@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,324 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Cognitive Load Meter
4
+ *
5
+ * A status bar component that displays real-time code complexity metrics.
6
+ * Shows an animated gauge with color-coded levels and optional tooltip details.
7
+ */
8
+
9
+ import type { ComplexityMetrics } from './core/complexity-analyzer';
10
+
11
+ interface Props {
12
+ /** Current complexity metrics */
13
+ metrics: ComplexityMetrics | null;
14
+ /** Whether to show detailed tooltip on hover */
15
+ showDetails?: boolean;
16
+ /** Callback when clicked */
17
+ onclick?: () => void;
18
+ }
19
+
20
+ let { metrics, showDetails = true, onclick }: Props = $props();
21
+
22
+ let showTooltip = $state(false);
23
+
24
+ // Derived values
25
+ let score = $derived(metrics?.overall ?? 0);
26
+ let level = $derived(metrics?.level ?? 'low');
27
+
28
+ let levelColor = $derived(
29
+ level === 'critical'
30
+ ? 'var(--color-error, #ef4444)'
31
+ : level === 'high'
32
+ ? 'var(--color-warning, #f59e0b)'
33
+ : level === 'medium'
34
+ ? 'var(--color-info, #3b82f6)'
35
+ : 'var(--color-success, #22c55e)'
36
+ );
37
+
38
+ let levelLabel = $derived(
39
+ level === 'critical'
40
+ ? 'Critical'
41
+ : level === 'high'
42
+ ? 'High'
43
+ : level === 'medium'
44
+ ? 'Medium'
45
+ : 'Low'
46
+ );
47
+
48
+ let highComplexityRegions = $derived(metrics?.regions.filter((r) => r.score >= 50) ?? []);
49
+
50
+ function handleMouseEnter() {
51
+ if (showDetails) {
52
+ showTooltip = true;
53
+ }
54
+ }
55
+
56
+ function handleMouseLeave() {
57
+ showTooltip = false;
58
+ }
59
+ </script>
60
+
61
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
62
+ <div
63
+ class="cognitive-meter"
64
+ role={onclick ? 'button' : 'meter'}
65
+ aria-valuenow={score}
66
+ aria-valuemin={0}
67
+ aria-valuemax={100}
68
+ aria-label="Code complexity: {score} out of 100, {levelLabel} complexity"
69
+ onmouseenter={handleMouseEnter}
70
+ onmouseleave={handleMouseLeave}
71
+ onclick={onclick}
72
+ onkeydown={(e) => e.key === 'Enter' && onclick?.()}
73
+ tabindex={onclick ? 0 : -1}
74
+ >
75
+ <!-- Brain icon -->
76
+ <div class="cognitive-meter__icon" style="color: {levelColor}">
77
+ <svg
78
+ width="14"
79
+ height="14"
80
+ viewBox="0 0 24 24"
81
+ fill="none"
82
+ stroke="currentColor"
83
+ stroke-width="2"
84
+ stroke-linecap="round"
85
+ stroke-linejoin="round"
86
+ >
87
+ <path
88
+ d="M9.5 2A2.5 2.5 0 0 1 12 4.5v15a2.5 2.5 0 0 1-4.96.44 2.5 2.5 0 0 1-2.96-3.08 3 3 0 0 1-.34-5.58 2.5 2.5 0 0 1 1.32-4.24 2.5 2.5 0 0 1 1.98-3A2.5 2.5 0 0 1 9.5 2Z"
89
+ />
90
+ <path
91
+ d="M14.5 2A2.5 2.5 0 0 0 12 4.5v15a2.5 2.5 0 0 0 4.96.44 2.5 2.5 0 0 0 2.96-3.08 3 3 0 0 0 .34-5.58 2.5 2.5 0 0 0-1.32-4.24 2.5 2.5 0 0 0-1.98-3A2.5 2.5 0 0 0 14.5 2Z"
92
+ />
93
+ </svg>
94
+ </div>
95
+
96
+ <!-- Gauge bar -->
97
+ <div class="cognitive-meter__gauge">
98
+ <div
99
+ class="cognitive-meter__fill"
100
+ style="width: {score}%; background-color: {levelColor}"
101
+ class:cognitive-meter__fill--animated={level === 'critical'}
102
+ ></div>
103
+ </div>
104
+
105
+ <!-- Score value -->
106
+ <span class="cognitive-meter__value" style="color: {levelColor}">
107
+ {score}
108
+ </span>
109
+
110
+ <!-- Tooltip -->
111
+ {#if showTooltip && metrics}
112
+ <div class="cognitive-meter__tooltip">
113
+ <div class="cognitive-meter__tooltip-header">
114
+ <span class="cognitive-meter__tooltip-title">Cognitive Complexity</span>
115
+ <span class="cognitive-meter__tooltip-score" style="color: {levelColor}">
116
+ {score}/100 ({levelLabel})
117
+ </span>
118
+ </div>
119
+
120
+ {#if highComplexityRegions.length > 0}
121
+ <div class="cognitive-meter__tooltip-section">
122
+ <span class="cognitive-meter__tooltip-label">High complexity regions:</span>
123
+ <ul class="cognitive-meter__tooltip-list">
124
+ {#each highComplexityRegions.slice(0, 5) as region}
125
+ <li>
126
+ <span class="cognitive-meter__tooltip-region-name">
127
+ {region.name || `${region.type} at line ${region.startLine + 1}`}
128
+ </span>
129
+ <span class="cognitive-meter__tooltip-region-score">
130
+ {region.score}
131
+ </span>
132
+ </li>
133
+ {/each}
134
+ {#if highComplexityRegions.length > 5}
135
+ <li class="cognitive-meter__tooltip-more">
136
+ +{highComplexityRegions.length - 5} more regions
137
+ </li>
138
+ {/if}
139
+ </ul>
140
+ </div>
141
+ {/if}
142
+
143
+ {#if metrics.regions.some((r) => r.suggestion)}
144
+ <div class="cognitive-meter__tooltip-section">
145
+ <span class="cognitive-meter__tooltip-label">Suggestions:</span>
146
+ {#each metrics.regions.filter((r) => r.suggestion).slice(0, 2) as region}
147
+ <p class="cognitive-meter__tooltip-suggestion">
148
+ {region.suggestion}
149
+ </p>
150
+ {/each}
151
+ </div>
152
+ {/if}
153
+ </div>
154
+ {/if}
155
+ </div>
156
+
157
+ <style>
158
+ .cognitive-meter {
159
+ display: flex;
160
+ align-items: center;
161
+ gap: 6px;
162
+ padding: 2px 8px;
163
+ border-radius: 4px;
164
+ cursor: default;
165
+ position: relative;
166
+ font-size: 12px;
167
+ transition: background-color 0.15s ease;
168
+ }
169
+
170
+ .cognitive-meter:hover {
171
+ background-color: rgba(255, 255, 255, 0.1);
172
+ }
173
+
174
+ .cognitive-meter:focus-visible {
175
+ outline: 2px solid var(--color-focus, #3b82f6);
176
+ outline-offset: 2px;
177
+ }
178
+
179
+ .cognitive-meter__icon {
180
+ display: flex;
181
+ align-items: center;
182
+ justify-content: center;
183
+ flex-shrink: 0;
184
+ }
185
+
186
+ .cognitive-meter__gauge {
187
+ width: 40px;
188
+ height: 6px;
189
+ background-color: rgba(255, 255, 255, 0.1);
190
+ border-radius: 3px;
191
+ overflow: hidden;
192
+ }
193
+
194
+ .cognitive-meter__fill {
195
+ height: 100%;
196
+ border-radius: 3px;
197
+ transition:
198
+ width 0.3s ease,
199
+ background-color 0.3s ease;
200
+ }
201
+
202
+ .cognitive-meter__fill--animated {
203
+ animation: pulse-critical 1.5s ease-in-out infinite;
204
+ }
205
+
206
+ @keyframes pulse-critical {
207
+ 0%,
208
+ 100% {
209
+ opacity: 1;
210
+ }
211
+ 50% {
212
+ opacity: 0.6;
213
+ }
214
+ }
215
+
216
+ .cognitive-meter__value {
217
+ font-weight: 600;
218
+ font-variant-numeric: tabular-nums;
219
+ min-width: 20px;
220
+ text-align: right;
221
+ }
222
+
223
+ /* Tooltip */
224
+ .cognitive-meter__tooltip {
225
+ position: absolute;
226
+ bottom: 100%;
227
+ left: 50%;
228
+ transform: translateX(-50%);
229
+ margin-bottom: 8px;
230
+ padding: 12px;
231
+ background-color: var(--color-surface, #1e1e1e);
232
+ border: 1px solid var(--color-border, #333);
233
+ border-radius: 8px;
234
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
235
+ min-width: 280px;
236
+ max-width: 320px;
237
+ z-index: 1000;
238
+ pointer-events: none;
239
+ }
240
+
241
+ .cognitive-meter__tooltip::after {
242
+ content: '';
243
+ position: absolute;
244
+ top: 100%;
245
+ left: 50%;
246
+ transform: translateX(-50%);
247
+ border: 6px solid transparent;
248
+ border-top-color: var(--color-border, #333);
249
+ }
250
+
251
+ .cognitive-meter__tooltip-header {
252
+ display: flex;
253
+ justify-content: space-between;
254
+ align-items: center;
255
+ margin-bottom: 8px;
256
+ padding-bottom: 8px;
257
+ border-bottom: 1px solid var(--color-border, #333);
258
+ }
259
+
260
+ .cognitive-meter__tooltip-title {
261
+ font-weight: 600;
262
+ color: var(--color-text, #fff);
263
+ }
264
+
265
+ .cognitive-meter__tooltip-score {
266
+ font-weight: 700;
267
+ }
268
+
269
+ .cognitive-meter__tooltip-section {
270
+ margin-top: 8px;
271
+ }
272
+
273
+ .cognitive-meter__tooltip-label {
274
+ display: block;
275
+ font-size: 11px;
276
+ color: var(--color-text-muted, #888);
277
+ margin-bottom: 4px;
278
+ text-transform: uppercase;
279
+ letter-spacing: 0.05em;
280
+ }
281
+
282
+ .cognitive-meter__tooltip-list {
283
+ list-style: none;
284
+ margin: 0;
285
+ padding: 0;
286
+ }
287
+
288
+ .cognitive-meter__tooltip-list li {
289
+ display: flex;
290
+ justify-content: space-between;
291
+ align-items: center;
292
+ padding: 2px 0;
293
+ font-size: 12px;
294
+ }
295
+
296
+ .cognitive-meter__tooltip-region-name {
297
+ color: var(--color-text, #fff);
298
+ overflow: hidden;
299
+ text-overflow: ellipsis;
300
+ white-space: nowrap;
301
+ max-width: 200px;
302
+ }
303
+
304
+ .cognitive-meter__tooltip-region-score {
305
+ color: var(--color-warning, #f59e0b);
306
+ font-weight: 600;
307
+ font-variant-numeric: tabular-nums;
308
+ }
309
+
310
+ .cognitive-meter__tooltip-more {
311
+ color: var(--color-text-muted, #888);
312
+ font-style: italic;
313
+ }
314
+
315
+ .cognitive-meter__tooltip-suggestion {
316
+ margin: 4px 0 0;
317
+ padding: 6px 8px;
318
+ background-color: rgba(255, 255, 255, 0.05);
319
+ border-radius: 4px;
320
+ font-size: 11px;
321
+ color: var(--color-text-muted, #aaa);
322
+ line-height: 1.4;
323
+ }
324
+ </style>
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Cognitive Load Meter
3
+ *
4
+ * A status bar component that displays real-time code complexity metrics.
5
+ * Shows an animated gauge with color-coded levels and optional tooltip details.
6
+ */
7
+ import type { ComplexityMetrics } from './core/complexity-analyzer';
8
+ interface Props {
9
+ /** Current complexity metrics */
10
+ metrics: ComplexityMetrics | null;
11
+ /** Whether to show detailed tooltip on hover */
12
+ showDetails?: boolean;
13
+ /** Callback when clicked */
14
+ onclick?: () => void;
15
+ }
16
+ declare const CognitiveLoadMeter: import("svelte").Component<Props, {}, "">;
17
+ type CognitiveLoadMeter = ReturnType<typeof CognitiveLoadMeter>;
18
+ export default CognitiveLoadMeter;
@@ -0,0 +1,218 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Collaborative Editor component
4
+ *
5
+ * This component wraps the custom editor with Yjs CRDT support
6
+ * for real-time collaborative editing.
7
+ */
8
+
9
+ import { onMount, onDestroy } from 'svelte';
10
+ import * as Y from 'yjs';
11
+ import CustomEditor from './CustomEditor.svelte';
12
+ import {
13
+ createEditorState,
14
+ createCRDTBinding,
15
+ type CRDTBinding
16
+ } from './core';
17
+ import type { EditorPreferences } from '../../types';
18
+ import type { CollaborationUser } from '../../types/crdt';
19
+
20
+ interface Props {
21
+ /** Yjs document for collaboration (optional - will create one if not provided) */
22
+ doc?: Y.Doc;
23
+ /** Document ID for standalone mode */
24
+ documentId?: string;
25
+ /** Initial content when creating a new document */
26
+ initialContent?: string;
27
+ /** Text type name in the Yjs document */
28
+ textName?: string;
29
+ /** Language for syntax highlighting */
30
+ language?: string;
31
+ /** Whether the editor is read-only */
32
+ readonly?: boolean;
33
+ /** Editor preferences */
34
+ preferences?: Partial<EditorPreferences>;
35
+ /** Additional CSS class */
36
+ class?: string;
37
+ /** Current user info for cursor display */
38
+ currentUser?: CollaborationUser;
39
+ /** Called when content changes */
40
+ onChange?: (content: string) => void;
41
+ /** Called when cursor position changes */
42
+ onCursorChange?: (line: number, column: number) => void;
43
+ /** Called when save is triggered (Ctrl+S) */
44
+ onSave?: () => void;
45
+ }
46
+
47
+ let {
48
+ doc: externalDoc,
49
+ documentId,
50
+ initialContent = '',
51
+ textName = 'content',
52
+ language = 'plaintext',
53
+ readonly = false,
54
+ preferences = {},
55
+ class: className = '',
56
+ currentUser,
57
+ onChange,
58
+ onCursorChange,
59
+ onSave
60
+ }: Props = $props();
61
+
62
+ // Create internal doc if none provided
63
+ let internalDoc: Y.Doc | null = null;
64
+
65
+ // Editor state and CRDT binding
66
+ let editorState = $state<ReturnType<typeof createEditorState> | null>(null);
67
+ let crdtBinding = $state<CRDTBinding | null>(null);
68
+ let content = $state('');
69
+
70
+ // Unsubscribe for the bound editorState content-change listener
71
+ let unsubscribeContent: (() => void) | null = null;
72
+
73
+ // Yjs text observer used to mirror remote edits into `content`
74
+ let yTextObserver: (() => void) | null = null;
75
+
76
+ // Initialize on mount
77
+ onMount(() => {
78
+ // Use external doc or create internal one
79
+ const doc = externalDoc ?? new Y.Doc();
80
+ if (!externalDoc) {
81
+ internalDoc = doc;
82
+ // Initialize with content if provided
83
+ if (initialContent) {
84
+ const text = doc.getText(textName);
85
+ text.insert(0, initialContent);
86
+ }
87
+ }
88
+
89
+ // Create editor state
90
+ editorState = createEditorState({
91
+ content: initialContent,
92
+ language,
93
+ tabSize: preferences.tabSize ?? 2,
94
+ insertSpaces: preferences.insertSpaces ?? false
95
+ });
96
+
97
+ // Create CRDT binding
98
+ crdtBinding = createCRDTBinding({
99
+ doc,
100
+ textName,
101
+ editorState
102
+ });
103
+
104
+ // Get initial content from CRDT
105
+ content = crdtBinding.getText().toString();
106
+
107
+ // Mirror local edits applied to the bound editorState into the prop that
108
+ // drives the inner editor, and notify the outer onChange. (Remote edits are
109
+ // applied with notifications suppressed, so they are handled by the Yjs
110
+ // observer below instead.)
111
+ unsubscribeContent = editorState.onContentChange(() => {
112
+ const next = editorState!.getContent();
113
+ if (next === content) return;
114
+ content = next;
115
+ onChange?.(next);
116
+ });
117
+
118
+ // Receive path: observe the Yjs text directly so remote edits from
119
+ // collaborators are reflected into `content` and the outer onChange even
120
+ // though the binding applies them with editorState notifications suppressed.
121
+ const yText = crdtBinding.getText();
122
+ const observer = () => {
123
+ const next = yText.toString();
124
+ if (next === content) return;
125
+ content = next;
126
+ onChange?.(next);
127
+ };
128
+ yText.observe(observer);
129
+ yTextObserver = () => yText.unobserve(observer);
130
+ });
131
+
132
+ onDestroy(() => {
133
+ unsubscribeContent?.();
134
+ unsubscribeContent = null;
135
+ yTextObserver?.();
136
+ yTextObserver = null;
137
+ crdtBinding?.destroy();
138
+ internalDoc?.destroy();
139
+ });
140
+
141
+ // Handle content changes from the inner editor (local typing).
142
+ //
143
+ // The inner CustomEditor maintains its OWN EditorState, so local edits never
144
+ // reach the CRDT-bound editorState on their own. Push the new content into the
145
+ // binding, which updates the bound editorState and propagates the edit to Yjs
146
+ // so collaborators see it. crdtBinding.setContent is a no-op while a remote
147
+ // update is being applied and when the content is unchanged, which prevents a
148
+ // remote -> local -> remote echo loop. The bound editorState's content-change
149
+ // listener (above) is responsible for updating `content` and firing onChange.
150
+ function handleChange(newContent: string) {
151
+ if (!crdtBinding) {
152
+ // Binding not ready yet (pre-mount) - fall back to local mirroring.
153
+ content = newContent;
154
+ onChange?.(newContent);
155
+ return;
156
+ }
157
+ crdtBinding.setContent(newContent);
158
+ }
159
+
160
+ // Handle cursor changes
161
+ function handleCursorChange(line: number, column: number) {
162
+ onCursorChange?.(line, column);
163
+
164
+ // Could broadcast cursor position to other collaborators here
165
+ // using Yjs awareness protocol
166
+ }
167
+ </script>
168
+
169
+ <div class="collab-editor {className}">
170
+ {#if editorState}
171
+ <CustomEditor
172
+ {content}
173
+ {language}
174
+ {readonly}
175
+ {preferences}
176
+ onChange={handleChange}
177
+ onCursorChange={handleCursorChange}
178
+ {onSave}
179
+ />
180
+ {:else}
181
+ <div class="collab-editor__loading">
182
+ <span>Initializing collaborative editor...</span>
183
+ </div>
184
+ {/if}
185
+
186
+ <!-- Remote cursors overlay would go here -->
187
+ <div class="collab-editor__cursors">
188
+ <!-- Remote collaborator cursors will be rendered here -->
189
+ </div>
190
+ </div>
191
+
192
+ <style>
193
+ .collab-editor {
194
+ position: relative;
195
+ width: 100%;
196
+ height: 100%;
197
+ }
198
+
199
+ .collab-editor__loading {
200
+ display: flex;
201
+ align-items: center;
202
+ justify-content: center;
203
+ width: 100%;
204
+ height: 100%;
205
+ background: var(--ide-bg-primary);
206
+ color: var(--ide-text-muted);
207
+ }
208
+
209
+ .collab-editor__cursors {
210
+ position: absolute;
211
+ top: 0;
212
+ left: 0;
213
+ right: 0;
214
+ bottom: 0;
215
+ pointer-events: none;
216
+ z-index: 100;
217
+ }
218
+ </style>
@@ -0,0 +1,32 @@
1
+ import * as Y from 'yjs';
2
+ import type { EditorPreferences } from '../../types';
3
+ import type { CollaborationUser } from '../../types/crdt';
4
+ interface Props {
5
+ /** Yjs document for collaboration (optional - will create one if not provided) */
6
+ doc?: Y.Doc;
7
+ /** Document ID for standalone mode */
8
+ documentId?: string;
9
+ /** Initial content when creating a new document */
10
+ initialContent?: string;
11
+ /** Text type name in the Yjs document */
12
+ textName?: string;
13
+ /** Language for syntax highlighting */
14
+ language?: string;
15
+ /** Whether the editor is read-only */
16
+ readonly?: boolean;
17
+ /** Editor preferences */
18
+ preferences?: Partial<EditorPreferences>;
19
+ /** Additional CSS class */
20
+ class?: string;
21
+ /** Current user info for cursor display */
22
+ currentUser?: CollaborationUser;
23
+ /** Called when content changes */
24
+ onChange?: (content: string) => void;
25
+ /** Called when cursor position changes */
26
+ onCursorChange?: (line: number, column: number) => void;
27
+ /** Called when save is triggered (Ctrl+S) */
28
+ onSave?: () => void;
29
+ }
30
+ declare const CollaborativeEditor: import("svelte").Component<Props, {}, "">;
31
+ type CollaborativeEditor = ReturnType<typeof CollaborativeEditor>;
32
+ export default CollaborativeEditor;