@wise/components-theming 0.5.2 → 0.6.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,29 +1,40 @@
1
1
  /// <reference types="react" />
2
2
  import { PropsWithChildren } from "react";
3
- // TODO: Change 'light' with 'legacy' in future
4
- declare const baseThemes: string[];
5
- declare const extraThemes: string[];
6
- declare const screenModes: string[];
3
+ // TODO: Change 'light' with 'legacy' in the future
4
+ declare const baseThemes: readonly [
5
+ "light",
6
+ "personal"
7
+ ];
8
+ declare const extraThemes: readonly [
9
+ "forest-green",
10
+ "bright-green"
11
+ ];
12
+ declare const screenModes: readonly [
13
+ "light",
14
+ "dark"
15
+ ];
16
+ // TODO: componentThemes returned back for backward compatibility, refactor this place in the future
17
+ type ComponentTheme = (typeof baseThemes)[number];
7
18
  type BaseTheme = (typeof baseThemes)[number];
8
19
  type ExtraTheme = (typeof extraThemes)[number];
9
20
  type ScreenMode = (typeof screenModes)[number];
10
21
  type Theming = {
11
- theme?: BaseTheme | ExtraTheme;
22
+ theme?: ComponentTheme | BaseTheme | ExtraTheme;
12
23
  screenMode?: ScreenMode;
13
24
  };
14
- declare const isThemeModern: (theme: BaseTheme | ExtraTheme) => boolean;
15
- declare const isExtraTheme: (theme: ExtraTheme) => theme is string;
16
- declare const isScreenModeDark: (theme: BaseTheme, screenMode: ScreenMode) => boolean;
17
- declare const getThemeClassName: (theme: BaseTheme | ExtraTheme, screenMode: ScreenMode) => string;
25
+ declare const isThemeModern: (theme: ComponentTheme | BaseTheme | ExtraTheme) => theme is "personal" | "forest-green" | "bright-green";
26
+ declare const isExtraTheme: (theme: ComponentTheme | BaseTheme | ExtraTheme) => theme is "forest-green" | "bright-green";
27
+ declare const isScreenModeDark: (theme: ComponentTheme | BaseTheme | ExtraTheme, screenMode: ScreenMode) => screenMode is "dark";
28
+ declare const getThemeClassName: (theme: ComponentTheme | BaseTheme | ExtraTheme, screenMode: ScreenMode) => string;
18
29
  type ThemeProviderProps = PropsWithChildren<Theming>;
19
30
  declare const ThemeProvider: ({ theme, screenMode, children }: ThemeProviderProps) => JSX.Element;
20
31
  interface ThemeHookValue {
21
- theme: BaseTheme | ExtraTheme;
32
+ theme: ComponentTheme | BaseTheme | ExtraTheme;
22
33
  screenMode: ScreenMode;
23
34
  isModern: boolean;
24
35
  isScreenModeDark: boolean;
25
36
  className: string;
26
37
  }
27
38
  declare const useTheme: () => ThemeHookValue;
28
- export type { BaseTheme, ExtraTheme, ScreenMode, Theming };
39
+ export type { ComponentTheme, BaseTheme, ExtraTheme, ScreenMode, Theming };
29
40
  export { isThemeModern, isExtraTheme, isScreenModeDark, getThemeClassName, ThemeProvider, useTheme };
package/dist/cjs/index.js CHANGED
@@ -3,19 +3,22 @@
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var react = require('react');
5
5
 
6
- // TODO: Change 'light' with 'legacy' in future
7
- var extraThemes = ['forest-green'];
6
+ // TODO: Change 'light' with 'legacy' in the future
7
+ var baseThemes = ['light', 'personal'];
8
+ var extraThemes = ['forest-green', 'bright-green'];
9
+ var screenModes = ['light', 'dark'];
10
+ var modernThemes = [baseThemes[1]].concat(extraThemes);
8
11
  var DEFAULT_BASE_THEME = 'light';
9
12
  var DEFAULT_SCREEN_MODE = 'light';
