@nanoporetech-digital/components 3.0.0 → 3.1.0

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 (171) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/index-41582c2a.js +8 -4
  3. package/dist/cjs/loader.cjs.js +1 -1
  4. package/dist/cjs/nano-checkbox-group.cjs.entry.js +12 -3
  5. package/dist/cjs/nano-checkbox-group.cjs.entry.js.map +1 -1
  6. package/dist/cjs/nano-components.cjs.js +1 -1
  7. package/dist/cjs/nano-details.cjs.entry.js +1 -1
  8. package/dist/cjs/nano-field-validator.cjs.entry.js +2 -0
  9. package/dist/cjs/nano-field-validator.cjs.entry.js.map +1 -1
  10. package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js +2 -2
  11. package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js.map +1 -1
  12. package/dist/cjs/nano-global-nav.cjs.entry.js +18 -20
  13. package/dist/cjs/nano-global-nav.cjs.entry.js.map +1 -1
  14. package/dist/cjs/nano-progress-bar.cjs.entry.js +33 -0
  15. package/dist/cjs/nano-progress-bar.cjs.entry.js.map +1 -0
  16. package/dist/cjs/nano-resize-observe_2.cjs.entry.js +2 -2
  17. package/dist/cjs/nano-resize-observe_2.cjs.entry.js.map +1 -1
  18. package/dist/cjs/nano-spinner.cjs.entry.js +1 -1
  19. package/dist/cjs/nano-spinner.cjs.entry.js.map +1 -1
  20. package/dist/cjs/nano-tab-group.cjs.entry.js +1 -1
  21. package/dist/cjs/{nano-table-8a898621.js → nano-table-7e02106c.js} +146 -58
  22. package/dist/cjs/nano-table-7e02106c.js.map +1 -0
  23. package/dist/cjs/nano-table.cjs.entry.js +2 -1
  24. package/dist/cjs/nano-table.cjs.entry.js.map +1 -1
  25. package/dist/cjs/{table.worker-b0b0044a.js → table.worker-daf39ca9.js} +3 -2
  26. package/dist/cjs/table.worker-daf39ca9.js.map +1 -0
  27. package/dist/cjs/{transitions-d295a09e.js → transitions-5cd8f697.js} +10 -8
  28. package/dist/cjs/transitions-5cd8f697.js.map +1 -0
  29. package/dist/collection/collection-manifest.json +1 -0
  30. package/dist/collection/components/checkbox/checkbox-group.js +12 -3
  31. package/dist/collection/components/checkbox/checkbox-group.js.map +1 -1
  32. package/dist/collection/components/field-validator/field-validator.js +2 -0
  33. package/dist/collection/components/field-validator/field-validator.js.map +1 -1
  34. package/dist/collection/components/global-nav/assets/ont-logo.svg +89 -47
  35. package/dist/collection/components/global-nav/global-nav-interface.js.map +1 -1
  36. package/dist/collection/components/global-nav/global-nav.js +19 -21
  37. package/dist/collection/components/global-nav/global-nav.js.map +1 -1
  38. package/dist/collection/components/global-nav/{global-nav.css → style/global-nav.css} +462 -404
  39. package/dist/collection/components/nav-item/nav-item.css +4 -6
  40. package/dist/collection/components/progress-bar/progress-bar.css +84 -0
  41. package/dist/collection/components/progress-bar/progress-bar.js +106 -0
  42. package/dist/collection/components/progress-bar/progress-bar.js.map +1 -0
  43. package/dist/collection/components/skeleton/skeleton.css +8 -5
  44. package/dist/collection/components/skeleton/skeleton.js +1 -1
  45. package/dist/collection/components/skeleton/skeleton.js.map +1 -1
  46. package/dist/collection/components/spinner/spinner.css +5 -9
  47. package/dist/collection/components/table/table.children.js +43 -17
  48. package/dist/collection/components/table/table.children.js.map +1 -1
  49. package/dist/collection/components/table/table.css +97 -27
  50. package/dist/collection/components/table/table.js +143 -33
  51. package/dist/collection/components/table/table.js.map +1 -1
  52. package/dist/collection/components/table/table.service.js +1 -10
  53. package/dist/collection/components/table/table.service.js.map +1 -1
  54. package/dist/collection/components/table/table.store.js +11 -11
  55. package/dist/collection/components/table/table.store.js.map +1 -1
  56. package/dist/collection/utils/transitions.js +9 -7
  57. package/dist/collection/utils/transitions.js.map +1 -1
  58. package/dist/components/index.d.ts +1 -0
  59. package/dist/components/index.js +1 -0
  60. package/dist/components/index.js.map +1 -1
  61. package/dist/components/nano-checkbox-group.js +12 -3
  62. package/dist/components/nano-checkbox-group.js.map +1 -1
  63. package/dist/components/nano-field-validator.js +2 -0
  64. package/dist/components/nano-field-validator.js.map +1 -1
  65. package/dist/components/nano-global-nav.js +17 -19
  66. package/dist/components/nano-global-nav.js.map +1 -1
  67. package/dist/components/nano-progress-bar.d.ts +11 -0
  68. package/dist/components/nano-progress-bar.js +11 -0
  69. package/dist/components/nano-progress-bar.js.map +1 -0
  70. package/dist/components/nano-table.js +167 -58
  71. package/dist/components/nano-table.js.map +1 -1
  72. package/dist/components/nav-item.js +1 -1
  73. package/dist/components/nav-item.js.map +1 -1
  74. package/dist/components/progress-bar.js +48 -0
  75. package/dist/components/progress-bar.js.map +1 -0
  76. package/dist/components/skeleton.js +2 -2
  77. package/dist/components/skeleton.js.map +1 -1
  78. package/dist/components/spinner.js +1 -1
  79. package/dist/components/spinner.js.map +1 -1
  80. package/dist/components/transitions.js +9 -7
  81. package/dist/components/transitions.js.map +1 -1
  82. package/dist/custom-elements/index.d.ts +6 -0
  83. package/dist/custom-elements/index.js +214 -91
  84. package/dist/custom-elements/index.js.map +1 -1
  85. package/dist/esm/index-3c280603.js +8 -4
  86. package/dist/esm/loader.js +1 -1
  87. package/dist/esm/nano-checkbox-group.entry.js +12 -3
  88. package/dist/esm/nano-checkbox-group.entry.js.map +1 -1
  89. package/dist/esm/nano-components.js +1 -1
  90. package/dist/esm/nano-details.entry.js +1 -1
  91. package/dist/esm/nano-field-validator.entry.js +2 -0
  92. package/dist/esm/nano-field-validator.entry.js.map +1 -1
  93. package/dist/esm/nano-global-nav-user-profile_3.entry.js +2 -2
  94. package/dist/esm/nano-global-nav-user-profile_3.entry.js.map +1 -1
  95. package/dist/esm/nano-global-nav.entry.js +18 -20
  96. package/dist/esm/nano-global-nav.entry.js.map +1 -1
  97. package/dist/esm/nano-progress-bar.entry.js +29 -0
  98. package/dist/esm/nano-progress-bar.entry.js.map +1 -0
  99. package/dist/esm/nano-resize-observe_2.entry.js +2 -2
  100. package/dist/esm/nano-resize-observe_2.entry.js.map +1 -1
  101. package/dist/esm/nano-spinner.entry.js +1 -1
  102. package/dist/esm/nano-spinner.entry.js.map +1 -1
  103. package/dist/esm/nano-tab-group.entry.js +1 -1
  104. package/dist/esm/{nano-table-efdf3dba.js → nano-table-930d9245.js} +146 -58
  105. package/dist/esm/nano-table-930d9245.js.map +1 -0
  106. package/dist/esm/nano-table.entry.js +2 -1
  107. package/dist/esm/nano-table.entry.js.map +1 -1
  108. package/dist/esm/{table.worker-10ba1126.js → table.worker-7666db6d.js} +3 -2
  109. package/dist/esm/table.worker-7666db6d.js.map +1 -0
  110. package/dist/esm/{transitions-d75d242e.js → transitions-71cca3ed.js} +10 -8
  111. package/dist/esm/transitions-71cca3ed.js.map +1 -0
  112. package/dist/nano-components/assets/ont-logo.svg +89 -47
  113. package/dist/nano-components/nano-components.esm.js +1 -1
  114. package/dist/nano-components/nano-components.esm.js.map +1 -1
  115. package/dist/nano-components/p-167b9165.js +5 -0
  116. package/dist/nano-components/p-167b9165.js.map +1 -0
  117. package/dist/nano-components/p-28344d24.entry.js +5 -0
  118. package/dist/nano-components/p-28344d24.entry.js.map +1 -0
  119. package/dist/nano-components/p-40b47b05.entry.js +5 -0
  120. package/dist/nano-components/{p-8a6834ff.entry.js.map → p-40b47b05.entry.js.map} +0 -0
  121. package/dist/nano-components/p-49458cd9.js +5 -0
  122. package/dist/nano-components/p-49458cd9.js.map +1 -0
  123. package/dist/nano-components/p-65f84bbd.entry.js +5 -0
  124. package/dist/nano-components/p-65f84bbd.entry.js.map +1 -0
  125. package/dist/nano-components/{p-8ef2363b.entry.js → p-6cd59e58.entry.js} +2 -2
  126. package/dist/nano-components/{p-8ef2363b.entry.js.map → p-6cd59e58.entry.js.map} +0 -0
  127. package/dist/nano-components/{p-687350a5.entry.js → p-701e8ebf.entry.js} +2 -2
  128. package/dist/nano-components/p-701e8ebf.entry.js.map +1 -0
  129. package/dist/nano-components/p-a2d0d7b9.entry.js.map +1 -1
  130. package/dist/nano-components/p-b717f6d7.js +5 -0
  131. package/dist/nano-components/{p-b7b06e04.js.map → p-b717f6d7.js.map} +0 -0
  132. package/dist/nano-components/p-b7901427.entry.js +5 -0
  133. package/dist/nano-components/p-b7901427.entry.js.map +1 -0
  134. package/dist/nano-components/{p-9f8b091a.entry.js → p-b7c3aecb.entry.js} +2 -2
  135. package/dist/nano-components/{p-9f8b091a.entry.js.map → p-b7c3aecb.entry.js.map} +0 -0
  136. package/dist/nano-components/p-d8e8d7e3.entry.js +5 -0
  137. package/dist/nano-components/p-d8e8d7e3.entry.js.map +1 -0
  138. package/dist/nano-components/p-f95a263c.entry.js +5 -0
  139. package/dist/nano-components/p-f95a263c.entry.js.map +1 -0
  140. package/dist/types/components/global-nav/global-nav-interface.d.ts +43 -0
  141. package/dist/types/components/global-nav/global-nav.d.ts +1 -1
  142. package/dist/types/components/progress-bar/progress-bar.d.ts +19 -0
  143. package/dist/types/components/table/table.children.d.ts +2 -1
  144. package/dist/types/components/table/table.d.ts +25 -7
  145. package/dist/types/components/table/table.service.d.ts +1 -7
  146. package/dist/types/components/table/table.store.d.ts +4 -2
  147. package/dist/types/components.d.ts +60 -5
  148. package/docs-json.json +273 -49
  149. package/docs-vscode.json +31 -2
  150. package/package.json +3 -3
  151. package/dist/cjs/nano-table-8a898621.js.map +0 -1
  152. package/dist/cjs/table.worker-b0b0044a.js.map +0 -1
  153. package/dist/cjs/transitions-d295a09e.js.map +0 -1
  154. package/dist/esm/nano-table-efdf3dba.js.map +0 -1
  155. package/dist/esm/table.worker-10ba1126.js.map +0 -1
  156. package/dist/esm/transitions-d75d242e.js.map +0 -1
  157. package/dist/nano-components/p-03402e69.entry.js +0 -5
  158. package/dist/nano-components/p-03402e69.entry.js.map +0 -1
  159. package/dist/nano-components/p-2382d5e9.entry.js +0 -5
  160. package/dist/nano-components/p-2382d5e9.entry.js.map +0 -1
  161. package/dist/nano-components/p-4c6ef60b.js +0 -5
  162. package/dist/nano-components/p-4c6ef60b.js.map +0 -1
  163. package/dist/nano-components/p-61bfb8b9.entry.js +0 -5
  164. package/dist/nano-components/p-61bfb8b9.entry.js.map +0 -1
  165. package/dist/nano-components/p-687350a5.entry.js.map +0 -1
  166. package/dist/nano-components/p-82295d91.js +0 -5
  167. package/dist/nano-components/p-82295d91.js.map +0 -1
  168. package/dist/nano-components/p-8a6834ff.entry.js +0 -5
  169. package/dist/nano-components/p-9f2524d4.entry.js +0 -5
  170. package/dist/nano-components/p-9f2524d4.entry.js.map +0 -1
  171. package/dist/nano-components/p-b7b06e04.js +0 -5
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { j as consoleError, h, F as Fragment, g as getElement, e as getRenderingRef, r as registerInstance, c as createEvent, d as readTask, a as Host } from './index-3c280603.js';
5
5
  import { a as cyrb53 } from './math-c02ddfda.js';
