@unisim/sdk 0.142.11 → 0.143.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.
- package/README.md +82 -3
- package/dist/PreferencesDialog.d.ts +35 -0
- package/dist/PreferencesDialog.d.ts.map +1 -0
- package/dist/PreferencesDialog.js +174 -0
- package/dist/PreferencesDialog.js.map +1 -0
- package/dist/UniversalAppsNavBar.d.ts +26 -3
- package/dist/UniversalAppsNavBar.d.ts.map +1 -1
- package/dist/UniversalAppsNavBar.js +2 -2
- package/dist/UniversalAppsNavBar.js.map +1 -1
- package/dist/UniversalNavBar.d.ts +26 -1
- package/dist/UniversalNavBar.d.ts.map +1 -1
- package/dist/UniversalNavBar.js +12 -3
- package/dist/UniversalNavBar.js.map +1 -1
- package/dist/UserProfile.d.ts +40 -7
- package/dist/UserProfile.d.ts.map +1 -1
- package/dist/UserProfile.js +40 -63
- package/dist/UserProfile.js.map +1 -1
- package/dist/colorSchemeKeys.d.ts +9 -0
- package/dist/colorSchemeKeys.d.ts.map +1 -0
- package/dist/colorSchemeKeys.js +19 -0
- package/dist/colorSchemeKeys.js.map +1 -0
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +122 -0
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/languageLabels.d.ts +3 -0
- package/dist/languageLabels.d.ts.map +1 -0
- package/dist/languageLabels.js +22 -0
- package/dist/languageLabels.js.map +1 -0
- package/dist/provider.d.ts +53 -5
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +251 -21
- package/dist/provider.js.map +1 -1
- package/dist/themeStore.d.ts +22 -9
- package/dist/themeStore.d.ts.map +1 -1
- package/dist/themeStore.js +62 -14
- package/dist/themeStore.js.map +1 -1
- package/package.json +2 -1
package/dist/themeStore.js
CHANGED
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useSyncExternalStore } from 'react';
|
|
3
|
+
import { GLOBAL_COLOR_SCHEME_EVENT, GLOBAL_COLOR_SCHEME_KEY } from './colorSchemeKeys.js';
|
|
4
|
+
export { GLOBAL_COLOR_SCHEME_EVENT, GLOBAL_COLOR_SCHEME_KEY } from './colorSchemeKeys.js';
|
|
3
5
|
const DARK_QUERY = '(prefers-color-scheme: dark)';
|
|
4
6
|
function hasDom() {
|
|
5
7
|
return typeof window !== 'undefined' && typeof document !== 'undefined';
|
|
6
8
|
}
|
|
9
|
+
function isThemePref(v) {
|
|
10
|
+
return v === 'light' || v === 'dark' || v === 'system';
|
|
11
|
+
}
|
|
12
|
+
/** A valid stored preference, or `null` for absent, corrupt or unreadable. */
|
|
7
13
|
function readStored(storageKey) {
|
|
8
14
|
try {
|
|
9
15
|
const v = window.localStorage.getItem(storageKey);
|
|
10
|
-
if (v
|
|
16
|
+
if (isThemePref(v))
|
|
11
17
|
return v;
|
|
12
18
|
}
|
|
13
19
|
catch { /* private mode / storage disabled */ }
|
|
14
|
-
return
|
|
20
|
+
return null;
|
|
15
21
|
}
|
|
16
22
|
function osPrefersDark() {
|
|
17
23
|
try {
|
|
@@ -39,30 +45,55 @@ function apply(pref) {
|
|
|
39
45
|
* export const useThemeStore = createThemeStore('unisim-video-theme')
|
|
40
46
|
* ```
|
|
41
47
|
*
|
|
42
|
-
* The
|
|
48
|
+
* The resolved preference is read and applied to `<html>` immediately — at
|
|
43
49
|
* import time, before React renders — so a dark-mode user does not see a light
|
|
44
|
-
* frame first.
|
|
50
|
+
* frame first. Pass the store to the navbar (`themeStore={useThemeStore}`) and
|
|
51
|
+
* App preferences offers the override.
|
|
45
52
|
*
|
|
46
|
-
* ⚠️ **The key is the user's saved choice
|
|
47
|
-
*
|
|
48
|
-
*
|
|
53
|
+
* ⚠️ **The key is the user's saved choice** — since 0.143.0, their override of
|
|
54
|
+
* the global one. Changing it on an existing app silently puts everyone who
|
|
55
|
+
* chose something in that app back to following global. Existing apps keep
|
|
56
|
+
* the key their copy used (`unisim-<app>-theme`); a new app should follow that
|
|
57
|
+
* pattern.
|
|
49
58
|
*
|
|
50
|
-
* Only follows the OS live while the
|
|
59
|
+
* Only follows the OS live while the resolved preference is `'system'`.
|
|
51
60
|
*/
|
|
52
61
|
export function createThemeStore(storageKey) {
|
|
53
62
|
const listeners = new Set();
|
|
54
63
|
const emit = () => { for (const l of listeners)
|
|
55
64
|
l(); };
|
|
56
|
-
|
|
65
|
+
// Held in memory as well as in storage: when storage throws (private mode,
|
|
66
|
+
// blocked site data) these are the only copy, and a choice must still apply
|
|
67
|
+
// for the life of the page.
|
|
68
|
+
let override = hasDom() ? readStored(storageKey) : null;
|
|
69
|
+
let global = (hasDom() ? readStored(GLOBAL_COLOR_SCHEME_KEY) : null) ?? 'light';
|
|
70
|
+
// Declarations, not arrows: `state` is built from them below, and both must
|
|
71
|
+
// be the SAME function on every state object — a selector on `setPref` is
|
|
72
|
+
// what a component holds on to (see the "same function on every render" test).
|
|
73
|
+
function setOverride(next) {
|
|
74
|
+
const value = isThemePref(next) ? next : null;
|
|
57
75
|
try {
|
|
58
|
-
|
|
76
|
+
if (value)
|
|
77
|
+
window.localStorage.setItem(storageKey, value);
|
|
78
|
+
else
|
|
79
|
+
window.localStorage.removeItem(storageKey);
|
|
59
80
|
}
|
|
60
81
|
catch { /* ignore */ }
|
|
61
|
-
|
|
82
|
+
override = value;
|
|
83
|
+
commit();
|
|
84
|
+
}
|
|
85
|
+
function setPref(next) {
|
|
86
|
+
setOverride(next);
|
|
87
|
+
}
|
|
88
|
+
function resolve() {
|
|
89
|
+
const pref = override ?? global;
|
|
90
|
+
return { pref, effective: apply(pref), override, global, setOverride, setPref };
|
|
91
|
+
}
|
|
92
|
+
function commit() {
|
|
93
|
+
state = resolve();
|
|
62
94
|
emit();
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
let state = { pref: initial, effective: apply(initial), setPref };
|
|
95
|
+
}
|
|
96
|
+
let state = resolve();
|
|
66
97
|
if (hasDom()) {
|
|
67
98
|
try {
|
|
68
99
|
window.matchMedia?.(DARK_QUERY).addEventListener?.('change', () => {
|
|
@@ -73,6 +104,23 @@ export function createThemeStore(storageKey) {
|
|
|
73
104
|
});
|
|
74
105
|
}
|
|
75
106
|
catch { /* no matchMedia: 'system' resolves once and stays */ }
|
|
107
|
+
// The provider on this page changed the global. `detail` is trusted before
|
|
108
|
+
// storage: it is the value just chosen, and storage may be what threw.
|
|
109
|
+
window.addEventListener(GLOBAL_COLOR_SCHEME_EVENT, (e) => {
|
|
110
|
+
const detail = e.detail;
|
|
111
|
+
global = isThemePref(detail) ? detail : (readStored(GLOBAL_COLOR_SCHEME_KEY) ?? 'light');
|
|
112
|
+
commit();
|
|
113
|
+
});
|
|
114
|
+
// Another tab changed either key. `key === null` is a `localStorage.clear()`.
|
|
115
|
+
window.addEventListener('storage', (e) => {
|
|
116
|
+
if (e.key !== null && e.key !== storageKey && e.key !== GLOBAL_COLOR_SCHEME_KEY)
|
|
117
|
+
return;
|
|
118
|
+
if (e.key === null || e.key === storageKey)
|
|
119
|
+
override = readStored(storageKey);
|
|
120
|
+
if (e.key === null || e.key === GLOBAL_COLOR_SCHEME_KEY)
|
|
121
|
+
global = readStored(GLOBAL_COLOR_SCHEME_KEY) ?? 'light';
|
|
122
|
+
commit();
|
|
123
|
+
});
|
|
76
124
|
}
|
|
77
125
|
const getState = () => state;
|
|
78
126
|
const subscribe = (listener) => {
|
package/dist/themeStore.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"themeStore.js","sourceRoot":"","sources":["../src/themeStore.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"themeStore.js","sourceRoot":"","sources":["../src/themeStore.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unisim/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.143.1",
|
|
4
4
|
"description": "Shared React SDK for the Universal Suite — auth, entitlements, usage telemetry, changelog, org admin.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Universal Simulation Ltd",
|
|
@@ -78,6 +78,7 @@
|
|
|
78
78
|
"test:mock-auth": "npm run build && node tests/mock-auth-trial.browser.mjs",
|
|
79
79
|
"test:usage-tracker": "npm run build && node tests/usage-tracker.browser.mjs",
|
|
80
80
|
"test:theme-store": "npm run build && node tests/theme-store.browser.mjs",
|
|
81
|
+
"test:preferences": "npm run build && node tests/preferences-dialog.browser.mjs",
|
|
81
82
|
"test:contrast": "npm run build && node tests/contrast.mjs",
|
|
82
83
|
"test:chips": "npm run build && node tests/chips.browser.mjs",
|
|
83
84
|
"test:i18n": "npm run build && node tests/i18n.mjs",
|