10
13
 
11
14
  var isThemeModern = function isThemeModern(theme) {
12
- return extraThemes.includes(theme) || theme === 'personal';
15
+ return modernThemes.includes(theme);
13
16
  };
14
17
  var isExtraTheme = function isExtraTheme(theme) {
15
18
  return extraThemes.includes(theme);
16
19
  };
17
20
  var isScreenModeDark = function isScreenModeDark(theme, screenMode) {
18
- return theme !== DEFAULT_BASE_THEME && screenMode === 'dark';
21
+ return isThemeModern(theme) && screenModes[1] === screenMode;
19
22
  };
20
23
  var getThemeClassName = function getThemeClassName(theme, screenMode) {
21
24
  if (!isThemeModern(theme)) {
@@ -26,7 +29,7 @@ var getThemeClassName = function getThemeClassName(theme, screenMode) {
26
29
 
27
30
  if (isExtraTheme(theme)) {
28
31
  classes += " ".concat(classes, "--").concat(theme);
29
- } else if (screenMode === 'dark') {
32
+ } else if (screenModes[1] === screenMode) {
30
33
  classes += " ".concat(classes, "--").concat(screenMode);
31
34
  }
32
35
 
@@ -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 future\nexport const baseThemes = ['light', 'personal'];\nexport const extraThemes = ['forest-green'];\nexport const screenModes = ['light', 'dark'];\n\nexport type BaseTheme = typeof baseThemes[number];\nexport type ExtraTheme = typeof extraThemes[number];\nexport type ScreenMode = typeof screenModes[number];\n\nexport const DEFAULT_BASE_THEME = 'light' as const;\nexport const DEFAULT_SCREEN_MODE = 'light' as const;\n\nexport type Theming = {\n theme?: BaseTheme | ExtraTheme;\n screenMode?: ScreenMode;\n};\n","import { BaseTheme, ScreenMode, ExtraTheme, extraThemes, DEFAULT_BASE_THEME } from './const';\n\nexport const isThemeModern = (theme: BaseTheme | ExtraTheme): boolean =>\n extraThemes.includes(theme) || theme === 'personal';\n\nexport const isExtraTheme = (theme: ExtraTheme): theme is ExtraTheme =>\n extraThemes.includes(theme as ExtraTheme);\n\nexport const isScreenModeDark = (theme: BaseTheme, screenMode: ScreenMode): boolean =>\n theme !== DEFAULT_BASE_THEME && screenMode === 'dark';\n\nexport const getThemeClassName = (\n theme: 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 (screenMode === 'dark' ) {\n classes += ` ${classes}--${screenMode}`;\n }\n\n return classes;\n};\n","import { useContext, useMemo } from 'react';\n\nimport { ThemeContext } from './ThemeProvider';\nimport { BaseTheme, ScreenMode, ExtraTheme, DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';\nimport { isThemeModern, isScreenModeDark, getThemeClassName } from './helpers';\n\ninterface ThemeHookValue {\n theme: BaseTheme | ExtraTheme;\n screenMode: ScreenMode;\n isModern: boolean;\n isScreenModeDark: boolean;\n className: string;\n}\n\nexport const useTheme = (): ThemeHookValue => {\n const theme: BaseTheme | ExtraTheme = useContext(ThemeContext).theme ?? DEFAULT_BASE_THEME;\n const screenMode: ScreenMode = theme !== DEFAULT_BASE_THEME\n ? useContext(ThemeContext).screenMode ?? DEFAULT_SCREEN_MODE\n : DEFAULT_SCREEN_MODE;\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 } from 'react';\n\nimport { ThemedChildren } from './ThemedChildren';\nimport { BaseTheme, ExtraTheme, ScreenMode, Theming, DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';\nimport { getThemeClassName } from './helpers';\n\nexport const ThemeContext = createContext<{\n theme: BaseTheme | ExtraTheme | undefined,\n screenMode: ScreenMode | undefined,\n}>({ theme: undefined, screenMode: 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).theme === 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)?.map((item) => {\n document.documentElement.classList.remove(item);\n });\n getThemeClassName(theme, screenMode).split(' ').forEach(item => {\n document.documentElement.classList.add(item);\n })\n }\n }, [isRootProvider, theme, screenMode]);\n\n return (\n <ThemeContext.Provider value={{ theme, screenMode }}>\n <ThemedChildren>{children}</ThemedChildren>\n </ThemeContext.Provider>\n );\n};\n"],"names":["extraThemes","DEFAULT_BASE_THEME","DEFAULT_SCREEN_MODE","isThemeModern","theme","includes","isExtraTheme","isScreenModeDark","screenMode","getThemeClassName","classes","useTheme","useContext","ThemeContext","useMemo","isModern","className","ThemedChildren","children","_jsx","createContext","undefined","ThemeProvider","isRootProvider","themeClass","RegExp","useEffect","documentElement","match","map","item","document","classList","remove","split","forEach","add","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 { ComponentTheme, ModernTheme, BaseTheme, ExtraTheme, ScreenMode, ScreenModeDark } from './const';\nimport { extraThemes, screenModes, modernThemes } from './const';\n\nexport const isThemeModern = (theme: ComponentTheme | BaseTheme | ExtraTheme): theme is ModernTheme =>\n 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\nexport const useTheme = (): ThemeHookValue => {\n const theme: ComponentTheme | BaseTheme | ExtraTheme = useContext(ThemeContext).theme ?? DEFAULT_BASE_THEME;\n const screenMode: ScreenMode = theme !== DEFAULT_BASE_THEME\n ? useContext(ThemeContext).screenMode ?? DEFAULT_SCREEN_MODE\n : DEFAULT_SCREEN_MODE;\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 } 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 theme: ComponentTheme | BaseTheme | ExtraTheme | undefined,\n screenMode: ScreenMode | undefined,\n}>({ theme: undefined, screenMode: 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).theme === 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)?.map((item) => {\n document.documentElement.classList.remove(item);\n });\n getThemeClassName(theme, screenMode).split(' ').forEach(item => {\n document.documentElement.classList.add(item);\n })\n }\n }, [isRootProvider, theme, screenMode]);\n\n return (\n <ThemeContext.Provider value={{ theme, screenMode }}>\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","useTheme","useContext","ThemeContext","useMemo","isModern","className","ThemedChildren","children","_jsx","createContext","undefined","ThemeProvider","isRootProvider","themeClass","RegExp","useEffect","documentElement","match","map","item","document","classList","remove","split","forEach","add","Provider","value"],"mappings":"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"}
@@ -1,29 +1,40 @@
1
1
  /// <reference types="react" />
2
2
  import { PropsWithChildren } from "react";
3
- // TODO: Change 'light' with 'legacy' in future
4
- declare const baseThemes: string[];
5
- declare const extraThemes: string[];
6
- declare const screenModes: string[];
3
+ // TODO: Change 'light' with 'legacy' in the future
4
+ declare const baseThemes: readonly [
5
+ "light",
6
+ "personal"
7
+ ];
8
+ declare const extraThemes: readonly [
9
+ "forest-green",
10
+ "bright-green"
11
+ ];
12
+ declare const screenModes: readonly [
13
+ "light",
14
+ "dark"
15
+ ];
16
+ // TODO: componentThemes returned back for backward compatibility, refactor this place in the future
17
+ type ComponentTheme = (typeof baseThemes)[number];
7
18
  type BaseTheme = (typeof baseThemes)[number];
8
19
  type ExtraTheme = (typeof extraThemes)[number];
9
20
  type ScreenMode = (typeof screenModes)[number];
10
21
  type Theming = {
11
- theme?: BaseTheme | ExtraTheme;
22
+ theme?: ComponentTheme | BaseTheme | ExtraTheme;
12
23
  screenMode?: ScreenMode;
13
24
  };
14
- declare const isThemeModern: (theme: BaseTheme | ExtraTheme) => boolean;
15
- declare const isExtraTheme: (theme: ExtraTheme) => theme is string;
16
- declare const isScreenModeDark: (theme: BaseTheme, screenMode: ScreenMode) => boolean;
17
- declare const getThemeClassName: (theme: BaseTheme | ExtraTheme, screenMode: ScreenMode) => string;
25
+ declare const isThemeModern: (theme: ComponentTheme | BaseTheme | ExtraTheme) => theme is "personal" | "forest-green" | "bright-green";
26
+ declare const isExtraTheme: (theme: ComponentTheme | BaseTheme | ExtraTheme) => theme is "forest-green" | "bright-green";
27
+ declare const isScreenModeDark: (theme: ComponentTheme | BaseTheme | ExtraTheme, screenMode: ScreenMode) => screenMode is "dark";
28
+ declare const getThemeClassName: (theme: ComponentTheme | BaseTheme | ExtraTheme, screenMode: ScreenMode) => string;
18
29
  type ThemeProviderProps = PropsWithChildren<Theming>;
19
30
  declare const ThemeProvider: ({ theme, screenMode, children }: ThemeProviderProps) => JSX.Element;
20
31
  interface ThemeHookValue {
21
- theme: BaseTheme | ExtraTheme;
32
+ theme: ComponentTheme | BaseTheme | ExtraTheme;
22
33
  screenMode: ScreenMode;
23
34
  isModern: boolean;
24
35
  isScreenModeDark: boolean;
25
36
  className: string;
26
37
  }
27
38
  declare const useTheme: () => ThemeHookValue;
28
- export type { BaseTheme, ExtraTheme, ScreenMode, Theming };
39
+ export type { ComponentTheme, BaseTheme, ExtraTheme, ScreenMode, Theming };
29
40
  export { isThemeModern, isExtraTheme, isScreenModeDark, getThemeClassName, ThemeProvider, useTheme };
package/dist/es/index.js CHANGED
@@ -1,19 +1,22 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { useContext, useMemo, createContext, useEffect } from 'react';
3
3
 
4
- // TODO: Change 'light' with 'legacy' in future
5
- var extraThemes = ['forest-green'];
4
+ // TODO: Change 'light' with 'legacy' in the future
5
+ var baseThemes = ['light', 'personal'];
6
+ var extraThemes = ['forest-green', 'bright-green'];
7
+ var screenModes = ['light', 'dark'];
8
+ var modernThemes = [baseThemes[1]].concat(extraThemes);
6
9
  var DEFAULT_BASE_THEME = 'light';
7
10
  var DEFAULT_SCREEN_MODE = 'light';
8
11
 
9
12
  var isThemeModern = function isThemeModern(theme) {
10
- return extraThemes.includes(theme) || theme === 'personal';
13
+ return modernThemes.includes(theme);
11
14
  };
12
15
  var isExtraTheme = function isExtraTheme(theme) {
13
16
  return extraThemes.includes(theme);
14
17
  };
15
18
  var isScreenModeDark = function isScreenModeDark(theme, screenMode) {
16
- return theme !== DEFAULT_BASE_THEME && screenMode === 'dark';
19
+ return isThemeModern(theme) && screenModes[1] === screenMode;
17
20
  };
18
21
  var getThemeClassName = function getThemeClassName(theme, screenMode) {
19
22
  if (!isThemeModern(theme)) {
@@ -24,7 +27,7 @@ var getThemeClassName = function getThemeClassName(theme, screenMode) {
24
27
 
25
28
  if (isExtraTheme(theme)) {
26
29
  classes += " ".concat(classes, "--").concat(theme);
27
- } else if (screenMode === 'dark') {
30
+ } else if (screenModes[1] === screenMode) {
28
31
  classes += " ".concat(classes, "--").concat(screenMode);
29
32
  }
30
33
 
@@ -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 future\nexport const baseThemes = ['light', 'personal'];\nexport const extraThemes = ['forest-green'];\nexport const screenModes = ['light', 'dark'];\n\nexport type BaseTheme = typeof baseThemes[number];\nexport type ExtraTheme = typeof extraThemes[number];\nexport type ScreenMode = typeof screenModes[number];\n\nexport const DEFAULT_BASE_THEME = 'light' as const;\nexport const DEFAULT_SCREEN_MODE = 'light' as const;\n\nexport type Theming = {\n theme?: BaseTheme | ExtraTheme;\n screenMode?: ScreenMode;\n};\n","import { BaseTheme, ScreenMode, ExtraTheme, extraThemes, DEFAULT_BASE_THEME } from './const';\n\nexport const isThemeModern = (theme: BaseTheme | ExtraTheme): boolean =>\n extraThemes.includes(theme) || theme === 'personal';\n\nexport const isExtraTheme = (theme: ExtraTheme): theme is ExtraTheme =>\n extraThemes.includes(theme as ExtraTheme);\n\nexport const isScreenModeDark = (theme: BaseTheme, screenMode: ScreenMode): boolean =>\n theme !== DEFAULT_BASE_THEME && screenMode === 'dark';\n\nexport const getThemeClassName = (\n theme: 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 (screenMode === 'dark' ) {\n classes += ` ${classes}--${screenMode}`;\n }\n\n return classes;\n};\n","import { useContext, useMemo } from 'react';\n\nimport { ThemeContext } from './ThemeProvider';\nimport { BaseTheme, ScreenMode, ExtraTheme, DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';\nimport { isThemeModern, isScreenModeDark, getThemeClassName } from './helpers';\n\ninterface ThemeHookValue {\n theme: BaseTheme | ExtraTheme;\n screenMode: ScreenMode;\n isModern: boolean;\n isScreenModeDark: boolean;\n className: string;\n}\n\nexport const useTheme = (): ThemeHookValue => {\n const theme: BaseTheme | ExtraTheme = useContext(ThemeContext).theme ?? DEFAULT_BASE_THEME;\n const screenMode: ScreenMode = theme !== DEFAULT_BASE_THEME\n ? useContext(ThemeContext).screenMode ?? DEFAULT_SCREEN_MODE\n : DEFAULT_SCREEN_MODE;\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 } from 'react';\n\nimport { ThemedChildren } from './ThemedChildren';\nimport { BaseTheme, ExtraTheme, ScreenMode, Theming, DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';\nimport { getThemeClassName } from './helpers';\n\nexport const ThemeContext = createContext<{\n theme: BaseTheme | ExtraTheme | undefined,\n screenMode: ScreenMode | undefined,\n}>({ theme: undefined, screenMode: 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).theme === 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)?.map((item) => {\n document.documentElement.classList.remove(item);\n });\n getThemeClassName(theme, screenMode).split(' ').forEach(item => {\n document.documentElement.classList.add(item);\n })\n }\n }, [isRootProvider, theme, screenMode]);\n\n return (\n <ThemeContext.Provider value={{ theme, screenMode }}>\n <ThemedChildren>{children}</ThemedChildren>\n </ThemeContext.Provider>\n );\n};\n"],"names":["extraThemes","DEFAULT_BASE_THEME","DEFAULT_SCREEN_MODE","isThemeModern","theme","includes","isExtraTheme","isScreenModeDark","screenMode","getThemeClassName","classes","useTheme","useContext","ThemeContext","useMemo","isModern","className","ThemedChildren","children","_jsx","createContext","undefined","ThemeProvider","isRootProvider","themeClass","RegExp","useEffect","documentElement","match","map","item","document","classList","remove","split","forEach","add","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 { ComponentTheme, ModernTheme, BaseTheme, ExtraTheme, ScreenMode, ScreenModeDark } from './const';\nimport { extraThemes, screenModes, modernThemes } from './const';\n\nexport const isThemeModern = (theme: ComponentTheme | BaseTheme | ExtraTheme): theme is ModernTheme =>\n 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\nexport const useTheme = (): ThemeHookValue => {\n const theme: ComponentTheme | BaseTheme | ExtraTheme = useContext(ThemeContext).theme ?? DEFAULT_BASE_THEME;\n const screenMode: ScreenMode = theme !== DEFAULT_BASE_THEME\n ? useContext(ThemeContext).screenMode ?? DEFAULT_SCREEN_MODE\n : DEFAULT_SCREEN_MODE;\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 } 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 theme: ComponentTheme | BaseTheme | ExtraTheme | undefined,\n screenMode: ScreenMode | undefined,\n}>({ theme: undefined, screenMode: 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).theme === 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)?.map((item) => {\n document.documentElement.classList.remove(item);\n });\n getThemeClassName(theme, screenMode).split(' ').forEach(item => {\n document.documentElement.classList.add(item);\n })\n }\n }, [isRootProvider, theme, screenMode]);\n\n return (\n <ThemeContext.Provider value={{ theme, screenMode }}>\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","useTheme","useContext","ThemeContext","useMemo","isModern","className","ThemedChildren","children","_jsx","createContext","undefined","ThemeProvider","isRootProvider","themeClass","RegExp","useEffect","documentElement","match","map","item","document","classList","remove","split","forEach","add","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.5.2",
3
+ "version": "0.6.0",
4
4
  "description": "Provides theming support for the Wise Design system components",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [
@@ -43,5 +43,5 @@
43
43
  "dist/",
44
44
  "src/"
45
45
  ],
46
- "gitHead": "edf488a858a1293ab66f5bfc6b671ac8b833fa64"
46
+ "gitHead": "11588bb98e7cf3d0f050ce37ddd540a1575490dd"
47
47
  }
