@nocturnium/svelte-ide 1.0.0-rc.1

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 (330) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +251 -0
  3. package/dist/components/agents/AgentActivityPanel.svelte +565 -0
  4. package/dist/components/agents/AgentActivityPanel.svelte.d.ts +24 -0
  5. package/dist/components/agents/AgentAvatar.svelte +417 -0
  6. package/dist/components/agents/AgentAvatar.svelte.d.ts +23 -0
  7. package/dist/components/agents/AgentCursor.svelte +224 -0
  8. package/dist/components/agents/AgentCursor.svelte.d.ts +35 -0
  9. package/dist/components/agents/AgentPresenceBar.svelte +261 -0
  10. package/dist/components/agents/AgentPresenceBar.svelte.d.ts +20 -0
  11. package/dist/components/agents/index.d.ts +4 -0
  12. package/dist/components/agents/index.js +5 -0
  13. package/dist/components/ai/AIConversationList.svelte +524 -0
  14. package/dist/components/ai/AIConversationList.svelte.d.ts +17 -0
  15. package/dist/components/ai/AIEditPreview.svelte +132 -0
  16. package/dist/components/ai/AIEditPreview.svelte.d.ts +8 -0
  17. package/dist/components/ai/AIInlineEdit.svelte +155 -0
  18. package/dist/components/ai/AIInlineEdit.svelte.d.ts +10 -0
  19. package/dist/components/ai/AIMessage.svelte +239 -0
  20. package/dist/components/ai/AIMessage.svelte.d.ts +13 -0
  21. package/dist/components/ai/AIMessageActions.svelte +176 -0
  22. package/dist/components/ai/AIMessageActions.svelte.d.ts +12 -0
  23. package/dist/components/ai/AIMessageContent.svelte +355 -0
  24. package/dist/components/ai/AIMessageContent.svelte.d.ts +7 -0
  25. package/dist/components/ai/AIPanel.svelte +561 -0
  26. package/dist/components/ai/AIPanel.svelte.d.ts +7 -0
  27. package/dist/components/ai/AISuggestionWidget.svelte +132 -0
  28. package/dist/components/ai/AISuggestionWidget.svelte.d.ts +10 -0
  29. package/dist/components/ai/AIToolCallDisplay.svelte +317 -0
  30. package/dist/components/ai/AIToolCallDisplay.svelte.d.ts +12 -0
  31. package/dist/components/ai/index.d.ts +9 -0
  32. package/dist/components/ai/index.js +10 -0
  33. package/dist/components/core/Avatar.svelte +110 -0
  34. package/dist/components/core/Avatar.svelte.d.ts +12 -0
  35. package/dist/components/core/Badge.svelte +98 -0
  36. package/dist/components/core/Badge.svelte.d.ts +11 -0
  37. package/dist/components/core/Button.svelte +175 -0
  38. package/dist/components/core/Button.svelte.d.ts +18 -0
  39. package/dist/components/core/ConnectionStatus.svelte +294 -0
  40. package/dist/components/core/ConnectionStatus.svelte.d.ts +20 -0
  41. package/dist/components/core/ContextMenu.svelte +176 -0
  42. package/dist/components/core/ContextMenu.svelte.d.ts +19 -0
  43. package/dist/components/core/ErrorBoundary.svelte +277 -0
  44. package/dist/components/core/ErrorBoundary.svelte.d.ts +23 -0
  45. package/dist/components/core/Icon.svelte +107 -0
  46. package/dist/components/core/Icon.svelte.d.ts +8 -0
  47. package/dist/components/core/Input.svelte +138 -0
  48. package/dist/components/core/Input.svelte.d.ts +20 -0
  49. package/dist/components/core/Kbd.svelte +34 -0
  50. package/dist/components/core/Kbd.svelte.d.ts +7 -0
  51. package/dist/components/core/ResizeHandle.svelte +200 -0
  52. package/dist/components/core/ResizeHandle.svelte.d.ts +23 -0
  53. package/dist/components/core/Spinner.svelte +35 -0
  54. package/dist/components/core/Spinner.svelte.d.ts +7 -0
  55. package/dist/components/core/Textarea.svelte +112 -0
  56. package/dist/components/core/Textarea.svelte.d.ts +18 -0
  57. package/dist/components/core/Tooltip.svelte +103 -0
  58. package/dist/components/core/Tooltip.svelte.d.ts +11 -0
  59. package/dist/components/core/index.d.ts +13 -0
  60. package/dist/components/core/index.js +14 -0
  61. package/dist/components/editor/AIFocusLayer.svelte +430 -0
  62. package/dist/components/editor/AIFocusLayer.svelte.d.ts +32 -0
  63. package/dist/components/editor/Breadcrumbs.svelte +435 -0
  64. package/dist/components/editor/Breadcrumbs.svelte.d.ts +33 -0
  65. package/dist/components/editor/BreakpointLayer.svelte +642 -0
  66. package/dist/components/editor/BreakpointLayer.svelte.d.ts +20 -0
  67. package/dist/components/editor/CognitiveLoadMeter.svelte +324 -0
  68. package/dist/components/editor/CognitiveLoadMeter.svelte.d.ts +18 -0
  69. package/dist/components/editor/CollaborativeEditor.svelte +218 -0
  70. package/dist/components/editor/CollaborativeEditor.svelte.d.ts +32 -0
  71. package/dist/components/editor/CommandPalette.svelte +434 -0
  72. package/dist/components/editor/CommandPalette.svelte.d.ts +11 -0
  73. package/dist/components/editor/ComplexityLayer.svelte +293 -0
  74. package/dist/components/editor/ComplexityLayer.svelte.d.ts +23 -0
  75. package/dist/components/editor/ConflictZoneLayer.svelte +441 -0
  76. package/dist/components/editor/ConflictZoneLayer.svelte.d.ts +25 -0
  77. package/dist/components/editor/ContextLens.svelte +262 -0
  78. package/dist/components/editor/ContextLens.svelte.d.ts +27 -0
  79. package/dist/components/editor/CustomEditor.svelte +1242 -0
  80. package/dist/components/editor/CustomEditor.svelte.d.ts +37 -0
  81. package/dist/components/editor/DebugConsole.svelte +646 -0
  82. package/dist/components/editor/DebugConsole.svelte.d.ts +41 -0
  83. package/dist/components/editor/EchoCursorLayer.svelte +363 -0
  84. package/dist/components/editor/EchoCursorLayer.svelte.d.ts +24 -0
  85. package/dist/components/editor/Editor.svelte +61 -0
  86. package/dist/components/editor/Editor.svelte.d.ts +22 -0
  87. package/dist/components/editor/EditorGutter.svelte +119 -0
  88. package/dist/components/editor/EditorGutter.svelte.d.ts +19 -0
  89. package/dist/components/editor/EditorLines.svelte +182 -0
  90. package/dist/components/editor/EditorLines.svelte.d.ts +43 -0
  91. package/dist/components/editor/EditorPane.svelte +134 -0
  92. package/dist/components/editor/EditorPane.svelte.d.ts +9 -0
  93. package/dist/components/editor/EditorSelections.svelte +186 -0
  94. package/dist/components/editor/EditorSelections.svelte.d.ts +25 -0
  95. package/dist/components/editor/EditorTabs.svelte +170 -0
  96. package/dist/components/editor/EditorTabs.svelte.d.ts +12 -0
  97. package/dist/components/editor/FileExplorer.svelte +811 -0
  98. package/dist/components/editor/FileExplorer.svelte.d.ts +67 -0
  99. package/dist/components/editor/FileIcon.svelte +110 -0
  100. package/dist/components/editor/FileIcon.svelte.d.ts +10 -0
  101. package/dist/components/editor/FindReplace.svelte +448 -0
  102. package/dist/components/editor/FindReplace.svelte.d.ts +40 -0
  103. package/dist/components/editor/GhostBracketLayer.svelte +391 -0
  104. package/dist/components/editor/GhostBracketLayer.svelte.d.ts +24 -0
  105. package/dist/components/editor/GitBlameLayer.svelte +436 -0
  106. package/dist/components/editor/GitBlameLayer.svelte.d.ts +18 -0
  107. package/dist/components/editor/InlineDiagnosticsLayer.svelte +540 -0
  108. package/dist/components/editor/InlineDiagnosticsLayer.svelte.d.ts +35 -0
  109. package/dist/components/editor/InlineDiffLayer.svelte +337 -0
  110. package/dist/components/editor/InlineDiffLayer.svelte.d.ts +31 -0
  111. package/dist/components/editor/MinimalEditor.svelte +75 -0
  112. package/dist/components/editor/MinimalEditor.svelte.d.ts +6 -0
  113. package/dist/components/editor/MinimalEditor2.svelte +84 -0
  114. package/dist/components/editor/MinimalEditor2.svelte.d.ts +6 -0
  115. package/dist/components/editor/Minimap.svelte +327 -0
  116. package/dist/components/editor/Minimap.svelte.d.ts +34 -0
  117. package/dist/components/editor/PluginPreviewSandbox.svelte +793 -0
  118. package/dist/components/editor/PluginPreviewSandbox.svelte.d.ts +49 -0
  119. package/dist/components/editor/ProblemsPanel.svelte +628 -0
  120. package/dist/components/editor/ProblemsPanel.svelte.d.ts +25 -0
  121. package/dist/components/editor/QuickActionsMenu.svelte +403 -0
  122. package/dist/components/editor/QuickActionsMenu.svelte.d.ts +18 -0
  123. package/dist/components/editor/SnippetPalette.svelte +530 -0
  124. package/dist/components/editor/SnippetPalette.svelte.d.ts +16 -0
  125. package/dist/components/editor/StructureMap.svelte +431 -0
  126. package/dist/components/editor/StructureMap.svelte.d.ts +37 -0
  127. package/dist/components/editor/SymbolOutline.svelte +722 -0
  128. package/dist/components/editor/SymbolOutline.svelte.d.ts +44 -0
  129. package/dist/components/editor/TimelineScrubber.svelte +470 -0
  130. package/dist/components/editor/TimelineScrubber.svelte.d.ts +40 -0
  131. package/dist/components/editor/TokenRenderer.svelte +69 -0
  132. package/dist/components/editor/TokenRenderer.svelte.d.ts +15 -0
  133. package/dist/components/editor/constants.d.ts +32 -0
  134. package/dist/components/editor/constants.js +36 -0
  135. package/dist/components/editor/core/ai-awareness.d.ts +176 -0
  136. package/dist/components/editor/core/ai-awareness.js +210 -0
  137. package/dist/components/editor/core/bracket-healer.d.ts +189 -0
  138. package/dist/components/editor/core/bracket-healer.js +406 -0
  139. package/dist/components/editor/core/breakpoints.d.ts +203 -0
  140. package/dist/components/editor/core/breakpoints.js +414 -0
  141. package/dist/components/editor/core/commands.d.ts +108 -0
  142. package/dist/components/editor/core/commands.js +246 -0
  143. package/dist/components/editor/core/complexity-analyzer.d.ts +123 -0
  144. package/dist/components/editor/core/complexity-analyzer.js +376 -0
  145. package/dist/components/editor/core/conflict-predictor.d.ts +135 -0
  146. package/dist/components/editor/core/conflict-predictor.js +316 -0
  147. package/dist/components/editor/core/crdt-binding.d.ts +118 -0
  148. package/dist/components/editor/core/crdt-binding.js +286 -0
  149. package/dist/components/editor/core/diagnostics.d.ts +210 -0
  150. package/dist/components/editor/core/diagnostics.js +335 -0
  151. package/dist/components/editor/core/echo-cursor.d.ts +201 -0
  152. package/dist/components/editor/core/echo-cursor.js +267 -0
  153. package/dist/components/editor/core/folding.d.ts +124 -0
  154. package/dist/components/editor/core/folding.js +672 -0
  155. package/dist/components/editor/core/ghost-pair.d.ts +122 -0
  156. package/dist/components/editor/core/ghost-pair.js +221 -0
  157. package/dist/components/editor/core/git-blame.d.ts +170 -0
  158. package/dist/components/editor/core/git-blame.js +324 -0
  159. package/dist/components/editor/core/index.d.ts +26 -0
  160. package/dist/components/editor/core/index.js +24 -0
  161. package/dist/components/editor/core/keybindings.d.ts +79 -0
  162. package/dist/components/editor/core/keybindings.js +357 -0
  163. package/dist/components/editor/core/multi-cursor.d.ts +196 -0
  164. package/dist/components/editor/core/multi-cursor.js +521 -0
  165. package/dist/components/editor/core/navigation.d.ts +107 -0
  166. package/dist/components/editor/core/navigation.js +408 -0
  167. package/dist/components/editor/core/quick-actions.d.ts +189 -0
  168. package/dist/components/editor/core/quick-actions.js +427 -0
  169. package/dist/components/editor/core/search.d.ts +88 -0
  170. package/dist/components/editor/core/search.js +192 -0
  171. package/dist/components/editor/core/semantic-analyzer.d.ts +77 -0
  172. package/dist/components/editor/core/semantic-analyzer.js +424 -0
  173. package/dist/components/editor/core/snippet-manager.d.ts +202 -0
  174. package/dist/components/editor/core/snippet-manager.js +565 -0
  175. package/dist/components/editor/core/state.d.ts +367 -0
  176. package/dist/components/editor/core/state.js +900 -0
  177. package/dist/components/editor/core/timeline.d.ts +204 -0
  178. package/dist/components/editor/core/timeline.js +349 -0
  179. package/dist/components/editor/editor-find.d.ts +56 -0
  180. package/dist/components/editor/editor-find.js +148 -0
  181. package/dist/components/editor/editor-input.d.ts +77 -0
  182. package/dist/components/editor/editor-input.js +445 -0
  183. package/dist/components/editor/editor-multicursor.d.ts +21 -0
  184. package/dist/components/editor/editor-multicursor.js +196 -0
  185. package/dist/components/editor/editor-scroll.d.ts +14 -0
  186. package/dist/components/editor/editor-scroll.js +34 -0
  187. package/dist/components/editor/index.d.ts +15 -0
  188. package/dist/components/editor/index.js +21 -0
  189. package/dist/components/editor/languages.d.ts +62 -0
  190. package/dist/components/editor/languages.js +285 -0
  191. package/dist/components/editor/theme.d.ts +88 -0
  192. package/dist/components/editor/theme.js +139 -0
  193. package/dist/components/editor/tokenizer/base.d.ts +40 -0
  194. package/dist/components/editor/tokenizer/base.js +203 -0
  195. package/dist/components/editor/tokenizer/index.d.ts +56 -0
  196. package/dist/components/editor/tokenizer/index.js +215 -0
  197. package/dist/components/editor/tokenizer/languages/css.d.ts +17 -0
  198. package/dist/components/editor/tokenizer/languages/css.js +194 -0
  199. package/dist/components/editor/tokenizer/languages/go.d.ts +17 -0
  200. package/dist/components/editor/tokenizer/languages/go.js +220 -0
  201. package/dist/components/editor/tokenizer/languages/html.d.ts +24 -0
  202. package/dist/components/editor/tokenizer/languages/html.js +145 -0
  203. package/dist/components/editor/tokenizer/languages/javascript.d.ts +56 -0
  204. package/dist/components/editor/tokenizer/languages/javascript.js +452 -0
  205. package/dist/components/editor/tokenizer/languages/json.d.ts +12 -0
  206. package/dist/components/editor/tokenizer/languages/json.js +91 -0
  207. package/dist/components/editor/tokenizer/languages/markdown.d.ts +16 -0
  208. package/dist/components/editor/tokenizer/languages/markdown.js +156 -0
  209. package/dist/components/editor/tokenizer/languages/python.d.ts +20 -0
  210. package/dist/components/editor/tokenizer/languages/python.js +227 -0
  211. package/dist/components/editor/tokenizer/languages/svelte.d.ts +40 -0
  212. package/dist/components/editor/tokenizer/languages/svelte.js +326 -0
  213. package/dist/components/editor/tokenizer/types.d.ts +86 -0
  214. package/dist/components/editor/tokenizer/types.js +4 -0
  215. package/dist/components/layout/IDELayout.svelte +274 -0
  216. package/dist/components/layout/IDELayout.svelte.d.ts +29 -0
  217. package/dist/components/layout/StatusBar.svelte +511 -0
  218. package/dist/components/layout/StatusBar.svelte.d.ts +47 -0
  219. package/dist/components/layout/index.d.ts +2 -0
  220. package/dist/components/layout/index.js +3 -0
  221. package/dist/components/lsp/AutocompleteWidget.svelte +364 -0
  222. package/dist/components/lsp/AutocompleteWidget.svelte.d.ts +33 -0
  223. package/dist/components/lsp/DiagnosticMarker.svelte +166 -0
  224. package/dist/components/lsp/DiagnosticMarker.svelte.d.ts +19 -0
  225. package/dist/components/lsp/DiagnosticsPanel.svelte +388 -0
  226. package/dist/components/lsp/DiagnosticsPanel.svelte.d.ts +21 -0
  227. package/dist/components/lsp/HoverTooltip.svelte +274 -0
  228. package/dist/components/lsp/HoverTooltip.svelte.d.ts +24 -0
  229. package/dist/components/lsp/LSPEditor.svelte +486 -0
  230. package/dist/components/lsp/LSPEditor.svelte.d.ts +39 -0
  231. package/dist/components/lsp/SignatureHelpWidget.svelte +216 -0
  232. package/dist/components/lsp/SignatureHelpWidget.svelte.d.ts +22 -0
  233. package/dist/components/lsp/index.d.ts +6 -0
  234. package/dist/components/lsp/index.js +7 -0
  235. package/dist/components/plugins/PluginCard.svelte +153 -0
  236. package/dist/components/plugins/PluginCard.svelte.d.ts +19 -0
  237. package/dist/components/plugins/PluginPanel.svelte +280 -0
  238. package/dist/components/plugins/PluginPanel.svelte.d.ts +8 -0
  239. package/dist/components/plugins/PluginProposalForm.svelte +250 -0
  240. package/dist/components/plugins/PluginProposalForm.svelte.d.ts +6 -0
  241. package/dist/components/plugins/PluginStatusBadge.svelte +14 -0
  242. package/dist/components/plugins/PluginStatusBadge.svelte.d.ts +8 -0
  243. package/dist/components/plugins/index.d.ts +4 -0
  244. package/dist/components/plugins/index.js +5 -0
  245. package/dist/components/vfs/LockConflictDialog.svelte +705 -0
  246. package/dist/components/vfs/LockConflictDialog.svelte.d.ts +21 -0
  247. package/dist/components/vfs/LockIndicator.svelte +194 -0
  248. package/dist/components/vfs/LockIndicator.svelte.d.ts +29 -0
  249. package/dist/components/vfs/LockOverlay.svelte +344 -0
  250. package/dist/components/vfs/LockOverlay.svelte.d.ts +17 -0
  251. package/dist/components/vfs/VersionConflictDialog.svelte +549 -0
  252. package/dist/components/vfs/VersionConflictDialog.svelte.d.ts +24 -0
  253. package/dist/components/vfs/index.d.ts +4 -0
  254. package/dist/components/vfs/index.js +5 -0
  255. package/dist/crdt/awareness.d.ts +42 -0
  256. package/dist/crdt/awareness.js +109 -0
  257. package/dist/crdt/document.d.ts +101 -0
  258. package/dist/crdt/document.js +187 -0
  259. package/dist/crdt/index.d.ts +9 -0
  260. package/dist/crdt/index.js +8 -0
  261. package/dist/crdt/provider.d.ts +85 -0
  262. package/dist/crdt/provider.js +150 -0
  263. package/dist/crdt/types.d.ts +61 -0
  264. package/dist/crdt/types.js +4 -0
  265. package/dist/crdt/undo.d.ts +34 -0
  266. package/dist/crdt/undo.js +70 -0
  267. package/dist/index.d.ts +277 -0
  268. package/dist/index.js +280 -0
  269. package/dist/plugins/index.d.ts +103 -0
  270. package/dist/plugins/index.js +153 -0
  271. package/dist/services/error-handling.d.ts +95 -0
  272. package/dist/services/error-handling.js +413 -0
  273. package/dist/services/ide-integration.d.ts +83 -0
  274. package/dist/services/ide-integration.js +367 -0
  275. package/dist/services/lsp-client.d.ts +69 -0
  276. package/dist/services/lsp-client.js +667 -0
  277. package/dist/services/mock-ai.d.ts +37 -0
  278. package/dist/services/mock-ai.js +318 -0
  279. package/dist/services/optimistic.d.ts +141 -0
  280. package/dist/services/optimistic.js +367 -0
  281. package/dist/services/vfs-client.d.ts +81 -0
  282. package/dist/services/vfs-client.js +348 -0
  283. package/dist/stores/agents.svelte.d.ts +85 -0
  284. package/dist/stores/agents.svelte.js +459 -0
  285. package/dist/stores/ai-persistence.svelte.d.ts +76 -0
  286. package/dist/stores/ai-persistence.svelte.js +334 -0
  287. package/dist/stores/ai.svelte.d.ts +140 -0
  288. package/dist/stores/ai.svelte.js +383 -0
  289. package/dist/stores/collaboration.svelte.d.ts +164 -0
  290. package/dist/stores/collaboration.svelte.js +334 -0
  291. package/dist/stores/editor.svelte.d.ts +131 -0
  292. package/dist/stores/editor.svelte.js +250 -0
  293. package/dist/stores/index.d.ts +10 -0
  294. package/dist/stores/index.js +29 -0
  295. package/dist/stores/layout.svelte.d.ts +171 -0
  296. package/dist/stores/layout.svelte.js +351 -0
  297. package/dist/stores/plugin.svelte.d.ts +121 -0
  298. package/dist/stores/plugin.svelte.js +410 -0
  299. package/dist/stores/vfs.svelte.d.ts +123 -0
  300. package/dist/stores/vfs.svelte.js +680 -0
  301. package/dist/styles/theme.css +623 -0
  302. package/dist/types/agents.d.ts +127 -0
  303. package/dist/types/agents.js +5 -0
  304. package/dist/types/ai.d.ts +137 -0
  305. package/dist/types/ai.js +4 -0
  306. package/dist/types/crdt.d.ts +222 -0
  307. package/dist/types/crdt.js +5 -0
  308. package/dist/types/editor.d.ts +52 -0
  309. package/dist/types/editor.js +18 -0
  310. package/dist/types/events.d.ts +133 -0
  311. package/dist/types/events.js +4 -0
  312. package/dist/types/filesystem.d.ts +77 -0
  313. package/dist/types/filesystem.js +4 -0
  314. package/dist/types/index.d.ts +9 -0
  315. package/dist/types/index.js +12 -0
  316. package/dist/types/lsp.d.ts +691 -0
  317. package/dist/types/lsp.js +108 -0
  318. package/dist/types/plugin.d.ts +239 -0
  319. package/dist/types/plugin.js +5 -0
  320. package/dist/types/vfs.d.ts +191 -0
  321. package/dist/types/vfs.js +18 -0
  322. package/dist/utils/format.d.ts +55 -0
  323. package/dist/utils/format.js +152 -0
  324. package/dist/utils/index.d.ts +3 -0
  325. package/dist/utils/index.js +4 -0
  326. package/dist/utils/keybindings.d.ts +33 -0
  327. package/dist/utils/keybindings.js +171 -0
  328. package/dist/utils/language.d.ts +27 -0
  329. package/dist/utils/language.js +222 -0
  330. package/package.json +178 -0
