@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.
- package/LICENSE +21 -0
- package/README.md +251 -0
- package/dist/components/agents/AgentActivityPanel.svelte +565 -0
- package/dist/components/agents/AgentActivityPanel.svelte.d.ts +24 -0
- package/dist/components/agents/AgentAvatar.svelte +417 -0
- package/dist/components/agents/AgentAvatar.svelte.d.ts +23 -0
- package/dist/components/agents/AgentCursor.svelte +224 -0
- package/dist/components/agents/AgentCursor.svelte.d.ts +35 -0
- package/dist/components/agents/AgentPresenceBar.svelte +261 -0
- package/dist/components/agents/AgentPresenceBar.svelte.d.ts +20 -0
- package/dist/components/agents/index.d.ts +4 -0
- package/dist/components/agents/index.js +5 -0
- package/dist/components/ai/AIConversationList.svelte +524 -0
- package/dist/components/ai/AIConversationList.svelte.d.ts +17 -0
- package/dist/components/ai/AIEditPreview.svelte +132 -0
- package/dist/components/ai/AIEditPreview.svelte.d.ts +8 -0
- package/dist/components/ai/AIInlineEdit.svelte +155 -0
- package/dist/components/ai/AIInlineEdit.svelte.d.ts +10 -0
- package/dist/components/ai/AIMessage.svelte +239 -0
- package/dist/components/ai/AIMessage.svelte.d.ts +13 -0
- package/dist/components/ai/AIMessageActions.svelte +176 -0
- package/dist/components/ai/AIMessageActions.svelte.d.ts +12 -0
- package/dist/components/ai/AIMessageContent.svelte +355 -0
- package/dist/components/ai/AIMessageContent.svelte.d.ts +7 -0
- package/dist/components/ai/AIPanel.svelte +561 -0
- package/dist/components/ai/AIPanel.svelte.d.ts +7 -0
- package/dist/components/ai/AISuggestionWidget.svelte +132 -0
- package/dist/components/ai/AISuggestionWidget.svelte.d.ts +10 -0
- package/dist/components/ai/AIToolCallDisplay.svelte +317 -0
- package/dist/components/ai/AIToolCallDisplay.svelte.d.ts +12 -0
- package/dist/components/ai/index.d.ts +9 -0
- package/dist/components/ai/index.js +10 -0
- package/dist/components/core/Avatar.svelte +110 -0
- package/dist/components/core/Avatar.svelte.d.ts +12 -0
- package/dist/components/core/Badge.svelte +98 -0
- package/dist/components/core/Badge.svelte.d.ts +11 -0
- package/dist/components/core/Button.svelte +175 -0
- package/dist/components/core/Button.svelte.d.ts +18 -0
- package/dist/components/core/ConnectionStatus.svelte +294 -0
- package/dist/components/core/ConnectionStatus.svelte.d.ts +20 -0
- package/dist/components/core/ContextMenu.svelte +176 -0
- package/dist/components/core/ContextMenu.svelte.d.ts +19 -0
- package/dist/components/core/ErrorBoundary.svelte +277 -0
- package/dist/components/core/ErrorBoundary.svelte.d.ts +23 -0
- package/dist/components/core/Icon.svelte +107 -0
- package/dist/components/core/Icon.svelte.d.ts +8 -0
- package/dist/components/core/Input.svelte +138 -0
- package/dist/components/core/Input.svelte.d.ts +20 -0
- package/dist/components/core/Kbd.svelte +34 -0
- package/dist/components/core/Kbd.svelte.d.ts +7 -0
- package/dist/components/core/ResizeHandle.svelte +200 -0
- package/dist/components/core/ResizeHandle.svelte.d.ts +23 -0
- package/dist/components/core/Spinner.svelte +35 -0
- package/dist/components/core/Spinner.svelte.d.ts +7 -0
- package/dist/components/core/Textarea.svelte +112 -0
- package/dist/components/core/Textarea.svelte.d.ts +18 -0
- package/dist/components/core/Tooltip.svelte +103 -0
- package/dist/components/core/Tooltip.svelte.d.ts +11 -0
- package/dist/components/core/index.d.ts +13 -0
- package/dist/components/core/index.js +14 -0
- package/dist/components/editor/AIFocusLayer.svelte +430 -0
- package/dist/components/editor/AIFocusLayer.svelte.d.ts +32 -0
- package/dist/components/editor/Breadcrumbs.svelte +435 -0
- package/dist/components/editor/Breadcrumbs.svelte.d.ts +33 -0
- package/dist/components/editor/BreakpointLayer.svelte +642 -0
- package/dist/components/editor/BreakpointLayer.svelte.d.ts +20 -0
- package/dist/components/editor/CognitiveLoadMeter.svelte +324 -0
- package/dist/components/editor/CognitiveLoadMeter.svelte.d.ts +18 -0
- package/dist/components/editor/CollaborativeEditor.svelte +218 -0
- package/dist/components/editor/CollaborativeEditor.svelte.d.ts +32 -0
- package/dist/components/editor/CommandPalette.svelte +434 -0
- package/dist/components/editor/CommandPalette.svelte.d.ts +11 -0
- package/dist/components/editor/ComplexityLayer.svelte +293 -0
- package/dist/components/editor/ComplexityLayer.svelte.d.ts +23 -0
- package/dist/components/editor/ConflictZoneLayer.svelte +441 -0
- package/dist/components/editor/ConflictZoneLayer.svelte.d.ts +25 -0
- package/dist/components/editor/ContextLens.svelte +262 -0
- package/dist/components/editor/ContextLens.svelte.d.ts +27 -0
- package/dist/components/editor/CustomEditor.svelte +1242 -0
- package/dist/components/editor/CustomEditor.svelte.d.ts +37 -0
- package/dist/components/editor/DebugConsole.svelte +646 -0
- package/dist/components/editor/DebugConsole.svelte.d.ts +41 -0
- package/dist/components/editor/EchoCursorLayer.svelte +363 -0
- package/dist/components/editor/EchoCursorLayer.svelte.d.ts +24 -0
- package/dist/components/editor/Editor.svelte +61 -0
- package/dist/components/editor/Editor.svelte.d.ts +22 -0
- package/dist/components/editor/EditorGutter.svelte +119 -0
- package/dist/components/editor/EditorGutter.svelte.d.ts +19 -0
- package/dist/components/editor/EditorLines.svelte +182 -0
- package/dist/components/editor/EditorLines.svelte.d.ts +43 -0
- package/dist/components/editor/EditorPane.svelte +134 -0
- package/dist/components/editor/EditorPane.svelte.d.ts +9 -0
- package/dist/components/editor/EditorSelections.svelte +186 -0
- package/dist/components/editor/EditorSelections.svelte.d.ts +25 -0
- package/dist/components/editor/EditorTabs.svelte +170 -0
- package/dist/components/editor/EditorTabs.svelte.d.ts +12 -0
- package/dist/components/editor/FileExplorer.svelte +811 -0
- package/dist/components/editor/FileExplorer.svelte.d.ts +67 -0
- package/dist/components/editor/FileIcon.svelte +110 -0
- package/dist/components/editor/FileIcon.svelte.d.ts +10 -0
- package/dist/components/editor/FindReplace.svelte +448 -0
- package/dist/components/editor/FindReplace.svelte.d.ts +40 -0
- package/dist/components/editor/GhostBracketLayer.svelte +391 -0
- package/dist/components/editor/GhostBracketLayer.svelte.d.ts +24 -0
- package/dist/components/editor/GitBlameLayer.svelte +436 -0
- package/dist/components/editor/GitBlameLayer.svelte.d.ts +18 -0
- package/dist/components/editor/InlineDiagnosticsLayer.svelte +540 -0
- package/dist/components/editor/InlineDiagnosticsLayer.svelte.d.ts +35 -0
- package/dist/components/editor/InlineDiffLayer.svelte +337 -0
- package/dist/components/editor/InlineDiffLayer.svelte.d.ts +31 -0
- package/dist/components/editor/MinimalEditor.svelte +75 -0
- package/dist/components/editor/MinimalEditor.svelte.d.ts +6 -0
- package/dist/components/editor/MinimalEditor2.svelte +84 -0
- package/dist/components/editor/MinimalEditor2.svelte.d.ts +6 -0
- package/dist/components/editor/Minimap.svelte +327 -0
- package/dist/components/editor/Minimap.svelte.d.ts +34 -0
- package/dist/components/editor/PluginPreviewSandbox.svelte +793 -0
- package/dist/components/editor/PluginPreviewSandbox.svelte.d.ts +49 -0
- package/dist/components/editor/ProblemsPanel.svelte +628 -0
- package/dist/components/editor/ProblemsPanel.svelte.d.ts +25 -0
- package/dist/components/editor/QuickActionsMenu.svelte +403 -0
- package/dist/components/editor/QuickActionsMenu.svelte.d.ts +18 -0
- package/dist/components/editor/SnippetPalette.svelte +530 -0
- package/dist/components/editor/SnippetPalette.svelte.d.ts +16 -0
- package/dist/components/editor/StructureMap.svelte +431 -0
- package/dist/components/editor/StructureMap.svelte.d.ts +37 -0
- package/dist/components/editor/SymbolOutline.svelte +722 -0
- package/dist/components/editor/SymbolOutline.svelte.d.ts +44 -0
- package/dist/components/editor/TimelineScrubber.svelte +470 -0
- package/dist/components/editor/TimelineScrubber.svelte.d.ts +40 -0
- package/dist/components/editor/TokenRenderer.svelte +69 -0
- package/dist/components/editor/TokenRenderer.svelte.d.ts +15 -0
- package/dist/components/editor/constants.d.ts +32 -0
- package/dist/components/editor/constants.js +36 -0
- package/dist/components/editor/core/ai-awareness.d.ts +176 -0
- package/dist/components/editor/core/ai-awareness.js +210 -0
- package/dist/components/editor/core/bracket-healer.d.ts +189 -0
- package/dist/components/editor/core/bracket-healer.js +406 -0
- package/dist/components/editor/core/breakpoints.d.ts +203 -0
- package/dist/components/editor/core/breakpoints.js +414 -0
- package/dist/components/editor/core/commands.d.ts +108 -0
- package/dist/components/editor/core/commands.js +246 -0
- package/dist/components/editor/core/complexity-analyzer.d.ts +123 -0
- package/dist/components/editor/core/complexity-analyzer.js +376 -0
- package/dist/components/editor/core/conflict-predictor.d.ts +135 -0
- package/dist/components/editor/core/conflict-predictor.js +316 -0
- package/dist/components/editor/core/crdt-binding.d.ts +118 -0
- package/dist/components/editor/core/crdt-binding.js +286 -0
- package/dist/components/editor/core/diagnostics.d.ts +210 -0
- package/dist/components/editor/core/diagnostics.js +335 -0
- package/dist/components/editor/core/echo-cursor.d.ts +201 -0
- package/dist/components/editor/core/echo-cursor.js +267 -0
- package/dist/components/editor/core/folding.d.ts +124 -0
- package/dist/components/editor/core/folding.js +672 -0
- package/dist/components/editor/core/ghost-pair.d.ts +122 -0
- package/dist/components/editor/core/ghost-pair.js +221 -0
- package/dist/components/editor/core/git-blame.d.ts +170 -0
- package/dist/components/editor/core/git-blame.js +324 -0
- package/dist/components/editor/core/index.d.ts +26 -0
- package/dist/components/editor/core/index.js +24 -0
- package/dist/components/editor/core/keybindings.d.ts +79 -0
- package/dist/components/editor/core/keybindings.js +357 -0
- package/dist/components/editor/core/multi-cursor.d.ts +196 -0
- package/dist/components/editor/core/multi-cursor.js +521 -0
- package/dist/components/editor/core/navigation.d.ts +107 -0
- package/dist/components/editor/core/navigation.js +408 -0
- package/dist/components/editor/core/quick-actions.d.ts +189 -0
- package/dist/components/editor/core/quick-actions.js +427 -0
- package/dist/components/editor/core/search.d.ts +88 -0
- package/dist/components/editor/core/search.js +192 -0
- package/dist/components/editor/core/semantic-analyzer.d.ts +77 -0
- package/dist/components/editor/core/semantic-analyzer.js +424 -0
- package/dist/components/editor/core/snippet-manager.d.ts +202 -0
- package/dist/components/editor/core/snippet-manager.js +565 -0
- package/dist/components/editor/core/state.d.ts +367 -0
- package/dist/components/editor/core/state.js +900 -0
- package/dist/components/editor/core/timeline.d.ts +204 -0
- package/dist/components/editor/core/timeline.js +349 -0
- package/dist/components/editor/editor-find.d.ts +56 -0
- package/dist/components/editor/editor-find.js +148 -0
- package/dist/components/editor/editor-input.d.ts +77 -0
- package/dist/components/editor/editor-input.js +445 -0
- package/dist/components/editor/editor-multicursor.d.ts +21 -0
- package/dist/components/editor/editor-multicursor.js +196 -0
- package/dist/components/editor/editor-scroll.d.ts +14 -0
- package/dist/components/editor/editor-scroll.js +34 -0
- package/dist/components/editor/index.d.ts +15 -0
- package/dist/components/editor/index.js +21 -0
- package/dist/components/editor/languages.d.ts +62 -0
- package/dist/components/editor/languages.js +285 -0
- package/dist/components/editor/theme.d.ts +88 -0
- package/dist/components/editor/theme.js +139 -0
- package/dist/components/editor/tokenizer/base.d.ts +40 -0
- package/dist/components/editor/tokenizer/base.js +203 -0
- package/dist/components/editor/tokenizer/index.d.ts +56 -0
- package/dist/components/editor/tokenizer/index.js +215 -0
- package/dist/components/editor/tokenizer/languages/css.d.ts +17 -0
- package/dist/components/editor/tokenizer/languages/css.js +194 -0
- package/dist/components/editor/tokenizer/languages/go.d.ts +17 -0
- package/dist/components/editor/tokenizer/languages/go.js +220 -0
- package/dist/components/editor/tokenizer/languages/html.d.ts +24 -0
- package/dist/components/editor/tokenizer/languages/html.js +145 -0
- package/dist/components/editor/tokenizer/languages/javascript.d.ts +56 -0
- package/dist/components/editor/tokenizer/languages/javascript.js +452 -0
- package/dist/components/editor/tokenizer/languages/json.d.ts +12 -0
- package/dist/components/editor/tokenizer/languages/json.js +91 -0
- package/dist/components/editor/tokenizer/languages/markdown.d.ts +16 -0
- package/dist/components/editor/tokenizer/languages/markdown.js +156 -0
- package/dist/components/editor/tokenizer/languages/python.d.ts +20 -0
- package/dist/components/editor/tokenizer/languages/python.js +227 -0
- package/dist/components/editor/tokenizer/languages/svelte.d.ts +40 -0
- package/dist/components/editor/tokenizer/languages/svelte.js +326 -0
- package/dist/components/editor/tokenizer/types.d.ts +86 -0
- package/dist/components/editor/tokenizer/types.js +4 -0
- package/dist/components/layout/IDELayout.svelte +274 -0
- package/dist/components/layout/IDELayout.svelte.d.ts +29 -0
- package/dist/components/layout/StatusBar.svelte +511 -0
- package/dist/components/layout/StatusBar.svelte.d.ts +47 -0
- package/dist/components/layout/index.d.ts +2 -0
- package/dist/components/layout/index.js +3 -0
- package/dist/components/lsp/AutocompleteWidget.svelte +364 -0
- package/dist/components/lsp/AutocompleteWidget.svelte.d.ts +33 -0
- package/dist/components/lsp/DiagnosticMarker.svelte +166 -0
- package/dist/components/lsp/DiagnosticMarker.svelte.d.ts +19 -0
- package/dist/components/lsp/DiagnosticsPanel.svelte +388 -0
- package/dist/components/lsp/DiagnosticsPanel.svelte.d.ts +21 -0
- package/dist/components/lsp/HoverTooltip.svelte +274 -0
- package/dist/components/lsp/HoverTooltip.svelte.d.ts +24 -0
- package/dist/components/lsp/LSPEditor.svelte +486 -0
- package/dist/components/lsp/LSPEditor.svelte.d.ts +39 -0
- package/dist/components/lsp/SignatureHelpWidget.svelte +216 -0
- package/dist/components/lsp/SignatureHelpWidget.svelte.d.ts +22 -0
- package/dist/components/lsp/index.d.ts +6 -0
- package/dist/components/lsp/index.js +7 -0
- package/dist/components/plugins/PluginCard.svelte +153 -0
- package/dist/components/plugins/PluginCard.svelte.d.ts +19 -0
- package/dist/components/plugins/PluginPanel.svelte +280 -0
- package/dist/components/plugins/PluginPanel.svelte.d.ts +8 -0
- package/dist/components/plugins/PluginProposalForm.svelte +250 -0
- package/dist/components/plugins/PluginProposalForm.svelte.d.ts +6 -0
- package/dist/components/plugins/PluginStatusBadge.svelte +14 -0
- package/dist/components/plugins/PluginStatusBadge.svelte.d.ts +8 -0
- package/dist/components/plugins/index.d.ts +4 -0
- package/dist/components/plugins/index.js +5 -0
- package/dist/components/vfs/LockConflictDialog.svelte +705 -0
- package/dist/components/vfs/LockConflictDialog.svelte.d.ts +21 -0
- package/dist/components/vfs/LockIndicator.svelte +194 -0
- package/dist/components/vfs/LockIndicator.svelte.d.ts +29 -0
- package/dist/components/vfs/LockOverlay.svelte +344 -0
- package/dist/components/vfs/LockOverlay.svelte.d.ts +17 -0
- package/dist/components/vfs/VersionConflictDialog.svelte +549 -0
- package/dist/components/vfs/VersionConflictDialog.svelte.d.ts +24 -0
- package/dist/components/vfs/index.d.ts +4 -0
- package/dist/components/vfs/index.js +5 -0
- package/dist/crdt/awareness.d.ts +42 -0
- package/dist/crdt/awareness.js +109 -0
- package/dist/crdt/document.d.ts +101 -0
- package/dist/crdt/document.js +187 -0
- package/dist/crdt/index.d.ts +9 -0
- package/dist/crdt/index.js +8 -0
- package/dist/crdt/provider.d.ts +85 -0
- package/dist/crdt/provider.js +150 -0
- package/dist/crdt/types.d.ts +61 -0
- package/dist/crdt/types.js +4 -0
- package/dist/crdt/undo.d.ts +34 -0
- package/dist/crdt/undo.js +70 -0
- package/dist/index.d.ts +277 -0
- package/dist/index.js +280 -0
- package/dist/plugins/index.d.ts +103 -0
- package/dist/plugins/index.js +153 -0
- package/dist/services/error-handling.d.ts +95 -0
- package/dist/services/error-handling.js +413 -0
- package/dist/services/ide-integration.d.ts +83 -0
- package/dist/services/ide-integration.js +367 -0
- package/dist/services/lsp-client.d.ts +69 -0
- package/dist/services/lsp-client.js +667 -0
- package/dist/services/mock-ai.d.ts +37 -0
- package/dist/services/mock-ai.js +318 -0
- package/dist/services/optimistic.d.ts +141 -0
- package/dist/services/optimistic.js +367 -0
- package/dist/services/vfs-client.d.ts +81 -0
- package/dist/services/vfs-client.js +348 -0
- package/dist/stores/agents.svelte.d.ts +85 -0
- package/dist/stores/agents.svelte.js +459 -0
- package/dist/stores/ai-persistence.svelte.d.ts +76 -0
- package/dist/stores/ai-persistence.svelte.js +334 -0
- package/dist/stores/ai.svelte.d.ts +140 -0
- package/dist/stores/ai.svelte.js +383 -0
- package/dist/stores/collaboration.svelte.d.ts +164 -0
- package/dist/stores/collaboration.svelte.js +334 -0
- package/dist/stores/editor.svelte.d.ts +131 -0
- package/dist/stores/editor.svelte.js +250 -0
- package/dist/stores/index.d.ts +10 -0
- package/dist/stores/index.js +29 -0
- package/dist/stores/layout.svelte.d.ts +171 -0
- package/dist/stores/layout.svelte.js +351 -0
- package/dist/stores/plugin.svelte.d.ts +121 -0
- package/dist/stores/plugin.svelte.js +410 -0
- package/dist/stores/vfs.svelte.d.ts +123 -0
- package/dist/stores/vfs.svelte.js +680 -0
- package/dist/styles/theme.css +623 -0
- package/dist/types/agents.d.ts +127 -0
- package/dist/types/agents.js +5 -0
- package/dist/types/ai.d.ts +137 -0
- package/dist/types/ai.js +4 -0
- package/dist/types/crdt.d.ts +222 -0
- package/dist/types/crdt.js +5 -0
- package/dist/types/editor.d.ts +52 -0
- package/dist/types/editor.js +18 -0
- package/dist/types/events.d.ts +133 -0
- package/dist/types/events.js +4 -0
- package/dist/types/filesystem.d.ts +77 -0
- package/dist/types/filesystem.js +4 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.js +12 -0
- package/dist/types/lsp.d.ts +691 -0
- package/dist/types/lsp.js +108 -0
- package/dist/types/plugin.d.ts +239 -0
- package/dist/types/plugin.js +5 -0
- package/dist/types/vfs.d.ts +191 -0
- package/dist/types/vfs.js +18 -0
- package/dist/utils/format.d.ts +55 -0
- package/dist/utils/format.js +152 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/keybindings.d.ts +33 -0
- package/dist/utils/keybindings.js +171 -0
- package/dist/utils/language.d.ts +27 -0
- package/dist/utils/language.js +222 -0
- 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;
|