@walkthru-earth/objex 1.3.1 → 1.5.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.
- package/LICENSE +5 -0
- package/README.md +28 -20
- package/dist/components/browser/FileTreeSidebar.svelte +32 -17
- package/dist/components/layout/AboutSheet.svelte +5 -2
- package/dist/components/layout/ConnectionDialog.svelte +7 -2
- package/dist/components/layout/SettingsSheet.svelte +238 -0
- package/dist/components/layout/SettingsSheet.svelte.d.ts +6 -0
- package/dist/components/layout/Sidebar.svelte +73 -6
- package/dist/components/layout/Sidebar.svelte.d.ts +4 -1
- package/dist/components/layout/StatusBar.svelte +17 -14
- package/dist/components/layout/TabBar.svelte +4 -4
- package/dist/components/ui/context-menu/context-menu-radio-group.svelte.d.ts +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte.d.ts +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte.d.ts +1 -1
- package/dist/components/ui/input/input.svelte.d.ts +1 -1
- package/dist/components/ui/resizable/index.d.ts +1 -1
- package/dist/components/ui/resizable/index.js +2 -2
- package/dist/components/ui/slider/index.d.ts +3 -0
- package/dist/components/ui/slider/index.js +5 -0
- package/dist/components/ui/slider/range-slider.svelte +94 -0
- package/dist/components/ui/slider/range-slider.svelte.d.ts +21 -0
- package/dist/components/ui/slider/slider.svelte +83 -0
- package/dist/components/ui/slider/slider.svelte.d.ts +7 -0
- package/dist/components/viewers/ArchiveViewer.svelte +140 -113
- package/dist/components/viewers/CodeViewer.svelte +45 -48
- package/dist/components/viewers/CodeViewer.svelte.d.ts +1 -1
- package/dist/components/viewers/CogControls.svelte +338 -184
- package/dist/components/viewers/CogControls.svelte.d.ts +33 -10
- package/dist/components/viewers/CogViewer.svelte +269 -116
- package/dist/components/viewers/CopcViewer.svelte +8 -15
- package/dist/components/viewers/DatabaseViewer.svelte +22 -21
- package/dist/components/viewers/FileInfo.svelte +16 -16
- package/dist/components/viewers/FlatGeobufViewer.svelte +16 -46
- package/dist/components/viewers/GeoParquetMapViewer.svelte +11 -9
- package/dist/components/viewers/GeoParquetMapViewer.svelte.d.ts +1 -1
- package/dist/components/viewers/ImageViewer.svelte +12 -14
- package/dist/components/viewers/LoadProgress.svelte +6 -6
- package/dist/components/viewers/MarkdownViewer.svelte +29 -30
- package/dist/components/viewers/MediaViewer.svelte +13 -14
- package/dist/components/viewers/ModelViewer.svelte +18 -21
- package/dist/components/viewers/MultiCogViewer.svelte +474 -106
- package/dist/components/viewers/MultiCogViewer.svelte.d.ts +1 -1
- package/dist/components/viewers/NotebookViewer.svelte +28 -29
- package/dist/components/viewers/PdfViewer.svelte +24 -33
- package/dist/components/viewers/PmtilesViewer.svelte +13 -15
- package/dist/components/viewers/QueryHistoryPanel.svelte +18 -18
- package/dist/components/viewers/RawViewer.svelte +27 -21
- package/dist/components/viewers/StacMapViewer.svelte +6 -13
- package/dist/components/viewers/StacMosaicViewer.svelte +1764 -410
- package/dist/components/viewers/StacMosaicViewer.svelte.d.ts +1 -1
- package/dist/components/viewers/StacTabViewer.svelte +26 -15
- package/dist/components/viewers/StacTabViewer.svelte.d.ts +1 -1
- package/dist/components/viewers/TableGrid.svelte +38 -34
- package/dist/components/viewers/TableStatusBar.svelte +7 -7
- package/dist/components/viewers/TableToolbar.svelte +10 -9
- package/dist/components/viewers/TableViewer.svelte +47 -30
- package/dist/components/viewers/TableViewer.svelte.d.ts +1 -0
- package/dist/components/viewers/ViewerHeader.svelte +18 -0
- package/dist/components/viewers/ViewerHeader.svelte.d.ts +10 -0
- package/dist/components/viewers/ViewerRouter.svelte +16 -8
- package/dist/components/viewers/ViewerStatus.svelte +19 -0
- package/dist/components/viewers/ViewerStatus.svelte.d.ts +7 -0
- package/dist/components/viewers/ZarrMapViewer.svelte +24 -21
- package/dist/components/viewers/ZarrViewer.svelte +98 -65
- package/dist/components/viewers/cog/ChannelPicker.svelte +83 -0
- package/dist/components/viewers/cog/ChannelPicker.svelte.d.ts +13 -0
- package/dist/components/viewers/cog/PixelInspectorPanel.svelte +87 -0
- package/dist/components/viewers/cog/PixelInspectorPanel.svelte.d.ts +17 -0
- package/dist/components/viewers/cog/buildRgbLayer.d.ts +78 -0
- package/dist/components/viewers/cog/buildRgbLayer.js +176 -0
- package/dist/components/viewers/map/AttributeTable.svelte +7 -7
- package/dist/components/viewers/map/MapContainer.svelte +38 -12
- package/dist/components/viewers/pmtiles/PmtilesArchiveView.svelte +109 -83
- package/dist/components/viewers/pmtiles/PmtilesTileInspector.svelte +16 -16
- package/dist/components/viewers/stac/StacDatetimeBar.svelte +175 -0
- package/dist/components/viewers/stac/StacDatetimeBar.svelte.d.ts +10 -0
- package/dist/components/viewers/stac/StacFilterPanel.svelte +243 -0
- package/dist/components/viewers/stac/StacFilterPanel.svelte.d.ts +14 -0
- package/dist/components/viewers/stac/StacItemInspector.svelte +223 -0
- package/dist/components/viewers/stac/StacItemInspector.svelte.d.ts +10 -0
- package/dist/components/viewers/stac/StacItemStrip.svelte +228 -0
- package/dist/components/viewers/stac/StacItemStrip.svelte.d.ts +12 -0
- package/dist/constants.d.ts +6 -0
- package/dist/constants.js +8 -0
- package/dist/file-icons/index.d.ts +1 -1
- package/dist/file-icons/index.js +1 -1
- package/dist/i18n/ar.js +113 -2
- package/dist/i18n/en.js +113 -2
- package/dist/index.d.ts +2 -28
- package/dist/index.js +7 -23
- package/dist/query/engine.d.ts +10 -0
- package/dist/query/source.js +1 -1
- package/dist/query/stac-source-factory.d.ts +65 -0
- package/dist/query/stac-source-factory.js +77 -0
- package/dist/query/stac-source-parquet.d.ts +135 -0
- package/dist/query/stac-source-parquet.js +468 -0
- package/dist/query/wasm.d.ts +8 -0
- package/dist/query/wasm.js +310 -65
- package/dist/storage/presign.js +3 -2
- package/dist/storage/providers.js +7 -6
- package/dist/stores/config.svelte.d.ts +15 -0
- package/dist/stores/config.svelte.js +46 -0
- package/dist/stores/connections.svelte.d.ts +2 -2
- package/dist/stores/connections.svelte.js +1 -2
- package/dist/stores/files.svelte.d.ts +1 -1
- package/dist/stores/files.svelte.js +1 -1
- package/dist/stores/query-history.svelte.js +1 -1
- package/dist/stores/settings.svelte.d.ts +16 -1
- package/dist/stores/settings.svelte.js +104 -48
- package/dist/stores/tabs.svelte.d.ts +3 -0
- package/dist/stores/tabs.svelte.js +17 -0
- package/dist/utils/cog-histogram.d.ts +121 -0
- package/dist/utils/cog-histogram.js +424 -0
- package/dist/utils/cog.d.ts +177 -20
- package/dist/utils/cog.js +361 -76
- package/dist/utils/colormap-sprite.d.ts +0 -9
- package/dist/utils/colormap-sprite.js +0 -21
- package/dist/utils/deck.d.ts +18 -12
- package/dist/utils/deck.js +15 -7
- package/dist/utils/media-query.svelte.d.ts +14 -0
- package/dist/utils/media-query.svelte.js +29 -0
- package/dist/utils/pmtiles-tile.js +2 -2
- package/dist/utils/signed-url-effect.d.ts +7 -0
- package/dist/utils/signed-url-effect.js +19 -0
- package/dist/utils/{url.d.ts → signed-url.d.ts} +15 -1
- package/dist/utils/{url.js → signed-url.js} +32 -10
- package/dist/utils/url-state.d.ts +36 -0
- package/dist/utils/url-state.js +72 -2
- package/dist/utils/zarr-tab.d.ts +1 -2
- package/dist/utils/zarr-tab.js +1 -2
- package/dist/utils/zarr.d.ts +0 -17
- package/dist/utils/zarr.js +1 -45
- package/package.json +55 -84
- package/dist/components/browser/Breadcrumb.svelte +0 -50
- package/dist/components/browser/Breadcrumb.svelte.d.ts +0 -7
- package/dist/components/browser/CreateFolderDialog.svelte +0 -98
- package/dist/components/browser/CreateFolderDialog.svelte.d.ts +0 -6
- package/dist/components/browser/DeleteConfirmDialog.svelte +0 -90
- package/dist/components/browser/DeleteConfirmDialog.svelte.d.ts +0 -8
- package/dist/components/browser/DropZone.svelte +0 -83
- package/dist/components/browser/DropZone.svelte.d.ts +0 -7
- package/dist/components/browser/FileBrowser.svelte +0 -252
- package/dist/components/browser/FileBrowser.svelte.d.ts +0 -3
- package/dist/components/browser/FileRow.svelte +0 -117
- package/dist/components/browser/FileRow.svelte.d.ts +0 -9
- package/dist/components/browser/RenameDialog.svelte +0 -101
- package/dist/components/browser/RenameDialog.svelte.d.ts +0 -8
- package/dist/components/browser/SearchBar.svelte +0 -40
- package/dist/components/browser/SearchBar.svelte.d.ts +0 -6
- package/dist/components/browser/UploadButton.svelte +0 -65
- package/dist/components/browser/UploadButton.svelte.d.ts +0 -3
- package/dist/query/stac-geoparquet.d.ts +0 -31
- package/dist/query/stac-geoparquet.js +0 -136
- package/dist/utils/clipboard.d.ts +0 -13
- package/dist/utils/clipboard.js +0 -38
- package/dist/utils/cloud-url.d.ts +0 -27
- package/dist/utils/cloud-url.js +0 -61
- package/dist/utils/cog-pure.d.ts +0 -25
- package/dist/utils/cog-pure.js +0 -35
- package/dist/utils/column-types.d.ts +0 -5
- package/dist/utils/column-types.js +0 -137
- package/dist/utils/connection-identity.d.ts +0 -51
- package/dist/utils/connection-identity.js +0 -97
- package/dist/utils/error.d.ts +0 -8
- package/dist/utils/error.js +0 -12
- package/dist/utils/evidence-context.d.ts +0 -22
- package/dist/utils/evidence-context.js +0 -56
- package/dist/utils/export.d.ts +0 -22
- package/dist/utils/export.js +0 -76
- package/dist/utils/file-sort.d.ts +0 -20
- package/dist/utils/file-sort.js +0 -41
- package/dist/utils/format.d.ts +0 -24
- package/dist/utils/format.js +0 -78
- package/dist/utils/geoarrow.d.ts +0 -32
- package/dist/utils/geoarrow.js +0 -672
- package/dist/utils/geometry-type.d.ts +0 -52
- package/dist/utils/geometry-type.js +0 -76
- package/dist/utils/hex.d.ts +0 -10
- package/dist/utils/hex.js +0 -27
- package/dist/utils/host-detection.d.ts +0 -23
- package/dist/utils/host-detection.js +0 -95
- package/dist/utils/local-storage.d.ts +0 -16
- package/dist/utils/local-storage.js +0 -37
- package/dist/utils/markdown-sql.d.ts +0 -30
- package/dist/utils/markdown-sql.js +0 -72
- package/dist/utils/notebook.d.ts +0 -59
- package/dist/utils/notebook.js +0 -211
- package/dist/utils/parquet-metadata.d.ts +0 -64
- package/dist/utils/parquet-metadata.js +0 -262
- package/dist/utils/stac-geoparquet.d.ts +0 -90
- package/dist/utils/stac-geoparquet.js +0 -223
- package/dist/utils/stac-hydrate.d.ts +0 -38
- package/dist/utils/stac-hydrate.js +0 -243
- package/dist/utils/stac.d.ts +0 -136
- package/dist/utils/stac.js +0 -176
- package/dist/utils/storage-url.d.ts +0 -90
- package/dist/utils/storage-url.js +0 -568
- package/dist/utils/wkb.d.ts +0 -43
- package/dist/utils/wkb.js +0 -359
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import {
|
|
3
|
+
handleLoadError,
|
|
4
|
+
interpolateTemplates,
|
|
5
|
+
MarkdownSqlContext,
|
|
6
|
+
markSqlBlocks,
|
|
7
|
+
parseMarkdownDocument,
|
|
8
|
+
wireCodeCopyButtons
|
|
9
|
+
} from '@walkthru-earth/objex-utils';
|
|
2
10
|
import { onDestroy, tick } from 'svelte';
|
|
3
11
|
import SqlResultBlock from '../editor/SqlResultBlock.svelte';
|
|
4
12
|
import { Badge } from '../ui/badge/index.js';
|
|
@@ -7,15 +15,10 @@ import { t } from '../../i18n/index.svelte.js';
|
|
|
7
15
|
import { getAdapter } from '../../storage/index.js';
|
|
8
16
|
import { tabResources } from '../../stores/tab-resources.svelte.js';
|
|
9
17
|
import type { Tab } from '../../types';
|
|
10
|
-
import { wireCodeCopyButtons } from '../../utils/clipboard.js';
|
|
11
|
-
import { handleLoadError } from '../../utils/error.js';
|
|
12
|
-
import { EvidenceContext } from '../../utils/evidence-context';
|
|
13
18
|
import { detectRTL, processDirection, renderMarkdown } from '../../utils/markdown';
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
parseMarkdownDocument
|
|
18
|
-
} from '../../utils/markdown-sql';
|
|
19
|
+
import { getQueryEngine } from '../../query/index.js';
|
|
20
|
+
import ViewerHeader from './ViewerHeader.svelte';
|
|
21
|
+
import ViewerStatus from './ViewerStatus.svelte';
|
|
19
22
|
|
|
20
23
|
let mermaidInitialized = false;
|
|
21
24
|
const CAIRO_FONT = '"Cairo", sans-serif';
|
|
@@ -78,7 +81,9 @@ async function loadMarkdown() {
|
|
|
78
81
|
|
|
79
82
|
if (parsed.sqlBlocks.length > 0) {
|
|
80
83
|
// Execute SQL blocks in parallel
|
|
81
|
-
const
|
|
84
|
+
const engine = await getQueryEngine();
|
|
85
|
+
const ctx = new MarkdownSqlContext(
|
|
86
|
+
engine,
|
|
82
87
|
tab.connectionId ?? '',
|
|
83
88
|
tab.path.split('/').slice(0, -1).join('/')
|
|
84
89
|
);
|
|
@@ -201,24 +206,22 @@ async function saveMarkdown(markdown: string) {
|
|
|
201
206
|
editMode = false;
|
|
202
207
|
await loadMarkdown();
|
|
203
208
|
} catch (err) {
|
|
204
|
-
error =
|
|
209
|
+
error = handleLoadError(err);
|
|
205
210
|
}
|
|
206
211
|
}
|
|
207
212
|
</script>
|
|
208
213
|
|
|
209
214
|
<div class="flex h-full flex-col">
|
|
210
|
-
<
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
{
|
|
220
|
-
|
|
221
|
-
<div class="ms-auto">
|
|
215
|
+
<ViewerHeader {tab}>
|
|
216
|
+
{#snippet badge()}
|
|
217
|
+
<Badge variant="secondary">{t('markdown.badge')}</Badge>
|
|
218
|
+
{#if hasSqlBlocks}
|
|
219
|
+
<Badge variant="outline" class="border-blue-200 text-blue-600 dark:border-blue-800 dark:text-blue-300">
|
|
220
|
+
{t('markdown.evidence')}
|
|
221
|
+
</Badge>
|
|
222
|
+
{/if}
|
|
223
|
+
{/snippet}
|
|
224
|
+
{#snippet actions()}
|
|
222
225
|
<Button
|
|
223
226
|
variant="ghost"
|
|
224
227
|
size="sm"
|
|
@@ -227,18 +230,14 @@ async function saveMarkdown(markdown: string) {
|
|
|
227
230
|
>
|
|
228
231
|
{editMode ? t('markdown.view') : t('markdown.edit')}
|
|
229
232
|
</Button>
|
|
230
|
-
|
|
231
|
-
</
|
|
233
|
+
{/snippet}
|
|
234
|
+
</ViewerHeader>
|
|
232
235
|
|
|
233
236
|
<div class="flex-1 overflow-auto">
|
|
234
237
|
{#if loading}
|
|
235
|
-
<
|
|
236
|
-
<p class="text-sm text-zinc-400">Loading...</p>
|
|
237
|
-
</div>
|
|
238
|
+
<ViewerStatus kind="loading" />
|
|
238
239
|
{:else if error}
|
|
239
|
-
<
|
|
240
|
-
<p class="text-sm text-red-400">{error}</p>
|
|
241
|
-
</div>
|
|
240
|
+
<ViewerStatus kind="error" message={error} />
|
|
242
241
|
{:else if editMode}
|
|
243
242
|
{#await import('../editor/MilkdownEditor.svelte') then MilkdownEditor}
|
|
244
243
|
<MilkdownEditor.default
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import { handleLoadError } from '@walkthru-earth/objex-utils';
|
|
2
3
|
import { onDestroy } from 'svelte';
|
|
3
4
|
import { getMimeType } from '../../file-icons/index.js';
|
|
4
5
|
import { getAdapter } from '../../storage/index.js';
|
|
5
6
|
import { tabResources } from '../../stores/tab-resources.svelte.js';
|
|
6
7
|
import type { Tab } from '../../types';
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
8
|
+
import { buildHttpsUrl, canStreamDirectly } from '../../utils/signed-url.js';
|
|
9
|
+
import ViewerHeader from './ViewerHeader.svelte';
|
|
10
|
+
import ViewerStatus from './ViewerStatus.svelte';
|
|
9
11
|
|
|
10
12
|
let { tab }: { tab: Tab } = $props();
|
|
11
13
|
|
|
@@ -72,22 +74,19 @@ onDestroy(cleanup);
|
|
|
72
74
|
</script>
|
|
73
75
|
|
|
74
76
|
<div class="flex h-full flex-col">
|
|
75
|
-
<
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
</div>
|
|
77
|
+
<ViewerHeader {tab}>
|
|
78
|
+
{#snippet badge()}
|
|
79
|
+
<span class="rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground">
|
|
80
|
+
{mediaType}
|
|
81
|
+
</span>
|
|
82
|
+
{/snippet}
|
|
83
|
+
</ViewerHeader>
|
|
83
84
|
|
|
84
85
|
<div class="flex flex-1 items-center justify-center bg-zinc-950 p-4">
|
|
85
86
|
{#if loading}
|
|
86
|
-
<
|
|
87
|
+
<ViewerStatus kind="loading" />
|
|
87
88
|
{:else if error}
|
|
88
|
-
<
|
|
89
|
-
<p class="text-sm text-red-600 dark:text-red-400">{error}</p>
|
|
90
|
-
</div>
|
|
89
|
+
<ViewerStatus kind="error" message={error} />
|
|
91
90
|
{:else if mediaSrc}
|
|
92
91
|
{#if mediaType === 'video'}
|
|
93
92
|
<video
|
|
@@ -2,22 +2,23 @@
|
|
|
2
2
|
import EllipsisVerticalIcon from '@lucide/svelte/icons/ellipsis-vertical';
|
|
3
3
|
import MaximizeIcon from '@lucide/svelte/icons/maximize';
|
|
4
4
|
import RotateCcwIcon from '@lucide/svelte/icons/rotate-ccw';
|
|
5
|
+
import { handleLoadError } from '@walkthru-earth/objex-utils';
|
|
5
6
|
import { onDestroy } from 'svelte';
|
|
6
7
|
import { Badge } from '../ui/badge/index.js';
|
|
7
8
|
import { Button } from '../ui/button/index.js';
|
|
8
9
|
import * as DropdownMenu from '../ui/dropdown-menu/index.js';
|
|
9
|
-
import { Separator } from '../ui/separator/index.js';
|
|
10
10
|
import { t } from '../../i18n/index.svelte.js';
|
|
11
11
|
import { getAdapter } from '../../storage/index.js';
|
|
12
12
|
import { tabResources } from '../../stores/tab-resources.svelte.js';
|
|
13
13
|
import type { Tab } from '../../types';
|
|
14
|
-
import { handleLoadError } from '../../utils/error.js';
|
|
15
14
|
import {
|
|
16
15
|
createModelScene,
|
|
17
16
|
disposeModelScene,
|
|
18
17
|
loadModel,
|
|
19
18
|
type ModelScene
|
|
20
19
|
} from '../../utils/model3d';
|
|
20
|
+
import ViewerHeader from './ViewerHeader.svelte';
|
|
21
|
+
import ViewerStatus from './ViewerStatus.svelte';
|
|
21
22
|
|
|
22
23
|
let { tab }: { tab: Tab } = $props();
|
|
23
24
|
|
|
@@ -101,19 +102,15 @@ onDestroy(cleanup);
|
|
|
101
102
|
</script>
|
|
102
103
|
|
|
103
104
|
<div class="flex h-full flex-col">
|
|
104
|
-
<
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
{meshCount} {t('model.meshes')} · {vertexCount.toLocaleString()} {t('model.vertices')}
|
|
113
|
-
</span>
|
|
114
|
-
{/if}
|
|
105
|
+
<ViewerHeader {tab}>
|
|
106
|
+
{#snippet badge()}<Badge variant="secondary">{t('model.badge')}</Badge>{/snippet}
|
|
107
|
+
{#snippet actions()}
|
|
108
|
+
{#if meshCount > 0}
|
|
109
|
+
<span class="hidden text-xs text-muted-foreground sm:inline">
|
|
110
|
+
{meshCount} {t('model.meshes')} · {vertexCount.toLocaleString()} {t('model.vertices')}
|
|
111
|
+
</span>
|
|
112
|
+
{/if}
|
|
115
113
|
|
|
116
|
-
<div class="ms-auto flex items-center gap-1">
|
|
117
114
|
<!-- Desktop controls -->
|
|
118
115
|
<div class="hidden items-center gap-1 sm:flex">
|
|
119
116
|
<Button
|
|
@@ -135,7 +132,7 @@ onDestroy(cleanup);
|
|
|
135
132
|
<!-- Mobile overflow menu -->
|
|
136
133
|
<div class="flex sm:hidden">
|
|
137
134
|
<DropdownMenu.Root>
|
|
138
|
-
<DropdownMenu.Trigger class="rounded p-1 text-
|
|
135
|
+
<DropdownMenu.Trigger class="rounded p-1 text-muted-foreground hover:bg-muted">
|
|
139
136
|
<EllipsisVerticalIcon class="size-4" />
|
|
140
137
|
</DropdownMenu.Trigger>
|
|
141
138
|
<DropdownMenu.Content align="end" class="w-40">
|
|
@@ -147,18 +144,18 @@ onDestroy(cleanup);
|
|
|
147
144
|
</DropdownMenu.Content>
|
|
148
145
|
</DropdownMenu.Root>
|
|
149
146
|
</div>
|
|
150
|
-
|
|
151
|
-
</
|
|
147
|
+
{/snippet}
|
|
148
|
+
</ViewerHeader>
|
|
152
149
|
|
|
153
150
|
<div class="relative flex-1 overflow-hidden">
|
|
154
151
|
{#if loading}
|
|
155
|
-
<div class="absolute inset-0 z-10
|
|
156
|
-
<
|
|
152
|
+
<div class="absolute inset-0 z-10 bg-zinc-900/80">
|
|
153
|
+
<ViewerStatus kind="loading" message={t('model.loading')} />
|
|
157
154
|
</div>
|
|
158
155
|
{/if}
|
|
159
156
|
{#if error}
|
|
160
|
-
<div class="absolute inset-0 z-10
|
|
161
|
-
<
|
|
157
|
+
<div class="absolute inset-0 z-10 bg-zinc-900/80">
|
|
158
|
+
<ViewerStatus kind="error" message={error} />
|
|
162
159
|
</div>
|
|
163
160
|
{/if}
|
|
164
161
|
<canvas bind:this={canvasEl} class="h-full w-full"></canvas>
|