Skip to content

Commit

Permalink
apply mutator to spritesheets (#1927)
Browse files Browse the repository at this point in the history
* apply mutator to spritesheets

* prettier

* Update docs/pages/resources/changelog.md

---------

Co-authored-by: Cory LaViska <cory@abeautifulsite.net>
  • Loading branch information
KonnorRogers and claviska committed Mar 25, 2024
1 parent 0ac61a6 commit 7a62a87
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 2 deletions.
3 changes: 2 additions & 1 deletion docs/pages/resources/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ New versions of Shoelace are released as-needed and generally occur when a criti

- Added the Slovenian translation [#1893]
- Added support for `contextElement` to `VirtualElements` in `<sl-popup>` [#1874]
- Fixed a bug in `.sl-scroll-lock` causing layout shifts. [#1895]
- Fixed a bug in `<sl-icon>` that did not properly apply mutators to spritesheets [#1927]
- Fixed a bug in `.sl-scroll-lock` causing layout shifts [#1895]
- Fixed a bug in `<sl-rating>` that caused the rating to not reset in some circumstances [#1877]
- Fixed a bug in `<sl-select>` that caused the menu to not close when rendered in a shadow root [#1878]
- Fixed a bug in `<sl-tree>` that caused a new stacking context resulting in tooltips being clipped [#1709]
Expand Down
14 changes: 13 additions & 1 deletion src/components/icon/icon.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,21 @@ export default class SlIcon extends ShoelaceElement {
let fileData: Response;

if (library?.spriteSheet) {
return html`<svg part="svg">
this.svg = html`<svg part="svg">
<use part="use" href="${url}"></use>
</svg>`;

// Using a templateResult requires the SVG to be written to the DOM first before we can grab the SVGElement
// to be passed to the library's mutator function.
await this.updateComplete;

const svg = this.shadowRoot!.querySelector("[part='svg']")!;

if (typeof library.mutator === 'function') {
library.mutator(svg as SVGElement);
}

return this.svg;
}

try {
Expand Down
4 changes: 4 additions & 0 deletions src/components/icon/icon.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,10 @@ describe('<sl-icon>', () => {
const rect = use?.getBoundingClientRect();
expect(rect?.width).to.equal(0);
expect(rect?.width).to.equal(0);

// Make sure the mutator is applied.
// https://github.com/shoelace-style/shoelace/issues/1925
expect(svg?.getAttribute('fill')).to.equal('currentColor');
});

// TODO: <use> svg icons don't emit a "load" or "error" event...if we can figure out how to get the event to emit errors.
Expand Down

0 comments on commit 7a62a87

Please sign in to comment.