@nanoporetech-digital/components 3.0.0 → 3.1.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 (212) hide show
  1. package/CHANGELOG.md +31 -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 +2 -2
  8. package/dist/cjs/nano-details.cjs.entry.js.map +1 -1
  9. package/dist/cjs/nano-field-validator.cjs.entry.js +2 -0
  10. package/dist/cjs/nano-field-validator.cjs.entry.js.map +1 -1
  11. package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js +3 -3
  12. package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js.map +1 -1
  13. package/dist/cjs/nano-global-nav.cjs.entry.js +18 -20
  14. package/dist/cjs/nano-global-nav.cjs.entry.js.map +1 -1
  15. package/dist/cjs/nano-input.cjs.entry.js +1 -1
  16. package/dist/cjs/nano-input.cjs.entry.js.map +1 -1
  17. package/dist/cjs/nano-menu-drawer.cjs.entry.js +1 -1
  18. package/dist/cjs/nano-menu-drawer.cjs.entry.js.map +1 -1
  19. package/dist/cjs/nano-progress-bar.cjs.entry.js +33 -0
  20. package/dist/cjs/nano-progress-bar.cjs.entry.js.map +1 -0
  21. package/dist/cjs/nano-resize-observe_2.cjs.entry.js +2 -2
  22. package/dist/cjs/nano-resize-observe_2.cjs.entry.js.map +1 -1
  23. package/dist/cjs/nano-spinner.cjs.entry.js +1 -1
  24. package/dist/cjs/nano-spinner.cjs.entry.js.map +1 -1
  25. package/dist/cjs/nano-tab-group.cjs.entry.js +1 -1
  26. package/dist/cjs/nano-tab.cjs.entry.js +1 -1
  27. package/dist/cjs/nano-tab.cjs.entry.js.map +1 -1
  28. package/dist/cjs/{nano-table-8a898621.js → nano-table-844394ad.js} +146 -58
  29. package/dist/cjs/nano-table-844394ad.js.map +1 -0
  30. package/dist/cjs/nano-table.cjs.entry.js +2 -1
  31. package/dist/cjs/nano-table.cjs.entry.js.map +1 -1
  32. package/dist/cjs/{table.worker-b0b0044a.js → table.worker-1bc19978.js} +3 -2
  33. package/dist/cjs/table.worker-1bc19978.js.map +1 -0
  34. package/dist/cjs/{transitions-d295a09e.js → transitions-5cd8f697.js} +10 -8
  35. package/dist/cjs/transitions-5cd8f697.js.map +1 -0
  36. package/dist/collection/collection-manifest.json +1 -0
  37. package/dist/collection/components/checkbox/checkbox-group.js +12 -3
  38. package/dist/collection/components/checkbox/checkbox-group.js.map +1 -1
  39. package/dist/collection/components/details/details.css +1 -0
  40. package/dist/collection/components/field-validator/field-validator.js +2 -0
  41. package/dist/collection/components/field-validator/field-validator.js.map +1 -1
  42. package/dist/collection/components/global-nav/assets/ont-logo.svg +89 -47
  43. package/dist/collection/components/global-nav/global-nav-interface.js.map +1 -1
  44. package/dist/collection/components/global-nav/global-nav.js +19 -21
  45. package/dist/collection/components/global-nav/global-nav.js.map +1 -1
  46. package/dist/collection/components/global-nav/{global-nav.css → style/global-nav.css} +465 -405
  47. package/dist/collection/components/input/input.css +2 -0
  48. package/dist/collection/components/menu-drawer/menu-drawer.css +1 -0
  49. package/dist/collection/components/nav-item/nav-item.css +6 -6
  50. package/dist/collection/components/progress-bar/progress-bar.css +84 -0
  51. package/dist/collection/components/progress-bar/progress-bar.js +106 -0
  52. package/dist/collection/components/progress-bar/progress-bar.js.map +1 -0
  53. package/dist/collection/components/select/select.css +4 -0
  54. package/dist/collection/components/skeleton/skeleton.css +8 -5
  55. package/dist/collection/components/skeleton/skeleton.js +1 -1
  56. package/dist/collection/components/skeleton/skeleton.js.map +1 -1
  57. package/dist/collection/components/spinner/spinner.css +5 -9
  58. package/dist/collection/components/table/table.children.js +43 -17
  59. package/dist/collection/components/table/table.children.js.map +1 -1
  60. package/dist/collection/components/table/table.css +97 -27
  61. package/dist/collection/components/table/table.js +143 -33
  62. package/dist/collection/components/table/table.js.map +1 -1
  63. package/dist/collection/components/table/table.service.js +1 -10
  64. package/dist/collection/components/table/table.service.js.map +1 -1
  65. package/dist/collection/components/table/table.store.js +11 -11
  66. package/dist/collection/components/table/table.store.js.map +1 -1
  67. package/dist/collection/components/tabs/tab.css +1 -0
  68. package/dist/collection/utils/transitions.js +9 -7
  69. package/dist/collection/utils/transitions.js.map +1 -1
  70. package/dist/components/index.d.ts +1 -0
  71. package/dist/components/index.js +1 -0
  72. package/dist/components/index.js.map +1 -1
  73. package/dist/components/input.js +1 -1
  74. package/dist/components/input.js.map +1 -1
  75. package/dist/components/nano-checkbox-group.js +12 -3
  76. package/dist/components/nano-checkbox-group.js.map +1 -1
  77. package/dist/components/nano-details.js +1 -1
  78. package/dist/components/nano-details.js.map +1 -1
  79. package/dist/components/nano-field-validator.js +2 -0
  80. package/dist/components/nano-field-validator.js.map +1 -1
  81. package/dist/components/nano-global-nav.js +17 -19
  82. package/dist/components/nano-global-nav.js.map +1 -1
  83. package/dist/components/nano-menu-drawer.js +1 -1
  84. package/dist/components/nano-menu-drawer.js.map +1 -1
  85. package/dist/components/nano-progress-bar.d.ts +11 -0
  86. package/dist/components/nano-progress-bar.js +11 -0
  87. package/dist/components/nano-progress-bar.js.map +1 -0
  88. package/dist/components/nano-tab.js +1 -1
  89. package/dist/components/nano-tab.js.map +1 -1
  90. package/dist/components/nano-table.js +167 -58
  91. package/dist/components/nano-table.js.map +1 -1
  92. package/dist/components/nav-item.js +1 -1
  93. package/dist/components/nav-item.js.map +1 -1
  94. package/dist/components/progress-bar.js +48 -0
  95. package/dist/components/progress-bar.js.map +1 -0
  96. package/dist/components/select.js +1 -1
  97. package/dist/components/select.js.map +1 -1
  98. package/dist/components/skeleton.js +2 -2
  99. package/dist/components/skeleton.js.map +1 -1
  100. package/dist/components/spinner.js +1 -1
  101. package/dist/components/spinner.js.map +1 -1
  102. package/dist/components/transitions.js +9 -7
  103. package/dist/components/transitions.js.map +1 -1
  104. package/dist/custom-elements/index.d.ts +6 -0
  105. package/dist/custom-elements/index.js +219 -96
  106. package/dist/custom-elements/index.js.map +1 -1
  107. package/dist/esm/index-3c280603.js +8 -4
  108. package/dist/esm/loader.js +1 -1
  109. package/dist/esm/nano-checkbox-group.entry.js +12 -3
  110. package/dist/esm/nano-checkbox-group.entry.js.map +1 -1
  111. package/dist/esm/nano-components.js +1 -1
  112. package/dist/esm/nano-details.entry.js +2 -2
  113. package/dist/esm/nano-details.entry.js.map +1 -1
  114. package/dist/esm/nano-field-validator.entry.js +2 -0
  115. package/dist/esm/nano-field-validator.entry.js.map +1 -1
  116. package/dist/esm/nano-global-nav-user-profile_3.entry.js +3 -3
  117. package/dist/esm/nano-global-nav-user-profile_3.entry.js.map +1 -1
  118. package/dist/esm/nano-global-nav.entry.js +18 -20
  119. package/dist/esm/nano-global-nav.entry.js.map +1 -1
  120. package/dist/esm/nano-input.entry.js +1 -1
  121. package/dist/esm/nano-input.entry.js.map +1 -1
  122. package/dist/esm/nano-menu-drawer.entry.js +1 -1
  123. package/dist/esm/nano-menu-drawer.entry.js.map +1 -1
  124. package/dist/esm/nano-progress-bar.entry.js +29 -0
  125. package/dist/esm/nano-progress-bar.entry.js.map +1 -0
  126. package/dist/esm/nano-resize-observe_2.entry.js +2 -2
  127. package/dist/esm/nano-resize-observe_2.entry.js.map +1 -1
  128. package/dist/esm/nano-spinner.entry.js +1 -1
  129. package/dist/esm/nano-spinner.entry.js.map +1 -1
  130. package/dist/esm/nano-tab-group.entry.js +1 -1
  131. package/dist/esm/nano-tab.entry.js +1 -1
  132. package/dist/esm/nano-tab.entry.js.map +1 -1
  133. package/dist/esm/{nano-table-efdf3dba.js → nano-table-19d19d72.js} +146 -58
  134. package/dist/esm/nano-table-19d19d72.js.map +1 -0
  135. package/dist/esm/nano-table.entry.js +2 -1
  136. package/dist/esm/nano-table.entry.js.map +1 -1
  137. package/dist/esm/{table.worker-10ba1126.js → table.worker-c82cecdf.js} +3 -2
  138. package/dist/esm/table.worker-c82cecdf.js.map +1 -0
  139. package/dist/esm/{transitions-d75d242e.js → transitions-71cca3ed.js} +10 -8
  140. package/dist/esm/transitions-71cca3ed.js.map +1 -0
  141. package/dist/nano-components/assets/ont-logo.svg +89 -47
  142. package/dist/nano-components/nano-components.esm.js +1 -1
  143. package/dist/nano-components/nano-components.esm.js.map +1 -1
  144. package/dist/nano-components/p-02df1f62.entry.js +5 -0
  145. package/dist/nano-components/{p-9f8b091a.entry.js.map → p-02df1f62.entry.js.map} +1 -1
  146. package/dist/nano-components/p-167b9165.js +5 -0
  147. package/dist/nano-components/p-167b9165.js.map +1 -0
  148. package/dist/nano-components/p-1ae8c03e.entry.js +5 -0
  149. package/dist/nano-components/p-1ae8c03e.entry.js.map +1 -0
  150. package/dist/nano-components/p-28b43ee9.entry.js +5 -0
  151. package/dist/nano-components/{p-49a831a3.entry.js.map → p-28b43ee9.entry.js.map} +1 -1
  152. package/dist/nano-components/{p-8ef2363b.entry.js → p-6cd59e58.entry.js} +2 -2
  153. package/dist/nano-components/{p-8ef2363b.entry.js.map → p-6cd59e58.entry.js.map} +0 -0
  154. package/dist/nano-components/{p-687350a5.entry.js → p-701e8ebf.entry.js} +2 -2
  155. package/dist/nano-components/p-701e8ebf.entry.js.map +1 -0
  156. package/dist/nano-components/p-7ade1695.js +5 -0
  157. package/dist/nano-components/{p-8a6834ff.entry.js.map → p-7ade1695.js.map} +0 -0
  158. package/dist/nano-components/p-8a52a411.entry.js +5 -0
  159. package/dist/nano-components/{p-68b18b99.entry.js.map → p-8a52a411.entry.js.map} +1 -1
  160. package/dist/nano-components/p-a2d0d7b9.entry.js.map +1 -1
  161. package/dist/nano-components/p-b4a045a2.entry.js +5 -0
  162. package/dist/nano-components/{p-b7b06e04.js.map → p-b4a045a2.entry.js.map} +0 -0
  163. package/dist/nano-components/p-b7901427.entry.js +5 -0
  164. package/dist/nano-components/p-b7901427.entry.js.map +1 -0
  165. package/dist/nano-components/p-b83a8320.js +5 -0
  166. package/dist/nano-components/p-b83a8320.js.map +1 -0
  167. package/dist/nano-components/p-d8e8d7e3.entry.js +5 -0
  168. package/dist/nano-components/p-d8e8d7e3.entry.js.map +1 -0
  169. package/dist/nano-components/p-efa8c520.entry.js +5 -0
  170. package/dist/nano-components/{p-47bd0f5d.entry.js.map → p-efa8c520.entry.js.map} +1 -1
  171. package/dist/nano-components/p-f95a263c.entry.js +5 -0
  172. package/dist/nano-components/p-f95a263c.entry.js.map +1 -0
  173. package/dist/nano-components/p-fa2a6733.entry.js +5 -0
  174. package/dist/nano-components/p-fa2a6733.entry.js.map +1 -0
  175. package/dist/themes/london-calling.css.map +1 -1
  176. package/dist/themes/nanopore.css.map +1 -1
  177. package/dist/types/components/global-nav/global-nav-interface.d.ts +43 -0
  178. package/dist/types/components/global-nav/global-nav.d.ts +1 -1
  179. package/dist/types/components/progress-bar/progress-bar.d.ts +19 -0
  180. package/dist/types/components/table/table.children.d.ts +2 -1
  181. package/dist/types/components/table/table.d.ts +25 -7
  182. package/dist/types/components/table/table.service.d.ts +1 -7
  183. package/dist/types/components/table/table.store.d.ts +4 -2
  184. package/dist/types/components.d.ts +60 -5
  185. package/docs-json.json +274 -49
  186. package/docs-vscode.json +31 -2
  187. package/package.json +3 -3
  188. package/dist/cjs/nano-table-8a898621.js.map +0 -1
  189. package/dist/cjs/table.worker-b0b0044a.js.map +0 -1
  190. package/dist/cjs/transitions-d295a09e.js.map +0 -1
  191. package/dist/esm/nano-table-efdf3dba.js.map +0 -1
  192. package/dist/esm/table.worker-10ba1126.js.map +0 -1
  193. package/dist/esm/transitions-d75d242e.js.map +0 -1
  194. package/dist/nano-components/p-03402e69.entry.js +0 -5
  195. package/dist/nano-components/p-03402e69.entry.js.map +0 -1
  196. package/dist/nano-components/p-2382d5e9.entry.js +0 -5
  197. package/dist/nano-components/p-2382d5e9.entry.js.map +0 -1
  198. package/dist/nano-components/p-47bd0f5d.entry.js +0 -5
  199. package/dist/nano-components/p-49a831a3.entry.js +0 -5
  200. package/dist/nano-components/p-4c6ef60b.js +0 -5
  201. package/dist/nano-components/p-4c6ef60b.js.map +0 -1
  202. package/dist/nano-components/p-61bfb8b9.entry.js +0 -5
  203. package/dist/nano-components/p-61bfb8b9.entry.js.map +0 -1
  204. package/dist/nano-components/p-687350a5.entry.js.map +0 -1
  205. package/dist/nano-components/p-68b18b99.entry.js +0 -5
  206. package/dist/nano-components/p-82295d91.js +0 -5
  207. package/dist/nano-components/p-82295d91.js.map +0 -1
  208. package/dist/nano-components/p-8a6834ff.entry.js +0 -5
  209. package/dist/nano-components/p-9f2524d4.entry.js +0 -5
  210. package/dist/nano-components/p-9f2524d4.entry.js.map +0 -1
  211. package/dist/nano-components/p-9f8b091a.entry.js +0 -5
  212. package/dist/nano-components/p-b7b06e04.js +0 -5
