@walkthru-earth/objex 1.3.0 → 1.4.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 +20 -12
- package/dist/components/browser/FileTreeSidebar.svelte +32 -17
- package/dist/components/layout/AboutSheet.svelte +5 -2
- package/dist/components/layout/ConnectionDialog.svelte +1 -1
- package/dist/components/layout/SettingsSheet.svelte +237 -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 +1 -1
- package/dist/components/layout/TabBar.svelte +2 -2
- 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 +2 -2
- package/dist/components/viewers/CodeViewer.svelte +31 -22
- package/dist/components/viewers/CogControls.svelte +338 -184
- package/dist/components/viewers/CogControls.svelte.d.ts +33 -10
- package/dist/components/viewers/CogViewer.svelte +320 -119
- package/dist/components/viewers/CopcViewer.svelte +1 -1
- package/dist/components/viewers/FlatGeobufViewer.svelte +1 -1
- package/dist/components/viewers/GeoParquetMapViewer.svelte +6 -6
- package/dist/components/viewers/GeoParquetMapViewer.svelte.d.ts +1 -1
- package/dist/components/viewers/ImageViewer.svelte +2 -2
- package/dist/components/viewers/MarkdownViewer.svelte +12 -9
- package/dist/components/viewers/MediaViewer.svelte +2 -2
- package/dist/components/viewers/ModelViewer.svelte +1 -1
- package/dist/components/viewers/MultiCogViewer.svelte +467 -102
- package/dist/components/viewers/MultiCogViewer.svelte.d.ts +1 -1
- package/dist/components/viewers/NotebookViewer.svelte +6 -3
- package/dist/components/viewers/PdfViewer.svelte +2 -2
- package/dist/components/viewers/PmtilesViewer.svelte +3 -6
- package/dist/components/viewers/RawViewer.svelte +6 -3
- package/dist/components/viewers/StacMapViewer.svelte +10 -2
- package/dist/components/viewers/StacMosaicViewer.svelte +1800 -362
- package/dist/components/viewers/StacMosaicViewer.svelte.d.ts +1 -1
- package/dist/components/viewers/StacTabViewer.svelte +24 -13
- package/dist/components/viewers/StacTabViewer.svelte.d.ts +1 -1
- package/dist/components/viewers/TableGrid.svelte +4 -4
- package/dist/components/viewers/TableStatusBar.svelte +1 -1
- package/dist/components/viewers/TableToolbar.svelte +1 -1
- package/dist/components/viewers/TableViewer.svelte +25 -17
- package/dist/components/viewers/TableViewer.svelte.d.ts +1 -0
- package/dist/components/viewers/ViewerRouter.svelte +16 -8
- package/dist/components/viewers/ZarrMapViewer.svelte +11 -9
- package/dist/components/viewers/ZarrViewer.svelte +4 -4
- 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 +1 -1
- package/dist/components/viewers/map/MapContainer.svelte +37 -11
- package/dist/components/viewers/pmtiles/PmtilesArchiveView.svelte +1 -1
- package/dist/components/viewers/pmtiles/PmtilesTileInspector.svelte +1 -1
- 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/file-icons/index.d.ts +1 -1
- package/dist/file-icons/index.js +1 -1
- package/dist/i18n/ar.js +110 -2
- package/dist/i18n/en.js +110 -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 +465 -0
- package/dist/query/wasm.d.ts +8 -0
- package/dist/query/wasm.js +304 -2
- package/dist/storage/presign.js +1 -1
- package/dist/storage/providers.js +5 -5
- 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 +200 -60
- package/dist/utils/cog.js +377 -114
- package/dist/utils/colormap-sprite.d.ts +0 -9
- package/dist/utils/colormap-sprite.js +0 -21
- package/dist/utils/deck.d.ts +16 -12
- package/dist/utils/deck.js +10 -4
- package/dist/utils/pmtiles-tile.js +2 -2
- 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/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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walkthru-earth/objex",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Svelte 5 components and utilities for exploring geospatial object storage — S3, GCS, Azure, R2",
|
|
5
5
|
"author": "Youssef Harby <yharby@walkthru.earth>",
|
|
6
6
|
"license": "CC-BY-4.0",
|
|
@@ -27,41 +27,6 @@
|
|
|
27
27
|
"svelte": "./dist/query/engine.js",
|
|
28
28
|
"import": "./dist/query/engine.js"
|
|
29
29
|
},
|
|
30
|
-
"./utils/wkb": {
|
|
31
|
-
"types": "./dist/utils/wkb.d.ts",
|
|
32
|
-
"svelte": "./dist/utils/wkb.js",
|
|
33
|
-
"import": "./dist/utils/wkb.js"
|
|
34
|
-
},
|
|
35
|
-
"./utils/geoarrow": {
|
|
36
|
-
"types": "./dist/utils/geoarrow.d.ts",
|
|
37
|
-
"svelte": "./dist/utils/geoarrow.js",
|
|
38
|
-
"import": "./dist/utils/geoarrow.js"
|
|
39
|
-
},
|
|
40
|
-
"./utils/storage-url": {
|
|
41
|
-
"types": "./dist/utils/storage-url.d.ts",
|
|
42
|
-
"svelte": "./dist/utils/storage-url.js",
|
|
43
|
-
"import": "./dist/utils/storage-url.js"
|
|
44
|
-
},
|
|
45
|
-
"./utils/parquet-metadata": {
|
|
46
|
-
"types": "./dist/utils/parquet-metadata.d.ts",
|
|
47
|
-
"svelte": "./dist/utils/parquet-metadata.js",
|
|
48
|
-
"import": "./dist/utils/parquet-metadata.js"
|
|
49
|
-
},
|
|
50
|
-
"./utils/format": {
|
|
51
|
-
"types": "./dist/utils/format.d.ts",
|
|
52
|
-
"svelte": "./dist/utils/format.js",
|
|
53
|
-
"import": "./dist/utils/format.js"
|
|
54
|
-
},
|
|
55
|
-
"./utils/hex": {
|
|
56
|
-
"types": "./dist/utils/hex.d.ts",
|
|
57
|
-
"svelte": "./dist/utils/hex.js",
|
|
58
|
-
"import": "./dist/utils/hex.js"
|
|
59
|
-
},
|
|
60
|
-
"./utils/column-types": {
|
|
61
|
-
"types": "./dist/utils/column-types.d.ts",
|
|
62
|
-
"svelte": "./dist/utils/column-types.js",
|
|
63
|
-
"import": "./dist/utils/column-types.js"
|
|
64
|
-
},
|
|
65
30
|
"./file-icons": {
|
|
66
31
|
"types": "./dist/file-icons/index.d.ts",
|
|
67
32
|
"svelte": "./dist/file-icons/index.js",
|
|
@@ -123,85 +88,91 @@
|
|
|
123
88
|
}
|
|
124
89
|
},
|
|
125
90
|
"devDependencies": {
|
|
126
|
-
"@biomejs/biome": "^2.4.
|
|
127
|
-
"@changesets/changelog-github": "^0.
|
|
91
|
+
"@biomejs/biome": "^2.4.16",
|
|
92
|
+
"@changesets/changelog-github": "^0.7.0",
|
|
128
93
|
"@changesets/cli": "^2.31.0",
|
|
129
94
|
"@fontsource/cairo": "^5.2.7",
|
|
130
95
|
"@internationalized/date": "^3.12.1",
|
|
131
|
-
"@lucide/svelte": "^
|
|
96
|
+
"@lucide/svelte": "^1.17.0",
|
|
132
97
|
"@sveltejs/adapter-static": "^3.0.10",
|
|
133
|
-
"@sveltejs/kit": "^2.
|
|
98
|
+
"@sveltejs/kit": "^2.61.1",
|
|
134
99
|
"@sveltejs/package": "^2.5.7",
|
|
135
100
|
"@sveltejs/vite-plugin-svelte": "^6.2.4",
|
|
136
101
|
"@tailwindcss/forms": "^0.5.11",
|
|
137
102
|
"@tailwindcss/typography": "^0.5.19",
|
|
138
|
-
"@tailwindcss/vite": "^4.
|
|
139
|
-
"
|
|
103
|
+
"@tailwindcss/vite": "^4.3.0",
|
|
104
|
+
"@types/node": "^25.9.1",
|
|
105
|
+
"bits-ui": "^2.18.1",
|
|
140
106
|
"clsx": "^2.1.1",
|
|
141
|
-
"knip": "^6.
|
|
142
|
-
"lefthook": "^2.1.
|
|
107
|
+
"knip": "^6.14.2",
|
|
108
|
+
"lefthook": "^2.1.8",
|
|
143
109
|
"paneforge": "^1.0.2",
|
|
144
|
-
"posthog-js": "^1.
|
|
145
|
-
"publint": "^0.3.
|
|
146
|
-
"svelte": "^5.55.
|
|
147
|
-
"svelte-check": "^4.4.
|
|
148
|
-
"tailwind-merge": "^3.
|
|
110
|
+
"posthog-js": "^1.376.3",
|
|
111
|
+
"publint": "^0.3.21",
|
|
112
|
+
"svelte": "^5.55.10",
|
|
113
|
+
"svelte-check": "^4.4.8",
|
|
114
|
+
"tailwind-merge": "^3.6.0",
|
|
149
115
|
"tailwind-variants": "^3.2.2",
|
|
150
|
-
"tailwindcss": "^4.
|
|
116
|
+
"tailwindcss": "^4.3.0",
|
|
151
117
|
"tw-animate-css": "^1.4.0",
|
|
152
|
-
"typescript": "^
|
|
153
|
-
"vite": "^7.3.
|
|
118
|
+
"typescript": "^6.0.3",
|
|
119
|
+
"vite": "^7.3.3"
|
|
154
120
|
},
|
|
155
121
|
"dependencies": {
|
|
156
|
-
"@babylonjs/core": "^
|
|
157
|
-
"@babylonjs/loaders": "^
|
|
158
|
-
"
|
|
159
|
-
"@
|
|
122
|
+
"@babylonjs/core": "^9.10.0",
|
|
123
|
+
"@babylonjs/loaders": "^9.10.0",
|
|
124
|
+
"babylonjs-gltf2interface": "^9.10.0",
|
|
125
|
+
"@carbonplan/zarr-layer": "^0.5.0",
|
|
126
|
+
"@chunkd/middleware": "^11.3.1",
|
|
127
|
+
"@chunkd/source": "^11.4.1",
|
|
128
|
+
"@chunkd/source-http": "^11.4.1",
|
|
129
|
+
"@codemirror/autocomplete": "^6.20.2",
|
|
160
130
|
"@codemirror/commands": "^6.10.3",
|
|
161
131
|
"@codemirror/lang-sql": "^6.10.0",
|
|
162
132
|
"@codemirror/language": "^6.12.3",
|
|
163
133
|
"@codemirror/state": "^6.6.0",
|
|
164
134
|
"@codemirror/theme-one-dark": "^6.1.3",
|
|
165
|
-
"@codemirror/view": "^6.
|
|
166
|
-
"@deck.gl/core": "^9.3.
|
|
167
|
-
"@deck.gl/geo-layers": "^9.3.
|
|
168
|
-
"@deck.gl/layers": "^9.3.
|
|
169
|
-
"@deck.gl/mapbox": "^9.3.
|
|
170
|
-
"@deck.gl/mesh-layers": "^9.3.
|
|
171
|
-
"@developmentseed/deck.gl-geotiff": "0.
|
|
172
|
-
"@developmentseed/deck.gl-raster": "0.
|
|
173
|
-
"@developmentseed/deck.gl-zarr": "0.
|
|
174
|
-
"@developmentseed/epsg": "0.
|
|
175
|
-
"@developmentseed/geotiff": "0.
|
|
176
|
-
"@developmentseed/proj": "0.
|
|
177
|
-
"@duckdb/duckdb-wasm": "1.33.1-
|
|
178
|
-
"@geoarrow/deck.gl-
|
|
135
|
+
"@codemirror/view": "^6.43.0",
|
|
136
|
+
"@deck.gl/core": "^9.3.2",
|
|
137
|
+
"@deck.gl/geo-layers": "^9.3.2",
|
|
138
|
+
"@deck.gl/layers": "^9.3.2",
|
|
139
|
+
"@deck.gl/mapbox": "^9.3.2",
|
|
140
|
+
"@deck.gl/mesh-layers": "^9.3.2",
|
|
141
|
+
"@developmentseed/deck.gl-geotiff": "0.7.0",
|
|
142
|
+
"@developmentseed/deck.gl-raster": "0.7.0",
|
|
143
|
+
"@developmentseed/deck.gl-zarr": "0.7.0",
|
|
144
|
+
"@developmentseed/epsg": "0.7.0",
|
|
145
|
+
"@developmentseed/geotiff": "0.7.0",
|
|
146
|
+
"@developmentseed/proj": "0.7.0",
|
|
147
|
+
"@duckdb/duckdb-wasm": "1.33.1-dev55.0",
|
|
148
|
+
"@geoarrow/deck.gl-geoarrow": "^0.4.1",
|
|
179
149
|
"@luma.gl/core": "^9.3.3",
|
|
180
|
-
"@mapbox/vector-tile": "^
|
|
181
|
-
"@milkdown/kit": "^7.
|
|
182
|
-
"@milkdown/theme-nord": "^7.
|
|
150
|
+
"@mapbox/vector-tile": "^3.0.0",
|
|
151
|
+
"@milkdown/kit": "^7.21.1",
|
|
152
|
+
"@milkdown/theme-nord": "^7.21.1",
|
|
183
153
|
"@repeaterjs/repeater": "^3.0.6",
|
|
184
154
|
"@zip.js/zip.js": "^2.8.26",
|
|
185
155
|
"ansi_up": "^6.0.6",
|
|
186
156
|
"apache-arrow": "^21.1.0",
|
|
187
157
|
"aws4fetch": "^1.0.20",
|
|
188
158
|
"chart.js": "^4.5.1",
|
|
189
|
-
"deck.gl": "^9.3.
|
|
159
|
+
"deck.gl": "^9.3.2",
|
|
190
160
|
"flatgeobuf": "^4.4.0",
|
|
191
|
-
"hyparquet": "^1.
|
|
161
|
+
"hyparquet": "^1.26.0",
|
|
192
162
|
"hyparquet-compressors": "^1.1.1",
|
|
193
163
|
"lz-string": "^1.5.0",
|
|
194
164
|
"maplibre-gl": "^5.24.0",
|
|
195
|
-
"marked": "^
|
|
196
|
-
"mermaid": "^11.
|
|
197
|
-
"pbf": "^
|
|
198
|
-
"pdfjs-dist": "^5.
|
|
165
|
+
"marked": "^18.0.4",
|
|
166
|
+
"mermaid": "^11.15.0",
|
|
167
|
+
"pbf": "^5.0.0",
|
|
168
|
+
"pdfjs-dist": "^5.7.284",
|
|
199
169
|
"pmtiles": "^4.4.1",
|
|
200
170
|
"proj4": "^2.20.8",
|
|
201
|
-
"shiki": "^
|
|
202
|
-
"sql-formatter": "^15.
|
|
203
|
-
"yaml": "^2.
|
|
204
|
-
"zarrita": "^0.7.
|
|
171
|
+
"shiki": "^4.1.0",
|
|
172
|
+
"sql-formatter": "^15.8.0",
|
|
173
|
+
"yaml": "^2.9.0",
|
|
174
|
+
"zarrita": "^0.7.3",
|
|
175
|
+
"@walkthru-earth/objex-utils": "1.4.0"
|
|
205
176
|
},
|
|
206
177
|
"scripts": {
|
|
207
178
|
"dev": "vite dev",
|
|
@@ -215,6 +186,6 @@
|
|
|
215
186
|
"format": "biome format --write src/ packages/",
|
|
216
187
|
"format:check": "biome format src/ packages/",
|
|
217
188
|
"deadcode": "knip",
|
|
218
|
-
"ci:publish": "pnpm
|
|
189
|
+
"ci:publish": "pnpm --filter @walkthru-earth/objex-utils run build && pnpm run package && pnpm publish -r --access public --no-git-checks --provenance"
|
|
219
190
|
}
|
|
220
191
|
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { ChevronRight, Home } from '@lucide/svelte';
|
|
3
|
-
import { t } from '../../i18n/index.svelte.js';
|
|
4
|
-
|
|
5
|
-
let { path, onNavigate }: { path: string; onNavigate: (path: string) => void } = $props();
|
|
6
|
-
|
|
7
|
-
const segments = $derived.by(() => {
|
|
8
|
-
if (!path || path === '/') return [];
|
|
9
|
-
// Remove leading/trailing slashes and split
|
|
10
|
-
const clean = path.replace(/^\/+|\/+$/g, '');
|
|
11
|
-
if (!clean) return [];
|
|
12
|
-
return clean.split('/');
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
function navigateToSegment(index: number) {
|
|
16
|
-
if (index < 0) {
|
|
17
|
-
onNavigate('');
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
const targetPath = segments.slice(0, index + 1).join('/');
|
|
21
|
-
onNavigate(targetPath);
|
|
22
|
-
}
|
|
23
|
-
</script>
|
|
24
|
-
|
|
25
|
-
<nav class="flex items-center gap-1 overflow-x-auto text-sm" aria-label="Breadcrumb">
|
|
26
|
-
<button
|
|
27
|
-
class="text-muted-foreground hover:text-foreground flex shrink-0 items-center gap-1 rounded px-1.5 py-0.5 transition-colors hover:bg-accent"
|
|
28
|
-
onclick={() => navigateToSegment(-1)}
|
|
29
|
-
aria-label={t('breadcrumb.root')}
|
|
30
|
-
>
|
|
31
|
-
<Home class="size-3.5" />
|
|
32
|
-
</button>
|
|
33
|
-
|
|
34
|
-
{#each segments as segment, i}
|
|
35
|
-
<ChevronRight class="text-muted-foreground/50 size-3.5 shrink-0 rtl:-scale-x-100" />
|
|
36
|
-
|
|
37
|
-
{#if i === segments.length - 1}
|
|
38
|
-
<span class="text-foreground truncate rounded px-1.5 py-0.5 font-medium">
|
|
39
|
-
{segment}
|
|
40
|
-
</span>
|
|
41
|
-
{:else}
|
|
42
|
-
<button
|
|
43
|
-
class="text-muted-foreground hover:text-foreground truncate rounded px-1.5 py-0.5 transition-colors hover:bg-accent"
|
|
44
|
-
onclick={() => navigateToSegment(i)}
|
|
45
|
-
>
|
|
46
|
-
{segment}
|
|
47
|
-
</button>
|
|
48
|
-
{/if}
|
|
49
|
-
{/each}
|
|
50
|
-
</nav>
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import FolderPlusIcon from '@lucide/svelte/icons/folder-plus';
|
|
3
|
-
import Loader2Icon from '@lucide/svelte/icons/loader-2';
|
|
4
|
-
import { Button } from '../ui/button/index.js';
|
|
5
|
-
import { Input } from '../ui/input/index.js';
|
|
6
|
-
import {
|
|
7
|
-
Sheet,
|
|
8
|
-
SheetContent,
|
|
9
|
-
SheetDescription,
|
|
10
|
-
SheetFooter,
|
|
11
|
-
SheetHeader,
|
|
12
|
-
SheetTitle
|
|
13
|
-
} from '../ui/sheet/index.js';
|
|
14
|
-
import { t } from '../../i18n/index.svelte.js';
|
|
15
|
-
import { browser } from '../../stores/browser.svelte.js';
|
|
16
|
-
|
|
17
|
-
interface Props {
|
|
18
|
-
open: boolean;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
let { open = $bindable(false) }: Props = $props();
|
|
22
|
-
|
|
23
|
-
let folderName = $state('');
|
|
24
|
-
let creating = $state(false);
|
|
25
|
-
let error = $state<string | null>(null);
|
|
26
|
-
|
|
27
|
-
const invalidChars = /[/\\*?"<>|]/;
|
|
28
|
-
let canCreate = $derived(folderName.trim() !== '' && !invalidChars.test(folderName));
|
|
29
|
-
|
|
30
|
-
$effect(() => {
|
|
31
|
-
if (open) {
|
|
32
|
-
folderName = '';
|
|
33
|
-
creating = false;
|
|
34
|
-
error = null;
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
async function handleCreate() {
|
|
39
|
-
if (!canCreate) return;
|
|
40
|
-
creating = true;
|
|
41
|
-
error = null;
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
await browser.createFolder(folderName.trim());
|
|
45
|
-
open = false;
|
|
46
|
-
} catch (e) {
|
|
47
|
-
error = e instanceof Error ? e.message : String(e);
|
|
48
|
-
} finally {
|
|
49
|
-
creating = false;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function handleKeydown(e: KeyboardEvent) {
|
|
54
|
-
if (e.key === 'Enter' && canCreate) {
|
|
55
|
-
handleCreate();
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
</script>
|
|
59
|
-
|
|
60
|
-
<Sheet bind:open>
|
|
61
|
-
<SheetContent side="bottom" class="sm:max-w-lg sm:mx-auto sm:rounded-t-lg">
|
|
62
|
-
<SheetHeader>
|
|
63
|
-
<div class="flex items-center gap-2">
|
|
64
|
-
<FolderPlusIcon class="size-5 text-primary" />
|
|
65
|
-
<SheetTitle>{t('createFolder.title')}</SheetTitle>
|
|
66
|
-
</div>
|
|
67
|
-
<SheetDescription>
|
|
68
|
-
{t('createFolder.description')}
|
|
69
|
-
</SheetDescription>
|
|
70
|
-
</SheetHeader>
|
|
71
|
-
|
|
72
|
-
<div class="py-4">
|
|
73
|
-
<Input
|
|
74
|
-
placeholder={t('createFolder.placeholder')}
|
|
75
|
-
bind:value={folderName}
|
|
76
|
-
onkeydown={handleKeydown}
|
|
77
|
-
/>
|
|
78
|
-
{#if error}
|
|
79
|
-
<p class="mt-2 text-sm text-destructive">{error}</p>
|
|
80
|
-
{/if}
|
|
81
|
-
</div>
|
|
82
|
-
|
|
83
|
-
<SheetFooter class="flex-row gap-2">
|
|
84
|
-
<div class="flex-1"></div>
|
|
85
|
-
<Button variant="ghost" size="sm" onclick={() => { open = false; }} disabled={creating}>
|
|
86
|
-
{t('createFolder.cancel')}
|
|
87
|
-
</Button>
|
|
88
|
-
<Button size="sm" disabled={!canCreate || creating} onclick={handleCreate}>
|
|
89
|
-
{#if creating}
|
|
90
|
-
<Loader2Icon class="me-1.5 size-4 animate-spin" />
|
|
91
|
-
{t('createFolder.creating')}
|
|
92
|
-
{:else}
|
|
93
|
-
{t('createFolder.create')}
|
|
94
|
-
{/if}
|
|
95
|
-
</Button>
|
|
96
|
-
</SheetFooter>
|
|
97
|
-
</SheetContent>
|
|
98
|
-
</Sheet>
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import Loader2Icon from '@lucide/svelte/icons/loader-2';
|
|
3
|
-
import TriangleAlertIcon from '@lucide/svelte/icons/triangle-alert';
|
|
4
|
-
import { Button } from '../ui/button/index.js';
|
|
5
|
-
import {
|
|
6
|
-
Sheet,
|
|
7
|
-
SheetContent,
|
|
8
|
-
SheetDescription,
|
|
9
|
-
SheetFooter,
|
|
10
|
-
SheetHeader,
|
|
11
|
-
SheetTitle
|
|
12
|
-
} from '../ui/sheet/index.js';
|
|
13
|
-
import { t } from '../../i18n/index.svelte.js';
|
|
14
|
-
import { browser } from '../../stores/browser.svelte.js';
|
|
15
|
-
import type { FileEntry } from '../../types.js';
|
|
16
|
-
|
|
17
|
-
interface Props {
|
|
18
|
-
open: boolean;
|
|
19
|
-
entry: FileEntry | null;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
let { open = $bindable(false), entry }: Props = $props();
|
|
23
|
-
|
|
24
|
-
let deleting = $state(false);
|
|
25
|
-
let error = $state<string | null>(null);
|
|
26
|
-
|
|
27
|
-
$effect(() => {
|
|
28
|
-
if (open) {
|
|
29
|
-
deleting = false;
|
|
30
|
-
error = null;
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
async function handleDelete() {
|
|
35
|
-
if (!entry) return;
|
|
36
|
-
deleting = true;
|
|
37
|
-
error = null;
|
|
38
|
-
|
|
39
|
-
try {
|
|
40
|
-
await browser.deleteEntry(entry);
|
|
41
|
-
open = false;
|
|
42
|
-
} catch (e) {
|
|
43
|
-
error = e instanceof Error ? e.message : String(e);
|
|
44
|
-
} finally {
|
|
45
|
-
deleting = false;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
</script>
|
|
49
|
-
|
|
50
|
-
<Sheet bind:open>
|
|
51
|
-
<SheetContent side="bottom" class="sm:max-w-lg sm:mx-auto sm:rounded-t-lg">
|
|
52
|
-
<SheetHeader>
|
|
53
|
-
<div class="flex items-center gap-2">
|
|
54
|
-
<TriangleAlertIcon class="size-5 text-destructive" />
|
|
55
|
-
<SheetTitle>{t('deleteConfirm.title')}</SheetTitle>
|
|
56
|
-
</div>
|
|
57
|
-
<SheetDescription>
|
|
58
|
-
{t('deleteConfirm.description')}
|
|
59
|
-
</SheetDescription>
|
|
60
|
-
</SheetHeader>
|
|
61
|
-
|
|
62
|
-
<div class="py-4">
|
|
63
|
-
{#if entry}
|
|
64
|
-
<p class="text-sm">
|
|
65
|
-
Are you sure you want to delete
|
|
66
|
-
<span class="font-medium">{entry.name}</span>{entry.is_dir ? ' and all its contents' : ''}?
|
|
67
|
-
</p>
|
|
68
|
-
{/if}
|
|
69
|
-
|
|
70
|
-
{#if error}
|
|
71
|
-
<p class="mt-2 text-sm text-destructive">{error}</p>
|
|
72
|
-
{/if}
|
|
73
|
-
</div>
|
|
74
|
-
|
|
75
|
-
<SheetFooter class="flex-row gap-2">
|
|
76
|
-
<div class="flex-1"></div>
|
|
77
|
-
<Button variant="ghost" size="sm" onclick={() => { open = false; }} disabled={deleting}>
|
|
78
|
-
{t('deleteConfirm.cancel')}
|
|
79
|
-
</Button>
|
|
80
|
-
<Button variant="destructive" size="sm" disabled={deleting} onclick={handleDelete}>
|
|
81
|
-
{#if deleting}
|
|
82
|
-
<Loader2Icon class="me-1.5 size-4 animate-spin" />
|
|
83
|
-
{t('deleteConfirm.deleting')}
|
|
84
|
-
{:else}
|
|
85
|
-
{t('deleteConfirm.delete')}
|
|
86
|
-
{/if}
|
|
87
|
-
</Button>
|
|
88
|
-
</SheetFooter>
|
|
89
|
-
</SheetContent>
|
|
90
|
-
</Sheet>
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { FileEntry } from '../../types.js';
|
|
2
|
-
interface Props {
|
|
3
|
-
open: boolean;
|
|
4
|
-
entry: FileEntry | null;
|
|
5
|
-
}
|
|
6
|
-
declare const DeleteConfirmDialog: import("svelte").Component<Props, {}, "open">;
|
|
7
|
-
type DeleteConfirmDialog = ReturnType<typeof DeleteConfirmDialog>;
|
|
8
|
-
export default DeleteConfirmDialog;
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import UploadCloudIcon from '@lucide/svelte/icons/upload-cloud';
|
|
3
|
-
import type { Snippet } from 'svelte';
|
|
4
|
-
import { t } from '../../i18n/index.svelte.js';
|
|
5
|
-
import { browser } from '../../stores/browser.svelte.js';
|
|
6
|
-
import { safeLock } from '../../stores/safelock.svelte.js';
|
|
7
|
-
|
|
8
|
-
let { children }: { children: Snippet } = $props();
|
|
9
|
-
|
|
10
|
-
let dragOver = $state(false);
|
|
11
|
-
let dragCounter = 0;
|
|
12
|
-
|
|
13
|
-
let active = $derived(browser.canWrite && !safeLock.locked);
|
|
14
|
-
|
|
15
|
-
function handleDragEnter(e: DragEvent) {
|
|
16
|
-
if (!active) return;
|
|
17
|
-
e.preventDefault();
|
|
18
|
-
dragCounter++;
|
|
19
|
-
dragOver = true;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function handleDragLeave(e: DragEvent) {
|
|
23
|
-
if (!active) return;
|
|
24
|
-
e.preventDefault();
|
|
25
|
-
dragCounter--;
|
|
26
|
-
if (dragCounter <= 0) {
|
|
27
|
-
dragOver = false;
|
|
28
|
-
dragCounter = 0;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function handleDragOver(e: DragEvent) {
|
|
33
|
-
if (!active) return;
|
|
34
|
-
e.preventDefault();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
async function handleDrop(e: DragEvent) {
|
|
38
|
-
if (!active) return;
|
|
39
|
-
e.preventDefault();
|
|
40
|
-
dragOver = false;
|
|
41
|
-
dragCounter = 0;
|
|
42
|
-
|
|
43
|
-
const droppedFiles = e.dataTransfer?.files;
|
|
44
|
-
if (!droppedFiles || droppedFiles.length === 0) return;
|
|
45
|
-
|
|
46
|
-
const files: Array<{ name: string; data: Uint8Array; type?: string }> = [];
|
|
47
|
-
|
|
48
|
-
for (const file of droppedFiles) {
|
|
49
|
-
const buffer = await file.arrayBuffer();
|
|
50
|
-
files.push({
|
|
51
|
-
name: file.name,
|
|
52
|
-
data: new Uint8Array(buffer),
|
|
53
|
-
type: file.type || undefined
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
try {
|
|
58
|
-
await browser.uploadFiles(files);
|
|
59
|
-
} catch (err) {
|
|
60
|
-
console.error('Drop upload failed:', err);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
</script>
|
|
64
|
-
|
|
65
|
-
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
66
|
-
<div
|
|
67
|
-
class="relative h-full"
|
|
68
|
-
ondragenter={handleDragEnter}
|
|
69
|
-
ondragleave={handleDragLeave}
|
|
70
|
-
ondragover={handleDragOver}
|
|
71
|
-
ondrop={handleDrop}
|
|
72
|
-
>
|
|
73
|
-
{@render children()}
|
|
74
|
-
|
|
75
|
-
{#if dragOver && active}
|
|
76
|
-
<div
|
|
77
|
-
class="absolute inset-0 z-50 flex flex-col items-center justify-center gap-2 rounded-md border-2 border-dashed border-primary/50 bg-primary/5 backdrop-blur-sm"
|
|
78
|
-
>
|
|
79
|
-
<UploadCloudIcon class="size-10 text-primary/70" />
|
|
80
|
-
<p class="text-sm font-medium text-primary/70">{t('dropZone.message')}</p>
|
|
81
|
-
</div>
|
|
82
|
-
{/if}
|
|
83
|
-
</div>
|