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.
@@ -3,19 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.TOOL_ID = exports.PSEUDO_STATES = exports.EXCLUDED_PSEUDO_ELEMENTS = exports.ADDON_ID = void 0;
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.EXCLUDED_PSEUDO_ELEMENTS = EXCLUDED_PSEUDO_ELEMENTS;
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) => !isExcludedPseudoElement(selector, state) && acc.replace(new RegExp(`(?<!Y):${state}`, "g"), `.pseudo-${state}`), selector);
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].filter(Boolean);
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 => selector && !selector.includes(":not()"));
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 do this the old-fashioned way, for IE compatibility.
17
+ // before adding the new classnames. We use forEach for IE compatibility.
18
18
  const applyClasses = (element, classnames) => {
19
- element.className = element.className.split(" ").filter(classname => classname && classname.indexOf("pseudo-") !== 0).concat(...classnames).join(" ");
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
- const element = document.getElementById(viewMode === "docs" ? `story--${id}` : `root`);
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, viewMode]);
94
+ }, [canvasElement, globals, parameter]);
92
95
  return StoryFn();
93
96
  };
94
97
 
@@ -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, EXCLUDED_PSEUDO_ELEMENTS } from "./constants";
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) => !isExcludedPseudoElement(selector, state) && acc.replace(new RegExp(`(?<!Y):${state}`, "g"), `.pseudo-${state}`), selector);
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].filter(Boolean);
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 => selector && !selector.includes(":not()"));
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 do this the old-fashioned way, for IE compatibility.
10
+ // before adding the new classnames. We use forEach for IE compatibility.
11
11
  const applyClasses = (element, classnames) => {
12
- element.className = element.className.split(" ").filter(classname => classname && classname.indexOf("pseudo-") !== 0).concat(...classnames).join(" ");
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
- const element = document.getElementById(viewMode === "docs" ? `story--${id}` : `root`);
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, viewMode]);
87
+ }, [canvasElement, globals, parameter]);
85
88
  return StoryFn();
86
89
  };
87
90
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "storybook-addon-pseudo-states",
3
- "version": "1.15.2--canary.45.85eb83a.0",
3
+ "version": "1.15.2--canary.f030ea1.0",
4
4
  "description": "CSS pseudo states for Storybook",
5
5
  "keywords": [
6
6
  "storybook-addons",