@@ -3,8 +3,12 @@
3
3
  */
4
4
  import { consoleError, h, Fragment, getElement, getRenderingRef, proxyCustomElement, HTMLElement, createEvent, readTask, Host, Build } from '@stencil/core/internal/client';
5
5
  import { a as cyrb53 } from './math.js';
6
+ import { d as debounce } from './throttle.js';
6
7
  import { c as createStore } from './index2.js';
7
- import { d as defineCustomElement$2 } from './icon.js';
8
+ import { d as defineCustomElement$5 } from './icon.js';
9
+ import { d as defineCustomElement$4 } from './progress-bar.js';
10
+ import { d as defineCustomElement$3 } from './skeleton.js';
11
+ import { d as defineCustomElement$2 } from './spinner.js';
8
12
 
9
13
  const CSSNAMESPACE = 'nano-tbl';
10
14
 
@@ -129,17 +133,11 @@ function colsToWorker(columns) {
129
133
  return safeColumns;
130
134
  }
131
135
  const stores = new WeakMap();
132
- async function generateStore(host, rows, columns) {
133
- // augment data with some internal props
134
- rows = rows.map((row, i) => ({
135
- ...row,
136
- __index: i,
137
- __uuid: cyrb53(Object.values(row).join()),
138
- }));
136
+ async function generateStore(host, columns, scrollParent) {
139
137
  const store = {
140
- data: createStore({ rows }),
138
+ data: createStore({ rows: [] }),
141
139
  config: createStore({ columns }),
142
- general: createStore({ workerId: null }),
140
+ general: createStore({ workerId: null, scrollParent, host }),
143
141
  };
144
142
  const id = await createWorkerStore(store.data.state.rows, colsToWorker(store.config.state.columns));
145
143
  store.general.state.workerId = id;
@@ -174,9 +172,15 @@ function storeSetData(host, rows) {
174
172
  const store = stores.get(host);
175
173
  if (!store)
176
174
  return;
177
- if (store.general.state.workerId)
178
- syncDataToWorker(store.general.state.workerId, rows);
175
+ // augment data with some internal props
176
+ rows = rows.map((row, i) => ({
177
+ ...row,
178
+ __index: i,
179
+ __uuid: cyrb53(Object.values(row).join()),
180
+ }));
179
181
  store.data.state.rows = rows;
182
+ if (store.general.state.workerId)
183
+ return syncDataToWorker(store.general.state.workerId, rows);
180
184
  }
181
185
  function storeSetConfig(host, columns) {
182
186
  const store = stores.get(host);
@@ -331,7 +335,7 @@ function cellRender(rowIndex, colIndex) {
331
335
  * @param col - the current column config object
332
336
  * @returns - a JSX node
333
337
  */
334
- function colheadRender(col) {
338
+ function colheadFootRender(col) {
335
339
  const tpl = col?.colTemplate;
336
340
  return tpl ? (tpl(h, col)) : (h(Fragment, null, col.title));
337
341
  }
@@ -358,33 +362,56 @@ const stickyVIOs = new WeakMap();
358
362
  function addHObserver(el, pos, cb) {
359
363
  if (stickyHIOs.get(el))
360
364
  return;
365
+ const store = fetchStores();
366
+ const root = store.general.state.scrollParent;
367
+ const host = store.general.state.host;
361
368
  const observer = new IntersectionObserver(([e]) => {
362
369
  const positions = {};
363
- if (pos === 'start')
364
- positions.start = e.boundingClientRect.x < 0 && !e.isIntersecting;
365
- if (pos === 'end')
370
+ if (pos === 'start') {
371
+ positions.start =
372
+ e.boundingClientRect.x -
373
+ (host.getBoundingClientRect().x + root.scrollLeft) <
374
+ 0 && !e.isIntersecting;
375
+ }
376
+ if (pos === 'end') {
377
+ // TODO - sort these out for RtL
366
378
  positions.end =
367
- e.boundingClientRect.width > e.intersectionRect.width &&
379
+ e.boundingClientRect.right > e.boundingClientRect.width &&
368
380
  !e.isIntersecting;
381
+ }
369
382
  cb(positions);
370
- }, { threshold: [1], rootMargin: '1px 0px 1px 0px' });
383
+ }, {
384
+ threshold: [1],
385
+ rootMargin: '1px 0px 1px 0px',
386
+ root: root === document.scrollingElement ? null : root,
387
+ });
371
388
  stickyHIOs.set(el, observer);
372
389
  requestAnimationFrame(() => observer.observe(el));
373
390
  }
374
391
  function addVObserver(el, pos, cb) {
375
392
  if (stickyVIOs.get(el))
376
393
  return;
394
+ const store = fetchStores();
395
+ const root = store.general.state.scrollParent;
396
+ const host = store.general.state.host;
377
397
  const observer = new IntersectionObserver(([e]) => {
378
- console.log(e);
379
398
  const positions = {};
380
- if (pos === 'top')
381
- positions.top = e.boundingClientRect.y < 0 && !e.isIntersecting;
399
+ if (pos === 'top') {
400
+ positions.top =
401
+ e.boundingClientRect.y -
402
+ (host.getBoundingClientRect().y + root.scrollTop) <
403
+ 0 && !e.isIntersecting;
404
+ }
382
405
  if (pos === 'bottom')
383
406
  positions.bottom =
384
407
  e.boundingClientRect.height > e.intersectionRect.height &&
385
408
  !e.isIntersecting;
386
409
  cb(positions);
387
- }, { threshold: [0.99], rootMargin: '0px 100px 0px 100px' });
410
+ }, {
411
+ threshold: [0.99],
412
+ rootMargin: '0px 100px 0px 100px',
413
+ root: root === document.scrollingElement ? null : root,
414
+ });
388
415
  stickyVIOs.set(el, observer);
389
416
  requestAnimationFrame(() => observer.observe(el));
390
417
  }
@@ -457,7 +484,7 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
457
484
  default:
458
485
  order = 'asc';
459
486
  }
