storybook-addon-pseudo-states 9.2.0-alpha.3 → 10.0.0-beta.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/README.md CHANGED
@@ -81,3 +81,5 @@ DialogButton.parameters = {
81
81
  pseudo: { hover: true, rootSelector: 'body' },
82
82
  };
83
83
  ```
84
+
85
+ Learn more about Storybook at [storybook.js.org](https://storybook.js.org/?ref=readme).
@@ -0,0 +1,369 @@
1
+ import {
2
+ EXCLUDED_PSEUDO_ELEMENT_PATTERNS,
3
+ EXCLUDED_PSEUDO_ESCAPE_SEQUENCE,
4
+ PARAM_KEY,
5
+ PSEUDO_STATES,
6
+ __export,
7
+ __name
8
+ } from "./chunk-7CQCSQMX.js";
9
+
10
+ // src/preview.ts
11
+ var preview_exports = {};
12
+ __export(preview_exports, {
13
+ decorators: () => decorators,
14
+ initialGlobals: () => initialGlobals
15
+ });
16
+
17
+ // src/preview/withPseudoState.ts
18
+ import {
19
+ DOCS_RENDERED,
20
+ FORCE_REMOUNT,
21
+ FORCE_RE_RENDER,
22
+ GLOBALS_UPDATED,
23
+ STORY_CHANGED,
24
+ STORY_RENDERED,
25
+ UPDATE_GLOBALS
26
+ } from "storybook/internal/core-events";
27
+ import { addons, useEffect, useMemo, useRef } from "storybook/preview-api";
28
+
29
+ // src/preview/splitSelectors.ts
30
+ var isAtRule = /* @__PURE__ */ __name((selector) => selector.indexOf("@") === 0, "isAtRule");
31
+ var splitSelectors = /* @__PURE__ */ __name((selectors) => {
32
+ if (isAtRule(selectors)) {
33
+ return [selectors];
34
+ }
35
+ const result = [];
36
+ let parentheses = 0;
37
+ let brackets = 0;
38
+ let selector = "";
39
+ for (let i = 0, len = selectors.length; i < len; i++) {
40
+ const char = selectors[i];
41
+ if (char === "(") {
42
+ parentheses += 1;
43
+ } else if (char === ")") {
44
+ parentheses -= 1;
45
+ } else if (char === "[") {
46
+ brackets += 1;
47
+ } else if (char === "]") {
48
+ brackets -= 1;
49
+ } else if (char === ",") {
50
+ if (!parentheses && !brackets) {
51
+ result.push(selector.trim());
52
+ selector = "";
53
+ continue;
54
+ }
55
+ }
56
+ selector += char;
57
+ }
58
+ result.push(selector.trim());
59
+ return result;
60
+ }, "splitSelectors");
61
+
62
+ // src/preview/rewriteStyleSheet.ts
63
+ var pseudoStates = Object.values(PSEUDO_STATES);
64
+ var pseudoStatesPattern = `${EXCLUDED_PSEUDO_ESCAPE_SEQUENCE}:(${pseudoStates.join("|")})`;
65
+ var matchOne = new RegExp(pseudoStatesPattern);
66
+ var matchAll = new RegExp(pseudoStatesPattern, "g");
67
+ var warnings = /* @__PURE__ */ new Set();
68
+ var warnOnce = /* @__PURE__ */ __name((message) => {
69
+ if (warnings.has(message)) {
70
+ return;
71
+ }
72
+ console.warn(message);
73
+ warnings.add(message);
74
+ }, "warnOnce");
75
+ var replacePseudoStates = /* @__PURE__ */ __name((selector, allClass) => {
76
+ const negativeLookbehind = `(?<!(?:${EXCLUDED_PSEUDO_ELEMENT_PATTERNS.join("|")})\\S*)`;
77
+ return pseudoStates.reduce(
78
+ (acc, state) => acc.replace(
79
+ new RegExp(`${negativeLookbehind}${EXCLUDED_PSEUDO_ESCAPE_SEQUENCE}:${state}`, "g"),
80
+ `.pseudo-${state}${allClass ? "-all" : ""}`
81
+ ),
82
+ selector
83
+ );
84
+ }, "replacePseudoStates");
85
+ var replacePseudoStatesWithAncestorSelector = /* @__PURE__ */ __name((selector, forShadowDOM, additionalHostSelectors) => {
86
+ const extracted = extractPseudoStates(selector);
87
+ if (extracted.states.length === 0 && !additionalHostSelectors) {
88
+ return selector;
89
+ }
90
+ const selectors = `${additionalHostSelectors ?? ""}${extracted.states.map((s) => `.pseudo-${s}-all`).join("")}`;
91
+ let { withoutPseudoStates } = extracted;
92
+ withoutPseudoStates = withoutPseudoStates.replace(":host-context(*)", "").trimStart();
93
+ return withoutPseudoStates.startsWith(":host-context(") ? withoutPseudoStates.replace(/(?<=:host-context\(\S+)\)/, `)${selectors}`) : forShadowDOM ? `:host(${selectors}) ${withoutPseudoStates}` : `${selectors} ${withoutPseudoStates}`;
94
+ }, "replacePseudoStatesWithAncestorSelector");
95
+ var extractPseudoStates = /* @__PURE__ */ __name((selector) => {
96
+ const states = /* @__PURE__ */ new Set();
97
+ const withoutPseudoStates = selector.replace(matchAll, (_, state) => {
98
+ states.add(state);
99
+ return "";
100
+ }).replaceAll(/(?<!is)\(\)/g, "(*)").replace(/(?<=[\s(]),\s+|(,\s+)+(?=\))/g, "") || "*";
101
+ return {
102
+ states: Array.from(states),
103
+ withoutPseudoStates
104
+ };
105
+ }, "extractPseudoStates");
106
+ var rewriteNotSelectors = /* @__PURE__ */ __name((selector, forShadowDOM) => {
107
+ return [...selector.matchAll(/:not\(([^)]+)\)/g)].reduce((acc, match) => {
108
+ const originalNot = match[0];
109
+ const selectorList = match[1];
110
+ const rewrittenNot = rewriteNotSelector(selectorList, forShadowDOM);
111
+ return acc.replace(originalNot, rewrittenNot);
112
+ }, selector);
113
+ }, "rewriteNotSelectors");
114
+ var rewriteNotSelector = /* @__PURE__ */ __name((negatedSelectorList, forShadowDOM) => {
115
+ const rewrittenSelectors = [];
116
+ for (const negatedSelector of negatedSelectorList.split(/,\s*/)) {
117
+ rewrittenSelectors.push(replacePseudoStatesWithAncestorSelector(negatedSelector, forShadowDOM));
118
+ }
119
+ return `:not(${rewrittenSelectors.join(", ")})`;
120
+ }, "rewriteNotSelector");
121
+ var rewriteRule = /* @__PURE__ */ __name(({ cssText, selectorText }, forShadowDOM) => {
122
+ return cssText.replace(
123
+ selectorText,
124
+ splitSelectors(selectorText).flatMap((selector) => {
125
+ if (selector.includes(".pseudo-")) {
126
+ return [];
127
+ }
128
+ const replacementSelectors = [selector];
129
+ if (!matchOne.test(selector)) {
130
+ return replacementSelectors;
131
+ }
132
+ const classSelector = replacePseudoStates(selector);
133
+ if (classSelector !== selector) {
134
+ replacementSelectors.push(classSelector);
135
+ }
136
+ let ancestorSelector = "";
137
+ if (selector.startsWith(":host(")) {
138
+ const matches = selector.match(/^:host\((\S+)\)\s+(.+)$/);
139
+ if (matches && matchOne.test(matches[2])) {
140
+ let hostInnerSelector = matches[1];
141
+ let descendantSelector = matches[2];
142
+ hostInnerSelector = replacePseudoStates(hostInnerSelector, true);
143
+ descendantSelector = rewriteNotSelectors(descendantSelector, true);
144
+ ancestorSelector = replacePseudoStatesWithAncestorSelector(
145
+ descendantSelector,
146
+ true,
147
+ hostInnerSelector
148
+ );
149
+ } else {
150
+ ancestorSelector = replacePseudoStates(selector, true);
151
+ }
152
+ } else {
153
+ const withNotsReplaced = rewriteNotSelectors(selector, forShadowDOM);
154
+ ancestorSelector = replacePseudoStatesWithAncestorSelector(
155
+ withNotsReplaced,
156
+ forShadowDOM
157
+ );
158
+ }
159
+ replacementSelectors.push(ancestorSelector);
160
+ return replacementSelectors;
161
+ }).join(", ")
162
+ );
163
+ }, "rewriteRule");
164
+ var rewriteStyleSheet = /* @__PURE__ */ __name((sheet, forShadowDOM = false) => {
165
+ try {
166
+ const maximumRulesToRewrite = 1e3;
167
+ const count = rewriteRuleContainer(sheet, maximumRulesToRewrite, forShadowDOM);
168
+ if (count >= maximumRulesToRewrite) {
169
+ warnOnce("Reached maximum of 1000 pseudo selectors per sheet, skipping the rest.");
170
+ }
171
+ return count > 0;
172
+ } catch (e) {
173
+ if (String(e).includes("cssRules")) {
174
+ warnOnce(`Can't access cssRules, likely due to CORS restrictions: ${sheet.href}`);
175
+ } else {
176
+ console.error(e, sheet.href);
177
+ }
178
+ return false;
179
+ }
180
+ }, "rewriteStyleSheet");
181
+ var rewriteRuleContainer = /* @__PURE__ */ __name((ruleContainer, rewriteLimit, forShadowDOM) => {
182
+ let count = 0;
183
+ let index = -1;
184
+ for (const cssRule of ruleContainer.cssRules) {
185
+ index++;
186
+ let numRewritten = 0;
187
+ if (cssRule.__processed) {
188
+ numRewritten = cssRule.__pseudoStatesRewrittenCount;
189
+ } else {
190
+ if ("cssRules" in cssRule && cssRule.cssRules.length) {
191
+ numRewritten = rewriteRuleContainer(
192
+ cssRule,
193
+ rewriteLimit - count,
194
+ forShadowDOM
195
+ );
196
+ } else {
197
+ if (!("selectorText" in cssRule)) {
198
+ continue;
199
+ }
200
+ const styleRule = cssRule;
201
+ if (matchOne.test(styleRule.selectorText)) {
202
+ const newRule = rewriteRule(styleRule, forShadowDOM);
203
+ ruleContainer.deleteRule(index);
204
+ ruleContainer.insertRule(newRule, index);
205
+ numRewritten = 1;
206
+ }
207
+ }
208
+ cssRule.__processed = true;
209
+ cssRule.__pseudoStatesRewrittenCount = numRewritten;
210
+ }
211
+ count += numRewritten;
212
+ if (count >= rewriteLimit) {
213
+ break;
214
+ }
215
+ }
216
+ return count;
217
+ }, "rewriteRuleContainer");
218
+
219
+ // src/preview/withPseudoState.ts
220
+ var channel = addons.getChannel();
221
+ var shadowHosts = /* @__PURE__ */ new Set();
222
+ var applyClasses = /* @__PURE__ */ __name((element, classnames) => {
223
+ Object.values(PSEUDO_STATES).forEach((state) => {
224
+ element.classList.remove(`pseudo-${state}`);
225
+ element.classList.remove(`pseudo-${state}-all`);
226
+ });
227
+ classnames.forEach((classname) => element.classList.add(classname));
228
+ }, "applyClasses");
229
+ function querySelectorPiercingShadowDOM(root, selector) {
230
+ const results = [];
231
+ root.querySelectorAll("*").forEach((el) => {
232
+ if (el.shadowRoot) {
233
+ results.push(...querySelectorPiercingShadowDOM(el.shadowRoot, selector));
234
+ }
235
+ });
236
+ results.push(...root.querySelectorAll(selector).values());
237
+ return results;
238
+ }
239
+ __name(querySelectorPiercingShadowDOM, "querySelectorPiercingShadowDOM");
240
+ var applyParameter = /* @__PURE__ */ __name((rootElement, parameter = {}) => {
241
+ const map = /* @__PURE__ */ new Map([[rootElement, /* @__PURE__ */ new Set()]]);
242
+ const add = /* @__PURE__ */ __name((target, state) => map.set(target, /* @__PURE__ */ new Set([...map.get(target) || [], state])), "add");
243
+ Object.entries(parameter || {}).forEach(([state, value]) => {
244
+ if (typeof value === "boolean") {
245
+ if (value) {
246
+ add(rootElement, `${state}-all`);
247
+ }
248
+ } else if (typeof value === "string") {
249
+ querySelectorPiercingShadowDOM(rootElement, value).forEach((el) => add(el, state));
250
+ } else if (Array.isArray(value)) {
251
+ value.forEach(
252
+ (sel) => querySelectorPiercingShadowDOM(rootElement, sel).forEach((el) => add(el, state))
253
+ );
254
+ }
255
+ });
256
+ map.forEach((states, target) => {
257
+ const classnames = /* @__PURE__ */ new Set();
258
+ states.forEach((key) => {
259
+ const keyWithoutAll = key.replace("-all", "");
260
+ if (PSEUDO_STATES[key]) {
261
+ classnames.add(`pseudo-${PSEUDO_STATES[key]}`);
262
+ } else if (PSEUDO_STATES[keyWithoutAll]) {
263
+ classnames.add(`pseudo-${PSEUDO_STATES[keyWithoutAll]}-all`);
264
+ }
265
+ });
266
+ applyClasses(target, classnames);
267
+ });
268
+ }, "applyParameter");
269
+ var updateShadowHost = /* @__PURE__ */ __name((shadowHost) => {
270
+ const classnames = /* @__PURE__ */ new Set();
271
+ shadowHost.className.split(" ").filter((classname) => classname.match(/^pseudo-(.(?!-all))+$/)).forEach((classname) => classnames.add(classname));
272
+ for (let node = shadowHost.parentNode; node; ) {
273
+ if (node instanceof ShadowRoot) {
274
+ node = node.host;
275
+ continue;
276
+ }
277
+ if (node instanceof Element) {
278
+ const element = node;
279
+ if (element.className) {
280
+ element.className.split(" ").filter((classname) => classname.match(/^pseudo-.+-all$/) !== null).forEach((classname) => classnames.add(classname));
281
+ }
282
+ }
283
+ node = node.parentNode;
284
+ }
285
+ applyClasses(shadowHost, classnames);
286
+ }, "updateShadowHost");
287
+ var pseudoConfig = /* @__PURE__ */ __name((parameter) => {
288
+ const { rootSelector, ...pseudoStateConfig } = parameter || {};
289
+ return pseudoStateConfig;
290
+ }, "pseudoConfig");
291
+ var equals = /* @__PURE__ */ __name((a = {}, b = {}) => a !== null && b !== null && Object.keys(a).length === Object.keys(b).length && Object.keys(a).every(
292
+ (key) => JSON.stringify(a[key]) === JSON.stringify(b[key])
293
+ ), "equals");
294
+ var withPseudoState = /* @__PURE__ */ __name((StoryFn, { viewMode, parameters, id, globals: globalsArgs }) => {
295
+ const { pseudo: parameter } = parameters;
296
+ const { pseudo: globals } = globalsArgs;
297
+ const { rootSelector } = parameter || {};
298
+ const rootElement = useMemo(() => {
299
+ if (rootSelector) {
300
+ return document.querySelector(rootSelector);
301
+ }
302
+ if (viewMode === "docs") {
303
+ return document.getElementById(`story--${id}`);
304
+ }
305
+ return document.getElementById("storybook-root") || // Storybook 7.0+
306
+ document.getElementById("root");
307
+ }, [rootSelector, viewMode, id]);
308
+ const globalsRef = useRef(globals);
309
+ useEffect(() => {
310
+ const config = pseudoConfig(parameter);
311
+ if (viewMode === "story" && !equals(config, globalsRef.current)) {
312
+ channel.emit(UPDATE_GLOBALS, {
313
+ globals: { pseudo: config }
314
+ });
315
+ }
316
+ }, [parameter, viewMode]);
317
+ useEffect(() => {
318
+ if (!rootElement) {
319
+ return;
320
+ }
321
+ const timeout = setTimeout(() => {
322
+ applyParameter(rootElement, globals || pseudoConfig(parameter));
323
+ shadowHosts.forEach(updateShadowHost);
324
+ }, 0);
325
+ return () => clearTimeout(timeout);
326
+ }, [rootElement, globals, parameter]);
327
+ return StoryFn();
328
+ }, "withPseudoState");
329
+ var rewriteStyleSheets = /* @__PURE__ */ __name((shadowRoot) => {
330
+ let styleSheets = Array.from(shadowRoot ? shadowRoot.styleSheets : document.styleSheets);
331
+ if (shadowRoot?.adoptedStyleSheets?.length) {
332
+ styleSheets = shadowRoot.adoptedStyleSheets;
333
+ }
334
+ styleSheets.forEach((sheet) => rewriteStyleSheet(sheet, !!shadowRoot));
335
+ if (shadowRoot && shadowHosts) {
336
+ shadowHosts.add(shadowRoot.host);
337
+ }
338
+ }, "rewriteStyleSheets");
339
+ channel.on(STORY_CHANGED, () => shadowHosts.clear());
340
+ channel.on(STORY_RENDERED, () => rewriteStyleSheets());
341
+ channel.on(GLOBALS_UPDATED, () => rewriteStyleSheets());
342
+ channel.on(FORCE_RE_RENDER, () => rewriteStyleSheets());
343
+ channel.on(FORCE_REMOUNT, () => rewriteStyleSheets());
344
+ channel.on(DOCS_RENDERED, () => rewriteStyleSheets());
345
+ if (Element.prototype.attachShadow) {
346
+ Element.prototype._attachShadow = Element.prototype.attachShadow;
347
+ Element.prototype.attachShadow = /* @__PURE__ */ __name(function attachShadow(init) {
348
+ const shadowRoot = this._attachShadow({ ...init, mode: "open" });
349
+ requestAnimationFrame(() => {
350
+ rewriteStyleSheets(shadowRoot);
351
+ if (shadowHosts.has(shadowRoot.host)) {
352
+ updateShadowHost(shadowRoot.host);
353
+ }
354
+ });
355
+ return shadowRoot;
356
+ }, "attachShadow");
357
+ }
358
+
359
+ // src/preview.ts
360
+ var decorators = [withPseudoState];
361
+ var initialGlobals = {
362
+ [PARAM_KEY]: false
363
+ };
364
+
365
+ export {
366
+ decorators,
367
+ initialGlobals,
368
+ preview_exports
369
+ };
@@ -0,0 +1,35 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ var __export = (target, all) => {
4
+ for (var name in all)
5
+ __defProp(target, name, { get: all[name], enumerable: true });
6
+ };
7
+
8
+ // src/constants.ts
9
+ var ADDON_ID = "storybook/pseudo-states";
10
+ var TOOL_ID = `${ADDON_ID}/tool`;
11
+ var PARAM_KEY = "pseudo";
12
+ var EXCLUDED_PSEUDO_ELEMENT_PATTERNS = ["::-(webkit|moz|ms)-[a-z-]+", "::part\\([^)]+\\)"];
13
+ var EXCLUDED_PSEUDO_ESCAPE_SEQUENCE = "(?<=(?<!\\\\)(?:\\\\\\\\)*)";
14
+ var PSEUDO_STATES = {
15
+ hover: "hover",
16
+ active: "active",
17
+ focusVisible: "focus-visible",
18
+ focusWithin: "focus-within",
19
+ focus: "focus",
20
+ // must come after its alternatives
21
+ visited: "visited",
22
+ link: "link",
23
+ target: "target"
24
+ };
25
+
26
+ export {
27
+ __name,
28
+ __export,
29
+ ADDON_ID,
30
+ TOOL_ID,
31
+ PARAM_KEY,
32
+ EXCLUDED_PSEUDO_ELEMENT_PATTERNS,
33
+ EXCLUDED_PSEUDO_ESCAPE_SEQUENCE,
34
+ PSEUDO_STATES
35
+ };
package/dist/index.js CHANGED
@@ -1,12 +1,15 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var csf = require('storybook/internal/csf');
6
- var coreEvents = require('storybook/internal/core-events');
7
- var previewApi = require('storybook/preview-api');
8
-
9
- var __defProp=Object.defineProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0});};var preview_exports={};__export(preview_exports,{decorators:()=>decorators,initialGlobals:()=>initialGlobals});var PARAM_KEY="pseudo",EXCLUDED_PSEUDO_ELEMENT_PATTERNS=["::-(webkit|moz|ms)-[a-z-]+","::part\\([^)]+\\)"],EXCLUDED_PSEUDO_ESCAPE_SEQUENCE="(?<=(?<!\\\\)(?:\\\\\\\\)*)",PSEUDO_STATES={hover:"hover",active:"active",focusVisible:"focus-visible",focusWithin:"focus-within",focus:"focus",visited:"visited",link:"link",target:"target"};var isAtRule=selector=>selector.indexOf("@")===0,splitSelectors=selectors=>{if(isAtRule(selectors))return [selectors];let result=[],parentheses=0,brackets=0,selector="";for(let i=0,len=selectors.length;i<len;i++){let char=selectors[i];if(char==="(")parentheses+=1;else if(char===")")parentheses-=1;else if(char==="[")brackets+=1;else if(char==="]")brackets-=1;else if(char===","&&!parentheses&&!brackets){result.push(selector.trim()),selector="";continue}selector+=char;}return result.push(selector.trim()),result};var pseudoStates=Object.values(PSEUDO_STATES),pseudoStatesPattern=`${EXCLUDED_PSEUDO_ESCAPE_SEQUENCE}:(${pseudoStates.join("|")})`,matchOne=new RegExp(pseudoStatesPattern),matchAll=new RegExp(pseudoStatesPattern,"g"),warnings=new Set,warnOnce=message=>{warnings.has(message)||(console.warn(message),warnings.add(message));},replacePseudoStates=(selector,allClass)=>{let negativeLookbehind=`(?<!(?:${EXCLUDED_PSEUDO_ELEMENT_PATTERNS.join("|")})\\S*)`;return pseudoStates.reduce((acc,state)=>acc.replace(new RegExp(`${negativeLookbehind}${EXCLUDED_PSEUDO_ESCAPE_SEQUENCE}:${state}`,"g"),`.pseudo-${state}${allClass?"-all":""}`),selector)},replacePseudoStatesWithAncestorSelector=(selector,forShadowDOM,additionalHostSelectors)=>{let extracted=extractPseudoStates(selector);if(extracted.states.length===0&&!additionalHostSelectors)return selector;let selectors=`${additionalHostSelectors??""}${extracted.states.map(s=>`.pseudo-${s}-all`).join("")}`,{withoutPseudoStates}=extracted;return withoutPseudoStates=withoutPseudoStates.replace(":host-context(*)","").trimStart(),withoutPseudoStates.startsWith(":host-context(")?withoutPseudoStates.replace(/(?<=:host-context\(\S+)\)/,`)${selectors}`):forShadowDOM?`:host(${selectors}) ${withoutPseudoStates}`:`${selectors} ${withoutPseudoStates}`},extractPseudoStates=selector=>{let states=new Set,withoutPseudoStates=selector.replace(matchAll,(_,state)=>(states.add(state),"")).replaceAll(/(?<!is)\(\)/g,"(*)").replace(/(?<=[\s(]),\s+|(,\s+)+(?=\))/g,"")||"*";return {states:Array.from(states),withoutPseudoStates}},rewriteNotSelectors=(selector,forShadowDOM)=>[...selector.matchAll(/:not\(([^)]+)\)/g)].reduce((acc,match)=>{let originalNot=match[0],selectorList=match[1],rewrittenNot=rewriteNotSelector(selectorList,forShadowDOM);return acc.replace(originalNot,rewrittenNot)},selector),rewriteNotSelector=(negatedSelectorList,forShadowDOM)=>{let rewrittenSelectors=[];for(let negatedSelector of negatedSelectorList.split(/,\s*/))rewrittenSelectors.push(replacePseudoStatesWithAncestorSelector(negatedSelector,forShadowDOM));return `:not(${rewrittenSelectors.join(", ")})`},rewriteRule=({cssText,selectorText},forShadowDOM)=>cssText.replace(selectorText,splitSelectors(selectorText).flatMap(selector=>{if(selector.includes(".pseudo-"))return [];let replacementSelectors=[selector];if(!matchOne.test(selector))return replacementSelectors;let classSelector=replacePseudoStates(selector);classSelector!==selector&&replacementSelectors.push(classSelector);let ancestorSelector="";if(selector.startsWith(":host(")){let matches=selector.match(/^:host\((\S+)\)\s+(.+)$/);if(matches&&matchOne.test(matches[2])){let hostInnerSelector=matches[1],descendantSelector=matches[2];hostInnerSelector=replacePseudoStates(hostInnerSelector,!0),descendantSelector=rewriteNotSelectors(descendantSelector,!0),ancestorSelector=replacePseudoStatesWithAncestorSelector(descendantSelector,!0,hostInnerSelector);}else ancestorSelector=replacePseudoStates(selector,!0);}else {let withNotsReplaced=rewriteNotSelectors(selector,forShadowDOM);ancestorSelector=replacePseudoStatesWithAncestorSelector(withNotsReplaced,forShadowDOM);}return replacementSelectors.push(ancestorSelector),replacementSelectors}).join(", ")),rewriteStyleSheet=(sheet,forShadowDOM=!1)=>{try{let count=rewriteRuleContainer(sheet,1e3,forShadowDOM);return count>=1e3&&warnOnce("Reached maximum of 1000 pseudo selectors per sheet, skipping the rest."),count>0}catch(e){return String(e).includes("cssRules")?warnOnce(`Can't access cssRules, likely due to CORS restrictions: ${sheet.href}`):console.error(e,sheet.href),!1}},rewriteRuleContainer=(ruleContainer,rewriteLimit,forShadowDOM)=>{let count=0,index=-1;for(let cssRule of ruleContainer.cssRules){index++;let numRewritten=0;if(cssRule.__processed)numRewritten=cssRule.__pseudoStatesRewrittenCount;else {if("cssRules"in cssRule&&cssRule.cssRules.length)numRewritten=rewriteRuleContainer(cssRule,rewriteLimit-count,forShadowDOM);else {if(!("selectorText"in cssRule))continue;let styleRule=cssRule;if(matchOne.test(styleRule.selectorText)){let newRule=rewriteRule(styleRule,forShadowDOM);ruleContainer.deleteRule(index),ruleContainer.insertRule(newRule,index),numRewritten=1;}}cssRule.__processed=!0,cssRule.__pseudoStatesRewrittenCount=numRewritten;}if(count+=numRewritten,count>=rewriteLimit)break}return count};var channel=previewApi.addons.getChannel(),shadowHosts=new Set,applyClasses=(element,classnames)=>{Object.values(PSEUDO_STATES).forEach(state=>{element.classList.remove(`pseudo-${state}`),element.classList.remove(`pseudo-${state}-all`);}),classnames.forEach(classname=>element.classList.add(classname));};function querySelectorPiercingShadowDOM(root,selector){let results=[];return root.querySelectorAll("*").forEach(el=>{el.shadowRoot&&results.push(...querySelectorPiercingShadowDOM(el.shadowRoot,selector));}),results.push(...root.querySelectorAll(selector).values()),results}var applyParameter=(rootElement,parameter={})=>{let map=new Map([[rootElement,new Set]]),add=(target,state)=>map.set(target,new Set([...map.get(target)||[],state]));Object.entries(parameter||{}).forEach(([state,value])=>{typeof value=="boolean"?value&&add(rootElement,`${state}-all`):typeof value=="string"?querySelectorPiercingShadowDOM(rootElement,value).forEach(el=>add(el,state)):Array.isArray(value)&&value.forEach(sel=>querySelectorPiercingShadowDOM(rootElement,sel).forEach(el=>add(el,state)));}),map.forEach((states,target)=>{let classnames=new Set;states.forEach(key=>{let keyWithoutAll=key.replace("-all","");PSEUDO_STATES[key]?classnames.add(`pseudo-${PSEUDO_STATES[key]}`):PSEUDO_STATES[keyWithoutAll]&&classnames.add(`pseudo-${PSEUDO_STATES[keyWithoutAll]}-all`);}),applyClasses(target,classnames);});},updateShadowHost=shadowHost=>{let classnames=new Set;shadowHost.className.split(" ").filter(classname=>classname.match(/^pseudo-(.(?!-all))+$/)).forEach(classname=>classnames.add(classname));for(let node=shadowHost.parentNode;node;){if(node instanceof ShadowRoot){node=node.host;continue}if(node instanceof Element){let element=node;element.className&&element.className.split(" ").filter(classname=>classname.match(/^pseudo-.+-all$/)!==null).forEach(classname=>classnames.add(classname));}node=node.parentNode;}applyClasses(shadowHost,classnames);},pseudoConfig=parameter=>{let{rootSelector,...pseudoStateConfig}=parameter||{};return pseudoStateConfig},equals=(a={},b={})=>a!==null&&b!==null&&Object.keys(a).length===Object.keys(b).length&&Object.keys(a).every(key=>JSON.stringify(a[key])===JSON.stringify(b[key])),withPseudoState=(StoryFn,{viewMode,parameters,id,globals:globalsArgs})=>{let{pseudo:parameter}=parameters,{pseudo:globals}=globalsArgs,{rootSelector}=parameter||{},rootElement=previewApi.useMemo(()=>rootSelector?document.querySelector(rootSelector):viewMode==="docs"?document.getElementById(`story--${id}`):document.getElementById("storybook-root")||document.getElementById("root"),[rootSelector,viewMode,id]),globalsRef=previewApi.useRef(globals);return previewApi.useEffect(()=>{let config=pseudoConfig(parameter);viewMode==="story"&&!equals(config,globalsRef.current)&&channel.emit(coreEvents.UPDATE_GLOBALS,{globals:{pseudo:config}});},[parameter,viewMode]),previewApi.useEffect(()=>{if(!rootElement)return;let timeout=setTimeout(()=>{applyParameter(rootElement,globals||pseudoConfig(parameter)),shadowHosts.forEach(updateShadowHost);},0);return ()=>clearTimeout(timeout)},[rootElement,globals,parameter]),StoryFn()},rewriteStyleSheets=shadowRoot=>{let styleSheets=Array.from(shadowRoot?shadowRoot.styleSheets:document.styleSheets);shadowRoot?.adoptedStyleSheets?.length&&(styleSheets=shadowRoot.adoptedStyleSheets),styleSheets.forEach(sheet=>rewriteStyleSheet(sheet,!!shadowRoot)),shadowRoot&&shadowHosts&&shadowHosts.add(shadowRoot.host);};channel.on(coreEvents.STORY_CHANGED,()=>shadowHosts.clear());channel.on(coreEvents.STORY_RENDERED,()=>rewriteStyleSheets());channel.on(coreEvents.GLOBALS_UPDATED,()=>rewriteStyleSheets());channel.on(coreEvents.FORCE_RE_RENDER,()=>rewriteStyleSheets());channel.on(coreEvents.FORCE_REMOUNT,()=>rewriteStyleSheets());channel.on(coreEvents.DOCS_RENDERED,()=>rewriteStyleSheets());Element.prototype.attachShadow&&(Element.prototype._attachShadow=Element.prototype.attachShadow,Element.prototype.attachShadow=function(init){let shadowRoot=this._attachShadow({...init,mode:"open"});return requestAnimationFrame(()=>{rewriteStyleSheets(shadowRoot),shadowHosts.has(shadowRoot.host)&&updateShadowHost(shadowRoot.host);}),shadowRoot});var decorators=[withPseudoState],initialGlobals={[PARAM_KEY]:!1};var index_default=()=>csf.definePreviewAddon(preview_exports);
10
-
11
- exports.PARAM_KEY = PARAM_KEY;
12
- exports.default = index_default;
1
+ import {
2
+ preview_exports
3
+ } from "./_browser-chunks/chunk-5GW7LIKW.js";
4
+ import {
5
+ PARAM_KEY,
6
+ __name
7
+ } from "./_browser-chunks/chunk-7CQCSQMX.js";
8
+
9
+ // src/index.ts
10
+ import { definePreviewAddon } from "storybook/internal/csf";
11
+ var index_default = /* @__PURE__ */ __name(() => definePreviewAddon(preview_exports), "default");
12
+ export {
13
+ PARAM_KEY,
14
+ index_default as default
15
+ };
package/dist/manager.js CHANGED
@@ -1,7 +1,78 @@
1
- import { addons, types, useGlobals } from 'storybook/manager-api';
2
- import React, { useCallback } from 'react';
3
- import { Form, WithTooltip, TooltipLinkList, IconButton } from 'storybook/internal/components';
4
- import { styled, color } from 'storybook/internal/theming';
5
- import { RefreshIcon, ButtonIcon } from '@storybook/icons';
1
+ import {
2
+ ADDON_ID,
3
+ PARAM_KEY,
4
+ PSEUDO_STATES,
5
+ TOOL_ID,
6
+ __name
7
+ } from "./_browser-chunks/chunk-7CQCSQMX.js";
6
8
 
