@walkthru-earth/objex 0.1.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 (367) hide show
  1. package/LICENSE +396 -0
  2. package/README.md +114 -0
  3. package/dist/assets/favicon.svg +17 -0
  4. package/dist/components/CLAUDE.md +44 -0
  5. package/dist/components/browser/Breadcrumb.svelte +50 -0
  6. package/dist/components/browser/Breadcrumb.svelte.d.ts +7 -0
  7. package/dist/components/browser/CreateFolderDialog.svelte +98 -0
  8. package/dist/components/browser/CreateFolderDialog.svelte.d.ts +6 -0
  9. package/dist/components/browser/DeleteConfirmDialog.svelte +90 -0
  10. package/dist/components/browser/DeleteConfirmDialog.svelte.d.ts +8 -0
  11. package/dist/components/browser/DropZone.svelte +83 -0
  12. package/dist/components/browser/DropZone.svelte.d.ts +7 -0
  13. package/dist/components/browser/FileBrowser.svelte +229 -0
  14. package/dist/components/browser/FileBrowser.svelte.d.ts +3 -0
  15. package/dist/components/browser/FileRow.svelte +112 -0
  16. package/dist/components/browser/FileRow.svelte.d.ts +9 -0
  17. package/dist/components/browser/FileTreeSidebar.svelte +559 -0
  18. package/dist/components/browser/FileTreeSidebar.svelte.d.ts +8 -0
  19. package/dist/components/browser/RenameDialog.svelte +101 -0
  20. package/dist/components/browser/RenameDialog.svelte.d.ts +8 -0
  21. package/dist/components/browser/SearchBar.svelte +40 -0
  22. package/dist/components/browser/SearchBar.svelte.d.ts +6 -0
  23. package/dist/components/browser/UploadButton.svelte +65 -0
  24. package/dist/components/browser/UploadButton.svelte.d.ts +3 -0
  25. package/dist/components/editor/CodeMirrorEditor.svelte +404 -0
  26. package/dist/components/editor/CodeMirrorEditor.svelte.d.ts +12 -0
  27. package/dist/components/editor/MilkdownEditor.svelte +98 -0
  28. package/dist/components/editor/MilkdownEditor.svelte.d.ts +9 -0
  29. package/dist/components/editor/SqlEditor.svelte +173 -0
  30. package/dist/components/editor/SqlEditor.svelte.d.ts +7 -0
  31. package/dist/components/editor/SqlResultBlock.svelte +199 -0
  32. package/dist/components/editor/SqlResultBlock.svelte.d.ts +9 -0
  33. package/dist/components/layout/ConnectionDialog.svelte +439 -0
  34. package/dist/components/layout/ConnectionDialog.svelte.d.ts +9 -0
  35. package/dist/components/layout/LocaleToggle.svelte +32 -0
  36. package/dist/components/layout/LocaleToggle.svelte.d.ts +3 -0
  37. package/dist/components/layout/SafeLockToggle.svelte +37 -0
  38. package/dist/components/layout/SafeLockToggle.svelte.d.ts +18 -0
  39. package/dist/components/layout/Sidebar.svelte +314 -0
  40. package/dist/components/layout/Sidebar.svelte.d.ts +3 -0
  41. package/dist/components/layout/StatusBar.svelte +73 -0
  42. package/dist/components/layout/StatusBar.svelte.d.ts +3 -0
  43. package/dist/components/layout/TabBar.svelte +102 -0
  44. package/dist/components/layout/TabBar.svelte.d.ts +7 -0
  45. package/dist/components/layout/ThemeToggle.svelte +52 -0
  46. package/dist/components/layout/ThemeToggle.svelte.d.ts +3 -0
  47. package/dist/components/ui/badge/badge.svelte +49 -0
  48. package/dist/components/ui/badge/badge.svelte.d.ts +32 -0
  49. package/dist/components/ui/badge/index.d.ts +1 -0
  50. package/dist/components/ui/badge/index.js +1 -0
  51. package/dist/components/ui/button/button.svelte +82 -0
  52. package/dist/components/ui/button/button.svelte.d.ts +64 -0
  53. package/dist/components/ui/button/index.d.ts +2 -0
  54. package/dist/components/ui/button/index.js +4 -0
  55. package/dist/components/ui/context-menu/context-menu-checkbox-item.svelte +40 -0
  56. package/dist/components/ui/context-menu/context-menu-checkbox-item.svelte.d.ts +9 -0
  57. package/dist/components/ui/context-menu/context-menu-content.svelte +28 -0
  58. package/dist/components/ui/context-menu/context-menu-content.svelte.d.ts +10 -0
  59. package/dist/components/ui/context-menu/context-menu-group-heading.svelte +21 -0
  60. package/dist/components/ui/context-menu/context-menu-group-heading.svelte.d.ts +7 -0
  61. package/dist/components/ui/context-menu/context-menu-group.svelte +7 -0
  62. package/dist/components/ui/context-menu/context-menu-group.svelte.d.ts +4 -0
  63. package/dist/components/ui/context-menu/context-menu-item.svelte +27 -0
  64. package/dist/components/ui/context-menu/context-menu-item.svelte.d.ts +8 -0
  65. package/dist/components/ui/context-menu/context-menu-label.svelte +24 -0
  66. package/dist/components/ui/context-menu/context-menu-label.svelte.d.ts +8 -0
  67. package/dist/components/ui/context-menu/context-menu-portal.svelte +7 -0
  68. package/dist/components/ui/context-menu/context-menu-portal.svelte.d.ts +3 -0
  69. package/dist/components/ui/context-menu/context-menu-radio-group.svelte +16 -0
  70. package/dist/components/ui/context-menu/context-menu-radio-group.svelte.d.ts +4 -0
  71. package/dist/components/ui/context-menu/context-menu-radio-item.svelte +33 -0
  72. package/dist/components/ui/context-menu/context-menu-radio-item.svelte.d.ts +4 -0
  73. package/dist/components/ui/context-menu/context-menu-separator.svelte +17 -0
  74. package/dist/components/ui/context-menu/context-menu-separator.svelte.d.ts +4 -0
  75. package/dist/components/ui/context-menu/context-menu-shortcut.svelte +20 -0
  76. package/dist/components/ui/context-menu/context-menu-shortcut.svelte.d.ts +5 -0
  77. package/dist/components/ui/context-menu/context-menu-sub-content.svelte +20 -0
  78. package/dist/components/ui/context-menu/context-menu-sub-content.svelte.d.ts +4 -0
  79. package/dist/components/ui/context-menu/context-menu-sub-trigger.svelte +29 -0
  80. package/dist/components/ui/context-menu/context-menu-sub-trigger.svelte.d.ts +8 -0
  81. package/dist/components/ui/context-menu/context-menu-sub.svelte +7 -0
  82. package/dist/components/ui/context-menu/context-menu-sub.svelte.d.ts +3 -0
  83. package/dist/components/ui/context-menu/context-menu-trigger.svelte +7 -0
  84. package/dist/components/ui/context-menu/context-menu-trigger.svelte.d.ts +4 -0
  85. package/dist/components/ui/context-menu/context-menu.svelte +7 -0
  86. package/dist/components/ui/context-menu/context-menu.svelte.d.ts +3 -0
  87. package/dist/components/ui/context-menu/index.d.ts +17 -0
  88. package/dist/components/ui/context-menu/index.js +19 -0
  89. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
  90. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte.d.ts +4 -0
  91. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +43 -0
  92. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +9 -0
  93. package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte +29 -0
  94. package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte.d.ts +10 -0
  95. package/dist/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
  96. package/dist/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte.d.ts +8 -0
  97. package/dist/components/ui/dropdown-menu/dropdown-menu-group.svelte +7 -0
  98. package/dist/components/ui/dropdown-menu/dropdown-menu-group.svelte.d.ts +4 -0
  99. package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte +27 -0
  100. package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte.d.ts +8 -0
  101. package/dist/components/ui/dropdown-menu/dropdown-menu-label.svelte +24 -0
  102. package/dist/components/ui/dropdown-menu/dropdown-menu-label.svelte.d.ts +8 -0
  103. package/dist/components/ui/dropdown-menu/dropdown-menu-portal.svelte +7 -0
  104. package/dist/components/ui/dropdown-menu/dropdown-menu-portal.svelte.d.ts +3 -0
  105. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
  106. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte.d.ts +4 -0
  107. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +33 -0
  108. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte.d.ts +4 -0
  109. package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte +17 -0
  110. package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte.d.ts +4 -0
  111. package/dist/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +20 -0
  112. package/dist/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte.d.ts +5 -0
  113. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +20 -0
  114. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte.d.ts +4 -0
  115. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
  116. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte.d.ts +7 -0
  117. package/dist/components/ui/dropdown-menu/dropdown-menu-sub.svelte +7 -0
  118. package/dist/components/ui/dropdown-menu/dropdown-menu-sub.svelte.d.ts +3 -0
  119. package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
  120. package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte.d.ts +4 -0
  121. package/dist/components/ui/dropdown-menu/dropdown-menu.svelte +7 -0
  122. package/dist/components/ui/dropdown-menu/dropdown-menu.svelte.d.ts +3 -0
  123. package/dist/components/ui/dropdown-menu/index.d.ts +18 -0
  124. package/dist/components/ui/dropdown-menu/index.js +18 -0
  125. package/dist/components/ui/input/index.d.ts +2 -0
  126. package/dist/components/ui/input/index.js +4 -0
  127. package/dist/components/ui/input/input.svelte +52 -0
  128. package/dist/components/ui/input/input.svelte.d.ts +13 -0
  129. package/dist/components/ui/resizable/index.d.ts +4 -0
  130. package/dist/components/ui/resizable/index.js +6 -0
  131. package/dist/components/ui/resizable/resizable-handle.svelte +30 -0
  132. package/dist/components/ui/resizable/resizable-handle.svelte.d.ts +8 -0
  133. package/dist/components/ui/resizable/resizable-pane-group.svelte +20 -0
  134. package/dist/components/ui/resizable/resizable-pane-group.svelte.d.ts +7 -0
  135. package/dist/components/ui/scroll-area/index.d.ts +3 -0
  136. package/dist/components/ui/scroll-area/index.js +5 -0
  137. package/dist/components/ui/scroll-area/scroll-area-scrollbar.svelte +31 -0
  138. package/dist/components/ui/scroll-area/scroll-area-scrollbar.svelte.d.ts +4 -0
  139. package/dist/components/ui/scroll-area/scroll-area.svelte +47 -0
  140. package/dist/components/ui/scroll-area/scroll-area.svelte.d.ts +11 -0
  141. package/dist/components/ui/separator/index.d.ts +2 -0
  142. package/dist/components/ui/separator/index.js +4 -0
  143. package/dist/components/ui/separator/separator.svelte +21 -0
  144. package/dist/components/ui/separator/separator.svelte.d.ts +4 -0
  145. package/dist/components/ui/sheet/index.d.ts +11 -0
  146. package/dist/components/ui/sheet/index.js +13 -0
  147. package/dist/components/ui/sheet/sheet-close.svelte +7 -0
  148. package/dist/components/ui/sheet/sheet-close.svelte.d.ts +4 -0
  149. package/dist/components/ui/sheet/sheet-content.svelte +62 -0
  150. package/dist/components/ui/sheet/sheet-content.svelte.d.ts +37 -0
  151. package/dist/components/ui/sheet/sheet-description.svelte +17 -0
  152. package/dist/components/ui/sheet/sheet-description.svelte.d.ts +4 -0
  153. package/dist/components/ui/sheet/sheet-footer.svelte +20 -0
  154. package/dist/components/ui/sheet/sheet-footer.svelte.d.ts +5 -0
  155. package/dist/components/ui/sheet/sheet-header.svelte +20 -0
  156. package/dist/components/ui/sheet/sheet-header.svelte.d.ts +5 -0
  157. package/dist/components/ui/sheet/sheet-overlay.svelte +20 -0
  158. package/dist/components/ui/sheet/sheet-overlay.svelte.d.ts +4 -0
  159. package/dist/components/ui/sheet/sheet-portal.svelte +7 -0
  160. package/dist/components/ui/sheet/sheet-portal.svelte.d.ts +3 -0
  161. package/dist/components/ui/sheet/sheet-title.svelte +13 -0
  162. package/dist/components/ui/sheet/sheet-title.svelte.d.ts +4 -0
  163. package/dist/components/ui/sheet/sheet-trigger.svelte +7 -0
  164. package/dist/components/ui/sheet/sheet-trigger.svelte.d.ts +4 -0
  165. package/dist/components/ui/sheet/sheet.svelte +7 -0
  166. package/dist/components/ui/sheet/sheet.svelte.d.ts +3 -0
  167. package/dist/components/ui/switch/index.d.ts +2 -0
  168. package/dist/components/ui/switch/index.js +4 -0
  169. package/dist/components/ui/switch/switch.svelte +28 -0
  170. package/dist/components/ui/switch/switch.svelte.d.ts +8 -0
  171. package/dist/components/ui/tabs/index.d.ts +5 -0
  172. package/dist/components/ui/tabs/index.js +7 -0
  173. package/dist/components/ui/tabs/tabs-content.svelte +17 -0
  174. package/dist/components/ui/tabs/tabs-content.svelte.d.ts +4 -0
  175. package/dist/components/ui/tabs/tabs-list.svelte +16 -0
  176. package/dist/components/ui/tabs/tabs-list.svelte.d.ts +4 -0
  177. package/dist/components/ui/tabs/tabs-trigger.svelte +20 -0
  178. package/dist/components/ui/tabs/tabs-trigger.svelte.d.ts +4 -0
  179. package/dist/components/ui/tabs/tabs.svelte +19 -0
  180. package/dist/components/ui/tabs/tabs.svelte.d.ts +4 -0
  181. package/dist/components/ui/tooltip/index.d.ts +6 -0
  182. package/dist/components/ui/tooltip/index.js +8 -0
  183. package/dist/components/ui/tooltip/tooltip-content.svelte +52 -0
  184. package/dist/components/ui/tooltip/tooltip-content.svelte.d.ts +11 -0
  185. package/dist/components/ui/tooltip/tooltip-portal.svelte +7 -0
  186. package/dist/components/ui/tooltip/tooltip-portal.svelte.d.ts +4 -0
  187. package/dist/components/ui/tooltip/tooltip-provider.svelte +7 -0
  188. package/dist/components/ui/tooltip/tooltip-provider.svelte.d.ts +4 -0
  189. package/dist/components/ui/tooltip/tooltip-trigger.svelte +7 -0
  190. package/dist/components/ui/tooltip/tooltip-trigger.svelte.d.ts +4 -0
  191. package/dist/components/ui/tooltip/tooltip.svelte +7 -0
  192. package/dist/components/ui/tooltip/tooltip.svelte.d.ts +4 -0
  193. package/dist/components/viewers/ArchiveViewer.svelte +586 -0
  194. package/dist/components/viewers/ArchiveViewer.svelte.d.ts +7 -0
  195. package/dist/components/viewers/CLAUDE.md +60 -0
  196. package/dist/components/viewers/CodeViewer.svelte +553 -0
  197. package/dist/components/viewers/CodeViewer.svelte.d.ts +7 -0
  198. package/dist/components/viewers/CogViewer.svelte +1345 -0
  199. package/dist/components/viewers/CogViewer.svelte.d.ts +7 -0
  200. package/dist/components/viewers/CopcViewer.svelte +25 -0
  201. package/dist/components/viewers/CopcViewer.svelte.d.ts +7 -0
  202. package/dist/components/viewers/DatabaseViewer.svelte +169 -0
  203. package/dist/components/viewers/DatabaseViewer.svelte.d.ts +7 -0
  204. package/dist/components/viewers/FileInfo.svelte +174 -0
  205. package/dist/components/viewers/FileInfo.svelte.d.ts +10 -0
  206. package/dist/components/viewers/FlatGeobufViewer.svelte +755 -0
  207. package/dist/components/viewers/FlatGeobufViewer.svelte.d.ts +7 -0
  208. package/dist/components/viewers/GeoParquetMapViewer.svelte +278 -0
  209. package/dist/components/viewers/GeoParquetMapViewer.svelte.d.ts +17 -0
  210. package/dist/components/viewers/ImageViewer.svelte +233 -0
  211. package/dist/components/viewers/ImageViewer.svelte.d.ts +7 -0
  212. package/dist/components/viewers/LoadProgress.svelte +93 -0
  213. package/dist/components/viewers/LoadProgress.svelte.d.ts +15 -0
  214. package/dist/components/viewers/MapViewer.svelte +234 -0
  215. package/dist/components/viewers/MapViewer.svelte.d.ts +7 -0
  216. package/dist/components/viewers/MarkdownViewer.svelte +478 -0
  217. package/dist/components/viewers/MarkdownViewer.svelte.d.ts +7 -0
  218. package/dist/components/viewers/MediaViewer.svelte +121 -0
  219. package/dist/components/viewers/MediaViewer.svelte.d.ts +7 -0
  220. package/dist/components/viewers/ModelViewer.svelte +164 -0
  221. package/dist/components/viewers/ModelViewer.svelte.d.ts +7 -0
  222. package/dist/components/viewers/NotebookViewer.svelte +389 -0
  223. package/dist/components/viewers/NotebookViewer.svelte.d.ts +7 -0
  224. package/dist/components/viewers/PdfViewer.svelte +278 -0
  225. package/dist/components/viewers/PdfViewer.svelte.d.ts +7 -0
  226. package/dist/components/viewers/PmtilesViewer.svelte +191 -0
  227. package/dist/components/viewers/PmtilesViewer.svelte.d.ts +7 -0
  228. package/dist/components/viewers/QueryHistoryPanel.svelte +159 -0
  229. package/dist/components/viewers/QueryHistoryPanel.svelte.d.ts +8 -0
  230. package/dist/components/viewers/RawViewer.svelte +117 -0
  231. package/dist/components/viewers/RawViewer.svelte.d.ts +7 -0
  232. package/dist/components/viewers/StacMapViewer.svelte +20 -0
  233. package/dist/components/viewers/StacMapViewer.svelte.d.ts +7 -0
  234. package/dist/components/viewers/StyleEditorOverlay.svelte +27 -0
  235. package/dist/components/viewers/StyleEditorOverlay.svelte.d.ts +7 -0
  236. package/dist/components/viewers/TableGrid.svelte +355 -0
  237. package/dist/components/viewers/TableGrid.svelte.d.ts +12 -0
  238. package/dist/components/viewers/TableStatusBar.svelte +92 -0
  239. package/dist/components/viewers/TableStatusBar.svelte.d.ts +11 -0
  240. package/dist/components/viewers/TableToolbar.svelte +382 -0
  241. package/dist/components/viewers/TableToolbar.svelte.d.ts +25 -0
  242. package/dist/components/viewers/TableViewer.svelte +923 -0
  243. package/dist/components/viewers/TableViewer.svelte.d.ts +7 -0
  244. package/dist/components/viewers/ViewerRouter.svelte +70 -0
  245. package/dist/components/viewers/ViewerRouter.svelte.d.ts +7 -0
  246. package/dist/components/viewers/ZarrMapViewer.svelte +288 -0
  247. package/dist/components/viewers/ZarrMapViewer.svelte.d.ts +17 -0
  248. package/dist/components/viewers/ZarrViewer.svelte +256 -0
  249. package/dist/components/viewers/ZarrViewer.svelte.d.ts +7 -0
  250. package/dist/components/viewers/map/AttributeTable.svelte +52 -0
  251. package/dist/components/viewers/map/AttributeTable.svelte.d.ts +8 -0
  252. package/dist/components/viewers/map/MapContainer.svelte +158 -0
  253. package/dist/components/viewers/map/MapContainer.svelte.d.ts +12 -0
  254. package/dist/components/viewers/pmtiles/PmtilesArchiveView.svelte +389 -0
  255. package/dist/components/viewers/pmtiles/PmtilesArchiveView.svelte.d.ts +10 -0
  256. package/dist/components/viewers/pmtiles/PmtilesMapView.svelte +332 -0
  257. package/dist/components/viewers/pmtiles/PmtilesMapView.svelte.d.ts +11 -0
  258. package/dist/components/viewers/pmtiles/PmtilesTileInspector.svelte +373 -0
  259. package/dist/components/viewers/pmtiles/PmtilesTileInspector.svelte.d.ts +12 -0
  260. package/dist/components/viewers/pmtiles/SvgTileRenderer.svelte +112 -0
  261. package/dist/components/viewers/pmtiles/SvgTileRenderer.svelte.d.ts +10 -0
  262. package/dist/file-icons/CLAUDE.md +21 -0
  263. package/dist/file-icons/FileTypeIcon.svelte +74 -0
  264. package/dist/file-icons/FileTypeIcon.svelte.d.ts +9 -0
  265. package/dist/file-icons/index.d.ts +56 -0
  266. package/dist/file-icons/index.js +1070 -0
  267. package/dist/i18n/CLAUDE.md +19 -0
  268. package/dist/i18n/ar.d.ts +1 -0
  269. package/dist/i18n/ar.js +404 -0
  270. package/dist/i18n/en.d.ts +1 -0
  271. package/dist/i18n/en.js +404 -0
  272. package/dist/i18n/index.svelte.d.ts +9 -0
  273. package/dist/i18n/index.svelte.js +27 -0
  274. package/dist/index.d.ts +20 -0
  275. package/dist/index.js +13 -0
  276. package/dist/query/CLAUDE.md +22 -0
  277. package/dist/query/engine.d.ts +56 -0
  278. package/dist/query/engine.js +6 -0
  279. package/dist/query/index.d.ts +4 -0
  280. package/dist/query/index.js +19 -0
  281. package/dist/query/wasm.d.ts +20 -0
  282. package/dist/query/wasm.js +890 -0
  283. package/dist/storage/CLAUDE.md +23 -0
  284. package/dist/storage/adapter.d.ts +21 -0
  285. package/dist/storage/adapter.js +1 -0
  286. package/dist/storage/browser-azure.d.ts +25 -0
  287. package/dist/storage/browser-azure.js +271 -0
  288. package/dist/storage/browser-cloud.d.ts +32 -0
  289. package/dist/storage/browser-cloud.js +293 -0
  290. package/dist/storage/index.d.ts +11 -0
  291. package/dist/storage/index.js +37 -0
  292. package/dist/storage/url-adapter.d.ts +19 -0
  293. package/dist/storage/url-adapter.js +51 -0
  294. package/dist/stores/CLAUDE.md +29 -0
  295. package/dist/stores/browser.svelte.d.ts +28 -0
  296. package/dist/stores/browser.svelte.js +160 -0
  297. package/dist/stores/connections.svelte.d.ts +56 -0
  298. package/dist/stores/connections.svelte.js +272 -0
  299. package/dist/stores/credentials.svelte.d.ts +56 -0
  300. package/dist/stores/credentials.svelte.js +79 -0
  301. package/dist/stores/files.svelte.d.ts +20 -0
  302. package/dist/stores/files.svelte.js +76 -0
  303. package/dist/stores/query-history.svelte.d.ts +16 -0
  304. package/dist/stores/query-history.svelte.js +57 -0
  305. package/dist/stores/safelock.svelte.d.ts +8 -0
  306. package/dist/stores/safelock.svelte.js +52 -0
  307. package/dist/stores/settings.svelte.d.ts +11 -0
  308. package/dist/stores/settings.svelte.js +101 -0
  309. package/dist/stores/tab-resources.svelte.d.ts +25 -0
  310. package/dist/stores/tab-resources.svelte.js +61 -0
  311. package/dist/stores/tabs.svelte.d.ts +17 -0
  312. package/dist/stores/tabs.svelte.js +110 -0
  313. package/dist/types/notebookjs.d.ts +14 -0
  314. package/dist/types.d.ts +47 -0
  315. package/dist/types.js +1 -0
  316. package/dist/utils/CLAUDE.md +54 -0
  317. package/dist/utils/analytics.d.ts +10 -0
  318. package/dist/utils/analytics.js +38 -0
  319. package/dist/utils/archive.d.ts +70 -0
  320. package/dist/utils/archive.js +333 -0
  321. package/dist/utils/column-types.d.ts +5 -0
  322. package/dist/utils/column-types.js +137 -0
  323. package/dist/utils/deck.d.ts +98 -0
  324. package/dist/utils/deck.js +208 -0
  325. package/dist/utils/evidence-context.d.ts +22 -0
  326. package/dist/utils/evidence-context.js +56 -0
  327. package/dist/utils/export.d.ts +2 -0
  328. package/dist/utils/export.js +51 -0
  329. package/dist/utils/format.d.ts +14 -0
  330. package/dist/utils/format.js +56 -0
  331. package/dist/utils/geoarrow.d.ts +32 -0
  332. package/dist/utils/geoarrow.js +672 -0
  333. package/dist/utils/hex.d.ts +10 -0
  334. package/dist/utils/hex.js +27 -0
  335. package/dist/utils/host-detection.d.ts +23 -0
  336. package/dist/utils/host-detection.js +289 -0
  337. package/dist/utils/map-selection.d.ts +12 -0
  338. package/dist/utils/map-selection.js +45 -0
  339. package/dist/utils/markdown-sql.d.ts +30 -0
  340. package/dist/utils/markdown-sql.js +73 -0
  341. package/dist/utils/markdown.d.ts +18 -0
  342. package/dist/utils/markdown.js +146 -0
  343. package/dist/utils/model3d.d.ts +13 -0
  344. package/dist/utils/model3d.js +62 -0
  345. package/dist/utils/parquet-metadata.d.ts +58 -0
  346. package/dist/utils/parquet-metadata.js +228 -0
  347. package/dist/utils/pdf.d.ts +8 -0
  348. package/dist/utils/pdf.js +28 -0
  349. package/dist/utils/pmtiles-tile.d.ts +38 -0
  350. package/dist/utils/pmtiles-tile.js +64 -0
  351. package/dist/utils/pmtiles.d.ts +46 -0
  352. package/dist/utils/pmtiles.js +135 -0
  353. package/dist/utils/shiki.d.ts +8 -0
  354. package/dist/utils/shiki.js +98 -0
  355. package/dist/utils/storage-url.d.ts +64 -0
  356. package/dist/utils/storage-url.js +374 -0
  357. package/dist/utils/url-state.d.ts +40 -0
  358. package/dist/utils/url-state.js +113 -0
  359. package/dist/utils/url.d.ts +27 -0
  360. package/dist/utils/url.js +115 -0
  361. package/dist/utils/wkb.d.ts +43 -0
  362. package/dist/utils/wkb.js +345 -0
  363. package/dist/utils/zarr.d.ts +39 -0
  364. package/dist/utils/zarr.js +204 -0
  365. package/dist/utils.d.ts +12 -0
  366. package/dist/utils.js +5 -0
  367. package/package.json +203 -0
