@ngrok/mantle 0.0.2 → 0.0.3

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.
@@ -37,9 +37,9 @@ declare function useTheme(): ThemeProviderState;
37
37
  * determineThemeFromMediaQuery returns the theme that should be used based on the user's media query preferences.
38
38
  * @private
39
39
  */
40
- export declare function determineThemeFromMediaQuery({ prefersDarkMode, prefersContrastMore, }: {
40
+ export declare function determineThemeFromMediaQuery({ prefersDarkMode, prefersHighContrast, }: {
41
41
  prefersDarkMode: boolean;
42
- prefersContrastMore: boolean;
42
+ prefersHighContrast: boolean;
43
43
  }): "dark" | "light" | "light-high-contrast" | "dark-high-contrast";
44
44
  /**
45
45
  * PreventWrongThemeFlash is a React component that prevents the wrong theme from flashing on initial page load.
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  /**
3
- * @ngrok/mantle v0.0.2
3
+ * @ngrok/mantle v0.0.3
4
4
  *
5
5
  * Copyright (c) ngrok.
6
6
  *
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @ngrok/mantle v0.0.2
2
+ * @ngrok/mantle v0.0.3
3
3
  *
4
4
  * Copyright (c) ngrok.
5
5
  *
@@ -1193,15 +1193,19 @@ var isBrowser = function isBrowser() {
1193
1193
  return typeof window !== "undefined";
1194
1194
  };
1195
1195
  /**
1196
- * determines the initial theme based on the default theme and the value stored in localStorage by the storageKey
1196
+ * Gets the stored theme from localStorage or returns the default theme if no theme is stored.
1197
1197
  */
1198
- function determineInitialTheme(defaultTheme, storageKey) {
1199
- var fallback = defaultTheme != null ? defaultTheme : "system";
1198
+ function getStoredTheme(storageKey, defaultTheme) {
1199
+ var _defaultTheme;
1200
+ if (defaultTheme === void 0) {
1201
+ defaultTheme = "system";
1202
+ }
1203
+ var fallbackTheme = (_defaultTheme = defaultTheme) != null ? _defaultTheme : "system";
1200
1204
  if (isBrowser()) {
1201
- var _window$localStorage$;
1202
- return (_window$localStorage$ = window.localStorage.getItem(storageKey)) != null ? _window$localStorage$ : fallback;
1205
+ var storedTheme = window.localStorage.getItem(storageKey);
1206
+ return isTheme(storedTheme) ? storedTheme : fallbackTheme;
1203
1207
  }
1204
- return fallback;
1208
+ return fallbackTheme;
1205
1209
  }
1206
1210
  /**
1207
1211
  * ThemeProvider is a React Context Provider that provides the current theme and a function to set the theme.
@@ -1213,26 +1217,43 @@ function ThemeProvider(_ref) {
1213
1217
  _ref$storageKey = _ref.storageKey,
1214
1218
  storageKey = _ref$storageKey === void 0 ? DEFAULT_STORAGE_KEY : _ref$storageKey;
1215
1219
  var _useState = useState(function () {
1216
- var initialTheme = determineInitialTheme(defaultTheme, storageKey);
1220
+ var initialTheme = getStoredTheme(storageKey, defaultTheme);
1217
1221
  applyTheme(initialTheme);
1218
1222
  return initialTheme;
1219
1223
  }),
1220
1224
  theme = _useState[0],
1221
1225
  setTheme = _useState[1];
1222
1226
  useEffect(function () {
1223
- var storedTheme = window.localStorage.getItem(storageKey);
1224
- if (isTheme(storedTheme)) {
1225
- setTheme(storedTheme);
1226
- applyTheme(storedTheme);
1227
- }
1228
- }, [storageKey]);
1227
+ var storedTheme = getStoredTheme(storageKey, defaultTheme);
1228
+ setTheme(storedTheme);
1229
+ applyTheme(storedTheme);
1230
+ }, [defaultTheme, storageKey]);
1231
+ useEffect(function () {
1232
+ var prefersDarkMql = window.matchMedia(prefersDarkModeMediaQuery);
1233
+ var prefersHighContrastMql = window.matchMedia(prefersHighContrastMediaQuery);
1234
+ var onChange = function onChange() {
1235
+ var storedTheme = getStoredTheme(storageKey, defaultTheme);
1236
+ // If the stored theme is not "system", then the user has explicitly set a theme and we should not
1237
+ // automatically change the theme when the user's system preferences change.
1238
+ if (storedTheme !== "system") {
1239
+ return;
1240
+ }
1241
+ applyTheme("system");
1242
+ };
1243
+ prefersDarkMql.addEventListener("change", onChange);
1244
+ prefersHighContrastMql.addEventListener("change", onChange);
1245
+ return function () {
1246
+ prefersDarkMql.removeEventListener("change", onChange);
1247
+ prefersHighContrastMql.removeEventListener("change", onChange);
1248
+ };
1249
+ }, [defaultTheme, storageKey]);
1229
1250
  var value = useMemo(function () {
1230
1251
  return [theme, function (theme) {
1231
1252
  window.localStorage.setItem(storageKey, theme);
1232
1253
  setTheme(theme);
1233
1254
  applyTheme(theme);
1234
1255
  }];
1235
- }, [theme, storageKey]);
1256
+ }, [storageKey, theme]);
1236
1257
  return jsx(ThemeProviderContext.Provider, {
1237
1258
  value: value,
1238
1259
  children: children
@@ -1259,10 +1280,10 @@ function applyTheme(theme) {
1259
1280
  var htmlElement = window.document.documentElement;
1260
1281
  (_htmlElement$classLis = htmlElement.classList).remove.apply(_htmlElement$classLis, themes);
1261
1282
  var prefersDarkMode = window.matchMedia(prefersDarkModeMediaQuery).matches;
1262
- var prefersContrastMore = window.matchMedia(prefersHighContrastMediaQuery).matches;
1283
+ var prefersHighContrast = window.matchMedia(prefersHighContrastMediaQuery).matches;
1263
1284
  var newTheme = theme === "system" ? determineThemeFromMediaQuery({
1264
1285
  prefersDarkMode: prefersDarkMode,
1265
- prefersContrastMore: prefersContrastMore
1286
+ prefersHighContrast: prefersHighContrast
1266
1287
  }) : theme;
1267
1288
  htmlElement.classList.add(newTheme);
1268
1289
  htmlElement.dataset.theme = newTheme;
@@ -1273,8 +1294,8 @@ function applyTheme(theme) {
1273
1294
  */
1274
1295
  function determineThemeFromMediaQuery(_ref2) {
1275
1296
  var prefersDarkMode = _ref2.prefersDarkMode,
1276
- prefersContrastMore = _ref2.prefersContrastMore;
1277
- if (prefersContrastMore) {
1297
+ prefersHighContrast = _ref2.prefersHighContrast;
1298
+ if (prefersHighContrast) {
1278
1299
  return prefersDarkMode ? "dark-high-contrast" : "light-high-contrast";
1279
1300
  }
1280
1301
  return prefersDarkMode ? "dark" : "light";
@@ -1290,7 +1311,7 @@ var PreventWrongThemeFlash = function PreventWrongThemeFlash(_ref3) {
1290
1311
  storageKey = _ref3$storageKey === void 0 ? DEFAULT_STORAGE_KEY : _ref3$storageKey;
1291
1312
  return jsx("script", {
1292
1313
  dangerouslySetInnerHTML: {
1293
- __html: ("\n(function() {\n\tconst themes = " + JSON.stringify(themes) + ";\n\tconst isTheme = (value) => typeof value === \"string\" && themes.includes(value);\n\tconst fallbackTheme = \"" + defaultTheme + "\" ?? \"system\";\n\tconst maybeStoredTheme = window.localStorage.getItem(\"" + storageKey + "\");\n\tconst themePreference = isTheme(maybeStoredTheme) ? maybeStoredTheme : fallbackTheme;\n\tconst prefersDarkMode = window.matchMedia(\"" + prefersDarkModeMediaQuery + "\").matches;\n\tconst prefersContrastMore = window.matchMedia(\"" + prefersHighContrastMediaQuery + "\").matches;\n\tlet initialTheme = themePreference;\n\tif (initialTheme === \"system\") {\n\t\tif (prefersContrastMore) {\n\t\t\tinitialTheme = prefersDarkMode ? \"dark-high-contrast\" : \"light-high-contrast\";\n\t\t} else {\n\t\t\tinitialTheme = prefersDarkMode ? \"dark\" : \"light\";\n\t\t}\n\t}\n\tconst htmlElement = document.documentElement;\n\thtmlElement.classList.remove(...themes);\n\thtmlElement.classList.add(initialTheme);\n\thtmlElement.dataset.theme = initialTheme;\n})();\n").trim()
1314
+ __html: ("\n(function() {\n\tconst themes = " + JSON.stringify(themes) + ";\n\tconst isTheme = (value) => typeof value === \"string\" && themes.includes(value);\n\tconst fallbackTheme = \"" + defaultTheme + "\" ?? \"system\";\n\tconst maybeStoredTheme = window.localStorage.getItem(\"" + storageKey + "\");\n\tconst hasStoredTheme = isTheme(maybeStoredTheme);\n\tif (!hasStoredTheme) {\n\t\twindow.localStorage.setItem(\"" + storageKey + "\", fallbackTheme);\n\t}\n\tconst themePreference = hasStoredTheme ? maybeStoredTheme : fallbackTheme;\n\tconst prefersDarkMode = window.matchMedia(\"" + prefersDarkModeMediaQuery + "\").matches;\n\tconst prefersHighContrast = window.matchMedia(\"" + prefersHighContrastMediaQuery + "\").matches;\n\tlet initialTheme = themePreference;\n\tif (initialTheme === \"system\") {\n\t\tif (prefersHighContrast) {\n\t\t\tinitialTheme = prefersDarkMode ? \"dark-high-contrast\" : \"light-high-contrast\";\n\t\t} else {\n\t\t\tinitialTheme = prefersDarkMode ? \"dark\" : \"light\";\n\t\t}\n\t}\n\tconst htmlElement = document.documentElement;\n\thtmlElement.classList.remove(...themes);\n\thtmlElement.classList.add(initialTheme);\n\thtmlElement.dataset.theme = initialTheme;\n})();\n").trim()
1294
1315
  }
1295
1316
  });
1296
1317
  };
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @ngrok/mantle v0.0.2
2
+ * @ngrok/mantle v0.0.3
3
3
  *
4
4
  * Copyright (c) ngrok.
5
5
  *
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "mantle is ngrok's UI library and design system.",
4
4
  "author": "ngrok",
5
5
  "license": "MIT",
6
- "version": "0.0.2",
6
+ "version": "0.0.3",
7
7
  "homepage": "https://mantle.ngrok.com",
8
8
  "repository": {
9
9
  "type": "git",
@@ -98,7 +98,7 @@
98
98
  "prettier-plugin-tailwindcss": "0.5.7",
99
99
  "react": "18.2.0",
100
100
  "react-dom": "18.2.0",
101
- "rollup": "4.6.0",
101
+ "rollup": "4.6.1",
102
102
  "rollup-plugin-copy": "3.5.0",
103
103
  "rollup-plugin-dts": "6.1.0",
104
104
  "rollup-plugin-extensions": "0.1.0",