460
- onColumnOrderClick(order, column.prop, e.target.parentElement);
487
+ onColumnOrderClick(order, column.prop, e.target.closest('th'));
461
488
  }
462
489
  let extraProps = {};
463
490
  if (column.columnProperties) {
@@ -473,7 +500,7 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
473
500
  },
474
501
  };
475
502
  let props = extraProps ? mergeProperties(baseProps, extraProps) : baseProps;
476
- const content = colheadRender(column);
503
+ const content = colheadFootRender(column);
477
504
  if (!content)
478
505
  return h(Fragment, null);
479
506
  props =
@@ -491,8 +518,11 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
491
518
  if (['top', 'bottom'].includes(headRenderer.pinned))
492
519
  addVObserver(th, headRenderer.pinned, onColumnPinned);
493
520
  } },
494
- h("button", { class: `${CSSNAMESPACE}__order-btn`, onClick: handleColumnOrderClick },
495
- colheadRender(column),
521
+ h("button", { class: {
522
+ [`${CSSNAMESPACE}__order-btn`]: true,
523
+ [`${CSSNAMESPACE}__cell-content`]: true,
524
+ }, onClick: handleColumnOrderClick },
525
+ colheadFootRender(column),
496
526
  !!column.filter && h("nano-icon", { name: "light/filter" }),
497
527
  !!column.order &&
498
528
  (column.order === 'desc' ? (h("nano-icon", { name: "solid/long-arrow-down" })) : (h("nano-icon", { name: "solid/long-arrow-up" }))),
@@ -505,11 +535,12 @@ const TableColHead = ({ column, headRenderer, onColumnOrderClick, onColumnPinned
505
535
  if (['top', 'bottom'].includes(headRenderer.pinned))
506
536
  addVObserver(th, headRenderer.pinned, onColumnPinned);
507
537
  } },
508
- colheadRender(column),
509
- !!column.filter && h("nano-icon", { name: "light/bars-filter" })));
538
+ h("div", { class: `${CSSNAMESPACE}__cell-content` },
539
+ colheadFootRender(column),
540
+ !!column.filter && h("nano-icon", { name: "light/bars-filter" }))));
510
541
  };
