@aquera/nile-elements 1.1.3-beta-1.4 → 1.1.3-beta-2.1

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.
Files changed (111) hide show
  1. package/demo/index.html +124 -24
  2. package/dist/index.js +729 -770
  3. package/dist/nile-grid/nile-grid.cjs.js +1 -1
  4. package/dist/nile-grid/nile-grid.cjs.js.map +1 -1
  5. package/dist/nile-grid/nile-grid.css.cjs.js +1 -1
  6. package/dist/nile-grid/nile-grid.css.cjs.js.map +1 -1
  7. package/dist/nile-grid/nile-grid.css.esm.js +4 -8
  8. package/dist/nile-grid/nile-grid.esm.js +6 -6
  9. package/dist/nile-grid/nile-grid.utils.cjs.js +1 -1
  10. package/dist/nile-grid/nile-grid.utils.cjs.js.map +1 -1
  11. package/dist/nile-grid/nile-grid.utils.esm.js +1 -1
  12. package/dist/nile-grid-body/nile-grid-body.cjs.js +1 -1
  13. package/dist/nile-grid-body/nile-grid-body.cjs.js.map +1 -1
  14. package/dist/nile-grid-body/nile-grid-body.css.cjs.js +1 -1
  15. package/dist/nile-grid-body/nile-grid-body.css.cjs.js.map +1 -1
  16. package/dist/nile-grid-body/nile-grid-body.css.esm.js +4 -0
  17. package/dist/nile-grid-body/nile-grid-body.esm.js +3 -3
  18. package/dist/nile-grid-cell-item/nile-grid-cell-item.cjs.js +1 -1
  19. package/dist/nile-grid-cell-item/nile-grid-cell-item.cjs.js.map +1 -1
  20. package/dist/nile-grid-cell-item/nile-grid-cell-item.css.cjs.js +1 -1
  21. package/dist/nile-grid-cell-item/nile-grid-cell-item.css.cjs.js.map +1 -1
  22. package/dist/nile-grid-cell-item/nile-grid-cell-item.css.esm.js +3 -18
  23. package/dist/nile-grid-cell-item/nile-grid-cell-item.esm.js +3 -3
  24. package/dist/nile-grid-head/nile-grid-head.cjs.js +1 -1
  25. package/dist/nile-grid-head/nile-grid-head.cjs.js.map +1 -1
  26. package/dist/nile-grid-head/nile-grid-head.css.cjs.js +1 -1
  27. package/dist/nile-grid-head/nile-grid-head.css.cjs.js.map +1 -1
  28. package/dist/nile-grid-head/nile-grid-head.css.esm.js +1 -1
  29. package/dist/nile-grid-head/nile-grid-head.esm.js +3 -3
  30. package/dist/nile-grid-head-item/nile-grid-head-item.cjs.js +1 -1
  31. package/dist/nile-grid-head-item/nile-grid-head-item.cjs.js.map +1 -1
  32. package/dist/nile-grid-head-item/nile-grid-head-item.css.cjs.js +1 -1
  33. package/dist/nile-grid-head-item/nile-grid-head-item.css.cjs.js.map +1 -1
  34. package/dist/nile-grid-head-item/nile-grid-head-item.css.esm.js +5 -20
  35. package/dist/nile-grid-head-item/nile-grid-head-item.esm.js +3 -4
  36. package/dist/nile-grid-row/nile-grid-row.cjs.js +1 -1
  37. package/dist/nile-grid-row/nile-grid-row.cjs.js.map +1 -1
  38. package/dist/nile-grid-row/nile-grid-row.css.cjs.js +1 -1
  39. package/dist/nile-grid-row/nile-grid-row.css.cjs.js.map +1 -1
  40. package/dist/nile-grid-row/nile-grid-row.css.esm.js +5 -17
  41. package/dist/nile-grid-row/nile-grid-row.esm.js +5 -4
  42. package/dist/nile-select/nile-select.cjs.js +1 -1
  43. package/dist/nile-select/nile-select.cjs.js.map +1 -1
  44. package/dist/nile-select/nile-select.esm.js +2 -2
  45. package/dist/nile-select/virtual-scroll-helper.cjs.js +1 -1
  46. package/dist/nile-select/virtual-scroll-helper.cjs.js.map +1 -1
  47. package/dist/nile-select/virtual-scroll-helper.esm.js +1 -0
  48. package/dist/nile-virtual-select/nile-virtual-select.cjs.js +2 -2
  49. package/dist/nile-virtual-select/nile-virtual-select.cjs.js.map +1 -1
  50. package/dist/nile-virtual-select/nile-virtual-select.esm.js +7 -6
  51. package/dist/src/nile-grid/nile-grid.css.js +2 -6
  52. package/dist/src/nile-grid/nile-grid.css.js.map +1 -1
  53. package/dist/src/nile-grid/nile-grid.d.ts +3 -9
  54. package/dist/src/nile-grid/nile-grid.js +20 -96
  55. package/dist/src/nile-grid/nile-grid.js.map +1 -1
  56. package/dist/src/nile-grid/nile-grid.utils.d.ts +2 -3
  57. package/dist/src/nile-grid/nile-grid.utils.js +81 -223
  58. package/dist/src/nile-grid/nile-grid.utils.js.map +1 -1
  59. package/dist/src/nile-grid-body/nile-grid-body.css.js +4 -0
  60. package/dist/src/nile-grid-body/nile-grid-body.css.js.map +1 -1
  61. package/dist/src/nile-grid-body/nile-grid-body.js +1 -1
  62. package/dist/src/nile-grid-body/nile-grid-body.js.map +1 -1
  63. package/dist/src/nile-grid-cell-item/nile-grid-cell-item.css.js +2 -17
  64. package/dist/src/nile-grid-cell-item/nile-grid-cell-item.css.js.map +1 -1
  65. package/dist/src/nile-grid-cell-item/nile-grid-cell-item.d.ts +3 -0
  66. package/dist/src/nile-grid-cell-item/nile-grid-cell-item.js +11 -1
  67. package/dist/src/nile-grid-cell-item/nile-grid-cell-item.js.map +1 -1
  68. package/dist/src/nile-grid-head/nile-grid-head.css.js +1 -1
  69. package/dist/src/nile-grid-head/nile-grid-head.css.js.map +1 -1
  70. package/dist/src/nile-grid-head/nile-grid-head.js +1 -1
  71. package/dist/src/nile-grid-head/nile-grid-head.js.map +1 -1
  72. package/dist/src/nile-grid-head-item/nile-grid-head-item.css.js +3 -18
  73. package/dist/src/nile-grid-head-item/nile-grid-head-item.css.js.map +1 -1
  74. package/dist/src/nile-grid-head-item/nile-grid-head-item.d.ts +2 -3
  75. package/dist/src/nile-grid-head-item/nile-grid-head-item.js +11 -14
  76. package/dist/src/nile-grid-head-item/nile-grid-head-item.js.map +1 -1
  77. package/dist/src/nile-grid-row/nile-grid-row.css.js +5 -17
  78. package/dist/src/nile-grid-row/nile-grid-row.css.js.map +1 -1
  79. package/dist/src/nile-grid-row/nile-grid-row.d.ts +1 -4
  80. package/dist/src/nile-grid-row/nile-grid-row.js +4 -19
  81. package/dist/src/nile-grid-row/nile-grid-row.js.map +1 -1
  82. package/dist/src/nile-select/nile-select.d.ts +1 -0
  83. package/dist/src/nile-select/nile-select.js +4 -0
  84. package/dist/src/nile-select/nile-select.js.map +1 -1
  85. package/dist/src/nile-select/virtual-scroll-helper.js +1 -0
  86. package/dist/src/nile-select/virtual-scroll-helper.js.map +1 -1
  87. package/dist/src/nile-virtual-select/nile-virtual-select.d.ts +18 -0
  88. package/dist/src/nile-virtual-select/nile-virtual-select.js +230 -3
  89. package/dist/src/nile-virtual-select/nile-virtual-select.js.map +1 -1
  90. package/dist/src/version.js +1 -1
  91. package/dist/src/version.js.map +1 -1
  92. package/dist/tsconfig.tsbuildinfo +1 -1
  93. package/package.json +1 -1
  94. package/src/nile-grid/nile-grid.css.ts +2 -6
  95. package/src/nile-grid/nile-grid.ts +21 -124
  96. package/src/nile-grid/nile-grid.utils.ts +98 -353
  97. package/src/nile-grid-body/nile-grid-body.css.ts +4 -0
  98. package/src/nile-grid-body/nile-grid-body.ts +2 -2
  99. package/src/nile-grid-cell-item/nile-grid-cell-item.css.ts +2 -17
  100. package/src/nile-grid-cell-item/nile-grid-cell-item.ts +11 -3
  101. package/src/nile-grid-head/nile-grid-head.css.ts +1 -1
  102. package/src/nile-grid-head/nile-grid-head.ts +2 -2
  103. package/src/nile-grid-head-item/nile-grid-head-item.css.ts +3 -18
  104. package/src/nile-grid-head-item/nile-grid-head-item.ts +16 -8
  105. package/src/nile-grid-row/nile-grid-row.css.ts +5 -17
  106. package/src/nile-grid-row/nile-grid-row.ts +6 -9
  107. package/src/nile-select/nile-select.ts +2 -0
  108. package/src/nile-select/virtual-scroll-helper.ts +1 -0
  109. package/src/nile-virtual-select/nile-virtual-select.ts +257 -3
  110. package/vscode-html-custom-data.json +75 -38
  111. package/src/nile-grid/nile-grid.types.ts +0 -1
