@vueless/storybook-dark-mode 9.0.10 → 10.0.1-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/dist/cjs/Tool.js DELETED
@@ -1,251 +0,0 @@
1
- "use strict";
2
-
3
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.DarkMode = DarkMode;
8
- exports.updateStore = exports.store = exports.prefersDark = exports["default"] = void 0;
9
- var React = _interopRequireWildcard(require("react"));
10
- var _global = require("@storybook/global");
11
- var _theming = require("storybook/theming");
12
- var _components = require("storybook/internal/components");
13
- var _icons = require("@storybook/icons");
14
- var _coreEvents = require("storybook/internal/core-events");
15
- var _managerApi = require("storybook/manager-api");
16
- var _fastDeepEqual = _interopRequireDefault(require("fast-deep-equal"));
17
- var _constants = require("./constants");
18
- var _excluded = ["current", "stylePreview"];
19
- var _window$matchMedia;
20
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
21
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
22
- function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
23
- function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
24
- function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
25
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
26
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
27
- function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
28
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
29
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
30
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
31
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
32
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
33
- function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
34
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
35
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
36
- function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
37
- function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
38
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
39
- var _ref = _global.global,
40
- document = _ref.document,
41
- window = _ref.window;
42
- var modes = ['light', 'dark'];
43
- var STORAGE_KEY = 'sb-addon-themes-3';
44
- var prefersDark = exports.prefersDark = (_window$matchMedia = window.matchMedia) === null || _window$matchMedia === void 0 ? void 0 : _window$matchMedia.call(window, '(prefers-color-scheme: dark)');
45
- var defaultParams = {
46
- classTarget: 'body',
47
- dark: _theming.themes.dark,
48
- darkClass: ['dark'],
49
- light: _theming.themes.light,
50
- lightClass: ['light'],
51
- stylePreview: false,
52
- userHasExplicitlySetTheTheme: false
53
- };
54
-
55
- /** Persist the dark mode settings in localStorage */
56
- var updateStore = exports.updateStore = function updateStore(newStore) {
57
- window.localStorage.setItem(STORAGE_KEY, JSON.stringify(newStore));
58
- };
59
-
60
- /** Add the light/dark class to an element */
61
- var toggleDarkClass = function toggleDarkClass(el, _ref2) {
62
- var current = _ref2.current,
63
- _ref2$darkClass = _ref2.darkClass,
64
- darkClass = _ref2$darkClass === void 0 ? defaultParams.darkClass : _ref2$darkClass,
65
- _ref2$lightClass = _ref2.lightClass,
66
- lightClass = _ref2$lightClass === void 0 ? defaultParams.lightClass : _ref2$lightClass;
67
- if (current === 'dark') {
68
- var _el$classList, _el$classList2;
69
- (_el$classList = el.classList).remove.apply(_el$classList, _toConsumableArray(arrayify(lightClass)));
70
- (_el$classList2 = el.classList).add.apply(_el$classList2, _toConsumableArray(arrayify(darkClass)));
71
- } else {
72
- var _el$classList3, _el$classList4;
73
- (_el$classList3 = el.classList).remove.apply(_el$classList3, _toConsumableArray(arrayify(darkClass)));
74
- (_el$classList4 = el.classList).add.apply(_el$classList4, _toConsumableArray(arrayify(lightClass)));
75
- }
76
- };
77
-
78
- /** Coerce a string to a single item array, or return an array as-is */
79
- var arrayify = function arrayify(classes) {
80
- var arr = [];
81
- return arr.concat(classes).map(function (item) {
82
- return item;
83
- });
84
- };
85
-
86
- /** Update the preview iframe class */
87
- var updatePreview = function updatePreview(store) {
88
- var _iframe$contentWindow;
89
- var iframe = document.getElementById('storybook-preview-iframe');
90
- if (!iframe) {
91
- return;
92
- }
93
- var iframeDocument = iframe.contentDocument || ((_iframe$contentWindow = iframe.contentWindow) === null || _iframe$contentWindow === void 0 ? void 0 : _iframe$contentWindow.document);
94
- var target = iframeDocument === null || iframeDocument === void 0 ? void 0 : iframeDocument.querySelector(store.classTarget);
95
- if (!target) {
96
- return;
97
- }
98
- toggleDarkClass(target, store);
99
- };
100
-
101
- /** Update the manager iframe class */
102
- var updateManager = function updateManager(store) {
103
- var manager = document.querySelector(store.classTarget);
104
- if (!manager) {
105
- return;
106
- }
107
- toggleDarkClass(manager, store);
108
- };
109
-
110
- /** Update changed dark mode settings and persist to localStorage */
111
- var store = exports.store = function store() {
112
- var userTheme = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
113
- var storedItem = window.localStorage.getItem(STORAGE_KEY);
114
- if (typeof storedItem === 'string') {
115
- var stored = JSON.parse(storedItem);
116
- if (userTheme) {
117
- if (userTheme.dark && !(0, _fastDeepEqual["default"])(stored.dark, userTheme.dark)) {
118
- stored.dark = userTheme.dark;
119
- updateStore(stored);
120
- }
121
- if (userTheme.light && !(0, _fastDeepEqual["default"])(stored.light, userTheme.light)) {
122
- stored.light = userTheme.light;
123
- updateStore(stored);
124
- }
125
- }
126
- return stored;
127
- }
128
- return _objectSpread(_objectSpread({}, defaultParams), userTheme);
129
- };
130
-
131
- // On initial load, set the dark mode class on the manager
132
- // This is needed if you're using mostly CSS overrides to styles the storybook
133
- // Otherwise the default theme is set in src/preset/manager.tsx
134
- updateManager(store());
135
- /** A toolbar icon to toggle between dark and light themes in storybook */
136
- function DarkMode(_ref3) {
137
- var api = _ref3.api;
138
- var _React$useState = React.useState(prefersDark.matches),
139
- _React$useState2 = _slicedToArray(_React$useState, 2),
140
- isDark = _React$useState2[0],
141
- setDark = _React$useState2[1];
142
- var darkModeParams = (0, _managerApi.useParameter)('darkMode', {});
143
- var defaultMode = darkModeParams.current,
144
- stylePreview = darkModeParams.stylePreview,
145
- params = _objectWithoutProperties(darkModeParams, _excluded);
146
- var channel = api.getChannel();
147
- // Save custom themes on init
148
- var userHasExplicitlySetTheTheme = React.useMemo(function () {
149
- return store(params).userHasExplicitlySetTheTheme;
150
- }, [params]);
151
- /** Set the theme in storybook, update the local state, and emit an event */
152
- var setMode = React.useCallback(function (mode) {
153
- var currentStore = store();
154
- api.setOptions({
155
- theme: currentStore[mode]
156
- });
157
- setDark(mode === 'dark');
158
- api.getChannel().emit(_constants.DARK_MODE_EVENT_NAME, mode === 'dark');
159
- updateManager(currentStore);
160
- if (stylePreview) {
161
- updatePreview(currentStore);
162
- }
163
- }, [api, stylePreview]);
164
-
165
- /** Update the theme settings in localStorage, react, and storybook */
166
- var updateMode = React.useCallback(function (mode) {
167
- var currentStore = store();
168
- var current = mode || (currentStore.current === 'dark' ? 'light' : 'dark');
169
- updateStore(_objectSpread(_objectSpread({}, currentStore), {}, {
170
- current: current
171
- }));
172
- setMode(current);
173
- }, [setMode]);
174
-
175
- /** Update the theme based on the color preference */
176
- function prefersDarkUpdate(event) {
177
- if (userHasExplicitlySetTheTheme || defaultMode) {
178
- return;
179
- }
180
- updateMode(event.matches ? 'dark' : 'light');
181
- }
182
-
183
- /** Render the current theme */
184
- var renderTheme = React.useCallback(function () {
185
- var _store = store(),
186
- _store$current = _store.current,
187
- current = _store$current === void 0 ? 'light' : _store$current;
188
- setMode(current);
189
- }, [setMode]);
190
-
191
- /** Handle the user event and side effects */
192
- var handleIconClick = function handleIconClick() {
193
- updateMode();
194
- var currentStore = store();
195
- updateStore(_objectSpread(_objectSpread({}, currentStore), {}, {
196
- userHasExplicitlySetTheTheme: true
197
- }));
198
- };
199
-
200
- /** When storybook params change update the stored themes */
201
- React.useEffect(function () {
202
- var currentStore = store();
203
- // Ensure we use the stores `current` value first to persist
204
- // themeing between page loads and story changes.
205
- updateStore(_objectSpread(_objectSpread(_objectSpread({}, currentStore), darkModeParams), {}, {
206
- current: currentStore.current || darkModeParams.current
207
- }));
208
- renderTheme();
209
- }, [darkModeParams, renderTheme]);
210
- React.useEffect(function () {
211
- channel.on(_coreEvents.STORY_CHANGED, renderTheme);
212
- channel.on(_coreEvents.SET_STORIES, renderTheme);
213
- channel.on(_coreEvents.DOCS_RENDERED, renderTheme);
214
- prefersDark.addListener(prefersDarkUpdate);
215
- return function () {
216
- channel.removeListener(_coreEvents.STORY_CHANGED, renderTheme);
217
- channel.removeListener(_coreEvents.SET_STORIES, renderTheme);
218
- channel.removeListener(_coreEvents.DOCS_RENDERED, renderTheme);
219
- prefersDark.removeListener(prefersDarkUpdate);
220
- };
221
- });
222
- React.useEffect(function () {
223
- channel.on(_constants.UPDATE_DARK_MODE_EVENT_NAME, updateMode);
224
- return function () {
225
- channel.removeListener(_constants.UPDATE_DARK_MODE_EVENT_NAME, updateMode);
226
- };
227
- });
228
- // Storybook's first render doesn't have the global user params loaded so we
229
- // need the effect to run whenever defaultMode is updated
230
- React.useEffect(function () {
231
- // If a users has set the mode this is respected
232
- if (userHasExplicitlySetTheTheme) {
233
- return;
234
- }
235
- if (defaultMode) {
236
- updateMode(defaultMode);
237
- } else if (prefersDark.matches) {
238
- updateMode('dark');
239
- }
240
- }, [defaultMode, updateMode, userHasExplicitlySetTheTheme]);
241
- return /*#__PURE__*/React.createElement(_components.IconButton, {
242
- key: "dark-mode",
243
- title: isDark ? 'Change theme to light mode' : 'Change theme to dark mode',
244
- onClick: handleIconClick
245
- }, isDark ? /*#__PURE__*/React.createElement(_icons.SunIcon, {
246
- "aria-hidden": "true"
247
- }) : /*#__PURE__*/React.createElement(_icons.MoonIcon, {
248
- "aria-hidden": "true"
249
- }));
250
- }
251
- var _default = exports["default"] = DarkMode;
@@ -1,8 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.UPDATE_DARK_MODE_EVENT_NAME = exports.DARK_MODE_EVENT_NAME = void 0;
7
- var DARK_MODE_EVENT_NAME = exports.DARK_MODE_EVENT_NAME = 'DARK_MODE';
8
- var UPDATE_DARK_MODE_EVENT_NAME = exports.UPDATE_DARK_MODE_EVENT_NAME = 'UPDATE_DARK_MODE';
package/dist/cjs/index.js DELETED
@@ -1,48 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- var _exportNames = {
7
- useDarkMode: true
8
- };
9
- exports.useDarkMode = useDarkMode;
10
- var _previewApi = require("storybook/preview-api");
11
- var _constants = require("./constants");
12
- Object.keys(_constants).forEach(function (key) {
13
- if (key === "default" || key === "__esModule") return;
14
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
15
- if (key in exports && exports[key] === _constants[key]) return;
16
- Object.defineProperty(exports, key, {
17
- enumerable: true,
18
- get: function get() {
19
- return _constants[key];
20
- }
21
- });
22
- });
23
- var _Tool = require("./Tool");
24
- function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
25
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
26
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
27
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
28
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
29
- function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
30
- /**
31
- * Returns the current state of storybook's dark-mode
32
- */
33
- function useDarkMode() {
34
- var _useState = (0, _previewApi.useState)(function () {
35
- return (0, _Tool.store)().current === 'dark';
36
- }),
37
- _useState2 = _slicedToArray(_useState, 2),
38
- isDark = _useState2[0],
39
- setIsDark = _useState2[1];
40
- (0, _previewApi.useEffect)(function () {
41
- var chan = _previewApi.addons.getChannel();
42
- chan.on(_constants.DARK_MODE_EVENT_NAME, setIsDark);
43
- return function () {
44
- return chan.off(_constants.DARK_MODE_EVENT_NAME, setIsDark);
45
- };
46
- }, []);
47
- return isDark;
48
- }
@@ -1,34 +0,0 @@
1
- "use strict";
2
-
3
- var _managerApi = require("storybook/manager-api");
4
- var _types = require("storybook/internal/types");
5
- var _theming = require("storybook/theming");
6
- var React = _interopRequireWildcard(require("react"));
7
- var _Tool = _interopRequireWildcard(require("../Tool"));
8
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
9
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
10
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
13
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
14
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
15
- var currentStore = (0, _Tool.store)();
16
- var currentTheme = currentStore.current || _Tool.prefersDark.matches && 'dark' || 'light';
17
- _managerApi.addons.setConfig({
18
- theme: _objectSpread(_objectSpread({}, _theming.themes[currentTheme]), currentStore[currentTheme])
19
- });
20
- _managerApi.addons.register('storybook/dark-mode', function (api) {
21
- _managerApi.addons.add('storybook/dark-mode', {
22
- title: 'dark mode',
23
- type: _types.Addon_TypesEnum.TOOL,
24
- match: function match(_ref) {
25
- var viewMode = _ref.viewMode;
26
- return viewMode === 'story' || viewMode === 'docs';
27
- },
28
- render: function render() {
29
- return /*#__PURE__*/React.createElement(_Tool["default"], {
30
- api: api
31
- });
32
- }
33
- });
34
- });
package/dist/esm/Tool.js DELETED
@@ -1,242 +0,0 @@
1
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
- var _excluded = ["current", "stylePreview"];
3
- var _window$matchMedia;
4
- function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
5
- function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
6
- function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
7
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
8
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
9
- function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
10
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
13
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
14
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
15
- function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
16
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
17
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
18
- function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
19
- function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
20
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
21
- import * as React from 'react';
22
- import { global } from '@storybook/global';
23
- import { themes } from 'storybook/theming';
24
- import { IconButton } from 'storybook/internal/components';
25
- import { MoonIcon, SunIcon } from '@storybook/icons';
26
- import { STORY_CHANGED, SET_STORIES, DOCS_RENDERED } from 'storybook/internal/core-events';
27
- import { useParameter } from 'storybook/manager-api';
28
- import equal from 'fast-deep-equal';
29
- import { DARK_MODE_EVENT_NAME, UPDATE_DARK_MODE_EVENT_NAME } from './constants';
30
- var _ref = global,
31
- document = _ref.document,
32
- window = _ref.window;
33
- var modes = ['light', 'dark'];
34
- var STORAGE_KEY = 'sb-addon-themes-3';
35
- export var prefersDark = (_window$matchMedia = window.matchMedia) === null || _window$matchMedia === void 0 ? void 0 : _window$matchMedia.call(window, '(prefers-color-scheme: dark)');
36
- var defaultParams = {
37
- classTarget: 'body',
38
- dark: themes.dark,
39
- darkClass: ['dark'],
40
- light: themes.light,
41
- lightClass: ['light'],
42
- stylePreview: false,
43
- userHasExplicitlySetTheTheme: false
44
- };
45
-
46
- /** Persist the dark mode settings in localStorage */
47
- export var updateStore = function updateStore(newStore) {
48
- window.localStorage.setItem(STORAGE_KEY, JSON.stringify(newStore));
49
- };
50
-
51
- /** Add the light/dark class to an element */
52
- var toggleDarkClass = function toggleDarkClass(el, _ref2) {
53
- var current = _ref2.current,
54
- _ref2$darkClass = _ref2.darkClass,
55
- darkClass = _ref2$darkClass === void 0 ? defaultParams.darkClass : _ref2$darkClass,
56
- _ref2$lightClass = _ref2.lightClass,
57
- lightClass = _ref2$lightClass === void 0 ? defaultParams.lightClass : _ref2$lightClass;
58
- if (current === 'dark') {
59
- var _el$classList, _el$classList2;
60
- (_el$classList = el.classList).remove.apply(_el$classList, _toConsumableArray(arrayify(lightClass)));
61
- (_el$classList2 = el.classList).add.apply(_el$classList2, _toConsumableArray(arrayify(darkClass)));
62
- } else {
63
- var _el$classList3, _el$classList4;
64
- (_el$classList3 = el.classList).remove.apply(_el$classList3, _toConsumableArray(arrayify(darkClass)));
65
- (_el$classList4 = el.classList).add.apply(_el$classList4, _toConsumableArray(arrayify(lightClass)));
66
- }
67
- };
68
-
69
- /** Coerce a string to a single item array, or return an array as-is */
70
- var arrayify = function arrayify(classes) {
71
- var arr = [];
72
- return arr.concat(classes).map(function (item) {
73
- return item;
74
- });
75
- };
76
-
77
- /** Update the preview iframe class */
78
- var updatePreview = function updatePreview(store) {
79
- var _iframe$contentWindow;
80
- var iframe = document.getElementById('storybook-preview-iframe');
81
- if (!iframe) {
82
- return;
83
- }
84
- var iframeDocument = iframe.contentDocument || ((_iframe$contentWindow = iframe.contentWindow) === null || _iframe$contentWindow === void 0 ? void 0 : _iframe$contentWindow.document);
85
- var target = iframeDocument === null || iframeDocument === void 0 ? void 0 : iframeDocument.querySelector(store.classTarget);
86
- if (!target) {
87
- return;
88
- }
89
- toggleDarkClass(target, store);
90
- };
91
-
92
- /** Update the manager iframe class */
93
- var updateManager = function updateManager(store) {
94
- var manager = document.querySelector(store.classTarget);
95
- if (!manager) {
96
- return;
97
- }
98
- toggleDarkClass(manager, store);
99
- };
100
-
101
- /** Update changed dark mode settings and persist to localStorage */
102
- export var store = function store() {
103
- var userTheme = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
104
- var storedItem = window.localStorage.getItem(STORAGE_KEY);
105
- if (typeof storedItem === 'string') {
106
- var stored = JSON.parse(storedItem);
107
- if (userTheme) {
108
- if (userTheme.dark && !equal(stored.dark, userTheme.dark)) {
109
- stored.dark = userTheme.dark;
110
- updateStore(stored);
111
- }
112
- if (userTheme.light && !equal(stored.light, userTheme.light)) {
113
- stored.light = userTheme.light;
114
- updateStore(stored);
115
- }
116
- }
117
- return stored;
118
- }
119
- return _objectSpread(_objectSpread({}, defaultParams), userTheme);
120
- };
121
-
122
- // On initial load, set the dark mode class on the manager
123
- // This is needed if you're using mostly CSS overrides to styles the storybook
124
- // Otherwise the default theme is set in src/preset/manager.tsx
125
- updateManager(store());
126
- /** A toolbar icon to toggle between dark and light themes in storybook */
127
- export function DarkMode(_ref3) {
128
- var api = _ref3.api;
129
- var _React$useState = React.useState(prefersDark.matches),
130
- _React$useState2 = _slicedToArray(_React$useState, 2),
131
- isDark = _React$useState2[0],
132
- setDark = _React$useState2[1];
133
- var darkModeParams = useParameter('darkMode', {});
134
- var defaultMode = darkModeParams.current,
135
- stylePreview = darkModeParams.stylePreview,
136
- params = _objectWithoutProperties(darkModeParams, _excluded);
137
- var channel = api.getChannel();
138
- // Save custom themes on init
139
- var userHasExplicitlySetTheTheme = React.useMemo(function () {
140
- return store(params).userHasExplicitlySetTheTheme;
141
- }, [params]);
142
- /** Set the theme in storybook, update the local state, and emit an event */
143
- var setMode = React.useCallback(function (mode) {
144
- var currentStore = store();
145
- api.setOptions({
146
- theme: currentStore[mode]
147
- });
148
- setDark(mode === 'dark');
149
- api.getChannel().emit(DARK_MODE_EVENT_NAME, mode === 'dark');
150
- updateManager(currentStore);
151
- if (stylePreview) {
152
- updatePreview(currentStore);
153
- }
154
- }, [api, stylePreview]);
155
-
156
- /** Update the theme settings in localStorage, react, and storybook */
157
- var updateMode = React.useCallback(function (mode) {
158
- var currentStore = store();
159
- var current = mode || (currentStore.current === 'dark' ? 'light' : 'dark');
160
- updateStore(_objectSpread(_objectSpread({}, currentStore), {}, {
161
- current: current
162
- }));
163
- setMode(current);
164
- }, [setMode]);
165
-
166
- /** Update the theme based on the color preference */
167
- function prefersDarkUpdate(event) {
168
- if (userHasExplicitlySetTheTheme || defaultMode) {
169
- return;
170
- }
171
- updateMode(event.matches ? 'dark' : 'light');
172
- }
173
-
174
- /** Render the current theme */
175
- var renderTheme = React.useCallback(function () {
176
- var _store = store(),
177
- _store$current = _store.current,
178
- current = _store$current === void 0 ? 'light' : _store$current;
179
- setMode(current);
180
- }, [setMode]);
181
-
182
- /** Handle the user event and side effects */
183
- var handleIconClick = function handleIconClick() {
184
- updateMode();
185
- var currentStore = store();
186
- updateStore(_objectSpread(_objectSpread({}, currentStore), {}, {
187
- userHasExplicitlySetTheTheme: true
188
- }));
189
- };
190
-
191
- /** When storybook params change update the stored themes */
192
- React.useEffect(function () {
193
- var currentStore = store();
194
- // Ensure we use the stores `current` value first to persist
195
- // themeing between page loads and story changes.
196
- updateStore(_objectSpread(_objectSpread(_objectSpread({}, currentStore), darkModeParams), {}, {
197
- current: currentStore.current || darkModeParams.current
198
- }));
199
- renderTheme();
200
- }, [darkModeParams, renderTheme]);
201
- React.useEffect(function () {
202
- channel.on(STORY_CHANGED, renderTheme);
203
- channel.on(SET_STORIES, renderTheme);
204
- channel.on(DOCS_RENDERED, renderTheme);
205
- prefersDark.addListener(prefersDarkUpdate);
206
- return function () {
207
- channel.removeListener(STORY_CHANGED, renderTheme);
208
- channel.removeListener(SET_STORIES, renderTheme);
209
- channel.removeListener(DOCS_RENDERED, renderTheme);
210
- prefersDark.removeListener(prefersDarkUpdate);
211
- };
212
- });
213
- React.useEffect(function () {
214
- channel.on(UPDATE_DARK_MODE_EVENT_NAME, updateMode);
215
- return function () {
216
- channel.removeListener(UPDATE_DARK_MODE_EVENT_NAME, updateMode);
217
- };
218
- });
219
- // Storybook's first render doesn't have the global user params loaded so we
220
- // need the effect to run whenever defaultMode is updated
221
- React.useEffect(function () {
222
- // If a users has set the mode this is respected
223
- if (userHasExplicitlySetTheTheme) {
224
- return;
225
- }
226
- if (defaultMode) {
227
- updateMode(defaultMode);
228
- } else if (prefersDark.matches) {
229
- updateMode('dark');
230
- }
231
- }, [defaultMode, updateMode, userHasExplicitlySetTheTheme]);
232
- return /*#__PURE__*/React.createElement(IconButton, {
233
- key: "dark-mode",
234
- title: isDark ? 'Change theme to light mode' : 'Change theme to dark mode',
235
- onClick: handleIconClick
236
- }, isDark ? /*#__PURE__*/React.createElement(SunIcon, {
237
- "aria-hidden": "true"
238
- }) : /*#__PURE__*/React.createElement(MoonIcon, {
239
- "aria-hidden": "true"
240
- }));
241
- }
242
- export default DarkMode;
@@ -1,2 +0,0 @@
1
- export var DARK_MODE_EVENT_NAME = 'DARK_MODE';
2
- export var UPDATE_DARK_MODE_EVENT_NAME = 'UPDATE_DARK_MODE';
package/dist/esm/index.js DELETED
@@ -1,30 +0,0 @@
1
- function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
- function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
7
- import { addons, useState, useEffect } from 'storybook/preview-api';
8
- import { DARK_MODE_EVENT_NAME } from './constants';
9
- import { store } from './Tool';
10
-
11
- /**
12
- * Returns the current state of storybook's dark-mode
13
- */
14
- export function useDarkMode() {
15
- var _useState = useState(function () {
16
- return store().current === 'dark';
17
- }),
18
- _useState2 = _slicedToArray(_useState, 2),
19
- isDark = _useState2[0],
20
- setIsDark = _useState2[1];
21
- useEffect(function () {
22
- var chan = addons.getChannel();
23
- chan.on(DARK_MODE_EVENT_NAME, setIsDark);
24
- return function () {
25
- return chan.off(DARK_MODE_EVENT_NAME, setIsDark);
26
- };
27
- }, []);
28
- return isDark;
29
- }
30
- export * from './constants';
@@ -1,31 +0,0 @@
1
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
5
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
6
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
- import { addons } from 'storybook/manager-api';
8
- import { Addon_TypesEnum } from 'storybook/internal/types';
9
- import { themes } from 'storybook/theming';
10
- import * as React from 'react';
11
- import Tool, { prefersDark, store } from '../Tool';
12
- var currentStore = store();
13
- var currentTheme = currentStore.current || prefersDark.matches && 'dark' || 'light';
14
- addons.setConfig({
15
- theme: _objectSpread(_objectSpread({}, themes[currentTheme]), currentStore[currentTheme])
16
- });
17
- addons.register('storybook/dark-mode', function (api) {
18
- addons.add('storybook/dark-mode', {
19
- title: 'dark mode',
20
- type: Addon_TypesEnum.TOOL,
21
- match: function match(_ref) {
22
- var viewMode = _ref.viewMode;
23
- return viewMode === 'story' || viewMode === 'docs';
24
- },
25
- render: function render() {
26
- return /*#__PURE__*/React.createElement(Tool, {
27
- api: api
28
- });
29
- }
30
- });
31
- });