@@ -1,11 +1,12 @@
1
1
  import { createContext, PropsWithChildren, useContext, useEffect } from 'react';
2
2
 
3
3
  import { ThemedChildren } from './ThemedChildren';
4
- import { BaseTheme, ExtraTheme, ScreenMode, Theming, DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';
4
+ import type { ComponentTheme, BaseTheme, ExtraTheme, ScreenMode, Theming } from './const';
5
+ import { DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';
5
6
  import { getThemeClassName } from './helpers';
6
7
 
7
8
  export const ThemeContext = createContext<{
8
- theme: BaseTheme | ExtraTheme | undefined,
9
+ theme: ComponentTheme | BaseTheme | ExtraTheme | undefined,
9
10
  screenMode: ScreenMode | undefined,
10
11
  }>({ theme: undefined, screenMode: undefined });
11
12
 
package/src/const.ts CHANGED
@@ -1,16 +1,21 @@
1
- // TODO: Change 'light' with 'legacy' in future
2
- export const baseThemes = ['light', 'personal'];
3
- export const extraThemes = ['forest-green'];
4
- export const screenModes = ['light', 'dark'];
1
+ // TODO: Change 'light' with 'legacy' in the future
2
+ export const baseThemes = ['light', 'personal'] as const;
3
+ export const extraThemes = ['forest-green', 'bright-green'] as const;
4
+ export const screenModes = ['light', 'dark'] as const;
5
+ export const modernThemes = [baseThemes[1], ...extraThemes] as const;
5
6
 
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];
6
10
  export type BaseTheme = typeof baseThemes[number];
7
11
  export type ExtraTheme = typeof extraThemes[number];
8
12
  export type ScreenMode = typeof screenModes[number];
13
+ export type ScreenModeDark = typeof screenModes[1];
9
14
 
10
15
  export const DEFAULT_BASE_THEME = 'light' as const;
11
16
  export const DEFAULT_SCREEN_MODE = 'light' as const;
12
17
 
13
18
  export type Theming = {
14
- theme?: BaseTheme | ExtraTheme;
19
+ theme?: ComponentTheme | BaseTheme | ExtraTheme;
15
20
  screenMode?: ScreenMode;
16
21
  };
package/src/helpers.ts CHANGED
@@ -1,16 +1,20 @@
1
- import { BaseTheme, ScreenMode, ExtraTheme, extraThemes, DEFAULT_BASE_THEME } from './const';
1
+ import type { ComponentTheme, ModernTheme, BaseTheme, ExtraTheme, ScreenMode, ScreenModeDark } from './const';
2
+ import { extraThemes, screenModes, modernThemes } from './const';
2
3
 
3
- export const isThemeModern = (theme: BaseTheme | ExtraTheme): boolean =>
4
- extraThemes.includes(theme) || theme === 'personal';
4
+ export const isThemeModern = (theme: ComponentTheme | BaseTheme | ExtraTheme): theme is ModernTheme =>
5
+ modernThemes.includes(theme as ModernTheme);
5
6
 
6
- export const isExtraTheme = (theme: ExtraTheme): theme is ExtraTheme =>
7
+ export const isExtraTheme = (theme: ComponentTheme | BaseTheme | ExtraTheme): theme is ExtraTheme =>
7
8
  extraThemes.includes(theme as ExtraTheme);
8
9
 
9
- export const isScreenModeDark = (theme: BaseTheme, screenMode: ScreenMode): boolean =>
10
- theme !== DEFAULT_BASE_THEME && screenMode === 'dark';
10
+ export const isScreenModeDark = (
11
+ theme: ComponentTheme | BaseTheme | ExtraTheme,
12
+ screenMode: ScreenMode
13
+ ): screenMode is ScreenModeDark =>
14
+ isThemeModern(theme as ModernTheme) && screenModes[1] === screenMode;
11
15
 
12
16
  export const getThemeClassName = (
13
- theme: BaseTheme | ExtraTheme,
17
+ theme: ComponentTheme | BaseTheme | ExtraTheme,
14
18
  screenMode: ScreenMode,
15
19
  ) => {
16
20
  if (!isThemeModern(theme)) {
@@ -21,7 +25,7 @@ export const getThemeClassName = (
21
25
 
22
26
  if (isExtraTheme(theme)) {
23
27
  classes += ` ${classes}--${theme}`;
24
- } else if (screenMode === 'dark' ) {
28
+ } else if (screenModes[1] === screenMode) {
25
29
  classes += ` ${classes}--${screenMode}`;
26
30
  }
27
31
 
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type { BaseTheme, ExtraTheme, ScreenMode, Theming } from './const';
1
+ export type { ComponentTheme, BaseTheme, ExtraTheme, ScreenMode, Theming } from './const';
2
2
  export { isThemeModern, isExtraTheme, isScreenModeDark, getThemeClassName } from './helpers';
3
3
 
4
4
  export { ThemeProvider } from './ThemeProvider';
@@ -38,62 +38,81 @@ describe('useTheme', () => {
38
38
  });
39
39
  });
40
40
 
41
- it('returns default screen mode if used default light theme', () => {
41
+ it('returns forest-green theme', () => {
42
42
  const {
43
43
  result: { current },
44
44
  } = renderHook(() => useTheme(), {
45
45
  wrapper: ThemeProvider,
46
46
  initialProps: {
47
- theme: DEFAULT_BASE_THEME,
48
- screenMode: 'dark' as const,
47
+ theme: 'forest-green' as const,
49
48
  },
50
49
  });
51
50
 
52
51
  expect(current).toStrictEqual({
53
- theme: DEFAULT_BASE_THEME,
52
+ theme: 'forest-green',
54
53
  screenMode: DEFAULT_SCREEN_MODE,
55
- isModern: false,
54
+ isModern: true,
56
55
  isScreenModeDark: false,
57
- className: 'np-theme-light',
56
+ className: 'np-theme-personal np-theme-personal--forest-green',
58
57
  });
59
58
  });
60
59
 
61
- it('returns dark screen mode', () => {
60
+ it('returns bright-green theme', () => {
62
61
  const {
63
62
  result: { current },
64
63
  } = renderHook(() => useTheme(), {
65
64
  wrapper: ThemeProvider,
66
65
  initialProps: {
67
- theme: 'personal' as const,
68
- screenMode: 'dark' as const,
66
+ theme: 'bright-green' as const,
69
67
  },
70
68
  });
71
69
 
72
70
  expect(current).toStrictEqual({
73
- theme: 'personal',
74
- screenMode: 'dark',
71
+ theme: 'bright-green',
72
+ screenMode: DEFAULT_SCREEN_MODE,
75
73
  isModern: true,
76
- isScreenModeDark: true,
77
- className: 'np-theme-personal np-theme-personal--dark',
74
+ isScreenModeDark: false,
75
+ className: 'np-theme-personal np-theme-personal--bright-green',
78
76
  });
79
77
  });
80
78
 
81
- it('returns forest-green theme', () => {
79
+ it('returns default screen mode if used default light theme', () => {
82
80
  const {
83
81
  result: { current },
84
82
  } = renderHook(() => useTheme(), {
85
83
  wrapper: ThemeProvider,
86
84
  initialProps: {
87
- theme: 'forest-green' as const,
85
+ theme: DEFAULT_BASE_THEME,
86
+ screenMode: 'dark' as const,
88
87
  },
89
88
  });
90
89
 
91
90
  expect(current).toStrictEqual({
92
- theme: 'forest-green',
91
+ theme: DEFAULT_BASE_THEME,
93
92
  screenMode: DEFAULT_SCREEN_MODE,
94
- isModern: true,
93
+ isModern: false,
95
94
  isScreenModeDark: false,
96
- className: 'np-theme-personal np-theme-personal--forest-green',
95
+ className: 'np-theme-light',
96
+ });
97
+ });
98
+
99
+ it('returns dark screen mode', () => {
100
+ const {
101
+ result: { current },
102
+ } = renderHook(() => useTheme(), {
103
+ wrapper: ThemeProvider,
104
+ initialProps: {
105
+ theme: 'personal' as const,
106
+ screenMode: 'dark' as const,
107
+ },
108
+ });
109
+
110
+ expect(current).toStrictEqual({
111
+ theme: 'personal',
112
+ screenMode: 'dark',
113
+ isModern: true,
114
+ isScreenModeDark: true,
115
+ className: 'np-theme-personal np-theme-personal--dark',
97
116
  });
98
117
  });
99
118
  });
package/src/useTheme.ts CHANGED
@@ -1,11 +1,12 @@
1
1
  import { useContext, useMemo } from 'react';
2
2
 
3
3
  import { ThemeContext } from './ThemeProvider';
4
- import { BaseTheme, ScreenMode, ExtraTheme, DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';
4
+ import type { ComponentTheme, BaseTheme, ScreenMode, ExtraTheme } from './const';
5
+ import { DEFAULT_BASE_THEME, DEFAULT_SCREEN_MODE } from './const';
5
6
  import { isThemeModern, isScreenModeDark, getThemeClassName } from './helpers';
6
7
 
7
8
  interface ThemeHookValue {
8
- theme: BaseTheme | ExtraTheme;
9
+ theme: ComponentTheme | BaseTheme | ExtraTheme;
9
10
  screenMode: ScreenMode;
10
11
  isModern: boolean;
11
12
  isScreenModeDark: boolean;
@@ -13,7 +14,7 @@ interface ThemeHookValue {
13
14
  }
14
15
 
15
16
  export const useTheme = (): ThemeHookValue => {
16
- const theme: BaseTheme | ExtraTheme = useContext(ThemeContext).theme ?? DEFAULT_BASE_THEME;
17
+ const theme: ComponentTheme | BaseTheme | ExtraTheme = useContext(ThemeContext).theme ?? DEFAULT_BASE_THEME;
17
18
  const screenMode: ScreenMode = theme !== DEFAULT_BASE_THEME
18
19
  ? useContext(ThemeContext).screenMode ?? DEFAULT_SCREEN_MODE
19
20
  : DEFAULT_SCREEN_MODE;