7
- var ADDON_ID="storybook/pseudo-states",TOOL_ID=`${ADDON_ID}/tool`,PARAM_KEY="pseudo";var PSEUDO_STATES={hover:"hover",active:"active",focusVisible:"focus-visible",focusWithin:"focus-within",focus:"focus",visited:"visited",link:"link",target:"target"};var LinkTitle=styled.span(({active})=>({color:active?color.secondary:"inherit"})),options=Object.keys(PSEUDO_STATES).sort(),PseudoStateTool=()=>{let[globals,updateGlobals]=useGlobals(),pseudo=globals[PARAM_KEY],isActive=useCallback(option=>pseudo?pseudo[option]===!0:!1,[pseudo]),hasActive=options.some(isActive),reset={id:"reset",title:"Reset pseudo states",icon:React.createElement(RefreshIcon,{style:{opacity:hasActive?1:.7}}),disabled:!hasActive,onClick:()=>updateGlobals({[PARAM_KEY]:{}})},toggleOption=useCallback(option=>()=>{let{[option]:value,...rest}=pseudo;updateGlobals({[PARAM_KEY]:value===!0?rest:{...rest,[option]:!0}});},[pseudo,updateGlobals]),links=options.map(option=>{let active=isActive(option);return {id:option,title:React.createElement(LinkTitle,{active},":",PSEUDO_STATES[option]),input:React.createElement(Form.Checkbox,{checked:active,onChange:toggleOption(option)}),active}});return React.createElement(WithTooltip,{placement:"top",trigger:"click",closeOnOutsideClick:!0,tooltip:React.createElement(TooltipLinkList,{links:[[reset],links]})},React.createElement(IconButton,{key:"pseudo-states",title:"Select CSS pseudo states",active:hasActive},React.createElement(ButtonIcon,null)))};addons.register(ADDON_ID,()=>{addons.add(TOOL_ID,{type:types.TOOL,title:"CSS pseudo states",match:({viewMode})=>viewMode==="story",render:PseudoStateTool});});
9
+ // src/manager.ts
10
+ import { addons, types } from "storybook/manager-api";
11
+
12
+ // src/manager/PseudoStateTool.tsx
13
+ import React, { useCallback } from "react";
14
+ import { Form, IconButton, TooltipLinkList, WithTooltip } from "storybook/internal/components";
15
+ import { color, styled } from "storybook/internal/theming";
16
+ import { ButtonIcon, RefreshIcon } from "@storybook/icons";
17
+ import { useGlobals } from "storybook/manager-api";
18
+ var LinkTitle = styled.span(({ active }) => ({
19
+ color: active ? color.secondary : "inherit"
20
+ }));
21
+ var options = Object.keys(PSEUDO_STATES).sort();
22
+ var PseudoStateTool = /* @__PURE__ */ __name(() => {
23
+ const [globals, updateGlobals] = useGlobals();
24
+ const pseudo = globals[PARAM_KEY];
25
+ const isActive = useCallback(
26
+ (option) => {
27
+ if (!pseudo) {
28
+ return false;
29
+ }
30
+ return pseudo[option] === true;
31
+ },
32
+ [pseudo]
33
+ );
34
+ const hasActive = options.some(isActive);
35
+ const reset = {
36
+ id: "reset",
37
+ title: "Reset pseudo states",
38
+ icon: React.createElement(RefreshIcon, { style: { opacity: hasActive ? 1 : 0.7 } }),
39
+ disabled: !hasActive,
40
+ onClick: /* @__PURE__ */ __name(() => updateGlobals({ [PARAM_KEY]: {} }), "onClick")
41
+ };
42
+ const toggleOption = useCallback(
43
+ (option) => () => {
44
+ const { [option]: value, ...rest } = pseudo;
45
+ updateGlobals({ [PARAM_KEY]: value === true ? rest : { ...rest, [option]: true } });
46
+ },
47
+ [pseudo, updateGlobals]
48
+ );
49
+ const links = options.map((option) => {
50
+ const active = isActive(option);
51
+ return {
52
+ id: option,
53
+ title: React.createElement(LinkTitle, { active }, ":", PSEUDO_STATES[option]),
54
+ input: React.createElement(Form.Checkbox, { checked: active, onChange: toggleOption(option) }),
55
+ active
56
+ };
57
+ });
58
+ return React.createElement(
59
+ WithTooltip,
60
+ {
61
+ placement: "top",
62
+ trigger: "click",
63
+ closeOnOutsideClick: true,
64
+ tooltip: React.createElement(TooltipLinkList, { links: [[reset], links] })
65
+ },
66
+ React.createElement(IconButton, { key: "pseudo-states", title: "Select CSS pseudo states", active: hasActive }, React.createElement(ButtonIcon, null))
67
+ );
68
+ }, "PseudoStateTool");
69
+
70
+ // src/manager.ts
71
+ addons.register(ADDON_ID, () => {
72
+ addons.add(TOOL_ID, {
73
+ type: types.TOOL,
74
+ title: "CSS pseudo states",
75
+ match: /* @__PURE__ */ __name(({ viewMode }) => viewMode === "story", "match"),
76
+ render: PseudoStateTool
77
+ });
78
+ });
package/dist/preview.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import * as core_dist_csf from 'storybook/internal/csf';
1
+ import * as storybook_internal_csf from 'storybook/internal/csf';
2
2
 
