Skip to content

Commit

Permalink
[lit-html] styleMap fails when update contains priority directive (#3768
Browse files Browse the repository at this point in the history
)
  • Loading branch information
regevbr committed Mar 29, 2023
1 parent a4eb5e6 commit 7c1191d
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 2 deletions.
6 changes: 6 additions & 0 deletions .changeset/popular-shoes-carry.md
@@ -0,0 +1,6 @@
---
'lit-html': patch
'lit': patch
---

Fix styleMap's handling of important flags
1 change: 1 addition & 0 deletions .eslintignore
Expand Up @@ -10,6 +10,7 @@ node_modules/
.vscode/
.wireit
/temp
.idea

packages/benchmarks/generated/
packages/benchmarks/generator/build/
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -5,3 +5,4 @@ node_modules/
.vscode/
.wireit
/temp
.idea
1 change: 1 addition & 0 deletions .prettierignore
Expand Up @@ -10,6 +10,7 @@ node_modules/
.vscode/
.wireit
/temp
.idea

packages/benchmarks/generated/
packages/benchmarks/generator/build/
Expand Down
15 changes: 13 additions & 2 deletions packages/lit-html/src/directives/style-map.ts
Expand Up @@ -24,6 +24,12 @@ export interface StyleInfo {
[name: string]: string | undefined | null;
}

const important = 'important';
// The leading space is important
const importantFlag = ' !' + important;
// How many characters to remove from a value, as a negative number
const flagTrim = 0 - importantFlag.length;

class StyleMapDirective extends Directive {
_previousStyleProperties?: Set<string>;

Expand Down Expand Up @@ -95,8 +101,13 @@ class StyleMapDirective extends Directive {
const value = styleInfo[name];
if (value != null) {
this._previousStyleProperties.add(name);
if (name.includes('-')) {
style.setProperty(name, value);
const isImportant = value.endsWith(importantFlag);
if (name.includes('-') || isImportant) {
style.setProperty(
name,
isImportant ? value.slice(0, flagTrim) : value,
isImportant ? important : ''
);
} else {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(style as any)[name] = value;
Expand Down
15 changes: 15 additions & 0 deletions packages/lit-html/src/test/directives/style-map_test.ts
Expand Up @@ -133,6 +133,21 @@ suite('styleMap', () => {
assert.equal(el.style.getPropertyValue('--size'), '');
});

test('adds priority in updated properties', () => {
renderStyleMap({color: 'blue !important'});
const el = container.firstElementChild as HTMLElement;
assert.equal(el.style.getPropertyValue('color'), 'blue');
assert.equal(el.style.getPropertyPriority('color'), 'important');
renderStyleMap({color: 'green !important'});
assert.equal(el.style.getPropertyValue('color'), 'green');
assert.equal(el.style.getPropertyPriority('color'), 'important');
renderStyleMap({color: 'red'});
assert.equal(el.style.getPropertyValue('color'), 'red');
assert.equal(el.style.getPropertyPriority('color'), '');
renderStyleMap({});
assert.equal(el.style.getPropertyValue('color'), '');
});

test('works when used with the same object', () => {
const styleInfo: StyleInfo = {marginTop: '2px', 'padding-bottom': '4px'};
renderStyleMap(styleInfo);
Expand Down

0 comments on commit 7c1191d

Please sign in to comment.