peachsim 0.1.671 → 0.1.673

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 (77) hide show
  1. package/cli/commands/kotlin.ts +1 -0
  2. package/cli/output-redaction.ts +6 -0
  3. package/dist-lib/agent-daemon-client.cjs +1 -1
  4. package/dist-lib/agent-events.cjs +1 -1
  5. package/dist-lib/agent-identity.cjs +1 -1
  6. package/dist-lib/agent-sessions.cjs +1 -1
  7. package/dist-lib/attached-projects.cjs +1 -1
  8. package/dist-lib/auth/shared-session.cjs +1 -1
  9. package/dist-lib/backend-origin.cjs +1 -1
  10. package/dist-lib/beta.cjs +1 -1
  11. package/dist-lib/beta.mjs +1 -1
  12. package/dist-lib/bridge-constants.cjs +1 -1
  13. package/dist-lib/bridge-contract-input.cjs +1 -1
  14. package/dist-lib/bridge-contract-input.mjs +1 -1
  15. package/dist-lib/bridge-contract.cjs +1 -1
  16. package/dist-lib/bridge-contract.mjs +1 -1
  17. package/dist-lib/capture-contract.cjs +1 -1
  18. package/dist-lib/capture-contract.mjs +1 -1
  19. package/dist-lib/cli-constants.cjs +1 -1
  20. package/dist-lib/cloud-contract.cjs +1 -1
  21. package/dist-lib/cloud-contract.mjs +1 -1
  22. package/dist-lib/cloud-test-args.cjs +1 -1
  23. package/dist-lib/cloud-test-args.mjs +1 -1
  24. package/dist-lib/cloud.cjs +1 -1
  25. package/dist-lib/cloud.mjs +1 -1
  26. package/dist-lib/config.cjs +1 -1
  27. package/dist-lib/detox/index.cjs +1 -1
  28. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  29. package/dist-lib/home-paths.cjs +1 -1
  30. package/dist-lib/host/bridge-host.cjs +2 -2
  31. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  32. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  33. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  34. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  35. package/dist-lib/host/websocket-proxy.cjs +1 -1
  36. package/dist-lib/index.cjs +1 -1
  37. package/dist-lib/jump-to-source-babel.cjs +1 -1
  38. package/dist-lib/jump-to-source-native.cjs +1 -1
  39. package/dist-lib/kotlin-host.cjs +1 -1
  40. package/dist-lib/menu.cjs +1 -1
  41. package/dist-lib/menu.mjs +1 -1
  42. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  43. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  44. package/dist-lib/metro-production-bundle.cjs +1 -1
  45. package/dist-lib/metro-production-bundle.mjs +1 -1
  46. package/dist-lib/metro.cjs +1 -1
  47. package/dist-lib/native-app-identity.cjs +1 -1
  48. package/dist-lib/native-app-identity.mjs +1 -1
  49. package/dist-lib/native-firebase-metadata.cjs +1 -1
  50. package/dist-lib/native-firebase-metadata.mjs +1 -1
  51. package/dist-lib/plist.cjs +1 -1
  52. package/dist-lib/plist.mjs +1 -1
  53. package/dist-lib/profiles.cjs +1 -1
  54. package/dist-lib/public-brand.cjs +1 -1
  55. package/dist-lib/react-native-host-modules.cjs +1 -1
  56. package/dist-lib/react-native-host-modules.mjs +1 -1
  57. package/dist-lib/render-mode.cjs +1 -1
  58. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  59. package/dist-lib/sdk.cjs +1 -1
  60. package/dist-lib/sdk.mjs +1 -1
  61. package/dist-lib/skills.cjs +13 -6
  62. package/dist-lib/swift-compile.cjs +1 -1
  63. package/dist-lib/swift-compile.mjs +1 -1
  64. package/dist-lib/swift-package.cjs +1 -1
  65. package/dist-lib/swift-package.mjs +1 -1
  66. package/dist-lib/swift-submit.cjs +2 -2
  67. package/dist-lib/swift-submit.mjs +2 -2
  68. package/dist-lib/swift.cjs +1 -1
  69. package/dist-lib/vite-swift.cjs +2 -2
  70. package/dist-lib/vite.cjs +1 -1
  71. package/kotlin/ComposeSources/PeachComposeHost.kt +2 -11
  72. package/kotlin/ComposeSources/PeachSemantics.kt +127 -0
  73. package/kotlin/fixtures/kotlin-app-variants/Icons.kt +59 -0
  74. package/kotlin/toolchain.json +9 -2
  75. package/package.json +1 -1
  76. package/src/kotlin-app.ts +5 -1
  77. package/src/swift-submit.ts +2 -1