6
+ import { d as debounce } from './throttle-7836544e.js';
6
7
  import { c as createStore } from './index-c752dae1.js';
7
8
 
8
9
  const CSSNAMESPACE = 'nano-tbl';
@@ -109,7 +110,7 @@ const createWorkerProxy = (worker, workerMsgId, exportedMethod) => (
109
110
  })
110
111
  );
111
112
 
112
- const workerPromise = import('./table.worker-10ba1126.js').then(m => m.worker);
113
+ const workerPromise = import('./table.worker-7666db6d.js').then(m => m.worker);
113
114
  const createWorkerStore = /*@__PURE__*/createWorkerProxy(workerPromise, 'stencil.table.worker', 'createWorkerStore');
114
115
  const syncConfigToWorker = /*@__PURE__*/createWorkerProxy(workerPromise, 'stencil.table.worker', 'syncConfigToWorker');
115
116
  const syncDataToWorker = /*@__PURE__*/createWorkerProxy(workerPromise, 'stencil.table.worker', 'syncDataToWorker');
@@ -128,17 +129,11 @@ function colsToWorker(columns) {
128
129
  return safeColumns;
129
130
  }
130
131
  const stores = new WeakMap();
131
- async function generateStore(host, rows, columns) {
132
- // augment data with some internal props
133
- rows = rows.map((row, i) => ({
134
- ...row,
135
- __index: i,
136
- __uuid: cyrb53(Object.values(row).join()),
137
- }));
132
+ async function generateStore(host, columns, scrollParent) {
138
133
  const store = {
139
- data: createStore({ rows }),
134
+ data: createStore({ rows: [] }),
140
135
  config: createStore({ columns }),
141
- general: createStore({ workerId: null }),
136
+ general: createStore({ workerId: null, scrollParent, host }),
142
137
  };
143
138
  const id = await createWorkerStore(store.data.state.rows, colsToWorker(store.config.state.columns));
144
139
  store.general.state.workerId = id;
@@ -173,9 +168,15 @@ function storeSetData(host, rows) {
173
168
  const store = stores.get(host);
174
169
  if (!store)
175
170
  return;
176
- if (store.general.state.workerId)
177
- syncDataToWorker(store.general.state.workerId, rows);
171
+ // augment data with some internal props
172
+ rows = rows.map((row, i) => ({
173
+ ...row,
174
+ __index: i,
175
+ __uuid: cyrb53(Object.values(row).join()),
176
+ }));
178
177
  store.data.state.rows = rows;
178
+ if (store.general.state.workerId)
179
+ return syncDataToWorker(store.general.state.workerId, rows);
179
180
  }
180
181
  function storeSetConfig(host, columns) {
181
182
  const store = stores.get(host);
@@ -330,7 +331,7 @@ function cellRender(rowIndex, colIndex) {
330
331
  * @param col - the current column config object
331
332
  * @returns - a JSX node
332
333
  */
333
- function colheadRender(col) {
334
+ function colheadFootRender(col) {
334
335
  const tpl = col?.colTemplate;
335
336
  return tpl ? (tpl(h, col)) : (h(Fragment, null, col.title));
336
337
  }
@@ -357,33 +358,56 @@ const stickyVIOs = new WeakMap();
357
358
  function addHObserver(el, pos, cb) {
358
359
  if (stickyHIOs.get(el))
359
360
  return;
361
+ const store = fetchStores();
362
+ const root = store.general.state.scrollParent;
363
+ const host = store.general.state.host;
360
364
  const observer = new IntersectionObserver(([e]) => {
361
365
  const positions = {};
362
- if (pos === 'start')
363
- positions.start = e.boundingClientRect.x < 0 && !e.isIntersecting;
364
- if (pos === 'end')
366
+ if (pos === 'start') {
367
+ positions.start =
368
+ e.boundingClientRect.x -
369
+ (host.getBoundingClientRect().x + root.scrollLeft) <
370
+ 0 && !e.isIntersecting;
371
+ }
372
+ if (pos === 'end') {
373
+ // TODO - sort these out for RtL
365
374
  positions.end =
366
- e.boundingClientRect.width > e.intersectionRect.width &&
375
+ e.boundingClientRect.right > e.boundingClientRect.width &&
367
376
  !e.isIntersecting;
377
+ }
368
378
  cb(positions);
369
- }, { threshold: [1], rootMargin: '1px 0px 1px 0px' });
379
+ }, {
380
+ threshold: [1],
381
+ rootMargin: '1px 0px 1px 0px',
382
+ root: root === document.scrollingElement ? null : root,
383
+ });
370
384
  stickyHIOs.set(el, observer);
371
385
  requestAnimationFrame(() => observer.observe(el));
372
386
  }
373
387
  function addVObserver(el, pos, cb) {
374
388
  if (stickyVIOs.get(el))
375
389
  return;
390
+ const store = fetchStores();
391
+ const root = store.general.state.scrollParent;
392
+ const host = store.general.state.host;
376
393
  const observer = new IntersectionObserver(([e]) => {
377
- console.log(e);
378
394
  const positions = {};
379
- if (pos === 'top')
380
- positions.top = e.boundingClientRect.y < 0 && !e.isIntersecting;
395
+ if (pos === 'top') {
396
+ positions.top =
397
+ e.boundingClientRect.y -
398
+ (host.getBoundingClientRect().y + root.scrollTop) <
399
+ 0 && !e.isIntersecting;
400
+ }
381
401
  if (pos === 'bottom')
382
402
  positions.bottom =
383
403
  e.boundingClientRect.height > e.intersectionRect.height &&
384
404
  !e.isIntersecting;
385
405
  cb(positions);
386
- }, { threshold: [0.99], rootMargin: '0px 100px 0px 100px' });
406
+ }, {
407
+ threshold: [0.99],
408
+ rootMargin: '0px 100px 0px 100px',
409
+ root: root === document.scrollingElement ? null : root,
410
+ });
387
411
  stickyVIOs.set(el, observer);
388
412
  requestAnimationFrame(() => observer.observe(el));
389
413
  }
@@ -456,7 +480,7 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
456
480
  default:
457
481
  order = 'asc';
458
482
  }
