storybook-addon-pseudo-states 1.0.0 → 1.0.2

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/.babelrc.js CHANGED
@@ -1,3 +1,14 @@
1
+ const modules = process.env.BABEL_ESM === 'true' ? false : 'auto';
2
+
1
3
  module.exports = {
2
- presets: ["@babel/preset-env", "@babel/preset-react"],
4
+ presets: [
5
+ [
6
+ "@babel/preset-env",
7
+ {
8
+ targets: 'defaults',
9
+ modules
10
+ }
11
+ ],
12
+ "@babel/preset-react"
13
+ ],
3
14
  }
package/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ # v1.0.0 (Fri Mar 11 2022)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - Add support for custom elements using `:host(:hover)` like styling. [#17](https://github.com/chromaui/storybook-addon-pseudo-states/pull/17) (jeroen.zwartepoorte@iddinkgroup.com [@ghengeveld](https://github.com/ghengeveld))
6
+ - Setup auto [#7](https://github.com/chromaui/storybook-addon-pseudo-states/pull/7) ([@ghengeveld](https://github.com/ghengeveld))
7
+
8
+ #### ⚠️ Pushed to `main`
9
+
10
+ - Upgrade Storybook ([@ghengeveld](https://github.com/ghengeveld))
11
+ - Ignore .env file ([@ghengeveld](https://github.com/ghengeveld))
12
+
13
+ #### Authors: 2
14
+
15
+ - Gert Hengeveld ([@ghengeveld](https://github.com/ghengeveld))
16
+ - Jeroen Zwartepoorte ([@jpzwarte](https://github.com/jpzwarte))
17
+
18
+ ---
19
+
1
20
  # v1.0.0 (Sat Feb 27 2021)
2
21
 
3
22
  #### 🐛 Bug Fix
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
4
 
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
@@ -17,13 +17,13 @@ var _theming = require("@storybook/theming");
17
17
 
18
18
  var _constants = require("./constants");
19
19
 
20
- function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
20
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
21
21
 
22
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
22
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
23
23
 
24
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
24
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
25
25
 
26
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
26
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
27
27
 
28
28
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
29
29
 
@@ -35,7 +35,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
35
35
 
36
36
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
37
37
 
38
- function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
38
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
39
39
 
40
40
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
41
41
 
@@ -76,18 +76,18 @@ var PseudoStateTool = function PseudoStateTool() {
76
76
  });
77
77
  };
78
78
  }, [pseudo, getValue]);
79
- return /*#__PURE__*/_react["default"].createElement(_components.WithTooltip, {
79
+ return /*#__PURE__*/_react.default.createElement(_components.WithTooltip, {
80
80
  placement: "top",
81
81
  trigger: "click",
82
82
  tooltip: function tooltip() {
83
- return /*#__PURE__*/_react["default"].createElement(_components.TooltipLinkList, {
83
+ return /*#__PURE__*/_react.default.createElement(_components.TooltipLinkList, {
84
84
  links: options.map(function (option) {
85
85
  return {
86
86
  id: option,
87
- title: /*#__PURE__*/_react["default"].createElement(LinkTitle, {
87
+ title: /*#__PURE__*/_react.default.createElement(LinkTitle, {
88
88
  active: getValue(option)
89
89
  }, ":", _constants.PSEUDO_STATES[option]),
90
- right: /*#__PURE__*/_react["default"].createElement(LinkIcon, {
90
+ right: /*#__PURE__*/_react.default.createElement(LinkIcon, {
91
91
  icon: "check",
92
92
  width: 12,
93
93
  height: 12,
@@ -99,11 +99,11 @@ var PseudoStateTool = function PseudoStateTool() {
99
99
  })
100
100
  });
101
101
  }
102
- }, /*#__PURE__*/_react["default"].createElement(_components.IconButton, {
102
+ }, /*#__PURE__*/_react.default.createElement(_components.IconButton, {
103
103
  key: "pseudo-state",
104
104
  title: "Select CSS pseudo states",
105
105
  active: hasSelection
106
- }, /*#__PURE__*/_react["default"].createElement(_components.Icons, {
106
+ }, /*#__PURE__*/_react.default.createElement(_components.Icons, {
107
107
  icon: "button"
108
108
  })));
109
109
  };
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.PSEUDO_STATES = exports.TOOL_ID = exports.ADDON_ID = void 0;
6
+ exports.TOOL_ID = exports.PSEUDO_STATES = exports.ADDON_ID = void 0;
7
7
  var ADDON_ID = "storybook/pseudo-states";
8
8
  exports.ADDON_ID = ADDON_ID;
9
9
  var TOOL_ID = "".concat(ADDON_ID, "/tool"); // Dynamic pseudo-classes
File without changes
File without changes
@@ -11,19 +11,19 @@ var _coreEvents = require("@storybook/core-events");
11
11
 
12
12
  var _constants = require("./constants");
13
13
 
14
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
14
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
15
15
 
16
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
16
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
17
17
 
18
18
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
19
19
 
20
- function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
20
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
21
21
 
22
22
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
23
23
 
24
24
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
25
25
 
26
- function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
26
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
27
27
 
28
28
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
29
29
 
@@ -33,7 +33,7 @@ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread n
33
33
 
34
34
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
35
35
 
36
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
36
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
37
37
 
38
38
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
39
39
 
@@ -123,13 +123,24 @@ var warnOnce = function warnOnce(message) {
123
123
 
124
124
 
125
125
  function rewriteStyleSheets(shadowRoot) {
126
- var _iterator = _createForOfIteratorHelper((shadowRoot || document).styleSheets),
126
+ var _shadowRoot$adoptedSt;
127
+
128
+ var styleSheets = shadowRoot ? shadowRoot.styleSheets : document.styleSheets;
129
+ if (shadowRoot !== null && shadowRoot !== void 0 && (_shadowRoot$adoptedSt = shadowRoot.adoptedStyleSheets) !== null && _shadowRoot$adoptedSt !== void 0 && _shadowRoot$adoptedSt.length) styleSheets = shadowRoot.adoptedStyleSheets;
130
+
131
+ var _iterator = _createForOfIteratorHelper(styleSheets),
127
132
  _step;
128
133
 
129
134
  try {
130
135
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
131
136
  var sheet = _step.value;
132
137
 
138
+ if (sheet._pseudoStatesRewritten) {
139
+ continue;
140
+ } else {
141
+ sheet._pseudoStatesRewritten = true;
142
+ }
143
+
133
144
  try {
134
145
  var index = 0;
135
146
 
@@ -147,10 +158,25 @@ function rewriteStyleSheets(shadowRoot) {
147
158
  if (selector.includes(".pseudo-")) return [];
148
159
  var states = [];
149
160
  var plainSelector = selector.replace(matchAll, function (_, state) {
150
- states.push(".pseudo-".concat(state));
161
+ states.push(state);
151
162
  return "";
152
163
  });
153
- var stateSelector = shadowRoot ? ":host(".concat(states.join(""), ") ").concat(plainSelector) : "".concat(states.join(""), " ").concat(plainSelector);
164
+ var stateSelector;
165
+
166
+ if (selector.startsWith(":host(")) {
167
+ stateSelector = states.reduce(function (acc, state) {
168
+ return acc.replaceAll(":".concat(state), ".pseudo-".concat(state));
169
+ }, selector);
170
+ } else if (shadowRoot) {
171
+ stateSelector = ":host(".concat(states.map(function (s) {
172
+ return ".pseudo-".concat(s);
173
+ }).join(""), ") ").concat(plainSelector);
174
+ } else {
175
+ stateSelector = "".concat(states.map(function (s) {
176
+ return ".pseudo-".concat(s);
177
+ }).join(""), " ").concat(plainSelector);
178
+ }
179
+
154
180
  return [selector, stateSelector];
155
181
  }).join(", "));
156
182
  sheet.deleteRule(index);
@@ -0,0 +1,89 @@
1
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
+
3
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
+
5
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+
7
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
8
+
9
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
10
+
11
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
12
+
13
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
14
+
15
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
16
+
17
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
18
+
19
+ import React, { useCallback, useMemo } from "react";
20
+ import { useGlobals } from "@storybook/api";
21
+ import { Icons, IconButton, WithTooltip, TooltipLinkList } from "@storybook/components";
22
+ import { styled, color } from "@storybook/theming";
23
+ import { PSEUDO_STATES } from "./constants";
24
+ var LinkTitle = styled.span(function (_ref) {
25
+ var active = _ref.active;
26
+ return {
27
+ color: active ? color.secondary : "inherit"
28
+ };
29
+ });
30
+ var LinkIcon = styled(Icons)(function (_ref2) {
31
+ var active = _ref2.active;
32
+ return {
33
+ opacity: active ? 1 : 0,
34
+ path: {
35
+ fill: active ? color.secondary : "inherit"
36
+ }
37
+ };
38
+ });
39
+ var options = Object.keys(PSEUDO_STATES).sort();
40
+ export var PseudoStateTool = function PseudoStateTool() {
41
+ var _useGlobals = useGlobals(),
42
+ _useGlobals2 = _slicedToArray(_useGlobals, 2),
43
+ pseudo = _useGlobals2[0].pseudo,
44
+ updateGlobals = _useGlobals2[1];
45
+
46
+ var hasSelection = useMemo(function () {
47
+ return !!pseudo && Object.values(pseudo).includes(true);
48
+ }, [pseudo]);
49
+ var getValue = useCallback(function (option) {
50
+ return pseudo ? pseudo[option] : false;
51
+ }, [pseudo]);
52
+ var toggleOption = useCallback(function (option) {
53
+ return function () {
54
+ return updateGlobals({
55
+ pseudo: _objectSpread(_objectSpread({}, pseudo), {}, _defineProperty({}, option, !getValue(option)))
56
+ });
57
+ };
58
+ }, [pseudo, getValue]);
59
+ return /*#__PURE__*/React.createElement(WithTooltip, {
60
+ placement: "top",
61
+ trigger: "click",
62
+ tooltip: function tooltip() {
63
+ return /*#__PURE__*/React.createElement(TooltipLinkList, {
64
+ links: options.map(function (option) {
65
+ return {
66
+ id: option,
67
+ title: /*#__PURE__*/React.createElement(LinkTitle, {
68
+ active: getValue(option)
69
+ }, ":", PSEUDO_STATES[option]),
70
+ right: /*#__PURE__*/React.createElement(LinkIcon, {
71
+ icon: "check",
72
+ width: 12,
73
+ height: 12,
74
+ active: getValue(option)
75
+ }),
76
+ onClick: toggleOption(option),
77
+ active: getValue(option)
78
+ };
79
+ })
80
+ });
81
+ }
82
+ }, /*#__PURE__*/React.createElement(IconButton, {
83
+ key: "pseudo-state",
84
+ title: "Select CSS pseudo states",
85
+ active: hasSelection
86
+ }, /*#__PURE__*/React.createElement(Icons, {
87
+ icon: "button"
88
+ })));
89
+ };
@@ -0,0 +1,15 @@
1
+ export var ADDON_ID = "storybook/pseudo-states";
2
+ export var TOOL_ID = "".concat(ADDON_ID, "/tool"); // Dynamic pseudo-classes
3
+ // @see https://www.w3.org/TR/2018/REC-selectors-3-20181106/#dynamic-pseudos
4
+
5
+ export var PSEUDO_STATES = {
6
+ hover: "hover",
7
+ active: "active",
8
+ focusVisible: "focus-visible",
9
+ focusWithin: "focus-within",
10
+ focus: "focus",
11
+ // must come after its alternatives
12
+ visited: "visited",
13
+ link: "link",
14
+ target: "target"
15
+ };
@@ -0,0 +1,14 @@
1
+ import { addons, types } from "@storybook/addons";
2
+ import { ADDON_ID, TOOL_ID } from "../constants";
3
+ import { PseudoStateTool } from "../PseudoStateTool";
4
+ addons.register(ADDON_ID, function () {
5
+ addons.add(TOOL_ID, {
6
+ type: types.TOOL,
7
+ title: "CSS pseudo states",
8
+ match: function match(_ref) {
9
+ var viewMode = _ref.viewMode;
10
+ return viewMode === "story";
11
+ },
12
+ render: PseudoStateTool
13
+ });
14
+ });
@@ -0,0 +1,2 @@
1
+ import { withPseudoState } from "../withPseudoState";
2
+ export var decorators = [withPseudoState];
@@ -0,0 +1,224 @@
1
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
+
3
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
+
5
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+
7
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
8
+
9
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
10
+
11
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
12
+
13
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
14
+
15
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
16
+
17
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
18
+
19
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
20
+
21
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
22
+
23
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
24
+
25
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
26
+
27
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
28
+
29
+ /* eslint-env browser */
30
+ import { addons, useEffect, useGlobals, useParameter } from "@storybook/addons";
31
+ import { STORY_CHANGED, STORY_RENDERED } from "@storybook/core-events";
32
+ import { PSEUDO_STATES } from "./constants";
33
+ var pseudoStates = Object.values(PSEUDO_STATES);
34
+ var matchOne = new RegExp(":(".concat(pseudoStates.join("|"), ")"));
35
+ var matchAll = new RegExp(":(".concat(pseudoStates.join("|"), ")"), "g"); // Drops any existing pseudo state classnames that carried over from a previously viewed story
36
+ // before adding the new classnames. We do this the old-fashioned way, for IE compatibility.
37
+
38
+ var applyClasses = function applyClasses(element, classnames) {
39
+ var _element$className$sp;
40
+
41
+ element.className = (_element$className$sp = element.className.split(" ").filter(function (classname) {
42
+ return classname && classname.indexOf("pseudo-") !== 0;
43
+ })).concat.apply(_element$className$sp, _toConsumableArray(classnames)).join(" ");
44
+ }; // Traverses ancestry to collect relevant pseudo classnames, and applies them to the shadow host.
45
+ // Shadow DOM can only access classes on its host. Traversing is needed to mimic the CSS cascade.
46
+
47
+
48
+ var updateShadowHost = function updateShadowHost(shadowHost) {
49
+ var classnames = new Set();
50
+
51
+ for (var element = shadowHost.parentElement; element; element = element.parentElement) {
52
+ if (!element.className) continue;
53
+ element.className.split(" ").filter(function (classname) {
54
+ return classname.indexOf("pseudo-") === 0;
55
+ }).forEach(function (classname) {
56
+ return classnames.add(classname);
57
+ });
58
+ }
59
+
60
+ applyClasses(shadowHost, classnames);
61
+ }; // Keep track of attached shadow host elements for the current story
62
+
63
+
64
+ var shadowHosts = new Set();
65
+ addons.getChannel().on(STORY_CHANGED, function () {
66
+ return shadowHosts.clear();
67
+ }); // Global decorator that rewrites stylesheets and applies classnames to render pseudo styles
68
+
69
+ export var withPseudoState = function withPseudoState(StoryFn) {
70
+ var parameter = useParameter("pseudo");
71
+
72
+ var _useGlobals = useGlobals(),
73
+ _useGlobals2 = _slicedToArray(_useGlobals, 2),
74
+ globals = _useGlobals2[0].pseudo,
75
+ updateGlobals = _useGlobals2[1]; // Sync parameter to globals, used by the toolbar
76
+
77
+
78
+ useEffect(function () {
79
+ if (parameter !== globals) updateGlobals({
80
+ pseudo: parameter
81
+ });
82
+ }, [parameter]); // Convert selected states to classnames and apply them to the story root element.
83
+ // Then update each shadow host to redetermine its own pseudo classnames.
84
+
85
+ useEffect(function () {
86
+ applyClasses(document.getElementById("root"), Object.entries(globals || {}).filter(function (_ref) {
87
+ var _ref2 = _slicedToArray(_ref, 2),
88
+ _ = _ref2[0],
89
+ value = _ref2[1];
90
+
91
+ return value;
92
+ }).map(function (_ref3) {
93
+ var _ref4 = _slicedToArray(_ref3, 1),
94
+ key = _ref4[0];
95
+
96
+ return "pseudo-".concat(PSEUDO_STATES[key]);
97
+ }));
98
+ shadowHosts.forEach(updateShadowHost);
99
+ }, [globals]);
100
+ return StoryFn();
101
+ };
102
+ var warnings = new Set();
103
+
104
+ var warnOnce = function warnOnce(message) {
105
+ if (warnings.has(message)) return; // eslint-disable-next-line no-console
106
+
107
+ console.warn(message);
108
+ warnings.add(message);
109
+ }; // Rewrite CSS rules for pseudo-states on all stylesheets to add an alternative selector
110
+
111
+
112
+ function rewriteStyleSheets(shadowRoot) {
113
+ var _shadowRoot$adoptedSt;
114
+
115
+ var styleSheets = shadowRoot ? shadowRoot.styleSheets : document.styleSheets;
116
+ if (shadowRoot !== null && shadowRoot !== void 0 && (_shadowRoot$adoptedSt = shadowRoot.adoptedStyleSheets) !== null && _shadowRoot$adoptedSt !== void 0 && _shadowRoot$adoptedSt.length) styleSheets = shadowRoot.adoptedStyleSheets;
117
+
118
+ var _iterator = _createForOfIteratorHelper(styleSheets),
119
+ _step;
120
+
121
+ try {
122
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
123
+ var sheet = _step.value;
124
+
125
+ if (sheet._pseudoStatesRewritten) {
126
+ continue;
127
+ } else {
128
+ sheet._pseudoStatesRewritten = true;
129
+ }
130
+
131
+ try {
132
+ var index = 0;
133
+
134
+ var _iterator2 = _createForOfIteratorHelper(sheet.cssRules),
135
+ _step2;
136
+
137
+ try {
138
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
139
+ var _step2$value = _step2.value,
140
+ cssText = _step2$value.cssText,
141
+ selectorText = _step2$value.selectorText;
142
+
143
+ if (matchOne.test(selectorText)) {
144
+ var newRule = cssText.replace(selectorText, selectorText.split(", ").flatMap(function (selector) {
145
+ if (selector.includes(".pseudo-")) return [];
146
+ var states = [];
147
+ var plainSelector = selector.replace(matchAll, function (_, state) {
148
+ states.push(state);
149
+ return "";
150
+ });
151
+ var stateSelector;
152
+
153
+ if (selector.startsWith(":host(")) {
154
+ stateSelector = states.reduce(function (acc, state) {
155
+ return acc.replaceAll(":".concat(state), ".pseudo-".concat(state));
156
+ }, selector);
157
+ } else if (shadowRoot) {
158
+ stateSelector = ":host(".concat(states.map(function (s) {
159
+ return ".pseudo-".concat(s);
160
+ }).join(""), ") ").concat(plainSelector);
161
+ } else {
162
+ stateSelector = "".concat(states.map(function (s) {
163
+ return ".pseudo-".concat(s);
164
+ }).join(""), " ").concat(plainSelector);
165
+ }
166
+
167
+ return [selector, stateSelector];
168
+ }).join(", "));
169
+ sheet.deleteRule(index);
170
+ sheet.insertRule(newRule, index);
171
+ if (shadowRoot) shadowHosts.add(shadowRoot.host);
172
+ }
173
+
174
+ index++;
175
+
176
+ if (index > 1000) {
177
+ warnOnce("Reached maximum of 1000 pseudo selectors per sheet, skipping the rest.");
178
+ break;
179
+ }
180
+ }
181
+ } catch (err) {
182
+ _iterator2.e(err);
183
+ } finally {
184
+ _iterator2.f();
185
+ }
186
+ } catch (e) {
187
+ if (e.toString().includes("cssRules")) {
188
+ warnOnce("Can't access cssRules, likely due to CORS restrictions: ".concat(sheet.href));
189
+ } else {
190
+ // eslint-disable-next-line no-console
191
+ console.error(e, sheet.href);
192
+ }
193
+ }
194
+ }
195
+ } catch (err) {
196
+ _iterator.e(err);
197
+ } finally {
198
+ _iterator.f();
199
+ }
200
+ } // Reinitialize CSS enhancements every time the story changes
201
+
202
+
203
+ addons.getChannel().on(STORY_RENDERED, function () {
204
+ return rewriteStyleSheets();
205
+ }); // IE doesn't support shadow DOM
206
+
207
+ if (Element.prototype.attachShadow) {
208
+ // Monkeypatch the attachShadow method so we can handle pseudo styles inside shadow DOM
209
+ Element.prototype._attachShadow = Element.prototype.attachShadow;
210
+
211
+ Element.prototype.attachShadow = function attachShadow(init) {
212
+ // Force "open" mode, so we can access the shadowRoot
213
+ var shadowRoot = this._attachShadow(_objectSpread(_objectSpread({}, init), {}, {
214
+ mode: "open"
215
+ })); // Wait for it to render and apply its styles before rewriting them
216
+
217
+
218
+ requestAnimationFrame(function () {
219
+ rewriteStyleSheets(shadowRoot);
220
+ updateShadowHost(shadowRoot.host);
221
+ });
222
+ return shadowRoot;
223
+ };
224
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "storybook-addon-pseudo-states",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "CSS pseudo states for Storybook",
5
5
  "keywords": [
6
6
  "storybook-addons",
@@ -14,7 +14,8 @@
14
14
  },
15
15
  "author": "ghengeveld",
16
16
  "license": "MIT",
17
- "main": "dist/preset.js",
17
+ "main": "dist/cjs/preset.js",
18
+ "module": "dist/esm/preset.js",
18
19
  "files": [
19
20
  "dist/**/*",
20
21
  "README.md",
@@ -25,7 +26,7 @@
25
26
  "start": "concurrently \"yarn storybook --no-manager-cache --quiet\" \"yarn build:dist --watch\"",
26
27
  "storybook": "start-storybook -p 6006",
27
28
  "chromatic": "chromatic",
28
- "build:dist": "babel ./src --out-dir ./dist",
29
+ "build:dist": "babel ./src --out-dir ./dist/cjs && BABEL_ESM=\"true\" babel ./src --out-dir ./dist/esm",
29
30
  "build:storybook": "build-storybook",
30
31
  "prepublish": "yarn clean && yarn build:dist",
31
32
  "release": "auto shipit --base-branch=main"
@@ -36,7 +37,7 @@
36
37
  "@babel/core": "^7.12.3",
37
38
  "@babel/preset-env": "^7.12.1",
38
39
  "@babel/preset-react": "^7.12.5",
39
- "@storybook/react": "^6.1.14",
40
+ "@storybook/react": "^6.4.19",
40
41
  "auto": "^10.16.8",
41
42
  "babel-loader": "^8.1.0",
42
43
  "chromatic": "^5.6.0",
@@ -46,11 +47,11 @@
46
47
  "rimraf": "^3.0.2"
47
48
  },
48
49
  "peerDependencies": {
49
- "@storybook/addons": "^6.1.14",
50
- "@storybook/api": "^6.1.14",
51
- "@storybook/components": "^6.1.14",
52
- "@storybook/core-events": "^6.1.14",
53
- "@storybook/theming": "^6.1.14",
50
+ "@storybook/addons": "^6.4.19",
51
+ "@storybook/api": "^6.4.19",
52
+ "@storybook/components": "^6.4.19",
53
+ "@storybook/core-events": "^6.4.19",
54
+ "@storybook/theming": "^6.4.19",
54
55
  "react": "^16.8.0 || ^17.0.0",
55
56
  "react-dom": "^16.8.0 || ^17.0.0"
56
57
  },
package/preset.js CHANGED
@@ -1 +1,9 @@
1
- module.exports = require("./dist/preset")
1
+ function managerEntries(entry = []) {
2
+ return [...entry, require.resolve("./dist/esm/preset/manager")]
3
+ }
4
+
5
+ function config(entry = []) {
6
+ return [...entry, require.resolve("./dist/esm/preset/preview")]
7
+ }
8
+
9
+ module.exports = { managerEntries, config };
@@ -1,29 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.config = config;
7
- exports.managerEntries = managerEntries;
8
-
9
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
10
-
11
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
12
-
13
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
14
-
15
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
16
-
17
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
18
-
19
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
20
-
21
- function config() {
22
- var entry = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
23
- return [].concat(_toConsumableArray(entry), [require.resolve("./preview")]);
24
- }
25
-
26
- function managerEntries() {
27
- var entry = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
28
- return [].concat(_toConsumableArray(entry), [require.resolve("./manager")]);
29
- }