@@ -1,39 +1,41 @@
1
1
  import { NileGrid } from './nile-grid';
2
- import { HeadItemEl } from './nile-grid.types';
3
2
 
4
3
  export const resizeLinesHandler = (
5
- resizeStart: HTMLElement,
6
- resizeEnd: HTMLElement,
4
+ resizeStart: any,
5
+ resizeEnd: any,
7
6
  col: number,
8
- scrollHeight: number,
9
- columnWidths: number[],
7
+ widthPx: number,
8
+ scrollHeight: any,
9
+ columnWidths: any,
10
+ e: any
10
11
  ) => {
11
12
  resizeStart.style.display = 'block';
12
13
  resizeEnd.style.display = 'block';
13
14
  resizeStart.style.height = scrollHeight + 'px';
14
15
  resizeEnd.style.height = scrollHeight + 'px';
15
- const floor = 60;
16
- const safe = (n: number) => Math.max(0, Math.round(n || 0));
17
-
18
- const sum = (arr: number[], endExclusive: number) =>
19
- safe(
20
- arr.slice(0, Math.max(0, endExclusive)).reduce((a, b) => a + (b || 0), 0)
21
- );
22
-
23
- const totalGridWidth = safe(columnWidths.reduce((a, b) => a + (b || 0), 0));
24
- const baseLeft = sum(columnWidths, col);
25
- const appliedColWidth = safe(Math.max(floor, columnWidths[col] ?? floor));
26
- let handleLeft = baseLeft + appliedColWidth;
27
-
28
- const minEdge = baseLeft + floor;
29
- const maxEdge = totalGridWidth;
30
- handleLeft = Math.min(Math.max(handleLeft, minEdge), maxEdge);
31
-
32
- resizeStart.style.left = `${handleLeft - 6}px`;
33
- resizeEnd.style.left = `${handleLeft - 2}px`;
16
+ if (col === 0) {
17
+ resizeStart.style.left = `${Math.max(60, widthPx) - 6}px`;
18
+ resizeEnd.style.left = `${Math.max(60, widthPx) - 2}px`;
19
+ } else {
20
+ let totalWidth = 0;
21
+ if (
22
+ (e.target as HTMLElement).getAttribute('colspan') &&
23
+ parseInt((e.target as HTMLElement).getAttribute('colspan')!) > 1
24
+ ) {
25
+ widthPx = widthPx - columnWidths[col - 1];
26
+ for (let i = 0; i < col; i++) {
27
+ totalWidth += columnWidths[i];
28
+ }
29
+ } else {
30
+ for (let i = 0; i < col; i++) {
31
+ totalWidth += columnWidths[i];
32
+ }
33
+ }
34
+ resizeStart.style.left = `${totalWidth + Math.max(60, widthPx) - 6}px`;
35
+ resizeEnd.style.left = `${totalWidth + Math.max(60, widthPx) - 2}px`;
36
+ }
34
37
  };