459
- onColumnOrderClick(order, column.prop, e.target.parentElement);
483
+ onColumnOrderClick(order, column.prop, e.target.closest('th'));
460
484
  }
461
485
  let extraProps = {};
462
486
  if (column.columnProperties) {
@@ -472,7 +496,7 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
472
496
  },
473
497
  };
474
498
  let props = extraProps ? mergeProperties(baseProps, extraProps) : baseProps;
475
- const content = colheadRender(column);
499
+ const content = colheadFootRender(column);
476
500
  if (!content)
477
501
  return h(Fragment, null);
478
502
  props =
@@ -490,8 +514,11 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
490
514
  if (['top', 'bottom'].includes(headRenderer.pinned))
491
515
  addVObserver(th, headRenderer.pinned, onColumnPinned);
492
516
  } },
493
- h("button", { class: `${CSSNAMESPACE}__order-btn`, onClick: handleColumnOrderClick },
494
- colheadRender(column),
517
+ h("button", { class: {
518
+ [`${CSSNAMESPACE}__order-btn`]: true,
519
+ [`${CSSNAMESPACE}__cell-content`]: true,
520
+ }, onClick: handleColumnOrderClick },
521
+ colheadFootRender(column),
495
522
  !!column.filter && h("nano-icon", { name: "light/filter" }),
496
523
  !!column.order &&
497
524
  (column.order === 'desc' ? (h("nano-icon", { name: "solid/long-arrow-down" })) : (h("nano-icon", { name: "solid/long-arrow-up" }))),
@@ -504,11 +531,12 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
504
531
  if (['top', 'bottom'].includes(headRenderer.pinned))
505
532
  addVObserver(th, headRenderer.pinned, onColumnPinned);
506
533
  } },
