@atlaskit/app-provider 3.2.10 → 3.3.1

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.
Files changed (85) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/app-provider.js +4 -6
  3. package/dist/cjs/context.js +16 -0
  4. package/dist/cjs/index.js +12 -9
  5. package/dist/cjs/theme-provider/context/color-mode.js +16 -0
  6. package/dist/cjs/theme-provider/context/inside-theme-provider.js +11 -0
  7. package/dist/cjs/theme-provider/context/theme.js +16 -0
  8. package/dist/cjs/theme-provider/hooks/use-color-mode-for-migration.js +19 -0
  9. package/dist/cjs/theme-provider/hooks/use-color-mode.js +41 -0
  10. package/dist/cjs/theme-provider/hooks/use-is-inside-theme-provider.js +17 -0
  11. package/dist/cjs/theme-provider/hooks/use-set-color-mode.js +20 -0
  12. package/dist/cjs/theme-provider/hooks/use-set-theme.js +20 -0
  13. package/dist/cjs/theme-provider/hooks/use-theme.js +35 -0
  14. package/dist/cjs/theme-provider/index.js +215 -0
  15. package/dist/cjs/theme-provider/utils/is-theme-mounted.js +21 -0
  16. package/dist/cjs/theme-provider/utils/load-and-mount-themes.js +130 -0
  17. package/dist/es2019/app-provider.js +3 -3
  18. package/dist/es2019/context.js +11 -0
  19. package/dist/es2019/index.js +10 -1
  20. package/dist/es2019/theme-provider/context/color-mode.js +10 -0
  21. package/dist/es2019/theme-provider/context/inside-theme-provider.js +6 -0
  22. package/dist/es2019/theme-provider/context/theme.js +10 -0
  23. package/dist/es2019/theme-provider/hooks/use-color-mode-for-migration.js +14 -0
  24. package/dist/es2019/theme-provider/hooks/use-color-mode.js +29 -0
  25. package/dist/es2019/theme-provider/hooks/use-is-inside-theme-provider.js +12 -0
  26. package/dist/es2019/theme-provider/hooks/use-set-color-mode.js +15 -0
  27. package/dist/es2019/theme-provider/hooks/use-set-theme.js +15 -0
  28. package/dist/es2019/theme-provider/hooks/use-theme.js +23 -0
  29. package/dist/es2019/theme-provider/index.js +163 -0
  30. package/dist/es2019/theme-provider/utils/is-theme-mounted.js +16 -0
  31. package/dist/es2019/theme-provider/utils/load-and-mount-themes.js +47 -0
  32. package/dist/esm/app-provider.js +3 -3
  33. package/dist/esm/context.js +11 -0
  34. package/dist/esm/index.js +10 -1
  35. package/dist/esm/theme-provider/context/color-mode.js +10 -0
  36. package/dist/esm/theme-provider/context/inside-theme-provider.js +6 -0
  37. package/dist/esm/theme-provider/context/theme.js +10 -0
  38. package/dist/esm/theme-provider/hooks/use-color-mode-for-migration.js +14 -0
  39. package/dist/esm/theme-provider/hooks/use-color-mode.js +35 -0
  40. package/dist/esm/theme-provider/hooks/use-is-inside-theme-provider.js +12 -0
  41. package/dist/esm/theme-provider/hooks/use-set-color-mode.js +15 -0
  42. package/dist/esm/theme-provider/hooks/use-set-theme.js +15 -0
  43. package/dist/esm/theme-provider/hooks/use-theme.js +29 -0
  44. package/dist/esm/theme-provider/index.js +206 -0
  45. package/dist/esm/theme-provider/utils/is-theme-mounted.js +16 -0
  46. package/dist/esm/theme-provider/utils/load-and-mount-themes.js +123 -0
  47. package/dist/types/app-provider.d.ts +3 -2
  48. package/dist/types/context.d.ts +7 -0
  49. package/dist/types/index.d.ts +7 -2
  50. package/dist/types/theme-provider/context/color-mode.d.ts +10 -0
  51. package/dist/types/theme-provider/context/inside-theme-provider.d.ts +4 -0
  52. package/dist/types/theme-provider/context/theme.d.ts +10 -0
  53. package/dist/types/theme-provider/hooks/use-color-mode-for-migration.d.ts +9 -0
  54. package/dist/types/theme-provider/hooks/use-color-mode.d.ts +7 -0
  55. package/dist/types/theme-provider/hooks/use-is-inside-theme-provider.d.ts +6 -0
  56. package/dist/types/theme-provider/hooks/use-set-color-mode.d.ts +7 -0
  57. package/dist/types/theme-provider/hooks/use-set-theme.d.ts +7 -0
  58. package/dist/types/theme-provider/hooks/use-theme.d.ts +7 -0
  59. package/dist/types/theme-provider/index.d.ts +19 -0
  60. package/dist/types/theme-provider/utils/is-theme-mounted.d.ts +8 -0
  61. package/dist/types/theme-provider/utils/load-and-mount-themes.d.ts +2 -0
  62. package/dist/types-ts4.5/app-provider.d.ts +3 -2
  63. package/dist/types-ts4.5/context.d.ts +7 -0
  64. package/dist/types-ts4.5/index.d.ts +7 -2
  65. package/dist/types-ts4.5/theme-provider/context/color-mode.d.ts +10 -0
  66. package/dist/types-ts4.5/theme-provider/context/inside-theme-provider.d.ts +4 -0
  67. package/dist/types-ts4.5/theme-provider/context/theme.d.ts +10 -0
  68. package/dist/types-ts4.5/theme-provider/hooks/use-color-mode-for-migration.d.ts +9 -0
  69. package/dist/types-ts4.5/theme-provider/hooks/use-color-mode.d.ts +7 -0
  70. package/dist/types-ts4.5/theme-provider/hooks/use-is-inside-theme-provider.d.ts +6 -0
  71. package/dist/types-ts4.5/theme-provider/hooks/use-set-color-mode.d.ts +7 -0
  72. package/dist/types-ts4.5/theme-provider/hooks/use-set-theme.d.ts +7 -0
  73. package/dist/types-ts4.5/theme-provider/hooks/use-theme.d.ts +7 -0
  74. package/dist/types-ts4.5/theme-provider/index.d.ts +19 -0
  75. package/dist/types-ts4.5/theme-provider/utils/is-theme-mounted.d.ts +8 -0
  76. package/dist/types-ts4.5/theme-provider/utils/load-and-mount-themes.d.ts +2 -0
  77. package/package.json +10 -5
  78. package/dist/cjs/theme-provider.js +0 -286
  79. package/dist/es2019/theme-provider.js +0 -216
  80. package/dist/esm/theme-provider.js +0 -272
  81. package/dist/types/theme-provider.d.ts +0 -55
  82. package/dist/types-ts4.5/theme-provider.d.ts +0 -55
  83. /package/dist/cjs/{theme-provider.compiled.css → theme-provider/index.compiled.css} +0 -0
  84. /package/dist/es2019/{theme-provider.compiled.css → theme-provider/index.compiled.css} +0 -0
  85. /package/dist/esm/{theme-provider.compiled.css → theme-provider/index.compiled.css} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @atlaskit/app-provider
