@pinnacle0/web-ui 0.6.30 → 0.6.31

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pinnacle0/web-ui",
3
- "version": "0.6.30",
3
+ "version": "0.6.31",
4
4
  "author": "Pinnacle",
5
5
  "license": "MIT",
6
6
  "sideEffects": [
@@ -46,8 +46,8 @@
46
46
  "react": "19.2.0",
47
47
  "react-dom": "19.2.0",
48
48
  "react-router-dom": "5.3.0",
49
- "@pinnacle0/devtool-util": "1.3.6",
50
- "@pinnacle0/webpack-util": "0.8.18"
49
+ "@pinnacle0/webpack-util": "0.8.18",
50
+ "@pinnacle0/devtool-util": "1.3.6"
51
51
  },
52
52
  "exports": {
53
53
  "./core/*": {
@@ -1,11 +1,14 @@
1
1
  /**
2
2
  * Orientation detection utility for mobile and desktop devices.
3
3
  *
4
- * Uses the matchMedia API with orientation media queries, which provides
5
- * reliable cross-platform support including iOS 26+ where the legacy
6
- * window.orientation API has been removed since iOS 26+ PWA is not supported.
4
+ * Uses the ScreenOrientation API for checking the orientation of the screen.
5
+ * For Deprecated browsers, it uses the window.orientation API.
7
6
  *
8
- * @see https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_media_queries/Testing_media_queries
7
+ * For iOS 26.0+ PWA, it does not dispatch any event when the orientation changes,
8
+ * so we need to use media queries to check the orientation of the screen.
9
+ *
10
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/ScreenOrientation
11
+ * @see https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_media_queries/Using_media_queries
9
12
  */
10
13
  export type OrientationType = "portrait" | "landscape";
11
14
  export type Subscriber = (orientation: OrientationType) => void;
@@ -1,33 +1,50 @@
1
1
  /**
2
2
  * Orientation detection utility for mobile and desktop devices.
3
3
  *
4
- * Uses the matchMedia API with orientation media queries, which provides
5
- * reliable cross-platform support including iOS 26+ where the legacy
6
- * window.orientation API has been removed since iOS 26+ PWA is not supported.
4
+ * Uses the ScreenOrientation API for checking the orientation of the screen.
5
+ * For Deprecated browsers, it uses the window.orientation API.
7
6
  *
8
- * @see https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_media_queries/Testing_media_queries
7
+ * For iOS 26.0+ PWA, it does not dispatch any event when the orientation changes,
8
+ * so we need to use media queries to check the orientation of the screen.
9
+ *
10
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/ScreenOrientation
11
+ * @see https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_media_queries/Using_media_queries
9
12
  */
13
+ import { BrowserUtil } from "../BrowserUtil";
14
+ const supportScreenOrientationAPI = typeof window.screen.orientation !== "undefined";
15
+ // TODO: Need to check if iOS 26.0+ PWA bug is fixed in the future.
16
+ //
17
+ // Cannot use userAgent to check because it freeze at iOS 26.
18
+ // ref: https://www.kochava.com/blog/ios-26-apple-freezes-os-version/
19
+ // "notation" is a new option in Intl.PluralRules.prototype.resolvedOptions() in iOS 26.
20
+ // https://webkit.org/blog/17333/webkit-features-in-safari-26-0/#web-api
21
+ const isIOS26PWA = BrowserUtil.os() === "ios" && "notation" in new Intl.PluralRules().resolvedOptions() && "standalone" in window.navigator && window.navigator.standalone;
10
22
  function subscribe(subscriber) {
11
23
  const handler = () => subscriber(current());
12
- // Use matchMedia for iOS 26+ and other browsers
13
- const portraitQuery = window.matchMedia("(orientation: portrait)");
14
- const mediaHandler = () => handler();
15
- // Use addEventListener for modern browsers, addListener for older ones
16
- if (portraitQuery.addEventListener) {
17
- portraitQuery.addEventListener("change", mediaHandler);
18
- return () => portraitQuery.removeEventListener("change", mediaHandler);
24
+ if (isIOS26PWA) {
25
+ window.matchMedia("(orientation: portrait)").addEventListener("change", handler);
26
+ return () => window.matchMedia("(orientation: portrait)").removeEventListener("change", handler);
27
+ }
28
+ else if (supportScreenOrientationAPI) {
29
+ window.screen.orientation.addEventListener("change", handler);
30
+ return () => window.screen.orientation.removeEventListener("change", handler);
19
31
  }
20
32
  else {
21
- // Fallback for very old browsers
22
- portraitQuery.addListener(mediaHandler);
23
- return () => portraitQuery.removeListener(mediaHandler);
33
+ window.addEventListener("orientationchange", handler);
34
+ return () => window.removeEventListener("orientationchange", handler, false);
24
35
  }
25
36
  }
26
37
  function current() {
27
38
  try {
28
- // Use matchMedia API for iOS 26+ and other browsers
29
- const isPortrait = window.matchMedia("(orientation: portrait)").matches;
30
- return isPortrait ? "portrait" : "landscape";
39
+ if (isIOS26PWA) {
40
+ return window.matchMedia("(orientation: portrait)").matches ? "portrait" : "landscape";
41
+ }
42
+ else if (supportScreenOrientationAPI) {
43
+ return window.screen.orientation.angle === 0 ? "portrait" : "landscape";
44
+ }
45
+ else {
46
+ return window.orientation === 0 ? "portrait" : "landscape";
47
+ }
31
48
  }
32
49
  catch {
33
50
  // Do not use window.innerHeight/window.innerWidth comparison, because it is incorrect if keyboard is popped up
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/util/OrientationUtil/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,SAAS,SAAS,CAAC,UAAsB;IACrC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5C,gDAAgD;IAChD,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC;IACnE,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAErC,uEAAuE;IACvE,IAAI,aAAa,CAAC,gBAAgB,EAAE,CAAC;QACjC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACvD,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACJ,iCAAiC;QACjC,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAC5D,CAAC;AACL,CAAC;AAED,SAAS,OAAO;IACZ,IAAI,CAAC;QACD,oDAAoD;QACpD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC,OAAO,CAAC;QACxE,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACL,+GAA+G;QAC/G,OAAO,UAAU,CAAC;IACtB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,SAAS;IACT,OAAO;CACV,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/util/OrientationUtil/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAE3C,MAAM,2BAA2B,GAAG,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,KAAK,WAAW,CAAC;AAErF,mEAAmE;AACnE,EAAE;AACF,6DAA6D;AAC7D,qEAAqE;AACrE,wFAAwF;AACxF,wEAAwE;AACxE,MAAM,UAAU,GAAG,WAAW,CAAC,EAAE,EAAE,KAAK,KAAK,IAAI,UAAU,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,eAAe,EAAE,IAAI,YAAY,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;AAM3K,SAAS,SAAS,CAAC,UAAsB;IACrC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5C,IAAI,UAAU,EAAE,CAAC;QACb,MAAM,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjF,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrG,CAAC;SAAM,IAAI,2BAA2B,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9D,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;SAAM,CAAC;QACJ,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACjF,CAAC;AACL,CAAC;AAED,SAAS,OAAO;IACZ,IAAI,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACb,OAAO,MAAM,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;QAC3F,CAAC;aAAM,IAAI,2BAA2B,EAAE,CAAC;YACrC,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;QAC5E,CAAC;aAAM,CAAC;YACJ,OAAO,MAAM,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;QAC/D,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,+GAA+G;QAC/G,OAAO,UAAU,CAAC;IACtB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,SAAS;IACT,OAAO;CACV,CAAC,CAAC"}