@jobber/components 8.25.2 → 8.26.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/dist/AtlantisThemeContext/AtlantisThemeContext.d.ts +1 -1
- package/dist/AtlantisThemeContext/index.cjs +1 -2
- package/dist/AtlantisThemeContext/index.mjs +1 -2
- package/dist/AtlantisThemeContext/themeStore.d.ts +11 -0
- package/dist/AtlantisThemeContext/types.d.ts +14 -0
- package/dist/AtlantisThemeContext/updateTheme.d.ts +1 -1
- package/dist/AtlantisThemeContext-cjs.js +58 -17
- package/dist/AtlantisThemeContext-es.js +60 -20
- package/dist/DatePicker-es.js +1 -1
- package/dist/docs/AtlantisThemeContext/AtlantisThemeContext.md +41 -0
- package/dist/index.cjs +1 -2
- package/dist/index.mjs +1 -2
- package/dist/isTypedArray-es.js +1 -1
- package/dist/useScrollToActive-es.js +1 -1
- package/package.json +2 -2
- package/dist/updateTheme-cjs.js +0 -20
- package/dist/updateTheme-es.js +0 -18
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import type { AtlantisThemeContextProviderProps, AtlantisThemeContextValue } from "./types";
|
|
3
3
|
export declare const atlantisThemeContextDefaultValues: AtlantisThemeContextValue;
|
|
4
|
-
export declare function AtlantisThemeContextProvider({ children, dangerouslyOverrideTheme, dangerouslyOverrideTokens, }: AtlantisThemeContextProviderProps): React.JSX.Element;
|
|
4
|
+
export declare function AtlantisThemeContextProvider({ children, dangerouslyOverrideTheme, dangerouslyOverrideTokens, storageKey, }: AtlantisThemeContextProviderProps): React.JSX.Element;
|
|
5
5
|
export declare function useAtlantisTheme(): AtlantisThemeContextValue;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var AtlantisThemeContext = require('../AtlantisThemeContext-cjs.js');
|
|
4
|
-
var updateTheme = require('../updateTheme-cjs.js');
|
|
5
4
|
require('@jobber/design');
|
|
6
5
|
require('react');
|
|
7
6
|
require('../_commonjsHelpers-cjs.js');
|
|
@@ -19,5 +18,5 @@ require('../_setToString-cjs.js');
|
|
|
19
18
|
exports.AtlantisThemeContextProvider = AtlantisThemeContext.AtlantisThemeContextProvider;
|
|
20
19
|
exports.THEME_CHANGE_EVENT = AtlantisThemeContext.THEME_CHANGE_EVENT;
|
|
21
20
|
exports.atlantisThemeContextDefaultValues = AtlantisThemeContext.atlantisThemeContextDefaultValues;
|
|
21
|
+
exports.updateTheme = AtlantisThemeContext.updateTheme;
|
|
22
22
|
exports.useAtlantisTheme = AtlantisThemeContext.useAtlantisTheme;
|
|
23
|
-
exports.updateTheme = updateTheme.updateTheme;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
export { A as AtlantisThemeContextProvider, T as THEME_CHANGE_EVENT, a as atlantisThemeContextDefaultValues, u as useAtlantisTheme } from '../AtlantisThemeContext-es.js';
|
|
2
|
-
export { u as updateTheme } from '../updateTheme-es.js';
|
|
1
|
+
export { A as AtlantisThemeContextProvider, T as THEME_CHANGE_EVENT, a as atlantisThemeContextDefaultValues, b as updateTheme, u as useAtlantisTheme } from '../AtlantisThemeContext-es.js';
|
|
3
2
|
import '@jobber/design';
|
|
4
3
|
import 'react';
|
|
5
4
|
import '../_commonjsHelpers-es.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Theme } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* `useSyncExternalStore` source for the theme. `data-theme` on the document
|
|
4
|
+
* element is the source of truth: `updateTheme` writes it and dispatches
|
|
5
|
+
* `THEME_CHANGE_EVENT`, which this store subscribes to.
|
|
6
|
+
*/
|
|
7
|
+
export declare const themeStore: {
|
|
8
|
+
readonly subscribe: (onStoreChange: () => void) => () => void;
|
|
9
|
+
readonly getSnapshot: () => Theme;
|
|
10
|
+
readonly getServerSnapshot: () => Theme;
|
|
11
|
+
};
|
|
@@ -32,6 +32,20 @@ export interface AtlantisThemeContextProviderProps extends PropsWithChildren {
|
|
|
32
32
|
* **Important**: you should provide a constant or at least a memoized value for performance reasons.
|
|
33
33
|
*/
|
|
34
34
|
readonly dangerouslyOverrideTokens?: OverrideTokens;
|
|
35
|
+
/**
|
|
36
|
+
* The `localStorage` key your app writes to when toggling the theme (e.g.
|
|
37
|
+
* `"jobber_theme"`). When set, the provider listens for `window` `storage`
|
|
38
|
+
* events on this key and applies theme changes signalled by other browser
|
|
39
|
+
* tabs. Writing to `localStorage` remains the app's responsibility; Atlantis
|
|
40
|
+
* only handles the listen-and-react side.
|
|
41
|
+
*
|
|
42
|
+
* Cross-tab sync is opt-in: omit this prop and no `storage` listener is added,
|
|
43
|
+
* preserving the previous within-tab-only behavior.
|
|
44
|
+
*
|
|
45
|
+
* Has no effect when `dangerouslyOverrideTheme` is set, since that provider
|
|
46
|
+
* is intentionally isolated from the shared theme store.
|
|
47
|
+
*/
|
|
48
|
+
readonly storageKey?: string;
|
|
35
49
|
}
|
|
36
50
|
export type OverrideTokens = {
|
|
37
51
|
[K in keyof typeof tokens]?: (typeof tokens)[K];
|
|
@@ -2,6 +2,6 @@ import type { Theme } from "./types";
|
|
|
2
2
|
/**
|
|
3
3
|
* Toggle the theme of the application. If subscribed, the tokens will be updated accordingly.
|
|
4
4
|
* Will add data-theme="<newTheme>" to the <html> element.
|
|
5
|
-
* Will dispatch a custom event "atlantis.toggle-theme"
|
|
5
|
+
* Will dispatch a custom event "atlantis.toggle-theme" that theme providers subscribe to.
|
|
6
6
|
*/
|
|
7
7
|
export declare function updateTheme(theme: Theme): void;
|
|
@@ -340,9 +340,45 @@ var merge_1 = merge;
|
|
|
340
340
|
|
|
341
341
|
var merge$1 = /*@__PURE__*/_commonjsHelpers.getDefaultExportFromCjs(merge_1);
|
|
342
342
|
|
|
343
|
+
var styles = {"staticThemeProviderWrapper":"P6HrDSaI0Ac-","overrideTokensWrapper":"j-NMCOBL3-E-","spinning":"iq03qkKnXBA-"};
|
|
344
|
+
|
|
343
345
|
const THEME_CHANGE_EVENT = "atlantis.toggle-theme";
|
|
344
346
|
|
|
345
|
-
|
|
347
|
+
/**
|
|
348
|
+
* `useSyncExternalStore` source for the theme. `data-theme` on the document
|
|
349
|
+
* element is the source of truth: `updateTheme` writes it and dispatches
|
|
350
|
+
* `THEME_CHANGE_EVENT`, which this store subscribes to.
|
|
351
|
+
*/
|
|
352
|
+
const themeStore = {
|
|
353
|
+
subscribe(onStoreChange) {
|
|
354
|
+
globalThis.window.addEventListener(THEME_CHANGE_EVENT, onStoreChange);
|
|
355
|
+
return () => {
|
|
356
|
+
globalThis.window.removeEventListener(THEME_CHANGE_EVENT, onStoreChange);
|
|
357
|
+
};
|
|
358
|
+
},
|
|
359
|
+
getSnapshot() {
|
|
360
|
+
var _a, _b, _c, _d;
|
|
361
|
+
return ((_d = (_c = (_b = (_a = globalThis.document) === null || _a === void 0 ? void 0 : _a.documentElement) === null || _b === void 0 ? void 0 : _b.dataset) === null || _c === void 0 ? void 0 : _c.theme) !== null && _d !== void 0 ? _d : "light");
|
|
362
|
+
},
|
|
363
|
+
getServerSnapshot() {
|
|
364
|
+
return "light";
|
|
365
|
+
},
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Toggle the theme of the application. If subscribed, the tokens will be updated accordingly.
|
|
370
|
+
* Will add data-theme="<newTheme>" to the <html> element.
|
|
371
|
+
* Will dispatch a custom event "atlantis.toggle-theme" that theme providers subscribe to.
|
|
372
|
+
*/
|
|
373
|
+
function updateTheme(theme) {
|
|
374
|
+
if (!globalThis.window)
|
|
375
|
+
return;
|
|
376
|
+
globalThis.document.documentElement.setAttribute("data-theme", theme);
|
|
377
|
+
const event = new CustomEvent(THEME_CHANGE_EVENT, {
|
|
378
|
+
detail: { theme },
|
|
379
|
+
});
|
|
380
|
+
globalThis.window.dispatchEvent(event);
|
|
381
|
+
}
|
|
346
382
|
|
|
347
383
|
const atlantisThemeContextDefaultValues = {
|
|
348
384
|
theme: "light",
|
|
@@ -350,31 +386,35 @@ const atlantisThemeContextDefaultValues = {
|
|
|
350
386
|
};
|
|
351
387
|
const actualDarkTokens = merge$1({}, design.tokens, design.darkTokens);
|
|
352
388
|
const AtlantisThemeContext = React.createContext(atlantisThemeContextDefaultValues);
|
|
353
|
-
function AtlantisThemeContextProvider({ children, dangerouslyOverrideTheme, dangerouslyOverrideTokens, }) {
|
|
389
|
+
function AtlantisThemeContextProvider({ children, dangerouslyOverrideTheme, dangerouslyOverrideTokens, storageKey, }) {
|
|
354
390
|
if (dangerouslyOverrideTheme) {
|
|
355
391
|
return (React.createElement(InternalStaticThemeProvider, { dangerouslyOverrideTokens: dangerouslyOverrideTokens, dangerouslyOverrideTheme: dangerouslyOverrideTheme }, children));
|
|
356
392
|
}
|
|
357
|
-
return (React.createElement(InternalDynamicThemeProvider, { dangerouslyOverrideTokens: dangerouslyOverrideTokens }, children));
|
|
393
|
+
return (React.createElement(InternalDynamicThemeProvider, { dangerouslyOverrideTokens: dangerouslyOverrideTokens, storageKey: storageKey }, children));
|
|
358
394
|
}
|
|
359
|
-
function InternalDynamicThemeProvider({ children, dangerouslyOverrideTokens, }) {
|
|
360
|
-
|
|
361
|
-
const
|
|
362
|
-
const [internalTheme, setInternalTheme] = React.useState(initialTheme);
|
|
363
|
-
const { finalTokens, cssVariableOverrides } = useTokens(internalTheme, dangerouslyOverrideTokens);
|
|
364
|
-
const handleThemeChangeEvent = React.useCallback((event) => {
|
|
365
|
-
const newTheme = event.detail.theme;
|
|
366
|
-
setInternalTheme(newTheme);
|
|
367
|
-
}, []);
|
|
395
|
+
function InternalDynamicThemeProvider({ children, dangerouslyOverrideTokens, storageKey, }) {
|
|
396
|
+
const theme = React.useSyncExternalStore(themeStore.subscribe, themeStore.getSnapshot, themeStore.getServerSnapshot);
|
|
397
|
+
const { finalTokens, cssVariableOverrides } = useTokens(theme, dangerouslyOverrideTokens);
|
|
368
398
|
React.useEffect(() => {
|
|
369
|
-
if (!globalThis.window)
|
|
399
|
+
if (!storageKey || !globalThis.window)
|
|
370
400
|
return;
|
|
371
|
-
|
|
401
|
+
function handleStorage(event) {
|
|
402
|
+
if (event.key !== storageKey)
|
|
403
|
+
return;
|
|
404
|
+
const next = event.newValue;
|
|
405
|
+
if (next !== "light" && next !== "dark")
|
|
406
|
+
return;
|
|
407
|
+
if (next === themeStore.getSnapshot())
|
|
408
|
+
return;
|
|
409
|
+
updateTheme(next);
|
|
410
|
+
}
|
|
411
|
+
globalThis.window.addEventListener("storage", handleStorage);
|
|
372
412
|
return () => {
|
|
373
|
-
globalThis.window.removeEventListener(
|
|
413
|
+
globalThis.window.removeEventListener("storage", handleStorage);
|
|
374
414
|
};
|
|
375
|
-
}, [
|
|
415
|
+
}, [storageKey]);
|
|
376
416
|
return (React.createElement(AtlantisThemeContext.Provider, { value: {
|
|
377
|
-
theme:
|
|
417
|
+
theme: theme,
|
|
378
418
|
tokens: finalTokens,
|
|
379
419
|
overrideTokens: dangerouslyOverrideTokens,
|
|
380
420
|
} }, cssVariableOverrides ? (React.createElement("div", { className: styles.overrideTokensWrapper, style: cssVariableOverrides }, children)) : (children)));
|
|
@@ -419,4 +459,5 @@ function useTokens(theme, overrideTokens) {
|
|
|
419
459
|
exports.AtlantisThemeContextProvider = AtlantisThemeContextProvider;
|
|
420
460
|
exports.THEME_CHANGE_EVENT = THEME_CHANGE_EVENT;
|
|
421
461
|
exports.atlantisThemeContextDefaultValues = atlantisThemeContextDefaultValues;
|
|
462
|
+
exports.updateTheme = updateTheme;
|
|
422
463
|
exports.useAtlantisTheme = useAtlantisTheme;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { tokens, darkTokens } from '@jobber/design';
|
|
2
|
-
import React__default, { createContext,
|
|
2
|
+
import React__default, { createContext, useSyncExternalStore, useEffect, useContext, useMemo } from 'react';
|
|
3
3
|
import { g as getDefaultExportFromCjs } from './_commonjsHelpers-es.js';
|
|
4
4
|
import { e as eq_1, c as _Stack } from './identity-es.js';
|
|
5
5
|
import { _ as _baseAssignValue } from './_baseAssignValue-es.js';
|
|
6
6
|
import { _ as _baseFor } from './_baseFor-es.js';
|
|
7
7
|
import { _ as _copyObject, k as keysIn_1, a as _cloneBufferExports, b as _cloneTypedArray, c as _copyArray, d as _initCloneObject, i as isPlainObject_1 } from './keysIn-es.js';
|
|
8
|
-
import { b as isArrayLike_1, i as isArguments_1, a as isArray_1, c as isBufferExports,
|
|
8
|
+
import { b as isArrayLike_1, i as isArguments_1, a as isArray_1, c as isBufferExports, k as isFunction_1, d as isTypedArray_1 } from './isTypedArray-es.js';
|
|
9
9
|
import { i as isObjectLike_1, a as isObject_1 } from './isObjectLike-es.js';
|
|
10
10
|
import { _ as _baseRest, a as _isIterateeCall } from './_isIterateeCall-es.js';
|
|
11
11
|
|
|
@@ -338,9 +338,45 @@ var merge_1 = merge;
|
|
|
338
338
|
|
|
339
339
|
var merge$1 = /*@__PURE__*/getDefaultExportFromCjs(merge_1);
|
|
340
340
|
|
|
341
|
+
var styles = {"staticThemeProviderWrapper":"P6HrDSaI0Ac-","overrideTokensWrapper":"j-NMCOBL3-E-","spinning":"iq03qkKnXBA-"};
|
|
342
|
+
|
|
341
343
|
const THEME_CHANGE_EVENT = "atlantis.toggle-theme";
|
|
342
344
|
|
|
343
|
-
|
|
345
|
+
/**
|
|
346
|
+
* `useSyncExternalStore` source for the theme. `data-theme` on the document
|
|
347
|
+
* element is the source of truth: `updateTheme` writes it and dispatches
|
|
348
|
+
* `THEME_CHANGE_EVENT`, which this store subscribes to.
|
|
349
|
+
*/
|
|
350
|
+
const themeStore = {
|
|
351
|
+
subscribe(onStoreChange) {
|
|
352
|
+
globalThis.window.addEventListener(THEME_CHANGE_EVENT, onStoreChange);
|
|
353
|
+
return () => {
|
|
354
|
+
globalThis.window.removeEventListener(THEME_CHANGE_EVENT, onStoreChange);
|
|
355
|
+
};
|
|
356
|
+
},
|
|
357
|
+
getSnapshot() {
|
|
358
|
+
var _a, _b, _c, _d;
|
|
359
|
+
return ((_d = (_c = (_b = (_a = globalThis.document) === null || _a === void 0 ? void 0 : _a.documentElement) === null || _b === void 0 ? void 0 : _b.dataset) === null || _c === void 0 ? void 0 : _c.theme) !== null && _d !== void 0 ? _d : "light");
|
|
360
|
+
},
|
|
361
|
+
getServerSnapshot() {
|
|
362
|
+
return "light";
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Toggle the theme of the application. If subscribed, the tokens will be updated accordingly.
|
|
368
|
+
* Will add data-theme="<newTheme>" to the <html> element.
|
|
369
|
+
* Will dispatch a custom event "atlantis.toggle-theme" that theme providers subscribe to.
|
|
370
|
+
*/
|
|
371
|
+
function updateTheme(theme) {
|
|
372
|
+
if (!globalThis.window)
|
|
373
|
+
return;
|
|
374
|
+
globalThis.document.documentElement.setAttribute("data-theme", theme);
|
|
375
|
+
const event = new CustomEvent(THEME_CHANGE_EVENT, {
|
|
376
|
+
detail: { theme },
|
|
377
|
+
});
|
|
378
|
+
globalThis.window.dispatchEvent(event);
|
|
379
|
+
}
|
|
344
380
|
|
|
345
381
|
const atlantisThemeContextDefaultValues = {
|
|
346
382
|
theme: "light",
|
|
@@ -348,31 +384,35 @@ const atlantisThemeContextDefaultValues = {
|
|
|
348
384
|
};
|
|
349
385
|
const actualDarkTokens = merge$1({}, tokens, darkTokens);
|
|
350
386
|
const AtlantisThemeContext = createContext(atlantisThemeContextDefaultValues);
|
|
351
|
-
function AtlantisThemeContextProvider({ children, dangerouslyOverrideTheme, dangerouslyOverrideTokens, }) {
|
|
387
|
+
function AtlantisThemeContextProvider({ children, dangerouslyOverrideTheme, dangerouslyOverrideTokens, storageKey, }) {
|
|
352
388
|
if (dangerouslyOverrideTheme) {
|
|
353
389
|
return (React__default.createElement(InternalStaticThemeProvider, { dangerouslyOverrideTokens: dangerouslyOverrideTokens, dangerouslyOverrideTheme: dangerouslyOverrideTheme }, children));
|
|
354
390
|
}
|
|
355
|
-
return (React__default.createElement(InternalDynamicThemeProvider, { dangerouslyOverrideTokens: dangerouslyOverrideTokens }, children));
|
|
391
|
+
return (React__default.createElement(InternalDynamicThemeProvider, { dangerouslyOverrideTokens: dangerouslyOverrideTokens, storageKey: storageKey }, children));
|
|
356
392
|
}
|
|
357
|
-
function InternalDynamicThemeProvider({ children, dangerouslyOverrideTokens, }) {
|
|
358
|
-
|
|
359
|
-
const
|
|
360
|
-
const [internalTheme, setInternalTheme] = useState(initialTheme);
|
|
361
|
-
const { finalTokens, cssVariableOverrides } = useTokens(internalTheme, dangerouslyOverrideTokens);
|
|
362
|
-
const handleThemeChangeEvent = useCallback((event) => {
|
|
363
|
-
const newTheme = event.detail.theme;
|
|
364
|
-
setInternalTheme(newTheme);
|
|
365
|
-
}, []);
|
|
393
|
+
function InternalDynamicThemeProvider({ children, dangerouslyOverrideTokens, storageKey, }) {
|
|
394
|
+
const theme = useSyncExternalStore(themeStore.subscribe, themeStore.getSnapshot, themeStore.getServerSnapshot);
|
|
395
|
+
const { finalTokens, cssVariableOverrides } = useTokens(theme, dangerouslyOverrideTokens);
|
|
366
396
|
useEffect(() => {
|
|
367
|
-
if (!globalThis.window)
|
|
397
|
+
if (!storageKey || !globalThis.window)
|
|
368
398
|
return;
|
|
369
|
-
|
|
399
|
+
function handleStorage(event) {
|
|
400
|
+
if (event.key !== storageKey)
|
|
401
|
+
return;
|
|
402
|
+
const next = event.newValue;
|
|
403
|
+
if (next !== "light" && next !== "dark")
|
|
404
|
+
return;
|
|
405
|
+
if (next === themeStore.getSnapshot())
|
|
406
|
+
return;
|
|
407
|
+
updateTheme(next);
|
|
408
|
+
}
|
|
409
|
+
globalThis.window.addEventListener("storage", handleStorage);
|
|
370
410
|
return () => {
|
|
371
|
-
globalThis.window.removeEventListener(
|
|
411
|
+
globalThis.window.removeEventListener("storage", handleStorage);
|
|
372
412
|
};
|
|
373
|
-
}, [
|
|
413
|
+
}, [storageKey]);
|
|
374
414
|
return (React__default.createElement(AtlantisThemeContext.Provider, { value: {
|
|
375
|
-
theme:
|
|
415
|
+
theme: theme,
|
|
376
416
|
tokens: finalTokens,
|
|
377
417
|
overrideTokens: dangerouslyOverrideTokens,
|
|
378
418
|
} }, cssVariableOverrides ? (React__default.createElement("div", { className: styles.overrideTokensWrapper, style: cssVariableOverrides }, children)) : (children)));
|
|
@@ -414,4 +454,4 @@ function useTokens(theme, overrideTokens) {
|
|
|
414
454
|
};
|
|
415
455
|
}
|
|
416
456
|
|
|
417
|
-
export { AtlantisThemeContextProvider as A, THEME_CHANGE_EVENT as T, atlantisThemeContextDefaultValues as a, useAtlantisTheme as u };
|
|
457
|
+
export { AtlantisThemeContextProvider as A, THEME_CHANGE_EVENT as T, atlantisThemeContextDefaultValues as a, updateTheme as b, useAtlantisTheme as u };
|
package/dist/DatePicker-es.js
CHANGED
|
@@ -13,7 +13,7 @@ import { c as _Stack } from './identity-es.js';
|
|
|
13
13
|
import { _ as _copyObject, k as keysIn_1, e as _getPrototype, f as _cloneArrayBuffer, b as _cloneTypedArray, a as _cloneBufferExports, c as _copyArray, d as _initCloneObject, g as _assignValue, i as isPlainObject_1 } from './keysIn-es.js';
|
|
14
14
|
import { a as _getTag } from './_getTag-es.js';
|
|
15
15
|
import { b as _Symbol, i as isObjectLike_1, a as isObject_1 } from './isObjectLike-es.js';
|
|
16
|
-
import { m as _nodeUtilExports,
|
|
16
|
+
import { m as _nodeUtilExports, j as _baseUnary, c as isBufferExports, a as isArray_1 } from './isTypedArray-es.js';
|
|
17
17
|
import { _ as _baseFlatten } from './_baseFlatten-es.js';
|
|
18
18
|
import { _ as _overRest, a as _setToString } from './_setToString-es.js';
|
|
19
19
|
import { u as useAtlantisContext } from './AtlantisContext-es.js';
|
|
@@ -116,6 +116,46 @@ function ThemedComponent() {
|
|
|
116
116
|
}
|
|
117
117
|
```
|
|
118
118
|
|
|
119
|
+
### Cross-tab theme sync (Web Only)
|
|
120
|
+
|
|
121
|
+
The provider can keep the theme in sync across a user's open browser tabs. This
|
|
122
|
+
is opt-in: pass the `localStorage` key your app writes to as the `storageKey`
|
|
123
|
+
prop. The provider then listens for
|
|
124
|
+
[`storage` events](https://developer.mozilla.org/en-US/docs/Web/API/Window/storage_event)
|
|
125
|
+
on that key and applies theme changes from other tabs. The `storage` event fires
|
|
126
|
+
only in tabs *other* than the one that wrote the value, so there's no feedback
|
|
127
|
+
loop.
|
|
128
|
+
|
|
129
|
+
**Your app is responsible for writing to `localStorage`** when the theme changes
|
|
130
|
+
— Atlantis only handles the listen-and-react side.
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
<AtlantisThemeContextProvider storageKey="my_app_theme">
|
|
134
|
+
<ThemedComponent />
|
|
135
|
+
</AtlantisThemeContextProvider>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
```tsx
|
|
139
|
+
// Theme toggle — write to the same key after calling updateTheme
|
|
140
|
+
import { updateTheme } from "@jobber/components/AtlantisThemeContext";
|
|
141
|
+
|
|
142
|
+
function toggleTheme(newTheme: "light" | "dark") {
|
|
143
|
+
updateTheme(newTheme); // updates all providers in this tab immediately
|
|
144
|
+
|
|
145
|
+
try {
|
|
146
|
+
localStorage.setItem("my_app_theme", newTheme); // signals other tabs
|
|
147
|
+
} catch {
|
|
148
|
+
// localStorage unavailable (e.g. private mode) — degrades gracefully
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Omit `storageKey` and no `storage` listener is added, keeping the previous
|
|
154
|
+
within-tab-only behavior. Multiple dynamic providers on the same page all share
|
|
155
|
+
the same internal store, so a single provider with a `storageKey` is enough — a
|
|
156
|
+
cross-tab signal updates every dynamic provider at once. Providers mounted with
|
|
157
|
+
`dangerouslyOverrideTheme` are unaffected.
|
|
158
|
+
|
|
119
159
|
### Forcing a theme for an AtlantisThemeContextProvider
|
|
120
160
|
|
|
121
161
|
In some scenarios you may want to force a theme for specific components
|
|
@@ -255,3 +295,4 @@ Key features:
|
|
|
255
295
|
| `children` | `ReactNode` | Yes | — | The children to render. |
|
|
256
296
|
| `dangerouslyOverrideTheme` | `Theme` | No | — | Force the theme for this provider to always be the same as the provided theme. Useful for sections that should remain... |
|
|
257
297
|
| `dangerouslyOverrideTokens` | `OverrideTokens` | No | — | Overrides existing design tokens with custom values. Can also supply custom tokens which will be accessible via useAt... |
|
|
298
|
+
| `storageKey` | `string` | No | — | The `localStorage` key your app writes to when toggling the theme (e.g. `"jobber_theme"`). When set, the provider lis... |
|
package/dist/index.cjs
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
var ActivityIndicator = require('./ActivityIndicator-cjs.js');
|
|
4
4
|
var AtlantisContext = require('./AtlantisContext-cjs.js');
|
|
5
5
|
var AtlantisThemeContext = require('./AtlantisThemeContext-cjs.js');
|
|
6
|
-
var updateTheme = require('./updateTheme-cjs.js');
|
|
7
6
|
var Autocomplete = require('./Autocomplete-cjs.js');
|
|
8
7
|
var Avatar = require('./Avatar-cjs.js');
|
|
9
8
|
var Banner = require('./Banner-cjs.js');
|
|
@@ -215,8 +214,8 @@ exports.useAtlantisContext = AtlantisContext.useAtlantisContext;
|
|
|
215
214
|
exports.AtlantisThemeContextProvider = AtlantisThemeContext.AtlantisThemeContextProvider;
|
|
216
215
|
exports.THEME_CHANGE_EVENT = AtlantisThemeContext.THEME_CHANGE_EVENT;
|
|
217
216
|
exports.atlantisThemeContextDefaultValues = AtlantisThemeContext.atlantisThemeContextDefaultValues;
|
|
217
|
+
exports.updateTheme = AtlantisThemeContext.updateTheme;
|
|
218
218
|
exports.useAtlantisTheme = AtlantisThemeContext.useAtlantisTheme;
|
|
219
|
-
exports.updateTheme = updateTheme.updateTheme;
|
|
220
219
|
exports.Autocomplete = Autocomplete.Autocomplete;
|
|
221
220
|
exports.Avatar = Avatar.Avatar;
|
|
222
221
|
exports.Banner = Banner.Banner;
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export { A as ActivityIndicator } from './ActivityIndicator-es.js';
|
|
2
2
|
export { A as AtlantisContext, a as atlantisContextDefaultValues, u as useAtlantisContext } from './AtlantisContext-es.js';
|
|
3
|
-
export { A as AtlantisThemeContextProvider, T as THEME_CHANGE_EVENT, a as atlantisThemeContextDefaultValues, u as useAtlantisTheme } from './AtlantisThemeContext-es.js';
|
|
4
|
-
export { u as updateTheme } from './updateTheme-es.js';
|
|
3
|
+
export { A as AtlantisThemeContextProvider, T as THEME_CHANGE_EVENT, a as atlantisThemeContextDefaultValues, b as updateTheme, u as useAtlantisTheme } from './AtlantisThemeContext-es.js';
|
|
5
4
|
export { A as Autocomplete } from './Autocomplete-es.js';
|
|
6
5
|
export { A as Avatar } from './Avatar-es.js';
|
|
7
6
|
export { B as Banner } from './Banner-es.js';
|
package/dist/isTypedArray-es.js
CHANGED
|
@@ -586,4 +586,4 @@ var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedA
|
|
|
586
586
|
|
|
587
587
|
var isTypedArray_1 = isTypedArray;
|
|
588
588
|
|
|
589
|
-
export { _isPrototype as _, isArray_1 as a, isArrayLike_1 as b, isBufferExports as c, isTypedArray_1 as d, _overArg as e, _getNative as f, _Map as g, _toSource as h, isArguments_1 as i,
|
|
589
|
+
export { _isPrototype as _, isArray_1 as a, isArrayLike_1 as b, isBufferExports as c, isTypedArray_1 as d, _overArg as e, _getNative as f, _Map as g, _toSource as h, isArguments_1 as i, _baseUnary as j, isFunction_1 as k, isLength_1 as l, _nodeUtilExports as m };
|
|
@@ -3,7 +3,7 @@ import { g as getDefaultExportFromCjs } from './_commonjsHelpers-es.js';
|
|
|
3
3
|
import { _ as _baseFlatten } from './_baseFlatten-es.js';
|
|
4
4
|
import { a as _arrayMap, b as _baseGet } from './_getAllKeys-es.js';
|
|
5
5
|
import { _ as _baseEach, a as _baseIteratee } from './_baseEach-es.js';
|
|
6
|
-
import { b as isArrayLike_1,
|
|
6
|
+
import { b as isArrayLike_1, j as _baseUnary, a as isArray_1 } from './isTypedArray-es.js';
|
|
7
7
|
import { i as isSymbol_1 } from './isSymbol-es.js';
|
|
8
8
|
import { i as identity_1 } from './identity-es.js';
|
|
9
9
|
import { _ as _baseRest, a as _isIterateeCall } from './_isIterateeCall-es.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jobber/components",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.26.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -545,5 +545,5 @@
|
|
|
545
545
|
"> 1%",
|
|
546
546
|
"IE 10"
|
|
547
547
|
],
|
|
548
|
-
"gitHead": "
|
|
548
|
+
"gitHead": "4542a9c611cd00d7d25a48138bfed4365b3b0097"
|
|
549
549
|
}
|
package/dist/updateTheme-cjs.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var AtlantisThemeContext = require('./AtlantisThemeContext-cjs.js');
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Toggle the theme of the application. If subscribed, the tokens will be updated accordingly.
|
|
7
|
-
* Will add data-theme="<newTheme>" to the <html> element.
|
|
8
|
-
* Will dispatch a custom event "atlantis.toggle-theme" with the new theme for other providers to subscribe to.
|
|
9
|
-
*/
|
|
10
|
-
function updateTheme(theme) {
|
|
11
|
-
if (!globalThis.window)
|
|
12
|
-
return;
|
|
13
|
-
const event = new CustomEvent(AtlantisThemeContext.THEME_CHANGE_EVENT, {
|
|
14
|
-
detail: { theme },
|
|
15
|
-
});
|
|
16
|
-
globalThis.document.documentElement.setAttribute("data-theme", theme);
|
|
17
|
-
globalThis.window.dispatchEvent(event);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
exports.updateTheme = updateTheme;
|
package/dist/updateTheme-es.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { T as THEME_CHANGE_EVENT } from './AtlantisThemeContext-es.js';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Toggle the theme of the application. If subscribed, the tokens will be updated accordingly.
|
|
5
|
-
* Will add data-theme="<newTheme>" to the <html> element.
|
|
6
|
-
* Will dispatch a custom event "atlantis.toggle-theme" with the new theme for other providers to subscribe to.
|
|
7
|
-
*/
|
|
8
|
-
function updateTheme(theme) {
|
|
9
|
-
if (!globalThis.window)
|
|
10
|
-
return;
|
|
11
|
-
const event = new CustomEvent(THEME_CHANGE_EVENT, {
|
|
12
|
-
detail: { theme },
|
|
13
|
-
});
|
|
14
|
-
globalThis.document.documentElement.setAttribute("data-theme", theme);
|
|
15
|
-
globalThis.window.dispatchEvent(event);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export { updateTheme as u };
|