507
- colheadRender(column),
508
- !!column.filter && h("nano-icon", { name: "light/bars-filter" })));
534
+ h("div", { class: `${CSSNAMESPACE}__cell-content` },
535
+ colheadFootRender(column),
536
+ !!column.filter && h("nano-icon", { name: "light/bars-filter" }))));
509
537
  };
510
- const TableCell = ({ rowIndex, colIndex, }) => {
511
- const content = cellRender(rowIndex, colIndex);
538
+ const TableCell = ({ rowIndex, colIndex, nestedContent, }) => {
539
+ const content = nestedContent || cellRender(rowIndex, colIndex);
512
540
  if (!content)
513
541
  return h(Fragment, null);
514
542
  const store = fetchStores();
@@ -532,7 +560,8 @@ const TableCell = ({ rowIndex, colIndex, }) => {
532
560
  }
533
561
  return (h(CellType
534
562
  // role="gridcell"
535
- , { ...props }, cellRender(rowIndex, colIndex)));
563
+ , { ...props },
564
+ h("div", { class: `${CSSNAMESPACE}__cell-content` }, content)));
536
565
  };
537
566
 
538
567
  const detectScrollSpeed = (() => {
@@ -590,7 +619,7 @@ function isInViewport(el, percentVisible = 100) {
590
619
  percentVisible);
591
620
  }
592
621
 
593
- const tableCss = ":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}nano-table{display:block;--max-col-width:200px;--color:var(--nano-color-mediumgrey, #68767e);--font-size:0.87rem;--cell-line-height:1.5;--border-color:var(--nano-color-palegrey, #b5aea7);--border-style:1px solid var(--border-color);--border-tint-color:var(--nano-color-blue, #90c6e7);--border-tint-style:2px solid var(--border-tint-color);--cell-bg-rgb:var(--nano-color-white-rgb);--head-bg-rgb:var(--cell-bg-rgb);--foot-bg-rgb:var(--cell-bg-rgb);--th-row-bg-rgb:var(--cell-bg-rgb);--ordered-bg-rgb:var(--nano-color-lightgrey-rgb);--td-padding:0.5rem 0.625rem 0.4125rem;--th-padding:0.875rem 0.625rem 0.6875rem;--head-th-padding:var(--th-padding);--foot-th-padding:var(--td-padding);--bookend-col-padding:2rem}.nano-tbl{color:var(--color);text-align:start;width:100%;font-size:var(--font-size);border-spacing:0 0;-webkit-margin-after:32px;margin-block-end:32px;border-collapse:separate;background:rgb(var(--cell-bg-rgb))}.nano-tbl__ordered{background-color:var(--ordered-bg);-webkit-border-start:var(--border-style);border-inline-start:var(--border-style);-webkit-border-end:var(--border-style);border-inline-end:var(--border-style)}.nano-tbl__order-btn{padding:0;border:none;outline:none;font:inherit;background:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;color:inherit;display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%}.nano-tbl__status-icons{margin-inline:auto 10px;display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px}.nano-tbl__loader{font-size:2rem;width:100%;display:block}.nano-tbl__caption{clip:rect(1px, 1px, 1px, 1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);block-size:1px;inline-size:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}.nano-tbl__td,.nano-tbl__th{line-height:var(--cell-line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:start;-webkit-border-after:var(--border-style);border-block-end:var(--border-style);padding:var(--td-padding);max-width:var(--max-col-width);background-color:rgb(var(--cell-bg-rgb))}@media (min-width: 768px){.nano-tbl__td:first-child,.nano-tbl__th:first-child{-webkit-padding-start:var(--bookend-col-padding) !important;padding-inline-start:var(--bookend-col-padding) !important}.nano-tbl__td:last-child,.nano-tbl__th:last-child{-webkit-padding-end:var(--bookend-col-padding) !important;padding-inline-end:var(--bookend-col-padding) !important}}thead .nano-tbl__td,thead .nano-tbl__th{padding:var(--head-th-padding);font-weight:800;background:rgba(var(--head-bg-rgb), 90%)}tfoot .nano-tbl__td,tfoot .nano-tbl__th{padding:var(--foot-th-padding);font-weight:800;-webkit-border-after:none;border-block-end:none;background:rgba(var(--foot-bg-rgb), 90%)}.nano-tbl__td.nano-tbl__ordered,.nano-tbl__th.nano-tbl__ordered{background-color:rgba(var(--ordered-bg-rgb), 0.8) !important}.nano-tbl tbody{will-change:scroll-position;visibility:visible}.nano-tbl tbody.nano-tbl__inactive{visibility:hidden}.nano-tbl th[scope=row]{font-weight:800;max-width:65vw;margin:0}.nano-tbl__pin{position:sticky}.nano-tbl__pin--start{inset-inline:-1px auto;will-change:scroll-position;overflow:visible}.nano-tbl__pin--start::after{content:\"\";position:absolute;inset:0;-webkit-box-shadow:5px 0 4px 0 rgba(0, 0, 0, 0.2);box-shadow:5px 0 4px 0 rgba(0, 0, 0, 0.2);opacity:0}.nano-tbl__pinned--start .nano-tbl__pin--start{z-index:1}.nano-tbl__pinned--start .nano-tbl__pin--start::after{opacity:1}.nano-tbl__pin--end{inset-inline:auto -1px}.nano-tbl__pin--end::after{content:\"\";position:absolute;inset:0;-webkit-box-shadow:-5px 0 4px 0 rgba(0, 0, 0, 0.2);box-shadow:-5px 0 4px 0 rgba(0, 0, 0, 0.2);opacity:0}.nano-tbl__pinned--end .nano-tbl__pin--end{z-index:2}.nano-tbl__pinned--end .nano-tbl__pin--end::after{opacity:1}.nano-tbl__pin--top{inset-block:-1px auto}.nano-tbl__pinned--top .nano-tbl__pin--top{z-index:3}.nano-tbl__pin--bottom{inset-block:auto -1px}.nano-tbl__pinned--bottom .nano-tbl__pin--bottom{z-index:4;-webkit-border-before:var(--border-tint-style);border-block-start:var(--border-tint-style)}.nano-tbl__pinned--top.nano-tbl__pinned--start .nano-tbl__pin--top.nano-tbl__pin--start{z-index:5}.nano-tbl__pinned--top.nano-tbl__pinned--end .nano-tbl__pin--top.nano-tbl__pin--end{z-index:5}.nano-tbl__pinned--bottom.nano-tbl__pinned--start .nano-tbl__pin--bottom.nano-tbl__pin--start{z-index:5}.nano-tbl__pinned--bottom.nano-tbl__pinned--end .nano-tbl__pin--bottom.nano-tbl__pin--end{z-index:5}.nano-tbl thead tr:last-of-type td,.nano-tbl thead tr:last-of-type th,.nano-tbl tfoot tr:last-of-type td,.nano-tbl tfoot tr:last-of-type th{-webkit-border-after:var(--border-tint-style);border-block-end:var(--border-tint-style)}.nano-tbl .unlimited-width{max-width:none}";
622
+ const tableCss = ":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}@charset \"UTF-8\";nano-table{display:table;width:100%;--max-col-width:200px;--color:var(--nano-color-mediumgrey, #68767e);--font-size:0.87rem;--cell-line-height:1.5;--border-color:var(--nano-color-palegrey, #b5aea7);--border-style:1px solid var(--border-color);--border-tint-color:var(--nano-color-blue, #90c6e7);--border-tint-style:2px solid var(--border-tint-color);--cell-bg-rgb:var(--nano-color-white-rgb, 255 255 255);--head-bg-rgb:var(--cell-bg-rgb);--foot-bg-rgb:var(--cell-bg-rgb);--th-row-bg-rgb:var(--cell-bg-rgb);--ordered-bg-rgb:var(--nano-color-offwhite-rgb, 249 249 251);--td-padding:0.5rem 0.625rem 0.4125rem;--th-padding:0.875rem 0.625rem 0.6875rem;--head-th-padding:var(--th-padding);--foot-th-padding:var(--td-padding);--bookend-col-padding:2rem}.nano-tbl{color:var(--color);text-align:start;width:100%;font-size:var(--font-size);border-spacing:0 0;border-collapse:separate;background:rgb(var(--cell-bg-rgb));-webkit-border-end:1px solid transparent;border-inline-end:1px solid transparent}.nano-tbl__top-anchor{clip:rect(1px, 1px, 1px, 1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);block-size:1px;inline-size:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}.nano-tbl__ordered{background-color:var(--ordered-bg);-webkit-border-start:var(--border-style);border-inline-start:var(--border-style);-webkit-border-end:var(--border-style);border-inline-end:var(--border-style)}.nano-tbl__order-btn{padding:0;border:none;outline:none;font:inherit;background:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;color:inherit;display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%}.nano-tbl__status-icons{margin-inline:auto 10px;display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px}.nano-tbl__progress-bar{font-size:0.2rem;position:sticky;inset-block-start:0;inset-inline:0;z-index:10;-webkit-transition:scale 0.25s;transition:scale 0.25s;scale:0;width:100%;height:0}.nano-tbl__progress-bar--show{scale:1;height:auto}.nano-tbl__caption--hide{clip:rect(1px, 1px, 1px, 1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);block-size:1px;inline-size:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}.nano-tbl__td,.nano-tbl__th{line-height:var(--cell-line-height);text-align:start;-webkit-border-after:var(--border-style);border-block-end:var(--border-style);max-width:var(--max-col-width);background-color:rgb(var(--cell-bg-rgb))}@media (min-width: 768px){.nano-tbl__td:first-child .nano-tbl__cell-content,.nano-tbl__th:first-child .nano-tbl__cell-content{-webkit-padding-start:var(--bookend-col-padding) !important;padding-inline-start:var(--bookend-col-padding) !important}.nano-tbl__td:last-child .nano-tbl__cell-content,.nano-tbl__th:last-child .nano-tbl__cell-content{-webkit-padding-end:var(--bookend-col-padding) !important;padding-inline-end:var(--bookend-col-padding) !important}}thead .nano-tbl__td,thead .nano-tbl__th{font-weight:800;background:rgba(var(--head-bg-rgb), 90%)}thead .nano-tbl__td .nano-tbl__cell-content,thead .nano-tbl__th .nano-tbl__cell-content{padding:var(--head-th-padding)}tfoot .nano-tbl__td,tfoot .nano-tbl__th{font-weight:800;-webkit-border-after:none;border-block-end:none;background:rgba(var(--foot-bg-rgb), 90%)}tfoot .nano-tbl__td .nano-tbl__cell-content,tfoot .nano-tbl__th .nano-tbl__cell-content{padding:var(--foot-th-padding)}.nano-tbl__td.nano-tbl__ordered,.nano-tbl__th.nano-tbl__ordered{background-color:rgba(var(--ordered-bg-rgb), 0.8) !important}.nano-tbl__cell-content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:var(--td-padding)}.nano-tbl tbody{will-change:scroll-position;visibility:visible}.nano-tbl tbody.nano-tbl__inactive{visibility:hidden}.nano-tbl th[scope=row]{font-weight:800;max-width:65vw;margin:0}.nano-tbl__pin{position:sticky;z-index:1}.nano-tbl__pin--start{inset-inline:-1px auto;-webkit-transition:max-width 0.25s;transition:max-width 0.25s}.nano-tbl__pin--start::after{content:\"\";position:absolute;inset:0;-webkit-box-shadow:5px 0 4px 0 rgba(0, 0, 0, 0.2);box-shadow:5px 0 4px 0 rgba(0, 0, 0, 0.2);opacity:0;z-index:-1}.nano-tbl__pinned--start .nano-tbl__pin--start{z-index:2}@media (max-width: 576px){.nano-tbl__pinned--start .nano-tbl__pin--start{max-width:25vw !important}}.nano-tbl__pinned--start .nano-tbl__pin--start::after{opacity:1}.nano-tbl__pin--end{inset-inline:auto -1px;max-width:min(50vw, 200px);}.nano-tbl__pin--end::after{content:\"\";position:absolute;inset:0;-webkit-box-shadow:-5px 0 4px 0 rgba(0, 0, 0, 0.2);box-shadow:-5px 0 4px 0 rgba(0, 0, 0, 0.2);opacity:0;z-index:-1}.nano-tbl__pinned--end .nano-tbl__pin--end{z-index:3}.nano-tbl__pinned--end .nano-tbl__pin--end::after{opacity:1}@media (max-width: 576px){.nano-tbl__pin--start~.nano-tbl__pin--end{inset-inline:auto auto}.nano-tbl__pin--start~.nano-tbl__pin--end::after{display:none}}.nano-tbl__pin--top{inset-block:-1px auto}.nano-tbl__pinned--top .nano-tbl__pin--top{z-index:4}.nano-tbl__pin--bottom{inset-block:auto -1px}.nano-tbl__pinned--bottom .nano-tbl__pin--bottom{z-index:5;-webkit-border-before:var(--border-tint-style);border-block-start:var(--border-tint-style)}.nano-tbl__pinned--top.nano-tbl__pinned--start .nano-tbl__pin--top.nano-tbl__pin--start{z-index:6}.nano-tbl__pinned--top.nano-tbl__pinned--end .nano-tbl__pin--top.nano-tbl__pin--end{z-index:6}.nano-tbl__pinned--bottom.nano-tbl__pinned--start .nano-tbl__pin--bottom.nano-tbl__pin--start{z-index:6}.nano-tbl__pinned--bottom.nano-tbl__pinned--end .nano-tbl__pin--bottom.nano-tbl__pin--end{z-index:6}.nano-tbl thead tr:last-of-type td,.nano-tbl thead tr:last-of-type th,.nano-tbl tfoot tr:last-of-type td,.nano-tbl tfoot tr:last-of-type th{-webkit-border-after:var(--border-tint-style);border-block-end:var(--border-tint-style)}.nano-tbl .unlimited-width{max-width:none}.nano-tbl__spinner{font-size:1.5rem;-webkit-transition:scale 0.25s;transition:scale 0.25s;scale:0;padding:0.5rem;position:absolute;inset-block-end:0;inset-inline-start:calc(50% - 0.75rem);z-index:-1}.nano-tbl__spinner--show{scale:1;position:sticky}.nano-tbl nano-skeleton{line-height:var(--cell-line-height)}";
594
623
 
595
624
  let id = 0;
596
625
  const Table = class {
@@ -604,6 +633,9 @@ const Table = class {
604
633
  this.nanoTblAfterFilter = createEvent(this, "nanoTblAfterFilter", 7);
605
634
  this.nanoTblBeforeSearch = createEvent(this, "nanoTblBeforeSearch", 7);
606
635
  this.nanoTblAfterSearch = createEvent(this, "nanoTblAfterSearch", 7);
636
+ this.debounceSetLoading = (l) => {
637
+ this._loading = l;
638
+ };
607
639
  this.renderId = 'tbl-' + id++;
608
640
  this.filters = [];
609
641
  this.currentFilters = '';
@@ -621,8 +653,10 @@ const Table = class {
621
653
  * @returns A promise
622
654
  */
623
655
  this.sortStart = async (order, column, element) => {
656
+ // did order change?
624
657
  if (this.currentSort === order + ':' + column)
625
658
  return;
659
+ this.loading = true;
626
660
  const sortEvent = this.nanoTblBeforeSort.emit({ column: column, order });
627
661
  if (sortEvent.defaultPrevented)
628
662
  return;
@@ -647,10 +681,13 @@ const Table = class {
647
681
  console.warn('sort failed', e);
648
682
  this.currentSort = '';
649
683
  }
684
+ finally {
685
+ this.loading = false;
686
+ }
650
687
  };
651
688
  /**
652
- * Attaches an intersection observer to each rendered tbody elements
653
- * shows / hides intersecting blocks' and sets heights for when their hidden
689
+ * Attaches an intersection observer to each rendered tbody element
690
+ * shows / hides intersecting blocks' and sets heights for when they're hidden
654
691
  * @param el - the tbody element to observe
655
692
  * @param blockIndex - the rendering tbody we're attaching the IO to
656
693
  */
@@ -665,8 +702,8 @@ const Table = class {
665
702
  // The Intersection Observer (IO) fires in an incorrect order when the scrolling is very fast
666
703
  // i.e. we go past blocks 3, 2, 1 and land on 0, but 3 can fire as 'intersecting' after 0.
667
704
  // To fix that, we check - for realsies - if the block IS visible.
668
- // BUT that test is not as sensitive to a block being visible as the IO,
669
- // so doesn't always fire if scrolling slowing
705
+ // BUT that test is not as sensitive to a block being visible via the IO,
706
+ // so doesn't always fire if scrolling slowly
670
707
  // *sigh*
671
708
  readTask(() => {
672
709
  if (this.scrollSpeed < 100 || isInViewport(el, 0.01)) {
@@ -683,7 +720,12 @@ const Table = class {
683
720
  }
684
721
  });
685
722
  }
686
- }, { threshold: [0] });
723
+ }, {
724
+ threshold: [0],
725
+ root: this.scrollParent === document.scrollingElement
726
+ ? null
727
+ : this.scrollParent,
728
+ });
687
729
  blockIo.observe(el);
688
730
  this.blockIos.set(el, blockIo);
689
731
  };
