| 
									
										
										
										
											2018-01-17 04:34:09 +00:00
										 |  |  | <div class="virtual-list-item {{shown ? 'shown' : ''}}" | 
					
						
							| 
									
										
										
										
											2018-02-18 23:28:42 +00:00
										 |  |  |      aria-hidden="{{!shown}}" | 
					
						
							| 
									
										
										
										
											2018-01-17 04:34:09 +00:00
										 |  |  |      virtual-list-key="{{key}}" | 
					
						
							| 
									
										
										
										
											2018-01-15 18:54:02 +00:00
										 |  |  |      ref:node | 
					
						
							| 
									
										
										
										
											2018-01-21 18:32:18 +00:00
										 |  |  |      style="transform: translateY({{offset}}px);" > | 
					
						
							| 
									
										
										
										
											2018-01-24 02:15:14 +00:00
										 |  |  |   <:Component {component} | 
					
						
							|  |  |  |               virtualProps="{{props}}" | 
					
						
							|  |  |  |               virtualIndex="{{index}}" | 
					
						
							| 
									
										
										
										
											2018-02-04 18:05:01 +00:00
										 |  |  |               virtualLength="{{$length}}" | 
					
						
							| 
									
										
										
										
											2018-01-21 18:32:18 +00:00
										 |  |  |               on:recalculateHeight="doRecalculateHeight()"/> | 
					
						
							| 
									
										
										
										
											2018-01-15 18:54:02 +00:00
										 |  |  | </div> | 
					
						
							|  |  |  | <style> | 
					
						
							|  |  |  |   .virtual-list-item { | 
					
						
							|  |  |  |     position: absolute; | 
					
						
							|  |  |  |     top: 0; | 
					
						
							| 
									
										
										
										
											2018-01-17 04:34:09 +00:00
										 |  |  |     opacity: 0; | 
					
						
							|  |  |  |     pointer-events: none; | 
					
						
							| 
									
										
										
										
											2018-02-12 00:24:14 +00:00
										 |  |  |     transition: opacity 0.333s linear; | 
					
						
							| 
									
										
										
										
											2018-01-17 04:34:09 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-01-20 20:35:38 +00:00
										 |  |  |   .virtual-list-item.shown { | 
					
						
							| 
									
										
										
										
											2018-01-17 04:34:09 +00:00
										 |  |  |     opacity: 1; | 
					
						
							|  |  |  |     pointer-events: auto; | 
					
						
							| 
									
										
										
										
											2018-01-15 18:54:02 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | </style> | 
					
						
							|  |  |  | <script> | 
					
						
							| 
									
										
										
										
											2018-01-25 16:23:14 +00:00
										 |  |  |   import { virtualListStore } from './virtualListStore' | 
					
						
							|  |  |  |   import { AsyncLayout } from '../../_utils/AsyncLayout' | 
					
						
							| 
									
										
										
										
											2018-01-17 04:34:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-15 18:54:02 +00:00
										 |  |  |   export default { | 
					
						
							|  |  |  |     oncreate() { | 
					
						
							| 
									
										
										
										
											2018-03-23 15:29:54 +00:00
										 |  |  |       let asyncLayout = new AsyncLayout(node => node.getAttribute('virtual-list-key')) | 
					
						
							|  |  |  |       let key = this.get('key') | 
					
						
							|  |  |  |       asyncLayout.observe(key, this.refs.node, (rect) => { | 
					
						
							|  |  |  |         asyncLayout.disconnect() | 
					
						
							|  |  |  |         // update all item heights in one batch for better perf | 
					
						
							|  |  |  |         this.store.batchUpdateForRealm('itemHeights', key, rect.height) | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-01-15 18:54:02 +00:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2018-01-17 04:34:09 +00:00
										 |  |  |     store: () => virtualListStore, | 
					
						
							|  |  |  |     computed: { | 
					
						
							|  |  |  |       'shown': ($itemHeights, key) => $itemHeights[key] > 0 | 
					
						
							| 
									
										
										
										
											2018-01-21 18:32:18 +00:00
										 |  |  |     }, | 
					
						
							|  |  |  |     methods: { | 
					
						
							|  |  |  |       doRecalculateHeight() { | 
					
						
							| 
									
										
										
										
											2018-03-23 15:29:54 +00:00
										 |  |  |         // Recalculate immediately because this is done on-demand, e.g. | 
					
						
							|  |  |  |         // when clicking the "More" button on a spoiler. | 
					
						
							|  |  |  |         let rect = this.refs.node.getBoundingClientRect() | 
					
						
							| 
									
										
										
										
											2018-01-21 18:32:18 +00:00
										 |  |  |         let key = this.get('key') | 
					
						
							| 
									
										
										
										
											2018-03-23 15:29:54 +00:00
										 |  |  |         let itemHeights = this.store.get('itemHeights') | 
					
						
							|  |  |  |         itemHeights[key] = rect.height | 
					
						
							|  |  |  |         this.store.setForRealm({itemHeights}) | 
					
						
							| 
									
										
										
										
											2018-01-21 18:32:18 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-01-17 04:34:09 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-01-15 18:54:02 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | </script> |