@@ -0,0 +1,327 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Minimap Component
4
+ *
5
+ * A scaled-down overview of the entire document showing:
6
+ * - Code structure visualization
7
+ * - Current viewport indicator
8
+ * - Highlighted regions (search, errors, changes)
9
+ * - Click-to-navigate functionality
10
+ */
11
+
12
+ import { onMount } from 'svelte';
13
+
14
+ interface MinimapHighlight {
15
+ /** Line number (0-based) */
16
+ line: number;
17
+ /** Highlight type */
18
+ type: 'search' | 'error' | 'warning' | 'change' | 'selection' | 'cursor';
19
+ /** Optional column range */
20
+ startColumn?: number;
21
+ endColumn?: number;
22
+ }
23
+
24
+ interface Props {
25
+ /** Lines of code to display */
26
+ lines: string[];
27
+ /** Current scroll position (line number) */
28
+ scrollTop: number;
29
+ /** Number of visible lines in viewport */
30
+ visibleLines: number;
31
+ /** Total editor height */
32
+ editorHeight: number;
33
+ /** Highlights to show on minimap */
34
+ highlights?: MinimapHighlight[];
35
+ /** Whether minimap is enabled */
36
+ enabled?: boolean;
37
+ /** Minimap width */
38
+ width?: number;
39
+ /** Scale factor for text */
40
+ scale?: number;
41
+ /** Callback when user clicks to navigate */
42
+ onNavigate?: (line: number) => void;
43
+ /** Show slider/viewport indicator */
44
+ showSlider?: boolean;
45
+ }
46
+
47
+ let {
48
+ lines,
49
+ scrollTop,
50
+ visibleLines,
51
+ editorHeight,
52
+ highlights = [],
53
+ enabled = true,
54
+ width = 100,
55
+ scale = 1,
56
+ onNavigate,
57
+ showSlider = true
58
+ }: Props = $props();
59
+
60
+ let canvas = $state<HTMLCanvasElement>(null!);
61
+ let container = $state<HTMLDivElement>(null!);
62
+ let isDragging = $state(false);
63
+ let isHovering = $state(false);
64
+ let hoverLine = $state<number | null>(null);
65
+
66
+ // Computed constants (derived from props)
67
+ const PADDING = 4;
68
+ const LINE_HEIGHT = $derived(2 * scale);
69
+ const CHAR_WIDTH = $derived(1.2 * scale);
70
+ const MAX_CHARS = $derived(Math.floor((width - 20) / CHAR_WIDTH));
71
+
72
+ // Computed values
73
+ const totalHeight = $derived(lines.length * LINE_HEIGHT);
74
+ const scaleFactor = $derived(editorHeight / totalHeight);
75
+ const needsScaling = $derived(totalHeight > editorHeight);
76
+
77
+ // Color palette for syntax-like rendering
78
+ const colors = {
79
+ keyword: '#c586c0',
80
+ string: '#ce9178',
81
+ comment: '#6a9955',
82
+ number: '#b5cea8',
83
+ function: '#dcdcaa',
84
+ default: '#9cdcfe',
85
+ background: '#1e1e2e',
86
+ viewport: 'rgba(255, 255, 255, 0.1)',
87
+ viewportBorder: 'rgba(255, 255, 255, 0.3)'
88
+ };
89
+
90
+ // Highlight colors
91
+ const highlightColors: Record<MinimapHighlight['type'], string> = {
92
+ search: '#f9e64f',
93
+ error: '#f44747',
94
+ warning: '#ff8c00',
95
+ change: '#3b82f6',
96
+ selection: 'rgba(38, 79, 120, 0.8)',
97
+ cursor: '#aeafad'
98
+ };
99
+
100
+ /**
101
+ * Render the minimap to canvas
102
+ */
103
+ function render() {
104
+ if (!canvas) return;
105
+
106
+ const ctx = canvas.getContext('2d');
107
+ if (!ctx) return;
108
+
109
+ const devicePixelRatio = window.devicePixelRatio || 1;
110
+ canvas.width = width * devicePixelRatio;
111
+ canvas.height = editorHeight * devicePixelRatio;
112
+ canvas.style.width = `${width}px`;
113
+ canvas.style.height = `${editorHeight}px`;
114
+ ctx.scale(devicePixelRatio, devicePixelRatio);
115
+
116
+ // Clear
117
+ ctx.fillStyle = colors.background;
118
+ ctx.fillRect(0, 0, width, editorHeight);
119
+
120
+ // Calculate effective line height based on scaling
121
+ const effectiveLineHeight = needsScaling ? (editorHeight / lines.length) : LINE_HEIGHT;
122
+ const effectiveCharWidth = CHAR_WIDTH * (needsScaling ? scaleFactor : 1);
123
+
124
+ // Draw highlights first (behind text)
125
+ for (const highlight of highlights) {
126
+ const y = highlight.line * effectiveLineHeight;
127
+ ctx.fillStyle = highlightColors[highlight.type];
128
+
129
+ if (highlight.startColumn !== undefined && highlight.endColumn !== undefined) {
130
+ const x = PADDING + highlight.startColumn * effectiveCharWidth;
131
+ const highlightWidth = (highlight.endColumn - highlight.startColumn) * effectiveCharWidth;
132
+ ctx.fillRect(x, y, Math.max(highlightWidth, 3), effectiveLineHeight);
133
+ } else {
134
+ // Full line highlight
135
+ ctx.fillRect(0, y, width, effectiveLineHeight);
136
+ }
137
+ }
138
+
139
+ // Draw code lines
140
+ for (let i = 0; i < lines.length; i++) {
141
+ const line = lines[i];
142
+ const y = i * effectiveLineHeight;
143
+
144
+ // Skip if outside visible area
145
+ if (y > editorHeight) break;
146
+
147
+ // Simple syntax-like coloring based on content
148
+ const trimmed = line.trim();
149
+ let color = colors.default;
150
+
151
+ if (trimmed.startsWith('//') || trimmed.startsWith('/*') || trimmed.startsWith('*')) {
152
+ color = colors.comment;
153
+ } else if (trimmed.startsWith('import') || trimmed.startsWith('export') ||
154
+ trimmed.startsWith('const') || trimmed.startsWith('let') ||
155
+ trimmed.startsWith('function') || trimmed.startsWith('class') ||
156
+ trimmed.startsWith('if') || trimmed.startsWith('for') ||
157
+ trimmed.startsWith('return') || trimmed.startsWith('async')) {
158
+ color = colors.keyword;
159
+ } else if (trimmed.includes('"') || trimmed.includes("'") || trimmed.includes('`')) {
160
+ color = colors.string;
161
+ }
162
+
163
+ ctx.fillStyle = color;
164
+
165
+ // Draw simplified line representation
166
+ const indent = line.length - line.trimStart().length;
167
+ const content = line.trim().slice(0, MAX_CHARS);
168
+
169
+ // Draw as small rectangles representing characters
170
+ let x = PADDING + indent * effectiveCharWidth;
171
+ for (let j = 0; j < content.length && x < width - PADDING; j++) {
172
+ const char = content[j];
173
+ if (char !== ' ') {
174
+ const charWidth = effectiveCharWidth * 0.8;
175
+ ctx.fillRect(x, y + effectiveLineHeight * 0.2, charWidth, effectiveLineHeight * 0.6);
176
+ }
177
+ x += effectiveCharWidth;
178
+ }
179
+ }
180
+
181
+ // Draw viewport slider
182
+ if (showSlider) {
183
+ // Use effectiveLineHeight for consistent positioning with click handling
184
+ const sliderY = scrollTop * effectiveLineHeight;
185
+ const sliderHeight = visibleLines * effectiveLineHeight;
186
+
187
+ // Viewport background
188
+ ctx.fillStyle = colors.viewport;
189
+ ctx.fillRect(0, sliderY, width, Math.max(sliderHeight, 20));
190
+
191
+ // Viewport border
192
+ ctx.strokeStyle = colors.viewportBorder;
193
+ ctx.lineWidth = 1;
194
+ ctx.strokeRect(0.5, sliderY + 0.5, width - 1, Math.max(sliderHeight, 20) - 1);
195
+ }
196
+
197
+ // Draw hover indicator
198
+ if (isHovering && hoverLine !== null) {
199
+ const hoverY = hoverLine * effectiveLineHeight;
200
+ ctx.fillStyle = 'rgba(255, 255, 255, 0.1)';
201
+ ctx.fillRect(0, hoverY, width, effectiveLineHeight * 3);
202
+ }
203
+ }
204
+
205
+ /**
206
+ * Handle click to navigate
207
+ */
208
+ function handleClick(e: MouseEvent) {
209
+ const rect = container.getBoundingClientRect();
210
+ const y = e.clientY - rect.top;
211
+ const effectiveLineHeight = needsScaling ? (editorHeight / lines.length) : LINE_HEIGHT;
212
+ const line = Math.floor(y / effectiveLineHeight);
213
+ onNavigate?.(Math.max(0, Math.min(line, lines.length - 1)));
214
+ }
215
+
216
+ /**
217
+ * Handle mouse move for hover effect
218
+ */
219
+ function handleMouseMove(e: MouseEvent) {
220
+ const rect = container.getBoundingClientRect();
221
+ const y = e.clientY - rect.top;
222
+ const effectiveLineHeight = needsScaling ? (editorHeight / lines.length) : LINE_HEIGHT;
223
+ hoverLine = Math.floor(y / effectiveLineHeight);
224
+
225
+ if (isDragging) {
226
+ handleClick(e);
227
+ }
228
+ }
229
+
230
+ /**
231
+ * Handle drag start
232
+ */
233
+ function handleMouseDown(e: MouseEvent) {
234
+ isDragging = true;
235
+ handleClick(e);
236
+
237
+ const handleMouseUp = () => {
238
+ isDragging = false;
239
+ window.removeEventListener('mouseup', handleMouseUp);
240
+ window.removeEventListener('mousemove', handleWindowMouseMove);
241
+ };
242
+
243
+ const handleWindowMouseMove = (e: MouseEvent) => {
244
+ if (isDragging) {
245
+ const rect = container.getBoundingClientRect();
246
+ const y = Math.max(0, Math.min(e.clientY - rect.top, editorHeight));
247
+ const effectiveLineHeight = needsScaling ? (editorHeight / lines.length) : LINE_HEIGHT;
248
+ const line = Math.floor(y / effectiveLineHeight);
249
+ onNavigate?.(Math.max(0, Math.min(line, lines.length - 1)));
250
+ }
251
+ };
252
+
253
+ window.addEventListener('mouseup', handleMouseUp);
254
+ window.addEventListener('mousemove', handleWindowMouseMove);
255
+ }
256
+
257
+ // Re-render when dependencies change
258
+ $effect(() => {
259
+ if (enabled && lines && scrollTop !== undefined && highlights) {
260
+ render();
261
+ }
262
+ });
263
+
264
+ onMount(() => {
265
+ render();
266
+ });
267
+ </script>
268
+
269
+ {#if enabled}
270
+ <div
271
+ class="minimap"
272
+ class:minimap--dragging={isDragging}
273
+ style="width: {width}px; height: {editorHeight}px;"
274
+ bind:this={container}
275
+ onmousedown={handleMouseDown}
276
+ onmousemove={handleMouseMove}
277
+ onmouseenter={() => (isHovering = true)}
278
+ onmouseleave={() => {
279
+ isHovering = false;
280
+ hoverLine = null;
281
+ }}
282
+ role="slider"
283
+ aria-label="Code minimap"
284
+ aria-valuenow={scrollTop}
285
+ aria-valuemin={0}
286
+ aria-valuemax={lines.length}
287
+ tabindex={-1}
288
+ >
289
+ <canvas bind:this={canvas} class="minimap__canvas"></canvas>
290
+
291
+ <!-- Line count indicator -->
292
+ <div class="minimap__info">
293
+ {lines.length} lines
294
+ </div>
295
+ </div>
296
+ {/if}
297
+
298
+ <style>
299
+ .minimap {
300
+ position: relative;
301
+ background: var(--minimap-bg, #1e1e2e);
302
+ border-left: 1px solid var(--ide-border, #333);
303
+ cursor: pointer;
304
+ user-select: none;
305
+ overflow: hidden;
306
+ }
307
+
308
+ .minimap--dragging {
309
+ cursor: grabbing;
310
+ }
311
+
312
+ .minimap__canvas {
313
+ display: block;
314
+ }
315
+
316
+ .minimap__info {
317
+ position: absolute;
318
+ bottom: 4px;
319
+ right: 4px;
320
+ font-size: 9px;
321
+ color: var(--ide-text-muted, #666);
322
+ background: rgba(0, 0, 0, 0.5);
323
+ padding: 2px 4px;
324
+ border-radius: 2px;
325
+ pointer-events: none;
326
+ }
327
+ </style>
@@ -0,0 +1,34 @@
1
+ interface MinimapHighlight {
2
+ /** Line number (0-based) */
3
+ line: number;
4
+ /** Highlight type */
5
+ type: 'search' | 'error' | 'warning' | 'change' | 'selection' | 'cursor';
6
+ /** Optional column range */
7
+ startColumn?: number;
8
+ endColumn?: number;
9
+ }
10
+ interface Props {
11
+ /** Lines of code to display */
12
+ lines: string[];
13
+ /** Current scroll position (line number) */
14
+ scrollTop: number;
15
+ /** Number of visible lines in viewport */
16
+ visibleLines: number;
17
+ /** Total editor height */
18
+ editorHeight: number;
19
+ /** Highlights to show on minimap */
20
+ highlights?: MinimapHighlight[];
21
+ /** Whether minimap is enabled */
22
+ enabled?: boolean;
23
+ /** Minimap width */
24
+ width?: number;
25
+ /** Scale factor for text */
26
+ scale?: number;
27
+ /** Callback when user clicks to navigate */
28
+ onNavigate?: (line: number) => void;
29
+ /** Show slider/viewport indicator */
30
+ showSlider?: boolean;
31
+ }
32
+ declare const Minimap: import("svelte").Component<Props, {}, "">;
33
+ type Minimap = ReturnType<typeof Minimap>;
34
+ export default Minimap;