2018-05-02 00:05:36 +00:00
|
|
|
<div class="virtual-list-header {shown ? 'shown' : ''} {fadedIn ? 'faded-in' : ''}"
|
2018-02-12 03:15:21 +00:00
|
|
|
ref:node >
|
2018-05-02 00:05:36 +00:00
|
|
|
<svelte:component this={component} {virtualProps} />
|
2018-02-12 03:15:21 +00:00
|
|
|
</div>
|
|
|
|
<style>
|
|
|
|
.virtual-list-header {
|
|
|
|
position: absolute;
|
|
|
|
top: 0;
|
|
|
|
width: 100%;
|
|
|
|
opacity: 0;
|
|
|
|
z-index: 10;
|
2018-02-12 06:50:20 +00:00
|
|
|
transition: none;
|
2018-04-13 04:17:57 +00:00
|
|
|
display: none;
|
2018-02-12 03:15:21 +00:00
|
|
|
}
|
|
|
|
.virtual-list-header.shown {
|
2018-04-13 04:17:57 +00:00
|
|
|
display: block;
|
2018-02-12 06:50:20 +00:00
|
|
|
transition: opacity 0.333s linear;
|
2018-02-12 03:15:21 +00:00
|
|
|
}
|
2018-04-13 04:17:57 +00:00
|
|
|
.virtual-list-header.faded-in {
|
|
|
|
opacity: 1;
|
|
|
|
}
|
2018-02-12 03:15:21 +00:00
|
|
|
</style>
|
|
|
|
<script>
|
|
|
|
import { virtualListStore } from './virtualListStore'
|
2018-04-13 04:17:57 +00:00
|
|
|
import { doubleRAF } from '../../_utils/doubleRAF'
|
2018-04-27 16:21:30 +00:00
|
|
|
import { mark, stop } from '../../_utils/marks'
|
2018-04-30 15:29:04 +00:00
|
|
|
import { observe } from 'svelte-extras'
|
2018-02-12 03:15:21 +00:00
|
|
|
|
|
|
|
export default {
|
2018-04-20 04:38:01 +00:00
|
|
|
oncreate () {
|
2018-04-13 04:17:57 +00:00
|
|
|
this.observe('shown', shown => {
|
|
|
|
if (shown) {
|
|
|
|
this.doCalculateHeight()
|
2018-08-30 04:42:57 +00:00
|
|
|
doubleRAF(() => this.set({ fadedIn: true })) // animate in
|
2018-04-13 04:17:57 +00:00
|
|
|
} else {
|
2018-08-30 04:42:57 +00:00
|
|
|
this.set({ fadedIn: false })
|
2018-04-13 04:17:57 +00:00
|
|
|
}
|
2018-08-30 04:42:57 +00:00
|
|
|
}, { init: false })
|
2018-02-12 03:15:21 +00:00
|
|
|
},
|
2018-04-30 05:13:41 +00:00
|
|
|
data: () => ({
|
|
|
|
fadedIn: false
|
|
|
|
}),
|
2018-02-12 03:15:21 +00:00
|
|
|
store: () => virtualListStore,
|
2018-04-13 04:17:57 +00:00
|
|
|
methods: {
|
2018-04-30 15:29:04 +00:00
|
|
|
observe,
|
2018-04-20 04:38:01 +00:00
|
|
|
doCalculateHeight () {
|
2018-04-19 16:37:05 +00:00
|
|
|
let { heightCalculated } = this.get()
|
|
|
|
if (heightCalculated) { // only need to calculate once, it never changes
|
2018-04-13 04:17:57 +00:00
|
|
|
return
|
|
|
|
}
|
2018-08-30 04:42:57 +00:00
|
|
|
this.set({ heightCalculated: true })
|
2018-04-27 16:21:30 +00:00
|
|
|
requestAnimationFrame(() => {
|
|
|
|
mark('VirtualListHeader gBCR')
|
|
|
|
let rect = this.refs.node.getBoundingClientRect()
|
|
|
|
stop('VirtualListHeader gBCR')
|
2018-08-30 04:42:57 +00:00
|
|
|
this.store.setForRealm({ headerHeight: rect.height })
|
2018-04-13 04:17:57 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
2018-02-12 03:15:21 +00:00
|
|
|
}
|
|
|
|
</script>
|