storybook-addon-pseudo-states 1.15.2--canary.45.85eb83a.0 → 1.15.2--canary.f030ea1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/constants.js +2 -7
- package/dist/cjs/rewriteStyleSheet.js +3 -4
- package/dist/cjs/rewriteStyleSheet.test.js +0 -6
- package/dist/cjs/withPseudoState.js +8 -5
- package/dist/esm/constants.js +0 -4
- package/dist/esm/rewriteStyleSheet.js +4 -5
- package/dist/esm/rewriteStyleSheet.test.js +0 -6
- package/dist/esm/withPseudoState.js +8 -5
- package/package.json +1 -1
package/dist/cjs/constants.js
CHANGED
|
@@ -3,19 +3,14 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.TOOL_ID = exports.PSEUDO_STATES = exports.
|
|
6
|
+
exports.TOOL_ID = exports.PSEUDO_STATES = exports.ADDON_ID = void 0;
|
|
7
7
|
const ADDON_ID = "storybook/pseudo-states";
|
|
8
8
|
exports.ADDON_ID = ADDON_ID;
|
|
9
9
|
const TOOL_ID = `${ADDON_ID}/tool`;
|
|
10
10
|
|
|
11
|
-
// Pseudo-elements which are not allowed to have classes applied on them
|
|
12
|
-
// E.g. ::-webkit-scrollbar-thumb.pseudo-hover is not a valid selector
|
|
13
|
-
exports.TOOL_ID = TOOL_ID;
|
|
14
|
-
const EXCLUDED_PSEUDO_ELEMENTS = ["::-webkit-scrollbar-thumb"];
|
|
15
|
-
|
|
16
11
|
// Dynamic pseudo-classes
|
|
17
12
|
// @see https://www.w3.org/TR/2018/REC-selectors-3-20181106/#dynamic-pseudos
|
|
18
|
-
exports.
|
|
13
|
+
exports.TOOL_ID = TOOL_ID;
|
|
19
14
|
const PSEUDO_STATES = {
|
|
20
15
|
hover: "hover",
|
|
21
16
|
active: "active",
|
|
@@ -16,7 +16,6 @@ const warnOnce = message => {
|
|
|
16
16
|
console.warn(message);
|
|
17
17
|
warnings.add(message);
|
|
18
18
|
};
|
|
19
|
-
const isExcludedPseudoElement = (selector, pseudoState) => _constants.EXCLUDED_PSEUDO_ELEMENTS.some(element => selector.endsWith(`${element}:${pseudoState}`));
|
|
20
19
|
const rewriteRule = (cssText, selectorText, shadowRoot) => {
|
|
21
20
|
return cssText.replace(selectorText, (0, _splitSelectors.splitSelectors)(selectorText).flatMap(selector => {
|
|
22
21
|
if (selector.includes(".pseudo-")) {
|
|
@@ -30,12 +29,12 @@ const rewriteRule = (cssText, selectorText, shadowRoot) => {
|
|
|
30
29
|
states.push(state);
|
|
31
30
|
return "";
|
|
32
31
|
});
|
|
33
|
-
const classSelector = states.reduce((acc, state) =>
|
|
32
|
+
const classSelector = states.reduce((acc, state) => acc.replace(new RegExp(`:${state}`, "g"), `.pseudo-${state}`), selector);
|
|
34
33
|
if (selector.startsWith(":host(") || selector.startsWith("::slotted(")) {
|
|
35
|
-
return [selector, classSelector]
|
|
34
|
+
return [selector, classSelector];
|
|
36
35
|
}
|
|
37
36
|
const ancestorSelector = shadowRoot ? `:host(${states.map(s => `.pseudo-${s}`).join("")}) ${plainSelector}` : `${states.map(s => `.pseudo-${s}`).join("")} ${plainSelector}`;
|
|
38
|
-
return [selector, classSelector, ancestorSelector].filter(selector =>
|
|
37
|
+
return [selector, classSelector, ancestorSelector].filter(selector => !selector.includes(":not()"));
|
|
39
38
|
}).join(", "));
|
|
40
39
|
};
|
|
41
40
|
|
|
@@ -30,12 +30,6 @@ describe("rewriteStyleSheet", () => {
|
|
|
30
30
|
(0, _rewriteStyleSheet.rewriteStyleSheet)(sheet);
|
|
31
31
|
expect(sheet.cssRules[0]).toContain(".pseudo-hover a");
|
|
32
32
|
});
|
|
33
|
-
it("does not add .pseudo-<class> to pseudo-class, which does not support classes", () => {
|
|
34
|
-
const sheet = new Sheet("::-webkit-scrollbar-thumb:hover { border-color: transparent; }");
|
|
35
|
-
(0, _rewriteStyleSheet.rewriteStyleSheet)(sheet);
|
|
36
|
-
console.log(sheet.cssRules[0]);
|
|
37
|
-
expect(sheet.cssRules[0]).not.toContain("::-webkit-scrollbar-thumb.pseudo-hover");
|
|
38
|
-
});
|
|
39
33
|
it("adds alternative selector for each pseudo selector", () => {
|
|
40
34
|
const sheet = new Sheet("a:hover, a:focus { color: red }");
|
|
41
35
|
(0, _rewriteStyleSheet.rewriteStyleSheet)(sheet);
|
|
@@ -14,9 +14,10 @@ const channel = _addons.addons.getChannel();
|
|
|
14
14
|
const shadowHosts = new Set();
|
|
15
15
|
|
|
16
16
|
// Drops any existing pseudo state classnames that carried over from a previously viewed story
|
|
17
|
-
// before adding the new classnames. We
|
|
17
|
+
// before adding the new classnames. We use forEach for IE compatibility.
|
|
18
18
|
const applyClasses = (element, classnames) => {
|
|
19
|
-
|
|
19
|
+
Object.values(_constants.PSEUDO_STATES).forEach(state => element.classList.remove(`pseudo-${state}`));
|
|
20
|
+
classnames.forEach(classname => element.classList.add(classname));
|
|
20
21
|
};
|
|
21
22
|
const applyParameter = (rootElement, parameter) => {
|
|
22
23
|
const map = new Map([[rootElement, new Set()]]);
|
|
@@ -66,6 +67,9 @@ const withPseudoState = (StoryFn, _ref2) => {
|
|
|
66
67
|
const {
|
|
67
68
|
pseudo: globals
|
|
68
69
|
} = globalsArgs;
|
|
70
|
+
const canvasElement = viewMode === "docs" ? document.getElementById(`story--${id}`) : document.getElementById("storybook-root") ||
|
|
71
|
+
// Storybook 7.0+
|
|
72
|
+
document.getElementById("root");
|
|
69
73
|
|
|
70
74
|
// Sync parameter to globals, used by the toolbar (only in canvas as this
|
|
71
75
|
// doesn't make sense for docs because many stories are displayed at once)
|
|
@@ -83,12 +87,11 @@ const withPseudoState = (StoryFn, _ref2) => {
|
|
|
83
87
|
// Then update each shadow host to redetermine its own pseudo classnames.
|
|
84
88
|
(0, _addons.useEffect)(() => {
|
|
85
89
|
const timeout = setTimeout(() => {
|
|
86
|
-
|
|
87
|
-
applyParameter(element, globals || parameter);
|
|
90
|
+
applyParameter(canvasElement, globals || parameter);
|
|
88
91
|
shadowHosts.forEach(updateShadowHost);
|
|
89
92
|
}, 0);
|
|
90
93
|
return () => clearTimeout(timeout);
|
|
91
|
-
}, [globals, parameter
|
|
94
|
+
}, [canvasElement, globals, parameter]);
|
|
92
95
|
return StoryFn();
|
|
93
96
|
};
|
|
94
97
|
|
package/dist/esm/constants.js
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
export const ADDON_ID = "storybook/pseudo-states";
|
|
2
2
|
export const TOOL_ID = `${ADDON_ID}/tool`;
|
|
3
3
|
|
|
4
|
-
// Pseudo-elements which are not allowed to have classes applied on them
|
|
5
|
-
// E.g. ::-webkit-scrollbar-thumb.pseudo-hover is not a valid selector
|
|
6
|
-
export const EXCLUDED_PSEUDO_ELEMENTS = ["::-webkit-scrollbar-thumb"];
|
|
7
|
-
|
|
8
4
|
// Dynamic pseudo-classes
|
|
9
5
|
// @see https://www.w3.org/TR/2018/REC-selectors-3-20181106/#dynamic-pseudos
|
|
10
6
|
export const PSEUDO_STATES = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PSEUDO_STATES
|
|
1
|
+
import { PSEUDO_STATES } from "./constants";
|
|
2
2
|
import { splitSelectors } from "./splitSelectors";
|
|
3
3
|
const pseudoStates = Object.values(PSEUDO_STATES);
|
|
4
4
|
const matchOne = new RegExp(`:(${pseudoStates.join("|")})`);
|
|
@@ -10,7 +10,6 @@ const warnOnce = message => {
|
|
|
10
10
|
console.warn(message);
|
|
11
11
|
warnings.add(message);
|
|
12
12
|
};
|
|
13
|
-
const isExcludedPseudoElement = (selector, pseudoState) => EXCLUDED_PSEUDO_ELEMENTS.some(element => selector.endsWith(`${element}:${pseudoState}`));
|
|
14
13
|
const rewriteRule = (cssText, selectorText, shadowRoot) => {
|
|
15
14
|
return cssText.replace(selectorText, splitSelectors(selectorText).flatMap(selector => {
|
|
16
15
|
if (selector.includes(".pseudo-")) {
|
|
@@ -24,12 +23,12 @@ const rewriteRule = (cssText, selectorText, shadowRoot) => {
|
|
|
24
23
|
states.push(state);
|
|
25
24
|
return "";
|
|
26
25
|
});
|
|
27
|
-
const classSelector = states.reduce((acc, state) =>
|
|
26
|
+
const classSelector = states.reduce((acc, state) => acc.replace(new RegExp(`:${state}`, "g"), `.pseudo-${state}`), selector);
|
|
28
27
|
if (selector.startsWith(":host(") || selector.startsWith("::slotted(")) {
|
|
29
|
-
return [selector, classSelector]
|
|
28
|
+
return [selector, classSelector];
|
|
30
29
|
}
|
|
31
30
|
const ancestorSelector = shadowRoot ? `:host(${states.map(s => `.pseudo-${s}`).join("")}) ${plainSelector}` : `${states.map(s => `.pseudo-${s}`).join("")} ${plainSelector}`;
|
|
32
|
-
return [selector, classSelector, ancestorSelector].filter(selector =>
|
|
31
|
+
return [selector, classSelector, ancestorSelector].filter(selector => !selector.includes(":not()"));
|
|
33
32
|
}).join(", "));
|
|
34
33
|
};
|
|
35
34
|
|
|
@@ -28,12 +28,6 @@ describe("rewriteStyleSheet", () => {
|
|
|
28
28
|
rewriteStyleSheet(sheet);
|
|
29
29
|
expect(sheet.cssRules[0]).toContain(".pseudo-hover a");
|
|
30
30
|
});
|
|
31
|
-
it("does not add .pseudo-<class> to pseudo-class, which does not support classes", () => {
|
|
32
|
-
const sheet = new Sheet("::-webkit-scrollbar-thumb:hover { border-color: transparent; }");
|
|
33
|
-
rewriteStyleSheet(sheet);
|
|
34
|
-
console.log(sheet.cssRules[0]);
|
|
35
|
-
expect(sheet.cssRules[0]).not.toContain("::-webkit-scrollbar-thumb.pseudo-hover");
|
|
36
|
-
});
|
|
37
31
|
it("adds alternative selector for each pseudo selector", () => {
|
|
38
32
|
const sheet = new Sheet("a:hover, a:focus { color: red }");
|
|
39
33
|
rewriteStyleSheet(sheet);
|
|
@@ -7,9 +7,10 @@ const channel = addons.getChannel();
|
|
|
7
7
|
const shadowHosts = new Set();
|
|
8
8
|
|
|
9
9
|
// Drops any existing pseudo state classnames that carried over from a previously viewed story
|
|
10
|
-
// before adding the new classnames. We
|
|
10
|
+
// before adding the new classnames. We use forEach for IE compatibility.
|
|
11
11
|
const applyClasses = (element, classnames) => {
|
|
12
|
-
|
|
12
|
+
Object.values(PSEUDO_STATES).forEach(state => element.classList.remove(`pseudo-${state}`));
|
|
13
|
+
classnames.forEach(classname => element.classList.add(classname));
|
|
13
14
|
};
|
|
14
15
|
const applyParameter = (rootElement, parameter) => {
|
|
15
16
|
const map = new Map([[rootElement, new Set()]]);
|
|
@@ -59,6 +60,9 @@ export const withPseudoState = (StoryFn, _ref2) => {
|
|
|
59
60
|
const {
|
|
60
61
|
pseudo: globals
|
|
61
62
|
} = globalsArgs;
|
|
63
|
+
const canvasElement = viewMode === "docs" ? document.getElementById(`story--${id}`) : document.getElementById("storybook-root") ||
|
|
64
|
+
// Storybook 7.0+
|
|
65
|
+
document.getElementById("root");
|
|
62
66
|
|
|
63
67
|
// Sync parameter to globals, used by the toolbar (only in canvas as this
|
|
64
68
|
// doesn't make sense for docs because many stories are displayed at once)
|
|
@@ -76,12 +80,11 @@ export const withPseudoState = (StoryFn, _ref2) => {
|
|
|
76
80
|
// Then update each shadow host to redetermine its own pseudo classnames.
|
|
77
81
|
useEffect(() => {
|
|
78
82
|
const timeout = setTimeout(() => {
|
|
79
|
-
|
|
80
|
-
applyParameter(element, globals || parameter);
|
|
83
|
+
applyParameter(canvasElement, globals || parameter);
|
|
81
84
|
shadowHosts.forEach(updateShadowHost);
|
|
82
85
|
}, 0);
|
|
83
86
|
return () => clearTimeout(timeout);
|
|
84
|
-
}, [globals, parameter
|
|
87
|
+
}, [canvasElement, globals, parameter]);
|
|
85
88
|
return StoryFn();
|
|
86
89
|
};
|
|
87
90
|
|