@@ -40,6 +40,7 @@ function androidPins(): AndroidPins {
40
40
  material3: pin('material3'),
41
41
  navigation: pin('navigation'),
42
42
  activity: pin('activity'),
43
+ materialIcons: pin('materialIcons'),
43
44
  }
44
45
  }
45
46
 
@@ -28,6 +28,11 @@ const JWT = /\beyJ[\w-]{6,}\.[\w-]{6,}\.[\w-]{6,}/g
28
28
  const GOOGLE_API_KEY = /\bAIza[\w-]{30,}/g
29
29
  const BEARER = /\b(Bearer|Basic)\s+[\w.~+/=-]{8,}/gi
30
30
  const EMAIL = /\b[\w.+-]+@[\w-]+(?:\.[\w-]+)+\b/g
31
+ // an opaque account or session id printed bare in prose, such as a Firebase
32
+ // uid after "Signed in": 20 or more letters and digits mixing upper case,
33
+ // lower case and digits. hex hashes, uuids and identifiers lack that mix.
34
+ const OPAQUE_ID =
35
+ /\b(?=[A-Za-z0-9]*[A-Z])(?=[A-Za-z0-9]*[a-z])(?=[A-Za-z0-9]*\d)[A-Za-z0-9]{20,}\b/g
31
36
  // a name and its value: a quoted json name or a bare js object key, then a
32
37
  // json or js string, a whole number token, or an array of strings. a string is
33
38
  // matched at its own escaping level only; a json document escaped inside it is
@@ -121,6 +126,7 @@ export function redactForSharing(text: string): string {
121
126
  SECRET_NAME.test(name) ? `${prefix}${mask(value)}` : line,
122
127
  )
123
128
  .replace(EMAIL, mask)
129
+ .replace(OPAQUE_ID, mask)
124
130
  }
125
131
 