511
- const TableCell = ({ rowIndex, colIndex, }) => {
512
- const content = cellRender(rowIndex, colIndex);
542
+ const TableCell = ({ rowIndex, colIndex, nestedContent, }) => {
543
+ const content = nestedContent || cellRender(rowIndex, colIndex);
513
544
  if (!content)
514
545
  return h(Fragment, null);
515
546
  const store = fetchStores();
@@ -533,7 +564,8 @@ const TableCell = ({ rowIndex, colIndex, }) => {
533
564
  }
534
565
  return (h(CellType
535
566
  // role="gridcell"
536
- , { ...props }, cellRender(rowIndex, colIndex)));
567
+ , { ...props },
568
+ h("div", { class: `${CSSNAMESPACE}__cell-content` }, content)));
537
569
  };
538
570
 
539
571
  const detectScrollSpeed = (() => {
@@ -591,7 +623,7 @@ function isInViewport(el, percentVisible = 100) {
591
623
  percentVisible);
592
624
  }
593
625
 
594
- 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}";
626
+ 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)}";
595
627
 
596
628
  function perMark(name, end = false) {
597
629
  if (!Build.isDev)
@@ -619,6 +651,9 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
619
651
  this.nanoTblAfterFilter = createEvent(this, "nanoTblAfterFilter", 7);
620
652
  this.nanoTblBeforeSearch = createEvent(this, "nanoTblBeforeSearch", 7);
621
653
  this.nanoTblAfterSearch = createEvent(this, "nanoTblAfterSearch", 7);
654
+ this.debounceSetLoading = (l) => {
655
+ this._loading = l;
656
+ };
622
657
  this.renderId = 'tbl-' + id++;
623
658
  this.filters = [];
624
659
  this.currentFilters = '';
@@ -636,8 +671,10 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
636
671
  * @returns A promise
637
672
  */
638
673
  this.sortStart = async (order, column, element) => {
674
+ // did order change?
639
675
  if (this.currentSort === order + ':' + column)
640
676
  return;
677
+ this.loading = true;
641
678
  const sortEvent = this.nanoTblBeforeSort.emit({ column: column, order });
642
679
  if (sortEvent.defaultPrevented)
643
680
  return;
@@ -663,10 +700,13 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
663
700
  console.warn('sort failed', e);
664
701
  this.currentSort = '';
665
702
  }
703
+ finally {
704
+ this.loading = false;
705
+ }
666
706
  };
