diff --git a/.nvmrc b/.nvmrc index 0f576a16ca..c9758a53fa 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v23.2.0 +v23.6.0 diff --git a/docs/_includes/partials/javascript/dsd-init.html b/docs/_includes/partials/javascript/dsd-init.html index cc227374fc..a25059246c 100644 --- a/docs/_includes/partials/javascript/dsd-init.html +++ b/docs/_includes/partials/javascript/dsd-init.html @@ -1,13 +1,13 @@ - + diff --git a/docs/_plugins/lit-ssr/worker.ts b/docs/_plugins/lit-ssr/worker.ts index d073e7e64c..bd07534d2f 100644 --- a/docs/_plugins/lit-ssr/worker.ts +++ b/docs/_plugins/lit-ssr/worker.ts @@ -5,6 +5,8 @@ import type { RenderRequestMessage, RenderResponseMessage } from './lit.js'; import { LitElementRenderer } from '@lit-labs/ssr/lib/lit-element-renderer.js'; +import '@patternfly/pfe-core/ssr-shims.js'; + import { register } from 'node:module'; import { register as registerTS } from 'tsx/esm/api'; @@ -93,4 +95,3 @@ export default async function renderPage({ const end = performance.now(); return { page, rendered, durationMs: end - start }; } - diff --git a/docs/_plugins/rhds.ts b/docs/_plugins/rhds.ts index aff4119313..880f903aeb 100644 --- a/docs/_plugins/rhds.ts +++ b/docs/_plugins/rhds.ts @@ -13,6 +13,8 @@ import RHDSElementDocsPlugin from '#11ty-plugins/element-docs.js'; import RHDSElementDemosPlugin from '#11ty-plugins/element-demos.js'; import LitSSRPlugin from '#11ty-plugins/lit-ssr/lit.js'; +import '@patternfly/pfe-core/ssr-shims.js'; + import { getPfeConfig } from '@patternfly/pfe-tools/config.js'; import { capitalize } from '#11ty-plugins/tokensHelpers.js'; diff --git a/elements/rh-accordion/rh-accordion-header.ts b/elements/rh-accordion/rh-accordion-header.ts index b41e325297..c0354669ba 100644 --- a/elements/rh-accordion/rh-accordion-header.ts +++ b/elements/rh-accordion/rh-accordion-header.ts @@ -1,7 +1,7 @@ import type { RhAccordion } from './rh-accordion.js'; import type { RhAccordionContext } from './context.js'; -import { html, LitElement } from 'lit'; +import { html, isServer, LitElement } from 'lit'; import { classMap } from 'lit/directives/class-map.js'; import { customElement } from 'lit/decorators/custom-element.js'; import { property } from 'lit/decorators/property.js'; @@ -18,7 +18,8 @@ import { consume } from '@lit/context'; import { context } from './context.js'; import styles from './rh-accordion-header.css'; -import { HeadingLevelController } from '@rhds/elements/lib/context/headings/controller.js'; + +import { HeadingLevelContextProvider } from '@rhds/elements/lib/context/headings/provider.js'; export class AccordionHeaderChangeEvent extends Event { declare target: RhAccordionHeader; @@ -65,22 +66,15 @@ export class RhAccordionHeader extends LitElement { ariaLevel: '2', }); - #heading = new HeadingLevelController(this); + #heading = new HeadingLevelContextProvider(this); override connectedCallback() { super.connectedCallback(); this.id ||= getRandomId(this.localName); - const accordion = this.closest('rh-accordion'); - const heading = this.closest('h1,h2,h3,h4,h5,h6'); - if (heading && accordion?.contains(heading)) { - this.#internals.ariaLevel = heading.localName.replace('h', ''); - heading.replaceWith(this); - } else { - this.#internals.ariaLevel = Math.max(2, this.#heading.level).toString(); - } + this.#initDom(); } - render() { + override render() { const { expanded, on = 'light' } = this; const { accents, large = false } = this.ctx ?? {}; const rtl = this.#dir.dir === 'rtl'; @@ -102,6 +96,20 @@ export class RhAccordionHeader extends LitElement { `; } + #initDom() { + if (!isServer) { + // TODO: replace with context? + const accordion = this.closest('rh-accordion'); + const heading = this.closest('h1,h2,h3,h4,h5,h6'); + if (heading && accordion?.contains(heading)) { + this.#internals.ariaLevel = heading.localName.replace('h', ''); + heading.replaceWith(this); + } else { + this.#internals.ariaLevel = Math.max(2, this.#heading.level).toString(); + } + } + } + #onClick(event: MouseEvent) { const accordion = event.composedPath().find(isAccordion); if (accordion) { diff --git a/elements/rh-accordion/rh-accordion.ts b/elements/rh-accordion/rh-accordion.ts index bf23421f7f..7282b54db1 100644 --- a/elements/rh-accordion/rh-accordion.ts +++ b/elements/rh-accordion/rh-accordion.ts @@ -1,4 +1,4 @@ -import { LitElement, html, type TemplateResult } from 'lit'; +import { LitElement, html, isServer, type TemplateResult } from 'lit'; import { classMap } from 'lit/directives/class-map.js'; import { customElement } from 'lit/decorators/custom-element.js'; import { property } from 'lit/decorators/property.js'; @@ -145,11 +145,13 @@ export class RhAccordion extends LitElement { @provide({ context }) private ctx = this.#makeContext(); - connectedCallback() { + override connectedCallback() { super.connectedCallback(); this.addEventListener('change', this.#onChange as EventListener); - this.#mo.observe(this, { childList: true }); - this.updateAccessibility(); + if (!isServer) { + this.updateAccessibility(); + this.#mo.observe(this, { childList: true }); + } } override render(): TemplateResult { @@ -262,6 +264,10 @@ export class RhAccordion extends LitElement { * open */ public updateAccessibility() { + if (isServer) { + return; + } + const { headers } = this; // For each header in the accordion, attach the aria connections diff --git a/elements/rh-audio-player/rh-audio-player-about.ts b/elements/rh-audio-player/rh-audio-player-about.ts index 42306bbccf..946714b49f 100644 --- a/elements/rh-audio-player/rh-audio-player-about.ts +++ b/elements/rh-audio-player/rh-audio-player-about.ts @@ -9,7 +9,7 @@ import '@rhds/elements/rh-avatar/rh-avatar.js'; import panelStyles from './rh-audio-player-panel.css'; import styles from './rh-audio-player-about.css'; -import { HeadingLevelContextConsumer } from '../../lib/context/headings/consumer.js'; +import { HeadingLevelContextConsumer, wrap } from '../../lib/context/headings/consumer.js'; /** * Audio Player About Panel @@ -42,7 +42,7 @@ export class RhAudioPlayerAbout extends LitElement { override render() { const { label, mediaseries, mediatitle } = this; const hasContent = (this.content?.length ?? 0) >= 1; - const heading = this.#headings.wrap(mediatitle ?? ''); + const heading = wrap.call(this.#headings, mediatitle ?? ''); return html` diff --git a/elements/rh-audio-player/rh-audio-player-subscribe.ts b/elements/rh-audio-player/rh-audio-player-subscribe.ts index 2f2cc0c984..9eebbe7920 100644 --- a/elements/rh-audio-player/rh-audio-player-subscribe.ts +++ b/elements/rh-audio-player/rh-audio-player-subscribe.ts @@ -3,7 +3,7 @@ import { customElement } from 'lit/decorators/custom-element.js'; import { property } from 'lit/decorators/property.js'; import { queryAssignedElements } from 'lit/decorators/query-assigned-elements.js'; -import { HeadingLevelContextConsumer } from '../../lib/context/headings/consumer.js'; +import { HeadingLevelContextConsumer, wrap } from '../../lib/context/headings/consumer.js'; import './rh-audio-player-scrolling-text-overflow.js'; @@ -37,7 +37,7 @@ export class RhAudioPlayerSubscribe extends LitElement { override render() { return html` - ${this.#headings.wrap(this.menuLabel)} + ${wrap.call(this.#headings, this.menuLabel)} `; diff --git a/elements/rh-audio-player/rh-cue.ts b/elements/rh-audio-player/rh-cue.ts index 30cd0f0718..0d72173b12 100644 --- a/elements/rh-audio-player/rh-cue.ts +++ b/elements/rh-audio-player/rh-cue.ts @@ -2,7 +2,7 @@ import { LitElement, html, nothing } from 'lit'; import { customElement } from 'lit/decorators/custom-element.js'; import { property } from 'lit/decorators/property.js'; -import { HeadingLevelContextConsumer } from '../../lib/context/headings/consumer.js'; +import { HeadingLevelContextConsumer, wrap } from '../../lib/context/headings/consumer.js'; import styles from './rh-cue.css'; @@ -105,7 +105,7 @@ export class RhCue extends LitElement { render() { const { start, voice } = this; - return html`${!this.#hasVoice ? nothing : this.#headings.wrap(this.#linkTemplate(html` + return html`${!this.#hasVoice ? nothing : wrap.call(this.#headings, this.#linkTemplate(html` ${start} - ${voice}`, true))}${this.#linkTemplate(html` `)}`; diff --git a/elements/rh-audio-player/rh-transcript.ts b/elements/rh-audio-player/rh-transcript.ts index a68812623d..98ea6b55af 100644 --- a/elements/rh-audio-player/rh-transcript.ts +++ b/elements/rh-audio-player/rh-transcript.ts @@ -6,8 +6,7 @@ import { queryAssignedElements } from 'lit/decorators/query-assigned-elements.js import { RhCue, getFormattedTime } from './rh-cue.js'; -import { HeadingLevelContextConsumer } from '@rhds/elements/lib/context/headings/consumer.js'; -import { HeadingLevelContextProvider } from '@rhds/elements/lib/context/headings/provider.js'; +import { HeadingLevelContextProvider, wrap } from '@rhds/elements/lib/context/headings/provider.js'; import buttonStyles from './rh-audio-player-button.css'; import panelStyles from './rh-audio-player-panel.css'; @@ -48,10 +47,7 @@ export class RhTranscript extends LitElement { #duration?: number; - #headings = new HeadingLevelContextProvider(this, { - offset: 0, - parent: new HeadingLevelContextConsumer(this), - }); + #headings = new HeadingLevelContextProvider(this, { offset: 0 }); set autoscrollLabel(label: string) { this._autoscroll = label; @@ -84,7 +80,7 @@ export class RhTranscript extends LitElement { render() { return html` - ${this.#headings.wrap(this.menuLabel)} + ${wrap.call(this.#headings, this.menuLabel)}
${this._cues.length < 0 ? '' : html`