@@ -0,0 +1,52 @@
1
+ <script lang="ts">
2
+ import XIcon from '@lucide/svelte/icons/x';
3
+
4
+ let {
5
+ feature = null,
6
+ visible = false,
7
+ onClose
8
+ }: {
9
+ feature: Record<string, any> | null;
10
+ visible?: boolean;
11
+ onClose?: () => void;
12
+ } = $props();
13
+
14
+ function formatValue(value: any): string {
15
+ if (value === null || value === undefined) return 'NULL';
16
+ if (typeof value === 'object') return JSON.stringify(value);
17
+ return String(value);
18
+ }
19
+ </script>
20
+
21
+ {#if visible && feature}
22
+ <div
23
+ class="absolute bottom-2 end-2 top-10 z-10 flex w-64 flex-col overflow-hidden rounded bg-card/95 text-card-foreground shadow-lg backdrop-blur-sm sm:w-72"
24
+ >
25
+ <div
26
+ class="flex items-center justify-between border-b border-zinc-200 px-3 py-2 dark:border-zinc-800"
27
+ >
28
+ <h3 class="text-xs font-medium text-zinc-500 dark:text-zinc-400">Feature Attributes</h3>
29
+ {#if onClose}
30
+ <button
31
+ class="rounded p-0.5 text-zinc-400 hover:bg-zinc-200 hover:text-zinc-600 dark:hover:bg-zinc-700 dark:hover:text-zinc-300"
32
+ onclick={onClose}
33
+ >
34
+ <XIcon class="size-3.5" />
35
+ </button>
36
+ {/if}
37
+ </div>
38
+ <div class="flex-1 divide-y divide-zinc-100 overflow-auto dark:divide-zinc-800">
39
+ {#each Object.entries(feature) as [key, value]}
40
+ <div class="px-3 py-1.5">
41
+ <div class="text-[10px] font-medium text-zinc-500 dark:text-zinc-400">{key}</div>
42
+ <div
43
+ class="break-all text-xs text-zinc-700 dark:text-zinc-300"
44
+ title={formatValue(value)}
45
+ >
46
+ {formatValue(value)}
47
+ </div>
48
+ </div>
49
+ {/each}
50
+ </div>
51
+ </div>
52
+ {/if}
@@ -0,0 +1,8 @@
1
+ type $$ComponentProps = {
2
+ feature: Record<string, any> | null;
3
+ visible?: boolean;
4
+ onClose?: () => void;
5
+ };
6
+ declare const AttributeTable: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type AttributeTable = ReturnType<typeof AttributeTable>;
8
+ export default AttributeTable;
@@ -0,0 +1,158 @@
1
+ <script lang="ts">
2
+ import maplibregl from 'maplibre-gl';
3
+ import 'maplibre-gl/dist/maplibre-gl.css';
4
+ import { onDestroy } from 'svelte';
5
+ import { t } from '../../../i18n/index.svelte.js';
6
+ import { settings } from '../../../stores/settings.svelte.js';
7
+
8
+ const MAP_STYLES = {
9
+ light: 'https://basemaps.cartocdn.com/gl/positron-gl-style/style.json',
10
+ dark: 'https://basemaps.cartocdn.com/gl/dark-matter-gl-style/style.json'
11
+ };
12
+
13
+ const RTL_PLUGIN_URL =
14
+ 'https://unpkg.com/@mapbox/mapbox-gl-rtl-text@0.3.0/dist/mapbox-gl-rtl-text.js';
15
+
16
+ // Register RTL text plugin once (idempotent)
17
+ if (
18
+ typeof window !== 'undefined' &&
19
+ (!maplibregl.getRTLTextPluginStatus || maplibregl.getRTLTextPluginStatus() === 'unavailable')
20
+ ) {
21
+ maplibregl.setRTLTextPlugin(RTL_PLUGIN_URL, true).catch((err) => {
22
+ console.warn('RTL text plugin failed to load:', err);
23
+ });
24
+ }
25
+
26
+ let {
27
+ onMapReady,
28
+ style,
29
+ center = [0, 20] as [number, number],
30
+ zoom = 2,
31
+ bounds
32
+ }: {
33
+ onMapReady: (map: maplibregl.Map) => void;
34
+ style?: string | maplibregl.StyleSpecification;
35
+ center?: [number, number];
36
+ zoom?: number;
37
+ bounds?: [number, number, number, number];
38
+ } = $props();
39
+
40
+ const resolvedStyle = $derived(style ?? MAP_STYLES[settings.resolved]);
41
+
42
+ let containerEl: HTMLDivElement | undefined = $state();
43
+ let map: maplibregl.Map | null = null;
44
+ let currentStyleUrl: string | maplibregl.StyleSpecification | null = null;
45
+ let currentZoom = $state(2);
46
+ let webglLost = $state(false);
47
+
48
+ function initMap() {
49
+ if (!containerEl || map) return;
50
+ webglLost = false;
51
+
52
+ map = new maplibregl.Map({
53
+ container: containerEl,
54
+ style: resolvedStyle,
55
+ center,
56
+ zoom
57
+ });
58
+
59
+ currentStyleUrl = resolvedStyle;
60
+
61
+ map.addControl(
62
+ new maplibregl.NavigationControl({ showCompass: true, visualizePitch: true }),
63
+ 'bottom-right'
64
+ );
65
+
66
+ currentZoom = map.getZoom();
67
+ map.on('zoom', () => {
68
+ if (map) currentZoom = map.getZoom();
69
+ });
70
+
71
+ map.on('load', () => {
72
+ if (map) onMapReady(map);
73
+ });
74
+
75
+ // Handle WebGL context loss gracefully
76
+ const canvas = map.getCanvas();
77
+ canvas.addEventListener('webglcontextlost', (e) => {
78
+ e.preventDefault();
79
+ console.warn('[MapContainer] WebGL context lost');
80
+ webglLost = true;
81
+ });
82
+ canvas.addEventListener('webglcontextrestored', () => {
83
+ console.log('[MapContainer] WebGL context restored');
84
+ webglLost = false;
85
+ });
86
+ }
87
+
88
+ function retryMap() {
89
+ if (map) {
90
+ map.remove();
91
+ map = null;
92
+ }
93
+ webglLost = false;
94
+ // Re-init on next microtask so the DOM settles
95
+ queueMicrotask(initMap);
96
+ }
97
+
98
+ $effect(() => {
99
+ if (containerEl && !map) {
100
+ initMap();
101
+ }
102
+ });
103
+
104
+ // React to bounds changes — data may load after the map is ready.
105
+ // Also handles initial bounds that arrive before or during map load.
106
+ let prevBoundsKey = '';
107
+ $effect(() => {
108
+ if (!bounds || !map) return;
109
+ const key = bounds.join(',');
110
+ if (key === prevBoundsKey) return;
111
+ prevBoundsKey = key;
112
+ const [minX, minY, maxX, maxY] = bounds;
113
+ if (minX >= -180 && maxX <= 180 && minY >= -90 && maxY <= 90) {
114
+ map.fitBounds(bounds, { padding: 40 });
115
+ } else {
116
+ console.warn('[MapContainer] Bounds outside WGS84 range, skipping fitBounds:', bounds);
117
+ }
118
+ });
119
+
120
+ // React to theme changes — swap basemap style
121
+ $effect(() => {
122
+ const newStyle = resolvedStyle;
123
+ if (map && currentStyleUrl !== newStyle && !style) {
124
+ currentStyleUrl = newStyle;
125
+ map.setStyle(newStyle);
126
+ }
127
+ });
128
+
129
+ onDestroy(() => {
130
+ map?.remove();
131
+ map = null;
132
+ });
133
+ </script>
134
+
135
+ <div class="relative h-full w-full">
136
+ <div bind:this={containerEl} class="h-full w-full"></div>
137
+ <!-- Zoom level indicator — positioned above nav controls -->
138
+ <div
139
+ class="pointer-events-none absolute bottom-[10rem] right-[10px] z-10 flex size-[29px] items-center justify-center rounded-full border border-zinc-300 bg-white shadow-sm dark:border-zinc-600 dark:bg-zinc-800"
140
+ >
141
+ <span class="text-[10px] font-semibold tabular-nums text-zinc-600 dark:text-zinc-300">
142
+ {currentZoom.toFixed(1)}
143
+ </span>
144
+ </div>
145
+ {#if webglLost}
146
+ <div class="absolute inset-0 z-20 flex items-center justify-center bg-card/80 backdrop-blur-sm">
147
+ <div class="text-center">
148
+ <p class="text-sm text-card-foreground">{t('map.webglLost')}</p>
149
+ <button
150
+ class="mt-2 rounded bg-primary px-3 py-1 text-xs text-primary-foreground hover:bg-primary/90"
151
+ onclick={retryMap}
152
+ >
153
+ {t('map.retry')}
154
+ </button>
155
+ </div>
156
+ </div>
157
+ {/if}
158
+ </div>
@@ -0,0 +1,12 @@
1
+ import maplibregl from 'maplibre-gl';
2
+ import 'maplibre-gl/dist/maplibre-gl.css';
3
+ type $$ComponentProps = {
4
+ onMapReady: (map: maplibregl.Map) => void;
5
+ style?: string | maplibregl.StyleSpecification;
6
+ center?: [number, number];
7
+ zoom?: number;
8
+ bounds?: [number, number, number, number];
9
+ };
10
+ declare const MapContainer: import("svelte").Component<$$ComponentProps, {}, "">;
11
+ type MapContainer = ReturnType<typeof MapContainer>;
12
+ export default MapContainer;
@@ -0,0 +1,389 @@
1
+ <script lang="ts">
2
+ import ChevronRightIcon from '@lucide/svelte/icons/chevron-right';
3
+ import type { PMTiles } from 'pmtiles';
4
+ import { tileIdToZxy } from 'pmtiles';
5
+ import {
6
+ ResizableHandle,
7
+ ResizablePane,
8
+ ResizablePaneGroup
9
+ } from '../../ui/resizable/index.js';
10
+ import { t } from '../../../i18n/index.svelte.js';
11
+ import type { PmtilesMetadata } from '../../../utils/pmtiles';
12
+ import { highlightCode } from '../../../utils/shiki';
13
+
14
+ let {
15
+ metadata,
16
+ pmtiles,
17
+ onOpenInspector
18
+ }: {
19
+ metadata: PmtilesMetadata;
20
+ pmtiles: PMTiles;
21
+ onOpenInspector?: (z: number, x: number, y: number) => void;
22
+ } = $props();
23
+
24
+ interface ZoomSummary {
25
+ zoom: number;
26
+ count: number;
27
+ }
28
+
29
+ interface DirectoryEntry {
30
+ tileId: number;
31
+ z: number;
32
+ x: number;
33
+ y: number;
34
+ offset: number;
35
+ length: number;
36
+ runLength: number;
37
+ }
38
+
39
+ let zoomSummaries = $state<ZoomSummary[]>([]);
40
+ let selectedZoom = $state<number | null>(null);
41
+ let zoomEntries = $state<DirectoryEntry[]>([]);
42
+ let selectedEntry = $state<DirectoryEntry | null>(null);
43
+ let loadingEntries = $state(false);
44
+ let showJson = $state(false);
45
+ let highlightedJson = $state('');
46
+ let errorMsg = $state('');
47
+
48
+ // Build zoom summaries from directory on mount
49
+ $effect(() => {
50
+ if (!pmtiles) return;
51
+ buildZoomSummaries();
52
+ });
53
+
54
+ async function buildZoomSummaries() {
55
+ const header = metadata.header;
56
+ const entries = await pmtiles.cache.getDirectory(
57
+ pmtiles.source,
58
+ header.rootDirectoryOffset,
59
+ header.rootDirectoryLength,
60
+ header
61
+ );
62
+
63
+ // Expand root entries into per-zoom counts
64
+ const zoomCounts = new Map<number, number>();
65
+ for (const e of entries) {
66
+ if (e.runLength === 0) {
67
+ const [z] = tileIdToZxy(e.tileId);
68
+ zoomCounts.set(z, (zoomCounts.get(z) ?? 0) + 1);
69
+ } else {
70
+ for (let r = 0; r < e.runLength; r++) {
71
+ const [z] = tileIdToZxy(e.tileId + r);
72
+ zoomCounts.set(z, (zoomCounts.get(z) ?? 0) + 1);
73
+ }
74
+ }
75
+ }
76
+
77
+ const summaries: ZoomSummary[] = [];
78
+ for (let z = metadata.minZoom; z <= metadata.maxZoom; z++) {
79
+ summaries.push({ zoom: z, count: zoomCounts.get(z) ?? 0 });
80
+ }
81
+ zoomSummaries = summaries;
82
+ }
83
+
84
+ async function selectZoom(zoom: number) {
85
+ selectedZoom = zoom;
86
+ selectedEntry = null;
87
+ loadingEntries = true;
88
+ errorMsg = '';
89
+
90
+ const header = metadata.header;
91
+ const allEntries = await pmtiles.cache.getDirectory(
92
+ pmtiles.source,
93
+ header.rootDirectoryOffset,
94
+ header.rootDirectoryLength,
95
+ header
96
+ );
97
+
98
+ const result: DirectoryEntry[] = [];
99
+ for (const e of allEntries) {
100
+ if (e.runLength === 0) {
101
+ const [z] = tileIdToZxy(e.tileId);
102
+ if (z === zoom) {
103
+ try {
104
+ const leafEntries = await pmtiles.cache.getDirectory(
105
+ pmtiles.source,
106
+ header.leafDirectoryOffset + e.offset,
107
+ e.length,
108
+ header
109
+ );
110
+ for (const le of leafEntries) {
111
+ for (let r = 0; r < le.runLength; r++) {
112
+ const [lz, lx, ly] = tileIdToZxy(le.tileId + r);
113
+ if (lz === zoom) {
114
+ result.push({
115
+ tileId: le.tileId + r,
116
+ z: lz,
117
+ x: lx,
118
+ y: ly,
119
+ offset: le.offset,
120
+ length: le.length,
121
+ runLength: le.runLength
122
+ });
123
+ }
124
+ }
125
+ if (result.length > 5000) break;
126
+ }
127
+ } catch (err) {
128
+ errorMsg = err instanceof Error ? err.message : String(err);
129
+ }
130
+ }
131
+ } else {
132
+ for (let r = 0; r < e.runLength; r++) {
133
+ const [z, x, y] = tileIdToZxy(e.tileId + r);
134
+ if (z === zoom) {
135
+ result.push({
136
+ tileId: e.tileId + r,
137
+ z,
138
+ x,
139
+ y,
140
+ offset: e.offset,
141
+ length: e.length,
142
+ runLength: e.runLength
143
+ });
144
+ }
145
+ }
146
+ }
147
+ if (result.length > 5000) break;
148
+ }
149
+
150
+ zoomEntries = result;
151
+ loadingEntries = false;
152
+ }
153
+
154
+ function formatBytes(bytes: number): string {
155
+ if (bytes === 0) return '0 B';
156
+ const units = ['B', 'KB', 'MB', 'GB'];
157
+ const i = Math.floor(Math.log(bytes) / Math.log(1024));
158
+ return `${(bytes / 1024 ** i).toFixed(i > 0 ? 1 : 0)} ${units[i]}`;
159
+ }
160
+
161
+ const maxCount = $derived(Math.max(1, ...zoomSummaries.map((s) => s.count)));
162
+ const dedupRatio = $derived(
163
+ metadata.numAddressedTiles > 0
164
+ ? ((1 - metadata.numTileContents / metadata.numAddressedTiles) * 100).toFixed(1)
165
+ : '0'
166
+ );
167
+ </script>
168
+
169
+ {#snippet entryDetails()}
170
+ {#if selectedEntry}
171
+ <div
172
+ class="shrink-0 border-b border-zinc-200 px-3 py-1.5 text-[11px] font-medium uppercase tracking-wider text-muted-foreground dark:border-zinc-800"
173
+ >
174
+ {t('pmtiles.entryDetails')}
175
+ </div>
176
+ <div class="flex-1 overflow-auto p-3">
177
+ <dl class="space-y-2 text-xs">
178
+ <div>
179
+ <dt class="text-muted-foreground">Tile</dt>
180
+ <dd class="font-mono">{selectedEntry.z}/{selectedEntry.x}/{selectedEntry.y}</dd>
181
+ </div>
182
+ <div>
183
+ <dt class="text-muted-foreground">Tile ID</dt>
184
+ <dd class="font-mono text-[11px]">{selectedEntry.tileId.toLocaleString()}</dd>
185
+ </div>
186
+ <div>
187
+ <dt class="text-muted-foreground">{t('pmtiles.offset')}</dt>
188
+ <dd class="font-mono text-[11px]">0x{selectedEntry.offset.toString(16).toUpperCase()}</dd>
189
+ </div>
190
+ <div>
191
+ <dt class="text-muted-foreground">{t('pmtiles.length')}</dt>
192
+ <dd>{formatBytes(selectedEntry.length)}</dd>
193
+ </div>
194
+ <div>
195
+ <dt class="text-muted-foreground">Run Length</dt>
196
+ <dd>{selectedEntry.runLength}</dd>
197
+ </div>
198
+ </dl>
199
+
200
+ {#if onOpenInspector}
201
+ <button
202
+ class="mt-4 w-full rounded bg-primary/90 px-3 py-1.5 text-xs text-primary-foreground hover:bg-primary"
203
+ onclick={() => onOpenInspector?.(selectedEntry!.z, selectedEntry!.x, selectedEntry!.y)}
204
+ >
205
+ {t('pmtiles.openInInspector')}
206
+ </button>
207
+ {/if}
208
+ </div>
209
+ {:else}
210
+ <div class="flex flex-1 items-center justify-center text-xs text-muted-foreground">
211
+ Select an entry
212
+ </div>
213
+ {/if}
214
+ {/snippet}
215
+
216
+ <div class="flex h-full flex-col overflow-hidden">
217
+ <!-- Stats grid -->
218
+ <div
219
+ class="shrink-0 border-b border-zinc-200 px-3 py-3 sm:px-4 dark:border-zinc-800"
220
+ >
221
+ <div class="grid grid-cols-2 gap-x-4 gap-y-2 text-xs sm:grid-cols-3 lg:grid-cols-6">
222
+ <div>
223
+ <div class="text-muted-foreground">{t('mapInfo.tileFormat')}</div>
224
+ <div class="font-medium">{metadata.formatLabel}</div>
225
+ </div>
226
+ <div>
227
+ <div class="text-muted-foreground">{t('mapInfo.zoomRange')}</div>
228
+ <div class="font-medium">z{metadata.minZoom} – z{metadata.maxZoom}</div>
229
+ </div>
230
+ <div>
231
+ <div class="text-muted-foreground">{t('mapInfo.addressedTiles')}</div>
232
+ <div class="font-medium">{metadata.numAddressedTiles.toLocaleString()}</div>
233
+ </div>
234
+ <div>
235
+ <div class="text-muted-foreground">{t('mapInfo.uniqueContents')}</div>
236
+ <div class="font-medium">{metadata.numTileContents.toLocaleString()}</div>
237
+ </div>
238
+ <div>
239
+ <div class="text-muted-foreground">{t('pmtiles.dedupRatio')}</div>
240
+ <div class="font-medium">{dedupRatio}%</div>
241
+ </div>
242
+ <div>
243
+ <div class="text-muted-foreground">{t('mapInfo.tileCompression')}</div>
244
+ <div class="font-medium">{metadata.tileCompression}</div>
245
+ </div>
246
+ </div>
247
+
248
+ <!-- Header layout -->
249
+ <div class="mt-3 grid grid-cols-2 gap-x-4 gap-y-1 text-[11px] sm:grid-cols-4">
250
+ {#each [
251
+ { label: t('pmtiles.rootDirectory'), offset: metadata.header.rootDirectoryOffset, length: metadata.header.rootDirectoryLength },
252
+ { label: t('pmtiles.metadata'), offset: metadata.header.jsonMetadataOffset, length: metadata.header.jsonMetadataLength },
253
+ { label: t('pmtiles.leafDirectories'), offset: metadata.header.leafDirectoryOffset, length: metadata.header.leafDirectoryLength ?? 0 },
254
+ { label: t('pmtiles.tileData'), offset: metadata.header.tileDataOffset, length: metadata.header.tileDataLength ?? 0 }
255
+ ] as section}
256
+ <div class="flex items-baseline gap-1">
257
+ <span class="text-muted-foreground">{section.label}:</span>
258
+ <span class="font-mono text-[10px]">{formatBytes(section.length)}</span>
259
+ </div>
260
+ {/each}
261
+ </div>
262
+
263
+ <!-- JSON metadata toggle -->
264
+ {#if metadata.jsonMetadata && Object.keys(metadata.jsonMetadata).length > 0}
265
+ <button
266
+ class="mt-2 text-[11px] text-blue-400 hover:text-blue-300"
267
+ onclick={async () => {
268
+ showJson = !showJson;
269
+ if (showJson && !highlightedJson) {
270
+ const raw = JSON.stringify(metadata.jsonMetadata, null, 2);
271
+ highlightedJson = await highlightCode(raw, 'json');
272
+ }
273
+ }}
274
+ >
275
+ {showJson ? '▾' : '▸'} {t('pmtiles.jsonMetadata')}
276
+ </button>
277
+ {#if showJson}
278
+ <div class="json-metadata mt-1 max-h-48 overflow-auto rounded text-[11px]">
279
+ {@html highlightedJson || `<pre class="rounded bg-zinc-100 p-2 font-mono text-zinc-600 dark:bg-zinc-900 dark:text-zinc-400">${JSON.stringify(metadata.jsonMetadata, null, 2)}</pre>`}
280
+ </div>
281
+ {/if}
282
+ {/if}
283
+ </div>
284
+
285
+ <!-- Column browser (resizable) -->
286
+ <ResizablePaneGroup direction="horizontal" class="min-h-0 flex-1">
287
+ <!-- Column 1: Zoom levels -->
288
+ <ResizablePane defaultSize={28} minSize={15}>
289
+ <div class="flex h-full flex-col">
290
+ <div
291
+ class="shrink-0 border-b border-zinc-200 px-3 py-1.5 text-[11px] font-medium uppercase tracking-wider text-muted-foreground dark:border-zinc-800"
292
+ >
293
+ {t('pmtiles.zoomLevels')}
294
+ </div>
295
+ <div class="flex-1 overflow-auto">
296
+ {#each zoomSummaries as s}
297
+ <button
298
+ class="flex w-full items-center gap-2 px-3 py-1.5 text-xs hover:bg-zinc-100 dark:hover:bg-zinc-800/50"
299
+ class:bg-zinc-100={selectedZoom === s.zoom}
300
+ class:dark:bg-zinc-800={selectedZoom === s.zoom}
301
+ onclick={() => selectZoom(s.zoom)}
302
+ >
303
+ <span class="w-7 shrink-0 font-mono text-muted-foreground">z{s.zoom}</span>
304
+ <div class="min-w-0 flex-1">
305
+ <div
306
+ class="h-1.5 rounded-full bg-blue-500/60"
307
+ style="width: {Math.max(2, (s.count / maxCount) * 100)}%"
308
+ ></div>
309
+ </div>
310
+ <span class="shrink-0 text-[10px] tabular-nums text-muted-foreground">
311
+ {s.count.toLocaleString()}
312
+ </span>
313
+ <ChevronRightIcon class="size-3 shrink-0 text-muted-foreground" />
314
+ </button>
315
+ {/each}
316
+ </div>
317
+ </div>
318
+ </ResizablePane>
319
+
320
+ <ResizableHandle />
321
+
322
+ <!-- Column 2: Entries at zoom -->
323
+ <ResizablePane defaultSize={42} minSize={20}>
324
+ <div class="flex h-full flex-col">
325
+ {#if selectedZoom !== null}
326
+ <div
327
+ class="shrink-0 border-b border-zinc-200 px-3 py-1.5 text-[11px] font-medium uppercase tracking-wider text-muted-foreground dark:border-zinc-800"
328
+ >
329
+ {t('pmtiles.tilesAtZoom').replace('{zoom}', String(selectedZoom))}
330
+ <span class="ms-1 normal-case tracking-normal">({zoomEntries.length.toLocaleString()})</span>
331
+ </div>
332
+ <div class="flex-1 overflow-auto">
333
+ {#if loadingEntries}
334
+ <div class="p-4 text-center text-xs text-muted-foreground">Loading...</div>
335
+ {:else if errorMsg}
336
+ <div class="p-4 text-center text-xs text-red-400">{errorMsg}</div>
337
+ {:else if zoomEntries.length === 0}
338
+ <div class="p-4 text-center text-xs text-muted-foreground">{t('pmtiles.noEntries')}</div>
339
+ {:else}
340
+ {#each zoomEntries as entry}
341
+ <button
342
+ class="flex w-full items-center gap-2 px-3 py-1 text-xs hover:bg-zinc-100 dark:hover:bg-zinc-800/50"
343
+ class:bg-zinc-100={selectedEntry?.tileId === entry.tileId}
344
+ class:dark:bg-zinc-800={selectedEntry?.tileId === entry.tileId}
345
+ onclick={() => (selectedEntry = entry)}
346
+ >
347
+ <span class="shrink-0 truncate font-mono text-[11px]">
348
+ {entry.z}/{entry.x}/{entry.y}
349
+ </span>
350
+ <span class="ms-auto shrink-0 text-[10px] tabular-nums text-muted-foreground">
351
+ {formatBytes(entry.length)}
352
+ </span>
353
+ <ChevronRightIcon class="size-3 shrink-0 text-muted-foreground" />
354
+ </button>
355
+ {/each}
356
+ {/if}
357
+ </div>
358
+ {:else}
359
+ <div class="flex flex-1 items-center justify-center text-xs text-muted-foreground">
360
+ Select a zoom level
361
+ </div>
362
+ {/if}
363
+ </div>
364
+ </ResizablePane>
365
+
366
+ <ResizableHandle />
367
+
368
+ <!-- Column 3: Entry details -->
369
+ <ResizablePane defaultSize={30} minSize={15}>
370
+ <div class="flex h-full flex-col">
371
+ {@render entryDetails()}
372
+ </div>
373
+ </ResizablePane>
374
+ </ResizablePaneGroup>
375
+ </div>
376
+
377
+ <style>
378
+ .json-metadata :global(pre) {
379
+ margin: 0;
380
+ padding: 0.5rem;
381
+ border-radius: 0.375rem;
382
+ font-size: 0.6875rem;
383
+ line-height: 1.5;
384
+ }
385
+
386
+ .json-metadata :global(code) {
387
+ font-size: inherit;
388
+ }
389
+ </style>
@@ -0,0 +1,10 @@
1
+ import type { PMTiles } from 'pmtiles';
2
+ import type { PmtilesMetadata } from '../../../utils/pmtiles';
3
+ type $$ComponentProps = {
4
+ metadata: PmtilesMetadata;
5
+ pmtiles: PMTiles;
6
+ onOpenInspector?: (z: number, x: number, y: number) => void;
7
+ };
8
+ declare const PmtilesArchiveView: import("svelte").Component<$$ComponentProps, {}, "">;
9
+ type PmtilesArchiveView = ReturnType<typeof PmtilesArchiveView>;
10
+ export default PmtilesArchiveView;