@wise/components-theming 0.6.3-beta-1ecce65b8a.45 → 0.7.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.
@@ -21,14 +21,13 @@ type ScreenMode = (typeof screenModes)[number];
21
21
  type Theming = {
22
22
  theme?: ComponentTheme | BaseTheme | ExtraTheme;
23
23
  screenMode?: ScreenMode;
24
- isNotRootProvider?: boolean | undefined;
25
24
  };
26
25
  declare const isThemeModern: (theme: ComponentTheme | BaseTheme | ExtraTheme) => theme is "personal" | "forest-green" | "bright-green";
27
26
  declare const isExtraTheme: (theme: ComponentTheme | BaseTheme | ExtraTheme) => theme is "forest-green" | "bright-green";
28
27
  declare const isScreenModeDark: (theme: ComponentTheme | BaseTheme | ExtraTheme, screenMode: ScreenMode) => screenMode is "dark";
29
28
  declare const getThemeClassName: (theme: ComponentTheme | BaseTheme | ExtraTheme, screenMode: ScreenMode) => string;
30
29
  type ThemeProviderProps = PropsWithChildren<Theming>;
31
- declare const ThemeProvider: ({ theme, screenMode, isNotRootProvider, children }: ThemeProviderProps) => JSX.Element;
30
+ declare const ThemeProvider: ({ theme, screenMode, children }: ThemeProviderProps) => JSX.Element;
32
31
  interface ThemeHookValue {
33
32
  theme: ComponentTheme | BaseTheme | ExtraTheme;
34
33
  screenMode: ScreenMode;
package/dist/cjs/index.js CHANGED
@@ -40,10 +40,24 @@ var FALLBACK_VALUES = {
40
40
  theme: DEFAULT_BASE_THEME,
41
41
  screenMode: DEFAULT_SCREEN_MODE
42
42
  };
43
+
44
+ var isNotProduction = function isNotProduction() {
45
+ try {
46
+ return ['localhost', 'dev-wi.se'].includes(window.location.hostname);
47
+ } catch (_unused) {
48
+ return false;
49
+ }
50
+ };
51
+
43
52
  var useTheme = function useTheme() {
44
- var _useContext;
53
+ var theming = react.useContext(ThemeContext);
54
+
55
+ if (!theming && isNotProduction()) {
56
+ // eslint-disable-next-line no-console
57
+ console.warn('Call to useTheme outside a ThemeProvider');
58
+ }
45
59
 
46
- var _ref = (_useContext = react.useContext(ThemeContext)) !== null && _useContext !== void 0 ? _useContext : FALLBACK_VALUES,
60
+ var _ref = theming !== null && theming !== void 0 ? theming : FALLBACK_VALUES,
47
61
  theme = _ref.theme,
48
62
  contextScreenMode = _ref.screenMode;
49
63
 
@@ -77,16 +91,14 @@ var ThemeProvider = function ThemeProvider(_ref) {
77
91
  theme = _ref$theme === void 0 ? DEFAULT_BASE_THEME : _ref$theme,
78
92
  _ref$screenMode = _ref.screenMode,
79
93
  screenMode = _ref$screenMode === void 0 ? DEFAULT_SCREEN_MODE : _ref$screenMode,
80
- _ref$isNotRootProvide = _ref.isNotRootProvider,
81
- isNotRootProvider = _ref$isNotRootProvide === void 0 ? false : _ref$isNotRootProvide,
82
94
  children = _ref.children;
83
- var isContextRoot = react.useContext(ThemeContext) === undefined; // RegEx to check for `np-theme-` class name
95
+ var isRootProvider = react.useContext(ThemeContext) === undefined; // RegEx to check for `np-theme-` class name
84
96
  // eslint-disable-next-line react-hooks/exhaustive-deps
85
97
 
86
98
  var themeClass = new RegExp(/\bnp-theme-[a-z-]+\b/, 'g'); // useEffect hook used to apply the theme class to the HTML element
87
99
 
88
100
  react.useEffect(function () {
89
- if (!isNotRootProvider && isContextRoot) {
101
+ if (isRootProvider) {
90
102
  var _document$documentEle;
91
103
 
92
104
  // Remove all the theme classes from the documentElement
@@ -97,7 +109,7 @@ var ThemeProvider = function ThemeProvider(_ref) {
97
109
  document.documentElement.classList.add(item);
98
110
  });
99
111
  }
100
- }, [isNotRootProvider, isContextRoot, theme, screenMode, themeClass]);
112
+ }, [isRootProvider, theme, screenMode, themeClass]);
101
113
  var contextValue = react.useMemo(function () {
102
114
  return {
103
115
  theme: theme,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/const.ts","../../src/helpers.ts","../../src/useTheme.ts","../../src/ThemedChildren.tsx","../../src/ThemeProvider.tsx"],"sourcesContent":["// TODO: Change 'light' with 'legacy' in the future\nexport const baseThemes = ['light', 'personal'] as const;\nexport const extraThemes = ['forest-green', 'bright-green'] as const;\nexport const screenModes = ['light', 'dark'] as const;\nexport const modernThemes = [baseThemes[1], ...extraThemes] as const;\n\n// TODO: componentThemes returned back for backward compatibility, refactor this place in the future\nexport type ComponentTheme = typeof baseThemes[number];\nexport type ModernTheme = typeof modernThemes[number];\nexport type BaseTheme = typeof baseThemes[number];\nexport type ExtraTheme = typeof extraThemes[number];\nexport type ScreenMode = typeof screenModes[number];\nexport type ScreenModeDark = typeof screenModes[1];\n\nexport const DEFAULT_BASE_THEME = 'light' as const;\nexport const DEFAULT_SCREEN_MODE = 'light' as const;\n\nexport type Theming = {\n theme?: ComponentTheme | BaseTheme | ExtraTheme;\n screenMode?: ScreenMode;\n isNotRootProvider?: boolean | undefined;\n};\n","import type {\n ComponentTheme,\n ModernTheme,\n BaseTheme,\n ExtraTheme,\n ScreenMode,\n ScreenModeDark,\n} from './const';\nimport { extraThemes, screenModes, modernThemes } from './const';\n\nexport const isThemeModern = (\n theme: ComponentTheme | BaseTheme | ExtraTheme,\n): theme is ModernTheme => modernThemes.includes(theme as ModernTheme);\n\nexport const isExtraTheme = (theme: ComponentTheme | BaseTheme | ExtraTheme): theme is ExtraTheme =>\n extraThemes.includes(theme as ExtraTheme);\n\nexport const isScreenModeDark = (\n theme: ComponentTheme | BaseTheme | ExtraTheme,\n screenMode: ScreenMode,\n): screenMode is ScreenModeDark =>\n isThemeModern(theme as ModernTheme) && screenModes[1] === screenMode;\n\nexport const getThemeClassName = (\n theme: ComponentTheme | BaseTheme | ExtraTheme,\n screenMode: ScreenMode,\n) => {\n if (!isThemeModern(theme)) {\n return `np-theme-${theme}`;\n }\n\n let classes = `np-theme-personal`;\n\n if (isExtraTheme(theme)) {\n classes += ` ${classes}--${theme}`;\n } else if (screenModes[1] === screenMode) {\n classes += ` ${classes}--${screenMode}`;\n }\n\n return classes;\n};\n","import { useContext, useMemo } from 'react';\n\nimport { ThemeContext } from './ThemeProvider';\nimport type { ComponentTheme, BaseTheme, ScreenMode, ExtraTheme } from './const';\nimport { DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';\nimport { isThemeModern, isScreenModeDark, getThemeClassName } from './helpers';\n\ninterface ThemeHookValue {\n theme: ComponentTheme | BaseTheme | ExtraTheme;\n screenMode: ScreenMode;\n isModern: boolean;\n isScreenModeDark: boolean;\n className: string;\n}\n\nconst FALLBACK_VALUES = {\n theme: DEFAULT_BASE_THEME,\n screenMode: DEFAULT_SCREEN_MODE,\n};\n\nexport const useTheme = (): ThemeHookValue => {\n const { theme, screenMode: contextScreenMode } = useContext(ThemeContext) ?? FALLBACK_VALUES;\n\n const screenMode = theme === DEFAULT_BASE_THEME ? DEFAULT_SCREEN_MODE : contextScreenMode;\n\n return useMemo(\n () => ({\n theme,\n screenMode,\n isModern: isThemeModern(theme),\n isScreenModeDark: isScreenModeDark(theme, screenMode),\n className: getThemeClassName(theme, screenMode),\n }),\n [theme, screenMode],\n );\n};\n","import { ReactNode } from 'react';\n\nimport { useTheme } from './useTheme';\n\ntype ThemedChildrenProps = { children: ReactNode };\n\nexport const ThemedChildren = ({ children }: ThemedChildrenProps) => {\n const { className } = useTheme();\n\n return <div className={className}>{children}</div>;\n};\n","import { createContext, PropsWithChildren, useContext, useEffect, useMemo } from 'react';\n\nimport { ThemedChildren } from './ThemedChildren';\nimport type { ComponentTheme, BaseTheme, ExtraTheme, ScreenMode, Theming } from './const';\nimport { DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';\nimport { getThemeClassName } from './helpers';\n\nexport const ThemeContext = createContext<\n | {\n theme: ComponentTheme | BaseTheme | ExtraTheme;\n screenMode: ScreenMode;\n }\n | undefined\n>(undefined);\n\ntype ThemeProviderProps = PropsWithChildren<Theming>;\n\nexport const ThemeProvider = ({\n theme = DEFAULT_BASE_THEME,\n screenMode = DEFAULT_SCREEN_MODE,\n isNotRootProvider = false,\n children,\n}: ThemeProviderProps) => {\n const isContextRoot = useContext(ThemeContext) === undefined;\n\n // RegEx to check for `np-theme-` class name\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const themeClass = new RegExp(/\\bnp-theme-[a-z-]+\\b/, 'g');\n\n // useEffect hook used to apply the theme class to the HTML element\n useEffect(() => {\n if (!isNotRootProvider && isContextRoot) {\n // Remove all the theme classes from the documentElement\n document.documentElement.className.match(themeClass)?.forEach((item) => {\n document.documentElement.classList.remove(item);\n });\n getThemeClassName(theme, screenMode)\n .split(' ')\n .forEach((item) => {\n document.documentElement.classList.add(item);\n });\n }\n }, [isNotRootProvider, isContextRoot, theme, screenMode, themeClass]);\n\n const contextValue = useMemo(() => ({ theme, screenMode }), [screenMode, theme]);\n\n return (\n <ThemeContext.Provider value={contextValue}>\n <ThemedChildren>{children}</ThemedChildren>\n </ThemeContext.Provider>\n );\n};\n"],"names":["baseThemes","extraThemes","screenModes","modernThemes","DEFAULT_BASE_THEME","DEFAULT_SCREEN_MODE","isThemeModern","theme","includes","isExtraTheme","isScreenModeDark","screenMode","getThemeClassName","classes","FALLBACK_VALUES","useTheme","useContext","ThemeContext","contextScreenMode","useMemo","isModern","className","ThemedChildren","children","_jsx","createContext","undefined","ThemeProvider","isNotRootProvider","isContextRoot","themeClass","RegExp","useEffect","documentElement","match","forEach","item","document","classList","remove","split","add","contextValue","Provider","value"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/const.ts","../../src/helpers.ts","../../src/useTheme.ts","../../src/ThemedChildren.tsx","../../src/ThemeProvider.tsx"],"sourcesContent":["// TODO: Change 'light' with 'legacy' in the future\nexport const baseThemes = ['light', 'personal'] as const;\nexport const extraThemes = ['forest-green', 'bright-green'] as const;\nexport const screenModes = ['light', 'dark'] as const;\nexport const modernThemes = [baseThemes[1], ...extraThemes] as const;\n\n// TODO: componentThemes returned back for backward compatibility, refactor this place in the future\nexport type ComponentTheme = typeof baseThemes[number];\nexport type ModernTheme = typeof modernThemes[number];\nexport type BaseTheme = typeof baseThemes[number];\nexport type ExtraTheme = typeof extraThemes[number];\nexport type ScreenMode = typeof screenModes[number];\nexport type ScreenModeDark = typeof screenModes[1];\n\nexport const DEFAULT_BASE_THEME = 'light' as const;\nexport const DEFAULT_SCREEN_MODE = 'light' as const;\n\nexport type Theming = {\n theme?: ComponentTheme | BaseTheme | ExtraTheme;\n screenMode?: ScreenMode;\n};\n","import type {\n ComponentTheme,\n ModernTheme,\n BaseTheme,\n ExtraTheme,\n ScreenMode,\n ScreenModeDark,\n} from './const';\nimport { extraThemes, screenModes, modernThemes } from './const';\n\nexport const isThemeModern = (\n theme: ComponentTheme | BaseTheme | ExtraTheme,\n): theme is ModernTheme => modernThemes.includes(theme as ModernTheme);\n\nexport const isExtraTheme = (theme: ComponentTheme | BaseTheme | ExtraTheme): theme is ExtraTheme =>\n extraThemes.includes(theme as ExtraTheme);\n\nexport const isScreenModeDark = (\n theme: ComponentTheme | BaseTheme | ExtraTheme,\n screenMode: ScreenMode,\n): screenMode is ScreenModeDark =>\n isThemeModern(theme as ModernTheme) && screenModes[1] === screenMode;\n\nexport const getThemeClassName = (\n theme: ComponentTheme | BaseTheme | ExtraTheme,\n screenMode: ScreenMode,\n) => {\n if (!isThemeModern(theme)) {\n return `np-theme-${theme}`;\n }\n\n let classes = `np-theme-personal`;\n\n if (isExtraTheme(theme)) {\n classes += ` ${classes}--${theme}`;\n } else if (screenModes[1] === screenMode) {\n classes += ` ${classes}--${screenMode}`;\n }\n\n return classes;\n};\n","import { useContext, useMemo } from 'react';\n\nimport { ThemeContext } from './ThemeProvider';\nimport type { ComponentTheme, BaseTheme, ScreenMode, ExtraTheme } from './const';\nimport { DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';\nimport { isThemeModern, isScreenModeDark, getThemeClassName } from './helpers';\n\ninterface ThemeHookValue {\n theme: ComponentTheme | BaseTheme | ExtraTheme;\n screenMode: ScreenMode;\n isModern: boolean;\n isScreenModeDark: boolean;\n className: string;\n}\n\nconst FALLBACK_VALUES = {\n theme: DEFAULT_BASE_THEME,\n screenMode: DEFAULT_SCREEN_MODE,\n};\n\nconst isNotProduction = () => {\n try {\n return ['localhost', 'dev-wi.se'].includes(window.location.hostname);\n } catch {\n return false;\n }\n};\n\nexport const useTheme = (): ThemeHookValue => {\n const theming = useContext(ThemeContext);\n\n if (!theming && isNotProduction()) {\n // eslint-disable-next-line no-console\n console.warn('Call to useTheme outside a ThemeProvider');\n }\n\n const { theme, screenMode: contextScreenMode } = theming ?? FALLBACK_VALUES;\n\n const screenMode = theme === DEFAULT_BASE_THEME ? DEFAULT_SCREEN_MODE : contextScreenMode;\n\n return useMemo(\n () => ({\n theme,\n screenMode,\n isModern: isThemeModern(theme),\n isScreenModeDark: isScreenModeDark(theme, screenMode),\n className: getThemeClassName(theme, screenMode),\n }),\n [theme, screenMode],\n );\n};\n","import { ReactNode } from 'react';\n\nimport { useTheme } from './useTheme';\n\ntype ThemedChildrenProps = { children: ReactNode };\n\nexport const ThemedChildren = ({ children }: ThemedChildrenProps) => {\n const { className } = useTheme();\n\n return <div className={className}>{children}</div>;\n};\n","import { createContext, PropsWithChildren, useContext, useEffect, useMemo } from 'react';\n\nimport { ThemedChildren } from './ThemedChildren';\nimport type { ComponentTheme, BaseTheme, ExtraTheme, ScreenMode, Theming } from './const';\nimport { DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';\nimport { getThemeClassName } from './helpers';\n\nexport const ThemeContext = createContext<\n | {\n theme: ComponentTheme | BaseTheme | ExtraTheme;\n screenMode: ScreenMode;\n }\n | undefined\n>(undefined);\n\ntype ThemeProviderProps = PropsWithChildren<Theming>;\n\nexport const ThemeProvider = ({\n theme = DEFAULT_BASE_THEME,\n screenMode = DEFAULT_SCREEN_MODE,\n children,\n}: ThemeProviderProps) => {\n const isRootProvider = useContext(ThemeContext) === undefined;\n\n // RegEx to check for `np-theme-` class name\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const themeClass = new RegExp(/\\bnp-theme-[a-z-]+\\b/, 'g');\n\n // useEffect hook used to apply the theme class to the HTML element\n useEffect(() => {\n if (isRootProvider) {\n // Remove all the theme classes from the documentElement\n document.documentElement.className.match(themeClass)?.forEach((item) => {\n document.documentElement.classList.remove(item);\n });\n getThemeClassName(theme, screenMode)\n .split(' ')\n .forEach((item) => {\n document.documentElement.classList.add(item);\n });\n }\n }, [isRootProvider, theme, screenMode, themeClass]);\n\n const contextValue = useMemo(() => ({ theme, screenMode }), [screenMode, theme]);\n\n return (\n <ThemeContext.Provider value={contextValue}>\n <ThemedChildren>{children}</ThemedChildren>\n </ThemeContext.Provider>\n );\n};\n"],"names":["baseThemes","extraThemes","screenModes","modernThemes","DEFAULT_BASE_THEME","DEFAULT_SCREEN_MODE","isThemeModern","theme","includes","isExtraTheme","isScreenModeDark","screenMode","getThemeClassName","classes","FALLBACK_VALUES","isNotProduction","window","location","hostname","useTheme","theming","useContext","ThemeContext","console","warn","contextScreenMode","useMemo","isModern","className","ThemedChildren","children","_jsx","createContext","undefined","ThemeProvider","isRootProvider","themeClass","RegExp","useEffect","documentElement","match","forEach","item","document","classList","remove","split","add","contextValue","Provider","value"],"mappings":"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"}
@@ -21,14 +21,13 @@ type ScreenMode = (typeof screenModes)[number];
21
21
  type Theming = {
22
22
  theme?: ComponentTheme | BaseTheme | ExtraTheme;
23
23
  screenMode?: ScreenMode;
24
- isNotRootProvider?: boolean | undefined;
25
24
  };
26
25
  declare const isThemeModern: (theme: ComponentTheme | BaseTheme | ExtraTheme) => theme is "personal" | "forest-green" | "bright-green";
27
26
  declare const isExtraTheme: (theme: ComponentTheme | BaseTheme | ExtraTheme) => theme is "forest-green" | "bright-green";
28
27
  declare const isScreenModeDark: (theme: ComponentTheme | BaseTheme | ExtraTheme, screenMode: ScreenMode) => screenMode is "dark";
29
28
  declare const getThemeClassName: (theme: ComponentTheme | BaseTheme | ExtraTheme, screenMode: ScreenMode) => string;
30
29
  type ThemeProviderProps = PropsWithChildren<Theming>;
31
- declare const ThemeProvider: ({ theme, screenMode, isNotRootProvider, children }: ThemeProviderProps) => JSX.Element;
30
+ declare const ThemeProvider: ({ theme, screenMode, children }: ThemeProviderProps) => JSX.Element;
32
31
  interface ThemeHookValue {
33
32
  theme: ComponentTheme | BaseTheme | ExtraTheme;
34
33
  screenMode: ScreenMode;
package/dist/es/index.js CHANGED
@@ -38,10 +38,24 @@ var FALLBACK_VALUES = {
38
38
  theme: DEFAULT_BASE_THEME,
39
39
  screenMode: DEFAULT_SCREEN_MODE
40
40
  };
41
+
42
+ var isNotProduction = function isNotProduction() {
43
+ try {
44
+ return ['localhost', 'dev-wi.se'].includes(window.location.hostname);
45
+ } catch (_unused) {
46
+ return false;
47
+ }
48
+ };
49
+
41
50
  var useTheme = function useTheme() {
42
- var _useContext;
51
+ var theming = useContext(ThemeContext);
52
+
53
+ if (!theming && isNotProduction()) {
54
+ // eslint-disable-next-line no-console
55
+ console.warn('Call to useTheme outside a ThemeProvider');
56
+ }
43
57
 
44
- var _ref = (_useContext = useContext(ThemeContext)) !== null && _useContext !== void 0 ? _useContext : FALLBACK_VALUES,
58
+ var _ref = theming !== null && theming !== void 0 ? theming : FALLBACK_VALUES,
45
59
  theme = _ref.theme,
46
60
  contextScreenMode = _ref.screenMode;
47
61
 
@@ -75,16 +89,14 @@ var ThemeProvider = function ThemeProvider(_ref) {
75
89
  theme = _ref$theme === void 0 ? DEFAULT_BASE_THEME : _ref$theme,
76
90
  _ref$screenMode = _ref.screenMode,
77
91
  screenMode = _ref$screenMode === void 0 ? DEFAULT_SCREEN_MODE : _ref$screenMode,
78
- _ref$isNotRootProvide = _ref.isNotRootProvider,
79
- isNotRootProvider = _ref$isNotRootProvide === void 0 ? false : _ref$isNotRootProvide,
80
92
  children = _ref.children;
81
- var isContextRoot = useContext(ThemeContext) === undefined; // RegEx to check for `np-theme-` class name
93
+ var isRootProvider = useContext(ThemeContext) === undefined; // RegEx to check for `np-theme-` class name
82
94
  // eslint-disable-next-line react-hooks/exhaustive-deps
83
95
 
84
96
  var themeClass = new RegExp(/\bnp-theme-[a-z-]+\b/, 'g'); // useEffect hook used to apply the theme class to the HTML element
85
97
 
86
98
  useEffect(function () {
87
- if (!isNotRootProvider && isContextRoot) {
99
+ if (isRootProvider) {
88
100
  var _document$documentEle;
89
101
 
90
102
  // Remove all the theme classes from the documentElement
@@ -95,7 +107,7 @@ var ThemeProvider = function ThemeProvider(_ref) {
95
107
  document.documentElement.classList.add(item);
96
108
  });
97
109
  }
98
- }, [isNotRootProvider, isContextRoot, theme, screenMode, themeClass]);
110
+ }, [isRootProvider, theme, screenMode, themeClass]);
99
111
  var contextValue = useMemo(function () {
100
112
  return {
101
113
  theme: theme,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/const.ts","../../src/helpers.ts","../../src/useTheme.ts","../../src/ThemedChildren.tsx","../../src/ThemeProvider.tsx"],"sourcesContent":["// TODO: Change 'light' with 'legacy' in the future\nexport const baseThemes = ['light', 'personal'] as const;\nexport const extraThemes = ['forest-green', 'bright-green'] as const;\nexport const screenModes = ['light', 'dark'] as const;\nexport const modernThemes = [baseThemes[1], ...extraThemes] as const;\n\n// TODO: componentThemes returned back for backward compatibility, refactor this place in the future\nexport type ComponentTheme = typeof baseThemes[number];\nexport type ModernTheme = typeof modernThemes[number];\nexport type BaseTheme = typeof baseThemes[number];\nexport type ExtraTheme = typeof extraThemes[number];\nexport type ScreenMode = typeof screenModes[number];\nexport type ScreenModeDark = typeof screenModes[1];\n\nexport const DEFAULT_BASE_THEME = 'light' as const;\nexport const DEFAULT_SCREEN_MODE = 'light' as const;\n\nexport type Theming = {\n theme?: ComponentTheme | BaseTheme | ExtraTheme;\n screenMode?: ScreenMode;\n isNotRootProvider?: boolean | undefined;\n};\n","import type {\n ComponentTheme,\n ModernTheme,\n BaseTheme,\n ExtraTheme,\n ScreenMode,\n ScreenModeDark,\n} from './const';\nimport { extraThemes, screenModes, modernThemes } from './const';\n\nexport const isThemeModern = (\n theme: ComponentTheme | BaseTheme | ExtraTheme,\n): theme is ModernTheme => modernThemes.includes(theme as ModernTheme);\n\nexport const isExtraTheme = (theme: ComponentTheme | BaseTheme | ExtraTheme): theme is ExtraTheme =>\n extraThemes.includes(theme as ExtraTheme);\n\nexport const isScreenModeDark = (\n theme: ComponentTheme | BaseTheme | ExtraTheme,\n screenMode: ScreenMode,\n): screenMode is ScreenModeDark =>\n isThemeModern(theme as ModernTheme) && screenModes[1] === screenMode;\n\nexport const getThemeClassName = (\n theme: ComponentTheme | BaseTheme | ExtraTheme,\n screenMode: ScreenMode,\n) => {\n if (!isThemeModern(theme)) {\n return `np-theme-${theme}`;\n }\n\n let classes = `np-theme-personal`;\n\n if (isExtraTheme(theme)) {\n classes += ` ${classes}--${theme}`;\n } else if (screenModes[1] === screenMode) {\n classes += ` ${classes}--${screenMode}`;\n }\n\n return classes;\n};\n","import { useContext, useMemo } from 'react';\n\nimport { ThemeContext } from './ThemeProvider';\nimport type { ComponentTheme, BaseTheme, ScreenMode, ExtraTheme } from './const';\nimport { DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';\nimport { isThemeModern, isScreenModeDark, getThemeClassName } from './helpers';\n\ninterface ThemeHookValue {\n theme: ComponentTheme | BaseTheme | ExtraTheme;\n screenMode: ScreenMode;\n isModern: boolean;\n isScreenModeDark: boolean;\n className: string;\n}\n\nconst FALLBACK_VALUES = {\n theme: DEFAULT_BASE_THEME,\n screenMode: DEFAULT_SCREEN_MODE,\n};\n\nexport const useTheme = (): ThemeHookValue => {\n const { theme, screenMode: contextScreenMode } = useContext(ThemeContext) ?? FALLBACK_VALUES;\n\n const screenMode = theme === DEFAULT_BASE_THEME ? DEFAULT_SCREEN_MODE : contextScreenMode;\n\n return useMemo(\n () => ({\n theme,\n screenMode,\n isModern: isThemeModern(theme),\n isScreenModeDark: isScreenModeDark(theme, screenMode),\n className: getThemeClassName(theme, screenMode),\n }),\n [theme, screenMode],\n );\n};\n","import { ReactNode } from 'react';\n\nimport { useTheme } from './useTheme';\n\ntype ThemedChildrenProps = { children: ReactNode };\n\nexport const ThemedChildren = ({ children }: ThemedChildrenProps) => {\n const { className } = useTheme();\n\n return <div className={className}>{children}</div>;\n};\n","import { createContext, PropsWithChildren, useContext, useEffect, useMemo } from 'react';\n\nimport { ThemedChildren } from './ThemedChildren';\nimport type { ComponentTheme, BaseTheme, ExtraTheme, ScreenMode, Theming } from './const';\nimport { DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';\nimport { getThemeClassName } from './helpers';\n\nexport const ThemeContext = createContext<\n | {\n theme: ComponentTheme | BaseTheme | ExtraTheme;\n screenMode: ScreenMode;\n }\n | undefined\n>(undefined);\n\ntype ThemeProviderProps = PropsWithChildren<Theming>;\n\nexport const ThemeProvider = ({\n theme = DEFAULT_BASE_THEME,\n screenMode = DEFAULT_SCREEN_MODE,\n isNotRootProvider = false,\n children,\n}: ThemeProviderProps) => {\n const isContextRoot = useContext(ThemeContext) === undefined;\n\n // RegEx to check for `np-theme-` class name\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const themeClass = new RegExp(/\\bnp-theme-[a-z-]+\\b/, 'g');\n\n // useEffect hook used to apply the theme class to the HTML element\n useEffect(() => {\n if (!isNotRootProvider && isContextRoot) {\n // Remove all the theme classes from the documentElement\n document.documentElement.className.match(themeClass)?.forEach((item) => {\n document.documentElement.classList.remove(item);\n });\n getThemeClassName(theme, screenMode)\n .split(' ')\n .forEach((item) => {\n document.documentElement.classList.add(item);\n });\n }\n }, [isNotRootProvider, isContextRoot, theme, screenMode, themeClass]);\n\n const contextValue = useMemo(() => ({ theme, screenMode }), [screenMode, theme]);\n\n return (\n <ThemeContext.Provider value={contextValue}>\n <ThemedChildren>{children}</ThemedChildren>\n </ThemeContext.Provider>\n );\n};\n"],"names":["baseThemes","extraThemes","screenModes","modernThemes","DEFAULT_BASE_THEME","DEFAULT_SCREEN_MODE","isThemeModern","theme","includes","isExtraTheme","isScreenModeDark","screenMode","getThemeClassName","classes","FALLBACK_VALUES","useTheme","useContext","ThemeContext","contextScreenMode","useMemo","isModern","className","ThemedChildren","children","_jsx","createContext","undefined","ThemeProvider","isNotRootProvider","isContextRoot","themeClass","RegExp","useEffect","documentElement","match","forEach","item","document","classList","remove","split","add","contextValue","Provider","value"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/const.ts","../../src/helpers.ts","../../src/useTheme.ts","../../src/ThemedChildren.tsx","../../src/ThemeProvider.tsx"],"sourcesContent":["// TODO: Change 'light' with 'legacy' in the future\nexport const baseThemes = ['light', 'personal'] as const;\nexport const extraThemes = ['forest-green', 'bright-green'] as const;\nexport const screenModes = ['light', 'dark'] as const;\nexport const modernThemes = [baseThemes[1], ...extraThemes] as const;\n\n// TODO: componentThemes returned back for backward compatibility, refactor this place in the future\nexport type ComponentTheme = typeof baseThemes[number];\nexport type ModernTheme = typeof modernThemes[number];\nexport type BaseTheme = typeof baseThemes[number];\nexport type ExtraTheme = typeof extraThemes[number];\nexport type ScreenMode = typeof screenModes[number];\nexport type ScreenModeDark = typeof screenModes[1];\n\nexport const DEFAULT_BASE_THEME = 'light' as const;\nexport const DEFAULT_SCREEN_MODE = 'light' as const;\n\nexport type Theming = {\n theme?: ComponentTheme | BaseTheme | ExtraTheme;\n screenMode?: ScreenMode;\n};\n","import type {\n ComponentTheme,\n ModernTheme,\n BaseTheme,\n ExtraTheme,\n ScreenMode,\n ScreenModeDark,\n} from './const';\nimport { extraThemes, screenModes, modernThemes } from './const';\n\nexport const isThemeModern = (\n theme: ComponentTheme | BaseTheme | ExtraTheme,\n): theme is ModernTheme => modernThemes.includes(theme as ModernTheme);\n\nexport const isExtraTheme = (theme: ComponentTheme | BaseTheme | ExtraTheme): theme is ExtraTheme =>\n extraThemes.includes(theme as ExtraTheme);\n\nexport const isScreenModeDark = (\n theme: ComponentTheme | BaseTheme | ExtraTheme,\n screenMode: ScreenMode,\n): screenMode is ScreenModeDark =>\n isThemeModern(theme as ModernTheme) && screenModes[1] === screenMode;\n\nexport const getThemeClassName = (\n theme: ComponentTheme | BaseTheme | ExtraTheme,\n screenMode: ScreenMode,\n) => {\n if (!isThemeModern(theme)) {\n return `np-theme-${theme}`;\n }\n\n let classes = `np-theme-personal`;\n\n if (isExtraTheme(theme)) {\n classes += ` ${classes}--${theme}`;\n } else if (screenModes[1] === screenMode) {\n classes += ` ${classes}--${screenMode}`;\n }\n\n return classes;\n};\n","import { useContext, useMemo } from 'react';\n\nimport { ThemeContext } from './ThemeProvider';\nimport type { ComponentTheme, BaseTheme, ScreenMode, ExtraTheme } from './const';\nimport { DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';\nimport { isThemeModern, isScreenModeDark, getThemeClassName } from './helpers';\n\ninterface ThemeHookValue {\n theme: ComponentTheme | BaseTheme | ExtraTheme;\n screenMode: ScreenMode;\n isModern: boolean;\n isScreenModeDark: boolean;\n className: string;\n}\n\nconst FALLBACK_VALUES = {\n theme: DEFAULT_BASE_THEME,\n screenMode: DEFAULT_SCREEN_MODE,\n};\n\nconst isNotProduction = () => {\n try {\n return ['localhost', 'dev-wi.se'].includes(window.location.hostname);\n } catch {\n return false;\n }\n};\n\nexport const useTheme = (): ThemeHookValue => {\n const theming = useContext(ThemeContext);\n\n if (!theming && isNotProduction()) {\n // eslint-disable-next-line no-console\n console.warn('Call to useTheme outside a ThemeProvider');\n }\n\n const { theme, screenMode: contextScreenMode } = theming ?? FALLBACK_VALUES;\n\n const screenMode = theme === DEFAULT_BASE_THEME ? DEFAULT_SCREEN_MODE : contextScreenMode;\n\n return useMemo(\n () => ({\n theme,\n screenMode,\n isModern: isThemeModern(theme),\n isScreenModeDark: isScreenModeDark(theme, screenMode),\n className: getThemeClassName(theme, screenMode),\n }),\n [theme, screenMode],\n );\n};\n","import { ReactNode } from 'react';\n\nimport { useTheme } from './useTheme';\n\ntype ThemedChildrenProps = { children: ReactNode };\n\nexport const ThemedChildren = ({ children }: ThemedChildrenProps) => {\n const { className } = useTheme();\n\n return <div className={className}>{children}</div>;\n};\n","import { createContext, PropsWithChildren, useContext, useEffect, useMemo } from 'react';\n\nimport { ThemedChildren } from './ThemedChildren';\nimport type { ComponentTheme, BaseTheme, ExtraTheme, ScreenMode, Theming } from './const';\nimport { DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';\nimport { getThemeClassName } from './helpers';\n\nexport const ThemeContext = createContext<\n | {\n theme: ComponentTheme | BaseTheme | ExtraTheme;\n screenMode: ScreenMode;\n }\n | undefined\n>(undefined);\n\ntype ThemeProviderProps = PropsWithChildren<Theming>;\n\nexport const ThemeProvider = ({\n theme = DEFAULT_BASE_THEME,\n screenMode = DEFAULT_SCREEN_MODE,\n children,\n}: ThemeProviderProps) => {\n const isRootProvider = useContext(ThemeContext) === undefined;\n\n // RegEx to check for `np-theme-` class name\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const themeClass = new RegExp(/\\bnp-theme-[a-z-]+\\b/, 'g');\n\n // useEffect hook used to apply the theme class to the HTML element\n useEffect(() => {\n if (isRootProvider) {\n // Remove all the theme classes from the documentElement\n document.documentElement.className.match(themeClass)?.forEach((item) => {\n document.documentElement.classList.remove(item);\n });\n getThemeClassName(theme, screenMode)\n .split(' ')\n .forEach((item) => {\n document.documentElement.classList.add(item);\n });\n }\n }, [isRootProvider, theme, screenMode, themeClass]);\n\n const contextValue = useMemo(() => ({ theme, screenMode }), [screenMode, theme]);\n\n return (\n <ThemeContext.Provider value={contextValue}>\n <ThemedChildren>{children}</ThemedChildren>\n </ThemeContext.Provider>\n );\n};\n"],"names":["baseThemes","extraThemes","screenModes","modernThemes","DEFAULT_BASE_THEME","DEFAULT_SCREEN_MODE","isThemeModern","theme","includes","isExtraTheme","isScreenModeDark","screenMode","getThemeClassName","classes","FALLBACK_VALUES","isNotProduction","window","location","hostname","useTheme","theming","useContext","ThemeContext","console","warn","contextScreenMode","useMemo","isModern","className","ThemedChildren","children","_jsx","createContext","undefined","ThemeProvider","isRootProvider","themeClass","RegExp","useEffect","documentElement","match","forEach","item","document","classList","remove","split","add","contextValue","Provider","value"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wise/components-theming",
3
- "version": "0.6.3-beta-1ecce65b8a.45+1ecce65b8a",
3
+ "version": "0.7.0",
4
4
  "description": "Provides theming support for the Wise Design system components",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [
@@ -46,5 +46,5 @@
46
46
  "dist/",
47
47
  "src/"
48
48
  ],
49
- "gitHead": "1ecce65b8aa7ad879eb9caec11ad9ed4e1142720"
49
+ "gitHead": "6f6515516b3565379677053e918c1cf59dce2dee"
50
50
  }
@@ -18,10 +18,9 @@ type ThemeProviderProps = PropsWithChildren<Theming>;
18
18
  export const ThemeProvider = ({
19
19
  theme = DEFAULT_BASE_THEME,
20
20
  screenMode = DEFAULT_SCREEN_MODE,
21
- isNotRootProvider = false,
22
21
  children,
23
22
  }: ThemeProviderProps) => {
24
- const isContextRoot = useContext(ThemeContext) === undefined;
23
+ const isRootProvider = useContext(ThemeContext) === undefined;
25
24
 
26
25
  // RegEx to check for `np-theme-` class name
27
26
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -29,7 +28,7 @@ export const ThemeProvider = ({
29
28
 
30
29
  // useEffect hook used to apply the theme class to the HTML element
31
30
  useEffect(() => {
32
- if (!isNotRootProvider && isContextRoot) {
31
+ if (isRootProvider) {
33
32
  // Remove all the theme classes from the documentElement
34
33
  document.documentElement.className.match(themeClass)?.forEach((item) => {
35
34
  document.documentElement.classList.remove(item);
@@ -40,7 +39,7 @@ export const ThemeProvider = ({
40
39
  document.documentElement.classList.add(item);
41
40
  });
42
41
  }
43
- }, [isNotRootProvider, isContextRoot, theme, screenMode, themeClass]);
42
+ }, [isRootProvider, theme, screenMode, themeClass]);
44
43
 
45
44
  const contextValue = useMemo(() => ({ theme, screenMode }), [screenMode, theme]);
46
45
 
package/src/const.ts CHANGED
@@ -18,5 +18,4 @@ export const DEFAULT_SCREEN_MODE = 'light' as const;
18
18
  export type Theming = {
19
19
  theme?: ComponentTheme | BaseTheme | ExtraTheme;
20
20
  screenMode?: ScreenMode;
21
- isNotRootProvider?: boolean | undefined;
22
21
  };
@@ -6,6 +6,8 @@ import { useTheme } from './useTheme';
6
6
 
7
7
  describe('useTheme', () => {
8
8
  it('returns default light theme', () => {
9
+ jest.spyOn(console, 'warn').mockImplementation();
10
+
9
11
  const {
10
12
  result: { current },
11
13
  } = renderHook(() => useTheme());
@@ -17,6 +19,8 @@ describe('useTheme', () => {
17
19
  isScreenModeDark: false,
18
20
  className: 'np-theme-light',
19
21
  });
22
+
23
+ jest.clearAllMocks();
20
24
  });
21
25
 
22
26
  it('returns personal theme', () => {
@@ -115,4 +119,96 @@ describe('useTheme', () => {
115
119
  className: 'np-theme-personal np-theme-personal--dark',
116
120
  });
117
121
  });
122
+
123
+ it('warns when used outside a theme provider on staging or localhost', () => {
124
+ jest.spyOn(console, 'warn').mockImplementation();
125
+
126
+ Object.defineProperty(window, 'location', {
127
+ value: {
128
+ hostname: 'wise.com',
129
+ },
130
+ writable: true,
131
+ });
132
+
133
+ const {
134
+ result: { current: productionValue },
135
+ } = renderHook(() => useTheme());
136
+
137
+ expect(productionValue).toStrictEqual({
138
+ theme: DEFAULT_BASE_THEME,
139
+ screenMode: DEFAULT_SCREEN_MODE,
140
+ isModern: false,
141
+ isScreenModeDark: false,
142
+ className: 'np-theme-light',
143
+ });
144
+
145
+ // eslint-disable-next-line no-console
146
+ expect(console.warn).not.toHaveBeenCalled();
147
+
148
+ Object.defineProperty(window, 'location', {
149
+ value: {
150
+ hostname: 'dev-wi.se',
151
+ },
152
+ writable: true,
153
+ });
154
+
155
+ const {
156
+ result: { current: stagingValue },
157
+ } = renderHook(() => useTheme());
158
+
159
+ expect(stagingValue).toStrictEqual({
160
+ theme: DEFAULT_BASE_THEME,
161
+ screenMode: DEFAULT_SCREEN_MODE,
162
+ isModern: false,
163
+ isScreenModeDark: false,
164
+ className: 'np-theme-light',
165
+ });
166
+
167
+ // eslint-disable-next-line no-console
168
+ expect(console.warn).toHaveBeenCalledTimes(1);
169
+
170
+ Object.defineProperty(window, 'location', {
171
+ value: {
172
+ hostname: 'localhost',
173
+ },
174
+ writable: true,
175
+ });
176
+
177
+ const {
178
+ result: { current: localhostValue },
179
+ } = renderHook(() => useTheme());
180
+
181
+ expect(localhostValue).toStrictEqual({
182
+ theme: DEFAULT_BASE_THEME,
183
+ screenMode: DEFAULT_SCREEN_MODE,
184
+ isModern: false,
185
+ isScreenModeDark: false,
186
+ className: 'np-theme-light',
187
+ });
188
+
189
+ // eslint-disable-next-line no-console
190
+ expect(console.warn).toHaveBeenCalledTimes(2);
191
+
192
+ Object.defineProperty(window, 'location', {
193
+ value: undefined,
194
+ writable: true,
195
+ });
196
+
197
+ const {
198
+ result: { current: noHostnameValue },
199
+ } = renderHook(() => useTheme());
200
+
201
+ expect(noHostnameValue).toStrictEqual({
202
+ theme: DEFAULT_BASE_THEME,
203
+ screenMode: DEFAULT_SCREEN_MODE,
204
+ isModern: false,
205
+ isScreenModeDark: false,
206
+ className: 'np-theme-light',
207
+ });
208
+
209
+ // eslint-disable-next-line no-console
210
+ expect(console.warn).toHaveBeenCalledTimes(2);
211
+
212
+ jest.clearAllMocks();
213
+ });
118
214
  });
package/src/useTheme.ts CHANGED
@@ -18,8 +18,23 @@ const FALLBACK_VALUES = {
18
18
  screenMode: DEFAULT_SCREEN_MODE,
19
19
  };
20
20
 
21
+ const isNotProduction = () => {
22
+ try {
23
+ return ['localhost', 'dev-wi.se'].includes(window.location.hostname);
24
+ } catch {
25
+ return false;
26
+ }
27
+ };
28
+
21
29
  export const useTheme = (): ThemeHookValue => {
22
- const { theme, screenMode: contextScreenMode } = useContext(ThemeContext) ?? FALLBACK_VALUES;
30
+ const theming = useContext(ThemeContext);
31
+
32
+ if (!theming && isNotProduction()) {
33
+ // eslint-disable-next-line no-console
34
+ console.warn('Call to useTheme outside a ThemeProvider');
35
+ }
36
+
37
+ const { theme, screenMode: contextScreenMode } = theming ?? FALLBACK_VALUES;
23
38
 
24
39
  const screenMode = theme === DEFAULT_BASE_THEME ? DEFAULT_SCREEN_MODE : contextScreenMode;
25
40