@opentui/core 0.3.1 → 0.3.2

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.
@@ -182,7 +182,7 @@ import {
182
182
  white,
183
183
  wrapWithDelegates,
184
184
  yellow
185
- } from "./index-jx0p1c2f.js";
185
+ } from "./index-218h9p3f.js";
186
186
 
187
187
  // src/index.ts
188
188
  var exports_src2 = {};
@@ -278,6 +278,7 @@ __export(exports_src2, {
278
278
  createTextAttributes: () => createTextAttributes,
279
279
  createTerminalPalette: () => createTerminalPalette,
280
280
  createSlotRegistry: () => createSlotRegistry,
281
+ createMarkdownCodeBlockRenderer: () => createMarkdownCodeBlockRenderer,
281
282
  createExtmarksController: () => createExtmarksController,
282
283
  createCoreSlotRegistry: () => createCoreSlotRegistry,
283
284
  createCliRenderer: () => createCliRenderer,
@@ -4248,6 +4249,8 @@ class DiffRenderable extends Renderable {
4248
4249
  _view;
4249
4250
  _parsedDiff = null;
4250
4251
  _parseError = null;
4252
+ _hunkStartLines = [];
4253
+ _hunkRowOffsets = null;
4251
4254
  _fg;
4252
4255
  _filetype;
4253
4256
  _syntaxStyle;
@@ -4336,6 +4339,8 @@ class DiffRenderable extends Renderable {
4336
4339
  }
4337
4340
  }
4338
4341
  buildView() {
4342
+ this._hunkStartLines = [];
4343
+ this.invalidateHunkRowOffsets();
4339
4344
  if (this._parseError) {
4340
4345
  this.buildErrorView();
4341
4346
  return;
@@ -4396,6 +4401,9 @@ class DiffRenderable extends Renderable {
4396
4401
  }
4397
4402
  });
4398
4403
  }
4404
+ invalidateHunkRowOffsets() {
4405
+ this._hunkRowOffsets = null;
4406
+ }
4399
4407
  rebuildView() {
4400
4408
  if (this._view === "split") {
4401
4409
  this.requestRebuild();
@@ -4404,6 +4412,7 @@ class DiffRenderable extends Renderable {
4404
4412
  }
4405
4413
  }
4406
4414
  handleLineInfoChange = () => {
4415
+ this.invalidateHunkRowOffsets();
4407
4416
  if (!this._waitingForHighlight)
4408
4417
  return;
4409
4418
  if (!this.leftCodeRenderable || !this.rightCodeRenderable)
@@ -4416,13 +4425,17 @@ class DiffRenderable extends Renderable {
4416
4425
  }
4417
4426
  };
4418
4427
  attachLineInfoListeners() {
4419
- if (this._lineInfoChangeHandler)
4420
- return;
4421
- if (!this.leftCodeRenderable || !this.rightCodeRenderable)
4428
+ if (!this.leftCodeRenderable && !this.rightCodeRenderable)
4422
4429
  return;
4423
- this._lineInfoChangeHandler = this.handleLineInfoChange;
4424
- this.leftCodeRenderable.on("line-info-change", this._lineInfoChangeHandler);
4425
- this.rightCodeRenderable.on("line-info-change", this._lineInfoChangeHandler);
4430
+ this._lineInfoChangeHandler ??= this.handleLineInfoChange;
4431
+ if (this.leftCodeRenderable) {
4432
+ this.leftCodeRenderable.off("line-info-change", this._lineInfoChangeHandler);
4433
+ this.leftCodeRenderable.on("line-info-change", this._lineInfoChangeHandler);
4434
+ }
4435
+ if (this.rightCodeRenderable) {
4436
+ this.rightCodeRenderable.off("line-info-change", this._lineInfoChangeHandler);
4437
+ this.rightCodeRenderable.on("line-info-change", this._lineInfoChangeHandler);
4438
+ }
4426
4439
  }
4427
4440
  detachLineInfoListeners() {
4428
4441
  if (!this._lineInfoChangeHandler)
@@ -4612,6 +4625,7 @@ class DiffRenderable extends Renderable {
4612
4625
  const lineNumbers = new Map;
4613
4626
  let lineIndex = 0;
4614
4627
  for (const hunk of this._parsedDiff.hunks) {
4628
+ this._hunkStartLines.push(lineIndex);
4615
4629
  let oldLineNum = hunk.oldStart;
4616
4630
  let newLineNum = hunk.newStart;
4617
4631
  for (const line of hunk.lines) {
@@ -4674,6 +4688,7 @@ class DiffRenderable extends Renderable {
4674
4688
  const content = contentLines.join(`
4675
4689
  `);
4676
4690
  const codeRenderable = this.createOrUpdateCodeRenderable("left", content, this._wrapMode);
4691
+ this.attachLineInfoListeners();
4677
4692
  this.createOrUpdateSide("left", codeRenderable, lineColors, lineSigns, lineNumbers, new Set, "100%");
4678
4693
  if (this.rightSide && this.rightSideAdded) {
4679
4694
  super.remove(this.rightSide.id);
@@ -4698,7 +4713,9 @@ class DiffRenderable extends Renderable {
4698
4713
  }
4699
4714
  const leftLogicalLines = [];
4700
4715
  const rightLogicalLines = [];
4716
+ const hunkFirstLeftLine = [];
4701
4717
  for (const hunk of this._parsedDiff.hunks) {
4718
+ hunkFirstLeftLine.push(leftLogicalLines.length);
4702
4719
  let oldLineNum = hunk.oldStart;
4703
4720
  let newLineNum = hunk.newStart;
4704
4721
  let i = 0;
@@ -4785,6 +4802,11 @@ class DiffRenderable extends Renderable {
4785
4802
  }
4786
4803
  }
4787
4804
  }
4805
+ for (const startIndex of hunkFirstLeftLine) {
4806
+ const firstLine = leftLogicalLines[startIndex];
4807
+ if (firstLine)
4808
+ firstLine.hunkStart = true;
4809
+ }
4788
4810
  const canDoWrapAlignment = this.width > 0 && (this._wrapMode === "word" || this._wrapMode === "char");
4789
4811
  const preLeftContent = leftLogicalLines.map((l) => l.content).join(`
4790
4812
  `);
@@ -4794,6 +4816,7 @@ class DiffRenderable extends Renderable {
4794
4816
  const drawUnstyledText = !needsConsistentConcealing;
4795
4817
  const leftCodeRenderable = this.createOrUpdateCodeRenderable("left", preLeftContent, this._wrapMode, drawUnstyledText);
4796
4818
  const rightCodeRenderable = this.createOrUpdateCodeRenderable("right", preRightContent, this._wrapMode, drawUnstyledText);
4819
+ this.attachLineInfoListeners();
4797
4820
  let finalLeftLines;
4798
4821
  let finalRightLines;
4799
4822
  const leftIsHighlighting = leftCodeRenderable.isHighlighting;
@@ -4824,8 +4847,8 @@ class DiffRenderable extends Renderable {
4824
4847
  for (let i = 0;i < leftLogicalLines.length; i++) {
4825
4848
  const leftLine = leftLogicalLines[i];
4826
4849
  const rightLine = rightLogicalLines[i];
4827
- const leftVisualCount = leftVisualCounts.get(i) || 1;
4828
- const rightVisualCount = rightVisualCounts.get(i) || 1;
4850
+ const leftVisualCount = leftVisualCounts.get(i) ?? 0;
4851
+ const rightVisualCount = rightVisualCounts.get(i) ?? 0;
4829
4852
  if (leftVisualPos < rightVisualPos) {
4830
4853
  const pad = rightVisualPos - leftVisualPos;
4831
4854
  for (let p = 0;p < pad; p++) {
@@ -4868,6 +4891,9 @@ class DiffRenderable extends Renderable {
4868
4891
  const leftLineNumbers = new Map;
4869
4892
  const rightLineNumbers = new Map;
4870
4893
  finalLeftLines.forEach((line, index) => {
4894
+ if (line.hunkStart) {
4895
+ this._hunkStartLines.push(index);
4896
+ }
4871
4897
  if (line.lineNum !== undefined) {
4872
4898
  leftLineNumbers.set(index, line.lineNum);
4873
4899
  }
@@ -4957,9 +4983,6 @@ class DiffRenderable extends Renderable {
4957
4983
  set syncScroll(value) {
4958
4984
  if (this._syncScroll !== value) {
4959
4985
  this._syncScroll = value;
4960
- if (!value) {
4961
- this.detachLineInfoListeners();
4962
- }
4963
4986
  }
4964
4987
  }
4965
4988
  get view() {
@@ -4996,6 +5019,7 @@ class DiffRenderable extends Renderable {
4996
5019
  set wrapMode(value) {
4997
5020
  if (this._wrapMode !== value) {
4998
5021
  this._wrapMode = value;
5022
+ this.invalidateHunkRowOffsets();
4999
5023
  if (this._view === "unified" && this.leftCodeRenderable) {
5000
5024
  this.leftCodeRenderable.wrapMode = value ?? "none";
5001
5025
  } else if (this._view === "split") {
@@ -5215,6 +5239,28 @@ class DiffRenderable extends Renderable {
5215
5239
  this.leftSide?.clearHighlightLines(startLine, endLine);
5216
5240
  this.rightSide?.clearHighlightLines(startLine, endLine);
5217
5241
  }
5242
+ getHunkRowOffsets() {
5243
+ if (this._hunkRowOffsets)
5244
+ return [...this._hunkRowOffsets];
5245
+ this._hunkRowOffsets = this.computeHunkRowOffsets();
5246
+ return [...this._hunkRowOffsets];
5247
+ }
5248
+ computeHunkRowOffsets() {
5249
+ if (this._hunkStartLines.length === 0)
5250
+ return [];
5251
+ const sources = this.leftCodeRenderable?.lineInfo.lineSources;
5252
+ if (!sources || sources.length === 0)
5253
+ return [...this._hunkStartLines];
5254
+ const offsets = [];
5255
+ let visualRow = 0;
5256
+ for (const hunkStartLine of this._hunkStartLines) {
5257
+ while (visualRow < sources.length && sources[visualRow] < hunkStartLine) {
5258
+ visualRow++;
5259
+ }
5260
+ offsets.push(visualRow < sources.length ? visualRow : hunkStartLine);
5261
+ }
5262
+ return offsets;
5263
+ }
5218
5264
  }
5219
5265
  // src/renderables/Textarea.ts
5220
5266
  var defaultTextareaKeyBindings = [
@@ -8101,6 +8147,35 @@ function parseMarkdownIncremental(newContent, prevState, trailingUnstable = 2) {
8101
8147
  }
8102
8148
 
8103
8149
  // src/renderables/Markdown.ts
8150
+ function normalizeMarkdownCodeBlockRenderers(renderers) {
8151
+ const rendererMap = new Map;
8152
+ const maybeMap = renderers;
8153
+ if (typeof maybeMap.forEach === "function") {
8154
+ maybeMap.forEach((renderer, language) => {
8155
+ rendererMap.set(language, renderer);
8156
+ });
8157
+ return rendererMap;
8158
+ }
8159
+ const rendererRecord = renderers;
8160
+ for (const [language, renderer] of Object.entries(rendererRecord)) {
8161
+ rendererMap.set(language, renderer);
8162
+ }
8163
+ return rendererMap;
8164
+ }
8165
+ function createMarkdownCodeBlockRenderer(renderers) {
8166
+ const rendererMap = normalizeMarkdownCodeBlockRenderers(renderers);
8167
+ const renderNode = (token, context) => {
8168
+ if (token.type !== "code") {
8169
+ return;
8170
+ }
8171
+ const language = infoStringToFiletype(token.lang ?? "");
8172
+ if (!language)
8173
+ return;
8174
+ return rendererMap.get(language)?.(token, context);
8175
+ };
8176
+ renderNode.codeBlockOnly = true;
8177
+ return renderNode;
8178
+ }
8104
8179
  var TRAILING_MARKDOWN_BLOCK_BREAKS_RE = /(?:\r?\n){2,}$/;
8105
8180
  var TRAILING_MARKDOWN_BLOCK_NEWLINES_RE = /(?:\r?\n)+$/;
8106
8181
  function colorsEqual(left, right) {
@@ -8739,8 +8814,11 @@ class MarkdownRenderable extends Renderable {
8739
8814
  normalizeScrollbackMarkdownBlockRaw(raw) {
8740
8815
  return raw.replace(TRAILING_MARKDOWN_BLOCK_NEWLINES_RE, "");
8741
8816
  }
8817
+ isCodeBlockOnlyRenderer() {
8818
+ return this._renderNode?.codeBlockOnly === true;
8819
+ }
8742
8820
  buildRenderableTokens(tokens) {
8743
- if (this._renderNode) {
8821
+ if (this._renderNode && !this.isCodeBlockOnlyRenderer()) {
8744
8822
  return tokens.filter((token) => token.type !== "space");
8745
8823
  }
8746
8824
  const renderTokens = [];
@@ -9057,58 +9135,50 @@ class MarkdownRenderable extends Renderable {
9057
9135
  if (token.type === "code") {
9058
9136
  const renderable2 = this.createCodeRenderable(token, id);
9059
9137
  renderable2.marginTop = marginTop;
9060
- return { renderable: renderable2 };
9138
+ return { renderable: renderable2, canUpdateInPlace: true };
9061
9139
  }
9062
9140
  if (token.type === "table") {
9063
9141
  const next = this.createTableBlock(token, id);
9064
9142
  next.renderable.marginTop = marginTop;
9065
- return next;
9143
+ return { ...next, canUpdateInPlace: true };
9066
9144
  }
9067
9145
  if (token.type === "blockquote") {
9068
9146
  const renderable2 = this.createBlockquoteRenderable(token, id);
9069
9147
  renderable2.marginTop = marginTop;
9070
- return { renderable: renderable2 };
9148
+ return { renderable: renderable2, canUpdateInPlace: true };
9071
9149
  }
9072
9150
  if (token.type === "list") {
9073
9151
  const renderable2 = this.createListRenderable(token, id);
9074
9152
  renderable2.marginTop = marginTop;
9075
- return { renderable: renderable2 };
9153
+ return { renderable: renderable2, canUpdateInPlace: true };
9076
9154
  }
9077
9155
  if (token.type === "hr") {
9078
9156
  const renderable2 = this.createHorizontalRuleRenderable(id);
9079
9157
  renderable2.marginTop = marginTop;
9080
- return { renderable: renderable2 };
9158
+ return { renderable: renderable2, canUpdateInPlace: true };
9081
9159
  }
9082
9160
  const markdownRaw = this.getTopLevelBlockRaw(token);
9083
9161
  if (!markdownRaw) {
9084
- return { renderable: undefined };
9162
+ return { renderable: undefined, canUpdateInPlace: true };
9085
9163
  }
9086
9164
  const renderable = this.createMarkdownCodeRenderable(markdownRaw, id);
9087
9165
  renderable.marginTop = marginTop;
9088
- return { renderable };
9166
+ return { renderable, canUpdateInPlace: true };
9089
9167
  }
9090
9168
  createTopLevelRenderable(block, index) {
9091
9169
  if (!this._renderNode) {
9092
9170
  return this.createTopLevelDefaultRenderable(block, index);
9093
9171
  }
9094
- let next;
9095
- const context = {
9096
- syntaxStyle: this._syntaxStyle,
9097
- conceal: this._conceal,
9098
- concealCode: this._concealCode,
9099
- treeSitterClient: this._treeSitterClient,
9100
- defaultRender: () => {
9101
- next = this.createTopLevelDefaultRenderable(block, index);
9102
- return next.renderable ?? null;
9103
- }
9172
+ const custom = this.createTopLevelCustomRenderable(block, index);
9173
+ if (!custom.renderable)
9174
+ return this.createTopLevelDefaultRenderable(block, index);
9175
+ const marginTop = typeof custom.renderable.marginTop === "number" ? Math.max(custom.renderable.marginTop, block.marginTop) : block.marginTop;
9176
+ this.applyMargins(custom.renderable, marginTop, 0);
9177
+ return {
9178
+ renderable: custom.renderable,
9179
+ tableContentCache: custom.tableContentCache,
9180
+ canUpdateInPlace: custom.canUpdateInPlace
9104
9181
  };
9105
- const custom = this._renderNode(block.token, context);
9106
- if (custom) {
9107
- const marginTop = typeof custom.marginTop === "number" ? Math.max(custom.marginTop, block.marginTop) : block.marginTop;
9108
- this.applyMargins(custom, marginTop, 0);
9109
- return { renderable: custom };
9110
- }
9111
- return next ?? this.createTopLevelDefaultRenderable(block, index);
9112
9182
  }
9113
9183
  createDefaultRenderable(token, index, nextToken) {
9114
9184
  const id = `${this.id}-block-${index}`;
@@ -9136,6 +9206,57 @@ class MarkdownRenderable extends Renderable {
9136
9206
  }
9137
9207
  return this.createMarkdownCodeRenderable(token.raw, id, marginBottom);
9138
9208
  }
9209
+ createCustomRenderable(token, index, nextToken) {
9210
+ const custom = this.renderCustomNode(token, () => {
9211
+ return { renderable: this.createDefaultRenderable(token, index, nextToken) };
9212
+ });
9213
+ if (!custom.renderable) {
9214
+ return { tracksInterBlockMargin: true, canUpdateInPlace: true };
9215
+ }
9216
+ const canUpdateInPlace = custom.renderable === custom.defaultResult?.renderable;
9217
+ return {
9218
+ renderable: custom.renderable,
9219
+ tracksInterBlockMargin: canUpdateInPlace,
9220
+ canUpdateInPlace
9221
+ };
9222
+ }
9223
+ createTopLevelCustomRenderable(block, index) {
9224
+ const custom = this.renderCustomNode(block.token, () => {
9225
+ return this.createTopLevelDefaultRenderable(block, index);
9226
+ });
9227
+ if (!custom.renderable) {
9228
+ return { tracksInterBlockMargin: true, canUpdateInPlace: true };
9229
+ }
9230
+ const canUpdateInPlace = custom.renderable === custom.defaultResult?.renderable;
9231
+ return {
9232
+ renderable: custom.renderable,
9233
+ tableContentCache: canUpdateInPlace ? custom.defaultResult?.tableContentCache : undefined,
9234
+ tracksInterBlockMargin: canUpdateInPlace,
9235
+ canUpdateInPlace
9236
+ };
9237
+ }
9238
+ renderCustomNode(token, createDefault) {
9239
+ if (!this._renderNode)
9240
+ return {};
9241
+ let defaultResult;
9242
+ const custom = this._renderNode(token, {
9243
+ syntaxStyle: this._syntaxStyle,
9244
+ conceal: this._conceal,
9245
+ concealCode: this._concealCode,
9246
+ treeSitterClient: this._treeSitterClient,
9247
+ defaultRender: () => {
9248
+ defaultResult = createDefault();
9249
+ return defaultResult.renderable ?? null;
9250
+ }
9251
+ });
9252
+ this.destroyUnusedDefaultRenderable(defaultResult?.renderable, custom ?? undefined);
9253
+ return custom ? { renderable: custom, defaultResult } : {};
9254
+ }
9255
+ destroyUnusedDefaultRenderable(renderable, usedRenderable) {
9256
+ if (!renderable || renderable === usedRenderable || renderable.parent)
9257
+ return;
9258
+ renderable.destroyRecursively();
9259
+ }
9139
9260
  updateBlockRenderable(state, token, index, nextToken, forceListRefresh = false) {
9140
9261
  const marginBottom = this.getInterBlockMargin(token, nextToken);
9141
9262
  if (token.type === "code") {
@@ -9222,7 +9343,29 @@ class MarkdownRenderable extends Renderable {
9222
9343
  blockIndex++;
9223
9344
  continue;
9224
9345
  }
9225
- if (existing && !forceTableRefresh && !this._renderNode && existing.token.type === block.token.type && this.canUpdateBlockRenderable(existing.renderable, block.token)) {
9346
+ if (existing && !forceTableRefresh && existing.canUpdateInPlace && existing.token.type === block.token.type && this.canUpdateBlockRenderable(existing.renderable, block.token)) {
9347
+ if (this._renderNode) {
9348
+ const custom = this.createTopLevelCustomRenderable(block, blockIndex);
9349
+ if (custom.renderable && !custom.canUpdateInPlace) {
9350
+ const marginTop = typeof custom.renderable.marginTop === "number" ? Math.max(custom.renderable.marginTop, block.marginTop) : block.marginTop;
9351
+ this.applyMargins(custom.renderable, marginTop, 0);
9352
+ if (custom.renderable !== existing.renderable) {
9353
+ existing.renderable.destroyRecursively();
9354
+ this.add(custom.renderable, blockIndex);
9355
+ }
9356
+ this._blockStates[blockIndex] = {
9357
+ token: block.token,
9358
+ tokenRaw: block.token.raw,
9359
+ marginTop: block.marginTop,
9360
+ renderable: custom.renderable,
9361
+ tableContentCache: custom.tableContentCache,
9362
+ canUpdateInPlace: custom.canUpdateInPlace
9363
+ };
9364
+ blockIndex++;
9365
+ continue;
9366
+ }
9367
+ this.destroyUnusedDefaultRenderable(custom.renderable);
9368
+ }
9226
9369
  this.updateBlockRenderable(existing, block.token, blockIndex, blocks[i + 1]?.token);
9227
9370
  existing.renderable.marginBottom = 0;
9228
9371
  if (existing.marginTop !== block.marginTop) {
@@ -9243,7 +9386,8 @@ class MarkdownRenderable extends Renderable {
9243
9386
  tokenRaw: block.token.raw,
9244
9387
  marginTop: block.marginTop,
9245
9388
  renderable: next.renderable,
9246
- tableContentCache: next.tableContentCache
9389
+ tableContentCache: next.tableContentCache,
9390
+ canUpdateInPlace: next.canUpdateInPlace
9247
9391
  };
9248
9392
  }
9249
9393
  blockIndex++;
@@ -9289,7 +9433,8 @@ class MarkdownRenderable extends Renderable {
9289
9433
  tokenRaw: this._content,
9290
9434
  marginTop: 0,
9291
9435
  renderable: fallback,
9292
- tracksInterBlockMargin: true
9436
+ tracksInterBlockMargin: true,
9437
+ canUpdateInPlace: true
9293
9438
  }
9294
9439
  ];
9295
9440
  return;
@@ -9327,7 +9472,24 @@ class MarkdownRenderable extends Renderable {
9327
9472
  blockIndex++;
9328
9473
  continue;
9329
9474
  }
9330
- if (existing && existing.token.type === token.type) {
9475
+ if (existing && existing.canUpdateInPlace && existing.token.type === token.type) {
9476
+ const custom2 = this.createCustomRenderable(token, blockIndex, nextToken);
9477
+ if (custom2.renderable && !custom2.canUpdateInPlace) {
9478
+ if (custom2.renderable !== existing.renderable) {
9479
+ existing.renderable.destroyRecursively();
9480
+ this.add(custom2.renderable, blockIndex);
9481
+ }
9482
+ this._blockStates[blockIndex] = {
9483
+ token,
9484
+ tokenRaw: token.raw,
9485
+ renderable: custom2.renderable,
9486
+ tracksInterBlockMargin: custom2.tracksInterBlockMargin,
9487
+ canUpdateInPlace: custom2.canUpdateInPlace
9488
+ };
9489
+ blockIndex++;
9490
+ continue;
9491
+ }
9492
+ this.destroyUnusedDefaultRenderable(custom2.renderable);
9331
9493
  this.updateBlockRenderable(existing, token, blockIndex, nextToken);
9332
9494
  existing.token = token;
9333
9495
  existing.tokenRaw = token.raw;
@@ -9341,23 +9503,12 @@ class MarkdownRenderable extends Renderable {
9341
9503
  let renderable;
9342
9504
  let tableContentCache;
9343
9505
  let tracksInterBlockMargin = true;
9344
- if (this._renderNode) {
9345
- let defaultRenderable;
9346
- const context = {
9347
- syntaxStyle: this._syntaxStyle,
9348
- conceal: this._conceal,
9349
- concealCode: this._concealCode,
9350
- treeSitterClient: this._treeSitterClient,
9351
- defaultRender: () => {
9352
- defaultRenderable = this.createDefaultRenderable(token, blockIndex, nextToken);
9353
- return defaultRenderable;
9354
- }
9355
- };
9356
- const custom = this._renderNode(token, context);
9357
- if (custom) {
9358
- renderable = custom;
9359
- tracksInterBlockMargin = custom === defaultRenderable;
9360
- }
9506
+ let canUpdateInPlace = true;
9507
+ const custom = this.createCustomRenderable(token, blockIndex, nextToken);
9508
+ if (custom.renderable) {
9509
+ renderable = custom.renderable;
9510
+ tracksInterBlockMargin = custom.tracksInterBlockMargin;
9511
+ canUpdateInPlace = custom.canUpdateInPlace;
9361
9512
  }
9362
9513
  if (!renderable) {
9363
9514
  if (token.type === "table") {
@@ -9379,7 +9530,8 @@ class MarkdownRenderable extends Renderable {
9379
9530
  tokenRaw: token.raw,
9380
9531
  renderable,
9381
9532
  tableContentCache,
9382
- tracksInterBlockMargin
9533
+ tracksInterBlockMargin,
9534
+ canUpdateInPlace
9383
9535
  };
9384
9536
  }
9385
9537
  blockIndex++;
@@ -10169,12 +10321,6 @@ class ScrollBoxRenderable extends BoxRenderable {
10169
10321
  }
10170
10322
  set scrollTop(value) {
10171
10323
  this.verticalScrollBar.scrollPosition = value;
10172
- if (!this._isApplyingStickyScroll) {
10173
- const maxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height);
10174
- if (!this.isAtStickyPosition() && maxScrollTop > 1) {
10175
- this._hasManualScroll = true;
10176
- }
10177
- }
10178
10324
  this.updateStickyState();
10179
10325
  }
10180
10326
  get scrollLeft() {
@@ -10182,12 +10328,6 @@ class ScrollBoxRenderable extends BoxRenderable {
10182
10328
  }
10183
10329
  set scrollLeft(value) {
10184
10330
  this.horizontalScrollBar.scrollPosition = value;
10185
- if (!this._isApplyingStickyScroll) {
10186
- const maxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width);
10187
- if (!this.isAtStickyPosition() && maxScrollLeft > 1) {
10188
- this._hasManualScroll = true;
10189
- }
10190
- }
10191
10331
  this.updateStickyState();
10192
10332
  }
10193
10333
  get scrollWidth() {
@@ -10197,22 +10337,18 @@ class ScrollBoxRenderable extends BoxRenderable {
10197
10337
  return this.verticalScrollBar.scrollSize;
10198
10338
  }
10199
10339
  updateStickyState() {
10200
- if (!this._stickyScroll)
10340
+ if (!this._stickyScroll) {
10341
+ this.syncManualScrollState();
10201
10342
  return;
10343
+ }
10202
10344
  const maxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height);
10203
10345
  const maxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width);
10204
10346
  if (this.scrollTop <= 0) {
10205
10347
  this._stickyScrollTop = true;
10206
10348
  this._stickyScrollBottom = false;
10207
- if (!this._isApplyingStickyScroll && (this._stickyStart === "top" || this._stickyStart === "bottom" && maxScrollTop === 0)) {
10208
- this._hasManualScroll = false;
10209
- }
10210
10349
  } else if (this.scrollTop >= maxScrollTop) {
10211
10350
  this._stickyScrollTop = false;
10212
10351
  this._stickyScrollBottom = true;
10213
- if (!this._isApplyingStickyScroll && this._stickyStart === "bottom") {
10214
- this._hasManualScroll = false;
10215
- }
10216
10352
  } else {
10217
10353
  this._stickyScrollTop = false;
10218
10354
  this._stickyScrollBottom = false;
@@ -10220,19 +10356,30 @@ class ScrollBoxRenderable extends BoxRenderable {
10220
10356
  if (this.scrollLeft <= 0) {
10221
10357
  this._stickyScrollLeft = true;
10222
10358
  this._stickyScrollRight = false;
10223
- if (!this._isApplyingStickyScroll && (this._stickyStart === "left" || this._stickyStart === "right" && maxScrollLeft === 0)) {
10224
- this._hasManualScroll = false;
10225
- }
10226
10359
  } else if (this.scrollLeft >= maxScrollLeft) {
10227
10360
  this._stickyScrollLeft = false;
10228
10361
  this._stickyScrollRight = true;
10229
- if (!this._isApplyingStickyScroll && this._stickyStart === "right") {
10230
- this._hasManualScroll = false;
10231
- }
10232
10362
  } else {
10233
10363
  this._stickyScrollLeft = false;
10234
10364
  this._stickyScrollRight = false;
10235
10365
  }
10366
+ this.syncManualScrollState();
10367
+ }
10368
+ syncManualScrollState() {
10369
+ if (!this._stickyScroll) {
10370
+ this._hasManualScroll = false;
10371
+ return;
10372
+ }
10373
+ const maxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height);
10374
+ const maxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width);
10375
+ const hasScrollableContent = maxScrollTop > 1 || maxScrollLeft > 1;
10376
+ if (this._isApplyingStickyScroll) {
10377
+ if (this._hasManualScroll && hasScrollableContent && this.isAtStickyPosition()) {
10378
+ this._hasManualScroll = false;
10379
+ }
10380
+ return;
10381
+ }
10382
+ this._hasManualScroll = hasScrollableContent && !this.isAtStickyPosition();
10236
10383
  }
10237
10384
  applyStickyStart(stickyStart) {
10238
10385
  const wasApplyingStickyScroll = this._isApplyingStickyScroll;
@@ -10342,12 +10489,6 @@ class ScrollBoxRenderable extends BoxRenderable {
10342
10489
  orientation: "vertical",
10343
10490
  onChange: (position) => {
10344
10491
  this.content.translateY = -position;
10345
- if (!this._isApplyingStickyScroll) {
10346
- const maxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height);
10347
- if (!this.isAtStickyPosition() && maxScrollTop > 1) {
10348
- this._hasManualScroll = true;
10349
- }
10350
- }
10351
10492
  this.updateStickyState();
10352
10493
  }
10353
10494
  });
@@ -10363,12 +10504,6 @@ class ScrollBoxRenderable extends BoxRenderable {
10363
10504
  orientation: "horizontal",
10364
10505
  onChange: (position) => {
10365
10506
  this.content.translateX = -position;
10366
- if (!this._isApplyingStickyScroll) {
10367
- const maxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width);
10368
- if (!this.isAtStickyPosition() && maxScrollLeft > 1) {
10369
- this._hasManualScroll = true;
10370
- }
10371
- }
10372
10507
  this.updateStickyState();
10373
10508
  }
10374
10509
  });
@@ -10519,11 +10654,7 @@ class ScrollBoxRenderable extends BoxRenderable {
10519
10654
  this.scrollAccumulatorX -= integerScroll;
10520
10655
  }
10521
10656
  }
10522
- const maxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height);
10523
- const maxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width);
10524
- if (maxScrollTop > 1 || maxScrollLeft > 1) {
10525
- this._hasManualScroll = true;
10526
- }
10657
+ this.syncManualScrollState();
10527
10658
  }
10528
10659
  if (event.type === "drag" && event.isDragging) {
10529
10660
  this.updateAutoScroll(event.x, event.y);
@@ -10533,15 +10664,15 @@ class ScrollBoxRenderable extends BoxRenderable {
10533
10664
  }
10534
10665
  handleKeyPress(key) {
10535
10666
  if (this.verticalScrollBar.handleKeyPress(key)) {
10536
- this._hasManualScroll = true;
10537
10667
  this.scrollAccel.reset();
10538
10668
  this.resetScrollAccumulators();
10669
+ this.syncManualScrollState();
10539
10670
  return true;
10540
10671
  }
10541
10672
  if (this.horizontalScrollBar.handleKeyPress(key)) {
10542
- this._hasManualScroll = true;
10543
10673
  this.scrollAccel.reset();
10544
10674
  this.resetScrollAccumulators();
10675
+ this.syncManualScrollState();
10545
10676
  return true;
10546
10677
  }
10547
10678
  return false;
@@ -11533,7 +11664,7 @@ class TimeToFirstDrawRenderable extends Renderable {
11533
11664
  return Math.max(0, Math.floor(value));
11534
11665
  }
11535
11666
  }
11536
- export { DistortionEffect, VignetteEffect, CloudsEffect, FlamesEffect, CRTRollingBarEffect, RainbowTextEffect, applyScanlines, applyInvert, applyNoise, applyChromaticAberration, applyAsciiArt, applyBrightness, applyGain, applySaturation, BloomEffect, SEPIA_MATRIX, PROTANOPIA_SIM_MATRIX, DEUTERANOPIA_SIM_MATRIX, TRITANOPIA_SIM_MATRIX, ACHROMATOPSIA_MATRIX, PROTANOPIA_COMP_MATRIX, DEUTERANOPIA_COMP_MATRIX, TRITANOPIA_COMP_MATRIX, TECHNICOLOR_MATRIX, SOLARIZATION_MATRIX, SYNTHWAVE_MATRIX, GREENSCALE_MATRIX, GRAYSCALE_MATRIX, INVERT_MATRIX, Timeline, engine, createTimeline, SlotRegistry, createSlotRegistry, createCoreSlotRegistry, registerCorePlugin, resolveCoreSlot, SlotRenderable, Audio, setupAudio, FrameBufferRenderable, ASCIIFontRenderable, Generic, Box, Text, ASCIIFont, Input, Select, TabSelect, FrameBuffer, Code, ScrollBox, vstyles, VRenderable, LineNumberRenderable, DiffRenderable, defaultTextareaKeyBindings, TextareaRenderable, InputRenderableEvents, InputRenderable, TextTableRenderable, MarkdownRenderable, SliderRenderable, ScrollBarRenderable, ArrowRenderable, ScrollBoxRenderable, SelectRenderableEvents, SelectRenderable, TabSelectRenderableEvents, TabSelectRenderable, TimeToFirstDrawRenderable, exports_src2 as exports_src };
11667
+ export { DistortionEffect, VignetteEffect, CloudsEffect, FlamesEffect, CRTRollingBarEffect, RainbowTextEffect, applyScanlines, applyInvert, applyNoise, applyChromaticAberration, applyAsciiArt, applyBrightness, applyGain, applySaturation, BloomEffect, SEPIA_MATRIX, PROTANOPIA_SIM_MATRIX, DEUTERANOPIA_SIM_MATRIX, TRITANOPIA_SIM_MATRIX, ACHROMATOPSIA_MATRIX, PROTANOPIA_COMP_MATRIX, DEUTERANOPIA_COMP_MATRIX, TRITANOPIA_COMP_MATRIX, TECHNICOLOR_MATRIX, SOLARIZATION_MATRIX, SYNTHWAVE_MATRIX, GREENSCALE_MATRIX, GRAYSCALE_MATRIX, INVERT_MATRIX, Timeline, engine, createTimeline, SlotRegistry, createSlotRegistry, createCoreSlotRegistry, registerCorePlugin, resolveCoreSlot, SlotRenderable, Audio, setupAudio, FrameBufferRenderable, ASCIIFontRenderable, Generic, Box, Text, ASCIIFont, Input, Select, TabSelect, FrameBuffer, Code, ScrollBox, vstyles, VRenderable, LineNumberRenderable, DiffRenderable, defaultTextareaKeyBindings, TextareaRenderable, InputRenderableEvents, InputRenderable, TextTableRenderable, createMarkdownCodeBlockRenderer, MarkdownRenderable, SliderRenderable, ScrollBarRenderable, ArrowRenderable, ScrollBoxRenderable, SelectRenderableEvents, SelectRenderable, TabSelectRenderableEvents, TabSelectRenderable, TimeToFirstDrawRenderable, exports_src2 as exports_src };
11537
11668
 
11538
- //# debugId=FF9419E6A578C71164756E2164756E21
11539
- //# sourceMappingURL=index-zv319bjp.js.map
11669
+ //# debugId=99C613C726810CD764756E2164756E21
11670
+ //# sourceMappingURL=index-3mx8q5t1.js.map