setup() {
this.container = this.$refs.container;
this.tabs = this.$manyRefs.tab;
+ this.sidebarScrollContainers = this.$manyRefs.sidebarScrollContainer;
this.lastLayoutType = 'none';
this.onDestroy = null;
window.addEventListener('resize', () => {
this.updateLayout();
}, {passive: true});
+
+ this.setupSidebarScrollHandlers();
}
updateLayout() {
this.lastTabShown = tabName;
}
+ setupSidebarScrollHandlers() {
+ for (const sidebar of this.sidebarScrollContainers) {
+ sidebar.addEventListener('scroll', () => this.handleSidebarScroll(sidebar), {
+ passive: true,
+ });
+ this.handleSidebarScroll(sidebar);
+ }
+
+ window.addEventListener('resize', () => {
+ for (const sidebar of this.sidebarScrollContainers) {
+ this.handleSidebarScroll(sidebar);
+ }
+ });
+ }
+
+ handleSidebarScroll(sidebar) {
+ const scrollable = sidebar.clientHeight !== sidebar.scrollHeight;
+ const atTop = sidebar.scrollTop === 0;
+ const atBottom = (sidebar.scrollTop + sidebar.clientHeight) === sidebar.scrollHeight;
+
+ sidebar.parentElement.classList.toggle('scroll-away-from-top', !atTop && scrollable);
+ sidebar.parentElement.classList.toggle('scroll-away-from-bottom', !atBottom && scrollable);
+ }
+
}
.tri-layout-right {
grid-area: c;
min-width: 0;
+ position: relative;
}
.tri-layout-left {
grid-area: a;
min-width: 0;
+ position: relative;
}
@include mixins.larger-than(vars.$bp-xxl) {
margin-inline-start: 0;
margin-inline-end: 0;
}
+}
+
+/**
+ * Scroll Indicators
+ */
+.scroll-away-from-top:before,
+.scroll-away-from-bottom:after {
+ content: '';
+ display: block;
+ position: absolute;
+ @include mixins.lightDark(color, #F2F2F2, #111);
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 50px;
+ background: linear-gradient(to bottom, currentColor, transparent);
+ z-index: 2;
+}
+.scroll-away-from-bottom:after {
+ top: auto;
+ bottom: 0;
+ background: linear-gradient(to top, currentColor, transparent);
}
\ No newline at end of file
<div refs="tri-layout@container" class="tri-layout-container" @yield('container-attrs') >
<div class="tri-layout-sides print-hidden">
- <div class="tri-layout-sides-content">
+ <div refs="tri-layout@sidebar-scroll-container" class="tri-layout-sides-content">
<div class="tri-layout-right print-hidden">
- <aside class="tri-layout-right-contents">
+ <aside refs="tri-layout@sidebar-scroll-container" class="tri-layout-right-contents">
@yield('right')
</aside>
</div>
<div class="tri-layout-left print-hidden" id="sidebar">
- <aside class="tri-layout-left-contents">
+ <aside refs="tri-layout@sidebar-scroll-container" class="tri-layout-left-contents">
@yield('left')
</aside>
</div>