@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,553 @@
1
+ <script lang="ts">
2
+ import EllipsisVerticalIcon from '@lucide/svelte/icons/ellipsis-vertical';
3
+ import { onDestroy } from 'svelte';
4
+ import { Badge } from '../ui/badge/index.js';
5
+ import { Button } from '../ui/button/index.js';
6
+ import * as DropdownMenu from '../ui/dropdown-menu/index.js';
7
+ import { t } from '../../i18n/index.svelte.js';
8
+ import { getAdapter } from '../../storage/index.js';
9
+ import { tabResources } from '../../stores/tab-resources.svelte.js';
10
+ import type { Tab } from '../../types';
11
+ import { extensionToShikiLang, highlightCode } from '../../utils/shiki';
12
+ import { buildHttpsUrl } from '../../utils/url.js';
13
+ import { getUrlView, updateUrlView } from '../../utils/url-state.js';
14
+
15
+ let { tab }: { tab: Tab } = $props();
16
+
17
+ let abortController: AbortController | null = null;
18
+ let html = $state('');
19
+ let rawCode = $state('');
20
+ let loading = $state(true);
21
+ let error = $state<string | null>(null);
22
+ let wordWrap = $state(false);
23
+ let copied = $state(false);
24
+ let formatted = $state(false);
25
+ const urlView = getUrlView();
26
+ function getInitialViewMode():
27
+ | 'code'
28
+ | 'render'
29
+ | 'stac-browser'
30
+ | 'kepler'
31
+ | 'maputnik'
32
+ | 'marimo' {
33
+ if (urlView === 'stac-browser') return 'stac-browser';
34
+ if (urlView === 'kepler') return 'kepler';
35
+ if (urlView === 'maputnik') return 'maputnik';
36
+ if (urlView === 'marimo') return 'marimo';
37
+ if (urlView === 'code') return 'code';
38
+ if (tab.extension.toLowerCase() === 'html') return 'render';
39
+ return 'code';
40
+ }
41
+ let viewMode = $state(getInitialViewMode());
42
+
43
+ type JsonKind =
44
+ | 'maplibre-style'
45
+ | 'tilejson'
46
+ | 'stac-catalog'
47
+ | 'stac-collection'
48
+ | 'stac-item'
49
+ | 'kepler'
50
+ | null;
51
+
52
+ /** Detect if a .py file is a marimo notebook (first 512 bytes contain both markers) */
53
+ function isMarimoNotebook(code: string): boolean {
54
+ const header = code.slice(0, 512);
55
+ return header.includes('import marimo') && header.includes('marimo.App');
56
+ }
57
+
58
+ /** Detect if a .md file is a marimo notebook (first 512 bytes contain marimo-version:) */
59
+ function isMarimoMarkdown(code: string): boolean {
60
+ const header = code.slice(0, 512);
61
+ return header.includes('marimo-version:');
62
+ }
63
+
64
+ /** Detect if JSON is a MapLibre style, TileJSON, STAC object, or Kepler.gl config */
65
+ function detectJsonKind(code: string): JsonKind {
66
+ try {
67
+ const obj = JSON.parse(code);
68
+ if (obj && typeof obj === 'object') {
69
+ if (obj.version === 8 && obj.sources && obj.layers) return 'maplibre-style';
70
+ if (obj.tilejson && obj.tiles) return 'tilejson';
71
+ if (obj.type === 'Catalog' && obj.stac_version) return 'stac-catalog';
72
+ if (obj.type === 'Collection' && obj.stac_version) return 'stac-collection';
73
+ if (obj.type === 'Feature' && obj.stac_version) return 'stac-item';
74
+ if (obj.info?.app === 'kepler.gl' && obj.config) return 'kepler';
75
+ }
76
+ } catch {
77
+ // not valid JSON
78
+ }
79
+ return null;
80
+ }
81
+
82
+ const ext = $derived(`.${tab.extension.toLowerCase()}`);
83
+ const isHtml = $derived(ext === '.html');
84
+ const lang = $derived(extensionToShikiLang(ext));
85
+ const jsonKind = $derived(ext === '.json' ? detectJsonKind(rawCode) : null);
86
+ const isStacJson = $derived(jsonKind?.startsWith('stac-') ?? false);
87
+ const stacBadgeKey = $derived<Record<string, string>>({
88
+ 'stac-catalog': 'code.stacCatalog',
89
+ 'stac-collection': 'code.stacCollection',
90
+ 'stac-item': 'code.stacItem'
91
+ });
92
+ const styleUrl = $derived(buildHttpsUrl(tab));
93
+ const stacBrowserSrc = $derived(
94
+ `https://radiantearth.github.io/stac-browser/#/external/${styleUrl}`
95
+ );
96
+ const keplerSrc = $derived(`https://kepler.gl/demo?mapUrl=${encodeURIComponent(styleUrl)}`);
97
+ const maputnikSrc = $derived(
98
+ `https://maplibre.org/maputnik/?style=${encodeURIComponent(styleUrl)}`
99
+ );
100
+
101
+ const languageMap: Record<string, string> = {
102
+ '.js': 'JavaScript',
103
+ '.ts': 'TypeScript',
104
+ '.py': 'Python',
105
+ '.rs': 'Rust',
106
+ '.go': 'Go',
107
+ '.java': 'Java',
108
+ '.c': 'C',
109
+ '.cpp': 'C++',
110
+ '.h': 'C Header',
111
+ '.hpp': 'C++ Header',
112
+ '.rb': 'Ruby',
113
+ '.php': 'PHP',
114
+ '.swift': 'Swift',
115
+ '.kt': 'Kotlin',
116
+ '.scala': 'Scala',
117
+ '.r': 'R',
118
+ '.lua': 'Lua',
119
+ '.sql': 'SQL',
120
+ '.html': 'HTML',
121
+ '.css': 'CSS',
122
+ '.xml': 'XML',
123
+ '.yaml': 'YAML',
124
+ '.yml': 'YAML',
125
+ '.toml': 'TOML',
126
+ '.json': 'JSON',
127
+ '.sh': 'Shell',
128
+ '.bash': 'Bash',
129
+ '.vim': 'Vim Script',
130
+ '.dockerfile': 'Dockerfile',
131
+ '.makefile': 'Makefile',
132
+ '.ini': 'INI',
133
+ '.cfg': 'Config',
134
+ '.conf': 'Config',
135
+ '.env': 'Environment',
136
+ '.txt': 'Plain Text',
137
+ '.log': 'Log',
138
+ '.md': 'Markdown',
139
+ '.svelte': 'Svelte',
140
+ '.vue': 'Vue'
141
+ };
142
+
143
+ const isMarimo = $derived(
144
+ (ext === '.py' && isMarimoNotebook(rawCode)) ||
145
+ ((ext === '.md' || ext === '.qmd') && isMarimoMarkdown(rawCode))
146
+ );
147
+
148
+ let marimoSrc = $state('');
149
+ let htmlBlobUrl = $state('');
150
+
151
+ const language = $derived(languageMap[ext] ?? 'Plain Text');
152
+
153
+ /** File types that support native formatting */
154
+ const canFormat = $derived(['.json', '.sql', '.css', '.html', '.xml'].includes(ext));
155
+
156
+ // Reset iframe view mode when tab changes (component reuse across code-type tabs)
157
+ let prevTabId = '';
158
+ $effect(() => {
159
+ const id = tab.id;
160
+ if (prevTabId && prevTabId !== id) {
161
+ viewMode = isHtml ? 'render' : 'code';
162
+ updateUrlView('');
163
+ }
164
+ prevTabId = id;
165
+ });
166
+
167
+ function cleanup() {
168
+ abortController?.abort();
169
+ abortController = null;
170
+ }
171
+
172
+ $effect(() => {
173
+ if (!tab) return;
174
+ const unregister = tabResources.register(tab.id, cleanup);
175
+ return unregister;
176
+ });
177
+ onDestroy(cleanup);
178
+
179
+ $effect(() => {
180
+ if (!tab) return;
181
+ loadCode();
182
+ });
183
+
184
+ async function loadCode() {
185
+ abortController?.abort();
186
+ abortController = new AbortController();
187
+ const { signal } = abortController;
188
+
189
+ loading = true;
190
+ error = null;
191
+
192
+ try {
193
+ const adapter = getAdapter(tab.source, tab.connectionId);
194
+ const data = await adapter.read(tab.path, undefined, undefined, signal);
195
+ rawCode = new TextDecoder().decode(data);
196
+ html = await highlightCode(rawCode, lang);
197
+ } catch (err) {
198
+ if (err instanceof DOMException && err.name === 'AbortError') return;
199
+ error = err instanceof Error ? err.message : String(err);
200
+ } finally {
201
+ loading = false;
202
+ }
203
+ }
204
+
205
+ // Build marimo playground URL when marimo notebook is detected
206
+ $effect(() => {
207
+ if (!isMarimo || !rawCode) {
208
+ marimoSrc = '';
209
+ return;
210
+ }
211
+ import('lz-string').then(({ compressToEncodedURIComponent }) => {
212
+ const compressed = compressToEncodedURIComponent(rawCode);
213
+ marimoSrc = `https://marimo.app?embed=true&mode=read#code/${compressed}`;
214
+ });
215
+ });
216
+
217
+ // Build blob URL for HTML rendering
218
+ // Only reads isHtml + rawCode as dependencies; cleanup revokes via captured local ref
219
+ $effect(() => {
220
+ if (!isHtml || !rawCode) {
221
+ htmlBlobUrl = '';
222
+ return;
223
+ }
224
+ const blob = new Blob([rawCode], { type: 'text/html' });
225
+ const url = URL.createObjectURL(blob);
226
+ htmlBlobUrl = url;
227
+
228
+ return () => URL.revokeObjectURL(url);
229
+ });
230
+
231
+ async function toggleFormat() {
232
+ if (formatted) {
233
+ // Restore original
234
+ html = await highlightCode(rawCode, lang);
235
+ formatted = false;
236
+ return;
237
+ }
238
+
239
+ let prettyCode = rawCode;
240
+ try {
241
+ if (ext === '.json') {
242
+ prettyCode = JSON.stringify(JSON.parse(rawCode), null, 2);
243
+ } else if (ext === '.sql') {
244
+ const { format: formatSql } = await import('sql-formatter');
245
+ prettyCode = formatSql(rawCode, { language: 'sql' });
246
+ } else if (ext === '.css') {
247
+ // Basic CSS pretty-print: newlines after { } ; and indent
248
+ prettyCode = rawCode
249
+ .replace(/\{/g, ' {\n ')
250
+ .replace(/;/g, ';\n ')
251
+ .replace(/\}/g, '\n}\n')
252
+ .replace(/\n\s*\n/g, '\n')
253
+ .trim();
254
+ } else if (ext === '.html' || ext === '.xml') {
255
+ // Basic XML/HTML indent
256
+ let indent = 0;
257
+ prettyCode = rawCode
258
+ .replace(/>\s*</g, '>\n<')
259
+ .split('\n')
260
+ .map((line) => {
261
+ const trimmed = line.trim();
262
+ if (trimmed.startsWith('</')) indent = Math.max(0, indent - 1);
263
+ const padded = ' '.repeat(indent) + trimmed;
264
+ if (
265
+ trimmed.startsWith('<') &&
266
+ !trimmed.startsWith('</') &&
267
+ !trimmed.endsWith('/>') &&
268
+ !trimmed.startsWith('<!')
269
+ )
270
+ indent++;
271
+ return padded;
272
+ })
273
+ .join('\n');
274
+ }
275
+ } catch {
276
+ // If formatting fails, keep the original
277
+ return;
278
+ }
279
+
280
+ html = await highlightCode(prettyCode, lang);
281
+ formatted = true;
282
+ }
283
+
284
+ function setViewMode(mode: 'code' | 'render' | 'stac-browser' | 'kepler' | 'maputnik' | 'marimo') {
285
+ viewMode = viewMode === mode ? (isHtml ? 'render' : 'code') : mode;
286
+ updateUrlView(viewMode === 'render' ? '' : viewMode);
287
+ }
288
+
289
+ async function copyCode() {
290
+ try {
291
+ await navigator.clipboard.writeText(rawCode);
292
+ copied = true;
293
+ setTimeout(() => (copied = false), 2000);
294
+ } catch {
295
+ // clipboard not available
296
+ }
297
+ }
298
+ </script>
299
+
300
+ <div class="flex h-full flex-col">
301
+ <div
302
+ class="flex items-center gap-1 border-b border-zinc-200 px-2 py-1.5 sm:gap-2 sm:px-4 dark:border-zinc-800"
303
+ >
304
+ <span class="truncate max-w-[120px] text-sm font-medium text-zinc-700 sm:max-w-none dark:text-zinc-300">{tab.name}</span>
305
+ <Badge variant="secondary">{language}</Badge>
306
+
307
+ <div class="ms-auto flex items-center gap-1 sm:gap-2">
308
+ {#if jsonKind === 'maplibre-style'}
309
+ <Badge variant="outline" class="hidden border-blue-200 text-blue-600 sm:inline-flex dark:border-blue-800 dark:text-blue-300">
310
+ {t('code.maplibreStyle')}
311
+ </Badge>
312
+ <Button
313
+ variant={viewMode === 'maputnik' ? 'default' : 'outline'}
314
+ size="sm"
315
+ class="h-7 gap-1 px-2 text-xs {viewMode !== 'maputnik' ? 'border-blue-300 text-blue-600 hover:bg-blue-50 hover:text-blue-700 dark:border-blue-700 dark:text-blue-400 dark:hover:bg-blue-950' : ''}"
316
+ onclick={() => setViewMode('maputnik')}
317
+ >
318
+ {viewMode === 'maputnik' ? t('code.code') : t('code.editStyle')}
319
+ </Button>
320
+ {:else if jsonKind === 'tilejson'}
321
+ <Badge variant="outline" class="hidden border-teal-200 text-teal-600 sm:inline-flex dark:border-teal-800 dark:text-teal-300">
322
+ {t('code.tileJson')}
323
+ </Badge>
324
+ {:else if isStacJson && jsonKind}
325
+ <Badge variant="outline" class="hidden border-emerald-200 text-emerald-600 sm:inline-flex dark:border-emerald-800 dark:text-emerald-300">
326
+ {t(stacBadgeKey[jsonKind] ?? 'code.stacItem')}
327
+ </Badge>
328
+ <Button
329
+ variant={viewMode === 'stac-browser' ? 'default' : 'outline'}
330
+ size="sm"
331
+ class="h-7 gap-1 px-2 text-xs {viewMode !== 'stac-browser' ? 'border-blue-300 text-blue-600 hover:bg-blue-50 hover:text-blue-700 dark:border-blue-700 dark:text-blue-400 dark:hover:bg-blue-950' : ''}"
332
+ onclick={() => setViewMode('stac-browser')}
333
+ >
334
+ {viewMode === 'stac-browser' ? t('code.code') : t('code.browseStac')}
335
+ </Button>
336
+ {:else if jsonKind === 'kepler'}
337
+ <Badge variant="outline" class="hidden border-violet-200 text-violet-600 sm:inline-flex dark:border-violet-800 dark:text-violet-300">
338
+ {t('code.keplerGl')}
339
+ </Badge>
340
+ <Button
341
+ variant={viewMode === 'kepler' ? 'default' : 'outline'}
342
+ size="sm"
343
+ class="h-7 gap-1 px-2 text-xs {viewMode !== 'kepler' ? 'border-blue-300 text-blue-600 hover:bg-blue-50 hover:text-blue-700 dark:border-blue-700 dark:text-blue-400 dark:hover:bg-blue-950' : ''}"
344
+ onclick={() => setViewMode('kepler')}
345
+ >
346
+ {viewMode === 'kepler' ? t('code.code') : t('code.openKepler')}
347
+ </Button>
348
+ {/if}
349
+
350
+ {#if isMarimo}
351
+ <Badge variant="outline" class="hidden border-green-200 text-green-600 sm:inline-flex dark:border-green-800 dark:text-green-300">
352
+ {t('code.marimoNotebook')}
353
+ </Badge>
354
+ <Button
355
+ variant={viewMode === 'marimo' ? 'default' : 'outline'}
356
+ size="sm"
357
+ class="h-7 gap-1 px-2 text-xs {viewMode !== 'marimo' ? 'border-green-300 text-green-600 hover:bg-green-50 hover:text-green-700 dark:border-green-700 dark:text-green-400 dark:hover:bg-green-950' : ''}"
358
+ onclick={() => setViewMode('marimo')}
359
+ >
360
+ {viewMode === 'marimo' ? t('code.code') : t('code.openPlayground')}
361
+ </Button>
362
+ {/if}
363
+
364
+ {#if isHtml}
365
+ <Button
366
+ variant={viewMode === 'code' ? 'default' : 'outline'}
367
+ size="sm"
368
+ class="h-7 gap-1 px-2 text-xs"
369
+ onclick={() => setViewMode('code')}
370
+ >
371
+ {viewMode === 'code' ? t('code.preview') : t('code.viewSource')}
372
+ </Button>
373
+ {/if}
374
+
375
+ <!-- Desktop controls -->
376
+ <div class="hidden items-center gap-1 sm:flex">
377
+ {#if canFormat}
378
+ <Button variant="ghost" size="sm" class="h-7 px-2 text-xs" onclick={toggleFormat}>
379
+ {formatted ? t('code.raw') : t('code.format')}
380
+ </Button>
381
+ {/if}
382
+ <Button variant="ghost" size="sm" class="h-7 px-2 text-xs" onclick={() => (wordWrap = !wordWrap)}>
383
+ {wordWrap ? t('code.noWrap') : t('code.wrap')}
384
+ </Button>
385
+ <Button variant="ghost" size="sm" class="h-7 px-2 text-xs" onclick={copyCode}>
386
+ {copied ? t('code.copied') : t('code.copy')}
387
+ </Button>
388
+ </div>
389
+
390
+ <!-- Mobile overflow menu -->
391
+ <div class="flex sm:hidden">
392
+ <DropdownMenu.Root>
393
+ <DropdownMenu.Trigger class="rounded p-1 text-zinc-400 hover:bg-zinc-100 dark:hover:bg-zinc-800">
394
+ <EllipsisVerticalIcon class="size-4" />
395
+ </DropdownMenu.Trigger>
396
+ <DropdownMenu.Content align="end" class="w-44">
397
+ {#if jsonKind === 'maplibre-style'}
398
+ <DropdownMenu.Item disabled>
399
+ {t('code.maplibreStyle')}
400
+ </DropdownMenu.Item>
401
+ <DropdownMenu.Item onclick={() => setViewMode('maputnik')}>
402
+ {viewMode === 'maputnik' ? t('code.code') : t('code.editStyle')}
403
+ </DropdownMenu.Item>
404
+ {:else if jsonKind === 'tilejson'}
405
+ <DropdownMenu.Item disabled>
406
+ {t('code.tileJson')}
407
+ </DropdownMenu.Item>
408
+ {:else if isStacJson && jsonKind}
409
+ <DropdownMenu.Item disabled>
410
+ {t(stacBadgeKey[jsonKind] ?? 'code.stacItem')}
411
+ </DropdownMenu.Item>
412
+ <DropdownMenu.Item onclick={() => setViewMode('stac-browser')}>
413
+ {viewMode === 'stac-browser' ? t('code.code') : t('code.browseStac')}
414
+ </DropdownMenu.Item>
415
+ {:else if jsonKind === 'kepler'}
416
+ <DropdownMenu.Item disabled>
417
+ {t('code.keplerGl')}
418
+ </DropdownMenu.Item>
419
+ <DropdownMenu.Item onclick={() => setViewMode('kepler')}>
420
+ {viewMode === 'kepler' ? t('code.code') : t('code.openKepler')}
421
+ </DropdownMenu.Item>
422
+ {/if}
423
+ {#if isMarimo}
424
+ <DropdownMenu.Item disabled>
425
+ {t('code.marimoNotebook')}
426
+ </DropdownMenu.Item>
427
+ <DropdownMenu.Item onclick={() => setViewMode('marimo')}>
428
+ {viewMode === 'marimo' ? t('code.code') : t('code.openPlayground')}
429
+ </DropdownMenu.Item>
430
+ {/if}
431
+ {#if isHtml}
432
+ <DropdownMenu.Item onclick={() => setViewMode('code')}>
433
+ {viewMode === 'code' ? t('code.preview') : t('code.viewSource')}
434
+ </DropdownMenu.Item>
435
+ {/if}
436
+ {#if canFormat}
437
+ <DropdownMenu.Item onclick={toggleFormat}>
438
+ {formatted ? t('code.raw') : t('code.format')}
439
+ </DropdownMenu.Item>
440
+ {/if}
441
+ <DropdownMenu.Item onclick={() => (wordWrap = !wordWrap)}>
442
+ {wordWrap ? t('code.noWrap') : t('code.wrap')}
443
+ </DropdownMenu.Item>
444
+ <DropdownMenu.Item onclick={copyCode}>
445
+ {copied ? t('code.copied') : t('code.copy')}
446
+ </DropdownMenu.Item>
447
+ </DropdownMenu.Content>
448
+ </DropdownMenu.Root>
449
+ </div>
450
+ </div>
451
+ </div>
452
+
453
+ {#if viewMode === 'stac-browser'}
454
+ <div class="flex-1 overflow-hidden">
455
+ <iframe
456
+ src={stacBrowserSrc}
457
+ class="h-full w-full border-0"
458
+ title="STAC Browser"
459
+ allow="fullscreen"
460
+ ></iframe>
461
+ </div>
462
+ {:else if viewMode === 'kepler'}
463
+ <div class="flex-1 overflow-hidden">
464
+ <iframe
465
+ src={keplerSrc}
466
+ class="h-full w-full border-0"
467
+ title="Kepler.gl"
468
+ allow="fullscreen"
469
+ ></iframe>
470
+ </div>
471
+ {:else if viewMode === 'maputnik'}
472
+ <div class="flex-1 overflow-hidden">
473
+ <iframe
474
+ src={maputnikSrc}
475
+ class="h-full w-full border-0"
476
+ title="Maputnik Style Editor"
477
+ allow="clipboard-read; clipboard-write; fullscreen"
478
+ ></iframe>
479
+ </div>
480
+ {:else if viewMode === 'render' && htmlBlobUrl}
481
+ <div class="flex-1 overflow-hidden">
482
+ <iframe
483
+ src={htmlBlobUrl}
484
+ class="h-full w-full border-0"
485
+ title={tab.name}
486
+ sandbox="allow-scripts allow-same-origin allow-popups allow-forms"
487
+ ></iframe>
488
+ </div>
489
+ {:else if viewMode === 'marimo' && marimoSrc}
490
+ <div class="flex-1 overflow-hidden">
491
+ <iframe
492
+ src={marimoSrc}
493
+ class="h-full w-full border-0"
494
+ title="marimo Playground"
495
+ sandbox="allow-scripts allow-same-origin allow-downloads allow-popups"
496
+ allow="fullscreen"
497
+ ></iframe>
498
+ </div>
499
+ {:else}
500
+ <div
501
+ dir="ltr"
502
+ class="code-viewer flex-1 overflow-auto"
503
+ class:word-wrap={wordWrap}
504
+ >
505
+ {#if loading}
506
+ <div class="flex h-full items-center justify-center">
507
+ <p class="text-sm text-zinc-400">{t('code.loading')}</p>
508
+ </div>
509
+ {:else if error}
510
+ <div class="flex h-full items-center justify-center">
511
+ <p class="text-sm text-red-400">{error}</p>
512
+ </div>
513
+ {:else}
514
+ {@html html}
515
+ {/if}
516
+ </div>
517
+ {/if}
518
+ </div>
519
+
520
+ <style>
521
+ .code-viewer :global(pre) {
522
+ margin: 0;
523
+ padding: 1rem;
524
+ min-height: 100%;
525
+ font-size: 0.8125rem;
526
+ line-height: 1.6;
527
+ }
528
+
529
+ .code-viewer :global(code) {
530
+ counter-reset: line;
531
+ }
532
+
533
+ .code-viewer :global(code .line) {
534
+ display: inline-block;
535
+ width: 100%;
536
+ }
537
+
538
+ .code-viewer :global(code .line::before) {
539
+ counter-increment: line;
540
+ content: counter(line);
541
+ display: inline-block;
542
+ width: 3rem;
543
+ margin-inline-end: 1rem;
544
+ text-align: right;
545
+ color: var(--muted-foreground);
546
+ user-select: none;
547
+ }
548
+
549
+ .code-viewer.word-wrap :global(pre) {
550
+ white-space: pre-wrap;
551
+ word-break: break-all;
552
+ }
553
+ </style>
@@ -0,0 +1,7 @@
1
+ import type { Tab } from '../../types';
2
+ type $$ComponentProps = {
3
+ tab: Tab;
4
+ };
5
+ declare const CodeViewer: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ type CodeViewer = ReturnType<typeof CodeViewer>;
7
+ export default CodeViewer;