@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.
Files changed (182) hide show
  1. package/LICENSE +5 -0
  2. package/README.md +20 -12
  3. package/dist/components/browser/FileTreeSidebar.svelte +32 -17
  4. package/dist/components/layout/AboutSheet.svelte +5 -2
  5. package/dist/components/layout/ConnectionDialog.svelte +1 -1
  6. package/dist/components/layout/SettingsSheet.svelte +237 -0
  7. package/dist/components/layout/SettingsSheet.svelte.d.ts +6 -0
  8. package/dist/components/layout/Sidebar.svelte +73 -6
  9. package/dist/components/layout/Sidebar.svelte.d.ts +4 -1
  10. package/dist/components/layout/StatusBar.svelte +1 -1
  11. package/dist/components/layout/TabBar.svelte +2 -2
  12. package/dist/components/ui/context-menu/context-menu-radio-group.svelte.d.ts +1 -1
  13. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte.d.ts +1 -1
  14. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte.d.ts +1 -1
  15. package/dist/components/ui/input/input.svelte.d.ts +1 -1
  16. package/dist/components/ui/resizable/index.d.ts +1 -1
  17. package/dist/components/ui/resizable/index.js +2 -2
  18. package/dist/components/ui/slider/index.d.ts +3 -0
  19. package/dist/components/ui/slider/index.js +5 -0
  20. package/dist/components/ui/slider/range-slider.svelte +94 -0
  21. package/dist/components/ui/slider/range-slider.svelte.d.ts +21 -0
  22. package/dist/components/ui/slider/slider.svelte +83 -0
  23. package/dist/components/ui/slider/slider.svelte.d.ts +7 -0
  24. package/dist/components/viewers/ArchiveViewer.svelte +2 -2
  25. package/dist/components/viewers/CodeViewer.svelte +31 -22
  26. package/dist/components/viewers/CogControls.svelte +338 -184
  27. package/dist/components/viewers/CogControls.svelte.d.ts +33 -10
  28. package/dist/components/viewers/CogViewer.svelte +320 -119
  29. package/dist/components/viewers/CopcViewer.svelte +1 -1
  30. package/dist/components/viewers/FlatGeobufViewer.svelte +1 -1
  31. package/dist/components/viewers/GeoParquetMapViewer.svelte +6 -6
  32. package/dist/components/viewers/GeoParquetMapViewer.svelte.d.ts +1 -1
  33. package/dist/components/viewers/ImageViewer.svelte +2 -2
  34. package/dist/components/viewers/MarkdownViewer.svelte +12 -9
  35. package/dist/components/viewers/MediaViewer.svelte +2 -2
  36. package/dist/components/viewers/ModelViewer.svelte +1 -1
  37. package/dist/components/viewers/MultiCogViewer.svelte +467 -102
  38. package/dist/components/viewers/MultiCogViewer.svelte.d.ts +1 -1
  39. package/dist/components/viewers/NotebookViewer.svelte +6 -3
  40. package/dist/components/viewers/PdfViewer.svelte +2 -2
  41. package/dist/components/viewers/PmtilesViewer.svelte +3 -6
  42. package/dist/components/viewers/RawViewer.svelte +6 -3
  43. package/dist/components/viewers/StacMapViewer.svelte +10 -2
  44. package/dist/components/viewers/StacMosaicViewer.svelte +1800 -362
  45. package/dist/components/viewers/StacMosaicViewer.svelte.d.ts +1 -1
  46. package/dist/components/viewers/StacTabViewer.svelte +24 -13
  47. package/dist/components/viewers/StacTabViewer.svelte.d.ts +1 -1
  48. package/dist/components/viewers/TableGrid.svelte +4 -4
  49. package/dist/components/viewers/TableStatusBar.svelte +1 -1
  50. package/dist/components/viewers/TableToolbar.svelte +1 -1
  51. package/dist/components/viewers/TableViewer.svelte +25 -17
  52. package/dist/components/viewers/TableViewer.svelte.d.ts +1 -0
  53. package/dist/components/viewers/ViewerRouter.svelte +16 -8
  54. package/dist/components/viewers/ZarrMapViewer.svelte +11 -9
  55. package/dist/components/viewers/ZarrViewer.svelte +4 -4
  56. package/dist/components/viewers/cog/ChannelPicker.svelte +83 -0
  57. package/dist/components/viewers/cog/ChannelPicker.svelte.d.ts +13 -0
  58. package/dist/components/viewers/cog/PixelInspectorPanel.svelte +87 -0
  59. package/dist/components/viewers/cog/PixelInspectorPanel.svelte.d.ts +17 -0
  60. package/dist/components/viewers/cog/buildRgbLayer.d.ts +78 -0
  61. package/dist/components/viewers/cog/buildRgbLayer.js +176 -0
  62. package/dist/components/viewers/map/AttributeTable.svelte +1 -1
  63. package/dist/components/viewers/map/MapContainer.svelte +37 -11
  64. package/dist/components/viewers/pmtiles/PmtilesArchiveView.svelte +1 -1
  65. package/dist/components/viewers/pmtiles/PmtilesTileInspector.svelte +1 -1
  66. package/dist/components/viewers/stac/StacDatetimeBar.svelte +175 -0
  67. package/dist/components/viewers/stac/StacDatetimeBar.svelte.d.ts +10 -0
  68. package/dist/components/viewers/stac/StacFilterPanel.svelte +243 -0
  69. package/dist/components/viewers/stac/StacFilterPanel.svelte.d.ts +14 -0
  70. package/dist/components/viewers/stac/StacItemInspector.svelte +223 -0
  71. package/dist/components/viewers/stac/StacItemInspector.svelte.d.ts +10 -0
  72. package/dist/components/viewers/stac/StacItemStrip.svelte +228 -0
  73. package/dist/components/viewers/stac/StacItemStrip.svelte.d.ts +12 -0
  74. package/dist/file-icons/index.d.ts +1 -1
  75. package/dist/file-icons/index.js +1 -1
  76. package/dist/i18n/ar.js +110 -2
  77. package/dist/i18n/en.js +110 -2
  78. package/dist/index.d.ts +2 -28
  79. package/dist/index.js +7 -23
  80. package/dist/query/engine.d.ts +10 -0
  81. package/dist/query/source.js +1 -1
  82. package/dist/query/stac-source-factory.d.ts +65 -0
  83. package/dist/query/stac-source-factory.js +77 -0
  84. package/dist/query/stac-source-parquet.d.ts +135 -0
  85. package/dist/query/stac-source-parquet.js +465 -0
  86. package/dist/query/wasm.d.ts +8 -0
  87. package/dist/query/wasm.js +304 -2
  88. package/dist/storage/presign.js +1 -1
  89. package/dist/storage/providers.js +5 -5
  90. package/dist/stores/config.svelte.d.ts +15 -0
  91. package/dist/stores/config.svelte.js +46 -0
  92. package/dist/stores/connections.svelte.d.ts +2 -2
  93. package/dist/stores/connections.svelte.js +1 -2
  94. package/dist/stores/files.svelte.d.ts +1 -1
  95. package/dist/stores/files.svelte.js +1 -1
  96. package/dist/stores/query-history.svelte.js +1 -1
  97. package/dist/stores/settings.svelte.d.ts +16 -1
  98. package/dist/stores/settings.svelte.js +104 -48
  99. package/dist/stores/tabs.svelte.d.ts +3 -0
  100. package/dist/stores/tabs.svelte.js +17 -0
  101. package/dist/utils/cog-histogram.d.ts +121 -0
  102. package/dist/utils/cog-histogram.js +424 -0
  103. package/dist/utils/cog.d.ts +200 -60
  104. package/dist/utils/cog.js +377 -114
  105. package/dist/utils/colormap-sprite.d.ts +0 -9
  106. package/dist/utils/colormap-sprite.js +0 -21
  107. package/dist/utils/deck.d.ts +16 -12
  108. package/dist/utils/deck.js +10 -4
  109. package/dist/utils/pmtiles-tile.js +2 -2
  110. package/dist/utils/{url.d.ts → signed-url.d.ts} +15 -1
  111. package/dist/utils/{url.js → signed-url.js} +32 -10
  112. package/dist/utils/url-state.d.ts +36 -0
  113. package/dist/utils/url-state.js +72 -2
  114. package/dist/utils/zarr-tab.d.ts +1 -2
  115. package/dist/utils/zarr-tab.js +1 -2
  116. package/dist/utils/zarr.d.ts +0 -17
  117. package/dist/utils/zarr.js +1 -45
  118. package/package.json +55 -84
  119. package/dist/components/browser/Breadcrumb.svelte +0 -50
  120. package/dist/components/browser/Breadcrumb.svelte.d.ts +0 -7
  121. package/dist/components/browser/CreateFolderDialog.svelte +0 -98
  122. package/dist/components/browser/CreateFolderDialog.svelte.d.ts +0 -6
  123. package/dist/components/browser/DeleteConfirmDialog.svelte +0 -90
  124. package/dist/components/browser/DeleteConfirmDialog.svelte.d.ts +0 -8
  125. package/dist/components/browser/DropZone.svelte +0 -83
  126. package/dist/components/browser/DropZone.svelte.d.ts +0 -7
  127. package/dist/components/browser/FileBrowser.svelte +0 -252
  128. package/dist/components/browser/FileBrowser.svelte.d.ts +0 -3
  129. package/dist/components/browser/FileRow.svelte +0 -117
  130. package/dist/components/browser/FileRow.svelte.d.ts +0 -9
  131. package/dist/components/browser/RenameDialog.svelte +0 -101
  132. package/dist/components/browser/RenameDialog.svelte.d.ts +0 -8
  133. package/dist/components/browser/SearchBar.svelte +0 -40
  134. package/dist/components/browser/SearchBar.svelte.d.ts +0 -6
  135. package/dist/components/browser/UploadButton.svelte +0 -65
  136. package/dist/components/browser/UploadButton.svelte.d.ts +0 -3
  137. package/dist/query/stac-geoparquet.d.ts +0 -31
  138. package/dist/query/stac-geoparquet.js +0 -136
  139. package/dist/utils/clipboard.d.ts +0 -13
  140. package/dist/utils/clipboard.js +0 -38
  141. package/dist/utils/cloud-url.d.ts +0 -27
  142. package/dist/utils/cloud-url.js +0 -61
  143. package/dist/utils/column-types.d.ts +0 -5
  144. package/dist/utils/column-types.js +0 -137
  145. package/dist/utils/connection-identity.d.ts +0 -51
  146. package/dist/utils/connection-identity.js +0 -97
  147. package/dist/utils/error.d.ts +0 -8
  148. package/dist/utils/error.js +0 -12
  149. package/dist/utils/evidence-context.d.ts +0 -22
  150. package/dist/utils/evidence-context.js +0 -56
  151. package/dist/utils/export.d.ts +0 -22
  152. package/dist/utils/export.js +0 -76
  153. package/dist/utils/file-sort.d.ts +0 -20
  154. package/dist/utils/file-sort.js +0 -41
  155. package/dist/utils/format.d.ts +0 -24
  156. package/dist/utils/format.js +0 -78
  157. package/dist/utils/geoarrow.d.ts +0 -32
  158. package/dist/utils/geoarrow.js +0 -672
  159. package/dist/utils/geometry-type.d.ts +0 -52
  160. package/dist/utils/geometry-type.js +0 -76
  161. package/dist/utils/hex.d.ts +0 -10
  162. package/dist/utils/hex.js +0 -27
  163. package/dist/utils/host-detection.d.ts +0 -23
  164. package/dist/utils/host-detection.js +0 -95
  165. package/dist/utils/local-storage.d.ts +0 -16
  166. package/dist/utils/local-storage.js +0 -37
  167. package/dist/utils/markdown-sql.d.ts +0 -30
  168. package/dist/utils/markdown-sql.js +0 -72
  169. package/dist/utils/notebook.d.ts +0 -59
  170. package/dist/utils/notebook.js +0 -211
  171. package/dist/utils/parquet-metadata.d.ts +0 -64
  172. package/dist/utils/parquet-metadata.js +0 -262
  173. package/dist/utils/stac-geoparquet.d.ts +0 -90
  174. package/dist/utils/stac-geoparquet.js +0 -223
  175. package/dist/utils/stac-hydrate.d.ts +0 -38
  176. package/dist/utils/stac-hydrate.js +0 -243
  177. package/dist/utils/stac.d.ts +0 -136
  178. package/dist/utils/stac.js +0 -176
  179. package/dist/utils/storage-url.d.ts +0 -90
  180. package/dist/utils/storage-url.js +0 -568
  181. package/dist/utils/wkb.d.ts +0 -43
  182. 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.0",
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.13",
127
- "@changesets/changelog-github": "^0.5.2",
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": "^0.561.0",
96
+ "@lucide/svelte": "^1.17.0",
132
97
  "@sveltejs/adapter-static": "^3.0.10",