667
707
  /**
668
- * Attaches an intersection observer to each rendered tbody elements
669
- * shows / hides intersecting blocks' and sets heights for when their hidden
708
+ * Attaches an intersection observer to each rendered tbody element
709
+ * shows / hides intersecting blocks' and sets heights for when they're hidden
670
710
  * @param el - the tbody element to observe
671
711
  * @param blockIndex - the rendering tbody we're attaching the IO to
672
712
  */
@@ -681,8 +721,8 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
681
721
  // The Intersection Observer (IO) fires in an incorrect order when the scrolling is very fast
682
722
  // i.e. we go past blocks 3, 2, 1 and land on 0, but 3 can fire as 'intersecting' after 0.
683
723
  // To fix that, we check - for realsies - if the block IS visible.
684
- // BUT that test is not as sensitive to a block being visible as the IO,
685
- // so doesn't always fire if scrolling slowing
724
+ // BUT that test is not as sensitive to a block being visible via the IO,
725
+ // so doesn't always fire if scrolling slowly
686
726
  // *sigh*
687
727
  readTask(() => {
688
728
  if (this.scrollSpeed < 100 || isInViewport(el, 0.01)) {
@@ -699,7 +739,12 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
699
739
  }
700
740
  });
701
741
  }
702
- }, { threshold: [0] });
742
+ }, {
743
+ threshold: [0],
744
+ root: this.scrollParent === document.scrollingElement
745
+ ? null
746
+ : this.scrollParent,
747
+ });
703
748
  blockIo.observe(el);
