@nanoporetech-digital/components 5.1.3 → 5.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.
- package/CHANGELOG.md +26 -0
- package/dist/cjs/{component-store-74d25f63.js → component-store-f1dc1276.js} +2 -2
- package/dist/cjs/{component-store-74d25f63.js.map → component-store-f1dc1276.js.map} +1 -1
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/nano-algolia-filter.cjs.entry.js +2 -2
- package/dist/cjs/nano-algolia-input.cjs.entry.js +2 -2
- package/dist/cjs/nano-algolia.cjs.entry.js +2 -2
- package/dist/cjs/nano-checkbox-group.cjs.entry.js +1 -1
- package/dist/cjs/nano-components.cjs.js +1 -1
- package/dist/cjs/nano-datalist_3.cjs.entry.js +1 -1
- package/dist/cjs/nano-dialog.cjs.entry.js +2 -2
- package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js +2 -2
- package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-global-nav.cjs.entry.js +2 -2
- package/dist/cjs/nano-input.cjs.entry.js +1 -1
- package/dist/cjs/nano-overflow-nav.cjs.entry.js +1 -1
- package/dist/cjs/nano-range.cjs.entry.js +1 -1
- package/dist/cjs/nano-resize-observe_2.cjs.entry.js +3 -1
- package/dist/cjs/nano-resize-observe_2.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-sortable.cjs.entry.js +16 -8
- package/dist/cjs/nano-sortable.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-split-pane.cjs.entry.js +1 -1
- package/dist/cjs/nano-sticker.cjs.entry.js +4 -2
- package/dist/cjs/nano-sticker.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-tab-group.cjs.entry.js +2 -2
- package/dist/cjs/{nano-table-5a7a4d53.js → nano-table-10a40ab3.js} +557 -185
- package/dist/cjs/nano-table-10a40ab3.js.map +1 -0
- package/dist/cjs/nano-table.cjs.entry.js +2 -2
- package/dist/cjs/{table.worker-77e56070.js → table.worker-f04588c1.js} +4 -4
- package/dist/cjs/table.worker-f04588c1.js.map +1 -0
- package/dist/cjs/{table.worker-bd51e29f.js → table.worker-f258383d.js} +1 -1
- package/dist/cjs/{throttle-f55496c8.js → throttle-dfa64b9e.js} +17 -20
- package/dist/cjs/throttle-dfa64b9e.js.map +1 -0
- package/dist/collection/components/resize-observe/resize-observe.js +21 -1
- package/dist/collection/components/resize-observe/resize-observe.js.map +1 -1
- package/dist/collection/components/select/select.css +0 -1
- package/dist/collection/components/sortable/sortable.js +3 -7
- package/dist/collection/components/sortable/sortable.js.map +1 -1
- package/dist/collection/components/sticker/sticker.js +11 -5
- package/dist/collection/components/sticker/sticker.js.map +1 -1
- package/dist/collection/components/table/table-interface.js.map +1 -1
- package/dist/collection/components/table/table.cell.js +43 -10
- package/dist/collection/components/table/table.cell.js.map +1 -1
- package/dist/collection/components/table/table.css +38 -55
- package/dist/collection/components/table/table.header.js +4 -9
- package/dist/collection/components/table/table.header.js.map +1 -1
- package/dist/collection/components/table/table.js +101 -47
- package/dist/collection/components/table/table.js.map +1 -1
- package/dist/collection/components/table/table.pin-service.js +382 -0
- package/dist/collection/components/table/table.pin-service.js.map +1 -0
- package/dist/collection/components/table/table.row.js +39 -46
- package/dist/collection/components/table/table.row.js.map +1 -1
- package/dist/collection/components/table/table.utils.js +0 -124
- package/dist/collection/components/table/table.utils.js.map +1 -1
- package/dist/collection/components/table/table.worker.js +1 -0
- package/dist/collection/components/table/table.worker.js.map +1 -1
- package/dist/collection/utils/events.js +27 -0
- package/dist/collection/utils/events.js.map +1 -0
- package/dist/collection/utils/throttle.js +16 -19
- package/dist/collection/utils/throttle.js.map +1 -1
- package/dist/components/nano-sortable.js +15 -7
- package/dist/components/nano-sortable.js.map +1 -1
- package/dist/components/resize-observe.js +3 -1
- package/dist/components/resize-observe.js.map +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/select.js.map +1 -1
- package/dist/components/sticker.js +3 -1
- package/dist/components/sticker.js.map +1 -1
- package/dist/components/table.js +530 -187
- package/dist/components/table.js.map +1 -1
- package/dist/components/table.worker.js +1 -1
- package/dist/components/throttle.js +16 -19
- package/dist/components/throttle.js.map +1 -1
- package/dist/esm/{component-store-244a8431.js → component-store-c23ebc9c.js} +2 -2
- package/dist/esm/{component-store-244a8431.js.map → component-store-c23ebc9c.js.map} +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/nano-algolia-filter.entry.js +2 -2
- package/dist/esm/nano-algolia-input.entry.js +2 -2
- package/dist/esm/nano-algolia.entry.js +2 -2
- package/dist/esm/nano-checkbox-group.entry.js +1 -1
- package/dist/esm/nano-components.js +1 -1
- package/dist/esm/nano-datalist_3.entry.js +1 -1
- package/dist/esm/nano-dialog.entry.js +2 -2
- package/dist/esm/nano-global-nav-user-profile_3.entry.js +2 -2
- package/dist/esm/nano-global-nav-user-profile_3.entry.js.map +1 -1
- package/dist/esm/nano-global-nav.entry.js +2 -2
- package/dist/esm/nano-input.entry.js +1 -1
- package/dist/esm/nano-overflow-nav.entry.js +1 -1
- package/dist/esm/nano-range.entry.js +1 -1
- package/dist/esm/nano-resize-observe_2.entry.js +3 -1
- package/dist/esm/nano-resize-observe_2.entry.js.map +1 -1
- package/dist/esm/nano-sortable.entry.js +16 -8
- package/dist/esm/nano-sortable.entry.js.map +1 -1
- package/dist/esm/nano-split-pane.entry.js +1 -1
- package/dist/esm/nano-sticker.entry.js +4 -2
- package/dist/esm/nano-sticker.entry.js.map +1 -1
- package/dist/esm/nano-tab-group.entry.js +2 -2
- package/dist/esm/{nano-table-026a0d30.js → nano-table-2bbcaa8d.js} +558 -186
- package/dist/esm/nano-table-2bbcaa8d.js.map +1 -0
- package/dist/esm/nano-table.entry.js +2 -2
- package/dist/esm/{table.worker-c17a27ed.js → table.worker-7324ad73.js} +4 -4
- package/dist/esm/table.worker-7324ad73.js.map +1 -0
- package/dist/esm/{table.worker-bd51e29f.js → table.worker-f258383d.js} +1 -1
- package/dist/esm/{throttle-7836544e.js → throttle-ac4fcefa.js} +17 -20
- package/dist/esm/throttle-ac4fcefa.js.map +1 -0
- package/dist/nano-components/index.esm.js +1 -1
- package/dist/nano-components/nano-components.esm.js +1 -1
- package/dist/nano-components/nano-components.esm.js.map +1 -1
- package/dist/nano-components/{p-7d6065c6.entry.js → p-0697795a.entry.js} +2 -2
- package/dist/nano-components/p-0697795a.entry.js.map +1 -0
- package/dist/nano-components/{p-6975f110.entry.js → p-192902e0.entry.js} +2 -2
- package/dist/nano-components/{p-a6ff5ca6.js → p-1a0b5bc3.js} +2 -2
- package/dist/nano-components/{p-3a761d77.entry.js → p-1b791810.entry.js} +2 -2
- package/dist/nano-components/p-39aec880.entry.js +5 -0
- package/dist/nano-components/{p-3b4b7f40.entry.js → p-3eb6d833.entry.js} +2 -2
- package/dist/nano-components/{p-a1c0afb6.entry.js → p-4884b65a.entry.js} +2 -2
- package/dist/nano-components/p-52ae36ec.js +5 -0
- package/dist/nano-components/{p-34501eae.entry.js → p-565793a2.entry.js} +2 -2
- package/dist/nano-components/p-5aae2588.entry.js +5 -0
- package/dist/nano-components/p-5aae2588.entry.js.map +1 -0
- package/dist/nano-components/{p-935aef3d.entry.js → p-6920ad69.entry.js} +2 -2
- package/dist/nano-components/{p-1c6c94cb.entry.js → p-7baa9e14.entry.js} +2 -2
- package/dist/nano-components/p-7bff5224.js +5 -0
- package/dist/nano-components/p-7bff5224.js.map +1 -0
- package/dist/nano-components/{p-f60fe933.entry.js → p-898cbac7.entry.js} +2 -2
- package/dist/nano-components/p-9b533dc3.js +5 -0
- package/dist/nano-components/p-9b533dc3.js.map +1 -0
- package/dist/nano-components/{p-ace1ffc2.entry.js → p-a362bd23.entry.js} +2 -2
- package/dist/nano-components/{p-eb6c9191.entry.js → p-b72df1aa.entry.js} +2 -2
- package/dist/nano-components/{p-9c4efe14.entry.js → p-bf18e298.entry.js} +2 -2
- package/dist/nano-components/p-bf18e298.entry.js.map +1 -0
- package/dist/nano-components/p-ce5efc3f.entry.js +5 -0
- package/dist/nano-components/p-ce5efc3f.entry.js.map +1 -0
- package/dist/nano-components/{p-1b687f96.entry.js → p-d0eefd52.entry.js} +2 -2
- package/dist/nano-components/{p-1a9d9956.entry.js → p-d74e2642.entry.js} +2 -2
- package/dist/nano-components/{p-bd51e29f.js → p-f258383d.js} +1 -1
- package/dist/types/components/resize-observe/resize-observe.d.ts +2 -0
- package/dist/types/components/sortable/sortable.d.ts +0 -1
- package/dist/types/components/sticker/sticker.d.ts +2 -2
- package/dist/types/components/table/table-interface.d.ts +23 -11
- package/dist/types/components/table/table.cell.d.ts +0 -7
- package/dist/types/components/table/table.d.ts +10 -8
- package/dist/types/components/table/table.header.d.ts +0 -1
- package/dist/types/components/table/table.pin-service.d.ts +90 -0
- package/dist/types/components/table/table.row.d.ts +3 -2
- package/dist/types/components/table/table.utils.d.ts +0 -27
- package/dist/types/components.d.ts +29 -11
- package/dist/types/utils/events.d.ts +15 -0
- package/dist/types/utils/throttle.d.ts +1 -1
- package/docs-json.json +59 -24
- package/docs-vscode.json +2 -2
- package/hydrate/index.js +580 -194
- package/package.json +2 -2
- package/dist/cjs/nano-table-5a7a4d53.js.map +0 -1
- package/dist/cjs/table.worker-77e56070.js.map +0 -1
- package/dist/cjs/throttle-f55496c8.js.map +0 -1
- package/dist/esm/nano-table-026a0d30.js.map +0 -1
- package/dist/esm/table.worker-c17a27ed.js.map +0 -1
- package/dist/esm/throttle-7836544e.js.map +0 -1
- package/dist/nano-components/p-15217442.entry.js +0 -5
- package/dist/nano-components/p-15217442.entry.js.map +0 -1
- package/dist/nano-components/p-2e63676f.js +0 -5
- package/dist/nano-components/p-30cc21c2.entry.js +0 -5
- package/dist/nano-components/p-59eb9caa.js +0 -5
- package/dist/nano-components/p-59eb9caa.js.map +0 -1
- package/dist/nano-components/p-7759d185.entry.js +0 -5
- package/dist/nano-components/p-7759d185.entry.js.map +0 -1
- package/dist/nano-components/p-7d6065c6.entry.js.map +0 -1
- package/dist/nano-components/p-9746b0a5.js +0 -5
- package/dist/nano-components/p-9746b0a5.js.map +0 -1
- package/dist/nano-components/p-9c4efe14.entry.js.map +0 -1
- /package/dist/nano-components/{p-6975f110.entry.js.map → p-192902e0.entry.js.map} +0 -0
- /package/dist/nano-components/{p-a6ff5ca6.js.map → p-1a0b5bc3.js.map} +0 -0
- /package/dist/nano-components/{p-3a761d77.entry.js.map → p-1b791810.entry.js.map} +0 -0
- /package/dist/nano-components/{p-2e63676f.js.map → p-39aec880.entry.js.map} +0 -0
- /package/dist/nano-components/{p-3b4b7f40.entry.js.map → p-3eb6d833.entry.js.map} +0 -0
- /package/dist/nano-components/{p-a1c0afb6.entry.js.map → p-4884b65a.entry.js.map} +0 -0
- /package/dist/nano-components/{p-30cc21c2.entry.js.map → p-52ae36ec.js.map} +0 -0
- /package/dist/nano-components/{p-34501eae.entry.js.map → p-565793a2.entry.js.map} +0 -0
- /package/dist/nano-components/{p-935aef3d.entry.js.map → p-6920ad69.entry.js.map} +0 -0
- /package/dist/nano-components/{p-1c6c94cb.entry.js.map → p-7baa9e14.entry.js.map} +0 -0
- /package/dist/nano-components/{p-f60fe933.entry.js.map → p-898cbac7.entry.js.map} +0 -0
- /package/dist/nano-components/{p-ace1ffc2.entry.js.map → p-a362bd23.entry.js.map} +0 -0
- /package/dist/nano-components/{p-eb6c9191.entry.js.map → p-b72df1aa.entry.js.map} +0 -0
- /package/dist/nano-components/{p-1b687f96.entry.js.map → p-d0eefd52.entry.js.map} +0 -0
- /package/dist/nano-components/{p-1a9d9956.entry.js.map → p-d74e2642.entry.js.map} +0 -0
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"names":["CSSNAMESPACE","isInstanceOf","value","className","C","globalThis","getTransferables","constructor","Object","values","Array","isArray","flatMap","buffer","pendingIds","callbackIds","pending","Map","callbacks","createWorker","workerPath","workerName","workerMsgId","worker","Worker","name","addEventListener","data","workerMsg","id","err","resolve","reject","get","delete","errObj","assign","Error","message","consoleError","forEach","e","createWorkerProxy","exportedMethod","args","Promise","pendingId","i","argLen","length","mainData","set","callbackId","push","postMessage","w","then","colsToWorker","columns","safeColumns","JSON","parse","stringify","c","sortCompareFn","safeCol","find","sc","prop","toString","stores","WeakMap","async","generateStore","host","scrollParent","isReady","store","createStore","rows","config","general","workerId","createWorkerStore","state","use","reset","syncDataToWorker","dispose","syncConfigToWorker","getStore","getDataType","Date","includes","storeSetData","cols","dateCols","filter","col","type","reduce","prev","curr","unknownCols","map","row","colName","coerceDate","_a","Number","cyrb53","join","storeSetConfig","storeSearch","term","workerSearch","console","warn","storeFilter","filters","workerFilter","storeSort","order","workerSort","colDataModel","rowIndex","colIndex","fetchStores","column","rowModel","cellModel","rowDataModel","mergeProperties","current","extra","props","class","style","getElement","getRenderingRef","mergeCellProperties","defaultProps","extraPropsFunc","cellProperties","colheadFootRender","tpl","columnTemplate","h","Fragment","title","stickyHIOs","stickyVIOs","addHObserver","el","pos","cb","root","observer","IntersectionObserver","rootBounds","document","scrollingElement","getBoundingClientRect","positions","start","boundingClientRect","x","scrollLeft","isIntersecting","end","right","width","threshold","rootMargin","observe","once","addVObserver","top","y","scrollTop","target","bottom","height","headerPinClasses","vPinned","classes","classListToStr","classString","entries","on","findScrollParent","element","getComputedStyle","excludeStaticParent","position","overflowRegex","documentElement","parent","parentElement","test","overflow","overflowY","overflowX","isInViewport","percentVisible","r","windowHeight","window","innerHeight","clientHeight","left","Math","floor","TableColHead","headRenderer","onColumnSortClick","onColumnPinned","defaults","handleColumnSortClick","closest","isSortable","sortable","extraProps","columnProperties","baseProps","pinned","undefined","content","colSpan","scope","sort","ref","th","key","onClick","cellRender","cellTemplate","model","d","isNaN","toLocaleDateString","toLocaleTimeString","_b","baseCellClasses","TableCell","nestedContent","Content","CellType","rowHeader","rowSpan","ContentWrap","wrap","autoTooltip","notifyContentFit","onNanoResizeContentFitChange","firstElementChild","disabled","detail","placement","onNanoShow","zIndex","onNanoHide","slot","header","children","cell","TableRow","rowRenderer","utils","rowProperties","template","toRender","renderedRow","__uuid","node","vtag","vkey","vattrs","vchildren","cNode","classList","contains","TableHeadFootRow","tableCss","Table","hostRef","this","renderId","currentFilters","currentSort","cacheScrollPosition","measureHeight","blockHeights","unitHeight","_isReady","sortStart","_loading","sortEvent","nanoTblBeforeSort","emit","defaultPrevented","scrollToTop","customSortFn","res","sortComplete","blocks","scrollHandler","isActive","primaryBlockIndex","readTask","scrollY","cumulativeHeight","offsetTop","blockIndex","blockLen","getBlockHeight","potentialBlocks","max","activeBlocks","handleColumnPinned","applied","tableEle","toggle","handleResizeChange","tableWrapperEle","split","add","cl","debounceSetLoading","debounce","bind","loading","internalLoading","l","handleRowsChange","columnInit","requestAnimationFrame","setInitialBlockDimension","blocksLength","handleSearchTermChange","searchStart","virtualTotalItemsChangeHandler","setBlocks","filterStart","additive","columnNames","f","splice","measureEle","potentialHeight","abs","querySelector","_scrollParent","ele","removeEventListener","_primaryBlockIndex","nanoTblBlockRendered","block","totalBlocks","blockElements","ready","handleReady","hash","location","idRow","scrollIntoView","nanoTblReady","nanoTblAfterSort","nanoTblBeforeSearch","searchTerm","nanoTblAfterSearch","ff","nanoTblBeforeFilter","customFilterFn","filterComplete","cFilter","nanoTblAfterFilter","scrollBehaviour","scrollBehavior","scrollX","topAnchorEle","setTimeout","setMeasureElement","b","testForDimensions","dimensionsReady","disconnect","dRows","virtualTotalItems","perBlock","cachedBlockHeight","bh","blockLength","setBlockHeight","fBhIdx","findIndex","processSlots","caption","error","setupActiveWatcher","activeWatcherIo","io","onChange","connectedCallback","componentDidLoad","componentShouldUpdate","_newVal","_oldVal","stateName","componentWillRender","componentDidRender","disconnectedCallback","render","Host","a","states","onNanoResizeStateChange","div","tabindex","indeterminate","role","tbl","showCaption","headRender","colModel","defaultSort","keys","_colModel","hidden","tb","rowRender","showFooter","footRender"],"sources":["./src/components/table/table.constants.ts","@worker-helper","./src/components/table/table.store.ts","./src/components/table/table.utils.tsx","./src/components/table/table.header.tsx","./src/components/table/table.cell.tsx","./src/components/table/table.row.tsx","./src/components/table/table.scss?tag=nano-table","./src/components/table/table.tsx"],"sourcesContent":["export const CSSNAMESPACE = 'nano-tbl';\n","\nimport { consoleError } from '@stencil/core/internal';\n\n\nconst isInstanceOf = (value, className) => {\n const C = globalThis[className];\n return C != null && value instanceof C;\n}\nconst getTransferables = (value) => {\n if (value != null) {\n if (\n isInstanceOf(value, \"ArrayBuffer\") ||\n isInstanceOf(value, \"MessagePort\") ||\n isInstanceOf(value, \"ImageBitmap\") ||\n isInstanceOf(value, \"OffscreenCanvas\")\n ) {\n return [value];\n }\n if (typeof value === \"object\") {\n if (value.constructor === Object) {\n value = Object.values(value);\n }\n if (Array.isArray(value)) {\n return value.flatMap(getTransferables);\n }\n return getTransferables(value.buffer);\n }\n }\n return [];\n};\n\nlet pendingIds = 0;\nlet callbackIds = 0;\nconst pending = new Map();\nconst callbacks = new Map();\n\nexport const createWorker = (workerPath, workerName, workerMsgId) => {\n const worker = new Worker(workerPath, {name:workerName});\n\n worker.addEventListener('message', ({data}) => {\n if (data) {\n const workerMsg = data[0];\n const id = data[1];\n const value = data[2];\n\n if (workerMsg === workerMsgId) {\n const err = data[3];\n const [resolve, reject, callbackIds] = pending.get(id);\n pending.delete(id);\n\n if (err) {\n const errObj = (err.isError)\n ? Object.assign(new Error(err.value.message), err.value)\n : err.value;\n\n consoleError(errObj);\n reject(errObj);\n } else {\n if (callbackIds) {\n callbackIds.forEach(id => callbacks.delete(id));\n }\n resolve(value);\n }\n } else if (workerMsg === workerMsgId + '.cb') {\n try {\n callbacks.get(id)(...value);\n } catch (e) {\n consoleError(e);\n }\n }\n }\n });\n\n return worker;\n};\n\nexport const createWorkerProxy = (worker, workerMsgId, exportedMethod) => (\n (...args) => new Promise((resolve, reject) => {\n let pendingId = pendingIds++;\n let i = 0;\n let argLen = args.length;\n let mainData = [resolve, reject];\n pending.set(pendingId, mainData);\n\n for (; i < argLen; i++) {\n if (typeof args[i] === 'function') {\n const callbackId = callbackIds++;\n callbacks.set(callbackId, args[i]);\n args[i] = [workerMsgId + '.cb', callbackId];\n (mainData[2] = mainData[2] || []).push(callbackId);\n }\n }\n const postMessage = (w) => (\n w.postMessage(\n [workerMsgId, pendingId, exportedMethod, args],\n getTransferables(args)\n )\n );\n if (worker.then) {\n worker.then(postMessage);\n } else {\n postMessage(worker);\n }\n })\n);\n","import { createStore, ObservableMap } from '@stencil/store';\nimport { cyrb53 } from '../../utils/math';\nimport {\n createWorkerStore,\n syncConfigToWorker,\n syncDataToWorker,\n workerFilter,\n workerSearch,\n workerSort,\n} from './table.worker';\nimport type { TableTypes } from '../../interface';\n\nexport interface TableStores {\n data: ObservableMap<{ rows: TableTypes.NanoTable['rows'] }>;\n config: ObservableMap<{ columns: TableTypes.NanoTable['columns'] }>;\n general: ObservableMap<{\n workerId: string;\n scrollParent: HTMLElement;\n host: HTMLNanoTableElement;\n isReady: boolean;\n isActive?: boolean;\n }>;\n}\n\nfunction colsToWorker(columns: TableTypes.NanoTable['columns']) {\n const safeColumns: Partial<TableTypes.ColumnConfig>[] = JSON.parse(\n JSON.stringify(columns)\n );\n columns.forEach((c) => {\n if (!!c?.sortCompareFn) {\n const safeCol = safeColumns.find((sc) => sc.prop === c.prop);\n safeCol.sortCompareFn = c.sortCompareFn.toString();\n }\n });\n return safeColumns;\n}\n\nconst stores: WeakMap<HTMLElement, TableStores> = new WeakMap();\n\nexport async function generateStore(\n host: HTMLNanoTableElement,\n columns: TableTypes.NanoTable['columns'],\n scrollParent: HTMLElement,\n isReady: boolean\n) {\n const store: TableStores = {\n data: createStore({ rows: [] }),\n config: createStore({ columns }),\n general: createStore({ workerId: null, scrollParent, host, isReady }),\n };\n\n const id = await createWorkerStore(\n store.data.state.rows,\n colsToWorker(store.config.state.columns)\n );\n store.general.state.workerId = id;\n stores.set(host, store);\n\n // sync data from our store to our worker\n\n store.data.use({\n reset: () => {\n if (store.general.state.workerId)\n syncDataToWorker(store.general.state.workerId, null);\n },\n dispose: () => {\n if (store.general.state.workerId)\n syncDataToWorker(store.general.state.workerId, null);\n },\n });\n store.config.use({\n reset: () => {\n if (store.general.state.workerId)\n syncConfigToWorker(store.general.state.workerId, null);\n },\n dispose: () => {\n if (store.general.state.workerId)\n syncConfigToWorker(store.general.state.workerId, null);\n },\n });\n return store;\n}\n\nexport function getStore(host: HTMLElement) {\n return stores.get(host);\n}\n\nfunction getDataType(value: any): TableTypes.ColumnType {\n if (value instanceof Date) {\n return 'date';\n }\n if (['number', 'string', 'boolean'].includes(typeof value)) {\n return typeof value as 'string' | 'number' | 'boolean';\n }\n return 'unknown';\n}\n\nexport function storeSetData(host: HTMLElement, rows: TableTypes.RowData[]) {\n const store = stores.get(host);\n if (!store) return;\n\n const cols = store.config.state.columns;\n const dateCols: (keyof TableTypes.RowData)[] = cols\n .filter((col) => col.type === 'date')\n .reduce((prev, curr) => {\n return [...prev, curr.prop];\n }, []);\n const unknownCols: TableTypes.RowData[] = cols.filter((col) => !col.type);\n\n // augments data with some internal props.\n // discern unknown column types\n // convert dates to numbers for worker\n rows = rows.map((row, i) => {\n // try our best to discern the column type (from first row) if unset\n if (unknownCols.length && i === 0) {\n store.config.state.columns = cols.map((col) => {\n if (unknownCols.includes(col) && row[col.prop] && !col.type) {\n col.type = getDataType(row[col.prop]);\n if (col.type === 'date') dateCols.push(col.prop);\n }\n return col;\n });\n }\n\n // convert date columns into numbers to send to our worker\n dateCols.forEach((colName) => {\n // coerce any date type;\n // Date(), timestamp, valid date string\n const coerceDate = new Date(row[colName]) ?? null;\n if (!!coerceDate && Number(coerceDate)) row[colName] = Number(coerceDate);\n });\n\n row['__index'] = i;\n row['__uuid'] = cyrb53(cols.map((c) => row[c.prop]).join());\n\n return row;\n });\n store.data.state.rows = rows;\n\n if (store.general.state.workerId)\n return syncDataToWorker(store.general.state.workerId, rows);\n}\n\nexport function storeSetConfig(\n host: HTMLElement,\n columns: TableTypes.ColumnConfig[]\n) {\n const store = stores.get(host);\n if (!store) return;\n\n store.config.state.columns = columns;\n\n if (store.general.state.workerId)\n return syncConfigToWorker(\n store.general.state.workerId,\n colsToWorker(columns)\n );\n}\n\nexport async function storeSearch(host: HTMLElement, term: string) {\n const store = stores.get(host);\n if (!store || !store.general.state.workerId) return;\n\n try {\n store.data.state.rows = await workerSearch(\n store.general.state.workerId,\n term\n );\n } catch (e) {\n console.warn(e);\n }\n}\n\nexport async function storeFilter(\n host: HTMLElement,\n filters: TableTypes.Filter[]\n) {\n const store = stores.get(host);\n if (!store || !store.general.state.workerId) return;\n\n try {\n store.data.state.rows = await workerFilter(\n store.general.state.workerId,\n filters\n );\n } catch (e) {\n console.warn(e);\n }\n}\n\nexport async function storeSort(\n host: HTMLNanoTableElement,\n prop: TableTypes.Prop,\n order: TableTypes.Order\n) {\n const store = stores.get(host);\n if (!store || !store.general.state.workerId) return;\n\n try {\n store.data.state.rows = await workerSort(\n store.general.state.workerId,\n prop,\n order\n );\n } catch (e) {\n console.warn(e);\n }\n}\n","import { getRenderingRef, getElement, VNode, h, Fragment } from '@stencil/core';\nimport { getStore } from './table.store';\nimport { CSSNAMESPACE } from './table.constants';\nimport type { TableTypes } from '../../interface';\n\ntype ValidRenderTypes = 'tr' | 'th' | 'td';\n\n/**\n * Get a model object for custom cell / property renderers.\n * @param rowIndex - the current row index being rendered\n * @param colIndex - the current column index being rendered\n * @returns a model object which will be passed to custom renderers\n */\nexport function colDataModel(\n rowIndex: number,\n colIndex: number\n): TableTypes.RenderModel {\n const store = fetchStores();\n const columns = store.config.state.columns;\n const rows = store.data.state.rows;\n\n const column = columns[colIndex];\n const prop: TableTypes.ColumnProp | undefined = column?.prop;\n const rowModel = rows[rowIndex];\n const cellModel = rowModel ? rowModel[columns[colIndex].prop] : '';\n\n return {\n prop,\n cellModel,\n column,\n rowIndex,\n rowModel,\n };\n}\n\n/**\n * Get a model object for custom row renderers.\n * @param rowIndex\n * @returns a model object passed to custom row renderers\n */\nexport function rowDataModel(rowIndex: number): TableTypes.RowDataSchemaModel {\n const store = fetchStores();\n const rows = store.data.state.rows;\n const rowModel = rows[rowIndex];\n\n return {\n rowModel,\n rowIndex,\n };\n}\n\n/**\n * Merges 2 objects of properties together\n * @param current - property object\n * @param extra - additional object property\n * @returns - merged properties that can be applied to a node\n */\nexport function mergeProperties<\n T extends TableTypes.CellProps | TableTypes.CellProps\n>(current: T, extra: T) {\n if (!extra) return current;\n\n // top level merge\n const props: T = { ...extra, ...current };\n\n // deeper merge\n // merge classes maps or strings\n if (extra.class) {\n if (typeof extra.class === 'object' && typeof props.class === 'object') {\n props.class = { ...extra.class, ...props.class };\n } else if (\n typeof extra.class === 'string' &&\n typeof props.class === 'object'\n ) {\n props.class[extra.class] = true;\n } else if (typeof props.class === 'string') {\n props.class += ' ' + extra.class;\n }\n }\n // merge style\n if (extra.style) {\n props.style = { ...extra.style, ...props.style };\n }\n return props;\n}\n\n/**\n * Returns the current nano-table's stores.\n * @returns the current nano-table stores\n */\nexport function fetchStores() {\n return getStore(getElement(getRenderingRef()));\n}\n\n/**\n * Merges any defined cell properties with properties\n * required by `nano-table` functionality\n * @param rowIndex - the current row index being rendered\n * @param colIndex = the current column index being rendered\n * @param defaultProps - default properties required by `nano-table`\n * @returns - the merged properties that will be applied to a node\n */\nexport function mergeCellProperties(\n rowIndex: number,\n colIndex: number,\n defaultProps: TableTypes.CellProps\n): TableTypes.CellProps {\n const props: TableTypes.CellProps = { ...defaultProps };\n const extraPropsFunc =\n fetchStores().config.state.columns[colIndex]?.cellProperties;\n if (!extraPropsFunc) return props;\n\n const data = colDataModel(rowIndex, colIndex);\n const extra = extraPropsFunc(data);\n if (!extra) return props;\n\n return mergeProperties(props, extra);\n}\n\n/**\n * Renders a table header (within a thead) using a custom template if set.\n * @param col - the current column config object\n * @returns - a JSX node\n */\nexport function colheadFootRender(col: TableTypes.ColumnConfig): VNode {\n const tpl = col?.columnTemplate;\n return tpl ? (\n tpl(h as unknown as TableTypes.HFunc<VNode>, col)\n ) : (\n <Fragment>{col.title}</Fragment>\n );\n}\n\nconst stickyHIOs: WeakMap<HTMLTableCellElement, IntersectionObserver> =\n new WeakMap();\nconst stickyVIOs: WeakMap<HTMLTableCellElement, IntersectionObserver> =\n new WeakMap();\n\n/**\n * Adds element to Intersection Observer. Fires when element changes on the x axis\n * @param el - an element to observe\n * @param pos - the edge to watch (start or end)\n * @param cb - callback when an intersection state changes.\n */\nexport function addHObserver(\n el: HTMLTableCellElement,\n pos: TableTypes.Position,\n cb: TableTypes.PinnedCb\n) {\n if (stickyHIOs.get(el)) return;\n\n const store = fetchStores();\n const root = store.general.state.scrollParent;\n\n const observer = new IntersectionObserver(\n ([e]) => {\n const rootBounds =\n e.rootBounds || document.scrollingElement.getBoundingClientRect();\n const positions: { [key in TableTypes.Position]?: boolean } = {};\n if (pos === 'start') {\n positions.start =\n e.boundingClientRect.x - (rootBounds.x + root.scrollLeft) < 0 &&\n !e.isIntersecting;\n }\n if (pos === 'end') {\n // TODO - sort these out for RtL\n positions.end =\n e.boundingClientRect.right > e.boundingClientRect.width &&\n !e.isIntersecting;\n }\n if (!!cb) cb(positions);\n },\n {\n threshold: [1],\n rootMargin: '1px 0px 100px 0px',\n root: root === document.scrollingElement ? null : root,\n }\n );\n stickyHIOs.set(el, observer);\n\n if (store.general.state.isReady) {\n observer.observe(el);\n } else {\n store.general.state.host.addEventListener(\n 'nanoTblReady',\n () => {\n observer.observe(el);\n },\n { once: true }\n );\n }\n}\n\n/**\n * Adds element to Intersection Observer. Fires when element changes on the y axis\n * @param el - an element to observe\n * @param pos - the edge to watch (start or end)\n * @param cb - callback when an intersection state changes.\n */\nexport function addVObserver(\n el: HTMLTableCellElement,\n pos: TableTypes.Position,\n cb: TableTypes.PinnedCb\n) {\n if (stickyVIOs.get(el)) return;\n\n const store = fetchStores();\n const root = store.general.state.scrollParent;\n\n const observer = new IntersectionObserver(\n ([e]) => {\n const rootBounds =\n e.rootBounds || document.scrollingElement.getBoundingClientRect();\n const positions: { [key in TableTypes.Position]?: boolean } = {};\n if (pos === 'top') {\n positions.top =\n e.boundingClientRect.y - (rootBounds.y + root.scrollTop) < 0 &&\n !e.isIntersecting;\n }\n if (pos === 'bottom') {\n const boundingClientRect = e.target.getBoundingClientRect();\n positions.bottom =\n boundingClientRect.height + boundingClientRect.y >\n rootBounds.height && !e.isIntersecting;\n }\n if (!!cb) cb(positions);\n },\n {\n threshold: [1],\n rootMargin: '0px 100px 0px 100px',\n root: root === document.scrollingElement ? null : root,\n }\n );\n stickyVIOs.set(el, observer);\n\n if (store.general.state.isReady) {\n observer.observe(el);\n } else {\n store.general.state.host.addEventListener(\n 'nanoTblReady',\n () => {\n observer.observe(el);\n },\n { once: true }\n );\n }\n}\n\n/**\n * Renders a class string or map for pinned classes on the v axis.\n * @param type - element tagName\n * @param vPinned - whether element is currently pinned vertically to top or bottom\n * @param toString - render as a string (defaults to class map)\n * @returns a class string or class map\n */\nexport function headerPinClasses(\n type: ValidRenderTypes,\n vPinned?: TableTypes.Position,\n toString?: false\n): { [key: string]: boolean };\nexport function headerPinClasses(\n type: ValidRenderTypes,\n vPinned?: TableTypes.Position,\n toString?: true\n): string;\nexport function headerPinClasses(\n type: ValidRenderTypes,\n vPinned?: TableTypes.Position,\n toString = false\n): { [key: string]: boolean } | string {\n const classes = {\n [`${CSSNAMESPACE}__${type}`]: true,\n [`${CSSNAMESPACE}__pin`]: !!vPinned,\n [`${CSSNAMESPACE}__pin--top`]: vPinned === 'top',\n [`${CSSNAMESPACE}__pin--bottom`]: vPinned === 'bottom',\n };\n\n if (toString) return classListToStr(classes);\n return classes;\n}\n\n/**\n * Turns a class map {'string': boolean} to class string\n * @param classes - the class map to convert\n * @returns a class string\n */\nexport function classListToStr(classes: { [key: string]: boolean }): string {\n let classString = '';\n Object.entries(classes).forEach(([className, on]) => {\n if (on) classString += className + ' ';\n });\n return classString;\n}\n\n/**\n * Detects the current scroll speed as a number.\n * Use within a scroll listener\n */\nexport const detectScrollSpeed = (() => {\n let lastPos: number;\n let newPos: number;\n let timer: number;\n let delta: number;\n const delay = 60; // in \"ms\" (higher means lower fidelity )\n\n const clear = () => {\n lastPos = null;\n delta = 0;\n };\n clear();\n\n return () => {\n newPos = window.scrollY;\n if (lastPos != null) delta = newPos - lastPos;\n lastPos = newPos;\n window.clearTimeout(timer);\n timer = window.setTimeout(clear, delay);\n return delta;\n };\n})();\n\n/**\n * Attempts to find the closes scrolling parental element\n * @param element - the element from which to traverse up the DOM\n * @returns - the closest scrolling parental element\n */\nexport function findScrollParent(element: HTMLElement) {\n let style = getComputedStyle(element);\n const excludeStaticParent = style.position === 'absolute';\n const overflowRegex = /(auto|scroll)/;\n\n if (style.position === 'fixed') return document.documentElement;\n for (let parent = element; (parent = parent.parentElement); ) {\n style = getComputedStyle(parent);\n if (excludeStaticParent && style.position === 'static') {\n continue;\n }\n if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX))\n return parent;\n }\n return document.documentElement;\n}\n\n/**\n * Checks whether an element is currently viewable within the viewport\n * @param el - element to check\n * @param percentVisible - the percentage of the element that should be within the viewport\n * @returns true if the element's area percentage is visible\n */\nexport function isInViewport(el: Element, percentVisible = 100) {\n const r = el.getBoundingClientRect();\n const windowHeight =\n window.innerHeight || document.documentElement.clientHeight;\n\n if (\n !r.bottom &&\n !r.top &&\n !r.left &&\n !r.right &&\n !r.height &&\n !r.width &&\n !r.x &&\n !r.y\n )\n return false;\n\n return !(\n Math.floor(100 - ((r.top >= 0 ? 0 : r.top) / +-r.height) * 100) <\n percentVisible ||\n Math.floor(100 - ((r.bottom - windowHeight) / r.height) * 100) <\n percentVisible\n );\n}\n\n/**\n * Immutable array re-order\n * @param from - the index to move from\n * @param to - the index to move to\n * @param arr - the array to re-order\n * @returns - a new, re-orderd array\n */\nexport function arrMove(from: number, to: number, arr: any[]) {\n const newArr = [...arr];\n const item = newArr.splice(from, 1)[0];\n newArr.splice(to, 0, item);\n return newArr;\n}\n","import { Fragment, FunctionalComponent, h } from '@stencil/core';\nimport { CSSNAMESPACE } from './table.constants';\nimport {\n addHObserver,\n addVObserver,\n colheadFootRender,\n headerPinClasses,\n mergeProperties,\n} from './table.utils';\nimport type { TableTypes } from '../../interface';\n\n// TABLE HEADERS\n// (thead > tr > th, tfoot > tr > th)\n\ntype TableColHeadProps = {\n column: TableTypes.ColumnConfig;\n headRenderer: TableTypes.HeadFootRenderer;\n onColumnSortClick?: (\n order: TableTypes.Order,\n column: TableTypes.Prop,\n el: HTMLTableCellElement\n ) => void;\n onColumnPinned?: TableTypes.PinnedCb;\n defaults: { sortable?: boolean };\n};\n\nexport const TableColHead: FunctionalComponent<TableColHeadProps> = ({\n column,\n headRenderer,\n onColumnSortClick,\n onColumnPinned,\n defaults,\n}) => {\n // Sort handling\n\n function handleColumnSortClick(e: MouseEvent & { target: HTMLElement }) {\n let order;\n switch (column.order) {\n case 'asc':\n order = 'desc';\n break;\n case 'desc':\n order = null;\n break;\n default:\n order = 'asc';\n }\n onColumnSortClick(order, column.prop, e.target.closest('th'));\n }\n\n function isSortable() {\n return (\n (!!defaults.sortable && column.sortable !== false) ||\n (!defaults.sortable && column.sortable === true)\n );\n }\n\n let extraProps = {};\n if (column.columnProperties) {\n extraProps = column.columnProperties(column) || extraProps;\n }\n\n const baseProps = {\n class: {\n ...headerPinClasses('th', headRenderer?.pinned),\n [`${CSSNAMESPACE}__pin--start`]: column.pinned === 'start',\n [`${CSSNAMESPACE}__pin--end`]: column.pinned === 'end',\n [`${CSSNAMESPACE}__ordered`]: !!column.order,\n [`${CSSNAMESPACE}__filtered`]:\n column.filter !== undefined && column.filter !== null,\n },\n };\n let props = extraProps ? mergeProperties(baseProps, extraProps) : baseProps;\n const content = colheadFootRender(column);\n\n if (!content) return <Fragment></Fragment>;\n\n props =\n Number((props as TableTypes.CellProps).colSpan) > 1\n ? { ...props, scope: 'colgroup' }\n : { ...props, scope: 'col' };\n\n if (isSortable()) {\n const sort = column.order\n ? column.order === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none';\n\n props = { ...props, 'aria-sort': sort };\n }\n\n return (\n <th\n {...props}\n ref={(th) => {\n if (['end', 'start'].includes(column.pinned))\n addHObserver(th, column.pinned, onColumnPinned);\n if (['top', 'bottom'].includes(headRenderer.pinned))\n addVObserver(th, headRenderer.pinned, onColumnPinned);\n }}\n key={column.prop}\n >\n {isSortable() ? (\n <button\n class={{\n [`${CSSNAMESPACE}__order-btn`]: true,\n [`${CSSNAMESPACE}__cell-content`]: true,\n }}\n onClick={handleColumnSortClick}\n >\n {colheadFootRender(column)}\n {column.filter !== undefined && column.filter !== null && (\n <nano-icon name=\"light/filter\" />\n )}\n {!!column.order &&\n (column.order === 'desc' ? (\n <nano-icon name=\"solid/long-arrow-down\" />\n ) : (\n <nano-icon name=\"solid/long-arrow-up\" />\n ))}\n <div class={`${CSSNAMESPACE}__status-icons`}>\n <nano-icon name=\"light/chevron-down\" />\n </div>\n </button>\n ) : (\n <div class={`${CSSNAMESPACE}__cell-content`}>\n {colheadFootRender(column)}\n {column.filter !== undefined && column.filter !== null && (\n <nano-icon name=\"light/bars-filter\" />\n )}\n </div>\n )}\n </th>\n );\n};\n","import { Fragment, FunctionalComponent, h, VNode } from '@stencil/core';\nimport { CSSNAMESPACE } from './table.constants';\nimport {\n classListToStr,\n colDataModel,\n fetchStores,\n mergeCellProperties,\n} from './table.utils';\nimport type { NanoResizeObserveCustomEvent, TableTypes } from '../../interface';\n\n// TABLE CELL\n// (tbody > tr > td, tbody > tr > th)\n\n/**\n * Renders a cell using a custom renderer if set.\n * @param rowIndex - the current row index being rendered\n * @param colIndex - the current column index being rendered\n * @returns - a JSX node\n */\nexport function cellRender(rowIndex: number, colIndex: number): VNode {\n const store = fetchStores();\n const columns = store.config.state.columns;\n const tpl = columns[colIndex]?.cellTemplate;\n const model = colDataModel(rowIndex, colIndex);\n\n if (!!model.cellModel && columns[colIndex].type === 'date') {\n const d = new Date(model.cellModel);\n if (d instanceof Date && !isNaN(d as any)) {\n model.cellModel = !tpl\n ? `${new Date(model.cellModel).toLocaleDateString()} ${new Date(\n model.cellModel\n ).toLocaleTimeString()}`\n : d;\n }\n }\n\n return tpl ? (\n tpl(h as unknown as TableTypes.HFunc<VNode>, model)\n ) : model.cellModel !== undefined && model.cellModel !== null ? (\n <Fragment>{model.cellModel?.toString()}</Fragment>\n ) : (\n ''\n );\n}\n\nexport const baseCellClasses = (\n colIndex: number,\n toString: boolean = false\n) => {\n const store = fetchStores();\n const column = store.config.state.columns[colIndex];\n\n const classes = {\n [`${CSSNAMESPACE}__td`]: true,\n [`${CSSNAMESPACE}__ordered`]: !!column.order,\n [`${CSSNAMESPACE}__pin`]: !!column.pinned,\n [`${CSSNAMESPACE}__pin--start`]: column.pinned === 'start',\n [`${CSSNAMESPACE}__pin--end`]: column.pinned === 'end',\n };\n\n if (toString) return classListToStr(classes);\n return classes;\n};\n\ntype TableCellProps = {\n rowIndex: number;\n colIndex: number;\n nestedContent?: () => VNode;\n};\n\nexport const TableCell: FunctionalComponent<TableCellProps> = ({\n rowIndex,\n colIndex,\n nestedContent,\n}) => {\n const Content = () =>\n nestedContent\n ? nestedContent()\n : cellRender(rowIndex, colIndex) || (\n <span class=\"placeholder\"> </span>\n );\n\n let CellType = 'td';\n const store = fetchStores();\n const column = store.config.state.columns[colIndex];\n let props = mergeCellProperties(rowIndex, colIndex, {\n class: baseCellClasses(colIndex),\n });\n\n if (column.rowHeader) {\n props =\n Number((props as TableTypes.CellProps).rowSpan) > 1\n ? { ...props, scope: 'rowgroup' }\n : { ...props, scope: 'row' };\n CellType = 'th';\n }\n\n const ContentWrap = (props) => (\n <div\n {...props}\n class={{\n [`${CSSNAMESPACE}__cell-content`]: true,\n [`${CSSNAMESPACE}__cell-content--wrap`]: !!column.wrap,\n }}\n >\n <Content />\n </div>\n );\n\n return (\n <CellType\n // role=\"gridcell\"\n {...props}\n >\n {column.autoTooltip && !column.wrap ? (\n <nano-resize-observe\n notifyContentFit=\"x\"\n onNanoResizeContentFitChange={(\n e: NanoResizeObserveCustomEvent<{ x: boolean }>\n ) =>\n ((e.target.firstElementChild as HTMLNanoTooltipElement).disabled =\n e.detail.x)\n }\n >\n <nano-tooltip\n disabled\n placement=\"top\"\n onNanoShow={(e) =>\n ((e.target.closest(CellType) as HTMLElement).style.zIndex = '100')\n }\n onNanoHide={(e) =>\n ((e.target.closest(CellType) as HTMLElement).style.zIndex = '')\n }\n >\n <ContentWrap />\n <span slot=\"content\">\n <Content />\n </span>\n </nano-tooltip>\n </nano-resize-observe>\n ) : (\n <ContentWrap />\n )}\n </CellType>\n );\n};\n","import { FunctionalComponent, h, VNode } from '@stencil/core';\nimport {\n addHObserver,\n addVObserver,\n headerPinClasses,\n mergeProperties,\n rowDataModel,\n} from './table.utils';\nimport { baseCellClasses } from './table.cell';\nimport { CSSNAMESPACE } from './table.constants';\nimport type { TableTypes } from '../../interface';\n\n// TABLE ROWS\n// (thead > tr, tfoot > tr, tr)\n\ntype TableRowCellHelperProps = { header: boolean; wrap: boolean };\n\ntype TableRowProps = {\n rowRenderer: TableTypes.RowRenderer;\n rowIndex: number;\n rowModel: TableTypes.RowData;\n onColumnPinned?: TableTypes.PinnedCb;\n};\n\nconst TableCell: FunctionalComponent<TableRowCellHelperProps> = (\n { header, wrap },\n children\n): VNode => {\n const cell = (\n <div\n class={{\n [`${CSSNAMESPACE}__cell-content`]: true,\n [`${CSSNAMESPACE}__cell-content--wrap`]: wrap,\n }}\n >\n {children}\n </div>\n );\n return header ? <th scope=\"row\">{cell}</th> : <td>{cell}</td>;\n};\n\nexport const TableRow: FunctionalComponent<TableRowProps> = (\n { rowRenderer, rowIndex, rowModel, onColumnPinned },\n children,\n utils\n) => {\n let extraProps = {};\n\n if (!rowModel) {\n const model = rowDataModel(rowIndex);\n rowModel = model.rowModel;\n }\n\n if (rowRenderer?.rowProperties) {\n extraProps =\n rowRenderer.rowProperties({ rowModel, rowIndex }) || extraProps;\n }\n\n let pinned: TableTypes.Position;\n if (rowRenderer?.pinned && typeof rowRenderer.pinned === 'function') {\n pinned = rowRenderer.pinned();\n }\n\n const baseProps = { class: headerPinClasses('tr', pinned) };\n const props = extraProps ? mergeProperties(baseProps, extraProps) : baseProps;\n const tpl = rowRenderer?.template;\n\n if (tpl) {\n let toRender = tpl(\n h as TableTypes.HFunc<VNode>,\n {\n renderedRow: (\n <tr {...props} key={rowModel.__uuid}>\n {children}\n </tr>\n ),\n rowModel,\n rowIndex,\n },\n TableCell\n );\n\n if (Array.isArray(toRender)) {\n toRender = utils.map(toRender, (node, i) => {\n if (node.vtag === 'tr') {\n if (!node.vkey) node.vkey = `${rowModel.__uuid}_${i}`;\n\n node.vattrs = mergeProperties(\n { class: headerPinClasses('tr', pinned, true) },\n node.vattrs\n );\n\n if (!!node.vchildren) {\n node.vchildren = utils.map(node.vchildren, (cNode, i) => {\n if (['td', 'th'].includes(cNode.vtag.toString())) {\n cNode.vattrs = mergeProperties(\n {\n class:\n headerPinClasses(\n cNode.vtag.toString() as 'th' | 'td',\n pinned,\n true\n ) + baseCellClasses(i, true),\n ref: (th: HTMLTableCellElement) => {\n if ((!!th && pinned === 'top') || pinned === 'bottom')\n addVObserver(th, pinned, onColumnPinned);\n if (!!th && th.classList.contains('nano-tbl__pin--end'))\n addHObserver(th, 'end', onColumnPinned);\n if (!!th && th.classList.contains('nano-tbl__pin--start'))\n addHObserver(th, 'start', onColumnPinned);\n },\n },\n cNode.vattrs\n );\n }\n return cNode;\n });\n }\n }\n return node;\n });\n }\n return toRender;\n }\n\n return (\n <tr {...props} key={rowModel.__uuid}>\n {children}\n </tr>\n );\n};\n\ntype TableHeadFootProps = {\n rowRenderer: TableTypes.HeadFootRenderer;\n onColumnPinned?: TableTypes.PinnedCb;\n};\n\nexport const TableHeadFootRow: FunctionalComponent<TableHeadFootProps> = (\n { rowRenderer, onColumnPinned },\n children,\n utils\n) => {\n let extraProps = {};\n if (rowRenderer.rowProperties) {\n extraProps = rowRenderer.rowProperties() || {};\n }\n\n const TableCell: FunctionalComponent<TableRowCellHelperProps> = (\n { header, wrap },\n children\n ): VNode => {\n const cell = (\n <div\n class={{\n [`${CSSNAMESPACE}__cell-content`]: true,\n [`${CSSNAMESPACE}__cell-content--wrap`]: wrap,\n }}\n >\n {children}\n </div>\n );\n return header !== false ? <th scope=\"col\">{cell}</th> : <td>{cell}</td>;\n };\n\n const pinned = rowRenderer.pinned || null;\n const baseProps = { class: headerPinClasses('tr', null) };\n const props = extraProps ? mergeProperties(baseProps, extraProps) : baseProps;\n const tpl = rowRenderer?.template;\n\n if (tpl) {\n let toRender = tpl(\n h as TableTypes.HFunc<VNode>,\n {\n renderedRow: <tr {...props}>{children}</tr>,\n },\n TableCell\n );\n\n if (Array.isArray(toRender)) {\n toRender = utils.map(toRender, (node) => {\n if (node.vtag === 'tr') {\n node.vattrs = mergeProperties(\n { class: headerPinClasses('tr', pinned, true) },\n node.vattrs\n );\n\n if (!!node.vchildren) {\n node.vchildren = utils.map(node.vchildren, (cNode) => {\n if (['td', 'th'].includes(cNode.vtag.toString())) {\n cNode.vattrs = mergeProperties(\n {\n class: headerPinClasses(\n cNode.vtag.toString() as 'th' | 'td',\n pinned,\n true\n ),\n ref: (th) => {\n if ((!!th && pinned === 'top') || pinned === 'bottom')\n addVObserver(th, pinned, onColumnPinned);\n if (!!th && th.classList.contains('nano-tbl__pin--end'))\n addHObserver(th, 'end', onColumnPinned);\n if (!!th && th.classList.contains('nano-tbl__pin--start'))\n addHObserver(th, 'start', onColumnPinned);\n },\n },\n cNode.vattrs\n );\n }\n return cNode;\n });\n }\n }\n return node;\n });\n }\n return toRender;\n }\n\n return <tr {...props}>{children}</tr>;\n};\n","@use '../../global/style/utilities/globals' as t;\n@use '../../global/style/nano-theme/form' as f;\n\nnano-table {\n /**\n * @prop --max-col-width: Default 200px;\n\n * @prop --color: Deafults to var(--nano-color-mediumgrey, #68767e);\n * @prop --font-size: Deafults to 0.87rem;\n * @prop --cell-line-height: Deafults to 1.5;\n\n * @prop --border-color: Deafults to var(--nano-color-palegrey, #b5aea7);\n * @prop --border-style: Deafults to thin solid var(--border-color);\n * @prop --border-tint-color: Deafults to var(--nano-color-blue, #90c6e7);\n * @prop --border-tint-style: Deafults to 2px solid var(--border-tint-color);\n\n * @prop --cell-bg-rgb: Deafults to var(--nano-color-white-rgb, 255 255 255);\n * @prop --head-bg-rgb: Deafults to var(--cell-bg-rgb);\n * @prop --foot-bg-rgb: Deafults to var(--cell-bg-rgb);\n * @prop --th-row-bg-rgb: Deafults to var(--cell-bg-rgb);\n * @prop --ordered-bg-rgb: Deafults to var(--nano-color-offwhite-rgb, 249 249 251);\n\n * @prop --td-padding-start: Deafults to 0.625rem;\n * @prop --td-padding-end: Deafults to 0.625rem;\n * @prop --td-padding-top: Deafults to 0.5rem;\n * @prop --td-padding-bottom: Deafults to 0.4125rem;\n\n * @prop --th-padding-start: Deafults to 0.625rem;\n * @prop --th-padding-end: Deafults to 0.625rem;\n * @prop --th-padding-top: Deafults to 0.875rem;\n * @prop --th-padding-bottom: Deafults to 0.6875rem;\n\n * @prop --td-padding-v: Deafults to var(--td-padding-top) var(--td-padding-bottom);\n * @prop --td-padding-h: Deafults to var(--td-padding-start) var(--td-padding-end);\n\n * @prop --th-padding-v: Deafults to var(--th-padding-top) var(--th-padding-bottom);\n * @prop --th-padding-h: Deafults to var(--th-padding-start) var(--th-padding-end);\n\n * @prop --foot-th-padding-v: Deafults to var(--td-padding-top) var(--td-padding-bottom);\n * @prop --foot-th-padding-h: Deafults to var(--td-padding-start) var(--td-padding-end);\n\n * @prop --head-th-padding-v: Deafults to var(--th-padding-top) var(--th-padding-bottom);\n * @prop --head-th-padding-h: Deafults to var(--th-padding-start) var(--th-padding-end);\n\n * @prop --bookend-col-padding: Deafults to 2rem;\n */\n\n display: block;\n width: 100%;\n\n // general\n --max-col-width: clamp(200px, 500px, 50vw);\n\n // text\n --color: var(--nano-color-mediumgrey, #68767e);\n --font-size: 0.87rem;\n --cell-line-height: 1.5;\n --thead-font-size: 0.95rem;\n --thead-color: #455560;\n --tfoot-color: #455560;\n\n // borders\n --border-color: #dddbda;\n --border-style: thin solid var(--border-color);\n --border-tint-color: #0084a9;\n --border-tint-style: 3px solid var(--border-tint-color);\n\n // backgrounds\n --cell-bg-rgb: var(--nano-color-white-rgb, 255 255 255);\n --head-bg-rgb: 250 250 249;\n --foot-bg-rgb: var(--head-bg-rgb);\n --th-row-bg-rgb: var(--cell-bg-rgb);\n --ordered-bg-rgb: var(--nano-color-offwhite-rgb, 249 249 251);\n\n // spacing\n --td-padding-start: 0.625rem;\n --td-padding-end: 0.625rem;\n --td-padding-top: 0.5rem;\n --td-padding-bottom: 0.4125rem;\n --th-padding-start: 0.625rem;\n --th-padding-end: 0.625rem;\n --th-padding-top: 0.875rem;\n --th-padding-bottom: 0.6875rem;\n --td-padding-v: var(--td-padding-top) var(--td-padding-bottom);\n --td-padding-h: var(--td-padding-start) var(--td-padding-end);\n --th-padding-v: var(--th-padding-top) var(--th-padding-bottom);\n --th-padding-h: var(--th-padding-start) var(--th-padding-end);\n --foot-th-padding-v: var(--td-padding-top) var(--td-padding-bottom);\n --foot-th-padding-h: var(--td-padding-start) var(--td-padding-end);\n --head-th-padding-v: var(--th-padding-top) var(--th-padding-bottom);\n --head-th-padding-h: var(--th-padding-start) var(--th-padding-end);\n --bookend-col-padding: 2rem;\n}\n\n.nano-tbl {\n $base: &;\n\n color: var(--color);\n text-align: start;\n width: 100%;\n font-size: var(--font-size);\n border-spacing: 0 0;\n border-collapse: separate;\n background: rgb(var(--cell-bg-rgb));\n border-inline-end: 1px solid transparent;\n border-block-start: 1px solid transparent;\n position: relative;\n z-index: 1;\n\n &__wrap {\n display: table;\n min-width: 100%;\n // container-type: inline-size;\n }\n\n &__top-anchor {\n @include t.visually-hide;\n\n position: relative;\n }\n\n &__ordered {\n background-color: var(--ordered-bg);\n border-inline-start: var(--border-style);\n border-inline-end: var(--border-style);\n }\n\n &__order-btn {\n padding: 0;\n border: none;\n outline: none;\n font: inherit;\n background: none;\n appearance: none;\n color: inherit;\n display: flex;\n gap: 10px;\n align-items: center;\n width: 100%;\n\n &:focus-visible {\n outline: none;\n box-shadow: #{f.$control-focus-style} inset;\n }\n }\n\n &__status-icons {\n margin-inline: auto 10px;\n display: flex;\n gap: 10px;\n }\n\n &__progress-bar {\n font-size: 0.2rem;\n position: sticky;\n inset-block-start: 0;\n inset-inline: 0;\n z-index: 10;\n transition: scale 0.25s;\n transform: scale(0);\n width: 100%;\n height: 0;\n\n &--show {\n transform: scale(1);\n height: auto;\n }\n }\n\n &__caption {\n &--hide {\n @include t.visually-hide;\n }\n }\n\n // Shared styles in th, td across thead / tbody / tfoot\n\n &__td,\n &__th {\n line-height: var(--cell-line-height);\n text-align: start;\n border-block-start: var(--border-style);\n max-width: var(--max-col-width);\n background-color: rgb(var(--cell-bg-rgb));\n\n // @container (min-width: 700px) {\n // color: red !important;\n // }\n\n tbody:first-of-type tr:first-child & {\n border-block-start: none;\n }\n\n tbody:last-of-type tr:last-child & {\n border-block-end: var(--border-style);\n }\n\n // 'bookend' (larger) padding on larger screens\n .md & {\n &:first-child #{$base}__cell-content {\n padding-inline-start: var(--bookend-col-padding);\n }\n\n &:last-child #{$base}__cell-content {\n padding-inline-end: var(--bookend-col-padding);\n }\n }\n\n // force override of bookend on small screens css media\n // queries are faster than the breakpoints from `nano-resize-observer`\n @include t.media-breakpoint-down('md') {\n &:first-child #{$base}__cell-content {\n padding-inline-start: var(--td-padding-start) !important;\n }\n\n &:last-child #{$base}__cell-content {\n padding-inline-end: var(--td-padding-end) !important;\n }\n }\n\n thead & {\n color: var(--thead-color);\n font-weight: 800;\n background: rgb(var(--head-bg-rgb) / 90%);\n font-size: var(--thead-font-size);\n border-block-start: none !important;\n\n #{$base}__cell-content {\n padding-block: var(--head-th-padding-v);\n padding-inline: var(--head-th-padding-h);\n }\n\n .nano-sortable__keyboard-handle {\n position: absolute;\n inset-inline-end: 5px;\n inset-block-start: 50%;\n transform: translateY(-50%);\n background: white;\n z-index: 10;\n }\n }\n\n tfoot & {\n color: var(--tfoot-color);\n font-weight: 800;\n border-block-start: none;\n background: rgb(var(--foot-bg-rgb) / 90%);\n font-size: var(--thead-font-size);\n\n #{$base}__cell-content {\n padding-block: var(--foot-th-padding-v);\n padding-inline: var(--foot-th-padding-h);\n }\n }\n\n &.nano-tbl__ordered {\n background-color: rgb(var(--ordered-bg-rgb) / 80%) !important;\n }\n }\n\n &__cell-content {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n padding-block: var(--td-padding-v);\n padding-inline: var(--td-padding-h);\n\n &--no-result {\n padding-block: 2rem;\n }\n\n &--wrap {\n white-space: normal;\n overflow: visible;\n }\n }\n\n tbody {\n will-change: scroll-position;\n opacity: 1;\n transition: 0.1s ease opacity;\n transform: translateZ(0);\n\n &#{$base}__inactive {\n opacity: 0;\n }\n #{$base}__tr:has(~ #{$base}__tr--placeholder) {\n display: none;\n }\n #{$base}__tr--placeholder ~ #{$base}__tr {\n display: none;\n }\n }\n\n // tbody th\n\n th[scope='row'] {\n font-weight: 800;\n margin: 0;\n }\n\n // .sm & th[scope='row'] {\n // max-width: 65vw !important;\n // }\n\n // pinned styles\n\n &__pin {\n position: sticky;\n transform: translateZ(0);\n\n &--start {\n inset-inline: -1px auto;\n transition: max-width 0.25s ease;\n\n &::after {\n content: '';\n position: absolute;\n inset: 0;\n box-shadow: 5px 1px 4px 0 rgb(0 0 0 / 20%);\n opacity: 0;\n z-index: -1;\n }\n\n #{$base}__pinned--start & {\n z-index: 2;\n max-width: 125px !important;\n\n .sm & {\n max-width: var(--max-col-width) !important;\n }\n\n &::after {\n opacity: 1;\n }\n }\n }\n\n &--end {\n /*\n I cannot think of a nice way to make stuck-end columns play nice on small screens :(\n Changing the width when stuck (as we do for stuck-start columns) causes the whole positioning to change.\n This fires the IO, thus un-sticks the column, thus causes the IO to fire which sticks the column ad-infinitum\n */\n #{$base}__pin--start + & {\n inset-inline: auto auto;\n\n &::after {\n display: none;\n }\n }\n\n .sm & {\n inset-inline: auto -1px !important;\n max-width: min(50vw, 200px);\n\n &::after {\n display: block !important;\n content: '';\n position: absolute;\n inset: 0;\n box-shadow: -5px 1px 4px 0 rgb(0 0 0 / 20%);\n opacity: 0;\n z-index: -1;\n }\n }\n\n #{$base}__pinned--end & {\n .sm & {\n &::after {\n opacity: 1;\n }\n }\n }\n }\n\n &--top {\n inset-block: -1px auto;\n\n #{$base}__pinned--top & {\n z-index: 4 !important;\n }\n }\n\n &--bottom {\n inset-block: auto -1px;\n\n #{$base}__pinned--bottom & {\n z-index: 5 !important;\n }\n }\n\n &--top#{&}--start {\n #{$base}__pinned--start & {\n z-index: 5 !important;\n }\n\n #{$base}__pinned--top#{$base}__pinned--start & {\n z-index: 6 !important;\n }\n }\n\n &--top#{&}--end {\n #{$base}__pinned--end & {\n z-index: 5 !important;\n }\n\n #{$base}__pinned--top#{$base}__pinned--end & {\n z-index: 6 !important;\n }\n }\n\n &--bottom#{&}--start {\n #{$base}__pinned--start & {\n z-index: 5 !important;\n }\n\n #{$base}__pinned--bottom#{$base}__pinned--start & {\n z-index: 6 !important;\n }\n }\n\n &--bottom#{&}--end {\n #{$base}__pinned--end & {\n z-index: 5 !important;\n }\n\n #{$base}__pinned--bottom#{$base}__pinned--end & {\n z-index: 6 !important;\n }\n }\n }\n\n thead tr:last-of-type {\n td,\n th {\n border-block-end: var(--border-tint-style);\n }\n }\n\n tfoot tr:first-of-type {\n td,\n th {\n border-block-start: none;\n }\n }\n\n tfoot tr:last-of-type {\n td,\n th {\n border-block-end: var(--border-tint-style);\n }\n }\n\n tfoot tr.nano-tbl__pin--bottom {\n &:first-of-type {\n .nano-tbl__pinned--bottom & {\n td,\n th {\n border-block-start: var(--border-tint-style) !important;\n }\n }\n }\n\n &:last-of-type {\n .nano-tbl__pinned--bottom & {\n td,\n th {\n border-block-end: none !important;\n }\n }\n }\n }\n\n .unlimited-width {\n max-width: none;\n }\n\n &__spinner {\n font-size: 1.5rem;\n transition: scale 0.25s;\n scale: 0;\n padding: 0.5rem;\n position: absolute;\n inset-block-end: 0;\n inset-inline-start: calc(50% - 0.75rem);\n z-index: 0;\n\n &--show {\n scale: 1;\n position: sticky;\n }\n }\n\n nano-skeleton {\n line-height: var(--cell-line-height);\n }\n}\n","import {\n Component,\n Prop,\n h,\n ComponentInterface,\n Element,\n Host,\n Watch,\n State,\n readTask,\n Event,\n EventEmitter,\n Method,\n Build,\n} from '@stencil/core';\nimport { cyrb53 } from '../../utils/math';\nimport { debounce } from '../../utils/throttle';\nimport {\n NanoResizeObserveCustomEvent,\n ResizeStateChangeEventDetail,\n TableTypes,\n} from '../../interface';\nimport { TableColHead } from './table.header';\nimport { TableRow, TableHeadFootRow } from './table.row';\nimport { TableCell } from './table.cell';\nimport { CSSNAMESPACE } from './table.constants';\nimport {\n generateStore,\n storeSearch,\n storeSetConfig,\n storeSetData,\n storeSort,\n storeFilter,\n TableStores,\n} from './table.store';\nimport { findScrollParent, isInViewport } from './table.utils';\n\nconst measurePerf = false;\n\nfunction perMark(name: string, end: boolean = false) {\n if (!Build.isDev || Build.isTesting || !performance || !measurePerf) return;\n if (end) {\n performance?.mark('end' + name);\n performance?.measure(name, 'start' + name, 'end' + name);\n const entries = performance?.getEntriesByName(name);\n console.log(entries[entries.length ? entries.length - 1 : 0]);\n } else {\n performance?.mark('start' + name);\n }\n}\n\nlet id = 0;\n/**\n * A performant, accessible and semantic (uses real html `<table />`, `<tr />` etc) table and data-grid solution.\n *\n *- Built-in search\n *- Built-in column filter\n *- Built-in column sort\n *- Easily swap in API / async based search / filter & sort\n *- Pin headers, footers, rows, columns\n *- Add custom rendering at every level\n *- Add custom properties at every level\n *\n * @slot caption - The table's caption. You must either use this or the `caption` attribute.\n * @slot no-results - text to display when search or filtering yields no results\n */\n@Component({\n tag: 'nano-table',\n styleUrl: 'table.scss',\n})\nexport class Table implements ComponentInterface {\n constructor() {\n this.debounceSetLoading = debounce(this.debounceSetLoading.bind(this), 50);\n }\n // Public API\n\n // Props\n\n @Prop() jsxRenderer: TableTypes.HFunc<any>;\n\n /** The type of table. Grid type will make cells navigable by keyboard */\n @Prop() type: 'grid' | 'table' = 'table';\n\n /** A descriptive title of the table.\n * You must use this or the `slot=\"caption\"` for accessibility */\n @Prop() caption: string;\n\n /** Show the caption on-screen */\n @Prop() showCaption: boolean = false;\n\n /** Will show a loading state when set to true.\n * By default, will be shown automatically if `rows` is a promise waiting to resolve\n * or when performing custom filtering or sorting.\n * *Note* when set manually, will overwrite any internal loading state.\n * Set to 'undefined' to revert to default behaviour. */\n @Prop() loading: boolean = undefined;\n\n get _loading() {\n return this.loading !== undefined ? this.loading : this.internalLoading;\n }\n set _loading(l: boolean) {\n if (this.loading !== undefined) return;\n this.debounceSetLoading(l);\n }\n private debounceSetLoading(l: boolean) {\n this.internalLoading = l;\n }\n @State() internalLoading = false;\n\n /** When loading rows asynchronously, this will render this number of placeholder rows */\n @Prop() placeholderSize = 5;\n\n /** The data to place in the table */\n @Prop({ mutable: true }) rows:\n | TableTypes.NanoTable['rows']\n | Promise<TableTypes.NanoTable['rows']>;\n\n @Watch('rows')\n handleRowsChange() {\n if (!this.rows) {\n this._loading = true;\n return;\n }\n\n this._loading = true;\n Promise.resolve(this.rows).then(async (rows) => {\n await storeSetData(this.host, rows);\n\n // reset everything\n this.currentFilters = '';\n this.currentSort = '';\n await this.columnInit();\n\n if (!this.isReady)\n requestAnimationFrame(() => this.setInitialBlockDimension());\n this._loading = false;\n });\n }\n\n /** The column config used to present the rows of data */\n @Prop({ mutable: true }) columns: TableTypes.NanoTable<any>['columns'] = [];\n\n @Watch('columns')\n async handleColsChange() {\n await storeSetConfig(this.host, this.columns);\n if (this.isReady) this.columnInit();\n }\n\n /** Used for custom thead row rendering */\n @Prop() headRender: TableTypes.HeadFootRenderer = { pinned: 'top' };\n\n /** Used for custom row rendering */\n @Prop() rowRender: TableTypes.RowRenderer;\n\n /** Used for custom tfoot row rendering */\n @Prop() footRender: TableTypes.HeadFootRenderer = { pinned: 'bottom' };\n\n /** Whether to show a `<tfoot>` component */\n @Prop() showFooter = false;\n\n /** To improve performance, data is split into blocks\n * which are shown / hidden and rendered as they become visible.\n * Use this to control the number of hits within a block -\n * A block should fill a scrolling viewport.\n * The less perBlock the better for performance */\n @Prop() perBlock = 40;\n\n /** The number of total blocks currently rendered in the table. @readonly */\n @Prop()\n get blocksLength() {\n return this.blocks.length;\n }\n\n /** Term to search for in the data */\n @Prop() searchTerm: string;\n\n /** A custom filtering function. Should return a promise.\n * If the promise resolves as `true` the column UI will be updated.\n * If the promise resolves as falsey, the sort will be performed by the component.\n * A good use-case would be performing the filter on a server / via fetch.\n * Then on success, updating the table's data via the `rows` property */\n @Prop() customFilterFn?: (\n filters: TableTypes.Filter[]\n ) => Promise<true | TableTypes.Falsy>;\n\n /** A custom sorting function. Should return a promise.\n * If the promise resolves as `true` the column UI will be updated.\n * If the promise resolves as falsey, the sort will be performed by the component.\n * A good use-case would be performing the sort on a server / via fetch.\n * Then on success, updating the table's data via the `rows` property */\n @Prop() customSortFn?: (\n property: TableTypes.Prop,\n order: TableTypes.Order\n ) => Promise<true | TableTypes.Falsy>;\n\n /**\n * The default sortable option for all columns.\n * `true` will enable column sorting unless you set `sortable: false` on a column\n * `false` will disable column sorting unless you set `sortable: true` on a column\n */\n @Prop() defaultSort = true;\n\n @Watch('searchTerm')\n handleSearchTermChange() {\n this.searchStart();\n }\n\n /** Use this to render the table with roughly the correct dimensions.\n * a use-case might be; fetch a small initial dataset to minimise load-time,\n * render the table with the correct dimensions, the table becomes interactive,\n * load the rest of the data\n */\n @Prop() virtualTotalItems: number = 0;\n\n @Watch('virtualTotalItems')\n virtualTotalItemsChangeHandler() {\n this.setBlocks();\n }\n\n /** Fired when the table has done it's first complete render */\n @Event() nanoTblReady: EventEmitter;\n\n /** Fired whenever a block is activated by scrolling into view / becoming visible\n * This could be leveraged for infinite scrolling / to fetch more data.\n */\n @Event() nanoTblBlockRendered: EventEmitter<{\n block: number;\n totalBlocks: number;\n }>;\n\n /** Fired before a column is sorted.\n * `event.preventDefault()` to stop sorting. */\n @Event() nanoTblBeforeSort: EventEmitter<{\n column: TableTypes.Prop;\n order: TableTypes.Order;\n }>;\n\n /** Fired after a column is sorted */\n @Event() nanoTblAfterSort: EventEmitter<{\n column: TableTypes.Prop;\n order: TableTypes.Order;\n }>;\n\n /** Fired before a column is filtered.\n * `event.preventDefault()` to stop filtering. */\n @Event() nanoTblBeforeFilter: EventEmitter<{ filters: TableTypes.Filter[] }>;\n\n /** Fired after a column is sorted */\n @Event() nanoTblAfterFilter: EventEmitter<{ filters: TableTypes.Filter[] }>;\n\n /** Fired before a general search.\n * `event.preventDefault()` to stop searching. */\n @Event() nanoTblBeforeSearch: EventEmitter<{ term: string }>;\n\n /** Fired after a general / cross column search */\n @Event() nanoTblAfterSearch: EventEmitter<{ term: string }>;\n\n /** Fired before a general search.\n * `event.preventDefault()` to stop searching. */\n @Event() nanoTblBeforeEdit: EventEmitter<{ term: string }>;\n\n /** Remove any column sorts currently applied\n * @returns a promise which resolves when complete */\n @Method()\n async resetSorting() {\n const col = (this.columns as TableTypes.NanoTable['columns']).find(\n (c) => !!c.order\n );\n if (!col) return;\n return this.sortStart(null, col.prop);\n }\n\n /** Apply a sort on a column\n * @returns a promise which resolves when complete */\n @Method()\n async addSort(column: TableTypes.Prop, order: TableTypes.Order) {\n const col = (this.columns as TableTypes.NanoTable['columns']).find(\n (c) => c.prop === column\n );\n if (!col) throw 'Cannot find column with ' + column;\n return this.sortStart(order, col.prop);\n }\n\n /** Remove any column filters currently applied\n * @returns a promise which resolves when complete */\n @Method()\n async resetFilters() {\n this.filters = [];\n return this.filterStart();\n }\n\n /** Apply a filter on a column\n * @param filters - the filters to apply\n * @param additive - if true, will add the filters to any currently applied\n * @returns a promise which resolves when complete\n */\n @Method()\n async addFilters(filters: TableTypes.Filter[], additive: boolean = true) {\n if (!additive) this.filters = [];\n return this.filterStart(filters, additive);\n }\n\n /** Remove filters from a column\n * @param columnNames - the filters to apply\n * @returns a promise which resolves when complete\n */\n @Method()\n async removeFilters(columnNames: TableTypes.Prop[]) {\n this.filters = this.filters.filter((f) => !columnNames.includes(f.prop));\n return this.filterStart();\n }\n\n /** Updates a row model at a given index\n * @param row - the row to update.\n * *Note* - this should come from the `col.cellTemplate` or `row.rowRender.template` `rowModel` property\n * - rows are augmented with certain properties to aid with efficient rendering\n * @param rowIndex - the row index to insert this row\n */\n @Method()\n async updateRow(row: TableTypes.RowData, rowIndex: number) {\n (this.rows as TableTypes.NanoTable['rows']).splice(rowIndex, 1, row);\n this.handleRowsChange();\n }\n\n // TODO.\n // change this.rows to be a Map instead?\n // this will allow 'padding' < inserting row data at a non-adjacent index\n\n // /**\n // * During pagination or infinite scroll\n // * you may not always want to load data in serial order.\n // * This method allows you to insert a block of results at a particular index.\n // * Use in-conjunction with `virtualTotalItems`\n // * @param blockIndex - where to insert\n // * @param rows - what to insert\n // */\n // @Method()\n // async insertBlock(blockIndex: number, rows: TableTypes.NanoTable['rows']) {\n // this.pauseAutoBlockAssign = true;\n // const cRows = (this.rows as TableTypes.NanoTable['rows']);\n\n // if (cRows.length < (blockIndex * this.perBlock)) {\n // (this.rows as TableTypes.NanoTable['rows'])\n // }\n\n // (this.rows as TableTypes.NanoTable['rows']).splice((blockIndex * this.perBlock)-1, 0, ...rows);\n\n // console.log(this.rows)\n // debugger;\n\n // await this.handleRowsChange(this.rows);\n // this.blocks[blockIndex] = {rows, __uuid: cyrb53(rows.map((b) => b.__uuid).join())};\n // this.blocks = this.blocks;\n // this.pauseAutoBlockAssign = true;\n\n // console.log(this.rows, this.blocks)\n // }\n\n // Private State\n\n @Element() host: HTMLNanoTableElement;\n private renderId = 'tbl-' + id++;\n private store: TableStores;\n private filters: TableTypes.Filter[] = [];\n private currentFilters = '[]';\n private currentSort = '';\n private tableEle: HTMLTableElement;\n private topAnchorEle: HTMLElement;\n private tableWrapperEle: HTMLElement;\n private cacheScrollPosition: number = 0;\n private activeWatcherIo: IntersectionObserver;\n\n // Block view management\n\n /** `tr` elements split into units - defined by `perBlock`\n These are show / hidden for perf */\n @State() blocks: TableTypes.TBody[] = [];\n @State() activeBlocks: number[] = [0, 1, 2];\n\n private measureHeight = 0;\n private blockElements: HTMLTableSectionElement[];\n private blockHeights: { blockIndex: number; height: number }[] = [];\n\n // uses the first 'tr' of an active block as our yard stick\n private set measureEle(el: HTMLTableSectionElement) {\n if (!el) return;\n const potentialHeight = el.getBoundingClientRect().height;\n this.measureHeight =\n Math.abs(this.measureHeight - potentialHeight) < 5\n ? this.measureHeight\n : potentialHeight;\n this.unitHeight =\n el.querySelector('tr')?.getBoundingClientRect().height || this.unitHeight;\n }\n\n private unitHeight = 0;\n\n private get scrollParent() {\n return this._scrollParent;\n }\n\n private set scrollParent(ele: HTMLElement) {\n if (ele === this._scrollParent) return;\n\n if (this._scrollParent) {\n (this._scrollParent === document.documentElement\n ? document\n : this._scrollParent\n ).removeEventListener('scroll', this.scrollHandler);\n }\n (ele === document.documentElement ? document : ele).addEventListener(\n 'scroll',\n this.scrollHandler\n );\n this._scrollParent = ele;\n }\n\n private _scrollParent: HTMLElement;\n\n // used to fire `nanoTblBlockRendered` on block render change\n private get primaryBlockIndex() {\n return this._primaryBlockIndex;\n }\n\n private set primaryBlockIndex(blockIndex) {\n if (this._primaryBlockIndex === blockIndex) return;\n\n this._primaryBlockIndex = blockIndex;\n\n // fire block change event\n this.nanoTblBlockRendered.emit({\n block: blockIndex,\n totalBlocks: this.blockElements.length,\n });\n }\n\n private _primaryBlockIndex;\n\n // Misc.\n\n private get isReady() {\n return this._isReady;\n }\n private set isReady(ready: boolean) {\n if (ready === this._isReady) return;\n this._isReady = ready;\n if (this.isReady) requestAnimationFrame(() => this.handleReady());\n }\n private _isReady = false;\n\n // Private Logic\n\n // Listeners\n\n private handleReady() {\n const hash = window.location.hash;\n if (hash.length > 1) {\n try {\n const idRow = document.querySelector(hash);\n if (idRow) idRow.scrollIntoView();\n } catch (e) {}\n }\n this.nanoTblReady.emit();\n }\n\n /**\n * Start a sort - can be cancelled by `preventDefault`\n * @param order - column order\n * @param column - column config object\n * @returns A promise\n */\n private sortStart = async (\n order: TableTypes.Order,\n column: TableTypes.Prop,\n element?: HTMLElement\n ) => {\n // did order change?\n if (this.currentSort === order + ':' + column) return;\n\n this._loading = true;\n const sortEvent = this.nanoTblBeforeSort.emit({ column: column, order });\n if (sortEvent.defaultPrevented) return;\n perMark('sort');\n this.currentSort = order + ':' + column;\n\n // doesn't make sense to leave user in place for a sort\n this.scrollToTop(element);\n\n if (this.customSortFn) {\n try {\n const res = await this.customSortFn(column, order);\n\n // if the response is 'true', the custom sort did it's thing\n // handover to finish and stop loading state.\n // if response is falsey, carry on to do a FE sort\n if (res === true) {\n this.sortComplete(order, column);\n this._loading = false;\n return;\n }\n } catch (e) {\n // if response errored, stop loading state\n // clear current sort cache\n console.warn('custom sort failed', e);\n this.currentSort = '';\n this._loading = false;\n return;\n }\n }\n\n try {\n await storeSort(this.host, column, order);\n this.sortComplete(order, column);\n } catch (e) {\n console.warn('sort failed', e);\n this.currentSort = '';\n } finally {\n if (this.blocks.length) this._loading = false;\n }\n };\n\n /**\n * Complete a sort. Reflects the order to ui.\n * @param order - column order\n * @param column - column config object\n */\n private sortComplete(order: TableTypes.Order, column: TableTypes.Prop) {\n this.columns = this.columns.map((c) => {\n if (c.prop === column) return { ...c, order };\n return { ...c, order: null };\n });\n this.nanoTblAfterSort.emit({ column: column, order });\n perMark('sort', true);\n }\n\n private async searchStart() {\n this._loading = true;\n const sortEvent = this.nanoTblBeforeSearch.emit({ term: this.searchTerm });\n if (sortEvent.defaultPrevented) return;\n perMark('search');\n\n // doesn't make sense to leave user in place for a search\n this.scrollToTop();\n\n try {\n await storeSearch(this.host, this.searchTerm);\n this.nanoTblAfterSearch.emit({ term: this.searchTerm });\n perMark('search', true);\n } catch (e) {\n console.warn('search failed', e);\n } finally {\n this._loading = false;\n }\n }\n\n private async filterStart(\n filters?: TableTypes.Filter[],\n additive: boolean = true\n ) {\n if (filters) {\n if (additive) {\n this.filters = [\n ...this.filters.filter(\n (f) => !filters.find((ff) => ff.prop === f.prop)\n ),\n ...filters,\n ];\n } else {\n this.filters = filters;\n }\n }\n\n if (this.currentFilters === JSON.stringify(this.filters)) return;\n\n this._loading = true;\n const sortEvent = this.nanoTblBeforeFilter.emit({ filters: this.filters });\n if (sortEvent.defaultPrevented) return;\n perMark('filter');\n this.currentFilters = JSON.stringify(this.filters);\n\n // doesn't make sense to leave user in place for a search\n this.scrollToTop();\n\n if (this.customFilterFn) {\n try {\n const res = await this.customFilterFn(this.filters);\n\n // if the response is 'true', the custom filter did it's thing\n // handover to finish and stop loading state.\n // if response is falsey, carry on to do a FE filter\n if (res === true) {\n this.filterComplete();\n this._loading = false;\n }\n } catch (e) {\n // if response errored, stop loading state\n // clear current sort cache\n console.warn('custom filter failed', e);\n this.currentFilters = '';\n this._loading = false;\n }\n return;\n }\n\n try {\n await storeFilter(this.host, this.filters);\n this.filterComplete();\n } catch (e) {\n console.warn('filter failed', e);\n } finally {\n this._loading = false;\n }\n }\n\n private filterComplete() {\n this.columns = this.columns.map((c) => {\n const cFilter = this.filters.find((f) => f.prop === c.prop);\n if (cFilter) c.filter = cFilter.filter;\n else if (c.filter !== null && c.filter !== undefined)\n c.filter = undefined;\n\n return c;\n });\n this.nanoTblAfterFilter.emit({ filters: this.filters });\n perMark('filter', true);\n }\n\n /** Scrolls to the top immediately - used whilst sorting / filtering */\n private scrollToTop(element?: HTMLElement) {\n const scrollBehaviour = this.scrollParent.style?.scrollBehavior;\n const scrollX = this.scrollParent.scrollLeft;\n this.scrollParent.style.scrollBehavior = 'auto';\n\n if (this.topAnchorEle && !isInViewport(this.topAnchorEle, 0.1)) {\n this.host.scrollIntoView();\n }\n if (element && !isInViewport(element, 1))\n setTimeout(() => element.scrollIntoView({ block: 'start' }), 500);\n\n if (scrollX) this.scrollParent.scrollLeft = scrollX;\n\n if (scrollBehaviour)\n this.scrollParent.style.scrollBehavior = scrollBehaviour;\n\n this.scrollHandler();\n }\n\n private setMeasureElement(): Promise<void> {\n return new Promise((resolve) => {\n readTask(() => {\n this.measureEle = this.blockElements.find(\n (b) => !b?.classList?.contains(`${CSSNAMESPACE}__inactive`)\n );\n resolve();\n });\n });\n }\n\n /**\n * Makes sure we have dimensions on at least one, active tbody element.\n * We'll use this is a yard stick for inactive tbody elements in future.\n * These elements have no natural height (on account of all their rows being hidden)\n */\n private setInitialBlockDimension() {\n if (!this.blockElements?.length) return;\n perMark('blockDims');\n\n const testForDimensions = async () => {\n await this.setMeasureElement();\n if (this.unitHeight) return true;\n return false;\n };\n\n const dimensionsReady: Promise<void> = new Promise(async (resolve) => {\n if (await testForDimensions()) resolve();\n else {\n // it's likely this table is hidden in the dom.\n // we need to wait until it's visible\n const observer = new IntersectionObserver(\n async () => {\n if (await testForDimensions()) {\n resolve();\n observer.disconnect();\n }\n },\n { root: this.scrollParent }\n );\n observer.observe(this.tableEle);\n }\n });\n\n // we're all finished.\n dimensionsReady.then(() => {\n perMark('blockDims', true);\n perMark('init', true);\n requestAnimationFrame(() => (this.isReady = true));\n });\n }\n\n /** Apply initial columns settings */\n private async columnInit() {\n this.filters = (this.columns as TableTypes.NanoTable['columns'])\n .filter((c) => c.filter !== undefined && c.filter !== null)\n .map((c) => {\n const { filter, prop } = c;\n return { filter, prop };\n });\n\n if (this.searchTerm) {\n await this.searchStart();\n }\n\n if (this.filters.length) {\n await this.filterStart();\n }\n // apply sort\n const col = (this.columns as TableTypes.NanoTable['columns']).find(\n (c) => !!c.order\n );\n if (!!col) {\n await this.sortStart(col.order, col.prop);\n }\n }\n\n /** Split up all incoming rows into 'blocks' split amongst tbody elements.\n * These can then be hidden / shown to improve performance.\n */\n private setBlocks() {\n const dRows = this.store.data.state.rows;\n if (!dRows.length) {\n this.blocks = [];\n return;\n }\n\n perMark('setBlocks');\n // this.ignoreIO = true;\n let i = 1;\n const l =\n this.virtualTotalItems > dRows.length\n ? this.virtualTotalItems\n : dRows.length;\n let rows: TableTypes.RowData[] = [];\n const blocks: TableTypes.TBody[] = [];\n\n // old skool loop for perf\n for (i; i <= l; i++) {\n rows.push(this.store.data.state.rows[i - 1] || { __uuid: '' });\n\n if (i % this.perBlock === 0) {\n // assign a UUID for the whole block\n // for block diffing\n blocks.push({ rows, __uuid: cyrb53(rows.map((b) => b.__uuid).join()) });\n rows = [];\n }\n }\n\n // any leftover rows\n if (rows.length) {\n blocks.push({ rows, __uuid: cyrb53(rows.map((b) => b.__uuid).join()) });\n }\n\n this.blocks = blocks;\n perMark('setBlocks', true);\n }\n\n /**\n * Returns a block render height.\n * If it's currently active - let auto do it's thing\n * If we've rendered it before - return that\n * If all else fails, let's guess it\n * @param blockIndex\n * @returns a height string (incl px)\n */\n private getBlockHeight(blockIndex: number): number {\n if (this.blockHeights.length) {\n const cachedBlockHeight = this.blockHeights.find(\n (bh) => bh.blockIndex === blockIndex\n );\n if (cachedBlockHeight && cachedBlockHeight.height)\n return cachedBlockHeight.height;\n }\n const blockLength = this.blocks[blockIndex].rows.length;\n if (blockLength === this.perBlock && this.measureHeight) {\n return this.measureHeight;\n }\n return this.unitHeight ? this.unitHeight * blockLength : 100;\n }\n\n /** cache the height for all active blocks for later renders */\n private setBlockHeight() {\n this.activeBlocks.forEach((blockIndex) => {\n const el = this.blockElements[blockIndex];\n if (!el) return;\n\n readTask(() => {\n if (el.classList.contains(`${CSSNAMESPACE}__inactive`)) return;\n\n const height = el.getBoundingClientRect().height;\n // cache height to our block heights array\n // for subsequent renders\n const fBhIdx = this.blockHeights.findIndex(\n (bh) => bh.blockIndex === blockIndex\n );\n if (fBhIdx > -1) {\n this.blockHeights[fBhIdx] = { height, blockIndex };\n } else this.blockHeights.push({ height, blockIndex });\n });\n });\n }\n\n /**\n * On scroll, loop through all blocks' heights and cumulatively, add them together.\n * When we find that the scroll position is less than this cumulative block height -\n * stop loop - it's on the current active block.\n */\n private scrollHandler = () => {\n // don't listen if this table isn't in the viewport\n if (!this.store.general.state.isActive || !this.rows) return;\n if (this.primaryBlockIndex === undefined) this.primaryBlockIndex = 0;\n\n readTask(() => {\n this.cacheScrollPosition = this.scrollParent.scrollTop || window.scrollY;\n let cumulativeHeight = this.host.offsetTop;\n let blockIndex = 0;\n const blockLen = this.blocks.length;\n\n while (\n blockIndex < blockLen &&\n this.cacheScrollPosition >= cumulativeHeight\n ) {\n cumulativeHeight += this.getBlockHeight(blockIndex);\n\n if (this.cacheScrollPosition < cumulativeHeight) {\n const potentialBlocks = [\n blockIndex,\n blockIndex + 1,\n Math.max(0, blockIndex - 1),\n ];\n if (potentialBlocks.toString() !== this.activeBlocks.toString()) {\n this.activeBlocks = potentialBlocks;\n }\n this.primaryBlockIndex = blockIndex;\n }\n blockIndex++;\n }\n });\n };\n\n /** Process slotted content */\n private processSlots() {\n // see if we have slot content\n if (!this.caption && !this.host.querySelector('[slot=\"caption\"]')) {\n console.error(\n 'For accessibility you must set a `caption` prop or use the `caption` slot'\n );\n }\n }\n\n private handleColumnPinned = (positions: {\n [key in TableTypes.Position]: boolean;\n }) => {\n Object.entries(positions).forEach(([key, applied]) => {\n this.tableEle.classList.toggle(\n `${CSSNAMESPACE}__pinned--${key}`,\n applied\n );\n });\n };\n\n private handleResizeChange = (\n e: NanoResizeObserveCustomEvent<ResizeStateChangeEventDetail>\n ) => {\n this.tableWrapperEle.className = '';\n\n let classes: string[] = [`${CSSNAMESPACE}__wrap`];\n if (e.target?.className)\n classes = [...e.target.className.split(' '), ...classes];\n\n this.tableWrapperEle.classList.add(...classes.filter((cl) => !!cl));\n };\n\n /** Adds an IO. Makes sure our scroll listener is only active when\n * the table is in viewport */\n private setupActiveWatcher() {\n if (!this.host || !this.scrollParent || !this.store) return;\n\n if (this.activeWatcherIo) {\n this.activeWatcherIo.disconnect();\n this.activeWatcherIo = undefined;\n }\n const io = (this.activeWatcherIo = new IntersectionObserver(\n async ([e]) => {\n if (e.isIntersecting) this.store.general.state.isActive = true;\n else this.store.general.state.isActive = false;\n },\n { root: this.scrollParent, threshold: 0 }\n ));\n io.observe(this.host);\n }\n\n // Component lifecycle\n\n async componentWillLoad() {\n perMark('init');\n // setup stores\n this.store = await generateStore(\n this.host,\n this.columns,\n this.scrollParent,\n this.isReady\n );\n await this.handleRowsChange();\n this.store.general.onChange('isActive', () => {\n this.scrollHandler();\n });\n this.store.data.onChange('rows', () => this.setBlocks());\n\n // setup dom and attach listeners\n this.processSlots();\n this.setBlocks();\n this.scrollParent = findScrollParent(this.host);\n this.setupActiveWatcher();\n }\n\n connectedCallback(): void {\n this.scrollParent = findScrollParent(this.host);\n this.setupActiveWatcher();\n }\n\n componentDidLoad(): void {\n this.setInitialBlockDimension();\n }\n\n componentShouldUpdate(_newVal, _oldVal, stateName: keyof Table) {\n // stop double rendering - we use the store for rendering internally\n // the public facing props are kept in-sync with the store\n // but we don't want it to cause renders\n if (['rows', 'columns'].includes(stateName)) return false;\n\n if (Build.isDev && !Build.isTesting && measurePerf)\n console.log(stateName, _newVal, _oldVal);\n }\n\n componentWillRender(): void | Promise<void> {\n perMark('render');\n }\n\n componentDidRender(): void {\n this.setMeasureElement().then(() => this.setBlockHeight());\n perMark('render', true);\n }\n\n disconnectedCallback(): void {\n if (!this.activeWatcherIo) return;\n this.activeWatcherIo.disconnect();\n this.activeWatcherIo = undefined;\n\n (this.scrollParent === document.documentElement\n ? document\n : this.scrollParent\n ).removeEventListener('scroll', this.scrollHandler);\n }\n\n render() {\n this.blockElements = [];\n\n return (\n <Host>\n <div\n class={`${CSSNAMESPACE}__top-anchor`}\n ref={(a) => (this.topAnchorEle = a)}\n >\n \n </div>\n\n <nano-resize-observe\n states=\"576w sm, 768w md\"\n class=\"sm md\"\n onNanoResizeStateChange={this.handleResizeChange}\n ></nano-resize-observe>\n\n <div\n class={`${CSSNAMESPACE}__wrap sm md`}\n ref={(div) => (this.tableWrapperEle = div)}\n aria-labelledby={'table-caption-' + this.renderId}\n tabindex={this.type === 'grid' ? '0' : undefined}\n >\n <nano-progress-bar\n indeterminate\n class={{\n [`${CSSNAMESPACE}__progress-bar`]: true,\n [`${CSSNAMESPACE}__progress-bar--show`]: this._loading,\n }}\n />\n <table\n role={this.type === 'grid' ? 'grid' : undefined}\n aria-rowcount={this.store.data.state.rows.length}\n aria-colcount={this.store.config.state.columns.length}\n class={`${CSSNAMESPACE}`}\n ref={(tbl) => (this.tableEle = tbl)}\n >\n <caption\n class={{\n [`${CSSNAMESPACE}__caption`]: true,\n [`${CSSNAMESPACE}__caption--hide`]: !this.showCaption,\n }}\n id={'table-caption-' + this.renderId}\n >\n <slot name=\"caption\">{this.caption}</slot>\n </caption>\n\n {/* Header */}\n <thead>\n <TableHeadFootRow\n rowRenderer={this.headRender}\n onColumnPinned={this.handleColumnPinned}\n >\n {this.store.config.state.columns.map((colModel) => [\n <TableColHead\n column={colModel}\n headRenderer={this.headRender}\n onColumnSortClick={this.sortStart}\n onColumnPinned={this.handleColumnPinned}\n defaults={{\n sortable: this.defaultSort,\n }}\n />,\n ])}\n </TableHeadFootRow>\n </thead>\n\n {this._loading && !this.blocks.length && (\n <tbody class={`${CSSNAMESPACE}__active`}>\n {[...Array(10).keys()].map((rowIndex) => (\n <tr>\n {this.store.config.state.columns.map(\n (_colModel, colIndex) => (\n <TableCell\n rowIndex={rowIndex}\n colIndex={colIndex}\n nestedContent={() => <nano-skeleton />}\n />\n )\n )}\n </tr>\n ))}\n </tbody>\n )}\n\n <tr hidden={!!this._loading || !!this.blocks.length}>\n <th\n class={`${CSSNAMESPACE}__th`}\n colSpan={this.store.config.state.columns.length}\n >\n <div class=\"nano-tbl__cell-content nano-tbl__cell-content--no-result\">\n <slot name=\"no-results\">No results found</slot>\n </div>\n </th>\n </tr>\n\n {/* Body */}\n {this.blocks.map((block, blockIndex) => (\n <tbody\n key={block.__uuid}\n id={`tbody-${this.renderId}-${blockIndex}`}\n ref={(tb) => {\n this.blockElements.push(tb);\n }}\n class={{\n [`${CSSNAMESPACE}__inactive`]:\n !this.activeBlocks.includes(blockIndex),\n [`${CSSNAMESPACE}__active`]:\n this.activeBlocks.includes(blockIndex),\n }}\n >\n {this.activeBlocks.includes(blockIndex) ? (\n block.rows.map((row, i) => {\n const rowIndex =\n blockIndex > 0 ? blockIndex * this.perBlock + i : i;\n return (\n <TableRow\n rowRenderer={this.rowRender}\n rowModel={row}\n rowIndex={rowIndex}\n >\n {this.store.config.state.columns.map(\n (_colModel, colIndex) => (\n <TableCell\n rowIndex={rowIndex}\n colIndex={colIndex}\n />\n )\n )}\n </TableRow>\n );\n })\n ) : (\n <tr>\n <td\n colSpan={this.store.config.state.columns.length}\n style={{\n height: this.getBlockHeight(blockIndex) + 'px',\n }}\n />\n </tr>\n )}\n </tbody>\n ))}\n\n {/* Footer */}\n {this.showFooter && (\n <tfoot>\n <TableHeadFootRow\n rowRenderer={this.footRender}\n onColumnPinned={this.handleColumnPinned}\n >\n {this.store.config.state.columns.map((colModel) => [\n <TableColHead\n column={colModel}\n headRenderer={this.footRender}\n onColumnPinned={this.handleColumnPinned}\n onColumnSortClick={this.sortStart}\n defaults={{\n sortable: this.defaultSort,\n }}\n />,\n ])}\n </TableHeadFootRow>\n </tfoot>\n )}\n </table>\n\n {!!this.blocks.length && (\n <nano-spinner\n type=\"circle\"\n class={{\n [`${CSSNAMESPACE}__spinner`]: true,\n [`${CSSNAMESPACE}__spinner--show`]: this._loading,\n }}\n />\n )}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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"}
|
@@ -1,5 +0,0 @@
|
|
1
|
-
/*!
|
2
|
-
* Web Components for Nanopore digital Web Apps
|
3
|
-
*/
|
4
|
-
import{w as t,r as i,c as s,d as e,h,a as n,g as r}from"./p-f6a8467a.js";import{d as o}from"./p-842cf127.js";import{d as a}from"./p-9746b0a5.js";const l=":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}:host{position:relative;display:block}.sortable__live-region{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}";const d={horizontal:{x:1,y:0},vertical:{x:0,y:1}};let c=0;const f=class{handleItemSelectorChange(){this.refreshKeyboardHandles()}handleHandleSelectorChange(){this.refreshKeyboardHandles();this.attachMutationObserver()}handleCreateKeyboardHandleChange(){this.refreshKeyboardHandles()}handleSortableHostElement(t,i){if(i)this.removeEventHandlers(i);this.addEventHandlers();this.refreshKeyboardHandles();this.attachMutationObserver();if(this.sortableHostElement){this.sortableHostElement.style.position="relative"}}async refreshKeyboardHandles(){var t,i,s;if(this.handleSelector){if((t=this.keyboardHandleMap)===null||t===void 0?void 0:t.size){this.keyboardHandleMap.clear()}this.sortableHost.querySelectorAll(this.handleSelector).forEach((t=>{if(!t.getAttribute("aria-describedby"))t.setAttribute("aria-describedby",this.sortableId);const i=t.closest(this.itemSelector);if(i)this.keyboardHandleMap.set(t,i)}));return}if((i=this.keyboardHandleMap)===null||i===void 0?void 0:i.size){(s=this.keyboardHandleMap)===null||s===void 0?void 0:s.forEach(((t,i)=>i.remove()));this.keyboardHandleMap.clear()}this.sortableHost.querySelectorAll(this.itemSelector).forEach(((t,i)=>{const s=this.createKeyboardHandle(i,t);if(!s){console.error("`createKeyboardHandle` *must* return the handle element it creates");return}this.keyboardHandleMap.set(s,t);s.setAttribute("aria-describedby",this.sortableId)}))}get sortableHost(){if(this.sortableHostElement)return this.sortableHostElement;return this.host}addAriaMsg(t){this.ariaTextList=[...this.ariaTextList,t];setTimeout((()=>{const i=this.ariaTextList.indexOf(t);this.ariaTextList.splice(i,1);this.ariaTextList=[...this.ariaTextList]}),1e4)}updateUserSelectStyle(t){this.host.style.userSelect=t;this.host.style.MozUserSelect=t;this.host.style.msUserSelect=t;this.host.style.webkitUserSelect=t}hitTest(t,i){const{left:s,top:e,width:h,height:n}=t.getBoundingClientRect();const r=s+h/2;const o=e+n/2;return i.filter((t=>{const{left:i,right:s,top:e,bottom:h}=t.getBoundingClientRect();return!(r<i||r>s||o<e||o>h)}))}isAnimating(t){return this.animatedElements.indexOf(t)!==-1}animateNode(i,s=0,e=0){if(!i.animate){return}this.animatedElements.push(i);i.style.willChange="transform";t((()=>{this.animationPromise=new Promise((t=>{i.animate([{transform:`translate3d(${s}px, ${e}px, 0)`},{transform:"none"}],this.animationTiming).addEventListener("finish",(()=>{const s=this.animatedElements.indexOf(i);i.style.willChange="";if(s!==-1){this.animatedElements.splice(s,1)}t();delete this.animationPromise}),{once:true})}))}))}insertAtTarget(t,i){if(!t||!i)return;let s=[];if(this.animationEnabled){s=this.sortableNodes.map((t=>({x:t.offsetLeft,y:t.offsetTop})))}if(!t.isConnected||!i.isConnected)return;if(this.dropzoneNodes.indexOf(i)>-1){i.append(t)}else{const s=t.compareDocumentPosition(i);let e;if(s&this.host.DOCUMENT_POSITION_FOLLOWING){e=i.parentNode===t.parentNode?"afterend":"beforebegin"}if(s&this.host.DOCUMENT_POSITION_PRECEDING){e=i.parentNode===t.parentNode?"beforebegin":"afterend"}if(e)i.insertAdjacentElement(e,t)}if(this.animationEnabled){this.sortableNodes.forEach(((t,i)=>{const{x:e,y:h}=s[i];const n=e-t.offsetLeft;const r=h-t.offsetTop;if(n!==0||r!==0){this.animateNode(t,n,r)}}))}}reset(){if(this.draggedElementClone!==undefined&&this.draggedElementClone.parentNode!==null){this.draggedElementClone.parentNode.removeChild(this.draggedElementClone)}if(this.draggedElement&&this.draggedElement.parentNode&&this.draggedElementOrigin){this.draggedElement.classList.remove(this.placeholderClass)}if(this.dropzoneActiveClass&&this.dropzoneNodes.length){this.dropzoneNodes.forEach((t=>t.classList.remove(this.dropzoneActiveClass)))}delete this.draggedElementClone;delete this.draggedElement;this.dropzoneNodes=[];this.sortableNodes=[];this.animatedElements=[];this.dragRequestPending=false;this.updateUserSelectStyle("")}createClone(t){const i=t.cloneNode(true);if(t.id)i.id="clone__"+i.id;Array.from(i.children).forEach(((i,s)=>{const e=i;const h=t.children.item(s);if(h){e.style.width=`${h.offsetWidth}px`}}));const{offsetLeft:s,offsetTop:e,offsetWidth:h,offsetHeight:n}=t;Object.assign(i.style,{position:"absolute",left:`calc(${s}px - var(--grab-offset-x, 0px))`,top:`calc(${e}px - var(--grab-offset-y, 0px))`,height:this.dragResize?`${n}px`:undefined,width:this.dragResize?`${h}px`:undefined,willChange:"transform,opacity"});i.classList.add(this.draggedClass);return t.parentNode.appendChild(i)}addListeners(t,i,s,e){i.split(" ").forEach((i=>t.addEventListener(i,s,e)))}removeEventHandlers(t){t=t||this.sortableHost;t.removeEventListener("mousedown",this.handleTrack);t.removeEventListener("touchstart",this.handleTrack);t.removeEventListener("keydown",this.handleKeydown)}addEventHandlers(t){t=t||this.sortableHost;this.addListeners(t,"mousedown touchstart",this.handleTrack,{passive:true});t.addEventListener("keydown",this.handleKeydown)}attachMutationObserver(){if(this.mutationObserver){this.mutationObserver.disconnect();this.mutationObserver=undefined}this.mutationObserver=new MutationObserver((()=>{const t=Array.from(this.keyboardHandleMap.values());const i=Array.from(this.sortableHost.querySelectorAll(this.itemSelector));if(t.length!==i.length||!!i.find((i=>!t.includes(i)))){this.refreshKeyboardHandles()}}));this.mutationObserver.observe(this.sortableHost,{subtree:true,childList:true})}handleKeydown(t){const i=t.target;let s;let e;if(this.handleSelector){s=i.closest(this.handleSelector);e=i.closest(this.itemSelector)}else{e=this.keyboardHandleMap.get(i);s=i}if(!s||!e)return;const h=t=>{this.keyboardSortActive=t;this.draggedElement=t?e:undefined;e.classList.toggle(this.draggedClass,t);s.classList.toggle(this.handleDraggedClass,t);if(t){this.addAriaMsg(this.grabbedHelperText(e));document.addEventListener("mousedown",(()=>h(false)),{once:true})}else{this.addAriaMsg(this.droppedHelperText(e))}};if([" ","Space","Enter"].includes(t.key)){t.preventDefault();if(!this.keyboardSortActive){h(true);this.sortableNodes=Array.from(this.sortableHost.querySelectorAll(this.itemSelector))||[];const t=this.nanoGrabbed.emit({element:e,index:this.sortableNodes.indexOf(e)});if(t.defaultPrevented){h(false);return}}else{h(false);this.nanoDropped.emit({element:e})}return}if(!this.keyboardSortActive)return;if(["Escape","Tab"].includes(t.key))h(false);let n=["Home","End"];if(!this.orientation||this.orientation==="horizontal")n=[...n,"ArrowRight","ArrowLeft"];if(!this.orientation||this.orientation==="vertical")n=[...n,"ArrowUp","ArrowDown"];if(!n.includes(t.key))return;t.preventDefault();this.sortableNodes=Array.from(this.sortableHost.querySelectorAll(this.itemSelector))||[];this.dropzoneNodes=Array.from(this.sortableHost.querySelectorAll(this.dropzoneSelector))||[];const r=this.sortableNodes.indexOf(this.draggedElement);let o=-1;if(this.dropzoneNodes.length){const t=this.draggedElement.closest(this.dropzoneSelector);o=this.dropzoneNodes.indexOf(t);o=o>-1?o:-1}const a=r-1<0&&o>-1?this.dropzoneNodes[o-1]:this.sortableNodes[r-1];const l=r+1===this.sortableNodes.length&&o>-1?this.dropzoneNodes[o+1]:this.sortableNodes[r+1];if(t.key==="Home"){this.insertAtTarget(this.draggedElement,this.sortableNodes[0])}if(t.key==="End"){this.insertAtTarget(this.draggedElement,this.sortableNodes[this.sortableNodes.length-1])}if(["ArrowRight","ArrowDown"].includes(t.key)){this.insertAtTarget(this.draggedElement,l)}if(["ArrowLeft","ArrowUp"].includes(t.key)){this.insertAtTarget(this.draggedElement,a)}this.finishOrder();this.draggedElement=e;const d=()=>{requestAnimationFrame((()=>{typeof s["setFocus"]==="function"?s.setFocus():s.focus()}))};if(this.animationPromise)this.animationPromise.then((()=>d()));else d()}handleTrack(t){if(this.dragRequestPending||t.button&&t.button!==1)return;const i=t=>{if(t.cancelable)t.preventDefault();clearTimeout(this.mouseDownTimer)};const s=()=>{clearTimeout(this.mouseDownTimer);document.removeEventListener("touchmove",i);document.removeEventListener("contextmenu",this.finishOrder)};s();this.mouseDownTimer=window===null||window===void 0?void 0:window.setTimeout((()=>{if(!this.trackStart(t))return;document.addEventListener("touchmove",i,{passive:false});document.addEventListener("contextmenu",this.finishOrder);this.addAriaMsg(this.grabbedHelperText(this.draggedElement));o(this.sortableHost,{initialEvent:t,relative:true,onMove:(t,i)=>{this.trackMove(t,i)},onStop:()=>{this.nanoDropped.emit({element:this.draggedElement});s();const t=()=>{this.addAriaMsg(this.droppedHelperText(this.draggedElement));requestAnimationFrame((()=>this.finishOrder()))};if(this.animationPromise){this.animationPromise.then((()=>t()))}else t()}})}),150);this.addListeners(document,"mouseup touchend touchmove",(()=>clearTimeout(this.mouseDownTimer)),{once:true})}trackStart(t){const i=t.target;let s;if(this.handleSelector){s=i.closest(this.handleSelector);if(!s)return;s.classList.add(this.handleDraggedClass)}const e=i.closest(this.itemSelector);if(!e)return false;this.sortableNodes=Array.from(this.sortableHost.querySelectorAll(this.itemSelector))||[];const h=this.nanoGrabbed.emit({element:e,index:this.sortableNodes.indexOf(e)});if(h.defaultPrevented)return false;t.preventDefault();this.updateUserSelectStyle("none");this.dragRequestPending=true;this.draggedElement=e;this.dropzoneNodes=Array.from(this.sortableHost.querySelectorAll(this.dropzoneSelector))||[];this.draggedElementClone=this.createClone(e);this.draggedElementOrigin=e.nextSibling;this.animatedElements=[];this.draggedElement.classList.add(this.placeholderClass);return true}constructor(h){i(this,h);this.nanoOrderChange=s(this,"nanoOrderChange",7);this.nanoGrabbed=s(this,"nanoGrabbed",7);this.nanoDropped=s(this,"nanoDropped",7);this.dragRequestPending=false;this.sortableNodes=[];this.dropzoneNodes=[];this.animatedElements=[];this.keyboardHandleMap=new Map;this.sortableId=`nano-sortable-${c++}`;this.finishOrder=()=>{if(!this.draggedElement)return;const t=Array.from(this.sortableHost.querySelectorAll(this.itemSelector)).filter((t=>t!==this.draggedElementClone));const i=this.sortableNodes.indexOf(this.draggedElement);const s=t.indexOf(this.draggedElement);if(this.handleSelector){const t=this.draggedElement.querySelector(this.handleSelector);t.classList.remove(this.handleDraggedClass)}if(i!==s){const e=this.nanoOrderChange.emit({element:this.draggedElement,originalIndex:i,targetIndex:s});if(e.defaultPrevented){this.animationPromise=new Promise((s=>{setTimeout((()=>{this.insertAtTarget(this.draggedElement,t[i]);this.reset();this.dragRequestPending=false;s()}),200)}));return}this.addAriaMsg(this.reorderHelperText(this.draggedElement,t,s+1))}this.reset();this.dragRequestPending=false};this.trackMove=(i,s)=>{if(!this.draggedElementClone){return}if(this.orientation){i=i*d[this.orientation].x;s=s*d[this.orientation].y}t((()=>{Object.assign(this.draggedElementClone.style,{transform:`translate3d(${i}px, ${s}px, 0)`})}));let h=this.hitTest(this.draggedElementClone,this.sortableNodes)[0];let n;if(this.dropzoneSelector&&this.dropzoneActiveClass){e((()=>{n=this.draggedElement.closest(this.dropzoneSelector);t((()=>{this.dropzoneNodes.filter((t=>t!==n)).forEach((t=>t.classList.remove(this.dropzoneActiveClass)));n.classList.add(this.dropzoneActiveClass)}))}))}if(!h&&this.dropzoneNodes.length){h=this.hitTest(this.draggedElementClone,this.dropzoneNodes)[0];if(this.draggedElement.closest(this.dropzoneSelector)===h)return}if(h&&h!==this.draggedElement&&!this.isAnimating(h)){this.insertAtTarget(this.draggedElement,h)}};this.itemSelector="li";this.handleSelector=undefined;this.dropzoneSelector=undefined;this.helperText='Press "Space" or "Enter" to enable element reordering and use the arrow keys to reorder items.'+'Press "Escape" to cancel reordering. Alternatively, use your mouse to drag / reorder.';this.itemDescriptor=t=>`"${t===null||t===void 0?void 0:t.textContent.trim()}"`;this.grabbedHelperText=t=>`${this.itemDescriptor(t)} grabbed`;this.droppedHelperText=t=>`${this.itemDescriptor(t)} dropped`;this.reorderHelperText=(t,i,s)=>`The list has been reordered, ${this.itemDescriptor(t)} is now item ${s} of ${i.length}`;this.createKeyboardHandle=(t,i)=>{const s=`\n <nano-icon-button\n slot="end"\n icon-name="light/arrows"\n class="nano-sortable__keyboard-handle visually-hidden"\n label="Re-order this item"\n ></nano-icon-button>`;const e=globalThis.document.createElement("div");e.innerHTML=s;const h=e.children[0];i.append(h);return h};this.sortableHostElement=undefined;this.animationEnabled=true;this.draggedClass="nano-sortable__dragged";this.handleDraggedClass="nano-sortable__handle-dragged";this.placeholderClass="nano-sortable__placeholder";this.dropzoneActiveClass="";this.animationTiming={duration:200,easing:"ease-out"};this.orientation=undefined;this.dragResize=false;this.keyboardSortActive=false;this.ariaTextList=[];this.handleTrack=this.handleTrack.bind(this);this.handleKeydown=this.handleKeydown.bind(this);this.refreshKeyboardHandles=this.refreshKeyboardHandles.bind(this);this.refreshKeyboardHandles=a(this.refreshKeyboardHandles,500)}connectedCallback(){this.addEventHandlers();this.refreshKeyboardHandles();this.attachMutationObserver();if(!this.host.querySelector(`#${this.sortableId}`)){this.host.insertAdjacentHTML("beforeend",`<div class="visually-hidden" id="${this.sortableId}">${this.helperText}</div>`)}}disconnectedCallback(){var t;this.removeEventHandlers();(t=this.host.querySelector(`#${this.sortableId}`))===null||t===void 0?void 0:t.remove();if(this.mutationObserver){this.mutationObserver.disconnect();this.mutationObserver=undefined}}render(){return h(n,null,h("div",{class:"sortable__live-region","aria-live":"polite","aria-relevant":"additions","aria-atomic":"true",role:"log",part:"announcements"},this.ariaTextList.map((t=>h("div",null,t)))),h("slot",null))}get host(){return r(this)}static get watchers(){return{itemSelector:["handleItemSelectorChange"],handleSelector:["handleHandleSelectorChange"],createKeyboardHandle:["handleCreateKeyboardHandleChange"],sortableHostElement:["handleSortableHostElement"]}}};f.style=l;export{f as nano_sortable};
|
5
|
-
//# sourceMappingURL=p-7759d185.entry.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"names":["sortableCss","orientationMap","horizontal","x","y","vertical","sortableIds","Sortable","handleItemSelectorChange","this","refreshKeyboardHandles","handleHandleSelectorChange","attachMutationObserver","handleCreateKeyboardHandleChange","handleSortableHostElement","_newVal","oldVal","removeEventHandlers","addEventHandlers","sortableHostElement","style","position","async","handleSelector","_a","keyboardHandleMap","size","clear","sortableHost","querySelectorAll","forEach","handle","getAttribute","setAttribute","sortableId","sortEle","closest","itemSelector","set","_b","_c","_ele","remove","ele","i","createKeyboardHandle","console","error","host","addAriaMsg","msg","ariaTextList","setTimeout","mIdx","indexOf","splice","updateUserSelectStyle","userSelect","MozUserSelect","msUserSelect","webkitUserSelect","hitTest","node","targets","left","l","top","t","width","w","height","h","getBoundingClientRect","filter","item","right","bottom","isAnimating","animatedElements","animateNode","dx","dy","animate","push","willChange","writeTask","animationPromise","Promise","resolve","transform","animationTiming","addEventListener","index","once","insertAtTarget","target","offsets","animationEnabled","sortableNodes","map","offsetLeft","offsetTop","isConnected","dropzoneNodes","append","nodeComparison","compareDocumentPosition","DOCUMENT_POSITION_FOLLOWING","parentNode","DOCUMENT_POSITION_PRECEDING","insertAdjacentElement","sortableNode","reset","draggedElementClone","undefined","removeChild","draggedElement","draggedElementOrigin","classList","placeholderClass","dropzoneActiveClass","length","dze","dragRequestPending","createClone","clone","cloneNode","id","Array","from","children","nodeChild","clonedNodeChild","originalNodeChild","offsetWidth","offsetHeight","Object","assign","dragResize","add","draggedClass","appendChild","addListeners","el","events","fn","opts","split","e","removeEventListener","handleTrack","handleKeydown","passive","mutationObserver","disconnect","MutationObserver","currHandles","values","newHandles","find","includes","observe","subtree","childList","targetElement","foundHandle","get","activateSort","isActive","keyboardSortActive","toggle","handleDraggedClass","grabbedHelperText","document","droppedHelperText","key","preventDefault","nanoGrabbedEv","nanoGrabbed","emit","element","defaultPrevented","nanoDropped","moveKeys","orientation","dropzoneSelector","currIdx","curDzIdx","curDropzone","prevEle","nextEle","finishOrder","focus","requestAnimationFrame","setFocus","then","button","handleMove","cancelable","clearTimeout","mouseDownTimer","resetTrack","window","trackStart","drag","initialEvent","relative","onMove","trackMove","onStop","didStop","targetHandle","nextSibling","constructor","hostRef","Map","updated","originalIndex","targetIndex","querySelector","orderChangeEv","nanoOrderChange","reorderHelperText","activeDropzone","readTask","textContent","trim","itemDescriptor","elements","_number","_element","handleTpl","div","globalThis","createElement","innerHTML","duration","easing","bind","nanoDebounce","connectedCallback","insertAdjacentHTML","helperText","disconnectedCallback","render","Host","class","role","part","str"],"sources":["./src/components/sortable/sortable.scss?tag=nano-sortable&encapsulation=shadow","./src/components/sortable/sortable.tsx"],"sourcesContent":["@use '../../global/style/utilities/globals' as g;\n\n:host {\n position: relative;\n display: block;\n}\n\n.sortable__live-region {\n @include g.visually-hide();\n}\n","import {\n Prop,\n Element,\n Event,\n EventEmitter,\n h,\n Component,\n ComponentInterface,\n Watch,\n Method,\n State,\n Host,\n readTask,\n writeTask,\n Build,\n} from '@stencil/core';\nimport { drag } from '../../utils/drag';\nimport { nanoDebounce } from '../..';\n\n// Orientation map to limit dragging to horizontal or vertical.\nconst orientationMap = {\n horizontal: { x: 1, y: 0 },\n vertical: { x: 0, y: 1 },\n};\n\nlet sortableIds = 0;\n\n/**\n * An accessible and flexible re-order / sort utility component.\n *\n *- Drag and drop via mouse, touch or keyboard\n *- Live announcements for screen readers\n *- Works with or without an explicit handle (although with is preferable)\n\n * @part announcements - the a11y, live region. Visually hidden by default\n *\n * @slot - The default slot containing any items you might want to sort\n */\n@Component({\n tag: 'nano-sortable',\n shadow: true,\n styleUrl: 'sortable.scss',\n})\nexport class Sortable implements ComponentInterface {\n /// Public API & surface ///\n\n /** A css query selector which matches a set of elements that should be sortable. e.g. `<li>` or `<tr>` */\n @Prop() itemSelector = 'li';\n @Watch('itemSelector')\n handleItemSelectorChange() {\n this.refreshKeyboardHandles();\n }\n\n /** A css query selector which matches an element *within* the `itemSelector` element\n * which will act like a drag handle. **Note** For keyboard a11y it's recommended\n * to use `handleSelector` when possible. Alternatively, the `createKeyboardHandle` prop will be used */\n @Prop() handleSelector?: string;\n @Watch('handleSelector')\n handleHandleSelectorChange() {\n this.refreshKeyboardHandles();\n this.attachMutationObserver();\n }\n\n /** When dragging between grouped collections of items, it is possible to drag all sortable items from one group to another.\n * At that point, you will not be able to drag items back to the original group.\n * A `dropzoneSelector` allows you to define a placeholder area where items can always be dropped.\n */\n @Prop() dropzoneSelector?: string;\n\n /** Accessibility helper text applied to handle controls */\n @Prop() helperText =\n 'Press \"Space\" or \"Enter\" to enable element reordering and use the arrow keys to reorder items.' +\n 'Press \"Escape\" to cancel reordering. Alternatively, use your mouse to drag / reorder.';\n\n /**\n * As a sortable element is interacted with, announcements are made to screen readers\n * - informing the user what is changing.\n * By default, the text from the element is extracted to describe the interacted with element.\n * Use this function to provide a more meaningful, concise item descriptor\n * @param el the element being interacted with\n * @returns a string, describing the element being interacted with\n */\n @Prop() itemDescriptor = (el: Element) => `\"${el?.textContent.trim()}\"`;\n\n /**\n * Used to generate a screen reader live update, informing the user of the current element being grabbed.\n * @param el the element that has been grabbed by the user\n * @returns a string, describing the element being grabbed\n */\n @Prop() grabbedHelperText = (el: Element) =>\n `${this.itemDescriptor(el)} grabbed`;\n\n /**\n * Used to generate a screen reader live update, informing the user of the current element being dropped.\n * @param el the element that has been dropped by the user\n * @returns a string, describing the element that has been dropped\n */\n @Prop() droppedHelperText = (el: Element) =>\n `${this.itemDescriptor(el)} dropped`;\n\n /**\n * Used to generate a screen reader live update, informing the user when items have been reordered.\n * @param el the element that has been reordered by the user\n * @param elements the elements in the sortable list\n * @param position the new position of the dropped element\n * @returns a string, describing the element being dropped\n */\n @Prop() reorderHelperText = (\n el: Element,\n elements: Element[],\n position: number\n ) =>\n `The list has been reordered, ${this.itemDescriptor(\n el\n )} is now item ${position} of ${elements.length}`;\n\n /**\n * A function that should attach a keyboard accessible control.\n * When a `handleSelector` is not used - to allow keyboard accessibility -\n * `createKeyboardHandle` should render a focusable element.\n *\n * If your sortable item is itself focusable,\n * you must use this function to render a control *outside* of the focusable element.\n * @param _number\n * @param _element\n * @returns a function that attaches a keyboard accessible handle control element.\n * The function itself *must* return the handle element.\n */\n @Prop() createKeyboardHandle = (_number: number, _element: Element) => {\n const handleTpl = /* html */ `\n <nano-icon-button\n slot=\"end\"\n icon-name=\"light/arrows\"\n class=\"nano-sortable__keyboard-handle visually-hidden\"\n label=\"Re-order this item\"\n ></nano-icon-button>`;\n const div = globalThis.document.createElement('div');\n div.innerHTML = handleTpl;\n\n const handle = div.children[0] as HTMLElement;\n _element.append(handle);\n return handle;\n };\n @Watch('createKeyboardHandle')\n handleCreateKeyboardHandleChange() {\n this.refreshKeyboardHandles();\n }\n\n /** use `sortableHostElement` to watch a sortable list without needing to wrap in `nano-sortable`.\n * Note that the `sortableHostElement` element css `position` will be set to `relative` */\n @Prop() sortableHostElement?: HTMLElement;\n @Watch('sortableHostElement')\n handleSortableHostElement(_newVal?, oldVal?: HTMLElement) {\n if (oldVal) this.removeEventHandlers(oldVal);\n\n this.addEventHandlers();\n this.refreshKeyboardHandles();\n this.attachMutationObserver();\n\n if (this.sortableHostElement) {\n // sortable host must have position relative\n this.sortableHostElement.style.position = 'relative';\n }\n }\n\n /** Items being sorted will animate into place */\n @Prop() animationEnabled = true;\n\n /** Use this class to change how the element looks whilst being sorted */\n @Prop() draggedClass = 'nano-sortable__dragged';\n\n /** Use this class to change how the handle looks whilst being sorted */\n @Prop() handleDraggedClass = 'nano-sortable__handle-dragged';\n\n /** Use this class to change how the element looks when acting as a placeholder */\n @Prop() placeholderClass = 'nano-sortable__placeholder';\n\n /** Used in-conjunction with `dropzoneSelector`, applied when a dropzone is dragged over */\n @Prop() dropzoneActiveClass?: string = '';\n\n /** The css animation timing applied when `animationEnabled` is `true` */\n @Prop() animationTiming: any = { duration: 200, easing: 'ease-out' };\n\n /** The axis to lock dragging elements to. `undefined` means any axis */\n @Prop() orientation?: 'horizontal' | 'vertical';\n\n /** Dragged items by default, will take whatever default css is applied in situ.\n * When sortable items' dimensions are dynamic (i.e they can shrink / grow via the space allowed) dragging items can look 'wrong'.\n * Apply `dragResize` to read & recreate the dragged items current dimensions when dragged. */\n @Prop() dragResize = false;\n\n /** Fired when an the order changes. Use this to update any underlying data model.\n * `event.preventDefault()` to prevent the element being moved; will revert to original position. */\n @Event() nanoOrderChange: EventEmitter<{\n element: HTMLElement;\n originalIndex: number;\n targetIndex: number;\n }>;\n\n /** Fired when a sortable element is picked-up; via keyboard, mouse or touch.\n * `event.preventDefault()` to prevent the element being picked-up. */\n @Event() nanoGrabbed: EventEmitter<{ element: HTMLElement; index: number }>;\n\n /** Fired when a sortable element is dropped after having been picked up. */\n @Event() nanoDropped: EventEmitter<{ element: HTMLElement }>;\n\n /** If sortable elements change dynamically, use this method to add handle controls to new elements */\n @Method()\n async refreshKeyboardHandles() {\n if (this.handleSelector) {\n if (this.keyboardHandleMap?.size) {\n this.keyboardHandleMap.clear();\n }\n\n this.sortableHost\n .querySelectorAll<HTMLElement>(this.handleSelector)\n .forEach((handle) => {\n if (!handle.getAttribute('aria-describedby'))\n handle.setAttribute('aria-describedby', this.sortableId);\n const sortEle = handle.closest<HTMLElement>(this.itemSelector);\n if (sortEle) this.keyboardHandleMap.set(handle, sortEle);\n });\n return;\n }\n\n if (this.keyboardHandleMap?.size) {\n this.keyboardHandleMap?.forEach((_ele, handle) => handle.remove());\n this.keyboardHandleMap.clear();\n }\n this.sortableHost\n .querySelectorAll<HTMLElement>(this.itemSelector)\n .forEach((ele, i) => {\n const handle = this.createKeyboardHandle(i, ele);\n if (!handle) {\n console.error(\n '`createKeyboardHandle` *must* return the handle element it creates'\n );\n return;\n }\n this.keyboardHandleMap.set(handle, ele);\n handle.setAttribute('aria-describedby', this.sortableId);\n });\n }\n\n /// Private state & logic ///\n\n @Element() host: HTMLNanoSortableElement;\n private dragRequestPending = false;\n private draggedElement?: HTMLElement;\n private draggedElementClone?: HTMLElement;\n private draggedElementOrigin?: HTMLElement;\n private sortableNodes: HTMLElement[] = [];\n private dropzoneNodes: HTMLElement[] = [];\n private animatedElements: HTMLElement[] = [];\n private animationPromise?: Promise<void>;\n private keyboardHandleMap: Map<HTMLElement, HTMLElement> = new Map();\n private sortableId = `nano-sortable-${sortableIds++}`;\n private mouseDownTimer: number;\n private mutationObserver: MutationObserver;\n\n @State() keyboardSortActive = false;\n @State() ariaTextList: string[] = [];\n\n /**\n * Get instance of sortable host.\n * By default it is `nano-sortable` which can be overridden by property `sortableHostElement`\n */\n get sortableHost() {\n if (this.sortableHostElement) return this.sortableHostElement;\n return this.host;\n }\n\n /**\n * Queues aria messages which are then displayed in a 'live' region.\n * Messages are cleared after 10s\n * @param msg aria message to announce\n */\n private addAriaMsg(msg: string) {\n this.ariaTextList = [...this.ariaTextList, msg];\n\n setTimeout(() => {\n const mIdx = this.ariaTextList.indexOf(msg);\n this.ariaTextList.splice(mIdx, 1);\n this.ariaTextList = [...this.ariaTextList];\n }, 10000);\n }\n\n /**\n * Try to stop text highlight whilst dragging\n * @param userSelect\n */\n private updateUserSelectStyle(userSelect: '' | 'none') {\n this.host.style.userSelect = userSelect;\n // @ts-ignore\n this.host.style.MozUserSelect = userSelect;\n // @ts-ignore\n this.host.style.msUserSelect = userSelect;\n this.host.style.webkitUserSelect = userSelect;\n }\n\n /**\n * Fast and simple hit test to check whether the center of a node intersects with the rectangle of any of the\n * given targets. Returns an array of matches.\n * @param node\n * @param targets\n * @returns all the items that currently intersect with the target node\n */\n private hitTest(node: HTMLElement, targets: HTMLElement[]): HTMLElement[] {\n const {\n left: l,\n top: t,\n width: w,\n height: h,\n } = node.getBoundingClientRect();\n const x = l + w / 2;\n const y = t + h / 2;\n\n return targets.filter((item) => {\n const { left, right, top, bottom } = item.getBoundingClientRect();\n return !(x < left || x > right || y < top || y > bottom);\n });\n }\n\n /**\n * Returns a boolean indicating whether the node is currently in an animation.\n * @param node\n * @returns whether a node is currently animating or not\n */\n private isAnimating(node: HTMLElement) {\n return this.animatedElements.indexOf(node) !== -1;\n }\n\n /**\n * Triggers a CSS animation on a node with the given dx and dy. Used following dom updates to make it appear as\n * if nodes animate from their old to their new position in the dom. */\n private animateNode(node: HTMLElement, dx = 0, dy = 0) {\n if (!node.animate) {\n return;\n }\n\n // keep a stack of currently animating nodes to exclude as drag & drop targets.\n this.animatedElements.push(node);\n\n node.style.willChange = 'transform';\n\n // animate from dx/dy (old node position) to none (new node position)\n writeTask(() => {\n this.animationPromise = new Promise((resolve) => {\n node\n .animate(\n [\n { transform: `translate3d(${dx}px, ${dy}px, 0)` },\n { transform: 'none' },\n ],\n this.animationTiming\n )\n .addEventListener(\n 'finish',\n () => {\n const index = this.animatedElements.indexOf(node);\n node.style.willChange = '';\n\n if (index !== -1) {\n // splice out when done to unlock as a valid target\n this.animatedElements.splice(index, 1);\n }\n\n resolve();\n delete this.animationPromise;\n },\n { once: true }\n );\n });\n });\n }\n\n /**\n * Inserts node at target to update sibling sorting. If the node precedes the target, it is inserted after it;\n * If it follows the target, it is inserted before it. This ensures any node can be dragged from the very\n * beginning to the very end and vice versa. The animateNode function is called for all nodes that moved because\n * of this dom update */\n private insertAtTarget(node: Element, target: HTMLElement) {\n if (!node || !target) return;\n\n let offsets: any[] = [];\n if (this.animationEnabled) {\n offsets = this.sortableNodes.map((item) => ({\n x: item.offsetLeft,\n y: item.offsetTop,\n }));\n }\n\n if (!node.isConnected || !target.isConnected) return;\n\n if (this.dropzoneNodes.indexOf(target) > -1) {\n target.append(node);\n } else {\n const nodeComparison = node.compareDocumentPosition(target);\n let position;\n\n if (nodeComparison & this.host.DOCUMENT_POSITION_FOLLOWING) {\n position =\n target.parentNode === node.parentNode ? 'afterend' : 'beforebegin';\n }\n if (nodeComparison & this.host.DOCUMENT_POSITION_PRECEDING) {\n position =\n target.parentNode === node.parentNode ? 'beforebegin' : 'afterend';\n }\n if (position) target.insertAdjacentElement(position, node);\n }\n\n if (this.animationEnabled) {\n this.sortableNodes.forEach((sortableNode, i) => {\n const { x, y } = offsets[i];\n const dx = x - sortableNode.offsetLeft;\n const dy = y - sortableNode.offsetTop;\n if (dx !== 0 || dy !== 0) {\n this.animateNode(sortableNode, dx, dy);\n }\n });\n }\n }\n\n private reset() {\n if (\n this.draggedElementClone !== undefined &&\n this.draggedElementClone.parentNode !== null\n ) {\n this.draggedElementClone.parentNode.removeChild(this.draggedElementClone);\n }\n\n if (\n this.draggedElement &&\n this.draggedElement.parentNode &&\n this.draggedElementOrigin\n ) {\n this.draggedElement.classList.remove(this.placeholderClass);\n }\n\n if (this.dropzoneActiveClass && this.dropzoneNodes.length) {\n this.dropzoneNodes.forEach((dze) =>\n dze.classList.remove(this.dropzoneActiveClass)\n );\n }\n\n delete this.draggedElementClone;\n delete this.draggedElement;\n\n this.dropzoneNodes = [];\n this.sortableNodes = [];\n this.animatedElements = [];\n this.dragRequestPending = false;\n this.updateUserSelectStyle('');\n }\n\n /**\n * Clones a given node to visually drag around. The original node is left in the same flow as its siblings.\n * Clone styles are added onto the style object directly, since the ::slotted()\n * selector can't universally target nodes that may be nested an unknown amount of shadow dom levels deep\n * @param node html node to clone\n * @returns the cloned html node\n */\n private createClone(node: HTMLElement): HTMLElement {\n const clone = node.cloneNode(true) as HTMLElement;\n if (node.id) clone.id = 'clone__' + clone.id;\n\n /**\n * Bugfix for table row sorting.\n * During dragging table rows shrink, so we manually set them width of original node.\n */\n Array.from(clone.children).forEach((nodeChild: HTMLElement, index) => {\n const clonedNodeChild = nodeChild;\n const originalNodeChild = node.children.item(index) as HTMLElement;\n\n if (originalNodeChild) {\n clonedNodeChild.style.width = `${originalNodeChild.offsetWidth}px`;\n }\n });\n const {\n offsetLeft: x,\n offsetTop: y,\n offsetWidth: w,\n offsetHeight: h,\n } = node;\n\n Object.assign(clone.style, {\n position: 'absolute',\n left: `calc(${x}px - var(--grab-offset-x, 0px))`,\n top: `calc(${y}px - var(--grab-offset-y, 0px))`,\n height: this.dragResize ? `${h}px` : undefined,\n width: this.dragResize ? `${w}px` : undefined,\n willChange: 'transform,opacity',\n });\n\n clone.classList.add(this.draggedClass);\n\n return node.parentNode!.appendChild(clone);\n }\n\n /// Event handlers ///\n\n private addListeners(\n el: Element | Document,\n events: string,\n fn: (e: Event) => void,\n opts?: AddEventListenerOptions\n ) {\n events\n .split(' ')\n .forEach((e) =>\n el.addEventListener(e as keyof HTMLElementEventMap, fn, opts)\n );\n }\n\n private removeEventHandlers(ele?: HTMLElement) {\n ele = ele || this.sortableHost;\n ele.removeEventListener('mousedown', this.handleTrack);\n ele.removeEventListener('touchstart', this.handleTrack);\n ele.removeEventListener('keydown', this.handleKeydown);\n }\n\n private addEventHandlers(ele?: HTMLElement) {\n ele = ele || this.sortableHost;\n this.addListeners(ele, 'mousedown touchstart', this.handleTrack, {\n passive: true,\n });\n ele.addEventListener('keydown', this.handleKeydown);\n }\n\n /**\n * Watch for any changes in grab-able handle elements.\n */\n private attachMutationObserver() {\n if (!Build.isBrowser) return;\n\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = undefined;\n }\n\n this.mutationObserver = new MutationObserver(() => {\n const currHandles = Array.from(this.keyboardHandleMap.values());\n const newHandles = Array.from(\n this.sortableHost.querySelectorAll<HTMLElement>(this.itemSelector)\n );\n\n // simple test for equality\n if (\n currHandles.length !== newHandles.length ||\n !!newHandles.find((h) => !currHandles.includes(h))\n ) {\n this.refreshKeyboardHandles();\n }\n });\n this.mutationObserver.observe(this.sortableHost, {\n subtree: true,\n childList: true,\n });\n }\n\n private handleKeydown(e: KeyboardEvent) {\n const targetElement = e.target as HTMLElement;\n let foundHandle: HTMLElement;\n let sortEle: HTMLElement;\n\n if (this.handleSelector) {\n foundHandle = targetElement.closest(this.handleSelector);\n sortEle = targetElement.closest(this.itemSelector);\n } else {\n sortEle = this.keyboardHandleMap.get(targetElement);\n foundHandle = targetElement;\n }\n\n // have we found a handle and matching sort element from the keydown element\n if (!foundHandle || !sortEle) return;\n\n const activateSort = (isActive: boolean) => {\n this.keyboardSortActive = isActive;\n this.draggedElement = isActive ? sortEle : undefined;\n sortEle.classList.toggle(this.draggedClass, isActive);\n foundHandle.classList.toggle(this.handleDraggedClass, isActive);\n\n if (isActive) {\n this.addAriaMsg(this.grabbedHelperText(sortEle));\n document.addEventListener('mousedown', () => activateSort(false), {\n once: true,\n });\n } else {\n this.addAriaMsg(this.droppedHelperText(sortEle));\n }\n };\n\n // start editing this element's order?\n if ([' ', 'Space', 'Enter'].includes(e.key)) {\n e.preventDefault();\n\n if (!this.keyboardSortActive) {\n // grabbed the element\n activateSort(true);\n\n this.sortableNodes =\n Array.from(this.sortableHost.querySelectorAll(this.itemSelector)) ||\n [];\n const nanoGrabbedEv = this.nanoGrabbed.emit({\n element: sortEle,\n index: this.sortableNodes.indexOf(sortEle),\n });\n\n if (nanoGrabbedEv.defaultPrevented) {\n activateSort(false);\n return;\n }\n } else {\n // dropped the element\n activateSort(false);\n this.nanoDropped.emit({ element: sortEle });\n }\n return;\n }\n if (!this.keyboardSortActive) return;\n\n // Tabbing away from this handle - deactivate\n if (['Escape', 'Tab'].includes(e.key)) activateSort(false);\n\n let moveKeys = ['Home', 'End'];\n if (!this.orientation || this.orientation === 'horizontal')\n moveKeys = [...moveKeys, 'ArrowRight', 'ArrowLeft'];\n if (!this.orientation || this.orientation === 'vertical')\n moveKeys = [...moveKeys, 'ArrowUp', 'ArrowDown'];\n\n if (!moveKeys.includes(e.key)) return;\n\n // move the element with the keyboard\n e.preventDefault();\n\n /** Collect all elements that have drag positions.\n * Both sortable elements and 'dropzones' (placeholders where items can always be placed) */\n\n this.sortableNodes =\n Array.from(this.sortableHost.querySelectorAll(this.itemSelector)) || [];\n this.dropzoneNodes =\n Array.from(this.sortableHost.querySelectorAll(this.dropzoneSelector)) ||\n [];\n const currIdx = this.sortableNodes.indexOf(this.draggedElement);\n let curDzIdx: number = -1;\n\n if (this.dropzoneNodes.length) {\n const curDropzone = this.draggedElement.closest<HTMLElement>(\n this.dropzoneSelector\n );\n curDzIdx = this.dropzoneNodes.indexOf(curDropzone);\n curDzIdx = curDzIdx > -1 ? curDzIdx : -1;\n }\n\n /** If we don't have a next / prev sortable element in our list, test to see if there's a dropzone instead */\n const prevEle =\n currIdx - 1 < 0 && curDzIdx > -1\n ? this.dropzoneNodes[curDzIdx - 1]\n : this.sortableNodes[currIdx - 1];\n const nextEle =\n currIdx + 1 === this.sortableNodes.length && curDzIdx > -1\n ? this.dropzoneNodes[curDzIdx + 1]\n : this.sortableNodes[currIdx + 1];\n\n if (e.key === 'Home') {\n this.insertAtTarget(this.draggedElement, this.sortableNodes[0]);\n }\n if (e.key === 'End') {\n this.insertAtTarget(\n this.draggedElement,\n this.sortableNodes[this.sortableNodes.length - 1]\n );\n }\n if (['ArrowRight', 'ArrowDown'].includes(e.key)) {\n this.insertAtTarget(this.draggedElement, nextEle);\n }\n if (['ArrowLeft', 'ArrowUp'].includes(e.key)) {\n this.insertAtTarget(this.draggedElement, prevEle);\n }\n\n this.finishOrder();\n this.draggedElement = sortEle;\n\n const focus = () => {\n requestAnimationFrame(() => {\n typeof foundHandle['setFocus'] === 'function'\n ? (foundHandle as HTMLNanoIconButtonElement).setFocus()\n : foundHandle.focus();\n });\n };\n\n // replace focus to handle so we don't 'drop' the element\n if (this.animationPromise) this.animationPromise.then(() => focus());\n else focus();\n }\n\n /** Tracks a pointer from touchstart/mousedown to touchend/mouseup. */\n private handleTrack(e: PointerEvent) {\n // ignore if we've started dragging or right click\n if (this.dragRequestPending || (e.button && e.button !== 1)) return;\n\n // ignore touchmove events (namespace it so we can remove it)\n const handleMove = (e: Event) => {\n if (e.cancelable) e.preventDefault();\n clearTimeout(this.mouseDownTimer);\n };\n\n // remove temporary events and reset timer\n const resetTrack = () => {\n clearTimeout(this.mouseDownTimer);\n document.removeEventListener('touchmove', handleMove);\n document.removeEventListener('contextmenu', this.finishOrder);\n };\n resetTrack();\n\n // start a timer - only start dragging if pressed for 150ms\n this.mouseDownTimer = window?.setTimeout(() => {\n // ignore if this is not a valid drag target\n if (!this.trackStart(e)) return;\n\n // ignore touchmove events (they scroll the screen)\n document.addEventListener('touchmove', handleMove, {\n passive: false,\n });\n // cancel if user presses and holds (without move) for context menu\n document.addEventListener('contextmenu', this.finishOrder);\n\n this.addAriaMsg(this.grabbedHelperText(this.draggedElement));\n\n drag(this.sortableHost, {\n initialEvent: e,\n relative: true,\n onMove: (x, y) => {\n this.trackMove(x, y);\n },\n onStop: () => {\n this.nanoDropped.emit({ element: this.draggedElement });\n resetTrack();\n\n const didStop = () => {\n this.addAriaMsg(this.droppedHelperText(this.draggedElement));\n requestAnimationFrame(() => this.finishOrder());\n };\n if (this.animationPromise) {\n this.animationPromise.then(() => didStop());\n } else didStop();\n },\n });\n }, 150);\n\n // reset track timer & cancel DnD on mouseup / touchend / touchmove\n this.addListeners(\n document,\n 'mouseup touchend touchmove',\n () => clearTimeout(this.mouseDownTimer),\n { once: true }\n );\n }\n\n /**\n * Initialized a drag and drop sequence if a child node was clicked that matches the itemSelector property.\n * OR If a handleSelector is defined, a node matching this selector must be clicked instead\n * @returns boolean - whether tracking for this event should continue or not\n */\n private trackStart(e: Event) {\n const targetElement = e.target as HTMLElement;\n let targetHandle: HTMLElement;\n\n // If we have a handle set, return now if not being pressed\n if (this.handleSelector) {\n targetHandle = targetElement.closest(this.handleSelector);\n\n if (!targetHandle) return;\n targetHandle.classList.add(this.handleDraggedClass);\n }\n\n // Check that we've found the target element via itemSelector\n const node = targetElement.closest<HTMLElement>(this.itemSelector);\n if (!node) return false;\n\n this.sortableNodes =\n Array.from(this.sortableHost.querySelectorAll(this.itemSelector)) || [];\n const nanoGrabbedEv = this.nanoGrabbed.emit({\n element: node,\n index: this.sortableNodes.indexOf(node),\n });\n if (nanoGrabbedEv.defaultPrevented) return false;\n\n // Element found... start everything\n e.preventDefault();\n this.updateUserSelectStyle('none');\n this.dragRequestPending = true;\n this.draggedElement = node;\n this.dropzoneNodes =\n Array.from(this.sortableHost.querySelectorAll(this.dropzoneSelector)) ||\n [];\n this.draggedElementClone = this.createClone(node);\n this.draggedElementOrigin = node.nextSibling as HTMLElement;\n this.animatedElements = [];\n this.draggedElement!.classList.add(this.placeholderClass);\n return true;\n }\n\n /** Ends re-ordering */\n private finishOrder = () => {\n if (!this.draggedElement) return;\n\n const updated = Array.from(\n this.sortableHost.querySelectorAll<HTMLElement>(this.itemSelector)\n ).filter((ele) => ele !== this.draggedElementClone);\n const originalIndex = this.sortableNodes.indexOf(this.draggedElement);\n const targetIndex = updated.indexOf(this.draggedElement);\n\n if (this.handleSelector) {\n const targetHandle = this.draggedElement.querySelector(\n this.handleSelector\n );\n targetHandle.classList.remove(this.handleDraggedClass);\n }\n\n if (originalIndex !== targetIndex) {\n const orderChangeEv = this.nanoOrderChange.emit({\n element: this.draggedElement,\n originalIndex,\n targetIndex,\n });\n\n if (orderChangeEv.defaultPrevented) {\n /** Event was prevented, wait a moment to send element back to whence it came - gives a nicer visual queue */\n this.animationPromise = new Promise((resolve) => {\n setTimeout(() => {\n this.insertAtTarget(this.draggedElement, updated[originalIndex]);\n this.reset();\n this.dragRequestPending = false;\n resolve();\n }, 200);\n });\n return;\n }\n this.addAriaMsg(\n this.reorderHelperText(this.draggedElement, updated, targetIndex + 1)\n );\n }\n\n this.reset();\n this.dragRequestPending = false;\n };\n\n /**\n * Moves the active node's clone to follow the pointer. The node that the clone intersects with (via hitTest) is\n * the insert point for updated sorting */\n private trackMove = (x: number, y: number) => {\n if (!this.draggedElementClone) {\n return;\n }\n\n if (this.orientation) {\n x = x * orientationMap[this.orientation].x;\n y = y * orientationMap[this.orientation].y;\n }\n\n writeTask(() => {\n Object.assign(this.draggedElementClone!.style, {\n transform: `translate3d(${x}px, ${y}px, 0)`,\n });\n });\n\n let target = this.hitTest(this.draggedElementClone!, this.sortableNodes)[0];\n let activeDropzone: HTMLElement;\n\n if (this.dropzoneSelector && this.dropzoneActiveClass) {\n readTask(() => {\n activeDropzone = this.draggedElement.closest(this.dropzoneSelector);\n\n writeTask(() => {\n this.dropzoneNodes\n .filter((dze) => dze !== activeDropzone)\n .forEach((dze) => dze.classList.remove(this.dropzoneActiveClass));\n activeDropzone.classList.add(this.dropzoneActiveClass);\n });\n });\n }\n\n // didn't find a target - let's test to see if we can use a drop-zone instead\n if (!target && this.dropzoneNodes.length) {\n target = this.hitTest(this.draggedElementClone!, this.dropzoneNodes)[0];\n if (this.draggedElement.closest(this.dropzoneSelector) === target) return;\n }\n\n if (\n // if clone intersects with a valid target,\n target &&\n // other than its own origin,\n target !== this.draggedElement &&\n // and the target isn't currently animating, which causes false hit tests,\n !this.isAnimating(target)\n ) {\n this.insertAtTarget(this.draggedElement!, target);\n }\n };\n\n /// Component lifecycle ///\n\n constructor() {\n this.handleTrack = this.handleTrack.bind(this);\n this.handleKeydown = this.handleKeydown.bind(this);\n this.refreshKeyboardHandles = this.refreshKeyboardHandles.bind(this);\n this.refreshKeyboardHandles = nanoDebounce(\n this.refreshKeyboardHandles,\n 500\n );\n }\n\n connectedCallback() {\n this.addEventHandlers();\n this.refreshKeyboardHandles();\n this.attachMutationObserver();\n\n if (Build.isBrowser && !this.host.querySelector(`#${this.sortableId}`)) {\n // inject a light-dom / a11y description that we can connect sortable items to\n this.host.insertAdjacentHTML(\n 'beforeend',\n `<div class=\"visually-hidden\" id=\"${this.sortableId}\">${this.helperText}</div>`\n );\n }\n }\n\n disconnectedCallback() {\n this.removeEventHandlers();\n this.host.querySelector(`#${this.sortableId}`)?.remove();\n\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = undefined;\n }\n }\n\n render() {\n return (\n <Host>\n <div\n class=\"sortable__live-region\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n aria-atomic=\"true\"\n role=\"log\"\n part=\"announcements\"\n >\n {this.ariaTextList.map((str) => (\n <div>{str}</div>\n ))}\n </div>\n <slot />\n </Host>\n );\n }\n}\n"],"mappings":"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"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"names":["stickerCss","_getScrollTop","ele","Document","window","pageYOffset","scrollTop","_getOffset","parent","parentEle","document","documentElement","getOffset","Sticker","this","isRtl","scrollPosCache","scrollPosThresholdCache","cacheOffset","pauseResizeWatcher","listenForScrollParent","positions","pauseHide","hasBootstrapped","setupParentResizeListener","parentSizeObserver","disconnect","undefined","ResizeObserver","entries","entry","height","width","contentRect","quietMode","w","h","quietModeIsOn","breakPointMin","isSticky","breakPointMax","isRootSticker","sticker","autoResize","style","host","scrollWidth","toWatch","scrollParent","observe","onStickToDisplayEvent","e","detail","stickToEle","type","_offset","offset","isStuck","moveTrigger","requestAnimationFrame","minHeight","stickToEleInitSize","scrollHeight","v","setTriggerPos","getBoundingClientRect","onStickEvent","async","position","incomingTriggerPos","getTriggerPos","stickerIndex","hideOnNewStickers","includes","triggerPos","top","multiStickerHide","stuckCounter","onScroll","y","handleScrollTo","handleScrollAway","hide","shouldStick","pause","updateTriggerOffset","trigger","stickerResizeListener","content","contentSizeObserver","quietModeChange","setOffset","setAttribute","_v","_h","setPos","pos","u","match","setTriggetPos","setProperty","positionChange","split","children","slottedContent","Array","from","forEach","child","appendChild","order","nanoStuck","emit","scrollHide","nanoUnstuck","attachScrollListeners","addEventListener","passive","capture","removeEventListener","handleParentEvents","_","oldParent","manageListenersOnParent","stickToEleChange","oldEle","stickToChange","stickTo","querySelector","visibilityDecisionHandler","handleHideChange","nanoHide","nanoShow","setupIO","io","root","IntersectionObserver","slice","addEvents","console","error","scrollingTo","currScroll","Math","abs","toInitial","parentNode","insertBefore","nextSibling","getScrollParent","regex","parents","_node","ps","concat","prop","getComputedStyle","getPropertyValue","overflow","scroll","test","docHeight","find","data","scrollAmt","parentBounding","rootBounds","bootstrapGurantor","createElement","classList","add","querySelectorAll","filter","findIndex","debounce","connectedCallback","dir","ownerDocument","setTimeout","disconnectedCallback","render","Host","sticky","siblings","index","stuck","class","ref","div"],"sources":["./src/components/sticker/sticker.scss?tag=nano-sticker&encapsulation=shadow","./src/components/sticker/sticker.tsx"],"sourcesContent":["@import '../../global/style/nano-theme/layers';\n\n:host {\n /**\n * @prop --stuck-left: The left position when your sticker is stuck. This can be useful to force your sticker to fill the viewport for example. Defaults to initial\n * @prop --stuck-right: The right position when your sticker is stuck. This can be useful to force your sticker to fill the viewport for example. Defaults to initial\n * @prop --stuck-z-index: The z-index order to display your sticker. Can be useful when displaying multiple stickers simultaneously. Defaults to #{$layer-index-menubar};\n * @prop --top-hide: This is used for the hide transform animation (e.g. when quiet-mode is on). Defaults to translateY(-110%);\n * @prop --bottom-hide: This is used for the hide transform animation (e.g. when quiet-mode is on). Defaults to translateY(110%);\n */\n\n --stuck-left: initial;\n --stuck-right: initial;\n --stuck-z-index: #{$layer-index-menubar};\n --top-hide: translateY(-110%);\n --bottom-hide: translateY(110%);\n\n display: block;\n max-inline-size: 100%;\n}\n\n:host([sticky]) {\n position: sticky;\n transition: 0.3s ease transform;\n will-change: min-block-size;\n}\n\n:host([sticky][stuck]) {\n inset-inline: var(--stuck-left) var(--stuck-right);\n z-index: var(--stuck-z-index) !important;\n}\n\n:host([sticky][hide][placed-top]) {\n transform: var(--top-hide);\n}\n\n:host([sticky][hide][placed-bottom]) {\n transform: var(--bottom-hide);\n}\n\n:host([sticky][index='1']) {\n z-index: calc(var(--stuck-z-index) + 1);\n}\n\n:host([sticky][index='2']) {\n z-index: calc(var(--stuck-z-index) + 2);\n}\n\n:host([sticky][index='3']) {\n z-index: calc(var(--stuck-z-index) + 3);\n}\n\n:host([sticky][index='4']) {\n z-index: calc(var(--stuck-z-index) + 4);\n}\n\n:host([sticky][index='5']) {\n z-index: calc(var(--stuck-z-index) + 5);\n}\n\n.sticker {\n display: inherit;\n max-inline-size: inherit;\n inline-size: 100%;\n\n &:not(.stuck) {\n inline-size: auto !important;\n }\n\n &.sticky {\n transition: 0.3s ease all;\n position: relative;\n\n :host([index='1']) & {\n z-index: calc(var(--stuck-z-index) + 1);\n }\n\n :host([index='2']) & {\n z-index: calc(var(--stuck-z-index) + 2);\n }\n\n :host([index='3']) & {\n z-index: calc(var(--stuck-z-index) + 3);\n }\n\n :host([index='4']) & {\n z-index: calc(var(--stuck-z-index) + 4);\n }\n\n :host([index='5']) & {\n z-index: calc(var(--stuck-z-index) + 5);\n }\n }\n\n &.stuck {\n position: fixed;\n inset-inline: var(--stuck-left) var(--stuck-right);\n z-index: var(--stuck-z-index);\n transform: translateY(0);\n\n :host([placed-top]) & {\n inset-block-start: 0;\n }\n\n :host([placed-bottom]) & {\n inset-block-end: 0;\n }\n\n &.hide {\n :host([placed-top]) & {\n transform: var(--top-hide);\n }\n\n :host([placed-bottom]) & {\n transform: var(--bottom-hide);\n }\n }\n }\n}\n\n.sticker-content {\n display: flex;\n flex-wrap: wrap;\n}\n","import {\n Component,\n ComponentInterface,\n h,\n Host,\n Prop,\n State,\n Watch,\n Element,\n Event,\n EventEmitter,\n Method,\n} from '@stencil/core';\nimport { getOffset } from '../../utils/dom';\nimport { debounce } from '../../utils/throttle';\n\nfunction _getScrollTop(ele: HTMLElement | Document) {\n return ele instanceof Document ? window.pageYOffset : ele.scrollTop;\n}\n\nfunction _getOffset(ele: HTMLElement, parent: HTMLElement | Document) {\n const parentEle =\n parent instanceof Document ? document.documentElement : parent;\n return getOffset(ele, parentEle);\n}\n\ntype Positions = 'top' | 'bottom' | 'start' | 'end';\n\n/**\n * The Sticker component is a toolbox for 'sticking' items to scrolling containers.\n *\n */\n@Component({\n tag: 'nano-sticker',\n styleUrl: 'sticker.scss',\n shadow: true,\n})\nexport class Sticker implements ComponentInterface {\n private isRtl: boolean = false;\n private io: IntersectionObserver;\n private contentSizeObserver: ResizeObserver;\n private parentSizeObserver: ResizeObserver;\n private sticker: HTMLDivElement;\n private content: HTMLDivElement;\n private scrollPosCache = 0;\n private scrollPosThresholdCache = 0;\n private cacheOffset: number | { v: number; h: number } = 0;\n private slottedContent: Element[];\n private pauseResizeWatcher = false;\n private listenForScrollParent = false;\n private stickToEleInitSize?: DOMRect;\n private positions: Positions[] = [];\n private pauseHide: boolean = false;\n private hasBootstrapped = false;\n\n @Element() host: HTMLNanoStickerElement;\n\n // Internal State\n\n @State() isStuck = false;\n @State() isRootSticker = true;\n @State() hide = false;\n @State() scrollHide = false;\n @State() multiStickerHide = false;\n @State() scrollingTo = false;\n @State() quietModeIsOn = false;\n @State() stuckCounter = 0;\n @State() stickerIndex = 0;\n @State() stickToEle?: HTMLNanoStickerElement;\n @State() triggerPos: { top: number; left: number };\n @State() trigger: HTMLDivElement;\n @State() _offset: number | { v: number; h: number } = 0;\n\n // Public API\n\n /** Only applicable to root stickers. When applied the sticker will grow or shrink to the scrollParent size */\n @Prop() autoResize = true;\n\n /** Manually enable / disabled sticky behaviour */\n @Prop({ mutable: true }) isSticky = true;\n\n /** Distance the item should be stuck from the sticky edge. */\n @Prop({ mutable: true }) offset: number | { v: number; h: number } = 0;\n\n /** The edge of the scroll-parent to stick to */\n @Prop() position: 'top' | 'bottom' = 'top';\n // other opts I'd like one day. 'start' | 'end' | 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end'\n\n /** When applied, the sticker will hide when the scroll-parent\n * is scrolling away from the sticker's stuck position and show when scrolling toward it.\n * By default this will apply when the parent is below either the h or w dimensions */\n @Prop() quietMode: 'on' | 'off' | { h: number; w: number } = {\n h: 600,\n w: 600,\n };\n\n /** When applied stickers will hide upon new stickers being stuck to the same position */\n @Prop() hideOnNewStickers = true;\n\n /** The max width of the item to implement sticky behaviour. */\n @Prop() breakPointMax: null | number = null;\n\n /** The min width of the item to implement sticky behaviour. */\n @Prop() breakPointMin: null | number = null;\n\n /** Define which scroll element to listen & stick to.\n * By default, it will find traverse the DOM to find the closest. */\n @Prop({ mutable: true }) scrollParent?: HTMLElement | Document;\n\n /** Upon being stuck, attach the sticker to another sticker element.\n * A JS query selector that returns a <nano-sticker> */\n @Prop() stickTo: string;\n\n // Broadcasted Events\n\n /** Emitted when a sticker is stuck */\n @Event() nanoStuck!: EventEmitter<{ sticker: HTMLNanoStickerElement }>;\n\n /** Emitted when a sticker is unstuck */\n @Event() nanoUnstuck!: EventEmitter<{ sticker: HTMLNanoStickerElement }>;\n\n /** Emitted when a sticker is hidden */\n @Event() nanoHide!: EventEmitter<{ sticker: HTMLNanoStickerElement }>;\n\n /** Emitted when a sticker is showing */\n @Event() nanoShow!: EventEmitter<{ sticker: HTMLNanoStickerElement }>;\n\n // Public methods\n\n /**\n * Method to return the visibility status of the sticker\n * @returns boolean\n */\n @Method()\n async isHiding() {\n return this.hide;\n }\n\n /**\n * Method to return the stuck status of the sticker\n * @returns boolean\n */\n @Method()\n async isSticking() {\n this.shouldStick();\n return this.isStuck;\n }\n\n /** @internal */\n @Method()\n async setTriggerPos(offset: number | { v: number; h: number }) {\n return (this._offset = offset);\n }\n\n /** @internal */\n @Method()\n async getTriggerPos() {\n return this.triggerPos;\n }\n\n /** @internal */\n @Method()\n async pauseHiding(pause: boolean) {\n return (this.pauseHide = pause);\n }\n\n // Watchers\n\n /** Keep a note of trigger position. Need this to track sticker order in the DOM */\n @Watch('trigger')\n @Watch('scrollParent')\n updateTriggerOffset() {\n if (!this.trigger || !this.scrollParent || !this.listenForScrollParent)\n return;\n this.triggerPos = _getOffset(this.trigger, this.scrollParent);\n }\n\n /** A root sticker is a fixed element Or this sticker is sticking to another.\n * We need a content resize watcher to make sure we maintain a correct placeholder size in the body */\n @Watch('position')\n stickerResizeListener() {\n if (!this.content || !window['ResizeObserver']) return;\n\n if (this.contentSizeObserver) {\n this.contentSizeObserver.disconnect();\n this.contentSizeObserver = undefined;\n }\n\n this.contentSizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (this.pauseResizeWatcher) return;\n\n if (entry.contentRect.height) {\n if (this.position === 'top')\n this.host.style.height = entry.contentRect.height + 'px';\n if (this.position === 'bottom')\n this.host.style.minHeight = entry.contentRect.height + 'px';\n }\n }\n });\n this.contentSizeObserver.observe(this.content);\n }\n\n @Watch('quietMode')\n quietModeChange() {\n if (this.quietMode === 'on')\n requestAnimationFrame(() => (this.quietModeIsOn = true));\n else if (this.quietMode === 'off')\n requestAnimationFrame(() => (this.quietModeIsOn = false));\n }\n\n /** offset is part of the public API but we also use it to manipulate trigger points */\n @Watch('offset')\n @Watch('_offset')\n setOffset() {\n this.trigger.setAttribute('style', '');\n let v: number, h: number, _v: number, _h: number;\n const sticker: HTMLElement =\n this.isRootSticker || this.stickToEle ? this.sticker : this.host;\n\n if (!sticker) return;\n\n if (typeof this.offset === 'object') ({ v, h } = this.offset);\n else v = h = this.offset;\n\n if (typeof this._offset === 'object') ({ v = _v, h = _h } = this._offset);\n else _v = _h = this._offset;\n\n const setPos = (pos: 'top' | 'bottom' | 'left' | 'right') => {\n const u = pos.match(/(top|bottom)/) ? v : h;\n setTriggetPos(pos);\n sticker.style[pos] = u + 'px';\n if (u)\n this.host.style.setProperty(\n '--hide-transform-amount',\n `(110% + ${u}px)`\n );\n else this.host.style.setProperty('--hide-transform-amount', null);\n };\n\n const setTriggetPos = (pos: 'top' | 'bottom' | 'left' | 'right') => {\n const u = pos.match(/(top|bottom)/) ? v + _v : h + _h;\n this.trigger.style[pos] = u * -1 + 'px';\n this.trigger.style.position = 'relative';\n this.trigger.style.height = '1px';\n };\n\n if (\n (this.positions.includes('start') && this.isRtl) ||\n (this.positions.includes('end') && !this.isRtl)\n )\n setPos('right');\n\n if (\n (this.positions.includes('end') && this.isRtl) ||\n (this.positions.includes('start') && !this.isRtl)\n )\n setPos('left');\n\n if (this.positions.includes('top')) setPos('top');\n if (this.positions.includes('bottom')) setPos('bottom');\n }\n\n @Watch('position')\n positionChange() {\n this.positions = this.position.split('-') as Positions[];\n this.setOffset();\n }\n\n /** If this sticker is attached to a 'master' sticker (stickToEle),\n * here we move the content of this sticker in and out accordingly */\n @Watch('isStuck')\n async stuckChange() {\n if (this.isStuck) {\n if (this.stickToEle) {\n const content = this.host.children;\n this.slottedContent = Array.from(content);\n\n this.slottedContent.forEach((child: HTMLElement) => {\n this.stickToEle.appendChild(child);\n child.style.order = this.stickerIndex + '';\n });\n\n this.nanoStuck.emit({ sticker: this.stickToEle });\n } else this.nanoStuck.emit({ sticker: this.host });\n } else {\n this.scrollHide = false;\n\n if (this.stickToEle) {\n this.slottedContent.forEach((child: HTMLElement) => {\n this.host.appendChild(child);\n child.style.order = '';\n });\n this.nanoUnstuck.emit({ sticker: this.stickToEle });\n } else this.nanoUnstuck.emit({ sticker: this.host });\n }\n }\n\n /** attach scroll listener. 'hides' stickers when scrolling away from trigger and 'shows' when scrolling toward */\n @Watch('quietModeIsOn')\n attachScrollListeners() {\n if (this.quietModeIsOn)\n this.scrollParent.addEventListener('scroll', this.onScroll, {\n passive: true,\n capture: false,\n });\n else if (this.scrollParent) {\n this.scrollParent.removeEventListener('scroll', this.onScroll);\n this.moveTrigger(true);\n }\n }\n\n /** Add / remove parent scrolling listeners. If there's stickToEle we need to remove them */\n @Watch('scrollParent')\n @Watch('stickToEle')\n handleParentEvents(_, oldParent: null | HTMLElement = null) {\n if (!this.listenForScrollParent) return;\n if (oldParent) this.manageListenersOnParent(false, oldParent);\n if (this.scrollParent) this.manageListenersOnParent(!this.stickToEle);\n }\n\n /** Add remove specific listeners if we're sticking to a sticker.\n * We need to adjust triggers according to the status of the 'master' */\n @Watch('stickToEle')\n stickToEleChange(_, oldEle: null | HTMLNanoStickerElement) {\n if (this.stickToEle) {\n this.stickToEle.addEventListener('nanoHide', this.onStickToDisplayEvent);\n this.stickToEle.addEventListener('nanoShow', this.onStickToDisplayEvent);\n this.stickToEle.addEventListener('nanoStuck', this.onStickToDisplayEvent);\n this.stickToEle.addEventListener(\n 'nanoUnstuck',\n this.onStickToDisplayEvent\n );\n }\n if (oldEle) {\n oldEle.removeEventListener('nanoHide', this.onStickToDisplayEvent);\n oldEle.removeEventListener('nanoShow', this.onStickToDisplayEvent);\n oldEle.removeEventListener('nanoStuck', this.onStickToDisplayEvent);\n oldEle.removeEventListener('nanoUnstuck', this.onStickToDisplayEvent);\n }\n }\n\n /** Find and set the stickToEle from the public, selector string */\n @Watch('stickTo')\n stickToChange() {\n if (this.stickTo)\n this.stickToEle = this.scrollParent.querySelector(this.stickTo);\n else this.stickToEle = undefined;\n }\n\n /** 2 potential criteria for hiding. Multi-stickers or quietmode. */\n @Watch('multiStickerHide')\n @Watch('scrollHide')\n visibilityDecisionHandler() {\n if (this.multiStickerHide || this.scrollHide) this.hide = true;\n else this.hide = false;\n }\n\n @Watch('hide')\n handleHideChange() {\n if (this.hide) this.nanoHide.emit({ sticker: this.host });\n else this.nanoShow.emit({ sticker: this.host });\n }\n\n @Watch('scrollParent')\n setupIO() {\n if (this.io) {\n this.io.disconnect();\n this.io = undefined;\n }\n if (!this.scrollParent || !this.hasBootstrapped || !this.trigger) return;\n\n this.isRootSticker = this.scrollParent instanceof Document;\n let root = this.scrollParent;\n if (this.scrollParent instanceof Document) root = null;\n\n this.io = new window.IntersectionObserver(\n (_) => {\n if (this.pauseResizeWatcher || !this.isSticky) return;\n this.shouldStick(_.slice(-1)[0]);\n },\n { root: root as HTMLElement }\n );\n\n this.io.observe(this.trigger);\n }\n\n // Private methods / handlers\n\n /** Assesses the public API quitemode and works out if it should be applied atm.\n * If 'smallscreen', or there is a breakpointmax / min it will add a resizeobserver to conditionally add behaviour */\n private setupParentResizeListener = () => {\n if (!window['ResizeObserver']) return;\n\n if (this.parentSizeObserver) {\n this.parentSizeObserver.disconnect();\n this.parentSizeObserver = undefined;\n }\n\n this.parentSizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n let height: number, width: number;\n if (entry.contentRect.height) height = entry.contentRect.height;\n if (entry.contentRect.width) width = entry.contentRect.width;\n\n if (typeof this.quietMode === 'object') {\n if (width < this.quietMode.w || height < this.quietMode.h)\n this.quietModeIsOn = true;\n else this.quietModeIsOn = false;\n }\n\n if (this.breakPointMin) {\n if (width > this.breakPointMin) this.isSticky = true;\n else this.isSticky = false;\n }\n\n if (this.breakPointMax) {\n if (width < this.breakPointMax) this.isSticky = true;\n else this.isSticky = false;\n }\n\n if (this.isRootSticker && this.sticker && this.autoResize)\n this.sticker.style.width = this.host.scrollWidth + 'px';\n }\n });\n\n const toWatch =\n this.scrollParent instanceof Document\n ? this.scrollParent.documentElement\n : this.scrollParent;\n if (toWatch) this.parentSizeObserver.observe(toWatch);\n };\n\n /** For stickTo stickers. We listen to the events from the 'master' sticker to ammend the hide/show trigger\n * Main diffs from rootstickers / non is height being on 'master' */\n private onStickToDisplayEvent = (\n e: CustomEvent<{ sticker: HTMLNanoStickerElement }>\n ) => {\n if (e.detail.sticker !== this.stickToEle) return;\n\n switch (e.type) {\n case 'nanoHide':\n this._offset = 0;\n this.cacheOffset = this.offset;\n this.offset = 0;\n /** trigger moves down, underneath sticker if the main sticker hides */\n if (!this.isStuck) this.moveTrigger(false);\n\n /** If it's an actual 'position: sticky' element, we need to give the sticker an appropriate height.\n * This minimises content jumping around as items are added */\n if (!this.isRootSticker && this.quietModeIsOn) {\n requestAnimationFrame(() => {\n this.stickToEle.style.minHeight =\n this.stickToEleInitSize.height +\n (this.host.scrollHeight +\n (typeof this.cacheOffset === 'object'\n ? this.cacheOffset.v\n : this.cacheOffset)) +\n 'px';\n this.stickToEle.setTriggerPos(this.stickToEleInitSize.height * -1);\n });\n }\n break;\n case 'nanoShow':\n this._offset = this.stickToEleInitSize.height;\n this.offset = this.cacheOffset;\n this.moveTrigger(true);\n\n /** reset master sticker size */\n if (!this.isRootSticker && this.quietModeIsOn) {\n requestAnimationFrame(() => {\n this.stickToEle.style.minHeight = '';\n this.stickToEle.setTriggerPos(0);\n });\n }\n break;\n case 'nanoStuck':\n this.stickToEleInitSize = this.stickToEle.getBoundingClientRect();\n this._offset = this.stickToEleInitSize.height;\n break;\n }\n };\n\n /** Add or removes event listeners / observers on scrolling parent\n * for when the scrolling parent changes, or, this sticker is sticking to another */\n private manageListenersOnParent(\n addEvents: boolean,\n ele?: HTMLElement | Document\n ) {\n const scrollParent = ele || this.scrollParent;\n\n if (!scrollParent) return;\n\n if (!addEvents) {\n try {\n if (this.quietModeIsOn)\n scrollParent.removeEventListener('scroll', this.onScroll);\n scrollParent.removeEventListener('nanoStuck', this.onStickEvent);\n scrollParent.removeEventListener('nanoUnstuck', this.onStickEvent);\n } catch (e) {\n console.error('Events haven`t been added');\n }\n } else {\n scrollParent.addEventListener('nanoStuck', this.onStickEvent);\n scrollParent.addEventListener('nanoUnstuck', this.onStickEvent);\n\n if (this.quietModeIsOn) this.attachScrollListeners();\n }\n this.setupParentResizeListener();\n }\n\n /** Handler applied to scrolling parent. When 'hideOnNewStickers' is true, hide this sticker on subsequent stuck stickers. */\n private onStickEvent = async (\n e: CustomEvent<{ sticker: HTMLNanoStickerElement }>\n ) => {\n const sticker = e.detail ? e.detail.sticker : null;\n if (!sticker || sticker.position !== this.position) return;\n\n const incomingTriggerPos = await sticker.getTriggerPos();\n\n if (\n e.type === 'nanoStuck' &&\n sticker !== this.host &&\n sticker.scrollParent === this.host.scrollParent\n ) {\n this.stickerIndex++;\n\n if (!this.hideOnNewStickers) return;\n\n if (\n (this.positions.includes('top') &&\n this.triggerPos.top < incomingTriggerPos.top) ||\n (this.positions.includes('bottom') &&\n this.triggerPos.top > incomingTriggerPos.top)\n ) {\n this.multiStickerHide = true;\n this.stuckCounter++;\n }\n }\n\n if (\n e.type === 'nanoUnstuck' &&\n sticker !== this.host &&\n sticker.scrollParent === this.host.scrollParent\n ) {\n this.stickerIndex--;\n\n if (!this.hideOnNewStickers) return;\n\n if (\n (this.positions.includes('top') &&\n this.triggerPos.top < incomingTriggerPos.top) ||\n (this.positions.includes('bottom') &&\n this.triggerPos.top > incomingTriggerPos.top)\n ) {\n this.stuckCounter--;\n if (this.stuckCounter < 1) this.multiStickerHide = false;\n }\n }\n };\n\n /** Scroll handler applied to scrolling parent. Only applied when quietmode is on.\n * 'hides' stickers when scrolling over 100px away from trigger and 'shows' when scrolling toward */\n private onScroll = () => {\n const y: number = _getScrollTop(this.scrollParent);\n\n // scrolling up\n if (y < this.scrollPosCache) {\n if (!this.positions.includes('bottom')) this.handleScrollTo();\n else this.handleScrollAway(y);\n }\n\n // scrolling down\n if (y > this.scrollPosCache) {\n if (!this.positions.includes('bottom')) this.handleScrollAway(y);\n else this.handleScrollTo();\n }\n this.scrollPosCache = y;\n };\n\n /** Watch for scroll direction. Only applies when quietmode is on.\n * We need to addjust the position of the trigger when the sticker is hidden */\n private handleScrollTo() {\n this.scrollPosThresholdCache = null;\n if (!this.scrollHide) return;\n\n if (this.scrollingTo !== true) {\n this._offset = this.cacheOffset || this._offset;\n }\n this.scrollingTo = true;\n this.scrollHide = false;\n }\n\n private handleScrollAway(currScroll: number) {\n if (this.scrollHide) return;\n\n if (!this.isStuck) return;\n\n if (this.scrollingTo !== false) {\n this.cacheOffset = this._offset;\n this._offset = 0;\n }\n this.scrollingTo = false;\n\n if (!this.scrollPosThresholdCache)\n this.scrollPosThresholdCache = currScroll;\n else if (\n !this.pauseHide &&\n Math.abs(currScroll - this.scrollPosThresholdCache) > 100\n )\n this.scrollHide = true;\n }\n\n private moveTrigger(toInitial?: boolean) {\n if (\n (this.positions.includes('bottom') && !toInitial) ||\n (!this.positions.includes('bottom') && toInitial)\n ) {\n this.host.parentNode.insertBefore(this.trigger, this.host);\n } else\n this.host.parentNode.insertBefore(this.trigger, this.host.nextSibling);\n }\n\n /**\n * Gets the 'closest' scrolling parent\n * @returns either an element with `overflow: scroll | auto` or the parent Document\n */\n private getScrollParent(): HTMLElement | Document {\n const regex = /(auto|scroll)/;\n const parents = (_node: Node, ps: Node[]) => {\n if (_node.parentNode === null) {\n return ps;\n }\n return parents(_node.parentNode, ps.concat([_node]));\n };\n const style = (_node, prop) =>\n getComputedStyle(_node, null).getPropertyValue(prop);\n const overflow = (_node) =>\n style(_node, 'overflow') +\n style(_node, 'overflow-y') +\n style(_node, 'overflow-x');\n const scroll = (_node) => regex.test(overflow(_node));\n const docHeight = document.documentElement.getBoundingClientRect().height;\n\n const scrollParent = (_node: HTMLElement) => {\n if (!(typeof _node === 'object')) return;\n\n const ps = parents(_node, []);\n return (\n ps.find(\n (ele) =>\n scroll(ele) && ele.getBoundingClientRect().height !== docHeight\n ) || document\n );\n };\n\n return scrollParent(this.host);\n }\n\n private shouldStick(data?: IntersectionObserverEntry) {\n let scrollAmt: number;\n\n if (this.positions.includes('top')) {\n if (!this.isRootSticker)\n scrollAmt = _getOffset(this.trigger, this.scrollParent).top;\n else scrollAmt = this.trigger.getBoundingClientRect().top;\n this.isStuck = scrollAmt < -1;\n } else if (this.positions.includes('bottom')) {\n scrollAmt = this.trigger.getBoundingClientRect().top;\n const parentBounding =\n data && data.rootBounds\n ? data.rootBounds\n : (this.scrollParent instanceof Document\n ? document.documentElement\n : this.scrollParent\n ).getBoundingClientRect();\n this.isStuck = scrollAmt > parentBounding.height + parentBounding.top;\n }\n }\n\n private bootstrapGurantor() {\n this.hasBootstrapped = true;\n\n this.scrollParent = this.scrollParent || this.getScrollParent();\n this.isRootSticker = this.scrollParent instanceof Document;\n\n this.trigger = this.trigger || document.createElement('div');\n this.trigger.classList.add('sticker-trigger');\n\n this.positionChange();\n this.moveTrigger(true);\n this.quietModeChange();\n\n this.listenForScrollParent = true;\n this.handleParentEvents(true);\n\n this.stickerIndex = Array.from(\n this.scrollParent.querySelectorAll('nano-sticker')\n )\n .filter(\n (sticker: HTMLNanoStickerElement) => sticker.position === this.position\n )\n .findIndex((sticker) => sticker === this.host);\n\n this.setOffset();\n this.stickerResizeListener();\n this.setupParentResizeListener();\n\n // bit of a hack ... add default 'order'. Required for 'stickTo' elements.\n this.slottedContent = Array.from(this.host.children);\n this.slottedContent.forEach((child: HTMLElement) => {\n child.style.order = this.stickerIndex + '';\n });\n\n this.updateTriggerOffset();\n this.stickToChange();\n this.setupIO();\n this.onStickToDisplayEvent = debounce(this.onStickToDisplayEvent, 50);\n }\n\n // Stencil metthods\n\n connectedCallback() {\n this.isRtl =\n this.host.dir === 'rtl' ||\n (this.host.ownerDocument as Document).dir === 'rtl';\n\n // this is all horrible.... shrug\n document.documentElement.addEventListener('nanoComponentsReady', () => {\n setTimeout((_) => this.bootstrapGurantor(), 200);\n });\n setTimeout((_) => {\n if (!this.hasBootstrapped) this.bootstrapGurantor();\n }, 1000);\n }\n\n disconnectedCallback() {\n if (this.io) {\n this.io.disconnect();\n this.io = undefined;\n }\n\n if (this.parentSizeObserver) {\n this.parentSizeObserver.disconnect();\n this.parentSizeObserver = undefined;\n }\n\n this.scrollParent = null;\n this.hasBootstrapped = false;\n }\n\n render() {\n return (\n <Host\n sticky={!this.isRootSticker && !this.stickToEle && this.isSticky}\n hide={this.hide && this.isStuck}\n siblings={this.stuckCounter}\n index={this.stickerIndex}\n stuck={this.isStuck && this.isSticky}\n placed-bottom={this.positions.includes('bottom')}\n placed-top={this.positions.includes('top')}\n placed-end={this.positions.includes('end')}\n placed-start={this.positions.includes('start')}\n >\n <div\n class={{\n sticker: true,\n sticky: this.isRootSticker && this.isSticky,\n stuck: this.isStuck && this.isRootSticker && this.isSticky,\n hide: this.isRootSticker && this.hide && this.isStuck,\n }}\n ref={(div) => (this.sticker = div)}\n >\n <div class=\"sticker-content\" ref={(div) => (this.content = div)}>\n <slot />\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":";;;wIAAA,MAAMA,EAAa,64DCgBnB,SAASC,EAAcC,GACrB,OAAOA,aAAeC,SAAWC,OAAOC,YAAcH,EAAII,SAC5D,CAEA,SAASC,EAAWL,EAAkBM,GACpC,MAAMC,EACJD,aAAkBL,SAAWO,SAASC,gBAAkBH,EAC1D,OAAOI,EAAUV,EAAKO,EACxB,C,MAaaI,EAAO,M,6KACVC,KAAAC,MAAiB,MAMjBD,KAAAE,eAAiB,EACjBF,KAAAG,wBAA0B,EAC1BH,KAAAI,YAAiD,EAEjDJ,KAAAK,mBAAqB,MACrBL,KAAAM,sBAAwB,MAExBN,KAAAO,UAAyB,GACzBP,KAAAQ,UAAqB,MACrBR,KAAAS,gBAAkB,MAkVlBT,KAAAU,0BAA4B,KAClC,IAAKpB,OAAO,kBAAmB,OAE/B,GAAIU,KAAKW,mBAAoB,CAC3BX,KAAKW,mBAAmBC,aACxBZ,KAAKW,mBAAqBE,S,CAG5Bb,KAAKW,mBAAqB,IAAIG,gBAAgBC,IAC5C,IAAK,MAAMC,KAASD,EAAS,CAC3B,IAAIE,EAAgBC,EACpB,GAAIF,EAAMG,YAAYF,OAAQA,EAASD,EAAMG,YAAYF,OACzD,GAAID,EAAMG,YAAYD,MAAOA,EAAQF,EAAMG,YAAYD,MAEvD,UAAWlB,KAAKoB,YAAc,SAAU,CACtC,GAAIF,EAAQlB,KAAKoB,UAAUC,GAAKJ,EAASjB,KAAKoB,UAAUE,EACtDtB,KAAKuB,cAAgB,UAClBvB,KAAKuB,cAAgB,K,CAG5B,GAAIvB,KAAKwB,cAAe,CACtB,GAAIN,EAAQlB,KAAKwB,cAAexB,KAAKyB,SAAW,UAC3CzB,KAAKyB,SAAW,K,CAGvB,GAAIzB,KAAK0B,cAAe,CACtB,GAAIR,EAAQlB,KAAK0B,cAAe1B,KAAKyB,SAAW,UAC3CzB,KAAKyB,SAAW,K,CAGvB,GAAIzB,KAAK2B,eAAiB3B,KAAK4B,SAAW5B,KAAK6B,WAC7C7B,KAAK4B,QAAQE,MAAMZ,MAAQlB,KAAK+B,KAAKC,YAAc,I,KAIzD,MAAMC,EACJjC,KAAKkC,wBAAwB7C,SACzBW,KAAKkC,aAAarC,gBAClBG,KAAKkC,aACX,GAAID,EAASjC,KAAKW,mBAAmBwB,QAAQF,EAAQ,EAK/CjC,KAAAoC,sBACNC,IAEA,GAAIA,EAAEC,OAAOV,UAAY5B,KAAKuC,WAAY,OAE1C,OAAQF,EAAEG,MACR,IAAK,WACHxC,KAAKyC,QAAU,EACfzC,KAAKI,YAAcJ,KAAK0C,OACxB1C,KAAK0C,OAAS,EAEd,IAAK1C,KAAK2C,QAAS3C,KAAK4C,YAAY,OAIpC,IAAK5C,KAAK2B,eAAiB3B,KAAKuB,cAAe,CAC7CsB,uBAAsB,KACpB7C,KAAKuC,WAAWT,MAAMgB,UACpB9C,KAAK+C,mBAAmB9B,QACvBjB,KAAK+B,KAAKiB,qBACDhD,KAAKI,cAAgB,SACzBJ,KAAKI,YAAY6C,EACjBjD,KAAKI,cACX,KACFJ,KAAKuC,WAAWW,cAAclD,KAAK+C,mBAAmB9B,QAAU,EAAE,G,CAGtE,MACF,IAAK,WACHjB,KAAKyC,QAAUzC,KAAK+C,mBAAmB9B,OACvCjB,KAAK0C,OAAS1C,KAAKI,YACnBJ,KAAK4C,YAAY,MAGjB,IAAK5C,KAAK2B,eAAiB3B,KAAKuB,cAAe,CAC7CsB,uBAAsB,KACpB7C,KAAKuC,WAAWT,MAAMgB,UAAY,GAClC9C,KAAKuC,WAAWW,cAAc,EAAE,G,CAGpC,MACF,IAAK,YACHlD,KAAK+C,mBAAqB/C,KAAKuC,WAAWY,wBAC1CnD,KAAKyC,QAAUzC,KAAK+C,mBAAmB9B,OACvC,M,EAiCEjB,KAAAoD,aAAeC,MACrBhB,IAEA,MAAMT,EAAUS,EAAEC,OAASD,EAAEC,OAAOV,QAAU,KAC9C,IAAKA,GAAWA,EAAQ0B,WAAatD,KAAKsD,SAAU,OAEpD,MAAMC,QAA2B3B,EAAQ4B,gBAEzC,GACEnB,EAAEG,OAAS,aACXZ,IAAY5B,KAAK+B,MACjBH,EAAQM,eAAiBlC,KAAK+B,KAAKG,aACnC,CACAlC,KAAKyD,eAEL,IAAKzD,KAAK0D,kBAAmB,OAE7B,GACG1D,KAAKO,UAAUoD,SAAS,QACvB3D,KAAK4D,WAAWC,IAAMN,EAAmBM,KAC1C7D,KAAKO,UAAUoD,SAAS,WACvB3D,KAAK4D,WAAWC,IAAMN,EAAmBM,IAC3C,CACA7D,KAAK8D,iBAAmB,KACxB9D,KAAK+D,c,EAIT,GACE1B,EAAEG,OAAS,eACXZ,IAAY5B,KAAK+B,MACjBH,EAAQM,eAAiBlC,KAAK+B,KAAKG,aACnC,CACAlC,KAAKyD,eAEL,IAAKzD,KAAK0D,kBAAmB,OAE7B,GACG1D,KAAKO,UAAUoD,SAAS,QACvB3D,KAAK4D,WAAWC,IAAMN,EAAmBM,KAC1C7D,KAAKO,UAAUoD,SAAS,WACvB3D,KAAK4D,WAAWC,IAAMN,EAAmBM,IAC3C,CACA7D,KAAK+D,eACL,GAAI/D,KAAK+D,aAAe,EAAG/D,KAAK8D,iBAAmB,K,IAOjD9D,KAAAgE,SAAW,KACjB,MAAMC,EAAY9E,EAAca,KAAKkC,cAGrC,GAAI+B,EAAIjE,KAAKE,eAAgB,CAC3B,IAAKF,KAAKO,UAAUoD,SAAS,UAAW3D,KAAKkE,sBACxClE,KAAKmE,iBAAiBF,E,CAI7B,GAAIA,EAAIjE,KAAKE,eAAgB,CAC3B,IAAKF,KAAKO,UAAUoD,SAAS,UAAW3D,KAAKmE,iBAAiBF,QACzDjE,KAAKkE,gB,CAEZlE,KAAKE,eAAiB+D,CAAC,E,aAtgBN,M,mBACM,K,UACT,M,gBACM,M,sBACM,M,iBACL,M,mBACE,M,kBACD,E,kBACA,E,wFAI8B,E,gBAKjC,K,cAGe,K,YAGiC,E,cAGhC,M,eAMwB,CAC3D3C,EAAG,IACHD,EAAG,K,uBAIuB,K,mBAGW,K,mBAGA,K,mDA+BvCgC,iBACE,OAAOrD,KAAKoE,I,CAQdf,mBACErD,KAAKqE,cACL,OAAOrE,KAAK2C,O,CAKdU,oBAAoBX,GAClB,OAAQ1C,KAAKyC,QAAUC,C,CAKzBW,sBACE,OAAOrD,KAAK4D,U,CAKdP,kBAAkBiB,GAChB,OAAQtE,KAAKQ,UAAY8D,C,CAQ3BC,sBACE,IAAKvE,KAAKwE,UAAYxE,KAAKkC,eAAiBlC,KAAKM,sBAC/C,OACFN,KAAK4D,WAAanE,EAAWO,KAAKwE,QAASxE,KAAKkC,a,CAMlDuC,wBACE,IAAKzE,KAAK0E,UAAYpF,OAAO,kBAAmB,OAEhD,GAAIU,KAAK2E,oBAAqB,CAC5B3E,KAAK2E,oBAAoB/D,aACzBZ,KAAK2E,oBAAsB9D,S,CAG7Bb,KAAK2E,oBAAsB,IAAI7D,gBAAgBC,IAC7C,IAAK,MAAMC,KAASD,EAAS,CAC3B,GAAIf,KAAKK,mBAAoB,OAE7B,GAAIW,EAAMG,YAAYF,OAAQ,CAC5B,GAAIjB,KAAKsD,WAAa,MACpBtD,KAAK+B,KAAKD,MAAMb,OAASD,EAAMG,YAAYF,OAAS,KACtD,GAAIjB,KAAKsD,WAAa,SACpBtD,KAAK+B,KAAKD,MAAMgB,UAAY9B,EAAMG,YAAYF,OAAS,I,MAI/DjB,KAAK2E,oBAAoBxC,QAAQnC,KAAK0E,Q,CAIxCE,kBACE,GAAI5E,KAAKoB,YAAc,KACrByB,uBAAsB,IAAO7C,KAAKuB,cAAgB,YAC/C,GAAIvB,KAAKoB,YAAc,MAC1ByB,uBAAsB,IAAO7C,KAAKuB,cAAgB,O,CAMtDsD,YACE7E,KAAKwE,QAAQM,aAAa,QAAS,IACnC,IAAI7B,EAAW3B,EAAWyD,EAAYC,EACtC,MAAMpD,EACJ5B,KAAK2B,eAAiB3B,KAAKuC,WAAavC,KAAK4B,QAAU5B,KAAK+B,KAE9D,IAAKH,EAAS,OAEd,UAAW5B,KAAK0C,SAAW,WAAaO,IAAG3B,KAAMtB,KAAK0C,aACjDO,EAAI3B,EAAItB,KAAK0C,OAElB,UAAW1C,KAAKyC,UAAY,WAAaQ,IAAI8B,EAAIzD,IAAI0D,GAAOhF,KAAKyC,cAC5DsC,EAAKC,EAAKhF,KAAKyC,QAEpB,MAAMwC,EAAUC,IACd,MAAMC,EAAID,EAAIE,MAAM,gBAAkBnC,EAAI3B,EAC1C+D,EAAcH,GACdtD,EAAQE,MAAMoD,GAAOC,EAAI,KACzB,GAAIA,EACFnF,KAAK+B,KAAKD,MAAMwD,YACd,0BACA,WAAWH,aAEVnF,KAAK+B,KAAKD,MAAMwD,YAAY,0BAA2B,KAAK,EAGnE,MAAMD,EAAiBH,IACrB,MAAMC,EAAID,EAAIE,MAAM,gBAAkBnC,EAAI8B,EAAKzD,EAAI0D,EACnDhF,KAAKwE,QAAQ1C,MAAMoD,GAAOC,GAAK,EAAI,KACnCnF,KAAKwE,QAAQ1C,MAAMwB,SAAW,WAC9BtD,KAAKwE,QAAQ1C,MAAMb,OAAS,KAAK,EAGnC,GACGjB,KAAKO,UAAUoD,SAAS,UAAY3D,KAAKC,OACzCD,KAAKO,UAAUoD,SAAS,SAAW3D,KAAKC,MAEzCgF,EAAO,SAET,GACGjF,KAAKO,UAAUoD,SAAS,QAAU3D,KAAKC,OACvCD,KAAKO,UAAUoD,SAAS,WAAa3D,KAAKC,MAE3CgF,EAAO,QAET,GAAIjF,KAAKO,UAAUoD,SAAS,OAAQsB,EAAO,OAC3C,GAAIjF,KAAKO,UAAUoD,SAAS,UAAWsB,EAAO,S,CAIhDM,iBACEvF,KAAKO,UAAYP,KAAKsD,SAASkC,MAAM,KACrCxF,KAAK6E,W,CAMPxB,oBACE,GAAIrD,KAAK2C,QAAS,CAChB,GAAI3C,KAAKuC,WAAY,CACnB,MAAMmC,EAAU1E,KAAK+B,KAAK0D,SAC1BzF,KAAK0F,eAAiBC,MAAMC,KAAKlB,GAEjC1E,KAAK0F,eAAeG,SAASC,IAC3B9F,KAAKuC,WAAWwD,YAAYD,GAC5BA,EAAMhE,MAAMkE,MAAQhG,KAAKyD,aAAe,EAAE,IAG5CzD,KAAKiG,UAAUC,KAAK,CAAEtE,QAAS5B,KAAKuC,Y,MAC/BvC,KAAKiG,UAAUC,KAAK,CAAEtE,QAAS5B,KAAK+B,M,KACtC,CACL/B,KAAKmG,WAAa,MAElB,GAAInG,KAAKuC,WAAY,CACnBvC,KAAK0F,eAAeG,SAASC,IAC3B9F,KAAK+B,KAAKgE,YAAYD,GACtBA,EAAMhE,MAAMkE,MAAQ,EAAE,IAExBhG,KAAKoG,YAAYF,KAAK,CAAEtE,QAAS5B,KAAKuC,Y,MACjCvC,KAAKoG,YAAYF,KAAK,CAAEtE,QAAS5B,KAAK+B,M,EAMjDsE,wBACE,GAAIrG,KAAKuB,cACPvB,KAAKkC,aAAaoE,iBAAiB,SAAUtG,KAAKgE,SAAU,CAC1DuC,QAAS,KACTC,QAAS,aAER,GAAIxG,KAAKkC,aAAc,CAC1BlC,KAAKkC,aAAauE,oBAAoB,SAAUzG,KAAKgE,UACrDhE,KAAK4C,YAAY,K,EAOrB8D,mBAAmBC,EAAGC,EAAgC,MACpD,IAAK5G,KAAKM,sBAAuB,OACjC,GAAIsG,EAAW5G,KAAK6G,wBAAwB,MAAOD,GACnD,GAAI5G,KAAKkC,aAAclC,KAAK6G,yBAAyB7G,KAAKuC,W,CAM5DuE,iBAAiBH,EAAGI,GAClB,GAAI/G,KAAKuC,WAAY,CACnBvC,KAAKuC,WAAW+D,iBAAiB,WAAYtG,KAAKoC,uBAClDpC,KAAKuC,WAAW+D,iBAAiB,WAAYtG,KAAKoC,uBAClDpC,KAAKuC,WAAW+D,iBAAiB,YAAatG,KAAKoC,uBACnDpC,KAAKuC,WAAW+D,iBACd,cACAtG,KAAKoC,sB,CAGT,GAAI2E,EAAQ,CACVA,EAAON,oBAAoB,WAAYzG,KAAKoC,uBAC5C2E,EAAON,oBAAoB,WAAYzG,KAAKoC,uBAC5C2E,EAAON,oBAAoB,YAAazG,KAAKoC,uBAC7C2E,EAAON,oBAAoB,cAAezG,KAAKoC,sB,EAMnD4E,gBACE,GAAIhH,KAAKiH,QACPjH,KAAKuC,WAAavC,KAAKkC,aAAagF,cAAclH,KAAKiH,cACpDjH,KAAKuC,WAAa1B,S,CAMzBsG,4BACE,GAAInH,KAAK8D,kBAAoB9D,KAAKmG,WAAYnG,KAAKoE,KAAO,UACrDpE,KAAKoE,KAAO,K,CAInBgD,mBACE,GAAIpH,KAAKoE,KAAMpE,KAAKqH,SAASnB,KAAK,CAAEtE,QAAS5B,KAAK+B,YAC7C/B,KAAKsH,SAASpB,KAAK,CAAEtE,QAAS5B,KAAK+B,M,CAI1CwF,UACE,GAAIvH,KAAKwH,GAAI,CACXxH,KAAKwH,GAAG5G,aACRZ,KAAKwH,GAAK3G,S,CAEZ,IAAKb,KAAKkC,eAAiBlC,KAAKS,kBAAoBT,KAAKwE,QAAS,OAElExE,KAAK2B,cAAgB3B,KAAKkC,wBAAwB7C,SAClD,IAAIoI,EAAOzH,KAAKkC,aAChB,GAAIlC,KAAKkC,wBAAwB7C,SAAUoI,EAAO,KAElDzH,KAAKwH,GAAK,IAAIlI,OAAOoI,sBAClBf,IACC,GAAI3G,KAAKK,qBAAuBL,KAAKyB,SAAU,OAC/CzB,KAAKqE,YAAYsC,EAAEgB,OAAO,GAAG,GAAG,GAElC,CAAEF,KAAMA,IAGVzH,KAAKwH,GAAGrF,QAAQnC,KAAKwE,Q,CAqGfqC,wBACNe,EACAxI,GAEA,MAAM8C,EAAe9C,GAAOY,KAAKkC,aAEjC,IAAKA,EAAc,OAEnB,IAAK0F,EAAW,CACd,IACE,GAAI5H,KAAKuB,cACPW,EAAauE,oBAAoB,SAAUzG,KAAKgE,UAClD9B,EAAauE,oBAAoB,YAAazG,KAAKoD,cACnDlB,EAAauE,oBAAoB,cAAezG,KAAKoD,a,CACrD,MAAOf,GACPwF,QAAQC,MAAM,4B,MAEX,CACL5F,EAAaoE,iBAAiB,YAAatG,KAAKoD,cAChDlB,EAAaoE,iBAAiB,cAAetG,KAAKoD,cAElD,GAAIpD,KAAKuB,cAAevB,KAAKqG,uB,CAE/BrG,KAAKU,2B,CA0ECwD,iBACNlE,KAAKG,wBAA0B,KAC/B,IAAKH,KAAKmG,WAAY,OAEtB,GAAInG,KAAK+H,cAAgB,KAAM,CAC7B/H,KAAKyC,QAAUzC,KAAKI,aAAeJ,KAAKyC,O,CAE1CzC,KAAK+H,YAAc,KACnB/H,KAAKmG,WAAa,K,CAGZhC,iBAAiB6D,GACvB,GAAIhI,KAAKmG,WAAY,OAErB,IAAKnG,KAAK2C,QAAS,OAEnB,GAAI3C,KAAK+H,cAAgB,MAAO,CAC9B/H,KAAKI,YAAcJ,KAAKyC,QACxBzC,KAAKyC,QAAU,C,CAEjBzC,KAAK+H,YAAc,MAEnB,IAAK/H,KAAKG,wBACRH,KAAKG,wBAA0B6H,OAC5B,IACFhI,KAAKQ,WACNyH,KAAKC,IAAIF,EAAahI,KAAKG,yBAA2B,IAEtDH,KAAKmG,WAAa,I,CAGdvD,YAAYuF,GAClB,GACGnI,KAAKO,UAAUoD,SAAS,YAAcwE,IACrCnI,KAAKO,UAAUoD,SAAS,WAAawE,EACvC,CACAnI,KAAK+B,KAAKqG,WAAWC,aAAarI,KAAKwE,QAASxE,KAAK+B,K,MAErD/B,KAAK+B,KAAKqG,WAAWC,aAAarI,KAAKwE,QAASxE,KAAK+B,KAAKuG,Y,CAOtDC,kBACN,MAAMC,EAAQ,gBACd,MAAMC,EAAU,CAACC,EAAaC,KAC5B,GAAID,EAAMN,aAAe,KAAM,CAC7B,OAAOO,C,CAET,OAAOF,EAAQC,EAAMN,WAAYO,EAAGC,OAAO,CAACF,IAAQ,EAEtD,MAAM5G,EAAQ,CAAC4G,EAAOG,IACpBC,iBAAiBJ,EAAO,MAAMK,iBAAiBF,GACjD,MAAMG,EAAYN,GAChB5G,EAAM4G,EAAO,YACb5G,EAAM4G,EAAO,cACb5G,EAAM4G,EAAO,cACf,MAAMO,EAAUP,GAAUF,EAAMU,KAAKF,EAASN,IAC9C,MAAMS,EAAYvJ,SAASC,gBAAgBsD,wBAAwBlC,OAEnE,MAAMiB,EAAgBwG,IACpB,YAAaA,IAAU,UAAW,OAElC,MAAMC,EAAKF,EAAQC,EAAO,IAC1B,OACEC,EAAGS,MACAhK,GACC6J,EAAO7J,IAAQA,EAAI+D,wBAAwBlC,SAAWkI,KACrDvJ,QAAQ,EAIjB,OAAOsC,EAAalC,KAAK+B,K,CAGnBsC,YAAYgF,GAClB,IAAIC,EAEJ,GAAItJ,KAAKO,UAAUoD,SAAS,OAAQ,CAClC,IAAK3D,KAAK2B,cACR2H,EAAY7J,EAAWO,KAAKwE,QAASxE,KAAKkC,cAAc2B,SACrDyF,EAAYtJ,KAAKwE,QAAQrB,wBAAwBU,IACtD7D,KAAK2C,QAAU2G,GAAa,C,MACvB,GAAItJ,KAAKO,UAAUoD,SAAS,UAAW,CAC5C2F,EAAYtJ,KAAKwE,QAAQrB,wBAAwBU,IACjD,MAAM0F,EACJF,GAAQA,EAAKG,WACTH,EAAKG,YACJxJ,KAAKkC,wBAAwB7C,SAC1BO,SAASC,gBACTG,KAAKkC,cACPiB,wBACRnD,KAAK2C,QAAU2G,EAAYC,EAAetI,OAASsI,EAAe1F,G,EAI9D4F,oBACNzJ,KAAKS,gBAAkB,KAEvBT,KAAKkC,aAAelC,KAAKkC,cAAgBlC,KAAKuI,kBAC9CvI,KAAK2B,cAAgB3B,KAAKkC,wBAAwB7C,SAElDW,KAAKwE,QAAUxE,KAAKwE,SAAW5E,SAAS8J,cAAc,OACtD1J,KAAKwE,QAAQmF,UAAUC,IAAI,mBAE3B5J,KAAKuF,iBACLvF,KAAK4C,YAAY,MACjB5C,KAAK4E,kBAEL5E,KAAKM,sBAAwB,KAC7BN,KAAK0G,mBAAmB,MAExB1G,KAAKyD,aAAekC,MAAMC,KACxB5F,KAAKkC,aAAa2H,iBAAiB,iBAElCC,QACElI,GAAoCA,EAAQ0B,WAAatD,KAAKsD,WAEhEyG,WAAWnI,GAAYA,IAAY5B,KAAK+B,OAE3C/B,KAAK6E,YACL7E,KAAKyE,wBACLzE,KAAKU,4BAGLV,KAAK0F,eAAiBC,MAAMC,KAAK5F,KAAK+B,KAAK0D,UAC3CzF,KAAK0F,eAAeG,SAASC,IAC3BA,EAAMhE,MAAMkE,MAAQhG,KAAKyD,aAAe,EAAE,IAG5CzD,KAAKuE,sBACLvE,KAAKgH,gBACLhH,KAAKuH,UACLvH,KAAKoC,sBAAwB4H,EAAShK,KAAKoC,sBAAuB,G,CAKpE6H,oBACEjK,KAAKC,MACHD,KAAK+B,KAAKmI,MAAQ,OACjBlK,KAAK+B,KAAKoI,cAA2BD,MAAQ,MAGhDtK,SAASC,gBAAgByG,iBAAiB,uBAAuB,KAC/D8D,YAAYzD,GAAM3G,KAAKyJ,qBAAqB,IAAI,IAElDW,YAAYzD,IACV,IAAK3G,KAAKS,gBAAiBT,KAAKyJ,mBAAmB,GAClD,I,CAGLY,uBACE,GAAIrK,KAAKwH,GAAI,CACXxH,KAAKwH,GAAG5G,aACRZ,KAAKwH,GAAK3G,S,CAGZ,GAAIb,KAAKW,mBAAoB,CAC3BX,KAAKW,mBAAmBC,aACxBZ,KAAKW,mBAAqBE,S,CAG5Bb,KAAKkC,aAAe,KACpBlC,KAAKS,gBAAkB,K,CAGzB6J,SACE,OACEhJ,EAACiJ,EAAI,CACHC,QAASxK,KAAK2B,gBAAkB3B,KAAKuC,YAAcvC,KAAKyB,SACxD2C,KAAMpE,KAAKoE,MAAQpE,KAAK2C,QACxB8H,SAAUzK,KAAK+D,aACf2G,MAAO1K,KAAKyD,aACZkH,MAAO3K,KAAK2C,SAAW3C,KAAKyB,SAAQ,gBACrBzB,KAAKO,UAAUoD,SAAS,UAAS,aACpC3D,KAAKO,UAAUoD,SAAS,OAAM,aAC9B3D,KAAKO,UAAUoD,SAAS,OAAM,eAC5B3D,KAAKO,UAAUoD,SAAS,UAEtCrC,EAAA,OACEsJ,MAAO,CACLhJ,QAAS,KACT4I,OAAQxK,KAAK2B,eAAiB3B,KAAKyB,SACnCkJ,MAAO3K,KAAK2C,SAAW3C,KAAK2B,eAAiB3B,KAAKyB,SAClD2C,KAAMpE,KAAK2B,eAAiB3B,KAAKoE,MAAQpE,KAAK2C,SAEhDkI,IAAMC,GAAS9K,KAAK4B,QAAUkJ,GAE9BxJ,EAAA,OAAKsJ,MAAM,kBAAkBC,IAAMC,GAAS9K,KAAK0E,QAAUoG,GACzDxJ,EAAA,e"}
|
@@ -1,5 +0,0 @@
|
|
1
|
-
/*!
|
2
|
-
* Web Components for Nanopore digital Web Apps
|
3
|
-
*/
|
4
|
-
const t=(t,n)=>{const i=t._original||t;return{_original:t,emit:e(i.emit.bind(i),n)}};const e=(t,e=0)=>{let n;return(...i)=>{clearTimeout(n);n=setTimeout(t,e,...i)}};function n(t,e){let n=false;let i;function r(...s){if(n){i=this;return}n=true;t.apply(this,s);setTimeout((()=>{n=false;if(s){r.apply(i,s);s=i=null}}),e)}return r}export{t as a,e as d,n as t};
|
5
|
-
//# sourceMappingURL=p-9746b0a5.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"names":["debounceEvent","event","wait","original","_original","emit","debounce","bind","callback","timer","args","clearTimeout","setTimeout","throttle","delay","isThrottled","context","wrapper","this","apply"],"sources":["./src/utils/throttle.ts"],"sourcesContent":["import { EventEmitter } from '@stencil/core';\n\nexport const deferEvent = (event: EventEmitter): EventEmitter => {\n return debounceEvent(event, 0);\n};\n\nexport const debounceEvent = (\n event: EventEmitter,\n wait: number\n): EventEmitter => {\n const original = (event as any)._original || event;\n return {\n _original: event,\n emit: debounce(original.emit.bind(original), wait),\n } as EventEmitter;\n};\n\n/**\n * debounce ensures that one function call is made for an event that fires multiple times.\n * @param callback to perform after waiting\n * @param wait how to long to wait before calling the function\n * @returns a debounced function to call as often as required\n */\nexport const debounce = (callback: (...args: any[]) => void, wait = 0) => {\n let timer: any;\n return (...args: any[]): any => {\n clearTimeout(timer);\n timer = setTimeout(callback, wait, ...args);\n };\n};\n\n/**\n * throttle delays executing a function - reducing the function calls of an event that fires multiple times.\n * @param callback to perform after a delay\n * @param delay how long to delay before calling the function\n * @returns a throttled function to call as often as required\n */\nexport function throttle(callback: (...args: [any]) => void, delay: number) {\n let isThrottled = false;\n let context: any;\n\n function wrapper(...args) {\n if (isThrottled) {\n context = this;\n return;\n }\n\n isThrottled = true;\n callback.apply(this, args);\n\n setTimeout(() => {\n isThrottled = false;\n if (args) {\n wrapper.apply(context, args);\n args = context = null;\n }\n }, delay);\n }\n\n return wrapper;\n}\n"],"mappings":";;;MAMaA,EAAgB,CAC3BC,EACAC,KAEA,MAAMC,EAAYF,EAAcG,WAAaH,EAC7C,MAAO,CACLG,UAAWH,EACXI,KAAMC,EAASH,EAASE,KAAKE,KAAKJ,GAAWD,GAC9B,E,MASNI,EAAW,CAACE,EAAoCN,EAAO,KAClE,IAAIO,EACJ,MAAO,IAAIC,KACTC,aAAaF,GACbA,EAAQG,WAAWJ,EAAUN,KAASQ,EAAK,CAC5C,E,SASaG,EAASL,EAAoCM,GAC3D,IAAIC,EAAc,MAClB,IAAIC,EAEJ,SAASC,KAAWP,GAClB,GAAIK,EAAa,CACfC,EAAUE,KACV,M,CAGFH,EAAc,KACdP,EAASW,MAAMD,KAAMR,GAErBE,YAAW,KACTG,EAAc,MACd,GAAIL,EAAM,CACRO,EAAQE,MAAMH,EAASN,GACvBA,EAAOM,EAAU,I,IAElBF,E,CAGL,OAAOG,CACT,Q"}
|