@storybook/addon-themes 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 +4 -2
- package/dist/_browser-chunks/chunk-D4FRO6NL.js +32 -0
- package/dist/_browser-chunks/chunk-R6XDDBXB.js +18 -0
- package/dist/index.d.ts +2 -6
- package/dist/index.js +141 -18
- package/dist/manager.js +128 -6
- package/dist/postinstall.js +39 -0
- package/dist/preview.js +7 -5
- package/manager.js +1 -1
- package/package.json +20 -39
- package/preview.js +1 -1
- package/dist/index.mjs +0 -11
- package/dist/preview.mjs +0 -3
- package/postinstall.js +0 -25
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @storybook/addon-themes
|
|
2
2
|
|
|
3
|
-
Storybook Addon Themes can be used
|
|
3
|
+
Storybook Addon Themes can be used to switch between multiple themes for components inside the preview in [Storybook](https://storybook.js.org?ref=readme).
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|
|
|
@@ -12,7 +12,7 @@ Requires Storybook 7.0 or later. If you need to add it to your Storybook, you ca
|
|
|
12
12
|
npm i -D @storybook/addon-themes
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/configure#configure-your-storybook-project):
|
|
15
|
+
Then, add following content to [`.storybook/main.js`](https://storybook.js.org/docs/configure#configure-your-storybook-project?ref=readme):
|
|
16
16
|
|
|
17
17
|
```js
|
|
18
18
|
export default {
|
|
@@ -65,3 +65,5 @@ export const PrimaryDark = {
|
|
|
65
65
|
globals: { theme: 'dark' },
|
|
66
66
|
};
|
|
67
67
|
```
|
|
68
|
+
|
|
69
|
+
Learn more about Storybook at [storybook.js.org](https://storybook.js.org/?ref=readme).
|
|
@@ -0,0 +1,32 @@
|
|
|
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 PARAM_KEY = "themes";
|
|
10
|
+
var ADDON_ID = `storybook/${PARAM_KEY}`;
|
|
11
|
+
var GLOBAL_KEY = "theme";
|
|
12
|
+
var THEME_SWITCHER_ID = `${ADDON_ID}/theme-switcher`;
|
|
13
|
+
var DEFAULT_ADDON_STATE = {
|
|
14
|
+
themesList: [],
|
|
15
|
+
themeDefault: void 0
|
|
16
|
+
};
|
|
17
|
+
var DEFAULT_THEME_PARAMETERS = {};
|
|
18
|
+
var THEMING_EVENTS = {
|
|
19
|
+
REGISTER_THEMES: `${ADDON_ID}/REGISTER_THEMES`
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export {
|
|
23
|
+
__name,
|
|
24
|
+
__export,
|
|
25
|
+
PARAM_KEY,
|
|
26
|
+
ADDON_ID,
|
|
27
|
+
GLOBAL_KEY,
|
|
28
|
+
THEME_SWITCHER_ID,
|
|
29
|
+
DEFAULT_ADDON_STATE,
|
|
30
|
+
DEFAULT_THEME_PARAMETERS,
|
|
31
|
+
THEMING_EVENTS
|
|
32
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {
|
|
2
|
+
GLOBAL_KEY,
|
|
3
|
+
__export
|
|
4
|
+
} from "./chunk-D4FRO6NL.js";
|
|
5
|
+
|
|
6
|
+
// src/preview.ts
|
|
7
|
+
var preview_exports = {};
|
|
8
|
+
__export(preview_exports, {
|
|
9
|
+
initialGlobals: () => initialGlobals
|
|
10
|
+
});
|
|
11
|
+
var initialGlobals = {
|
|
12
|
+
[GLOBAL_KEY]: ""
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
initialGlobals,
|
|
17
|
+
preview_exports
|
|
18
|
+
};
|
package/dist/index.d.ts
CHANGED
|
@@ -61,13 +61,9 @@ declare const helpers_initializeThemeState: typeof initializeThemeState;
|
|
|
61
61
|
declare const helpers_pluckThemeFromContext: typeof pluckThemeFromContext;
|
|
62
62
|
declare const helpers_useThemeParameters: typeof useThemeParameters;
|
|
63
63
|
declare namespace helpers {
|
|
64
|
-
export {
|
|
65
|
-
helpers_initializeThemeState as initializeThemeState,
|
|
66
|
-
helpers_pluckThemeFromContext as pluckThemeFromContext,
|
|
67
|
-
helpers_useThemeParameters as useThemeParameters,
|
|
68
|
-
};
|
|
64
|
+
export { helpers_initializeThemeState as initializeThemeState, helpers_pluckThemeFromContext as pluckThemeFromContext, helpers_useThemeParameters as useThemeParameters };
|
|
69
65
|
}
|
|
70
66
|
|
|
71
67
|
declare const _default: () => storybook_internal_csf.PreviewAddon<ThemesTypes>;
|
|
72
68
|
|
|
73
|
-
export { ClassNameStrategyConfiguration, DataAttributeStrategyConfiguration, helpers as DecoratorHelpers, ProviderStrategyConfiguration, ThemesTypes, _default as default, withThemeByClassName, withThemeByDataAttribute, withThemeFromJSXProvider };
|
|
69
|
+
export { type ClassNameStrategyConfiguration, type DataAttributeStrategyConfiguration, helpers as DecoratorHelpers, type ProviderStrategyConfiguration, type ThemesTypes, _default as default, withThemeByClassName, withThemeByDataAttribute, withThemeFromJSXProvider };
|
package/dist/index.js
CHANGED
|
@@ -1,24 +1,147 @@
|
|
|
1
|
-
|
|
1
|
+
import {
|
|
2
|
+
preview_exports
|
|
3
|
+
} from "./_browser-chunks/chunk-R6XDDBXB.js";
|
|
4
|
+
import {
|
|
5
|
+
DEFAULT_THEME_PARAMETERS,
|
|
6
|
+
GLOBAL_KEY,
|
|
7
|
+
PARAM_KEY,
|
|
8
|
+
THEMING_EVENTS,
|
|
9
|
+
__export,
|
|
10
|
+
__name
|
|
11
|
+
} from "./_browser-chunks/chunk-D4FRO6NL.js";
|
|
2
12
|
|
|
3
|
-
|
|
13
|
+
// src/index.ts
|
|
14
|
+
import { definePreviewAddon } from "storybook/internal/csf";
|
|
4
15
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
var clientLogger = require('storybook/internal/client-logger');
|
|
8
|
-
var dedent = require('ts-dedent');
|
|
9
|
-
var React = require('react');
|
|
16
|
+
// src/decorators/class-name.decorator.tsx
|
|
17
|
+
import { useEffect } from "storybook/preview-api";
|
|
10
18
|
|
|
11
|
-
|
|
19
|
+
// src/decorators/helpers.ts
|
|
20
|
+
var helpers_exports = {};
|
|
21
|
+
__export(helpers_exports, {
|
|
22
|
+
initializeThemeState: () => initializeThemeState,
|
|
23
|
+
pluckThemeFromContext: () => pluckThemeFromContext,
|
|
24
|
+
useThemeParameters: () => useThemeParameters
|
|
25
|
+
});
|
|
26
|
+
import { deprecate } from "storybook/internal/client-logger";
|
|
27
|
+
import { addons, useParameter } from "storybook/preview-api";
|
|
28
|
+
import { dedent } from "ts-dedent";
|
|
29
|
+
function pluckThemeFromContext({ globals }) {
|
|
30
|
+
return globals[GLOBAL_KEY] || "";
|
|
31
|
+
}
|
|
32
|
+
__name(pluckThemeFromContext, "pluckThemeFromContext");
|
|
33
|
+
function useThemeParameters(context) {
|
|
34
|
+
deprecate(
|
|
35
|
+
dedent`The useThemeParameters function is deprecated. Please access parameters via the context directly instead e.g.
|
|
36
|
+
- const { themeOverride } = context.parameters.themes ?? {};
|
|
37
|
+
`
|
|
38
|
+
);
|
|
39
|
+
if (!context) {
|
|
40
|
+
return useParameter(PARAM_KEY, DEFAULT_THEME_PARAMETERS);
|
|
41
|
+
}
|
|
42
|
+
return context.parameters[PARAM_KEY] ?? DEFAULT_THEME_PARAMETERS;
|
|
43
|
+
}
|
|
44
|
+
__name(useThemeParameters, "useThemeParameters");
|
|
45
|
+
function initializeThemeState(themeNames, defaultTheme) {
|
|
46
|
+
addons.getChannel().emit(THEMING_EVENTS.REGISTER_THEMES, {
|
|
47
|
+
defaultTheme,
|
|
48
|
+
themes: themeNames
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
__name(initializeThemeState, "initializeThemeState");
|
|
12
52
|
|
|
13
|
-
|
|
14
|
-
var
|
|
53
|
+
// src/decorators/class-name.decorator.tsx
|
|
54
|
+
var DEFAULT_ELEMENT_SELECTOR = "html";
|
|
55
|
+
var classStringToArray = /* @__PURE__ */ __name((classString) => classString.split(" ").filter(Boolean), "classStringToArray");
|
|
56
|
+
var withThemeByClassName = /* @__PURE__ */ __name(({
|
|
57
|
+
themes,
|
|
58
|
+
defaultTheme,
|
|
59
|
+
parentSelector = DEFAULT_ELEMENT_SELECTOR
|
|
60
|
+
}) => {
|
|
61
|
+
initializeThemeState(Object.keys(themes), defaultTheme);
|
|
62
|
+
return (storyFn, context) => {
|
|
63
|
+
const { themeOverride } = context.parameters[PARAM_KEY] ?? {};
|
|
64
|
+
const selected = pluckThemeFromContext(context);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
const selectedThemeName = themeOverride || selected || defaultTheme;
|
|
67
|
+
const parentElement = document.querySelector(parentSelector);
|
|
68
|
+
if (!parentElement) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
Object.entries(themes).filter(([themeName]) => themeName !== selectedThemeName).forEach(([themeName, className]) => {
|
|
72
|
+
const classes = classStringToArray(className);
|
|
73
|
+
if (classes.length > 0) {
|
|
74
|
+
parentElement.classList.remove(...classes);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
const newThemeClasses = classStringToArray(themes[selectedThemeName]);
|
|
78
|
+
if (newThemeClasses.length > 0) {
|
|
79
|
+
parentElement.classList.add(...newThemeClasses);
|
|
80
|
+
}
|
|
81
|
+
}, [themeOverride, selected]);
|
|
82
|
+
return storyFn();
|
|
83
|
+
};
|
|
84
|
+
}, "withThemeByClassName");
|
|
15
85
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
86
|
+
// src/decorators/data-attribute.decorator.tsx
|
|
87
|
+
import { useEffect as useEffect2 } from "storybook/preview-api";
|
|
88
|
+
var DEFAULT_ELEMENT_SELECTOR2 = "html";
|
|
89
|
+
var DEFAULT_DATA_ATTRIBUTE = "data-theme";
|
|
90
|
+
var withThemeByDataAttribute = /* @__PURE__ */ __name(({
|
|
91
|
+
themes,
|
|
92
|
+
defaultTheme,
|
|
93
|
+
parentSelector = DEFAULT_ELEMENT_SELECTOR2,
|
|
94
|
+
attributeName = DEFAULT_DATA_ATTRIBUTE
|
|
95
|
+
}) => {
|
|
96
|
+
initializeThemeState(Object.keys(themes), defaultTheme);
|
|
97
|
+
return (storyFn, context) => {
|
|
98
|
+
const { themeOverride } = context.parameters[PARAM_KEY] ?? {};
|
|
99
|
+
const selected = pluckThemeFromContext(context);
|
|
100
|
+
useEffect2(() => {
|
|
101
|
+
const parentElement = document.querySelector(parentSelector);
|
|
102
|
+
const themeKey = themeOverride || selected || defaultTheme;
|
|
103
|
+
if (parentElement) {
|
|
104
|
+
parentElement.setAttribute(attributeName, themes[themeKey]);
|
|
105
|
+
}
|
|
106
|
+
}, [themeOverride, selected]);
|
|
107
|
+
return storyFn();
|
|
108
|
+
};
|
|
109
|
+
}, "withThemeByDataAttribute");
|
|
110
|
+
|
|
111
|
+
// src/decorators/provider.decorator.tsx
|
|
112
|
+
import React from "react";
|
|
113
|
+
import { useMemo } from "storybook/preview-api";
|
|
114
|
+
var pluckThemeFromKeyPairTuple = /* @__PURE__ */ __name(([_, themeConfig]) => themeConfig, "pluckThemeFromKeyPairTuple");
|
|
115
|
+
var withThemeFromJSXProvider = /* @__PURE__ */ __name(({
|
|
116
|
+
Provider,
|
|
117
|
+
GlobalStyles,
|
|
118
|
+
defaultTheme,
|
|
119
|
+
themes = {}
|
|
120
|
+
}) => {
|
|
121
|
+
const themeNames = Object.keys(themes);
|
|
122
|
+
const initialTheme = defaultTheme || themeNames[0];
|
|
123
|
+
initializeThemeState(themeNames, initialTheme);
|
|
124
|
+
return (storyFn, context) => {
|
|
125
|
+
const { themeOverride } = context.parameters[PARAM_KEY] ?? {};
|
|
126
|
+
const selected = pluckThemeFromContext(context);
|
|
127
|
+
const theme = useMemo(() => {
|
|
128
|
+
const selectedThemeName = themeOverride || selected || initialTheme;
|
|
129
|
+
const pairs = Object.entries(themes);
|
|
130
|
+
return pairs.length === 1 ? pluckThemeFromKeyPairTuple(pairs[0]) : themes[selectedThemeName];
|
|
131
|
+
}, [selected, themeOverride]);
|
|
132
|
+
if (!Provider) {
|
|
133
|
+
return React.createElement(React.Fragment, null, GlobalStyles && React.createElement(GlobalStyles, null), storyFn());
|
|
134
|
+
}
|
|
135
|
+
return React.createElement(Provider, { theme }, GlobalStyles && React.createElement(GlobalStyles, null), storyFn());
|
|
136
|
+
};
|
|
137
|
+
}, "withThemeFromJSXProvider");
|
|
19
138
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
139
|
+
// src/index.ts
|
|
140
|
+
var index_default = /* @__PURE__ */ __name(() => definePreviewAddon(preview_exports), "default");
|
|
141
|
+
export {
|
|
142
|
+
helpers_exports as DecoratorHelpers,
|
|
143
|
+
index_default as default,
|
|
144
|
+
withThemeByClassName,
|
|
145
|
+
withThemeByDataAttribute,
|
|
146
|
+
withThemeFromJSXProvider
|
|
147
|
+
};
|
package/dist/manager.js
CHANGED
|
@@ -1,7 +1,129 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import {
|
|
2
|
+
ADDON_ID,
|
|
3
|
+
DEFAULT_ADDON_STATE,
|
|
4
|
+
DEFAULT_THEME_PARAMETERS,
|
|
5
|
+
GLOBAL_KEY,
|
|
6
|
+
PARAM_KEY,
|
|
7
|
+
THEME_SWITCHER_ID,
|
|
8
|
+
THEMING_EVENTS,
|
|
9
|
+
__name
|
|
10
|
+
} from "./_browser-chunks/chunk-D4FRO6NL.js";
|
|
6
11
|
|
|
7
|
-
|
|
12
|
+
// src/manager.tsx
|
|
13
|
+
import { addons as addons2, types } from "storybook/manager-api";
|
|
14
|
+
|
|
15
|
+
// src/theme-switcher.tsx
|
|
16
|
+
import React from "react";
|
|
17
|
+
import { IconButton, TooltipLinkList, WithTooltip } from "storybook/internal/components";
|
|
18
|
+
import { PaintBrushIcon } from "@storybook/icons";
|
|
19
|
+
import { addons, useAddonState, useChannel, useGlobals, useParameter } from "storybook/manager-api";
|
|
20
|
+
import { styled } from "storybook/theming";
|
|
21
|
+
var IconButtonLabel = styled.div(({ theme }) => ({
|
|
22
|
+
fontSize: theme.typography.size.s2 - 1
|
|
23
|
+
}));
|
|
24
|
+
var hasMultipleThemes = /* @__PURE__ */ __name((themesList) => themesList.length > 1, "hasMultipleThemes");
|
|
25
|
+
var hasTwoThemes = /* @__PURE__ */ __name((themesList) => themesList.length === 2, "hasTwoThemes");
|
|
26
|
+
var ThemeSwitcher = React.memo(/* @__PURE__ */ __name(function ThemeSwitcher2() {
|
|
27
|
+
const { themeOverride, disable } = useParameter(
|
|
28
|
+
PARAM_KEY,
|
|
29
|
+
DEFAULT_THEME_PARAMETERS
|
|
30
|
+
);
|
|
31
|
+
const [{ theme: selected }, updateGlobals, storyGlobals] = useGlobals();
|
|
32
|
+
const channel = addons.getChannel();
|
|
33
|
+
const fromLast = channel.last(THEMING_EVENTS.REGISTER_THEMES);
|
|
34
|
+
const initializeThemeState = Object.assign({}, DEFAULT_ADDON_STATE, {
|
|
35
|
+
themesList: fromLast?.[0]?.themes || [],
|
|
36
|
+
themeDefault: fromLast?.[0]?.defaultTheme || ""
|
|
37
|
+
});
|
|
38
|
+
const [{ themesList, themeDefault }, updateState] = useAddonState(
|
|
39
|
+
THEME_SWITCHER_ID,
|
|
40
|
+
initializeThemeState
|
|
41
|
+
);
|
|
42
|
+
const isLocked = GLOBAL_KEY in storyGlobals || !!themeOverride;
|
|
43
|
+
useChannel({
|
|
44
|
+
[THEMING_EVENTS.REGISTER_THEMES]: ({ themes, defaultTheme }) => {
|
|
45
|
+
updateState((state) => ({
|
|
46
|
+
...state,
|
|
47
|
+
themesList: themes,
|
|
48
|
+
themeDefault: defaultTheme
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
const themeName = selected || themeDefault;
|
|
53
|
+
let label = "";
|
|
54
|
+
if (isLocked) {
|
|
55
|
+
label = "Story override";
|
|
56
|
+
} else if (themeName) {
|
|
57
|
+
label = `${themeName} theme`;
|
|
58
|
+
}
|
|
59
|
+
if (disable) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
if (hasTwoThemes(themesList)) {
|
|
63
|
+
const currentTheme = selected || themeDefault;
|
|
64
|
+
const alternateTheme = themesList.find((theme) => theme !== currentTheme);
|
|
65
|
+
return React.createElement(
|
|
66
|
+
IconButton,
|
|
67
|
+
{
|
|
68
|
+
disabled: isLocked,
|
|
69
|
+
key: THEME_SWITCHER_ID,
|
|
70
|
+
active: !themeOverride,
|
|
71
|
+
title: "Theme",
|
|
72
|
+
onClick: () => {
|
|
73
|
+
updateGlobals({ theme: alternateTheme });
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
React.createElement(PaintBrushIcon, null),
|
|
77
|
+
label ? React.createElement(IconButtonLabel, null, label) : null
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
if (hasMultipleThemes(themesList)) {
|
|
81
|
+
return React.createElement(
|
|
82
|
+
WithTooltip,
|
|
83
|
+
{
|
|
84
|
+
placement: "top",
|
|
85
|
+
trigger: "click",
|
|
86
|
+
closeOnOutsideClick: true,
|
|
87
|
+
tooltip: ({ onHide }) => {
|
|
88
|
+
return React.createElement(
|
|
89
|
+
TooltipLinkList,
|
|
90
|
+
{
|
|
91
|
+
links: themesList.map((theme) => ({
|
|
92
|
+
id: theme,
|
|
93
|
+
title: theme,
|
|
94
|
+
active: selected === theme,
|
|
95
|
+
onClick: /* @__PURE__ */ __name(() => {
|
|
96
|
+
updateGlobals({ theme });
|
|
97
|
+
onHide();
|
|
98
|
+
}, "onClick")
|
|
99
|
+
}))
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
React.createElement(
|
|
105
|
+
IconButton,
|
|
106
|
+
{
|
|
107
|
+
key: THEME_SWITCHER_ID,
|
|
108
|
+
active: !themeOverride,
|
|
109
|
+
title: "Theme",
|
|
110
|
+
disabled: isLocked
|
|
111
|
+
},
|
|
112
|
+
React.createElement(PaintBrushIcon, null),
|
|
113
|
+
label && React.createElement(IconButtonLabel, null, label)
|
|
114
|
+
)
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}, "ThemeSwitcher"));
|
|
119
|
+
|
|
120
|
+
// src/manager.tsx
|
|
121
|
+
addons2.register(ADDON_ID, () => {
|
|
122
|
+
addons2.add(THEME_SWITCHER_ID, {
|
|
123
|
+
title: "Themes",
|
|
124
|
+
type: types.TOOL,
|
|
125
|
+
match: /* @__PURE__ */ __name(({ viewMode, tabId }) => !!(viewMode && viewMode.match(/^(story|docs)$/)) && !tabId, "match"),
|
|
126
|
+
render: ThemeSwitcher,
|
|
127
|
+
paramKey: PARAM_KEY
|
|
128
|
+
});
|
|
129
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import CJS_COMPAT_NODE_URL_l6cypphj3q from 'node:url';
|
|
2
|
+
import CJS_COMPAT_NODE_PATH_l6cypphj3q from 'node:path';
|
|
3
|
+
import CJS_COMPAT_NODE_MODULE_l6cypphj3q from "node:module";
|
|
4
|
+
|
|
5
|
+
var __filename = CJS_COMPAT_NODE_URL_l6cypphj3q.fileURLToPath(import.meta.url);
|
|
6
|
+
var __dirname = CJS_COMPAT_NODE_PATH_l6cypphj3q.dirname(__filename);
|
|
7
|
+
var require = CJS_COMPAT_NODE_MODULE_l6cypphj3q.createRequire(import.meta.url);
|
|
8
|
+
|
|
9
|
+
// ------------------------------------------------------------
|
|
10
|
+
// end of CJS compatibility banner, injected by Storybook's esbuild configuration
|
|
11
|
+
// ------------------------------------------------------------
|
|
12
|
+
var __defProp = Object.defineProperty;
|
|
13
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
14
|
+
|
|
15
|
+
// src/postinstall.ts
|
|
16
|
+
import { spawn } from "child_process";
|
|
17
|
+
var PACKAGE_MANAGER_TO_COMMAND = {
|
|
18
|
+
npm: ["npx"],
|
|
19
|
+
pnpm: ["pnpm", "dlx"],
|
|
20
|
+
yarn1: ["npx"],
|
|
21
|
+
yarn2: ["yarn", "dlx"],
|
|
22
|
+
bun: ["bunx"]
|
|
23
|
+
};
|
|
24
|
+
var selectPackageManagerCommand = /* @__PURE__ */ __name((packageManager) => PACKAGE_MANAGER_TO_COMMAND[packageManager], "selectPackageManagerCommand");
|
|
25
|
+
var spawnPackageManagerScript = /* @__PURE__ */ __name(async (packageManager, args) => {
|
|
26
|
+
const [command, ...baseArgs] = selectPackageManagerCommand(packageManager);
|
|
27
|
+
await spawn(command, [...baseArgs, ...args], {
|
|
28
|
+
stdio: "inherit",
|
|
29
|
+
cwd: process.cwd(),
|
|
30
|
+
shell: true
|
|
31
|
+
});
|
|
32
|
+
}, "spawnPackageManagerScript");
|
|
33
|
+
async function postinstall({ packageManager = "npm" }) {
|
|
34
|
+
await spawnPackageManagerScript(packageManager, ["@storybook/auto-config", "themes"]);
|
|
35
|
+
}
|
|
36
|
+
__name(postinstall, "postinstall");
|
|
37
|
+
export {
|
|
38
|
+
postinstall as default
|
|
39
|
+
};
|
package/dist/preview.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import {
|
|
2
|
+
initialGlobals
|
|
3
|
+
} from "./_browser-chunks/chunk-R6XDDBXB.js";
|
|
4
|
+
import "./_browser-chunks/chunk-D4FRO6NL.js";
|
|
5
|
+
export {
|
|
6
|
+
initialGlobals
|
|
7
|
+
};
|
package/manager.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export * from './dist/manager.js';
|
package/package.json
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@storybook/addon-themes",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Switch between
|
|
3
|
+
"version": "10.0.0-beta.0",
|
|
4
|
+
"description": "Storybook Themes addon: Switch between themes from the toolbar",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"css",
|
|
7
7
|
"essentials",
|
|
8
|
+
"storybook",
|
|
8
9
|
"storybook-addon",
|
|
9
|
-
"storybook-addons",
|
|
10
10
|
"style",
|
|
11
11
|
"themes",
|
|
12
|
-
"toggle"
|
|
12
|
+
"toggle",
|
|
13
|
+
"component",
|
|
14
|
+
"components",
|
|
15
|
+
"react",
|
|
16
|
+
"vue",
|
|
17
|
+
"angular",
|
|
18
|
+
"svelte",
|
|
19
|
+
"web-components"
|
|
13
20
|
],
|
|
14
21
|
"homepage": "https://github.com/storybookjs/storybook/tree/next/code/addons/themes",
|
|
15
22
|
"bugs": {
|
|
@@ -29,29 +36,14 @@
|
|
|
29
36
|
"exports": {
|
|
30
37
|
".": {
|
|
31
38
|
"types": "./dist/index.d.ts",
|
|
32
|
-
"
|
|
33
|
-
"require": "./dist/index.js"
|
|
34
|
-
},
|
|
35
|
-
"./preview": {
|
|
36
|
-
"types": "./dist/preview.d.ts",
|
|
37
|
-
"import": "./dist/preview.mjs",
|
|
38
|
-
"require": "./dist/preview.js"
|
|
39
|
+
"default": "./dist/index.js"
|
|
39
40
|
},
|
|
40
41
|
"./manager": "./dist/manager.js",
|
|
41
42
|
"./package.json": "./package.json",
|
|
42
|
-
"./postinstall": "./postinstall.js"
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"types": "dist/index.d.ts",
|
|
47
|
-
"typesVersions": {
|
|
48
|
-
"*": {
|
|
49
|
-
"*": [
|
|
50
|
-
"dist/index.d.ts"
|
|
51
|
-
],
|
|
52
|
-
"preview": [
|
|
53
|
-
"dist/preview.d.ts"
|
|
54
|
-
]
|
|
43
|
+
"./postinstall": "./dist/postinstall.js",
|
|
44
|
+
"./preview": {
|
|
45
|
+
"types": "./dist/preview.d.ts",
|
|
46
|
+
"default": "./dist/preview.js"
|
|
55
47
|
}
|
|
56
48
|
},
|
|
57
49
|
"files": [
|
|
@@ -62,8 +54,8 @@
|
|
|
62
54
|
"!src/**/*"
|
|
63
55
|
],
|
|
64
56
|
"scripts": {
|
|
65
|
-
"check": "jiti ../../../scripts/
|
|
66
|
-
"prep": "jiti ../../../scripts/
|
|
57
|
+
"check": "jiti ../../../scripts/check/check-package.ts",
|
|
58
|
+
"prep": "jiti ../../../scripts/build/build-package.ts"
|
|
67
59
|
},
|
|
68
60
|
"dependencies": {
|
|
69
61
|
"ts-dedent": "^2.0.0"
|
|
@@ -75,23 +67,12 @@
|
|
|
75
67
|
"typescript": "^5.8.3"
|
|
76
68
|
},
|
|
77
69
|
"peerDependencies": {
|
|
78
|
-
"storybook": "^
|
|
70
|
+
"storybook": "^10.0.0-beta.0"
|
|
79
71
|
},
|
|
80
72
|
"publishConfig": {
|
|
81
73
|
"access": "public"
|
|
82
74
|
},
|
|
83
|
-
"
|
|
84
|
-
"exportEntries": [
|
|
85
|
-
"./src/index.ts"
|
|
86
|
-
],
|
|
87
|
-
"managerEntries": [
|
|
88
|
-
"./src/manager.tsx"
|
|
89
|
-
],
|
|
90
|
-
"previewEntries": [
|
|
91
|
-
"./src/preview.tsx"
|
|
92
|
-
]
|
|
93
|
-
},
|
|
94
|
-
"gitHead": "ce6a1e4a8d5ad69c699021a0b183df89cfc7b684",
|
|
75
|
+
"gitHead": "a8e7fd8a655c69780bc20b9749d2699e45beae16",
|
|
95
76
|
"storybook": {
|
|
96
77
|
"displayName": "Themes",
|
|
97
78
|
"unsupportedFrameworks": [
|
package/preview.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './dist/preview';
|
|
1
|
+
export * from './dist/preview.js';
|
package/dist/index.mjs
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { definePreviewAddon } from 'storybook/internal/csf';
|
|
2
|
-
import { useParameter, addons, useEffect, useMemo } from 'storybook/preview-api';
|
|
3
|
-
import { deprecate } from 'storybook/internal/client-logger';
|
|
4
|
-
import dedent from 'ts-dedent';
|
|
5
|
-
import React from 'react';
|
|
6
|
-
|
|
7
|
-
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,{initialGlobals:()=>initialGlobals});var PARAM_KEY="themes",ADDON_ID=`storybook/${PARAM_KEY}`,GLOBAL_KEY="theme";var DEFAULT_THEME_PARAMETERS={},THEMING_EVENTS={REGISTER_THEMES:`${ADDON_ID}/REGISTER_THEMES`};var initialGlobals={[GLOBAL_KEY]:""};var helpers_exports={};__export(helpers_exports,{initializeThemeState:()=>initializeThemeState,pluckThemeFromContext:()=>pluckThemeFromContext,useThemeParameters:()=>useThemeParameters});function pluckThemeFromContext({globals}){return globals[GLOBAL_KEY]||""}function useThemeParameters(context){return deprecate(dedent`The useThemeParameters function is deprecated. Please access parameters via the context directly instead e.g.
|
|
8
|
-
- const { themeOverride } = context.parameters.themes ?? {};
|
|
9
|
-
`),context?context.parameters[PARAM_KEY]??DEFAULT_THEME_PARAMETERS:useParameter(PARAM_KEY,DEFAULT_THEME_PARAMETERS)}function initializeThemeState(themeNames,defaultTheme){addons.getChannel().emit(THEMING_EVENTS.REGISTER_THEMES,{defaultTheme,themes:themeNames});}var DEFAULT_ELEMENT_SELECTOR="html",classStringToArray=classString=>classString.split(" ").filter(Boolean),withThemeByClassName=({themes,defaultTheme,parentSelector=DEFAULT_ELEMENT_SELECTOR})=>(initializeThemeState(Object.keys(themes),defaultTheme),(storyFn,context)=>{let{themeOverride}=context.parameters[PARAM_KEY]??{},selected=pluckThemeFromContext(context);return useEffect(()=>{let selectedThemeName=themeOverride||selected||defaultTheme,parentElement=document.querySelector(parentSelector);if(!parentElement)return;Object.entries(themes).filter(([themeName])=>themeName!==selectedThemeName).forEach(([themeName,className])=>{let classes=classStringToArray(className);classes.length>0&&parentElement.classList.remove(...classes);});let newThemeClasses=classStringToArray(themes[selectedThemeName]);newThemeClasses.length>0&&parentElement.classList.add(...newThemeClasses);},[themeOverride,selected]),storyFn()});var DEFAULT_ELEMENT_SELECTOR2="html",DEFAULT_DATA_ATTRIBUTE="data-theme",withThemeByDataAttribute=({themes,defaultTheme,parentSelector=DEFAULT_ELEMENT_SELECTOR2,attributeName=DEFAULT_DATA_ATTRIBUTE})=>(initializeThemeState(Object.keys(themes),defaultTheme),(storyFn,context)=>{let{themeOverride}=context.parameters[PARAM_KEY]??{},selected=pluckThemeFromContext(context);return useEffect(()=>{let parentElement=document.querySelector(parentSelector),themeKey=themeOverride||selected||defaultTheme;parentElement&&parentElement.setAttribute(attributeName,themes[themeKey]);},[themeOverride,selected]),storyFn()});var pluckThemeFromKeyPairTuple=([_,themeConfig])=>themeConfig,withThemeFromJSXProvider=({Provider,GlobalStyles,defaultTheme,themes={}})=>{let themeNames=Object.keys(themes),initialTheme=defaultTheme||themeNames[0];return initializeThemeState(themeNames,initialTheme),(storyFn,context)=>{let{themeOverride}=context.parameters[PARAM_KEY]??{},selected=pluckThemeFromContext(context),theme=useMemo(()=>{let selectedThemeName=themeOverride||selected||initialTheme,pairs=Object.entries(themes);return pairs.length===1?pluckThemeFromKeyPairTuple(pairs[0]):themes[selectedThemeName]},[selected,themeOverride]);return Provider?React.createElement(Provider,{theme},GlobalStyles&&React.createElement(GlobalStyles,null),storyFn()):React.createElement(React.Fragment,null,GlobalStyles&&React.createElement(GlobalStyles,null),storyFn())}};var index_default=()=>definePreviewAddon(preview_exports);
|
|
10
|
-
|
|
11
|
-
export { helpers_exports as DecoratorHelpers, index_default as default, withThemeByClassName, withThemeByDataAttribute, withThemeFromJSXProvider };
|
package/dist/preview.mjs
DELETED
package/postinstall.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
const { spawn } = require('child_process');
|
|
2
|
-
|
|
3
|
-
const PACKAGE_MANAGER_TO_COMMAND = {
|
|
4
|
-
npm: ['npx'],
|
|
5
|
-
pnpm: ['pnpm', 'dlx'],
|
|
6
|
-
yarn1: ['npx'],
|
|
7
|
-
yarn2: ['yarn', 'dlx'],
|
|
8
|
-
bun: ['bunx'],
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
const selectPackageManagerCommand = (packageManager) => PACKAGE_MANAGER_TO_COMMAND[packageManager];
|
|
12
|
-
|
|
13
|
-
const spawnPackageManagerScript = async (packageManager, args) => {
|
|
14
|
-
const [command, ...baseArgs] = selectPackageManagerCommand(packageManager);
|
|
15
|
-
|
|
16
|
-
await spawn(command, [...baseArgs, ...args], {
|
|
17
|
-
stdio: 'inherit',
|
|
18
|
-
cwd: process.cwd(),
|
|
19
|
-
shell: true,
|
|
20
|
-
});
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
module.exports = async function postinstall({ packageManager = 'npm' }) {
|
|
24
|
-
await spawnPackageManagerScript(packageManager, ['@storybook/auto-config', 'themes']);
|
|
25
|
-
};
|