@difizen/libro-core 0.3.41 → 0.3.43

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.
@@ -41,21 +41,16 @@ export declare class LibroCellView extends BaseView implements CellView {
41
41
  toJSON(): LibroCell;
42
42
  toJSONWithoutId: () => {
43
43
  [x: string]: import("@difizen/libro-common").PartialJSONValue | undefined;
44
- metadata: Partial<import("./libro-cell-protocol.js").LibroCellMetadata>;
45
- cell_type: string;
44
+ id?: string | undefined;
45
+ cell_type: "raw";
46
+ metadata: Partial<import("@difizen/libro-common").IRawCellMetadata>;
47
+ attachments?: import("@difizen/libro-common").IAttachments | undefined;
46
48
  source: import("@difizen/libro-common").MultilineString;
47
49
  } | {
48
50
  [x: string]: import("@difizen/libro-common").PartialJSONValue | undefined;
49
51
  cell_type: string;
50
52
  source: import("@difizen/libro-common").MultilineString;
51
53
  metadata: Partial<import("@difizen/libro-common").ICellMetadata>;
52
- } | {
53
- [x: string]: import("@difizen/libro-common").PartialJSONValue | undefined;
54
- id?: string | undefined;
55
- cell_type: "raw";
56
- metadata: Partial<import("@difizen/libro-common").IRawCellMetadata>;
57
- attachments?: import("@difizen/libro-common").IAttachments | undefined;
58
- source: import("@difizen/libro-common").MultilineString;
59
54
  } | {
60
55
  [x: string]: import("@difizen/libro-common").PartialJSONValue | undefined;
61
56
  id?: string | undefined;
@@ -71,6 +66,11 @@ export declare class LibroCellView extends BaseView implements CellView {
71
66
  outputs: import("@difizen/libro-common").IOutput[];
72
67
  execution_count: import("@difizen/libro-common").ExecutionCount;
73
68
  source: import("@difizen/libro-common").MultilineString;
69
+ } | {
70
+ [x: string]: import("@difizen/libro-common").PartialJSONValue | undefined;
71
+ metadata: Partial<import("./libro-cell-protocol.js").LibroCellMetadata>;
72
+ cell_type: string;
73
+ source: import("@difizen/libro-common").MultilineString;
74
74
  };
75
75
  }
76
76
  //# sourceMappingURL=libro-cell-view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"libro-virtualized-render.d.ts","sourceRoot":"","sources":["../../src/components/libro-virtualized-render.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD,UAAU,wBAAwB;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAkBlE,CAAC;AAGF,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC5C,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,SAAS,CAAC;CAC3B,CAkKA,CAAC"}
1
+ {"version":3,"file":"libro-virtualized-render.d.ts","sourceRoot":"","sources":["../../src/components/libro-virtualized-render.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAKlD,UAAU,wBAAwB;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAkBlE,CAAC;AAGF,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC5C,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,SAAS,CAAC;CAC3B,CAoNA,CAAC"}
@@ -13,6 +13,7 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
13
13
  import { AutoSizer, List } from '@difizen/libro-virtualized';
14
14
  import { memo, useEffect, useMemo, useRef, useState } from 'react';
15
15
  import { EditorCellView } from "../cell/index.js";
16
+ import { useFrameMonitor } from "../utils/index.js";
16
17
  import { DndCellRender } from "./dnd-component/index.js";
17
18
  import { Fragment as _Fragment } from "react/jsx-runtime";
18
19
  import { jsx as _jsx } from "react/jsx-runtime";
@@ -37,12 +38,15 @@ export var LibroVirtualizedRow = /*#__PURE__*/memo(function LibroVirtualizedRow(
37
38
 
38
39
  // 已经在上层判断是否为虚拟滚动
39
40
  export var LibroCellsOutputRender = function LibroCellsOutputRender(_ref2) {
41
+ var _listRef$current;
40
42
  var cells = _ref2.cells,
41
43
  libroView = _ref2.libroView,
42
44
  addCellButtons = _ref2.addCellButtons;
43
45
  var parentRef = useRef(null);
44
46
  var listRef = useRef(null);
45
47
  var noEditorAreaRef = useRef(null);
48
+ var scrollTopRef = useRef(0);
49
+ var viewportHeightRef = useRef(0);
46
50
  var _useState = useState([]),
47
51
  _useState2 = _slicedToArray(_useState, 2),
48
52
  editorsOffset = _useState2[0],
@@ -113,13 +117,33 @@ export var LibroCellsOutputRender = function LibroCellsOutputRender(_ref2) {
113
117
  return;
114
118
  }
115
119
  libroView.model.onScrollToCellView(function (params) {
116
- // listRef.current!.scrollToRow(index);
117
- listRef.current.scrollToCellPosition(params.cellIndex, params.cellOffset);
120
+ var index = params.cellIndex;
121
+ var offset = params.cellOffset || 0;
122
+ var top = (editorsOffset[index] || 0) + offset;
123
+ var height = (noEditorAreaHeight[index] || 0) + (editorAreaHeight[index] || 0);
124
+ var viewportTop = scrollTopRef.current;
125
+ var viewportHeight = viewportHeightRef.current;
126
+ if (viewportHeight && height) {
127
+ if (top > viewportTop && top + height < viewportTop + viewportHeight) {
128
+ // 在可视范围内就不需要滚动
129
+ return;
130
+ }
131
+ if (top < viewportTop) {
132
+ listRef.current.scrollToCellPosition(index, offset);
133
+ } else {
134
+ var prevCellNoEditorHeight = noEditorAreaHeight[index - 1] || 0;
135
+ var prevCellEditorHeight = editorAreaHeight[index - 1] || 0;
136
+ var centerOffset = offset - viewportHeight / 2 - (prevCellNoEditorHeight - prevCellEditorHeight);
137
+ listRef.current.scrollToCellPosition(index, centerOffset); // 把目标 cell 的顶部放到视窗的中间位置
138
+ }
139
+ } else {
140
+ listRef.current.scrollToCellPosition(index, offset);
141
+ }
118
142
  });
119
143
  return function () {
120
144
  libroView.model.disposeScrollToCellViewEmitter();
121
145
  };
122
- }, [listRef, libroView]);
146
+ }, [listRef, libroView, editorsOffset, noEditorAreaHeight, editorAreaHeight]);
123
147
 
124
148
  // 在Cell的高度变化时,触发重新计算所有Cell的高度偏移值
125
149
  useEffect(function () {
@@ -141,7 +165,23 @@ export var LibroCellsOutputRender = function LibroCellsOutputRender(_ref2) {
141
165
  newCellOffsets[index] = offsetTop + offset;
142
166
  });
143
167
  setEditorsOffset(newCellOffsets);
144
- }, [noEditorAreaRef.current, cells]);
168
+ }, [cells]);
169
+ useFrameMonitor({
170
+ current: (_listRef$current = listRef.current) === null || _listRef$current === void 0 || (_listRef$current = _listRef$current.Grid) === null || _listRef$current === void 0 ? void 0 : _listRef$current._scrollingContainer
171
+ }, libroView.libroViewTracker.isEnabledSpmReporter, function (payload) {
172
+ var _libroView$model$curr;
173
+ var fpsTracker = libroView.libroViewTracker.getOrCreateTrackers({
174
+ type: 'fps',
175
+ id: libroView.model.options['modelId'] + 'fps'
176
+ });
177
+ fpsTracker['avgFPS'] = payload.summary.avgFPS;
178
+ fpsTracker['maxFrameTime'] = payload.summary.maxFrameTime;
179
+ fpsTracker['totalDropped'] = payload.summary.totalDropped;
180
+ fpsTracker['extra'] = payload.frames;
181
+ fpsTracker['cells'] = libroView.model.cells.length;
182
+ fpsTracker['size'] = (_libroView$model$curr = libroView.model.currentFileContents) === null || _libroView$model$curr === void 0 ? void 0 : _libroView$model$curr.size;
183
+ libroView.libroViewTracker.tracker(fpsTracker);
184
+ });
145
185
  return /*#__PURE__*/_jsx(AutoSizer, {
146
186
  style: {
147
187
  height: '100%',
@@ -151,6 +191,7 @@ export var LibroCellsOutputRender = function LibroCellsOutputRender(_ref2) {
151
191
  children: function children(_ref3) {
152
192
  var width = _ref3.width,
153
193
  height = _ref3.height;
194
+ viewportHeightRef.current = height;
154
195
  return /*#__PURE__*/_jsx(List, {
155
196
  ref: listRef,
156
197
  width: width,
@@ -174,6 +215,8 @@ export var LibroCellsOutputRender = function LibroCellsOutputRender(_ref2) {
174
215
  noEditorArea: noEditorArea,
175
216
  editorsOffset: editorsOffset,
176
217
  onScroll: function onScroll(scrollParams) {
218
+ scrollTopRef.current = scrollParams.scrollTop;
219
+ viewportHeightRef.current = scrollParams.clientHeight;
177
220
  libroView.cellScrollEmitter.fire({
178
221
  scrollingContainer: scrollParams.scrollingContainer,
179
222
  scrollTop: scrollParams.scrollTop
@@ -1 +1 @@
1
- {"version":3,"file":"libro-model.d.ts","sourceRoot":"","sources":["../src/libro-model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"libro-model.d.ts","sourceRoot":"","sources":["../src/libro-model.ts"],"names":[],"mappings":"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"}
package/es/libro-model.js CHANGED
@@ -561,9 +561,9 @@ export var LibroModel = (_dec = transient(), _dec2 = inject(NotebookOption), _de
561
561
  if (offsetTop < _scrollTop) {
562
562
  target.offsetParent.parentElement.scrollTop = offsetTop;
563
563
  } else {
564
- //目标cell的高度大于屏幕的高度
564
+ // 目标 cell 的高度大于屏幕的高度
565
565
  if (_targetheight >= _height) {
566
- target.offsetParent.parentElement.scrollTop = offsetTop - _height / 2;
566
+ target.offsetParent.parentElement.scrollTop = offsetTop - _height / 2; // 把目标 cell 的顶部放到视窗的中间位置
567
567
  } else {
568
568
  target.offsetParent.parentElement.scrollTop = offsetTop + _targetheight - _height + 30; // 加缓冲向上不贴底部
569
569
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@difizen/libro-core",
3
- "version": "0.3.41",
3
+ "version": "0.3.43",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "libro",
@@ -34,10 +34,10 @@
34
34
  ],
35
35
  "dependencies": {
36
36
  "@ant-design/icons": "^5.1.0",
37
- "@difizen/libro-code-editor": "^0.3.41",
38
- "@difizen/libro-common": "^0.3.41",
39
- "@difizen/libro-shared-model": "^0.3.41",
40
- "@difizen/libro-virtualized": "^0.3.41",
37
+ "@difizen/libro-code-editor": "^0.3.43",
38
+ "@difizen/libro-common": "^0.3.43",
39
+ "@difizen/libro-shared-model": "^0.3.43",
40
+ "@difizen/libro-virtualized": "^0.3.43",
41
41
  "@difizen/mana-app": "latest",
42
42
  "@difizen/mana-l10n": "latest",
43
43
  "@difizen/mana-react": "latest",
@@ -6,6 +6,7 @@ import { memo, useEffect, useMemo, useRef, useState } from 'react';
6
6
  import { EditorCellView } from '../cell/index.js';
7
7
  import type { CellView, ScrollParams } from '../libro-protocol.js';
8
8
  import type { LibroView } from '../libro-view.js';
9
+ import { useFrameMonitor } from '../utils/index.js';
9
10
 
10
11
  import { DndCellRender } from './dnd-component/index.js';
11
12
 
@@ -43,6 +44,8 @@ export const LibroCellsOutputRender: React.FC<{
43
44
  const parentRef = useRef(null);
44
45
  const listRef = useRef<List | null>(null);
45
46
  const noEditorAreaRef = useRef<HTMLDivElement | null>(null);
47
+ const scrollTopRef = useRef(0);
48
+ const viewportHeightRef = useRef(0);
46
49
 
47
50
  const [editorsOffset, setEditorsOffset] = useState<number[]>([]);
48
51
 
@@ -128,13 +131,38 @@ export const LibroCellsOutputRender: React.FC<{
128
131
  }
129
132
 
130
133
  libroView.model.onScrollToCellView((params: ScrollParams) => {
131
- // listRef.current!.scrollToRow(index);
132
- listRef.current!.scrollToCellPosition(params.cellIndex, params.cellOffset);
134
+ const index = params.cellIndex;
135
+ const offset = params.cellOffset || 0;
136
+ const top = (editorsOffset[index] || 0) + offset;
137
+ const height = (noEditorAreaHeight[index] || 0) + (editorAreaHeight[index] || 0);
138
+ const viewportTop = scrollTopRef.current;
139
+ const viewportHeight = viewportHeightRef.current;
140
+
141
+ if (viewportHeight && height) {
142
+ if (top > viewportTop && top + height < viewportTop + viewportHeight) {
143
+ // 在可视范围内就不需要滚动
144
+ return;
145
+ }
146
+ if (top < viewportTop) {
147
+ listRef.current!.scrollToCellPosition(index, offset);
148
+ } else {
149
+ const prevCellNoEditorHeight = noEditorAreaHeight[index - 1] || 0;
150
+ const prevCellEditorHeight = editorAreaHeight[index - 1] || 0;
151
+ const centerOffset =
152
+ offset -
153
+ viewportHeight / 2 -
154
+ (prevCellNoEditorHeight - prevCellEditorHeight);
155
+ listRef.current!.scrollToCellPosition(index, centerOffset); // 把目标 cell 的顶部放到视窗的中间位置
156
+ }
157
+ } else {
158
+ listRef.current!.scrollToCellPosition(index, offset);
159
+ }
133
160
  });
161
+
134
162
  return () => {
135
163
  libroView.model.disposeScrollToCellViewEmitter();
136
164
  };
137
- }, [listRef, libroView]);
165
+ }, [listRef, libroView, editorsOffset, noEditorAreaHeight, editorAreaHeight]);
138
166
 
139
167
  // 在Cell的高度变化时,触发重新计算所有Cell的高度偏移值
140
168
  useEffect(() => {
@@ -163,9 +191,30 @@ export const LibroCellsOutputRender: React.FC<{
163
191
  setEditorsOffset(newCellOffsets);
164
192
  }, [cells]);
165
193
 
194
+ useFrameMonitor(
195
+ {
196
+ current: listRef.current?.Grid?._scrollingContainer,
197
+ },
198
+ libroView.libroViewTracker.isEnabledSpmReporter,
199
+ (payload) => {
200
+ const fpsTracker = libroView.libroViewTracker.getOrCreateTrackers({
201
+ type: 'fps',
202
+ id: libroView.model.options['modelId'] + 'fps',
203
+ });
204
+ fpsTracker['avgFPS'] = payload.summary.avgFPS;
205
+ fpsTracker['maxFrameTime'] = payload.summary.maxFrameTime;
206
+ fpsTracker['totalDropped'] = payload.summary.totalDropped;
207
+ fpsTracker['extra'] = payload.frames;
208
+ fpsTracker['cells'] = libroView.model.cells.length;
209
+ fpsTracker['size'] = libroView.model.currentFileContents?.size;
210
+ libroView.libroViewTracker.tracker(fpsTracker);
211
+ },
212
+ );
213
+
166
214
  return (
167
215
  <AutoSizer style={{ height: '100%', width: '100%' }} ref={parentRef}>
168
216
  {({ width, height }: { width: number; height: number }) => {
217
+ viewportHeightRef.current = height;
169
218
  return (
170
219
  <List
171
220
  ref={listRef}
@@ -188,6 +237,8 @@ export const LibroCellsOutputRender: React.FC<{
188
237
  scrollTop: number;
189
238
  scrollingContainer: Element;
190
239
  }) => {
240
+ scrollTopRef.current = scrollParams.scrollTop;
241
+ viewportHeightRef.current = scrollParams.clientHeight;
191
242
  libroView.cellScrollEmitter.fire({
192
243
  scrollingContainer: scrollParams.scrollingContainer,
193
244
  scrollTop: scrollParams.scrollTop,
@@ -422,9 +422,11 @@ export class LibroModel implements NotebookModel, DndListModel {
422
422
  target = target?.offsetParent as HTMLElement;
423
423
  offsetTop += target?.offsetTop || 0;
424
424
  }
425
+
425
426
  if (target?.offsetParent?.parentElement && _targetheight) {
426
427
  const _height = target.offsetParent.parentElement.clientHeight;
427
428
  const _scrollTop = target.offsetParent.parentElement.scrollTop;
429
+
428
430
  if (offsetTop > _scrollTop && offsetTop + _targetheight < _height + _scrollTop) {
429
431
  // 在可视范围内就不需要滚动
430
432
  return;
@@ -432,9 +434,9 @@ export class LibroModel implements NotebookModel, DndListModel {
432
434
  if (offsetTop < _scrollTop) {
433
435
  target.offsetParent.parentElement.scrollTop = offsetTop;
434
436
  } else {
435
- //目标cell的高度大于屏幕的高度
437
+ // 目标 cell 的高度大于屏幕的高度
436
438
  if (_targetheight >= _height) {
437
- target.offsetParent.parentElement.scrollTop = offsetTop - _height / 2;
439
+ target.offsetParent.parentElement.scrollTop = offsetTop - _height / 2; // 把目标 cell 的顶部放到视窗的中间位置
438
440
  } else {
439
441
  target.offsetParent.parentElement.scrollTop =
440
442
  offsetTop + _targetheight - _height + 30; // 加缓冲向上不贴底部