126
132
  const utf8 = new TextDecoder('utf-8', { fatal: true })
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/beta.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/beta.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/beta.ts
4
4
  var IS_BETA = true;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var SIM_LONG_PRESS_MAX_MS = 5e3;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var REFUSED_PERFORM_STEP_TYPES = [
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/capture-contract.ts
4
4
  var RNX_SCREEN_CAPTURE_VERSION = 1;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/cloud-contract.ts
4
4
  var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/cloud-test-args.ts
4
4
  var CLOUD_TEST_ARGS_MAX_COUNT = 32;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -7016,7 +7016,7 @@ var MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES = 8 * 1024 * 1024;
7016
7016
  var MAX_SWIFT_COMPILE_IMAGES = 128;
7017
7017
  var MAX_SWIFT_COMPILE_IMAGE_BYTES = 4 * 1024 * 1024;
7018
7018
  var MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES = 16 * 1024 * 1024;
7019
- var SWIFT_HOST_ABI = 3;
7019
+ var SWIFT_HOST_ABI = 4;
7020
7020
  var POLL_INTERVAL_MS = 1500;
7021
7021
  function httpSwiftCompileSubmit(context) {
7022
7022
  const { assetReadToken, authorization, endpoint } = context;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/host/fetch-proxy-overrides.ts
4
4
  var FETCH_PROXY_BROWSER_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/menu.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/public-brand.ts
4
4
  var name = "Peach";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/is-record.ts
4
4
  function isRecord(value) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/metro-production-bundle.ts
4
4
  var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/native-app-identity.ts
4
4
  var NATIVE_APP_IDENTITY_PREFIX = "globalThis.__sootsimNativeAppIdentity=";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/native-firebase-metadata.ts
4
4
  var PREFIX = "globalThis.__peachNativeFirebaseConfig=";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/plist.ts
4
4
  import plistModule from "@expo/plist";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/react-native-host-modules.ts
4
4
  var REACT_NATIVE_PASSTHROUGH_SPECIFIERS = [
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
package/dist-lib/sdk.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -8386,11 +8386,18 @@ var init_registry = __esm({
8386
8386
  stubType: "native",
8387
8387
  versions: [
8388
8388
  {
8389
- range: ">=4.6.1",
8389
+ range: ">=6.0.0 <7.0.0",
8390
+ coverage: 0.7,
8391
+ note: "the progressive native view delegates to the kit variable-radius pass with the cubic CGGradient first shipped in 6.0.0; iOS 27 full-region comparisons cover top, bottom and center, radii 10/30, offsets 0/0.25, and light/dark",
8392
+ working: "BlurView backdrop materials; ProgressiveBlurView variable radius, direction and startOffset, with the current opaque-edge plateau and center ramps; native blur style aliases; LiquidGlassView and LiquidGlassContainer calibrated glass materials; interactive BlurSwitch; native component export aliases",
8393
+ missing: "general vibrant-content composition, liquid glass container merging, Android QmBlurView behavior, reduced-transparency system-setting fallback color"
8394
+ },
8395
+ {
8396
+ range: ">=4.6.1 <6.0.0",
8390
8397
  coverage: 0.7,
8391
- note: "CanvasKit backdrop-blur + engine liquid-glass material for the full latest component surface; 40-material iOS color table drives per-blurType overlay tint",
8392
- working: "BlurView/VibrancyView/ProgressiveBlurView render real backdropFilter (sigma from blurAmount) over a per-material rgba overlay from the full iOS material constant table (xlight\u2026systemChromeMaterialDark); LiquidGlassView/LiquidGlassContainer drive the calibrated glassEffect materials (glassType, glassTintColor as the material glassTint, glassOpacity scaling the calibrated body opacity, isInteractive, cornerRadius); BlurSwitch is a real interactive switch (value/onValueChange/disabled, switch a11y role+state, track color); all native component export aliases",
8393
- missing: "progressive gradient direction (direction/startOffset accepted but ignored \u2014 renders uniform blur), exact iOS 26 liquid glass behavior, Android QmBlurView behavior, reduced-transparency system-setting fallback color"
8398
+ note: "partial: the older progressive native view uses CIFilter.smoothLinearGradient; the kit retains one current cubic mask, differing from the older iOS 27 oracle by 3.47\u201336.72% of pixels at the unchanged conformance threshold",
8399
+ working: "BlurView backdrop materials; progressive direction and radius vary spatially; calibrated liquid glass materials, interactive BlurSwitch and native component export aliases",
8400
+ missing: "the pre-6 progressive gradient profile and clear-edge offset; general vibrant-content composition, liquid glass container merging, Android QmBlurView behavior, reduced-transparency system-setting fallback color"
8394
8401
  }
8395
8402
  ]
8396
8403
  },
@@ -22491,7 +22498,7 @@ var init_swift_submit = __esm({
22491
22498
  MAX_SWIFT_COMPILE_IMAGES = 128;
22492
22499
  MAX_SWIFT_COMPILE_IMAGE_BYTES = 4 * 1024 * 1024;
22493
22500
  MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES = 16 * 1024 * 1024;
22494
- SWIFT_HOST_ABI = 3;
22501
+ SWIFT_HOST_ABI = 4;
22495
22502
  POLL_INTERVAL_MS = 1500;
22496
22503
  }
22497
22504
  });
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/swift-compile.ts
4
4
  import { execFile as execFile2 } from "node:child_process";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/swift-package.ts
4
4
  function isSwiftManifestFile(file) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -51,7 +51,7 @@ var MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES = 8 * 1024 * 1024;
51
51
  var MAX_SWIFT_COMPILE_IMAGES = 128;
52
52
  var MAX_SWIFT_COMPILE_IMAGE_BYTES = 4 * 1024 * 1024;
53
53
  var MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES = 16 * 1024 * 1024;
54
- var SWIFT_HOST_ABI = 3;
54
+ var SWIFT_HOST_ABI = 4;
55
55
  var POLL_INTERVAL_MS = 1500;
56
56
  function swiftNativeEntry(native, file) {
57
57
  return {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/swift-submit.ts
4
4
  var SWIFT_COMPILE_PATH = "/api/swift-compile";
@@ -12,7 +12,7 @@ var MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES = 8 * 1024 * 1024;
12
12
  var MAX_SWIFT_COMPILE_IMAGES = 128;
13
13
  var MAX_SWIFT_COMPILE_IMAGE_BYTES = 4 * 1024 * 1024;
14
14
  var MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES = 16 * 1024 * 1024;
15
- var SWIFT_HOST_ABI = 3;
15
+ var SWIFT_HOST_ABI = 4;
16
16
  var POLL_INTERVAL_MS = 1500;
17
17
  function swiftNativeEntry(native, file) {
18
18
  return {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1231,7 +1231,7 @@ var MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES = 8 * 1024 * 1024;
1231
1231
  var MAX_SWIFT_COMPILE_IMAGES = 128;
1232
1232
  var MAX_SWIFT_COMPILE_IMAGE_BYTES = 4 * 1024 * 1024;
1233
1233
  var MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES = 16 * 1024 * 1024;
1234
- var SWIFT_HOST_ABI = 3;
1234
+ var SWIFT_HOST_ABI = 4;
1235
1235
  var POLL_INTERVAL_MS = 1500;
1236
1236
  function swiftNativeEntry(native, file) {
1237
1237
  return {
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.671 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.673 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -29,10 +29,7 @@ import androidx.compose.ui.platform.WindowInfo
29
29
  import androidx.compose.ui.platform.registerSkikoComposeImplementation
30
30
  import androidx.compose.ui.scene.CanvasLayersComposeScene
31
31
  import androidx.compose.ui.scene.hasInvalidations
32
- import androidx.compose.ui.semantics.SemanticsNode
33
32
  import androidx.compose.ui.semantics.SemanticsOwner
34
- import androidx.compose.ui.semantics.SemanticsProperties
35
- import androidx.compose.ui.semantics.getOrNull
36
33
  import androidx.compose.ui.text.font.FontFamily
37
34
  import androidx.compose.ui.text.font.FontStyle
38
35
  import androidx.compose.ui.text.font.FontSynthesis
@@ -451,16 +448,10 @@ internal class PeachComposeMount(
451
448
  invalidate(false)
452
449
  }
453
450
 
451
+ // each owner's accessibility node tree, as android's delegate builds it
454
452
  fun semantics(): String {
455
453
  val nodes = JSONArray()
456
- fun collect(node: SemanticsNode) {
457
- val bounds = node.boundsInRoot
458
- nodes.put(JSONObject().put("text", node.config.getOrNull(SemanticsProperties.Text)?.joinToString { it.text })
459
- .put("tag", node.config.getOrNull(SemanticsProperties.TestTag))
460
- .put("left", bounds.left).put("top", bounds.top).put("right", bounds.right).put("bottom", bounds.bottom))
461
- node.children.forEach { collect(it) }
462
- }
463
- platform.owners.forEach { collect(it.unmergedRootSemanticsNode) }
454
+ platform.owners.forEach { accessibilityNodes(it, nodes) }
464
455
  return nodes.toString()
465
456
  }
466
457
 
@@ -0,0 +1,127 @@
1
+ // the accessibility delegate's internal reads (replacedChildren, isFake,
2
+ // unmergedConfig, isHidden, getAllUncoveredSemanticsNodesToIntObjectMap) are
3
+ // common compose code that ships in the web build; android reaches them from
4
+ // inside the module, so this file reads the same functions rather than a copy
5
+ @file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
6
+
7
+ import androidx.compose.ui.semantics.AdjustedSemanticsNode
8
+ import androidx.compose.ui.semantics.Role
9
+ import androidx.compose.ui.semantics.SemanticsActions
10
+ import androidx.compose.ui.semantics.SemanticsNode
11
+ import androidx.compose.ui.semantics.SemanticsOwner
12
+ import androidx.compose.ui.semantics.SemanticsProperties
13
+ import androidx.compose.ui.semantics.getAllUncoveredSemanticsNodesToIntObjectMap
14
+ import androidx.compose.ui.semantics.getOrNull
15
+ import androidx.compose.ui.semantics.isHidden
16
+ import androidx.compose.ui.state.ToggleableState
17
+ import org.json.JSONArray
18
+ import org.json.JSONObject
19
+
20
+ // AndroidComposeViewAccessibilityDelegateCompat's virtual view tree for one
21
+ // owner, as uiautomator reads it: the nodes the uncovered map keeps, each at
22
+ // its adjusted bounds in root pixels, linked through replacedChildren, with
23
+ // the properties populateAccessibilityNodeInfoProperties sets. the root is
24
+ // the host view's own node
25
+ internal fun accessibilityNodes(owner: SemanticsOwner, out: JSONArray) {
26
+ val root = owner.unmergedRootSemanticsNode
27
+ val nodes = owner.getAllUncoveredSemanticsNodesToIntObjectMap(root.id) { it.isAccessibilityIgnoredLink }
28
+ fun emit(node: SemanticsNode, parent: Int?) {
29
+ val adjusted = nodes[node.id] ?: return
30
+ out.put(nodeInfo(node, adjusted, parent))
31
+ node.replacedChildren.forEach { if (nodes.containsKey(it.id)) emit(it, node.id) }
32
+ }
33
+ emit(root, null)
34
+ }
35
+
36
+ private val SemanticsNode.isAccessibilityIgnoredLink: Boolean
37
+ get() = config.contains(SemanticsProperties.LinkTestMarker)
38
+
39
+ // SemanticsUtils.android.kt's toLegacyClassName
40
+ private fun Role.legacyClassName(): String? = when (this) {
41
+ Role.Button -> "android.widget.Button"
42
+ Role.Checkbox -> "android.widget.CheckBox"
43
+ Role.RadioButton -> "android.widget.RadioButton"
44
+ Role.Image -> "android.widget.ImageView"
45
+ Role.DropdownList -> "android.widget.Spinner"
46
+ Role.ValuePicker -> "android.widget.NumberPicker"
47
+ else -> null
48
+ }
49
+
50
+ private val SemanticsNode.isUnmergedLeafNode: Boolean
51
+ get() {
52
+ if (isFake) return false
53
+ replacedChildren.forEach { if (!it.isAccessibilityIgnoredLink) return false }
54
+ // the closest layout ancestor carrying a merging semantics
55
+ // configuration is the closest merging semantics parent
56
+ var parent = parent
57
+ while (parent != null) {
58
+ if (parent.unmergedConfig.isMergingSemanticsOfDescendants) return false
59
+ parent = parent.parent
60
+ }
61
+ return true
62
+ }
63
+
64
+ private fun nodeInfo(node: SemanticsNode, adjusted: AdjustedSemanticsNode, parent: Int?): JSONObject {
65
+ val config = node.unmergedConfig
66
+ val role = config.getOrNull(SemanticsProperties.Role)
67
+ // the text class first, so a role's class wins over it
68
+ var className = "android.view.View"
69
+ if (config.contains(SemanticsProperties.EditableText)) className = "android.widget.EditText"
70
+ if (config.contains(SemanticsProperties.Text)) className = "android.widget.TextView"
71
+ if (role != null && role != Role.Tab && role != Role.Switch && (node.isFake || node.replacedChildren.isEmpty())) {
72
+ val legacy = role.legacyClassName()
73
+ if (legacy != null && (role != Role.Image || node.isUnmergedLeafNode || config.isMergingSemanticsOfDescendants)) {
74
+ className = legacy
75
+ }
76
+ }
77
+ // the delegate sets range and scroll classes after the role's
78
+ if (config.contains(SemanticsProperties.ProgressBarRangeInfo)) {
79
+ className =
80
+ if (config.contains(SemanticsActions.SetProgress)) "android.widget.SeekBar"
81
+ else "android.widget.ProgressBar"
82
+ }
83
+ // CollectionInfo.android.kt's hasCollectionInfo, on the merged config
84
+ val collection = node.config.contains(SemanticsProperties.CollectionInfo) ||
85
+ node.config.contains(SemanticsProperties.SelectableGroup)
86
+ if (config.contains(SemanticsActions.ScrollBy) && !collection) {
87
+ if (config.contains(SemanticsProperties.HorizontalScrollAxisRange)) {
88
+ className = "android.widget.HorizontalScrollView"
89
+ }
90
+ if (config.contains(SemanticsProperties.VerticalScrollAxisRange)) {
91
+ className = "android.widget.ScrollView"
92
+ }
93
+ }
94
+ val text = config.getOrNull(SemanticsProperties.EditableText)?.text
95
+ ?: config.getOrNull(SemanticsProperties.Text)?.firstOrNull()?.text
96
+ val description =
97
+ if (!config.isMergingSemanticsOfDescendants || node.replacedChildren.isEmpty())
98
+ config.getOrNull(SemanticsProperties.ContentDescription)?.firstOrNull()
99
+ else null
100
+ val selected = config.getOrNull(SemanticsProperties.Selected)
101
+ // a tab reports selected; any other role reports selected as checked
102
+ val checked = when (config.getOrNull(SemanticsProperties.ToggleableState)) {
103
+ ToggleableState.On -> true
104
+ ToggleableState.Off -> false
105
+ else -> if (role != Role.Tab) selected else null
106
+ }
107
+ val clickable = config.getOrNull(SemanticsActions.OnClick) != null &&
108
+ !((role == Role.Tab || role == Role.RadioButton) && selected == true)
109
+ val bounds = adjusted.adjustedBounds
110
+ return JSONObject()
111
+ .put("id", node.id)
112
+ .put("parent", parent ?: JSONObject.NULL)
113
+ .put("className", className)
114
+ .put("role", role?.toString() ?: JSONObject.NULL)
115
+ .put("text", text ?: JSONObject.NULL)
116
+ .put("contentDescription", description ?: JSONObject.NULL)
117
+ .put("testTag", config.getOrNull(SemanticsProperties.TestTag) ?: JSONObject.NULL)
118
+ .put("clickable", clickable)
119
+ .put("longClickable", config.getOrNull(SemanticsActions.OnLongClick) != null)
120
+ .put("focusable", config.contains(SemanticsProperties.Focused))
121
+ .put("focused", config.getOrNull(SemanticsProperties.Focused) == true)
122
+ .put("enabled", !node.config.contains(SemanticsProperties.Disabled))
123
+ .put("checked", checked ?: JSONObject.NULL)
124
+ .put("selected", if (role == Role.Tab) selected ?: false else false)
125
+ .put("visible", !(node.isHidden || adjusted.isInMergingHiddenSubtree))
126
+ .put("bounds", JSONArray().put(bounds.left).put(bounds.top).put(bounds.right).put(bounds.bottom))
127
+ }
@@ -0,0 +1,59 @@
1
+ package dev.contrast.kotlinapp
2
+
3
+ import androidx.compose.foundation.background
4
+ import androidx.compose.foundation.layout.Arrangement
5
+ import androidx.compose.foundation.layout.Column
6
+ import androidx.compose.foundation.layout.Row
7
+ import androidx.compose.foundation.layout.fillMaxSize
8
+ import androidx.compose.foundation.layout.padding
9
+ import androidx.compose.foundation.layout.safeDrawingPadding
10
+ import androidx.compose.foundation.layout.size
11
+ import androidx.compose.material.icons.Icons
12
+ import androidx.compose.material.icons.filled.Add
13
+ import androidx.compose.material.icons.filled.Favorite
14
+ import androidx.compose.material.icons.filled.FavoriteBorder
15
+ import androidx.compose.material.icons.outlined.Settings
16
+ import androidx.compose.material.icons.rounded.Home
17
+ import androidx.compose.material.icons.sharp.Delete
18
+ import androidx.compose.material.icons.twotone.Star
19
+ import androidx.compose.material3.Icon
20
+ import androidx.compose.material3.IconButton
21
+ import androidx.compose.material3.Text
22
+ import androidx.compose.runtime.Composable
23
+ import androidx.compose.runtime.getValue
24
+ import androidx.compose.runtime.mutableStateOf
25
+ import androidx.compose.runtime.remember
26
+ import androidx.compose.runtime.setValue
27
+ import androidx.compose.ui.Modifier
28
+ import androidx.compose.ui.graphics.Color
29
+ import androidx.compose.ui.unit.dp
30
+
31
+ // material-icons-core vectors in each theme, at the default and a large
32
+ // size and tinted, and an IconButton that swaps its icon
33
+ @Composable
34
+ fun IconsScreen() {
35
+ var liked by remember { mutableStateOf(false) }
36
+ Column(
37
+ Modifier.fillMaxSize().background(Color(0xFFE8EEF8)).safeDrawingPadding().padding(16.dp),
38
+ verticalArrangement = Arrangement.spacedBy(12.dp),
39
+ ) {
40
+ Text("Icons: liked $liked")
41
+ Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
42
+ Icon(Icons.Filled.Add, contentDescription = "Add")
43
+ Icon(Icons.Outlined.Settings, contentDescription = "Settings")
44
+ Icon(Icons.Rounded.Home, contentDescription = "Home")
45
+ Icon(Icons.Sharp.Delete, contentDescription = "Delete")
46
+ Icon(Icons.TwoTone.Star, contentDescription = "Star")
47
+ }
48
+ Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
49
+ Icon(Icons.Filled.Favorite, contentDescription = null, Modifier.size(64.dp), tint = Color(0xFFE91E63))
50
+ Icon(Icons.Outlined.Settings, contentDescription = null, Modifier.size(96.dp), tint = Color(0xFF6750A4))
51
+ }
52
+ IconButton(onClick = { liked = !liked }) {
53
+ Icon(
54
+ if (liked) Icons.Filled.Favorite else Icons.Filled.FavoriteBorder,
55
+ contentDescription = "Like",
56
+ )
57
+ }
58
+ }
59
+ }
@@ -281,6 +281,11 @@
281
281
  "name": "navigation-compose-wasm-js-2.10.0-beta01.klib",
282
282
  "url": "https://repo1.maven.org/maven2/org/jetbrains/androidx/navigation/navigation-compose-wasm-js/2.10.0-beta01/navigation-compose-wasm-js-2.10.0-beta01.klib",
283
283
  "sha256": "35e147105bfc48ef083c56b5108436234f8d8ab4747bce855e48a30243b15cd6"
284
+ },
285
+ {
286
+ "name": "material-icons-core-wasm-js-1.7.3.klib",
287
+ "url": "https://repo1.maven.org/maven2/org/jetbrains/compose/material/material-icons-core-wasm-js/1.7.3/material-icons-core-wasm-js-1.7.3.klib",
288
+ "sha256": "b49e6d71be88de8ff909b7b741f21b744c7d24d7c73e2949e75dfbf581561020"
284
289
  }
285
290
  ],
286
291
  "compose": {
@@ -293,7 +298,8 @@
293
298
  "materialRipple": "1.13.0-alpha02",
294
299
  "material3Ripple": "1.5.0-alpha27",
295
300
  "navigation": "2.10.0",
296
- "activity": "1.13.0"
301
+ "activity": "1.13.0",
302
+ "materialIcons": "1.7.6"
297
303
  },
298
304
  "mappingSources": [
299
305
  "https://repo1.maven.org/maven2/org/jetbrains/compose/ui/ui-android/1.13.0-alpha01/ui-android-1.13.0-alpha01.module",
@@ -313,7 +319,8 @@
313
319
  "https://repo1.maven.org/maven2/org/jetbrains/compose/material/material-ripple-android/1.13.0-alpha01/material-ripple-android-1.13.0-alpha01.module",
314
320
  "https://repo1.maven.org/maven2/org/jetbrains/compose/animation/animation-core-android/1.13.0-alpha01/animation-core-android-1.13.0-alpha01.module",
315
321
  "https://repo1.maven.org/maven2/org/jetbrains/compose/material3/material3-ripple-android/1.13.0-alpha01/material3-ripple-android-1.13.0-alpha01.module",
316
- "https://repo1.maven.org/maven2/org/jetbrains/androidx/navigation/navigation-compose-android/2.10.0-beta01/navigation-compose-android-2.10.0-beta01.module"
322
+ "https://repo1.maven.org/maven2/org/jetbrains/androidx/navigation/navigation-compose-android/2.10.0-beta01/navigation-compose-android-2.10.0-beta01.module",
323
+ "https://repo1.maven.org/maven2/org/jetbrains/compose/material/material-icons-core/1.7.3/material-icons-core-1.7.3.module"
317
324
  ],
318
325
  "skiko": "0.152.0-alpha02"
319
326
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "peachsim",
3
- "version": "0.1.671",
3
+ "version": "0.1.673",
4
4
  "description": "Vite and Metro plugins, testing drivers, and SDK exports for peach.",
5
5
  "author": "Tamagui LLC",
6
6
  "license": "SEE LICENSE IN LICENSE",
package/src/kotlin-app.ts CHANGED
@@ -56,6 +56,7 @@ export interface AndroidPins {
56
56
  material3: string
57
57
  navigation: string
58
58
  activity: string
59
+ materialIcons: string
59
60
  }
60
61
 
61
62
  const ANDROID_NS = 'android:'
@@ -70,7 +71,10 @@ const PLUGINS = new Set([
70
71
  // match their Android pins (Peach's activity actuals are that version's); the
71
72
  // lifecycle and savedstate artifacts are Peach's platform actuals.
72
73
  const PLATFORM_GROUPS = new Set(['androidx.lifecycle', 'androidx.savedstate'])
74
+ // pinned by group, or by group and artifact where a group's artifacts version
75
+ // apart (material-icons-core stopped at 1.7, beside material-ripple)
73
76
  const ANDROID_PIN: Record<string, keyof AndroidPins> = {
77
+ 'androidx.compose.material:material-icons-core': 'materialIcons',
74
78
  'androidx.compose.ui': 'ui',
75
79
  'androidx.compose.foundation': 'foundation',
76
80
  'androidx.compose.runtime': 'runtime',
@@ -167,7 +171,7 @@ function checkModuleGradle(gradle: { file: string; text: string }, pins: Android
167
171
  if (!coordinate)
168
172
  throw new Error(`${where}: ${value} is not a literal group:artifact:version`)
169
173
  const [, group = '', artifact, version] = coordinate
170
- const pin = ANDROID_PIN[group]
174
+ const pin = ANDROID_PIN[`${group}:${artifact}`] ?? ANDROID_PIN[group]
171
175
  if (pin) {
172
176
  if (version !== pins[pin])
173
177
  throw new Error(
@@ -46,8 +46,9 @@ export const MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES = 16 * 1024 * 1024
46
46
  * 2: scroll anchors carry numeric unit coordinates to the kit.
47
47
  * 3: the host provides `rnx.measure_text`, UIKitCore's synchronous text
48
48
  * measure (`packages/sootsim-swift/src/mount.tsx`).
49
+ * 4: the host handles Network path observations and cancellation.
49
50
  */
50
- export const SWIFT_HOST_ABI = 3
51
+ export const SWIFT_HOST_ABI = 4
51
52
 
52
53
  export interface SwiftImageUpload {
53
54
  /** the raster file picked for the asset (has the extension). */