3
- declare const decorators: core_dist_csf.DecoratorFunction[];
3
+ declare const decorators: storybook_internal_csf.DecoratorFunction[];
4
4
  declare const initialGlobals: {
5
5
  pseudo: boolean;
6
6
  };
package/dist/preview.js CHANGED
@@ -1,9 +1,9 @@
1
- 'use strict';
2
-
3
- var coreEvents = require('storybook/internal/core-events');
4
- var previewApi = require('storybook/preview-api');
5
-
6
- var PARAM_KEY="pseudo",EXCLUDED_PSEUDO_ELEMENT_PATTERNS=["::-(webkit|moz|ms)-[a-z-]+","::part\\([^)]+\\)"],EXCLUDED_PSEUDO_ESCAPE_SEQUENCE="(?<=(?<!\\\\)(?:\\\\\\\\)*)",PSEUDO_STATES={hover:"hover",active:"active",focusVisible:"focus-visible",focusWithin:"focus-within",focus:"focus",visited:"visited",link:"link",target:"target"};var isAtRule=selector=>selector.indexOf("@")===0,splitSelectors=selectors=>{if(isAtRule(selectors))return [selectors];let result=[],parentheses=0,brackets=0,selector="";for(let i=0,len=selectors.length;i<len;i++){let char=selectors[i];if(char==="(")parentheses+=1;else if(char===")")parentheses-=1;else if(char==="[")brackets+=1;else if(char==="]")brackets-=1;else if(char===","&&!parentheses&&!brackets){result.push(selector.trim()),selector="";continue}selector+=char;}return result.push(selector.trim()),result};var pseudoStates=Object.values(PSEUDO_STATES),pseudoStatesPattern=`${EXCLUDED_PSEUDO_ESCAPE_SEQUENCE}:(${pseudoStates.join("|")})`,matchOne=new RegExp(pseudoStatesPattern),matchAll=new RegExp(pseudoStatesPattern,"g"),warnings=new Set,warnOnce=message=>{warnings.has(message)||(console.warn(message),warnings.add(message));},replacePseudoStates=(selector,allClass)=>{let negativeLookbehind=`(?<!(?:${EXCLUDED_PSEUDO_ELEMENT_PATTERNS.join("|")})\\S*)`;return pseudoStates.reduce((acc,state)=>acc.replace(new RegExp(`${negativeLookbehind}${EXCLUDED_PSEUDO_ESCAPE_SEQUENCE}:${state}`,"g"),`.pseudo-${state}${allClass?"-all":""}`),selector)},replacePseudoStatesWithAncestorSelector=(selector,forShadowDOM,additionalHostSelectors)=>{let extracted=extractPseudoStates(selector);if(extracted.states.length===0&&!additionalHostSelectors)return selector;let selectors=`${additionalHostSelectors??""}${extracted.states.map(s=>`.pseudo-${s}-all`).join("")}`,{withoutPseudoStates}=extracted;return withoutPseudoStates=withoutPseudoStates.replace(":host-context(*)","").trimStart(),withoutPseudoStates.startsWith(":host-context(")?withoutPseudoStates.replace(/(?<=:host-context\(\S+)\)/,`)${selectors}`):forShadowDOM?`:host(${selectors}) ${withoutPseudoStates}`:`${selectors} ${withoutPseudoStates}`},extractPseudoStates=selector=>{let states=new Set,withoutPseudoStates=selector.replace(matchAll,(_,state)=>(states.add(state),"")).replaceAll(/(?<!is)\(\)/g,"(*)").replace(/(?<=[\s(]),\s+|(,\s+)+(?=\))/g,"")||"*";return {states:Array.from(states),withoutPseudoStates}},rewriteNotSelectors=(selector,forShadowDOM)=>[...selector.matchAll(/:not\(([^)]+)\)/g)].reduce((acc,match)=>{let originalNot=match[0],selectorList=match[1],rewrittenNot=rewriteNotSelector(selectorList,forShadowDOM);return acc.replace(originalNot,rewrittenNot)},selector),rewriteNotSelector=(negatedSelectorList,forShadowDOM)=>{let rewrittenSelectors=[];for(let negatedSelector of negatedSelectorList.split(/,\s*/))rewrittenSelectors.push(replacePseudoStatesWithAncestorSelector(negatedSelector,forShadowDOM));return `:not(${rewrittenSelectors.join(", ")})`},rewriteRule=({cssText,selectorText},forShadowDOM)=>cssText.replace(selectorText,splitSelectors(selectorText).flatMap(selector=>{if(selector.includes(".pseudo-"))return [];let replacementSelectors=[selector];if(!matchOne.test(selector))return replacementSelectors;let classSelector=replacePseudoStates(selector);classSelector!==selector&&replacementSelectors.push(classSelector);let ancestorSelector="";if(selector.startsWith(":host(")){let matches=selector.match(/^:host\((\S+)\)\s+(.+)$/);if(matches&&matchOne.test(matches[2])){let hostInnerSelector=matches[1],descendantSelector=matches[2];hostInnerSelector=replacePseudoStates(hostInnerSelector,!0),descendantSelector=rewriteNotSelectors(descendantSelector,!0),ancestorSelector=replacePseudoStatesWithAncestorSelector(descendantSelector,!0,hostInnerSelector);}else ancestorSelector=replacePseudoStates(selector,!0);}else {let withNotsReplaced=rewriteNotSelectors(selector,forShadowDOM);ancestorSelector=replacePseudoStatesWithAncestorSelector(withNotsReplaced,forShadowDOM);}return replacementSelectors.push(ancestorSelector),replacementSelectors}).join(", ")),rewriteStyleSheet=(sheet,forShadowDOM=!1)=>{try{let count=rewriteRuleContainer(sheet,1e3,forShadowDOM);return count>=1e3&&warnOnce("Reached maximum of 1000 pseudo selectors per sheet, skipping the rest."),count>0}catch(e){return String(e).includes("cssRules")?warnOnce(`Can't access cssRules, likely due to CORS restrictions: ${sheet.href}`):console.error(e,sheet.href),!1}},rewriteRuleContainer=(ruleContainer,rewriteLimit,forShadowDOM)=>{let count=0,index=-1;for(let cssRule of ruleContainer.cssRules){index++;let numRewritten=0;if(cssRule.__processed)numRewritten=cssRule.__pseudoStatesRewrittenCount;else {if("cssRules"in cssRule&&cssRule.cssRules.length)numRewritten=rewriteRuleContainer(cssRule,rewriteLimit-count,forShadowDOM);else {if(!("selectorText"in cssRule))continue;let styleRule=cssRule;if(matchOne.test(styleRule.selectorText)){let newRule=rewriteRule(styleRule,forShadowDOM);ruleContainer.deleteRule(index),ruleContainer.insertRule(newRule,index),numRewritten=1;}}cssRule.__processed=!0,cssRule.__pseudoStatesRewrittenCount=numRewritten;}if(count+=numRewritten,count>=rewriteLimit)break}return count};var channel=previewApi.addons.getChannel(),shadowHosts=new Set,applyClasses=(element,classnames)=>{Object.values(PSEUDO_STATES).forEach(state=>{element.classList.remove(`pseudo-${state}`),element.classList.remove(`pseudo-${state}-all`);}),classnames.forEach(classname=>element.classList.add(classname));};function querySelectorPiercingShadowDOM(root,selector){let results=[];return root.querySelectorAll("*").forEach(el=>{el.shadowRoot&&results.push(...querySelectorPiercingShadowDOM(el.shadowRoot,selector));}),results.push(...root.querySelectorAll(selector).values()),results}var applyParameter=(rootElement,parameter={})=>{let map=new Map([[rootElement,new Set]]),add=(target,state)=>map.set(target,new Set([...map.get(target)||[],state]));Object.entries(parameter||{}).forEach(([state,value])=>{typeof value=="boolean"?value&&add(rootElement,`${state}-all`):typeof value=="string"?querySelectorPiercingShadowDOM(rootElement,value).forEach(el=>add(el,state)):Array.isArray(value)&&value.forEach(sel=>querySelectorPiercingShadowDOM(rootElement,sel).forEach(el=>add(el,state)));}),map.forEach((states,target)=>{let classnames=new Set;states.forEach(key=>{let keyWithoutAll=key.replace("-all","");PSEUDO_STATES[key]?classnames.add(`pseudo-${PSEUDO_STATES[key]}`):PSEUDO_STATES[keyWithoutAll]&&classnames.add(`pseudo-${PSEUDO_STATES[keyWithoutAll]}-all`);}),applyClasses(target,classnames);});},updateShadowHost=shadowHost=>{let classnames=new Set;shadowHost.className.split(" ").filter(classname=>classname.match(/^pseudo-(.(?!-all))+$/)).forEach(classname=>classnames.add(classname));for(let node=shadowHost.parentNode;node;){if(node instanceof ShadowRoot){node=node.host;continue}if(node instanceof Element){let element=node;element.className&&element.className.split(" ").filter(classname=>classname.match(/^pseudo-.+-all$/)!==null).forEach(classname=>classnames.add(classname));}node=node.parentNode;}applyClasses(shadowHost,classnames);},pseudoConfig=parameter=>{let{rootSelector,...pseudoStateConfig}=parameter||{};return pseudoStateConfig},equals=(a={},b={})=>a!==null&&b!==null&&Object.keys(a).length===Object.keys(b).length&&Object.keys(a).every(key=>JSON.stringify(a[key])===JSON.stringify(b[key])),withPseudoState=(StoryFn,{viewMode,parameters,id,globals:globalsArgs})=>{let{pseudo:parameter}=parameters,{pseudo:globals}=globalsArgs,{rootSelector}=parameter||{},rootElement=previewApi.useMemo(()=>rootSelector?document.querySelector(rootSelector):viewMode==="docs"?document.getElementById(`story--${id}`):document.getElementById("storybook-root")||document.getElementById("root"),[rootSelector,viewMode,id]),globalsRef=previewApi.useRef(globals);return previewApi.useEffect(()=>{let config=pseudoConfig(parameter);viewMode==="story"&&!equals(config,globalsRef.current)&&channel.emit(coreEvents.UPDATE_GLOBALS,{globals:{pseudo:config}});},[parameter,viewMode]),previewApi.useEffect(()=>{if(!rootElement)return;let timeout=setTimeout(()=>{applyParameter(rootElement,globals||pseudoConfig(parameter)),shadowHosts.forEach(updateShadowHost);},0);return ()=>clearTimeout(timeout)},[rootElement,globals,parameter]),StoryFn()},rewriteStyleSheets=shadowRoot=>{let styleSheets=Array.from(shadowRoot?shadowRoot.styleSheets:document.styleSheets);shadowRoot?.adoptedStyleSheets?.length&&(styleSheets=shadowRoot.adoptedStyleSheets),styleSheets.forEach(sheet=>rewriteStyleSheet(sheet,!!shadowRoot)),shadowRoot&&shadowHosts&&shadowHosts.add(shadowRoot.host);};channel.on(coreEvents.STORY_CHANGED,()=>shadowHosts.clear());channel.on(coreEvents.STORY_RENDERED,()=>rewriteStyleSheets());channel.on(coreEvents.GLOBALS_UPDATED,()=>rewriteStyleSheets());channel.on(coreEvents.FORCE_RE_RENDER,()=>rewriteStyleSheets());channel.on(coreEvents.FORCE_REMOUNT,()=>rewriteStyleSheets());channel.on(coreEvents.DOCS_RENDERED,()=>rewriteStyleSheets());Element.prototype.attachShadow&&(Element.prototype._attachShadow=Element.prototype.attachShadow,Element.prototype.attachShadow=function(init){let shadowRoot=this._attachShadow({...init,mode:"open"});return requestAnimationFrame(()=>{rewriteStyleSheets(shadowRoot),shadowHosts.has(shadowRoot.host)&&updateShadowHost(shadowRoot.host);}),shadowRoot});var decorators=[withPseudoState],initialGlobals={[PARAM_KEY]:!1};
7
-
8
- exports.decorators = decorators;
9
- exports.initialGlobals = initialGlobals;
1
+ import {
2
+ decorators,
3
+ initialGlobals
4
+ } from "./_browser-chunks/chunk-5GW7LIKW.js";
5
+ import "./_browser-chunks/chunk-7CQCSQMX.js";
6
+ export {
7
+ decorators,
8
+ initialGlobals
9
+ };
package/manager.js CHANGED
@@ -1 +1 @@
1
- import './dist/manager';
1
+ export * from './dist/manager.js';
package/package.json CHANGED
@@ -1,12 +1,21 @@
1
1
  {
2
2
  "name": "storybook-addon-pseudo-states",
3
- "version": "9.2.0-alpha.3",
4
- "description": "CSS pseudo states for Storybook",
3
+ "version": "10.0.0-beta.0",
4
+ "description": "Storybook Pseudo-states addon: Manipulate CSS pseudo states",
5
5
  "keywords": [
6
6
  "storybook",
7
+ "storybook-addon",
8
+ "css",
7
9
  "pseudo states",
8
10
  "style",
9
- "test"
11
+ "test",
12
+ "component",
13
+ "components",
14
+ "react",
15
+ "vue",
16
+ "angular",
17
+ "svelte",
18
+ "web-components"
10
19
  ],
11
20
  "homepage": "https://github.com/storybookjs/storybook/tree/next/code/addons/pseudo-states",
12
21
  "bugs": {
@@ -22,24 +31,19 @@
22
31
  "url": "https://opencollective.com/storybook"
23
32
  },
24
33
  "license": "MIT",
34
+ "type": "module",
25
35
  "exports": {
26
36
  ".": {
27
37
  "types": "./dist/index.d.ts",
28
- "import": "./dist/index.mjs",
29
- "require": "./dist/index.js"
38
+ "default": "./dist/index.js"
30
39
  },
40
+ "./manager": "./dist/manager.js",
41
+ "./package.json": "./package.json",
31
42
  "./preview": {
32
43
  "types": "./dist/preview.d.ts",
33
- "import": "./dist/preview.mjs",
34
- "require": "./dist/preview.js"
35
- },
36
- "./manager": "./dist/manager.js",
37
- "./register": "./dist/manager.js",
38
- "./package.json": "./package.json"
44
+ "default": "./dist/preview.js"
45
+ }
39
46
  },
