@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,13 @@
1
+ import { ArcRotateCamera, Engine, Scene } from '@babylonjs/core';
2
+ import '@babylonjs/loaders';
3
+ export interface ModelScene {
4
+ engine: Engine;
5
+ scene: Scene;
6
+ camera: ArcRotateCamera;
7
+ }
8
+ export declare function createModelScene(canvas: HTMLCanvasElement): ModelScene;
9
+ export declare function loadModel(scene: Scene, camera: ArcRotateCamera, data: Uint8Array, extension: string): Promise<{
10
+ meshCount: number;
11
+ vertexCount: number;
12
+ }>;
13
+ export declare function disposeModelScene(modelScene: ModelScene): void;
@@ -0,0 +1,62 @@
1
+ import { ArcRotateCamera, Color4, Engine, HemisphericLight, Scene, SceneLoader, Vector3 } from '@babylonjs/core';
2
+ import '@babylonjs/loaders';
3
+ export function createModelScene(canvas) {
4
+ const engine = new Engine(canvas, true, {
5
+ preserveDrawingBuffer: true,
6
+ stencil: true
7
+ });
8
+ const scene = new Scene(engine);
9
+ scene.clearColor = new Color4(0.1, 0.1, 0.12, 1);
10
+ const camera = new ArcRotateCamera('camera', Math.PI / 4, Math.PI / 3, 10, Vector3.Zero(), scene);
11
+ camera.attachControl(canvas, true);
12
+ camera.wheelPrecision = 20;
13
+ camera.minZ = 0.01;
14
+ new HemisphericLight('light', new Vector3(0, 1, 0.3), scene);
15
+ engine.runRenderLoop(() => scene.render());
16
+ return { engine, scene, camera };
17
+ }
18
+ export async function loadModel(scene, camera, data, extension) {
19
+ const blob = new Blob([data]);
20
+ const url = URL.createObjectURL(blob);
21
+ const extMap = {
22
+ glb: '.glb',
23
+ gltf: '.gltf',
24
+ obj: '.obj',
25
+ stl: '.stl',
26
+ fbx: '.fbx'
27
+ };
28
+ const fileExt = extMap[extension.toLowerCase()] || '.glb';
29
+ try {
30
+ const result = await SceneLoader.ImportMeshAsync('', '', url, scene, undefined, fileExt);
31
+ // Auto-frame camera to model bounds
32
+ let min = new Vector3(Infinity, Infinity, Infinity);
33
+ let max = new Vector3(-Infinity, -Infinity, -Infinity);
34
+ let vertexCount = 0;
35
+ for (const mesh of result.meshes) {
36
+ if (mesh.getBoundingInfo) {
37
+ const bb = mesh.getBoundingInfo().boundingBox;
38
+ min = Vector3.Minimize(min, bb.minimumWorld);
39
+ max = Vector3.Maximize(max, bb.maximumWorld);
40
+ }
41
+ if (mesh.getTotalVertices) {
42
+ vertexCount += mesh.getTotalVertices();
43
+ }
44
+ }
45
+ const center = min.add(max).scale(0.5);
46
+ const size = max.subtract(min);
47
+ const maxDim = Math.max(size.x, size.y, size.z);
48
+ camera.target = center;
49
+ camera.radius = maxDim * 2;
50
+ camera.alpha = Math.PI / 4;
51
+ camera.beta = Math.PI / 3;
52
+ return { meshCount: result.meshes.length, vertexCount };
53
+ }
54
+ finally {
55
+ URL.revokeObjectURL(url);
56
+ }
57
+ }
58
+ export function disposeModelScene(modelScene) {
59
+ modelScene.engine.stopRenderLoop();
60
+ modelScene.scene.dispose();
61
+ modelScene.engine.dispose();
62
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Lightweight Parquet metadata reader using hyparquet.
3
+ *
4
+ * Reads schema, row count, CRS, and geometry types from the Parquet footer
5
+ * via a single HTTP range request (~512KB). No DuckDB boot needed.
6
+ *
7
+ * This provides instant metadata display before DuckDB-WASM finishes loading.
8
+ */
9
+ import type { GeoArrowGeomType } from './geoarrow.js';
10
+ export interface GeoColumnMeta {
11
+ encoding: string;
12
+ geometryTypes: string[];
13
+ crs: any | null;
14
+ bbox?: number[];
15
+ }
16
+ export interface GeoParquetMeta {
17
+ primaryColumn: string;
18
+ columns: Record<string, GeoColumnMeta>;
19
+ }
20
+ export interface ParquetFileMetadata {
21
+ /** Total number of rows across all row groups. */
22
+ rowCount: number;
23
+ /** Column schema (name + type). */
24
+ schema: {
25
+ name: string;
26
+ type: string;
27
+ }[];
28
+ /** GeoParquet "geo" metadata if present. */
29
+ geo: GeoParquetMeta | null;
30
+ /** True when file has legacy GeoParquet metadata (schema_version 0.x without "version" field). */
31
+ legacyGeoParquet: boolean;
32
+ /** Tool that created the file (e.g. "pyarrow 15.0.0"). */
33
+ createdBy: string | null;
34
+ /** Number of row groups. */
35
+ numRowGroups: number;
36
+ /** Primary compression codec (e.g. "SNAPPY", "ZSTD"). */
37
+ compression: string | null;
38
+ }
39
+ /**
40
+ * Read Parquet footer metadata from a remote URL using hyparquet.
41
+ * Uses HTTP range requests — typically a single ~512KB fetch.
42
+ */
43
+ export declare function readParquetMetadata(url: string): Promise<ParquetFileMetadata>;
44
+ /**
45
+ * Extract EPSG code from GeoParquet CRS metadata.
46
+ * Returns null for WGS84/CRS84 (no reprojection needed).
47
+ */
48
+ export declare function extractEpsgFromGeoMeta(geo: GeoParquetMeta): string | null;
49
+ /**
50
+ * Extract normalized geometry types from GeoParquet metadata.
51
+ * Returns the set of geometry types for the primary column.
52
+ */
53
+ export declare function extractGeometryTypes(geo: GeoParquetMeta): GeoArrowGeomType[];
54
+ /**
55
+ * Extract bounds from GeoParquet metadata (bbox field).
56
+ * Returns [minX, minY, maxX, maxY] or null.
57
+ */
58
+ export declare function extractBounds(geo: GeoParquetMeta): [number, number, number, number] | null;
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Lightweight Parquet metadata reader using hyparquet.
3
+ *
4
+ * Reads schema, row count, CRS, and geometry types from the Parquet footer
5
+ * via a single HTTP range request (~512KB). No DuckDB boot needed.
6
+ *
7
+ * This provides instant metadata display before DuckDB-WASM finishes loading.
8
+ */
9
+ const WGS84_CODES = new Set([4326, 4979]);
10
+ /** Map hyparquet schema element types to DuckDB-like type strings. */
11
+ function mapParquetType(col) {
12
+ const lt = col.logical_type;
13
+ if (lt) {
14
+ // Parquet Format 2.11+ native geometry/geography types
15
+ if (lt.type === 'GEOMETRY' || lt.type === 'GEOGRAPHY')
16
+ return 'GEOMETRY';
17
+ // String types
18
+ if (lt.type === 'STRING' || lt.type === 'UTF8')
19
+ return 'VARCHAR';
20
+ if (lt.type === 'JSON')
21
+ return 'JSON';
22
+ if (lt.type === 'UUID')
23
+ return 'UUID';
24
+ if (lt.type === 'ENUM')
25
+ return 'VARCHAR';
26
+ // Integer types
27
+ if (lt.type === 'INT' || lt.type === 'INTEGER') {
28
+ const bits = lt.bitWidth ?? 32;
29
+ const signed = lt.isSigned !== false;
30
+ if (bits <= 8)
31
+ return signed ? 'TINYINT' : 'UTINYINT';
32
+ if (bits <= 16)
33
+ return signed ? 'SMALLINT' : 'USMALLINT';
34
+ if (bits <= 32)
35
+ return signed ? 'INTEGER' : 'UINTEGER';
36
+ return signed ? 'BIGINT' : 'UBIGINT';
37
+ }
38
+ // Decimal
39
+ if (lt.type === 'DECIMAL')
40
+ return `DECIMAL(${lt.precision ?? 18},${lt.scale ?? 0})`;
41
+ // Date/Time
42
+ if (lt.type === 'DATE')
43
+ return 'DATE';
44
+ if (lt.type === 'TIME')
45
+ return 'TIME';
46
+ if (lt.type === 'TIMESTAMP')
47
+ return 'TIMESTAMP';
48
+ // Binary
49
+ if (lt.type === 'BSON')
50
+ return 'BLOB';
51
+ }
52
+ // Fallback to physical type
53
+ const ct = col.converted_type;
54
+ if (ct === 'UTF8')
55
+ return 'VARCHAR';
56
+ if (ct === 'JSON')
57
+ return 'JSON';
58
+ if (ct === 'DATE')
59
+ return 'DATE';
60
+ if (ct === 'TIMESTAMP_MILLIS' || ct === 'TIMESTAMP_MICROS')
61
+ return 'TIMESTAMP';
62
+ if (ct === 'DECIMAL')
63
+ return `DECIMAL(${col.precision ?? 18},${col.scale ?? 0})`;
64
+ if (ct === 'INT_8')
65
+ return 'TINYINT';
66
+ if (ct === 'INT_16')
67
+ return 'SMALLINT';
68
+ if (ct === 'INT_32')
69
+ return 'INTEGER';
70
+ if (ct === 'INT_64')
71
+ return 'BIGINT';
72
+ if (ct === 'UINT_8')
73
+ return 'UTINYINT';
74
+ if (ct === 'UINT_16')
75
+ return 'USMALLINT';
76
+ if (ct === 'UINT_32')
77
+ return 'UINTEGER';
78
+ if (ct === 'UINT_64')
79
+ return 'UBIGINT';
80
+ const pt = col.type;
81
+ if (pt === 'BOOLEAN')
82
+ return 'BOOLEAN';
83
+ if (pt === 'INT32')
84
+ return 'INTEGER';
85
+ if (pt === 'INT64')
86
+ return 'BIGINT';
87
+ if (pt === 'INT96')
88
+ return 'TIMESTAMP';
89
+ if (pt === 'FLOAT')
90
+ return 'FLOAT';
91
+ if (pt === 'DOUBLE')
92
+ return 'DOUBLE';
93
+ if (pt === 'BYTE_ARRAY')
94
+ return 'BLOB';
95
+ if (pt === 'FIXED_LEN_BYTE_ARRAY')
96
+ return 'BLOB';
97
+ return 'VARCHAR';
98
+ }
99
+ /**
100
+ * Read Parquet footer metadata from a remote URL using hyparquet.
101
+ * Uses HTTP range requests — typically a single ~512KB fetch.
102
+ */
103
+ export async function readParquetMetadata(url) {
104
+ const { parquetMetadataAsync, asyncBufferFromUrl } = await import('hyparquet');
105
+ const file = await asyncBufferFromUrl({ url });
106
+ const metadata = await parquetMetadataAsync(file);
107
+ // Row count from row group metadata (no data scan needed)
108
+ const rowCount = metadata.row_groups.reduce((sum, rg) => sum + Number(rg.num_rows), 0);
109
+ // Schema from metadata (skip root element at index 0)
110
+ const schema = metadata.schema
111
+ .slice(1)
112
+ .filter((col) => col.num_children === undefined) // skip group elements
113
+ .map((col) => ({
114
+ name: col.name,
115
+ type: mapParquetType(col)
116
+ }));
117
+ // GeoParquet "geo" key-value metadata
118
+ let geo = null;
119
+ let legacyGeoParquet = false;
120
+ const geoKv = metadata.key_value_metadata?.find((kv) => kv.key === 'geo');
121
+ if (geoKv) {
122
+ try {
123
+ const geoJson = JSON.parse(geoKv.value ?? '');
124
+ // Detect legacy GeoParquet (schema_version 0.x without "version" field).
125
+ // Early geopandas (<0.12) wrote schema_version instead of version.
126
+ // DuckDB's spatial extension rejects these files with:
127
+ // "Geoparquet metadata does not have a version"
128
+ if (geoJson.schema_version && !geoJson.version) {
129
+ legacyGeoParquet = true;
130
+ }
131
+ geo = {
132
+ primaryColumn: geoJson.primary_column ?? 'geometry',
133
+ columns: {}
134
+ };
135
+ if (geoJson.columns) {
136
+ for (const [colName, colMeta] of Object.entries(geoJson.columns)) {
137
+ geo.columns[colName] = {
138
+ encoding: colMeta.encoding ?? 'WKB',
139
+ geometryTypes: colMeta.geometry_types ?? [],
140
+ crs: colMeta.crs ?? null,
141
+ bbox: colMeta.bbox
142
+ };
143
+ }
144
+ }
145
+ }
146
+ catch {
147
+ // malformed geo metadata — ignore
148
+ }
149
+ }
150
+ // Created-by tool
151
+ const createdBy = metadata.created_by ?? null;
152
+ // Row group count
153
+ const numRowGroups = metadata.row_groups.length;
154
+ // Compression: collect unique codecs from first row group's columns
155
+ let compression = null;
156
+ if (numRowGroups > 0 && metadata.row_groups[0].columns) {
157
+ const codecs = new Set();
158
+ for (const col of metadata.row_groups[0].columns) {
159
+ const codec = col.meta_data?.codec;
160
+ if (codec)
161
+ codecs.add(codec);
162
+ }
163
+ if (codecs.size === 1) {
164
+ compression = [...codecs][0];
165
+ }
166
+ else if (codecs.size > 1) {
167
+ compression = [...codecs].join(', ');
168
+ }
169
+ }
170
+ return { rowCount, schema, geo, legacyGeoParquet, createdBy, numRowGroups, compression };
171
+ }
172
+ /**
173
+ * Extract EPSG code from GeoParquet CRS metadata.
174
+ * Returns null for WGS84/CRS84 (no reprojection needed).
175
+ */
176
+ export function extractEpsgFromGeoMeta(geo) {
177
+ const primaryCol = geo.columns[geo.primaryColumn];
178
+ if (!primaryCol?.crs)
179
+ return null;
180
+ const crs = primaryCol.crs;
181
+ // OGC CRS84 is lon/lat WGS84
182
+ if (crs.type === 'name' && crs.properties?.name?.includes('CRS84'))
183
+ return null;
184
+ // PROJJSON: { "id": { "authority": "EPSG", "code": 27700 } }
185
+ if (crs.id?.authority === 'EPSG') {
186
+ const code = crs.id.code;
187
+ if (WGS84_CODES.has(code))
188
+ return null;
189
+ return `EPSG:${code}`;
190
+ }
191
+ return null;
192
+ }
193
+ /**
194
+ * Extract normalized geometry types from GeoParquet metadata.
195
+ * Returns the set of geometry types for the primary column.
196
+ */
197
+ export function extractGeometryTypes(geo) {
198
+ const primaryCol = geo.columns[geo.primaryColumn];
199
+ if (!primaryCol?.geometryTypes?.length)
200
+ return [];
201
+ const typeMap = {
202
+ Point: 'point',
203
+ LineString: 'linestring',
204
+ Polygon: 'polygon',
205
+ MultiPoint: 'multipoint',
206
+ MultiLineString: 'multilinestring',
207
+ MultiPolygon: 'multipolygon'
208
+ };
209
+ const types = [];
210
+ for (const raw of primaryCol.geometryTypes) {
211
+ // GeoParquet geometry_types may include Z/M suffixes like "Polygon Z"
212
+ const base = raw.split(' ')[0];
213
+ const mapped = typeMap[base];
214
+ if (mapped && !types.includes(mapped))
215
+ types.push(mapped);
216
+ }
217
+ return types;
218
+ }
219
+ /**
220
+ * Extract bounds from GeoParquet metadata (bbox field).
221
+ * Returns [minX, minY, maxX, maxY] or null.
222
+ */
223
+ export function extractBounds(geo) {
224
+ const primaryCol = geo.columns[geo.primaryColumn];
225
+ if (!primaryCol?.bbox || primaryCol.bbox.length < 4)
226
+ return null;
227
+ return [primaryCol.bbox[0], primaryCol.bbox[1], primaryCol.bbox[2], primaryCol.bbox[3]];
228
+ }
@@ -0,0 +1,8 @@
1
+ import type { PDFDocumentLoadingTask } from 'pdfjs-dist';
2
+ /** Load a PDF from an in-memory buffer. Returns the loading task (cancellable). */
3
+ export declare function loadPdfDocument(data: Uint8Array): Promise<PDFDocumentLoadingTask>;
4
+ /**
5
+ * Load a PDF from a URL using HTTP range requests (progressive page rendering).
6
+ * Returns the loading task (cancellable via `.destroy()`).
7
+ */
8
+ export declare function loadPdfFromUrl(url: string): Promise<PDFDocumentLoadingTask>;
@@ -0,0 +1,28 @@
1
+ let pdfjsPromise = null;
2
+ async function getPdfjs() {
3
+ if (!pdfjsPromise) {
4
+ pdfjsPromise = import('pdfjs-dist').then((mod) => {
5
+ mod.GlobalWorkerOptions.workerSrc = `https://cdn.jsdelivr.net/npm/pdfjs-dist@${mod.version}/build/pdf.worker.min.mjs`;
6
+ return mod;
7
+ });
8
+ }
9
+ return pdfjsPromise;
10
+ }
11
+ /** Load a PDF from an in-memory buffer. Returns the loading task (cancellable). */
12
+ export async function loadPdfDocument(data) {
13
+ const pdfjs = await getPdfjs();
14
+ return pdfjs.getDocument({ data });
15
+ }
16
+ /**
17
+ * Load a PDF from a URL using HTTP range requests (progressive page rendering).
18
+ * Returns the loading task (cancellable via `.destroy()`).
19
+ */
20
+ export async function loadPdfFromUrl(url) {
21
+ const pdfjs = await getPdfjs();
22
+ return pdfjs.getDocument({
23
+ url,
24
+ disableRange: false,
25
+ disableStream: false,
26
+ disableAutoFetch: true
27
+ });
28
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * PMTiles tile decoding utilities.
3
+ *
4
+ * Fetches individual tiles from a PMTiles archive and decodes MVT
5
+ * vector tiles into a structure suitable for SVG rendering and
6
+ * feature inspection.
7
+ */
8
+ import type { PMTiles } from 'pmtiles';
9
+ export interface DecodedTile {
10
+ z: number;
11
+ x: number;
12
+ y: number;
13
+ layers: DecodedLayer[];
14
+ rawSize: number;
15
+ }
16
+ export interface DecodedLayer {
17
+ name: string;
18
+ extent: number;
19
+ features: DecodedFeature[];
20
+ }
21
+ export interface DecodedFeature {
22
+ type: 'Point' | 'LineString' | 'Polygon' | 'Unknown';
23
+ /** Raw tile coordinates (0..extent) — ring arrays. */
24
+ geometry: number[][][];
25
+ properties: Record<string, unknown>;
26
+ id?: number;
27
+ }
28
+ /**
29
+ * Fetch and decode an MVT tile from a PMTiles archive.
30
+ * Returns null if the tile does not exist or for raster archives.
31
+ */
32
+ export declare function decodeMvtTile(pmtiles: PMTiles, z: number, x: number, y: number): Promise<DecodedTile | null>;
33
+ /** Convert tile bytes to a Blob URL for raster tile preview. */
34
+ export declare function tileToImageUrl(pmtiles: PMTiles, z: number, x: number, y: number, mimeType: string): Promise<string | null>;
35
+ /** MIME type for a PMTiles tile format string. */
36
+ export declare function tileMimeType(format: string): string;
37
+ /** Compute the hue for layer index i (same palette as buildPmtilesLayers). */
38
+ export declare function layerHue(i: number): number;
@@ -0,0 +1,64 @@
1
+ /**
2
+ * PMTiles tile decoding utilities.
3
+ *
4
+ * Fetches individual tiles from a PMTiles archive and decodes MVT
5
+ * vector tiles into a structure suitable for SVG rendering and
6
+ * feature inspection.
7
+ */
8
+ const GEOM_TYPES = ['Unknown', 'Point', 'LineString', 'Polygon'];
9
+ /**
10
+ * Fetch and decode an MVT tile from a PMTiles archive.
11
+ * Returns null if the tile does not exist or for raster archives.
12
+ */
13
+ export async function decodeMvtTile(pmtiles, z, x, y) {
14
+ const resp = await pmtiles.getZxy(z, x, y);
15
+ if (!resp)
16
+ return null;
17
+ const bytes = new Uint8Array(resp.data);
18
+ const rawSize = bytes.length;
19
+ // Lazy-load @mapbox/vector-tile + pbf (only when inspector is opened)
20
+ const [{ VectorTile }, { default: Pbf }] = await Promise.all([
21
+ import('@mapbox/vector-tile'),
22
+ import('pbf')
23
+ ]);
24
+ const tile = new VectorTile(new Pbf(bytes));
25
+ const layers = [];
26
+ for (const [name, vtLayer] of Object.entries(tile.layers)) {
27
+ const features = [];
28
+ for (let i = 0; i < vtLayer.length; i++) {
29
+ const f = vtLayer.feature(i);
30
+ const rawGeom = f.loadGeometry();
31
+ const geometry = rawGeom.map((ring) => ring.map((pt) => [pt.x, pt.y]));
32
+ features.push({
33
+ type: GEOM_TYPES[f.type] ?? 'Unknown',
34
+ geometry,
35
+ properties: f.properties,
36
+ id: f.id
37
+ });
38
+ }
39
+ layers.push({ name, extent: vtLayer.extent, features });
40
+ }
41
+ return { z, x, y, layers, rawSize };
42
+ }
43
+ /** Convert tile bytes to a Blob URL for raster tile preview. */
44
+ export async function tileToImageUrl(pmtiles, z, x, y, mimeType) {
45
+ const resp = await pmtiles.getZxy(z, x, y);
46
+ if (!resp)
47
+ return null;
48
+ const blob = new Blob([resp.data], { type: mimeType });
49
+ return URL.createObjectURL(blob);
50
+ }
51
+ /** MIME type for a PMTiles tile format string. */
52
+ export function tileMimeType(format) {
53
+ const map = {
54
+ png: 'image/png',
55
+ jpeg: 'image/jpeg',
56
+ webp: 'image/webp',
57
+ avif: 'image/avif'
58
+ };
59
+ return map[format] ?? 'application/octet-stream';
60
+ }
61
+ /** Compute the hue for layer index i (same palette as buildPmtilesLayers). */
62
+ export function layerHue(i) {
63
+ return (i * 137) % 360;
64
+ }
@@ -0,0 +1,46 @@
1
+ import { type Header, PMTiles, Protocol } from 'pmtiles';
2
+ export declare function getPmtilesProtocol(): Protocol;
3
+ export declare const TILE_TYPE_LABELS: Record<number, string>;
4
+ export declare const COMPRESSION_LABELS: Record<number, string>;
5
+ /** Rich vector layer info from TileJSON metadata. */
6
+ export interface VectorLayerInfo {
7
+ id: string;
8
+ description?: string;
9
+ minzoom?: number;
10
+ maxzoom?: number;
11
+ fields: Record<string, string>;
12
+ }
13
+ export interface PmtilesMetadata {
14
+ specVersion: number;
15
+ format: string;
16
+ formatLabel: string;
17
+ internalCompression: string;
18
+ tileCompression: string;
19
+ minZoom: number;
20
+ maxZoom: number;
21
+ bounds: [number, number, number, number] | null;
22
+ center: [number, number] | null;
23
+ centerZoom: number;
24
+ clustered: boolean;
25
+ numAddressedTiles: number;
26
+ numTileEntries: number;
27
+ numTileContents: number;
28
+ layers: string[];
29
+ vectorLayers: VectorLayerInfo[];
30
+ jsonMetadata: Record<string, unknown> | null;
31
+ header: Header;
32
+ name?: string;
33
+ description?: string;
34
+ attribution?: string;
35
+ version?: string;
36
+ }
37
+ /** Load a PMTiles archive and return both the instance and its metadata. */
38
+ export declare function loadPmtiles(url: string): Promise<{
39
+ pmtiles: PMTiles;
40
+ metadata: PmtilesMetadata;
41
+ }>;
42
+ /**
43
+ * Build vector tile layers for PMTiles source.
44
+ * Each source layer gets a fill + line layer with distinct hue.
45
+ */
46
+ export declare function buildPmtilesLayers(sourceId: string, metadata: PmtilesMetadata): maplibregl.LayerSpecification[];
@@ -0,0 +1,135 @@
1
+ import { PMTiles, Protocol } from 'pmtiles';
2
+ let protocol = null;
3
+ export function getPmtilesProtocol() {
4
+ if (!protocol) {
5
+ protocol = new Protocol();
6
+ }
7
+ return protocol;
8
+ }
9
+ export const TILE_TYPE_LABELS = {
10
+ 0: 'Unknown',
11
+ 1: 'MVT',
12
+ 2: 'PNG',
13
+ 3: 'JPEG',
14
+ 4: 'WebP',
15
+ 5: 'AVIF',
16
+ 6: 'MLT'
17
+ };
18
+ export const COMPRESSION_LABELS = {
19
+ 0: 'Unknown',
20
+ 1: 'None',
21
+ 2: 'Gzip',
22
+ 3: 'Brotli',
23
+ 4: 'Zstd'
24
+ };
25
+ const FORMAT_MAP = {
26
+ 1: 'mvt',
27
+ 2: 'png',
28
+ 3: 'jpeg',
29
+ 4: 'webp',
30
+ 5: 'avif',
31
+ 6: 'mlt'
32
+ };
33
+ function extractMetadata(header, jsonMeta) {
34
+ const tiletype = header.tileType;
35
+ const format = FORMAT_MAP[tiletype] ?? 'unknown';
36
+ const bounds = header.minLon !== undefined
37
+ ? [header.minLon, header.minLat, header.maxLon, header.maxLat]
38
+ : null;
39
+ const center = header.centerLon !== undefined ? [header.centerLon, header.centerLat] : null;
40
+ const layers = [];
41
+ const vectorLayers = [];
42
+ if (jsonMeta && typeof jsonMeta === 'object' && 'vector_layers' in jsonMeta) {
43
+ const vl = jsonMeta.vector_layers;
44
+ if (Array.isArray(vl)) {
45
+ for (const layer of vl) {
46
+ if (layer.id) {
47
+ layers.push(layer.id);
48
+ vectorLayers.push({
49
+ id: layer.id,
50
+ description: layer.description,
51
+ minzoom: layer.minzoom,
52
+ maxzoom: layer.maxzoom,
53
+ fields: layer.fields ?? {}
54
+ });
55
+ }
56
+ }
57
+ }
58
+ }
59
+ return {
60
+ specVersion: header.specVersion,
61
+ format,
62
+ formatLabel: TILE_TYPE_LABELS[tiletype] ?? 'Unknown',
63
+ internalCompression: COMPRESSION_LABELS[header.internalCompression] ?? 'Unknown',
64
+ tileCompression: COMPRESSION_LABELS[header.tileCompression] ?? 'Unknown',
65
+ minZoom: header.minZoom,
66
+ maxZoom: header.maxZoom,
67
+ bounds,
68
+ center,
69
+ centerZoom: header.centerZoom,
70
+ clustered: header.clustered,
71
+ numAddressedTiles: header.numAddressedTiles,
72
+ numTileEntries: header.numTileEntries,
73
+ numTileContents: header.numTileContents,
74
+ layers,
75
+ vectorLayers,
76
+ jsonMetadata: jsonMeta,
77
+ header,
78
+ name: jsonMeta?.name,
79
+ description: jsonMeta?.description,
80
+ attribution: jsonMeta?.attribution,
81
+ version: jsonMeta?.version
82
+ };
83
+ }
84
+ /** Load a PMTiles archive and return both the instance and its metadata. */
85
+ export async function loadPmtiles(url) {
86
+ const pmtiles = new PMTiles(url);
87
+ const header = await pmtiles.getHeader();
88
+ const jsonMeta = (await pmtiles.getMetadata());
89
+ return { pmtiles, metadata: extractMetadata(header, jsonMeta) };
90
+ }
91
+ /**
92
+ * Build vector tile layers for PMTiles source.
93
+ * Each source layer gets a fill + line layer with distinct hue.
94
+ */
95
+ export function buildPmtilesLayers(sourceId, metadata) {
96
+ const layers = [];
97
+ for (let i = 0; i < metadata.layers.length; i++) {
98
+ const layerId = metadata.layers[i];
99
+ const hue = (i * 137) % 360;
100
+ layers.push({
101
+ id: `${layerId}-fill`,
102
+ type: 'fill',
103
+ source: sourceId,
104
+ 'source-layer': layerId,
105
+ paint: {
106
+ 'fill-color': `hsl(${hue}, 70%, 55%)`,
107
+ 'fill-opacity': 0.4
108
+ }
109
+ });
110
+ layers.push({
111
+ id: `${layerId}-line`,
112
+ type: 'line',
113
+ source: sourceId,
114
+ 'source-layer': layerId,
115
+ paint: {
116
+ 'line-color': `hsl(${hue}, 70%, 40%)`,
117
+ 'line-width': 1.5
118
+ }
119
+ });
120
+ layers.push({
121
+ id: `${layerId}-circle`,
122
+ type: 'circle',
123
+ source: sourceId,
124
+ 'source-layer': layerId,
125
+ filter: ['==', '$type', 'Point'],
126
+ paint: {
127
+ 'circle-radius': 5,
128
+ 'circle-color': `hsl(${hue}, 70%, 55%)`,
129
+ 'circle-stroke-width': 1.5,
130
+ 'circle-stroke-color': '#fff'
131
+ }
132
+ });
133
+ }
134
+ return layers;
135
+ }