@atlaskit/app-provider 0.1.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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ # @atlaskit/app-provider
2
+
3
+ ## 0.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#41035](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/41035) [`e7344823cff`](https://bitbucket.org/atlassian/atlassian-frontend/commits/e7344823cff) - Created the AppProvider component with support for theming.
8
+
9
+ ## 0.0.1
10
+
11
+ - Scaffold AppProvider component.
package/LICENSE.md ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2023 Atlassian Pty Ltd
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # App provider
2
+
3
+ A top level provider for the Design System.
4
+
5
+ ## Usage
6
+
7
+ Detailed docs and example usage can be found [here](https://atlaskit.atlassian.com/packages/design-system/app-provider).
@@ -0,0 +1,23 @@
1
+ ---
2
+ order: 0
3
+ ---
4
+
5
+ import AppProviderDefault from '../../examples/constellation/0-default';
6
+ import AppProviderThemeSwitcher from '../../examples/constellation/1-theme-switcher';
7
+
8
+ ## Theming
9
+
10
+ AppProvider sets up theming for an app, enabling [design tokens](/tokens/design-tokens) to be used.
11
+
12
+ <Example Component={AppProviderDefault} packageName="@atlaskit/app-provider" />
13
+
14
+ ## Color mode and theme switching
15
+
16
+ The `useColorMode` hook can be used to get the active color mode. When the color mode is set to `auto`, the active color mode will be determined by the user's system preference.
17
+
18
+ The `useTheme` hook can be used to get the active themes. The `useSetTheme` hook can be used to change themes.
19
+
20
+ <Example
21
+ Component={AppProviderThemeSwitcher}
22
+ packageName="@atlaskit/app-provider"
23
+ />
@@ -0,0 +1,7 @@
1
+ ---
2
+ order: 2
3
+ ---
4
+
5
+ ## Usage
6
+
7
+ AppProvider provides app-level configuration for the Design System, such as global theming. Place it at the root of your application.
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.AppProvider = AppProvider;
9
+ exports.default = void 0;
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _themeProvider = _interopRequireDefault(require("./theme-provider"));
12
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
13
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
14
+ var InsideAppProviderContext = /*#__PURE__*/(0, _react.createContext)(false);
15
+ var defaultThemeSettings = {
16
+ dark: 'dark',
17
+ light: 'light',
18
+ spacing: 'spacing'
19
+ };
20
+ /**
21
+ * __App provider__
22
+ *
23
+ * An app provider provides app level configuration such as global theming.
24
+ *
25
+ * Place it at the root of your application.
26
+ */
27
+ function AppProvider(_ref) {
28
+ var children = _ref.children,
29
+ _ref$defaultColorMode = _ref.defaultColorMode,
30
+ defaultColorMode = _ref$defaultColorMode === void 0 ? 'light' : _ref$defaultColorMode,
31
+ _ref$defaultTheme = _ref.defaultTheme,
32
+ defaultTheme = _ref$defaultTheme === void 0 ? defaultThemeSettings : _ref$defaultTheme;
33
+ var isInsideAppProvider = (0, _react.useContext)(InsideAppProviderContext);
34
+ if (isInsideAppProvider) {
35
+ throw new Error('App provider should not be nested within another app provider.');
36
+ }
37
+ return /*#__PURE__*/_react.default.createElement(InsideAppProviderContext.Provider, {
38
+ value: true
39
+ }, /*#__PURE__*/_react.default.createElement(_themeProvider.default, {
40
+ defaultColorMode: defaultColorMode,
41
+ defaultTheme: defaultTheme
42
+ }, children));
43
+ }
44
+ var _default = exports.default = AppProvider;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ Object.defineProperty(exports, "default", {
8
+ enumerable: true,
9
+ get: function get() {
10
+ return _appProvider.default;
11
+ }
12
+ });
13
+ Object.defineProperty(exports, "useColorMode", {
14
+ enumerable: true,
15
+ get: function get() {
16
+ return _themeProvider.useColorMode;
17
+ }
18
+ });
19
+ Object.defineProperty(exports, "useSetColorMode", {
20
+ enumerable: true,
21
+ get: function get() {
22
+ return _themeProvider.useSetColorMode;
23
+ }
24
+ });
25
+ Object.defineProperty(exports, "useSetTheme", {
26
+ enumerable: true,
27
+ get: function get() {
28
+ return _themeProvider.useSetTheme;
29
+ }
30
+ });
31
+ Object.defineProperty(exports, "useTheme", {
32
+ enumerable: true,
33
+ get: function get() {
34
+ return _themeProvider.useTheme;
35
+ }
36
+ });
37
+ var _appProvider = _interopRequireDefault(require("./app-provider"));
38
+ var _themeProvider = require("./theme-provider");
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.ThemeProvider = ThemeProvider;
9
+ exports.default = void 0;
10
+ exports.useColorMode = useColorMode;
11
+ exports.useSetColorMode = useSetColorMode;
12
+ exports.useSetTheme = useSetTheme;
13
+ exports.useTheme = useTheme;
14
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
16
+ var _react = _interopRequireWildcard(require("react"));
17
+ var _bindEventListener = require("bind-event-listener");
18
+ var _tokens = require("@atlaskit/tokens");
19
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
20
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
21
+ 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; }
22
+ 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; }
23
+ var ColorModeContext = /*#__PURE__*/(0, _react.createContext)(undefined);
24
+ var SetColorModeContext = /*#__PURE__*/(0, _react.createContext)(undefined);
25
+ var ThemeContext = /*#__PURE__*/(0, _react.createContext)(undefined);
26
+ var SetThemeContext = /*#__PURE__*/(0, _react.createContext)(undefined);
27
+
28
+ /**
29
+ * __useColorMode()__
30
+ *
31
+ * Returns the current color mode when inside the app provider.
32
+ */
33
+ function useColorMode() {
34
+ var value = (0, _react.useContext)(ColorModeContext);
35
+ if (!value) {
36
+ throw new Error('useColorMode must be used within AppProvider.');
37
+ }
38
+ return value;
39
+ }
40
+
41
+ /**
42
+ * __useSetColorMode()__
43
+ *
44
+ * Returns the color mode setter when inside the app provider.
45
+ */
46
+ function useSetColorMode() {
47
+ var value = (0, _react.useContext)(SetColorModeContext);
48
+ if (!value) {
49
+ throw new Error('useSetColorMode must be used within AppProvider.');
50
+ }
51
+ return value;
52
+ }
53
+
54
+ /**
55
+ * __useTheme()__
56
+ *
57
+ * Returns the current theme settings when inside the app provider.
58
+ */
59
+ function useTheme() {
60
+ var value = (0, _react.useContext)(ThemeContext);
61
+ if (!value) {
62
+ throw new Error('useTheme must be used within AppProvider.');
63
+ }
64
+ return value;
65
+ }
66
+
67
+ /**
68
+ * __useSetTheme()__
69
+ *
70
+ * Returns the theme setter when inside the app provider.
71
+ */
72
+ function useSetTheme() {
73
+ var value = (0, _react.useContext)(SetThemeContext);
74
+ if (!value) {
75
+ throw new Error('useSetTheme must be used within AppProvider.');
76
+ }
77
+ return value;
78
+ }
79
+ var isMatchMediaAvailable = typeof window !== 'undefined' && 'matchMedia' in window;
80
+ var prefersDarkModeMql = isMatchMediaAvailable ? window.matchMedia('(prefers-color-scheme: dark)') : undefined;
81
+
82
+ // TODO: currently 'auto' color mode will always return 'light' in SSR.
83
+ // Additional work required: https://product-fabric.atlassian.net/browse/DSP-9781
84
+ function getReconciledColorMode(colorMode) {
85
+ if (colorMode === 'auto') {
86
+ return prefersDarkModeMql !== null && prefersDarkModeMql !== void 0 && prefersDarkModeMql.matches ? 'dark' : 'light';
87
+ }
88
+ return colorMode;
89
+ }
90
+ /**
91
+ * __Theme provider__
92
+ *
93
+ * Provides global theming configuration.
94
+ *
95
+ * @internal
96
+ */
97
+ function ThemeProvider(_ref) {
98
+ var children = _ref.children,
99
+ defaultColorMode = _ref.defaultColorMode,
100
+ defaultTheme = _ref.defaultTheme;
101
+ var _useState = (0, _react.useState)(defaultColorMode),
102
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
103
+ chosenColorMode = _useState2[0],
104
+ setChosenColorMode = _useState2[1];
105
+ var _useState3 = (0, _react.useState)(getReconciledColorMode(defaultColorMode)),
106
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
107
+ reconciledColorMode = _useState4[0],
108
+ setReconciledColorMode = _useState4[1];
109
+ var _useState5 = (0, _react.useState)(defaultTheme),
110
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
111
+ theme = _useState6[0],
112
+ setTheme = _useState6[1];
113
+ var setColorMode = (0, _react.useCallback)(function (colorMode) {
114
+ setChosenColorMode(colorMode);
115
+ setReconciledColorMode(getReconciledColorMode(colorMode));
116
+ }, []);
117
+ var setPartialTheme = (0, _react.useCallback)(function (nextTheme) {
118
+ setTheme(function (theme) {
119
+ return _objectSpread(_objectSpread({}, theme), nextTheme);
120
+ });
121
+ }, []);
122
+ (0, _react.useEffect)(function () {
123
+ (0, _tokens.setGlobalTheme)(_objectSpread(_objectSpread({}, theme), {}, {
124
+ colorMode: reconciledColorMode
125
+ }));
126
+ }, [theme, reconciledColorMode]);
127
+ (0, _react.useEffect)(function () {
128
+ if (!prefersDarkModeMql) {
129
+ return;
130
+ }
131
+ var unbindListener = (0, _bindEventListener.bind)(prefersDarkModeMql, {
132
+ type: 'change',
133
+ listener: function listener(event) {
134
+ if (chosenColorMode === 'auto') {
135
+ setReconciledColorMode(event.matches ? 'dark' : 'light');
136
+ }
137
+ }
138
+ });
139
+ return unbindListener;
140
+ }, [chosenColorMode]);
141
+ return /*#__PURE__*/_react.default.createElement(ColorModeContext.Provider, {
142
+ value: reconciledColorMode
143
+ }, /*#__PURE__*/_react.default.createElement(SetColorModeContext.Provider, {
144
+ value: setColorMode
145
+ }, /*#__PURE__*/_react.default.createElement(ThemeContext.Provider, {
146
+ value: theme
147
+ }, /*#__PURE__*/_react.default.createElement(SetThemeContext.Provider, {
148
+ value: setPartialTheme
149
+ }, children))));
150
+ }
151
+ var _default = exports.default = ThemeProvider;
@@ -0,0 +1,32 @@
1
+ import React, { createContext, useContext } from 'react';
2
+ import ThemeProvider from './theme-provider';
3
+ const InsideAppProviderContext = /*#__PURE__*/createContext(false);
4
+ const defaultThemeSettings = {
5
+ dark: 'dark',
6
+ light: 'light',
7
+ spacing: 'spacing'
8
+ };
9
+ /**
10
+ * __App provider__
11
+ *
12
+ * An app provider provides app level configuration such as global theming.
13
+ *
14
+ * Place it at the root of your application.
15
+ */
16
+ export function AppProvider({
17
+ children,
18
+ defaultColorMode = 'light',
19
+ defaultTheme = defaultThemeSettings
20
+ }) {
21
+ const isInsideAppProvider = useContext(InsideAppProviderContext);
22
+ if (isInsideAppProvider) {
23
+ throw new Error('App provider should not be nested within another app provider.');
24
+ }
25
+ return /*#__PURE__*/React.createElement(InsideAppProviderContext.Provider, {
26
+ value: true
27
+ }, /*#__PURE__*/React.createElement(ThemeProvider, {
28
+ defaultColorMode: defaultColorMode,
29
+ defaultTheme: defaultTheme
30
+ }, children));
31
+ }
32
+ export default AppProvider;
@@ -0,0 +1,2 @@
1
+ export { default } from './app-provider';
2
+ export { useColorMode, useSetColorMode, useSetTheme, useTheme } from './theme-provider';
@@ -0,0 +1,126 @@
1
+ import React, { createContext, useCallback, useContext, useEffect, useState } from 'react';
2
+ import { bind } from 'bind-event-listener';
3
+ import { setGlobalTheme } from '@atlaskit/tokens';
4
+ const ColorModeContext = /*#__PURE__*/createContext(undefined);
5
+ const SetColorModeContext = /*#__PURE__*/createContext(undefined);
6
+ const ThemeContext = /*#__PURE__*/createContext(undefined);
7
+ const SetThemeContext = /*#__PURE__*/createContext(undefined);
8
+
9
+ /**
10
+ * __useColorMode()__
11
+ *
12
+ * Returns the current color mode when inside the app provider.
13
+ */
14
+ export function useColorMode() {
15
+ const value = useContext(ColorModeContext);
16
+ if (!value) {
17
+ throw new Error('useColorMode must be used within AppProvider.');
18
+ }
19
+ return value;
20
+ }
21
+
22
+ /**
23
+ * __useSetColorMode()__
24
+ *
25
+ * Returns the color mode setter when inside the app provider.
26
+ */
27
+ export function useSetColorMode() {
28
+ const value = useContext(SetColorModeContext);
29
+ if (!value) {
30
+ throw new Error('useSetColorMode must be used within AppProvider.');
31
+ }
32
+ return value;
33
+ }
34
+
35
+ /**
36
+ * __useTheme()__
37
+ *
38
+ * Returns the current theme settings when inside the app provider.
39
+ */
40
+ export function useTheme() {
41
+ const value = useContext(ThemeContext);
42
+ if (!value) {
43
+ throw new Error('useTheme must be used within AppProvider.');
44
+ }
45
+ return value;
46
+ }
47
+
48
+ /**
49
+ * __useSetTheme()__
50
+ *
51
+ * Returns the theme setter when inside the app provider.
52
+ */
53
+ export function useSetTheme() {
54
+ const value = useContext(SetThemeContext);
55
+ if (!value) {
56
+ throw new Error('useSetTheme must be used within AppProvider.');
57
+ }
58
+ return value;
59
+ }
60
+ const isMatchMediaAvailable = typeof window !== 'undefined' && 'matchMedia' in window;
61
+ const prefersDarkModeMql = isMatchMediaAvailable ? window.matchMedia('(prefers-color-scheme: dark)') : undefined;
62
+
63
+ // TODO: currently 'auto' color mode will always return 'light' in SSR.
64
+ // Additional work required: https://product-fabric.atlassian.net/browse/DSP-9781
65
+ function getReconciledColorMode(colorMode) {
66
+ if (colorMode === 'auto') {
67
+ return prefersDarkModeMql !== null && prefersDarkModeMql !== void 0 && prefersDarkModeMql.matches ? 'dark' : 'light';
68
+ }
69
+ return colorMode;
70
+ }
71
+ /**
72
+ * __Theme provider__
73
+ *
74
+ * Provides global theming configuration.
75
+ *
76
+ * @internal
77
+ */
78
+ export function ThemeProvider({
79
+ children,
80
+ defaultColorMode,
81
+ defaultTheme
82
+ }) {
83
+ const [chosenColorMode, setChosenColorMode] = useState(defaultColorMode);
84
+ const [reconciledColorMode, setReconciledColorMode] = useState(getReconciledColorMode(defaultColorMode));
85
+ const [theme, setTheme] = useState(defaultTheme);
86
+ const setColorMode = useCallback(colorMode => {
87
+ setChosenColorMode(colorMode);
88
+ setReconciledColorMode(getReconciledColorMode(colorMode));
89
+ }, []);
90
+ const setPartialTheme = useCallback(nextTheme => {
91
+ setTheme(theme => ({
92
+ ...theme,
93
+ ...nextTheme
94
+ }));
95
+ }, []);
96
+ useEffect(() => {
97
+ setGlobalTheme({
98
+ ...theme,
99
+ colorMode: reconciledColorMode
100
+ });
101
+ }, [theme, reconciledColorMode]);
102
+ useEffect(() => {
103
+ if (!prefersDarkModeMql) {
104
+ return;
105
+ }
106
+ const unbindListener = bind(prefersDarkModeMql, {
107
+ type: 'change',
108
+ listener: event => {
109
+ if (chosenColorMode === 'auto') {
110
+ setReconciledColorMode(event.matches ? 'dark' : 'light');
111
+ }
112
+ }
113
+ });
114
+ return unbindListener;
115
+ }, [chosenColorMode]);
116
+ return /*#__PURE__*/React.createElement(ColorModeContext.Provider, {
117
+ value: reconciledColorMode
118
+ }, /*#__PURE__*/React.createElement(SetColorModeContext.Provider, {
119
+ value: setColorMode
120
+ }, /*#__PURE__*/React.createElement(ThemeContext.Provider, {
121
+ value: theme
122
+ }, /*#__PURE__*/React.createElement(SetThemeContext.Provider, {
123
+ value: setPartialTheme
124
+ }, children))));
125
+ }
126
+ export default ThemeProvider;
@@ -0,0 +1,33 @@
1
+ import React, { createContext, useContext } from 'react';
2
+ import ThemeProvider from './theme-provider';
3
+ var InsideAppProviderContext = /*#__PURE__*/createContext(false);
4
+ var defaultThemeSettings = {
5
+ dark: 'dark',
6
+ light: 'light',
7
+ spacing: 'spacing'
8
+ };
9
+ /**
10
+ * __App provider__
11
+ *
12
+ * An app provider provides app level configuration such as global theming.
13
+ *
14
+ * Place it at the root of your application.
15
+ */
16
+ export function AppProvider(_ref) {
17
+ var children = _ref.children,
18
+ _ref$defaultColorMode = _ref.defaultColorMode,
19
+ defaultColorMode = _ref$defaultColorMode === void 0 ? 'light' : _ref$defaultColorMode,
20
+ _ref$defaultTheme = _ref.defaultTheme,
21
+ defaultTheme = _ref$defaultTheme === void 0 ? defaultThemeSettings : _ref$defaultTheme;
22
+ var isInsideAppProvider = useContext(InsideAppProviderContext);
23
+ if (isInsideAppProvider) {
24
+ throw new Error('App provider should not be nested within another app provider.');
25
+ }
26
+ return /*#__PURE__*/React.createElement(InsideAppProviderContext.Provider, {
27
+ value: true
28
+ }, /*#__PURE__*/React.createElement(ThemeProvider, {
29
+ defaultColorMode: defaultColorMode,
30
+ defaultTheme: defaultTheme
31
+ }, children));
32
+ }
33
+ export default AppProvider;
@@ -0,0 +1,2 @@
1
+ export { default } from './app-provider';
2
+ export { useColorMode, useSetColorMode, useSetTheme, useTheme } from './theme-provider';
@@ -0,0 +1,136 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ 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; }
4
+ 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) { _defineProperty(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; }
5
+ import React, { createContext, useCallback, useContext, useEffect, useState } from 'react';
6
+ import { bind } from 'bind-event-listener';
7
+ import { setGlobalTheme } from '@atlaskit/tokens';
8
+ var ColorModeContext = /*#__PURE__*/createContext(undefined);
9
+ var SetColorModeContext = /*#__PURE__*/createContext(undefined);
10
+ var ThemeContext = /*#__PURE__*/createContext(undefined);
11
+ var SetThemeContext = /*#__PURE__*/createContext(undefined);
12
+
13
+ /**
14
+ * __useColorMode()__
15
+ *
16
+ * Returns the current color mode when inside the app provider.
17
+ */
18
+ export function useColorMode() {
19
+ var value = useContext(ColorModeContext);
20
+ if (!value) {
21
+ throw new Error('useColorMode must be used within AppProvider.');
22
+ }
23
+ return value;
24
+ }
25
+
26
+ /**
27
+ * __useSetColorMode()__
28
+ *
29
+ * Returns the color mode setter when inside the app provider.
30
+ */
31
+ export function useSetColorMode() {
32
+ var value = useContext(SetColorModeContext);
33
+ if (!value) {
34
+ throw new Error('useSetColorMode must be used within AppProvider.');
35
+ }
36
+ return value;
37
+ }
38
+
39
+ /**
40
+ * __useTheme()__
41
+ *
42
+ * Returns the current theme settings when inside the app provider.
43
+ */
44
+ export function useTheme() {
45
+ var value = useContext(ThemeContext);
46
+ if (!value) {
47
+ throw new Error('useTheme must be used within AppProvider.');
48
+ }
49
+ return value;
50
+ }
51
+
52
+ /**
53
+ * __useSetTheme()__
54
+ *
55
+ * Returns the theme setter when inside the app provider.
56
+ */
57
+ export function useSetTheme() {
58
+ var value = useContext(SetThemeContext);
59
+ if (!value) {
60
+ throw new Error('useSetTheme must be used within AppProvider.');
61
+ }
62
+ return value;
63
+ }
64
+ var isMatchMediaAvailable = typeof window !== 'undefined' && 'matchMedia' in window;
65
+ var prefersDarkModeMql = isMatchMediaAvailable ? window.matchMedia('(prefers-color-scheme: dark)') : undefined;
66
+
67
+ // TODO: currently 'auto' color mode will always return 'light' in SSR.
68
+ // Additional work required: https://product-fabric.atlassian.net/browse/DSP-9781
69
+ function getReconciledColorMode(colorMode) {
70
+ if (colorMode === 'auto') {
71
+ return prefersDarkModeMql !== null && prefersDarkModeMql !== void 0 && prefersDarkModeMql.matches ? 'dark' : 'light';
72
+ }
73
+ return colorMode;
74
+ }
75
+ /**
76
+ * __Theme provider__
77
+ *
78
+ * Provides global theming configuration.
79
+ *
80
+ * @internal
81
+ */
82
+ export function ThemeProvider(_ref) {
83
+ var children = _ref.children,
84
+ defaultColorMode = _ref.defaultColorMode,
85
+ defaultTheme = _ref.defaultTheme;
86
+ var _useState = useState(defaultColorMode),
87
+ _useState2 = _slicedToArray(_useState, 2),
88
+ chosenColorMode = _useState2[0],
89
+ setChosenColorMode = _useState2[1];
90
+ var _useState3 = useState(getReconciledColorMode(defaultColorMode)),
91
+ _useState4 = _slicedToArray(_useState3, 2),
92
+ reconciledColorMode = _useState4[0],
93
+ setReconciledColorMode = _useState4[1];
94
+ var _useState5 = useState(defaultTheme),
95
+ _useState6 = _slicedToArray(_useState5, 2),
96
+ theme = _useState6[0],
97
+ setTheme = _useState6[1];
98
+ var setColorMode = useCallback(function (colorMode) {
99
+ setChosenColorMode(colorMode);
100
+ setReconciledColorMode(getReconciledColorMode(colorMode));
101
+ }, []);
102
+ var setPartialTheme = useCallback(function (nextTheme) {
103
+ setTheme(function (theme) {
104
+ return _objectSpread(_objectSpread({}, theme), nextTheme);
105
+ });
106
+ }, []);
107
+ useEffect(function () {
108
+ setGlobalTheme(_objectSpread(_objectSpread({}, theme), {}, {
109
+ colorMode: reconciledColorMode
110
+ }));
111
+ }, [theme, reconciledColorMode]);
112
+ useEffect(function () {
113
+ if (!prefersDarkModeMql) {
114
+ return;
115
+ }
116
+ var unbindListener = bind(prefersDarkModeMql, {
117
+ type: 'change',
118
+ listener: function listener(event) {
119
+ if (chosenColorMode === 'auto') {
120
+ setReconciledColorMode(event.matches ? 'dark' : 'light');
121
+ }
122
+ }
123
+ });
124
+ return unbindListener;
125
+ }, [chosenColorMode]);
126
+ return /*#__PURE__*/React.createElement(ColorModeContext.Provider, {
127
+ value: reconciledColorMode
128
+ }, /*#__PURE__*/React.createElement(SetColorModeContext.Provider, {
129
+ value: setColorMode
130
+ }, /*#__PURE__*/React.createElement(ThemeContext.Provider, {
131
+ value: theme
132
+ }, /*#__PURE__*/React.createElement(SetThemeContext.Provider, {
133
+ value: setPartialTheme
134
+ }, children))));
135
+ }
136
+ export default ThemeProvider;
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import { type ColorMode, type Theme } from './theme-provider';
3
+ interface AppProviderProps {
4
+ /**
5
+ * Initial color mode.
6
+ */
7
+ defaultColorMode?: ColorMode;
8
+ /**
9
+ * Theme settings.
10
+ */
11
+ defaultTheme?: Theme;
12
+ /**
13
+ * App content.
14
+ */
15
+ children: React.ReactNode;
16
+ }
17
+ /**
18
+ * __App provider__
19
+ *
20
+ * An app provider provides app level configuration such as global theming.
21
+ *
22
+ * Place it at the root of your application.
23
+ */
24
+ export declare function AppProvider({ children, defaultColorMode, defaultTheme, }: AppProviderProps): JSX.Element;
25
+ export default AppProvider;
@@ -0,0 +1,2 @@
1
+ export { default } from './app-provider';
2
+ export { useColorMode, useSetColorMode, useSetTheme, useTheme, } from './theme-provider';
@@ -0,0 +1,43 @@
1
+ import React from 'react';
2
+ import { type ThemeState } from '@atlaskit/tokens';
3
+ export type Theme = Omit<ThemeState, 'colorMode'>;
4
+ export type ColorMode = 'light' | 'dark' | 'auto';
5
+ export type ReconciledColorMode = Exclude<ColorMode, 'auto'>;
6
+ /**
7
+ * __useColorMode()__
8
+ *
9
+ * Returns the current color mode when inside the app provider.
10
+ */
11
+ export declare function useColorMode(): ReconciledColorMode;
12
+ /**
13
+ * __useSetColorMode()__
14
+ *
15
+ * Returns the color mode setter when inside the app provider.
16
+ */
17
+ export declare function useSetColorMode(): (value: ColorMode) => void;
18
+ /**
19
+ * __useTheme()__
20
+ *
21
+ * Returns the current theme settings when inside the app provider.
22
+ */
23
+ export declare function useTheme(): Theme;
24
+ /**
25
+ * __useSetTheme()__
26
+ *
27
+ * Returns the theme setter when inside the app provider.
28
+ */
29
+ export declare function useSetTheme(): (value: Partial<Theme>) => void;
30
+ interface ThemeProviderProps {
31
+ defaultColorMode: ColorMode;
32
+ defaultTheme: Theme;
33
+ children: React.ReactNode;
34
+ }
35
+ /**
36
+ * __Theme provider__
37
+ *
38
+ * Provides global theming configuration.
39
+ *
40
+ * @internal
41
+ */
42
+ export declare function ThemeProvider({ children, defaultColorMode, defaultTheme, }: ThemeProviderProps): JSX.Element;
43
+ export default ThemeProvider;
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import { type ColorMode, type Theme } from './theme-provider';
3
+ interface AppProviderProps {
4
+ /**
5
+ * Initial color mode.
6
+ */
7
+ defaultColorMode?: ColorMode;
8
+ /**
9
+ * Theme settings.
10
+ */
11
+ defaultTheme?: Theme;
12
+ /**
13
+ * App content.
14
+ */
15
+ children: React.ReactNode;
16
+ }
17
+ /**
18
+ * __App provider__
19
+ *
20
+ * An app provider provides app level configuration such as global theming.
21
+ *
22
+ * Place it at the root of your application.
23
+ */
24
+ export declare function AppProvider({ children, defaultColorMode, defaultTheme, }: AppProviderProps): JSX.Element;
25
+ export default AppProvider;
@@ -0,0 +1,2 @@
1
+ export { default } from './app-provider';
2
+ export { useColorMode, useSetColorMode, useSetTheme, useTheme, } from './theme-provider';
@@ -0,0 +1,43 @@
1
+ import React from 'react';
2
+ import { type ThemeState } from '@atlaskit/tokens';
3
+ export type Theme = Omit<ThemeState, 'colorMode'>;
4
+ export type ColorMode = 'light' | 'dark' | 'auto';
5
+ export type ReconciledColorMode = Exclude<ColorMode, 'auto'>;
6
+ /**
7
+ * __useColorMode()__
8
+ *
9
+ * Returns the current color mode when inside the app provider.
10
+ */
11
+ export declare function useColorMode(): ReconciledColorMode;
12
+ /**
13
+ * __useSetColorMode()__
14
+ *
15
+ * Returns the color mode setter when inside the app provider.
16
+ */
17
+ export declare function useSetColorMode(): (value: ColorMode) => void;
18
+ /**
19
+ * __useTheme()__
20
+ *
21
+ * Returns the current theme settings when inside the app provider.
22
+ */
23
+ export declare function useTheme(): Theme;
24
+ /**
25
+ * __useSetTheme()__
26
+ *
27
+ * Returns the theme setter when inside the app provider.
28
+ */
29
+ export declare function useSetTheme(): (value: Partial<Theme>) => void;
30
+ interface ThemeProviderProps {
31
+ defaultColorMode: ColorMode;
32
+ defaultTheme: Theme;
33
+ children: React.ReactNode;
34
+ }
35
+ /**
36
+ * __Theme provider__
37
+ *
38
+ * Provides global theming configuration.
39
+ *
40
+ * @internal
41
+ */
42
+ export declare function ThemeProvider({ children, defaultColorMode, defaultTheme, }: ThemeProviderProps): JSX.Element;
43
+ export default ThemeProvider;
package/package.json ADDED
@@ -0,0 +1,98 @@
1
+ {
2
+ "name": "@atlaskit/app-provider",
3
+ "version": "0.1.0",
4
+ "description": "A top level provider for the Design System.",
5
+ "author": "Atlassian Pty Ltd",
6
+ "license": "Apache-2.0",
7
+ "publishConfig": {
8
+ "registry": "https://registry.npmjs.org/"
9
+ },
10
+ "atlassian": {
11
+ "team": "Design System Team",
12
+ "inPublicMirror": false,
13
+ "releaseModel": "continuous",
14
+ "website": {
15
+ "name": "App provider",
16
+ "category": "Components",
17
+ "status": {
18
+ "type": "alpha"
19
+ }
20
+ }
21
+ },
22
+ "repository": "https://bitbucket.org/atlassian/atlassian-frontend-mirror",
23
+ "main": "dist/cjs/index.js",
24
+ "module": "dist/esm/index.js",
25
+ "module:es2019": "dist/es2019/index.js",
26
+ "types": "dist/types/index.d.ts",
27
+ "typesVersions": {
28
+ ">=4.5 <4.9": {
29
+ "*": [
30
+ "dist/types-ts4.5/*",
31
+ "dist/types-ts4.5/index.d.ts"
32
+ ]
33
+ }
34
+ },
35
+ "sideEffects": false,
36
+ "atlaskit:src": "src/index.tsx",
37
+ "af:exports": {
38
+ ".": "./src/index.tsx"
39
+ },
40
+ "dependencies": {
41
+ "@atlaskit/tokens": "^1.19.0",
42
+ "@babel/runtime": "^7.0.0",
43
+ "bind-event-listener": "^2.1.1"
44
+ },
45
+ "peerDependencies": {
46
+ "react": "^16.8.0"
47
+ },
48
+ "devDependencies": {
49
+ "@af/visual-regression": "*",
50
+ "@atlaskit/dropdown-menu": "*",
51
+ "@atlaskit/primitives": "*",
52
+ "@atlaskit/ssr": "*",
53
+ "@atlaskit/visual-regression": "*",
54
+ "@atlaskit/webdriver-runner": "*",
55
+ "@atlassian/atlassian-frontend-prettier-config-1.0.0": "npm:@atlassian/atlassian-frontend-prettier-config@1.0.0",
56
+ "@testing-library/react": "^12.1.5",
57
+ "@testing-library/react-hooks": "^8.0.1",
58
+ "@testing-library/user-event": "^14.4.3",
59
+ "react-dom": "^16.8.0",
60
+ "typescript": "~4.9.5",
61
+ "wait-for-expect": "^1.2.0"
62
+ },
63
+ "techstack": {
64
+ "@atlassian/frontend": {
65
+ "import-structure": [
66
+ "atlassian-conventions"
67
+ ],
68
+ "circular-dependencies": [
69
+ "file-and-folder-level"
70
+ ]
71
+ },
72
+ "@repo/internal": {
73
+ "dom-events": "use-bind-event-listener",
74
+ "analytics": [
75
+ "analytics-next"
76
+ ],
77
+ "design-tokens": [
78
+ "color",
79
+ "spacing"
80
+ ],
81
+ "ui-components": [
82
+ "lite-mode"
83
+ ],
84
+ "deprecation": [
85
+ "no-deprecated-imports"
86
+ ],
87
+ "styling": [
88
+ "static",
89
+ "emotion"
90
+ ],
91
+ "imports": [
92
+ "import-no-extraneous-disable-for-examples-and-docs"
93
+ ]
94
+ }
95
+ },
96
+ "homepage": "https://atlassian.design/components",
97
+ "prettier": "@atlassian/atlassian-frontend-prettier-config-1.0.0"
98
+ }
package/report.api.md ADDED
@@ -0,0 +1,72 @@
1
+ <!-- API Report Version: 2.3 -->
2
+
3
+ ## API Report File for "@atlaskit/app-provider"
4
+
5
+ > Do not edit this file. This report is auto-generated using [API Extractor](https://api-extractor.com/).
6
+ > [Learn more about API reports](https://hello.atlassian.net/wiki/spaces/UR/pages/1825484529/Package+API+Reports)
7
+
8
+ ### Table of contents
9
+
10
+ - [Main Entry Types](#main-entry-types)
11
+ - [Peer Dependencies](#peer-dependencies)
12
+
13
+ ### Main Entry Types
14
+
15
+ <!--SECTION START: Main Entry Types-->
16
+
17
+ ```ts
18
+ import { default as React_2 } from 'react';
19
+ import { ThemeState } from '@atlaskit/tokens';
20
+
21
+ // @public
22
+ function AppProvider({
23
+ children,
24
+ defaultColorMode,
25
+ defaultTheme,
26
+ }: AppProviderProps): JSX.Element;
27
+ export default AppProvider;
28
+
29
+ // @public (undocumented)
30
+ interface AppProviderProps {
31
+ children: React_2.ReactNode;
32
+ defaultColorMode?: ColorMode;
33
+ defaultTheme?: Theme;
34
+ }
35
+
36
+ // @public (undocumented)
37
+ type ColorMode = 'auto' | 'dark' | 'light';
38
+
39
+ // @public (undocumented)
40
+ type ReconciledColorMode = Exclude<ColorMode, 'auto'>;
41
+
42
+ // @public (undocumented)
43
+ type Theme = Omit<ThemeState, 'colorMode'>;
44
+
45
+ // @public
46
+ export function useColorMode(): ReconciledColorMode;
47
+
48
+ // @public
49
+ export function useSetColorMode(): (value: ColorMode) => void;
50
+
51
+ // @public
52
+ export function useSetTheme(): (value: Partial<Theme>) => void;
53
+
54
+ // @public
55
+ export function useTheme(): Theme;
56
+
57
+ // (No @packageDocumentation comment for this package)
58
+ ```
59
+
60
+ <!--SECTION END: Main Entry Types-->
61
+
62
+ ### Peer Dependencies
63
+
64
+ <!--SECTION START: Peer Dependencies-->
65
+
66
+ ```json
67
+ {
68
+ "react": "^16.8.0"
69
+ }
70
+ ```
71
+
72
+ <!--SECTION END: Peer Dependencies-->
@@ -0,0 +1,44 @@
1
+ ## API Report File for "@atlaskit/app-provider"
2
+
3
+ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
4
+
5
+ ```ts
6
+
7
+ import { default as React_2 } from 'react';
8
+ import { ThemeState } from '@atlaskit/tokens';
9
+
10
+ // @public
11
+ function AppProvider({ children, defaultColorMode, defaultTheme, }: AppProviderProps): JSX.Element;
12
+ export default AppProvider;
13
+
14
+ // @public (undocumented)
15
+ interface AppProviderProps {
16
+ children: React_2.ReactNode;
17
+ defaultColorMode?: ColorMode;
18
+ defaultTheme?: Theme;
19
+ }
20
+
21
+ // @public (undocumented)
22
+ type ColorMode = 'auto' | 'dark' | 'light';
23
+
24
+ // @public (undocumented)
25
+ type ReconciledColorMode = Exclude<ColorMode, 'auto'>;
26
+
27
+ // @public (undocumented)
28
+ type Theme = Omit<ThemeState, 'colorMode'>;
29
+
30
+ // @public
31
+ export function useColorMode(): ReconciledColorMode;
32
+
33
+ // @public
34
+ export function useSetColorMode(): (value: ColorMode) => void;
35
+
36
+ // @public
37
+ export function useSetTheme(): (value: Partial<Theme>) => void;
38
+
39
+ // @public
40
+ export function useTheme(): Theme;
41
+
42
+ // (No @packageDocumentation comment for this package)
43
+
44
+ ```