Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions components/page/demo/page-component.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ class PageDemo extends LitElement {
}
.horizontal-fields {
display: flex;
flex-wrap: wrap;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unrelated, but was driving me crazy

gap: 1rem;
}
`];
Expand Down
46 changes: 32 additions & 14 deletions components/page/page-divider-internal.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,28 +57,39 @@ class PageDivider extends FocusMixin(PropertyRequiredMixin(LitElement)) {
background-color: var(--d2l-color-gypsum);
cursor: ew-resize;
height: 100%;
outline: none;
position: relative;
width: ${DIVIDER_WIDTH}px;
}
.divider:hover {
background-color: var(--d2l-color-mica);
}
.divider:focus {
.divider:focus-within {
background-color: var(--d2l-color-celestine);
}

.slider {
outline: none;
position: absolute;
top: 55px;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be (or will wrap) the collapse button, but just adding the minimum pieces right now to get the defect fixed and the vdiffs in place to protect from regressions.

}

:host([panel-type="drawer"]) .divider {
background-color: var(--d2l-color-celestine);
cursor: ns-resize;
height: ${DIVIDER_WIDTH}px;
width: 100%;
}

:host([panel-type="drawer"]) .slider {
inset-inline-end: 18px;
top: auto;
}

/* TO DO: Lots more divider styling to come */

`;

static focusElementSelector = '.divider';
static focusElementSelector = '.slider';

constructor() {
super();
Expand All @@ -98,17 +109,19 @@ class PageDivider extends FocusMixin(PropertyRequiredMixin(LitElement)) {
}

return html`
<div
class="divider"
role="slider"
tabindex="0"
aria-label="${this.label}"
aria-orientation="${this.panelType === 'panel' ? 'horizontal' : 'vertical'}"
aria-valuemax="${ifDefined(ariaValues.max)}"
aria-valuemin="${ifDefined(ariaValues.min)}"
aria-valuenow="${ifDefined(ariaValues.now)}"
aria-valuetext="${ifDefined(ariaValues.text)}"
@keydown="${this.#handleKeyDown}">
<div class="divider" @pointerdown="${this.#handlePointerDown}">
<div
class="slider"
role="slider"
tabindex="0"
aria-label="${this.label}"
aria-orientation="${this.panelType === 'panel' ? 'horizontal' : 'vertical'}"
aria-valuemax="${ifDefined(ariaValues.max)}"
aria-valuemin="${ifDefined(ariaValues.min)}"
aria-valuenow="${ifDefined(ariaValues.now)}"
aria-valuetext="${ifDefined(ariaValues.text)}"
@keydown="${this.#handleKeyDown}">
</div>
</div>
`;
}
Expand Down Expand Up @@ -148,6 +161,11 @@ class PageDivider extends FocusMixin(PropertyRequiredMixin(LitElement)) {
this.#sendResizeEvent(requestedSize);
}

#handlePointerDown(e) {
e.preventDefault();
this.focus();
}

#sendResizeEvent(requestedSize) {
const clampedRequestedSize = clampedSize(requestedSize, this.minSize, this.maxSize);
/** @ignore */
Expand Down
10 changes: 8 additions & 2 deletions components/page/page.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,13 +132,18 @@ class Page extends ProviderMixin(LocalizeCoreElement(LitElement)) {
}

.side-nav-panel,
.supporting-panel {
.supporting-panel,
.divider {
max-height: calc(100vh - var(--d2l-page-header-height, 0) - var(--d2l-page-footer-height, 0));
overflow: clip auto;
position: sticky;
top: var(--d2l-page-header-height, 0);
}

.side-nav-panel,
.supporting-panel {
overflow: clip auto;
}

.footer:not([hidden]),
.floating-buttons-container {
display: inline;
Expand Down Expand Up @@ -294,6 +299,7 @@ class Page extends ProviderMixin(LocalizeCoreElement(LitElement)) {
#renderDivider(panelKey, label, panelPosition) {
return html`
<d2l-page-divider-internal
class="divider"
data-panel-key="${panelKey}"
label="${label}"
current-size="${this._panelState.getSize(panelKey)}"
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion components/page/test/page-divider-internal-fixtures.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export function getDivider(elem, panelKey) {
}

export function getSlider(elem) {
return elem.shadowRoot.querySelector('.divider');
return elem.shadowRoot.querySelector('.slider');
}

export const pageDividerFixtures = {
Expand Down
6 changes: 3 additions & 3 deletions components/page/test/page-divider-internal.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { createDivider, getSlider } from './page-divider-internal-fixtures.js';
import { expect, fixture, html, nextFrame, oneEvent, runConstructor, sendKeysElem } from '@brightspace-ui/testing';
import { KEYBOARD_STEP, KEYBOARD_STEP_LARGE } from '../page-divider-internal.js';
import { createDivider } from './page-divider-internal-fixtures.js';

describe('d2l-page-divider-internal', () => {

Expand All @@ -11,7 +11,7 @@ describe('d2l-page-divider-internal', () => {
describe('accessibility', () => {
it('calculates aria values correctly', async() => {
const elem = await fixture(html`<d2l-page-divider-internal label="Resize" min-size="100" max-size="200" current-size="150"></d2l-page-divider-internal>`);
const slider = elem.shadowRoot.querySelector('.divider');
const slider = getSlider(elem);

@svanherk svanherk Jul 14, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Made this function so the update in this PR would be cleaner, and then forgot to use it 🤦‍♀️

expect(slider.getAttribute('aria-valuemax')).to.equal('200');
expect(slider.getAttribute('aria-valuemin')).to.equal('0');
expect(slider.getAttribute('aria-valuenow')).to.equal('150');
Expand All @@ -20,7 +20,7 @@ describe('d2l-page-divider-internal', () => {

it('does not set aria values when in unknown state', async() => {
const elem = await fixture(html`<d2l-page-divider-internal label="Resize"></d2l-page-divider-internal>`);
const slider = elem.shadowRoot.querySelector('.divider');
const slider = getSlider(elem);
expect(slider.hasAttribute('aria-valuemax')).to.be.false;
expect(slider.hasAttribute('aria-valuemin')).to.be.false;
expect(slider.hasAttribute('aria-valuenow')).to.be.false;
Expand Down
18 changes: 18 additions & 0 deletions components/page/test/page-divider-internal.vdiff.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,24 @@ describe('page-divider-internal', () => {
});
});

describe('focus-stay-scrolled', () => {
[
{ name: 'main', divider: 'side-nav', fixture: pageDividerFixtures.sideNavLongMainBothHeaders },
{ name: 'panel', divider: 'supporting', fixture: pageDividerFixtures.supportingLongFooter },
{ name: 'immersive-main', divider: 'supporting', fixture: pageDividerFixtures.supportingImmersiveLongMain },
{ name: 'immersive-panel', divider: 'side-nav', fixture: pageDividerFixtures.sideNavImmersiveLongFooter }
].forEach(test => {
it(test.name, async() => {
const elem = await fixture(test.fixture, { pagePadding: false, viewport: { width: 1000, height: 400 } });
window.scrollTo(0, document.body.scrollHeight);
const panel = elem.shadowRoot.querySelector(`.${test.divider}-panel`);
panel.scrollTop = panel.scrollHeight;
await focusElem(getDivider(elem, test.divider));
await expect(elem).to.be.golden({ margin: 0 });
});
});
});

describe('keyboard', () => {
// TO DO once arrow visuals added
});
Expand Down