2
2
 
3
+ ## 3.3.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`d9d9cbc1507f6`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/d9d9cbc1507f6) -
8
+ Internal change how default theme settings are shared between `@atlaskit/tokens` and
9
+ `@atlaskit/app-provider`.
10
+ - Updated dependencies
11
+
12
+ ## 3.3.0
13
+
14
+ ### Minor Changes
15
+
16
+ - [`a45bf2e086e1d`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/a45bf2e086e1d) -
17
+ We are testing AppProvider subtree theming capabilities behind a feature flag. This is still in
18
+ development but working under minimal conditions. If this change is successful it will be
19
+ available in a later release.
20
+
3
21
  ## 3.2.10
4
22
 
5
23
  ### Patch Changes
@@ -1,16 +1,14 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof = require("@babel/runtime/helpers/typeof");
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = void 0;
9
- var _react = _interopRequireWildcard(require("react"));
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _context = require("./context");
10
10
  var _routerLinkProvider = _interopRequireDefault(require("./router-link-provider"));
11
11
  var _themeProvider = _interopRequireDefault(require("./theme-provider"));
12
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
13
- var InsideAppProviderContext = /*#__PURE__*/(0, _react.createContext)(false);
14
12
  /**
15
13
  * __App provider__
16
14
  *
@@ -25,14 +23,14 @@ function AppProvider(_ref) {
25
23
  defaultTheme = _ref.defaultTheme,
26
24
  routerLinkComponent = _ref.routerLinkComponent,
27
25
  UNSAFE_isThemingDisabled = _ref.UNSAFE_isThemingDisabled;
28
- var isInsideAppProvider = (0, _react.useContext)(InsideAppProviderContext);
26
+ var isInsideAppProvider = (0, _context.useIsInsideAppProvider)();
29
27
  if (isInsideAppProvider) {
30
28
  throw new Error('App provider should not be nested within another app provider.');
31
29
  }
32
30
  var routerLinkProvider = /*#__PURE__*/_react.default.createElement(_routerLinkProvider.default, {
33
31
  routerLinkComponent: routerLinkComponent
34
32
  }, children);
