Skip to content

feat(esl-utils): ScrollIntoView new implementation #1001

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 26 commits into
base: epic/scroll-into-view
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
7357a98
feat(esl-utils): ScrollIntoView new implementation
fshovchko May 25, 2022
66b7ac4
style(esl-utils): add ScrollIntoView example page
fshovchko May 29, 2022
86001b0
style(esl-utils): code refactoring
fshovchko May 30, 2022
3ac4af3
style(esl-utils): code refactoring
fshovchko May 30, 2022
ef4533a
Merge branch 'main-beta' into feat/scrollIntoView
ala-n Jun 3, 2022
f14723c
style(esl-utils): code refactoring
fshovchko Jun 3, 2022
bc6bf22
Merge remote-tracking branch 'origin/feat/scrollIntoView' into feat/s…
ala-n Jun 4, 2022
21a020d
chore(gh-pages): nested accordions & anchor navigation sample (compon…
ala-n Jun 4, 2022
ce91d3f
chore(gh-pages): move scroll ino view sample
ala-n Jun 4, 2022
cee98fa
chore(gh-pages): add sample page with anchor nav and nested accordions
ala-n Jun 4, 2022
d4b74b3
style(esl-utils): code refactoring
fshovchko Jun 5, 2022
a19ad71
style(esl-utils): code refactoring
fshovchko Jun 5, 2022
27e15c2
style(esl-utils): code refactoring
fshovchko Jun 5, 2022
26d5e45
chore(esl-utils): remove example pages
fshovchko Jun 7, 2022
00830ff
style(esl-utils): code refactoring
fshovchko Jun 8, 2022
84fc925
Merge branch 'main-beta' into feat/scrollIntoView
fshovchko Jun 9, 2022
fbd1dc7
refactor(esl-utils): add example page
fshovchko Jun 9, 2022
2d2a2a2
refactor(esl-utils): update scroll example page
fshovchko Jun 10, 2022
2264f84
refactor(esl-utils): disable scroll
fshovchko Jun 11, 2022
5680e45
Merge branch 'main-beta' of https://github.com/exadel-inc/esl into fe…
ala-n Jul 24, 2022
1d1a5a0
style(esl-utils): update sample with incorrect behaviour
ala-n Jul 30, 2022
a0543df
chore(gh-pages): update anchors and footnote sample pages
dshovchko Oct 31, 2022
92f1128
chore(gh-pages): update anchor scroll ino view sample
dshovchko Oct 31, 2022
ca4dd51
chore(gh-pages): update scroll ino view sample page
dshovchko Oct 31, 2022
c2098bd
Merge remote-tracking branch 'origin/epic/scroll-into-view' into feat…
dshovchko Oct 31, 2022
a611b2f
chore(gh-pages): add nested accordion scroll into view example page
dshovchko Oct 31, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions pages/src/anchor/anchor-link.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {ESLMixinElement} from '../../../src/modules/esl-mixin-element/ui/esl-mix
import {listen, memoize} from '../../../src/modules/esl-utils/decorators';
import {afterNextRender} from '../../../src/modules/esl-utils/async/raf';
import {ESLEventUtils} from '../../../src/modules/esl-utils/dom/events';
import {scrollIntoView} from '../../../src/modules/esl-utils/dom/scroll';

/**
* Demo sample of anchor mixin
Expand All @@ -27,12 +28,8 @@ export class ESLDemoAnchorLink extends ESLMixinElement {
if (!$target) return console.warn('No anchor target found');

ESLEventUtils.dispatch($target, 'esl:show:request');
afterNextRender(() => {
// TODO: replace with scroll ext version
// scrollIntoView($target, {behavior: 'smooth'})
// .then(() => console.log('Scroll to successful: ', $target));
$target.scrollIntoView({behavior: 'smooth'});
});
($target as HTMLElement).style.scrollMarginTop = '60px';
afterNextRender(() => scrollIntoView($target, {behavior: 'smooth', block: 'start'}));
}

@listen('click')
Expand Down
53 changes: 53 additions & 0 deletions pages/src/esl-scrollable-controls-demo/scrollable-controls.less
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
@import (reference) "../common/variables.less";

esl-d-scroll-controls {
display: flex;
align-items: center;
width: 100%;
background-color: @primary-blue;
border-radius: 8px;
padding: 1rem;
margin: 40px 0;
}

.esl-d-scroll-controls {
&-ul {
margin: 0;
flex-wrap: wrap;
list-style: none;
color: white;
}

@media @lg-xl {
&-ul {
width: 100%;
display: flex;
}
}

&-li {
margin-right: 10px;
@media @md-lg {
&:first-child {
flex: 0 1 100%;
}
}
}

&-behavior {
display: block;
margin: 0;
list-style: none;

&-option {
margin-top: 5px;
margin-right: 20px;
}
}

&-button {
background-color: white;
margin: 20px 0;
width: 100px;
}
}
57 changes: 57 additions & 0 deletions pages/src/esl-scrollable-controls-demo/scrollable-controls.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import {TraversingQuery} from '../../../src/modules/esl-traversing-query/core/esl-traversing-query';
import {attr, ESLBaseElement, listen} from '../../../src/modules/esl-base-element/core';
import {scrollIntoView} from '../../../src/modules/esl-utils/dom/scroll';
import type {ESLSelect} from '../../../src/modules/all';

export class ESLDemoScrollControls extends ESLBaseElement {
static is = 'esl-d-scroll-controls';

@attr() public target: string;

protected connectedCallback(): void {
TraversingQuery.all(this.target).forEach((el: HTMLElement) => {
const scrollNameValue = el.getAttribute('scrollname');
if (!scrollNameValue) return;
const option = document.createElement('option');
option.innerHTML = scrollNameValue;
const target = TraversingQuery.first('::find(#target)', this) as ESLSelect;
target.appendChild(option);
});
super.connectedCallback();
}

// @listen({event: 'click', selector: '#scrollIntoView'})
@listen({event: 'click', selector: '.esl-d-scroll-controls-button'})
private onClick(e: PointerEvent): void {
const behaviorOptions = TraversingQuery.all('::find([name="scroll-behavior"])', this) as HTMLInputElement[];
const behavior = behaviorOptions.find((radio) => radio.checked)!.value as ScrollBehavior;

const block = (TraversingQuery.first('::find(#options_block)', this) as ESLSelect).value as ScrollLogicalPosition;
const inline = (TraversingQuery.first('::find(#options_inline)', this) as ESLSelect).value as ScrollLogicalPosition;

const targetSelect = TraversingQuery.first('::find(#target)', this) as ESLSelect;
const target = TraversingQuery.first(`[scrollname="${targetSelect.value?.toString()}"]`);

const offsetInline = Number((TraversingQuery.first('::find(#offsetInline)', this) as HTMLInputElement).value);
const offsetBlock = Number((TraversingQuery.first('::find(#offsetBlock)', this) as HTMLInputElement).value);
(target as HTMLElement).style.scrollMarginInline = `${offsetInline}px ${offsetInline}px`;
(target as HTMLElement).style.scrollMarginBlock = `${offsetBlock}px ${offsetBlock}px`;
if ((e.target as HTMLElement).id.includes('Native')) {
target?.scrollIntoView({behavior, block, inline});
} else {
scrollIntoView(target!, {behavior, block, inline})
.then(() => this.$$fire('esl:alert:show',
{detail: {
text: 'Sucessful scroll to given position',
cls: 'alert alert-info'
}})
)
.catch(() => this.$$fire('esl:alert:show',
{detail: {
text: 'Failed to scroll to given position',
cls: 'alert alert-danger'
}})
);
}
}
}
64 changes: 64 additions & 0 deletions pages/src/esl-scrollable-controls-demo/scrollable-list-demo.less
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
@import (reference) "../common/variables.less";

.scrollable-test {
&-lvl {
&-1 {
display: flex;
margin: 30px;
min-width: 200px;
height: 200px;

&-wrapper {
display: flex;
flex-wrap: wrap;
align-content: flex-start;
width: 1050px;
margin: 600px;
}
}

&-2 {
height: 600px;
width: 600px;

&-wrapper {
height: 600px;
width: 600px;
margin: 1000px 2000px;
}
}

&-3-wrapper {
background-color: @secondary-green;
}
}

&-dynamic {
background-color: @secondary-blue;
color: white;
padding: 30px;
font-size: 2rem;
text-align: center;
min-height: 200px;
margin-bottom: 40px;

&-expandable {
background-color: @secondary-green;
transition: min-height .9s ease;
}

&-expanded {
min-height: 1000px;
}

&-target {
background-color: @secondary-blue;
}
}

&-p {
color: white;
margin: auto;
font-size: 4em;
}
}
2 changes: 2 additions & 0 deletions pages/src/localdev.less
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@

@import "./collection-grid/collection-grid.less";
@import "./esl-media-demo/test-media.less";
@import "./esl-scrollable-controls-demo/scrollable-list-demo.less";
@import "./esl-scrollable-controls-demo/scrollable-controls.less";

@import "../../src/modules/all.less";
@import "../../src/modules/draft/all.less";
Expand Down
2 changes: 2 additions & 0 deletions pages/src/localdev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import './esl-media-demo/test-media-source';

import {ESLDemoBackLink} from './back-link/back-link';
import {ESLDemoMarquee} from './landing/landing';
import {ESLDemoScrollControls} from './esl-scrollable-controls-demo/scrollable-controls';
import {ESLDemoSearchBox} from './navigation/header/header-search';
import {ESLDemoSearchPageWrapper} from './search/search';
import {ESLDemoSidebar} from './navigation/navigation';
Expand All @@ -62,6 +63,7 @@ ESLDemoSidebar.register();
ESLDemoMarquee.register();
ESLDemoSearchBox.register();
ESLDemoSearchPageWrapper.register();
ESLDemoScrollControls.register();
ESLDemoAnchorLink.register();
ESLDemoBackLink.register();

Expand Down
82 changes: 82 additions & 0 deletions pages/views/_includes/scroll/scroll-options.njk
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
{% macro scrollControls(target) %}
<esl-d-scroll-controls target="{{ target }}">
<form style="width: inherit">
<ul class="esl-d-scroll-controls-ul">
<li class="esl-d-scroll-controls-li">
<label class="form-label">Behavior</label>

<ul class="esl-d-scroll-controls-behavior">
<li class="esl-d-scroll-controls-behavior-option">
<input type="radio" name="scroll-behavior" id="smooth" value="smooth">
<label class="form-label">Smooth</label>
</li>

<li class="esl-d-scroll-controls-behavior-option">
<input type="radio" name="scroll-behavior" id="auto" value="auto" checked>
<label class="form-label">Auto</label>
</li>
</ul>
</li>

<li class="esl-d-scroll-controls-li">
<label for="target" class="form-label">Target</label>
<esl-select style="display: block" placeholder="Target">
<select esl-select-target
id="target"
name="target"
class="form-control">
</select>
</esl-select>
</li>

<li class="esl-d-scroll-controls-li">
<label for="options_block" class="form-label">Block</label>
<esl-select style="display: block"
placeholder="Block"
select-all-label="Block">
<select esl-select-target
id="options_block"
name="options_block"
class="form-control">
<option>start</option>
<option>center</option>
<option>end</option>
<option>nearest</option>
</select>
</esl-select>
</li>

<li class="esl-d-scroll-controls-li">
<label for="options_inline" class="form-label">Inline</label>
<esl-select style="display: block" placeholder="Inline">
<select esl-select-target
id="options_inline"
name="options_inline"
class="form-control">
<option>start</option>
<option>center</option>
<option>end</option>
<option>nearest</option>
</select>
</esl-select>
</li>

<li class="esl-d-scroll-controls-li">
<label>OffsetBlock</label>
<input type="text" class="form-control" id="offsetBlock" min="0" max="2000" value="0" size="3">
</li>

<li class="esl-d-scroll-controls-li">
<label>OffsetInline</label>
<input type="text" class="form-control" id="offsetInline" min="0" max="2000" value="0" size="3">
</li>

<li class="menu-item" style="margin-left: auto">
<button type="button" class="btn btn-sec-orange esl-d-scroll-controls-button" id="scrollIntoViewNative">Native</button>
<button type="button" class="btn btn-sec-orange esl-d-scroll-controls-button" id="scrollIntoViewPonyfill">Ponyfill</button>
</li>
</ul>
</form>
<esl-alert style="position: fixed"></esl-alert>
</esl-d-scroll-controls>
{% endmacro %}
83 changes: 83 additions & 0 deletions pages/views/examples/anchors.njk
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
---
layout: empty
title: Anchors
name: Anchors
tags: [examples, draft]
icon: examples/accordion.svg
scrollbar: true
aside:
components:
- esl-trigger
- esl-panel
---

{% import 'lorem.njk' as lorem %}

{% macro anchorNav() %}
<ul class="mx-4">
<li><a esl-d-anchor class="btn-link" href="#II-1">Scroll to II - 1</a></li>
<li><a esl-d-anchor class="btn-link" href="#II-2">Scroll to II - 2</a></li>
<li><a esl-d-anchor class="btn-link" href="#II-3">Scroll to II - 3</a></li>
<li><a esl-d-anchor class="btn-link" href="#II-4">Scroll to II - 4</a></li>
<li><a esl-d-anchor class="btn-link" href="#II-11">Scroll to II - 11</a></li>
</ul>
{% endmacro %}

<nav class="mb-1">
<h2>Accordion Block anchors</h2>
{{ anchorNav() }}
</nav>
<section class="row">
<div class="col-12">
<esl-panel-group class="accordion-group mb-4">
<div class="esl-d-accordion">
<esl-trigger class="esl-d-accordion-header h4 esl-d-accordion-header-arrow" target="::next">
Toggle Accordion #1
</esl-trigger>
<esl-panel open class="esl-d-accordion-panel">
<div id="II-1" class="esl-d-accordion-body">
{{ lorem.paragraphs(3) }}
</div>
</esl-panel>
</div>
<div class="esl-d-accordion">
<esl-trigger class="esl-d-accordion-header h4 esl-d-accordion-header-arrow" target="::next">
Toggle Accordion #2
</esl-trigger>
<esl-panel class="esl-d-accordion-panel">
<div id="II-2" class="esl-d-accordion-body">
{{ lorem.paragraphs(7) }}
</div>
</esl-panel>
</div>
<h4 id="II-11">Lorem ipsum #11</h4>
<div class="esl-d-accordion">
<esl-trigger class="esl-d-accordion-header h4 esl-d-accordion-header-arrow" target="::next">
Toggle Accordion #3
</esl-trigger>
<esl-panel class="esl-d-accordion-panel">
<div id="II-3" class="esl-d-accordion-body">
{{ lorem.paragraphs(2) }}
</div>
</esl-panel>
</div>
<div class="esl-d-accordion">
<esl-trigger class="esl-d-accordion-header h4 esl-d-accordion-header-arrow" target="::next">
Toggle Accordion #4
</esl-trigger>
<esl-panel open class="esl-d-accordion-panel">
<div id="II-4" class="esl-d-accordion-body">
{{ lorem.paragraphs(8) }}
</div>
</esl-panel>
</div>
</esl-panel-group>
</div>
<hr/>
<div>
{{ lorem.paragraphs(3) }}
</div>
</section>
<nav class="mb-1">
{{ anchorNav() }}
</nav>
Loading