133
- "@sveltejs/kit": "^2.58.0",
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.2.4",
139
- "bits-ui": "^2.18.0",
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.6.2",
142
- "lefthook": "^2.1.6",
107
+ "knip": "^6.14.2",
108
+ "lefthook": "^2.1.8",
143
109
  "paneforge": "^1.0.2",
144
- "posthog-js": "^1.371.3",
145
- "publint": "^0.3.18",
146
- "svelte": "^5.55.5",
147
- "svelte-check": "^4.4.6",
148
- "tailwind-merge": "^3.5.0",
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.2.4",
116
+ "tailwindcss": "^4.3.0",
151
117
  "tw-animate-css": "^1.4.0",
152
- "typescript": "^5.9.3",
153
- "vite": "^7.3.2"
118
+ "typescript": "^6.0.3",
119
+ "vite": "^7.3.3"
154
120
  },
155
121
  "dependencies": {
156
- "@babylonjs/core": "^8.56.2",
157
- "@babylonjs/loaders": "^8.56.2",
158
- "@carbonplan/zarr-layer": "^0.4.3",
159
- "@codemirror/autocomplete": "^6.20.1",
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.41.1",
166
- "@deck.gl/core": "^9.3.1",
167
- "@deck.gl/geo-layers": "^9.3.1",
168
- "@deck.gl/layers": "^9.3.1",
169
- "@deck.gl/mapbox": "^9.3.1",
170
- "@deck.gl/mesh-layers": "^9.3.1",
171
- "@developmentseed/deck.gl-geotiff": "0.6.0-alpha.1",
172
- "@developmentseed/deck.gl-raster": "0.6.0-alpha.1",
173
- "@developmentseed/deck.gl-zarr": "0.6.0-alpha.1",
174
- "@developmentseed/epsg": "0.6.0-alpha.1",
175
- "@developmentseed/geotiff": "0.6.0-alpha.1",
176
- "@developmentseed/proj": "0.6.0-alpha.1",
177
- "@duckdb/duckdb-wasm": "1.33.1-dev53.0",
178
- "@geoarrow/deck.gl-layers": "^0.3.2",
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": "^2.0.4",
181
- "@milkdown/kit": "^7.20.0",
182
- "@milkdown/theme-nord": "^7.20.0",
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.1",
159
+ "deck.gl": "^9.3.2",
190
160
  "flatgeobuf": "^4.4.0",
191
- "hyparquet": "^1.25.6",
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": "^17.0.6",
196
- "mermaid": "^11.14.0",
197
- "pbf": "^4.0.1",
198
- "pdfjs-dist": "^5.6.205",
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": "^3.23.0",
202
- "sql-formatter": "^15.7.3",
203
- "yaml": "^2.8.3",
204
- "zarrita": "^0.7.2"
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 run package && pnpm --filter @walkthru-earth/objex-utils run build && pnpm publish -r --access public --no-git-checks --provenance"
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,7 +0,0 @@
1
- type $$ComponentProps = {
2
- path: string;
3
- onNavigate: (path: string) => void;
4
- };
5
- declare const Breadcrumb: import("svelte").Component<$$ComponentProps, {}, "">;
6
- type Breadcrumb = ReturnType<typeof Breadcrumb>;
7
- export default Breadcrumb;
@@ -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,6 +0,0 @@
1
- interface Props {
2
- open: boolean;
3
- }
4
- declare const CreateFolderDialog: import("svelte").Component<Props, {}, "open">;
5
- type CreateFolderDialog = ReturnType<typeof CreateFolderDialog>;
6
- export default CreateFolderDialog;
@@ -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>
@@ -1,7 +0,0 @@
1
- import type { Snippet } from 'svelte';
2
- type $$ComponentProps = {
3
- children: Snippet;
4
- };
5
- declare const DropZone: import("svelte").Component<$$ComponentProps, {}, "">;
6
- type DropZone = ReturnType<typeof DropZone>;
7
- export default DropZone;