35
- return /*#__PURE__*/_react.default.createElement(InsideAppProviderContext.Provider, {
33
+ return /*#__PURE__*/_react.default.createElement(_context.InsideAppProviderContext.Provider, {
36
34
  value: true
37
35
  }, UNSAFE_isThemingDisabled ? routerLinkProvider : /*#__PURE__*/_react.default.createElement(_themeProvider.default, {
38
36
  defaultColorMode: defaultColorMode,
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useIsInsideAppProvider = exports.InsideAppProviderContext = void 0;
7
+ var _react = require("react");
8
+ /**
9
+ * __Inside app provider context__
10
+ *
11
+ * A context that indicates if the current component is inside an AppProvider.
12
+ */
13
+ var InsideAppProviderContext = exports.InsideAppProviderContext = /*#__PURE__*/(0, _react.createContext)(false);
14
+ var useIsInsideAppProvider = exports.useIsInsideAppProvider = function useIsInsideAppProvider() {
15
+ return (0, _react.useContext)(InsideAppProviderContext);
16
+ };
package/dist/cjs/index.js CHANGED
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof = require("@babel/runtime/helpers/typeof");
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
@@ -14,7 +13,7 @@ Object.defineProperty(exports, "ThemeProvider", {
14
13
  Object.defineProperty(exports, "UNSAFE_useColorModeForMigration", {
15
14
  enumerable: true,
16
15
  get: function get() {
17
- return _themeProvider.UNSAFE_useColorModeForMigration;
16
+ return _useColorModeForMigration.UNSAFE_useColorModeForMigration;
18
17
  }
19
18
  });
20
19
  Object.defineProperty(exports, "default", {
@@ -26,7 +25,7 @@ Object.defineProperty(exports, "default", {
26
25
  Object.defineProperty(exports, "useColorMode", {
27
26
  enumerable: true,
28
27
  get: function get() {
29
- return _themeProvider.useColorMode;
28
+ return _useColorMode.useColorMode;
30
29
  }
31
30
  });
32
31
  Object.defineProperty(exports, "useRouterLink", {
@@ -38,22 +37,26 @@ Object.defineProperty(exports, "useRouterLink", {
38
37
  Object.defineProperty(exports, "useSetColorMode", {
39
38
  enumerable: true,
40
39
  get: function get() {
41
- return _themeProvider.useSetColorMode;
40
+ return _useSetColorMode.useSetColorMode;
42
41
  }
43
42
  });
44
43
  Object.defineProperty(exports, "useSetTheme", {
45
44
  enumerable: true,
46
45
  get: function get() {
47
- return _themeProvider.useSetTheme;
46
+ return _useSetTheme.useSetTheme;
48
47
  }
49
48
  });
50
49
  Object.defineProperty(exports, "useTheme", {
51
50
  enumerable: true,
52
51
  get: function get() {
53
- return _themeProvider.useTheme;
52
+ return _useTheme.useTheme;
54
53
  }
55
54
  });
56
55
  var _appProvider = _interopRequireDefault(require("./app-provider"));
57
- var _themeProvider = _interopRequireWildcard(require("./theme-provider"));
58
- var _useRouterLink = _interopRequireDefault(require("./router-link-provider/hooks/use-router-link"));
59
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
56
+ var _useColorModeForMigration = require("./theme-provider/hooks/use-color-mode-for-migration");
57
+ var _useColorMode = require("./theme-provider/hooks/use-color-mode");
58
+ var _useSetColorMode = require("./theme-provider/hooks/use-set-color-mode");
59
+ var _useSetTheme = require("./theme-provider/hooks/use-set-theme");
60
+ var _useTheme = require("./theme-provider/hooks/use-theme");
61
+ var _themeProvider = _interopRequireDefault(require("./theme-provider"));
62
+ var _useRouterLink = _interopRequireDefault(require("./router-link-provider/hooks/use-router-link"));
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SetColorModeContext = exports.ColorModeContext = void 0;
7
+ var _react = require("react");
8
+ /**
9
+ * __Color mode context__
10
+ */
11
+ var ColorModeContext = exports.ColorModeContext = /*#__PURE__*/(0, _react.createContext)(undefined);
12
+
13
+ /**
14
+ * __Set color mode context__
15
+ */
16
+ var SetColorModeContext = exports.SetColorModeContext = /*#__PURE__*/(0, _react.createContext)(undefined);
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.InsideThemeProviderContext = void 0;
7
+ var _react = require("react");
8
+ /**
9
+ * __Inside theme provider context__
10
+ */
11
+ var InsideThemeProviderContext = exports.InsideThemeProviderContext = /*#__PURE__*/(0, _react.createContext)(false);
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ThemeContext = exports.SetThemeContext = void 0;
7
+ var _react = require("react");
8
+ /**
9
+ * __Theme context__
10
+ */
11
+ var ThemeContext = exports.ThemeContext = /*#__PURE__*/(0, _react.createContext)(undefined);
12
+
13
+ /**
14
+ * __Set theme context__
15
+ */
16
+ var SetThemeContext = exports.SetThemeContext = /*#__PURE__*/(0, _react.createContext)(undefined);
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.UNSAFE_useColorModeForMigration = UNSAFE_useColorModeForMigration;
7
+ var _react = require("react");
8
+ var _colorMode = require("../context/color-mode");
9
+ /**
10
+ * __UNSAFE_useColorModeForMigration()__
11
+ *
12
+ * Returns the current color mode when inside the app provider.
13
+ * Unlike useColorMode, this utility returns undefined, instead of throwing an error, when the app provider is missing.
14
+ * This allows it to be used by components that need to operate with and without an app provider.
15
+ */
16
+ function UNSAFE_useColorModeForMigration() {
17
+ var value = (0, _react.useContext)(_colorMode.ColorModeContext);
18
+ return value;
19
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useColorMode = useColorMode;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _react = require("react");
10
+ var _tokens = require("@atlaskit/tokens");
11
+ var _colorMode = require("../context/color-mode");
12
+ /**
13
+ * __useColorMode()__
14
+ *
15
+ * Returns the current color mode when inside the app provider.
16
+ */
17
+ function useColorMode() {
18
+ var value = (0, _react.useContext)(_colorMode.ColorModeContext);
19
+
20
+ // TODO: This will only return 'light' or 'dark' but never 'auto', which in some cases
21
+ // may be desirable. We should consider returning both the reconciled color mode (e.g. 'light' or 'dark') and the selected color mode ("auto").
22
+ var theme = (0, _tokens.getGlobalTheme)();
23
+ var _useState = (0, _react.useState)((theme === null || theme === void 0 ? void 0 : theme.colorMode) || 'light'),
24
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
25
+ resolvedColorMode = _useState2[0],
26
+ setResolvedColorMode = _useState2[1];
27
+ (0, _react.useEffect)(function () {
28
+ // We are using theme from context so no need to reference the DOM
29
+ if (value) {
30
+ return;
31
+ }
32
+ var observer = new _tokens.ThemeMutationObserver(function (theme) {
33
+ setResolvedColorMode((theme === null || theme === void 0 ? void 0 : theme.colorMode) || 'light');
34
+ });
35
+ observer.observe();
36
+ return function () {
37
+ return observer.disconnect();
38
+ };
39
+ }, [value]);
40
+ return value ? value : resolvedColorMode;
41
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useIsInsideThemeProvider = void 0;
7
+ var _react = require("react");
8
+ var _insideThemeProvider = require("../context/inside-theme-provider");
9
+ /**
10
+ * __useIsInsideThemeProvider()__
11
+ *
12
+ * Returns true if the current component is inside a ThemeProvider.
13
+ */
14
+ var useIsInsideThemeProvider = exports.useIsInsideThemeProvider = function useIsInsideThemeProvider() {
15
+ var _useContext;
16
+ return (_useContext = (0, _react.useContext)(_insideThemeProvider.InsideThemeProviderContext)) !== null && _useContext !== void 0 ? _useContext : false;
17
+ };
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useSetColorMode = useSetColorMode;
7
+ var _react = require("react");
8
+ var _colorMode = require("../context/color-mode");
9
+ /**
10
+ * __useSetColorMode()__
11
+ *
12
+ * Returns the color mode setter when inside the app provider.
13
+ */
14
+ function useSetColorMode() {
15
+ var value = (0, _react.useContext)(_colorMode.SetColorModeContext);
16
+ if (!value) {
17
+ throw new Error('useSetColorMode must be used within ThemeProvider.');
18
+ }
19
+ return value;
20
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useSetTheme = useSetTheme;
7
+ var _react = require("react");
8
+ var _theme = require("../context/theme");
9
+ /**
10
+ * __useSetTheme()__
11
+ *
12
+ * Returns the theme setter when inside the app provider.
13
+ */
14
+ function useSetTheme() {
15
+ var value = (0, _react.useContext)(_theme.SetThemeContext);
16
+ if (!value) {
17
+ throw new Error('useSetTheme must be used within ThemeProvider.');
18
+ }
19
+ return value;
20
+ }
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useTheme = useTheme;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _react = require("react");
10
+ var _tokens = require("@atlaskit/tokens");
11
+ var _theme = require("../context/theme");
12
+ /**
13
+ * __useTheme()__
14
+ *
15
+ * Returns the current theme settings when inside the app provider.
16
+ */
17
+ function useTheme() {
18
+ var theme = (0, _react.useContext)(_theme.ThemeContext);
19
+ var _useState = (0, _react.useState)(theme || (0, _tokens.getGlobalTheme)()),
20
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
21
+ resolvedTheme = _useState2[0],
22
+ setResolvedTheme = _useState2[1];
23
+ (0, _react.useEffect)(function () {
24
+ // We are using theme from context so no need to reference the DOM
25
+ if (theme) {
26
+ return;
27
+ }
28
+ var observer = new _tokens.ThemeMutationObserver(setResolvedTheme);
29
+ observer.observe();
30
+ return function () {
31
+ return observer.disconnect();
32
+ };
33
+ }, [theme]);
34
+ return theme ? theme : resolvedTheme;
35
+ }
@@ -0,0 +1,215 @@
1
+ /* index.tsx generated by @compiled/babel-plugin v0.38.1 */
2
+ "use strict";
3
+
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.default = void 0;
10
+ require("./index.compiled.css");
11
+ var _runtime = require("@compiled/react/runtime");
12
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
13
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
14
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
17
+ var _react = _interopRequireWildcard(require("react"));
18
+ var _bindEventListener = require("bind-event-listener");
19
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
20
+ var _tokens = require("@atlaskit/tokens");
21
+ var _context3 = require("../context");
22
+ var _colorMode = require("./context/color-mode");
23
+ var _insideThemeProvider = require("./context/inside-theme-provider");
24
+ var _theme = require("./context/theme");
25
+ var _useIsInsideThemeProvider = require("./hooks/use-is-inside-theme-provider");
26
+ var _loadAndMountThemes = require("./utils/load-and-mount-themes");
27
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
28
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
29
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
30
+ var defaultThemeSettings = {
31
+ dark: 'dark',
32
+ light: 'light',
33
+ spacing: 'spacing',
34
+ typography: 'typography'
35
+ };
36
+ var isMatchMediaAvailable = typeof window !== 'undefined' && 'matchMedia' in window;
37
+ var prefersDarkModeMql = isMatchMediaAvailable ? window.matchMedia('(prefers-color-scheme: dark)') : undefined;
38
+
39
+ // TODO: currently 'auto' color mode will always return 'light' in SSR.
40
+ // Additional work required: https://product-fabric.atlassian.net/browse/DSP-9781
41
+ function getReconciledColorMode(colorMode) {
42
+ if (colorMode === 'auto') {
43
+ return prefersDarkModeMql !== null && prefersDarkModeMql !== void 0 && prefersDarkModeMql.matches ? 'dark' : 'light';
44
+ }
45
+ return colorMode;
46
+ }
47
+ var contentStyles = {
48
+ body: "_1e0c1bgi"
49
+ };
50
+ /**
51
+ * __Theme provider__
52
+ *
53
+ * Provides global theming configuration.
54
+ */
55
+ function ThemeProvider(_ref) {
56
+ var children = _ref.children,
57
+ _ref$defaultColorMode = _ref.defaultColorMode,
58
+ defaultColorMode = _ref$defaultColorMode === void 0 ? 'auto' : _ref$defaultColorMode,
59
+ defaultTheme = _ref.defaultTheme;
60
+ var _useState = (0, _react.useState)(defaultColorMode),
61
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
62
+ chosenColorMode = _useState2[0],
63
+ setChosenColorMode = _useState2[1];
64
+ var _useState3 = (0, _react.useState)(getReconciledColorMode(defaultColorMode)),
65
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
66
+ reconciledColorMode = _useState4[0],
67
+ setReconciledColorMode = _useState4[1];
68
+ var _useState5 = (0, _react.useState)(function () {
69
+ return _objectSpread(_objectSpread({}, defaultThemeSettings), defaultTheme);
70
+ }),
71
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
72
+ theme = _useState6[0],
73
+ setTheme = _useState6[1];
74
+ var setColorMode = (0, _react.useCallback)(function (colorMode) {
75
+ setChosenColorMode(colorMode);
76
+ setReconciledColorMode(getReconciledColorMode(colorMode));
77
+ }, []);
78
+ var setPartialTheme = (0, _react.useCallback)(function (nextTheme) {
79
+ setTheme(function (theme) {
80
+ return _objectSpread(_objectSpread({}, theme), nextTheme);
81
+ });
82
+ }, []);
83
+ var lastSetGlobalThemePromiseRef = (0, _react.useRef)(null);
84
+ var isInsideAppProvider = (0, _context3.useIsInsideAppProvider)();
85
+ var isInsideThemeProvider = (0, _useIsInsideThemeProvider.useIsInsideThemeProvider)();
86
+ var isRootThemeProvider = isInsideAppProvider && !isInsideThemeProvider;
87
+ (0, _react.useEffect)(function () {
88
+ if (
89
+ /**
90
+ * A top-level ThemeProvider is detected by being the first ThemeProvider inside an AppProvider.
91
+ *
92
+ * This will not use sub-tree theming but instead set the global theme state using the
93
+ * `@atlaskit/tokens` APIs, as it's required for styling root `html` and `body` elements
94
+ * for compatibility with `@atlaskit/css-reset`.
95
+ *
96
+ * In the future we could consider moving away from DOM mutations and require AppProvider to wrap
97
+ * `html` in order to apply global theme state, which would allow a more consistent approach to
98
+ * theme loading.
99
+ */
100
+ isRootThemeProvider || (
101
+ /**
102
+ * Or when not behind feature flag, partially revert to legacy behavior.
103
+ * This only affects theme providers that are not inside an AppProvider or a ThemeProvider,
104
+ * as we still need to set global theme state to prevent breaking existing apps,
105
+ * but also prevent multiple theme providers from loading conflicting theme states.
106
+ *
107
+ * After we roll out the feature flag, this will be removed as we will
108
+ * only support sub-tree theming when used outside of AppProvider.
109
+ */
110
+ !isInsideAppProvider && !isInsideThemeProvider && !(0, _platformFeatureFlags.fg)('platform_dst_subtree_theming'))) {
111
+ /**
112
+ * We need to wait for any previous `setGlobalTheme` calls to finish before calling it again.
113
+ * This is to prevent race conditions as `setGlobalTheme` is async and mutates the DOM (e.g. sets the
114
+ * `data-color-mode` attribute on the root element).
115
+ *
116
+ * Since we can't safely abort the `setGlobalTheme` execution, we need to wait for it to properly finish before
117
+ * applying the new theme.
118
+ *
119
+ * Without this, we can end up in the following scenario:
120
+ * 1. app loads with the default 'light' theme, kicking off `setGlobalTheme`
121
+ * 2. app switches to 'dark' theme after retrieving value persisted in local storage, calling `setGlobalTheme` again
122
+ * 3. `setGlobalTheme` function execution for `dark` finishes before the initial `light` execution
123
+ * 4. `setGlobalTheme` function execution for `light` then finishes, resulting in the 'light' theme being applied.
124
+ */
125
+ var cleanupLastFnCall = /*#__PURE__*/function () {
126
+ var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
127
+ var unbindFn;
128
+ return _regenerator.default.wrap(function _callee$(_context) {
129
+ while (1) switch (_context.prev = _context.next) {
130
+ case 0:
131
+ if (!lastSetGlobalThemePromiseRef.current) {
132
+ _context.next = 6;
133
+ break;
134
+ }
135
+ _context.next = 3;
136
+ return lastSetGlobalThemePromiseRef.current;
137
+ case 3:
138
+ unbindFn = _context.sent;
139
+ unbindFn();
140
+ lastSetGlobalThemePromiseRef.current = null;
141
+ case 6:
142
+ case "end":
143
+ return _context.stop();
144
+ }
145
+ }, _callee);
146
+ }));
147
+ return function cleanupLastFnCall() {
148
+ return _ref2.apply(this, arguments);
149
+ };
150
+ }();
151
+ var safelySetGlobalTheme = /*#__PURE__*/function () {
152
+ var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
153
+ var promise;
154
+ return _regenerator.default.wrap(function _callee2$(_context2) {
155
+ while (1) switch (_context2.prev = _context2.next) {
156
+ case 0:
157
+ _context2.next = 2;
158
+ return cleanupLastFnCall();
159
+ case 2:
160
+ promise = (0, _tokens.setGlobalTheme)(_objectSpread(_objectSpread({}, theme), {}, {
161
+ colorMode: reconciledColorMode
162
+ }));
163
+ lastSetGlobalThemePromiseRef.current = promise;
164
+ case 4:
165
+ case "end":
166
+ return _context2.stop();
167
+ }
168
+ }, _callee2);
169
+ }));
170
+ return function safelySetGlobalTheme() {
171
+ return _ref3.apply(this, arguments);
172
+ };
173
+ }();
174
+ safelySetGlobalTheme();
175
+ return function cleanup() {
176
+ cleanupLastFnCall();
177
+ };
178
+ } else {
179
+ // For other theme providers (whether outside AppProvider or nested inside a ThemeProvider),
180
+ // we treat them as sub-tree themes that do not load global theme state.
181
+ (0, _loadAndMountThemes.loadAndMountThemes)(theme);
182
+ }
183
+ }, [isInsideAppProvider, isInsideThemeProvider, isRootThemeProvider, reconciledColorMode, theme]);
184
+ (0, _react.useEffect)(function () {
185
+ if (!prefersDarkModeMql) {
186
+ return;
187
+ }
188
+ var unbindListener = (0, _bindEventListener.bind)(prefersDarkModeMql, {
189
+ type: 'change',
190
+ listener: function listener(event) {
191
+ if (chosenColorMode === 'auto') {
192
+ setReconciledColorMode(event.matches ? 'dark' : 'light');
193
+ }
194
+ }
195
+ });
196
+ return unbindListener;
197
+ }, [chosenColorMode]);
198
+ var attrs = _objectSpread(_objectSpread({}, (0, _tokens.getThemeHtmlAttrs)(_objectSpread(_objectSpread({}, theme), {}, {
199
+ colorMode: reconciledColorMode
200
+ }))), {}, (0, _defineProperty2.default)({}, _tokens.SUBTREE_THEME_ATTRIBUTE, true));
201
+ return /*#__PURE__*/_react.default.createElement(_insideThemeProvider.InsideThemeProviderContext.Provider, {
202
+ value: true
203
+ }, /*#__PURE__*/_react.default.createElement(_colorMode.ColorModeContext.Provider, {
204
+ value: reconciledColorMode
205
+ }, /*#__PURE__*/_react.default.createElement(_colorMode.SetColorModeContext.Provider, {
206
+ value: setColorMode
207
+ }, /*#__PURE__*/_react.default.createElement(_theme.ThemeContext.Provider, {
208
+ value: theme
209
+ }, /*#__PURE__*/_react.default.createElement(_theme.SetThemeContext.Provider, {
210
+ value: setPartialTheme
211
+ }, (0, _platformFeatureFlags.fg)('platform_dst_subtree_theming') ? /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, attrs, {
212
+ className: (0, _runtime.ax)([contentStyles.body])
213
+ }), children) : children)))));
214
+ }
215
+ var _default = exports.default = ThemeProvider;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isThemeMounted = isThemeMounted;
7
+ var _browserApis = require("@atlaskit/browser-apis");
8
+ var _tokens = require("@atlaskit/tokens");
9
+ /**
10
+ * Checks if a theme is mounted in the document head.
11
+ *
12
+ * Eventually this won't be necessary as we'll utilise AppProvider context
13
+ * to track theme loading.
14
+ */
15
+ function isThemeMounted(themeId) {
16
+ var doc = (0, _browserApis.getDocument)();
17
+ if (!doc) {
18
+ return false;
19
+ }
20
+ return doc.head.querySelector("style[".concat(_tokens.THEME_DATA_ATTRIBUTE, "=\"").concat(themeId, "\"]"));
21
+ }