UNPKG

6.23 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
6
7var slicedToArray = require('./slicedToArray-ef426d0f.js');
8require('./unsupportedIterableToArray-8a00e599.js');
9var React = require('react');
10var React__default = _interopDefault(React);
11require('./_commonjsHelpers-72d386ba.js');
12var index = require('./index-b0606964.js');
13var defineProperty = require('./defineProperty-0921a47c.js');
14require('./toConsumableArray-7f36359f.js');
15require('./getPrototypeOf-e2d1e599.js');
16var color = require('./color.js');
17require('./components.js');
18require('./contains-component.js');
19require('./css.js');
20require('./dayjs.min-aa59a48e.js');
21require('./date.js');
22require('./miscellaneous.js');
23var environment = require('./environment.js');
24require('./font.js');
25require('./math-ecfd5d91.js');
26require('./characters.js');
27require('./format.js');
28require('./keycodes.js');
29require('./url.js');
30require('./web3.js');
31var themeDark = require('./theme-dark.js');
32var themeLight = require('./theme-light.js');
33
34function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
35
36function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { defineProperty._defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
37// The appearance can be either “dark” or “light”.
38
39var APPEARANCES = ['dark', 'light'];
40var EMBEDDED_THEMES = {
41 dark: themeDark.default,
42 light: themeLight.default
43};
44var THEME_DEFAULT = 'light';
45var RESERVED_KEYS = ['_appearance', '_name'];
46var DEPRECATED_COLORS = new Map([['error', 'negative'], ['success', 'positive']]);
47var COLOR_FALLBACK = '#FF00FF';
48
49function getTheme(theme) {
50 var validationError = validateTheme(theme);
51
52 if (validationError !== null) {
53 environment.warnOnce("theme:theme-invalid:".concat(validationError), "Theme invalid: ".concat(validationError, ". ") + "Using the theme \u201C".concat(THEME_DEFAULT, "\u201D instead."));
54 return EMBEDDED_THEMES[THEME_DEFAULT];
55 }
56
57 if (typeof theme === 'string' && EMBEDDED_THEMES[theme]) {
58 return EMBEDDED_THEMES[theme];
59 }
60
61 var baseTheme = EMBEDDED_THEMES[theme._appearance === 'dark' ? 'dark' : 'light'];
62 return _objectSpread(_objectSpread({}, baseTheme), theme);
63} // Setting the default is needed for cases when components are used without being wrapped in `<Theme />`, e.g. for tests.
64
65
66var ThemeContext = React__default.createContext(prepareTheme(getTheme(THEME_DEFAULT)));
67
68function convertThemeColor(name, value) {
69 if (RESERVED_KEYS.includes(name)) {
70 return value;
71 }
72
73 try {
74 return color.default(value);
75 } catch (err) {
76 return color.default(COLOR_FALLBACK);
77 }
78} // prepareTheme() does a few things:
79// - Wrap every color in a color() object (see utils/color.js).
80// - Filter out invalid colors added in custom themes.
81// - Wraps the theme in a proxy that warns about deprecated colors.
82
83
84function prepareTheme(theme) {
85 var themeConverted = Object.fromEntries(Object.entries(theme).filter(function (_ref) {
86 var _ref2 = slicedToArray._slicedToArray(_ref, 1),
87 name = _ref2[0];
88
89 if (!EMBEDDED_THEMES[THEME_DEFAULT][name]) {
90 environment.warnOnce("theme:invalid:".concat(name), "Theme: the color \u201C".concat(name, "\u201D is invalid and will be ignored. ") + "Please check src/theme/theme-light.js in the aragonUI " + "repository for a list of valid colors.");
91 return false;
92 }
93
94 return true;
95 }).map(function (_ref3) {
96 var _ref4 = slicedToArray._slicedToArray(_ref3, 2),
97 name = _ref4[0],
98 value = _ref4[1];
99
100 return [name, convertThemeColor(name, value)];
101 }));
102 return new Proxy(themeConverted, {
103 get: function get(theme, name) {
104 if (DEPRECATED_COLORS.has(name)) {
105 environment.warnOnce("theme:deprecated:".concat(name), "useTheme(): the color \u201C".concat(name, "\u201D has been deprecated and will be removed soon. ") + "Please use \u201C".concat(DEPRECATED_COLORS.get(name), "\u201D instead."));
106 return theme[DEPRECATED_COLORS.get(name)];
107 }
108
109 if (!theme[name]) {
110 environment.warnOnce("theme:unknown:".concat(name), "useTheme(): the color \u201C".concat(name, "\u201D doesn\u2019t exist in the theme."));
111 return COLOR_FALLBACK;
112 }
113
114 return theme[name];
115 }
116 });
117}
118
119function validateTheme(theme) {
120 if (typeof theme === 'string') {
121 return EMBEDDED_THEMES[theme] ? null : "the theme \u201C".concat(theme, "\u201D doesn\u2019t exist");
122 }
123
124 if (theme && !theme._name) {
125 return "the \u201C_name\u201D key of the theme is missing";
126 }
127
128 if (theme && !APPEARANCES.includes(theme._appearance)) {
129 return "the \u201C_appearance\u201D key of the theme is missing";
130 }
131
132 return null;
133}
134
135function Theme(_ref5) {
136 var theme = _ref5.theme,
137 children = _ref5.children;
138
139 if (theme === undefined) {
140 theme = THEME_DEFAULT;
141 }
142
143 var themeConverted = React.useMemo(function () {
144 return prepareTheme(getTheme(theme));
145 }, [theme]);
146 return /*#__PURE__*/React__default.createElement(ThemeContext.Provider, {
147 value: themeConverted
148 }, children);
149}
150
151Theme.propTypes = {
152 children: index.PropTypes.node,
153 theme: index.PropTypes.oneOfType([index.PropTypes.object, index.PropTypes.string])
154};
155
156function useTheme() {
157 return React.useContext(ThemeContext);
158}
159
160Theme.THEME_DEFAULT = THEME_DEFAULT;
161Theme.EMBEDDED_THEMES = EMBEDDED_THEMES;
162
163exports.Theme = Theme;
164exports.useTheme = useTheme;
165//# sourceMappingURL=Theme.js.map