35
38
 
36
-
37
39
  export const listenToEventListeners = (
38
40
  nileGrid: NileGrid,
39
41
  onResize: any,
@@ -111,280 +113,108 @@ export const applyTemplate = (
111
113
  if (head) head.style.gridTemplateColumns = colTemplate;
112
114
  if (body) {
113
115
  body.style.gridTemplateColumns = colTemplate;
116
+ body.style.overflowX = 'auto';
114
117
  }
115
118
  };
116
119
 
117
- function layoutRows(
118
- rows: HTMLElement[],
119
- carry: number[],
120
- colCount: number,
121
- stickyLeftIndexes: number[],
122
- stickyRightIndexes: number[],
123
- columnWidths: number[],
124
- opts: {
125
- itemSelector: string;
126
- useStickyAttr?: boolean;
127
- handleRowBg?: boolean;
128
- }
120
+ function computeHeadLayout(
121
+ headRows: HTMLElement[],
122
+ carryHead: number[],
123
+ colCount: number
129
124
  ): number {
130
- rows.forEach((row, rIdx) => {
125
+ headRows.forEach((row, rIdx) => {
131
126
  let c = 1;
127
+ const cells = Array.from(
128
+ row.querySelectorAll('nile-grid-head-item, nile-grid-cell')
129
+ ) as HTMLElement[];
132
130
  const rStart = rIdx + 1;
133
- let maxRowspan = 1;
134
-
135
- let bg: HTMLElement | null = null;
136
- if (opts.handleRowBg) {
137
- bg = row.shadowRoot?.querySelector<HTMLElement>('[data-row-bg]') ?? null;
138
- if (bg) bg.style.gridColumn = `1 / -1`;
139
- }
140
131
 
141
- const items = Array.from(
142
- row.querySelectorAll(opts.itemSelector)
143
- ) as HTMLElement[];
132
+ cells.forEach(cell => {
133
+ while (carryHead[c - 1] > 0) c++;
134
+ const colspan = Math.max(1, Number(cell.getAttribute('colspan')) || 1);
135
+ const rowspan = Math.max(1, Number(cell.getAttribute('rowspan')) || 1);
144
136
 
145
- items.forEach((el) => {
146
- while ((carry[c - 1] || 0) > 0) c++;
137
+ const cStart = c,
138
+ cEnd = c + colspan;
139
+ const rEnd = rStart + rowspan;
147
140
 
148
- const colspan = Math.max(1, Number(el.getAttribute('colspan')) || 1);
149
- const rowspan = Math.max(1, Number(el.getAttribute('rowspan')) || 1);
141
+ cell.style.gridColumn = `${cStart} / ${cEnd}`;
142
+ cell.style.gridRow = `${rStart} / ${rEnd}`;
143
+ (cell as any).dataset.cStart = String(cStart);
150
144
 
151
- if (rowspan > 1) {
152
- el.style.position = "absolute";
153
- el.style.height = `${
154
- 50 * rowspan
155
- }px`;
156
- el.style.zIndex = "1";
145
+ for (let k = 0; k < colspan; k++) {
146
+ const idx = c - 1 + k;
147
+ carryHead[idx] = Math.max(carryHead[idx] || 0, rowspan);
157
148
  }
149
+ c = cEnd;
150
+ colCount = Math.max(colCount, cEnd - 1);
151
+ });
158
152
 
159
- const cStart = c;
160
- const cEnd = c + colspan;
161
- const rEnd = rStart + rowspan;
153
+ for (let i = 0; i < carryHead.length; i++)
154
+ if (carryHead[i] > 0) carryHead[i]--;
155
+ });
156
+ return colCount;
157
+ }
162
158
 
163
- el.style.gridColumn = `${cStart} / ${cEnd}`;
164
- el.style.gridRow = `${rStart} / ${rEnd}`;
165
- (el as any).dataset.cStart = String(cStart);
159
+ function computeBodyLayout(
160
+ bodyRows: HTMLElement[],
161
+ carryBody: number[],
162
+ colCount: number
163
+ ) {
164
+ bodyRows.forEach((row, rIdx) => {
165
+ let c = 1;
166
+ const cells = Array.from(
167
+ row.querySelectorAll('nile-grid-cell, nile-grid-header')
168
+ ) as HTMLElement[];
169
+ const rStart = rIdx + 1;
170
+ let maxRowspan = 1;
166
171
 
167
- if (opts.useStickyAttr && el.hasAttribute('colSticky')) {
168
- stickyLeftIndexes.push(cStart - 1);
169
- }
172
+ const bg = row.shadowRoot?.querySelector<HTMLElement>('[data-row-bg]');
173
+ if (bg) bg.style.gridColumn = `1 / -1`;
170
174
 
171
- if (opts.useStickyAttr && el.hasAttribute('lastColSticky')) {
172
- stickyRightIndexes.push(cStart - 1);
173
- }
175
+ cells.forEach(cell => {
176
+ while (carryBody[c - 1] > 0) c++;
177
+ const colspan = Math.max(1, Number(cell.getAttribute('colspan')) || 1);
178
+ const rowspan = Math.max(1, Number(cell.getAttribute('rowspan')) || 1);
179
+
180
+ const cStart = c,
181
+ cEnd = c + colspan;
182
+ const rEnd = rStart + rowspan;
174
183
 
175
- applySticky(el, cStart - 1, stickyLeftIndexes, stickyRightIndexes, columnWidths);
184
+ cell.style.gridColumn = `${cStart} / ${cEnd}`;
185
+ cell.style.gridRow = `${rStart} / ${rEnd}`;
186
+ (cell as any).dataset.cStart = String(cStart);
176
187
 
177
188
  for (let k = 0; k < colspan; k++) {
178
189
  const idx = c - 1 + k;
179
- carry[idx] = Math.max(carry[idx] || 0, rowspan);
190
+ carryBody[idx] = Math.max(carryBody[idx] || 0, rowspan);
180
191
  }
181
-
182
192
  maxRowspan = Math.max(maxRowspan, rowspan);
183
193
  c = cEnd;
184
194
  colCount = Math.max(colCount, cEnd - 1);
185
195
  });
186
196
 
187
- if (opts.handleRowBg && bg) {
197
+ if (bg) {
188
198
  const rEnd = rStart + maxRowspan;
189
199
  bg.style.gridRow = `${rStart} / ${rEnd}`;
190
200
  }
191
201
 
192
- for (let i = 0; i < carry.length; i++) {
193
- if (carry[i] > 0) carry[i]--;
194
- }
202
+ for (let i = 0; i < carryBody.length; i++)
203
+ if (carryBody[i] > 0) carryBody[i]--;
195
204
  });
196
205
 
197
206
  return colCount;
198
207
  }
199
208
 
200
- function computeHeadLayout(
201
- headRows: HTMLElement[],
202
- carryHead: number[],
203
- colCount: number,
204
- stickyLeftIndexes: number[],
205
- stickyRightIndexes: number[],
206
- columnWidths: number[]
207
- ): number {
208
- return layoutRows(
209
- headRows,
210
- carryHead,
211
- colCount,
212
- stickyLeftIndexes,
213
- stickyRightIndexes,
214
- columnWidths,
215
- {
216
- itemSelector: 'nile-grid-head-item',
217
- useStickyAttr: true,
218
- handleRowBg: false,
219
- }
220
- );
221
- }
222
-
223
- function computeBodyLayout(
224
- bodyRows: HTMLElement[],
225
- carryBody: number[],
226
- colCount: number,
227
- stickyLeftIndexes: number[],
228
- stickyRightIndexes: number[],
229
- columnWidths: number[]
230
- ): number {
231
- return layoutRows(
232
- bodyRows,
233
- carryBody,
234
- colCount,
235
- stickyLeftIndexes,
236
- stickyRightIndexes,
237
- columnWidths,
238
- {
239
- itemSelector: 'nile-grid-cell-item',
240
- useStickyAttr: false,
241
- handleRowBg: true,
242
- }
243
- );
244
- }
245
-
246
209
  function computeColumnWidths(
247
210
  nileGrid: NileGrid,
248
211
  colCount: number,
249
- columnWidths: number[],
250
- slotEl: any
212
+ columnWidths: number[]
251
213
  ) {
252
- const minCol = 60;
253
- const containerWidth = getContainerWidth(nileGrid);
254
-
255
- const desired = readDesiredFromHead(slotEl, colCount);
256
- const isSeeded = seedWidthsFromDesired(desired, columnWidths, minCol);
257
-
258
- distributeFlex(columnWidths, isSeeded, containerWidth, minCol);
259
-
260
- normalizeToContainer(columnWidths, containerWidth, minCol);
261
-
262
- clampAndRound(columnWidths, minCol);
263
- applyColumnsTemplate(nileGrid, columnWidths, slotEl);
264
- }
265
-
266
-
267
- function getContainerWidth(nileGrid: NileGrid): number {
268
- return Math.max(0, (nileGrid.getBoundingClientRect().width || 0) - 4);
269
- }
270
-
271
- function readDesiredFromHead(slotEl: any, colCount: number): (number | null)[] {
272
- const desired: (number | null)[] = Array(colCount).fill(null);
273
- const head = getHead(slotEl) as HTMLElement | null;
274
- if (!head) return desired;
275
-
276
- const headRows = Array.from(head.children).filter(
277
- el => el.tagName.toLowerCase() === 'nile-grid-row'
278
- ) as HTMLElement[];
279
-
280
- for (const row of headRows) {
281
- const items = Array.from(row.children).filter(
282
- el => el.tagName.toLowerCase() === 'nile-grid-head-item'
283
- ) as Array<HeadItemEl>;
284
-
285
- items
286
- .map(h => {
287
- const cStart = Number((h as any).dataset?.cStart) || 1;
288
- const colspan = Math.max(1, Number(h.getAttribute('colspan')) || 1);
289
- const attr = h.getAttribute('customWidth');
290
- const cw = attr != null ? Number(attr) : (h as any).customWidth ?? null;
291
- return { cStart, colspan, cw };
292
- })
293
- .filter(x => x.cw != null && !Number.isNaN(x.cw!))
294
- .sort((a, b) => {
295
- return a.colspan - b.colspan;
296
- })
297
- .forEach(({ cStart, colspan, cw }) => {
298
- const perCol = (cw as number) / colspan;
299
- for (let k = 0; k < colspan; k++) {
300
- const idx = cStart - 1 + k;
301
- if (idx >= 0 && idx < colCount && desired[idx] == null) {
302
- desired[idx] = perCol;
303
- }
304
- }
305
- });
306
- }
307
- return desired;
308
- }
309
-
310
- function seedWidthsFromDesired(
311
- desired: (number | null)[],
312
- columnWidths: number[],
313
- minCol: number
314
- ): boolean[] {
315
- const isSeeded = Array(desired.length).fill(false);
316
- for (let i = 0; i < desired.length; i++) {
317
- const w = desired[i] ?? null;
318
- columnWidths[i] =
319
- w != null && !Number.isNaN(w) ? Math.max(minCol, Number(w)) : 0;
320
- isSeeded[i] = w != null && !Number.isNaN(w);
321
- }
322
- return isSeeded;
323
- }
324
-
325
- function distributeFlex(
326
- columnWidths: number[],
327
- isSeeded: boolean[],
328
- containerWidth: number,
329
- minCol: number
330
- ) {
331
- const sumSeed = columnWidths.reduce((a, b) => a + b, 0);
332
- const remaining = containerWidth - sumSeed;
333
- const flexIdxs = Array.from(
334
- { length: columnWidths.length },
335
- (_, i) => i
336
- ).filter(i => !isSeeded[i]);
337
- if (flexIdxs.length === 0) return;
338
-
339
- const each = remaining / flexIdxs.length;
340
- for (const i of flexIdxs) columnWidths[i] = Math.max(minCol, each);
341
- }
342
-
343
- function normalizeToContainer(
344
- columnWidths: number[],
345
- containerWidth: number,
346
- minCol: number
347
- ) {
348
- let total = columnWidths.reduce((a, b) => a + b, 0);
349
-
350
- if (total < containerWidth && columnWidths.length > 0) {
351
- const add = containerWidth - total;
352
- const weight = total || 1;
353
- for (let i = 0; i < columnWidths.length; i++) {
354
- columnWidths[i] += add * (columnWidths[i] / weight);
355
- }
356
- } else if (total > containerWidth) {
357
- let need = total - containerWidth;
358
-
359
- for (let iter = 0; iter < 8 && need > 0.5; iter++) {
360
- let weightSum = 0;
361
- const candidates: number[] = [];
362
- for (let i = 0; i < columnWidths.length; i++) {
363
- const reducible = Math.max(0, columnWidths[i] - minCol);
364
- if (reducible > 0) {
365
- candidates.push(i);
366
- weightSum += columnWidths[i];
367
- }
368
- }
369
- if (candidates.length === 0 || weightSum <= 0) break;
370
-
371
- let reduced = 0;
372
- for (const i of candidates) {
373
- const reducible = Math.max(0, columnWidths[i] - minCol);
374
- const share = columnWidths[i] / weightSum;
375
- const cut = Math.min(reducible, need * share);
376
- columnWidths[i] -= cut;
377
- reduced += cut;
378
- }
379
- need -= reduced;
380
- if (reduced < 0.5) break;
381
- }
382
- }
383
- }
384
-
385
- function clampAndRound(columnWidths: number[], minCol: number) {
386
- for (let i = 0; i < columnWidths.length; i++) {
387
- columnWidths[i] = Math.max(minCol, Math.round(columnWidths[i]));
214
+ for (let col = 0; col < colCount; col++) {
215
+ const containerWidth = (nileGrid.getBoundingClientRect().width || 1) - 2;
216
+ columnWidths[col] =
217
+ nileGrid.customWidths[col] || containerWidth / Math.max(colCount, 1);
388
218
  }
389
219
  }
390
220
 
@@ -394,8 +224,7 @@ export const layout = (
394
224
  ensureWidths: any,
395
225
  rebuildTemplate: any,
396
226
  applyTemplate: any,
397
- stickyLeftIndexes: number[],
398
- stickyRightIndexes: number[]
227
+ columnWidths: any
399
228
  ) => {
400
229
  const head = getHead(slotEl);
401
230
  const body = getBody(slotEl);
@@ -410,98 +239,14 @@ export const layout = (
410
239
 
411
240
  let colCount = 0;
412
241
 
413
- colCount = computeHeadLayout(
414
- headRows,
415
- [],
416
- colCount,
417
- stickyLeftIndexes,
418
- stickyRightIndexes,
419
- nileGrid.columnWidths
420
- );
421
- colCount = computeBodyLayout(
422
- bodyRows,
423
- [],
424
- colCount,
425
- stickyLeftIndexes,
426
- stickyRightIndexes,
427
- nileGrid.columnWidths
428
- );
429
- computeColumnWidths(nileGrid, colCount, nileGrid.columnWidths, slotEl);
242
+ colCount = computeHeadLayout(headRows, [], colCount);
243
+ colCount = computeBodyLayout(bodyRows, [], colCount);
244
+
245
+ computeColumnWidths(nileGrid, colCount, columnWidths);
430
246
 
431
247
  ensureWidths(colCount);
432
248
  body.style.gridAutoRows = 'auto';
433
- nileGrid.colTemplate = rebuildTemplate(colCount, nileGrid.columnWidths);
249
+ body.style.overflowY = 'auto';
250
+ nileGrid.colTemplate = rebuildTemplate(colCount, columnWidths);
434
251
  applyTemplate(head, body, nileGrid.colTemplate, nileGrid.colTemplate);
435
252
  };
436
-
437
- function applySticky(
438
- el: HTMLElement,
439
- colIndex: number,
440
- stickyLeftIndexes: number[],
441
- stickyRightIndexes: number[],
442
- columnWidths: number[]
443
- ) {
444
- const onLeft = stickyLeftIndexes.includes(colIndex);
445
- const onRight = stickyRightIndexes.includes(colIndex);
446
-
447
- if (!onLeft && !onRight) return;
448
-
449
- el.style.position = 'sticky';
450
- el.style.zIndex = '2';
451
-
452
- if (onLeft && !onRight) {
453
- const leftOrder = [...stickyLeftIndexes].sort((a, b) => a - b);
454
- const pos = leftOrder.indexOf(colIndex);
455
- let left = 0;
456
- for (let i = 0; i < pos; i++) left += columnWidths[leftOrder[i]] ?? 0;
457
- el.style.left = `${left}px`;
458
- return;
459
- }
460
-
461
- const rightOrder = [...stickyRightIndexes].sort((a, b) => b - a);
462
- const pos = rightOrder.indexOf(colIndex);
463
-
464
- const scroller = el.closest('nile-grid') as HTMLElement | null;
465
- const sb = scroller ? scroller.offsetWidth - scroller.clientWidth : 0;
466
-
467
- let right = sb;
468
- for (let i = 0; i < pos; i++) right += columnWidths[rightOrder[i]] ?? 0;
469
-
470
- el.style.right = `${right - 2}px`;
471
- }
472
-
473
-
474
- export function applyColumnsTemplate(
475
- nileGrid: HTMLElement,
476
- columnWidths: number[],
477
- slotEl: HTMLElement
478
- ) {
479
- const cols = columnWidths
480
- .map((w, idx) => {
481
- if (idx === columnWidths.length - 1) {
482
- return `minmax(${Math.round(w)}px, auto)`;
483
- }
484
- return `${Math.max(0, Math.round(w))}px`;
485
- })
486
- .join(' ');
487
- nileGrid.style.setProperty('--nile-grid-columns', cols);
488
-
489
- const head = slotEl.querySelector('nile-grid-head') as HTMLElement | null;
490
- if (head) {
491
- head.style.setProperty('--nile-grid-columns', cols);
492
- head
493
- .querySelectorAll('nile-grid-row')
494
- .forEach(r =>
495
- (r as HTMLElement).style.setProperty('--nile-grid-columns', cols)
496
- );
497
- }
498
- const body = slotEl.querySelector('nile-grid-body') as HTMLElement | null;
499
- if (body) {
500
- body.style.setProperty('--nile-grid-columns', cols);
501
- body
502
- .querySelectorAll('nile-grid-row')
503
- .forEach(r =>
504
- (r as HTMLElement).style.setProperty('--nile-grid-columns', cols)
505
- );
506
- }
507
- }
@@ -12,8 +12,12 @@ import { css } from 'lit';
12
12
  */
13
13
  export const styles = css`
14
14
  :host {
15
+ display: grid;
16
+ overflow-y: auto;
17
+ overflow-x: visible;
15
18
  box-sizing: border-box;
16
19
  background-color: var(--nile-colors-white-base);
20
+ height: 100%;
17
21
  }
18
22
  `;
19
23
 
@@ -5,7 +5,7 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import { html, CSSResultArray, TemplateResult } from 'lit';
8
+ import { LitElement, html, CSSResultArray, TemplateResult } from 'lit';
9
9
  import { customElement } from 'lit/decorators.js';
10
10
  import { styles } from './nile-grid-body.css';
11
11
  import NileElement from '../internal/nile-element';
@@ -33,7 +33,7 @@ export class NileGridBody extends NileElement {
33
33
 
34
34
  public render(): TemplateResult {
35
35
  return html`
36
- <div part="grid-body-base">
36
+ <div style="display: contents;">
37
37
  <slot></slot>
38
38
  </div>
39
39
  `;
@@ -22,17 +22,8 @@ export const styles = css`
22
22
  padding: var(--padding);
23
23
  height: auto;
24
24
  border-bottom: 1px solid var(--nile-colors-neutral-400);
25
- font-size: 14px;
26
- font-weight: 400;
27
- font-family: var(--nile-font-weight-regular);
28
- background-color: #FFFFFF;
29
- min-height: 44px;
30
- }
31
-
32
- .cell-item-base {
33
- width: 100%;
34
- overflow: hidden;
35
- text-overflow: ellipsis;
25
+ border-right: 1px solid var(--nile-colors-neutral-400);
26
+ position: relative;
36
27
  }
37
28
 
38
29
  ::slotted(*) {
@@ -42,11 +33,6 @@ export const styles = css`
42
33
  width: min-content;
43
34
  }
44
35
 
45
- :host(:last-child) .resize-handle {
46
- border-right: none;
47
- display: none;
48
- }
49
-
50
36
  .resize-handle {
51
37
  position: absolute;
52
38
  top: 0;
@@ -57,7 +43,6 @@ export const styles = css`
57
43
  z-index: 1;
58
44
  width: 2px;
59
45
  border-right: 1px solid var(--nile-colors-neutral-400);
60
- display: none;
61
46
  }
62
47
  `;
63
48
 
@@ -5,7 +5,7 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import { html, CSSResultArray, TemplateResult } from 'lit';
8
+ import { LitElement, html, CSSResultArray, TemplateResult } from 'lit';
9
9
  import { customElement, property } from 'lit/decorators.js';
10
10
  import { styles } from './nile-grid-cell-item.css';
11
11
  import NileElement from '../internal/nile-element';
@@ -33,7 +33,16 @@ export class NileGridCellItem extends NileElement {
33
33
 
34
34
  @property({ type: Number, reflect: true, attribute: true }) colspan = 1;
35
35
  @property({ type: Number, reflect: true, attribute: true }) rowspan = 1;
36
+ @property({ type: String, reflect: true, attribute: true }) align?:
37
+ | 'start'
38
+ | 'center'
39
+ | 'end';
40
+ @property({ type: String, reflect: true, attribute: true }) valign?:
41
+ | 'top'
42
+ | 'middle'
43
+ | 'bottom';
36
44
  @property({ type: Boolean, reflect: true, attribute: true }) resizable = false;
45
+ @property({ type: Boolean, reflect: true, attribute: true }) textOverflowType: 'ellipsis' | 'clip' = 'ellipsis';
37
46
 
38
47
  connectedCallback() {
39
48
  super.connectedCallback();
@@ -41,7 +50,6 @@ export class NileGridCellItem extends NileElement {
41
50
  }
42
51
 
43
52
  private onHandlePointerDown = (ev: PointerEvent) => {
44
-
45
53
  const el = this as HTMLElement;
46
54
 
47
55
  const downXRef = { value: 0 };
@@ -63,7 +71,7 @@ export class NileGridCellItem extends NileElement {
63
71
 
64
72
  public render(): TemplateResult {
65
73
  return html`
66
- <div class="cell-item-base" part="cell-item-base">
74
+ <div style="display: contents;">
67
75
  <slot></slot>
68
76
  ${this.resizable
69
77
  ? html`
@@ -13,7 +13,7 @@ import { css } from 'lit';
13
13
  export const styles = css`
14
14
  :host([sticky]) {
15
15
  position: sticky;
16
- z-index: 4;
16
+ z-index: 2;
17
17
  top: 0;
18
18
  }
19
19
  `;
@@ -5,7 +5,7 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import { html, CSSResultArray, TemplateResult } from 'lit';
8
+ import { LitElement, html, CSSResultArray, TemplateResult } from 'lit';
9
9
  import { customElement } from 'lit/decorators.js';
10
10
  import { styles } from './nile-grid-head.css';
11
11
  import NileElement from '../internal/nile-element';
@@ -32,7 +32,7 @@ export class NileGridHead extends NileElement {
32
32
 
33
33
  public render(): TemplateResult {
34
34
  return html`
35
- <div part="grid-head-base">
35
+ <div style="display: contents;">
36
36
  <slot></slot>
37
37
  </div>
38
38
  `;