@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,98 @@
1
+ <script lang="ts">
2
+ import FolderPlusIcon from '@lucide/svelte/icons/folder-plus';
3
+ import Loader2Icon from '@lucide/svelte/icons/loader-2';
4
+ import { Button } from '../ui/button/index.js';
5
+ import { Input } from '../ui/input/index.js';
6
+ import {
7
+ Sheet,
8
+ SheetContent,
9
+ SheetDescription,
10
+ SheetFooter,
11
+ SheetHeader,
12
+ SheetTitle
13
+ } from '../ui/sheet/index.js';
14
+ import { t } from '../../i18n/index.svelte.js';
15
+ import { browser } from '../../stores/browser.svelte.js';
16
+
17
+ interface Props {
18
+ open: boolean;
19
+ }
20
+
21
+ let { open = $bindable(false) }: Props = $props();
22
+
23
+ let folderName = $state('');
24
+ let creating = $state(false);
25
+ let error = $state<string | null>(null);
26
+
27
+ const invalidChars = /[/\\*?"<>|]/;
28
+ let canCreate = $derived(folderName.trim() !== '' && !invalidChars.test(folderName));
29
+
30
+ $effect(() => {
31
+ if (open) {
32
+ folderName = '';
33
+ creating = false;
34
+ error = null;
35
+ }
36
+ });
37
+
38
+ async function handleCreate() {
39
+ if (!canCreate) return;
40
+ creating = true;
41
+ error = null;
42
+
43
+ try {
44
+ await browser.createFolder(folderName.trim());
45
+ open = false;
46
+ } catch (e) {
47
+ error = e instanceof Error ? e.message : String(e);
48
+ } finally {
49
+ creating = false;
50
+ }
51
+ }
52
+
53
+ function handleKeydown(e: KeyboardEvent) {
54
+ if (e.key === 'Enter' && canCreate) {
55
+ handleCreate();
56
+ }
57
+ }
58
+ </script>
59
+
60
+ <Sheet bind:open>
61
+ <SheetContent side="bottom" class="sm:max-w-lg sm:mx-auto sm:rounded-t-lg">
62
+ <SheetHeader>
63
+ <div class="flex items-center gap-2">
64
+ <FolderPlusIcon class="size-5 text-primary" />
65
+ <SheetTitle>{t('createFolder.title')}</SheetTitle>
66
+ </div>
67
+ <SheetDescription>
68
+ {t('createFolder.description')}
69
+ </SheetDescription>
70
+ </SheetHeader>
71
+
72
+ <div class="py-4">
73
+ <Input
74
+ placeholder={t('createFolder.placeholder')}
75
+ bind:value={folderName}
76
+ onkeydown={handleKeydown}
77
+ />
78
+ {#if error}
79
+ <p class="mt-2 text-sm text-destructive">{error}</p>
80
+ {/if}
81
+ </div>
82
+
83
+ <SheetFooter class="flex-row gap-2">
84
+ <div class="flex-1"></div>
85
+ <Button variant="ghost" size="sm" onclick={() => { open = false; }} disabled={creating}>
86
+ {t('createFolder.cancel')}
87
+ </Button>
88
+ <Button size="sm" disabled={!canCreate || creating} onclick={handleCreate}>
89
+ {#if creating}
90
+ <Loader2Icon class="me-1.5 size-4 animate-spin" />
91
+ {t('createFolder.creating')}
92
+ {:else}
93
+ {t('createFolder.create')}
94
+ {/if}
95
+ </Button>
96
+ </SheetFooter>
97
+ </SheetContent>
98
+ </Sheet>
@@ -0,0 +1,6 @@
1
+ interface Props {
2
+ open: boolean;
3
+ }
4
+ declare const CreateFolderDialog: import("svelte").Component<Props, {}, "open">;
5
+ type CreateFolderDialog = ReturnType<typeof CreateFolderDialog>;
6
+ export default CreateFolderDialog;
@@ -0,0 +1,90 @@
1
+ <script lang="ts">
2
+ import Loader2Icon from '@lucide/svelte/icons/loader-2';
3
+ import TriangleAlertIcon from '@lucide/svelte/icons/triangle-alert';
4
+ import { Button } from '../ui/button/index.js';
5
+ import {
6
+ Sheet,
7
+ SheetContent,
8
+ SheetDescription,
9
+ SheetFooter,
10
+ SheetHeader,
11
+ SheetTitle
12
+ } from '../ui/sheet/index.js';
13
+ import { t } from '../../i18n/index.svelte.js';
14
+ import { browser } from '../../stores/browser.svelte.js';
15
+ import type { FileEntry } from '../../types.js';
16
+
17
+ interface Props {
18
+ open: boolean;
19
+ entry: FileEntry | null;
20
+ }
21
+
22
+ let { open = $bindable(false), entry }: Props = $props();
23
+
24
+ let deleting = $state(false);
25
+ let error = $state<string | null>(null);
26
+
27
+ $effect(() => {
28
+ if (open) {
29
+ deleting = false;
30
+ error = null;
31
+ }
32
+ });
33
+
34
+ async function handleDelete() {
35
+ if (!entry) return;
36
+ deleting = true;
37
+ error = null;
38
+
39
+ try {
40
+ await browser.deleteEntry(entry);
41
+ open = false;
42
+ } catch (e) {
43
+ error = e instanceof Error ? e.message : String(e);
44
+ } finally {
45
+ deleting = false;
46
+ }
47
+ }
48
+ </script>
49
+
50
+ <Sheet bind:open>
51
+ <SheetContent side="bottom" class="sm:max-w-lg sm:mx-auto sm:rounded-t-lg">
52
+ <SheetHeader>
53
+ <div class="flex items-center gap-2">
54
+ <TriangleAlertIcon class="size-5 text-destructive" />
55
+ <SheetTitle>{t('deleteConfirm.title')}</SheetTitle>
56
+ </div>
57
+ <SheetDescription>
58
+ {t('deleteConfirm.description')}
59
+ </SheetDescription>
60
+ </SheetHeader>
61
+
62
+ <div class="py-4">
63
+ {#if entry}
64
+ <p class="text-sm">
65
+ Are you sure you want to delete
66
+ <span class="font-medium">{entry.name}</span>{entry.is_dir ? ' and all its contents' : ''}?
67
+ </p>
68
+ {/if}
69
+
70
+ {#if error}
71
+ <p class="mt-2 text-sm text-destructive">{error}</p>
72
+ {/if}
73
+ </div>
74
+
75
+ <SheetFooter class="flex-row gap-2">
76
+ <div class="flex-1"></div>
77
+ <Button variant="ghost" size="sm" onclick={() => { open = false; }} disabled={deleting}>
78
+ {t('deleteConfirm.cancel')}
79
+ </Button>
80
+ <Button variant="destructive" size="sm" disabled={deleting} onclick={handleDelete}>
81
+ {#if deleting}
82
+ <Loader2Icon class="me-1.5 size-4 animate-spin" />
83
+ {t('deleteConfirm.deleting')}
84
+ {:else}
85
+ {t('deleteConfirm.delete')}
86
+ {/if}
87
+ </Button>
88
+ </SheetFooter>
89
+ </SheetContent>
90
+ </Sheet>
@@ -0,0 +1,8 @@
1
+ import type { FileEntry } from '../../types.js';
2
+ interface Props {
3
+ open: boolean;
4
+ entry: FileEntry | null;
5
+ }
6
+ declare const DeleteConfirmDialog: import("svelte").Component<Props, {}, "open">;
7
+ type DeleteConfirmDialog = ReturnType<typeof DeleteConfirmDialog>;
8
+ export default DeleteConfirmDialog;
@@ -0,0 +1,83 @@
1
+ <script lang="ts">
2
+ import UploadCloudIcon from '@lucide/svelte/icons/upload-cloud';
3
+ import type { Snippet } from 'svelte';
4
+ import { t } from '../../i18n/index.svelte.js';
5
+ import { browser } from '../../stores/browser.svelte.js';
6
+ import { safeLock } from '../../stores/safelock.svelte.js';
7
+
8
+ let { children }: { children: Snippet } = $props();
9
+
10
+ let dragOver = $state(false);
11
+ let dragCounter = 0;
12
+
13
+ let active = $derived(browser.canWrite && !safeLock.locked);
14
+
15
+ function handleDragEnter(e: DragEvent) {
16
+ if (!active) return;
17
+ e.preventDefault();
18
+ dragCounter++;
19
+ dragOver = true;
20
+ }
21
+
22
+ function handleDragLeave(e: DragEvent) {
23
+ if (!active) return;
24
+ e.preventDefault();
25
+ dragCounter--;
26
+ if (dragCounter <= 0) {
27
+ dragOver = false;
28
+ dragCounter = 0;
29
+ }
30
+ }
31
+
32
+ function handleDragOver(e: DragEvent) {
33
+ if (!active) return;
34
+ e.preventDefault();
35
+ }
36
+
37
+ async function handleDrop(e: DragEvent) {
38
+ if (!active) return;
39
+ e.preventDefault();
40
+ dragOver = false;
41
+ dragCounter = 0;
42
+
43
+ const droppedFiles = e.dataTransfer?.files;
44
+ if (!droppedFiles || droppedFiles.length === 0) return;
45
+
46
+ const files: Array<{ name: string; data: Uint8Array; type?: string }> = [];
47
+
48
+ for (const file of droppedFiles) {
49
+ const buffer = await file.arrayBuffer();
50
+ files.push({
51
+ name: file.name,
52
+ data: new Uint8Array(buffer),
53
+ type: file.type || undefined
54
+ });
55
+ }
56
+
57
+ try {
58
+ await browser.uploadFiles(files);
59
+ } catch (err) {
60
+ console.error('Drop upload failed:', err);
61
+ }
62
+ }
63
+ </script>
64
+
65
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
66
+ <div
67
+ class="relative h-full"
68
+ ondragenter={handleDragEnter}
69
+ ondragleave={handleDragLeave}
70
+ ondragover={handleDragOver}
71
+ ondrop={handleDrop}
72
+ >
73
+ {@render children()}
74
+
75
+ {#if dragOver && active}
76
+ <div
77
+ class="absolute inset-0 z-50 flex flex-col items-center justify-center gap-2 rounded-md border-2 border-dashed border-primary/50 bg-primary/5 backdrop-blur-sm"
78
+ >
79
+ <UploadCloudIcon class="size-10 text-primary/70" />
80
+ <p class="text-sm font-medium text-primary/70">{t('dropZone.message')}</p>
81
+ </div>
82
+ {/if}
83
+ </div>
@@ -0,0 +1,7 @@
1
+ import type { Snippet } from 'svelte';
2
+ type $$ComponentProps = {
3
+ children: Snippet;
4
+ };
5
+ declare const DropZone: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ type DropZone = ReturnType<typeof DropZone>;
7
+ export default DropZone;
@@ -0,0 +1,229 @@
1
+ <script lang="ts">
2
+ import { ArrowDown, ArrowUp, ArrowUpDown, FolderOpen, Loader2 } from '@lucide/svelte';
3
+ import FolderPlusIcon from '@lucide/svelte/icons/folder-plus';
4
+ import { Button } from '../ui/button/index.js';
5
+ import { ScrollArea } from '../ui/scroll-area/index.js';
6
+ import { t } from '../../i18n/index.svelte.js';
7
+ import { browser } from '../../stores/browser.svelte.js';
8
+ import { safeLock } from '../../stores/safelock.svelte.js';
9
+ import type { FileEntry } from '../../types.js';
10
+ import Breadcrumb from './Breadcrumb.svelte';
11
+ import CreateFolderDialog from './CreateFolderDialog.svelte';
12
+ import DeleteConfirmDialog from './DeleteConfirmDialog.svelte';
13
+ import DropZone from './DropZone.svelte';
14
+ import FileRow from './FileRow.svelte';
15
+ import RenameDialog from './RenameDialog.svelte';
16
+ import SearchBar from './SearchBar.svelte';
17
+ import UploadButton from './UploadButton.svelte';
18
+
19
+ type SortField = 'name' | 'size' | 'modified' | 'extension';
20
+ type SortDirection = 'asc' | 'desc';
21
+
22
+ let filterQuery = $state('');
23
+ let sortField = $state<SortField>('name');
24
+ let sortDirection = $state<SortDirection>('asc');
25
+
26
+ let deleteDialogOpen = $state(false);
27
+ let deleteTarget = $state<FileEntry | null>(null);
28
+ let createFolderOpen = $state(false);
29
+ let renameDialogOpen = $state(false);
30
+ let renameTarget = $state<FileEntry | null>(null);
31
+
32
+ let showWriteActions = $derived(browser.canWrite && !safeLock.locked);
33
+
34
+ const sortedAndFilteredEntries = $derived.by(() => {
35
+ let result = [...browser.entries];
36
+
37
+ // Filter
38
+ if (filterQuery) {
39
+ const q = filterQuery.toLowerCase();
40
+ result = result.filter((entry: FileEntry) => entry.name.toLowerCase().includes(q));
41
+ }
42
+
43
+ // Sort
44
+ const dir = sortDirection === 'asc' ? 1 : -1;
45
+ result.sort((a, b) => {
46
+ // Directories always come first
47
+ if (a.is_dir && !b.is_dir) return -1;
48
+ if (!a.is_dir && b.is_dir) return 1;
49
+
50
+ switch (sortField) {
51
+ case 'name':
52
+ return dir * a.name.localeCompare(b.name, undefined, { sensitivity: 'base' });
53
+ case 'size':
54
+ return dir * (a.size - b.size);
55
+ case 'modified':
56
+ return dir * (a.modified - b.modified);
57
+ case 'extension':
58
+ return dir * a.extension.localeCompare(b.extension, undefined, { sensitivity: 'base' });
59
+ default:
60
+ return 0;
61
+ }
62
+ });
63
+
64
+ return result;
65
+ });
66
+
67
+ function handleFilter(query: string) {
68
+ filterQuery = query;
69
+ }
70
+
71
+ function handleNavigate(path: string) {
72
+ browser.navigateTo(path);
73
+ }
74
+
75
+ function handleSort(field: SortField) {
76
+ if (sortField === field) {
77
+ sortDirection = sortDirection === 'asc' ? 'desc' : 'asc';
78
+ } else {
79
+ sortField = field;
80
+ sortDirection = 'asc';
81
+ }
82
+ }
83
+
84
+ function handleDelete(entry: FileEntry) {
85
+ deleteTarget = entry;
86
+ deleteDialogOpen = true;
87
+ }
88
+
89
+ function handleRename(entry: FileEntry) {
90
+ renameTarget = entry;
91
+ renameDialogOpen = true;
92
+ }
93
+ </script>
94
+
95
+ <div class="flex h-full w-full flex-col">
96
+ <!-- Header: connection name + breadcrumb + search + actions -->
97
+ <div class="border-border flex flex-col gap-2 border-b px-3 py-2">
98
+ {#if browser.activeConnection}
99
+ <div class="flex items-center gap-2">
100
+ <span class="text-xs font-medium text-muted-foreground">
101
+ {browser.activeConnection.name}
102
+ </span>
103
+ <span class="text-muted-foreground/50 text-xs">/</span>
104
+ <span class="text-xs text-muted-foreground">
105
+ {browser.activeConnection.bucket}
106
+ </span>
107
+ </div>
108
+ {/if}
109
+ <Breadcrumb path={browser.currentPrefix} onNavigate={handleNavigate} />
110
+ <div class="flex items-center gap-2">
111
+ <div class="flex-1">
112
+ <SearchBar onFilter={handleFilter} />
113
+ </div>
114
+ {#if showWriteActions}
115
+ <UploadButton />
116
+ <Button
117
+ variant="outline"
118
+ size="sm"
119
+ class="h-7 gap-1.5 px-2 text-xs"
120
+ onclick={() => { createFolderOpen = true; }}
121
+ >
122
+ <FolderPlusIcon class="size-3.5" />
123
+ {t('fileBrowser.newFolder')}
124
+ </Button>
125
+ {/if}
126
+ </div>
127
+ </div>
128
+
129
+ <!-- Column headers -->
130
+ <div class="border-border bg-muted/30 flex items-center gap-3 border-b px-3 py-1.5 text-xs">
131
+ <div class="w-4 shrink-0"></div>
132
+ <button
133
+ class="text-muted-foreground hover:text-foreground flex min-w-0 flex-1 items-center gap-1 transition-colors"
134
+ onclick={() => handleSort('name')}
135
+ >
136
+ {t('fileBrowser.name')}
137
+ {#if sortField === 'name'}
138
+ {#if sortDirection === 'asc'}
139
+ <ArrowUp class="size-3" />
140
+ {:else}
141
+ <ArrowDown class="size-3" />
142
+ {/if}
143
+ {:else}
144
+ <ArrowUpDown class="size-3 opacity-0 group-hover:opacity-100" />
145
+ {/if}
146
+ </button>
147
+ <button
148
+ class="text-muted-foreground hover:text-foreground flex w-20 shrink-0 items-center justify-end gap-1 transition-colors"
149
+ onclick={() => handleSort('size')}
150
+ >
151
+ {#if sortField === 'size'}
152
+ {#if sortDirection === 'asc'}
153
+ <ArrowUp class="size-3" />
154
+ {:else}
155
+ <ArrowDown class="size-3" />
156
+ {/if}
157
+ {/if}
158
+ {t('fileBrowser.size')}
159
+ </button>
160
+ <button
161
+ class="text-muted-foreground hover:text-foreground flex w-24 shrink-0 items-center justify-end gap-1 transition-colors"
162
+ onclick={() => handleSort('modified')}
163
+ >
164
+ {#if sortField === 'modified'}
165
+ {#if sortDirection === 'asc'}
166
+ <ArrowUp class="size-3" />
167
+ {:else}
168
+ <ArrowDown class="size-3" />
169
+ {/if}
170
+ {/if}
171
+ {t('fileBrowser.modified')}
172
+ </button>
173
+ </div>
174
+
175
+ <!-- File list -->
176
+ <div class="relative min-h-0 flex-1">
177
+ <DropZone>
178
+ {#if browser.loading}
179
+ <div class="flex h-full items-center justify-center">
180
+ <Loader2 class="text-muted-foreground size-6 animate-spin" />
181
+ </div>
182
+ {:else if browser.error}
183
+ <div class="flex h-full items-center justify-center px-4">
184
+ <p class="text-destructive text-sm">{browser.error}</p>
185
+ </div>
186
+ {:else if sortedAndFilteredEntries.length === 0}
187
+ <div class="flex h-full flex-col items-center justify-center gap-2 px-4">
188
+ <FolderOpen class="text-muted-foreground/50 size-10" />
189
+ {#if filterQuery}
190
+ <p class="text-muted-foreground text-sm">{t('fileBrowser.noMatch', { query: filterQuery })}</p>
191
+ {:else}
192
+ <p class="text-muted-foreground text-sm">{t('fileBrowser.empty')}</p>
193
+ {/if}
194
+ </div>
195
+ {:else}
196
+ <ScrollArea class="h-full">
197
+ <div role="table" aria-label="File list">
198
+ {#each sortedAndFilteredEntries as entry (entry.path)}
199
+ <FileRow
200
+ {entry}
201
+ onDelete={handleDelete}
202
+ onRename={handleRename}
203
+ />
204
+ {/each}
205
+ </div>
206
+ </ScrollArea>
207
+ {/if}
208
+ </DropZone>
209
+ </div>
210
+
211
+ <!-- Upload progress bar -->
212
+ {#if browser.uploading}
213
+ <div class="border-border border-t px-3 py-1.5">
214
+ <div class="flex items-center gap-2 text-xs text-muted-foreground">
215
+ <div class="h-1.5 flex-1 overflow-hidden rounded-full bg-muted">
216
+ <div
217
+ class="h-full rounded-full bg-primary transition-all"
218
+ style="width: {browser.uploadProgress.total > 0 ? (browser.uploadProgress.current / browser.uploadProgress.total) * 100 : 0}%"
219
+ ></div>
220
+ </div>
221
+ <span>{browser.uploadProgress.current}/{browser.uploadProgress.total}</span>
222
+ </div>
223
+ </div>
224
+ {/if}
225
+ </div>
226
+
227
+ <DeleteConfirmDialog bind:open={deleteDialogOpen} entry={deleteTarget} />
228
+ <CreateFolderDialog bind:open={createFolderOpen} />
229
+ <RenameDialog bind:open={renameDialogOpen} entry={renameTarget} />
@@ -0,0 +1,3 @@
1
+ declare const FileBrowser: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type FileBrowser = ReturnType<typeof FileBrowser>;
3
+ export default FileBrowser;
@@ -0,0 +1,112 @@
1
+ <script lang="ts">
2
+ import PencilIcon from '@lucide/svelte/icons/pencil';
3
+ import Trash2Icon from '@lucide/svelte/icons/trash-2';
4
+ import FileTypeIcon from '../../file-icons/FileTypeIcon.svelte';
5
+ import { getFileTypeInfo } from '../../file-icons/index.js';
6
+ import { t } from '../../i18n/index.svelte.js';
7
+ import { browser } from '../../stores/browser.svelte.js';
8
+ import { safeLock } from '../../stores/safelock.svelte.js';
9
+ import { tabs } from '../../stores/tabs.svelte.js';
10
+ import type { FileEntry } from '../../types.js';
11
+ import { formatDate, formatFileSize } from '../../utils/format.js';
12
+
13
+ interface Props {
14
+ entry: FileEntry;
15
+ onDelete?: (entry: FileEntry) => void;
16
+ onRename?: (entry: FileEntry) => void;
17
+ }
18
+
19
+ let { entry, onDelete, onRename }: Props = $props();
20
+
21
+ const info = $derived(getFileTypeInfo(entry.extension, entry.is_dir));
22
+ let showActions = $derived(browser.canWrite && !safeLock.locked);
23
+
24
+ function handleClick() {
25
+ if (entry.is_dir) {
26
+ browser.navigateTo(entry.path);
27
+ } else {
28
+ if (browser.activeConnection) {
29
+ tabs.open({
30
+ id: `${browser.activeConnection.id}:${entry.path}`,
31
+ name: entry.name,
32
+ path: entry.path,
33
+ source: 'remote',
34
+ connectionId: browser.activeConnection.id,
35
+ extension: entry.extension,
36
+ size: entry.size
37
+ });
38
+ }
39
+ }
40
+ }
41
+
42
+ function handleKeydown(e: KeyboardEvent) {
43
+ if (e.key === 'Enter' || e.key === ' ') {
44
+ e.preventDefault();
45
+ handleClick();
46
+ }
47
+ }
48
+
49
+ function handleDeleteClick(e: MouseEvent) {
50
+ e.stopPropagation();
51
+ onDelete?.(entry);
52
+ }
53
+
54
+ function handleRenameClick(e: MouseEvent) {
55
+ e.stopPropagation();
56
+ onRename?.(entry);
57
+ }
58
+ </script>
59
+
60
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
61
+ <div
62
+ class="hover:bg-accent/50 border-border/40 group flex w-full cursor-pointer items-center gap-3 border-b px-3 py-2 text-start transition-colors last:border-b-0"
63
+ onclick={handleClick}
64
+ onkeydown={handleKeydown}
65
+ role="row"
66
+ tabindex="0"
67
+ title={info.label}
68
+ >
69
+ <!-- Icon -->
70
+ <div class="flex shrink-0 items-center justify-center">
71
+ <FileTypeIcon extension={entry.extension} isDir={entry.is_dir} class="size-4" />
72
+ </div>
73
+
74
+ <!-- File name -->
75
+ <span class="text-foreground min-w-0 flex-1 truncate text-sm">
76
+ {entry.name}
77
+ </span>
78
+
79
+ <!-- Action buttons (hover-reveal) -->
80
+ {#if showActions}
81
+ <div class="flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity group-hover:opacity-100">
82
+ <button
83
+ class="inline-flex size-6 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground"
84
+ aria-label={t('fileRow.rename', { name: entry.name })}
85
+ onclick={handleRenameClick}
86
+ >
87
+ <PencilIcon class="size-3" />
88
+ </button>
89
+ <button
90
+ class="inline-flex size-6 items-center justify-center rounded text-muted-foreground hover:bg-destructive/10 hover:text-destructive"
91
+ aria-label={t('fileRow.delete', { name: entry.name })}
92
+ onclick={handleDeleteClick}
93
+ >
94
+ <Trash2Icon class="size-3" />
95
+ </button>
96
+ </div>
97
+ {/if}
98
+
99
+ <!-- File size -->
100
+ <span class="text-muted-foreground w-20 shrink-0 text-end text-xs">
101
+ {#if entry.is_dir}
102
+ --
103
+ {:else}
104
+ {formatFileSize(entry.size)}
105
+ {/if}
106
+ </span>
107
+
108
+ <!-- Modified date -->
109
+ <span class="text-muted-foreground w-24 shrink-0 text-end text-xs">
110
+ {formatDate(entry.modified)}
111
+ </span>
112
+ </div>
@@ -0,0 +1,9 @@
1
+ import type { FileEntry } from '../../types.js';
2
+ interface Props {
3
+ entry: FileEntry;
4
+ onDelete?: (entry: FileEntry) => void;
5
+ onRename?: (entry: FileEntry) => void;
6
+ }
7
+ declare const FileRow: import("svelte").Component<Props, {}, "">;
8
+ type FileRow = ReturnType<typeof FileRow>;
9
+ export default FileRow;