From ce761061dc71c1a78811866e75befbe29c260885 Mon Sep 17 00:00:00 2001 From: Steven Spriggs Date: Fri, 8 May 2026 14:07:32 -0400 Subject: [PATCH 1/9] feat(avatar): add pf-v6-avatar element Port pf-v5-avatar to pf-v6-avatar with the following v6 API changes: - Replace `border` string attribute (light/dark) with boolean `bordered` attribute, matching React v6 `isBordered` prop - Drop `dark` boolean attribute (removed in v6 React) - Update all CSS custom property tokens from `--pf-v5-c-avatar--*` to `--pf-v6-c-avatar--*` matching the v6 SCSS source - Use v6 global tokens (`--pf-t--global--border--*`) for bordered variant - Simplify placeholder SVG to use `light-dark()` for automatic light/dark mode, replacing the separate dark boolean - Use private CSS custom properties (`--_*`) with public token fallback defaults at use sites - Remove default value from `alt` property to avoid sprouting attributes - Add `aria-hidden="true"` to placeholder SVG - Add `@cssprop` JSDoc for all public CSS custom properties - Export `AvatarSize` type union Demos match patternfly.org: basic, bordered, size-variations. Tests cover sizes (offsetWidth), load event, alt text (a11ySnapshot), bordered, and placeholder rendering. Closes #2979 Assisted-By: Claude Opus 4.6 --- elements/package.json | 1 + elements/pf-v6-avatar/demo/basic.html | 18 +++ elements/pf-v6-avatar/demo/bordered.html | 19 +++ .../pf-v6-avatar/demo/size-variations.html | 63 +++++++++ elements/pf-v6-avatar/pf-v6-avatar.css | 54 ++++++++ elements/pf-v6-avatar/pf-v6-avatar.ts | 80 +++++++++++ .../pf-v6-avatar/test/pf-v6-avatar.spec.ts | 129 ++++++++++++++++++ 7 files changed, 364 insertions(+) create mode 100644 elements/pf-v6-avatar/demo/basic.html create mode 100644 elements/pf-v6-avatar/demo/bordered.html create mode 100644 elements/pf-v6-avatar/demo/size-variations.html create mode 100644 elements/pf-v6-avatar/pf-v6-avatar.css create mode 100644 elements/pf-v6-avatar/pf-v6-avatar.ts create mode 100644 elements/pf-v6-avatar/test/pf-v6-avatar.spec.ts diff --git a/elements/package.json b/elements/package.json index fe8dda2080..dc67ca9ec7 100644 --- a/elements/package.json +++ b/elements/package.json @@ -15,6 +15,7 @@ "./pf-v5-accordion/pf-v5-accordion.js": "./pf-v5-accordion/pf-v5-accordion.js", "./pf-v5-alert/pf-v5-alert.js": "./pf-v5-alert/pf-v5-alert.js", "./pf-v5-avatar/pf-v5-avatar.js": "./pf-v5-avatar/pf-v5-avatar.js", + "./pf-v6-avatar/pf-v6-avatar.js": "./pf-v6-avatar/pf-v6-avatar.js", "./pf-v5-back-to-top/pf-v5-back-to-top.js": "./pf-v5-back-to-top/pf-v5-back-to-top.js", "./pf-v5-background-image/pf-v5-background-image.js": "./pf-v5-background-image/pf-v5-background-image.js", "./pf-v5-badge/pf-v5-badge.js": "./pf-v5-badge/pf-v5-badge.js", diff --git a/elements/pf-v6-avatar/demo/basic.html b/elements/pf-v6-avatar/demo/basic.html new file mode 100644 index 0000000000..0cbc5325b8 --- /dev/null +++ b/elements/pf-v6-avatar/demo/basic.html @@ -0,0 +1,18 @@ +--- +name: Basic +description: A basic avatar displays a user image or a placeholder graphic when no image is available. +--- +
+ +
+ + + + diff --git a/elements/pf-v6-avatar/demo/bordered.html b/elements/pf-v6-avatar/demo/bordered.html new file mode 100644 index 0000000000..de60d25be3 --- /dev/null +++ b/elements/pf-v6-avatar/demo/bordered.html @@ -0,0 +1,19 @@ +--- +name: Bordered +description: A bordered avatar has a thin border around the image. +--- +
+ +
+ + + + diff --git a/elements/pf-v6-avatar/demo/size-variations.html b/elements/pf-v6-avatar/demo/size-variations.html new file mode 100644 index 0000000000..8983fd4faf --- /dev/null +++ b/elements/pf-v6-avatar/demo/size-variations.html @@ -0,0 +1,63 @@ +--- +name: Size variations +description: Avatars can be displayed in four sizes. +--- +
+
+
Small
+
+ +
+
+ +
+
Medium
+
+ +
+
+ +
+
Large
+
+ +
+
+ +
+
Extra Large
+
+ +
+
+
+ + + + diff --git a/elements/pf-v6-avatar/pf-v6-avatar.css b/elements/pf-v6-avatar/pf-v6-avatar.css new file mode 100644 index 0000000000..ffbe4b2bfc --- /dev/null +++ b/elements/pf-v6-avatar/pf-v6-avatar.css @@ -0,0 +1,54 @@ +:host { + --_width: var(--pf-v6-c-avatar--Width, 2.25rem); + --_height: var(--pf-v6-c-avatar--Height, 2.25rem); + --_border-radius: var(--pf-v6-c-avatar--BorderRadius, var(--pf-t--global--border--radius--pill, 30em)); + --_border-color: var(--pf-v6-c-avatar--BorderColor, transparent); + --_border-width: var(--pf-v6-c-avatar--BorderWidth, 0); + --_placeholder-bg: light-dark(#f0f0f0, #212427); + --_placeholder-fg: light-dark(#d2d2d2, #6a6e73); + + display: inline-block; + width: var(--_width); + height: var(--_height); + border-radius: var(--_border-radius); +} + +:host([hidden]), +[hidden] { + display: none !important; +} + +:host([bordered]) { + --_border-color: var(--pf-v6-c-avatar--m-bordered--BorderColor, var(--pf-t--global--border--color--default, #d2d2d2)); + --_border-width: var(--pf-v6-c-avatar--m-bordered--BorderWidth, var(--pf-t--global--border--width--box--default, 1px)); +} + +:host([size="sm"]) { + --_width: var(--pf-v6-c-avatar--m-sm--Width, 1.5rem); + --_height: var(--pf-v6-c-avatar--m-sm--Height, 1.5rem); +} + +:host([size="md"]) { + --_width: var(--pf-v6-c-avatar--m-md--Width, 2.25rem); + --_height: var(--pf-v6-c-avatar--m-md--Height, 2.25rem); +} + +:host([size="lg"]) { + --_width: var(--pf-v6-c-avatar--m-lg--Width, 4.5rem); + --_height: var(--pf-v6-c-avatar--m-lg--Height, 4.5rem); +} + +:host([size="xl"]) { + --_width: var(--pf-v6-c-avatar--m-xl--Width, 8rem); + --_height: var(--pf-v6-c-avatar--m-xl--Height, 8rem); +} + +svg, +img { + display: inline; + object-fit: cover; + width: var(--_width); + height: var(--_height); + border-radius: var(--_border-radius); + border: var(--_border-width) solid var(--_border-color); +} diff --git a/elements/pf-v6-avatar/pf-v6-avatar.ts b/elements/pf-v6-avatar/pf-v6-avatar.ts new file mode 100644 index 0000000000..b97876c46b --- /dev/null +++ b/elements/pf-v6-avatar/pf-v6-avatar.ts @@ -0,0 +1,80 @@ +import { LitElement, html, type TemplateResult } from 'lit'; +import { property } from 'lit/decorators/property.js'; +import { customElement } from 'lit/decorators/custom-element.js'; + +import style from './pf-v6-avatar.css'; + +/** Size variants for the avatar. */ +export type AvatarSize = 'sm' | 'md' | 'lg' | 'xl'; + +export class PfV6AvatarLoadEvent extends Event { + constructor(public originalEvent: Event) { + super('load', { bubbles: true }); + } +} + +/** + * An **avatar** is a visual used to represent a user. It may contain an image + * or a placeholder graphic. + * @summary Displays a user's avatar image + * @fires {PfV6AvatarLoadEvent} load - when the avatar image loads + * @cssprop {} --pf-v6-c-avatar--Width - Width of the avatar + * @cssprop {} --pf-v6-c-avatar--Height - Height of the avatar + * @cssprop {} --pf-v6-c-avatar--BorderRadius - Border radius of the avatar + * @cssprop {} --pf-v6-c-avatar--BorderColor - Border color of the avatar + * @cssprop {} --pf-v6-c-avatar--BorderWidth - Border width of the avatar + * @cssprop {} --pf-v6-c-avatar--m-sm--Width - Width when size is `sm` + * @cssprop {} --pf-v6-c-avatar--m-sm--Height - Height when size is `sm` + * @cssprop {} --pf-v6-c-avatar--m-md--Width - Width when size is `md` + * @cssprop {} --pf-v6-c-avatar--m-md--Height - Height when size is `md` + * @cssprop {} --pf-v6-c-avatar--m-lg--Width - Width when size is `lg` + * @cssprop {} --pf-v6-c-avatar--m-lg--Height - Height when size is `lg` + * @cssprop {} --pf-v6-c-avatar--m-xl--Width - Width when size is `xl` + * @cssprop {} --pf-v6-c-avatar--m-xl--Height - Height when size is `xl` + * @cssprop {} --pf-v6-c-avatar--m-bordered--BorderColor - Border color when bordered + * @cssprop {} --pf-v6-c-avatar--m-bordered--BorderWidth - Border width when bordered + */ +@customElement('pf-v6-avatar') +export class PfV6Avatar extends LitElement { + static readonly styles: CSSStyleSheet[] = [style]; + + /** The URL to the user's custom avatar image. */ + @property() src?: string; + + /** The alt text for the avatar image. */ + @property({ reflect: true }) alt?: string; + + /** Size of the avatar */ + @property({ reflect: true }) size?: AvatarSize; + + /** Whether to display a border around the avatar */ + @property({ type: Boolean, reflect: true }) bordered = false; + + override render(): TemplateResult<1> { + return this.src != null ? html` + ${this.alt ?? ''} + ` : html` + + `; + } + + #onLoad(event: Event) { + this.dispatchEvent(new PfV6AvatarLoadEvent(event)); + } +} + +declare global { + interface HTMLElementTagNameMap { + 'pf-v6-avatar': PfV6Avatar; + } +} diff --git a/elements/pf-v6-avatar/test/pf-v6-avatar.spec.ts b/elements/pf-v6-avatar/test/pf-v6-avatar.spec.ts new file mode 100644 index 0000000000..cd9a5a34ac --- /dev/null +++ b/elements/pf-v6-avatar/test/pf-v6-avatar.spec.ts @@ -0,0 +1,129 @@ +import { html, expect, oneEvent, nextFrame } from '@open-wc/testing'; +import { createFixture } from '@patternfly/pfe-tools/test/create-fixture.js'; +import { a11ySnapshot } from '@patternfly/pfe-tools/test/a11y-snapshot.js'; +import { PfV6Avatar, PfV6AvatarLoadEvent } from '@patternfly/elements/pf-v6-avatar/pf-v6-avatar.js'; + +describe('', function() { + it('imperatively instantiates', function() { + expect(document.createElement('pf-v6-avatar')).to.be.an.instanceof(PfV6Avatar); + }); + + it('should upgrade', async function() { + const el = await createFixture(html``); + expect(el, 'pf-v6-avatar should be an instance of PfV6Avatar') + .to.be.an.instanceOf(customElements.get('pf-v6-avatar')) + .and + .to.be.an.instanceOf(PfV6Avatar); + }); + + describe('without src attr', function() { + let element: PfV6Avatar; + beforeEach(async function() { + element = await createFixture(html``); + await nextFrame(); + }); + + it('displays a placeholder', function() { + const { offsetWidth } = element; + expect(offsetWidth).to.be.greaterThan(0); + }); + + it('has the default size', function() { + expect(element.offsetWidth).to.equal(36); + expect(element.offsetHeight).to.equal(36); + }); + }); + + describe('with a src attr', function() { + let element: PfV6Avatar; + let loaded: string | undefined; + const datauri = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAB0UlEQVR4Xu3UAQ0AAAyDsM+/6QspcwAh2zXawGj64K8A8AgKoABwAzh+D1AAuAEcvwcoANwAjt8DFABuAMfvAQoAN4Dj9wAFgBvA8XuAAsAN4Pg9QAHgBnD8HqAAcAM4fg9QALgBHL8HKADcAI7fAxQAbgDH7wEKADeA4/cABYAbwPF7gALADeD4PUAB4AZw/B6gAHADOH4PUAC4ARy/BygA3ACO3wMUAG4Ax+8BCgA3gOP3AAWAG8Dxe4ACwA3g+D1AAeAGcPweoABwAzh+D1AAuAEcvwcoANwAjt8DFABuAMfvAQoAN4Dj9wAFgBvA8XuAAsAN4Pg9QAHgBnD8HqAAcAM4fg9QALgBHL8HKADcAI7fAxQAbgDH7wEKADeA4/cABYAbwPF7gALADeD4PUAB4AZw/B6gAHADOH4PUAC4ARy/BygA3ACO3wMUAG4Ax+8BCgA3gOP3AAWAG8Dxe4ACwA3g+D1AAeAGcPweoABwAzh+D1AAuAEcvwcoANwAjt8DFABuAMfvAQoAN4Dj9wAFgBvA8XuAAsAN4Pg9QAHgBnD8HqAAcAM4fg9QALgBHL8HKADcAI7fAxQAbgDH7wEKADeA4/cABYAbwPF7ADyAB6SPAIFm19U7AAAAAElFTkSuQmCC'; + const onLoad = (e: PfV6AvatarLoadEvent) => { + const paths = e.originalEvent.composedPath() as HTMLImageElement[]; + loaded = paths.find(x => x.localName === 'img')?.src; + }; + beforeEach(async function() { + element = await createFixture(html``); + setTimeout(() => element.src = datauri); + await oneEvent(element, 'load'); + }); + + it('loads the image', function() { + expect(loaded).to.equal(datauri); + }); + + it('fires a PfV6AvatarLoadEvent', function() { + expect(loaded).to.be.ok; + }); + }); + + describe('with alt attr', function() { + let element: PfV6Avatar; + beforeEach(async function() { + element = await createFixture(html` + + `); + await oneEvent(element, 'load'); + }); + + it('passes alt text to the image', async function() { + const snapshot = await a11ySnapshot(); + expect(snapshot?.children?.find( + (child: { name: string }) => child.name === 'User avatar' + )).to.be.ok; + }); + }); + + describe('with size="sm"', function() { + let element: PfV6Avatar; + beforeEach(async function() { + element = await createFixture(html``); + await nextFrame(); + }); + + it('renders at the small size', function() { + expect(element.offsetWidth).to.equal(24); + expect(element.offsetHeight).to.equal(24); + }); + }); + + describe('with size="lg"', function() { + let element: PfV6Avatar; + beforeEach(async function() { + element = await createFixture(html``); + await nextFrame(); + }); + + it('renders at the large size', function() { + expect(element.offsetWidth).to.equal(72); + expect(element.offsetHeight).to.equal(72); + }); + }); + + describe('with size="xl"', function() { + let element: PfV6Avatar; + beforeEach(async function() { + element = await createFixture(html``); + await nextFrame(); + }); + + it('renders at the extra large size', function() { + expect(element.offsetWidth).to.equal(128); + expect(element.offsetHeight).to.equal(128); + }); + }); + + describe('with bordered', function() { + let element: PfV6Avatar; + beforeEach(async function() { + element = await createFixture(html``); + await nextFrame(); + }); + + it('renders with a visible border', function() { + // The element should still render with a size larger than 0 + expect(element.offsetWidth).to.be.greaterThan(0); + }); + }); +}); From 4f20b211c5cbc743d671a1c302c7453f5af4aaf2 Mon Sep 17 00:00:00 2001 From: Steven Spriggs Date: Fri, 8 May 2026 15:29:17 -0400 Subject: [PATCH 2/9] fix(avatar): apply review fixes - Use `static styles = [style]` array form convention - Simplify render return type to TemplateResult - Change img/svg display from inline to block (prevents baseline gap) - Add placeholder avatar to basic demo - Add a11ySnapshot test for placeholder hidden from ax tree - Add size=md test case - Strengthen bordered test assertion (check border adds to size) - Add cem generate output path to config Assisted-By: Claude Opus 4.6 --- .config/cem.yaml | 1 + elements/pf-v6-avatar/demo/basic.html | 1 + elements/pf-v6-avatar/pf-v6-avatar.css | 2 +- elements/pf-v6-avatar/pf-v6-avatar.ts | 4 ++-- .../pf-v6-avatar/test/pf-v6-avatar.spec.ts | 23 +++++++++++++++++-- 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/.config/cem.yaml b/.config/cem.yaml index febc90fcec..86f5f070a6 100644 --- a/.config/cem.yaml +++ b/.config/cem.yaml @@ -1,5 +1,6 @@ sourceControlRootUrl: https://github.com/patternfly/patternfly-elements/tree/main/ generate: + output: ./elements/custom-elements.json files: - ./elements/*/*.ts - ./core/*/*.ts diff --git a/elements/pf-v6-avatar/demo/basic.html b/elements/pf-v6-avatar/demo/basic.html index 0cbc5325b8..67e06153eb 100644 --- a/elements/pf-v6-avatar/demo/basic.html +++ b/elements/pf-v6-avatar/demo/basic.html @@ -5,6 +5,7 @@
+
- - diff --git a/elements/pf-v6-avatar/demo/bordered.html b/elements/pf-v6-avatar/demo/bordered.html index de60d25be3..f5ab4113cb 100644 --- a/elements/pf-v6-avatar/demo/bordered.html +++ b/elements/pf-v6-avatar/demo/bordered.html @@ -5,7 +5,7 @@
+ src="./avatarImg.svg">
diff --git a/elements/pf-v6-avatar/demo/size-variations.html b/elements/pf-v6-avatar/demo/size-variations.html index 8983fd4faf..33467cde0b 100644 --- a/elements/pf-v6-avatar/demo/size-variations.html +++ b/elements/pf-v6-avatar/demo/size-variations.html @@ -8,7 +8,7 @@
+ src="./avatarImg.svg">
@@ -17,7 +17,7 @@
+ src="./avatarImg.svg">
@@ -26,7 +26,7 @@
+ src="./avatarImg.svg">
@@ -35,7 +35,7 @@
+ src="./avatarImg.svg">
From 029d18d30c76f488561340e58c4b95a13e954f11 Mon Sep 17 00:00:00 2001 From: Steven Spriggs Date: Fri, 8 May 2026 17:02:34 -0400 Subject: [PATCH 4/9] fix(avatar): correct css vars --- elements/pf-v6-avatar/pf-v6-avatar.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/elements/pf-v6-avatar/pf-v6-avatar.css b/elements/pf-v6-avatar/pf-v6-avatar.css index 20e338606a..aeb19ce41b 100644 --- a/elements/pf-v6-avatar/pf-v6-avatar.css +++ b/elements/pf-v6-avatar/pf-v6-avatar.css @@ -4,8 +4,8 @@ --_border-radius: var(--pf-v6-c-avatar--BorderRadius, var(--pf-t--global--border--radius--pill, 30em)); --_border-color: var(--pf-v6-c-avatar--BorderColor, transparent); --_border-width: var(--pf-v6-c-avatar--BorderWidth, 0); - --_placeholder-bg: light-dark(#f0f0f0, #212427); - --_placeholder-fg: light-dark(#d2d2d2, #6a6e73); + --_placeholder-bg: var(--pf-t--global--background--color--200, light-dark(var(--pf-t--color--gray--10, #f2f2f2), var(--pf-t--color--gray--80, #292929))); + --_placeholder-fg: var(--pf-t--global--icon--color--subtle, light-dark(var(--pf-t--color--gray--50, #707070), var(--pf-t--color--gray--40, #a3a3a3))); display: inline-block; width: var(--_width); From 47ea912dc2ebd4ec6c2cb066079e9c66266ced8c Mon Sep 17 00:00:00 2001 From: Steven Spriggs Date: Fri, 8 May 2026 17:02:56 -0400 Subject: [PATCH 5/9] fix(avatar): readd typing --- elements/pf-v6-avatar/pf-v6-avatar.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elements/pf-v6-avatar/pf-v6-avatar.ts b/elements/pf-v6-avatar/pf-v6-avatar.ts index 39096db4ea..a79e28f922 100644 --- a/elements/pf-v6-avatar/pf-v6-avatar.ts +++ b/elements/pf-v6-avatar/pf-v6-avatar.ts @@ -36,7 +36,7 @@ export class PfV6AvatarLoadEvent extends Event { */ @customElement('pf-v6-avatar') export class PfV6Avatar extends LitElement { - static styles = [style]; + static readonly styles: CSSStyleSheet[] = [style]; /** The URL to the user's custom avatar image. */ @property() src?: string; From fbbd7135dcbab41de902ab01bd2df4883ba18171 Mon Sep 17 00:00:00 2001 From: Steven Spriggs Date: Wed, 13 May 2026 13:26:39 -0400 Subject: [PATCH 6/9] chore: remove pf-v5-avatar --- elements/pf-v5-avatar/README.md | 31 ------- elements/pf-v5-avatar/demo/bordered.html | 50 ------------ elements/pf-v5-avatar/demo/dark-border.html | 49 ------------ elements/pf-v5-avatar/demo/dark-variant.html | 69 ---------------- elements/pf-v5-avatar/demo/index.html | 13 --- elements/pf-v5-avatar/demo/sizes.html | 49 ------------ elements/pf-v5-avatar/docs/CHANGELOG.old.md | 52 ------------ elements/pf-v5-avatar/docs/pf-v5-avatar.md | 28 ------- elements/pf-v5-avatar/docs/screenshot.png | Bin 5981 -> 0 bytes elements/pf-v5-avatar/pf-v5-avatar.css | 80 ------------------- elements/pf-v5-avatar/pf-v5-avatar.ts | 69 ---------------- elements/pf-v5-avatar/test/mwcz.jpg | Bin 49364 -> 0 bytes elements/pf-v5-avatar/test/pf-avatar.e2e.ts | 25 ------ elements/pf-v5-avatar/test/pf-avatar.spec.ts | 47 ----------- 14 files changed, 562 deletions(-) delete mode 100644 elements/pf-v5-avatar/README.md delete mode 100644 elements/pf-v5-avatar/demo/bordered.html delete mode 100644 elements/pf-v5-avatar/demo/dark-border.html delete mode 100644 elements/pf-v5-avatar/demo/dark-variant.html delete mode 100644 elements/pf-v5-avatar/demo/index.html delete mode 100644 elements/pf-v5-avatar/demo/sizes.html delete mode 100644 elements/pf-v5-avatar/docs/CHANGELOG.old.md delete mode 100644 elements/pf-v5-avatar/docs/pf-v5-avatar.md delete mode 100644 elements/pf-v5-avatar/docs/screenshot.png delete mode 100644 elements/pf-v5-avatar/pf-v5-avatar.css delete mode 100644 elements/pf-v5-avatar/pf-v5-avatar.ts delete mode 100644 elements/pf-v5-avatar/test/mwcz.jpg delete mode 100644 elements/pf-v5-avatar/test/pf-avatar.e2e.ts delete mode 100644 elements/pf-v5-avatar/test/pf-avatar.spec.ts diff --git a/elements/pf-v5-avatar/README.md b/elements/pf-v5-avatar/README.md deleted file mode 100644 index 0ec4063598..0000000000 --- a/elements/pf-v5-avatar/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# PatternFly Elements Avatar - -`` is an element for displaying a user's avatar image. If the user in -question has provided a custom avatar, provide it and it will be displayed. - -Read more about Avatar in the [PatternFly Elements Avatar documentation](https://patternflyelements.org/components/avatar) - -## Installation - -Load `` via CDN: - -```html - -``` - -Or, if you are using [NPM](https://npm.im), install it - -```bash -npm install @patternfly/elements -``` - -Then once installed, import it to your application: - -```js -import '@patternfly/elements/pf-v5-avatar/pf-v5-avatar.js'; -``` -## Usage - -```html - -``` diff --git a/elements/pf-v5-avatar/demo/bordered.html b/elements/pf-v5-avatar/demo/bordered.html deleted file mode 100644 index 072dfd254b..0000000000 --- a/elements/pf-v5-avatar/demo/bordered.html +++ /dev/null @@ -1,50 +0,0 @@ -
-
-
Small
-
- -
-
- -
-
Medium
-
- -
-
- -
-
Large
-
- -
-
- -
-
Extra Large
-
- -
-
-
- - - - - diff --git a/elements/pf-v5-avatar/demo/dark-border.html b/elements/pf-v5-avatar/demo/dark-border.html deleted file mode 100644 index 50f110b1e1..0000000000 --- a/elements/pf-v5-avatar/demo/dark-border.html +++ /dev/null @@ -1,49 +0,0 @@ -
-
-
Small
-
- -
-
- -
-
Medium
-
- -
-
- -
-
Large
-
- -
-
- -
-
Extra Large
-
- -
-
-
- - - - diff --git a/elements/pf-v5-avatar/demo/dark-variant.html b/elements/pf-v5-avatar/demo/dark-variant.html deleted file mode 100644 index 36dbb71eb1..0000000000 --- a/elements/pf-v5-avatar/demo/dark-variant.html +++ /dev/null @@ -1,69 +0,0 @@ -
-
-
Small
-
- -
-
- -
-
Medium
-
- -
-
- -
-
Large
-
- -
-
- -
-
Extra Large
-
- -
-
-
- - - - diff --git a/elements/pf-v5-avatar/demo/index.html b/elements/pf-v5-avatar/demo/index.html deleted file mode 100644 index b0cc5bc048..0000000000 --- a/elements/pf-v5-avatar/demo/index.html +++ /dev/null @@ -1,13 +0,0 @@ -
- -
- - - - diff --git a/elements/pf-v5-avatar/demo/sizes.html b/elements/pf-v5-avatar/demo/sizes.html deleted file mode 100644 index 1d93dbab01..0000000000 --- a/elements/pf-v5-avatar/demo/sizes.html +++ /dev/null @@ -1,49 +0,0 @@ -
-
-
Small
-
- -
-
- -
-
Medium
-
- -
-
- -
-
Large
-
- -
-
- -
-
Extra Large
-
- -
-
-
- - - - diff --git a/elements/pf-v5-avatar/docs/CHANGELOG.old.md b/elements/pf-v5-avatar/docs/CHANGELOG.old.md deleted file mode 100644 index 4a4f39449e..0000000000 --- a/elements/pf-v5-avatar/docs/CHANGELOG.old.md +++ /dev/null @@ -1,52 +0,0 @@ -# @patternfly/pfe-avatar - -## 2.0.0-next.3 - -### Major Changes - -- 21f7fa8b: Redesigned `` to bring it in line with [PatternFly v4 Avatar](https://patternfly.org/v4/components/avatar) - - The new `` has three attributes: `src`, `alt` (like ``) and - `border="dark|light"` for adding a border on dark or light backgrounds. - -## 2.0.0-next.2 - -### Patch Changes - -- bfad8b4b: Updates dependencies -- Updated dependencies [bfad8b4b] - - @patternfly/pfe-core@2.0.0-next.8 - -## 2.0.0-next.1 - -### Patch Changes - -- 447b2d75: Remove `esbuild` export condition, as this anyways was a runtime error -- Updated dependencies [447b2d75] - - @patternfly/pfe-core@2.0.0-next.3 - -## 2.0.0-next.0 - -### Major Changes - -- 216beeb8: ## 🔥 Migrate to Lit - - This release migrates `` to LitElement. - - ### NEW: CSS Shadow Parts - - - Adds `canvas` and `img` CSS parts to `` - - ### Breaking Changes - - - Initial render is now [asynchronous](https://lit.dev/docs/components/lifecycle/#reactive-update-cycle). - If your code assumes that shadow DOM is ready once the element is constructed, update it to `await element.updateComplete`; - - Deprecates `pfe-avatar:connected` event. Use `await pfeAvatar.updateComplete` instead - - Deprecates `pfe-avatar:options-shown`, `pfe-avatar:option-cleared`, `pfe-avatar:search-event`, and `pfe-avatar:option-selected` events. - - See [docs](https://patternflyelements.org/components/avatar/) for more info - -### Patch Changes - -- Updated dependencies [e8788c72] - - @patternfly/pfe-core@2.0.0-next.0 diff --git a/elements/pf-v5-avatar/docs/pf-v5-avatar.md b/elements/pf-v5-avatar/docs/pf-v5-avatar.md deleted file mode 100644 index fae6c555bf..0000000000 --- a/elements/pf-v5-avatar/docs/pf-v5-avatar.md +++ /dev/null @@ -1,28 +0,0 @@ -{% renderInstallation %} {% endrenderInstallation %} - -{% renderOverview %} - -{% endrenderOverview %} - -{% band header="Usage" %} - {% htmlexample style="display: flex; gap: 1em;" %} - - - - - {% endhtmlexample %} -{% endband %} - -{% renderSlots %}{% endrenderSlots %} - -{% renderAttributes %}{% endrenderAttributes %} - -{% renderProperties %}{% endrenderProperties %} - -{% renderMethods %}{% endrenderMethods %} - -{% renderEvents %}{% endrenderEvents %} - -{% renderCssCustomProperties %}{% endrenderCssCustomProperties %} - -{% renderCssParts %}{% endrenderCssParts %} diff --git a/elements/pf-v5-avatar/docs/screenshot.png b/elements/pf-v5-avatar/docs/screenshot.png deleted file mode 100644 index eaea2ccddc55ef771d148980dcbe9dc935e1adc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5981 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 LHTiPc4?+I}>sRC- diff --git a/elements/pf-v5-avatar/pf-v5-avatar.css b/elements/pf-v5-avatar/pf-v5-avatar.css deleted file mode 100644 index 5e36c8d8b2..0000000000 --- a/elements/pf-v5-avatar/pf-v5-avatar.css +++ /dev/null @@ -1,80 +0,0 @@ -:host { - display: inline-block; - /** Border color for avatar */ - --pf-v5-c-avatar--BorderColor: transparent; - /** Border width for avatar */ - --pf-v5-c-avatar--BorderWidth: 0; - /** Border radius for avatar */ - --pf-v5-c-avatar--BorderRadius: var(--pf-global--BorderRadius--lg, 30em); - /** Width for avatar */ - --pf-v5-c-avatar--Width: 2.25rem; - /** Height for avatar */ - --pf-v5-c-avatar--Height: 2.25rem; - /** Width for small avatar */ - --pf-v5-c-avatar--m-sm--Width: 1.5rem; - /** Height for small avatar */ - --pf-v5-c-avatar--m-sm--Height: 1.5rem; - /** Width for medium avatar */ - --pf-v5-c-avatar--m-md--Width: 2.25rem; - /** Height for medium avatar */ - --pf-v5-c-avatar--m-md--Height: 2.25rem; - /** Width for large avatar */ - --pf-v5-c-avatar--m-lg--Width: 4.5rem; - /** Height for large avatar */ - --pf-v5-c-avatar--m-lg--Height: 4.5rem; - /** Width for extra large avatar */ - --pf-v5-c-avatar--m-xl--Width: 8rem; - /** Height for extra large avatar */ - --pf-v5-c-avatar--m-xl--Height: 8rem; - --pf-v5-c-avatar--m-light--BorderColor: var(--pf-global--BorderColor--dark-100, #d2d2d2); - --pf-v5-c-avatar--m-light--BorderWidth: var(--pf-global--BorderWidth--sm, 1px); - /** Border color for dark avatar */ - --pf-v5-c-avatar--m-dark--BorderColor: var(--pf-global--palette--black-700, #4f5255); - --pf-v5-c-avatar--m-dark--BorderWidth: var(--pf-global--BorderWidth--sm, 1px); - width: var(--pf-v5-c-avatar--Width); - height: var(--pf-v5-c-avatar--Height); - border-radius: var(--pf-v5-c-avatar--BorderRadius); -} - -:host([hidden]), -[hidden] { - display: none !important; -} - -svg, -img { - display: inline; - object-fit: cover; - width: var(--pf-v5-c-avatar--Width); - height: var(--pf-v5-c-avatar--Height); - border-radius: var(--pf-v5-c-avatar--BorderRadius); - border: var(--pf-v5-c-avatar--BorderWidth) solid var(--pf-v5-c-avatar--BorderColor); -} - -:host([border]) { - --pf-v5-c-avatar--BorderWidth: var(--pf-global--BorderWidth--sm, 1px); -} - -:host([border="dark"]) { - --pf-v5-c-avatar--BorderColor: var(--pf-v5-c-avatar--m-dark--BorderColor); -} - -:host([size="sm"]) { - --pf-v5-c-avatar--Width: var(--pf-v5-c-avatar--m-sm--Width); - --pf-v5-c-avatar--Height: var(--pf-v5-c-avatar--m-sm--Height); -} - -:host([size="md"]) { - --pf-v5-c-avatar--Width: var(--pf-v5-c-avatar--m-md--Width); - --pf-v5-c-avatar--Height: var(--pf-v5-c-avatar--m-md--Height); -} - -:host([size="lg"]) { - --pf-v5-c-avatar--Width: var(--pf-v5-c-avatar--m-lg--Width); - --pf-v5-c-avatar--Height: var(--pf-v5-c-avatar--m-lg--Height); -} - -:host([size="xl"]) { - --pf-v5-c-avatar--Width: var(--pf-v5-c-avatar--m-xl--Width); - --pf-v5-c-avatar--Height: var(--pf-v5-c-avatar--m-xl--Height); -} diff --git a/elements/pf-v5-avatar/pf-v5-avatar.ts b/elements/pf-v5-avatar/pf-v5-avatar.ts deleted file mode 100644 index 27c73b2073..0000000000 --- a/elements/pf-v5-avatar/pf-v5-avatar.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { LitElement, html, type TemplateResult } from 'lit'; -import { property } from 'lit/decorators/property.js'; -import { customElement } from 'lit/decorators/custom-element.js'; - -import style from './pf-v5-avatar.css'; - -export class PfV5AvatarLoadEvent extends Event { - constructor(public originalEvent: Event) { - super('load', { bubbles: true }); - } -} - -/** - * An **avatar** is a visual used to represent a user. It may contain an image or a placeholder graphic. - * @summary For displaying a user's avatar image - * @alias Avatar - * @fires {PfV5AvatarLoadEvent} load - when the avatar loads - */ -@customElement('pf-v5-avatar') -export class PfV5Avatar extends LitElement { - static readonly styles: CSSStyleSheet[] = [style]; - - /** The URL to the user's custom avatar image. */ - @property() src?: string; - - /** The alt text for the avatar image. */ - @property({ reflect: true }) alt?: string = 'Avatar image'; - - /** Size of the Avatar */ - @property({ reflect: true }) size: 'sm' | 'md' | 'lg' | 'xl' = 'sm'; - - /** Whether to display a border around the avatar */ - @property({ reflect: true }) border?: 'light' | 'dark'; - - /** Whether or not the Avatar image is dark */ - @property({ type: Boolean, reflect: true }) dark = false; - - render(): TemplateResult<1> { - return this.src != null ? html` - ${this.alt ?? ''} - ` : this.dark ? html` - - - - - ` : html` - - - - - - `; - } - - #onLoad(event: Event) { - this.dispatchEvent(new PfV5AvatarLoadEvent(event)); - } -} - -declare global { - interface HTMLElementTagNameMap { - 'pf-v5-avatar': PfV5Avatar; - } -} diff --git a/elements/pf-v5-avatar/test/mwcz.jpg b/elements/pf-v5-avatar/test/mwcz.jpg deleted file mode 100644 index afc839dd76374b3aeb535e4d1a5f4d03cb824933..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49364 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%0AyFf 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 diff --git a/elements/pf-v5-avatar/test/pf-avatar.e2e.ts b/elements/pf-v5-avatar/test/pf-avatar.e2e.ts deleted file mode 100644 index 2271f89428..0000000000 --- a/elements/pf-v5-avatar/test/pf-avatar.e2e.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { test } from '@playwright/test'; -import { PfeDemoPage } from '@patternfly/pfe-tools/test/playwright/PfeDemoPage.js'; -import { SSRPage } from '@patternfly/pfe-tools/test/playwright/SSRPage.js'; - -const tagName = 'pf-v5-avatar'; - -test.describe(tagName, () => { - test('snapshot', async ({ page }) => { - const componentPage = new PfeDemoPage(page, tagName); - await componentPage.navigate(); - await componentPage.snapshot(); - }); - - test('ssr', async ({ browser }) => { - const fixture = new SSRPage({ - tagName, - browser, - demoDir: new URL('../demo/', import.meta.url), - importSpecifiers: [ - `@patternfly/elements/${tagName}/${tagName}.js`, - ], - }); - await fixture.snapshots(); - }); -}); diff --git a/elements/pf-v5-avatar/test/pf-avatar.spec.ts b/elements/pf-v5-avatar/test/pf-avatar.spec.ts deleted file mode 100644 index 8fd79928fd..0000000000 --- a/elements/pf-v5-avatar/test/pf-avatar.spec.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { html, expect, oneEvent, nextFrame } from '@open-wc/testing'; -import { createFixture } from '@patternfly/pfe-tools/test/create-fixture.js'; -import { PfV5Avatar, PfV5AvatarLoadEvent } from '@patternfly/elements/pf-v5-avatar/pf-v5-avatar.js'; - -describe('', function() { - it('imperatively instantiates', function() { - expect(document.createElement('pf-v5-avatar')).to.be.an.instanceof(PfV5Avatar); - }); - - it('should upgrade', async function() { - const el = await createFixture(html``); - expect(el, 'pf-v5-badge should be an instance of PfV5Avatar') - .to.be.an.instanceOf(customElements.get('pf-v5-avatar')) - .and - .to.be.an.instanceOf(PfV5Avatar); - }); - - describe('without src attr', function() { - let element: PfV5Avatar; - beforeEach(async function() { - element = await createFixture(html``); - await nextFrame(); - }); - it('loads default avatar', function() { - const { offsetWidth } = element; - expect(offsetWidth).to.be.greaterThan(0); - }); - }); - - describe('with a src attr', function() { - let element: PfV5Avatar; - let loaded: string | undefined; - const datauri = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAB0UlEQVR4Xu3UAQ0AAAyDsM+/6QspcwAh2zXawGj64K8A8AgKoABwAzh+D1AAuAEcvwcoANwAjt8DFABuAMfvAQoAN4Dj9wAFgBvA8XuAAsAN4Pg9QAHgBnD8HqAAcAM4fg9QALgBHL8HKADcAI7fAxQAbgDH7wEKADeA4/cABYAbwPF7gALADeD4PUAB4AZw/B6gAHADOH4PUAC4ARy/BygA3ACO3wMUAG4Ax+8BCgA3gOP3AAWAG8Dxe4ACwA3g+D1AAeAGcPweoABwAzh+D1AAuAEcvwcoANwAjt8DFABuAMfvAQoAN4Dj9wAFgBvA8XuAAsAN4Pg9QAHgBnD8HqAAcAM4fg9QALgBHL8HKADcAI7fAxQAbgDH7wEKADeA4/cABYAbwPF7gALADeD4PUAB4AZw/B6gAHADOH4PUAC4ARy/BygA3ACO3wMUAG4Ax+8BCgA3gOP3AAWAG8Dxe4ACwA3g+D1AAeAGcPweoABwAzh+D1AAuAEcvwcoANwAjt8DFABuAMfvAQoAN4Dj9wAFgBvA8XuAAsAN4Pg9QAHgBnD8HqAAcAM4fg9QALgBHL8HKADcAI7fAxQAbgDH7wEKADeA4/cABYAbwPF7ADyAB6SPAIFm19U7AAAAAElFTkSuQmCC'; - const onLoad = (e: PfV5AvatarLoadEvent) => { - const paths = e.originalEvent.composedPath() as HTMLImageElement[]; - loaded = paths.find(x => x.localName === 'img')?.src; - }; - beforeEach(async function() { - element = await createFixture(html``); - setTimeout(() => element.src = datauri); - await oneEvent(element, 'load'); - }); - it('loads the image', function() { - expect(loaded).to.equal(datauri); - }); - }); -}); From eef757f581fe4632670a63ee4e94e588e34504da Mon Sep 17 00:00:00 2001 From: Steven Spriggs Date: Wed, 13 May 2026 14:09:43 -0400 Subject: [PATCH 7/9] fix(avatar): correct jsdoc to cem documentation comments --- elements/pf-v6-avatar/pf-v6-avatar.css | 60 +++++++++++++++++++------- elements/pf-v6-avatar/pf-v6-avatar.ts | 15 ------- 2 files changed, 45 insertions(+), 30 deletions(-) diff --git a/elements/pf-v6-avatar/pf-v6-avatar.css b/elements/pf-v6-avatar/pf-v6-avatar.css index aeb19ce41b..89f9929a40 100644 --- a/elements/pf-v6-avatar/pf-v6-avatar.css +++ b/elements/pf-v6-avatar/pf-v6-avatar.css @@ -1,9 +1,19 @@ :host { - --_width: var(--pf-v6-c-avatar--Width, 2.25rem); - --_height: var(--pf-v6-c-avatar--Height, 2.25rem); - --_border-radius: var(--pf-v6-c-avatar--BorderRadius, var(--pf-t--global--border--radius--pill, 30em)); - --_border-color: var(--pf-v6-c-avatar--BorderColor, transparent); - --_border-width: var(--pf-v6-c-avatar--BorderWidth, 0); + --_width: + /** Width of the avatar */ + var(--pf-v6-c-avatar--Width, 2.25rem); + --_height: + /** Height of the avatar */ + var(--pf-v6-c-avatar--Height, 2.25rem); + --_border-radius: + /** Border radius of the avatar */ + var(--pf-v6-c-avatar--BorderRadius, var(--pf-t--global--border--radius--pill, 30em)); + --_border-color: + /** Border color of the avatar */ + var(--pf-v6-c-avatar--BorderColor, transparent); + --_border-width: + /** Border width of the avatar */ + var(--pf-v6-c-avatar--BorderWidth, 0); --_placeholder-bg: var(--pf-t--global--background--color--200, light-dark(var(--pf-t--color--gray--10, #f2f2f2), var(--pf-t--color--gray--80, #292929))); --_placeholder-fg: var(--pf-t--global--icon--color--subtle, light-dark(var(--pf-t--color--gray--50, #707070), var(--pf-t--color--gray--40, #a3a3a3))); @@ -19,28 +29,48 @@ } :host([bordered]) { - --_border-color: var(--pf-v6-c-avatar--m-bordered--BorderColor, var(--pf-t--global--border--color--default, #d2d2d2)); - --_border-width: var(--pf-v6-c-avatar--m-bordered--BorderWidth, var(--pf-t--global--border--width--box--default, 1px)); + --_border-color: + /** Border color when bordered */ + var(--pf-v6-c-avatar--m-bordered--BorderColor, var(--pf-t--global--border--color--default, #d2d2d2)); + --_border-width: + /** Border width when bordered */ + var(--pf-v6-c-avatar--m-bordered--BorderWidth, var(--pf-t--global--border--width--box--default, 1px)); } :host([size="sm"]) { - --_width: var(--pf-v6-c-avatar--m-sm--Width, 1.5rem); - --_height: var(--pf-v6-c-avatar--m-sm--Height, 1.5rem); + --_width: + /** Width when size is sm */ + var(--pf-v6-c-avatar--m-sm--Width, 1.5rem); + --_height: + /** Height when size is sm */ + var(--pf-v6-c-avatar--m-sm--Height, 1.5rem); } :host([size="md"]) { - --_width: var(--pf-v6-c-avatar--m-md--Width, 2.25rem); - --_height: var(--pf-v6-c-avatar--m-md--Height, 2.25rem); + --_width: + /** Width when size is md */ + var(--pf-v6-c-avatar--m-md--Width, 2.25rem); + --_height: + /** Height when size is md */ + var(--pf-v6-c-avatar--m-md--Height, 2.25rem); } :host([size="lg"]) { - --_width: var(--pf-v6-c-avatar--m-lg--Width, 4.5rem); - --_height: var(--pf-v6-c-avatar--m-lg--Height, 4.5rem); + --_width: + /** Width when size is lg */ + var(--pf-v6-c-avatar--m-lg--Width, 4.5rem); + --_height: + /** Height when size is lg */ + var(--pf-v6-c-avatar--m-lg--Height, 4.5rem); } :host([size="xl"]) { - --_width: var(--pf-v6-c-avatar--m-xl--Width, 8rem); - --_height: var(--pf-v6-c-avatar--m-xl--Height, 8rem); + --_width: + /** Width when size is xl */ + var(--pf-v6-c-avatar--m-xl--Width, 8rem); + --_height: + /** Height when size is xl */ + var(--pf-v6-c-avatar--m-xl--Height, 8rem); } svg, diff --git a/elements/pf-v6-avatar/pf-v6-avatar.ts b/elements/pf-v6-avatar/pf-v6-avatar.ts index a79e28f922..01d654fa7d 100644 --- a/elements/pf-v6-avatar/pf-v6-avatar.ts +++ b/elements/pf-v6-avatar/pf-v6-avatar.ts @@ -18,21 +18,6 @@ export class PfV6AvatarLoadEvent extends Event { * or a placeholder graphic. * @summary Displays a user's avatar image * @fires {PfV6AvatarLoadEvent} load - when the avatar image loads - * @cssprop {} --pf-v6-c-avatar--Width - Width of the avatar - * @cssprop {} --pf-v6-c-avatar--Height - Height of the avatar - * @cssprop {} --pf-v6-c-avatar--BorderRadius - Border radius of the avatar - * @cssprop {} --pf-v6-c-avatar--BorderColor - Border color of the avatar - * @cssprop {} --pf-v6-c-avatar--BorderWidth - Border width of the avatar - * @cssprop {} --pf-v6-c-avatar--m-sm--Width - Width when size is `sm` - * @cssprop {} --pf-v6-c-avatar--m-sm--Height - Height when size is `sm` - * @cssprop {} --pf-v6-c-avatar--m-md--Width - Width when size is `md` - * @cssprop {} --pf-v6-c-avatar--m-md--Height - Height when size is `md` - * @cssprop {} --pf-v6-c-avatar--m-lg--Width - Width when size is `lg` - * @cssprop {} --pf-v6-c-avatar--m-lg--Height - Height when size is `lg` - * @cssprop {} --pf-v6-c-avatar--m-xl--Width - Width when size is `xl` - * @cssprop {} --pf-v6-c-avatar--m-xl--Height - Height when size is `xl` - * @cssprop {} --pf-v6-c-avatar--m-bordered--BorderColor - Border color when bordered - * @cssprop {} --pf-v6-c-avatar--m-bordered--BorderWidth - Border width when bordered */ @customElement('pf-v6-avatar') export class PfV6Avatar extends LitElement { From 7c1346ffdd896727132c0dd4cf3a8f30931f52a8 Mon Sep 17 00:00:00 2001 From: Steven Spriggs Date: Wed, 13 May 2026 14:11:44 -0400 Subject: [PATCH 8/9] chore: add changeset --- .changeset/social-guests-wish.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .changeset/social-guests-wish.md diff --git a/.changeset/social-guests-wish.md b/.changeset/social-guests-wish.md new file mode 100644 index 0000000000..8d413c1fb1 --- /dev/null +++ b/.changeset/social-guests-wish.md @@ -0,0 +1,24 @@ +--- +"@patternfly/elements": major +--- + +✨ Added `` replacing ``. Avatar now follows +PatternFly v6 design specs. + +```html + +``` + +**Breaking Changes from v5 ** + +- Renamed tag from `` to `` +- ✨ Added `size` attribute with `sm`, `md`, `lg`, `xl` presets +- ✨ Added `bordered` boolean attribute +- ✨ Added `color-scheme` support via `light-dark()` for placeholder graphic +- ✨ Added v6 design tokens +- CSS custom properties renamed from `--pf-v5-c-avatar--*` to `--pf-v6-c-avatar--*` +- Replaced `border` attribute with `bordered` boolean attribute +- `alt` attribute no longer defaults to "Avatar image" (defaults to empty string) +- `size` attribute no longer defaults to `sm` (defaults to `unset`, renders at default +dimensions) +- Removed `dark` attribute From 1eac98a34610fc73588aef9e0d3b2f6467a6817e Mon Sep 17 00:00:00 2001 From: Steven Spriggs Date: Thu, 14 May 2026 12:20:09 -0400 Subject: [PATCH 9/9] docs(avatar): add README --- elements/pf-v6-avatar/README.md | 66 +++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 elements/pf-v6-avatar/README.md diff --git a/elements/pf-v6-avatar/README.md b/elements/pf-v6-avatar/README.md new file mode 100644 index 0000000000..cb0dfcdae3 --- /dev/null +++ b/elements/pf-v6-avatar/README.md @@ -0,0 +1,66 @@ +# Avatar + +`` displays a user's avatar image, or a placeholder graphic +when no image is provided. + +## Usage + +### Basic avatar with image + +```html + +``` + +### Placeholder (no image) + +```html + +``` + +### Bordered, large + +```html + +``` + +## Divergences from React `Avatar` + +### Changed API + +| React prop | Web component | Difference | +| ------------ | ----------------- | --------------------------------------------------------------- | +| `isBordered` | `bordered` | Boolean attribute without `is` prefix | +| `alt` | `alt` | Optional in web component (React requires it) | +| `src` | `src` | React defaults to empty string; web component renders a placeholder SVG when omitted | + +### Not implemented + +| React prop | Notes | +| ---------------------------- | ------------------------------------------------------------ | +| Native `` attributes | React spreads all `HTMLImageElement` attributes; web component only exposes `src` and `alt` | + +### Added + +| Web component API | Notes | +| ------------------------------------------ | ----------------------------------------------- | +| `load` event (`PfV6AvatarLoadEvent`) | Fires when the avatar image loads successfully | +| Placeholder SVG | Rendered automatically when `src` is not set | +| `--pf-v6-c-avatar--Width` | Avatar width (default `2.25rem`) | +| `--pf-v6-c-avatar--Height` | Avatar height (default `2.25rem`) | +| `--pf-v6-c-avatar--BorderRadius` | Border radius (default pill) | +| `--pf-v6-c-avatar--BorderColor` | Border color (default `transparent`) | +| `--pf-v6-c-avatar--BorderWidth` | Border width (default `0`) | +| `--pf-v6-c-avatar--m-bordered--BorderColor` | Border color when `bordered` is set | +| `--pf-v6-c-avatar--m-bordered--BorderWidth` | Border width when `bordered` is set (default `1px`) | +| `--pf-v6-c-avatar--m-sm--Width` | Width override for `size="sm"` (default `1.5rem`) | +| `--pf-v6-c-avatar--m-sm--Height` | Height override for `size="sm"` | +| `--pf-v6-c-avatar--m-md--Width` | Width override for `size="md"` (default `2.25rem`) | +| `--pf-v6-c-avatar--m-md--Height` | Height override for `size="md"` | +| `--pf-v6-c-avatar--m-lg--Width` | Width override for `size="lg"` (default `4.5rem`) | +| `--pf-v6-c-avatar--m-lg--Height` | Height override for `size="lg"` | +| `--pf-v6-c-avatar--m-xl--Width` | Width override for `size="xl"` (default `8rem`) | +| `--pf-v6-c-avatar--m-xl--Height` | Height override for `size="xl"` |