@unisim/sdk 0.142.11 → 0.143.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.
Files changed (41) hide show
  1. package/README.md +82 -3
  2. package/dist/PreferencesDialog.d.ts +35 -0
  3. package/dist/PreferencesDialog.d.ts.map +1 -0
  4. package/dist/PreferencesDialog.js +174 -0
  5. package/dist/PreferencesDialog.js.map +1 -0
  6. package/dist/UniversalAppsNavBar.d.ts +26 -3
  7. package/dist/UniversalAppsNavBar.d.ts.map +1 -1
  8. package/dist/UniversalAppsNavBar.js +2 -2
  9. package/dist/UniversalAppsNavBar.js.map +1 -1
  10. package/dist/UniversalNavBar.d.ts +26 -1
  11. package/dist/UniversalNavBar.d.ts.map +1 -1
  12. package/dist/UniversalNavBar.js +12 -3
  13. package/dist/UniversalNavBar.js.map +1 -1
  14. package/dist/UserProfile.d.ts +40 -7
  15. package/dist/UserProfile.d.ts.map +1 -1
  16. package/dist/UserProfile.js +40 -63
  17. package/dist/UserProfile.js.map +1 -1
  18. package/dist/colorSchemeKeys.d.ts +9 -0
  19. package/dist/colorSchemeKeys.d.ts.map +1 -0
  20. package/dist/colorSchemeKeys.js +19 -0
  21. package/dist/colorSchemeKeys.js.map +1 -0
  22. package/dist/i18n.d.ts.map +1 -1
  23. package/dist/i18n.js +122 -0
  24. package/dist/i18n.js.map +1 -1
  25. package/dist/index.d.ts +5 -2
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +8 -2
  28. package/dist/index.js.map +1 -1
  29. package/dist/languageLabels.d.ts +3 -0
  30. package/dist/languageLabels.d.ts.map +1 -0
  31. package/dist/languageLabels.js +22 -0
  32. package/dist/languageLabels.js.map +1 -0
  33. package/dist/provider.d.ts +53 -5
  34. package/dist/provider.d.ts.map +1 -1
  35. package/dist/provider.js +251 -21
  36. package/dist/provider.js.map +1 -1
  37. package/dist/themeStore.d.ts +22 -9
  38. package/dist/themeStore.d.ts.map +1 -1
  39. package/dist/themeStore.js +62 -14
  40. package/dist/themeStore.js.map +1 -1
  41. package/package.json +2 -1
@@ -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 === 'light' || v === 'dark' || v === 'system')
16
+ if (isThemePref(v))
11
17
  return v;
12
18
  }
13
19
  catch { /* private mode / storage disabled */ }
14
- return 'light';
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 stored preference is read and applied to `<html>` immediately — at
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.** Changing it on an existing app
47
- * resets everyone's theme to light without a word. Existing apps keep the key
48
- * their copy used (`unisim-<app>-theme`); a new app should follow that pattern.
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 user has actually chosen `'system'`.
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
- const setPref = (next) => {
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
- window.localStorage.setItem(storageKey, next);
76
+ if (value)
77
+ window.localStorage.setItem(storageKey, value);
78
+ else
79
+ window.localStorage.removeItem(storageKey);
59
80
  }
60
81
  catch { /* ignore */ }
61
- state = { pref: next, effective: apply(next), setPref };
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
- const initial = hasDom() ? readStored(storageKey) : 'light';
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) => {
@@ -1 +1 @@
1
- {"version":3,"file":"themeStore.js","sourceRoot":"","sources":["../src/themeStore.ts"],"names":[],"mappings":"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"}
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.142.11",
3
+ "version": "0.143.0",
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",