704
749
  this.blockIos.set(el, blockIo);
705
750
  };
@@ -711,7 +756,9 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
711
756
  this.type = 'table';
712
757
  this.caption = undefined;
713
758
  this.showCaption = false;
714
- this.rows = [];
759
+ this._loading = true;
760
+ this.placeholderSize = 5;
761
+ this.rows = undefined;
715
762
  this.columns = [];
716
763
  this.headRender = { pinned: 'top' };
717
764
  this.rowRender = undefined;
@@ -724,9 +771,29 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
724
771
  this.blocks = [];
725
772
  this.activeBlocks = [0, 1, 2];
726
773
  this.measureHeight = 0;
774
+ this.debounceSetLoading = debounce(this.debounceSetLoading.bind(this), 50);
775
+ }
776
+ /** Will show a loading state when true.
777
+ * Will be shown automatically if `rows` is a promise waiting to resolve
778
+ * or when performing custom filtering or sorting */
779
+ get loading() {
780
+ return this._loading;
781
+ }
782
+ set loading(l) {
783
+ this.debounceSetLoading(l);
727
784
  }
728
785
  handleRowsChange() {
729
- storeSetData(this.host, this.rows);
786
+ if (!this.rows)
787
+ return;
788
+ this.loading = true;
789
+ Promise.resolve(this.rows).then(async (rows) => {
790
+ await storeSetData(this.host, rows);
791
+ if (!this.isReady) {
792
+ await this.columnInit();
793
+ this.setInitialBlockDimension();
794
+ }
795
+ this.loading = false;
796
+ });
730
797
  }