40
- "main": "dist/index.js",
41
- "module": "dist/index.mjs",
42
- "types": "dist/index.d.ts",
43
47
  "files": [
44
48
  "*.js",
45
49
  "*.d.ts",
@@ -47,8 +51,8 @@
47
51
  "!src/**/*"
48
52
  ],
49
53
  "scripts": {
50
- "check": "jiti ../../../scripts/prepare/check.ts",
51
- "prep": "jiti ../../../scripts/prepare/addon-bundle.ts"
54
+ "check": "jiti ../../../scripts/check/check-package.ts",
55
+ "prep": "jiti ../../../scripts/build/build-package.ts"
52
56
  },
53
57
  "devDependencies": {
54
58
  "@storybook/icons": "^1.4.0",
@@ -57,22 +61,11 @@
57
61
  "typescript": "^5.8.3"
58
62
  },
59
63
  "peerDependencies": {
60
- "storybook": "^9.2.0-alpha.3"
64
+ "storybook": "^10.0.0-beta.0"
61
65
  },
62
66
  "publishConfig": {
63
67
  "access": "public"
64
68
  },
65
- "bundler": {
66
- "exportEntries": [
67
- "./src/index.ts"
68
- ],
69
- "managerEntries": [
70
- "./src/manager.ts"
71
- ],
72
- "previewEntries": [
73
- "./src/preview.ts"
74
- ]
75
- },
76
69
  "storybook": {
77
70
  "displayName": "Pseudo States",
78
71
  "icon": "https://user-images.githubusercontent.com/321738/105224055-f6c29c00-5b5c-11eb-83c9-ba28a7fbadf2.gif",
package/preview.js CHANGED
@@ -1 +1 @@
1
- export * from './dist/preview';
1
+ export * from './dist/preview.js';
package/dist/index.mjs DELETED
@@ -1,7 +0,0 @@
1
- import { definePreviewAddon } from 'storybook/internal/csf';
2
- import { STORY_CHANGED, STORY_RENDERED, GLOBALS_UPDATED, FORCE_RE_RENDER, FORCE_REMOUNT, DOCS_RENDERED, UPDATE_GLOBALS } from 'storybook/internal/core-events';
3
- import { addons, useMemo, useRef, useEffect } from 'storybook/preview-api';
4
-
5
- var __defProp=Object.defineProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0});};var preview_exports={};__export(preview_exports,{decorators:()=>decorators,initialGlobals:()=>initialGlobals});var PARAM_KEY="pseudo",EXCLUDED_PSEUDO_ELEMENT_PATTERNS=["::-(webkit|moz|ms)-[a-z-]+","::part\\([^)]+\\)"],EXCLUDED_PSEUDO_ESCAPE_SEQUENCE="(?<=(?<!\\\\)(?:\\\\\\\\)*)",PSEUDO_STATES={hover:"hover",active:"active",focusVisible:"focus-visible",focusWithin:"focus-within",focus:"focus",visited:"visited",link:"link",target:"target"};var isAtRule=selector=>selector.indexOf("@")===0,splitSelectors=selectors=>{if(isAtRule(selectors))return [selectors];let result=[],parentheses=0,brackets=0,selector="";for(let i=0,len=selectors.length;i<len;i++){let char=selectors[i];if(char==="(")parentheses+=1;else if(char===")")parentheses-=1;else if(char==="[")brackets+=1;else if(char==="]")brackets-=1;else if(char===","&&!parentheses&&!brackets){result.push(selector.trim()),selector="";continue}selector+=char;}return result.push(selector.trim()),result};var pseudoStates=Object.values(PSEUDO_STATES),pseudoStatesPattern=`${EXCLUDED_PSEUDO_ESCAPE_SEQUENCE}:(${pseudoStates.join("|")})`,matchOne=new RegExp(pseudoStatesPattern),matchAll=new RegExp(pseudoStatesPattern,"g"),warnings=new Set,warnOnce=message=>{warnings.has(message)||(console.warn(message),warnings.add(message));},replacePseudoStates=(selector,allClass)=>{let negativeLookbehind=`(?<!(?:${EXCLUDED_PSEUDO_ELEMENT_PATTERNS.join("|")})\\S*)`;return pseudoStates.reduce((acc,state)=>acc.replace(new RegExp(`${negativeLookbehind}${EXCLUDED_PSEUDO_ESCAPE_SEQUENCE}:${state}`,"g"),`.pseudo-${state}${allClass?"-all":""}`),selector)},replacePseudoStatesWithAncestorSelector=(selector,forShadowDOM,additionalHostSelectors)=>{let extracted=extractPseudoStates(selector);if(extracted.states.length===0&&!additionalHostSelectors)return selector;let selectors=`${additionalHostSelectors??""}${extracted.states.map(s=>`.pseudo-${s}-all`).join("")}`,{withoutPseudoStates}=extracted;return withoutPseudoStates=withoutPseudoStates.replace(":host-context(*)","").trimStart(),withoutPseudoStates.startsWith(":host-context(")?withoutPseudoStates.replace(/(?<=:host-context\(\S+)\)/,`)${selectors}`):forShadowDOM?`:host(${selectors}) ${withoutPseudoStates}`:`${selectors} ${withoutPseudoStates}`},extractPseudoStates=selector=>{let states=new Set,withoutPseudoStates=selector.replace(matchAll,(_,state)=>(states.add(state),"")).replaceAll(/(?<!is)\(\)/g,"(*)").replace(/(?<=[\s(]),\s+|(,\s+)+(?=\))/g,"")||"*";return {states:Array.from(states),withoutPseudoStates}},rewriteNotSelectors=(selector,forShadowDOM)=>[...selector.matchAll(/:not\(([^)]+)\)/g)].reduce((acc,match)=>{let originalNot=match[0],selectorList=match[1],rewrittenNot=rewriteNotSelector(selectorList,forShadowDOM);return acc.replace(originalNot,rewrittenNot)},selector),rewriteNotSelector=(negatedSelectorList,forShadowDOM)=>{let rewrittenSelectors=[];for(let negatedSelector of negatedSelectorList.split(/,\s*/))rewrittenSelectors.push(replacePseudoStatesWithAncestorSelector(negatedSelector,forShadowDOM));return `:not(${rewrittenSelectors.join(", ")})`},rewriteRule=({cssText,selectorText},forShadowDOM)=>cssText.replace(selectorText,splitSelectors(selectorText).flatMap(selector=>{if(selector.includes(".pseudo-"))return [];let replacementSelectors=[selector];if(!matchOne.test(selector))return replacementSelectors;let classSelector=replacePseudoStates(selector);classSelector!==selector&&replacementSelectors.push(classSelector);let ancestorSelector="";if(selector.startsWith(":host(")){let matches=selector.match(/^:host\((\S+)\)\s+(.+)$/);if(matches&&matchOne.test(matches[2])){let hostInnerSelector=matches[1],descendantSelector=matches[2];hostInnerSelector=replacePseudoStates(hostInnerSelector,!0),descendantSelector=rewriteNotSelectors(descendantSelector,!0),ancestorSelector=replacePseudoStatesWithAncestorSelector(descendantSelector,!0,hostInnerSelector);}else ancestorSelector=replacePseudoStates(selector,!0);}else {let withNotsReplaced=rewriteNotSelectors(selector,forShadowDOM);ancestorSelector=replacePseudoStatesWithAncestorSelector(withNotsReplaced,forShadowDOM);}return replacementSelectors.push(ancestorSelector),replacementSelectors}).join(", ")),rewriteStyleSheet=(sheet,forShadowDOM=!1)=>{try{let count=rewriteRuleContainer(sheet,1e3,forShadowDOM);return count>=1e3&&warnOnce("Reached maximum of 1000 pseudo selectors per sheet, skipping the rest."),count>0}catch(e){return String(e).includes("cssRules")?warnOnce(`Can't access cssRules, likely due to CORS restrictions: ${sheet.href}`):console.error(e,sheet.href),!1}},rewriteRuleContainer=(ruleContainer,rewriteLimit,forShadowDOM)=>{let count=0,index=-1;for(let cssRule of ruleContainer.cssRules){index++;let numRewritten=0;if(cssRule.__processed)numRewritten=cssRule.__pseudoStatesRewrittenCount;else {if("cssRules"in cssRule&&cssRule.cssRules.length)numRewritten=rewriteRuleContainer(cssRule,rewriteLimit-count,forShadowDOM);else {if(!("selectorText"in cssRule))continue;let styleRule=cssRule;if(matchOne.test(styleRule.selectorText)){let newRule=rewriteRule(styleRule,forShadowDOM);ruleContainer.deleteRule(index),ruleContainer.insertRule(newRule,index),numRewritten=1;}}cssRule.__processed=!0,cssRule.__pseudoStatesRewrittenCount=numRewritten;}if(count+=numRewritten,count>=rewriteLimit)break}return count};var channel=addons.getChannel(),shadowHosts=new Set,applyClasses=(element,classnames)=>{Object.values(PSEUDO_STATES).forEach(state=>{element.classList.remove(`pseudo-${state}`),element.classList.remove(`pseudo-${state}-all`);}),classnames.forEach(classname=>element.classList.add(classname));};function querySelectorPiercingShadowDOM(root,selector){let results=[];return root.querySelectorAll("*").forEach(el=>{el.shadowRoot&&results.push(...querySelectorPiercingShadowDOM(el.shadowRoot,selector));}),results.push(...root.querySelectorAll(selector).values()),results}var applyParameter=(rootElement,parameter={})=>{let map=new Map([[rootElement,new Set]]),add=(target,state)=>map.set(target,new Set([...map.get(target)||[],state]));Object.entries(parameter||{}).forEach(([state,value])=>{typeof value=="boolean"?value&&add(rootElement,`${state}-all`):typeof value=="string"?querySelectorPiercingShadowDOM(rootElement,value).forEach(el=>add(el,state)):Array.isArray(value)&&value.forEach(sel=>querySelectorPiercingShadowDOM(rootElement,sel).forEach(el=>add(el,state)));}),map.forEach((states,target)=>{let classnames=new Set;states.forEach(key=>{let keyWithoutAll=key.replace("-all","");PSEUDO_STATES[key]?classnames.add(`pseudo-${PSEUDO_STATES[key]}`):PSEUDO_STATES[keyWithoutAll]&&classnames.add(`pseudo-${PSEUDO_STATES[keyWithoutAll]}-all`);}),applyClasses(target,classnames);});},updateShadowHost=shadowHost=>{let classnames=new Set;shadowHost.className.split(" ").filter(classname=>classname.match(/^pseudo-(.(?!-all))+$/)).forEach(classname=>classnames.add(classname));for(let node=shadowHost.parentNode;node;){if(node instanceof ShadowRoot){node=node.host;continue}if(node instanceof Element){let element=node;element.className&&element.className.split(" ").filter(classname=>classname.match(/^pseudo-.+-all$/)!==null).forEach(classname=>classnames.add(classname));}node=node.parentNode;}applyClasses(shadowHost,classnames);},pseudoConfig=parameter=>{let{rootSelector,...pseudoStateConfig}=parameter||{};return pseudoStateConfig},equals=(a={},b={})=>a!==null&&b!==null&&Object.keys(a).length===Object.keys(b).length&&Object.keys(a).every(key=>JSON.stringify(a[key])===JSON.stringify(b[key])),withPseudoState=(StoryFn,{viewMode,parameters,id,globals:globalsArgs})=>{let{pseudo:parameter}=parameters,{pseudo:globals}=globalsArgs,{rootSelector}=parameter||{},rootElement=useMemo(()=>rootSelector?document.querySelector(rootSelector):viewMode==="docs"?document.getElementById(`story--${id}`):document.getElementById("storybook-root")||document.getElementById("root"),[rootSelector,viewMode,id]),globalsRef=useRef(globals);return useEffect(()=>{let config=pseudoConfig(parameter);viewMode==="story"&&!equals(config,globalsRef.current)&&channel.emit(UPDATE_GLOBALS,{globals:{pseudo:config}});},[parameter,viewMode]),useEffect(()=>{if(!rootElement)return;let timeout=setTimeout(()=>{applyParameter(rootElement,globals||pseudoConfig(parameter)),shadowHosts.forEach(updateShadowHost);},0);return ()=>clearTimeout(timeout)},[rootElement,globals,parameter]),StoryFn()},rewriteStyleSheets=shadowRoot=>{let styleSheets=Array.from(shadowRoot?shadowRoot.styleSheets:document.styleSheets);shadowRoot?.adoptedStyleSheets?.length&&(styleSheets=shadowRoot.adoptedStyleSheets),styleSheets.forEach(sheet=>rewriteStyleSheet(sheet,!!shadowRoot)),shadowRoot&&shadowHosts&&shadowHosts.add(shadowRoot.host);};channel.on(STORY_CHANGED,()=>shadowHosts.clear());channel.on(STORY_RENDERED,()=>rewriteStyleSheets());channel.on(GLOBALS_UPDATED,()=>rewriteStyleSheets());channel.on(FORCE_RE_RENDER,()=>rewriteStyleSheets());channel.on(FORCE_REMOUNT,()=>rewriteStyleSheets());channel.on(DOCS_RENDERED,()=>rewriteStyleSheets());Element.prototype.attachShadow&&(Element.prototype._attachShadow=Element.prototype.attachShadow,Element.prototype.attachShadow=function(init){let shadowRoot=this._attachShadow({...init,mode:"open"});return requestAnimationFrame(()=>{rewriteStyleSheets(shadowRoot),shadowHosts.has(shadowRoot.host)&&updateShadowHost(shadowRoot.host);}),shadowRoot});var decorators=[withPseudoState],initialGlobals={[PARAM_KEY]:!1};var index_default=()=>definePreviewAddon(preview_exports);
6
-
7
- export { PARAM_KEY, index_default as default };
package/dist/preview.mjs DELETED
@@ -1,6 +0,0 @@
1
- import { STORY_CHANGED, STORY_RENDERED, GLOBALS_UPDATED, FORCE_RE_RENDER, FORCE_REMOUNT, DOCS_RENDERED, UPDATE_GLOBALS } from 'storybook/internal/core-events';
2
- import { addons, useMemo, useRef, useEffect } from 'storybook/preview-api';
3
-
4
- var PARAM_KEY="pseudo",EXCLUDED_PSEUDO_ELEMENT_PATTERNS=["::-(webkit|moz|ms)-[a-z-]+","::part\\([^)]+\\)"],EXCLUDED_PSEUDO_ESCAPE_SEQUENCE="(?<=(?<!\\\\)(?:\\\\\\\\)*)",PSEUDO_STATES={hover:"hover",active:"active",focusVisible:"focus-visible",focusWithin:"focus-within",focus:"focus",visited:"visited",link:"link",target:"target"};var isAtRule=selector=>selector.indexOf("@")===0,splitSelectors=selectors=>{if(isAtRule(selectors))return [selectors];let result=[],parentheses=0,brackets=0,selector="";for(let i=0,len=selectors.length;i<len;i++){let char=selectors[i];if(char==="(")parentheses+=1;else if(char===")")parentheses-=1;else if(char==="[")brackets+=1;else if(char==="]")brackets-=1;else if(char===","&&!parentheses&&!brackets){result.push(selector.trim()),selector="";continue}selector+=char;}return result.push(selector.trim()),result};var pseudoStates=Object.values(PSEUDO_STATES),pseudoStatesPattern=`${EXCLUDED_PSEUDO_ESCAPE_SEQUENCE}:(${pseudoStates.join("|")})`,matchOne=new RegExp(pseudoStatesPattern),matchAll=new RegExp(pseudoStatesPattern,"g"),warnings=new Set,warnOnce=message=>{warnings.has(message)||(console.warn(message),warnings.add(message));},replacePseudoStates=(selector,allClass)=>{let negativeLookbehind=`(?<!(?:${EXCLUDED_PSEUDO_ELEMENT_PATTERNS.join("|")})\\S*)`;return pseudoStates.reduce((acc,state)=>acc.replace(new RegExp(`${negativeLookbehind}${EXCLUDED_PSEUDO_ESCAPE_SEQUENCE}:${state}`,"g"),`.pseudo-${state}${allClass?"-all":""}`),selector)},replacePseudoStatesWithAncestorSelector=(selector,forShadowDOM,additionalHostSelectors)=>{let extracted=extractPseudoStates(selector);if(extracted.states.length===0&&!additionalHostSelectors)return selector;let selectors=`${additionalHostSelectors??""}${extracted.states.map(s=>`.pseudo-${s}-all`).join("")}`,{withoutPseudoStates}=extracted;return withoutPseudoStates=withoutPseudoStates.replace(":host-context(*)","").trimStart(),withoutPseudoStates.startsWith(":host-context(")?withoutPseudoStates.replace(/(?<=:host-context\(\S+)\)/,`)${selectors}`):forShadowDOM?`:host(${selectors}) ${withoutPseudoStates}`:`${selectors} ${withoutPseudoStates}`},extractPseudoStates=selector=>{let states=new Set,withoutPseudoStates=selector.replace(matchAll,(_,state)=>(states.add(state),"")).replaceAll(/(?<!is)\(\)/g,"(*)").replace(/(?<=[\s(]),\s+|(,\s+)+(?=\))/g,"")||"*";return {states:Array.from(states),withoutPseudoStates}},rewriteNotSelectors=(selector,forShadowDOM)=>[...selector.matchAll(/:not\(([^)]+)\)/g)].reduce((acc,match)=>{let originalNot=match[0],selectorList=match[1],rewrittenNot=rewriteNotSelector(selectorList,forShadowDOM);return acc.replace(originalNot,rewrittenNot)},selector),rewriteNotSelector=(negatedSelectorList,forShadowDOM)=>{let rewrittenSelectors=[];for(let negatedSelector of negatedSelectorList.split(/,\s*/))rewrittenSelectors.push(replacePseudoStatesWithAncestorSelector(negatedSelector,forShadowDOM));return `:not(${rewrittenSelectors.join(", ")})`},rewriteRule=({cssText,selectorText},forShadowDOM)=>cssText.replace(selectorText,splitSelectors(selectorText).flatMap(selector=>{if(selector.includes(".pseudo-"))return [];let replacementSelectors=[selector];if(!matchOne.test(selector))return replacementSelectors;let classSelector=replacePseudoStates(selector);classSelector!==selector&&replacementSelectors.push(classSelector);let ancestorSelector="";if(selector.startsWith(":host(")){let matches=selector.match(/^:host\((\S+)\)\s+(.+)$/);if(matches&&matchOne.test(matches[2])){let hostInnerSelector=matches[1],descendantSelector=matches[2];hostInnerSelector=replacePseudoStates(hostInnerSelector,!0),descendantSelector=rewriteNotSelectors(descendantSelector,!0),ancestorSelector=replacePseudoStatesWithAncestorSelector(descendantSelector,!0,hostInnerSelector);}else ancestorSelector=replacePseudoStates(selector,!0);}else {let withNotsReplaced=rewriteNotSelectors(selector,forShadowDOM);ancestorSelector=replacePseudoStatesWithAncestorSelector(withNotsReplaced,forShadowDOM);}return replacementSelectors.push(ancestorSelector),replacementSelectors}).join(", ")),rewriteStyleSheet=(sheet,forShadowDOM=!1)=>{try{let count=rewriteRuleContainer(sheet,1e3,forShadowDOM);return count>=1e3&&warnOnce("Reached maximum of 1000 pseudo selectors per sheet, skipping the rest."),count>0}catch(e){return String(e).includes("cssRules")?warnOnce(`Can't access cssRules, likely due to CORS restrictions: ${sheet.href}`):console.error(e,sheet.href),!1}},rewriteRuleContainer=(ruleContainer,rewriteLimit,forShadowDOM)=>{let count=0,index=-1;for(let cssRule of ruleContainer.cssRules){index++;let numRewritten=0;if(cssRule.__processed)numRewritten=cssRule.__pseudoStatesRewrittenCount;else {if("cssRules"in cssRule&&cssRule.cssRules.length)numRewritten=rewriteRuleContainer(cssRule,rewriteLimit-count,forShadowDOM);else {if(!("selectorText"in cssRule))continue;let styleRule=cssRule;if(matchOne.test(styleRule.selectorText)){let newRule=rewriteRule(styleRule,forShadowDOM);ruleContainer.deleteRule(index),ruleContainer.insertRule(newRule,index),numRewritten=1;}}cssRule.__processed=!0,cssRule.__pseudoStatesRewrittenCount=numRewritten;}if(count+=numRewritten,count>=rewriteLimit)break}return count};var channel=addons.getChannel(),shadowHosts=new Set,applyClasses=(element,classnames)=>{Object.values(PSEUDO_STATES).forEach(state=>{element.classList.remove(`pseudo-${state}`),element.classList.remove(`pseudo-${state}-all`);}),classnames.forEach(classname=>element.classList.add(classname));};function querySelectorPiercingShadowDOM(root,selector){let results=[];return root.querySelectorAll("*").forEach(el=>{el.shadowRoot&&results.push(...querySelectorPiercingShadowDOM(el.shadowRoot,selector));}),results.push(...root.querySelectorAll(selector).values()),results}var applyParameter=(rootElement,parameter={})=>{let map=new Map([[rootElement,new Set]]),add=(target,state)=>map.set(target,new Set([...map.get(target)||[],state]));Object.entries(parameter||{}).forEach(([state,value])=>{typeof value=="boolean"?value&&add(rootElement,`${state}-all`):typeof value=="string"?querySelectorPiercingShadowDOM(rootElement,value).forEach(el=>add(el,state)):Array.isArray(value)&&value.forEach(sel=>querySelectorPiercingShadowDOM(rootElement,sel).forEach(el=>add(el,state)));}),map.forEach((states,target)=>{let classnames=new Set;states.forEach(key=>{let keyWithoutAll=key.replace("-all","");PSEUDO_STATES[key]?classnames.add(`pseudo-${PSEUDO_STATES[key]}`):PSEUDO_STATES[keyWithoutAll]&&classnames.add(`pseudo-${PSEUDO_STATES[keyWithoutAll]}-all`);}),applyClasses(target,classnames);});},updateShadowHost=shadowHost=>{let classnames=new Set;shadowHost.className.split(" ").filter(classname=>classname.match(/^pseudo-(.(?!-all))+$/)).forEach(classname=>classnames.add(classname));for(let node=shadowHost.parentNode;node;){if(node instanceof ShadowRoot){node=node.host;continue}if(node instanceof Element){let element=node;element.className&&element.className.split(" ").filter(classname=>classname.match(/^pseudo-.+-all$/)!==null).forEach(classname=>classnames.add(classname));}node=node.parentNode;}applyClasses(shadowHost,classnames);},pseudoConfig=parameter=>{let{rootSelector,...pseudoStateConfig}=parameter||{};return pseudoStateConfig},equals=(a={},b={})=>a!==null&&b!==null&&Object.keys(a).length===Object.keys(b).length&&Object.keys(a).every(key=>JSON.stringify(a[key])===JSON.stringify(b[key])),withPseudoState=(StoryFn,{viewMode,parameters,id,globals:globalsArgs})=>{let{pseudo:parameter}=parameters,{pseudo:globals}=globalsArgs,{rootSelector}=parameter||{},rootElement=useMemo(()=>rootSelector?document.querySelector(rootSelector):viewMode==="docs"?document.getElementById(`story--${id}`):document.getElementById("storybook-root")||document.getElementById("root"),[rootSelector,viewMode,id]),globalsRef=useRef(globals);return useEffect(()=>{let config=pseudoConfig(parameter);viewMode==="story"&&!equals(config,globalsRef.current)&&channel.emit(UPDATE_GLOBALS,{globals:{pseudo:config}});},[parameter,viewMode]),useEffect(()=>{if(!rootElement)return;let timeout=setTimeout(()=>{applyParameter(rootElement,globals||pseudoConfig(parameter)),shadowHosts.forEach(updateShadowHost);},0);return ()=>clearTimeout(timeout)},[rootElement,globals,parameter]),StoryFn()},rewriteStyleSheets=shadowRoot=>{let styleSheets=Array.from(shadowRoot?shadowRoot.styleSheets:document.styleSheets);shadowRoot?.adoptedStyleSheets?.length&&(styleSheets=shadowRoot.adoptedStyleSheets),styleSheets.forEach(sheet=>rewriteStyleSheet(sheet,!!shadowRoot)),shadowRoot&&shadowHosts&&shadowHosts.add(shadowRoot.host);};channel.on(STORY_CHANGED,()=>shadowHosts.clear());channel.on(STORY_RENDERED,()=>rewriteStyleSheets());channel.on(GLOBALS_UPDATED,()=>rewriteStyleSheets());channel.on(FORCE_RE_RENDER,()=>rewriteStyleSheets());channel.on(FORCE_REMOUNT,()=>rewriteStyleSheets());channel.on(DOCS_RENDERED,()=>rewriteStyleSheets());Element.prototype.attachShadow&&(Element.prototype._attachShadow=Element.prototype.attachShadow,Element.prototype.attachShadow=function(init){let shadowRoot=this._attachShadow({...init,mode:"open"});return requestAnimationFrame(()=>{rewriteStyleSheets(shadowRoot),shadowHosts.has(shadowRoot.host)&&updateShadowHost(shadowRoot.host);}),shadowRoot});var decorators=[withPseudoState],initialGlobals={[PARAM_KEY]:!1};
5
-
6
- export { decorators, initialGlobals };