@dxos/lit-grid 0.6.12-main.f9d0246 → 0.6.12-staging.e11e696

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.
@@ -2,6 +2,7 @@
2
2
  import { LitElement as LitElement2, html as html2, nothing } from "lit";
3
3
  import { customElement as customElement2, state, property as property2, eventOptions } from "lit/decorators.js";
4
4
  import { ref as ref2, createRef } from "lit/directives/ref.js";
5
+ import { styleMap } from "lit/directives/style-map.js";
5
6
 
6
7
  // packages/ui/lit-grid/src/dx-grid-axis-resize-handle.ts
7
8
  import { draggable } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
@@ -148,7 +149,7 @@ function _ts_decorate2(decorators, target, key, desc) {
148
149
  return c > 3 && r && Object.defineProperty(target, key, r), r;
149
150
  }
150
151
  var gap = 1;
151
- var resizeTolerance = 8;
152
+ var resizeTolerance = 1;
152
153
  var overscanCol = 1;
153
154
  var overscanRow = 1;
154
155
  var sizeColMin = 32;
@@ -205,6 +206,8 @@ var DxGrid = class extends LitElement2 {
205
206
  this.columns = {};
206
207
  this.initialCells = {};
207
208
  this.mode = "browse";
209
+ this.limitColumns = Infinity;
210
+ this.limitRows = Infinity;
208
211
  /**
209
212
  * When this function is defined, it is used first to try to get a value for a cell, and otherwise will fall back
210
213
  * to `cells`.
@@ -265,6 +268,11 @@ var DxGrid = class extends LitElement2 {
265
268
  col: 0,
266
269
  row: 0
267
270
  };
271
+ //
272
+ // Limits
273
+ //
274
+ this.intrinsicInlineSize = Infinity;
275
+ this.intrinsicBlockSize = Infinity;
268
276
  this.handlePointerDown = (event) => {
269
277
  if (event.isPrimary) {
270
278
  const { action, actionEl } = closestAction(event.target);
@@ -332,6 +340,7 @@ var DxGrid = class extends LitElement2 {
332
340
  this.sizeInline = inlineSize;
333
341
  this.sizeBlock = blockSize;
334
342
  this.updateVis();
343
+ queueMicrotask(() => this.updatePos());
335
344
  }
336
345
  });
337
346
  this.viewportRef = createRef();
@@ -343,13 +352,13 @@ var DxGrid = class extends LitElement2 {
343
352
  };
344
353
  this.handleWheel = ({ deltaX, deltaY }) => {
345
354
  if (this.mode === "browse") {
346
- this.posInline = Math.max(0, this.posInline + deltaX);
347
- this.posBlock = Math.max(0, this.posBlock + deltaY);
348
- this.maybeUpdateVis();
355
+ this.updatePos(this.posInline + deltaX, this.posBlock + deltaY);
349
356
  }
350
357
  };
351
358
  this.addEventListener("dx-axis-resize-internal", this.handleAxisResizeInternal);
352
- this.addEventListener("wheel", this.handleWheel);
359
+ this.addEventListener("wheel", this.handleWheel, {
360
+ passive: true
361
+ });
353
362
  this.addEventListener("pointerdown", this.handlePointerDown);
354
363
  this.addEventListener("pointermove", this.handlePointerMove);
355
364
  this.addEventListener("pointerup", this.handlePointerUp);
@@ -379,7 +388,7 @@ var DxGrid = class extends LitElement2 {
379
388
  case "ArrowDown":
380
389
  this.focusedCell = {
381
390
  ...this.focusedCell,
382
- row: this.focusedCell.row + 1
391
+ row: Math.min(this.limitRows - 1, this.focusedCell.row + 1)
383
392
  };
384
393
  break;
385
394
  case "ArrowUp":
@@ -391,7 +400,7 @@ var DxGrid = class extends LitElement2 {
391
400
  case "ArrowRight":
392
401
  this.focusedCell = {
393
402
  ...this.focusedCell,
394
- col: this.focusedCell.col + 1
403
+ col: Math.min(this.limitColumns - 1, this.focusedCell.col + 1)
395
404
  };
396
405
  break;
397
406
  case "ArrowLeft":
@@ -459,6 +468,11 @@ var DxGrid = class extends LitElement2 {
459
468
  ...cellSize
460
469
  };
461
470
  }
471
+ updatePos(inline, block) {
472
+ this.posInline = Math.max(0, Math.min(this.intrinsicInlineSize - this.sizeInline, inline ?? this.posInline));
473
+ this.posBlock = Math.max(0, Math.min(this.intrinsicBlockSize - this.sizeBlock, block ?? this.posBlock));
474
+ this.maybeUpdateVis();
475
+ }
462
476
  updateVisInline() {
463
477
  let colIndex = 0;
464
478
  let pxInline = this.colSize(colIndex);
@@ -479,7 +493,7 @@ var DxGrid = class extends LitElement2 {
479
493
  colIndex += 1;
480
494
  pxInline += this.colSize(colIndex) + gap;
481
495
  }
482
- this.visColMax = colIndex + overscanCol;
496
+ this.visColMax = Math.min(this.limitColumns, colIndex + overscanCol);
483
497
  this.templateColumns = [
484
498
  ...Array(this.visColMax - this.visColMin)
485
499
  ].map((_, c0) => `${this.colSize(this.visColMin + c0)}px`).join(" ");
@@ -504,7 +518,7 @@ var DxGrid = class extends LitElement2 {
504
518
  rowIndex += 1;
505
519
  pxBlock += this.rowSize(rowIndex) + gap;
506
520
  }
507
- this.visRowMax = rowIndex + overscanRow;
521
+ this.visRowMax = Math.min(this.limitRows, rowIndex + overscanRow);
508
522
  this.templateRows = [
509
523
  ...Array(this.visRowMax - this.visRowMin)
510
524
  ].map((_, r0) => `${this.rowSize(this.visRowMin + r0)}px`).join(" ");
@@ -561,7 +575,7 @@ var DxGrid = class extends LitElement2 {
561
575
  } else if (this.focusedCell.col > this.visColMin + overscanCol && this.focusedCell.col < this.visColMax - overscanCol - 1 && this.focusedCell.row > this.visRowMin + overscanRow && this.focusedCell.row < this.visRowMax - overscanRow - 1) {
562
576
  } else {
563
577
  if (this.focusedCell.col <= this.visColMin + overscanCol) {
564
- this.posInline = this.binInlineMin;
578
+ this.posInline = this.binInlineMin + gap;
565
579
  this.updateVisInline();
566
580
  } else if (this.focusedCell.col >= this.visColMax - overscanCol - 1) {
567
581
  const sizeSumCol = [
@@ -570,11 +584,11 @@ var DxGrid = class extends LitElement2 {
570
584
  acc += this.colSize(this.visColMin + overscanCol + c0) + gap;
571
585
  return acc;
572
586
  }, 0);
573
- this.posInline = Math.max(0, this.binInlineMin + sizeSumCol + gap * 2 - this.sizeInline);
587
+ this.posInline = Math.max(0, Math.min(this.intrinsicInlineSize - this.sizeInline, this.binInlineMin + sizeSumCol + gap * 2 - this.sizeInline));
574
588
  this.updateVisInline();
575
589
  }
576
590
  if (this.focusedCell.row <= this.visRowMin + overscanRow) {
577
- this.posBlock = this.binBlockMin;
591
+ this.posBlock = this.binBlockMin + gap;
578
592
  this.updateVisBlock();
579
593
  } else if (this.focusedCell.row >= this.visRowMax - overscanRow - 1) {
580
594
  const sizeSumRow = [
@@ -583,7 +597,7 @@ var DxGrid = class extends LitElement2 {
583
597
  acc += this.rowSize(this.visRowMin + overscanRow + r0) + gap;
584
598
  return acc;
585
599
  }, 0);
586
- this.posBlock = Math.max(0, this.binBlockMin + sizeSumRow + gap * 2 - this.sizeBlock);
600
+ this.posBlock = Math.max(0, Math.min(this.intrinsicBlockSize - this.sizeBlock, this.binBlockMin + sizeSumRow + gap * 2 - this.sizeBlock));
587
601
  this.updateVisBlock();
588
602
  }
589
603
  }
@@ -618,6 +632,7 @@ var DxGrid = class extends LitElement2 {
618
632
  [index]: nextSize
619
633
  };
620
634
  this.updateVisInline();
635
+ this.updateIntrinsicInlineSize();
621
636
  } else {
622
637
  const nextSize = Math.max(sizeRowMin, Math.min(sizeRowMax, size + delta));
623
638
  this.rowSizes = {
@@ -625,6 +640,7 @@ var DxGrid = class extends LitElement2 {
625
640
  [index]: nextSize
626
641
  };
627
642
  this.updateVisBlock();
643
+ this.updateIntrinsicBlockSize();
628
644
  }
629
645
  if (type === "dropped") {
630
646
  this.dispatchEvent(new DxAxisResize({
@@ -650,6 +666,10 @@ var DxGrid = class extends LitElement2 {
650
666
  return html2`<div
651
667
  role="none"
652
668
  class="dx-grid"
669
+ style=${styleMap({
670
+ "--dx-viewport-inline-size": Number.isFinite(this.limitColumns) ? `${this.intrinsicInlineSize}px` : "1fr",
671
+ "--dx-viewport-block-size": Number.isFinite(this.limitRows) ? `${this.intrinsicBlockSize}px` : "1fr"
672
+ })}
653
673
  data-grid=${this.gridId}
654
674
  data-grid-mode=${this.mode}
655
675
  ?data-grid-select=${selectVisible}
@@ -675,7 +695,6 @@ var DxGrid = class extends LitElement2 {
675
695
  axis="col"
676
696
  index=${c}
677
697
  size=${this.colSize(c)}
678
- @dxaxisresizeinternal=${this.handleAxisResizeInternal}
679
698
  ></dx-grid-axis-resize-handle>`}
680
699
  </div>`;
681
700
  })}
@@ -703,7 +722,7 @@ var DxGrid = class extends LitElement2 {
703
722
  })}
704
723
  </div>
705
724
  </div>
706
- <div role="grid" class="dx-grid__viewport" tabindex="0" @wheel=${this.handleWheel} ${ref2(this.viewportRef)}>
725
+ <div role="grid" class="dx-grid__viewport" tabindex="0" ${ref2(this.viewportRef)}>
707
726
  <div
708
727
  role="none"
709
728
  class="dx-grid__content"
@@ -747,6 +766,20 @@ var DxGrid = class extends LitElement2 {
747
766
  <div role="none" class="dx-grid__corner"></div>
748
767
  </div>`;
749
768
  }
769
+ updateIntrinsicInlineSize() {
770
+ this.intrinsicInlineSize = Number.isFinite(this.limitColumns) ? [
771
+ ...Array(this.limitColumns)
772
+ ].reduce((acc, _, c0) => acc + this.colSize(c0), 0) + gap * (this.limitColumns - 1) : Infinity;
773
+ }
774
+ updateIntrinsicBlockSize() {
775
+ this.intrinsicBlockSize = Number.isFinite(this.limitRows) ? [
776
+ ...Array(this.limitRows)
777
+ ].reduce((acc, _, r0) => acc + this.rowSize(r0), 0) + gap * (this.limitRows - 1) : Infinity;
778
+ }
779
+ updateIntrinsicSizes() {
780
+ this.updateIntrinsicInlineSize();
781
+ this.updateIntrinsicBlockSize();
782
+ }
750
783
  firstUpdated() {
751
784
  if (this.getCells) {
752
785
  this.cells = this.getCells({
@@ -773,6 +806,7 @@ var DxGrid = class extends LitElement2 {
773
806
  }
774
807
  return acc;
775
808
  }, {});
809
+ this.updateIntrinsicSizes();
776
810
  }
777
811
  willUpdate(changedProperties) {
778
812
  if (this.getCells && (changedProperties.has("initialCells") || changedProperties.has("visColMin") || changedProperties.has("visColMax") || changedProperties.has("visRowMin") || changedProperties.has("visRowMax"))) {
@@ -838,6 +872,16 @@ _ts_decorate2([
838
872
  type: String
839
873
  })
840
874
  ], DxGrid.prototype, "mode", void 0);
875
+ _ts_decorate2([
876
+ property2({
877
+ type: Number
878
+ })
879
+ ], DxGrid.prototype, "limitColumns", void 0);
880
+ _ts_decorate2([
881
+ property2({
882
+ type: Number
883
+ })
884
+ ], DxGrid.prototype, "limitRows", void 0);
841
885
  _ts_decorate2([
842
886
  state()
843
887
  ], DxGrid.prototype, "cells", void 0);
@@ -910,6 +954,12 @@ _ts_decorate2([
910
954
  _ts_decorate2([
911
955
  state()
912
956
  ], DxGrid.prototype, "selectionEnd", void 0);
957
+ _ts_decorate2([
958
+ state()
959
+ ], DxGrid.prototype, "intrinsicInlineSize", void 0);
960
+ _ts_decorate2([
961
+ state()
962
+ ], DxGrid.prototype, "intrinsicBlockSize", void 0);
913
963
  _ts_decorate2([
914
964
  state()
915
965
  ], DxGrid.prototype, "observer", void 0);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/dx-grid.ts", "../../../src/dx-grid-axis-resize-handle.ts", "../../../src/util.ts", "../../../src/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { LitElement, html, nothing } from 'lit';\nimport { customElement, state, property, eventOptions } from 'lit/decorators.js';\nimport { ref, createRef, type Ref } from 'lit/directives/ref.js';\n\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport './dx-grid-axis-resize-handle';\nimport {\n type AxisMeta,\n type CellIndex,\n DxAxisResize,\n type DxAxisResizeInternal,\n DxEditRequest,\n type DxGridAxis,\n type DxGridAxisMeta,\n type DxGridCells,\n DxGridCellsSelect,\n type DxGridMode,\n type DxGridPointer,\n type DxGridPosition,\n type DxGridPositionNullable,\n type DxGridRange,\n} from './types';\nimport { separator, toCellIndex } from './util';\n\n/**\n * The size in pixels of the gap between cells\n */\nconst gap = 1;\n\n/**\n * This should be about the width of the `1` numeral so resize is triggered as the row header column’s intrinsic size\n * changes when scrolling vertically.\n */\nconst resizeTolerance = 8;\n\n//\n// `overscan` is the number of columns or rows to render outside of the viewport\n//\nconst overscanCol = 1;\nconst overscanRow = 1;\n\n//\n// `size`, when suffixed with ‘row’ or ‘col’, are limits on size applied when resizing\n//\nconst sizeColMin = 32;\nconst sizeColMax = 1024;\nconst sizeRowMin = 16;\nconst sizeRowMax = 1024;\n\n//\n// A1 notation is the fallback for numbering columns and rows.\n//\n\nconst colToA1Notation = (col: number): string => {\n return (\n (col >= 26 ? String.fromCharCode('A'.charCodeAt(0) + Math.floor(col / 26) - 1) : '') +\n String.fromCharCode('A'.charCodeAt(0) + (col % 26))\n );\n};\n\nconst rowToA1Notation = (row: number): string => {\n return `${row + 1}`;\n};\n\nconst closestAction = (target: EventTarget | null): { action: string | null; actionEl: HTMLElement | null } => {\n const actionEl: HTMLElement | null = (target as HTMLElement | null)?.closest('[data-dx-grid-action]') ?? null;\n return { actionEl, action: actionEl?.getAttribute('data-dx-grid-action') ?? null };\n};\n\nconst closestCell = (target: EventTarget | null, actionEl?: HTMLElement | null): DxGridPositionNullable => {\n let cellElement = actionEl;\n if (!cellElement) {\n const { action, actionEl } = closestAction(target);\n if (action === 'cell') {\n cellElement = actionEl as HTMLElement;\n }\n }\n if (cellElement) {\n const col = parseInt(cellElement.getAttribute('aria-colindex') ?? 'never');\n const row = parseInt(cellElement.getAttribute('aria-rowindex') ?? 'never');\n return { col, row };\n } else {\n return null;\n }\n};\n\nconst isSameCell = (a: DxGridPositionNullable, b: DxGridPositionNullable) =>\n a && b && Number.isFinite(a.col) && Number.isFinite(a.row) && a.col === b.col && a.row === b.row;\n\nconst localChId = (c0: number) => `ch--${c0}`;\nconst localRhId = (r0: number) => `rh--${r0}`;\n\nconst getPage = (axis: string, event: PointerEvent) => (axis === 'col' ? event.pageX : event.pageY);\n\n@customElement('dx-grid')\nexport class DxGrid extends LitElement {\n constructor() {\n super();\n this.addEventListener('dx-axis-resize-internal', this.handleAxisResizeInternal as EventListener);\n this.addEventListener('wheel', this.handleWheel);\n this.addEventListener('pointerdown', this.handlePointerDown);\n this.addEventListener('pointermove', this.handlePointerMove);\n this.addEventListener('pointerup', this.handlePointerUp);\n this.addEventListener('pointerleave', this.handlePointerUp);\n this.addEventListener('focus', this.handleFocus, { capture: true });\n this.addEventListener('blur', this.handleBlur, { capture: true });\n this.addEventListener('keydown', this.handleKeydown);\n }\n\n @property({ type: String })\n gridId: string = 'default-grid-id';\n\n @property({ type: Object })\n rowDefault: AxisMeta = { size: 32 };\n\n @property({ type: Object })\n columnDefault: AxisMeta = { size: 180 };\n\n @property({ type: Object })\n rows: DxGridAxisMeta = {};\n\n @property({ type: Object })\n columns: DxGridAxisMeta = {};\n\n @property({ type: Object })\n initialCells: DxGridCells = {};\n\n @property({ type: String })\n mode: DxGridMode = 'browse';\n\n /**\n * When this function is defined, it is used first to try to get a value for a cell, and otherwise will fall back\n * to `cells`.\n */\n getCells: ((nextRange: DxGridRange) => DxGridCells) | null = null;\n\n @state()\n private cells: DxGridCells = {};\n\n //\n // `pos`, short for ‘position’, is the position in pixels of the viewport from the origin.\n //\n\n @state()\n private posInline = 0;\n\n @state()\n private posBlock = 0;\n\n //\n // `size` (when not suffixed with ‘row’ or ‘col’, see above) is the size in pixels of the viewport.\n //\n\n @state()\n private sizeInline = 0;\n\n @state()\n private sizeBlock = 0;\n\n //\n // `overscan` is the amount in pixels to offset the grid content due to the number of overscanned columns or rows.\n //\n\n @state()\n private overscanInline = 0;\n\n @state()\n private overscanBlock = 0;\n\n //\n // `bin`, not short for anything, is the range in pixels within which virtualization does not need to reassess.\n //\n\n @state()\n private binInlineMin = 0;\n\n @state()\n private binInlineMax = this.colSize(0);\n\n @state()\n private binBlockMin = 0;\n\n @state()\n private binBlockMax = this.rowSize(0);\n\n //\n // `vis`, short for ‘visible’, is the range in numeric index of the columns or rows which should be rendered within\n // the viewport. These start with naïve values that are updated before first contentful render.\n //\n\n @state()\n private visColMin = 0;\n\n @state()\n private visColMax = 1;\n\n @state()\n private visRowMin = 0;\n\n @state()\n private visRowMax = 1;\n\n //\n // `template` is the rendered value of `grid-{axis}-template`.\n //\n @state()\n private templateColumns = `${this.colSize(0)}px`;\n\n @state()\n private templateRows = `${this.rowSize(0)}px`;\n\n //\n // Focus, selection, and resize states\n //\n\n @state()\n private pointer: DxGridPointer = null;\n\n @state()\n private colSizes: Record<string, number> = {};\n\n @state()\n private rowSizes: Record<string, number> = {};\n\n @state()\n private focusActive: boolean = false;\n\n @state()\n private focusedCell: DxGridPosition = { col: 0, row: 0 };\n\n @state()\n private selectionStart: DxGridPosition = { col: 0, row: 0 };\n\n @state()\n private selectionEnd: DxGridPosition = { col: 0, row: 0 };\n\n //\n // Primary pointer and keyboard handlers\n //\n\n private dispatchEditRequest(initialContent?: string) {\n this.snapPosToFocusedCell();\n // Without deferring, the event dispatches before `focusedCellBox` can get updated bounds of the cell, hence:\n queueMicrotask(() =>\n this.dispatchEvent(\n new DxEditRequest({\n cellIndex: toCellIndex(this.focusedCell),\n cellBox: this.focusedCellBox(),\n initialContent,\n }),\n ),\n );\n }\n\n private handlePointerDown = (event: PointerEvent) => {\n if (event.isPrimary) {\n const { action, actionEl } = closestAction(event.target);\n if (action) {\n if (action.startsWith('resize') && this.mode === 'browse') {\n const [resize, index] = action.split(',');\n const [_, axis] = resize.split('-');\n this.pointer = {\n state: 'resizing',\n axis: axis as DxGridAxis,\n size: axis === 'col' ? this.colSize(index) : this.rowSize(index),\n page: getPage(axis, event),\n index,\n };\n } else if (action === 'cell') {\n const cellCoords = closestCell(event.target, actionEl);\n if (cellCoords) {\n this.pointer = { state: 'selecting' };\n this.selectionStart = cellCoords;\n }\n if (this.mode === 'edit') {\n event.preventDefault();\n } else {\n if (this.focusActive && isSameCell(this.focusedCell, cellCoords)) {\n this.dispatchEditRequest();\n }\n }\n }\n }\n }\n };\n\n private handlePointerUp = (event: PointerEvent) => {\n if (this.pointer?.state === 'resizing') {\n // do nothing, todo: remove\n } else {\n const cell = closestCell(event.target);\n if (cell) {\n this.selectionEnd = cell;\n this.dispatchEvent(\n new DxGridCellsSelect({\n start: this.selectionStart,\n end: this.selectionEnd,\n }),\n );\n }\n }\n this.pointer = null;\n };\n\n private handlePointerMove = (event: PointerEvent) => {\n if (this.pointer?.state === 'selecting') {\n const cell = closestCell(event.target);\n if (cell && (cell.col !== this.selectionEnd.col || cell.row !== this.selectionEnd.row)) {\n this.selectionEnd = cell;\n }\n }\n };\n\n private handleKeydown(event: KeyboardEvent) {\n if (this.focusActive && this.mode === 'browse') {\n // Adjust state\n switch (event.key) {\n case 'ArrowDown':\n this.focusedCell = { ...this.focusedCell, row: this.focusedCell.row + 1 };\n break;\n case 'ArrowUp':\n this.focusedCell = { ...this.focusedCell, row: Math.max(0, this.focusedCell.row - 1) };\n break;\n case 'ArrowRight':\n this.focusedCell = { ...this.focusedCell, col: this.focusedCell.col + 1 };\n break;\n case 'ArrowLeft':\n this.focusedCell = { ...this.focusedCell, col: Math.max(0, this.focusedCell.col - 1) };\n break;\n }\n // Emit edit request if relevant\n switch (event.key) {\n case 'Enter':\n this.dispatchEditRequest();\n break;\n default:\n if (event.key.length === 1 && event.key.match(/\\P{Cc}/u)) {\n this.dispatchEditRequest(event.key);\n }\n break;\n }\n // Handle virtualization & focus consequences\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n case 'ArrowRight':\n case 'ArrowLeft':\n event.preventDefault();\n this.snapPosToFocusedCell();\n break;\n }\n }\n }\n\n //\n // Accessors\n //\n\n private colSize(c: number | string) {\n return this.colSizes?.[c] ?? this.columnDefault.size;\n }\n\n private rowSize(r: number | string) {\n return this.rowSizes?.[r] ?? this.rowDefault.size;\n }\n\n private cell(c: number | string, r: number | string) {\n const index: CellIndex = `${c}${separator}${r}`;\n return this.cells[index] ?? this.initialCells[index];\n }\n\n private focusedCellBox(): DxEditRequest['cellBox'] {\n const cellElement = this.focusedCellElement();\n const cellSize = { inlineSize: this.colSize(this.focusedCell.col), blockSize: this.rowSize(this.focusedCell.row) };\n if (!cellElement) {\n return { insetInlineStart: NaN, insetBlockStart: NaN, ...cellSize };\n }\n const contentElement = cellElement.offsetParent as HTMLElement;\n // Note that storing `offset` in state causes performance issues, so instead the transform is parsed here.\n const [_translate3d, inlineStr, blockStr] = contentElement.style.transform.split(/[()]|px,?\\s?/);\n const contentOffsetInline = parseFloat(inlineStr);\n const contentOffsetBlock = parseFloat(blockStr);\n const offsetParent = contentElement.offsetParent as HTMLElement;\n return {\n insetInlineStart: cellElement.offsetLeft + contentOffsetInline + offsetParent.offsetLeft,\n insetBlockStart: cellElement.offsetTop + contentOffsetBlock + offsetParent.offsetTop,\n ...cellSize,\n };\n }\n\n //\n // Resize & reposition handlers, observer, ref\n //\n\n @state()\n private observer = new ResizeObserver((entries) => {\n const { inlineSize, blockSize } = entries?.[0]?.contentBoxSize?.[0] ?? {\n inlineSize: 0,\n blockSize: 0,\n };\n if (\n Math.abs(inlineSize - this.sizeInline) > resizeTolerance ||\n Math.abs(blockSize - this.sizeBlock) > resizeTolerance\n ) {\n // console.info('[updating bounds]', 'resize', [inlineSize - this.sizeInline, blockSize - this.sizeBlock]);\n this.sizeInline = inlineSize;\n this.sizeBlock = blockSize;\n this.updateVis();\n }\n });\n\n private viewportRef: Ref<HTMLDivElement> = createRef();\n\n private maybeUpdateVis = () => {\n if (\n this.posInline >= this.binInlineMin &&\n this.posInline < this.binInlineMax &&\n this.posBlock >= this.binBlockMin &&\n this.posBlock < this.binBlockMax\n ) {\n // do nothing\n } else {\n // console.info(\n // '[updating bounds]',\n // 'wheel',\n // [this.binInlineMin, this.posInline, this.binInlineMax],\n // [this.binBlockMin, this.posBlock, this.binBlockMax],\n // );\n this.updateVis();\n }\n };\n\n private handleWheel = ({ deltaX, deltaY }: WheelEvent) => {\n if (this.mode === 'browse') {\n this.posInline = Math.max(0, this.posInline + deltaX);\n this.posBlock = Math.max(0, this.posBlock + deltaY);\n this.maybeUpdateVis();\n }\n };\n\n private updateVisInline() {\n // todo: avoid starting from zero\n let colIndex = 0;\n let pxInline = this.colSize(colIndex);\n\n while (pxInline < this.posInline) {\n colIndex += 1;\n pxInline += this.colSize(colIndex) + gap;\n }\n\n this.visColMin = colIndex - overscanCol;\n\n this.binInlineMin = pxInline - this.colSize(colIndex) - gap;\n this.binInlineMax = pxInline + gap;\n\n this.overscanInline =\n [...Array(overscanCol)].reduce((acc, _, c0) => {\n acc += this.colSize(this.visColMin + c0);\n return acc;\n }, 0) +\n gap * (overscanCol - 1);\n\n while (pxInline < this.binInlineMax + this.sizeInline + gap) {\n colIndex += 1;\n pxInline += this.colSize(colIndex) + gap;\n }\n\n this.visColMax = colIndex + overscanCol;\n\n this.templateColumns = [...Array(this.visColMax - this.visColMin)]\n .map((_, c0) => `${this.colSize(this.visColMin + c0)}px`)\n .join(' ');\n }\n\n private updateVisBlock() {\n // todo: avoid starting from zero\n let rowIndex = 0;\n let pxBlock = this.rowSize(rowIndex);\n\n while (pxBlock < this.posBlock) {\n rowIndex += 1;\n pxBlock += this.rowSize(rowIndex) + gap;\n }\n\n this.visRowMin = rowIndex - overscanRow;\n\n this.binBlockMin = pxBlock - this.rowSize(rowIndex) - gap;\n this.binBlockMax = pxBlock + gap;\n\n this.overscanBlock =\n [...Array(overscanRow)].reduce((acc, _, r0) => {\n acc += this.rowSize(this.visRowMin + r0);\n return acc;\n }, 0) +\n gap * (overscanRow - 1);\n\n while (pxBlock < this.binBlockMax + this.sizeBlock) {\n rowIndex += 1;\n pxBlock += this.rowSize(rowIndex) + gap;\n }\n\n this.visRowMax = rowIndex + overscanRow;\n\n this.templateRows = [...Array(this.visRowMax - this.visRowMin)]\n .map((_, r0) => `${this.rowSize(this.visRowMin + r0)}px`)\n .join(' ');\n }\n\n private updateVis() {\n this.updateVisInline();\n this.updateVisBlock();\n }\n\n // Focus handlers\n\n @eventOptions({ capture: true })\n private handleFocus(event: FocusEvent) {\n const cellCoords = closestCell(event.target);\n if (cellCoords) {\n this.focusedCell = cellCoords;\n this.focusActive = true;\n }\n }\n\n @eventOptions({ capture: true })\n private handleBlur(event: FocusEvent) {\n // Only unset `focusActive` if focus is not moving to an element within the grid.\n if (!event.relatedTarget || !(event.relatedTarget as HTMLElement).closest(`[data-grid=\"${this.gridId}\"]`)) {\n this.focusActive = false;\n }\n }\n\n private focusedCellElement() {\n return this.viewportRef.value?.querySelector(\n `[aria-colindex=\"${this.focusedCell.col}\"][aria-rowindex=\"${this.focusedCell.row}\"]`,\n ) as HTMLElement | null;\n }\n\n /**\n * Moves focus to the cell with actual focus, otherwise moves focus to the viewport.\n */\n refocus(increment?: 'col' | 'row', delta: 1 | -1 = 1) {\n switch (increment) {\n case 'row':\n this.focusedCell = { ...this.focusedCell, row: this.focusedCell.row + delta };\n break;\n case 'col':\n this.focusedCell = { ...this.focusedCell, col: this.focusedCell.col + delta };\n }\n (this.focusedCell.row < this.visRowMin ||\n this.focusedCell.row > this.visRowMax ||\n this.focusedCell.col < this.visColMin ||\n this.focusedCell.col > this.visColMax\n ? this.viewportRef.value\n : this.focusedCellElement()\n )?.focus({ preventScroll: true });\n if (increment) {\n this.snapPosToFocusedCell();\n }\n }\n\n /**\n * Updates `pos` so that a cell in focus is fully within the viewport\n */\n snapPosToFocusedCell() {\n if (\n this.focusedCell.col < this.visColMin ||\n this.focusedCell.col > this.visColMax ||\n this.focusedCell.row < this.visRowMin ||\n this.focusedCell.row > this.visRowMax\n ) {\n // console.warn('Snapping position to a focused cell that is not already mounted is unsupported.');\n } else if (\n this.focusedCell.col > this.visColMin + overscanCol &&\n this.focusedCell.col < this.visColMax - overscanCol - 1 &&\n this.focusedCell.row > this.visRowMin + overscanRow &&\n this.focusedCell.row < this.visRowMax - overscanRow - 1\n ) {\n // console.log(\n // '[within bounds]',\n // this.focusedCell,\n // [this.visColMin, this.visColMax, overscanCol],\n // [this.visRowMin, this.visRowMax, overscanRow],\n // );\n } else {\n if (this.focusedCell.col <= this.visColMin + overscanCol) {\n this.posInline = this.binInlineMin;\n this.updateVisInline();\n } else if (this.focusedCell.col >= this.visColMax - overscanCol - 1) {\n const sizeSumCol = [...Array(this.focusedCell.col - this.visColMin)].reduce((acc, _, c0) => {\n acc += this.colSize(this.visColMin + overscanCol + c0) + gap;\n return acc;\n }, 0);\n this.posInline = Math.max(0, this.binInlineMin + sizeSumCol + gap * 2 - this.sizeInline);\n this.updateVisInline();\n }\n\n if (this.focusedCell.row <= this.visRowMin + overscanRow) {\n this.posBlock = this.binBlockMin;\n this.updateVisBlock();\n } else if (this.focusedCell.row >= this.visRowMax - overscanRow - 1) {\n const sizeSumRow = [...Array(this.focusedCell.row - this.visRowMin)].reduce((acc, _, r0) => {\n acc += this.rowSize(this.visRowMin + overscanRow + r0) + gap;\n return acc;\n }, 0);\n this.posBlock = Math.max(0, this.binBlockMin + sizeSumRow + gap * 2 - this.sizeBlock);\n this.updateVisBlock();\n }\n }\n }\n\n //\n // Map scroll DOM methods to virtualized value.\n //\n\n override get scrollLeft() {\n return this.posInline;\n }\n\n override set scrollLeft(nextValue: number) {\n this.posInline = nextValue;\n this.maybeUpdateVis();\n }\n\n override get scrollTop() {\n return this.posBlock;\n }\n\n override set scrollTop(nextValue: number) {\n this.posBlock = nextValue;\n this.maybeUpdateVis();\n }\n\n //\n // Resize handlers\n //\n private handleAxisResizeInternal(event: DxAxisResizeInternal) {\n event.stopPropagation();\n const { axis, delta, size, index, type } = event;\n if (axis === 'col') {\n const nextSize = Math.max(sizeColMin, Math.min(sizeColMax, size + delta));\n this.colSizes = { ...this.colSizes, [index]: nextSize };\n this.updateVisInline();\n } else {\n const nextSize = Math.max(sizeRowMin, Math.min(sizeRowMax, size + delta));\n this.rowSizes = { ...this.rowSizes, [index]: nextSize };\n this.updateVisBlock();\n }\n if (type === 'dropped') {\n this.dispatchEvent(\n new DxAxisResize({\n axis,\n index,\n size: this[axis === 'col' ? 'colSize' : 'rowSize'](index),\n }),\n );\n }\n }\n\n //\n // Render and other lifecycle methods\n //\n\n override render() {\n const visibleCols = this.visColMax - this.visColMin;\n const visibleRows = this.visRowMax - this.visRowMin;\n const offsetInline = this.binInlineMin - this.posInline - this.overscanInline;\n const offsetBlock = this.binBlockMin - this.posBlock - this.overscanBlock;\n\n const selectColMin = Math.min(this.selectionStart.col, this.selectionEnd.col);\n const selectColMax = Math.max(this.selectionStart.col, this.selectionEnd.col);\n const selectRowMin = Math.min(this.selectionStart.row, this.selectionEnd.row);\n const selectRowMax = Math.max(this.selectionStart.row, this.selectionEnd.row);\n const selectVisible = selectColMin !== selectColMax || selectRowMin !== selectRowMax;\n\n return html`<div\n role=\"none\"\n class=\"dx-grid\"\n data-grid=${this.gridId}\n data-grid-mode=${this.mode}\n ?data-grid-select=${selectVisible}\n >\n <div role=\"none\" class=\"dx-grid__corner\"></div>\n <div role=\"none\" class=\"dx-grid__columnheader\">\n <div\n role=\"none\"\n class=\"dx-grid__columnheader__content\"\n style=\"transform:translate3d(${offsetInline}px,0,0);grid-template-columns:${this.templateColumns};\"\n >\n ${[...Array(visibleCols)].map((_, c0) => {\n const c = this.visColMin + c0;\n return html`<div\n role=\"columnheader\"\n ?inert=${c < 0}\n style=\"block-size:${this.rowDefault.size}px;grid-column:${c0 + 1}/${c0 + 2};\"\n >\n <span id=${localChId(c0)}>${colToA1Notation(c)}</span>\n ${(this.columns[c]?.resizeable ?? this.columnDefault.resizeable) &&\n html`<dx-grid-axis-resize-handle\n axis=\"col\"\n index=${c}\n size=${this.colSize(c)}\n @dxaxisresizeinternal=${this.handleAxisResizeInternal}\n ></dx-grid-axis-resize-handle>`}\n </div>`;\n })}\n </div>\n </div>\n <div role=\"none\" class=\"dx-grid__corner\"></div>\n <div role=\"none\" class=\"dx-grid__rowheader\">\n <div\n role=\"none\"\n class=\"dx-grid__rowheader__content\"\n style=\"transform:translate3d(0,${offsetBlock}px,0);grid-template-rows:${this.templateRows};\"\n >\n ${[...Array(visibleRows)].map((_, r0) => {\n const r = this.visRowMin + r0;\n return html`<div role=\"rowheader\" ?inert=${r < 0} style=\"grid-row:${r0 + 1}/${r0 + 2}\">\n <span id=${localRhId(r0)}>${rowToA1Notation(r)}</span>\n ${(this.rows[r]?.resizeable ?? this.rowDefault.resizeable) &&\n html`<dx-grid-axis-resize-handle\n axis=\"row\"\n index=${r}\n size=${this.rowSize(r)}\n ></dx-grid-axis-resize-handle>`}\n </div>`;\n })}\n </div>\n </div>\n <div role=\"grid\" class=\"dx-grid__viewport\" tabindex=\"0\" @wheel=${this.handleWheel} ${ref(this.viewportRef)}>\n <div\n role=\"none\"\n class=\"dx-grid__content\"\n style=\"transform:translate3d(${offsetInline}px,${offsetBlock}px,0);grid-template-columns:${this\n .templateColumns};grid-template-rows:${this.templateRows};\"\n >\n ${[...Array(visibleCols)].map((_, c0) => {\n return [...Array(visibleRows)].map((_, r0) => {\n const c = c0 + this.visColMin;\n const r = r0 + this.visRowMin;\n const cell = this.cell(c, r);\n const active = this.focusActive && this.focusedCell.col === c && this.focusedCell.row === r;\n const selected = c >= selectColMin && c <= selectColMax && r >= selectRowMin && r <= selectRowMax;\n return html`<div\n role=\"gridcell\"\n tabindex=\"0\"\n ?inert=${c < 0 || r < 0}\n ?aria-selected=${selected}\n class=${cell || active\n ? (cell?.className ? cell.className + ' ' : '') + (active ? 'dx-grid__cell--active' : '')\n : nothing}\n aria-rowindex=${r}\n aria-colindex=${c}\n data-dx-grid-action=\"cell\"\n style=\"grid-column:${c0 + 1};grid-row:${r0 + 1}\"\n >\n ${cell?.value}\n </div>`;\n });\n })}\n </div>\n </div>\n <div role=\"none\" class=\"dx-grid__scrollbar\" aria-orientation=\"vertical\">\n <div role=\"none\" class=\"dx-grid__scrollbar__thumb\"></div>\n </div>\n <div role=\"none\" class=\"dx-grid__corner\"></div>\n <div role=\"none\" class=\"dx-grid__scrollbar\" aria-orientation=\"horizontal\">\n <div role=\"none\" class=\"dx-grid__scrollbar__thumb\"></div>\n </div>\n <div role=\"none\" class=\"dx-grid__corner\"></div>\n </div>`;\n }\n\n override firstUpdated() {\n if (this.getCells) {\n this.cells = this.getCells({\n start: { col: this.visColMin, row: this.visRowMin },\n end: { col: this.visColMax, row: this.visRowMax },\n });\n }\n this.observer.observe(this.viewportRef.value!);\n this.colSizes = Object.entries(this.columns).reduce((acc: Record<string, number>, [colId, colMeta]) => {\n if (colMeta?.size) {\n acc[colId] = colMeta.size;\n }\n return acc;\n }, {});\n this.rowSizes = Object.entries(this.rows).reduce((acc: Record<string, number>, [rowId, rowMeta]) => {\n if (rowMeta?.size) {\n acc[rowId] = rowMeta.size;\n }\n return acc;\n }, {});\n }\n\n override willUpdate(changedProperties: Map<string, any>) {\n if (\n this.getCells &&\n (changedProperties.has('initialCells') ||\n changedProperties.has('visColMin') ||\n changedProperties.has('visColMax') ||\n changedProperties.has('visRowMin') ||\n changedProperties.has('visRowMax'))\n ) {\n this.cells = this.getCells({\n start: { col: this.visColMin, row: this.visRowMin },\n end: { col: this.visColMax, row: this.visRowMax },\n });\n }\n }\n\n override updated(changedProperties: Map<string, any>) {\n // Update the focused element if there is a change in bounds (otherwise Lit keeps focus on the relative element).\n if (\n this.focusActive &&\n (changedProperties.has('visRowMin') || changedProperties.has('visColMin') || changedProperties.has('focusedCell'))\n ) {\n this.refocus();\n }\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n // console.log('[disconnected]', this.viewportRef.value);\n // TODO(thure): Will this even work?\n if (this.viewportRef.value) {\n this.observer.unobserve(this.viewportRef.value);\n }\n }\n\n override createRenderRoot() {\n return this;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { draggable } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { disableNativeDragPreview } from '@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview';\nimport { preventUnhandled } from '@atlaskit/pragmatic-drag-and-drop/prevent-unhandled';\nimport { type CleanupFn, type DragLocationHistory } from '@atlaskit/pragmatic-drag-and-drop/types';\nimport { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { ref } from 'lit/directives/ref.js';\n\nimport { DxAxisResizeInternal, type DxGridAxis } from './types';\n\n@customElement('dx-grid-axis-resize-handle')\nexport class DxGridAxisResizeHandle extends LitElement {\n @property({ type: String })\n axis: DxGridAxis = 'row';\n\n @property({ type: String })\n index: string = '-1';\n\n @property({ type: Number })\n size: number = 128;\n\n private dragStartSize: number = 128;\n\n override render() {\n return html`<button class=\"dx-grid__resize-handle\" ${ref(this.mount)}>\n <span class=\"sr-only\">Resize</span>\n </button>`;\n }\n\n private cleanup: CleanupFn | null = null;\n\n private dispatchResize(location: DragLocationHistory, state: 'dragging' | 'dropped') {\n const client = this.axis === 'row' ? 'clientY' : 'clientX';\n const event = new DxAxisResizeInternal({\n axis: this.axis,\n size: this.dragStartSize,\n index: this.index,\n delta: location.current.input[client] - location.initial.input[client],\n state,\n });\n this.dispatchEvent(event);\n }\n\n private mount(element?: Element) {\n this.cleanup?.();\n const host = this;\n if (element) {\n this.cleanup = draggable({\n element: element as HTMLButtonElement,\n onGenerateDragPreview: ({ nativeSetDragImage }) => {\n // we will be moving the line to indicate a drag\n // we can disable the native drag preview\n disableNativeDragPreview({ nativeSetDragImage });\n // we don't want any native drop animation for when the user\n // does not drop on a drop target. we want the drag to finish immediately\n preventUnhandled.start();\n },\n onDragStart() {\n host.dragStartSize = host.size;\n },\n onDrag({ location }) {\n host.dispatchResize(location, 'dragging');\n },\n onDrop({ location }) {\n host.dispatchResize(location, 'dropped');\n },\n });\n }\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.cleanup?.();\n }\n\n override createRenderRoot() {\n return this;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type CellIndex, type DxGridPosition } from './types';\n\n/**\n * Separator for serializing cell position vectors\n */\nexport const separator = ',';\n\nexport const toCellIndex = (cellCoords: DxGridPosition): CellIndex => `${cellCoords.col}${separator}${cellCoords.row}`;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type DxGrid } from './dx-grid';\nimport { toCellIndex } from './util';\n\nexport type CellIndex = `${string},${string}`;\n\nexport type DxGridAxis = 'row' | 'col';\n\nexport type DxGridPosition = Record<DxGridAxis, number>;\nexport type DxGridPositionNullable = DxGridPosition | null;\n\nexport type DxGridCells = Record<CellIndex, CellValue>;\n\nexport type DxGridAxisMeta = Record<string, AxisMeta>;\n\nexport type DxGridPointer = null | ({ state: 'resizing'; page: number } & DxAxisResizeProps) | { state: 'selecting' };\n\nexport type DxAxisResizeProps = Pick<DxAxisResize, 'axis' | 'index' | 'size'>;\nexport type DxAxisResizeInternalProps = DxAxisResizeProps & { delta: number; state: 'dragging' | 'dropped' };\n\nexport type DxGridMode = 'browse' | 'edit';\n\nexport type CellValue = {\n /**\n * The content value\n */\n value: string;\n /**\n * If this is a merged cell, the bottomright-most of the range in numeric notation, otherwise undefined.\n */\n end?: string;\n /**\n * `class` attribute value to apply to the gridcell element\n */\n className?: string;\n};\n\nexport type AxisMeta = {\n size: number;\n description?: string;\n resizeable?: boolean;\n};\n\nexport type DxGridProps = Partial<Pick<DxGrid, 'initialCells' | 'rows' | 'columns' | 'rowDefault' | 'columnDefault'>>;\n\nexport class DxAxisResize extends Event {\n public readonly axis: DxGridAxis;\n public readonly index: string;\n public readonly size: number;\n constructor(props: DxAxisResizeProps) {\n super('dx-axis-resize');\n this.axis = props.axis;\n this.index = props.index;\n this.size = props.size;\n }\n}\n\nexport class DxAxisResizeInternal extends Event {\n public readonly axis: DxGridAxis;\n public readonly index: string;\n public readonly size: number;\n public readonly delta: number;\n public readonly state: 'dragging' | 'dropped';\n constructor(props: DxAxisResizeInternalProps) {\n super('dx-axis-resize-internal', { composed: true, bubbles: true });\n this.axis = props.axis;\n this.index = props.index;\n this.size = props.size;\n this.delta = props.delta;\n this.state = props.state;\n }\n}\n\nexport type DxEditRequestProps = Pick<DxEditRequest, 'cellIndex' | 'cellBox' | 'initialContent'>;\n\nexport class DxEditRequest extends Event {\n public readonly cellIndex: CellIndex;\n public readonly cellBox: Record<'insetInlineStart' | 'insetBlockStart' | 'inlineSize' | 'blockSize', number>;\n public readonly initialContent?: string;\n constructor(props: DxEditRequestProps) {\n super('dx-edit-request');\n this.cellIndex = props.cellIndex;\n this.cellBox = props.cellBox;\n this.initialContent = props.initialContent;\n }\n}\n\nexport type DxGridRange = { start: DxGridPosition; end: DxGridPosition };\n\nexport class DxGridCellsSelect extends Event {\n public readonly start: string;\n public readonly end: string;\n public readonly minCol: number;\n public readonly maxCol: number;\n public readonly minRow: number;\n public readonly maxRow: number;\n constructor({ start, end }: DxGridRange) {\n super('dx-grid-cells-select');\n this.start = toCellIndex(start);\n this.end = toCellIndex(end);\n this.minCol = Math.min(start.col, end.col);\n this.maxCol = Math.max(start.col, end.col);\n this.minRow = Math.min(start.row, end.row);\n this.maxRow = Math.max(start.row, end.row);\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["LitElement", "html", "nothing", "customElement", "state", "property", "eventOptions", "ref", "createRef", "draggable", "disableNativeDragPreview", "preventUnhandled", "html", "LitElement", "customElement", "property", "ref", "separator", "toCellIndex", "cellCoords", "col", "row", "DxAxisResize", "Event", "constructor", "props", "axis", "index", "size", "DxAxisResizeInternal", "composed", "bubbles", "delta", "state", "DxEditRequest", "cellIndex", "cellBox", "initialContent", "DxGridCellsSelect", "start", "end", "toCellIndex", "minCol", "Math", "min", "col", "maxCol", "max", "minRow", "row", "maxRow", "DxGridAxisResizeHandle", "LitElement", "axis", "index", "size", "dragStartSize", "cleanup", "render", "html", "ref", "mount", "dispatchResize", "location", "state", "client", "event", "DxAxisResizeInternal", "delta", "current", "input", "initial", "dispatchEvent", "element", "host", "draggable", "onGenerateDragPreview", "nativeSetDragImage", "disableNativeDragPreview", "preventUnhandled", "start", "onDragStart", "onDrag", "onDrop", "disconnectedCallback", "createRenderRoot", "property", "type", "String", "Number", "customElement", "gap", "resizeTolerance", "overscanCol", "overscanRow", "sizeColMin", "sizeColMax", "sizeRowMin", "sizeRowMax", "colToA1Notation", "col", "String", "fromCharCode", "charCodeAt", "Math", "floor", "rowToA1Notation", "row", "closestAction", "target", "actionEl", "closest", "action", "getAttribute", "closestCell", "cellElement", "parseInt", "isSameCell", "a", "b", "Number", "isFinite", "localChId", "c0", "localRhId", "r0", "getPage", "axis", "event", "pageX", "pageY", "DxGrid", "LitElement", "constructor", "gridId", "rowDefault", "size", "columnDefault", "rows", "columns", "initialCells", "mode", "getCells", "cells", "posInline", "posBlock", "sizeInline", "sizeBlock", "overscanInline", "overscanBlock", "binInlineMin", "binInlineMax", "colSize", "binBlockMin", "binBlockMax", "rowSize", "visColMin", "visColMax", "visRowMin", "visRowMax", "templateColumns", "templateRows", "pointer", "colSizes", "rowSizes", "focusActive", "focusedCell", "selectionStart", "selectionEnd", "handlePointerDown", "isPrimary", "startsWith", "resize", "index", "split", "_", "state", "page", "cellCoords", "preventDefault", "dispatchEditRequest", "handlePointerUp", "cell", "dispatchEvent", "DxGridCellsSelect", "start", "end", "handlePointerMove", "observer", "ResizeObserver", "entries", "inlineSize", "blockSize", "contentBoxSize", "abs", "updateVis", "viewportRef", "createRef", "maybeUpdateVis", "handleWheel", "deltaX", "deltaY", "max", "addEventListener", "handleAxisResizeInternal", "handleFocus", "capture", "handleBlur", "handleKeydown", "initialContent", "snapPosToFocusedCell", "queueMicrotask", "DxEditRequest", "cellIndex", "toCellIndex", "cellBox", "focusedCellBox", "key", "length", "match", "c", "r", "separator", "focusedCellElement", "cellSize", "insetInlineStart", "NaN", "insetBlockStart", "contentElement", "offsetParent", "_translate3d", "inlineStr", "blockStr", "style", "transform", "contentOffsetInline", "parseFloat", "contentOffsetBlock", "offsetLeft", "offsetTop", "updateVisInline", "colIndex", "pxInline", "Array", "reduce", "acc", "map", "join", "updateVisBlock", "rowIndex", "pxBlock", "relatedTarget", "value", "querySelector", "refocus", "increment", "delta", "focus", "preventScroll", "sizeSumCol", "sizeSumRow", "scrollLeft", "nextValue", "scrollTop", "stopPropagation", "type", "nextSize", "min", "DxAxisResize", "render", "visibleCols", "visibleRows", "offsetInline", "offsetBlock", "selectColMin", "selectColMax", "selectRowMin", "selectRowMax", "selectVisible", "html", "resizeable", "ref", "active", "selected", "className", "nothing", "firstUpdated", "observe", "Object", "colId", "colMeta", "rowId", "rowMeta", "willUpdate", "changedProperties", "has", "updated", "disconnectedCallback", "unobserve", "createRenderRoot", "property", "eventOptions", "customElement"]
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { LitElement, html, nothing } from 'lit';\nimport { customElement, state, property, eventOptions } from 'lit/decorators.js';\nimport { ref, createRef, type Ref } from 'lit/directives/ref.js';\nimport { styleMap } from 'lit/directives/style-map.js';\n\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport './dx-grid-axis-resize-handle';\nimport {\n type AxisMeta,\n type CellIndex,\n DxAxisResize,\n type DxAxisResizeInternal,\n DxEditRequest,\n type DxGridAxis,\n type DxGridAxisMeta,\n type DxGridCells,\n DxGridCellsSelect,\n type DxGridMode,\n type DxGridPointer,\n type DxGridPosition,\n type DxGridPositionNullable,\n type DxGridRange,\n} from './types';\nimport { separator, toCellIndex } from './util';\n\n/**\n * The size in pixels of the gap between cells\n */\nconst gap = 1;\n\n/**\n * ResizeObserver notices even subpixel changes, only respond to changes of at least 1px.\n */\nconst resizeTolerance = 1;\n\n//\n// `overscan` is the number of columns or rows to render outside of the viewport\n//\nconst overscanCol = 1;\nconst overscanRow = 1;\n\n//\n// `size`, when suffixed with ‘row’ or ‘col’, are limits on size applied when resizing\n//\nconst sizeColMin = 32;\nconst sizeColMax = 1024;\nconst sizeRowMin = 16;\nconst sizeRowMax = 1024;\n\n//\n// A1 notation is the fallback for numbering columns and rows.\n//\n\nconst colToA1Notation = (col: number): string => {\n return (\n (col >= 26 ? String.fromCharCode('A'.charCodeAt(0) + Math.floor(col / 26) - 1) : '') +\n String.fromCharCode('A'.charCodeAt(0) + (col % 26))\n );\n};\n\nconst rowToA1Notation = (row: number): string => {\n return `${row + 1}`;\n};\n\nconst closestAction = (target: EventTarget | null): { action: string | null; actionEl: HTMLElement | null } => {\n const actionEl: HTMLElement | null = (target as HTMLElement | null)?.closest('[data-dx-grid-action]') ?? null;\n return { actionEl, action: actionEl?.getAttribute('data-dx-grid-action') ?? null };\n};\n\nconst closestCell = (target: EventTarget | null, actionEl?: HTMLElement | null): DxGridPositionNullable => {\n let cellElement = actionEl;\n if (!cellElement) {\n const { action, actionEl } = closestAction(target);\n if (action === 'cell') {\n cellElement = actionEl as HTMLElement;\n }\n }\n if (cellElement) {\n const col = parseInt(cellElement.getAttribute('aria-colindex') ?? 'never');\n const row = parseInt(cellElement.getAttribute('aria-rowindex') ?? 'never');\n return { col, row };\n } else {\n return null;\n }\n};\n\nconst isSameCell = (a: DxGridPositionNullable, b: DxGridPositionNullable) =>\n a && b && Number.isFinite(a.col) && Number.isFinite(a.row) && a.col === b.col && a.row === b.row;\n\nconst localChId = (c0: number) => `ch--${c0}`;\nconst localRhId = (r0: number) => `rh--${r0}`;\n\nconst getPage = (axis: string, event: PointerEvent) => (axis === 'col' ? event.pageX : event.pageY);\n\n@customElement('dx-grid')\nexport class DxGrid extends LitElement {\n constructor() {\n super();\n this.addEventListener('dx-axis-resize-internal', this.handleAxisResizeInternal as EventListener);\n this.addEventListener('wheel', this.handleWheel, { passive: true });\n this.addEventListener('pointerdown', this.handlePointerDown);\n this.addEventListener('pointermove', this.handlePointerMove);\n this.addEventListener('pointerup', this.handlePointerUp);\n this.addEventListener('pointerleave', this.handlePointerUp);\n this.addEventListener('focus', this.handleFocus, { capture: true });\n this.addEventListener('blur', this.handleBlur, { capture: true });\n this.addEventListener('keydown', this.handleKeydown);\n }\n\n @property({ type: String })\n gridId: string = 'default-grid-id';\n\n @property({ type: Object })\n rowDefault: AxisMeta = { size: 32 };\n\n @property({ type: Object })\n columnDefault: AxisMeta = { size: 180 };\n\n @property({ type: Object })\n rows: DxGridAxisMeta = {};\n\n @property({ type: Object })\n columns: DxGridAxisMeta = {};\n\n @property({ type: Object })\n initialCells: DxGridCells = {};\n\n @property({ type: String })\n mode: DxGridMode = 'browse';\n\n @property({ type: Number })\n limitColumns: number = Infinity;\n\n @property({ type: Number })\n limitRows: number = Infinity;\n\n /**\n * When this function is defined, it is used first to try to get a value for a cell, and otherwise will fall back\n * to `cells`.\n */\n getCells: ((nextRange: DxGridRange) => DxGridCells) | null = null;\n\n @state()\n private cells: DxGridCells = {};\n\n //\n // `pos`, short for ‘position’, is the position in pixels of the viewport from the origin.\n //\n\n @state()\n private posInline = 0;\n\n @state()\n private posBlock = 0;\n\n //\n // `size` (when not suffixed with ‘row’ or ‘col’, see above) is the size in pixels of the viewport.\n //\n\n @state()\n private sizeInline = 0;\n\n @state()\n private sizeBlock = 0;\n\n //\n // `overscan` is the amount in pixels to offset the grid content due to the number of overscanned columns or rows.\n //\n\n @state()\n private overscanInline = 0;\n\n @state()\n private overscanBlock = 0;\n\n //\n // `bin`, not short for anything, is the range in pixels within which virtualization does not need to reassess.\n //\n\n @state()\n private binInlineMin = 0;\n\n @state()\n private binInlineMax = this.colSize(0);\n\n @state()\n private binBlockMin = 0;\n\n @state()\n private binBlockMax = this.rowSize(0);\n\n //\n // `vis`, short for ‘visible’, is the range in numeric index of the columns or rows which should be rendered within\n // the viewport. These start with naïve values that are updated before first contentful render.\n //\n\n @state()\n private visColMin = 0;\n\n @state()\n private visColMax = 1;\n\n @state()\n private visRowMin = 0;\n\n @state()\n private visRowMax = 1;\n\n //\n // `template` is the rendered value of `grid-{axis}-template`.\n //\n @state()\n private templateColumns = `${this.colSize(0)}px`;\n\n @state()\n private templateRows = `${this.rowSize(0)}px`;\n\n //\n // Focus, selection, and resize states\n //\n\n @state()\n private pointer: DxGridPointer = null;\n\n @state()\n private colSizes: Record<string, number> = {};\n\n @state()\n private rowSizes: Record<string, number> = {};\n\n @state()\n private focusActive: boolean = false;\n\n @state()\n private focusedCell: DxGridPosition = { col: 0, row: 0 };\n\n @state()\n private selectionStart: DxGridPosition = { col: 0, row: 0 };\n\n @state()\n private selectionEnd: DxGridPosition = { col: 0, row: 0 };\n\n //\n // Limits\n //\n\n @state()\n private intrinsicInlineSize: number = Infinity;\n\n @state()\n private intrinsicBlockSize: number = Infinity;\n\n //\n // Primary pointer and keyboard handlers\n //\n\n private dispatchEditRequest(initialContent?: string) {\n this.snapPosToFocusedCell();\n // Without deferring, the event dispatches before `focusedCellBox` can get updated bounds of the cell, hence:\n queueMicrotask(() =>\n this.dispatchEvent(\n new DxEditRequest({\n cellIndex: toCellIndex(this.focusedCell),\n cellBox: this.focusedCellBox(),\n initialContent,\n }),\n ),\n );\n }\n\n private handlePointerDown = (event: PointerEvent) => {\n if (event.isPrimary) {\n const { action, actionEl } = closestAction(event.target);\n if (action) {\n if (action.startsWith('resize') && this.mode === 'browse') {\n const [resize, index] = action.split(',');\n const [_, axis] = resize.split('-');\n this.pointer = {\n state: 'resizing',\n axis: axis as DxGridAxis,\n size: axis === 'col' ? this.colSize(index) : this.rowSize(index),\n page: getPage(axis, event),\n index,\n };\n } else if (action === 'cell') {\n const cellCoords = closestCell(event.target, actionEl);\n if (cellCoords) {\n this.pointer = { state: 'selecting' };\n this.selectionStart = cellCoords;\n }\n if (this.mode === 'edit') {\n event.preventDefault();\n } else {\n if (this.focusActive && isSameCell(this.focusedCell, cellCoords)) {\n this.dispatchEditRequest();\n }\n }\n }\n }\n }\n };\n\n private handlePointerUp = (event: PointerEvent) => {\n if (this.pointer?.state === 'resizing') {\n // do nothing, todo: remove\n } else {\n const cell = closestCell(event.target);\n if (cell) {\n this.selectionEnd = cell;\n this.dispatchEvent(\n new DxGridCellsSelect({\n start: this.selectionStart,\n end: this.selectionEnd,\n }),\n );\n }\n }\n this.pointer = null;\n };\n\n private handlePointerMove = (event: PointerEvent) => {\n if (this.pointer?.state === 'selecting') {\n const cell = closestCell(event.target);\n if (cell && (cell.col !== this.selectionEnd.col || cell.row !== this.selectionEnd.row)) {\n this.selectionEnd = cell;\n }\n }\n };\n\n private handleKeydown(event: KeyboardEvent) {\n if (this.focusActive && this.mode === 'browse') {\n // Adjust state\n switch (event.key) {\n case 'ArrowDown':\n this.focusedCell = { ...this.focusedCell, row: Math.min(this.limitRows - 1, this.focusedCell.row + 1) };\n break;\n case 'ArrowUp':\n this.focusedCell = { ...this.focusedCell, row: Math.max(0, this.focusedCell.row - 1) };\n break;\n case 'ArrowRight':\n this.focusedCell = { ...this.focusedCell, col: Math.min(this.limitColumns - 1, this.focusedCell.col + 1) };\n break;\n case 'ArrowLeft':\n this.focusedCell = { ...this.focusedCell, col: Math.max(0, this.focusedCell.col - 1) };\n break;\n }\n // Emit edit request if relevant\n switch (event.key) {\n case 'Enter':\n this.dispatchEditRequest();\n break;\n default:\n if (event.key.length === 1 && event.key.match(/\\P{Cc}/u)) {\n this.dispatchEditRequest(event.key);\n }\n break;\n }\n // Handle virtualization & focus consequences\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n case 'ArrowRight':\n case 'ArrowLeft':\n event.preventDefault();\n this.snapPosToFocusedCell();\n break;\n }\n }\n }\n\n //\n // Accessors\n //\n\n private colSize(c: number | string) {\n return this.colSizes?.[c] ?? this.columnDefault.size;\n }\n\n private rowSize(r: number | string) {\n return this.rowSizes?.[r] ?? this.rowDefault.size;\n }\n\n private cell(c: number | string, r: number | string) {\n const index: CellIndex = `${c}${separator}${r}`;\n return this.cells[index] ?? this.initialCells[index];\n }\n\n private focusedCellBox(): DxEditRequest['cellBox'] {\n const cellElement = this.focusedCellElement();\n const cellSize = { inlineSize: this.colSize(this.focusedCell.col), blockSize: this.rowSize(this.focusedCell.row) };\n if (!cellElement) {\n return { insetInlineStart: NaN, insetBlockStart: NaN, ...cellSize };\n }\n const contentElement = cellElement.offsetParent as HTMLElement;\n // Note that storing `offset` in state causes performance issues, so instead the transform is parsed here.\n const [_translate3d, inlineStr, blockStr] = contentElement.style.transform.split(/[()]|px,?\\s?/);\n const contentOffsetInline = parseFloat(inlineStr);\n const contentOffsetBlock = parseFloat(blockStr);\n const offsetParent = contentElement.offsetParent as HTMLElement;\n return {\n insetInlineStart: cellElement.offsetLeft + contentOffsetInline + offsetParent.offsetLeft,\n insetBlockStart: cellElement.offsetTop + contentOffsetBlock + offsetParent.offsetTop,\n ...cellSize,\n };\n }\n\n //\n // Resize & reposition handlers, observer, ref\n //\n\n @state()\n private observer = new ResizeObserver((entries) => {\n const { inlineSize, blockSize } = entries?.[0]?.contentBoxSize?.[0] ?? {\n inlineSize: 0,\n blockSize: 0,\n };\n if (\n Math.abs(inlineSize - this.sizeInline) > resizeTolerance ||\n Math.abs(blockSize - this.sizeBlock) > resizeTolerance\n ) {\n // console.info('[updating bounds]', 'resize', [inlineSize - this.sizeInline, blockSize - this.sizeBlock]);\n this.sizeInline = inlineSize;\n this.sizeBlock = blockSize;\n this.updateVis();\n queueMicrotask(() => this.updatePos());\n }\n });\n\n private viewportRef: Ref<HTMLDivElement> = createRef();\n\n private maybeUpdateVis = () => {\n if (\n this.posInline >= this.binInlineMin &&\n this.posInline < this.binInlineMax &&\n this.posBlock >= this.binBlockMin &&\n this.posBlock < this.binBlockMax\n ) {\n // do nothing\n } else {\n // console.info(\n // '[updating bounds]',\n // 'wheel',\n // [this.binInlineMin, this.posInline, this.binInlineMax],\n // [this.binBlockMin, this.posBlock, this.binBlockMax],\n // );\n this.updateVis();\n }\n };\n\n private updatePos(inline?: number, block?: number) {\n this.posInline = Math.max(0, Math.min(this.intrinsicInlineSize - this.sizeInline, inline ?? this.posInline));\n this.posBlock = Math.max(0, Math.min(this.intrinsicBlockSize - this.sizeBlock, block ?? this.posBlock));\n this.maybeUpdateVis();\n }\n\n private handleWheel = ({ deltaX, deltaY }: Pick<WheelEvent, 'deltaX' | 'deltaY'>) => {\n if (this.mode === 'browse') {\n this.updatePos(this.posInline + deltaX, this.posBlock + deltaY);\n }\n };\n\n private updateVisInline() {\n // todo: avoid starting from zero\n let colIndex = 0;\n let pxInline = this.colSize(colIndex);\n\n while (pxInline < this.posInline) {\n colIndex += 1;\n pxInline += this.colSize(colIndex) + gap;\n }\n\n this.visColMin = colIndex - overscanCol;\n\n this.binInlineMin = pxInline - this.colSize(colIndex) - gap;\n this.binInlineMax = pxInline + gap;\n\n this.overscanInline =\n [...Array(overscanCol)].reduce((acc, _, c0) => {\n acc += this.colSize(this.visColMin + c0);\n return acc;\n }, 0) +\n gap * (overscanCol - 1);\n\n while (pxInline < this.binInlineMax + this.sizeInline + gap) {\n colIndex += 1;\n pxInline += this.colSize(colIndex) + gap;\n }\n\n this.visColMax = Math.min(this.limitColumns, colIndex + overscanCol);\n\n this.templateColumns = [...Array(this.visColMax - this.visColMin)]\n .map((_, c0) => `${this.colSize(this.visColMin + c0)}px`)\n .join(' ');\n }\n\n private updateVisBlock() {\n // todo: avoid starting from zero\n let rowIndex = 0;\n let pxBlock = this.rowSize(rowIndex);\n\n while (pxBlock < this.posBlock) {\n rowIndex += 1;\n pxBlock += this.rowSize(rowIndex) + gap;\n }\n\n this.visRowMin = rowIndex - overscanRow;\n\n this.binBlockMin = pxBlock - this.rowSize(rowIndex) - gap;\n this.binBlockMax = pxBlock + gap;\n\n this.overscanBlock =\n [...Array(overscanRow)].reduce((acc, _, r0) => {\n acc += this.rowSize(this.visRowMin + r0);\n return acc;\n }, 0) +\n gap * (overscanRow - 1);\n\n while (pxBlock < this.binBlockMax + this.sizeBlock) {\n rowIndex += 1;\n pxBlock += this.rowSize(rowIndex) + gap;\n }\n\n this.visRowMax = Math.min(this.limitRows, rowIndex + overscanRow);\n\n this.templateRows = [...Array(this.visRowMax - this.visRowMin)]\n .map((_, r0) => `${this.rowSize(this.visRowMin + r0)}px`)\n .join(' ');\n }\n\n private updateVis() {\n this.updateVisInline();\n this.updateVisBlock();\n }\n\n // Focus handlers\n\n @eventOptions({ capture: true })\n private handleFocus(event: FocusEvent) {\n const cellCoords = closestCell(event.target);\n if (cellCoords) {\n this.focusedCell = cellCoords;\n this.focusActive = true;\n }\n }\n\n @eventOptions({ capture: true })\n private handleBlur(event: FocusEvent) {\n // Only unset `focusActive` if focus is not moving to an element within the grid.\n if (!event.relatedTarget || !(event.relatedTarget as HTMLElement).closest(`[data-grid=\"${this.gridId}\"]`)) {\n this.focusActive = false;\n }\n }\n\n private focusedCellElement() {\n return this.viewportRef.value?.querySelector(\n `[aria-colindex=\"${this.focusedCell.col}\"][aria-rowindex=\"${this.focusedCell.row}\"]`,\n ) as HTMLElement | null;\n }\n\n /**\n * Moves focus to the cell with actual focus, otherwise moves focus to the viewport.\n */\n refocus(increment?: 'col' | 'row', delta: 1 | -1 = 1) {\n switch (increment) {\n case 'row':\n this.focusedCell = { ...this.focusedCell, row: this.focusedCell.row + delta };\n break;\n case 'col':\n this.focusedCell = { ...this.focusedCell, col: this.focusedCell.col + delta };\n }\n (this.focusedCell.row < this.visRowMin ||\n this.focusedCell.row > this.visRowMax ||\n this.focusedCell.col < this.visColMin ||\n this.focusedCell.col > this.visColMax\n ? this.viewportRef.value\n : this.focusedCellElement()\n )?.focus({ preventScroll: true });\n if (increment) {\n this.snapPosToFocusedCell();\n }\n }\n\n /**\n * Updates `pos` so that a cell in focus is fully within the viewport\n */\n snapPosToFocusedCell() {\n if (\n this.focusedCell.col < this.visColMin ||\n this.focusedCell.col > this.visColMax ||\n this.focusedCell.row < this.visRowMin ||\n this.focusedCell.row > this.visRowMax\n ) {\n // console.warn('Snapping position to a focused cell that is not already mounted is unsupported.');\n } else if (\n this.focusedCell.col > this.visColMin + overscanCol &&\n this.focusedCell.col < this.visColMax - overscanCol - 1 &&\n this.focusedCell.row > this.visRowMin + overscanRow &&\n this.focusedCell.row < this.visRowMax - overscanRow - 1\n ) {\n // console.log(\n // '[within bounds]',\n // this.focusedCell,\n // [this.visColMin, this.visColMax, overscanCol],\n // [this.visRowMin, this.visRowMax, overscanRow],\n // );\n } else {\n if (this.focusedCell.col <= this.visColMin + overscanCol) {\n this.posInline = this.binInlineMin + gap;\n this.updateVisInline();\n } else if (this.focusedCell.col >= this.visColMax - overscanCol - 1) {\n const sizeSumCol = [...Array(this.focusedCell.col - this.visColMin)].reduce((acc, _, c0) => {\n acc += this.colSize(this.visColMin + overscanCol + c0) + gap;\n return acc;\n }, 0);\n this.posInline = Math.max(\n 0,\n Math.min(\n this.intrinsicInlineSize - this.sizeInline,\n this.binInlineMin + sizeSumCol + gap * 2 - this.sizeInline,\n ),\n );\n this.updateVisInline();\n }\n\n if (this.focusedCell.row <= this.visRowMin + overscanRow) {\n this.posBlock = this.binBlockMin + gap;\n this.updateVisBlock();\n } else if (this.focusedCell.row >= this.visRowMax - overscanRow - 1) {\n const sizeSumRow = [...Array(this.focusedCell.row - this.visRowMin)].reduce((acc, _, r0) => {\n acc += this.rowSize(this.visRowMin + overscanRow + r0) + gap;\n return acc;\n }, 0);\n this.posBlock = Math.max(\n 0,\n Math.min(this.intrinsicBlockSize - this.sizeBlock, this.binBlockMin + sizeSumRow + gap * 2 - this.sizeBlock),\n );\n this.updateVisBlock();\n }\n }\n }\n\n //\n // Map scroll DOM methods to virtualized value.\n //\n\n override get scrollLeft() {\n return this.posInline;\n }\n\n override set scrollLeft(nextValue: number) {\n this.posInline = nextValue;\n this.maybeUpdateVis();\n }\n\n override get scrollTop() {\n return this.posBlock;\n }\n\n override set scrollTop(nextValue: number) {\n this.posBlock = nextValue;\n this.maybeUpdateVis();\n }\n\n //\n // Resize handlers\n //\n private handleAxisResizeInternal(event: DxAxisResizeInternal) {\n event.stopPropagation();\n const { axis, delta, size, index, type } = event;\n if (axis === 'col') {\n const nextSize = Math.max(sizeColMin, Math.min(sizeColMax, size + delta));\n this.colSizes = { ...this.colSizes, [index]: nextSize };\n this.updateVisInline();\n this.updateIntrinsicInlineSize();\n } else {\n const nextSize = Math.max(sizeRowMin, Math.min(sizeRowMax, size + delta));\n this.rowSizes = { ...this.rowSizes, [index]: nextSize };\n this.updateVisBlock();\n this.updateIntrinsicBlockSize();\n }\n if (type === 'dropped') {\n this.dispatchEvent(\n new DxAxisResize({\n axis,\n index,\n size: this[axis === 'col' ? 'colSize' : 'rowSize'](index),\n }),\n );\n }\n }\n\n //\n // Render and other lifecycle methods\n //\n\n override render() {\n const visibleCols = this.visColMax - this.visColMin;\n const visibleRows = this.visRowMax - this.visRowMin;\n const offsetInline = this.binInlineMin - this.posInline - this.overscanInline;\n const offsetBlock = this.binBlockMin - this.posBlock - this.overscanBlock;\n\n const selectColMin = Math.min(this.selectionStart.col, this.selectionEnd.col);\n const selectColMax = Math.max(this.selectionStart.col, this.selectionEnd.col);\n const selectRowMin = Math.min(this.selectionStart.row, this.selectionEnd.row);\n const selectRowMax = Math.max(this.selectionStart.row, this.selectionEnd.row);\n const selectVisible = selectColMin !== selectColMax || selectRowMin !== selectRowMax;\n\n return html`<div\n role=\"none\"\n class=\"dx-grid\"\n style=${styleMap({\n '--dx-viewport-inline-size': Number.isFinite(this.limitColumns) ? `${this.intrinsicInlineSize}px` : '1fr',\n '--dx-viewport-block-size': Number.isFinite(this.limitRows) ? `${this.intrinsicBlockSize}px` : '1fr',\n })}\n data-grid=${this.gridId}\n data-grid-mode=${this.mode}\n ?data-grid-select=${selectVisible}\n >\n <div role=\"none\" class=\"dx-grid__corner\"></div>\n <div role=\"none\" class=\"dx-grid__columnheader\">\n <div\n role=\"none\"\n class=\"dx-grid__columnheader__content\"\n style=\"transform:translate3d(${offsetInline}px,0,0);grid-template-columns:${this.templateColumns};\"\n >\n ${[...Array(visibleCols)].map((_, c0) => {\n const c = this.visColMin + c0;\n return html`<div\n role=\"columnheader\"\n ?inert=${c < 0}\n style=\"block-size:${this.rowDefault.size}px;grid-column:${c0 + 1}/${c0 + 2};\"\n >\n <span id=${localChId(c0)}>${colToA1Notation(c)}</span>\n ${(this.columns[c]?.resizeable ?? this.columnDefault.resizeable) &&\n html`<dx-grid-axis-resize-handle\n axis=\"col\"\n index=${c}\n size=${this.colSize(c)}\n ></dx-grid-axis-resize-handle>`}\n </div>`;\n })}\n </div>\n </div>\n <div role=\"none\" class=\"dx-grid__corner\"></div>\n <div role=\"none\" class=\"dx-grid__rowheader\">\n <div\n role=\"none\"\n class=\"dx-grid__rowheader__content\"\n style=\"transform:translate3d(0,${offsetBlock}px,0);grid-template-rows:${this.templateRows};\"\n >\n ${[...Array(visibleRows)].map((_, r0) => {\n const r = this.visRowMin + r0;\n return html`<div role=\"rowheader\" ?inert=${r < 0} style=\"grid-row:${r0 + 1}/${r0 + 2}\">\n <span id=${localRhId(r0)}>${rowToA1Notation(r)}</span>\n ${(this.rows[r]?.resizeable ?? this.rowDefault.resizeable) &&\n html`<dx-grid-axis-resize-handle\n axis=\"row\"\n index=${r}\n size=${this.rowSize(r)}\n ></dx-grid-axis-resize-handle>`}\n </div>`;\n })}\n </div>\n </div>\n <div role=\"grid\" class=\"dx-grid__viewport\" tabindex=\"0\" ${ref(this.viewportRef)}>\n <div\n role=\"none\"\n class=\"dx-grid__content\"\n style=\"transform:translate3d(${offsetInline}px,${offsetBlock}px,0);grid-template-columns:${this\n .templateColumns};grid-template-rows:${this.templateRows};\"\n >\n ${[...Array(visibleCols)].map((_, c0) => {\n return [...Array(visibleRows)].map((_, r0) => {\n const c = c0 + this.visColMin;\n const r = r0 + this.visRowMin;\n const cell = this.cell(c, r);\n const active = this.focusActive && this.focusedCell.col === c && this.focusedCell.row === r;\n const selected = c >= selectColMin && c <= selectColMax && r >= selectRowMin && r <= selectRowMax;\n return html`<div\n role=\"gridcell\"\n tabindex=\"0\"\n ?inert=${c < 0 || r < 0}\n ?aria-selected=${selected}\n class=${cell || active\n ? (cell?.className ? cell.className + ' ' : '') + (active ? 'dx-grid__cell--active' : '')\n : nothing}\n aria-rowindex=${r}\n aria-colindex=${c}\n data-dx-grid-action=\"cell\"\n style=\"grid-column:${c0 + 1};grid-row:${r0 + 1}\"\n >\n ${cell?.value}\n </div>`;\n });\n })}\n </div>\n </div>\n <div role=\"none\" class=\"dx-grid__scrollbar\" aria-orientation=\"vertical\">\n <div role=\"none\" class=\"dx-grid__scrollbar__thumb\"></div>\n </div>\n <div role=\"none\" class=\"dx-grid__corner\"></div>\n <div role=\"none\" class=\"dx-grid__scrollbar\" aria-orientation=\"horizontal\">\n <div role=\"none\" class=\"dx-grid__scrollbar__thumb\"></div>\n </div>\n <div role=\"none\" class=\"dx-grid__corner\"></div>\n </div>`;\n }\n\n private updateIntrinsicInlineSize() {\n this.intrinsicInlineSize = Number.isFinite(this.limitColumns)\n ? [...Array(this.limitColumns)].reduce((acc, _, c0) => acc + this.colSize(c0), 0) + gap * (this.limitColumns - 1)\n : Infinity;\n }\n\n private updateIntrinsicBlockSize() {\n this.intrinsicBlockSize = Number.isFinite(this.limitRows)\n ? [...Array(this.limitRows)].reduce((acc, _, r0) => acc + this.rowSize(r0), 0) + gap * (this.limitRows - 1)\n : Infinity;\n }\n\n private updateIntrinsicSizes() {\n this.updateIntrinsicInlineSize();\n this.updateIntrinsicBlockSize();\n }\n\n override firstUpdated() {\n if (this.getCells) {\n this.cells = this.getCells({\n start: { col: this.visColMin, row: this.visRowMin },\n end: { col: this.visColMax, row: this.visRowMax },\n });\n }\n this.observer.observe(this.viewportRef.value!);\n this.colSizes = Object.entries(this.columns).reduce((acc: Record<string, number>, [colId, colMeta]) => {\n if (colMeta?.size) {\n acc[colId] = colMeta.size;\n }\n return acc;\n }, {});\n this.rowSizes = Object.entries(this.rows).reduce((acc: Record<string, number>, [rowId, rowMeta]) => {\n if (rowMeta?.size) {\n acc[rowId] = rowMeta.size;\n }\n return acc;\n }, {});\n this.updateIntrinsicSizes();\n }\n\n override willUpdate(changedProperties: Map<string, any>) {\n if (\n this.getCells &&\n (changedProperties.has('initialCells') ||\n changedProperties.has('visColMin') ||\n changedProperties.has('visColMax') ||\n changedProperties.has('visRowMin') ||\n changedProperties.has('visRowMax'))\n ) {\n this.cells = this.getCells({\n start: { col: this.visColMin, row: this.visRowMin },\n end: { col: this.visColMax, row: this.visRowMax },\n });\n }\n }\n\n override updated(changedProperties: Map<string, any>) {\n // Update the focused element if there is a change in bounds (otherwise Lit keeps focus on the relative element).\n if (\n this.focusActive &&\n (changedProperties.has('visRowMin') || changedProperties.has('visColMin') || changedProperties.has('focusedCell'))\n ) {\n this.refocus();\n }\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n // console.log('[disconnected]', this.viewportRef.value);\n // TODO(thure): Will this even work?\n if (this.viewportRef.value) {\n this.observer.unobserve(this.viewportRef.value);\n }\n }\n\n override createRenderRoot() {\n return this;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { draggable } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { disableNativeDragPreview } from '@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview';\nimport { preventUnhandled } from '@atlaskit/pragmatic-drag-and-drop/prevent-unhandled';\nimport { type CleanupFn, type DragLocationHistory } from '@atlaskit/pragmatic-drag-and-drop/types';\nimport { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { ref } from 'lit/directives/ref.js';\n\nimport { DxAxisResizeInternal, type DxGridAxis } from './types';\n\n@customElement('dx-grid-axis-resize-handle')\nexport class DxGridAxisResizeHandle extends LitElement {\n @property({ type: String })\n axis: DxGridAxis = 'row';\n\n @property({ type: String })\n index: string = '-1';\n\n @property({ type: Number })\n size: number = 128;\n\n private dragStartSize: number = 128;\n\n override render() {\n return html`<button class=\"dx-grid__resize-handle\" ${ref(this.mount)}>\n <span class=\"sr-only\">Resize</span>\n </button>`;\n }\n\n private cleanup: CleanupFn | null = null;\n\n private dispatchResize(location: DragLocationHistory, state: 'dragging' | 'dropped') {\n const client = this.axis === 'row' ? 'clientY' : 'clientX';\n const event = new DxAxisResizeInternal({\n axis: this.axis,\n size: this.dragStartSize,\n index: this.index,\n delta: location.current.input[client] - location.initial.input[client],\n state,\n });\n this.dispatchEvent(event);\n }\n\n private mount(element?: Element) {\n this.cleanup?.();\n const host = this;\n if (element) {\n this.cleanup = draggable({\n element: element as HTMLButtonElement,\n onGenerateDragPreview: ({ nativeSetDragImage }) => {\n // we will be moving the line to indicate a drag\n // we can disable the native drag preview\n disableNativeDragPreview({ nativeSetDragImage });\n // we don't want any native drop animation for when the user\n // does not drop on a drop target. we want the drag to finish immediately\n preventUnhandled.start();\n },\n onDragStart() {\n host.dragStartSize = host.size;\n },\n onDrag({ location }) {\n host.dispatchResize(location, 'dragging');\n },\n onDrop({ location }) {\n host.dispatchResize(location, 'dropped');\n },\n });\n }\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.cleanup?.();\n }\n\n override createRenderRoot() {\n return this;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type CellIndex, type DxGridPosition } from './types';\n\n/**\n * Separator for serializing cell position vectors\n */\nexport const separator = ',';\n\nexport const toCellIndex = (cellCoords: DxGridPosition): CellIndex => `${cellCoords.col}${separator}${cellCoords.row}`;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type DxGrid } from './dx-grid';\nimport { toCellIndex } from './util';\n\nexport type CellIndex = `${string},${string}`;\n\nexport type DxGridAxis = 'row' | 'col';\n\nexport type DxGridPosition = Record<DxGridAxis, number>;\nexport type DxGridPositionNullable = DxGridPosition | null;\n\nexport type DxGridCells = Record<CellIndex, CellValue>;\n\nexport type DxGridAxisMeta = Record<string, AxisMeta>;\n\nexport type DxGridPointer = null | ({ state: 'resizing'; page: number } & DxAxisResizeProps) | { state: 'selecting' };\n\nexport type DxAxisResizeProps = Pick<DxAxisResize, 'axis' | 'index' | 'size'>;\nexport type DxAxisResizeInternalProps = DxAxisResizeProps & { delta: number; state: 'dragging' | 'dropped' };\n\nexport type DxGridMode = 'browse' | 'edit';\n\nexport type CellValue = {\n /**\n * The content value\n */\n value: string;\n /**\n * If this is a merged cell, the bottomright-most of the range in numeric notation, otherwise undefined.\n */\n end?: string;\n /**\n * `class` attribute value to apply to the gridcell element\n */\n className?: string;\n};\n\nexport type AxisMeta = {\n size: number;\n description?: string;\n resizeable?: boolean;\n};\n\nexport type DxGridProps = Partial<\n Pick<DxGrid, 'initialCells' | 'rows' | 'columns' | 'rowDefault' | 'columnDefault' | 'limitRows' | 'limitColumns'>\n>;\n\nexport class DxAxisResize extends Event {\n public readonly axis: DxGridAxis;\n public readonly index: string;\n public readonly size: number;\n constructor(props: DxAxisResizeProps) {\n super('dx-axis-resize');\n this.axis = props.axis;\n this.index = props.index;\n this.size = props.size;\n }\n}\n\nexport class DxAxisResizeInternal extends Event {\n public readonly axis: DxGridAxis;\n public readonly index: string;\n public readonly size: number;\n public readonly delta: number;\n public readonly state: 'dragging' | 'dropped';\n constructor(props: DxAxisResizeInternalProps) {\n super('dx-axis-resize-internal', { composed: true, bubbles: true });\n this.axis = props.axis;\n this.index = props.index;\n this.size = props.size;\n this.delta = props.delta;\n this.state = props.state;\n }\n}\n\nexport type DxEditRequestProps = Pick<DxEditRequest, 'cellIndex' | 'cellBox' | 'initialContent'>;\n\nexport class DxEditRequest extends Event {\n public readonly cellIndex: CellIndex;\n public readonly cellBox: Record<'insetInlineStart' | 'insetBlockStart' | 'inlineSize' | 'blockSize', number>;\n public readonly initialContent?: string;\n constructor(props: DxEditRequestProps) {\n super('dx-edit-request');\n this.cellIndex = props.cellIndex;\n this.cellBox = props.cellBox;\n this.initialContent = props.initialContent;\n }\n}\n\nexport type DxGridRange = { start: DxGridPosition; end: DxGridPosition };\n\nexport class DxGridCellsSelect extends Event {\n public readonly start: string;\n public readonly end: string;\n public readonly minCol: number;\n public readonly maxCol: number;\n public readonly minRow: number;\n public readonly maxRow: number;\n constructor({ start, end }: DxGridRange) {\n super('dx-grid-cells-select');\n this.start = toCellIndex(start);\n this.end = toCellIndex(end);\n this.minCol = Math.min(start.col, end.col);\n this.maxCol = Math.max(start.col, end.col);\n this.minRow = Math.min(start.row, end.row);\n this.maxRow = Math.max(start.row, end.row);\n }\n}\n"],
5
+ "mappings": ";AAIA,SAASA,cAAAA,aAAYC,QAAAA,OAAMC,eAAe;AAC1C,SAASC,iBAAAA,gBAAeC,OAAOC,YAAAA,WAAUC,oBAAoB;AAC7D,SAASC,OAAAA,MAAKC,iBAA2B;AACzC,SAASC,gBAAgB;;;ACHzB,SAASC,iBAAiB;AAC1B,SAASC,gCAAgC;AACzC,SAASC,wBAAwB;AAEjC,SAASC,MAAMC,kBAAkB;AACjC,SAASC,eAAeC,gBAAgB;AACxC,SAASC,WAAW;;;ACDb,IAAMC,YAAY;AAElB,IAAMC,cAAc,CAACC,eAA0C,GAAGA,WAAWC,GAAG,GAAGH,SAAAA,GAAYE,WAAWE,GAAG;;;ACuC7G,IAAMC,eAAN,cAA2BC,MAAAA;EAIhCC,YAAYC,OAA0B;AACpC,UAAM,gBAAA;AACN,SAAKC,OAAOD,MAAMC;AAClB,SAAKC,QAAQF,MAAME;AACnB,SAAKC,OAAOH,MAAMG;EACpB;AACF;AAEO,IAAMC,uBAAN,cAAmCN,MAAAA;EAMxCC,YAAYC,OAAkC;AAC5C,UAAM,2BAA2B;MAAEK,UAAU;MAAMC,SAAS;IAAK,CAAA;AACjE,SAAKL,OAAOD,MAAMC;AAClB,SAAKC,QAAQF,MAAME;AACnB,SAAKC,OAAOH,MAAMG;AAClB,SAAKI,QAAQP,MAAMO;AACnB,SAAKC,QAAQR,MAAMQ;EACrB;AACF;AAIO,IAAMC,gBAAN,cAA4BX,MAAAA;EAIjCC,YAAYC,OAA2B;AACrC,UAAM,iBAAA;AACN,SAAKU,YAAYV,MAAMU;AACvB,SAAKC,UAAUX,MAAMW;AACrB,SAAKC,iBAAiBZ,MAAMY;EAC9B;AACF;AAIO,IAAMC,oBAAN,cAAgCf,MAAAA;EAOrCC,YAAY,EAAEe,OAAOC,IAAG,GAAiB;AACvC,UAAM,sBAAA;AACN,SAAKD,QAAQE,YAAYF,KAAAA;AACzB,SAAKC,MAAMC,YAAYD,GAAAA;AACvB,SAAKE,SAASC,KAAKC,IAAIL,MAAMM,KAAKL,IAAIK,GAAG;AACzC,SAAKC,SAASH,KAAKI,IAAIR,MAAMM,KAAKL,IAAIK,GAAG;AACzC,SAAKG,SAASL,KAAKC,IAAIL,MAAMU,KAAKT,IAAIS,GAAG;AACzC,SAAKC,SAASP,KAAKI,IAAIR,MAAMU,KAAKT,IAAIS,GAAG;EAC3C;AACF;;;;;;;;;AF/FO,IAAME,yBAAN,cAAqCC,WAAAA;EAArC;;AAELC,gBAAmB;AAGnBC,iBAAgB;AAGhBC,gBAAe;AAEPC,yBAAwB;AAQxBC,mBAA4B;;EAN3BC,SAAS;AAChB,WAAOC,8CAA8CC,IAAI,KAAKC,KAAK,CAAA;;;EAGrE;EAIQC,eAAeC,UAA+BC,QAA+B;AACnF,UAAMC,SAAS,KAAKZ,SAAS,QAAQ,YAAY;AACjD,UAAMa,QAAQ,IAAIC,qBAAqB;MACrCd,MAAM,KAAKA;MACXE,MAAM,KAAKC;MACXF,OAAO,KAAKA;MACZc,OAAOL,SAASM,QAAQC,MAAML,MAAAA,IAAUF,SAASQ,QAAQD,MAAML,MAAAA;MAC/DD,OAAAA;IACF,CAAA;AACA,SAAKQ,cAAcN,KAAAA;EACrB;EAEQL,MAAMY,SAAmB;AAC/B,SAAKhB,UAAO;AACZ,UAAMiB,OAAO;AACb,QAAID,SAAS;AACX,WAAKhB,UAAUkB,UAAU;QACvBF;QACAG,uBAAuB,CAAC,EAAEC,mBAAkB,MAAE;AAG5CC,mCAAyB;YAAED;UAAmB,CAAA;AAG9CE,2BAAiBC,MAAK;QACxB;QACAC,cAAAA;AACEP,eAAKlB,gBAAgBkB,KAAKnB;QAC5B;QACA2B,OAAO,EAAEnB,SAAQ,GAAE;AACjBW,eAAKZ,eAAeC,UAAU,UAAA;QAChC;QACAoB,OAAO,EAAEpB,SAAQ,GAAE;AACjBW,eAAKZ,eAAeC,UAAU,SAAA;QAChC;MACF,CAAA;IACF;EACF;EAESqB,uBAAuB;AAC9B,UAAMA,qBAAAA;AACN,SAAK3B,UAAO;EACd;EAES4B,mBAAmB;AAC1B,WAAO;EACT;AACF;;EAlEGC,SAAS;IAAEC,MAAMC;EAAO,CAAA;GADdrC,uBAAAA,WAAAA,QAAAA,MAAAA;;EAIVmC,SAAS;IAAEC,MAAMC;EAAO,CAAA;GAJdrC,uBAAAA,WAAAA,SAAAA,MAAAA;;EAOVmC,SAAS;IAAEC,MAAME;EAAO,CAAA;GAPdtC,uBAAAA,WAAAA,QAAAA,MAAAA;AAAAA,yBAAAA,aAAAA;EADZuC,cAAc,4BAAA;GACFvC,sBAAAA;;;;;;;;;ADiBb,IAAMwC,MAAM;AAKZ,IAAMC,kBAAkB;AAKxB,IAAMC,cAAc;AACpB,IAAMC,cAAc;AAKpB,IAAMC,aAAa;AACnB,IAAMC,aAAa;AACnB,IAAMC,aAAa;AACnB,IAAMC,aAAa;AAMnB,IAAMC,kBAAkB,CAACC,QAAAA;AACvB,UACGA,OAAO,KAAKC,OAAOC,aAAa,IAAIC,WAAW,CAAA,IAAKC,KAAKC,MAAML,MAAM,EAAA,IAAM,CAAA,IAAK,MACjFC,OAAOC,aAAa,IAAIC,WAAW,CAAA,IAAMH,MAAM,EAAA;AAEnD;AAEA,IAAMM,kBAAkB,CAACC,QAAAA;AACvB,SAAO,GAAGA,MAAM,CAAA;AAClB;AAEA,IAAMC,gBAAgB,CAACC,WAAAA;AACrB,QAAMC,WAAgCD,QAA+BE,QAAQ,uBAAA,KAA4B;AACzG,SAAO;IAAED;IAAUE,QAAQF,UAAUG,aAAa,qBAAA,KAA0B;EAAK;AACnF;AAEA,IAAMC,cAAc,CAACL,QAA4BC,aAAAA;AAC/C,MAAIK,cAAcL;AAClB,MAAI,CAACK,aAAa;AAChB,UAAM,EAAEH,QAAQF,UAAAA,UAAQ,IAAKF,cAAcC,MAAAA;AAC3C,QAAIG,WAAW,QAAQ;AACrBG,oBAAcL;IAChB;EACF;AACA,MAAIK,aAAa;AACf,UAAMf,MAAMgB,SAASD,YAAYF,aAAa,eAAA,KAAoB,OAAA;AAClE,UAAMN,MAAMS,SAASD,YAAYF,aAAa,eAAA,KAAoB,OAAA;AAClE,WAAO;MAAEb;MAAKO;IAAI;EACpB,OAAO;AACL,WAAO;EACT;AACF;AAEA,IAAMU,aAAa,CAACC,GAA2BC,MAC7CD,KAAKC,KAAKC,OAAOC,SAASH,EAAElB,GAAG,KAAKoB,OAAOC,SAASH,EAAEX,GAAG,KAAKW,EAAElB,QAAQmB,EAAEnB,OAAOkB,EAAEX,QAAQY,EAAEZ;AAE/F,IAAMe,YAAY,CAACC,OAAe,OAAOA,EAAAA;AACzC,IAAMC,YAAY,CAACC,OAAe,OAAOA,EAAAA;AAEzC,IAAMC,UAAU,CAACC,MAAcC,UAAyBD,SAAS,QAAQC,MAAMC,QAAQD,MAAME;AAGtF,IAAMC,SAAN,cAAqBC,YAAAA;EAC1BC,cAAc;AACZ,UAAK;AAaPC,kBAAiB;AAGjBC,sBAAuB;MAAEC,MAAM;IAAG;AAGlCC,yBAA0B;MAAED,MAAM;IAAI;AAGtCE,gBAAuB,CAAC;AAGxBC,mBAA0B,CAAC;AAG3BC,wBAA4B,CAAC;AAG7BC,gBAAmB;AAGnBC,wBAAuBC;AAGvBC,qBAAoBD;AAMpBE;;;;oBAA6D;AAGrDC,iBAAqB,CAAC;AAOtBC;;;qBAAY;AAGZC,oBAAW;AAOXC;;;sBAAa;AAGbC,qBAAY;AAOZC;;;0BAAiB;AAGjBC,yBAAgB;AAOhBC;;;wBAAe;AAGfC,wBAAe,KAAKC,QAAQ,CAAA;AAG5BC,uBAAc;AAGdC,uBAAc,KAAKC,QAAQ,CAAA;AAQ3BC;;;;qBAAY;AAGZC,qBAAY;AAGZC,qBAAY;AAGZC,qBAAY;AAMZC;;;2BAAkB,GAAG,KAAKR,QAAQ,CAAA,CAAA;AAGlCS,wBAAe,GAAG,KAAKN,QAAQ,CAAA,CAAA;AAO/BO;;;mBAAyB;AAGzBC,oBAAmC,CAAC;AAGpCC,oBAAmC,CAAC;AAGpCC,uBAAuB;AAGvBC,uBAA8B;MAAErE,KAAK;MAAGO,KAAK;IAAE;AAG/C+D,0BAAiC;MAAEtE,KAAK;MAAGO,KAAK;IAAE;AAGlDgE,wBAA+B;MAAEvE,KAAK;MAAGO,KAAK;IAAE;AAOhDiE;;;+BAA8B7B;AAG9B8B,8BAA6B9B;AAoB7B+B,6BAAoB,CAAC9C,UAAAA;AAC3B,UAAIA,MAAM+C,WAAW;AACnB,cAAM,EAAE/D,QAAQF,SAAQ,IAAKF,cAAcoB,MAAMnB,MAAM;AACvD,YAAIG,QAAQ;AACV,cAAIA,OAAOgE,WAAW,QAAA,KAAa,KAAKnC,SAAS,UAAU;AACzD,kBAAM,CAACoC,QAAQC,KAAAA,IAASlE,OAAOmE,MAAM,GAAA;AACrC,kBAAM,CAACC,GAAGrD,IAAAA,IAAQkD,OAAOE,MAAM,GAAA;AAC/B,iBAAKd,UAAU;cACbgB,OAAO;cACPtD;cACAS,MAAMT,SAAS,QAAQ,KAAK4B,QAAQuB,KAAAA,IAAS,KAAKpB,QAAQoB,KAAAA;cAC1DI,MAAMxD,QAAQC,MAAMC,KAAAA;cACpBkD;YACF;UACF,WAAWlE,WAAW,QAAQ;AAC5B,kBAAMuE,aAAarE,YAAYc,MAAMnB,QAAQC,QAAAA;AAC7C,gBAAIyE,YAAY;AACd,mBAAKlB,UAAU;gBAAEgB,OAAO;cAAY;AACpC,mBAAKX,iBAAiBa;YACxB;AACA,gBAAI,KAAK1C,SAAS,QAAQ;AACxBb,oBAAMwD,eAAc;YACtB,OAAO;AACL,kBAAI,KAAKhB,eAAenD,WAAW,KAAKoD,aAAac,UAAAA,GAAa;AAChE,qBAAKE,oBAAmB;cAC1B;YACF;UACF;QACF;MACF;IACF;AAEQC,2BAAkB,CAAC1D,UAAAA;AACzB,UAAI,KAAKqC,SAASgB,UAAU,YAAY;MAExC,OAAO;AACL,cAAMM,OAAOzE,YAAYc,MAAMnB,MAAM;AACrC,YAAI8E,MAAM;AACR,eAAKhB,eAAegB;AACpB,eAAKC,cACH,IAAIC,kBAAkB;YACpBC,OAAO,KAAKpB;YACZqB,KAAK,KAAKpB;UACZ,CAAA,CAAA;QAEJ;MACF;AACA,WAAKN,UAAU;IACjB;AAEQ2B,6BAAoB,CAAChE,UAAAA;AAC3B,UAAI,KAAKqC,SAASgB,UAAU,aAAa;AACvC,cAAMM,OAAOzE,YAAYc,MAAMnB,MAAM;AACrC,YAAI8E,SAASA,KAAKvF,QAAQ,KAAKuE,aAAavE,OAAOuF,KAAKhF,QAAQ,KAAKgE,aAAahE,MAAM;AACtF,eAAKgE,eAAegB;QACtB;MACF;IACF;AAoFQM;;;oBAAW,IAAIC,eAAe,CAACC,YAAAA;AACrC,YAAM,EAAEC,YAAYC,UAAS,IAAKF,UAAU,CAAA,GAAIG,iBAAiB,CAAA,KAAM;QACrEF,YAAY;QACZC,WAAW;MACb;AACA,UACE7F,KAAK+F,IAAIH,aAAa,KAAK/C,UAAU,IAAIzD,mBACzCY,KAAK+F,IAAIF,YAAY,KAAK/C,SAAS,IAAI1D,iBACvC;AAEA,aAAKyD,aAAa+C;AAClB,aAAK9C,YAAY+C;AACjB,aAAKG,UAAS;AACdC,uBAAe,MAAM,KAAKC,UAAS,CAAA;MACrC;IACF,CAAA;AAEQC,uBAAmCC,UAAAA;AAEnCC,0BAAiB,MAAA;AACvB,UACE,KAAK1D,aAAa,KAAKM,gBACvB,KAAKN,YAAY,KAAKO,gBACtB,KAAKN,YAAY,KAAKQ,eACtB,KAAKR,WAAW,KAAKS,aACrB;MAEF,OAAO;AAOL,aAAK2C,UAAS;MAChB;IACF;AAQQM,uBAAc,CAAC,EAAEC,QAAQC,OAAM,MAAyC;AAC9E,UAAI,KAAKnE,SAAS,UAAU;AAC1B,aAAK6D,UAAU,KAAKvD,YAAY4D,QAAQ,KAAK3D,WAAW4D,MAAAA;MAC1D;IACF;AAzWE,SAAKC,iBAAiB,2BAA2B,KAAKC,wBAAwB;AAC9E,SAAKD,iBAAiB,SAAS,KAAKH,aAAa;MAAEK,SAAS;IAAK,CAAA;AACjE,SAAKF,iBAAiB,eAAe,KAAKnC,iBAAiB;AAC3D,SAAKmC,iBAAiB,eAAe,KAAKjB,iBAAiB;AAC3D,SAAKiB,iBAAiB,aAAa,KAAKvB,eAAe;AACvD,SAAKuB,iBAAiB,gBAAgB,KAAKvB,eAAe;AAC1D,SAAKuB,iBAAiB,SAAS,KAAKG,aAAa;MAAEC,SAAS;IAAK,CAAA;AACjE,SAAKJ,iBAAiB,QAAQ,KAAKK,YAAY;MAAED,SAAS;IAAK,CAAA;AAC/D,SAAKJ,iBAAiB,WAAW,KAAKM,aAAa;EACrD;;;;EAqJQ9B,oBAAoB+B,gBAAyB;AACnD,SAAKC,qBAAoB;AAEzBhB,mBAAe,MACb,KAAKb,cACH,IAAI8B,cAAc;MAChBC,WAAWC,YAAY,KAAKnD,WAAW;MACvCoD,SAAS,KAAKC,eAAc;MAC5BN;IACF,CAAA,CAAA,CAAA;EAGN;EA6DQD,cAAcvF,OAAsB;AAC1C,QAAI,KAAKwC,eAAe,KAAK3B,SAAS,UAAU;AAE9C,cAAQb,MAAM+F,KAAG;QACf,KAAK;AACH,eAAKtD,cAAc;YAAE,GAAG,KAAKA;YAAa9D,KAAKH,KAAKwH,IAAI,KAAKhF,YAAY,GAAG,KAAKyB,YAAY9D,MAAM,CAAA;UAAG;AACtG;QACF,KAAK;AACH,eAAK8D,cAAc;YAAE,GAAG,KAAKA;YAAa9D,KAAKH,KAAKyH,IAAI,GAAG,KAAKxD,YAAY9D,MAAM,CAAA;UAAG;AACrF;QACF,KAAK;AACH,eAAK8D,cAAc;YAAE,GAAG,KAAKA;YAAarE,KAAKI,KAAKwH,IAAI,KAAKlF,eAAe,GAAG,KAAK2B,YAAYrE,MAAM,CAAA;UAAG;AACzG;QACF,KAAK;AACH,eAAKqE,cAAc;YAAE,GAAG,KAAKA;YAAarE,KAAKI,KAAKyH,IAAI,GAAG,KAAKxD,YAAYrE,MAAM,CAAA;UAAG;AACrF;MACJ;AAEA,cAAQ4B,MAAM+F,KAAG;QACf,KAAK;AACH,eAAKtC,oBAAmB;AACxB;QACF;AACE,cAAIzD,MAAM+F,IAAIG,WAAW,KAAKlG,MAAM+F,IAAII,MAAM,SAAA,GAAY;AACxD,iBAAK1C,oBAAoBzD,MAAM+F,GAAG;UACpC;AACA;MACJ;AAEA,cAAQ/F,MAAM+F,KAAG;QACf,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;AACH/F,gBAAMwD,eAAc;AACpB,eAAKiC,qBAAoB;AACzB;MACJ;IACF;EACF;;;;EAMQ9D,QAAQyE,GAAoB;AAClC,WAAO,KAAK9D,WAAW8D,CAAAA,KAAM,KAAK3F,cAAcD;EAClD;EAEQsB,QAAQuE,GAAoB;AAClC,WAAO,KAAK9D,WAAW8D,CAAAA,KAAM,KAAK9F,WAAWC;EAC/C;EAEQmD,KAAKyC,GAAoBC,GAAoB;AACnD,UAAMnD,QAAmB,GAAGkD,CAAAA,GAAIE,SAAAA,GAAYD,CAAAA;AAC5C,WAAO,KAAKnF,MAAMgC,KAAAA,KAAU,KAAKtC,aAAasC,KAAAA;EAChD;EAEQ4C,iBAA2C;AACjD,UAAM3G,cAAc,KAAKoH,mBAAkB;AAC3C,UAAMC,WAAW;MAAEpC,YAAY,KAAKzC,QAAQ,KAAKc,YAAYrE,GAAG;MAAGiG,WAAW,KAAKvC,QAAQ,KAAKW,YAAY9D,GAAG;IAAE;AACjH,QAAI,CAACQ,aAAa;AAChB,aAAO;QAAEsH,kBAAkBC;QAAKC,iBAAiBD;QAAK,GAAGF;MAAS;IACpE;AACA,UAAMI,iBAAiBzH,YAAY0H;AAEnC,UAAM,CAACC,cAAcC,WAAWC,QAAAA,IAAYJ,eAAeK,MAAMC,UAAU/D,MAAM,cAAA;AACjF,UAAMgE,sBAAsBC,WAAWL,SAAAA;AACvC,UAAMM,qBAAqBD,WAAWJ,QAAAA;AACtC,UAAMH,eAAeD,eAAeC;AACpC,WAAO;MACLJ,kBAAkBtH,YAAYmI,aAAaH,sBAAsBN,aAAaS;MAC9EX,iBAAiBxH,YAAYoI,YAAYF,qBAAqBR,aAAaU;MAC3E,GAAGf;IACL;EACF;EA6CQ9B,UAAU8C,QAAiBC,OAAgB;AACjD,SAAKtG,YAAY3C,KAAKyH,IAAI,GAAGzH,KAAKwH,IAAI,KAAKpD,sBAAsB,KAAKvB,YAAYmG,UAAU,KAAKrG,SAAS,CAAA;AAC1G,SAAKC,WAAW5C,KAAKyH,IAAI,GAAGzH,KAAKwH,IAAI,KAAKnD,qBAAqB,KAAKvB,WAAWmG,SAAS,KAAKrG,QAAQ,CAAA;AACrG,SAAKyD,eAAc;EACrB;EAQQ6C,kBAAkB;AAExB,QAAIC,WAAW;AACf,QAAIC,WAAW,KAAKjG,QAAQgG,QAAAA;AAE5B,WAAOC,WAAW,KAAKzG,WAAW;AAChCwG,kBAAY;AACZC,kBAAY,KAAKjG,QAAQgG,QAAAA,IAAYhK;IACvC;AAEA,SAAKoE,YAAY4F,WAAW9J;AAE5B,SAAK4D,eAAemG,WAAW,KAAKjG,QAAQgG,QAAAA,IAAYhK;AACxD,SAAK+D,eAAekG,WAAWjK;AAE/B,SAAK4D,iBACH;SAAIsG,MAAMhK,WAAAA;MAAciK,OAAO,CAACC,KAAK3E,GAAGzD,OAAAA;AACtCoI,aAAO,KAAKpG,QAAQ,KAAKI,YAAYpC,EAAAA;AACrC,aAAOoI;IACT,GAAG,CAAA,IACHpK,OAAOE,cAAc;AAEvB,WAAO+J,WAAW,KAAKlG,eAAe,KAAKL,aAAa1D,KAAK;AAC3DgK,kBAAY;AACZC,kBAAY,KAAKjG,QAAQgG,QAAAA,IAAYhK;IACvC;AAEA,SAAKqE,YAAYxD,KAAKwH,IAAI,KAAKlF,cAAc6G,WAAW9J,WAAAA;AAExD,SAAKsE,kBAAkB;SAAI0F,MAAM,KAAK7F,YAAY,KAAKD,SAAS;MAC7DiG,IAAI,CAAC5E,GAAGzD,OAAO,GAAG,KAAKgC,QAAQ,KAAKI,YAAYpC,EAAAA,CAAAA,IAAO,EACvDsI,KAAK,GAAA;EACV;EAEQC,iBAAiB;AAEvB,QAAIC,WAAW;AACf,QAAIC,UAAU,KAAKtG,QAAQqG,QAAAA;AAE3B,WAAOC,UAAU,KAAKhH,UAAU;AAC9B+G,kBAAY;AACZC,iBAAW,KAAKtG,QAAQqG,QAAAA,IAAYxK;IACtC;AAEA,SAAKsE,YAAYkG,WAAWrK;AAE5B,SAAK8D,cAAcwG,UAAU,KAAKtG,QAAQqG,QAAAA,IAAYxK;AACtD,SAAKkE,cAAcuG,UAAUzK;AAE7B,SAAK6D,gBACH;SAAIqG,MAAM/J,WAAAA;MAAcgK,OAAO,CAACC,KAAK3E,GAAGvD,OAAAA;AACtCkI,aAAO,KAAKjG,QAAQ,KAAKG,YAAYpC,EAAAA;AACrC,aAAOkI;IACT,GAAG,CAAA,IACHpK,OAAOG,cAAc;AAEvB,WAAOsK,UAAU,KAAKvG,cAAc,KAAKP,WAAW;AAClD6G,kBAAY;AACZC,iBAAW,KAAKtG,QAAQqG,QAAAA,IAAYxK;IACtC;AAEA,SAAKuE,YAAY1D,KAAKwH,IAAI,KAAKhF,WAAWmH,WAAWrK,WAAAA;AAErD,SAAKsE,eAAe;SAAIyF,MAAM,KAAK3F,YAAY,KAAKD,SAAS;MAC1D+F,IAAI,CAAC5E,GAAGvD,OAAO,GAAG,KAAKiC,QAAQ,KAAKG,YAAYpC,EAAAA,CAAAA,IAAO,EACvDoI,KAAK,GAAA;EACV;EAEQzD,YAAY;AAClB,SAAKkD,gBAAe;AACpB,SAAKQ,eAAc;EACrB;;EAKQ9C,YAAYpF,OAAmB;AACrC,UAAMuD,aAAarE,YAAYc,MAAMnB,MAAM;AAC3C,QAAI0E,YAAY;AACd,WAAKd,cAAcc;AACnB,WAAKf,cAAc;IACrB;EACF;EAGQ8C,WAAWtF,OAAmB;AAEpC,QAAI,CAACA,MAAMqI,iBAAiB,CAAErI,MAAMqI,cAA8BtJ,QAAQ,eAAe,KAAKuB,MAAM,IAAI,GAAG;AACzG,WAAKkC,cAAc;IACrB;EACF;EAEQ+D,qBAAqB;AAC3B,WAAO,KAAK5B,YAAY2D,OAAOC,cAC7B,mBAAmB,KAAK9F,YAAYrE,GAAG,qBAAqB,KAAKqE,YAAY9D,GAAG,IAAI;EAExF;;;;EAKA6J,QAAQC,WAA2BC,QAAgB,GAAG;AACpD,YAAQD,WAAAA;MACN,KAAK;AACH,aAAKhG,cAAc;UAAE,GAAG,KAAKA;UAAa9D,KAAK,KAAK8D,YAAY9D,MAAM+J;QAAM;AAC5E;MACF,KAAK;AACH,aAAKjG,cAAc;UAAE,GAAG,KAAKA;UAAarE,KAAK,KAAKqE,YAAYrE,MAAMsK;QAAM;IAChF;AACC,KAAA,KAAKjG,YAAY9D,MAAM,KAAKsD,aAC7B,KAAKQ,YAAY9D,MAAM,KAAKuD,aAC5B,KAAKO,YAAYrE,MAAM,KAAK2D,aAC5B,KAAKU,YAAYrE,MAAM,KAAK4D,YACxB,KAAK2C,YAAY2D,QACjB,KAAK/B,mBAAkB,IACxBoC,MAAM;MAAEC,eAAe;IAAK,CAAA;AAC/B,QAAIH,WAAW;AACb,WAAKhD,qBAAoB;IAC3B;EACF;;;;EAKAA,uBAAuB;AACrB,QACE,KAAKhD,YAAYrE,MAAM,KAAK2D,aAC5B,KAAKU,YAAYrE,MAAM,KAAK4D,aAC5B,KAAKS,YAAY9D,MAAM,KAAKsD,aAC5B,KAAKQ,YAAY9D,MAAM,KAAKuD,WAC5B;IAEF,WACE,KAAKO,YAAYrE,MAAM,KAAK2D,YAAYlE,eACxC,KAAK4E,YAAYrE,MAAM,KAAK4D,YAAYnE,cAAc,KACtD,KAAK4E,YAAY9D,MAAM,KAAKsD,YAAYnE,eACxC,KAAK2E,YAAY9D,MAAM,KAAKuD,YAAYpE,cAAc,GACtD;IAOF,OAAO;AACL,UAAI,KAAK2E,YAAYrE,OAAO,KAAK2D,YAAYlE,aAAa;AACxD,aAAKsD,YAAY,KAAKM,eAAe9D;AACrC,aAAK+J,gBAAe;MACtB,WAAW,KAAKjF,YAAYrE,OAAO,KAAK4D,YAAYnE,cAAc,GAAG;AACnE,cAAMgL,aAAa;aAAIhB,MAAM,KAAKpF,YAAYrE,MAAM,KAAK2D,SAAS;UAAG+F,OAAO,CAACC,KAAK3E,GAAGzD,OAAAA;AACnFoI,iBAAO,KAAKpG,QAAQ,KAAKI,YAAYlE,cAAc8B,EAAAA,IAAMhC;AACzD,iBAAOoK;QACT,GAAG,CAAA;AACH,aAAK5G,YAAY3C,KAAKyH,IACpB,GACAzH,KAAKwH,IACH,KAAKpD,sBAAsB,KAAKvB,YAChC,KAAKI,eAAeoH,aAAalL,MAAM,IAAI,KAAK0D,UAAU,CAAA;AAG9D,aAAKqG,gBAAe;MACtB;AAEA,UAAI,KAAKjF,YAAY9D,OAAO,KAAKsD,YAAYnE,aAAa;AACxD,aAAKsD,WAAW,KAAKQ,cAAcjE;AACnC,aAAKuK,eAAc;MACrB,WAAW,KAAKzF,YAAY9D,OAAO,KAAKuD,YAAYpE,cAAc,GAAG;AACnE,cAAMgL,aAAa;aAAIjB,MAAM,KAAKpF,YAAY9D,MAAM,KAAKsD,SAAS;UAAG6F,OAAO,CAACC,KAAK3E,GAAGvD,OAAAA;AACnFkI,iBAAO,KAAKjG,QAAQ,KAAKG,YAAYnE,cAAc+B,EAAAA,IAAMlC;AACzD,iBAAOoK;QACT,GAAG,CAAA;AACH,aAAK3G,WAAW5C,KAAKyH,IACnB,GACAzH,KAAKwH,IAAI,KAAKnD,qBAAqB,KAAKvB,WAAW,KAAKM,cAAckH,aAAanL,MAAM,IAAI,KAAK2D,SAAS,CAAA;AAE7G,aAAK4G,eAAc;MACrB;IACF;EACF;;;;EAMA,IAAaa,aAAa;AACxB,WAAO,KAAK5H;EACd;EAEA,IAAa4H,WAAWC,WAAmB;AACzC,SAAK7H,YAAY6H;AACjB,SAAKnE,eAAc;EACrB;EAEA,IAAaoE,YAAY;AACvB,WAAO,KAAK7H;EACd;EAEA,IAAa6H,UAAUD,WAAmB;AACxC,SAAK5H,WAAW4H;AAChB,SAAKnE,eAAc;EACrB;;;;EAKQK,yBAAyBlF,OAA6B;AAC5DA,UAAMkJ,gBAAe;AACrB,UAAM,EAAEnJ,MAAM2I,OAAOlI,MAAM0C,OAAOiG,KAAI,IAAKnJ;AAC3C,QAAID,SAAS,OAAO;AAClB,YAAMqJ,WAAW5K,KAAKyH,IAAIlI,YAAYS,KAAKwH,IAAIhI,YAAYwC,OAAOkI,KAAAA,CAAAA;AAClE,WAAKpG,WAAW;QAAE,GAAG,KAAKA;QAAU,CAACY,KAAAA,GAAQkG;MAAS;AACtD,WAAK1B,gBAAe;AACpB,WAAK2B,0BAAyB;IAChC,OAAO;AACL,YAAMD,WAAW5K,KAAKyH,IAAIhI,YAAYO,KAAKwH,IAAI9H,YAAYsC,OAAOkI,KAAAA,CAAAA;AAClE,WAAKnG,WAAW;QAAE,GAAG,KAAKA;QAAU,CAACW,KAAAA,GAAQkG;MAAS;AACtD,WAAKlB,eAAc;AACnB,WAAKoB,yBAAwB;IAC/B;AACA,QAAIH,SAAS,WAAW;AACtB,WAAKvF,cACH,IAAI2F,aAAa;QACfxJ;QACAmD;QACA1C,MAAM,KAAKT,SAAS,QAAQ,YAAY,SAAA,EAAWmD,KAAAA;MACrD,CAAA,CAAA;IAEJ;EACF;;;;EAMSsG,SAAS;AAChB,UAAMC,cAAc,KAAKzH,YAAY,KAAKD;AAC1C,UAAM2H,cAAc,KAAKxH,YAAY,KAAKD;AAC1C,UAAM0H,eAAe,KAAKlI,eAAe,KAAKN,YAAY,KAAKI;AAC/D,UAAMqI,cAAc,KAAKhI,cAAc,KAAKR,WAAW,KAAKI;AAE5D,UAAMqI,eAAerL,KAAKwH,IAAI,KAAKtD,eAAetE,KAAK,KAAKuE,aAAavE,GAAG;AAC5E,UAAM0L,eAAetL,KAAKyH,IAAI,KAAKvD,eAAetE,KAAK,KAAKuE,aAAavE,GAAG;AAC5E,UAAM2L,eAAevL,KAAKwH,IAAI,KAAKtD,eAAe/D,KAAK,KAAKgE,aAAahE,GAAG;AAC5E,UAAMqL,eAAexL,KAAKyH,IAAI,KAAKvD,eAAe/D,KAAK,KAAKgE,aAAahE,GAAG;AAC5E,UAAMsL,gBAAgBJ,iBAAiBC,gBAAgBC,iBAAiBC;AAExE,WAAOE;;;cAGGC,SAAS;MACf,6BAA6B3K,OAAOC,SAAS,KAAKqB,YAAY,IAAI,GAAG,KAAK8B,mBAAmB,OAAO;MACpG,4BAA4BpD,OAAOC,SAAS,KAAKuB,SAAS,IAAI,GAAG,KAAK6B,kBAAkB,OAAO;IACjG,CAAA,CAAA;kBACY,KAAKvC,MAAM;uBACN,KAAKO,IAAI;0BACNoJ,aAAAA;;;;;;;yCAOeN,YAAAA,iCAA6C,KAAKxH,eAAe;;YAE9F;SAAI0F,MAAM4B,WAAAA;MAAczB,IAAI,CAAC5E,GAAGzD,OAAAA;AAChC,YAAMyG,IAAI,KAAKrE,YAAYpC;AAC3B,aAAOuK;;uBAEI9D,IAAI,CAAA;kCACO,KAAK7F,WAAWC,IAAI,kBAAkBb,KAAK,CAAA,IAAKA,KAAK,CAAA;;yBAE9DD,UAAUC,EAAAA,CAAAA,IAAOxB,gBAAgBiI,CAAAA,CAAAA;iBACzC,KAAKzF,QAAQyF,CAAAA,GAAIgE,cAAc,KAAK3J,cAAc2J,eACrDF;;wBAEU9D,CAAAA;uBACD,KAAKzE,QAAQyE,CAAAA,CAAAA;6CACS;;IAEnC,CAAA,CAAA;;;;;;;;2CAQiCwD,WAAAA,4BAAuC,KAAKxH,YAAY;;YAEvF;SAAIyF,MAAM6B,WAAAA;MAAc1B,IAAI,CAAC5E,GAAGvD,OAAAA;AAChC,YAAMwG,IAAI,KAAKpE,YAAYpC;AAC3B,aAAOqK,qCAAoC7D,IAAI,CAAA,oBAAqBxG,KAAK,CAAA,IAAKA,KAAK,CAAA;yBACtED,UAAUC,EAAAA,CAAAA,IAAOnB,gBAAgB2H,CAAAA,CAAAA;iBACzC,KAAK3F,KAAK2F,CAAAA,GAAI+D,cAAc,KAAK7J,WAAW6J,eAC/CF;;wBAEU7D,CAAAA;uBACD,KAAKvE,QAAQuE,CAAAA,CAAAA;6CACS;;IAEnC,CAAA,CAAA;;;gEAGsDgE,KAAI,KAAK1F,WAAW,CAAA;;;;yCAI3CgF,YAAAA,MAAkBC,WAAAA,+BAA0C,KACxFzH,eAAe,uBAAuB,KAAKC,YAAY;;YAExD;SAAIyF,MAAM4B,WAAAA;MAAczB,IAAI,CAAC5E,GAAGzD,OAAAA;AAChC,aAAO;WAAIkI,MAAM6B,WAAAA;QAAc1B,IAAI,CAAC5E,IAAGvD,OAAAA;AACrC,cAAMuG,IAAIzG,KAAK,KAAKoC;AACpB,cAAMsE,IAAIxG,KAAK,KAAKoC;AACpB,cAAM0B,OAAO,KAAKA,KAAKyC,GAAGC,CAAAA;AAC1B,cAAMiE,SAAS,KAAK9H,eAAe,KAAKC,YAAYrE,QAAQgI,KAAK,KAAK3D,YAAY9D,QAAQ0H;AAC1F,cAAMkE,WAAWnE,KAAKyD,gBAAgBzD,KAAK0D,gBAAgBzD,KAAK0D,gBAAgB1D,KAAK2D;AACrF,eAAOE;;;yBAGI9D,IAAI,KAAKC,IAAI,CAAA;iCACLkE,QAAAA;wBACT5G,QAAQ2G,UACX3G,MAAM6G,YAAY7G,KAAK6G,YAAY,MAAM,OAAOF,SAAS,0BAA0B,MACpFG,OAAAA;gCACYpE,CAAAA;gCACAD,CAAAA;;qCAEKzG,KAAK,CAAA,aAAcE,KAAK,CAAA;;kBAE3C8D,MAAM2E,KAAAA;;MAEZ,CAAA;IACF,CAAA,CAAA;;;;;;;;;;;;EAYR;EAEQe,4BAA4B;AAClC,SAAKzG,sBAAsBpD,OAAOC,SAAS,KAAKqB,YAAY,IACxD;SAAI+G,MAAM,KAAK/G,YAAY;MAAGgH,OAAO,CAACC,KAAK3E,GAAGzD,OAAOoI,MAAM,KAAKpG,QAAQhC,EAAAA,GAAK,CAAA,IAAKhC,OAAO,KAAKmD,eAAe,KAC7GC;EACN;EAEQuI,2BAA2B;AACjC,SAAKzG,qBAAqBrD,OAAOC,SAAS,KAAKuB,SAAS,IACpD;SAAI6G,MAAM,KAAK7G,SAAS;MAAG8G,OAAO,CAACC,KAAK3E,GAAGvD,OAAOkI,MAAM,KAAKjG,QAAQjC,EAAAA,GAAK,CAAA,IAAKlC,OAAO,KAAKqD,YAAY,KACvGD;EACN;EAEQ2J,uBAAuB;AAC7B,SAAKrB,0BAAyB;AAC9B,SAAKC,yBAAwB;EAC/B;EAESqB,eAAe;AACtB,QAAI,KAAK1J,UAAU;AACjB,WAAKC,QAAQ,KAAKD,SAAS;QACzB6C,OAAO;UAAE1F,KAAK,KAAK2D;UAAWpD,KAAK,KAAKsD;QAAU;QAClD8B,KAAK;UAAE3F,KAAK,KAAK4D;UAAWrD,KAAK,KAAKuD;QAAU;MAClD,CAAA;IACF;AACA,SAAK+B,SAAS2G,QAAQ,KAAKjG,YAAY2D,KAAK;AAC5C,SAAKhG,WAAWuI,OAAO1G,QAAQ,KAAKxD,OAAO,EAAEmH,OAAO,CAACC,KAA6B,CAAC+C,OAAOC,OAAAA,MAAQ;AAChG,UAAIA,SAASvK,MAAM;AACjBuH,YAAI+C,KAAAA,IAASC,QAAQvK;MACvB;AACA,aAAOuH;IACT,GAAG,CAAC,CAAA;AACJ,SAAKxF,WAAWsI,OAAO1G,QAAQ,KAAKzD,IAAI,EAAEoH,OAAO,CAACC,KAA6B,CAACiD,OAAOC,OAAAA,MAAQ;AAC7F,UAAIA,SAASzK,MAAM;AACjBuH,YAAIiD,KAAAA,IAASC,QAAQzK;MACvB;AACA,aAAOuH;IACT,GAAG,CAAC,CAAA;AACJ,SAAK2C,qBAAoB;EAC3B;EAESQ,WAAWC,mBAAqC;AACvD,QACE,KAAKlK,aACJkK,kBAAkBC,IAAI,cAAA,KACrBD,kBAAkBC,IAAI,WAAA,KACtBD,kBAAkBC,IAAI,WAAA,KACtBD,kBAAkBC,IAAI,WAAA,KACtBD,kBAAkBC,IAAI,WAAA,IACxB;AACA,WAAKlK,QAAQ,KAAKD,SAAS;QACzB6C,OAAO;UAAE1F,KAAK,KAAK2D;UAAWpD,KAAK,KAAKsD;QAAU;QAClD8B,KAAK;UAAE3F,KAAK,KAAK4D;UAAWrD,KAAK,KAAKuD;QAAU;MAClD,CAAA;IACF;EACF;EAESmJ,QAAQF,mBAAqC;AAEpD,QACE,KAAK3I,gBACJ2I,kBAAkBC,IAAI,WAAA,KAAgBD,kBAAkBC,IAAI,WAAA,KAAgBD,kBAAkBC,IAAI,aAAA,IACnG;AACA,WAAK5C,QAAO;IACd;EACF;EAES8C,uBAAuB;AAC9B,UAAMA,qBAAAA;AAGN,QAAI,KAAK3G,YAAY2D,OAAO;AAC1B,WAAKrE,SAASsH,UAAU,KAAK5G,YAAY2D,KAAK;IAChD;EACF;EAESkD,mBAAmB;AAC1B,WAAO;EACT;AACF;;EAzwBGC,UAAS;IAAEtC,MAAM9K;EAAO,CAAA;GAdd8B,OAAAA,WAAAA,UAAAA,MAAAA;;EAiBVsL,UAAS;IAAEtC,MAAM0B;EAAO,CAAA;GAjBd1K,OAAAA,WAAAA,cAAAA,MAAAA;;EAoBVsL,UAAS;IAAEtC,MAAM0B;EAAO,CAAA;GApBd1K,OAAAA,WAAAA,iBAAAA,MAAAA;;EAuBVsL,UAAS;IAAEtC,MAAM0B;EAAO,CAAA;GAvBd1K,OAAAA,WAAAA,QAAAA,MAAAA;;EA0BVsL,UAAS;IAAEtC,MAAM0B;EAAO,CAAA;GA1Bd1K,OAAAA,WAAAA,WAAAA,MAAAA;;EA6BVsL,UAAS;IAAEtC,MAAM0B;EAAO,CAAA;GA7Bd1K,OAAAA,WAAAA,gBAAAA,MAAAA;;EAgCVsL,UAAS;IAAEtC,MAAM9K;EAAO,CAAA;GAhCd8B,OAAAA,WAAAA,QAAAA,MAAAA;;EAmCVsL,UAAS;IAAEtC,MAAM3J;EAAO,CAAA;GAnCdW,OAAAA,WAAAA,gBAAAA,MAAAA;;EAsCVsL,UAAS;IAAEtC,MAAM3J;EAAO,CAAA;GAtCdW,OAAAA,WAAAA,aAAAA,MAAAA;;EA+CVkD,MAAAA;GA/CUlD,OAAAA,WAAAA,SAAAA,MAAAA;;EAsDVkD,MAAAA;GAtDUlD,OAAAA,WAAAA,aAAAA,MAAAA;;EAyDVkD,MAAAA;GAzDUlD,OAAAA,WAAAA,YAAAA,MAAAA;;EAgEVkD,MAAAA;GAhEUlD,OAAAA,WAAAA,cAAAA,MAAAA;;EAmEVkD,MAAAA;GAnEUlD,OAAAA,WAAAA,aAAAA,MAAAA;;EA0EVkD,MAAAA;GA1EUlD,OAAAA,WAAAA,kBAAAA,MAAAA;;EA6EVkD,MAAAA;GA7EUlD,OAAAA,WAAAA,iBAAAA,MAAAA;;EAoFVkD,MAAAA;GApFUlD,OAAAA,WAAAA,gBAAAA,MAAAA;;EAuFVkD,MAAAA;GAvFUlD,OAAAA,WAAAA,gBAAAA,MAAAA;;EA0FVkD,MAAAA;GA1FUlD,OAAAA,WAAAA,eAAAA,MAAAA;;EA6FVkD,MAAAA;GA7FUlD,OAAAA,WAAAA,eAAAA,MAAAA;;EAqGVkD,MAAAA;GArGUlD,OAAAA,WAAAA,aAAAA,MAAAA;;EAwGVkD,MAAAA;GAxGUlD,OAAAA,WAAAA,aAAAA,MAAAA;;EA2GVkD,MAAAA;GA3GUlD,OAAAA,WAAAA,aAAAA,MAAAA;;EA8GVkD,MAAAA;GA9GUlD,OAAAA,WAAAA,aAAAA,MAAAA;;EAoHVkD,MAAAA;GApHUlD,OAAAA,WAAAA,mBAAAA,MAAAA;;EAuHVkD,MAAAA;GAvHUlD,OAAAA,WAAAA,gBAAAA,MAAAA;;EA8HVkD,MAAAA;GA9HUlD,OAAAA,WAAAA,WAAAA,MAAAA;;EAiIVkD,MAAAA;GAjIUlD,OAAAA,WAAAA,YAAAA,MAAAA;;EAoIVkD,MAAAA;GApIUlD,OAAAA,WAAAA,YAAAA,MAAAA;;EAuIVkD,MAAAA;GAvIUlD,OAAAA,WAAAA,eAAAA,MAAAA;;EA0IVkD,MAAAA;GA1IUlD,OAAAA,WAAAA,eAAAA,MAAAA;;EA6IVkD,MAAAA;GA7IUlD,OAAAA,WAAAA,kBAAAA,MAAAA;;EAgJVkD,MAAAA;GAhJUlD,OAAAA,WAAAA,gBAAAA,MAAAA;;EAuJVkD,MAAAA;GAvJUlD,OAAAA,WAAAA,uBAAAA,MAAAA;;EA0JVkD,MAAAA;GA1JUlD,OAAAA,WAAAA,sBAAAA,MAAAA;;EA2TVkD,MAAAA;GA3TUlD,OAAAA,WAAAA,YAAAA,MAAAA;;EAybVuL,aAAa;IAAErG,SAAS;EAAK,CAAA;GAzbnBlF,OAAAA,WAAAA,eAAAA,IAAAA;;EAkcVuL,aAAa;IAAErG,SAAS;EAAK,CAAA;GAlcnBlF,OAAAA,WAAAA,cAAAA,IAAAA;AAAAA,SAAAA,cAAAA;EADZwL,eAAc,SAAA;GACFxL,MAAAA;",
6
+ "names": ["LitElement", "html", "nothing", "customElement", "state", "property", "eventOptions", "ref", "createRef", "styleMap", "draggable", "disableNativeDragPreview", "preventUnhandled", "html", "LitElement", "customElement", "property", "ref", "separator", "toCellIndex", "cellCoords", "col", "row", "DxAxisResize", "Event", "constructor", "props", "axis", "index", "size", "DxAxisResizeInternal", "composed", "bubbles", "delta", "state", "DxEditRequest", "cellIndex", "cellBox", "initialContent", "DxGridCellsSelect", "start", "end", "toCellIndex", "minCol", "Math", "min", "col", "maxCol", "max", "minRow", "row", "maxRow", "DxGridAxisResizeHandle", "LitElement", "axis", "index", "size", "dragStartSize", "cleanup", "render", "html", "ref", "mount", "dispatchResize", "location", "state", "client", "event", "DxAxisResizeInternal", "delta", "current", "input", "initial", "dispatchEvent", "element", "host", "draggable", "onGenerateDragPreview", "nativeSetDragImage", "disableNativeDragPreview", "preventUnhandled", "start", "onDragStart", "onDrag", "onDrop", "disconnectedCallback", "createRenderRoot", "property", "type", "String", "Number", "customElement", "gap", "resizeTolerance", "overscanCol", "overscanRow", "sizeColMin", "sizeColMax", "sizeRowMin", "sizeRowMax", "colToA1Notation", "col", "String", "fromCharCode", "charCodeAt", "Math", "floor", "rowToA1Notation", "row", "closestAction", "target", "actionEl", "closest", "action", "getAttribute", "closestCell", "cellElement", "parseInt", "isSameCell", "a", "b", "Number", "isFinite", "localChId", "c0", "localRhId", "r0", "getPage", "axis", "event", "pageX", "pageY", "DxGrid", "LitElement", "constructor", "gridId", "rowDefault", "size", "columnDefault", "rows", "columns", "initialCells", "mode", "limitColumns", "Infinity", "limitRows", "getCells", "cells", "posInline", "posBlock", "sizeInline", "sizeBlock", "overscanInline", "overscanBlock", "binInlineMin", "binInlineMax", "colSize", "binBlockMin", "binBlockMax", "rowSize", "visColMin", "visColMax", "visRowMin", "visRowMax", "templateColumns", "templateRows", "pointer", "colSizes", "rowSizes", "focusActive", "focusedCell", "selectionStart", "selectionEnd", "intrinsicInlineSize", "intrinsicBlockSize", "handlePointerDown", "isPrimary", "startsWith", "resize", "index", "split", "_", "state", "page", "cellCoords", "preventDefault", "dispatchEditRequest", "handlePointerUp", "cell", "dispatchEvent", "DxGridCellsSelect", "start", "end", "handlePointerMove", "observer", "ResizeObserver", "entries", "inlineSize", "blockSize", "contentBoxSize", "abs", "updateVis", "queueMicrotask", "updatePos", "viewportRef", "createRef", "maybeUpdateVis", "handleWheel", "deltaX", "deltaY", "addEventListener", "handleAxisResizeInternal", "passive", "handleFocus", "capture", "handleBlur", "handleKeydown", "initialContent", "snapPosToFocusedCell", "DxEditRequest", "cellIndex", "toCellIndex", "cellBox", "focusedCellBox", "key", "min", "max", "length", "match", "c", "r", "separator", "focusedCellElement", "cellSize", "insetInlineStart", "NaN", "insetBlockStart", "contentElement", "offsetParent", "_translate3d", "inlineStr", "blockStr", "style", "transform", "contentOffsetInline", "parseFloat", "contentOffsetBlock", "offsetLeft", "offsetTop", "inline", "block", "updateVisInline", "colIndex", "pxInline", "Array", "reduce", "acc", "map", "join", "updateVisBlock", "rowIndex", "pxBlock", "relatedTarget", "value", "querySelector", "refocus", "increment", "delta", "focus", "preventScroll", "sizeSumCol", "sizeSumRow", "scrollLeft", "nextValue", "scrollTop", "stopPropagation", "type", "nextSize", "updateIntrinsicInlineSize", "updateIntrinsicBlockSize", "DxAxisResize", "render", "visibleCols", "visibleRows", "offsetInline", "offsetBlock", "selectColMin", "selectColMax", "selectRowMin", "selectRowMax", "selectVisible", "html", "styleMap", "resizeable", "ref", "active", "selected", "className", "nothing", "updateIntrinsicSizes", "firstUpdated", "observe", "Object", "colId", "colMeta", "rowId", "rowMeta", "willUpdate", "changedProperties", "has", "updated", "disconnectedCallback", "unobserve", "createRenderRoot", "property", "eventOptions", "customElement"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/ui/lit-grid/src/util.ts":{"bytes":1219,"imports":[],"format":"esm"},"packages/ui/lit-grid/src/types.ts":{"bytes":8710,"imports":[{"path":"packages/ui/lit-grid/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/ui/lit-grid/src/dx-grid-axis-resize-handle.ts":{"bytes":10189,"imports":[{"path":"@atlaskit/pragmatic-drag-and-drop/element/adapter","kind":"import-statement","external":true},{"path":"@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview","kind":"import-statement","external":true},{"path":"@atlaskit/pragmatic-drag-and-drop/prevent-unhandled","kind":"import-statement","external":true},{"path":"lit","kind":"import-statement","external":true},{"path":"lit/decorators.js","kind":"import-statement","external":true},{"path":"lit/directives/ref.js","kind":"import-statement","external":true},{"path":"packages/ui/lit-grid/src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/ui/lit-grid/src/dx-grid.ts":{"bytes":97287,"imports":[{"path":"lit","kind":"import-statement","external":true},{"path":"lit/decorators.js","kind":"import-statement","external":true},{"path":"lit/directives/ref.js","kind":"import-statement","external":true},{"path":"packages/ui/lit-grid/src/dx-grid-axis-resize-handle.ts","kind":"import-statement","original":"./dx-grid-axis-resize-handle"},{"path":"packages/ui/lit-grid/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/ui/lit-grid/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/ui/lit-grid/src/index.ts":{"bytes":572,"imports":[{"path":"packages/ui/lit-grid/src/dx-grid.ts","kind":"import-statement","original":"./dx-grid"},{"path":"packages/ui/lit-grid/src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"}},"outputs":{"packages/ui/lit-grid/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":55906},"packages/ui/lit-grid/dist/lib/browser/index.mjs":{"imports":[{"path":"lit","kind":"import-statement","external":true},{"path":"lit/decorators.js","kind":"import-statement","external":true},{"path":"lit/directives/ref.js","kind":"import-statement","external":true},{"path":"@atlaskit/pragmatic-drag-and-drop/element/adapter","kind":"import-statement","external":true},{"path":"@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview","kind":"import-statement","external":true},{"path":"@atlaskit/pragmatic-drag-and-drop/prevent-unhandled","kind":"import-statement","external":true},{"path":"lit","kind":"import-statement","external":true},{"path":"lit/decorators.js","kind":"import-statement","external":true},{"path":"lit/directives/ref.js","kind":"import-statement","external":true}],"exports":["DxAxisResize","DxAxisResizeInternal","DxEditRequest","DxGrid","DxGridCellsSelect"],"entryPoint":"packages/ui/lit-grid/src/index.ts","inputs":{"packages/ui/lit-grid/src/dx-grid.ts":{"bytesInOutput":25561},"packages/ui/lit-grid/src/dx-grid-axis-resize-handle.ts":{"bytesInOutput":2867},"packages/ui/lit-grid/src/util.ts":{"bytesInOutput":105},"packages/ui/lit-grid/src/types.ts":{"bytesInOutput":1104},"packages/ui/lit-grid/src/index.ts":{"bytesInOutput":0}},"bytes":30043}}}
1
+ {"inputs":{"packages/ui/lit-grid/src/util.ts":{"bytes":1219,"imports":[],"format":"esm"},"packages/ui/lit-grid/src/types.ts":{"bytes":8758,"imports":[{"path":"packages/ui/lit-grid/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/ui/lit-grid/src/dx-grid-axis-resize-handle.ts":{"bytes":10189,"imports":[{"path":"@atlaskit/pragmatic-drag-and-drop/element/adapter","kind":"import-statement","external":true},{"path":"@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview","kind":"import-statement","external":true},{"path":"@atlaskit/pragmatic-drag-and-drop/prevent-unhandled","kind":"import-statement","external":true},{"path":"lit","kind":"import-statement","external":true},{"path":"lit/decorators.js","kind":"import-statement","external":true},{"path":"lit/directives/ref.js","kind":"import-statement","external":true},{"path":"packages/ui/lit-grid/src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/ui/lit-grid/src/dx-grid.ts":{"bytes":104305,"imports":[{"path":"lit","kind":"import-statement","external":true},{"path":"lit/decorators.js","kind":"import-statement","external":true},{"path":"lit/directives/ref.js","kind":"import-statement","external":true},{"path":"lit/directives/style-map.js","kind":"import-statement","external":true},{"path":"packages/ui/lit-grid/src/dx-grid-axis-resize-handle.ts","kind":"import-statement","original":"./dx-grid-axis-resize-handle"},{"path":"packages/ui/lit-grid/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/ui/lit-grid/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/ui/lit-grid/src/index.ts":{"bytes":572,"imports":[{"path":"packages/ui/lit-grid/src/dx-grid.ts","kind":"import-statement","original":"./dx-grid"},{"path":"packages/ui/lit-grid/src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"}},"outputs":{"packages/ui/lit-grid/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":59464},"packages/ui/lit-grid/dist/lib/browser/index.mjs":{"imports":[{"path":"lit","kind":"import-statement","external":true},{"path":"lit/decorators.js","kind":"import-statement","external":true},{"path":"lit/directives/ref.js","kind":"import-statement","external":true},{"path":"lit/directives/style-map.js","kind":"import-statement","external":true},{"path":"@atlaskit/pragmatic-drag-and-drop/element/adapter","kind":"import-statement","external":true},{"path":"@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview","kind":"import-statement","external":true},{"path":"@atlaskit/pragmatic-drag-and-drop/prevent-unhandled","kind":"import-statement","external":true},{"path":"lit","kind":"import-statement","external":true},{"path":"lit/decorators.js","kind":"import-statement","external":true},{"path":"lit/directives/ref.js","kind":"import-statement","external":true}],"exports":["DxAxisResize","DxAxisResizeInternal","DxEditRequest","DxGrid","DxGridCellsSelect"],"entryPoint":"packages/ui/lit-grid/src/index.ts","inputs":{"packages/ui/lit-grid/src/dx-grid.ts":{"bytesInOutput":27497},"packages/ui/lit-grid/src/dx-grid-axis-resize-handle.ts":{"bytesInOutput":2867},"packages/ui/lit-grid/src/util.ts":{"bytesInOutput":105},"packages/ui/lit-grid/src/types.ts":{"bytesInOutput":1104},"packages/ui/lit-grid/src/index.ts":{"bytesInOutput":0}},"bytes":31979}}}
@@ -10,6 +10,8 @@ export declare class DxGrid extends LitElement {
10
10
  columns: DxGridAxisMeta;
11
11
  initialCells: DxGridCells;
12
12
  mode: DxGridMode;
13
+ limitColumns: number;
14
+ limitRows: number;
13
15
  /**
14
16
  * When this function is defined, it is used first to try to get a value for a cell, and otherwise will fall back
15
17
  * to `cells`.
@@ -39,6 +41,8 @@ export declare class DxGrid extends LitElement {
39
41
  private focusedCell;
40
42
  private selectionStart;
41
43
  private selectionEnd;
44
+ private intrinsicInlineSize;
45
+ private intrinsicBlockSize;
42
46
  private dispatchEditRequest;
43
47
  private handlePointerDown;
44
48
  private handlePointerUp;
@@ -51,6 +55,7 @@ export declare class DxGrid extends LitElement {
51
55
  private observer;
52
56
  private viewportRef;
53
57
  private maybeUpdateVis;
58
+ private updatePos;
54
59
  private handleWheel;
55
60
  private updateVisInline;
56
61
  private updateVisBlock;
@@ -72,6 +77,9 @@ export declare class DxGrid extends LitElement {
72
77
  set scrollTop(nextValue: number);
73
78
  private handleAxisResizeInternal;
74
79
  render(): import("lit").TemplateResult<1>;
80
+ private updateIntrinsicInlineSize;
81
+ private updateIntrinsicBlockSize;
82
+ private updateIntrinsicSizes;
75
83
  firstUpdated(): void;
76
84
  willUpdate(changedProperties: Map<string, any>): void;
77
85
  updated(changedProperties: Map<string, any>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"dx-grid.d.ts","sourceRoot":"","sources":["../../../src/dx-grid.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dx-grid.d.ts","sourceRoot":"","sources":["../../../src/dx-grid.ts"],"names":[],"mappings":"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"}
@@ -17,4 +17,14 @@ export declare const Basic: {
17
17
  columns: string;
18
18
  };
19
19
  };
20
+ export declare const Limits: {
21
+ (props: DxGridProps): import("lit").TemplateResult<1>;
22
+ args: {
23
+ limitRows: string;
24
+ limitColumns: string;
25
+ columnDefault: string;
26
+ rowDefault: string;
27
+ columns: string;
28
+ };
29
+ };
20
30
  //# sourceMappingURL=dx-grid.lit-stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dx-grid.lit-stories.d.ts","sourceRoot":"","sources":["../../../src/dx-grid.lit-stories.ts"],"names":[],"mappings":"AAIA,OAAO,cAAc,CAAC;AACtB,OAAO,gBAAgB,CAAC;AAIxB,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;;;;;;;AAE3C,wBAGE;AAEF,eAAO,MAAM,KAAK;YAAW,WAAW;;;;;;;CASvC,CAAC"}
1
+ {"version":3,"file":"dx-grid.lit-stories.d.ts","sourceRoot":"","sources":["../../../src/dx-grid.lit-stories.ts"],"names":[],"mappings":"AAIA,OAAO,cAAc,CAAC;AACtB,OAAO,gBAAgB,CAAC;AAIxB,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;;;;;;;AAE3C,wBAGE;AAEF,eAAO,MAAM,KAAK;YAAW,WAAW;;;;;;;CASvC,CAAC;AA0BF,eAAO,MAAM,MAAM;YAAW,WAAW;;;;;;;;CAUxC,CAAC"}
@@ -36,7 +36,7 @@ export type AxisMeta = {
36
36
  description?: string;
37
37
  resizeable?: boolean;
38
38
  };
39
- export type DxGridProps = Partial<Pick<DxGrid, 'initialCells' | 'rows' | 'columns' | 'rowDefault' | 'columnDefault'>>;
39
+ export type DxGridProps = Partial<Pick<DxGrid, 'initialCells' | 'rows' | 'columns' | 'rowDefault' | 'columnDefault' | 'limitRows' | 'limitColumns'>>;
40
40
  export declare class DxAxisResize extends Event {
41
41
  readonly axis: DxGridAxis;
42
42
  readonly index: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,MAAM,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;AAE9C,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC;AAEvC,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AACxD,MAAM,MAAM,sBAAsB,GAAG,cAAc,GAAG,IAAI,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAEtD,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,iBAAiB,CAAC,GAAG;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC;AAEtH,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;AAC9E,MAAM,MAAM,yBAAyB,GAAG,iBAAiB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,GAAG,SAAS,CAAA;CAAE,CAAC;AAE7G,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE3C,MAAM,MAAM,SAAS,GAAG;IACtB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,OAAO,CAC/B,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,YAAY,GAAG,eAAe,GAAG,WAAW,GAAG,cAAc,CAAC,CAClH,CAAC;AAEF,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAgB,IAAI,EAAE,UAAU,CAAC;IACjC,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B,SAAgB,IAAI,EAAE,MAAM,CAAC;gBACjB,KAAK,EAAE,iBAAiB;CAMrC;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAgB,IAAI,EAAE,UAAU,CAAC;IACjC,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B,SAAgB,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;gBAClC,KAAK,EAAE,yBAAyB;CAQ7C;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,SAAS,GAAG,gBAAgB,CAAC,CAAC;AAEjG,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,SAAgB,OAAO,EAAE,MAAM,CAAC,kBAAkB,GAAG,iBAAiB,GAAG,YAAY,GAAG,WAAW,EAAE,MAAM,CAAC,CAAC;IAC7G,SAAgB,cAAc,CAAC,EAAE,MAAM,CAAC;gBAC5B,KAAK,EAAE,kBAAkB;CAMtC;AAED,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,GAAG,EAAE,cAAc,CAAA;CAAE,CAAC;AAEzE,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B,SAAgB,GAAG,EAAE,MAAM,CAAC;IAC5B,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,MAAM,EAAE,MAAM,CAAC;gBACnB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,WAAW;CASxC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/lit-grid",
3
- "version": "0.6.12-main.f9d0246",
3
+ "version": "0.6.12-staging.e11e696",
4
4
  "description": "A grid Web Component using Lit",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -48,3 +48,35 @@ Basic.args = {
48
48
  4: { size: 270 },
49
49
  } satisfies DxGridProps['columns']),
50
50
  };
51
+
52
+ export const Limits = (props: DxGridProps) => {
53
+ return html`<div style="position:fixed;inset:0;">
54
+ <dx-grid
55
+ limitRows=${props.limitRows ?? nothing}
56
+ limitColumns=${props.limitColumns ?? nothing}
57
+ columnDefault=${props.columnDefault ?? nothing}
58
+ rowDefault=${props.rowDefault ?? nothing}
59
+ columns=${props.columns ?? nothing}
60
+ ></dx-grid>
61
+ </div>`;
62
+ };
63
+
64
+ Limits.args = {
65
+ limitRows: JSON.stringify(10 satisfies DxGridProps['limitRows']),
66
+ limitColumns: JSON.stringify(3 satisfies DxGridProps['limitColumns']),
67
+ columnDefault: JSON.stringify({
68
+ size: 180,
69
+ resizeable: true,
70
+ } satisfies DxGridProps['columnDefault']),
71
+ rowDefault: JSON.stringify({
72
+ size: 32,
73
+ resizeable: true,
74
+ } satisfies DxGridProps['rowDefault']),
75
+ columns: JSON.stringify({
76
+ 0: { size: 200 },
77
+ 1: { size: 210 },
78
+ 2: { size: 230 },
79
+ 3: { size: 250 },
80
+ 4: { size: 270 },
81
+ } satisfies DxGridProps['columns']),
82
+ };
package/src/dx-grid.pcss CHANGED
@@ -16,8 +16,8 @@ dx-grid, dx-grid-axis-resize-handle {
16
16
 
17
17
  .dx-grid {
18
18
  display: grid;
19
- grid-template-columns: min-content 1fr min-content;
20
- grid-template-rows: min-content 1fr min-content;
19
+ grid-template-columns: min-content minmax(0, var(--dx-viewport-inline-size)) min-content;
20
+ grid-template-rows: min-content minmax(0, var(--dx-viewport-block-size)) min-content;
21
21
  font-variant-numeric: tabular-nums;
22
22
  --dx-grid-gap: 1px;
23
23
 
package/src/dx-grid.ts CHANGED
@@ -5,6 +5,7 @@
5
5
  import { LitElement, html, nothing } from 'lit';
6
6
  import { customElement, state, property, eventOptions } from 'lit/decorators.js';
7
7
  import { ref, createRef, type Ref } from 'lit/directives/ref.js';
8
+ import { styleMap } from 'lit/directives/style-map.js';
8
9
 
9
10
  // eslint-disable-next-line unused-imports/no-unused-imports
10
11
  import './dx-grid-axis-resize-handle';
@@ -32,10 +33,9 @@ import { separator, toCellIndex } from './util';
32
33
  const gap = 1;
33
34
 
34
35
  /**
35
- * This should be about the width of the `1` numeral so resize is triggered as the row header column’s intrinsic size
36
- * changes when scrolling vertically.
36
+ * ResizeObserver notices even subpixel changes, only respond to changes of at least 1px.
37
37
  */
38
- const resizeTolerance = 8;
38
+ const resizeTolerance = 1;
39
39
 
40
40
  //
41
41
  // `overscan` is the number of columns or rows to render outside of the viewport
@@ -101,7 +101,7 @@ export class DxGrid extends LitElement {
101
101
  constructor() {
102
102
  super();
103
103
  this.addEventListener('dx-axis-resize-internal', this.handleAxisResizeInternal as EventListener);
104
- this.addEventListener('wheel', this.handleWheel);
104
+ this.addEventListener('wheel', this.handleWheel, { passive: true });
105
105
  this.addEventListener('pointerdown', this.handlePointerDown);
106
106
  this.addEventListener('pointermove', this.handlePointerMove);
107
107
  this.addEventListener('pointerup', this.handlePointerUp);
@@ -132,6 +132,12 @@ export class DxGrid extends LitElement {
132
132
  @property({ type: String })
133
133
  mode: DxGridMode = 'browse';
134
134
 
135
+ @property({ type: Number })
136
+ limitColumns: number = Infinity;
137
+
138
+ @property({ type: Number })
139
+ limitRows: number = Infinity;
140
+
135
141
  /**
136
142
  * When this function is defined, it is used first to try to get a value for a cell, and otherwise will fall back
137
143
  * to `cells`.
@@ -238,6 +244,16 @@ export class DxGrid extends LitElement {
238
244
  @state()
239
245
  private selectionEnd: DxGridPosition = { col: 0, row: 0 };
240
246
 
247
+ //
248
+ // Limits
249
+ //
250
+
251
+ @state()
252
+ private intrinsicInlineSize: number = Infinity;
253
+
254
+ @state()
255
+ private intrinsicBlockSize: number = Infinity;
256
+
241
257
  //
242
258
  // Primary pointer and keyboard handlers
243
259
  //
@@ -320,13 +336,13 @@ export class DxGrid extends LitElement {
320
336
  // Adjust state
321
337
  switch (event.key) {
322
338
  case 'ArrowDown':
323
- this.focusedCell = { ...this.focusedCell, row: this.focusedCell.row + 1 };
339
+ this.focusedCell = { ...this.focusedCell, row: Math.min(this.limitRows - 1, this.focusedCell.row + 1) };
324
340
  break;
325
341
  case 'ArrowUp':
326
342
  this.focusedCell = { ...this.focusedCell, row: Math.max(0, this.focusedCell.row - 1) };
327
343
  break;
328
344
  case 'ArrowRight':
329
- this.focusedCell = { ...this.focusedCell, col: this.focusedCell.col + 1 };
345
+ this.focusedCell = { ...this.focusedCell, col: Math.min(this.limitColumns - 1, this.focusedCell.col + 1) };
330
346
  break;
331
347
  case 'ArrowLeft':
332
348
  this.focusedCell = { ...this.focusedCell, col: Math.max(0, this.focusedCell.col - 1) };
@@ -410,6 +426,7 @@ export class DxGrid extends LitElement {
410
426
  this.sizeInline = inlineSize;
411
427
  this.sizeBlock = blockSize;
412
428
  this.updateVis();
429
+ queueMicrotask(() => this.updatePos());
413
430
  }
414
431
  });
415
432
 
@@ -434,11 +451,15 @@ export class DxGrid extends LitElement {
434
451
  }
435
452
  };
436
453
 
437
- private handleWheel = ({ deltaX, deltaY }: WheelEvent) => {
454
+ private updatePos(inline?: number, block?: number) {
455
+ this.posInline = Math.max(0, Math.min(this.intrinsicInlineSize - this.sizeInline, inline ?? this.posInline));
456
+ this.posBlock = Math.max(0, Math.min(this.intrinsicBlockSize - this.sizeBlock, block ?? this.posBlock));
457
+ this.maybeUpdateVis();
458
+ }
459
+
460
+ private handleWheel = ({ deltaX, deltaY }: Pick<WheelEvent, 'deltaX' | 'deltaY'>) => {
438
461
  if (this.mode === 'browse') {
439
- this.posInline = Math.max(0, this.posInline + deltaX);
440
- this.posBlock = Math.max(0, this.posBlock + deltaY);
441
- this.maybeUpdateVis();
462
+ this.updatePos(this.posInline + deltaX, this.posBlock + deltaY);
442
463
  }
443
464
  };
444
465
 
@@ -469,7 +490,7 @@ export class DxGrid extends LitElement {
469
490
  pxInline += this.colSize(colIndex) + gap;
470
491
  }
471
492
 
472
- this.visColMax = colIndex + overscanCol;
493
+ this.visColMax = Math.min(this.limitColumns, colIndex + overscanCol);
473
494
 
474
495
  this.templateColumns = [...Array(this.visColMax - this.visColMin)]
475
496
  .map((_, c0) => `${this.colSize(this.visColMin + c0)}px`)
@@ -503,7 +524,7 @@ export class DxGrid extends LitElement {
503
524
  pxBlock += this.rowSize(rowIndex) + gap;
504
525
  }
505
526
 
506
- this.visRowMax = rowIndex + overscanRow;
527
+ this.visRowMax = Math.min(this.limitRows, rowIndex + overscanRow);
507
528
 
508
529
  this.templateRows = [...Array(this.visRowMax - this.visRowMin)]
509
530
  .map((_, r0) => `${this.rowSize(this.visRowMin + r0)}px`)
@@ -588,26 +609,35 @@ export class DxGrid extends LitElement {
588
609
  // );
589
610
  } else {
590
611
  if (this.focusedCell.col <= this.visColMin + overscanCol) {
591
- this.posInline = this.binInlineMin;
612
+ this.posInline = this.binInlineMin + gap;
592
613
  this.updateVisInline();
593
614
  } else if (this.focusedCell.col >= this.visColMax - overscanCol - 1) {
594
615
  const sizeSumCol = [...Array(this.focusedCell.col - this.visColMin)].reduce((acc, _, c0) => {
595
616
  acc += this.colSize(this.visColMin + overscanCol + c0) + gap;
596
617
  return acc;
597
618
  }, 0);
598
- this.posInline = Math.max(0, this.binInlineMin + sizeSumCol + gap * 2 - this.sizeInline);
619
+ this.posInline = Math.max(
620
+ 0,
621
+ Math.min(
622
+ this.intrinsicInlineSize - this.sizeInline,
623
+ this.binInlineMin + sizeSumCol + gap * 2 - this.sizeInline,
624
+ ),
625
+ );
599
626
  this.updateVisInline();
600
627
  }
601
628
 
602
629
  if (this.focusedCell.row <= this.visRowMin + overscanRow) {
603
- this.posBlock = this.binBlockMin;
630
+ this.posBlock = this.binBlockMin + gap;
604
631
  this.updateVisBlock();
605
632
  } else if (this.focusedCell.row >= this.visRowMax - overscanRow - 1) {
606
633
  const sizeSumRow = [...Array(this.focusedCell.row - this.visRowMin)].reduce((acc, _, r0) => {
607
634
  acc += this.rowSize(this.visRowMin + overscanRow + r0) + gap;
608
635
  return acc;
609
636
  }, 0);
610
- this.posBlock = Math.max(0, this.binBlockMin + sizeSumRow + gap * 2 - this.sizeBlock);
637
+ this.posBlock = Math.max(
638
+ 0,
639
+ Math.min(this.intrinsicBlockSize - this.sizeBlock, this.binBlockMin + sizeSumRow + gap * 2 - this.sizeBlock),
640
+ );
611
641
  this.updateVisBlock();
612
642
  }
613
643
  }
@@ -645,10 +675,12 @@ export class DxGrid extends LitElement {
645
675
  const nextSize = Math.max(sizeColMin, Math.min(sizeColMax, size + delta));
646
676
  this.colSizes = { ...this.colSizes, [index]: nextSize };
647
677
  this.updateVisInline();
678
+ this.updateIntrinsicInlineSize();
648
679
  } else {
649
680
  const nextSize = Math.max(sizeRowMin, Math.min(sizeRowMax, size + delta));
650
681
  this.rowSizes = { ...this.rowSizes, [index]: nextSize };
651
682
  this.updateVisBlock();
683
+ this.updateIntrinsicBlockSize();
652
684
  }
653
685
  if (type === 'dropped') {
654
686
  this.dispatchEvent(
@@ -680,6 +712,10 @@ export class DxGrid extends LitElement {
680
712
  return html`<div
681
713
  role="none"
682
714
  class="dx-grid"
715
+ style=${styleMap({
716
+ '--dx-viewport-inline-size': Number.isFinite(this.limitColumns) ? `${this.intrinsicInlineSize}px` : '1fr',
717
+ '--dx-viewport-block-size': Number.isFinite(this.limitRows) ? `${this.intrinsicBlockSize}px` : '1fr',
718
+ })}
683
719
  data-grid=${this.gridId}
684
720
  data-grid-mode=${this.mode}
685
721
  ?data-grid-select=${selectVisible}
@@ -704,7 +740,6 @@ export class DxGrid extends LitElement {
704
740
  axis="col"
705
741
  index=${c}
706
742
  size=${this.colSize(c)}
707
- @dxaxisresizeinternal=${this.handleAxisResizeInternal}
708
743
  ></dx-grid-axis-resize-handle>`}
709
744
  </div>`;
710
745
  })}
@@ -731,7 +766,7 @@ export class DxGrid extends LitElement {
731
766
  })}
732
767
  </div>
733
768
  </div>
734
- <div role="grid" class="dx-grid__viewport" tabindex="0" @wheel=${this.handleWheel} ${ref(this.viewportRef)}>
769
+ <div role="grid" class="dx-grid__viewport" tabindex="0" ${ref(this.viewportRef)}>
735
770
  <div
736
771
  role="none"
737
772
  class="dx-grid__content"
@@ -775,6 +810,23 @@ export class DxGrid extends LitElement {
775
810
  </div>`;
776
811
  }
777
812
 
813
+ private updateIntrinsicInlineSize() {
814
+ this.intrinsicInlineSize = Number.isFinite(this.limitColumns)
815
+ ? [...Array(this.limitColumns)].reduce((acc, _, c0) => acc + this.colSize(c0), 0) + gap * (this.limitColumns - 1)
816
+ : Infinity;
817
+ }
818
+
819
+ private updateIntrinsicBlockSize() {
820
+ this.intrinsicBlockSize = Number.isFinite(this.limitRows)
821
+ ? [...Array(this.limitRows)].reduce((acc, _, r0) => acc + this.rowSize(r0), 0) + gap * (this.limitRows - 1)
822
+ : Infinity;
823
+ }
824
+
825
+ private updateIntrinsicSizes() {
826
+ this.updateIntrinsicInlineSize();
827
+ this.updateIntrinsicBlockSize();
828
+ }
829
+
778
830
  override firstUpdated() {
779
831
  if (this.getCells) {
780
832
  this.cells = this.getCells({
@@ -795,6 +847,7 @@ export class DxGrid extends LitElement {
795
847
  }
796
848
  return acc;
797
849
  }, {});
850
+ this.updateIntrinsicSizes();
798
851
  }
799
852
 
800
853
  override willUpdate(changedProperties: Map<string, any>) {
package/src/types.ts CHANGED
@@ -44,7 +44,9 @@ export type AxisMeta = {
44
44
  resizeable?: boolean;
45
45
  };
46
46
 
47
- export type DxGridProps = Partial<Pick<DxGrid, 'initialCells' | 'rows' | 'columns' | 'rowDefault' | 'columnDefault'>>;
47
+ export type DxGridProps = Partial<
48
+ Pick<DxGrid, 'initialCells' | 'rows' | 'columns' | 'rowDefault' | 'columnDefault' | 'limitRows' | 'limitColumns'>
49
+ >;
48
50
 
49
51
  export class DxAxisResize extends Event {
50
52
  public readonly axis: DxGridAxis;