@@ -695,7 +737,9 @@ const Table = class {
695
737
  this.type = 'table';
696
738
  this.caption = undefined;
697
739
  this.showCaption = false;
698
- this.rows = [];
740
+ this._loading = true;
741
+ this.placeholderSize = 5;
742
+ this.rows = undefined;
699
743
  this.columns = [];
700
744
  this.headRender = { pinned: 'top' };
701
745
  this.rowRender = undefined;
@@ -708,9 +752,29 @@ const Table = class {
708
752
  this.blocks = [];
709
753
  this.activeBlocks = [0, 1, 2];
710
754
  this.measureHeight = 0;
755
+ this.debounceSetLoading = debounce(this.debounceSetLoading.bind(this), 50);
756
+ }
757
+ /** Will show a loading state when true.
758
+ * Will be shown automatically if `rows` is a promise waiting to resolve
759
+ * or when performing custom filtering or sorting */
760
+ get loading() {
761
+ return this._loading;
762
+ }
763
+ set loading(l) {
764
+ this.debounceSetLoading(l);
711
765
  }
712
766
  handleRowsChange() {
713
- storeSetData(this.host, this.rows);
767
+ if (!this.rows)
768
+ return;
769
+ this.loading = true;
770
+ Promise.resolve(this.rows).then(async (rows) => {
771
+ await storeSetData(this.host, rows);
772
+ if (!this.isReady) {
773
+ await this.columnInit();
774
+ this.setInitialBlockDimension();
775
+ }
776
+ this.loading = false;
777
+ });
714
778
  }
715
779
  handleColsChange() {
716
780
  storeSetConfig(this.host, this.columns);
@@ -758,6 +822,8 @@ const Table = class {
758
822
  }
759
823
  // uses the first 'tr' of an active block as our yard stick
760
824
  set measureEle(el) {
825
+ if (!el)
826
+ return;
761
827
  this.measureHeight = el.getBoundingClientRect().height;
762
828
  this.unitHeight =
763
829
  el.querySelector('tr')?.getBoundingClientRect().height || this.unitHeight;
@@ -804,6 +870,7 @@ const Table = class {
804
870
  this.nanoTblAfterSort.emit({ column: column, order });
805
871
  }
806
872
  async searchStart() {
873
+ this.loading = true;
807
874
  const sortEvent = this.nanoTblBeforeSearch.emit({ term: this.searchTerm });
808
875
  if (sortEvent.defaultPrevented)
809
876
  return;
@@ -813,7 +880,12 @@ const Table = class {
813
880
  await storeSearch(this.host, this.searchTerm);
814
881
  this.nanoTblAfterSearch.emit({ term: this.searchTerm });
815
882
  }
816
- catch (e) { }
883
+ catch (e) {
884
+ console.warn('search failed', e);
885
+ }
886
+ finally {
887
+ this.loading = false;
888
+ }
817
889
  }
818
890
  async filterStart(filters, additive = true) {
819
891
  if (filters) {
@@ -829,6 +901,7 @@ const Table = class {
829
901
  }
830
902
  if (this.currentFilters === JSON.stringify(this.filters))
831
903
  return;
904
+ this.loading = true;
832
905
  const sortEvent = this.nanoTblBeforeFilter.emit({ filters: this.filters });
833
906
  if (sortEvent.defaultPrevented)
834
907
  return;
@@ -850,7 +923,12 @@ const Table = class {
850
923
  await storeFilter(this.host, this.filters);
851
924
  this.filterComplete();
852
925
  }
853
- catch (e) { }
926
+ catch (e) {
927
+ console.warn('filter failed', e);
928
+ }
929
+ finally {
930
+ this.loading = false;
931
+ }
854
932
  }
855
933
  filterComplete() {
856
934
  this.columns = this.columns.map((c) => {
@@ -864,16 +942,20 @@ const Table = class {
864
942
  /** Scrolls to the top immediately - used whilst sorting / filtering */
865
943
  scrollToTop(element) {
866
944
  const scrollBehaviour = this.scrollParent.style?.scrollBehavior;
945
+ const scrollX = this.scrollParent.scrollLeft;
867
946
  this.scrollParent.style.scrollBehavior = 'auto';
868
- this.host.scrollIntoView();
947
+ if (this.topAnchorEle && !isInViewport(this.topAnchorEle, 0.1))
948
+ this.topAnchorEle.scrollIntoView();
869
949
  if (element)
870
- element.scrollIntoView();
950
+ element.scrollIntoView({ block: 'start' });
951
+ if (scrollX)
952
+ this.scrollParent.scrollLeft = scrollX;
871
953
  if (scrollBehaviour)
872
954
  this.scrollParent.style.scrollBehavior = scrollBehaviour;
873
955
  }
874
956
  setMeasureElement() {
875
957
  readTask(() => {
876
- this.measureEle = this.blockElements.find((b) => !b.classList?.contains(`${CSSNAMESPACE}__inactive`));
958
+ this.measureEle = this.blockElements.find((b) => !b?.classList?.contains(`${CSSNAMESPACE}__inactive`));
877
959
  });
878
960
  }
879
961
  /**
@@ -898,11 +980,6 @@ const Table = class {
898
980
  }
899
981
  if (i === this.blockElements.length - 1)
900
982
  resolve();
901
- // const heightGuess = this.getBlockHeight(this.blockElements.indexOf(el));
902
- // writeTask(() => {
903
- // el.style.height = heightGuess;
904
- // if (i === this.blockElements.length - 1) resolve();
905
- // });
906
983
  });
907
984
  });
908
985
  });
@@ -986,8 +1063,8 @@ const Table = class {
986
1063
  if (!el)
987
1064
  return;
988
1065
  const height = el.getBoundingClientRect().height;
989
- // cache height to our block heights
990
- // array for subsequent renders
1066
+ // cache height to our block heights array
1067
+ // for subsequent renders
991
1068
  const fBhI = this.blockHeights.findIndex((bh) => bh.blockIndex === blockIndex);
992
1069
  if (fBhI > 0) {
993
1070
  this.blockHeights[fBhI] = { height, blockIndex };
@@ -1006,8 +1083,8 @@ const Table = class {
1006
1083
  }
1007
1084
  // Component lifecycle
1008
1085
  async componentWillLoad() {
1009
- this.store = await generateStore(this.host, this.rows, this.columns);
1010
- await this.columnInit();
1086
+ this.store = await generateStore(this.host, this.columns, this.scrollParent);
1087
+ await this.handleRowsChange();
1011
1088
  this.processSlots();
1012
1089
  this.setBlocks();
1013
1090
  this.store.data.onChange('rows', () => this.setBlocks());
@@ -1033,9 +1110,17 @@ const Table = class {
1033
1110
  }
1034
1111
  render() {
1035
1112
  this.blockElements = [];
1036
- return (h(Host, null, h("div", { "aria-labelledby": 'table-caption-' + this.renderId, tabindex: this.type === 'grid' ? '0' : undefined }, h("table", { role: this.type === 'grid' ? 'grid' : undefined, "aria-readonly": this.type === 'table' ? 'true' : undefined, "aria-rowcount": this.store.data.state.rows.length, "aria-colcount": this.store.config.state.columns.length, class: `${CSSNAMESPACE}`, ref: (tbl) => (this.tableEle = tbl) }, h("caption", { class: `${CSSNAMESPACE}__caption`, id: 'table-caption-' + this.renderId }, h("slot", { name: "caption" }, this.caption)), h("thead", null, h(TableHeadFootRow, { rowRenderer: this.headRender, onColumnPinned: this.handleColumnPinned }, this.store.config.state.columns.map((colModel) => [
1113
+ return (h(Host, null, h("div", { class: `${CSSNAMESPACE}__top-anchor`, ref: (a) => (this.topAnchorEle = a) }, "\u00A0"), h("div", { "aria-labelledby": 'table-caption-' + this.renderId, tabindex: this.type === 'grid' ? '0' : undefined }, h("nano-progress-bar", { indeterminate: true, class: {
1114
+ [`${CSSNAMESPACE}__progress-bar`]: true,
1115
+ [`${CSSNAMESPACE}__progress-bar--show`]: this.loading,
1116
+ } }), h("table", { role: this.type === 'grid' ? 'grid' : undefined, "aria-readonly": this.type === 'table' ? 'true' : undefined, "aria-rowcount": this.store.data.state.rows.length, "aria-colcount": this.store.config.state.columns.length, class: `${CSSNAMESPACE}`, ref: (tbl) => (this.tableEle = tbl) }, h("caption", { class: {
1117
+ [`${CSSNAMESPACE}__caption`]: true,
1118
+ [`${CSSNAMESPACE}__caption--hide`]: !this.showCaption,
1119
+ }, id: 'table-caption-' + this.renderId }, h("slot", { name: "caption" }, this.caption)), h("thead", null, h(TableHeadFootRow, { rowRenderer: this.headRender, onColumnPinned: this.handleColumnPinned }, this.store.config.state.columns.map((colModel) => [
1037
1120
  h(TableColHead, { column: colModel, headRenderer: this.headRender, onColumnOrderClick: this.sortStart, onColumnPinned: this.handleColumnPinned }),
1038
- ]))), this.blocks.map((block, blockIndex) => (h("tbody", { key: block.__uuid, id: `tbody-${this.renderId}-${blockIndex}`, ref: (tb) => {
1121
+ ]))), this.loading &&
1122
+ !this.blocks.length &&
1123
+ [...Array(10).keys()].map((rowIndex) => (h("tr", null, this.store.config.state.columns.map((_colModel, colIndex) => (h(TableCell, { rowIndex: rowIndex, colIndex: colIndex, nestedContent: h("nano-skeleton", null) })))))), this.blocks.map((block, blockIndex) => (h("tbody", { key: block.__uuid, id: `tbody-${this.renderId}-${blockIndex}`, ref: (tb) => {
1039
1124
  this.blockElements.push(tb);
1040
1125
  this.setupBlockIO(tb, blockIndex);
1041
1126
  }, class: {
@@ -1046,9 +1131,12 @@ const Table = class {
1046
1131
  return (h(TableRow, { rowRenderer: this.rowRender, row: row }, this.store.config.state.columns.map((_colModel, colIndex) => (h(TableCell, { rowIndex: rowIndex, colIndex: colIndex })))));
1047
1132
  })) : (h("td", { colSpan: this.store.config.state.columns.length, style: {
1048
1133
  height: this.getBlockHeight(blockIndex),
1049
- } }))))), (this.showFooter || !!this.footRender) && (h("tfoot", null, h(TableHeadFootRow, { rowRenderer: this.footRender, onColumnPinned: this.handleColumnPinned }, this.store.config.state.columns.map((colModel) => [
1134
+ } }))))), this.showFooter && (h("tfoot", null, h(TableHeadFootRow, { rowRenderer: this.footRender, onColumnPinned: this.handleColumnPinned }, this.store.config.state.columns.map((colModel) => [
1050
1135
  h(TableColHead, { column: colModel, headRenderer: this.footRender, onColumnPinned: this.handleColumnPinned }),
1051
- ]))))))));
1136
+ ]))))), !!this.blocks.length && (h("nano-spinner", { type: "circle", class: {
1137
+ [`${CSSNAMESPACE}__spinner`]: true,
1138
+ [`${CSSNAMESPACE}__spinner--show`]: this.loading,
1139
+ } })))));
1052
1140
  }
1053
1141
  get host() { return getElement(this); }
1054
1142
  static get watchers() { return {
@@ -1061,4 +1149,4 @@ Table.style = tableCss;
1061
1149
 
1062
1150
  export { Table as T, createWorker as c };
1063
1151
 
1064
- //# sourceMappingURL=nano-table-efdf3dba.js.map
1152
+ //# sourceMappingURL=nano-table-930d9245.js.map