@storybook/addon-themes 9.2.0-alpha.2 → 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
@@ -1,6 +1,6 @@
1
1
  # @storybook/addon-themes
2
2
 
3
- Storybook Addon Themes can be used which between multiple themes for components inside the preview in [Storybook](https://storybook.js.org).
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
  ![React Storybook Screenshot](https://user-images.githubusercontent.com/18172605/274302488-77a39112-cdbe-4d16-9966-0d8e9e7e3399.gif)
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
- 'use strict';
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
- Object.defineProperty(exports, '__esModule', { value: true });
13
+ // src/index.ts
14
+ import { definePreviewAddon } from "storybook/internal/csf";
4
15
 
5
- var csf = require('storybook/internal/csf');
6
- var previewApi = require('storybook/preview-api');
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
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
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
- var dedent__default = /*#__PURE__*/_interopDefault(dedent);
14
- var React__default = /*#__PURE__*/_interopDefault(React);
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
- 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 clientLogger.deprecate(dedent__default.default`The useThemeParameters function is deprecated. Please access parameters via the context directly instead e.g.
17
- - const { themeOverride } = context.parameters.themes ?? {};
18
- `),context?context.parameters[PARAM_KEY]??DEFAULT_THEME_PARAMETERS:previewApi.useParameter(PARAM_KEY,DEFAULT_THEME_PARAMETERS)}function initializeThemeState(themeNames,defaultTheme){previewApi.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 previewApi.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 previewApi.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=previewApi.useMemo(()=>{let selectedThemeName=themeOverride||selected||initialTheme,pairs=Object.entries(themes);return pairs.length===1?pluckThemeFromKeyPairTuple(pairs[0]):themes[selectedThemeName]},[selected,themeOverride]);return Provider?React__default.default.createElement(Provider,{theme},GlobalStyles&&React__default.default.createElement(GlobalStyles,null),storyFn()):React__default.default.createElement(React__default.default.Fragment,null,GlobalStyles&&React__default.default.createElement(GlobalStyles,null),storyFn())}};var index_default=()=>csf.definePreviewAddon(preview_exports);
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
- exports.DecoratorHelpers = helpers_exports;
21
- exports.default = index_default;
22
- exports.withThemeByClassName = withThemeByClassName;
23
- exports.withThemeByDataAttribute = withThemeByDataAttribute;
24
- exports.withThemeFromJSXProvider = withThemeFromJSXProvider;
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 { useParameter, useGlobals, addons, useAddonState, useChannel, types } from 'storybook/manager-api';
2
- import React from 'react';
3
- import { IconButton, WithTooltip, TooltipLinkList } from 'storybook/internal/components';
4
- import { PaintBrushIcon } from '@storybook/icons';
5
- import { styled } from 'storybook/theming';
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
- var PARAM_KEY="themes",ADDON_ID=`storybook/${PARAM_KEY}`,GLOBAL_KEY="theme",THEME_SWITCHER_ID=`${ADDON_ID}/theme-switcher`,DEFAULT_ADDON_STATE={themesList:[],themeDefault:void 0},DEFAULT_THEME_PARAMETERS={},THEMING_EVENTS={REGISTER_THEMES:`${ADDON_ID}/REGISTER_THEMES`};var IconButtonLabel=styled.div(({theme})=>({fontSize:theme.typography.size.s2-1})),hasMultipleThemes=themesList=>themesList.length>1,hasTwoThemes=themesList=>themesList.length===2,ThemeSwitcher=React.memo(function(){let{themeOverride,disable}=useParameter(PARAM_KEY,DEFAULT_THEME_PARAMETERS),[{theme:selected},updateGlobals,storyGlobals]=useGlobals(),fromLast=addons.getChannel().last(THEMING_EVENTS.REGISTER_THEMES),initializeThemeState=Object.assign({},DEFAULT_ADDON_STATE,{themesList:fromLast?.[0]?.themes||[],themeDefault:fromLast?.[0]?.defaultTheme||""}),[{themesList,themeDefault},updateState]=useAddonState(THEME_SWITCHER_ID,initializeThemeState),isLocked=GLOBAL_KEY in storyGlobals||!!themeOverride;useChannel({[THEMING_EVENTS.REGISTER_THEMES]:({themes,defaultTheme})=>{updateState(state=>({...state,themesList:themes,themeDefault:defaultTheme}));}});let themeName=selected||themeDefault,label="";if(isLocked?label="Story override":themeName&&(label=`${themeName} theme`),disable)return null;if(hasTwoThemes(themesList)){let currentTheme=selected||themeDefault,alternateTheme=themesList.find(theme=>theme!==currentTheme);return React.createElement(IconButton,{disabled:isLocked,key:THEME_SWITCHER_ID,active:!themeOverride,title:"Theme",onClick:()=>{updateGlobals({theme:alternateTheme});}},React.createElement(PaintBrushIcon,null),label?React.createElement(IconButtonLabel,null,label):null)}return hasMultipleThemes(themesList)?React.createElement(WithTooltip,{placement:"top",trigger:"click",closeOnOutsideClick:!0,tooltip:({onHide})=>React.createElement(TooltipLinkList,{links:themesList.map(theme=>({id:theme,title:theme,active:selected===theme,onClick:()=>{updateGlobals({theme}),onHide();}}))})},React.createElement(IconButton,{key:THEME_SWITCHER_ID,active:!themeOverride,title:"Theme",disabled:isLocked},React.createElement(PaintBrushIcon,null),label&&React.createElement(IconButtonLabel,null,label))):null});addons.register(ADDON_ID,()=>{addons.add(THEME_SWITCHER_ID,{title:"Themes",type:types.TOOL,match:({viewMode,tabId})=>!!(viewMode&&viewMode.match(/^(story|docs)$/))&&!tabId,render:ThemeSwitcher,paramKey:PARAM_KEY});});
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
- 'use strict';
2
-
3
- var GLOBAL_KEY="theme";var initialGlobals={[GLOBAL_KEY]:""};
4
-
5
- exports.initialGlobals = initialGlobals;
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
- import './dist/manager';
1
+ export * from './dist/manager.js';
package/package.json CHANGED
@@ -1,15 +1,22 @@
1
1
  {
2
2
  "name": "@storybook/addon-themes",
3
- "version": "9.2.0-alpha.2",
4
- "description": "Switch between multiple themes for you components in Storybook",
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
- "import": "./dist/index.mjs",
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
- "main": "dist/index.js",
45
- "module": "dist/index.mjs",
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/prepare/check.ts",
66
- "prep": "jiti ../../../scripts/prepare/addon-bundle.ts"
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": "^9.2.0-alpha.2"
70
+ "storybook": "^10.0.0-beta.0"
79
71
  },
80
72
  "publishConfig": {
81
73
  "access": "public"
82
74
  },
83
- "bundler": {
84
- "exportEntries": [
85
- "./src/index.ts"
86
- ],
87
- "managerEntries": [
88
- "./src/manager.tsx"
89
- ],
90
- "previewEntries": [
91
- "./src/preview.tsx"
92
- ]
93
- },
94
- "gitHead": "e6a7fd8a655c69780bc20b9749c2699e44beae16",
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
@@ -1,3 +0,0 @@
1
- var GLOBAL_KEY="theme";var initialGlobals={[GLOBAL_KEY]:""};
2
-
3
- export { initialGlobals };
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
- };