UNPKG

@ucam/design-system

Version:
94 lines (88 loc) 16.6 kB
'use strict'; var tslib = require('tslib'); var React = require('react'); var core = require('@material-ui/core'); var themes = require('../themes/themes.js'); var useTheme = require('../useTheme/useTheme.js'); var useThemeRegister = require('../useThemeRegister/useThemeRegister.js'); var useLocalStorage = require('../../useLocalStorage/useLocalStorage.js'); var HydrationChecker = require('../../HydrationChecker/HydrationChecker.js'); var PropTypes = require('prop-types'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var React__default = /*#__PURE__*/_interopDefaultLegacy(React); var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes); /** * A component that provides the app with theming support */ const ThemeProvider = React__default['default'].forwardRef(function ThemeProvider(props, ref) { const { children, themes: themes$1 = { Light: themes.light, Dark: themes.dark }, defaultThemeName = 'Light', darkThemeName = 'Dark', scope = 'global', disableLocalStorage: propDisableLocalStorage } = props, other = tslib.__rest(props, ["children", "themes", "defaultThemeName", "darkThemeName", "scope", "disableLocalStorage"]); // Note: false during rehydration run, regardless of browser setting... // TODO: if we switch to the useHydrated hook and use the standard browser media queries we can possibly avoid extra renders here const prefersDarkMode = core.useMediaQuery('(prefers-color-scheme: dark)'); // Cannot update the disableLocalStorage value otherwise different hooks would be called on the next line // React requires that the same hooks be called in the same order const [localStorageEnabled] = React.useState(!propDisableLocalStorage); const [chosenTheme, setChosenTheme] = (localStorageEnabled ? () => useLocalStorage('theme') : () => React.useState(defaultThemeName))(); const [registeredThemes, setRegisteredThemes] = React.useState(new Map(Object.entries(themes$1))); let themeName; let theme; if (chosenTheme !== undefined && registeredThemes.has(chosenTheme)) { themeName = chosenTheme; theme = registeredThemes.get(themeName); } else { themeName = prefersDarkMode ? darkThemeName : defaultThemeName; theme = registeredThemes.get(themeName) || themes.light; } const setTheme = React.useCallback((themeName) => { console.assert(themeName === undefined || registeredThemes.has(themeName), `Unrecognised theme: ${themeName}`); setChosenTheme(themeName); }, [setChosenTheme, registeredThemes]); const selectedTheme = React.useMemo(() => ({ requestedThemeName: chosenTheme, renderedThemeName: themeName, theme, setTheme }), [chosenTheme, themeName, setTheme]); const setThemes = React.useCallback((themes) => { setRegisteredThemes(new Map(Object.entries(themes))); }, [setRegisteredThemes]); const themeRegister = React.useMemo(() => [registeredThemes, setThemes], [registeredThemes, setThemes]); const cssBaselineWrapper = (() => { switch (scope) { case 'global': return React__default['default'].createElement(core.CssBaseline, Object.assign({}, other), children); case 'local': return (React__default['default'].createElement(core.ScopedCssBaseline, Object.assign({}, other, { ref: ref }), children)); default: return React__default['default'].createElement(React__default['default'].Fragment, null, children); } })(); return (React__default['default'].createElement(useThemeRegister.ThemeRegisterContext.Provider, { value: themeRegister }, React__default['default'].createElement(useTheme.ThemeUpdateContext.Provider, { value: selectedTheme }, React__default['default'].createElement(core.ThemeProvider, { theme: theme }, cssBaselineWrapper)))); }); ThemeProvider.propTypes = { children: PropTypes__default['default'].node, themes: PropTypes__default['default'].objectOf(PropTypes__default['default'].object.isRequired), defaultThemeName: PropTypes__default['default'].string, darkThemeName: PropTypes__default['default'].string, disableLocalStorage: PropTypes__default['default'].bool, scope: PropTypes__default['default'].oneOf(['global', 'local', false]) }; /** * A component that provides the app with theming support. * Also providing a `<HydrationChecker/>`. */ const ThemeProviderWithHydrationChecker = React__default['default'].forwardRef((props, ref) => { return (React__default['default'].createElement(HydrationChecker, null, React__default['default'].createElement(ThemeProvider, Object.assign({}, props, { ref: ref })))); }); ThemeProviderWithHydrationChecker.displayName = 'ThemeProvider'; module.exports = ThemeProviderWithHydrationChecker; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGhlbWVQcm92aWRlci5qcyIsInNvdXJjZXMiOlsiL0B1Y2FtL2Rlc2lnbi1zeXN0ZW0vc3JjL3RoZW1lL1RoZW1lUHJvdmlkZXIvVGhlbWVQcm92aWRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7XG4gIEludGVybmFsU3RhbmRhcmRQcm9wcyBhcyBTdGFuZGFyZFByb3BzLFxuICBDc3NCYXNlbGluZSxcbiAgU2NvcGVkQ3NzQmFzZWxpbmUsXG4gIHVzZU1lZGlhUXVlcnksXG4gIFRoZW1lLFxuICBUaGVtZVByb3ZpZGVyIGFzIE11aVRoZW1lUHJvdmlkZXJcbn0gZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUnO1xuaW1wb3J0IHsgZGFyaywgbGlnaHQgfSBmcm9tICcuLi90aGVtZXMnO1xuaW1wb3J0IHsgVGhlbWVVcGRhdGUsIFRoZW1lVXBkYXRlQ29udGV4dCB9IGZyb20gJy4uL3VzZVRoZW1lL3VzZVRoZW1lJztcbmltcG9ydCB7IFRoZW1lUmVnaXN0ZXJDb250ZXh0IH0gZnJvbSAnLi4vdXNlVGhlbWVSZWdpc3Rlci91c2VUaGVtZVJlZ2lzdGVyJztcbmltcG9ydCB1c2VMb2NhbFN0b3JhZ2UgZnJvbSAnLi4vLi4vdXNlTG9jYWxTdG9yYWdlJztcbmltcG9ydCBIeWRyYXRpb25DaGVja2VyIGZyb20gJy4uLy4uL0h5ZHJhdGlvbkNoZWNrZXInO1xuaW1wb3J0IFByb3BUeXBlcywgeyBSZXF1aXJlYWJsZSB9IGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRoZW1lUHJvdmlkZXJQcm9wcyBleHRlbmRzIFN0YW5kYXJkUHJvcHM8UmVhY3QuSFRNTEF0dHJpYnV0ZXM8SFRNTERpdkVsZW1lbnQ+PiB7XG4gIC8qKlxuICAgKiBBIGNvbGxlY3Rpb24gb2YgdGhlbWVzIGFuZCB0aGVpciBuYW1lc1xuICAgKiBkZWZhdWx0OiB7XG4gICAqICAgXCJMaWdodFwiOiBsaWdodCxcbiAgICogICBcIkRhcmtcIjogZGFya1xuICAgKiB9XG4gICAqL1xuICB0aGVtZXM/OiB7XG4gICAgW3RoZW1lTmFtZTogc3RyaW5nXTogVGhlbWU7XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZGVmYXVsdCAobGlnaHQpIHRoZW1lXG4gICAqIGRlZmF1bHQ6IFwiTGlnaHRcIlxuICAgKi9cbiAgZGVmYXVsdFRoZW1lTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBkYXJrIHRoZW1lXG4gICAqIGRlZmF1bHQ6IFwiRGFya1wiXG4gICAqL1xuICBkYXJrVGhlbWVOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogU3RvcmUgdGhlIGN1cnJlbnQgdGhlbWUgaW4gbG9jYWwgc3RvcmFnZSwgdG8gc2F2ZSBpdCBiZXR3ZWVuIGJyb3dzZXIgcmVsb2Fkc1xuICAgKiBOb3RlOiBVc2VzIHRoZSBzYW1lIHZhbHVlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudCAoY2Fubm90IGJlIHVwZGF0ZWQpXG4gICAqIGRlZmF1bHQ6IGZhbHNlXG4gICAqL1xuICBkaXNhYmxlTG9jYWxTdG9yYWdlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEdsb2JhbCBzY29wZWQgVGhlbWVQcm92aWRlcnMgYXBwbHkgZ2xvYmFsIHN0eWxlcyB0byB0aGUgYm9keSBlbGVtZW50XG4gICAqIExvY2FsIHNjb3BlZCBUaGVtZVByb3ZpZGVycyBhcHBseSBnbG9iYWwgc3R5bGVzIHRvIGEgd3JhcHBlciBkaXZcbiAgICogVW5zY29wZWQgVGhlbWVQcm92aWRlcnMgZG8gbm90IGFwcGx5IGFueSBnbG9iYWwgc3R5bGVzXG4gICAqIGRlZmF1bHQ6IFwiZ2xvYmFsXCJcbiAgICovXG4gIHNjb3BlPzogJ2dsb2JhbCcgfCAnbG9jYWwnIHwgZmFsc2U7XG59XG5cbi8qKlxuICogQSBjb21wb25lbnQgdGhhdCBwcm92aWRlcyB0aGUgYXBwIHdpdGggdGhlbWluZyBzdXBwb3J0XG4gKi9cbmNvbnN0IFRoZW1lUHJvdmlkZXIgPSBSZWFjdC5mb3J3YXJkUmVmPEhUTUxEaXZFbGVtZW50LCBUaGVtZVByb3ZpZGVyUHJvcHM+KGZ1bmN0aW9uIFRoZW1lUHJvdmlkZXIoXG4gIHByb3BzLFxuICByZWZcbikge1xuICBjb25zdCB7XG4gICAgY2hpbGRyZW4sXG4gICAgdGhlbWVzID0ge1xuICAgICAgTGlnaHQ6IGxpZ2h0LFxuICAgICAgRGFyazogZGFya1xuICAgIH0sXG4gICAgZGVmYXVsdFRoZW1lTmFtZSA9ICdMaWdodCcsXG4gICAgZGFya1RoZW1lTmFtZSA9ICdEYXJrJyxcbiAgICBzY29wZSA9ICdnbG9iYWwnLFxuICAgIGRpc2FibGVMb2NhbFN0b3JhZ2U6IHByb3BEaXNhYmxlTG9jYWxTdG9yYWdlLFxuICAgIC4uLm90aGVyXG4gIH0gPSBwcm9wcztcblxuICAvLyBOb3RlOiBmYWxzZSBkdXJpbmcgcmVoeWRyYXRpb24gcnVuLCByZWdhcmRsZXNzIG9mIGJyb3dzZXIgc2V0dGluZy4uLlxuICAvLyBUT0RPOiBpZiB3ZSBzd2l0Y2ggdG8gdGhlIHVzZUh5ZHJhdGVkIGhvb2sgYW5kIHVzZSB0aGUgc3RhbmRhcmQgYnJvd3NlciBtZWRpYSBxdWVyaWVzIHdlIGNhbiBwb3NzaWJseSBhdm9pZCBleHRyYSByZW5kZXJzIGhlcmVcbiAgY29uc3QgcHJlZmVyc0RhcmtNb2RlID0gdXNlTWVkaWFRdWVyeSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpO1xuXG4gIC8vIENhbm5vdCB1cGRhdGUgdGhlIGRpc2FibGVMb2NhbFN0b3JhZ2UgdmFsdWUgb3RoZXJ3aXNlIGRpZmZlcmVudCBob29rcyB3b3VsZCBiZSBjYWxsZWQgb24gdGhlIG5leHQgbGluZVxuICAvLyBSZWFjdCByZXF1aXJlcyB0aGF0IHRoZSBzYW1lIGhvb2tzIGJlIGNhbGxlZCBpbiB0aGUgc2FtZSBvcmRlclxuICBjb25zdCBbbG9jYWxTdG9yYWdlRW5hYmxlZF0gPSB1c2VTdGF0ZSghcHJvcERpc2FibGVMb2NhbFN0b3JhZ2UpO1xuICBjb25zdCBbY2hvc2VuVGhlbWUsIHNldENob3NlblRoZW1lXSA9IChsb2NhbFN0b3JhZ2VFbmFibGVkXG4gICAgPyAoKSA9PiB1c2VMb2NhbFN0b3JhZ2UoJ3RoZW1lJylcbiAgICA6ICgpID0+IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4oZGVmYXVsdFRoZW1lTmFtZSkpKCk7XG5cbiAgY29uc3QgW3JlZ2lzdGVyZWRUaGVtZXMsIHNldFJlZ2lzdGVyZWRUaGVtZXNdID0gdXNlU3RhdGUobmV3IE1hcChPYmplY3QuZW50cmllcyh0aGVtZXMpKSk7XG5cbiAgbGV0IHRoZW1lTmFtZTogc3RyaW5nO1xuICBsZXQgdGhlbWU6IFRoZW1lO1xuICBpZiAoY2hvc2VuVGhlbWUgIT09IHVuZGVmaW5lZCAmJiByZWdpc3RlcmVkVGhlbWVzLmhhcyhjaG9zZW5UaGVtZSkpIHtcbiAgICB0aGVtZU5hbWUgPSBjaG9zZW5UaGVtZTtcbiAgICB0aGVtZSA9IHJlZ2lzdGVyZWRUaGVtZXMuZ2V0KHRoZW1lTmFtZSkgYXMgVGhlbWU7XG4gIH0gZWxzZSB7XG4gICAgdGhlbWVOYW1lID0gcHJlZmVyc0RhcmtNb2RlID8gZGFya1RoZW1lTmFtZSA6IGRlZmF1bHRUaGVtZU5hbWU7XG4gICAgdGhlbWUgPSByZWdpc3RlcmVkVGhlbWVzLmdldCh0aGVtZU5hbWUpIHx8IGxpZ2h0O1xuICB9XG5cbiAgY29uc3Qgc2V0VGhlbWUgPSB1c2VDYWxsYmFjayhcbiAgICAodGhlbWVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGNvbnNvbGUuYXNzZXJ0KFxuICAgICAgICB0aGVtZU5hbWUgPT09IHVuZGVmaW5lZCB8fCByZWdpc3RlcmVkVGhlbWVzLmhhcyh0aGVtZU5hbWUpLFxuICAgICAgICBgVW5yZWNvZ25pc2VkIHRoZW1lOiAke3RoZW1lTmFtZX1gXG4gICAgICApO1xuICAgICAgc2V0Q2hvc2VuVGhlbWUodGhlbWVOYW1lKTtcbiAgICB9LFxuICAgIFtzZXRDaG9zZW5UaGVtZSwgcmVnaXN0ZXJlZFRoZW1lc11cbiAgKTtcblxuICBjb25zdCBzZWxlY3RlZFRoZW1lID0gdXNlTWVtbzxUaGVtZVVwZGF0ZT4oXG4gICAgKCkgPT4gKHtcbiAgICAgIHJlcXVlc3RlZFRoZW1lTmFtZTogY2hvc2VuVGhlbWUsXG4gICAgICByZW5kZXJlZFRoZW1lTmFtZTogdGhlbWVOYW1lLFxuICAgICAgdGhlbWUsXG4gICAgICBzZXRUaGVtZVxuICAgIH0pLFxuICAgIFtjaG9zZW5UaGVtZSwgdGhlbWVOYW1lLCBzZXRUaGVtZV1cbiAgKTtcblxuICBjb25zdCBzZXRUaGVtZXMgPSB1c2VDYWxsYmFjayhcbiAgICAodGhlbWVzOiB7IFtuYW1lOiBzdHJpbmddOiBUaGVtZSB9KSA9PiB7XG4gICAgICBzZXRSZWdpc3RlcmVkVGhlbWVzKG5ldyBNYXAoT2JqZWN0LmVudHJpZXModGhlbWVzKSkpO1xuICAgIH0sXG4gICAgW3NldFJlZ2lzdGVyZWRUaGVtZXNdXG4gICk7XG5cbiAgY29uc3QgdGhlbWVSZWdpc3RlcjogW01hcDxzdHJpbmcsIFRoZW1lPiwgKHRoZW1lczogeyBbbmFtZTogc3RyaW5nXTogVGhlbWUgfSkgPT4gdm9pZF0gPSB1c2VNZW1vKFxuICAgICgpID0+IFtyZWdpc3RlcmVkVGhlbWVzLCBzZXRUaGVtZXNdLFxuICAgIFtyZWdpc3RlcmVkVGhlbWVzLCBzZXRUaGVtZXNdXG4gICk7XG5cbiAgY29uc3QgY3NzQmFzZWxpbmVXcmFwcGVyID0gKCgpID0+IHtcbiAgICBzd2l0Y2ggKHNjb3BlKSB7XG4gICAgICBjYXNlICdnbG9iYWwnOlxuICAgICAgICByZXR1cm4gPENzc0Jhc2VsaW5lIHsuLi5vdGhlcn0+e2NoaWxkcmVufTwvQ3NzQmFzZWxpbmU+O1xuICAgICAgY2FzZSAnbG9jYWwnOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxTY29wZWRDc3NCYXNlbGluZSB7Li4ub3RoZXJ9IHJlZj17cmVmfT5cbiAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICA8L1Njb3BlZENzc0Jhc2VsaW5lPlxuICAgICAgICApO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDw+e2NoaWxkcmVufTwvPjtcbiAgICB9XG4gIH0pKCk7XG5cbiAgcmV0dXJuIChcbiAgICA8VGhlbWVSZWdpc3RlckNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3RoZW1lUmVnaXN0ZXJ9PlxuICAgICAgPFRoZW1lVXBkYXRlQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17c2VsZWN0ZWRUaGVtZX0+XG4gICAgICAgIDxNdWlUaGVtZVByb3ZpZGVyIHRoZW1lPXt0aGVtZX0+e2Nzc0Jhc2VsaW5lV3JhcHBlcn08L011aVRoZW1lUHJvdmlkZXI+XG4gICAgICA8L1RoZW1lVXBkYXRlQ29udGV4dC5Qcm92aWRlcj5cbiAgICA8L1RoZW1lUmVnaXN0ZXJDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufSk7XG5cblRoZW1lUHJvdmlkZXIucHJvcFR5cGVzID0ge1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gIHRoZW1lczogUHJvcFR5cGVzLm9iamVjdE9mKChQcm9wVHlwZXMub2JqZWN0IGFzIFJlcXVpcmVhYmxlPFRoZW1lPikuaXNSZXF1aXJlZCksXG4gIGRlZmF1bHRUaGVtZU5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGRhcmtUaGVtZU5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGRpc2FibGVMb2NhbFN0b3JhZ2U6IFByb3BUeXBlcy5ib29sLFxuICBzY29wZTogUHJvcFR5cGVzLm9uZU9mKFsnZ2xvYmFsJywgJ2xvY2FsJywgZmFsc2VdKVxufTtcblxuLyoqXG4gKiBBIGNvbXBvbmVudCB0aGF0IHByb3ZpZGVzIHRoZSBhcHAgd2l0aCB0aGVtaW5nIHN1cHBvcnQuXG4gKiBBbHNvIHByb3ZpZGluZyBhIGA8SHlkcmF0aW9uQ2hlY2tlci8+YC5cbiAqL1xuY29uc3QgVGhlbWVQcm92aWRlcldpdGhIeWRyYXRpb25DaGVja2VyID0gUmVhY3QuZm9yd2FyZFJlZjxIVE1MRGl2RWxlbWVudCwgVGhlbWVQcm92aWRlclByb3BzPihcbiAgKHByb3BzLCByZWYpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPEh5ZHJhdGlvbkNoZWNrZXI+XG4gICAgICAgIDxUaGVtZVByb3ZpZGVyIHsuLi5wcm9wc30gcmVmPXtyZWZ9IC8+XG4gICAgICA8L0h5ZHJhdGlvbkNoZWNrZXI+XG4gICAgKTtcbiAgfVxuKTtcblxuVGhlbWVQcm92aWRlcldpdGhIeWRyYXRpb25DaGVja2VyLmRpc3BsYXlOYW1lID0gJ1RoZW1lUHJvdmlkZXInO1xuXG5leHBvcnQgZGVmYXVsdCBUaGVtZVByb3ZpZGVyV2l0aEh5ZHJhdGlvbkNoZWNrZXI7XG4iXSwibmFtZXMiOlsiUmVhY3QiLCJ0aGVtZXMiLCJsaWdodCIsImRhcmsiLCJ1c2VNZWRpYVF1ZXJ5IiwidXNlU3RhdGUiLCJ1c2VDYWxsYmFjayIsInVzZU1lbW8iLCJDc3NCYXNlbGluZSIsIlNjb3BlZENzc0Jhc2VsaW5lIiwiVGhlbWVSZWdpc3RlckNvbnRleHQiLCJUaGVtZVVwZGF0ZUNvbnRleHQiLCJNdWlUaGVtZVByb3ZpZGVyIiwiUHJvcFR5cGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQW9EQTs7O0FBR0EsTUFBTSxhQUFhLEdBQUdBLHlCQUFLLENBQUMsVUFBVSxDQUFxQyxTQUFTLGFBQWEsQ0FDL0YsS0FBSyxFQUNMLEdBQUc7SUFFSCxNQUFNLEVBQ0osUUFBUSxVQUNSQyxRQUFNLEdBQUc7UUFDUCxLQUFLLEVBQUVDLFlBQUs7UUFDWixJQUFJLEVBQUVDLFdBQUk7S0FDWCxFQUNELGdCQUFnQixHQUFHLE9BQU8sRUFDMUIsYUFBYSxHQUFHLE1BQU0sRUFDdEIsS0FBSyxHQUFHLFFBQVEsRUFDaEIsbUJBQW1CLEVBQUUsdUJBQXVCLEtBRTFDLEtBQUssRUFESixLQUFLLGdCQUNOLEtBQUssRUFYSCwyRkFXTCxDQUFRLENBQUM7OztJQUlWLE1BQU0sZUFBZSxHQUFH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