@wise/components-theming 0.7.4 → 0.8.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.
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { PropsWithChildren } from "react";
3
2
  // TODO: Change 'light' with 'legacy' in the future
4
3
  declare const baseThemes: readonly [
@@ -25,17 +24,21 @@ type Theming = {
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";
27
+ declare const isForestGreenTheme: (theme: ComponentTheme | BaseTheme | ExtraTheme) => theme is "forest-green";
28
28
  declare const isScreenModeDark: (theme: ComponentTheme | BaseTheme | ExtraTheme, screenMode: ScreenMode) => screenMode is "dark";
29
29
  declare const getThemeClassName: (theme: ComponentTheme | BaseTheme | ExtraTheme, screenMode: ScreenMode) => string;
30
- type ThemeProviderProps = PropsWithChildren<Theming>;
31
- declare const ThemeProvider: ({ theme, screenMode, isNotRootProvider, children }: ThemeProviderProps) => JSX.Element;
30
+ type ThemeProviderProps = PropsWithChildren<Theming> & {
31
+ className?: string;
32
+ };
33
+ declare const ThemeProvider: ({ theme, screenMode, isNotRootProvider, children, className }: ThemeProviderProps) => JSX.Element;
32
34
  interface ThemeHookValue {
33
35
  theme: ComponentTheme | BaseTheme | ExtraTheme;
34
36
  screenMode: ScreenMode;
35
37
  isModern: boolean;
38
+ isForestGreenTheme: boolean;
36
39
  isScreenModeDark: boolean;
37
40
  className: string;
38
41
  }
39
42
  declare const useTheme: () => ThemeHookValue;
40
43
  export type { ComponentTheme, BaseTheme, ExtraTheme, ScreenMode, Theming };
41
- export { isThemeModern, isExtraTheme, isScreenModeDark, getThemeClassName, ThemeProvider, useTheme };
44
+ export { isThemeModern, isExtraTheme, isForestGreenTheme, isScreenModeDark, getThemeClassName, ThemeProvider, useTheme };
package/dist/cjs/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var react = require('react');
5
+ var classNames = require('classnames');
5
6
 
6
7
  // TODO: Change 'light' with 'legacy' in the future
7
8
  var baseThemes = ['light', 'personal'];
@@ -17,6 +18,9 @@ var isThemeModern = function isThemeModern(theme) {
17
18
  var isExtraTheme = function isExtraTheme(theme) {
18
19
  return extraThemes.includes(theme);
19
20
  };
21
+ var isForestGreenTheme = function isForestGreenTheme(theme) {
22
+ return theme === extraThemes[0];
23
+ };
20
24
  var isScreenModeDark = function isScreenModeDark(theme, screenMode) {
21
25
  return isThemeModern(theme) && screenModes[1] === screenMode;
22
26
  };
@@ -24,15 +28,12 @@ var getThemeClassName = function getThemeClassName(theme, screenMode) {
24
28
  if (!isThemeModern(theme)) {
25
29
  return "np-theme-".concat(theme);
26
30
  }
27
-
28
31
  var classes = "np-theme-personal";
29
-
30
32
  if (isExtraTheme(theme)) {
31
33
  classes += " ".concat(classes, "--").concat(theme);
32
34
  } else if (screenModes[1] === screenMode) {
33
35
  classes += " ".concat(classes, "--").concat(screenMode);
34
36
  }
35
-
36
37
  return classes;
37
38
  };
38
39
 
@@ -40,7 +41,6 @@ var FALLBACK_VALUES = {
40
41
  theme: DEFAULT_BASE_THEME,
41
42
  screenMode: DEFAULT_SCREEN_MODE
42
43
  };
43
-
44
44
  var isNotProduction = function isNotProduction() {
45
45
  try {
46
46
  return ['localhost', 'dev-wi.se'].includes(window.location.hostname);
@@ -48,25 +48,22 @@ var isNotProduction = function isNotProduction() {
48
48
  return false;
49
49
  }
50
50
  };
51
-
52
51
  var useTheme = function useTheme() {
53
52
  var theming = react.useContext(ThemeContext);
54
-
55
53
  if (!theming && isNotProduction()) {
56
54
  // eslint-disable-next-line no-console
57
55
  console.warn('Call to useTheme outside a ThemeProvider');
58
56
  }
59
-
60
57
  var _ref = theming !== null && theming !== void 0 ? theming : FALLBACK_VALUES,
61
- theme = _ref.theme,
62
- contextScreenMode = _ref.screenMode;
63
-
58
+ theme = _ref.theme,
59
+ contextScreenMode = _ref.screenMode;
64
60
  var screenMode = theme === DEFAULT_BASE_THEME ? DEFAULT_SCREEN_MODE : contextScreenMode;
65
61
  return react.useMemo(function () {
66
62
  return {
67
63
  theme: theme,
68
64
  screenMode: screenMode,
69
65
  isModern: isThemeModern(theme),
66
+ isForestGreenTheme: isForestGreenTheme(theme),
70
67
  isScreenModeDark: isScreenModeDark(theme, screenMode),
71
68
  className: getThemeClassName(theme, screenMode)
72
69
  };
@@ -74,13 +71,13 @@ var useTheme = function useTheme() {
74
71
  };
75
72
 
76
73
  var ThemedChildren = function ThemedChildren(_ref) {
77
- var children = _ref.children;
78
-
74
+ var _ref$className = _ref.className,
75
+ className = _ref$className === void 0 ? undefined : _ref$className,
76
+ children = _ref.children;
79
77
  var _useTheme = useTheme(),
80
- className = _useTheme.className;
81
-
78
+ themeClass = _useTheme.className;
82
79
  return jsxRuntime.jsx("div", {
83
- className: className,
80
+ className: classNames.default(themeClass, className),
84
81
  children: children
85
82
  });
86
83
  };
@@ -88,21 +85,22 @@ var ThemedChildren = function ThemedChildren(_ref) {
88
85
  var ThemeContext = /*#__PURE__*/react.createContext(undefined);
89
86
  var ThemeProvider = function ThemeProvider(_ref) {
90
87
  var _ref$theme = _ref.theme,
91
- theme = _ref$theme === void 0 ? DEFAULT_BASE_THEME : _ref$theme,
92
- _ref$screenMode = _ref.screenMode,
93
- screenMode = _ref$screenMode === void 0 ? DEFAULT_SCREEN_MODE : _ref$screenMode,
94
- _ref$isNotRootProvide = _ref.isNotRootProvider,
95
- isNotRootProvider = _ref$isNotRootProvide === void 0 ? false : _ref$isNotRootProvide,
96
- children = _ref.children;
97
- var isContextRoot = react.useContext(ThemeContext) === undefined; // RegEx to check for `np-theme-` class name
88
+ theme = _ref$theme === void 0 ? DEFAULT_BASE_THEME : _ref$theme,
89
+ _ref$screenMode = _ref.screenMode,
90
+ screenMode = _ref$screenMode === void 0 ? DEFAULT_SCREEN_MODE : _ref$screenMode,
91
+ _ref$isNotRootProvide = _ref.isNotRootProvider,
92
+ isNotRootProvider = _ref$isNotRootProvide === void 0 ? false : _ref$isNotRootProvide,
93
+ children = _ref.children,
94
+ _ref$className = _ref.className,
95
+ className = _ref$className === void 0 ? undefined : _ref$className;
96
+ var isContextRoot = react.useContext(ThemeContext) === undefined;
97
+ // RegEx to check for `np-theme-` class name
98
98
  // eslint-disable-next-line react-hooks/exhaustive-deps
99
-
100
- var themeClass = new RegExp(/\bnp-theme-[a-z-]+\b/, 'g'); // useEffect hook used to apply the theme class to the HTML element
101
-
99
+ var themeClass = new RegExp(/\bnp-theme-[a-z-]+\b/, 'g');
100
+ // useEffect hook used to apply the theme class to the HTML element
102
101
  react.useEffect(function () {
103
102
  if (!isNotRootProvider && isContextRoot) {
104
103
  var _document$documentEle;
105
-
106
104
  // Remove all the theme classes from the documentElement
107
105
  (_document$documentEle = document.documentElement.className.match(themeClass)) === null || _document$documentEle === void 0 ? void 0 : _document$documentEle.forEach(function (item) {
108
106
  document.documentElement.classList.remove(item);
@@ -121,6 +119,7 @@ var ThemeProvider = function ThemeProvider(_ref) {
121
119
  return jsxRuntime.jsx(ThemeContext.Provider, {
122
120
  value: contextValue,
123
121
  children: jsxRuntime.jsx(ThemedChildren, {
122
+ className: className,
124
123
  children: children
125
124
  })
126
125
  });
@@ -129,6 +128,7 @@ var ThemeProvider = function ThemeProvider(_ref) {
129
128
  exports.ThemeProvider = ThemeProvider;
130
129
  exports.getThemeClassName = getThemeClassName;
131
130
  exports.isExtraTheme = isExtraTheme;
131
+ exports.isForestGreenTheme = isForestGreenTheme;
132
132
  exports.isScreenModeDark = isScreenModeDark;
133
133
  exports.isThemeModern = isThemeModern;
134
134
  exports.useTheme = useTheme;
@@ -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\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 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","isNotProduction","window","location","hostname","useTheme","theming","useContext","ThemeContext","console","warn","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 ForestGreenTheme = (typeof extraThemes)[0];\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 ForestGreenTheme,\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 isForestGreenTheme = (\n theme: ComponentTheme | BaseTheme | ExtraTheme,\n): theme is ForestGreenTheme => theme === extraThemes[0];\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, isForestGreenTheme, isScreenModeDark, getThemeClassName } from './helpers';\n\ninterface ThemeHookValue {\n theme: ComponentTheme | BaseTheme | ExtraTheme;\n screenMode: ScreenMode;\n isModern: boolean;\n isForestGreenTheme: 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 isForestGreenTheme: isForestGreenTheme(theme),\n isScreenModeDark: isScreenModeDark(theme, screenMode),\n className: getThemeClassName(theme, screenMode),\n }),\n [theme, screenMode],\n );\n};\n","import classNames from 'classnames';\nimport { ReactNode } from 'react';\n\nimport { useTheme } from './useTheme';\n\ntype ThemedChildrenProps = { className?: string; children: ReactNode };\n\nexport const ThemedChildren = ({ className = undefined, children }: ThemedChildrenProps) => {\n const { className: themeClass } = useTheme();\n\n return <div className={classNames(themeClass, 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> & { className?: string };\n\nexport const ThemeProvider = ({\n theme = DEFAULT_BASE_THEME,\n screenMode = DEFAULT_SCREEN_MODE,\n isNotRootProvider = false,\n children,\n className = undefined,\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 className={className}>{children}</ThemedChildren>\n </ThemeContext.Provider>\n );\n};\n"],"names":["baseThemes","extraThemes","screenModes","modernThemes","concat","DEFAULT_BASE_THEME","DEFAULT_SCREEN_MODE","isThemeModern","theme","includes","isExtraTheme","isForestGreenTheme","isScreenModeDark","screenMode","getThemeClassName","classes","FALLBACK_VALUES","isNotProduction","window","location","hostname","_unused","useTheme","theming","useContext","ThemeContext","console","warn","_ref","contextScreenMode","useMemo","isModern","className","ThemedChildren","_ref$className","undefined","children","_useTheme","themeClass","_jsx","classNames","createContext","ThemeProvider","_ref$theme","_ref$screenMode","_ref$isNotRootProvide","isNotRootProvider","isContextRoot","RegExp","useEffect","_document$documentEle","document","documentElement","match","forEach","item","classList","remove","split","add","contextValue","Provider","value"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { PropsWithChildren } from "react";
3
2
  // TODO: Change 'light' with 'legacy' in the future
4
3
  declare const baseThemes: readonly [
@@ -25,17 +24,21 @@ type Theming = {
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";
27
+ declare const isForestGreenTheme: (theme: ComponentTheme | BaseTheme | ExtraTheme) => theme is "forest-green";
28
28
  declare const isScreenModeDark: (theme: ComponentTheme | BaseTheme | ExtraTheme, screenMode: ScreenMode) => screenMode is "dark";
29
29
  declare const getThemeClassName: (theme: ComponentTheme | BaseTheme | ExtraTheme, screenMode: ScreenMode) => string;
30
- type ThemeProviderProps = PropsWithChildren<Theming>;
31
- declare const ThemeProvider: ({ theme, screenMode, isNotRootProvider, children }: ThemeProviderProps) => JSX.Element;
30
+ type ThemeProviderProps = PropsWithChildren<Theming> & {
31
+ className?: string;
32
+ };
33
+ declare const ThemeProvider: ({ theme, screenMode, isNotRootProvider, children, className }: ThemeProviderProps) => JSX.Element;
32
34
  interface ThemeHookValue {
33
35
  theme: ComponentTheme | BaseTheme | ExtraTheme;
34
36
  screenMode: ScreenMode;
35
37
  isModern: boolean;
38
+ isForestGreenTheme: boolean;
36
39
  isScreenModeDark: boolean;
37
40
  className: string;
38
41
  }
39
42
  declare const useTheme: () => ThemeHookValue;
40
43
  export type { ComponentTheme, BaseTheme, ExtraTheme, ScreenMode, Theming };
41
- export { isThemeModern, isExtraTheme, isScreenModeDark, getThemeClassName, ThemeProvider, useTheme };
44
+ export { isThemeModern, isExtraTheme, isForestGreenTheme, isScreenModeDark, getThemeClassName, ThemeProvider, useTheme };
package/dist/es/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { useContext, useMemo, createContext, useEffect } from 'react';
3
+ import classNames from 'classnames';
3
4
 
4
5
  // TODO: Change 'light' with 'legacy' in the future
5
6
  var baseThemes = ['light', 'personal'];
@@ -15,6 +16,9 @@ var isThemeModern = function isThemeModern(theme) {
15
16
  var isExtraTheme = function isExtraTheme(theme) {
16
17
  return extraThemes.includes(theme);
17
18
  };
19
+ var isForestGreenTheme = function isForestGreenTheme(theme) {
20
+ return theme === extraThemes[0];
21
+ };
18
22
  var isScreenModeDark = function isScreenModeDark(theme, screenMode) {
19
23
  return isThemeModern(theme) && screenModes[1] === screenMode;
20
24
  };
@@ -22,15 +26,12 @@ var getThemeClassName = function getThemeClassName(theme, screenMode) {
22
26
  if (!isThemeModern(theme)) {
23
27
  return "np-theme-".concat(theme);
24
28
  }
25
-
26
29
  var classes = "np-theme-personal";
27
-
28
30
  if (isExtraTheme(theme)) {
29
31
  classes += " ".concat(classes, "--").concat(theme);
30
32
  } else if (screenModes[1] === screenMode) {
31
33
  classes += " ".concat(classes, "--").concat(screenMode);
32
34
  }
33
-
34
35
  return classes;
35
36
  };
36
37
 
@@ -38,7 +39,6 @@ var FALLBACK_VALUES = {
38
39
  theme: DEFAULT_BASE_THEME,
39
40
  screenMode: DEFAULT_SCREEN_MODE
40
41
  };
41
-
42
42
  var isNotProduction = function isNotProduction() {
43
43
  try {
44
44
  return ['localhost', 'dev-wi.se'].includes(window.location.hostname);
@@ -46,25 +46,22 @@ var isNotProduction = function isNotProduction() {
46
46
  return false;
47
47
  }
48
48
  };
49
-
50
49
  var useTheme = function useTheme() {
51
50
  var theming = useContext(ThemeContext);
52
-
53
51
  if (!theming && isNotProduction()) {
54
52
  // eslint-disable-next-line no-console
55
53
  console.warn('Call to useTheme outside a ThemeProvider');
56
54
  }
57
-
58
55
  var _ref = theming !== null && theming !== void 0 ? theming : FALLBACK_VALUES,
59
- theme = _ref.theme,
60
- contextScreenMode = _ref.screenMode;
61
-
56
+ theme = _ref.theme,
57
+ contextScreenMode = _ref.screenMode;
62
58
  var screenMode = theme === DEFAULT_BASE_THEME ? DEFAULT_SCREEN_MODE : contextScreenMode;
63
59
  return useMemo(function () {
64
60
  return {
65
61
  theme: theme,
66
62
  screenMode: screenMode,
67
63
  isModern: isThemeModern(theme),
64
+ isForestGreenTheme: isForestGreenTheme(theme),
68
65
  isScreenModeDark: isScreenModeDark(theme, screenMode),
69
66
  className: getThemeClassName(theme, screenMode)
70
67
  };
@@ -72,13 +69,13 @@ var useTheme = function useTheme() {
72
69
  };
73
70
 
74
71
  var ThemedChildren = function ThemedChildren(_ref) {
75
- var children = _ref.children;
76
-
72
+ var _ref$className = _ref.className,
73
+ className = _ref$className === void 0 ? undefined : _ref$className,
74
+ children = _ref.children;
77
75
  var _useTheme = useTheme(),
78
- className = _useTheme.className;
79
-
76
+ themeClass = _useTheme.className;
80
77
  return jsx("div", {
81
- className: className,
78
+ className: classNames(themeClass, className),
82
79
  children: children
83
80
  });
84
81
  };
@@ -86,21 +83,22 @@ var ThemedChildren = function ThemedChildren(_ref) {
86
83
  var ThemeContext = /*#__PURE__*/createContext(undefined);
87
84
  var ThemeProvider = function ThemeProvider(_ref) {
88
85
  var _ref$theme = _ref.theme,
89
- theme = _ref$theme === void 0 ? DEFAULT_BASE_THEME : _ref$theme,
90
- _ref$screenMode = _ref.screenMode,
91
- screenMode = _ref$screenMode === void 0 ? DEFAULT_SCREEN_MODE : _ref$screenMode,
92
- _ref$isNotRootProvide = _ref.isNotRootProvider,
93
- isNotRootProvider = _ref$isNotRootProvide === void 0 ? false : _ref$isNotRootProvide,
94
- children = _ref.children;
95
- var isContextRoot = useContext(ThemeContext) === undefined; // RegEx to check for `np-theme-` class name
86
+ theme = _ref$theme === void 0 ? DEFAULT_BASE_THEME : _ref$theme,
87
+ _ref$screenMode = _ref.screenMode,
88
+ screenMode = _ref$screenMode === void 0 ? DEFAULT_SCREEN_MODE : _ref$screenMode,
89
+ _ref$isNotRootProvide = _ref.isNotRootProvider,
90
+ isNotRootProvider = _ref$isNotRootProvide === void 0 ? false : _ref$isNotRootProvide,
91
+ children = _ref.children,
92
+ _ref$className = _ref.className,
93
+ className = _ref$className === void 0 ? undefined : _ref$className;
94
+ var isContextRoot = useContext(ThemeContext) === undefined;
95
+ // RegEx to check for `np-theme-` class name
96
96
  // eslint-disable-next-line react-hooks/exhaustive-deps
97
-
98
- var themeClass = new RegExp(/\bnp-theme-[a-z-]+\b/, 'g'); // useEffect hook used to apply the theme class to the HTML element
99
-
97
+ var themeClass = new RegExp(/\bnp-theme-[a-z-]+\b/, 'g');
98
+ // useEffect hook used to apply the theme class to the HTML element
100
99
  useEffect(function () {
101
100
  if (!isNotRootProvider && isContextRoot) {
102
101
  var _document$documentEle;
103
-
104
102
  // Remove all the theme classes from the documentElement
105
103
  (_document$documentEle = document.documentElement.className.match(themeClass)) === null || _document$documentEle === void 0 ? void 0 : _document$documentEle.forEach(function (item) {
106
104
  document.documentElement.classList.remove(item);
@@ -119,10 +117,11 @@ var ThemeProvider = function ThemeProvider(_ref) {
119
117
  return jsx(ThemeContext.Provider, {
120
118
  value: contextValue,
121
119
  children: jsx(ThemedChildren, {
120
+ className: className,
122
121
  children: children
123
122
  })
124
123
  });
125
124
  };
126
125
 
127
- export { ThemeProvider, getThemeClassName, isExtraTheme, isScreenModeDark, isThemeModern, useTheme };
126
+ export { ThemeProvider, getThemeClassName, isExtraTheme, isForestGreenTheme, isScreenModeDark, isThemeModern, useTheme };
128
127
  //# sourceMappingURL=index.js.map
@@ -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\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 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","isNotProduction","window","location","hostname","useTheme","theming","useContext","ThemeContext","console","warn","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 ForestGreenTheme = (typeof extraThemes)[0];\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 ForestGreenTheme,\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 isForestGreenTheme = (\n theme: ComponentTheme | BaseTheme | ExtraTheme,\n): theme is ForestGreenTheme => theme === extraThemes[0];\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, isForestGreenTheme, isScreenModeDark, getThemeClassName } from './helpers';\n\ninterface ThemeHookValue {\n theme: ComponentTheme | BaseTheme | ExtraTheme;\n screenMode: ScreenMode;\n isModern: boolean;\n isForestGreenTheme: 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 isForestGreenTheme: isForestGreenTheme(theme),\n isScreenModeDark: isScreenModeDark(theme, screenMode),\n className: getThemeClassName(theme, screenMode),\n }),\n [theme, screenMode],\n );\n};\n","import classNames from 'classnames';\nimport { ReactNode } from 'react';\n\nimport { useTheme } from './useTheme';\n\ntype ThemedChildrenProps = { className?: string; children: ReactNode };\n\nexport const ThemedChildren = ({ className = undefined, children }: ThemedChildrenProps) => {\n const { className: themeClass } = useTheme();\n\n return <div className={classNames(themeClass, 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> & { className?: string };\n\nexport const ThemeProvider = ({\n theme = DEFAULT_BASE_THEME,\n screenMode = DEFAULT_SCREEN_MODE,\n isNotRootProvider = false,\n children,\n className = undefined,\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 className={className}>{children}</ThemedChildren>\n </ThemeContext.Provider>\n );\n};\n"],"names":["baseThemes","extraThemes","screenModes","modernThemes","concat","DEFAULT_BASE_THEME","DEFAULT_SCREEN_MODE","isThemeModern","theme","includes","isExtraTheme","isForestGreenTheme","isScreenModeDark","screenMode","getThemeClassName","classes","FALLBACK_VALUES","isNotProduction","window","location","hostname","_unused","useTheme","theming","useContext","ThemeContext","console","warn","_ref","contextScreenMode","useMemo","isModern","className","ThemedChildren","_ref$className","undefined","children","_useTheme","themeClass","_jsx","classNames","createContext","ThemeProvider","_ref$theme","_ref$screenMode","_ref$isNotRootProvide","isNotRootProvider","isContextRoot","RegExp","useEffect","_document$documentEle","document","documentElement","match","forEach","item","classList","remove","split","add","contextValue","Provider","value"],"mappings":"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"}
package/package.json CHANGED
@@ -1,22 +1,34 @@
1
1
  {
2
2
  "name": "@wise/components-theming",
3
- "version": "0.7.4",
3
+ "version": "0.8.0",
4
4
  "description": "Provides theming support for the Wise Design system components",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [
7
- "wise",
8
- "jestconfig"
7
+ "wise"
9
8
  ],
10
9
  "repository": {
11
10
  "type": "git",
12
11
  "fullname": "transferwise/neptune-web",
13
12
  "url": "git+https://github.com/transferwise/neptune-web.git"
14
13
  },
14
+ "dependencies": {
15
+ "classnames": "^2.3.2"
16
+ },
15
17
  "devDependencies": {
16
18
  "@babel/plugin-syntax-import-assertions": "7.20.0",
17
19
  "@rollup/plugin-typescript": "11.0.0",
18
- "@types/react": "17.0.52",
19
- "@types/react-dom": "17.0.18",
20
+ "@testing-library/jest-dom": "^5.14.1",
21
+ "@testing-library/react": "^12.0.0",
22
+ "@testing-library/react-hooks": "^8.0.0",
23
+ "@transferwise/eslint-config": "^7.4.0",
24
+ "@transferwise/test-config": "^5.0.2",
25
+ "@types/jest": "^27.5.2",
26
+ "@types/node": "^18.15.12",
27
+ "@types/react": "^17.0.59",
28
+ "@types/react-dom": "^17.0.20",
29
+ "@types/testing-library__jest-dom": "^5.14.5",
30
+ "classnames": "^2.3.2",
31
+ "jest": "^27.0.6",
20
32
  "rollup": "3.2.3",
21
33
  "rollup-plugin-ts": "3.0.2",
22
34
  "typescript": "4.9.4"
@@ -25,14 +37,6 @@
25
37
  "react": ">=16.14",
26
38
  "react-dom": ">=16.14"
27
39
  },
28
- "scripts": {
29
- "build": "rollup --config --sourcemap --configPlugin rollup-plugin-ts",
30
- "test": "jest --env=jsdom --maxWorkers=4 --config=../../node_modules/@transferwise/test-config/jest.config.js",
31
- "test:watch": "jest --watch --env=jsdom --config=../../node_modules/@transferwise/test-config/jest.config.js",
32
- "lint": "jest --maxWorkers=4 --config ../../node_modules/@transferwise/test-config/test/jest.lint.js && yarn lint:ts",
33
- "lint:ts": "tsc --noEmit --emitDeclarationOnly false",
34
- "lint:fix": "eslint 'src/**/*.js' --fix"
35
- },
36
40
  "exports": {
37
41
  ".": {
38
42
  "import": "./dist/es/index.js",
@@ -49,5 +53,17 @@
49
53
  "publishConfig": {
50
54
  "access": "public"
51
55
  },
52
- "gitHead": "6439551ab2f62ec2206adbf4a49761bdcbbe2127"
53
- }
56
+ "scripts": {
57
+ "build": "rollup --config --sourcemap",
58
+ "test": "jest --maxWorkers=4",
59
+ "test:watch": "jest --watch --env=jsdom",
60
+ "lint": "pnpm run lint:check",
61
+ "lint:check": "npm-run-all --parallel lint:check:*",
62
+ "lint:check:format": "prettier --check --ignore-path ../../.prettierignore .",
63
+ "lint:check:js+ts": "eslint --ext .js,.jsx,.mjs,.ts,.tsx,.mts --ignore-path ../../.gitignore .",
64
+ "lint:check:types": "tsc --noEmit --emitDeclarationOnly false",
65
+ "lint:fix": "npm-run-all --serial lint:fix:*",
66
+ "lint:fix:format": "prettier --write --ignore-path ../../.prettierignore .",
67
+ "lint:fix:js+ts": "pnpm run lint:check:js+ts --fix"
68
+ }
69
+ }
@@ -13,13 +13,14 @@ export const ThemeContext = createContext<
13
13
  | undefined
14
14
  >(undefined);
15
15
 
16
- type ThemeProviderProps = PropsWithChildren<Theming>;
16
+ type ThemeProviderProps = PropsWithChildren<Theming> & { className?: string };
17
17
 
18
18
  export const ThemeProvider = ({
19
19
  theme = DEFAULT_BASE_THEME,
20
20
  screenMode = DEFAULT_SCREEN_MODE,
21
21
  isNotRootProvider = false,
22
22
  children,
23
+ className = undefined,
23
24
  }: ThemeProviderProps) => {
24
25
  const isContextRoot = useContext(ThemeContext) === undefined;
25
26
 
@@ -46,7 +47,7 @@ export const ThemeProvider = ({
46
47
 
47
48
  return (
48
49
  <ThemeContext.Provider value={contextValue}>
49
- <ThemedChildren>{children}</ThemedChildren>
50
+ <ThemedChildren className={className}>{children}</ThemedChildren>
50
51
  </ThemeContext.Provider>
51
52
  );
52
53
  };
@@ -1,11 +1,12 @@
1
+ import classNames from 'classnames';
1
2
  import { ReactNode } from 'react';
2
3
 
3
4
  import { useTheme } from './useTheme';
4
5
 
5
- type ThemedChildrenProps = { children: ReactNode };
6
+ type ThemedChildrenProps = { className?: string; children: ReactNode };
6
7
 
7
- export const ThemedChildren = ({ children }: ThemedChildrenProps) => {
8
- const { className } = useTheme();
8
+ export const ThemedChildren = ({ className = undefined, children }: ThemedChildrenProps) => {
9
+ const { className: themeClass } = useTheme();
9
10
 
10
- return <div className={className}>{children}</div>;
11
+ return <div className={classNames(themeClass, className)}>{children}</div>;
11
12
  };
package/src/const.ts CHANGED
@@ -5,12 +5,13 @@ export const screenModes = ['light', 'dark'] as const;
5
5
  export const modernThemes = [baseThemes[1], ...extraThemes] as const;
6
6
 
7
7
  // TODO: componentThemes returned back for backward compatibility, refactor this place in the future
8
- export type ComponentTheme = typeof baseThemes[number];
9
- export type ModernTheme = typeof modernThemes[number];
10
- export type BaseTheme = typeof baseThemes[number];
11
- export type ExtraTheme = typeof extraThemes[number];
12
- export type ScreenMode = typeof screenModes[number];
13
- export type ScreenModeDark = typeof screenModes[1];
8
+ export type ComponentTheme = (typeof baseThemes)[number];
9
+ export type ModernTheme = (typeof modernThemes)[number];
10
+ export type BaseTheme = (typeof baseThemes)[number];
11
+ export type ExtraTheme = (typeof extraThemes)[number];
12
+ export type ForestGreenTheme = (typeof extraThemes)[0];
13
+ export type ScreenMode = (typeof screenModes)[number];
14
+ export type ScreenModeDark = (typeof screenModes)[1];
14
15
 
15
16
  export const DEFAULT_BASE_THEME = 'light' as const;
16
17
  export const DEFAULT_SCREEN_MODE = 'light' as const;
package/src/helpers.ts CHANGED
@@ -3,6 +3,7 @@ import type {
3
3
  ModernTheme,
4
4
  BaseTheme,
5
5
  ExtraTheme,
6
+ ForestGreenTheme,
6
7
  ScreenMode,
7
8
  ScreenModeDark,
8
9
  } from './const';
@@ -15,6 +16,10 @@ export const isThemeModern = (
15
16
  export const isExtraTheme = (theme: ComponentTheme | BaseTheme | ExtraTheme): theme is ExtraTheme =>
16
17
  extraThemes.includes(theme as ExtraTheme);
17
18
 
19
+ export const isForestGreenTheme = (
20
+ theme: ComponentTheme | BaseTheme | ExtraTheme,
21
+ ): theme is ForestGreenTheme => theme === extraThemes[0];
22
+
18
23
  export const isScreenModeDark = (
19
24
  theme: ComponentTheme | BaseTheme | ExtraTheme,
20
25
  screenMode: ScreenMode,
package/src/index.ts CHANGED
@@ -1,5 +1,11 @@
1
1
  export type { ComponentTheme, BaseTheme, ExtraTheme, ScreenMode, Theming } from './const';
2
- export { isThemeModern, isExtraTheme, isScreenModeDark, getThemeClassName } from './helpers';
2
+ export {
3
+ isThemeModern,
4
+ isExtraTheme,
5
+ isForestGreenTheme,
6
+ isScreenModeDark,
7
+ getThemeClassName,
8
+ } from './helpers';
3
9
 
4
10
  export { ThemeProvider } from './ThemeProvider';
5
11
  export { useTheme } from './useTheme';
@@ -16,6 +16,7 @@ describe('useTheme', () => {
16
16
  theme: DEFAULT_BASE_THEME,
17
17
  screenMode: DEFAULT_SCREEN_MODE,
18
18
  isModern: false,
19
+ isForestGreenTheme: false,
19
20
  isScreenModeDark: false,
20
21
  className: 'np-theme-light',
21
22
  });
@@ -37,6 +38,7 @@ describe('useTheme', () => {
37
38
  theme: 'personal',
38
39
  screenMode: DEFAULT_SCREEN_MODE,
39
40
  isModern: true,
41
+ isForestGreenTheme: false,
40
42
  isScreenModeDark: false,
41
43
  className: 'np-theme-personal',
42
44
  });
@@ -56,6 +58,7 @@ describe('useTheme', () => {
56
58
  theme: 'forest-green',
57
59
  screenMode: DEFAULT_SCREEN_MODE,
58
60
  isModern: true,
61
+ isForestGreenTheme: true,
59
62
  isScreenModeDark: false,
60
63
  className: 'np-theme-personal np-theme-personal--forest-green',
61
64
  });
@@ -75,6 +78,7 @@ describe('useTheme', () => {
75
78
  theme: 'bright-green',
76
79
  screenMode: DEFAULT_SCREEN_MODE,
77
80
  isModern: true,
81
+ isForestGreenTheme: false,
78
82
  isScreenModeDark: false,
79
83
  className: 'np-theme-personal np-theme-personal--bright-green',
80
84
  });
@@ -95,6 +99,7 @@ describe('useTheme', () => {
95
99
  theme: DEFAULT_BASE_THEME,
96
100
  screenMode: DEFAULT_SCREEN_MODE,
97
101
  isModern: false,
102
+ isForestGreenTheme: false,
98
103
  isScreenModeDark: false,
99
104
  className: 'np-theme-light',
100
105
  });
@@ -115,6 +120,7 @@ describe('useTheme', () => {
115
120
  theme: 'personal',
116
121
  screenMode: 'dark',
117
122
  isModern: true,
123
+ isForestGreenTheme: false,
118
124
  isScreenModeDark: true,
119
125
  className: 'np-theme-personal np-theme-personal--dark',
120
126
  });
@@ -138,6 +144,7 @@ describe('useTheme', () => {
138
144
  theme: DEFAULT_BASE_THEME,
139
145
  screenMode: DEFAULT_SCREEN_MODE,
140
146
  isModern: false,
147
+ isForestGreenTheme: false,
141
148
  isScreenModeDark: false,
142
149
  className: 'np-theme-light',
143
150
  });
@@ -160,6 +167,7 @@ describe('useTheme', () => {
160
167
  theme: DEFAULT_BASE_THEME,
161
168
  screenMode: DEFAULT_SCREEN_MODE,
162
169
  isModern: false,
170
+ isForestGreenTheme: false,
163
171
  isScreenModeDark: false,
164
172
  className: 'np-theme-light',
165
173
  });
@@ -182,6 +190,7 @@ describe('useTheme', () => {
182
190
  theme: DEFAULT_BASE_THEME,
183
191
  screenMode: DEFAULT_SCREEN_MODE,
184
192
  isModern: false,
193
+ isForestGreenTheme: false,
185
194
  isScreenModeDark: false,
186
195
  className: 'np-theme-light',
187
196
  });
@@ -202,6 +211,7 @@ describe('useTheme', () => {
202
211
  theme: DEFAULT_BASE_THEME,
203
212
  screenMode: DEFAULT_SCREEN_MODE,
204
213
  isModern: false,
214
+ isForestGreenTheme: false,
205
215
  isScreenModeDark: false,
206
216
  className: 'np-theme-light',
207
217
  });
package/src/useTheme.ts CHANGED
@@ -3,12 +3,13 @@ import { useContext, useMemo } from 'react';
3
3
  import { ThemeContext } from './ThemeProvider';
4
4
  import type { ComponentTheme, BaseTheme, ScreenMode, ExtraTheme } from './const';
5
5
  import { DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';
6
- import { isThemeModern, isScreenModeDark, getThemeClassName } from './helpers';
6
+ import { isThemeModern, isForestGreenTheme, isScreenModeDark, getThemeClassName } from './helpers';
7
7
 
8
8
  interface ThemeHookValue {
9
9
  theme: ComponentTheme | BaseTheme | ExtraTheme;
10
10
  screenMode: ScreenMode;
11
11
  isModern: boolean;
12
+ isForestGreenTheme: boolean;
12
13
  isScreenModeDark: boolean;
13
14
  className: string;
14
15
  }
@@ -43,6 +44,7 @@ export const useTheme = (): ThemeHookValue => {
43
44
  theme,
44
45
  screenMode,
45
46
  isModern: isThemeModern(theme),
47
+ isForestGreenTheme: isForestGreenTheme(theme),
46
48
  isScreenModeDark: isScreenModeDark(theme, screenMode),
47
49
  className: getThemeClassName(theme, screenMode),
48
50
  }),