731
798
  handleColsChange() {
732
799
  storeSetConfig(this.host, this.columns);
@@ -774,6 +841,8 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
774
841
  }
775
842
  // uses the first 'tr' of an active block as our yard stick
776
843
  set measureEle(el) {
844
+ if (!el)
845
+ return;
777
846
  this.measureHeight = el.getBoundingClientRect().height;
778
847
  this.unitHeight =
779
848
  el.querySelector('tr')?.getBoundingClientRect().height || this.unitHeight;
@@ -821,6 +890,7 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
821
890
  perMark('sort', true);
822
891
  }
823
892
  async searchStart() {
893
+ this.loading = true;
824
894
  const sortEvent = this.nanoTblBeforeSearch.emit({ term: this.searchTerm });
825
895
  if (sortEvent.defaultPrevented)
826
896
  return;
@@ -832,7 +902,12 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
832
902
  this.nanoTblAfterSearch.emit({ term: this.searchTerm });
833
903
  perMark('search', true);
834
904
  }
835
- catch (e) { }
905
+ catch (e) {
906
+ console.warn('search failed', e);
907
+ }
908
+ finally {
909
+ this.loading = false;
910
+ }
836
911
  }
837
912
  async filterStart(filters, additive = true) {
838
913
  if (filters) {
@@ -848,6 +923,7 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
848
923
  }
849
924
  if (this.currentFilters === JSON.stringify(this.filters))
850
925
  return;
926
+ this.loading = true;
851
927
  const sortEvent = this.nanoTblBeforeFilter.emit({ filters: this.filters });
852
928
  if (sortEvent.defaultPrevented)
853
929
  return;
@@ -871,7 +947,12 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
871
947
  this.filterComplete();
872
948
  perMark('search', true);
873
949
  }
874
- catch (e) { }
950
+ catch (e) {
951
+ console.warn('filter failed', e);
952
+ }
953
+ finally {
954
+ this.loading = false;
955
+ }
875
956
  }
