@eclipse-lyra/extension-notebook 0.7.39 → 0.7.41

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/dist/index.js CHANGED
@@ -6,7 +6,7 @@ extensionRegistry.registerExtension({
6
6
  id: pkg.name,
7
7
  name: t.EXT_NOTEBOOK_NAME,
8
8
  description: t.EXT_NOTEBOOK_DESC,
9
- loader: () => import("./notebook-extension-DNAFwHgc.js"),
9
+ loader: () => import("./notebook-extension-DLfnTq-y.js"),
10
10
  icon: "lyra jupyter",
11
11
  dependencies: []
12
12
  });
@@ -89,13 +89,13 @@ const notebookExtension = ({ editorRegistry, commandRegistry, contributionRegist
89
89
  editorId: "system.notebooeditor",
90
90
  label: "Jupyter Notebook",
91
91
  icon: "lyra jupyter",
92
- lazyInit: () => import("./notebook-runtime-DFffRmNN.js"),
92
+ lazyInit: () => import("./notebook-runtime-CbWJycgO.js"),
93
93
  canHandle: (input) => input instanceof File && input.getName().toLowerCase().endsWith(".ipynb"),
94
94
  handle: async (input) => {
95
95
  const editorInput = {
96
- title: input.getName(),
96
+ title: input.getWorkspacePath(),
97
97
  data: input,
98
- key: input.getName(),
98
+ key: input.getWorkspacePath(),
99
99
  icon: "lyra jupyter",
100
100
  noOverflow: true,
101
101
  state: {}
@@ -121,4 +121,4 @@ const notebookExtension = ({ editorRegistry, commandRegistry, contributionRegist
121
121
  export {
122
122
  notebookExtension as default
123
123
  };
124
- //# sourceMappingURL=notebook-extension-DNAFwHgc.js.map
124
+ //# sourceMappingURL=notebook-extension-DLfnTq-y.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"notebook-extension-DNAFwHgc.js","sources":["../src/javascript-kernel.ts","../src/notebook-extension.ts"],"sourcesContent":["import { createJsRuntime, type JsRuntime } from '@eclipse-lyra/core';\nimport type { NotebookExecutionResult, NotebookKernel, NotebookKernelContribution } from './notebook-kernel-api';\n\nclass JavaScriptNotebookKernel implements NotebookKernel {\n readonly id = 'javascript';\n readonly label = 'JavaScript';\n readonly language = 'javascript';\n\n private runtime: JsRuntime | null = null;\n\n private getRuntime(): JsRuntime {\n if (!this.runtime) {\n this.runtime = createJsRuntime();\n }\n return this.runtime;\n }\n\n async getVersion(): Promise<string> {\n return 'JavaScript';\n }\n\n async execute(code: string): Promise<NotebookExecutionResult> {\n try {\n const result = await this.getRuntime().execute(code);\n if (result === undefined || result === null) {\n return {};\n }\n return { data: String(result) };\n } catch (err) {\n return { error: err instanceof Error ? err.message : String(err) };\n }\n }\n\n close(): void {\n if (this.runtime) {\n this.runtime.close();\n this.runtime = null;\n }\n }\n}\n\nexport const javascriptKernelContribution: NotebookKernelContribution = {\n id: 'javascript',\n label: 'JavaScript',\n language: 'javascript',\n loadKernel: async (): Promise<NotebookKernel> => new JavaScriptNotebookKernel(),\n};\n","import { html } from \"lit\";\nimport type { EditorInput } from \"@eclipse-lyra/core\";\nimport { File } from \"@eclipse-lyra/core\";\nimport { activeEditorSignal } from \"@eclipse-lyra/core\";\nimport type { ExecutionContext } from \"@eclipse-lyra/core\";\nimport { NotebookData, isNotebookEditorLike } from \"./notebook-types\";\nimport { TARGET_NOTEBOOK_KERNELS } from \"./notebook-kernel-api\";\nimport { javascriptKernelContribution } from \"./javascript-kernel\";\n\nexport default ({ editorRegistry, commandRegistry, contributionRegistry }: any) => {\n contributionRegistry.registerContribution(TARGET_NOTEBOOK_KERNELS, javascriptKernelContribution);\n\n const INITIAL_NOTEBOOK_CONTENT: NotebookData = {\n cells: [\n {\n cell_type: 'markdown',\n source: ['Press the **Run** button in the code cell below to execute it.'],\n metadata: {}\n },\n {\n cell_type: 'code',\n source: ['self.postMessage(\"Hello, World!\")'],\n execution_count: null,\n outputs: [],\n metadata: {}\n }\n ],\n metadata: { kernel: 'javascript' },\n nbformat: 4,\n nbformat_minor: 4\n };\n commandRegistry.registerHandler('notebook.runCell', {\n ranking: 10,\n canExecute: (context: ExecutionContext) => {\n const activeEditor = activeEditorSignal.get();\n if (isNotebookEditorLike(activeEditor)) {\n const cellIndex = context.params?.cellIndex;\n if (cellIndex !== undefined) {\n return cellIndex >= 0 && cellIndex < (activeEditor.notebook?.cells.length ?? 0);\n }\n return activeEditor.focusedCellIndex >= 0;\n }\n return false;\n },\n execute: async (context: ExecutionContext) => {\n const activeEditor = activeEditorSignal.get();\n if (isNotebookEditorLike(activeEditor)) {\n const cellIndex = context.params?.cellIndex ?? activeEditor.focusedCellIndex;\n if (cellIndex >= 0) {\n await activeEditor.executeCell(cellIndex);\n }\n }\n }\n });\n\n editorRegistry.registerEditorInputHandler({\n editorId: \"system.notebooeditor\",\n label: \"Jupyter Notebook\",\n icon: \"lyra jupyter\",\n lazyInit: () => import('./notebook-runtime'),\n canHandle: (input: any) => input instanceof File && input.getName().toLowerCase().endsWith(\".ipynb\"),\n handle: async (input: File) => {\n const editorInput = {\n title: input.getName(),\n data: input,\n key: input.getName(),\n icon: \"lyra jupyter\",\n noOverflow: true,\n state: {},\n } as EditorInput;\n editorInput.component = () => html`\n <lyra-notebook-editor .input=${editorInput}></lyra-notebook-editor>`;\n return editorInput;\n },\n ranking: 100,\n });\n\n contributionRegistry.registerContribution('filebrowser.create', {\n label: 'Jupyter Notebook',\n icon: 'lyra jupyter',\n command: 'touch',\n params: {\n path: \"notebook.ipynb\",\n extension: '.ipynb',\n ask: true,\n contents: JSON.stringify(INITIAL_NOTEBOOK_CONTENT, null, 2)\n }\n });\n};\n\n\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notebook-extension-DLfnTq-y.js","sources":["../src/javascript-kernel.ts","../src/notebook-extension.ts"],"sourcesContent":["import { createJsRuntime, type JsRuntime } from '@eclipse-lyra/core';\nimport type { NotebookExecutionResult, NotebookKernel, NotebookKernelContribution } from './notebook-kernel-api';\n\nclass JavaScriptNotebookKernel implements NotebookKernel {\n readonly id = 'javascript';\n readonly label = 'JavaScript';\n readonly language = 'javascript';\n\n private runtime: JsRuntime | null = null;\n\n private getRuntime(): JsRuntime {\n if (!this.runtime) {\n this.runtime = createJsRuntime();\n }\n return this.runtime;\n }\n\n async getVersion(): Promise<string> {\n return 'JavaScript';\n }\n\n async execute(code: string): Promise<NotebookExecutionResult> {\n try {\n const result = await this.getRuntime().execute(code);\n if (result === undefined || result === null) {\n return {};\n }\n return { data: String(result) };\n } catch (err) {\n return { error: err instanceof Error ? err.message : String(err) };\n }\n }\n\n close(): void {\n if (this.runtime) {\n this.runtime.close();\n this.runtime = null;\n }\n }\n}\n\nexport const javascriptKernelContribution: NotebookKernelContribution = {\n id: 'javascript',\n label: 'JavaScript',\n language: 'javascript',\n loadKernel: async (): Promise<NotebookKernel> => new JavaScriptNotebookKernel(),\n};\n","import { html } from \"lit\";\nimport type { EditorInput } from \"@eclipse-lyra/core\";\nimport { File } from \"@eclipse-lyra/core\";\nimport { activeEditorSignal } from \"@eclipse-lyra/core\";\nimport type { ExecutionContext } from \"@eclipse-lyra/core\";\nimport { NotebookData, isNotebookEditorLike } from \"./notebook-types\";\nimport { TARGET_NOTEBOOK_KERNELS } from \"./notebook-kernel-api\";\nimport { javascriptKernelContribution } from \"./javascript-kernel\";\n\nexport default ({ editorRegistry, commandRegistry, contributionRegistry }: any) => {\n contributionRegistry.registerContribution(TARGET_NOTEBOOK_KERNELS, javascriptKernelContribution);\n\n const INITIAL_NOTEBOOK_CONTENT: NotebookData = {\n cells: [\n {\n cell_type: 'markdown',\n source: ['Press the **Run** button in the code cell below to execute it.'],\n metadata: {}\n },\n {\n cell_type: 'code',\n source: ['self.postMessage(\"Hello, World!\")'],\n execution_count: null,\n outputs: [],\n metadata: {}\n }\n ],\n metadata: { kernel: 'javascript' },\n nbformat: 4,\n nbformat_minor: 4\n };\n commandRegistry.registerHandler('notebook.runCell', {\n ranking: 10,\n canExecute: (context: ExecutionContext) => {\n const activeEditor = activeEditorSignal.get();\n if (isNotebookEditorLike(activeEditor)) {\n const cellIndex = context.params?.cellIndex;\n if (cellIndex !== undefined) {\n return cellIndex >= 0 && cellIndex < (activeEditor.notebook?.cells.length ?? 0);\n }\n return activeEditor.focusedCellIndex >= 0;\n }\n return false;\n },\n execute: async (context: ExecutionContext) => {\n const activeEditor = activeEditorSignal.get();\n if (isNotebookEditorLike(activeEditor)) {\n const cellIndex = context.params?.cellIndex ?? activeEditor.focusedCellIndex;\n if (cellIndex >= 0) {\n await activeEditor.executeCell(cellIndex);\n }\n }\n }\n });\n\n editorRegistry.registerEditorInputHandler({\n editorId: \"system.notebooeditor\",\n label: \"Jupyter Notebook\",\n icon: \"lyra jupyter\",\n lazyInit: () => import('./notebook-runtime'),\n canHandle: (input: any) => input instanceof File && input.getName().toLowerCase().endsWith(\".ipynb\"),\n handle: async (input: File) => {\n const editorInput = {\n title: input.getWorkspacePath(),\n data: input,\n key: input.getWorkspacePath(),\n icon: \"lyra jupyter\",\n noOverflow: true,\n state: {},\n } as EditorInput;\n editorInput.component = () => html`\n <lyra-notebook-editor .input=${editorInput}></lyra-notebook-editor>`;\n return editorInput;\n },\n ranking: 100,\n });\n\n contributionRegistry.registerContribution('filebrowser.create', {\n label: 'Jupyter Notebook',\n icon: 'lyra jupyter',\n command: 'touch',\n params: {\n path: \"notebook.ipynb\",\n extension: '.ipynb',\n ask: true,\n contents: JSON.stringify(INITIAL_NOTEBOOK_CONTENT, null, 2)\n }\n });\n};\n\n\n"],"names":[],"mappings":"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"}
@@ -1,12 +1,10 @@
1
1
  import { html, css } from "lit";
2
2
  import { property, state, customElement } from "lit/decorators.js";
3
- import { createRef, ref } from "lit/directives/ref.js";
3
+ import { ref, createRef } from "lit/directives/ref.js";
4
4
  import { repeat } from "lit/directives/repeat.js";
5
5
  import { styleMap } from "lit/directives/style-map.js";
6
6
  import { unsafeHTML } from "lit/directives/unsafe-html.js";
7
7
  import { marked } from "marked";
8
- import * as monaco from "monaco-editor";
9
- import monacoStyles from "monaco-editor/min/vs/editor/editor.main.css?raw";
10
8
  import { LyraPart, unsubscribe, subscribe, TOPIC_CONTRIBUTEIONS_CHANGED, contributionRegistry, createLogger } from "@eclipse-lyra/core";
11
9
  import { T as TARGET_NOTEBOOK_KERNELS } from "./notebook-kernel-api--RBL5TaE.js";
12
10
  var __defProp = Object.defineProperty;
@@ -37,22 +35,17 @@ let LyraNotebookEditor = class extends LyraPart {
37
35
  this.highlightedCellIndex = -1;
38
36
  this.focusedCellIndex = -1;
39
37
  this.cancelRunAll = false;
40
- this.monacoEditors = /* @__PURE__ */ new Map();
41
- this.cellRefs = /* @__PURE__ */ new Map();
38
+ this.cellWidgetRefs = /* @__PURE__ */ new Map();
39
+ this.cellHeights = /* @__PURE__ */ new Map();
42
40
  }
43
41
  doClose() {
44
42
  this.input = void 0;
45
43
  this.notebook = void 0;
46
44
  this.cellOutputs.clear();
47
45
  this.executingCells.clear();
48
- this.monacoEditors.forEach((editor) => editor.dispose());
49
- this.monacoEditors.clear();
50
- this.cellRefs.clear();
46
+ this.cellWidgetRefs.clear();
47
+ this.cellHeights.clear();
51
48
  this.focusedCellIndex = -1;
52
- if (this.themeObserver) {
53
- this.themeObserver.disconnect();
54
- this.themeObserver = void 0;
55
- }
56
49
  if (this.unsubscribeContributionsToken) {
57
50
  unsubscribe(this.unsubscribeContributionsToken);
58
51
  this.unsubscribeContributionsToken = void 0;
@@ -232,7 +225,6 @@ let LyraNotebookEditor = class extends LyraPart {
232
225
  }
233
226
  }
234
227
  async doInitUI() {
235
- this.setupThemeObserver();
236
228
  this.unsubscribeContributionsToken = subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event) => {
237
229
  if (event?.target === TARGET_NOTEBOOK_KERNELS) {
238
230
  void this.refreshKernels();
@@ -331,21 +323,6 @@ let LyraNotebookEditor = class extends LyraPart {
331
323
  }
332
324
  void this.refreshKernels();
333
325
  }
334
- setupThemeObserver() {
335
- const rootElement = document.documentElement;
336
- let currentTheme = this.getMonacoTheme();
337
- this.themeObserver = new MutationObserver(() => {
338
- const newTheme = this.getMonacoTheme();
339
- if (newTheme !== currentTheme) {
340
- currentTheme = newTheme;
341
- monaco.editor.setTheme(newTheme);
342
- }
343
- });
344
- this.themeObserver.observe(rootElement, {
345
- attributes: true,
346
- attributeFilter: ["class"]
347
- });
348
- }
349
326
  getCellSource(cell) {
350
327
  return Array.isArray(cell.source) ? cell.source.join("") : cell.source;
351
328
  }
@@ -455,8 +432,9 @@ let LyraNotebookEditor = class extends LyraPart {
455
432
  }
456
433
  return;
457
434
  }
458
- const editor = this.monacoEditors.get(cellIndex);
459
- const code = editor ? editor.getValue() : this.getCellSource(cell);
435
+ const widget = this.getCellWidgetRef(cellIndex).value;
436
+ const code = widget ? widget.getContent() : this.getCellSource(cell);
437
+ if (code === null || code === void 0) return;
460
438
  const result = await k.execute(code);
461
439
  if (result.error) {
462
440
  this.cellOutputs.set(cellIndex, { type: "error", data: result.error });
@@ -662,10 +640,11 @@ let LyraNotebookEditor = class extends LyraPart {
662
640
  renderCodeCell(cell, index) {
663
641
  const output = this.cellOutputs.get(index);
664
642
  const isExecuting = this.executingCells.has(index);
665
- if (!this.cellRefs.has(index)) {
666
- this.cellRefs.set(index, createRef());
667
- }
668
- const cellRef = this.cellRefs.get(index);
643
+ const source = this.getCellSource(cell);
644
+ const language = this.kernel?.language ?? "javascript";
645
+ const notebookPath = this.input?.data?.getWorkspacePath?.() ?? "notebook";
646
+ const cellUri = `${notebookPath}-cell-${index}`;
647
+ const cellHeight = this.cellHeights.get(index) ?? Math.max(100, source.split("\n").length * 19 + 10);
669
648
  const runButton = isExecuting ? html`
670
649
  <wa-button
671
650
  size="small"
@@ -705,7 +684,27 @@ let LyraNotebookEditor = class extends LyraPart {
705
684
  </span>
706
685
  ${this.renderHeaderActions(index, runButton)}
707
686
  </div>
708
- <div class="cell-input monaco-container" ${ref(cellRef)} data-cell-index="${index}"></div>
687
+ <div
688
+ class="cell-input monaco-container"
689
+ style=${styleMap({ height: `${cellHeight}px` })}
690
+ @wheel=${(e) => this.onCellWheel(index, e)}
691
+ >
692
+ <lyra-monaco-widget
693
+ .value=${source}
694
+ .language=${language}
695
+ .uri=${cellUri}
696
+ ?autoLayout=${true}
697
+ @content-change=${() => this.markDirty(true)}
698
+ @editor-focus=${() => {
699
+ this.focusedCellIndex = index;
700
+ }}
701
+ @editor-blur=${() => {
702
+ if (this.focusedCellIndex === index) this.focusedCellIndex = -1;
703
+ }}
704
+ @content-height-changed=${(e) => this.onCellHeightChange(index, e.detail.height)}
705
+ ${ref(this.getCellWidgetRef(index))}
706
+ ></lyra-monaco-widget>
707
+ </div>
709
708
  ${output ? html`
710
709
  <div class="cell-output ${output.type === "error" ? "output-error" : ""}">
711
710
  <div class="output-label">Out [${index + 1}]:</div>
@@ -771,17 +770,16 @@ let LyraNotebookEditor = class extends LyraPart {
771
770
  });
772
771
  }
773
772
  saveEditorContents() {
774
- this.monacoEditors.forEach((editor, index) => {
775
- const cell = this.notebook.cells[index];
776
- if (cell && cell.cell_type === "code") {
777
- cell.source = this.stringToSourceArray(editor.getValue());
773
+ this.notebook?.cells.forEach((cell, index) => {
774
+ if (cell.cell_type !== "code") return;
775
+ const widget = this.getCellWidgetRef(index).value;
776
+ const value = widget?.getContent();
777
+ if (value !== void 0 && value !== null) {
778
+ cell.source = this.stringToSourceArray(value);
778
779
  }
779
780
  });
780
781
  }
781
782
  resetCellState() {
782
- this.monacoEditors.forEach((editor) => editor.dispose());
783
- this.monacoEditors.clear();
784
- this.cellRefs.clear();
785
783
  this.markDirty(true);
786
784
  }
787
785
  deleteCell(index) {
@@ -816,74 +814,38 @@ let LyraNotebookEditor = class extends LyraPart {
816
814
  shiftMap(this.cellOutputs);
817
815
  shiftSet(this.executingCells);
818
816
  shiftSet(this.editingMarkdownCells);
817
+ shiftMap(this.cellWidgetRefs);
818
+ shiftMap(this.cellHeights);
819
819
  }
820
- initializeMonacoEditor(container, cell, index) {
821
- const source = this.getCellSource(cell);
822
- const lineCount = source.split("\n").length;
823
- const lineHeight = 19;
820
+ getCellWidgetRef(index) {
821
+ if (!this.cellWidgetRefs.has(index)) {
822
+ this.cellWidgetRefs.set(index, createRef());
823
+ }
824
+ return this.cellWidgetRefs.get(index);
825
+ }
826
+ onCellHeightChange(index, height) {
824
827
  const padding = 10;
825
828
  const minHeight = 100;
826
- const calculatedHeight = Math.max(minHeight, lineCount * lineHeight + padding);
827
- container.style.height = `${calculatedHeight}px`;
828
- const language = this.kernel?.language ?? "javascript";
829
- const editor = monaco.editor.create(container, {
830
- value: source,
831
- language,
832
- theme: this.getMonacoTheme(),
833
- minimap: { enabled: false },
834
- scrollBeyondLastLine: false,
835
- lineNumbers: "on",
836
- renderLineHighlight: "all",
837
- automaticLayout: true,
838
- fontSize: 14,
839
- tabSize: 4,
840
- wordWrap: "on"
841
- });
842
- let isEditorFocused = false;
843
- editor.onDidFocusEditorText(() => {
844
- isEditorFocused = true;
845
- this.focusedCellIndex = index;
846
- });
847
- editor.onDidBlurEditorText(() => {
848
- isEditorFocused = false;
849
- if (this.focusedCellIndex === index) {
850
- this.focusedCellIndex = -1;
851
- }
852
- });
853
- container.addEventListener("wheel", (e) => {
854
- if (!isEditorFocused) {
855
- const scrollTop = editor.getScrollTop();
856
- const scrollHeight = editor.getScrollHeight();
857
- const contentHeight = editor.getContentHeight();
858
- const canScroll = scrollHeight > contentHeight;
859
- const atBoundary = e.deltaY < 0 && scrollTop <= 0 || e.deltaY > 0 && scrollTop + contentHeight >= scrollHeight;
860
- if (!canScroll || atBoundary) {
861
- e.stopImmediatePropagation();
862
- }
863
- }
864
- }, { passive: true, capture: true });
865
- editor.onDidContentSizeChange(() => {
866
- const contentHeight = editor.getContentHeight();
867
- container.style.height = `${Math.max(minHeight, contentHeight + padding)}px`;
868
- editor.layout();
869
- });
870
- editor.onDidChangeModelContent(() => {
871
- const currentValue = editor.getValue();
872
- const originalValue = this.getCellSource(cell);
873
- if (currentValue !== originalValue) {
874
- this.markDirty(true);
875
- }
876
- });
877
- this.monacoEditors.set(index, editor);
829
+ const newHeight = Math.max(minHeight, height + padding);
830
+ const current = this.cellHeights.get(index);
831
+ if (current === newHeight) return;
832
+ this.cellHeights = new Map(this.cellHeights);
833
+ this.cellHeights.set(index, newHeight);
834
+ this.requestUpdate();
835
+ this.updateComplete.then(() => this.getCellWidgetRef(index).value?.layout?.());
878
836
  }
879
- getMonacoTheme() {
880
- const rootElement = document.documentElement;
881
- if (rootElement.classList.contains("wa-dark")) {
882
- return "vs-dark";
883
- } else if (rootElement.classList.contains("wa-light")) {
884
- return "vs";
837
+ onCellWheel(index, e) {
838
+ const widget = this.getCellWidgetRef(index).value;
839
+ const editor = widget?.getEditor();
840
+ if (!editor) return;
841
+ const scrollTop = editor.getScrollTop();
842
+ const scrollHeight = editor.getScrollHeight();
843
+ const contentHeight = editor.getContentHeight();
844
+ const canScroll = scrollHeight > contentHeight;
845
+ const atBoundary = e.deltaY < 0 && scrollTop <= 0 || e.deltaY > 0 && scrollTop + contentHeight >= scrollHeight;
846
+ if (!canScroll || atBoundary) {
847
+ e.stopImmediatePropagation();
885
848
  }
886
- return "vs-dark";
887
849
  }
888
850
  openPackageManager() {
889
851
  if (!this.kernel?.openPackageManager) return;
@@ -914,25 +876,12 @@ let LyraNotebookEditor = class extends LyraPart {
914
876
  if (changedProperties.has("kernelConnected") || changedProperties.has("kernelConnecting") || changedProperties.has("kernelVersion") || changedProperties.has("isRunningAll") || changedProperties.has("availableKernels") || changedProperties.has("selectedKernelId")) {
915
877
  this.updateToolbar();
916
878
  }
917
- if (this.notebook?.cells) {
918
- this.notebook.cells.forEach((cell, index) => {
919
- if (cell.cell_type === "code") {
920
- const ref2 = this.cellRefs.get(index);
921
- if (ref2?.value && !this.monacoEditors.has(index)) {
922
- this.initializeMonacoEditor(ref2.value, cell, index);
923
- }
924
- }
925
- });
926
- }
927
879
  }
928
880
  render() {
929
881
  if (!this.notebook) {
930
882
  return html`<div class="loading">Loading notebook...</div>`;
931
883
  }
932
884
  return html`
933
- <style>
934
- ${monacoStyles}
935
- </style>
936
885
  <div class="noteboocells">
937
886
  ${repeat(
938
887
  this.notebook.cells,
@@ -1211,10 +1160,13 @@ __decorateClass([
1211
1160
  __decorateClass([
1212
1161
  state()
1213
1162
  ], LyraNotebookEditor.prototype, "highlightedCellIndex", 2);
1163
+ __decorateClass([
1164
+ state()
1165
+ ], LyraNotebookEditor.prototype, "cellHeights", 2);
1214
1166
  LyraNotebookEditor = __decorateClass([
1215
1167
  customElement("lyra-notebook-editor")
1216
1168
  ], LyraNotebookEditor);
1217
1169
  export {
1218
1170
  LyraNotebookEditor
1219
1171
  };
1220
- //# sourceMappingURL=notebook-runtime-DFffRmNN.js.map
1172
+ //# sourceMappingURL=notebook-runtime-CbWJycgO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-runtime-CbWJycgO.js","sources":["../src/notebook-runtime.ts"],"sourcesContent":["import { css, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { Ref, createRef, ref } from \"lit/directives/ref.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { marked } from \"marked\";\nimport type { EditorInput } from \"@eclipse-lyra/core\";\nimport { LyraMonacoWidget } from \"@eclipse-lyra/extension-monaco-editor/widget\";\nimport { createLogger, File, LyraPart, contributionRegistry, subscribe, unsubscribe, TOPIC_CONTRIBUTEIONS_CHANGED } from \"@eclipse-lyra/core\";\nimport type { NotebookCell, NotebookData, NotebookEditorLike } from \"./notebook-types\";\nimport type { NotebookKernel, NotebookKernelContribution } from \"./notebook-kernel-api\";\nimport { TARGET_NOTEBOOK_KERNELS } from \"./notebook-kernel-api\";\n\nconst logger = createLogger('NotebookRuntime');\n\n@customElement('lyra-notebook-editor')\nexport class LyraNotebookEditor extends LyraPart implements NotebookEditorLike {\n @property({ attribute: false })\n public input?: EditorInput;\n\n @state()\n public notebook?: NotebookData;\n\n @state()\n private cellOutputs: Map<number, any> = new Map();\n\n @state()\n private executingCells: Set<number> = new Set();\n\n @state()\n private availableKernels: NotebookKernelContribution[] = [];\n\n @state()\n private selectedKernelId: string | null = null;\n\n @state()\n private kernel: NotebookKernel | null = null;\n\n @state()\n private kernelConnected: boolean = false;\n\n @state()\n private kernelConnecting: boolean = false;\n\n @state()\n private kernelVersion: string | undefined = undefined;\n\n private unsubscribeContributionsToken?: string;\n\n @state()\n private editingMarkdownCells: Set<number> = new Set();\n\n @state()\n private executionCounter: number = 0;\n\n @state()\n private isRunningAll: boolean = false;\n\n @state()\n private highlightedCellIndex: number = -1;\n\n public focusedCellIndex: number = -1;\n private cancelRunAll: boolean = false;\n\n private cellWidgetRefs: Map<number, Ref<LyraMonacoWidget>> = new Map();\n @state() private cellHeights: Map<number, number> = new Map();\n\n protected doClose() {\n this.input = undefined;\n this.notebook = undefined;\n this.cellOutputs.clear();\n this.executingCells.clear();\n this.cellWidgetRefs.clear();\n this.cellHeights.clear();\n this.focusedCellIndex = -1;\n\n if (this.unsubscribeContributionsToken) {\n unsubscribe(this.unsubscribeContributionsToken);\n this.unsubscribeContributionsToken = undefined;\n }\n\n if (this.kernel?.close) {\n void Promise.resolve(this.kernel.close());\n }\n this.kernel = null;\n this.kernelConnected = false;\n this.kernelVersion = undefined;\n }\n\n async save() {\n if (!this.notebook || !this.input) return;\n\n try {\n // Update cell contents from Monaco editors before saving\n this.saveEditorContents();\n\n this.notebook.cells.forEach((cell, index) => {\n if (cell.cell_type === 'code') {\n const output = this.cellOutputs.get(index);\n cell.outputs = output ? this.convertOutputToJupyter(output, cell.execution_count) : [];\n }\n });\n\n // Serialize notebook to JSON\n const notebookJson = JSON.stringify(this.notebook, null, 2);\n\n // Save to file\n const file: File = this.input.data;\n await file.saveContents(notebookJson);\n\n // Mark as not dirty\n this.markDirty(false);\n } catch (error) {\n console.error(\"Failed to save notebook:\", error);\n throw error;\n }\n }\n\n protected doBeforeUI() {\n // Start loading notebook asynchronously\n this.loadNotebook();\n }\n\n private async onKernelDropdownSelect(e: CustomEvent<{ item?: { value?: string } }>): Promise<void> {\n const value = e.detail?.item?.value ?? '';\n const nextId = value || null;\n if (this.selectedKernelId === nextId) return;\n if (this.kernel?.close) void Promise.resolve(this.kernel.close());\n this.kernel = null;\n this.kernelConnected = false;\n this.kernelVersion = undefined;\n this.selectedKernelId = nextId;\n if (this.notebook) {\n if (!this.notebook.metadata) this.notebook.metadata = {};\n this.notebook.metadata.kernel = nextId ?? undefined;\n }\n this.cellOutputs.clear();\n this.executionCounter = 0;\n this.notebook?.cells?.forEach((cell) => {\n if (cell.cell_type === 'code') {\n cell.execution_count = null;\n cell.outputs = [];\n }\n });\n this.resetCellState();\n await this.ensureKernelLoaded();\n this.requestUpdate();\n this.updateToolbar();\n }\n\n protected renderToolbar() {\n const kernels = this.availableKernels;\n const hasKernels = kernels.length > 0;\n const currentLabel = this.selectedKernelId\n ? kernels.find((c) => c.id === this.selectedKernelId)?.label ?? this.selectedKernelId\n : 'Select kernel';\n\n const connectionTitle = this.kernelConnecting\n ? 'Connecting...'\n : this.kernelConnected\n ? 'Kernel connected'\n : 'Kernel disconnected';\n const connectionText = this.kernelConnecting\n ? 'Connecting...'\n : this.kernelConnected\n ? (this.kernelVersion ?? 'Connected')\n : 'Not connected';\n const iconColor = this.kernelConnected\n ? 'var(--wa-color-green-40)'\n : this.kernelConnecting\n ? 'var(--wa-color-warning-500)'\n : 'var(--wa-color-red-40)';\n\n const runAllButton = this.isRunningAll ? html`\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.cancelAllCells()} title=\"Cancel running all cells\">\n <wa-icon name=\"stop\" label=\"Stop\"></wa-icon>\n Cancel All\n </wa-button>\n ` : html`\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.runAllCells()} title=\"Run all code cells sequentially\">\n <wa-icon name=\"play\" label=\"Run\"></wa-icon>\n Run All\n </wa-button>\n `;\n\n return html`\n <wa-dropdown\n class=\"kernel-select\"\n placement=\"bottom-start\"\n distance=\"4\"\n size=\"small\"\n @wa-select=${(e: CustomEvent<{ item?: { value?: string } }>) => void this.onKernelDropdownSelect(e)}\n >\n <wa-button\n slot=\"trigger\"\n appearance=\"plain\"\n size=\"small\"\n with-caret\n title=\"Notebook kernel\"\n >\n ${currentLabel}\n </wa-button>\n ${kernels.map(\n (c) => html`\n <wa-dropdown-item\n value=${c.id}\n type=\"checkbox\"\n ?checked=${c.id === this.selectedKernelId}\n >\n ${c.label}\n </wa-dropdown-item>\n `\n )}\n </wa-dropdown>\n ${runAllButton}\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n @click=${() => this.clearAllOutputs()}\n title=\"Clear all outputs and reset execution counter\"\n >\n <wa-icon name=\"eraser\" label=\"Clear\"></wa-icon>\n Clear Outputs\n </wa-button>\n ${this.kernel?.restart ? html`\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n @click=${() => void this.restartKernel()}\n title=\"Restart kernel\"\n ?disabled=${!this.kernelConnected || this.kernelConnecting}\n >\n <wa-icon name=\"arrows-rotate\" label=\"Restart\"></wa-icon>\n Restart Kernel\n </wa-button>\n ` : ''}\n ${this.kernel?.openPackageManager ? html`\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n @click=${() => this.openPackageManager()}\n title=\"Manage packages\"\n >\n <wa-icon name=\"box\" label=\"Packages\"></wa-icon>\n Packages\n </wa-button>\n ` : ''}\n ${this.kernel ? (this.kernel.connect ? html`\n <wa-button\n appearance=\"plain\"\n size=\"small\"\n style=\"display: flex; align-items: center; gap: 0.5rem;\"\n ?disabled=${this.kernelConnecting}\n @click=${() => void this.connectKernel()}\n title=${connectionTitle}\n >\n <wa-icon name=\"circle\" label=\"Kernel status\" style=${styleMap({ color: iconColor })}></wa-icon>\n ${connectionText}\n </wa-button>\n ` : html`\n <span style=\"display: flex; align-items: center; gap: 0.5rem;\" title=${connectionTitle}>\n <wa-icon name=\"circle\" label=\"Kernel status\" style=${styleMap({ color: iconColor })}></wa-icon>\n ${connectionText}\n </span>\n `) : ''}\n `;\n }\n\n private async connectKernel(): Promise<void> {\n if (this.kernelConnecting || !this.kernel?.connect) return;\n try {\n this.kernelConnecting = true;\n this.requestUpdate();\n this.updateToolbar();\n await this.kernel.connect({\n requiredPackages: this.notebook?.metadata?.required_packages,\n });\n this.kernelConnected = true;\n if (this.kernel.getVersion) this.kernelVersion = await this.kernel.getVersion();\n } catch (err) {\n logger.error('Failed to connect kernel', err);\n } finally {\n this.kernelConnecting = false;\n this.requestUpdate();\n this.updateToolbar();\n }\n }\n\n protected async doInitUI() {\n this.unsubscribeContributionsToken = subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: { target?: string }) => {\n if (event?.target === TARGET_NOTEBOOK_KERNELS) {\n void this.refreshKernels();\n }\n });\n await this.refreshKernels();\n }\n\n private resolveDefaultKernelId(contributions: NotebookKernelContribution[]): string | null {\n if (!contributions.length) return null;\n const fromMeta = this.notebook?.metadata?.kernel;\n if (fromMeta && contributions.some((c) => c.id === fromMeta)) return fromMeta;\n const python = contributions.find((c) => c.id === 'python');\n if (python) return python.id;\n const js = contributions.find((c) => c.id === 'javascript');\n if (js) return js.id;\n return contributions[0].id;\n }\n\n private async refreshKernels(): Promise<void> {\n const contributions = contributionRegistry.getContributions<NotebookKernelContribution>(TARGET_NOTEBOOK_KERNELS);\n this.availableKernels = contributions;\n if (!this.selectedKernelId && contributions.length) {\n this.selectedKernelId = this.resolveDefaultKernelId(contributions);\n if (this.notebook && this.selectedKernelId) {\n if (!this.notebook.metadata) this.notebook.metadata = {};\n this.notebook.metadata.kernel = this.selectedKernelId;\n }\n }\n if (this.selectedKernelId && !contributions.some((c) => c.id === this.selectedKernelId)) {\n this.selectedKernelId = contributions.length ? contributions[0].id : null;\n }\n this.requestUpdate();\n await this.ensureKernelLoaded();\n this.updateToolbar();\n }\n\n private async ensureKernelLoaded(): Promise<void> {\n const id = this.selectedKernelId;\n if (!id || this.kernel?.id === id) return;\n if (this.kernel?.close) void Promise.resolve(this.kernel.close());\n this.kernel = null;\n this.kernelConnected = false;\n this.kernelVersion = undefined;\n const contribution = this.availableKernels.find((c) => c.id === id);\n if (!contribution) return;\n try {\n this.kernelConnecting = true;\n this.requestUpdate();\n this.updateToolbar();\n const k = await contribution.loadKernel();\n if (this.selectedKernelId !== id) return;\n this.kernel = k;\n if (k.connect) {\n await k.connect({\n requiredPackages: this.notebook?.metadata?.required_packages,\n });\n }\n this.kernelConnected = true;\n if (k.getVersion) {\n this.kernelVersion = await k.getVersion();\n }\n } catch (err) {\n logger.error('Failed to load kernel', id, err);\n } finally {\n this.kernelConnecting = false;\n this.requestUpdate();\n this.updateToolbar();\n }\n }\n\n private async loadNotebook() {\n const file: File = this.input!.data;\n const contents = await file.getContents();\n\n try {\n this.notebook = JSON.parse(contents as string);\n } catch (e) {\n console.error(\"Failed to parse notebook:\", e);\n this.notebook = {\n cells: [{\n cell_type: 'markdown',\n source: ['# Error\\nFailed to parse notebook file.']\n }]\n };\n }\n\n if (this.notebook?.metadata?.kernel) {\n this.selectedKernelId = this.notebook.metadata.kernel;\n }\n\n if (this.notebook?.cells) {\n const maxCount = this.notebook.cells\n .filter(cell => cell.cell_type === 'code')\n .map(cell => cell.execution_count ?? 0)\n .reduce((max, count) => Math.max(max, count), 0);\n this.executionCounter = maxCount;\n\n this.notebook.cells.forEach((cell, index) => {\n if (cell.cell_type === 'code' && cell.outputs && cell.outputs.length > 0) {\n const output = this.convertOutputFromJupyter(cell.outputs[0]);\n if (output) {\n this.cellOutputs.set(index, output);\n }\n }\n });\n }\n\n void this.refreshKernels();\n }\n\n private getCellSource(cell: NotebookCell): string {\n return Array.isArray(cell.source) ? cell.source.join('') : cell.source;\n }\n\n private convertOutputToJupyter(output: any, executionCount: number | null | undefined): any[] {\n if (output.type === 'execute_result') {\n const data: any = {};\n if (output.imageData) data['image/png'] = output.imageData;\n if (output.data) data['text/plain'] = output.data;\n return [{\n output_type: 'execute_result',\n data,\n execution_count: executionCount,\n metadata: {}\n }];\n } else if (output.type === 'error') {\n return [{\n output_type: 'error',\n ename: 'Error',\n evalue: output.data,\n traceback: [output.data]\n }];\n }\n return [];\n }\n\n private convertOutputFromJupyter(jupyterOutput: any): any | null {\n if (jupyterOutput.output_type === 'execute_result' && jupyterOutput.data) {\n return {\n type: 'execute_result',\n data: jupyterOutput.data['text/plain'] || '',\n imageData: jupyterOutput.data['image/png'] || undefined\n };\n } else if (jupyterOutput.output_type === 'error') {\n return {\n type: 'error',\n data: jupyterOutput.evalue || jupyterOutput.traceback?.join('\\n') || 'Unknown error'\n };\n }\n return null;\n }\n\n private renderHeaderActions(index: number, additionalButton?: any) {\n return html`\n <div class=\"cell-header-actions\">\n ${additionalButton || ''}\n ${additionalButton ? html`<span class=\"divider\"></span>` : ''}\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.addCell(index, 'code')} title=\"Add code cell before\">\n <wa-icon name=\"plus\"></wa-icon>\n <wa-icon name=\"code\" label=\"Code\"></wa-icon>\n </wa-button>\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.addCell(index, 'markdown')} title=\"Add markdown cell before\">\n <wa-icon name=\"plus\"></wa-icon>\n <wa-icon name=\"font\" label=\"Markdown\"></wa-icon>\n </wa-button>\n <span class=\"divider\"></span>\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.deleteCell(index)} title=\"Delete cell\" ?disabled=${this.notebook!.cells.length <= 1}>\n <wa-icon name=\"trash\" label=\"Delete cell\"></wa-icon>\n </wa-button>\n </div>\n `;\n }\n\n private renderFooterActions(index: number) {\n return html`\n <div class=\"cell-footer\">\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.addCell(index + 1, 'code')} title=\"Add code cell after\">\n <wa-icon name=\"code\" label=\"Code\"></wa-icon>\n <wa-icon name=\"plus\"></wa-icon>\n </wa-button>\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.addCell(index + 1, 'markdown')} title=\"Add markdown cell after\">\n <wa-icon name=\"font\" label=\"Markdown\"></wa-icon>\n <wa-icon name=\"plus\"></wa-icon>\n </wa-button>\n </div>\n `;\n }\n\n // Helper to convert string to Jupyter source format\n private stringToSourceArray(content: string): string[] {\n if (!content) return [''];\n const lines = content.split('\\n').map(line => line + '\\n');\n // Remove trailing newline from last line\n if (lines.length > 0) {\n lines[lines.length - 1] = lines[lines.length - 1].replace(/\\n$/, '');\n }\n return lines;\n }\n\n // Helper to create a new cell\n private createCell(cellType: 'code' | 'markdown'): NotebookCell {\n const newCell: NotebookCell = {\n cell_type: cellType,\n source: [''],\n metadata: {}\n };\n\n if (cellType === 'code') {\n newCell.execution_count = null;\n newCell.outputs = [];\n }\n\n return newCell;\n }\n\n public async executeCell(cellIndex: number) {\n const cell = this.notebook!.cells[cellIndex];\n if (cell.cell_type !== 'code') return;\n\n this.executingCells.add(cellIndex);\n this.requestUpdate();\n\n try {\n await this.ensureKernelLoaded();\n const k = this.kernel;\n if (!k) {\n if (this.executingCells.has(cellIndex)) {\n this.cellOutputs.set(cellIndex, { type: 'error', data: 'No kernel selected' });\n }\n return;\n }\n\n const widget = this.getCellWidgetRef(cellIndex).value;\n const code = widget ? widget.getContent() : this.getCellSource(cell);\n if (code === null || code === undefined) return;\n\n const result = await k.execute(code);\n\n if (result.error) {\n this.cellOutputs.set(cellIndex, { type: 'error', data: result.error });\n } else {\n this.cellOutputs.set(cellIndex, {\n type: 'execute_result',\n data: result.data,\n imageData: result.imageData,\n });\n }\n\n this.executionCounter++;\n cell.execution_count = this.executionCounter;\n this.markDirty(true);\n } catch (error) {\n if (this.executingCells.has(cellIndex)) {\n this.cellOutputs.set(cellIndex, {\n type: 'error',\n data: error instanceof Error ? error.message : String(error),\n });\n }\n } finally {\n this.executingCells.delete(cellIndex);\n this.requestUpdate();\n }\n }\n\n private cancelExecution(cellIndex: number) {\n if (this.kernel?.interrupt) {\n this.kernel.interrupt();\n } else {\n this.cellOutputs.set(cellIndex, {\n type: 'error',\n data: 'Cancellation not supported for this kernel',\n });\n this.executingCells.delete(cellIndex);\n this.requestUpdate();\n }\n }\n\n private clearAllOutputs() {\n // Clear all outputs\n this.cellOutputs.clear();\n\n // Reset execution counter\n this.executionCounter = 0;\n\n // Reset execution counts on all code cells\n if (this.notebook?.cells) {\n this.notebook.cells.forEach(cell => {\n if (cell.cell_type === 'code') {\n cell.execution_count = null;\n cell.outputs = [];\n }\n });\n }\n\n // Mark as dirty since we've modified the notebook\n this.markDirty(true);\n\n // Force re-render\n this.requestUpdate();\n }\n\n private async restartKernel() {\n if (!this.kernel?.restart || this.kernelConnecting) return;\n try {\n this.kernelConnecting = true;\n this.requestUpdate();\n this.updateToolbar();\n await this.kernel.restart();\n this.kernelConnected = true;\n if (this.kernel.getVersion) this.kernelVersion = await this.kernel.getVersion();\n } catch (error) {\n logger.error('Failed to restart kernel', error);\n } finally {\n this.kernelConnecting = false;\n this.requestUpdate();\n this.updateToolbar();\n }\n }\n\n private async runAllCells() {\n if (!this.notebook?.cells) return;\n\n this.isRunningAll = true;\n this.cancelRunAll = false;\n this.requestUpdate();\n\n try {\n // Execute all code cells sequentially\n for (let i = 0; i < this.notebook.cells.length; i++) {\n // Check if cancellation was requested\n if (this.cancelRunAll) {\n break;\n }\n\n const cell = this.notebook.cells[i];\n if (cell.cell_type === 'code') {\n await this.executeCell(i);\n }\n }\n } finally {\n this.isRunningAll = false;\n this.cancelRunAll = false;\n this.requestUpdate();\n }\n }\n\n private cancelAllCells() {\n this.cancelRunAll = true;\n this.kernel?.interrupt?.();\n }\n\n private toggleMarkdownEdit(index: number) {\n if (this.editingMarkdownCells.has(index)) {\n this.editingMarkdownCells.delete(index);\n } else {\n this.editingMarkdownCells.add(index);\n }\n this.requestUpdate();\n }\n\n private saveMarkdownEdit(index: number, event: Event) {\n const textarea = event.target as HTMLTextAreaElement;\n const newContent = textarea.value;\n\n // Update the cell source\n if (this.notebook && this.notebook.cells[index]) {\n const cell = this.notebook.cells[index];\n const oldContent = this.getCellSource(cell);\n\n cell.source = this.stringToSourceArray(newContent);\n\n // Mark dirty if content changed\n if (oldContent !== newContent) {\n this.markDirty(true);\n }\n }\n\n this.editingMarkdownCells.delete(index);\n this.requestUpdate();\n }\n\n private renderMarkdownCell(cell: NotebookCell, index: number) {\n const source = this.getCellSource(cell);\n const isEmpty = !source || source.trim() === '';\n const isEditing = this.editingMarkdownCells.has(index);\n\n if (isEditing) {\n const editButtons = html`\n <wa-button \n size=\"small\" \n appearance=\"plain\"\n @click=${(e: Event) => {\n const textarea = (e.target as HTMLElement).closest('.markdown-cell')?.querySelector('textarea');\n if (textarea) {\n this.saveMarkdownEdit(index, { target: textarea } as any);\n }\n }}\n title=\"Save changes\">\n <wa-icon name=\"check\" label=\"Save\"></wa-icon>\n </wa-button>\n <wa-button \n size=\"small\" \n appearance=\"plain\"\n @click=${() => this.toggleMarkdownEdit(index)}\n title=\"Cancel editing\">\n <wa-icon name=\"xmark\" label=\"Cancel\"></wa-icon>\n </wa-button>\n `;\n \n return html`\n <div class=\"cell-wrapper\">\n <wa-animation \n name=\"bounce\" \n duration=\"1000\" \n iterations=\"1\"\n ?play=${this.highlightedCellIndex === index}\n @wa-finish=${() => this.highlightedCellIndex = -1}>\n <div class=\"cell markdown-cell editing\">\n <div class=\"cell-header\">\n ${this.renderHeaderActions(index, editButtons)}\n <span class=\"cell-label\">Markdown</span>\n </div>\n <textarea \n class=\"markdown-editor\"\n .value=${source}\n @blur=${(e: Event) => this.saveMarkdownEdit(index, e)}\n placeholder=\"Enter markdown content here... (# for headings, ** for bold, etc.)\"></textarea>\n ${this.renderFooterActions(index)}\n </div>\n </wa-animation>\n </div>\n `;\n }\n\n const rendered = marked.parse(source) as string;\n\n const editButton = html`\n <wa-button \n size=\"small\" \n appearance=\"plain\"\n @click=${() => this.toggleMarkdownEdit(index)}\n title=\"Edit markdown\">\n <wa-icon name=\"pencil\" label=\"Edit\"></wa-icon>\n </wa-button>\n `;\n\n return html`\n <div class=\"cell-wrapper\">\n <wa-animation \n name=\"bounce\" \n duration=\"1000\" \n iterations=\"1\"\n ?play=${this.highlightedCellIndex === index}\n @wa-finish=${() => this.highlightedCellIndex = -1}>\n <div class=\"cell markdown-cell ${isEmpty ? 'empty' : ''}\" @dblclick=${() => this.toggleMarkdownEdit(index)}>\n <div class=\"cell-header\">\n ${this.renderHeaderActions(index, editButton)}\n <span class=\"cell-label\"></span>\n </div>\n <div class=\"cell-content\">\n ${isEmpty ? html`\n <div class=\"markdown-placeholder\">\n <wa-icon name=\"font\" label=\"Markdown\"></wa-icon>\n <span>Double-click or click the pencil icon to edit markdown</span>\n </div>\n ` : unsafeHTML(rendered)}\n </div>\n ${this.renderFooterActions(index)}\n </div>\n </wa-animation>\n </div>\n `;\n }\n\n private renderCodeCell(cell: NotebookCell, index: number) {\n const output = this.cellOutputs.get(index);\n const isExecuting = this.executingCells.has(index);\n const source = this.getCellSource(cell);\n const language = this.kernel?.language ?? 'javascript';\n const notebookPath = (this.input?.data as File)?.getWorkspacePath?.() ?? 'notebook';\n const cellUri = `${notebookPath}-cell-${index}`;\n const cellHeight = this.cellHeights.get(index) ?? Math.max(100, source.split('\\n').length * 19 + 10);\n\n const runButton = isExecuting ? html`\n <wa-button \n size=\"small\" \n appearance=\"plain\"\n @click=${() => this.cancelExecution(index)}\n title=\"Stop execution\">\n <wa-icon name=\"stop\" label=\"Stop\" style=\"color: var(--wa-color-danger-500);\"></wa-icon>\n </wa-button>\n ` : html`\n <lyra-command \n cmd=\"notebook.runCell\"\n icon=\"play\"\n title=\"Run cell\"\n size=\"small\"\n appearance=\"plain\"\n .params=${{ cellIndex: index }}>\n </lyra-command>\n `;\n\n return html`\n <div class=\"cell-wrapper\">\n <wa-animation \n name=\"bounce\" \n duration=\"1000\" \n iterations=\"1\"\n ?play=${this.highlightedCellIndex === index}\n @wa-finish=${() => this.highlightedCellIndex = -1}>\n <div class=\"cell code-cell ${isExecuting ? 'executing' : ''}\">\n <div class=\"cell-header\">\n <span class=\"cell-label\">\n ${isExecuting ? html`\n In [<wa-animation name=\"pulse\" duration=\"1000\" iterations=\"Infinity\" ?play=${isExecuting}>\n <span class=\"executing-indicator\">*</span>\n </wa-animation>]\n ` : html`\n In [${cell.execution_count ?? ' '}]\n `}\n </span>\n ${this.renderHeaderActions(index, runButton)}\n </div>\n <div\n class=\"cell-input monaco-container\"\n style=${styleMap({ height: `${cellHeight}px` })}\n @wheel=${(e: WheelEvent) => this.onCellWheel(index, e)}\n >\n <lyra-monaco-widget\n .value=${source}\n .language=${language}\n .uri=${cellUri}\n ?autoLayout=${true}\n @content-change=${() => this.markDirty(true)}\n @editor-focus=${() => { this.focusedCellIndex = index; }}\n @editor-blur=${() => { if (this.focusedCellIndex === index) this.focusedCellIndex = -1; }}\n @content-height-changed=${(e: CustomEvent<{ height: number }>) => this.onCellHeightChange(index, e.detail.height)}\n ${ref(this.getCellWidgetRef(index))}\n ></lyra-monaco-widget>\n </div>\n ${output ? html`\n <div class=\"cell-output ${output.type === 'error' ? 'output-error' : ''}\">\n <div class=\"output-label\">Out [${index + 1}]:</div>\n ${output.imageData ? html`\n <img src=\"data:image/png;base64,${output.imageData}\" alt=\"Output image\" class=\"output-image\" />\n ` : ''}\n ${output.data ? html`<pre><code>${output.data}</code></pre>` : ''}\n </div>\n ` : ''}\n ${this.renderFooterActions(index)}\n </div>\n </wa-animation>\n </div>\n `;\n }\n\n private renderCell(cell: NotebookCell, index: number) {\n if (cell.cell_type === 'markdown') {\n return this.renderMarkdownCell(cell, index);\n } else if (cell.cell_type === 'code') {\n return this.renderCodeCell(cell, index);\n } else {\n // raw cell\n const source = this.getCellSource(cell);\n return html`\n <div class=\"cell raw-cell\">\n <pre><code>${source}</code></pre>\n </div>\n `;\n }\n }\n\n private addCell(index: number, cellType: 'code' | 'markdown' = 'code') {\n if (!this.notebook) return;\n\n // Save editor contents BEFORE modifying the cells array\n this.saveEditorContents();\n \n this.shiftIndices(index, 'up');\n \n this.notebook.cells.splice(index, 0, this.createCell(cellType));\n \n // Automatically enter edit mode for new markdown cells\n if (cellType === 'markdown') {\n this.editingMarkdownCells.add(index);\n }\n \n this.resetCellState();\n \n // Trigger animation and scroll to the new cell\n this.highlightedCellIndex = index;\n this.updateComplete.then(() => {\n this.scrollToCell(index);\n });\n }\n\n private scrollToCell(index: number) {\n // Find the cell wrapper element\n const cellWrapper = this.shadowRoot?.querySelectorAll('.cell-wrapper')[index];\n if (!cellWrapper) return;\n\n // Find the wa-scroller container (parent of this component)\n const scroller = this.closest('wa-scroller');\n if (!scroller) {\n // Fallback to default scrollIntoView if no scroller found\n cellWrapper.scrollIntoView({ \n behavior: 'smooth', \n block: 'center',\n inline: 'nearest'\n });\n return;\n }\n\n // Manually scroll the wa-scroller to the cell position\n const scrollerRect = scroller.getBoundingClientRect();\n const cellRect = cellWrapper.getBoundingClientRect();\n const scrollTop = scroller.scrollTop;\n \n // Calculate target scroll position (center the cell)\n const targetScroll = scrollTop + (cellRect.top - scrollerRect.top) - (scrollerRect.height / 2) + (cellRect.height / 2);\n \n scroller.scrollTo({\n top: targetScroll,\n behavior: 'smooth'\n });\n }\n\n private saveEditorContents() {\n this.notebook?.cells.forEach((cell, index) => {\n if (cell.cell_type !== 'code') return;\n const widget = this.getCellWidgetRef(index).value;\n const value = widget?.getContent();\n if (value !== undefined && value !== null) {\n cell.source = this.stringToSourceArray(value);\n }\n });\n }\n\n private resetCellState() {\n this.markDirty(true);\n }\n\n private deleteCell(index: number) {\n if (!this.notebook || this.notebook.cells.length <= 1) return;\n\n // Save editor contents BEFORE modifying the cells array\n this.saveEditorContents();\n \n // Remove state for the deleted cell\n this.cellOutputs.delete(index);\n this.executingCells.delete(index);\n this.editingMarkdownCells.delete(index);\n \n this.notebook.cells.splice(index, 1);\n \n this.shiftIndices(index, 'down');\n \n this.resetCellState();\n }\n\n private shiftIndices(startIndex: number, direction: 'up' | 'down') {\n const shift = direction === 'up' ? 1 : -1;\n const filterFn = direction === 'up' \n ? (idx: number) => idx >= startIndex\n : (idx: number) => idx > startIndex;\n const sortFn = direction === 'up'\n ? (a: number, b: number) => b - a\n : (a: number, b: number) => a - b;\n\n const shiftMap = <T>(map: Map<number, T>) => {\n const indices = Array.from(map.keys()).filter(filterFn).sort(sortFn);\n indices.forEach(oldIndex => {\n const value = map.get(oldIndex);\n map.delete(oldIndex);\n map.set(oldIndex + shift, value!);\n });\n };\n\n const shiftSet = (set: Set<number>) => {\n const indices = Array.from(set).filter(filterFn).sort(sortFn);\n indices.forEach(oldIndex => {\n set.delete(oldIndex);\n set.add(oldIndex + shift);\n });\n };\n\n shiftMap(this.cellOutputs);\n shiftSet(this.executingCells);\n shiftSet(this.editingMarkdownCells);\n shiftMap(this.cellWidgetRefs);\n shiftMap(this.cellHeights);\n }\n\n private getCellWidgetRef(index: number): Ref<LyraMonacoWidget> {\n if (!this.cellWidgetRefs.has(index)) {\n this.cellWidgetRefs.set(index, createRef());\n }\n return this.cellWidgetRefs.get(index)!;\n }\n\n private onCellHeightChange(index: number, height: number): void {\n const padding = 10;\n const minHeight = 100;\n const newHeight = Math.max(minHeight, height + padding);\n const current = this.cellHeights.get(index);\n if (current === newHeight) return;\n this.cellHeights = new Map(this.cellHeights);\n this.cellHeights.set(index, newHeight);\n this.requestUpdate();\n this.updateComplete.then(() => (this.getCellWidgetRef(index).value as { layout?: () => void })?.layout?.());\n }\n\n private onCellWheel(index: number, e: WheelEvent): void {\n const widget = this.getCellWidgetRef(index).value;\n const editor = widget?.getEditor();\n if (!editor) return;\n const scrollTop = editor.getScrollTop();\n const scrollHeight = editor.getScrollHeight();\n const contentHeight = editor.getContentHeight();\n const canScroll = scrollHeight > contentHeight;\n const atBoundary = (e.deltaY < 0 && scrollTop <= 0) ||\n (e.deltaY > 0 && scrollTop + contentHeight >= scrollHeight);\n if (!canScroll || atBoundary) {\n e.stopImmediatePropagation();\n }\n }\n\n private openPackageManager() {\n if (!this.kernel?.openPackageManager) return;\n const packages = this.notebook?.metadata?.required_packages ?? [];\n this.kernel.openPackageManager({\n requiredPackages: packages,\n onPackageAdded: (packageName: string) => {\n if (!this.notebook) return;\n if (!this.notebook.metadata) this.notebook.metadata = {};\n if (!this.notebook.metadata.required_packages) this.notebook.metadata.required_packages = [];\n if (!this.notebook.metadata.required_packages.includes(packageName)) {\n this.notebook.metadata.required_packages.push(packageName);\n this.markDirty(true);\n }\n },\n onPackageRemoved: (packageName: string) => {\n if (!this.notebook?.metadata?.required_packages) return;\n const index = this.notebook.metadata.required_packages.indexOf(packageName);\n if (index > -1) {\n this.notebook.metadata.required_packages.splice(index, 1);\n this.markDirty(true);\n }\n },\n });\n }\n\n protected updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n if (\n changedProperties.has('kernelConnected') ||\n changedProperties.has('kernelConnecting') ||\n changedProperties.has('kernelVersion') ||\n changedProperties.has('isRunningAll') ||\n changedProperties.has('availableKernels') ||\n changedProperties.has('selectedKernelId')\n ) {\n this.updateToolbar();\n }\n }\n\n protected render() {\n if (!this.notebook) {\n return html`<div class=\"loading\">Loading notebook...</div>`;\n }\n\n return html`\n <div class=\"noteboocells\">\n ${repeat(\n this.notebook.cells,\n (_cell, index) => index,\n (cell, index) => this.renderCell(cell, index)\n )}\n </div>\n `;\n }\n\n static styles = css`\n :host {\n display: block;\n width: 100%;\n }\n\n .kernel-select {\n max-width: 10rem;\n }\n\n .noteboocells {\n display: flex;\n flex-direction: column;\n gap: 3rem;\n max-width: 1200px;\n margin: 0 auto;\n padding: 2rem 1rem;\n width: 100%;\n box-sizing: border-box;\n }\n\n .cell-wrapper {\n position: relative;\n }\n\n .cell {\n border-radius: 4px;\n overflow: hidden;\n opacity: 0.9;\n position: relative;\n }\n\n .cell-header-actions {\n display: flex;\n gap: 0.25rem;\n align-items: center;\n opacity: 0.5;\n transition: opacity 0.2s;\n }\n\n .cell-header-actions .divider {\n width: 1px;\n height: 1rem;\n background: var(--wa-color-outline);\n margin: 0 0.25rem;\n opacity: 0.5;\n }\n\n .cell-header:hover .cell-header-actions {\n opacity: 1;\n }\n\n .cell-footer {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n justify-content: flex-start;\n padding: 0.5rem;\n border-top: 1px solid var(--wa-color-outline);\n opacity: 0.5;\n transition: opacity 0.2s;\n }\n\n .cell-footer:hover {\n opacity: 1;\n }\n\n .markdown-cell {\n cursor: pointer;\n transition: opacity 0.2s;\n }\n\n .markdown-cell:hover:not(.editing) {\n opacity: 0.9;\n }\n \n .markdown-cell .cell-content {\n padding: 1rem;\n }\n\n .markdown-cell.editing {\n cursor: default;\n padding: 0;\n }\n \n .markdown-cell.editing .cell-actions {\n display: none;\n }\n\n .markdown-editor {\n width: 100%;\n min-height: 200px;\n padding: 1rem;\n font-family: monospace;\n font-size: 0.95rem;\n line-height: 1.6;\n border: none;\n outline: none;\n resize: vertical;\n background: transparent;\n color: inherit;\n }\n\n .code-cell {\n border-left: 3px solid var(--wa-color-primary-500);\n transition: all 0.3s ease;\n }\n \n .code-cell.executing {\n border-left: 4px solid var(--wa-color-primary-500);\n box-shadow: 0 0 0 2px var(--wa-color-primary-500, rgba(59, 130, 246, 0.3));\n animation: pulse-cell 2s ease-in-out infinite;\n }\n \n @keyframes pulse-cell {\n 0%, 100% {\n box-shadow: 0 0 0 2px var(--wa-color-primary-500, rgba(59, 130, 246, 0.3));\n opacity: 1;\n }\n 50% {\n box-shadow: 0 0 0 4px var(--wa-color-primary-500, rgba(59, 130, 246, 0.5));\n opacity: 0.95;\n }\n }\n\n .cell-header {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n flex-wrap: nowrap;\n }\n\n .cell-label {\n font-family: monospace;\n font-weight: bold;\n flex-shrink: 0;\n }\n \n .executing-indicator {\n display: inline-block;\n color: var(--wa-color-primary-500);\n font-weight: bold;\n font-size: 1.2em;\n }\n\n .cell-input {\n margin: 0;\n }\n\n .monaco-container {\n min-height: 100px;\n height: auto;\n width: 100%;\n }\n\n .cell-output {\n padding: 1rem;\n }\n\n .output-label {\n font-family: monospace;\n font-weight: bold;\n margin-bottom: 0.5rem;\n opacity: 0.7;\n }\n\n .cell-output pre {\n margin: 0;\n overflow-x: auto;\n }\n\n .cell-output code {\n font-family: 'Courier New', monospace;\n font-size: 0.9rem;\n line-height: 1.5;\n }\n\n .output-image {\n max-width: 100%;\n height: auto;\n display: block;\n margin: 0.5rem 0;\n border-radius: 4px;\n }\n\n .output-error {\n border-left: 3px solid var(--wa-color-danger-500);\n }\n\n .raw-cell {\n padding: 1rem;\n }\n\n .raw-cell pre {\n margin: 0;\n }\n\n .loading {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n font-size: 1.2rem;\n }\n\n .markdown-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n padding: 3rem 1rem;\n opacity: 0.5;\n font-style: italic;\n transition: opacity 0.2s;\n }\n\n .markdown-cell.empty:hover .markdown-placeholder {\n opacity: 0.8;\n }\n\n .markdown-placeholder wa-icon {\n font-size: 1.5rem;\n }\n `;\n}\n"],"names":[],"mappings":"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"}
@@ -18,9 +18,8 @@ export declare class LyraNotebookEditor extends LyraPart implements NotebookEdit
18
18
  private highlightedCellIndex;
19
19
  focusedCellIndex: number;
20
20
  private cancelRunAll;
21
- private monacoEditors;
22
- private cellRefs;
23
- private themeObserver?;
21
+ private cellWidgetRefs;
22
+ private cellHeights;
24
23
  protected doClose(): void;
25
24
  save(): Promise<void>;
26
25
  protected doBeforeUI(): void;
@@ -32,7 +31,6 @@ export declare class LyraNotebookEditor extends LyraPart implements NotebookEdit
32
31
  private refreshKernels;
33
32
  private ensureKernelLoaded;
34
33
  private loadNotebook;
35
- private setupThemeObserver;
36
34
  private getCellSource;
37
35
  private convertOutputToJupyter;
38
36
  private convertOutputFromJupyter;
@@ -57,8 +55,9 @@ export declare class LyraNotebookEditor extends LyraPart implements NotebookEdit
57
55
  private resetCellState;
58
56
  private deleteCell;
59
57
  private shiftIndices;
60
- private initializeMonacoEditor;
61
- private getMonacoTheme;
58
+ private getCellWidgetRef;
59
+ private onCellHeightChange;
60
+ private onCellWheel;
62
61
  private openPackageManager;
63
62
  protected updated(changedProperties: Map<string, any>): void;
64
63
  protected render(): import('lit-html').TemplateResult<1>;
@@ -1 +1 @@
1
- {"version":3,"file":"notebook-runtime.d.ts","sourceRoot":"","sources":["../src/notebook-runtime.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAsB,QAAQ,EAA8E,MAAM,oBAAoB,CAAC;AAC9I,OAAO,KAAK,EAAgB,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAMvF,qBACa,kBAAmB,SAAQ,QAAS,YAAW,kBAAkB;IAEnE,KAAK,CAAC,EAAE,WAAW,CAAC;IAGpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IAG/B,OAAO,CAAC,WAAW,CAA+B;IAGlD,OAAO,CAAC,cAAc,CAA0B;IAGhD,OAAO,CAAC,gBAAgB,CAAoC;IAG5D,OAAO,CAAC,gBAAgB,CAAuB;IAG/C,OAAO,CAAC,MAAM,CAA+B;IAG7C,OAAO,CAAC,eAAe,CAAkB;IAGzC,OAAO,CAAC,gBAAgB,CAAkB;IAG1C,OAAO,CAAC,aAAa,CAAiC;IAEtD,OAAO,CAAC,6BAA6B,CAAC,CAAS;IAG/C,OAAO,CAAC,oBAAoB,CAA0B;IAGtD,OAAO,CAAC,gBAAgB,CAAa;IAGrC,OAAO,CAAC,YAAY,CAAkB;IAGtC,OAAO,CAAC,oBAAoB,CAAc;IAEnC,gBAAgB,EAAE,MAAM,CAAM;IACrC,OAAO,CAAC,YAAY,CAAkB;IAEtC,OAAO,CAAC,aAAa,CAA+D;IACpF,OAAO,CAAC,QAAQ,CAA4C;IAC5D,OAAO,CAAC,aAAa,CAAC,CAAmB;IAEzC,SAAS,CAAC,OAAO;IA8BX,IAAI;IA6BV,SAAS,CAAC,UAAU;YAKN,sBAAsB;IA2BpC,SAAS,CAAC,aAAa;YAsHT,aAAa;cAoBX,QAAQ;IAUxB,OAAO,CAAC,sBAAsB;YAWhB,cAAc;YAkBd,kBAAkB;YAkClB,YAAY;IAwC1B,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,sBAAsB;IAsB9B,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,UAAU;IAeL,WAAW,CAAC,SAAS,EAAE,MAAM;IAgD1C,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,eAAe;YAwBT,aAAa;YAkBb,WAAW;IA2BzB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,kBAAkB;IA6F1B,OAAO,CAAC,cAAc;IAmEtB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,OAAO;IAwBf,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,sBAAsB;IAqE9B,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,kBAAkB;IAyB1B,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IA0BrD,SAAS,CAAC,MAAM;IAmBhB,MAAM,CAAC,MAAM,0BAiOX;CACL"}
1
+ {"version":3,"file":"notebook-runtime.d.ts","sourceRoot":"","sources":["../src/notebook-runtime.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAsB,QAAQ,EAA8E,MAAM,oBAAoB,CAAC;AAC9I,OAAO,KAAK,EAAgB,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAMvF,qBACa,kBAAmB,SAAQ,QAAS,YAAW,kBAAkB;IAEnE,KAAK,CAAC,EAAE,WAAW,CAAC;IAGpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IAG/B,OAAO,CAAC,WAAW,CAA+B;IAGlD,OAAO,CAAC,cAAc,CAA0B;IAGhD,OAAO,CAAC,gBAAgB,CAAoC;IAG5D,OAAO,CAAC,gBAAgB,CAAuB;IAG/C,OAAO,CAAC,MAAM,CAA+B;IAG7C,OAAO,CAAC,eAAe,CAAkB;IAGzC,OAAO,CAAC,gBAAgB,CAAkB;IAG1C,OAAO,CAAC,aAAa,CAAiC;IAEtD,OAAO,CAAC,6BAA6B,CAAC,CAAS;IAG/C,OAAO,CAAC,oBAAoB,CAA0B;IAGtD,OAAO,CAAC,gBAAgB,CAAa;IAGrC,OAAO,CAAC,YAAY,CAAkB;IAGtC,OAAO,CAAC,oBAAoB,CAAc;IAEnC,gBAAgB,EAAE,MAAM,CAAM;IACrC,OAAO,CAAC,YAAY,CAAkB;IAEtC,OAAO,CAAC,cAAc,CAAiD;IAC9D,OAAO,CAAC,WAAW,CAAkC;IAE9D,SAAS,CAAC,OAAO;IAsBX,IAAI;IA6BV,SAAS,CAAC,UAAU;YAKN,sBAAsB;IA2BpC,SAAS,CAAC,aAAa;YAsHT,aAAa;cAoBX,QAAQ;IASxB,OAAO,CAAC,sBAAsB;YAWhB,cAAc;YAkBd,kBAAkB;YAkClB,YAAY;IAwC1B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,sBAAsB;IAsB9B,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,UAAU;IAeL,WAAW,CAAC,SAAS,EAAE,MAAM;IAiD1C,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,eAAe;YAwBT,aAAa;YAkBb,WAAW;IA2BzB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,kBAAkB;IA6F1B,OAAO,CAAC,cAAc;IAkFtB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,OAAO;IAwBf,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,YAAY;IAiCpB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,kBAAkB;IAyB1B,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IAerD,SAAS,CAAC,MAAM;IAgBhB,MAAM,CAAC,MAAM,0BAiOX;CACL"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-lyra/extension-notebook",
3
- "version": "0.7.39",
3
+ "version": "0.7.41",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {
@@ -11,8 +11,8 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "@eclipse-lyra/core": "*",
14
- "marked": "^12.0.0 || ^16.4.1",
15
- "monaco-editor": "0.55.1"
14
+ "@eclipse-lyra/extension-monaco-editor": "*",
15
+ "marked": "^12.0.0 || ^16.4.1"
16
16
  },
17
17
  "devDependencies": {
18
18
  "typescript": "^5.9.3",
@@ -1 +0,0 @@
1
- {"version":3,"file":"notebook-runtime-DFffRmNN.js","sources":["../src/notebook-runtime.ts"],"sourcesContent":["import { css, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { Ref, createRef, ref } from \"lit/directives/ref.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { marked } from \"marked\";\nimport * as monaco from 'monaco-editor';\nimport monacoStyles from \"monaco-editor/min/vs/editor/editor.main.css?raw\";\nimport type { EditorInput } from \"@eclipse-lyra/core\";\nimport { File, createLogger, LyraPart, contributionRegistry, subscribe, unsubscribe, TOPIC_CONTRIBUTEIONS_CHANGED } from \"@eclipse-lyra/core\";\nimport type { NotebookCell, NotebookData, NotebookEditorLike } from \"./notebook-types\";\nimport type { NotebookKernel, NotebookKernelContribution } from \"./notebook-kernel-api\";\nimport { TARGET_NOTEBOOK_KERNELS } from \"./notebook-kernel-api\";\n\nconst logger = createLogger('NotebookRuntime');\n\n@customElement('lyra-notebook-editor')\nexport class LyraNotebookEditor extends LyraPart implements NotebookEditorLike {\n @property({ attribute: false })\n public input?: EditorInput;\n\n @state()\n public notebook?: NotebookData;\n\n @state()\n private cellOutputs: Map<number, any> = new Map();\n\n @state()\n private executingCells: Set<number> = new Set();\n\n @state()\n private availableKernels: NotebookKernelContribution[] = [];\n\n @state()\n private selectedKernelId: string | null = null;\n\n @state()\n private kernel: NotebookKernel | null = null;\n\n @state()\n private kernelConnected: boolean = false;\n\n @state()\n private kernelConnecting: boolean = false;\n\n @state()\n private kernelVersion: string | undefined = undefined;\n\n private unsubscribeContributionsToken?: string;\n\n @state()\n private editingMarkdownCells: Set<number> = new Set();\n\n @state()\n private executionCounter: number = 0;\n\n @state()\n private isRunningAll: boolean = false;\n\n @state()\n private highlightedCellIndex: number = -1;\n\n public focusedCellIndex: number = -1;\n private cancelRunAll: boolean = false;\n\n private monacoEditors: Map<number, monaco.editor.IStandaloneCodeEditor> = new Map();\n private cellRefs: Map<number, Ref<HTMLElement>> = new Map();\n private themeObserver?: MutationObserver;\n\n protected doClose() {\n this.input = undefined;\n this.notebook = undefined;\n this.cellOutputs.clear();\n this.executingCells.clear();\n\n // Dispose Monaco editors\n this.monacoEditors.forEach(editor => editor.dispose());\n this.monacoEditors.clear();\n this.cellRefs.clear();\n this.focusedCellIndex = -1;\n\n if (this.themeObserver) {\n this.themeObserver.disconnect();\n this.themeObserver = undefined;\n }\n\n if (this.unsubscribeContributionsToken) {\n unsubscribe(this.unsubscribeContributionsToken);\n this.unsubscribeContributionsToken = undefined;\n }\n\n if (this.kernel?.close) {\n void Promise.resolve(this.kernel.close());\n }\n this.kernel = null;\n this.kernelConnected = false;\n this.kernelVersion = undefined;\n }\n\n async save() {\n if (!this.notebook || !this.input) return;\n\n try {\n // Update cell contents from Monaco editors before saving\n this.saveEditorContents();\n\n this.notebook.cells.forEach((cell, index) => {\n if (cell.cell_type === 'code') {\n const output = this.cellOutputs.get(index);\n cell.outputs = output ? this.convertOutputToJupyter(output, cell.execution_count) : [];\n }\n });\n\n // Serialize notebook to JSON\n const notebookJson = JSON.stringify(this.notebook, null, 2);\n\n // Save to file\n const file: File = this.input.data;\n await file.saveContents(notebookJson);\n\n // Mark as not dirty\n this.markDirty(false);\n } catch (error) {\n console.error(\"Failed to save notebook:\", error);\n throw error;\n }\n }\n\n protected doBeforeUI() {\n // Start loading notebook asynchronously\n this.loadNotebook();\n }\n\n private async onKernelDropdownSelect(e: CustomEvent<{ item?: { value?: string } }>): Promise<void> {\n const value = e.detail?.item?.value ?? '';\n const nextId = value || null;\n if (this.selectedKernelId === nextId) return;\n if (this.kernel?.close) void Promise.resolve(this.kernel.close());\n this.kernel = null;\n this.kernelConnected = false;\n this.kernelVersion = undefined;\n this.selectedKernelId = nextId;\n if (this.notebook) {\n if (!this.notebook.metadata) this.notebook.metadata = {};\n this.notebook.metadata.kernel = nextId ?? undefined;\n }\n this.cellOutputs.clear();\n this.executionCounter = 0;\n this.notebook?.cells?.forEach((cell) => {\n if (cell.cell_type === 'code') {\n cell.execution_count = null;\n cell.outputs = [];\n }\n });\n this.resetCellState();\n await this.ensureKernelLoaded();\n this.requestUpdate();\n this.updateToolbar();\n }\n\n protected renderToolbar() {\n const kernels = this.availableKernels;\n const hasKernels = kernels.length > 0;\n const currentLabel = this.selectedKernelId\n ? kernels.find((c) => c.id === this.selectedKernelId)?.label ?? this.selectedKernelId\n : 'Select kernel';\n\n const connectionTitle = this.kernelConnecting\n ? 'Connecting...'\n : this.kernelConnected\n ? 'Kernel connected'\n : 'Kernel disconnected';\n const connectionText = this.kernelConnecting\n ? 'Connecting...'\n : this.kernelConnected\n ? (this.kernelVersion ?? 'Connected')\n : 'Not connected';\n const iconColor = this.kernelConnected\n ? 'var(--wa-color-green-40)'\n : this.kernelConnecting\n ? 'var(--wa-color-warning-500)'\n : 'var(--wa-color-red-40)';\n\n const runAllButton = this.isRunningAll ? html`\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.cancelAllCells()} title=\"Cancel running all cells\">\n <wa-icon name=\"stop\" label=\"Stop\"></wa-icon>\n Cancel All\n </wa-button>\n ` : html`\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.runAllCells()} title=\"Run all code cells sequentially\">\n <wa-icon name=\"play\" label=\"Run\"></wa-icon>\n Run All\n </wa-button>\n `;\n\n return html`\n <wa-dropdown\n class=\"kernel-select\"\n placement=\"bottom-start\"\n distance=\"4\"\n size=\"small\"\n @wa-select=${(e: CustomEvent<{ item?: { value?: string } }>) => void this.onKernelDropdownSelect(e)}\n >\n <wa-button\n slot=\"trigger\"\n appearance=\"plain\"\n size=\"small\"\n with-caret\n title=\"Notebook kernel\"\n >\n ${currentLabel}\n </wa-button>\n ${kernels.map(\n (c) => html`\n <wa-dropdown-item\n value=${c.id}\n type=\"checkbox\"\n ?checked=${c.id === this.selectedKernelId}\n >\n ${c.label}\n </wa-dropdown-item>\n `\n )}\n </wa-dropdown>\n ${runAllButton}\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n @click=${() => this.clearAllOutputs()}\n title=\"Clear all outputs and reset execution counter\"\n >\n <wa-icon name=\"eraser\" label=\"Clear\"></wa-icon>\n Clear Outputs\n </wa-button>\n ${this.kernel?.restart ? html`\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n @click=${() => void this.restartKernel()}\n title=\"Restart kernel\"\n ?disabled=${!this.kernelConnected || this.kernelConnecting}\n >\n <wa-icon name=\"arrows-rotate\" label=\"Restart\"></wa-icon>\n Restart Kernel\n </wa-button>\n ` : ''}\n ${this.kernel?.openPackageManager ? html`\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n @click=${() => this.openPackageManager()}\n title=\"Manage packages\"\n >\n <wa-icon name=\"box\" label=\"Packages\"></wa-icon>\n Packages\n </wa-button>\n ` : ''}\n ${this.kernel ? (this.kernel.connect ? html`\n <wa-button\n appearance=\"plain\"\n size=\"small\"\n style=\"display: flex; align-items: center; gap: 0.5rem;\"\n ?disabled=${this.kernelConnecting}\n @click=${() => void this.connectKernel()}\n title=${connectionTitle}\n >\n <wa-icon name=\"circle\" label=\"Kernel status\" style=${styleMap({ color: iconColor })}></wa-icon>\n ${connectionText}\n </wa-button>\n ` : html`\n <span style=\"display: flex; align-items: center; gap: 0.5rem;\" title=${connectionTitle}>\n <wa-icon name=\"circle\" label=\"Kernel status\" style=${styleMap({ color: iconColor })}></wa-icon>\n ${connectionText}\n </span>\n `) : ''}\n `;\n }\n\n private async connectKernel(): Promise<void> {\n if (this.kernelConnecting || !this.kernel?.connect) return;\n try {\n this.kernelConnecting = true;\n this.requestUpdate();\n this.updateToolbar();\n await this.kernel.connect({\n requiredPackages: this.notebook?.metadata?.required_packages,\n });\n this.kernelConnected = true;\n if (this.kernel.getVersion) this.kernelVersion = await this.kernel.getVersion();\n } catch (err) {\n logger.error('Failed to connect kernel', err);\n } finally {\n this.kernelConnecting = false;\n this.requestUpdate();\n this.updateToolbar();\n }\n }\n\n protected async doInitUI() {\n this.setupThemeObserver();\n this.unsubscribeContributionsToken = subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: { target?: string }) => {\n if (event?.target === TARGET_NOTEBOOK_KERNELS) {\n void this.refreshKernels();\n }\n });\n await this.refreshKernels();\n }\n\n private resolveDefaultKernelId(contributions: NotebookKernelContribution[]): string | null {\n if (!contributions.length) return null;\n const fromMeta = this.notebook?.metadata?.kernel;\n if (fromMeta && contributions.some((c) => c.id === fromMeta)) return fromMeta;\n const python = contributions.find((c) => c.id === 'python');\n if (python) return python.id;\n const js = contributions.find((c) => c.id === 'javascript');\n if (js) return js.id;\n return contributions[0].id;\n }\n\n private async refreshKernels(): Promise<void> {\n const contributions = contributionRegistry.getContributions<NotebookKernelContribution>(TARGET_NOTEBOOK_KERNELS);\n this.availableKernels = contributions;\n if (!this.selectedKernelId && contributions.length) {\n this.selectedKernelId = this.resolveDefaultKernelId(contributions);\n if (this.notebook && this.selectedKernelId) {\n if (!this.notebook.metadata) this.notebook.metadata = {};\n this.notebook.metadata.kernel = this.selectedKernelId;\n }\n }\n if (this.selectedKernelId && !contributions.some((c) => c.id === this.selectedKernelId)) {\n this.selectedKernelId = contributions.length ? contributions[0].id : null;\n }\n this.requestUpdate();\n await this.ensureKernelLoaded();\n this.updateToolbar();\n }\n\n private async ensureKernelLoaded(): Promise<void> {\n const id = this.selectedKernelId;\n if (!id || this.kernel?.id === id) return;\n if (this.kernel?.close) void Promise.resolve(this.kernel.close());\n this.kernel = null;\n this.kernelConnected = false;\n this.kernelVersion = undefined;\n const contribution = this.availableKernels.find((c) => c.id === id);\n if (!contribution) return;\n try {\n this.kernelConnecting = true;\n this.requestUpdate();\n this.updateToolbar();\n const k = await contribution.loadKernel();\n if (this.selectedKernelId !== id) return;\n this.kernel = k;\n if (k.connect) {\n await k.connect({\n requiredPackages: this.notebook?.metadata?.required_packages,\n });\n }\n this.kernelConnected = true;\n if (k.getVersion) {\n this.kernelVersion = await k.getVersion();\n }\n } catch (err) {\n logger.error('Failed to load kernel', id, err);\n } finally {\n this.kernelConnecting = false;\n this.requestUpdate();\n this.updateToolbar();\n }\n }\n\n private async loadNotebook() {\n const file: File = this.input!.data;\n const contents = await file.getContents();\n\n try {\n this.notebook = JSON.parse(contents as string);\n } catch (e) {\n console.error(\"Failed to parse notebook:\", e);\n this.notebook = {\n cells: [{\n cell_type: 'markdown',\n source: ['# Error\\nFailed to parse notebook file.']\n }]\n };\n }\n\n if (this.notebook?.metadata?.kernel) {\n this.selectedKernelId = this.notebook.metadata.kernel;\n }\n\n if (this.notebook?.cells) {\n const maxCount = this.notebook.cells\n .filter(cell => cell.cell_type === 'code')\n .map(cell => cell.execution_count ?? 0)\n .reduce((max, count) => Math.max(max, count), 0);\n this.executionCounter = maxCount;\n\n this.notebook.cells.forEach((cell, index) => {\n if (cell.cell_type === 'code' && cell.outputs && cell.outputs.length > 0) {\n const output = this.convertOutputFromJupyter(cell.outputs[0]);\n if (output) {\n this.cellOutputs.set(index, output);\n }\n }\n });\n }\n\n void this.refreshKernels();\n }\n\n private setupThemeObserver() {\n const rootElement = document.documentElement;\n let currentTheme = this.getMonacoTheme();\n\n this.themeObserver = new MutationObserver(() => {\n const newTheme = this.getMonacoTheme();\n // Only update if theme actually changed\n if (newTheme !== currentTheme) {\n currentTheme = newTheme;\n monaco.editor.setTheme(newTheme);\n }\n });\n\n this.themeObserver.observe(rootElement, {\n attributes: true,\n attributeFilter: ['class']\n });\n }\n\n private getCellSource(cell: NotebookCell): string {\n return Array.isArray(cell.source) ? cell.source.join('') : cell.source;\n }\n\n private convertOutputToJupyter(output: any, executionCount: number | null | undefined): any[] {\n if (output.type === 'execute_result') {\n const data: any = {};\n if (output.imageData) data['image/png'] = output.imageData;\n if (output.data) data['text/plain'] = output.data;\n return [{\n output_type: 'execute_result',\n data,\n execution_count: executionCount,\n metadata: {}\n }];\n } else if (output.type === 'error') {\n return [{\n output_type: 'error',\n ename: 'Error',\n evalue: output.data,\n traceback: [output.data]\n }];\n }\n return [];\n }\n\n private convertOutputFromJupyter(jupyterOutput: any): any | null {\n if (jupyterOutput.output_type === 'execute_result' && jupyterOutput.data) {\n return {\n type: 'execute_result',\n data: jupyterOutput.data['text/plain'] || '',\n imageData: jupyterOutput.data['image/png'] || undefined\n };\n } else if (jupyterOutput.output_type === 'error') {\n return {\n type: 'error',\n data: jupyterOutput.evalue || jupyterOutput.traceback?.join('\\n') || 'Unknown error'\n };\n }\n return null;\n }\n\n private renderHeaderActions(index: number, additionalButton?: any) {\n return html`\n <div class=\"cell-header-actions\">\n ${additionalButton || ''}\n ${additionalButton ? html`<span class=\"divider\"></span>` : ''}\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.addCell(index, 'code')} title=\"Add code cell before\">\n <wa-icon name=\"plus\"></wa-icon>\n <wa-icon name=\"code\" label=\"Code\"></wa-icon>\n </wa-button>\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.addCell(index, 'markdown')} title=\"Add markdown cell before\">\n <wa-icon name=\"plus\"></wa-icon>\n <wa-icon name=\"font\" label=\"Markdown\"></wa-icon>\n </wa-button>\n <span class=\"divider\"></span>\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.deleteCell(index)} title=\"Delete cell\" ?disabled=${this.notebook!.cells.length <= 1}>\n <wa-icon name=\"trash\" label=\"Delete cell\"></wa-icon>\n </wa-button>\n </div>\n `;\n }\n\n private renderFooterActions(index: number) {\n return html`\n <div class=\"cell-footer\">\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.addCell(index + 1, 'code')} title=\"Add code cell after\">\n <wa-icon name=\"code\" label=\"Code\"></wa-icon>\n <wa-icon name=\"plus\"></wa-icon>\n </wa-button>\n <wa-button size=\"small\" appearance=\"plain\" @click=${() => this.addCell(index + 1, 'markdown')} title=\"Add markdown cell after\">\n <wa-icon name=\"font\" label=\"Markdown\"></wa-icon>\n <wa-icon name=\"plus\"></wa-icon>\n </wa-button>\n </div>\n `;\n }\n\n // Helper to convert string to Jupyter source format\n private stringToSourceArray(content: string): string[] {\n if (!content) return [''];\n const lines = content.split('\\n').map(line => line + '\\n');\n // Remove trailing newline from last line\n if (lines.length > 0) {\n lines[lines.length - 1] = lines[lines.length - 1].replace(/\\n$/, '');\n }\n return lines;\n }\n\n // Helper to create a new cell\n private createCell(cellType: 'code' | 'markdown'): NotebookCell {\n const newCell: NotebookCell = {\n cell_type: cellType,\n source: [''],\n metadata: {}\n };\n\n if (cellType === 'code') {\n newCell.execution_count = null;\n newCell.outputs = [];\n }\n\n return newCell;\n }\n\n public async executeCell(cellIndex: number) {\n const cell = this.notebook!.cells[cellIndex];\n if (cell.cell_type !== 'code') return;\n\n this.executingCells.add(cellIndex);\n this.requestUpdate();\n\n try {\n await this.ensureKernelLoaded();\n const k = this.kernel;\n if (!k) {\n if (this.executingCells.has(cellIndex)) {\n this.cellOutputs.set(cellIndex, { type: 'error', data: 'No kernel selected' });\n }\n return;\n }\n\n const editor = this.monacoEditors.get(cellIndex);\n const code = editor ? editor.getValue() : this.getCellSource(cell);\n\n const result = await k.execute(code);\n\n if (result.error) {\n this.cellOutputs.set(cellIndex, { type: 'error', data: result.error });\n } else {\n this.cellOutputs.set(cellIndex, {\n type: 'execute_result',\n data: result.data,\n imageData: result.imageData,\n });\n }\n\n this.executionCounter++;\n cell.execution_count = this.executionCounter;\n this.markDirty(true);\n } catch (error) {\n if (this.executingCells.has(cellIndex)) {\n this.cellOutputs.set(cellIndex, {\n type: 'error',\n data: error instanceof Error ? error.message : String(error),\n });\n }\n } finally {\n this.executingCells.delete(cellIndex);\n this.requestUpdate();\n }\n }\n\n private cancelExecution(cellIndex: number) {\n if (this.kernel?.interrupt) {\n this.kernel.interrupt();\n } else {\n this.cellOutputs.set(cellIndex, {\n type: 'error',\n data: 'Cancellation not supported for this kernel',\n });\n this.executingCells.delete(cellIndex);\n this.requestUpdate();\n }\n }\n\n private clearAllOutputs() {\n // Clear all outputs\n this.cellOutputs.clear();\n\n // Reset execution counter\n this.executionCounter = 0;\n\n // Reset execution counts on all code cells\n if (this.notebook?.cells) {\n this.notebook.cells.forEach(cell => {\n if (cell.cell_type === 'code') {\n cell.execution_count = null;\n cell.outputs = [];\n }\n });\n }\n\n // Mark as dirty since we've modified the notebook\n this.markDirty(true);\n\n // Force re-render\n this.requestUpdate();\n }\n\n private async restartKernel() {\n if (!this.kernel?.restart || this.kernelConnecting) return;\n try {\n this.kernelConnecting = true;\n this.requestUpdate();\n this.updateToolbar();\n await this.kernel.restart();\n this.kernelConnected = true;\n if (this.kernel.getVersion) this.kernelVersion = await this.kernel.getVersion();\n } catch (error) {\n logger.error('Failed to restart kernel', error);\n } finally {\n this.kernelConnecting = false;\n this.requestUpdate();\n this.updateToolbar();\n }\n }\n\n private async runAllCells() {\n if (!this.notebook?.cells) return;\n\n this.isRunningAll = true;\n this.cancelRunAll = false;\n this.requestUpdate();\n\n try {\n // Execute all code cells sequentially\n for (let i = 0; i < this.notebook.cells.length; i++) {\n // Check if cancellation was requested\n if (this.cancelRunAll) {\n break;\n }\n\n const cell = this.notebook.cells[i];\n if (cell.cell_type === 'code') {\n await this.executeCell(i);\n }\n }\n } finally {\n this.isRunningAll = false;\n this.cancelRunAll = false;\n this.requestUpdate();\n }\n }\n\n private cancelAllCells() {\n this.cancelRunAll = true;\n this.kernel?.interrupt?.();\n }\n\n private toggleMarkdownEdit(index: number) {\n if (this.editingMarkdownCells.has(index)) {\n this.editingMarkdownCells.delete(index);\n } else {\n this.editingMarkdownCells.add(index);\n }\n this.requestUpdate();\n }\n\n private saveMarkdownEdit(index: number, event: Event) {\n const textarea = event.target as HTMLTextAreaElement;\n const newContent = textarea.value;\n\n // Update the cell source\n if (this.notebook && this.notebook.cells[index]) {\n const cell = this.notebook.cells[index];\n const oldContent = this.getCellSource(cell);\n\n cell.source = this.stringToSourceArray(newContent);\n\n // Mark dirty if content changed\n if (oldContent !== newContent) {\n this.markDirty(true);\n }\n }\n\n this.editingMarkdownCells.delete(index);\n this.requestUpdate();\n }\n\n private renderMarkdownCell(cell: NotebookCell, index: number) {\n const source = this.getCellSource(cell);\n const isEmpty = !source || source.trim() === '';\n const isEditing = this.editingMarkdownCells.has(index);\n\n if (isEditing) {\n const editButtons = html`\n <wa-button \n size=\"small\" \n appearance=\"plain\"\n @click=${(e: Event) => {\n const textarea = (e.target as HTMLElement).closest('.markdown-cell')?.querySelector('textarea');\n if (textarea) {\n this.saveMarkdownEdit(index, { target: textarea } as any);\n }\n }}\n title=\"Save changes\">\n <wa-icon name=\"check\" label=\"Save\"></wa-icon>\n </wa-button>\n <wa-button \n size=\"small\" \n appearance=\"plain\"\n @click=${() => this.toggleMarkdownEdit(index)}\n title=\"Cancel editing\">\n <wa-icon name=\"xmark\" label=\"Cancel\"></wa-icon>\n </wa-button>\n `;\n \n return html`\n <div class=\"cell-wrapper\">\n <wa-animation \n name=\"bounce\" \n duration=\"1000\" \n iterations=\"1\"\n ?play=${this.highlightedCellIndex === index}\n @wa-finish=${() => this.highlightedCellIndex = -1}>\n <div class=\"cell markdown-cell editing\">\n <div class=\"cell-header\">\n ${this.renderHeaderActions(index, editButtons)}\n <span class=\"cell-label\">Markdown</span>\n </div>\n <textarea \n class=\"markdown-editor\"\n .value=${source}\n @blur=${(e: Event) => this.saveMarkdownEdit(index, e)}\n placeholder=\"Enter markdown content here... (# for headings, ** for bold, etc.)\"></textarea>\n ${this.renderFooterActions(index)}\n </div>\n </wa-animation>\n </div>\n `;\n }\n\n const rendered = marked.parse(source) as string;\n\n const editButton = html`\n <wa-button \n size=\"small\" \n appearance=\"plain\"\n @click=${() => this.toggleMarkdownEdit(index)}\n title=\"Edit markdown\">\n <wa-icon name=\"pencil\" label=\"Edit\"></wa-icon>\n </wa-button>\n `;\n\n return html`\n <div class=\"cell-wrapper\">\n <wa-animation \n name=\"bounce\" \n duration=\"1000\" \n iterations=\"1\"\n ?play=${this.highlightedCellIndex === index}\n @wa-finish=${() => this.highlightedCellIndex = -1}>\n <div class=\"cell markdown-cell ${isEmpty ? 'empty' : ''}\" @dblclick=${() => this.toggleMarkdownEdit(index)}>\n <div class=\"cell-header\">\n ${this.renderHeaderActions(index, editButton)}\n <span class=\"cell-label\"></span>\n </div>\n <div class=\"cell-content\">\n ${isEmpty ? html`\n <div class=\"markdown-placeholder\">\n <wa-icon name=\"font\" label=\"Markdown\"></wa-icon>\n <span>Double-click or click the pencil icon to edit markdown</span>\n </div>\n ` : unsafeHTML(rendered)}\n </div>\n ${this.renderFooterActions(index)}\n </div>\n </wa-animation>\n </div>\n `;\n }\n\n private renderCodeCell(cell: NotebookCell, index: number) {\n const output = this.cellOutputs.get(index);\n const isExecuting = this.executingCells.has(index);\n\n // Create or get ref for this cell\n if (!this.cellRefs.has(index)) {\n this.cellRefs.set(index, createRef());\n }\n const cellRef = this.cellRefs.get(index)!;\n\n const runButton = isExecuting ? html`\n <wa-button \n size=\"small\" \n appearance=\"plain\"\n @click=${() => this.cancelExecution(index)}\n title=\"Stop execution\">\n <wa-icon name=\"stop\" label=\"Stop\" style=\"color: var(--wa-color-danger-500);\"></wa-icon>\n </wa-button>\n ` : html`\n <lyra-command \n cmd=\"notebook.runCell\"\n icon=\"play\"\n title=\"Run cell\"\n size=\"small\"\n appearance=\"plain\"\n .params=${{ cellIndex: index }}>\n </lyra-command>\n `;\n\n return html`\n <div class=\"cell-wrapper\">\n <wa-animation \n name=\"bounce\" \n duration=\"1000\" \n iterations=\"1\"\n ?play=${this.highlightedCellIndex === index}\n @wa-finish=${() => this.highlightedCellIndex = -1}>\n <div class=\"cell code-cell ${isExecuting ? 'executing' : ''}\">\n <div class=\"cell-header\">\n <span class=\"cell-label\">\n ${isExecuting ? html`\n In [<wa-animation name=\"pulse\" duration=\"1000\" iterations=\"Infinity\" ?play=${isExecuting}>\n <span class=\"executing-indicator\">*</span>\n </wa-animation>]\n ` : html`\n In [${cell.execution_count ?? ' '}]\n `}\n </span>\n ${this.renderHeaderActions(index, runButton)}\n </div>\n <div class=\"cell-input monaco-container\" ${ref(cellRef)} data-cell-index=\"${index}\"></div>\n ${output ? html`\n <div class=\"cell-output ${output.type === 'error' ? 'output-error' : ''}\">\n <div class=\"output-label\">Out [${index + 1}]:</div>\n ${output.imageData ? html`\n <img src=\"data:image/png;base64,${output.imageData}\" alt=\"Output image\" class=\"output-image\" />\n ` : ''}\n ${output.data ? html`<pre><code>${output.data}</code></pre>` : ''}\n </div>\n ` : ''}\n ${this.renderFooterActions(index)}\n </div>\n </wa-animation>\n </div>\n `;\n }\n\n private renderCell(cell: NotebookCell, index: number) {\n if (cell.cell_type === 'markdown') {\n return this.renderMarkdownCell(cell, index);\n } else if (cell.cell_type === 'code') {\n return this.renderCodeCell(cell, index);\n } else {\n // raw cell\n const source = this.getCellSource(cell);\n return html`\n <div class=\"cell raw-cell\">\n <pre><code>${source}</code></pre>\n </div>\n `;\n }\n }\n\n private addCell(index: number, cellType: 'code' | 'markdown' = 'code') {\n if (!this.notebook) return;\n\n // Save editor contents BEFORE modifying the cells array\n this.saveEditorContents();\n \n this.shiftIndices(index, 'up');\n \n this.notebook.cells.splice(index, 0, this.createCell(cellType));\n \n // Automatically enter edit mode for new markdown cells\n if (cellType === 'markdown') {\n this.editingMarkdownCells.add(index);\n }\n \n this.resetCellState();\n \n // Trigger animation and scroll to the new cell\n this.highlightedCellIndex = index;\n this.updateComplete.then(() => {\n this.scrollToCell(index);\n });\n }\n\n private scrollToCell(index: number) {\n // Find the cell wrapper element\n const cellWrapper = this.shadowRoot?.querySelectorAll('.cell-wrapper')[index];\n if (!cellWrapper) return;\n\n // Find the wa-scroller container (parent of this component)\n const scroller = this.closest('wa-scroller');\n if (!scroller) {\n // Fallback to default scrollIntoView if no scroller found\n cellWrapper.scrollIntoView({ \n behavior: 'smooth', \n block: 'center',\n inline: 'nearest'\n });\n return;\n }\n\n // Manually scroll the wa-scroller to the cell position\n const scrollerRect = scroller.getBoundingClientRect();\n const cellRect = cellWrapper.getBoundingClientRect();\n const scrollTop = scroller.scrollTop;\n \n // Calculate target scroll position (center the cell)\n const targetScroll = scrollTop + (cellRect.top - scrollerRect.top) - (scrollerRect.height / 2) + (cellRect.height / 2);\n \n scroller.scrollTo({\n top: targetScroll,\n behavior: 'smooth'\n });\n }\n\n private saveEditorContents() {\n // Update cell contents from Monaco editors\n this.monacoEditors.forEach((editor, index) => {\n const cell = this.notebook!.cells[index];\n if (cell && cell.cell_type === 'code') {\n cell.source = this.stringToSourceArray(editor.getValue());\n }\n });\n }\n\n private resetCellState() {\n // Clear Monaco editors and refs since indices have changed\n this.monacoEditors.forEach(editor => editor.dispose());\n this.monacoEditors.clear();\n this.cellRefs.clear();\n this.markDirty(true);\n }\n\n private deleteCell(index: number) {\n if (!this.notebook || this.notebook.cells.length <= 1) return;\n\n // Save editor contents BEFORE modifying the cells array\n this.saveEditorContents();\n \n // Remove state for the deleted cell\n this.cellOutputs.delete(index);\n this.executingCells.delete(index);\n this.editingMarkdownCells.delete(index);\n \n this.notebook.cells.splice(index, 1);\n \n this.shiftIndices(index, 'down');\n \n this.resetCellState();\n }\n\n private shiftIndices(startIndex: number, direction: 'up' | 'down') {\n const shift = direction === 'up' ? 1 : -1;\n const filterFn = direction === 'up' \n ? (idx: number) => idx >= startIndex\n : (idx: number) => idx > startIndex;\n const sortFn = direction === 'up'\n ? (a: number, b: number) => b - a\n : (a: number, b: number) => a - b;\n\n const shiftMap = <T>(map: Map<number, T>) => {\n const indices = Array.from(map.keys()).filter(filterFn).sort(sortFn);\n indices.forEach(oldIndex => {\n const value = map.get(oldIndex);\n map.delete(oldIndex);\n map.set(oldIndex + shift, value!);\n });\n };\n\n const shiftSet = (set: Set<number>) => {\n const indices = Array.from(set).filter(filterFn).sort(sortFn);\n indices.forEach(oldIndex => {\n set.delete(oldIndex);\n set.add(oldIndex + shift);\n });\n };\n\n shiftMap(this.cellOutputs);\n shiftSet(this.executingCells);\n shiftSet(this.editingMarkdownCells);\n }\n\n private initializeMonacoEditor(container: HTMLElement, cell: NotebookCell, index: number) {\n const source = this.getCellSource(cell);\n const lineCount = source.split('\\n').length;\n const lineHeight = 19;\n const padding = 10;\n const minHeight = 100;\n const calculatedHeight = Math.max(minHeight, lineCount * lineHeight + padding);\n\n container.style.height = `${calculatedHeight}px`;\n\n const language = this.kernel?.language ?? 'javascript';\n const editor = monaco.editor.create(container, {\n value: source,\n language,\n theme: this.getMonacoTheme(),\n minimap: { enabled: false },\n scrollBeyondLastLine: false,\n lineNumbers: 'on',\n renderLineHighlight: 'all',\n automaticLayout: true,\n fontSize: 14,\n tabSize: 4,\n wordWrap: 'on',\n });\n\n let isEditorFocused = false;\n editor.onDidFocusEditorText(() => { \n isEditorFocused = true;\n this.focusedCellIndex = index;\n });\n editor.onDidBlurEditorText(() => { \n isEditorFocused = false;\n if (this.focusedCellIndex === index) {\n this.focusedCellIndex = -1;\n }\n });\n\n container.addEventListener('wheel', (e: WheelEvent) => {\n if (!isEditorFocused) {\n const scrollTop = editor.getScrollTop();\n const scrollHeight = editor.getScrollHeight();\n const contentHeight = editor.getContentHeight();\n const canScroll = scrollHeight > contentHeight;\n const atBoundary = (e.deltaY < 0 && scrollTop <= 0) || \n (e.deltaY > 0 && scrollTop + contentHeight >= scrollHeight);\n\n if (!canScroll || atBoundary) {\n e.stopImmediatePropagation();\n }\n }\n }, { passive: true, capture: true });\n\n editor.onDidContentSizeChange(() => {\n const contentHeight = editor.getContentHeight();\n container.style.height = `${Math.max(minHeight, contentHeight + padding)}px`;\n editor.layout();\n });\n\n editor.onDidChangeModelContent(() => {\n const currentValue = editor.getValue();\n const originalValue = this.getCellSource(cell);\n if (currentValue !== originalValue) {\n this.markDirty(true);\n }\n });\n\n this.monacoEditors.set(index, editor);\n }\n\n private getMonacoTheme(): string {\n const rootElement = document.documentElement;\n if (rootElement.classList.contains('wa-dark')) {\n return 'vs-dark';\n } else if (rootElement.classList.contains('wa-light')) {\n return 'vs';\n }\n return 'vs-dark';\n }\n\n private openPackageManager() {\n if (!this.kernel?.openPackageManager) return;\n const packages = this.notebook?.metadata?.required_packages ?? [];\n this.kernel.openPackageManager({\n requiredPackages: packages,\n onPackageAdded: (packageName: string) => {\n if (!this.notebook) return;\n if (!this.notebook.metadata) this.notebook.metadata = {};\n if (!this.notebook.metadata.required_packages) this.notebook.metadata.required_packages = [];\n if (!this.notebook.metadata.required_packages.includes(packageName)) {\n this.notebook.metadata.required_packages.push(packageName);\n this.markDirty(true);\n }\n },\n onPackageRemoved: (packageName: string) => {\n if (!this.notebook?.metadata?.required_packages) return;\n const index = this.notebook.metadata.required_packages.indexOf(packageName);\n if (index > -1) {\n this.notebook.metadata.required_packages.splice(index, 1);\n this.markDirty(true);\n }\n },\n });\n }\n\n protected updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n if (\n changedProperties.has('kernelConnected') ||\n changedProperties.has('kernelConnecting') ||\n changedProperties.has('kernelVersion') ||\n changedProperties.has('isRunningAll') ||\n changedProperties.has('availableKernels') ||\n changedProperties.has('selectedKernelId')\n ) {\n this.updateToolbar();\n }\n\n if (this.notebook?.cells) {\n this.notebook.cells.forEach((cell, index) => {\n if (cell.cell_type === 'code') {\n const ref = this.cellRefs.get(index);\n if (ref?.value && !this.monacoEditors.has(index)) {\n this.initializeMonacoEditor(ref.value, cell, index);\n }\n }\n });\n }\n }\n\n protected render() {\n if (!this.notebook) {\n return html`<div class=\"loading\">Loading notebook...</div>`;\n }\n\n return html`\n <style>\n ${monacoStyles}\n </style>\n <div class=\"noteboocells\">\n ${repeat(\n this.notebook.cells,\n (_cell, index) => index,\n (cell, index) => this.renderCell(cell, index)\n )}\n </div>\n `;\n }\n\n static styles = css`\n :host {\n display: block;\n width: 100%;\n }\n\n .kernel-select {\n max-width: 10rem;\n }\n\n .noteboocells {\n display: flex;\n flex-direction: column;\n gap: 3rem;\n max-width: 1200px;\n margin: 0 auto;\n padding: 2rem 1rem;\n width: 100%;\n box-sizing: border-box;\n }\n\n .cell-wrapper {\n position: relative;\n }\n\n .cell {\n border-radius: 4px;\n overflow: hidden;\n opacity: 0.9;\n position: relative;\n }\n\n .cell-header-actions {\n display: flex;\n gap: 0.25rem;\n align-items: center;\n opacity: 0.5;\n transition: opacity 0.2s;\n }\n\n .cell-header-actions .divider {\n width: 1px;\n height: 1rem;\n background: var(--wa-color-outline);\n margin: 0 0.25rem;\n opacity: 0.5;\n }\n\n .cell-header:hover .cell-header-actions {\n opacity: 1;\n }\n\n .cell-footer {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n justify-content: flex-start;\n padding: 0.5rem;\n border-top: 1px solid var(--wa-color-outline);\n opacity: 0.5;\n transition: opacity 0.2s;\n }\n\n .cell-footer:hover {\n opacity: 1;\n }\n\n .markdown-cell {\n cursor: pointer;\n transition: opacity 0.2s;\n }\n\n .markdown-cell:hover:not(.editing) {\n opacity: 0.9;\n }\n \n .markdown-cell .cell-content {\n padding: 1rem;\n }\n\n .markdown-cell.editing {\n cursor: default;\n padding: 0;\n }\n \n .markdown-cell.editing .cell-actions {\n display: none;\n }\n\n .markdown-editor {\n width: 100%;\n min-height: 200px;\n padding: 1rem;\n font-family: monospace;\n font-size: 0.95rem;\n line-height: 1.6;\n border: none;\n outline: none;\n resize: vertical;\n background: transparent;\n color: inherit;\n }\n\n .code-cell {\n border-left: 3px solid var(--wa-color-primary-500);\n transition: all 0.3s ease;\n }\n \n .code-cell.executing {\n border-left: 4px solid var(--wa-color-primary-500);\n box-shadow: 0 0 0 2px var(--wa-color-primary-500, rgba(59, 130, 246, 0.3));\n animation: pulse-cell 2s ease-in-out infinite;\n }\n \n @keyframes pulse-cell {\n 0%, 100% {\n box-shadow: 0 0 0 2px var(--wa-color-primary-500, rgba(59, 130, 246, 0.3));\n opacity: 1;\n }\n 50% {\n box-shadow: 0 0 0 4px var(--wa-color-primary-500, rgba(59, 130, 246, 0.5));\n opacity: 0.95;\n }\n }\n\n .cell-header {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n flex-wrap: nowrap;\n }\n\n .cell-label {\n font-family: monospace;\n font-weight: bold;\n flex-shrink: 0;\n }\n \n .executing-indicator {\n display: inline-block;\n color: var(--wa-color-primary-500);\n font-weight: bold;\n font-size: 1.2em;\n }\n\n .cell-input {\n margin: 0;\n }\n\n .monaco-container {\n min-height: 100px;\n height: auto;\n width: 100%;\n }\n\n .cell-output {\n padding: 1rem;\n }\n\n .output-label {\n font-family: monospace;\n font-weight: bold;\n margin-bottom: 0.5rem;\n opacity: 0.7;\n }\n\n .cell-output pre {\n margin: 0;\n overflow-x: auto;\n }\n\n .cell-output code {\n font-family: 'Courier New', monospace;\n font-size: 0.9rem;\n line-height: 1.5;\n }\n\n .output-image {\n max-width: 100%;\n height: auto;\n display: block;\n margin: 0.5rem 0;\n border-radius: 4px;\n }\n\n .output-error {\n border-left: 3px solid var(--wa-color-danger-500);\n }\n\n .raw-cell {\n padding: 1rem;\n }\n\n .raw-cell pre {\n margin: 0;\n }\n\n .loading {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n font-size: 1.2rem;\n }\n\n .markdown-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n padding: 3rem 1rem;\n opacity: 0.5;\n font-style: italic;\n transition: opacity 0.2s;\n }\n\n .markdown-cell.empty:hover .markdown-placeholder {\n opacity: 0.8;\n }\n\n .markdown-placeholder wa-icon {\n font-size: 1.5rem;\n }\n `;\n}\n"],"names":["ref"],"mappings":"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"}