storybook-addon-pseudo-states 1.1.0-canary.8.b81386e.0 → 1.2.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/.babelrc.js +12 -1
- package/CHANGELOG.md +40 -0
- package/dist/{PseudoStateTool.js → cjs/PseudoStateTool.js} +12 -12
- package/dist/{constants.js → cjs/constants.js} +1 -1
- package/dist/{preset → cjs/preset}/manager.js +0 -0
- package/dist/{preset → cjs/preset}/preview.js +0 -0
- package/dist/{withPseudoState.js → cjs/withPseudoState.js} +80 -105
- package/dist/esm/PseudoStateTool.js +89 -0
- package/dist/esm/constants.js +15 -0
- package/dist/esm/preset/manager.js +14 -0
- package/dist/esm/preset/preview.js +2 -0
- package/dist/esm/withPseudoState.js +241 -0
- package/package.json +11 -9
- package/preset.js +9 -1
- package/dist/preset/index.js +0 -29
package/.babelrc.js
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
const modules = process.env.BABEL_ESM === 'true' ? false : 'auto';
|
|
2
|
+
|
|
1
3
|
module.exports = {
|
|
2
|
-
|
|
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
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# v1.0.0 (Fri Mar 11 2022)
|
|
2
|
+
|
|
3
|
+
#### 🚀 Enhancement
|
|
4
|
+
|
|
5
|
+
- Merge branch 'main' into feature/docs-support [#20](https://github.com/chromaui/storybook-addon-pseudo-states/pull/20) ([@ghengeveld](https://github.com/ghengeveld))
|
|
6
|
+
- 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))
|
|
7
|
+
|
|
8
|
+
#### 🐛 Bug Fix
|
|
9
|
+
|
|
10
|
+
- Setup auto [#7](https://github.com/chromaui/storybook-addon-pseudo-states/pull/7) ([@ghengeveld](https://github.com/ghengeveld))
|
|
11
|
+
|
|
12
|
+
#### ⚠️ Pushed to `main`
|
|
13
|
+
|
|
14
|
+
- Disable snapshotting for CustomElements stories ([@ghengeveld](https://github.com/ghengeveld))
|
|
15
|
+
- 1.1.0 ([@ghengeveld](https://github.com/ghengeveld))
|
|
16
|
+
- Simplify ([@ghengeveld](https://github.com/ghengeveld))
|
|
17
|
+
- Small tweak ([@ghengeveld](https://github.com/ghengeveld))
|
|
18
|
+
- Upgrade Storybook ([@ghengeveld](https://github.com/ghengeveld))
|
|
19
|
+
- Ignore .env file ([@ghengeveld](https://github.com/ghengeveld))
|
|
20
|
+
|
|
21
|
+
#### Authors: 2
|
|
22
|
+
|
|
23
|
+
- Gert Hengeveld ([@ghengeveld](https://github.com/ghengeveld))
|
|
24
|
+
- Jeroen Zwartepoorte ([@jpzwarte](https://github.com/jpzwarte))
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
# v1.0.0 (Sat Feb 27 2021)
|
|
29
|
+
|
|
30
|
+
#### 🐛 Bug Fix
|
|
31
|
+
|
|
32
|
+
- Setup auto [#7](https://github.com/chromaui/storybook-addon-pseudo-states/pull/7) ([@ghengeveld](https://github.com/ghengeveld))
|
|
33
|
+
|
|
34
|
+
#### ⚠️ Pushed to `main`
|
|
35
|
+
|
|
36
|
+
- Ignore .env file ([@ghengeveld](https://github.com/ghengeveld))
|
|
37
|
+
|
|
38
|
+
#### Authors: 1
|
|
39
|
+
|
|
40
|
+
- Gert Hengeveld ([@ghengeveld](https://github.com/ghengeveld))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
function _typeof(obj) { "@babel/helpers - typeof";
|
|
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
|
|
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 {
|
|
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);
|
|
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]
|
|
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) {
|
|
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
|
|
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
|
|
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
|
|
87
|
+
title: /*#__PURE__*/_react.default.createElement(LinkTitle, {
|
|
88
88
|
active: getValue(option)
|
|
89
89
|
}, ":", _constants.PSEUDO_STATES[option]),
|
|
90
|
-
right: /*#__PURE__*/_react
|
|
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
|
|
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
|
|
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.
|
|
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);
|
|
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]
|
|
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
|
|
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) {
|
|
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
|
|
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
|
|
|
@@ -50,6 +50,21 @@ var applyClasses = function applyClasses(element, classnames) {
|
|
|
50
50
|
element.className = (_element$className$sp = element.className.split(" ").filter(function (classname) {
|
|
51
51
|
return classname && classname.indexOf("pseudo-") !== 0;
|
|
52
52
|
})).concat.apply(_element$className$sp, _toConsumableArray(classnames)).join(" ");
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
var applyParameter = function applyParameter(element, parameter) {
|
|
56
|
+
return applyClasses(element, Object.entries(parameter || {}).filter(function (_ref) {
|
|
57
|
+
var _ref2 = _slicedToArray(_ref, 2),
|
|
58
|
+
_ = _ref2[0],
|
|
59
|
+
value = _ref2[1];
|
|
60
|
+
|
|
61
|
+
return value;
|
|
62
|
+
}).map(function (_ref3) {
|
|
63
|
+
var _ref4 = _slicedToArray(_ref3, 1),
|
|
64
|
+
key = _ref4[0];
|
|
65
|
+
|
|
66
|
+
return "pseudo-".concat(_constants.PSEUDO_STATES[key]);
|
|
67
|
+
}));
|
|
53
68
|
}; // Traverses ancestry to collect relevant pseudo classnames, and applies them to the shadow host.
|
|
54
69
|
// Shadow DOM can only access classes on its host. Traversing is needed to mimic the CSS cascade.
|
|
55
70
|
|
|
@@ -77,37 +92,35 @@ _addons.addons.getChannel().on(_coreEvents.STORY_CHANGED, function () {
|
|
|
77
92
|
}); // Global decorator that rewrites stylesheets and applies classnames to render pseudo styles
|
|
78
93
|
|
|
79
94
|
|
|
80
|
-
var withPseudoState = function withPseudoState(StoryFn) {
|
|
81
|
-
var
|
|
95
|
+
var withPseudoState = function withPseudoState(StoryFn, _ref5) {
|
|
96
|
+
var viewMode = _ref5.viewMode,
|
|
97
|
+
parameters = _ref5.parameters,
|
|
98
|
+
id = _ref5.id;
|
|
99
|
+
var parameter = parameters.pseudo;
|
|
82
100
|
|
|
83
101
|
var _useGlobals = (0, _addons.useGlobals)(),
|
|
84
102
|
_useGlobals2 = _slicedToArray(_useGlobals, 2),
|
|
85
103
|
globals = _useGlobals2[0].pseudo,
|
|
86
|
-
updateGlobals = _useGlobals2[1]; // Sync parameter to globals, used by the toolbar
|
|
104
|
+
updateGlobals = _useGlobals2[1]; // Sync parameter to globals, used by the toolbar (only in canvas as this
|
|
105
|
+
// doesn't make sense for docs because many stories are displayed at once)
|
|
87
106
|
|
|
88
107
|
|
|
89
108
|
(0, _addons.useEffect)(function () {
|
|
90
|
-
if (parameter !== globals) updateGlobals({
|
|
109
|
+
if (parameter !== globals && viewMode === "story") updateGlobals({
|
|
91
110
|
pseudo: parameter
|
|
92
111
|
});
|
|
93
|
-
}, [parameter]); // Convert selected states to classnames and apply them to the story root element.
|
|
112
|
+
}, [parameter, viewMode]); // Convert selected states to classnames and apply them to the story root element.
|
|
94
113
|
// Then update each shadow host to redetermine its own pseudo classnames.
|
|
95
114
|
|
|
96
115
|
(0, _addons.useEffect)(function () {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
return
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
key = _ref4[0];
|
|
106
|
-
|
|
107
|
-
return "pseudo-".concat(_constants.PSEUDO_STATES[key]);
|
|
108
|
-
}));
|
|
109
|
-
shadowHosts.forEach(updateShadowHost);
|
|
110
|
-
}, [globals]);
|
|
116
|
+
var timeout = setTimeout(function () {
|
|
117
|
+
applyParameter(document.getElementById(viewMode === "docs" ? "story--".concat(id) : "root"));
|
|
118
|
+
shadowHosts.forEach(updateShadowHost);
|
|
119
|
+
}, 0);
|
|
120
|
+
return function () {
|
|
121
|
+
return clearTimeout(timeout);
|
|
122
|
+
};
|
|
123
|
+
}, [parameter, viewMode]);
|
|
111
124
|
return StoryFn();
|
|
112
125
|
};
|
|
113
126
|
|
|
@@ -123,96 +136,60 @@ var warnOnce = function warnOnce(message) {
|
|
|
123
136
|
|
|
124
137
|
|
|
125
138
|
function rewriteStyleSheets(shadowRoot) {
|
|
126
|
-
var
|
|
127
|
-
var tagSelectors = new Set();
|
|
128
|
-
var idSelectors = new Set();
|
|
129
|
-
var classSelectors = new Set();
|
|
130
|
-
var attrSelectors = new Set();
|
|
139
|
+
var _shadowRoot$adoptedSt;
|
|
131
140
|
|
|
132
|
-
var
|
|
141
|
+
var styleSheets = shadowRoot ? shadowRoot.styleSheets : document.styleSheets;
|
|
142
|
+
if (shadowRoot !== null && shadowRoot !== void 0 && (_shadowRoot$adoptedSt = shadowRoot.adoptedStyleSheets) !== null && _shadowRoot$adoptedSt !== void 0 && _shadowRoot$adoptedSt.length) styleSheets = shadowRoot.adoptedStyleSheets;
|
|
143
|
+
|
|
144
|
+
var _iterator = _createForOfIteratorHelper(styleSheets),
|
|
133
145
|
_step;
|
|
134
146
|
|
|
135
147
|
try {
|
|
136
148
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
137
|
-
var
|
|
138
|
-
tagSelectors.add("(?<![.#])\\b".concat(element.tagName, "\\b"));
|
|
139
|
-
if (element.id) idSelectors.add("#".concat(element.id));
|
|
140
|
-
|
|
141
|
-
var _iterator3 = _createForOfIteratorHelper(element.className.split(/\s+/)),
|
|
142
|
-
_step3;
|
|
149
|
+
var sheet = _step.value;
|
|
143
150
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
} catch (err) {
|
|
150
|
-
_iterator3.e(err);
|
|
151
|
-
} finally {
|
|
152
|
-
_iterator3.f();
|
|
151
|
+
if (sheet._pseudoStatesRewritten) {
|
|
152
|
+
continue;
|
|
153
|
+
} else {
|
|
154
|
+
sheet._pseudoStatesRewritten = true;
|
|
153
155
|
}
|
|
154
156
|
|
|
155
|
-
var _iterator4 = _createForOfIteratorHelper(element.attributes),
|
|
156
|
-
_step4;
|
|
157
|
-
|
|
158
|
-
try {
|
|
159
|
-
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
160
|
-
var localName = _step4.value.localName;
|
|
161
|
-
if (localName) attrSelectors.add("\\[".concat(localName, "[~$^*|]?(=[^\\]]+)?\\]"));
|
|
162
|
-
}
|
|
163
|
-
} catch (err) {
|
|
164
|
-
_iterator4.e(err);
|
|
165
|
-
} finally {
|
|
166
|
-
_iterator4.f();
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
} catch (err) {
|
|
170
|
-
_iterator.e(err);
|
|
171
|
-
} finally {
|
|
172
|
-
_iterator.f();
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
var matchSelectors = [].concat(_toConsumableArray(Array.from(tagSelectors).map(function (re) {
|
|
176
|
-
return new RegExp(re, "i");
|
|
177
|
-
})), _toConsumableArray(Array.from(idSelectors).map(function (re) {
|
|
178
|
-
return new RegExp(re);
|
|
179
|
-
})), _toConsumableArray(Array.from(classSelectors).map(function (re) {
|
|
180
|
-
return new RegExp(re);
|
|
181
|
-
})), _toConsumableArray(Array.from(attrSelectors).map(function (re) {
|
|
182
|
-
return new RegExp(re, "i");
|
|
183
|
-
})));
|
|
184
|
-
|
|
185
|
-
var _iterator2 = _createForOfIteratorHelper((shadowRoot || document).styleSheets),
|
|
186
|
-
_step2;
|
|
187
|
-
|
|
188
|
-
try {
|
|
189
|
-
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
190
|
-
var sheet = _step2.value;
|
|
191
|
-
|
|
192
157
|
try {
|
|
193
158
|
var index = 0;
|
|
194
159
|
|
|
195
|
-
var
|
|
196
|
-
|
|
160
|
+
var _iterator2 = _createForOfIteratorHelper(sheet.cssRules),
|
|
161
|
+
_step2;
|
|
197
162
|
|
|
198
163
|
try {
|
|
199
|
-
|
|
200
|
-
var
|
|
201
|
-
cssText =
|
|
202
|
-
selectorText =
|
|
164
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
165
|
+
var _step2$value = _step2.value,
|
|
166
|
+
cssText = _step2$value.cssText,
|
|
167
|
+
selectorText = _step2$value.selectorText;
|
|
203
168
|
|
|
204
169
|
if (matchOne.test(selectorText)) {
|
|
205
|
-
if (!matchSelectors.some(function (matcher) {
|
|
206
|
-
return matcher.test(selectorText);
|
|
207
|
-
})) return "continue";
|
|
208
170
|
var newRule = cssText.replace(selectorText, selectorText.split(", ").flatMap(function (selector) {
|
|
209
171
|
if (selector.includes(".pseudo-")) return [];
|
|
210
172
|
var states = [];
|
|
211
173
|
var plainSelector = selector.replace(matchAll, function (_, state) {
|
|
212
|
-
states.push(
|
|
174
|
+
states.push(state);
|
|
213
175
|
return "";
|
|
214
176
|
});
|
|
215
|
-
var stateSelector
|
|
177
|
+
var stateSelector;
|
|
178
|
+
|
|
179
|
+
if (selector.startsWith(":host(")) {
|
|
180
|
+
stateSelector = states.reduce(function (acc, state) {
|
|
181
|
+
return acc.replaceAll(":".concat(state), ".pseudo-".concat(state));
|
|
182
|
+
}, selector);
|
|
183
|
+
} else if (shadowRoot) {
|
|
184
|
+
stateSelector = ":host(".concat(states.map(function (s) {
|
|
185
|
+
return ".pseudo-".concat(s);
|
|
186
|
+
}).join(""), ") ").concat(plainSelector);
|
|
187
|
+
} else {
|
|
188
|
+
stateSelector = "".concat(states.map(function (s) {
|
|
189
|
+
return ".pseudo-".concat(s);
|
|
190
|
+
}).join(""), " ").concat(plainSelector);
|
|
191
|
+
}
|
|
192
|
+
|
|
216
193
|
return [selector, stateSelector];
|
|
217
194
|
}).join(", "));
|
|
218
195
|
sheet.deleteRule(index);
|
|
@@ -224,20 +201,13 @@ function rewriteStyleSheets(shadowRoot) {
|
|
|
224
201
|
|
|
225
202
|
if (index > 1000) {
|
|
226
203
|
warnOnce("Reached maximum of 1000 pseudo selectors per sheet, skipping the rest.");
|
|
227
|
-
|
|
204
|
+
break;
|
|
228
205
|
}
|
|
229
|
-
};
|
|
230
|
-
|
|
231
|
-
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
232
|
-
var _ret = _loop();
|
|
233
|
-
|
|
234
|
-
if (_ret === "continue") continue;
|
|
235
|
-
if (_ret === "break") break;
|
|
236
206
|
}
|
|
237
207
|
} catch (err) {
|
|
238
|
-
|
|
208
|
+
_iterator2.e(err);
|
|
239
209
|
} finally {
|
|
240
|
-
|
|
210
|
+
_iterator2.f();
|
|
241
211
|
}
|
|
242
212
|
} catch (e) {
|
|
243
213
|
if (e.toString().includes("cssRules")) {
|
|
@@ -249,15 +219,20 @@ function rewriteStyleSheets(shadowRoot) {
|
|
|
249
219
|
}
|
|
250
220
|
}
|
|
251
221
|
} catch (err) {
|
|
252
|
-
|
|
222
|
+
_iterator.e(err);
|
|
253
223
|
} finally {
|
|
254
|
-
|
|
224
|
+
_iterator.f();
|
|
255
225
|
}
|
|
256
226
|
} // Reinitialize CSS enhancements every time the story changes
|
|
257
227
|
|
|
258
228
|
|
|
259
229
|
_addons.addons.getChannel().on(_coreEvents.STORY_RENDERED, function () {
|
|
260
230
|
return rewriteStyleSheets();
|
|
231
|
+
}); // Reinitialize CSS enhancements every time a docs page is rendered
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
_addons.addons.getChannel().on(_coreEvents.DOCS_RENDERED, function () {
|
|
235
|
+
return rewriteStyleSheets();
|
|
261
236
|
}); // IE doesn't support shadow DOM
|
|
262
237
|
|
|
263
238
|
|
|
@@ -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,241 @@
|
|
|
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 } from "@storybook/addons";
|
|
31
|
+
import { DOCS_RENDERED, 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
|
+
};
|
|
45
|
+
|
|
46
|
+
var applyParameter = function applyParameter(element, parameter) {
|
|
47
|
+
return applyClasses(element, Object.entries(parameter || {}).filter(function (_ref) {
|
|
48
|
+
var _ref2 = _slicedToArray(_ref, 2),
|
|
49
|
+
_ = _ref2[0],
|
|
50
|
+
value = _ref2[1];
|
|
51
|
+
|
|
52
|
+
return value;
|
|
53
|
+
}).map(function (_ref3) {
|
|
54
|
+
var _ref4 = _slicedToArray(_ref3, 1),
|
|
55
|
+
key = _ref4[0];
|
|
56
|
+
|
|
57
|
+
return "pseudo-".concat(PSEUDO_STATES[key]);
|
|
58
|
+
}));
|
|
59
|
+
}; // Traverses ancestry to collect relevant pseudo classnames, and applies them to the shadow host.
|
|
60
|
+
// Shadow DOM can only access classes on its host. Traversing is needed to mimic the CSS cascade.
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
var updateShadowHost = function updateShadowHost(shadowHost) {
|
|
64
|
+
var classnames = new Set();
|
|
65
|
+
|
|
66
|
+
for (var element = shadowHost.parentElement; element; element = element.parentElement) {
|
|
67
|
+
if (!element.className) continue;
|
|
68
|
+
element.className.split(" ").filter(function (classname) {
|
|
69
|
+
return classname.indexOf("pseudo-") === 0;
|
|
70
|
+
}).forEach(function (classname) {
|
|
71
|
+
return classnames.add(classname);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
applyClasses(shadowHost, classnames);
|
|
76
|
+
}; // Keep track of attached shadow host elements for the current story
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
var shadowHosts = new Set();
|
|
80
|
+
addons.getChannel().on(STORY_CHANGED, function () {
|
|
81
|
+
return shadowHosts.clear();
|
|
82
|
+
}); // Global decorator that rewrites stylesheets and applies classnames to render pseudo styles
|
|
83
|
+
|
|
84
|
+
export var withPseudoState = function withPseudoState(StoryFn, _ref5) {
|
|
85
|
+
var viewMode = _ref5.viewMode,
|
|
86
|
+
parameters = _ref5.parameters,
|
|
87
|
+
id = _ref5.id;
|
|
88
|
+
var parameter = parameters.pseudo;
|
|
89
|
+
|
|
90
|
+
var _useGlobals = useGlobals(),
|
|
91
|
+
_useGlobals2 = _slicedToArray(_useGlobals, 2),
|
|
92
|
+
globals = _useGlobals2[0].pseudo,
|
|
93
|
+
updateGlobals = _useGlobals2[1]; // Sync parameter to globals, used by the toolbar (only in canvas as this
|
|
94
|
+
// doesn't make sense for docs because many stories are displayed at once)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
useEffect(function () {
|
|
98
|
+
if (parameter !== globals && viewMode === "story") updateGlobals({
|
|
99
|
+
pseudo: parameter
|
|
100
|
+
});
|
|
101
|
+
}, [parameter, viewMode]); // Convert selected states to classnames and apply them to the story root element.
|
|
102
|
+
// Then update each shadow host to redetermine its own pseudo classnames.
|
|
103
|
+
|
|
104
|
+
useEffect(function () {
|
|
105
|
+
var timeout = setTimeout(function () {
|
|
106
|
+
applyParameter(document.getElementById(viewMode === "docs" ? "story--".concat(id) : "root"));
|
|
107
|
+
shadowHosts.forEach(updateShadowHost);
|
|
108
|
+
}, 0);
|
|
109
|
+
return function () {
|
|
110
|
+
return clearTimeout(timeout);
|
|
111
|
+
};
|
|
112
|
+
}, [parameter, viewMode]);
|
|
113
|
+
return StoryFn();
|
|
114
|
+
};
|
|
115
|
+
var warnings = new Set();
|
|
116
|
+
|
|
117
|
+
var warnOnce = function warnOnce(message) {
|
|
118
|
+
if (warnings.has(message)) return; // eslint-disable-next-line no-console
|
|
119
|
+
|
|
120
|
+
console.warn(message);
|
|
121
|
+
warnings.add(message);
|
|
122
|
+
}; // Rewrite CSS rules for pseudo-states on all stylesheets to add an alternative selector
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
function rewriteStyleSheets(shadowRoot) {
|
|
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),
|
|
132
|
+
_step;
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
136
|
+
var sheet = _step.value;
|
|
137
|
+
|
|
138
|
+
if (sheet._pseudoStatesRewritten) {
|
|
139
|
+
continue;
|
|
140
|
+
} else {
|
|
141
|
+
sheet._pseudoStatesRewritten = true;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
try {
|
|
145
|
+
var index = 0;
|
|
146
|
+
|
|
147
|
+
var _iterator2 = _createForOfIteratorHelper(sheet.cssRules),
|
|
148
|
+
_step2;
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
152
|
+
var _step2$value = _step2.value,
|
|
153
|
+
cssText = _step2$value.cssText,
|
|
154
|
+
selectorText = _step2$value.selectorText;
|
|
155
|
+
|
|
156
|
+
if (matchOne.test(selectorText)) {
|
|
157
|
+
var newRule = cssText.replace(selectorText, selectorText.split(", ").flatMap(function (selector) {
|
|
158
|
+
if (selector.includes(".pseudo-")) return [];
|
|
159
|
+
var states = [];
|
|
160
|
+
var plainSelector = selector.replace(matchAll, function (_, state) {
|
|
161
|
+
states.push(state);
|
|
162
|
+
return "";
|
|
163
|
+
});
|
|
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
|
+
|
|
180
|
+
return [selector, stateSelector];
|
|
181
|
+
}).join(", "));
|
|
182
|
+
sheet.deleteRule(index);
|
|
183
|
+
sheet.insertRule(newRule, index);
|
|
184
|
+
if (shadowRoot) shadowHosts.add(shadowRoot.host);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
index++;
|
|
188
|
+
|
|
189
|
+
if (index > 1000) {
|
|
190
|
+
warnOnce("Reached maximum of 1000 pseudo selectors per sheet, skipping the rest.");
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
} catch (err) {
|
|
195
|
+
_iterator2.e(err);
|
|
196
|
+
} finally {
|
|
197
|
+
_iterator2.f();
|
|
198
|
+
}
|
|
199
|
+
} catch (e) {
|
|
200
|
+
if (e.toString().includes("cssRules")) {
|
|
201
|
+
warnOnce("Can't access cssRules, likely due to CORS restrictions: ".concat(sheet.href));
|
|
202
|
+
} else {
|
|
203
|
+
// eslint-disable-next-line no-console
|
|
204
|
+
console.error(e, sheet.href);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
} catch (err) {
|
|
209
|
+
_iterator.e(err);
|
|
210
|
+
} finally {
|
|
211
|
+
_iterator.f();
|
|
212
|
+
}
|
|
213
|
+
} // Reinitialize CSS enhancements every time the story changes
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
addons.getChannel().on(STORY_RENDERED, function () {
|
|
217
|
+
return rewriteStyleSheets();
|
|
218
|
+
}); // Reinitialize CSS enhancements every time a docs page is rendered
|
|
219
|
+
|
|
220
|
+
addons.getChannel().on(DOCS_RENDERED, function () {
|
|
221
|
+
return rewriteStyleSheets();
|
|
222
|
+
}); // IE doesn't support shadow DOM
|
|
223
|
+
|
|
224
|
+
if (Element.prototype.attachShadow) {
|
|
225
|
+
// Monkeypatch the attachShadow method so we can handle pseudo styles inside shadow DOM
|
|
226
|
+
Element.prototype._attachShadow = Element.prototype.attachShadow;
|
|
227
|
+
|
|
228
|
+
Element.prototype.attachShadow = function attachShadow(init) {
|
|
229
|
+
// Force "open" mode, so we can access the shadowRoot
|
|
230
|
+
var shadowRoot = this._attachShadow(_objectSpread(_objectSpread({}, init), {}, {
|
|
231
|
+
mode: "open"
|
|
232
|
+
})); // Wait for it to render and apply its styles before rewriting them
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
requestAnimationFrame(function () {
|
|
236
|
+
rewriteStyleSheets(shadowRoot);
|
|
237
|
+
updateShadowHost(shadowRoot.host);
|
|
238
|
+
});
|
|
239
|
+
return shadowRoot;
|
|
240
|
+
};
|
|
241
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "storybook-addon-pseudo-states",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
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,8 @@
|
|
|
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/
|
|
40
|
+
"@storybook/addon-docs": "^6.4.19",
|
|
41
|
+
"@storybook/react": "^6.4.19",
|
|
40
42
|
"auto": "^10.16.8",
|
|
41
43
|
"babel-loader": "^8.1.0",
|
|
42
44
|
"chromatic": "^5.6.0",
|
|
@@ -46,11 +48,11 @@
|
|
|
46
48
|
"rimraf": "^3.0.2"
|
|
47
49
|
},
|
|
48
50
|
"peerDependencies": {
|
|
49
|
-
"@storybook/addons": "^6.
|
|
50
|
-
"@storybook/api": "^6.
|
|
51
|
-
"@storybook/components": "^6.
|
|
52
|
-
"@storybook/core-events": "^6.
|
|
53
|
-
"@storybook/theming": "^6.
|
|
51
|
+
"@storybook/addons": "^6.4.19",
|
|
52
|
+
"@storybook/api": "^6.4.19",
|
|
53
|
+
"@storybook/components": "^6.4.19",
|
|
54
|
+
"@storybook/core-events": "^6.4.19",
|
|
55
|
+
"@storybook/theming": "^6.4.19",
|
|
54
56
|
"react": "^16.8.0 || ^17.0.0",
|
|
55
57
|
"react-dom": "^16.8.0 || ^17.0.0"
|
|
56
58
|
},
|
package/preset.js
CHANGED
|
@@ -1 +1,9 @@
|
|
|
1
|
-
|
|
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 };
|
package/dist/preset/index.js
DELETED
|
@@ -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
|
-
}
|