876
957
  filterComplete() {
877
958
  this.columns = this.columns.map((c) => {
@@ -886,16 +967,20 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
886
967
  /** Scrolls to the top immediately - used whilst sorting / filtering */
887
968
  scrollToTop(element) {
888
969
  const scrollBehaviour = this.scrollParent.style?.scrollBehavior;
970
+ const scrollX = this.scrollParent.scrollLeft;
889
971
  this.scrollParent.style.scrollBehavior = 'auto';
890
- this.host.scrollIntoView();
972
+ if (this.topAnchorEle && !isInViewport(this.topAnchorEle, 0.1))
973
+ this.topAnchorEle.scrollIntoView();
891
974
  if (element)
892
- element.scrollIntoView();
975
+ element.scrollIntoView({ block: 'start' });
976
+ if (scrollX)
977
+ this.scrollParent.scrollLeft = scrollX;
893
978
  if (scrollBehaviour)
894
979
  this.scrollParent.style.scrollBehavior = scrollBehaviour;
895
980
  }
896
981
  setMeasureElement() {
897
982
  readTask(() => {
898
- this.measureEle = this.blockElements.find((b) => !b.classList?.contains(`${CSSNAMESPACE}__inactive`));
983
+ this.measureEle = this.blockElements.find((b) => !b?.classList?.contains(`${CSSNAMESPACE}__inactive`));
899
984
  });
900
985
  }
901
986
  /**
@@ -921,11 +1006,6 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
921
1006
  }
922
1007
  if (i === this.blockElements.length - 1)
923
1008
  resolve();
924
- // const heightGuess = this.getBlockHeight(this.blockElements.indexOf(el));
925
- // writeTask(() => {
926
- // el.style.height = heightGuess;
927
- // if (i === this.blockElements.length - 1) resolve();
928
- // });
929
1009
  });
930
1010
  });
931
1011
  });
@@ -1013,8 +1093,8 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
1013
1093
  if (!el)
1014
1094
  return;
1015
1095
  const height = el.getBoundingClientRect().height;
1016
- // cache height to our block heights
1017
- // array for subsequent renders
1096
+ // cache height to our block heights array
1097
+ // for subsequent renders
1018
1098
  const fBhI = this.blockHeights.findIndex((bh) => bh.blockIndex === blockIndex);
1019
1099
  if (fBhI > 0) {
1020
1100
  this.blockHeights[fBhI] = { height, blockIndex };
@@ -1034,8 +1114,8 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
1034
1114
  // Component lifecycle
1035
1115
  async componentWillLoad() {
1036
1116
  perMark('init');
1037
- this.store = await generateStore(this.host, this.rows, this.columns);
1038
- await this.columnInit();
1117
+ this.store = await generateStore(this.host, this.columns, this.scrollParent);
1118
+ await this.handleRowsChange();
1039
1119
  this.processSlots();
1040
1120
  this.setBlocks();
1041
1121
  this.store.data.onChange('rows', () => this.setBlocks());
@@ -1063,9 +1143,17 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
1063
1143
  }
1064
1144
  render() {
1065
1145
  this.blockElements = [];
1066
- 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) => [
1146
+ 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: {
1147
+ [`${CSSNAMESPACE}__progress-bar`]: true,
1148
+ [`${CSSNAMESPACE}__progress-bar--show`]: this.loading,
1149
+ } }), 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: {
1150
+ [`${CSSNAMESPACE}__caption`]: true,
1151
+ [`${CSSNAMESPACE}__caption--hide`]: !this.showCaption,
1152
+ }, 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) => [
1067
1153
  h(TableColHead, { column: colModel, headRenderer: this.headRender, onColumnOrderClick: this.sortStart, onColumnPinned: this.handleColumnPinned }),
1068
- ]))), this.blocks.map((block, blockIndex) => (h("tbody", { key: block.__uuid, id: `tbody-${this.renderId}-${blockIndex}`, ref: (tb) => {
1154
+ ]))), this.loading &&
1155
+ !this.blocks.length &&
1156
+ [...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) => {
1069
1157
  this.blockElements.push(tb);
1070
1158
  this.setupBlockIO(tb, blockIndex);
1071
1159
  }, class: {
@@ -1076,9 +1164,12 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
1076
1164
  return (h(TableRow, { rowRenderer: this.rowRender, row: row }, this.store.config.state.columns.map((_colModel, colIndex) => (h(TableCell, { rowIndex: rowIndex, colIndex: colIndex })))));
1077
1165
  })) : (h("td", { colSpan: this.store.config.state.columns.length, style: {
1078
1166
  height: this.getBlockHeight(blockIndex),
1079
- } }))))), (this.showFooter || !!this.footRender) && (h("tfoot", null, h(TableHeadFootRow, { rowRenderer: this.footRender, onColumnPinned: this.handleColumnPinned }, this.store.config.state.columns.map((colModel) => [
1167
+ } }))))), this.showFooter && (h("tfoot", null, h(TableHeadFootRow, { rowRenderer: this.footRender, onColumnPinned: this.handleColumnPinned }, this.store.config.state.columns.map((colModel) => [
1080
1168
  h(TableColHead, { column: colModel, headRenderer: this.footRender, onColumnPinned: this.handleColumnPinned }),
1081
- ]))))))));
1169
+ ]))))), !!this.blocks.length && (h("nano-spinner", { type: "circle", class: {
1170
+ [`${CSSNAMESPACE}__spinner`]: true,
1171
+ [`${CSSNAMESPACE}__spinner--show`]: this.loading,
1172
+ } })))));
1082
1173
  }
1083
1174
  get host() { return this; }
1084
1175
  static get watchers() { return {
@@ -1091,6 +1182,8 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
1091
1182
  "type": [1],
1092
1183
  "caption": [1],
1093
1184
  "showCaption": [4, "show-caption"],
1185
+ "loading": [6148],
1186
+ "placeholderSize": [2, "placeholder-size"],
1094
1187
  "rows": [16],
1095
1188
  "columns": [1040],
1096
1189
  "headRender": [16],
@@ -1102,6 +1195,7 @@ const Table = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
1102
1195
  "searchTerm": [1, "search-term"],
1103
1196
  "customFilterFn": [16],
1104
1197
  "customSortFn": [16],
1198
+ "_loading": [32],
1105
1199
  "blocks": [32],
1106
1200
  "activeBlocks": [32],
1107
1201
  "measureHeight": [32],
@@ -1114,7 +1208,7 @@ function defineCustomElement$1() {
1114
1208
  if (typeof customElements === "undefined") {
1115
1209
  return;
1116
1210
  }
1117
- const components = ["nano-table", "nano-icon"];
1211
+ const components = ["nano-table", "nano-icon", "nano-progress-bar", "nano-skeleton", "nano-spinner"];
1118
1212
  components.forEach(tagName => { switch (tagName) {
1119
1213
  case "nano-table":
1120
1214
  if (!customElements.get(tagName)) {
@@ -1122,6 +1216,21 @@ function defineCustomElement$1() {
1122
1216
  }
1123
1217
  break;
1124
1218
  case "nano-icon":
1219
+ if (!customElements.get(tagName)) {
1220
+ defineCustomElement$5();
1221
+ }
1222
+ break;
1223
+ case "nano-progress-bar":
1224
+ if (!customElements.get(tagName)) {
1225
+ defineCustomElement$4();
1226
+ }
1227
+ break;
1228
+ case "nano-skeleton":
1229
+ if (!customElements.get(tagName)) {
1230
+ defineCustomElement$3();
1231
+ }
1232
+ break;
1233
+ case "nano-spinner":
1125
1234
  if (!customElements.get(tagName)) {
1126
1235
  defineCustomElement$2();
1127
1236
  }