@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,7 @@
1
+ import type { Tab } from '../../types';
2
+ type $$ComponentProps = {
3
+ tab: Tab;
4
+ };
5
+ declare const MarkdownViewer: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ type MarkdownViewer = ReturnType<typeof MarkdownViewer>;
7
+ export default MarkdownViewer;
@@ -0,0 +1,121 @@
1
+ <script lang="ts">
2
+ import { onDestroy } from 'svelte';
3
+ import { getAdapter } from '../../storage/index.js';
4
+ import { tabResources } from '../../stores/tab-resources.svelte.js';
5
+ import type { Tab } from '../../types';
6
+ import { buildHttpsUrl, canStreamDirectly } from '../../utils/url.js';
7
+
8
+ let { tab }: { tab: Tab } = $props();
9
+
10
+ const videoExtensions = new Set(['mp4', 'webm', 'mov', 'avi', 'mkv']);
11
+ const mediaType = $derived(videoExtensions.has(tab.extension.toLowerCase()) ? 'video' : 'audio');
12
+
13
+ const mimeMap: Record<string, string> = {
14
+ mp4: 'video/mp4',
15
+ webm: 'video/webm',
16
+ mov: 'video/quicktime',
17
+ avi: 'video/x-msvideo',
18
+ mkv: 'video/x-matroska',
19
+ mp3: 'audio/mpeg',
20
+ wav: 'audio/wav',
21
+ ogg: 'audio/ogg',
22
+ flac: 'audio/flac',
23
+ aac: 'audio/aac'
24
+ };
25
+
26
+ let abortController: AbortController | null = null;
27
+ let mediaSrc = $state<string | null>(null);
28
+ let blobUrl = $state<string | null>(null);
29
+ let loading = $state(true);
30
+ let error = $state<string | null>(null);
31
+
32
+ $effect(() => {
33
+ if (!tab) return;
34
+ loadMedia();
35
+ });
36
+
37
+ async function loadMedia() {
38
+ loading = true;
39
+ error = null;
40
+ cleanup();
41
+ abortController = new AbortController();
42
+ const { signal } = abortController;
43
+
44
+ try {
45
+ if (canStreamDirectly(tab)) {
46
+ // Direct URL — browser handles HTTP range-request streaming natively.
47
+ // No CORS needed for <video>/<audio> src. Enables seeking without
48
+ // downloading the full file (S3/Azure/GCS all support range requests).
49
+ mediaSrc = buildHttpsUrl(tab);
50
+ } else {
51
+ // Authenticated S3 — download via storage adapter (blob fallback)
52
+ const adapter = getAdapter(tab.source, tab.connectionId);
53
+ const data = await adapter.read(tab.path, undefined, undefined, signal);
54
+ const mime = mimeMap[tab.extension.toLowerCase()] || 'application/octet-stream';
55
+ const blob = new Blob([data as unknown as BlobPart], { type: mime });
56
+ blobUrl = URL.createObjectURL(blob);
57
+ mediaSrc = blobUrl;
58
+ }
59
+ } catch (err) {
60
+ if (err instanceof DOMException && err.name === 'AbortError') return;
61
+ error = err instanceof Error ? err.message : String(err);
62
+ } finally {
63
+ loading = false;
64
+ }
65
+ }
66
+
67
+ function cleanup() {
68
+ abortController?.abort();
69
+ abortController = null;
70
+ if (blobUrl) {
71
+ URL.revokeObjectURL(blobUrl);
72
+ blobUrl = null;
73
+ }
74
+ mediaSrc = null;
75
+ }
76
+
77
+ $effect(() => {
78
+ const id = tab.id;
79
+ const unregister = tabResources.register(id, cleanup);
80
+ return unregister;
81
+ });
82
+ onDestroy(cleanup);
83
+ </script>
84
+
85
+ <div class="flex h-full flex-col">
86
+ <div class="flex items-center gap-2 border-b border-zinc-200 px-4 py-2 dark:border-zinc-800">
87
+ <span class="text-sm font-medium text-zinc-700 dark:text-zinc-300">{tab.name}</span>
88
+ <span
89
+ class="rounded bg-zinc-100 px-1.5 py-0.5 text-xs text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400"
90
+ >
91
+ {mediaType}
92
+ </span>
93
+ </div>
94
+
95
+ <div class="flex flex-1 items-center justify-center bg-zinc-950 p-4">
96
+ {#if loading}
97
+ <p class="text-sm text-zinc-400">Loading {mediaType}...</p>
98
+ {:else if error}
99
+ <div class="rounded-lg border border-red-300 bg-red-50 px-6 py-4 text-center dark:border-red-800 dark:bg-red-950">
100
+ <p class="text-sm text-red-600 dark:text-red-400">{error}</p>
101
+ </div>
102
+ {:else if mediaSrc}
103
+ {#if mediaType === 'video'}
104
+ <video
105
+ src={mediaSrc}
106
+ controls
107
+ preload="metadata"
108
+ class="max-h-full max-w-full rounded"
109
+ >
110
+ <track kind="captions" />
111
+ </video>
112
+ {:else}
113
+ <div class="w-full max-w-md">
114
+ <audio src={mediaSrc} controls preload="metadata" class="w-full">
115
+ <track kind="captions" />
116
+ </audio>
117
+ </div>
118
+ {/if}
119
+ {/if}
120
+ </div>
121
+ </div>
@@ -0,0 +1,7 @@
1
+ import type { Tab } from '../../types';
2
+ type $$ComponentProps = {
3
+ tab: Tab;
4
+ };
5
+ declare const MediaViewer: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ type MediaViewer = ReturnType<typeof MediaViewer>;
7
+ export default MediaViewer;
@@ -0,0 +1,164 @@
1
+ <script lang="ts">
2
+ import EllipsisVerticalIcon from '@lucide/svelte/icons/ellipsis-vertical';
3
+ import MaximizeIcon from '@lucide/svelte/icons/maximize';
4
+ import RotateCcwIcon from '@lucide/svelte/icons/rotate-ccw';
5
+ import { onDestroy } from 'svelte';
6
+ import { Badge } from '../ui/badge/index.js';
7
+ import { Button } from '../ui/button/index.js';
8
+ import * as DropdownMenu from '../ui/dropdown-menu/index.js';
9
+ import { Separator } from '../ui/separator/index.js';
10
+ import { t } from '../../i18n/index.svelte.js';
11
+ import { getAdapter } from '../../storage/index.js';
12
+ import { tabResources } from '../../stores/tab-resources.svelte.js';
13
+ import type { Tab } from '../../types';
14
+ import {
15
+ createModelScene,
16
+ disposeModelScene,
17
+ loadModel,
18
+ type ModelScene
19
+ } from '../../utils/model3d';
20
+
21
+ let { tab }: { tab: Tab } = $props();
22
+
23
+ let abortController: AbortController | null = null;
24
+ let canvasEl: HTMLCanvasElement | undefined = $state();
25
+ let modelScene: ModelScene | null = null;
26
+ let loading = $state(true);
27
+ let error = $state<string | null>(null);
28
+ let meshCount = $state(0);
29
+ let vertexCount = $state(0);
30
+ let wireframe = $state(false);
31
+
32
+ $effect(() => {
33
+ if (canvasEl) loadModelFile();
34
+ });
35
+
36
+ async function loadModelFile() {
37
+ abortController?.abort();
38
+ abortController = new AbortController();
39
+ const { signal } = abortController;
40
+
41
+ loading = true;
42
+ error = null;
43
+
44
+ try {
45
+ if (!canvasEl) return;
46
+
47
+ modelScene = createModelScene(canvasEl);
48
+
49
+ const adapter = getAdapter(tab.source, tab.connectionId);
50
+ const data = await adapter.read(tab.path, undefined, undefined, signal);
51
+ const info = await loadModel(modelScene.scene, modelScene.camera, data, tab.extension);
52
+ meshCount = info.meshCount;
53
+ vertexCount = info.vertexCount;
54
+ } catch (err) {
55
+ if (err instanceof DOMException && err.name === 'AbortError') return;
56
+ error = err instanceof Error ? err.message : String(err);
57
+ } finally {
58
+ loading = false;
59
+ }
60
+ }
61
+
62
+ function toggleWireframe() {
63
+ wireframe = !wireframe;
64
+ if (modelScene) {
65
+ for (const mesh of modelScene.scene.meshes) {
66
+ if (mesh.material) {
67
+ mesh.material.wireframe = wireframe;
68
+ }
69
+ }
70
+ }
71
+ }
72
+
73
+ function resetCamera() {
74
+ if (modelScene) {
75
+ modelScene.camera.alpha = Math.PI / 4;
76
+ modelScene.camera.beta = Math.PI / 3;
77
+ }
78
+ }
79
+
80
+ function fullscreen() {
81
+ canvasEl?.requestFullscreen?.();
82
+ }
83
+
84
+ function cleanup() {
85
+ abortController?.abort();
86
+ abortController = null;
87
+ if (modelScene) {
88
+ disposeModelScene(modelScene);
89
+ modelScene = null;
90
+ }
91
+ }
92
+
93
+ $effect(() => {
94
+ const id = tab.id;
95
+ const unregister = tabResources.register(id, cleanup);
96
+ return unregister;
97
+ });
98
+ onDestroy(cleanup);
99
+ </script>
100
+
101
+ <div class="flex h-full flex-col">
102
+ <div
103
+ 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"
104
+ >
105
+ <span class="truncate max-w-[120px] text-sm font-medium text-zinc-700 sm:max-w-none dark:text-zinc-300">{tab.name}</span>
106
+ <Badge variant="secondary">{t('model.badge')}</Badge>
107
+
108
+ {#if meshCount > 0}
109
+ <span class="hidden text-xs text-zinc-400 sm:inline">
110
+ {meshCount} {t('model.meshes')} &middot; {vertexCount.toLocaleString()} {t('model.vertices')}
111
+ </span>
112
+ {/if}
113
+
114
+ <div class="ms-auto flex items-center gap-1">
115
+ <!-- Desktop controls -->
116
+ <div class="hidden items-center gap-1 sm:flex">
117
+ <Button
118
+ variant="ghost"
119
+ size="sm"
120
+ class="h-7 px-2 text-xs {wireframe ? 'text-blue-500' : ''}"
121
+ onclick={toggleWireframe}
122
+ >
123
+ {t('model.wireframe')}
124
+ </Button>
125
+ <Button variant="ghost" size="sm" class="h-7 px-1.5" onclick={resetCamera} title={t('model.reset')}>
126
+ <RotateCcwIcon class="size-3.5" />
127
+ </Button>
128
+ <Button variant="ghost" size="sm" class="h-7 px-1.5" onclick={fullscreen} title={t('model.fullscreen')}>
129
+ <MaximizeIcon class="size-3.5" />
130
+ </Button>
131
+ </div>
132
+
133
+ <!-- Mobile overflow menu -->
134
+ <div class="flex sm:hidden">
135
+ <DropdownMenu.Root>
136
+ <DropdownMenu.Trigger class="rounded p-1 text-zinc-400 hover:bg-zinc-100 dark:hover:bg-zinc-800">
137
+ <EllipsisVerticalIcon class="size-4" />
138
+ </DropdownMenu.Trigger>
139
+ <DropdownMenu.Content align="end" class="w-40">
140
+ <DropdownMenu.Item onclick={toggleWireframe}>
141
+ {t('model.wireframe')} {wireframe ? '✓' : ''}
142
+ </DropdownMenu.Item>
143
+ <DropdownMenu.Item onclick={resetCamera}>{t('model.reset')}</DropdownMenu.Item>
144
+ <DropdownMenu.Item onclick={fullscreen}>{t('model.fullscreen')}</DropdownMenu.Item>
145
+ </DropdownMenu.Content>
146
+ </DropdownMenu.Root>
147
+ </div>
148
+ </div>
149
+ </div>
150
+
151
+ <div class="relative flex-1 overflow-hidden">
152
+ {#if loading}
153
+ <div class="absolute inset-0 z-10 flex items-center justify-center bg-zinc-900/80">
154
+ <p class="text-sm text-zinc-400">{t('model.loading')}</p>
155
+ </div>
156
+ {/if}
157
+ {#if error}
158
+ <div class="absolute inset-0 z-10 flex items-center justify-center bg-zinc-900/80">
159
+ <p class="text-sm text-red-400">{error}</p>
160
+ </div>
161
+ {/if}
162
+ <canvas bind:this={canvasEl} class="h-full w-full"></canvas>
163
+ </div>
164
+ </div>
@@ -0,0 +1,7 @@
1
+ import type { Tab } from '../../types';
2
+ type $$ComponentProps = {
3
+ tab: Tab;
4
+ };
5
+ declare const ModelViewer: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ type ModelViewer = ReturnType<typeof ModelViewer>;
7
+ export default ModelViewer;
@@ -0,0 +1,389 @@
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 { highlightCode } from '../../utils/shiki';
12
+
13
+ let { tab }: { tab: Tab } = $props();
14
+
15
+ let abortController: AbortController | null = null;
16
+ let container = $state<HTMLDivElement | null>(null);
17
+ let loading = $state(true);
18
+ let error = $state<string | null>(null);
19
+ let cellCount = $state(0);
20
+ let kernelName = $state('');
21
+ let showCode = $state(true);
22
+ let copied = $state(false);
23
+ let rawContent = $state('');
24
+
25
+ $effect(() => {
26
+ if (!tab) return;
27
+ loadNotebook();
28
+ });
29
+
30
+ function cleanup() {
31
+ abortController?.abort();
32
+ abortController = null;
33
+ rawContent = '';
34
+ if (container) {
35
+ container.innerHTML = '';
36
+ }
37
+ }
38
+
39
+ $effect(() => {
40
+ if (!tab) return;
41
+ const unregister = tabResources.register(tab.id, cleanup);
42
+ return unregister;
43
+ });
44
+
45
+ onDestroy(cleanup);
46
+
47
+ async function loadNotebook() {
48
+ abortController?.abort();
49
+ abortController = new AbortController();
50
+ const { signal } = abortController;
51
+
52
+ loading = true;
53
+ error = null;
54
+
55
+ try {
56
+ const adapter = getAdapter(tab.source, tab.connectionId);
57
+ const data = await adapter.read(tab.path, undefined, undefined, signal);
58
+ rawContent = new TextDecoder().decode(data);
59
+ const notebook = JSON.parse(rawContent);
60
+
61
+ if (typeof notebook.nbformat !== 'number' || !Array.isArray(notebook.cells)) {
62
+ throw new Error('Not a valid Jupyter notebook');
63
+ }
64
+
65
+ cellCount = notebook.cells.length;
66
+ kernelName =
67
+ notebook.metadata?.kernelspec?.display_name ?? notebook.metadata?.language_info?.name ?? '';
68
+
69
+ await renderNotebook(notebook);
70
+ } catch (err) {
71
+ if (err instanceof DOMException && err.name === 'AbortError') return;
72
+ error = err instanceof Error ? err.message : String(err);
73
+ } finally {
74
+ loading = false;
75
+ }
76
+ }
77
+
78
+ async function renderNotebook(notebook: any) {
79
+ if (!container) return;
80
+
81
+ const [nb, { marked }, { AnsiUp }] = await Promise.all([
82
+ import('notebookjs').then((m) => m.default || m),
83
+ import('marked'),
84
+ import('ansi_up')
85
+ ]);
86
+
87
+ // Configure notebookjs
88
+ nb.markdown = (md: string) => marked.parse(md, { async: false }) as string;
89
+ const ansiUp = new AnsiUp();
90
+ nb.ansi = (text: string) => ansiUp.ansi_to_html(text);
91
+ nb.highlighter = (code: string, lang: string) => {
92
+ // Return escaped code — Shiki highlighting is async so we apply it after render
93
+ return code.replace(/</g, '&lt;').replace(/>/g, '&gt;');
94
+ };
95
+
96
+ const parsed = nb.parse(notebook);
97
+ const rendered: HTMLElement = parsed.render();
98
+
99
+ container.innerHTML = '';
100
+ container.appendChild(rendered);
101
+
102
+ // Apply Shiki syntax highlighting to code cells asynchronously
103
+ const codeBlocks = container.querySelectorAll('.nb-input pre');
104
+ for (const block of codeBlocks) {
105
+ const code = block.textContent ?? '';
106
+ const lang =
107
+ notebook.metadata?.kernelspec?.language ?? notebook.metadata?.language_info?.name ?? 'python';
108
+ try {
109
+ const html = await highlightCode(code, lang);
110
+ block.outerHTML = html;
111
+ } catch {
112
+ // Shiki doesn't support this language — keep the escaped HTML
113
+ }
114
+ }
115
+ }
116
+
117
+ function toggleCode() {
118
+ showCode = !showCode;
119
+ if (container) {
120
+ const inputs = container.querySelectorAll('.nb-input');
121
+ for (const el of inputs) {
122
+ (el as HTMLElement).style.display = showCode ? '' : 'none';
123
+ }
124
+ }
125
+ }
126
+
127
+ async function copyRaw() {
128
+ try {
129
+ await navigator.clipboard.writeText(rawContent);
130
+ copied = true;
131
+ setTimeout(() => (copied = false), 2000);
132
+ } catch {
133
+ // clipboard not available
134
+ }
135
+ }
136
+ </script>
137
+
138
+ <div class="flex h-full flex-col">
139
+ <div
140
+ 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"
141
+ >
142
+ <span class="truncate max-w-[120px] text-sm font-medium text-zinc-700 sm:max-w-none dark:text-zinc-300">{tab.name}</span>
143
+ <Badge variant="secondary">{t('notebook.badge')}</Badge>
144
+ {#if kernelName}
145
+ <Badge variant="outline" class="hidden border-orange-200 text-orange-600 sm:inline-flex dark:border-orange-800 dark:text-orange-300">
146
+ {kernelName}
147
+ </Badge>
148
+ {/if}
149
+ {#if cellCount > 0}
150
+ <span class="hidden text-xs text-muted-foreground sm:inline">
151
+ {cellCount} {t('notebook.cells')}
152
+ </span>
153
+ {/if}
154
+
155
+ <div class="ms-auto flex items-center gap-1 sm:gap-2">
156
+ <!-- Desktop controls -->
157
+ <div class="hidden items-center gap-1 sm:flex">
158
+ <Button variant="ghost" size="sm" class="h-7 px-2 text-xs" onclick={toggleCode}>
159
+ {showCode ? t('notebook.hideCode') : t('notebook.showCode')}
160
+ </Button>
161
+ <Button variant="ghost" size="sm" class="h-7 px-2 text-xs" onclick={copyRaw}>
162
+ {copied ? t('code.copied') : t('code.copy')}
163
+ </Button>
164
+ </div>
165
+
166
+ <!-- Mobile overflow menu -->
167
+ <div class="flex sm:hidden">
168
+ <DropdownMenu.Root>
169
+ <DropdownMenu.Trigger class="rounded p-1 text-zinc-400 hover:bg-zinc-100 dark:hover:bg-zinc-800">
170
+ <EllipsisVerticalIcon class="size-4" />
171
+ </DropdownMenu.Trigger>
172
+ <DropdownMenu.Content align="end" class="w-44">
173
+ <DropdownMenu.Item onclick={toggleCode}>
174
+ {showCode ? t('notebook.hideCode') : t('notebook.showCode')}
175
+ </DropdownMenu.Item>
176
+ <DropdownMenu.Item onclick={copyRaw}>
177
+ {copied ? t('code.copied') : t('code.copy')}
178
+ </DropdownMenu.Item>
179
+ </DropdownMenu.Content>
180
+ </DropdownMenu.Root>
181
+ </div>
182
+ </div>
183
+ </div>
184
+
185
+ <div class="notebook-viewer flex-1 overflow-auto" dir="ltr">
186
+ {#if loading}
187
+ <div class="flex h-full items-center justify-center">
188
+ <p class="text-sm text-zinc-400">{t('notebook.loading')}</p>
189
+ </div>
190
+ {:else if error}
191
+ <div class="flex h-full items-center justify-center">
192
+ <p class="text-sm text-red-400">{error}</p>
193
+ </div>
194
+ {:else}
195
+ <div bind:this={container} class="notebook-content"></div>
196
+ {/if}
197
+ </div>
198
+ </div>
199
+
200
+ <style>
201
+ .notebook-content {
202
+ padding: 1rem;
203
+ max-width: 960px;
204
+ margin: 0 auto;
205
+ }
206
+
207
+ /* notebookjs cell styles — inherit app font (Cairo for Arabic, system sans for others) */
208
+ .notebook-content :global(.nb-notebook) {
209
+ font-family: inherit;
210
+ }
211
+
212
+ .notebook-content :global(.nb-cell) {
213
+ margin-bottom: 1rem;
214
+ }
215
+
216
+ /* Code input cells */
217
+ .notebook-content :global(.nb-input) {
218
+ border: 1px solid var(--border);
219
+ border-radius: 0.375rem;
220
+ overflow: hidden;
221
+ margin-bottom: 0.5rem;
222
+ }
223
+
224
+ .notebook-content :global(.nb-input pre) {
225
+ margin: 0;
226
+ padding: 0.75rem 1rem;
227
+ font-size: 0.8125rem;
228
+ line-height: 1.6;
229
+ overflow-x: auto;
230
+ background: var(--muted);
231
+ }
232
+
233
+ /* Shiki-rendered code blocks replace the notebookjs pre */
234
+ .notebook-content :global(.nb-input .shiki) {
235
+ margin: 0;
236
+ border-radius: 0;
237
+ }
238
+
239
+ .notebook-content :global(.nb-input .shiki pre) {
240
+ border: none;
241
+ }
242
+
243
+ /* Execution count */
244
+ .notebook-content :global(.nb-input::before) {
245
+ display: none;
246
+ }
247
+
248
+ /* Output cells */
249
+ .notebook-content :global(.nb-output) {
250
+ padding: 0.5rem 1rem;
251
+ border-left: 3px solid var(--border);
252
+ margin-bottom: 0.25rem;
253
+ overflow-x: auto;
254
+ }
255
+
256
+ .notebook-content :global(.nb-output pre) {
257
+ margin: 0;
258
+ font-size: 0.8125rem;
259
+ line-height: 1.5;
260
+ white-space: pre-wrap;
261
+ word-break: break-word;
262
+ }
263
+
264
+ /* Markdown cells */
265
+ .notebook-content :global(.nb-markdown-cell) {
266
+ padding: 0.5rem 0;
267
+ font-size: 0.9375rem;
268
+ line-height: 1.7;
269
+ }
270
+
271
+ .notebook-content :global(.nb-markdown-cell h1) {
272
+ font-size: 1.75rem;
273
+ font-weight: 700;
274
+ margin: 1rem 0 0.5rem;
275
+ border-bottom: 1px solid var(--border);
276
+ padding-bottom: 0.25rem;
277
+ }
278
+
279
+ .notebook-content :global(.nb-markdown-cell h2) {
280
+ font-size: 1.375rem;
281
+ font-weight: 600;
282
+ margin: 0.75rem 0 0.375rem;
283
+ }
284
+
285
+ .notebook-content :global(.nb-markdown-cell h3) {
286
+ font-size: 1.125rem;
287
+ font-weight: 600;
288
+ margin: 0.5rem 0 0.25rem;
289
+ }
290
+
291
+ .notebook-content :global(.nb-markdown-cell p) {
292
+ margin: 0.5rem 0;
293
+ }
294
+
295
+ .notebook-content :global(.nb-markdown-cell code) {
296
+ background: var(--muted);
297
+ padding: 0.125rem 0.375rem;
298
+ border-radius: 0.25rem;
299
+ font-size: 0.8125rem;
300
+ }
301
+
302
+ .notebook-content :global(.nb-markdown-cell pre code) {
303
+ background: none;
304
+ padding: 0;
305
+ }
306
+
307
+ .notebook-content :global(.nb-markdown-cell pre) {
308
+ background: var(--muted);
309
+ padding: 0.75rem 1rem;
310
+ border-radius: 0.375rem;
311
+ overflow-x: auto;
312
+ font-size: 0.8125rem;
313
+ }
314
+
315
+ .notebook-content :global(.nb-markdown-cell ul),
316
+ .notebook-content :global(.nb-markdown-cell ol) {
317
+ padding-left: 1.5rem;
318
+ margin: 0.5rem 0;
319
+ }
320
+
321
+ .notebook-content :global(.nb-markdown-cell li) {
322
+ margin: 0.25rem 0;
323
+ }
324
+
325
+ .notebook-content :global(.nb-markdown-cell a) {
326
+ color: var(--primary);
327
+ text-decoration: underline;
328
+ }
329
+
330
+ .notebook-content :global(.nb-markdown-cell blockquote) {
331
+ border-left: 3px solid var(--border);
332
+ padding-left: 1rem;
333
+ margin: 0.5rem 0;
334
+ color: var(--muted-foreground);
335
+ }
336
+
337
+ .notebook-content :global(.nb-markdown-cell table) {
338
+ border-collapse: collapse;
339
+ width: 100%;
340
+ margin: 0.5rem 0;
341
+ }
342
+
343
+ .notebook-content :global(.nb-markdown-cell th),
344
+ .notebook-content :global(.nb-markdown-cell td) {
345
+ border: 1px solid var(--border);
346
+ padding: 0.375rem 0.75rem;
347
+ text-align: left;
348
+ font-size: 0.875rem;
349
+ }
350
+
351
+ .notebook-content :global(.nb-markdown-cell th) {
352
+ background: var(--muted);
353
+ font-weight: 600;
354
+ }
355
+
356
+ /* Image outputs */
357
+ .notebook-content :global(.nb-output img) {
358
+ max-width: 100%;
359
+ height: auto;
360
+ }
361
+
362
+ /* HTML outputs */
363
+ .notebook-content :global(.nb-output .rendered_html) {
364
+ overflow-x: auto;
365
+ }
366
+
367
+ /* Error outputs */
368
+ .notebook-content :global(.nb-output .nb-stderr) {
369
+ color: #dc2626;
370
+ background: #fef2f2;
371
+ padding: 0.5rem;
372
+ border-radius: 0.25rem;
373
+ font-size: 0.8125rem;
374
+ }
375
+
376
+ :global(.dark) .notebook-content :global(.nb-output .nb-stderr) {
377
+ color: #fca5a5;
378
+ background: #450a0a;
379
+ }
380
+
381
+ /* Raw cell */
382
+ .notebook-content :global(.nb-raw-cell) {
383
+ padding: 0.5rem 1rem;
384
+ background: var(--muted);
385
+ border-radius: 0.375rem;
386
+ font-family: monospace;
387
+ font-size: 0.8125rem;
388
+ }
389
+ </style>
@@ -0,0 +1,7 @@
1
+ import type { Tab } from '../../types';
2
+ type $$ComponentProps = {
3
+ tab: Tab;
4
+ };
5
+ declare const NotebookViewer: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ type NotebookViewer = ReturnType<typeof NotebookViewer>;
7
+ export default NotebookViewer;