UNPKG

7.94 kBSource Map (JSON)View Raw
1{"version":3,"file":"Theme.js","sources":["../src/theme/Theme.js"],"sourcesContent":["import React, { useContext, useMemo } from 'react'\nimport PropTypes from 'prop-types'\nimport { color, warnOnce } from '../utils'\nimport dark from './theme-dark'\nimport light from './theme-light'\n\n// Every theme has a name and an appearance.\n// The appearance can be either “dark” or “light”.\nconst APPEARANCES = ['dark', 'light']\n\nconst EMBEDDED_THEMES = { dark, light }\nconst THEME_DEFAULT = 'light'\n\nconst RESERVED_KEYS = ['_appearance', '_name']\nconst DEPRECATED_COLORS = new Map([\n ['error', 'negative'],\n ['success', 'positive'],\n])\n\nconst COLOR_FALLBACK = '#FF00FF'\n\nfunction getTheme(theme) {\n const validationError = validateTheme(theme)\n if (validationError !== null) {\n warnOnce(\n `theme:theme-invalid:${validationError}`,\n `Theme invalid: ${validationError}. ` +\n `Using the theme “${THEME_DEFAULT}” instead.`\n )\n return EMBEDDED_THEMES[THEME_DEFAULT]\n }\n\n if (typeof theme === 'string' && EMBEDDED_THEMES[theme]) {\n return EMBEDDED_THEMES[theme]\n }\n\n const baseTheme =\n EMBEDDED_THEMES[theme._appearance === 'dark' ? 'dark' : 'light']\n\n return { ...baseTheme, ...theme }\n}\n\n// Setting the default is needed for cases when components are used without being wrapped in `<Theme />`, e.g. for tests.\nconst ThemeContext = React.createContext(prepareTheme(getTheme(THEME_DEFAULT)))\n\nfunction convertThemeColor(name, value) {\n if (RESERVED_KEYS.includes(name)) {\n return value\n }\n\n try {\n return color(value)\n } catch (err) {\n return color(COLOR_FALLBACK)\n }\n}\n\n// prepareTheme() does a few things:\n// - Wrap every color in a color() object (see utils/color.js).\n// - Filter out invalid colors added in custom themes.\n// - Wraps the theme in a proxy that warns about deprecated colors.\nfunction prepareTheme(theme) {\n const themeConverted = Object.fromEntries(\n Object.entries(theme)\n .filter(([name]) => {\n if (!EMBEDDED_THEMES[THEME_DEFAULT][name]) {\n warnOnce(\n `theme:invalid:${name}`,\n `Theme: the color “${name}” is invalid and will be ignored. ` +\n `Please check src/theme/theme-light.js in the aragonUI ` +\n `repository for a list of valid colors.`\n )\n return false\n }\n return true\n })\n .map(([name, value]) => [name, convertThemeColor(name, value)])\n )\n return new Proxy(themeConverted, {\n get(theme, name) {\n if (DEPRECATED_COLORS.has(name)) {\n warnOnce(\n `theme:deprecated:${name}`,\n `useTheme(): the color “${name}” has been deprecated and will be removed soon. ` +\n `Please use “${DEPRECATED_COLORS.get(name)}” instead.`\n )\n return theme[DEPRECATED_COLORS.get(name)]\n }\n if (!theme[name]) {\n warnOnce(\n `theme:unknown:${name}`,\n `useTheme(): the color “${name}” doesn’t exist in the theme.`\n )\n return COLOR_FALLBACK\n }\n return theme[name]\n },\n })\n}\n\nfunction validateTheme(theme) {\n if (typeof theme === 'string') {\n return EMBEDDED_THEMES[theme] ? null : `the theme “${theme}” doesn’t exist`\n }\n if (theme && !theme._name) {\n return `the “_name” key of the theme is missing`\n }\n if (theme && !APPEARANCES.includes(theme._appearance)) {\n return `the “_appearance” key of the theme is missing`\n }\n return null\n}\n\nfunction Theme({ theme, children }) {\n if (theme === undefined) {\n theme = THEME_DEFAULT\n }\n\n const themeConverted = useMemo(() => prepareTheme(getTheme(theme)), [theme])\n\n return (\n <ThemeContext.Provider value={themeConverted}>\n {children}\n </ThemeContext.Provider>\n )\n}\n\nTheme.propTypes = {\n children: PropTypes.node,\n theme: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),\n}\n\nfunction useTheme() {\n return useContext(ThemeContext)\n}\n\nTheme.THEME_DEFAULT = THEME_DEFAULT\nTheme.EMBEDDED_THEMES = EMBEDDED_THEMES\n\nexport { Theme, useTheme }\n"],"names":["APPEARANCES","EMBEDDED_THEMES","dark","light","THEME_DEFAULT","RESERVED_KEYS","DEPRECATED_COLORS","Map","COLOR_FALLBACK","getTheme","theme","validationError","validateTheme","warnOnce","baseTheme","_appearance","ThemeContext","React","createContext","prepareTheme","convertThemeColor","name","value","includes","color","err","themeConverted","Object","fromEntries","entries","filter","map","Proxy","get","has","_name","Theme","children","undefined","useMemo","propTypes","PropTypes","node","oneOfType","object","string","useTheme","useContext"],"mappings":"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"}
\No newline at end of file