@conduction/nextcloud-vue 2.89.1 → 2.89.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -38141,17 +38141,17 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
38141
38141
  }
38142
38142
 
38143
38143
 
38144
- .cn-dashboard-grid[data-v-a91998fc] {
38144
+ .cn-dashboard-grid[data-v-a76b6fc6] {
38145
38145
  width: 100%;
38146
38146
  min-height: 200px;
38147
38147
  }
38148
- .grid-stack[data-v-a91998fc] {
38148
+ .grid-stack[data-v-a76b6fc6] {
38149
38149
  background: transparent;
38150
38150
  }
38151
38151
 
38152
38152
  /* Screen-reader-only text: the keyboard key map and the live region. Kept in
38153
38153
  the layout (not `display: none`) so assistive tech still reads it. */
38154
- .cn-dashboard-grid__sr-only[data-v-a91998fc] {
38154
+ .cn-dashboard-grid__sr-only[data-v-a76b6fc6] {
38155
38155
  position: absolute;
38156
38156
  width: 1px;
38157
38157
  height: 1px;
@@ -38166,7 +38166,7 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
38166
38166
  /* Grid items become tab stops in edit mode — give them a visible focus ring
38167
38167
  that satisfies WCAG 2.1 SC 2.4.7 without relying on the widget's own
38168
38168
  styling. `outline-offset` keeps the ring outside the rounded card. */
38169
- .grid-stack-item[data-v-a91998fc]:focus-visible {
38169
+ .grid-stack-item[data-v-a76b6fc6]:focus-visible {
38170
38170
  outline: 2px solid var(--color-primary-element, #0082c9);
38171
38171
  outline-offset: 2px;
38172
38172
  border-radius: var(--border-radius-container-large, 16px);
@@ -38178,19 +38178,19 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
38178
38178
  cell never shrank: "Waiting for me" stayed a tall card around one row. In
38179
38179
  such a cell the child takes its own height. A cell without the key keeps
38180
38180
  the filling child. */
38181
- .cn-dashboard-grid__item--fit[data-v-a91998fc] > .grid-stack-item-content > * {
38181
+ .cn-dashboard-grid__item--fit[data-v-a76b6fc6] > .grid-stack-item-content > * {
38182
38182
  height: auto;
38183
38183
  }
38184
- [data-v-a91998fc] .grid-stack-item-content {
38184
+ [data-v-a76b6fc6] .grid-stack-item-content {
38185
38185
  background: var(--color-main-background);
38186
38186
  border: none;
38187
38187
  box-shadow: none;
38188
38188
  overflow: hidden;
38189
38189
  }
38190
- [data-v-a91998fc] .grid-stack-item-content:has(.cn-widget-wrapper--borderless) {
38190
+ [data-v-a76b6fc6] .grid-stack-item-content:has(.cn-widget-wrapper--borderless) {
38191
38191
  background: transparent;
38192
38192
  }
38193
- [data-v-a91998fc] .grid-stack-placeholder > .placeholder-content {
38193
+ [data-v-a76b6fc6] .grid-stack-placeholder > .placeholder-content {
38194
38194
  background: var(--color-primary-element-light);
38195
38195
  border: 2px dashed var(--color-primary-element);
38196
38196
  border-radius: var(--border-radius-large);
@@ -65,8 +65,11 @@ function readGridGeometry(items) {
65
65
  * full-width card under the stat tiles landed below the lists.
66
66
  *
67
67
  * @spec openspec/changes/dashboard-growth-keeps-order/specs/dashboard-grid/spec.md#requirement-a-growing-cell-keeps-the-order-of-the-cards-under-it
68
- * @param {Array<{x: number, y: number, w: number, h: number}>} nodes The grid's items (the growing one among them).
69
- * @param {{x: number, y: number, w: number, h: number}} node The growing item.
68
+ * The growing item is never among the items it moves, also when `nodes`
69
+ * holds another reference to it (a proxy of the same node, matched by `el`).
70
+ *
71
+ * @param {Array<{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}>} nodes The grid's items (the growing one among them).
72
+ * @param {{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}} node The growing item.
70
73
  * @param {number} h Its new height, in grid rows.
71
74
  * @return {Array<{node: object, y: number}>} The items to move and their new row, bottom-most first.
72
75
  */
@@ -81,7 +84,8 @@ function planGrowth(nodes, node, h) {
81
84
  while (queue.length > 0) {
82
85
  const rect = queue.shift();
83
86
  for (const other of nodes) {
84
- if (other === node || moved.has(other) || !overlaps(rect, other)) {
87
+ const self = other === node || (node.el && other.el === node.el);
88
+ if (self || moved.has(other) || !overlaps(rect, other)) {
85
89
  continue
86
90
  }
87
91
  const next = { x: other.x, y: other.y + delta, w: other.w, h: other.h };
@@ -1 +1 @@
1
- {"version":3,"file":"gridStack.js","sources":["../../../src/utils/gridStack.js"],"sourcesContent":["/**\n * Thin GridStack bootstrap shared by the drag/resize grids (CnDashboardGrid and\n * CnWidgetGrid's editable body slot). Keeps the GridStack option shape in one\n * place so the two engines stay consistent.\n *\n * @module utils/gridStack\n */\n\nimport { GridStack } from 'gridstack'\n// `gridstack` is a peerDependency, not bundled — see the matching comment in\n// CnDashboardGrid.vue. The consumer must install `gridstack` themselves and\n// import its stylesheet (`gridstack/dist/gridstack.min.css`) from that same\n// copy; nc-vue ships no GridStack CSS of its own so the JS driving the grid\n// and the CSS sizing it can never come from two different versions.\n\n/**\n * Initialise a GridStack instance on a `.grid-stack` element.\n *\n * @param {HTMLElement} el The `.grid-stack` container element.\n * @param {object} opts Options.\n * @param {number} opts.columns Column count.\n * @param {boolean} opts.editable Whether drag + resize are enabled.\n * @param {number} [opts.cellHeight] Cell height in px (default 80).\n * @param {number} [opts.margin] Grid margin in px (default 12).\n * @return {import('gridstack').GridStack} The GridStack instance.\n */\nexport function initGridStack(el, opts) {\n\tconst { columns, editable, cellHeight = 80, margin = 12 } = opts\n\treturn GridStack.init({\n\t\tcolumn: columns,\n\t\tcellHeight,\n\t\tmargin,\n\t\tfloat: true,\n\t\tanimate: true,\n\t\tdisableDrag: !editable,\n\t\tdisableResize: !editable,\n\t\tremovable: false,\n\t}, el)\n}\n\n/**\n * Read the geometry GridStack reports for a changed set of items into a plain\n * map keyed by node id.\n *\n * @param {Array<{id: (string|number), x: number, y: number, w: number, h: number}>} items\n * The items GridStack passes to its `change` handler.\n * @return {Map<string, {gridX: number, gridY: number, gridWidth: number, gridHeight: number}>}\n */\nexport function readGridGeometry(items) {\n\tconst map = new Map()\n\tfor (const it of items || []) {\n\t\tmap.set(String(it.id), { gridX: it.x, gridY: it.y, gridWidth: it.w, gridHeight: it.h })\n\t}\n\treturn map\n}\n\n/**\n * Where the items under a growing cell go so they keep their order: every item\n * the growth would overlap moves down by the growth, and so does every item\n * that move would overlap in turn. Items beside the cell stay put.\n *\n * GridStack resolves the same collision itself, but not in order: when\n * pipelinq's size-to-content banner grew from two rows to three, the\n * full-width card under the stat tiles landed below the lists.\n *\n * @spec openspec/changes/dashboard-growth-keeps-order/specs/dashboard-grid/spec.md#requirement-a-growing-cell-keeps-the-order-of-the-cards-under-it\n * @param {Array<{x: number, y: number, w: number, h: number}>} nodes The grid's items (the growing one among them).\n * @param {{x: number, y: number, w: number, h: number}} node The growing item.\n * @param {number} h Its new height, in grid rows.\n * @return {Array<{node: object, y: number}>} The items to move and their new row, bottom-most first.\n */\nexport function planGrowth(nodes, node, h) {\n\tconst delta = h - node.h\n\tif (!(delta > 0)) {\n\t\treturn []\n\t}\n\tconst moved = new Map()\n\tconst overlaps = (a, b) => a.x < b.x + b.w && b.x < a.x + a.w && a.y < b.y + b.h && b.y < a.y + a.h\n\tconst queue = [{ x: node.x, y: node.y, w: node.w, h }]\n\twhile (queue.length > 0) {\n\t\tconst rect = queue.shift()\n\t\tfor (const other of nodes) {\n\t\t\tif (other === node || moved.has(other) || !overlaps(rect, other)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst next = { x: other.x, y: other.y + delta, w: other.w, h: other.h }\n\t\t\tmoved.set(other, next.y)\n\t\t\tqueue.push(next)\n\t\t}\n\t}\n\treturn [...moved.entries()]\n\t\t.map(([item, y]) => ({ node: item, y }))\n\t\t.sort((a, b) => b.y - a.y)\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gridStack.js","sources":["../../../src/utils/gridStack.js"],"sourcesContent":["/**\n * Thin GridStack bootstrap shared by the drag/resize grids (CnDashboardGrid and\n * CnWidgetGrid's editable body slot). Keeps the GridStack option shape in one\n * place so the two engines stay consistent.\n *\n * @module utils/gridStack\n */\n\nimport { GridStack } from 'gridstack'\n// `gridstack` is a peerDependency, not bundled — see the matching comment in\n// CnDashboardGrid.vue. The consumer must install `gridstack` themselves and\n// import its stylesheet (`gridstack/dist/gridstack.min.css`) from that same\n// copy; nc-vue ships no GridStack CSS of its own so the JS driving the grid\n// and the CSS sizing it can never come from two different versions.\n\n/**\n * Initialise a GridStack instance on a `.grid-stack` element.\n *\n * @param {HTMLElement} el The `.grid-stack` container element.\n * @param {object} opts Options.\n * @param {number} opts.columns Column count.\n * @param {boolean} opts.editable Whether drag + resize are enabled.\n * @param {number} [opts.cellHeight] Cell height in px (default 80).\n * @param {number} [opts.margin] Grid margin in px (default 12).\n * @return {import('gridstack').GridStack} The GridStack instance.\n */\nexport function initGridStack(el, opts) {\n\tconst { columns, editable, cellHeight = 80, margin = 12 } = opts\n\treturn GridStack.init({\n\t\tcolumn: columns,\n\t\tcellHeight,\n\t\tmargin,\n\t\tfloat: true,\n\t\tanimate: true,\n\t\tdisableDrag: !editable,\n\t\tdisableResize: !editable,\n\t\tremovable: false,\n\t}, el)\n}\n\n/**\n * Read the geometry GridStack reports for a changed set of items into a plain\n * map keyed by node id.\n *\n * @param {Array<{id: (string|number), x: number, y: number, w: number, h: number}>} items\n * The items GridStack passes to its `change` handler.\n * @return {Map<string, {gridX: number, gridY: number, gridWidth: number, gridHeight: number}>}\n */\nexport function readGridGeometry(items) {\n\tconst map = new Map()\n\tfor (const it of items || []) {\n\t\tmap.set(String(it.id), { gridX: it.x, gridY: it.y, gridWidth: it.w, gridHeight: it.h })\n\t}\n\treturn map\n}\n\n/**\n * Where the items under a growing cell go so they keep their order: every item\n * the growth would overlap moves down by the growth, and so does every item\n * that move would overlap in turn. Items beside the cell stay put.\n *\n * GridStack resolves the same collision itself, but not in order: when\n * pipelinq's size-to-content banner grew from two rows to three, the\n * full-width card under the stat tiles landed below the lists.\n *\n * @spec openspec/changes/dashboard-growth-keeps-order/specs/dashboard-grid/spec.md#requirement-a-growing-cell-keeps-the-order-of-the-cards-under-it\n * The growing item is never among the items it moves, also when `nodes`\n * holds another reference to it (a proxy of the same node, matched by `el`).\n *\n * @param {Array<{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}>} nodes The grid's items (the growing one among them).\n * @param {{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}} node The growing item.\n * @param {number} h Its new height, in grid rows.\n * @return {Array<{node: object, y: number}>} The items to move and their new row, bottom-most first.\n */\nexport function planGrowth(nodes, node, h) {\n\tconst delta = h - node.h\n\tif (!(delta > 0)) {\n\t\treturn []\n\t}\n\tconst moved = new Map()\n\tconst overlaps = (a, b) => a.x < b.x + b.w && b.x < a.x + a.w && a.y < b.y + b.h && b.y < a.y + a.h\n\tconst queue = [{ x: node.x, y: node.y, w: node.w, h }]\n\twhile (queue.length > 0) {\n\t\tconst rect = queue.shift()\n\t\tfor (const other of nodes) {\n\t\t\tconst self = other === node || (node.el && other.el === node.el)\n\t\t\tif (self || moved.has(other) || !overlaps(rect, other)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst next = { x: other.x, y: other.y + delta, w: other.w, h: other.h }\n\t\t\tmoved.set(other, next.y)\n\t\t\tqueue.push(next)\n\t\t}\n\t}\n\treturn [...moved.entries()]\n\t\t.map(([item, y]) => ({ node: item, y }))\n\t\t.sort((a, b) => b.y - a.y)\n}\n"],"names":[],"mappings":"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"}
@@ -307002,8 +307002,11 @@ function readGridGeometry(items) {
307002
307002
  * full-width card under the stat tiles landed below the lists.
307003
307003
  *
307004
307004
  * @spec openspec/changes/dashboard-growth-keeps-order/specs/dashboard-grid/spec.md#requirement-a-growing-cell-keeps-the-order-of-the-cards-under-it
307005
- * @param {Array<{x: number, y: number, w: number, h: number}>} nodes The grid's items (the growing one among them).
307006
- * @param {{x: number, y: number, w: number, h: number}} node The growing item.
307005
+ * The growing item is never among the items it moves, also when `nodes`
307006
+ * holds another reference to it (a proxy of the same node, matched by `el`).
307007
+ *
307008
+ * @param {Array<{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}>} nodes The grid's items (the growing one among them).
307009
+ * @param {{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}} node The growing item.
307007
307010
  * @param {number} h Its new height, in grid rows.
307008
307011
  * @return {Array<{node: object, y: number}>} The items to move and their new row, bottom-most first.
307009
307012
  */
@@ -307018,7 +307021,8 @@ function planGrowth(nodes, node, h) {
307018
307021
  while (queue.length > 0) {
307019
307022
  const rect = queue.shift();
307020
307023
  for (const other of nodes) {
307021
- if (other === node || moved.has(other) || !overlaps(rect, other)) {
307024
+ const self = other === node || (node.el && other.el === node.el);
307025
+ if (self || moved.has(other) || !overlaps(rect, other)) {
307022
307026
  continue
307023
307027
  }
307024
307028
  const next = { x: other.x, y: other.y + delta, w: other.w, h: other.h };
@@ -307642,16 +307646,27 @@ var script$1t = {
307642
307646
  * (`itemsInRowOrder`). A cell that shrinks is left to GridStack as
307643
307647
  * before.
307644
307648
  *
307649
+ * The grid is read raw: through Vue's proxy `engine.nodes` holds proxies
307650
+ * while `el.gridstackNode` is the plain node, so the growing cell would
307651
+ * not be recognised among the nodes and would be moved down by its own
307652
+ * growth. Moving a cell makes GridStack measure it again, so a cell the
307653
+ * wrapper is already growing goes straight to GridStack.
307654
+ *
307645
307655
  * @spec openspec/changes/dashboard-growth-keeps-order/specs/dashboard-grid/spec.md#requirement-a-growing-cell-keeps-the-order-of-the-cards-under-it
307646
307656
  * @return {void}
307647
307657
  */
307648
307658
  keepOrderOnGrowth() {
307649
- const grid = this.grid;
307659
+ const grid = vue$1.toRaw(this.grid);
307650
307660
  if (!grid || typeof grid.resizeToContent !== 'function' || typeof grid.update !== 'function') {
307651
307661
  return
307652
307662
  }
307653
307663
  const resize = grid.resizeToContent.bind(grid);
307664
+ const growing = new Set();
307654
307665
  grid.resizeToContent = (el) => {
307666
+ if (growing.has(el)) {
307667
+ resize(el);
307668
+ return
307669
+ }
307655
307670
  const node = el && el.gridstackNode;
307656
307671
  const nodes = grid.engine && Array.isArray(grid.engine.nodes) ? grid.engine.nodes : null;
307657
307672
  const rows = node && nodes ? this.contentRows(el, node) : null;
@@ -307662,15 +307677,20 @@ var script$1t = {
307662
307677
  }
307663
307678
  // Inside a batch the moves are not packed until the cell has grown.
307664
307679
  const batching = Boolean(grid.engine.batchMode);
307665
- if (!batching) {
307666
- grid.batchUpdate();
307667
- }
307668
- for (const step of plan) {
307669
- grid.update(step.node.el, { y: step.y });
307670
- }
307671
- resize(el);
307672
- if (!batching) {
307673
- grid.batchUpdate(false);
307680
+ growing.add(el);
307681
+ try {
307682
+ if (!batching) {
307683
+ grid.batchUpdate();
307684
+ }
307685
+ for (const step of plan) {
307686
+ grid.update(step.node.el, { y: step.y });
307687
+ }
307688
+ resize(el);
307689
+ if (!batching) {
307690
+ grid.batchUpdate(false);
307691
+ }
307692
+ } finally {
307693
+ growing.delete(el);
307674
307694
  }
307675
307695
  };
307676
307696
  },
@@ -308273,7 +308293,7 @@ function render$1t(_ctx, _cache, $props, $setup, $data, $options) {
308273
308293
  }
308274
308294
 
308275
308295
  script$1t.render = render$1t;
308276
- script$1t.__scopeId = "data-v-a91998fc";
308296
+ script$1t.__scopeId = "data-v-a76b6fc6";
308277
308297
  const __sfc_main$1t = script$1t;
308278
308298
 
308279
308299
  /**
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/dist/nextcloud-vue.cjs.js.map
3
- size: 40766945 bytes
4
- sha256: 4d5c39c1fefeba7aa7f2181f991b71ad3354d5678ea63646f53060e929223d66
3
+ size: 40768932 bytes
4
+ sha256: 5eaf232e7473c7af37c95cfc8b0839550069002fa540192d0ea4b88131fbc06d
@@ -38141,17 +38141,17 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
38141
38141
  }
38142
38142
 
38143
38143
 
38144
- .cn-dashboard-grid[data-v-a91998fc] {
38144
+ .cn-dashboard-grid[data-v-a76b6fc6] {
38145
38145
  width: 100%;
38146
38146
  min-height: 200px;
38147
38147
  }
38148
- .grid-stack[data-v-a91998fc] {
38148
+ .grid-stack[data-v-a76b6fc6] {
38149
38149
  background: transparent;
38150
38150
  }
38151
38151
 
38152
38152
  /* Screen-reader-only text: the keyboard key map and the live region. Kept in
38153
38153
  the layout (not `display: none`) so assistive tech still reads it. */
38154
- .cn-dashboard-grid__sr-only[data-v-a91998fc] {
38154
+ .cn-dashboard-grid__sr-only[data-v-a76b6fc6] {
38155
38155
  position: absolute;
38156
38156
  width: 1px;
38157
38157
  height: 1px;
@@ -38166,7 +38166,7 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
38166
38166
  /* Grid items become tab stops in edit mode — give them a visible focus ring
38167
38167
  that satisfies WCAG 2.1 SC 2.4.7 without relying on the widget's own
38168
38168
  styling. `outline-offset` keeps the ring outside the rounded card. */
38169
- .grid-stack-item[data-v-a91998fc]:focus-visible {
38169
+ .grid-stack-item[data-v-a76b6fc6]:focus-visible {
38170
38170
  outline: 2px solid var(--color-primary-element, #0082c9);
38171
38171
  outline-offset: 2px;
38172
38172
  border-radius: var(--border-radius-container-large, 16px);
@@ -38178,19 +38178,19 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
38178
38178
  cell never shrank: "Waiting for me" stayed a tall card around one row. In
38179
38179
  such a cell the child takes its own height. A cell without the key keeps
38180
38180
  the filling child. */
38181
- .cn-dashboard-grid__item--fit[data-v-a91998fc] > .grid-stack-item-content > * {
38181
+ .cn-dashboard-grid__item--fit[data-v-a76b6fc6] > .grid-stack-item-content > * {
38182
38182
  height: auto;
38183
38183
  }
38184
- [data-v-a91998fc] .grid-stack-item-content {
38184
+ [data-v-a76b6fc6] .grid-stack-item-content {
38185
38185
  background: var(--color-main-background);
38186
38186
  border: none;
38187
38187
  box-shadow: none;
38188
38188
  overflow: hidden;
38189
38189
  }
38190
- [data-v-a91998fc] .grid-stack-item-content:has(.cn-widget-wrapper--borderless) {
38190
+ [data-v-a76b6fc6] .grid-stack-item-content:has(.cn-widget-wrapper--borderless) {
38191
38191
  background: transparent;
38192
38192
  }
38193
- [data-v-a91998fc] .grid-stack-placeholder > .placeholder-content {
38193
+ [data-v-a76b6fc6] .grid-stack-placeholder > .placeholder-content {
38194
38194
  background: var(--color-primary-element-light);
38195
38195
  border: 2px dashed var(--color-primary-element);
38196
38196
  border-radius: var(--border-radius-large);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@conduction/nextcloud-vue",
3
- "version": "2.89.1",
3
+ "version": "2.89.2",
4
4
  "description": "Shared Vue component library for Conduction Nextcloud apps — complements @nextcloud/vue with higher-level components, OpenRegister integration, and NL Design System support",
5
5
  "homepage": "https://github.com/ConductionNL/nextcloud-vue#readme",
6
6
  "bugs": {
@@ -71,6 +71,7 @@
71
71
  <script>
72
72
  import { translate as t } from '@nextcloud/l10n'
73
73
  import { GridStack } from 'gridstack'
74
+ import { toRaw } from 'vue'
74
75
  import { planGrowth } from '../../utils/gridStack.js'
75
76
  // `gridstack` is a peerDependency (see package.json), not bundled — this
76
77
  // component's JS and the consumer's GridStack stylesheet MUST come from the
@@ -683,16 +684,27 @@ export default {
683
684
  * (`itemsInRowOrder`). A cell that shrinks is left to GridStack as
684
685
  * before.
685
686
  *
687
+ * The grid is read raw: through Vue's proxy `engine.nodes` holds proxies
688
+ * while `el.gridstackNode` is the plain node, so the growing cell would
689
+ * not be recognised among the nodes and would be moved down by its own
690
+ * growth. Moving a cell makes GridStack measure it again, so a cell the
691
+ * wrapper is already growing goes straight to GridStack.
692
+ *
686
693
  * @spec openspec/changes/dashboard-growth-keeps-order/specs/dashboard-grid/spec.md#requirement-a-growing-cell-keeps-the-order-of-the-cards-under-it
687
694
  * @return {void}
688
695
  */
689
696
  keepOrderOnGrowth() {
690
- const grid = this.grid
697
+ const grid = toRaw(this.grid)
691
698
  if (!grid || typeof grid.resizeToContent !== 'function' || typeof grid.update !== 'function') {
692
699
  return
693
700
  }
694
701
  const resize = grid.resizeToContent.bind(grid)
702
+ const growing = new Set()
695
703
  grid.resizeToContent = (el) => {
704
+ if (growing.has(el)) {
705
+ resize(el)
706
+ return
707
+ }
696
708
  const node = el && el.gridstackNode
697
709
  const nodes = grid.engine && Array.isArray(grid.engine.nodes) ? grid.engine.nodes : null
698
710
  const rows = node && nodes ? this.contentRows(el, node) : null
@@ -703,15 +715,20 @@ export default {
703
715
  }
704
716
  // Inside a batch the moves are not packed until the cell has grown.
705
717
  const batching = Boolean(grid.engine.batchMode)
706
- if (!batching) {
707
- grid.batchUpdate()
708
- }
709
- for (const step of plan) {
710
- grid.update(step.node.el, { y: step.y })
711
- }
712
- resize(el)
713
- if (!batching) {
714
- grid.batchUpdate(false)
718
+ growing.add(el)
719
+ try {
720
+ if (!batching) {
721
+ grid.batchUpdate()
722
+ }
723
+ for (const step of plan) {
724
+ grid.update(step.node.el, { y: step.y })
725
+ }
726
+ resize(el)
727
+ if (!batching) {
728
+ grid.batchUpdate(false)
729
+ }
730
+ } finally {
731
+ growing.delete(el)
715
732
  }
716
733
  }
717
734
  },
@@ -64,8 +64,11 @@ export function readGridGeometry(items) {
64
64
  * full-width card under the stat tiles landed below the lists.
65
65
  *
66
66
  * @spec openspec/changes/dashboard-growth-keeps-order/specs/dashboard-grid/spec.md#requirement-a-growing-cell-keeps-the-order-of-the-cards-under-it
67
- * @param {Array<{x: number, y: number, w: number, h: number}>} nodes The grid's items (the growing one among them).
68
- * @param {{x: number, y: number, w: number, h: number}} node The growing item.
67
+ * The growing item is never among the items it moves, also when `nodes`
68
+ * holds another reference to it (a proxy of the same node, matched by `el`).
69
+ *
70
+ * @param {Array<{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}>} nodes The grid's items (the growing one among them).
71
+ * @param {{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}} node The growing item.
69
72
  * @param {number} h Its new height, in grid rows.
70
73
  * @return {Array<{node: object, y: number}>} The items to move and their new row, bottom-most first.
71
74
  */
@@ -80,7 +83,8 @@ export function planGrowth(nodes, node, h) {
80
83
  while (queue.length > 0) {
81
84
  const rect = queue.shift()
82
85
  for (const other of nodes) {
83
- if (other === node || moved.has(other) || !overlaps(rect, other)) {
86
+ const self = other === node || (node.el && other.el === node.el)
87
+ if (self || moved.has(other) || !overlaps(rect, other)) {
84
88
  continue
85
89
  }
86
90
  const next = { x: other.x, y: other.y + delta, w: other.w, h: other.h }