@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
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { StacItemView } from '@walkthru-earth/objex-utils';
|
|
3
|
+
import { formatDate } from '@walkthru-earth/objex-utils';
|
|
4
|
+
import { onDestroy, untrack } from 'svelte';
|
|
5
|
+
import { t } from '../../../i18n/index.svelte.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Bottom-anchored, horizontally-scrolling strip of STAC items. Each card
|
|
9
|
+
* shows a thumbnail (when available), the id, datetime, and cloud cover.
|
|
10
|
+
* Hovering a card highlights the matching footprint via `onHover`,
|
|
11
|
+
* clicking selects/pins it via `onSelect`.
|
|
12
|
+
*
|
|
13
|
+
* Thumbnails are presigned via the parent's `presign` callback (the same
|
|
14
|
+
* helper the mosaic uses) so private buckets work without a duplicate
|
|
15
|
+
* cache. Errors are swallowed quietly, a missing thumbnail is just an
|
|
16
|
+
* empty box, never a console flood.
|
|
17
|
+
*
|
|
18
|
+
* Layout choice: the strip is `position: absolute` instead of part of the
|
|
19
|
+
* MapContainer's flow because both the inspector (right slide-over) and
|
|
20
|
+
* the existing pixel inspector (`bottom-2 left-2`) need to coexist with
|
|
21
|
+
* it on the same map surface. `bottom-12` leaves room above the pixel
|
|
22
|
+
* inspector overlay.
|
|
23
|
+
*/
|
|
24
|
+
let {
|
|
25
|
+
views,
|
|
26
|
+
hoveredId,
|
|
27
|
+
selectedId,
|
|
28
|
+
presign,
|
|
29
|
+
onHover,
|
|
30
|
+
onSelect
|
|
31
|
+
}: {
|
|
32
|
+
views: readonly StacItemView[];
|
|
33
|
+
hoveredId: string | null;
|
|
34
|
+
selectedId: string | null;
|
|
35
|
+
presign: (href: string) => Promise<string>;
|
|
36
|
+
onHover: (id: string | null) => void;
|
|
37
|
+
onSelect: (id: string | null) => void;
|
|
38
|
+
} = $props();
|
|
39
|
+
|
|
40
|
+
// Resolved thumbnail URLs, keyed by item id. Held as a Map in $state.raw
|
|
41
|
+
// so per-resolve writes are O(1) instead of the O(n) object-spread the
|
|
42
|
+
// previous `{...thumbs, [id]: url}` did (which accumulated to O(n²) over a
|
|
43
|
+
// viewport of 1000+ items, per the project's $state.raw rule for large
|
|
44
|
+
// collections). Reactivity is triggered by bumping `thumbsTick`; readers
|
|
45
|
+
// in the template subscribe to that tick + read `thumbs.get(id)`.
|
|
46
|
+
const thumbs = new Map<string, string | null>();
|
|
47
|
+
let thumbsTick = $state(0);
|
|
48
|
+
const inflight = new Set<string>();
|
|
49
|
+
// Mirror of the current `views[].id` set. The .then() handler for each
|
|
50
|
+
// presign checks against this so a presign that settles AFTER its item
|
|
51
|
+
// scrolled out of the viewport does not re-insert a stale entry into
|
|
52
|
+
// `thumbs` (which the cleanup $effect just removed). Mutated by the
|
|
53
|
+
// cleanup effect, read by load handlers.
|
|
54
|
+
let liveIds = new Set<string>();
|
|
55
|
+
|
|
56
|
+
function loadThumbnail(view: StacItemView): void {
|
|
57
|
+
if (!view.thumbnailHref) return;
|
|
58
|
+
if (thumbs.has(view.id)) return;
|
|
59
|
+
if (inflight.has(view.id)) return;
|
|
60
|
+
inflight.add(view.id);
|
|
61
|
+
presign(view.thumbnailHref)
|
|
62
|
+
.then((url) => {
|
|
63
|
+
if (!liveIds.has(view.id)) return;
|
|
64
|
+
thumbs.set(view.id, url);
|
|
65
|
+
thumbsTick++;
|
|
66
|
+
})
|
|
67
|
+
.catch(() => {
|
|
68
|
+
if (!liveIds.has(view.id)) return;
|
|
69
|
+
thumbs.set(view.id, null);
|
|
70
|
+
thumbsTick++;
|
|
71
|
+
})
|
|
72
|
+
.finally(() => {
|
|
73
|
+
inflight.delete(view.id);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Eagerly kick presigning for every view as soon as it appears. `presign`
|
|
78
|
+
// is local crypto (SigV4 query-string sign or HTTPS pass-through), not a
|
|
79
|
+
// network call, so resolving all thumbnails up-front is cheap. Each
|
|
80
|
+
// resulting `<img>` carries `loading="lazy"`, so the actual GET is still
|
|
81
|
+
// deferred to scroll-into-view by the browser. The previous mouseenter /
|
|
82
|
+
// focus trigger never fired on touch devices and required the user to
|
|
83
|
+
// hover every card individually on desktop.
|
|
84
|
+
$effect(() => {
|
|
85
|
+
for (const view of views) loadThumbnail(view);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// Drop thumbs for items no longer in the views list. Without this, panning
|
|
89
|
+
// across a STAC API would grow `thumbs` forever as the user discovers new
|
|
90
|
+
// regions, and the cache would dominate memory before any other leak.
|
|
91
|
+
$effect(() => {
|
|
92
|
+
const ids = new Set(views.map((v) => v.id));
|
|
93
|
+
liveIds = ids;
|
|
94
|
+
untrack(() => {
|
|
95
|
+
let mutated = false;
|
|
96
|
+
for (const id of thumbs.keys()) {
|
|
97
|
+
if (!ids.has(id)) {
|
|
98
|
+
thumbs.delete(id);
|
|
99
|
+
mutated = true;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (mutated) thumbsTick++;
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Scroll the selected card into view when selection comes from outside
|
|
107
|
+
// (footprint click). Only fires when the id changes, not on every render.
|
|
108
|
+
let scrollContainer: HTMLDivElement | null = $state(null);
|
|
109
|
+
let lastScrolled: string | null = null;
|
|
110
|
+
$effect(() => {
|
|
111
|
+
if (!selectedId || selectedId === lastScrolled) return;
|
|
112
|
+
if (!scrollContainer) return;
|
|
113
|
+
const el = scrollContainer.querySelector(`[data-item-id="${CSS.escape(selectedId)}"]`);
|
|
114
|
+
if (el && 'scrollIntoView' in el) {
|
|
115
|
+
(el as HTMLElement).scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });
|
|
116
|
+
lastScrolled = selectedId;
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
onDestroy(() => {
|
|
121
|
+
thumbs.clear();
|
|
122
|
+
inflight.clear();
|
|
123
|
+
liveIds = new Set();
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
function formatItemDate(iso: string | null): string {
|
|
127
|
+
if (!iso) return '';
|
|
128
|
+
const t = Date.parse(iso);
|
|
129
|
+
return Number.isFinite(t) ? formatDate(t) : iso;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Template reader for the thumbs Map. Reading `thumbsTick` first registers
|
|
134
|
+
* a Svelte reactive dependency on the tick counter, so any tick bump
|
|
135
|
+
* (resolve / failure / cleanup) re-evaluates this call site without us
|
|
136
|
+
* having to wrap the entire Map in a reactive Proxy via `$state(Map)`.
|
|
137
|
+
* Returns the same tri-state the template branches on:
|
|
138
|
+
* string → resolved URL, render `<img>`
|
|
139
|
+
* null → presign failed, render "no thumbnail" placeholder
|
|
140
|
+
* undefined → still in flight (or has no thumbnailHref), render "loading"
|
|
141
|
+
*/
|
|
142
|
+
function thumbFor(id: string): string | null | undefined {
|
|
143
|
+
void thumbsTick;
|
|
144
|
+
return thumbs.get(id);
|
|
145
|
+
}
|
|
146
|
+
</script>
|
|
147
|
+
|
|
148
|
+
<div
|
|
149
|
+
class="pointer-events-auto rounded-md bg-card/90 shadow-lg backdrop-blur-sm"
|
|
150
|
+
>
|
|
151
|
+
<div class="flex items-center justify-between border-b border-border px-2 py-1 text-xs text-muted-foreground sm:text-[10px]">
|
|
152
|
+
<span class="tabular-nums">{t('stac.stripCount', { count: views.length })}</span>
|
|
153
|
+
{#if selectedId}
|
|
154
|
+
<button
|
|
155
|
+
class="inline-flex min-h-8 items-center rounded px-2 py-1 text-xs hover:bg-accent hover:text-accent-foreground sm:min-h-0 sm:px-1.5 sm:py-0.5 sm:text-[10px]"
|
|
156
|
+
style="touch-action: manipulation;"
|
|
157
|
+
onclick={() => onSelect(null)}
|
|
158
|
+
>
|
|
159
|
+
{t('stac.clearSelection')}
|
|
160
|
+
</button>
|
|
161
|
+
{/if}
|
|
162
|
+
</div>
|
|
163
|
+
<div
|
|
164
|
+
bind:this={scrollContainer}
|
|
165
|
+
role="list"
|
|
166
|
+
class="flex snap-x snap-mandatory gap-1.5 overflow-x-auto overscroll-x-contain px-2 py-1.5"
|
|
167
|
+
style="-webkit-overflow-scrolling: touch;"
|
|
168
|
+
onmouseleave={() => onHover(null)}
|
|
169
|
+
>
|
|
170
|
+
{#each views as view (view.id)}
|
|
171
|
+
{@const thumb = thumbFor(view.id)}
|
|
172
|
+
<button
|
|
173
|
+
type="button"
|
|
174
|
+
data-item-id={view.id}
|
|
175
|
+
class="group relative flex w-24 shrink-0 snap-start flex-col gap-1 overflow-hidden rounded border bg-background text-left transition-colors sm:w-32"
|
|
176
|
+
class:border-border={view.id !== hoveredId && view.id !== selectedId}
|
|
177
|
+
class:border-white={view.id === hoveredId && view.id !== selectedId}
|
|
178
|
+
class:border-amber-400={view.id === selectedId}
|
|
179
|
+
class:ring-1={view.id === selectedId}
|
|
180
|
+
class:ring-amber-400={view.id === selectedId}
|
|
181
|
+
onmouseenter={() => onHover(view.id)}
|
|
182
|
+
onfocus={() => onHover(view.id)}
|
|
183
|
+
onclick={() => onSelect(view.id)}
|
|
184
|
+
>
|
|
185
|
+
<div class="relative aspect-square w-full bg-muted">
|
|
186
|
+
{#if thumb}
|
|
187
|
+
<img
|
|
188
|
+
src={thumb}
|
|
189
|
+
alt=""
|
|
190
|
+
loading="lazy"
|
|
191
|
+
decoding="async"
|
|
192
|
+
fetchpriority="low"
|
|
193
|
+
class="h-full w-full object-cover"
|
|
194
|
+
onerror={() => {
|
|
195
|
+
thumbs.set(view.id, null);
|
|
196
|
+
thumbsTick++;
|
|
197
|
+
}}
|
|
198
|
+
/>
|
|
199
|
+
{:else if thumb === null}
|
|
200
|
+
<div class="flex h-full w-full items-center justify-center text-[9px] text-muted-foreground">
|
|
201
|
+
{t('stac.thumbNone')}
|
|
202
|
+
</div>
|
|
203
|
+
{:else if view.thumbnailHref}
|
|
204
|
+
<div class="flex h-full w-full items-center justify-center text-[9px] text-muted-foreground">
|
|
205
|
+
{t('stac.thumbLoading')}
|
|
206
|
+
</div>
|
|
207
|
+
{:else}
|
|
208
|
+
<div class="flex h-full w-full items-center justify-center text-[9px] text-muted-foreground">
|
|
209
|
+
{t('stac.thumbNone')}
|
|
210
|
+
</div>
|
|
211
|
+
{/if}
|
|
212
|
+
{#if view.cloudCover != null}
|
|
213
|
+
<span
|
|
214
|
+
class="absolute right-0.5 top-0.5 rounded bg-black/60 px-1 text-[9px] tabular-nums text-white"
|
|
215
|
+
title={t('stac.cloudCover')}
|
|
216
|
+
>
|
|
217
|
+
{Math.round(view.cloudCover)}%
|
|
218
|
+
</span>
|
|
219
|
+
{/if}
|
|
220
|
+
</div>
|
|
221
|
+
<div class="px-1.5 pb-1 text-[10px] leading-tight">
|
|
222
|
+
<div class="truncate font-medium" title={view.id}>{view.id}</div>
|
|
223
|
+
<div class="truncate text-muted-foreground">{formatItemDate(view.datetime)}</div>
|
|
224
|
+
</div>
|
|
225
|
+
</button>
|
|
226
|
+
{/each}
|
|
227
|
+
</div>
|
|
228
|
+
</div>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { StacItemView } from '@walkthru-earth/objex-utils';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
views: readonly StacItemView[];
|
|
4
|
+
hoveredId: string | null;
|
|
5
|
+
selectedId: string | null;
|
|
6
|
+
presign: (href: string) => Promise<string>;
|
|
7
|
+
onHover: (id: string | null) => void;
|
|
8
|
+
onSelect: (id: string | null) => void;
|
|
9
|
+
};
|
|
10
|
+
declare const StacItemStrip: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
11
|
+
type StacItemStrip = ReturnType<typeof StacItemStrip>;
|
|
12
|
+
export default StacItemStrip;
|
package/dist/constants.d.ts
CHANGED
|
@@ -30,3 +30,9 @@ export declare const VIEWER_DIR_EXTENSIONS: Set<string>;
|
|
|
30
30
|
export declare const LAYER_HUE_MULTIPLIER = 137;
|
|
31
31
|
/** Duration (ms) to show "Copied!" feedback before resetting. */
|
|
32
32
|
export declare const COPY_FEEDBACK_MS = 2000;
|
|
33
|
+
/** Region assumed when a connection or bucket name yields none. AWS's global default. */
|
|
34
|
+
export declare const DEFAULT_AWS_REGION = "us-east-1";
|
|
35
|
+
/** deck.gl tile-layer debounce (ms) before fetching after a viewport change. */
|
|
36
|
+
export declare const TILE_DEBOUNCE_MS = 200;
|
|
37
|
+
/** Zoom level used when flying to the first feature of a vector dataset. */
|
|
38
|
+
export declare const FIRST_FEATURE_FLY_ZOOM = 14;
|
package/dist/constants.js
CHANGED
|
@@ -36,3 +36,11 @@ export const LAYER_HUE_MULTIPLIER = 137;
|
|
|
36
36
|
// ── Clipboard ──
|
|
37
37
|
/** Duration (ms) to show "Copied!" feedback before resetting. */
|
|
38
38
|
export const COPY_FEEDBACK_MS = 2000;
|
|
39
|
+
// ── AWS defaults ──
|
|
40
|
+
/** Region assumed when a connection or bucket name yields none. AWS's global default. */
|
|
41
|
+
export const DEFAULT_AWS_REGION = 'us-east-1';
|
|
42
|
+
// ── Map / tiles ──
|
|
43
|
+
/** deck.gl tile-layer debounce (ms) before fetching after a viewport change. */
|
|
44
|
+
export const TILE_DEBOUNCE_MS = 200;
|
|
45
|
+
/** Zoom level used when flying to the first feature of a vector dataset. */
|
|
46
|
+
export const FIRST_FEATURE_FLY_ZOOM = 14;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Single source of truth for extension → icon, color, label, category,
|
|
5
5
|
* viewer, DuckDB read function, MIME type, and queryability.
|
|
6
6
|
*
|
|
7
|
-
* Used by:
|
|
7
|
+
* Used by: FileTreeSidebar, ViewerRouter, TableViewer, WasmQueryEngine, etc.
|
|
8
8
|
*/
|
|
9
9
|
export type FileCategory = 'data' | 'geo' | 'code' | 'document' | 'config' | 'image' | 'video' | 'audio' | 'archive' | 'database' | '3d' | 'other';
|
|
10
10
|
export type ViewerKind = 'table' | 'image' | 'video' | 'audio' | 'markdown' | 'code' | 'cog' | 'pmtiles' | 'flatgeobuf' | 'pdf' | '3d' | 'archive' | 'database' | 'zarr' | 'copc' | 'notebook' | 'raw';
|
package/dist/file-icons/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Single source of truth for extension → icon, color, label, category,
|
|
5
5
|
* viewer, DuckDB read function, MIME type, and queryability.
|
|
6
6
|
*
|
|
7
|
-
* Used by:
|
|
7
|
+
* Used by: FileTreeSidebar, ViewerRouter, TableViewer, WasmQueryEngine, etc.
|
|
8
8
|
*/
|
|
9
9
|
// ---------------------------------------------------------------------------
|
|
10
10
|
// Defaults
|
package/dist/i18n/ar.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export const ar = {
|
|
2
|
+
// Common
|
|
3
|
+
'common.loading': 'جارٍ التحميل...',
|
|
4
|
+
'common.error': 'خطأ',
|
|
2
5
|
// Sidebar
|
|
3
6
|
'sidebar.deleteConfirm': 'حذف الاتصال "{name}"؟',
|
|
4
7
|
'sidebar.browseDetected': 'تصفح الحاوية المكتشفة: {name}',
|
|
@@ -53,6 +56,26 @@ export const ar = {
|
|
|
53
56
|
'theme.dark': 'داكن',
|
|
54
57
|
'theme.system': 'النظام',
|
|
55
58
|
'theme.tooltip': 'وضع {mode}',
|
|
59
|
+
// Settings
|
|
60
|
+
'settings.title': 'الإعدادات',
|
|
61
|
+
'settings.tooltip': 'الإعدادات',
|
|
62
|
+
'settings.appearance': 'المظهر',
|
|
63
|
+
'settings.language': 'اللغة',
|
|
64
|
+
'settings.data': 'البيانات',
|
|
65
|
+
'settings.interface': 'الواجهة',
|
|
66
|
+
'settings.map': 'الخريطة',
|
|
67
|
+
'settings.basemapAuto': 'تلقائي (حسب السمة)',
|
|
68
|
+
'settings.rowLimit': 'حد الصفوف الافتراضي',
|
|
69
|
+
'settings.rowLimitHelp': 'عدد الصفوف المحملة لكل صفحة في عارض الجدول.',
|
|
70
|
+
'settings.mosaicLimit': 'حد عناصر STAC',
|
|
71
|
+
'settings.mosaicLimitHelp': 'أقصى عدد لعناصر STAC المحملة في الفسيفساء.',
|
|
72
|
+
'settings.showConnectionRail': 'شريط الاتصالات الجانبي',
|
|
73
|
+
'settings.showFileTree': 'شجرة الملفات',
|
|
74
|
+
'settings.lockedByLink': 'يتم التحكم به عبر معامل الرابط',
|
|
75
|
+
'settings.copyConfig': 'نسخ إعدادات JSON',
|
|
76
|
+
'settings.copied': 'تم النسخ',
|
|
77
|
+
'settings.reset': 'إعادة الضبط الافتراضي',
|
|
78
|
+
'settings.customConfig': 'تم تحميل إعدادات مخصصة',
|
|
56
79
|
// Safe Lock
|
|
57
80
|
'safeLock.enabledAria': 'قفل الأمان مفعّل (قراءة فقط)',
|
|
58
81
|
'safeLock.disabledAria': 'قفل الأمان معطّل (الكتابة مسموحة)',
|
|
@@ -73,6 +96,10 @@ export const ar = {
|
|
|
73
96
|
'fileTree.filterPlaceholder': 'تصفية الملفات...',
|
|
74
97
|
'fileTree.noMatch': 'لا توجد ملفات مطابقة',
|
|
75
98
|
'fileTree.emptyBucket': 'حاوية فارغة',
|
|
99
|
+
'fileTree.corsError': 'تعذّر عرض محتوى هذه الحاوية',
|
|
100
|
+
'fileTree.corsHint': 'استجاب الخادم لكنه لم يُرسل ترويسات CORS، فحجب المتصفح الاستجابة. هذا إعداد يتحكم به مالك الحاوية ولا يمكن تغييره من هنا. تحتاج الحاوية إلى سياسة CORS تسمح بهذا المصدر، أو الوصول عبر وسيط.',
|
|
101
|
+
'fileTree.loadError': 'تعذّر تحميل هذه الحاوية',
|
|
102
|
+
'fileTree.loadErrorHint': 'تحقق من إعدادات الاتصال والشبكة، وتأكد من صحة اسم الحاوية والمنطقة.',
|
|
76
103
|
'fileTree.expandDir': 'توسيع المجلد',
|
|
77
104
|
'fileTree.copyHttpUrl': 'نسخ رابط HTTPS',
|
|
78
105
|
'fileTree.copyNativeUri': 'نسخ رابط {scheme}',
|
|
@@ -386,14 +413,21 @@ export const ar = {
|
|
|
386
413
|
'mapInfo.size': 'الحجم',
|
|
387
414
|
'mapInfo.bands': 'النطاقات',
|
|
388
415
|
'map.mosaicEmpty': 'كتالوج STAC لا يحتوي على عناصر بها أصول COG.',
|
|
416
|
+
'map.mosaicEmptyViewport': 'لا توجد عناصر في نطاق الخريطة الحالي. حرّك أو ابتعد، أو ارفع حد العناصر.',
|
|
389
417
|
'map.mosaicNoAssets': 'لا تحتوي عناصر STAC على عنوان URL صالح لأصل COG.',
|
|
390
418
|
'map.multiCogMissingBands': 'عنصر STAC هذا ينقصه نطاقات الأحمر والأخضر والأزرق اللازمة للتركيب.',
|
|
419
|
+
'map.multiCogMosaicHeavy': 'فسيفساء متعددة الأصول مع عدد كبير من العناصر، قد يتأثر الأداء',
|
|
391
420
|
'map.multiCogPreset.label': 'الإعداد المسبق',
|
|
392
421
|
'map.multiCogPreset.trueColor': 'ألوان طبيعية',
|
|
393
422
|
'map.multiCogPreset.falseColorIR': 'أشعة تحت حمراء كاذبة اللون',
|
|
394
423
|
'map.multiCogPreset.swir': 'الأشعة تحت الحمراء قصيرة الموجة',
|
|
395
424
|
'map.multiCogPreset.vegetation': 'الغطاء النباتي',
|
|
396
425
|
'map.multiCogPreset.agriculture': 'الزراعة',
|
|
426
|
+
'map.multiCogPreset.custom': 'مخصص',
|
|
427
|
+
'map.multiCogBands': 'النطاقات',
|
|
428
|
+
'map.multiCogBandsTooltip': 'اختر النطاق المُسند إلى كل قناة إخراج',
|
|
429
|
+
'map.multiCogChannelNone': '(بدون)',
|
|
430
|
+
'map.mosaicAsset': 'الأصل',
|
|
397
431
|
// تبديل عرض STAC (StacTabViewer)
|
|
398
432
|
'stac.viewMosaic': 'خريطة',
|
|
399
433
|
'stac.viewMultiCog': 'خريطة (نطاقات)',
|
|
@@ -408,16 +442,93 @@ export const ar = {
|
|
|
408
442
|
'stac.mosaicSourcesOther': 'فسيفساء، {count} مصادر',
|
|
409
443
|
'stac.mosaicInfo': 'معلومات الفسيفساء',
|
|
410
444
|
'stac.mosaicSourcesLabel': 'المصادر',
|
|
445
|
+
'stac.explainHeading': 'تحليل',
|
|
446
|
+
'stac.explainItems': 'العناصر، {visible} ظاهر / {total} إجمالي',
|
|
447
|
+
'stac.explainAssets': 'أصول مميزة، {count}',
|
|
448
|
+
'stac.explainOverlap': 'تداخل في المركز، {count} عناصر',
|
|
449
|
+
'stac.explainBytes': 'تقدير بايت البلاطة لكل عنصر، {bytes}',
|
|
450
|
+
'stac.explainTimeSpan': 'الفترة، من {start} إلى {end}',
|
|
451
|
+
'stac.viewportMode': 'منطقة الخريطة',
|
|
452
|
+
'stac.timeRange': 'الوقت',
|
|
453
|
+
'stac.timeLatest': 'الأحدث',
|
|
454
|
+
'stac.time7d': 'آخر 7 أيام',
|
|
455
|
+
'stac.time30d': 'آخر 30 يومًا',
|
|
456
|
+
'stac.time90d': 'آخر 90 يومًا',
|
|
457
|
+
'stac.time1y': 'آخر سنة',
|
|
458
|
+
'stac.timeAll': 'كل الوقت',
|
|
459
|
+
'stac.refresh': 'تحديث',
|
|
460
|
+
'stac.filters': 'المرشحات',
|
|
461
|
+
'stac.itemLimit': 'حد العناصر',
|
|
462
|
+
'stac.itemLimitHint': 'الحد الأقصى لعدد العناصر التي يتم جلبها لكل عرض. القيم الأعلى تكشف عن مصادر أكثر لكنها تبطئ التحميل.',
|
|
463
|
+
'stac.capReached': 'تم بلوغ الحد {limit}. ارفع الحد لجلب المزيد.',
|
|
464
|
+
'stac.lastRefresh': 'آخر تحديث، منذ {seconds} ثانية',
|
|
465
|
+
'stac.stageIdle': 'في وضع الانتظار',
|
|
466
|
+
'stac.stageClassify': 'تصنيف STAC',
|
|
467
|
+
'stac.stageFetch': 'جلب العناصر',
|
|
468
|
+
'stac.stageIndex': 'فهرسة المساحات',
|
|
469
|
+
'stac.stageRender': 'رسم البلاطات',
|
|
470
|
+
'stac.stageEmpty': 'لا توجد عناصر في العرض',
|
|
471
|
+
'stac.stageError': 'خطأ',
|
|
472
|
+
'stac.stageSuperseded': 'تم استبدال الجلب السابق بتحريك جديد',
|
|
473
|
+
'stac.smokeWarning': 'فشل اختبار التخزين، {reason}',
|
|
474
|
+
'stac.smokeWarningHint': 'تعذّر الوصول إلى أحد ملفات COG التمثيلية. تحقّق من بيانات الاعتماد للاتصال، أو CORS للحاوية، أو من صحة عنوان الأصل.',
|
|
475
|
+
'stac.modeViewportApi': 'الوضع، تحديث عند التحريك، STAC API',
|
|
476
|
+
'stac.modeViewportParquet': 'الوضع، تحديث عند التحريك، stac-geoparquet',
|
|
477
|
+
'stac.modeStatic': 'الوضع، كتالوج ثابت (جلب لمرة واحدة، قص محلي حسب النطاق)',
|
|
478
|
+
'stac.footprints': 'البصمات',
|
|
479
|
+
'stac.footprintsHint': 'إظهار حدود كل عنصر محمّل',
|
|
480
|
+
'stac.strip': 'الشريط',
|
|
481
|
+
'stac.stripCount': '{count} عنصر',
|
|
482
|
+
'stac.clearSelection': 'مسح التحديد',
|
|
483
|
+
'stac.thumbLoading': 'جارٍ التحميل…',
|
|
484
|
+
'stac.thumbNone': 'لا توجد معاينة',
|
|
485
|
+
'stac.cloudCover': 'الغطاء السحابي',
|
|
486
|
+
'stac.datetime': 'التاريخ والوقت',
|
|
487
|
+
'stac.endDatetime': 'تاريخ النهاية',
|
|
488
|
+
'stac.gsd': 'دقة العينة الأرضية',
|
|
489
|
+
'stac.platform': 'المنصة',
|
|
490
|
+
'stac.constellation': 'الكوكبة',
|
|
491
|
+
'stac.instruments': 'الأجهزة',
|
|
492
|
+
'stac.epsg': 'النظام المرجعي',
|
|
493
|
+
'stac.assets': 'الأصول ({count})',
|
|
494
|
+
'stac.assetOpen': 'فتح',
|
|
495
|
+
'stac.flyTo': 'الانتقال',
|
|
496
|
+
'stac.filterDatetime': 'تصفية حسب التاريخ',
|
|
497
|
+
'stac.granularityLabel': 'المدرج التكراري، فواصل {granularity}',
|
|
498
|
+
'stac.granularity.day': 'يوم',
|
|
499
|
+
'stac.granularity.week': 'أسبوع',
|
|
500
|
+
'stac.granularity.month': 'شهر',
|
|
501
|
+
'stac.granularity.year': 'سنة',
|
|
502
|
+
'stac.facetTotal': '{count} محمَّل',
|
|
503
|
+
'stac.facetNoneAvailable': 'لا توجد حقول قابلة للتصفية في هذه البيانات.',
|
|
504
|
+
'stac.resetFilters': 'إعادة',
|
|
505
|
+
'stac.filtersActive': 'فلاتر نشطة',
|
|
506
|
+
'stac.collection': 'المجموعة',
|
|
507
|
+
'stac.assetRoles': 'أدوار الأصول',
|
|
508
|
+
'stac.copyId': 'نسخ المعرف',
|
|
509
|
+
'stac.copyJson': 'نسخ JSON',
|
|
510
|
+
'stac.copied': 'تم النسخ',
|
|
511
|
+
'stac.close': 'إغلاق',
|
|
512
|
+
'stac.showRaw': 'عرض JSON الخام',
|
|
513
|
+
'stac.hideRaw': 'إخفاء JSON الخام',
|
|
411
514
|
// COG Controls
|
|
412
515
|
'cog.style': 'النمط',
|
|
516
|
+
'cog.asset': 'الأصل',
|
|
413
517
|
'cog.band': 'النطاق',
|
|
414
518
|
'cog.singleBand': 'نطاق واحد',
|
|
415
519
|
'cog.colorRamp': 'تدرج الألوان',
|
|
416
520
|
'cog.colorRampSearch': 'بحث في التدرجات…',
|
|
417
521
|
'cog.pixelValue': 'قيمة البكسل',
|
|
418
522
|
'cog.reading': 'قراءة البكسل...',
|
|
419
|
-
'cog.rescale': 'إعادة القياس',
|
|
420
|
-
'cog.
|
|
523
|
+
'cog.rescale.label': 'إعادة القياس',
|
|
524
|
+
'cog.rescale.reset': 'إعادة تعيين',
|
|
525
|
+
'cog.nodata.label': 'بيانات مفقودة',
|
|
526
|
+
'cog.nodata.auto': 'تلقائي',
|
|
527
|
+
'cog.nodata.value': 'قيمة',
|
|
528
|
+
'cog.nodata.off': 'إيقاف',
|
|
529
|
+
'cog.nodata.autoHint': 'من الملف: {value}',
|
|
530
|
+
'cog.nodata.autoNone': 'لا يوجد وسم GDAL_NODATA',
|
|
531
|
+
'cog.nodata.valuePlaceholder': 'مثال: -9999',
|
|
421
532
|
// PMTiles Viewer
|
|
422
533
|
'pmtiles.mapView': 'خريطة',
|
|
423
534
|
'pmtiles.archiveView': 'الأرشيف',
|
package/dist/i18n/en.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export const en = {
|
|
2
|
+
// Common
|
|
3
|
+
'common.loading': 'Loading...',
|
|
4
|
+
'common.error': 'Error',
|
|
2
5
|
// Sidebar
|
|
3
6
|
'sidebar.deleteConfirm': 'Delete connection "{name}"?',
|
|
4
7
|
'sidebar.browseDetected': 'Browse detected bucket: {name}',
|
|
@@ -53,6 +56,26 @@ export const en = {
|
|
|
53
56
|
'theme.dark': 'Dark',
|
|
54
57
|
'theme.system': 'System',
|
|
55
58
|
'theme.tooltip': '{mode} mode',
|
|
59
|
+
// Settings
|
|
60
|
+
'settings.title': 'Settings',
|
|
61
|
+
'settings.tooltip': 'Settings',
|
|
62
|
+
'settings.appearance': 'Appearance',
|
|
63
|
+
'settings.language': 'Language',
|
|
64
|
+
'settings.data': 'Data',
|
|
65
|
+
'settings.interface': 'Interface',
|
|
66
|
+
'settings.map': 'Map',
|
|
67
|
+
'settings.basemapAuto': 'Auto (match theme)',
|
|
68
|
+
'settings.rowLimit': 'Default row limit',
|
|
69
|
+
'settings.rowLimitHelp': 'Rows loaded per page in the table viewer.',
|
|
70
|
+
'settings.mosaicLimit': 'STAC item limit',
|
|
71
|
+
'settings.mosaicLimitHelp': 'Maximum STAC items loaded into a mosaic.',
|
|
72
|
+
'settings.showConnectionRail': 'Connection sidebar',
|
|
73
|
+
'settings.showFileTree': 'File tree',
|
|
74
|
+
'settings.lockedByLink': 'Controlled by a link parameter',
|
|
75
|
+
'settings.copyConfig': 'Copy config JSON',
|
|
76
|
+
'settings.copied': 'Copied',
|
|
77
|
+
'settings.reset': 'Reset to defaults',
|
|
78
|
+
'settings.customConfig': 'Custom config loaded',
|
|
56
79
|
// Safe Lock
|
|
57
80
|
'safeLock.enabledAria': 'Safe lock enabled (read-only)',
|
|
58
81
|
'safeLock.disabledAria': 'Safe lock disabled (writes allowed)',
|
|
@@ -73,6 +96,10 @@ export const en = {
|
|
|
73
96
|
'fileTree.filterPlaceholder': 'Filter files...',
|
|
74
97
|
'fileTree.noMatch': 'No matching files',
|
|
75
98
|
'fileTree.emptyBucket': 'Empty bucket',
|
|
99
|
+
'fileTree.corsError': "Can't list this bucket",
|
|
100
|
+
'fileTree.corsHint': 'The server replied but sent no CORS headers, so the browser blocked the response. This is set by the bucket owner and cannot be changed here. The bucket needs a CORS policy that allows this origin, or access through a proxy.',
|
|
101
|
+
'fileTree.loadError': "Couldn't load this bucket",
|
|
102
|
+
'fileTree.loadErrorHint': 'Check the connection settings and your network, and confirm the bucket name and region are correct.',
|
|
76
103
|
'fileTree.expandDir': 'Expand directory',
|
|
77
104
|
'fileTree.copyHttpUrl': 'Copy HTTPS URL',
|
|
78
105
|
'fileTree.copyNativeUri': 'Copy {scheme} URI',
|
|
@@ -386,14 +413,21 @@ export const en = {
|
|
|
386
413
|
'mapInfo.size': 'Size',
|
|
387
414
|
'mapInfo.bands': 'Bands',
|
|
388
415
|
'map.mosaicEmpty': 'STAC catalog has no items with COG assets.',
|
|
416
|
+
'map.mosaicEmptyViewport': 'No items in the current map view. Pan or zoom out, or raise the item cap.',
|
|
389
417
|
'map.mosaicNoAssets': 'None of the STAC items expose a usable COG asset URL.',
|
|
390
418
|
'map.multiCogMissingBands': 'This STAC item is missing the red/green/blue bands required for a composite.',
|
|
419
|
+
'map.multiCogMosaicHeavy': 'Multi-asset mosaic with many items, performance may degrade',
|
|
391
420
|
'map.multiCogPreset.label': 'Preset',
|
|
392
421
|
'map.multiCogPreset.trueColor': 'True Color',
|
|
393
422
|
'map.multiCogPreset.falseColorIR': 'False-Color IR',
|
|
394
423
|
'map.multiCogPreset.swir': 'SWIR',
|
|
395
424
|
'map.multiCogPreset.vegetation': 'Vegetation',
|
|
396
425
|
'map.multiCogPreset.agriculture': 'Agriculture',
|
|
426
|
+
'map.multiCogPreset.custom': 'Custom',
|
|
427
|
+
'map.multiCogBands': 'Bands',
|
|
428
|
+
'map.multiCogBandsTooltip': 'Pick which STAC asset feeds each output channel',
|
|
429
|
+
'map.multiCogChannelNone': '(none)',
|
|
430
|
+
'map.mosaicAsset': 'Asset',
|
|
397
431
|
// STAC tab toggle (StacTabViewer)
|
|
398
432
|
'stac.viewMosaic': 'Map',
|
|
399
433
|
'stac.viewMultiCog': 'Map (Bands)',
|
|
@@ -408,16 +442,93 @@ export const en = {
|
|
|
408
442
|
'stac.mosaicSourcesOther': 'Mosaic, {count} sources',
|
|
409
443
|
'stac.mosaicInfo': 'Mosaic info',
|
|
410
444
|
'stac.mosaicSourcesLabel': 'Sources',
|
|
445
|
+
'stac.explainHeading': 'Explain',
|
|
446
|
+
'stac.explainItems': 'Items, {visible} visible / {total} total',
|
|
447
|
+
'stac.explainAssets': 'Distinct assets, {count}',
|
|
448
|
+
'stac.explainOverlap': 'Center overlap, {count} items',
|
|
449
|
+
'stac.explainBytes': 'Est tile bytes per item, {bytes}',
|
|
450
|
+
'stac.explainTimeSpan': 'Time span, {start} to {end}',
|
|
451
|
+
'stac.viewportMode': 'Map area',
|
|
452
|
+
'stac.timeRange': 'Time',
|
|
453
|
+
'stac.timeLatest': 'Latest',
|
|
454
|
+
'stac.time7d': 'Last 7 days',
|
|
455
|
+
'stac.time30d': 'Last 30 days',
|
|
456
|
+
'stac.time90d': 'Last 90 days',
|
|
457
|
+
'stac.time1y': 'Last year',
|
|
458
|
+
'stac.timeAll': 'All time',
|
|
459
|
+
'stac.refresh': 'Refresh',
|
|
460
|
+
'stac.filters': 'Filters',
|
|
461
|
+
'stac.itemLimit': 'Item cap',
|
|
462
|
+
'stac.itemLimitHint': 'Maximum items to fetch per viewport. Higher values reveal more sources but slow loading.',
|
|
463
|
+
'stac.capReached': 'Cap of {limit} items reached. Raise the cap to fetch more.',
|
|
464
|
+
'stac.lastRefresh': 'Last refresh, {seconds}s ago',
|
|
465
|
+
'stac.stageIdle': 'Idle',
|
|
466
|
+
'stac.stageClassify': 'Classifying STAC',
|
|
467
|
+
'stac.stageFetch': 'Fetching items',
|
|
468
|
+
'stac.stageIndex': 'Indexing footprints',
|
|
469
|
+
'stac.stageRender': 'Rendering tiles',
|
|
470
|
+
'stac.stageEmpty': 'No items in view',
|
|
471
|
+
'stac.stageError': 'Error',
|
|
472
|
+
'stac.stageSuperseded': 'Previous fetch superseded by new pan',
|
|
473
|
+
'stac.smokeWarning': 'Storage probe failed, {reason}',
|
|
474
|
+
'stac.smokeWarningHint': 'A representative COG could not be reached. Check connection credentials, bucket CORS, or whether the asset href resolves.',
|
|
475
|
+
'stac.modeViewportApi': 'Mode, viewport refresh on pan, STAC API',
|
|
476
|
+
'stac.modeViewportParquet': 'Mode, viewport refresh on pan, stac-geoparquet',
|
|
477
|
+
'stac.modeStatic': 'Mode, static catalog (one-shot fetch, client-side bbox clipping)',
|
|
478
|
+
'stac.footprints': 'Footprints',
|
|
479
|
+
'stac.footprintsHint': 'Toggle bbox outlines for every loaded item',
|
|
480
|
+
'stac.strip': 'Strip',
|
|
481
|
+
'stac.stripCount': '{count} items',
|
|
482
|
+
'stac.clearSelection': 'Clear selection',
|
|
483
|
+
'stac.thumbLoading': 'Loading…',
|
|
484
|
+
'stac.thumbNone': 'No preview',
|
|
485
|
+
'stac.cloudCover': 'Cloud cover',
|
|
486
|
+
'stac.datetime': 'Datetime',
|
|
487
|
+
'stac.endDatetime': 'End datetime',
|
|
488
|
+
'stac.gsd': 'GSD',
|
|
489
|
+
'stac.platform': 'Platform',
|
|
490
|
+
'stac.constellation': 'Constellation',
|
|
491
|
+
'stac.instruments': 'Instruments',
|
|
492
|
+
'stac.epsg': 'CRS',
|
|
493
|
+
'stac.assets': 'Assets ({count})',
|
|
494
|
+
'stac.assetOpen': 'Open',
|
|
495
|
+
'stac.flyTo': 'Fly to',
|
|
496
|
+
'stac.filterDatetime': 'Filter by datetime',
|
|
497
|
+
'stac.granularityLabel': 'Histogram, {granularity} buckets',
|
|
498
|
+
'stac.granularity.day': 'day',
|
|
499
|
+
'stac.granularity.week': 'week',
|
|
500
|
+
'stac.granularity.month': 'month',
|
|
501
|
+
'stac.granularity.year': 'year',
|
|
502
|
+
'stac.facetTotal': '{count} loaded',
|
|
503
|
+
'stac.facetNoneAvailable': 'No filterable fields detected for this dataset.',
|
|
504
|
+
'stac.resetFilters': 'Reset',
|
|
505
|
+
'stac.filtersActive': 'Filters active',
|
|
506
|
+
'stac.collection': 'Collection',
|
|
507
|
+
'stac.assetRoles': 'Asset roles',
|
|
508
|
+
'stac.copyId': 'Copy id',
|
|
509
|
+
'stac.copyJson': 'Copy JSON',
|
|
510
|
+
'stac.copied': 'Copied',
|
|
511
|
+
'stac.close': 'Close',
|
|
512
|
+
'stac.showRaw': 'Show raw JSON',
|
|
513
|
+
'stac.hideRaw': 'Hide raw JSON',
|
|
411
514
|
// COG Controls
|
|
412
515
|
'cog.style': 'Style',
|
|
516
|
+
'cog.asset': 'Asset',
|
|
413
517
|
'cog.band': 'Band',
|
|
414
518
|
'cog.singleBand': 'Single',
|
|
415
519
|
'cog.colorRamp': 'Color ramp',
|
|
416
520
|
'cog.colorRampSearch': 'Search ramps…',
|
|
417
521
|
'cog.pixelValue': 'Pixel Value',
|
|
418
522
|
'cog.reading': 'Reading pixel...',
|
|
419
|
-
'cog.rescale': 'Rescale',
|
|
420
|
-
'cog.
|
|
523
|
+
'cog.rescale.label': 'Rescale',
|
|
524
|
+
'cog.rescale.reset': 'Reset',
|
|
525
|
+
'cog.nodata.label': 'No-data',
|
|
526
|
+
'cog.nodata.auto': 'Auto',
|
|
527
|
+
'cog.nodata.value': 'Value',
|
|
528
|
+
'cog.nodata.off': 'Off',
|
|
529
|
+
'cog.nodata.autoHint': 'from file: {value}',
|
|
530
|
+
'cog.nodata.autoNone': 'no GDAL_NODATA tag',
|
|
531
|
+
'cog.nodata.valuePlaceholder': 'e.g. -9999',
|
|
421
532
|
// PMTiles Viewer
|
|
422
533
|
'pmtiles.mapView': 'Map',
|
|
423
534
|
'pmtiles.archiveView': 'Archive',
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export type { ChannelComposite, ChannelRef, CogAsset, CogInfo, ConnectionIdentityInput, DatetimeFacet, Defaults, EnumFacet, EnumFacetField, Facet, FacetSet, FacetSort, FacetState, GeoArrowGeomType, GeoArrowResult, GeoBounds, GeoColumnMeta, GeoParquetMeta, GeoType, HexRow, NumericFacet, NumericFacetField, ParquetFileMetadata, ParsedGeometry, ParsedMarkdownDocument, ParsedStorageUrl, PresetDef, SortConfig, SortDirection, SortField, SqlBlock, StacApiCapabilities, StacBboxStruct, StacGeoparquetRow, StacGeoparquetSchemaColumn, StacItemView, StacNativeQuery, StacRowToItemOptions, StacSource, StacSourceBatch, StacSourceCapabilities, StacSourceKind, StacSourceRequest, StorageExtensionVersion, StorageHints, StorageProvider, ToNativeQueryOptions, TypeCategory } from '@walkthru-earth/objex-utils';
|
|
2
|
+
export { allChannelsBand0, applyFacets, applyPreset, applyStorageHintsToConnection, availablePresets, buildDataTypeLabel, buildFacets, buildGeoArrowTables, clampBounds, classifyType, compositeFromUrl, compositeToUrl, connectionIdentityKey, copyToClipboard, DATETIME_HISTOGRAM_BINS, describeParseResult, detectStorageExtensionVersion, emptyFacetState, emptyPushdown, emptyStorageHints, escapeCsvField, extractBounds, extractCogAssets, extractEpsgFromGeoMeta, extractGeometryTypes, extractItemView, extractStorageHints, findGeoColumn, findGeoColumnFromRows, flattenStacBbox, formatDate, formatFileSize, formatValue, generateHexDump, getFileExtension, getNativeScheme, handleLoadError, hasActiveFilters, interpolateTemplates, isAbortError, isSameConnectionIdentity, isSingleAssetComposite, isStacGeoparquetSchema, jsonReplacerBigInt, loadFromStorage, looksLikeUrl, markSqlBlocks, normalizeEndpoint, normalizeGeomType, normalizeProvider, PRESETS, parseMarkdownDocument, parseStorageUrl, parseWKB, persistToStorage, pickNaturalColorComposite, pickStacPrimaryAsset, presetMatchesComposite, readParquetMetadata, residualState, resolveCloudUrl, resolveStacAssetHref, SF_LABELS, STAC_GEOPARQUET_REQUIRED_COLUMNS, safeClamp, safeDecodeURIComponent, serializeToCsv, serializeToJson, sniffApiCapabilities, sortFileEntries, sortViews, stacRowToItem, syntheticSelfAsset, toBinary, toCql2Filter, toggleSortField, toNativeQuery, typeBadgeClass, typeColor, typeLabel, wireCodeCopyButtons } from '@walkthru-earth/objex-utils';
|
|
1
3
|
export { COPY_FEEDBACK_MS, DEFAULT_TARGET_CRS, DUCKDB_INIT_TIMEOUT_MS, LAYER_HUE_MULTIPLIER, MAX_QUERY_HISTORY_ENTRIES, SQL_PREVIEW_LENGTH, STORAGE_KEYS, VIEWER_DIR_EXTENSIONS, WGS84_CODES } from './constants.js';
|
|
2
4
|
export type { DuckDbReadFn, FileCategory, FileTypeInfo, ViewerKind } from './file-icons/index.js';
|
|
3
5
|
export { buildDuckDbSource, getDuckDbReadFn, getFileTypeInfo, getMimeType, getViewerKind, isCloudNativeFormat, isQueryable } from './file-icons/index.js';
|
|
@@ -8,31 +10,3 @@ export type { ProviderDef, ProviderId, ProviderRegion } from './storage/provider
|
|
|
8
10
|
export { buildEndpointFromTemplate, buildProviderBaseUrl, getProvider, isGcsProvider, PROVIDER_IDS, PROVIDERS } from './storage/providers.js';
|
|
9
11
|
export { UrlAdapter } from './storage/url-adapter.js';
|
|
10
12
|
export type { Connection, ConnectionConfig, FileEntry, Tab, Theme, WriteResult } from './types.js';
|
|
11
|
-
export { copyToClipboard, wireCodeCopyButtons } from './utils/clipboard.js';
|
|
12
|
-
export { getNativeScheme, resolveCloudUrl, safeDecodeURIComponent } from './utils/cloud-url.js';
|
|
13
|
-
export type { CogInfo, GeoBounds } from './utils/cog.js';
|
|
14
|
-
export { buildDataTypeLabel, clampBounds, SF_LABELS, safeClamp } from './utils/cog.js';
|
|
15
|
-
export type { TypeCategory } from './utils/column-types.js';
|
|
16
|
-
export { classifyType, typeBadgeClass, typeColor, typeLabel } from './utils/column-types.js';
|
|
17
|
-
export type { ConnectionIdentityInput } from './utils/connection-identity.js';
|
|
18
|
-
export { connectionIdentityKey, isSameConnectionIdentity, normalizeEndpoint, normalizeProvider } from './utils/connection-identity.js';
|
|
19
|
-
export { handleLoadError } from './utils/error.js';
|
|
20
|
-
export { escapeCsvField, serializeToCsv, serializeToJson } from './utils/export.js';
|
|
21
|
-
export type { SortConfig, SortDirection, SortField } from './utils/file-sort.js';
|
|
22
|
-
export { sortFileEntries, toggleSortField } from './utils/file-sort.js';
|
|
23
|
-
export { formatDate, formatFileSize, formatValue, getFileExtension, jsonReplacerBigInt } from './utils/format.js';
|
|
24
|
-
export type { GeoArrowGeomType, GeoArrowResult } from './utils/geoarrow.js';
|
|
25
|
-
export { buildGeoArrowTables, normalizeGeomType } from './utils/geoarrow.js';
|
|
26
|
-
export type { HexRow } from './utils/hex.js';
|
|
27
|
-
export { generateHexDump } from './utils/hex.js';
|
|
28
|
-
export { loadFromStorage, persistToStorage } from './utils/local-storage.js';
|
|
29
|
-
export type { ParsedMarkdownDocument, SqlBlock } from './utils/markdown-sql.js';
|
|
30
|
-
export { interpolateTemplates, markSqlBlocks, parseMarkdownDocument } from './utils/markdown-sql.js';
|
|
31
|
-
export type { GeoColumnMeta, GeoParquetMeta, ParquetFileMetadata } from './utils/parquet-metadata.js';
|
|
32
|
-
export { extractBounds, extractEpsgFromGeoMeta, extractGeometryTypes, readParquetMetadata } from './utils/parquet-metadata.js';
|
|
33
|
-
export type { StacBboxStruct, StacGeoparquetRow, StacGeoparquetSchemaColumn, StacRowToItemOptions } from './utils/stac-geoparquet.js';
|
|
34
|
-
export { flattenStacBbox, isStacGeoparquetSchema, pickStacPrimaryAsset, resolveStacAssetHref, STAC_GEOPARQUET_REQUIRED_COLUMNS, stacRowToItem } from './utils/stac-geoparquet.js';
|
|
35
|
-
export type { Defaults, ParsedStorageUrl, StorageProvider } from './utils/storage-url.js';
|
|
36
|
-
export { describeParseResult, looksLikeUrl, parseStorageUrl } from './utils/storage-url.js';
|
|
37
|
-
export type { GeoType, ParsedGeometry } from './utils/wkb.js';
|
|
38
|
-
export { findGeoColumn, findGeoColumnFromRows, parseWKB, toBinary } from './utils/wkb.js';
|