peachsim 0.1.1641 → 0.1.1653

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 (618) hide show
  1. package/README.md +12 -0
  2. package/cli/app-bundle-resources.ts +57 -0
  3. package/cli/app-catalog.ts +1 -1
  4. package/cli/app-fonts.ts +11 -80
  5. package/cli/app-splash.ts +18 -12
  6. package/cli/bridge-flow-runner.ts +11 -7
  7. package/cli/cloud-client.ts +10 -13
  8. package/cli/command-registry.ts +13 -4
  9. package/cli/commands/box.ts +4 -4
  10. package/cli/commands/control.ts +105 -53
  11. package/cli/commands/coverage-parser.ts +67 -0
  12. package/cli/commands/coverage.ts +550 -0
  13. package/cli/commands/debug.ts +9 -18
  14. package/cli/commands/desktop.ts +19 -7
  15. package/cli/commands/device.ts +14 -9
  16. package/cli/commands/guest-host.ts +6 -10
  17. package/cli/commands/inspect/core.ts +81 -17
  18. package/cli/commands/inspect.ts +13 -8
  19. package/cli/commands/kotlin.ts +2 -2
  20. package/cli/commands/maestro-compare.ts +1 -1
  21. package/cli/commands/platform.ts +20 -11
  22. package/cli/commands/preview.ts +16 -18
  23. package/cli/commands/runtime.ts +3 -2
  24. package/cli/commands/screenshot-layers.ts +1 -1
  25. package/cli/commands/screenshot.ts +1 -1
  26. package/cli/commands/serve.ts +5 -1
  27. package/cli/commands/support.ts +4 -4
  28. package/cli/commands/three-mode.ts +22 -15
  29. package/cli/commands/upload.ts +44 -45
  30. package/cli/current-sim.ts +38 -0
  31. package/cli/desktop-companion.ts +36 -8
  32. package/cli/device-option.ts +1 -1
  33. package/cli/drivers/playwright.ts +40 -0
  34. package/cli/drivers/types.ts +4 -0
  35. package/cli/help-core.ts +1 -1
  36. package/cli/internal-child.ts +2 -1
  37. package/cli/main.ts +9 -3
  38. package/cli/outbound-endpoints.ts +15 -5
  39. package/cli/output-redaction.ts +39 -14
  40. package/cli/remote-simulators.ts +4 -1
  41. package/cli/scene-video.ts +5 -2
  42. package/cli/send-to-box.ts +7 -10
  43. package/cli/telemetry.ts +1 -1
  44. package/cli/ws-bridge.ts +8 -1
  45. package/detox/attempt-events.cjs +3 -1
  46. package/detox/attempt-events.d.cts +1 -1
  47. package/detox/expectations.ts +108 -99
  48. package/detox/frame-offset.d.mts +6 -0
  49. package/detox/frame-offset.mjs +35 -0
  50. package/detox/gestures.ts +6 -18
  51. package/detox/index.ts +169 -101
  52. package/detox/jest-preset.cjs +1 -3
  53. package/detox/jest-transform.cjs +4 -0
  54. package/detox/matchers.ts +3 -0
  55. package/detox/motion-change.cjs +52 -118
  56. package/detox/motion-change.d.cts +6 -27
  57. package/detox/motion-leg-starts.cjs +20 -0
  58. package/detox/motion-leg-starts.d.cts +8 -0
  59. package/dist-lib/agent-daemon-client.cjs +1 -1
  60. package/dist-lib/agent-events.cjs +1 -1
  61. package/dist-lib/attached-projects.cjs +1 -1
  62. package/dist-lib/auth/shared-session.cjs +1 -1
  63. package/dist-lib/backend-origin.cjs +3 -3
  64. package/dist-lib/beta.cjs +1 -1
  65. package/dist-lib/beta.mjs +1 -1
  66. package/dist-lib/bridge-constants.cjs +1 -1
  67. package/dist-lib/bridge-contract-input.cjs +65 -1
  68. package/dist-lib/bridge-contract-input.mjs +63 -1
  69. package/dist-lib/bridge-contract.cjs +19 -1
  70. package/dist-lib/bridge-contract.mjs +17 -1
  71. package/dist-lib/bundle-channel.cjs +38332 -14940
  72. package/dist-lib/capture-contract.cjs +1 -1
  73. package/dist-lib/capture-contract.mjs +1 -1
  74. package/dist-lib/cloud-contract.cjs +1 -1
  75. package/dist-lib/cloud-contract.mjs +1 -1
  76. package/dist-lib/cloud-test-args.cjs +1 -1
  77. package/dist-lib/cloud-test-args.mjs +1 -1
  78. package/dist-lib/cloud.cjs +1 -1
  79. package/dist-lib/cloud.mjs +1 -1
  80. package/dist-lib/config.cjs +1 -1
  81. package/dist-lib/config.mjs +5 -3
  82. package/dist-lib/detox/index.cjs +1247 -4511
  83. package/dist-lib/detox/jest-preset.cjs +1 -3
  84. package/dist-lib/detox/jest-transform.cjs +4 -0
  85. package/dist-lib/dev-bundle-resolution.cjs +28 -24
  86. package/dist-lib/expo-swift-bundle.cjs +35243 -13172
  87. package/dist-lib/expo-swift-metadata.cjs +1 -1
  88. package/dist-lib/expo-swift-metadata.mjs +1 -1
  89. package/dist-lib/home-paths.cjs +1 -1
  90. package/dist-lib/host/bridge-host.cjs +45285 -63163
  91. package/dist-lib/host/fetch-proxy-handler.cjs +3544 -11
  92. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  93. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  94. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  95. package/dist-lib/host/websocket-proxy.cjs +1 -1
  96. package/dist-lib/index.cjs +1997 -2069
  97. package/dist-lib/jump-to-source-babel.cjs +1 -1
  98. package/dist-lib/jump-to-source-native.cjs +1 -1
  99. package/dist-lib/kotlin-host.cjs +2 -2
  100. package/dist-lib/menu.cjs +14 -6
  101. package/dist-lib/menu.mjs +14 -6
  102. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  103. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  104. package/dist-lib/metro-production-bundle.cjs +1 -1
  105. package/dist-lib/metro-production-bundle.mjs +1 -1
  106. package/dist-lib/metro.cjs +468 -563
  107. package/dist-lib/native-app-identity-project.cjs +128 -292
  108. package/dist-lib/native-app-identity-project.mjs +1262 -51
  109. package/dist-lib/native-app-identity.cjs +8 -3
  110. package/dist-lib/native-app-identity.mjs +8 -3
  111. package/dist-lib/native-firebase-metadata.cjs +1 -1
  112. package/dist-lib/native-firebase-metadata.mjs +1 -1
  113. package/dist-lib/plist.cjs +2 -244
  114. package/dist-lib/plist.mjs +1 -1
  115. package/dist-lib/profiles.cjs +1 -1
  116. package/dist-lib/public-brand.cjs +1 -1
  117. package/dist-lib/public-origins-lib-esm.json +290 -0
  118. package/dist-lib/public-origins-lib-static.json +1 -0
  119. package/dist-lib/public-origins-lib.json +1852 -0
  120. package/dist-lib/react-native-host-modules.cjs +1 -1
  121. package/dist-lib/react-native-host-modules.mjs +1 -1
  122. package/dist-lib/scripts/dev-server-scanner.cjs +14 -253
  123. package/dist-lib/sdk.cjs +84 -16
  124. package/dist-lib/sdk.mjs +82 -15
  125. package/dist-lib/skills.cjs +51248 -75450
  126. package/dist-lib/swift-compile.cjs +26154 -1245
  127. package/dist-lib/swift-compile.mjs +26151 -1230
  128. package/dist-lib/swift-package.cjs +79 -1
  129. package/dist-lib/swift-package.mjs +75 -1
  130. package/dist-lib/swift-submit.cjs +1 -1
  131. package/dist-lib/swift-submit.mjs +1 -1
  132. package/dist-lib/swift-toolchain.cjs +1 -1
  133. package/dist-lib/swift.cjs +1 -1
  134. package/dist-lib/vite-swift.cjs +34394 -12323
  135. package/dist-lib/vite.cjs +373 -298
  136. package/dist-lib/worklet-executable.cjs +1 -1
  137. package/dist-lib/worklet-executable.mjs +1 -1
  138. package/dist-types/packages/peach-compat/src/engine-config.d.ts +2 -0
  139. package/dist-types/packages/peach-compat/src/stubs/form-sheet-spring.d.ts +9 -0
  140. package/dist-types/packages/peach-compat/src/stubs/native-evaluation-lease.d.ts +47 -0
  141. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-cookies.d.ts +113 -0
  142. package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-gesture-handler.d.ts +154 -0
  143. package/dist-types/packages/peach-compat/src/stubs/screen-transition-math.d.ts +756 -0
  144. package/dist-types/packages/peach-compat/src/stubs/transition-scalar.d.ts +25 -0
  145. package/dist-types/packages/peach-engine/src/billing/plans.d.ts +64 -0
  146. package/dist-types/packages/peach-engine/src/browser-page-target.d.ts +2 -0
  147. package/dist-types/packages/peach-engine/src/bundle-platform-url.d.ts +3 -0
  148. package/dist-types/packages/peach-engine/src/capture/browser-accessibility-host.d.ts +3 -0
  149. package/dist-types/packages/peach-engine/src/capture/browser-composite.d.ts +55 -0
  150. package/dist-types/packages/peach-engine/src/capture/browserAccessibilityContract.d.ts +27 -0
  151. package/dist-types/packages/peach-engine/src/capture/nativeScreenCaptureContract.d.ts +22 -0
  152. package/dist-types/packages/peach-engine/src/cli-companion.d.ts +36 -0
  153. package/dist-types/packages/peach-engine/src/components/native-ui/webview-frame-bridge.d.ts +34 -0
  154. package/dist-types/packages/peach-engine/src/config.d.ts +5 -0
  155. package/dist-types/packages/peach-engine/src/engine/android-stretch-effect.d.ts +57 -0
  156. package/dist-types/packages/peach-engine/src/engine/animated-driven-style.d.ts +47 -0
  157. package/dist-types/packages/peach-engine/src/engine/animated-value.d.ts +5 -0
  158. package/dist-types/packages/peach-engine/src/engine/animated.d.ts +195 -0
  159. package/dist-types/packages/peach-engine/src/engine/animation-clockContract.d.ts +15 -0
  160. package/dist-types/packages/peach-engine/src/engine/animation-graph.d.ts +148 -0
  161. package/dist-types/packages/peach-engine/src/engine/app-catalog-wire.d.ts +10 -0
  162. package/dist-types/packages/peach-engine/src/engine/app-font-registry.d.ts +87 -0
  163. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph-paint.d.ts +7 -0
  164. package/dist-types/packages/peach-engine/src/engine/attributed-paragraph.d.ts +123 -0
  165. package/dist-types/packages/peach-engine/src/engine/audioContract.d.ts +16 -0
  166. package/dist-types/packages/peach-engine/src/engine/canvaskit-api.d.ts +93 -0
  167. package/dist-types/packages/peach-engine/src/engine/canvaskit-renderer.d.ts +216 -0
  168. package/dist-types/packages/peach-engine/src/engine/config-plugin-fonts.d.ts +40 -0
  169. package/dist-types/packages/peach-engine/src/engine/config-plugin-splash.d.ts +25 -0
  170. package/dist-types/packages/peach-engine/src/engine/cull-visibility.d.ts +44 -0
  171. package/dist-types/packages/peach-engine/src/engine/damage-rect.d.ts +19 -0
  172. package/dist-types/packages/peach-engine/src/engine/engine-resource.d.ts +6 -0
  173. package/dist-types/packages/peach-engine/src/engine/expo-manifest.d.ts +5 -0
  174. package/dist-types/packages/peach-engine/src/engine/fiber-debug-metadata.d.ts +30 -0
  175. package/dist-types/packages/peach-engine/src/engine/font-config.d.ts +139 -0
  176. package/dist-types/packages/peach-engine/src/engine/generated/sf-pro-font.d.ts +1 -0
  177. package/dist-types/packages/peach-engine/src/engine/glass-material.d.ts +31 -0
  178. package/dist-types/packages/peach-engine/src/engine/host-composite.d.ts +100 -0
  179. package/dist-types/packages/peach-engine/src/engine/hosted-semantics.d.ts +49 -0
  180. package/dist-types/packages/peach-engine/src/engine/image-audit.d.ts +70 -0
  181. package/dist-types/packages/peach-engine/src/engine/image-loader.d.ts +350 -0
  182. package/dist-types/packages/peach-engine/src/engine/inspect-info.d.ts +27 -0
  183. package/dist-types/packages/peach-engine/src/engine/inspect-outline.d.ts +14 -0
  184. package/dist-types/packages/peach-engine/src/engine/inspect-visibility.d.ts +33 -0
  185. package/dist-types/packages/peach-engine/src/engine/ios-fast-scroll.d.ts +16 -0
  186. package/dist-types/packages/peach-engine/src/engine/layout-sab.d.ts +43 -0
  187. package/dist-types/packages/peach-engine/src/engine/liquid-glass-rect.d.ts +23 -0
  188. package/dist-types/packages/peach-engine/src/engine/liquid-glass-shaders.d.ts +9 -0
  189. package/dist-types/packages/peach-engine/src/engine/liquid-glass.d.ts +283 -0
  190. package/dist-types/packages/peach-engine/src/engine/live-object-counts.d.ts +6 -0
  191. package/dist-types/packages/peach-engine/src/engine/lottie-runtime.d.ts +32 -0
  192. package/dist-types/packages/peach-engine/src/engine/lottie-types.d.ts +138 -0
  193. package/dist-types/packages/peach-engine/src/engine/memory-counts.d.ts +27 -0
  194. package/dist-types/packages/peach-engine/src/engine/metalDirectContract.d.ts +108 -0
  195. package/dist-types/packages/peach-engine/src/engine/metalShaderContract.d.ts +217 -0
  196. package/dist-types/packages/peach-engine/src/engine/native-animation-driver.d.ts +112 -0
  197. package/dist-types/packages/peach-engine/src/engine/native-animation-graph.d.ts +62 -0
  198. package/dist-types/packages/peach-engine/src/engine/native-layout.d.ts +133 -0
  199. package/dist-types/packages/peach-engine/src/engine/native-resources.d.ts +26 -0
  200. package/dist-types/packages/peach-engine/src/engine/nativeReanimatedContract.d.ts +25 -0
  201. package/dist-types/packages/peach-engine/src/engine/nativeReplayContract.d.ts +64 -0
  202. package/dist-types/packages/peach-engine/src/engine/node.d.ts +589 -0
  203. package/dist-types/packages/peach-engine/src/engine/paint-boundary-types.d.ts +112 -0
  204. package/dist-types/packages/peach-engine/src/engine/paint-boundary.d.ts +57 -0
  205. package/dist-types/packages/peach-engine/src/engine/portalContract.d.ts +21 -0
  206. package/dist-types/packages/peach-engine/src/engine/portals.d.ts +20 -0
  207. package/dist-types/packages/peach-engine/src/engine/render-damage.d.ts +107 -0
  208. package/dist-types/packages/peach-engine/src/engine/riveContract.d.ts +420 -0
  209. package/dist-types/packages/peach-engine/src/engine/rn-spring.d.ts +51 -0
  210. package/dist-types/packages/peach-engine/src/engine/scene-table.d.ts +379 -0
  211. package/dist-types/packages/peach-engine/src/engine/scroll-momentum-math.d.ts +152 -0
  212. package/dist-types/packages/peach-engine/src/engine/scroll-pan-contacts.d.ts +10 -0
  213. package/dist-types/packages/peach-engine/src/engine/scroll-platform.d.ts +75 -0
  214. package/dist-types/packages/peach-engine/src/engine/scroll-range.d.ts +14 -0
  215. package/dist-types/packages/peach-engine/src/engine/scroll-velocity.d.ts +14 -0
  216. package/dist-types/packages/peach-engine/src/engine/scroll.d.ts +320 -0
  217. package/dist-types/packages/peach-engine/src/engine/signal.d.ts +7 -0
  218. package/dist-types/packages/peach-engine/src/engine/snapshot-cache-policy.d.ts +6 -0
  219. package/dist-types/packages/peach-engine/src/engine/svg-geometry.d.ts +41 -0
  220. package/dist-types/packages/peach-engine/src/engine/text-attachment-paragraphs.d.ts +10 -0
  221. package/dist-types/packages/peach-engine/src/engine/text-decoration.d.ts +11 -0
  222. package/dist-types/packages/peach-engine/src/engine/text-line-break.d.ts +22 -0
  223. package/dist-types/packages/peach-engine/src/engine/text-paint-receipt.d.ts +98 -0
  224. package/dist-types/packages/peach-engine/src/engine/text-paragraph.d.ts +11 -0
  225. package/dist-types/packages/peach-engine/src/engine/text-paragraphContract.d.ts +34 -0
  226. package/dist-types/packages/peach-engine/src/engine/text-transform.d.ts +1 -0
  227. package/dist-types/packages/peach-engine/src/engine/types.d.ts +657 -0
  228. package/dist-types/packages/peach-engine/src/engine/visible-frame.d.ts +54 -0
  229. package/dist-types/packages/peach-engine/src/engine/webrtcContract.d.ts +74 -0
  230. package/dist-types/packages/peach-engine/src/graphite-stats-fields.d.ts +184 -0
  231. package/dist-types/packages/peach-engine/src/guest-import-meta.d.ts +12 -0
  232. package/dist-types/packages/peach-engine/src/guest-module-overrides.d.ts +7 -0
  233. package/dist-types/packages/peach-engine/src/ios/app-card-types.d.ts +7 -0
  234. package/dist-types/packages/peach-engine/src/ios/apps/canvas-map-data.d.ts +177 -0
  235. package/dist-types/packages/peach-engine/src/ios/aux-home-scene.d.ts +54 -0
  236. package/dist-types/packages/peach-engine/src/ios/chrome-metrics.d.ts +47 -0
  237. package/dist-types/packages/peach-engine/src/ios/constants.d.ts +21 -0
  238. package/dist-types/packages/peach-engine/src/ios/duo-housing.d.ts +37 -0
  239. package/dist-types/packages/peach-engine/src/ios/home/types.d.ts +29 -0
  240. package/dist-types/packages/peach-engine/src/ios/home-app-catalog.d.ts +43 -0
  241. package/dist-types/packages/peach-engine/src/ios/photo-store.d.ts +73 -0
  242. package/dist-types/packages/peach-engine/src/ios/photoLibraryContract.d.ts +166 -0
  243. package/dist-types/packages/peach-engine/src/ios/shell-controller-types.d.ts +21 -0
  244. package/dist-types/packages/peach-engine/src/ios/shell-transition-debug.d.ts +18 -0
  245. package/dist-types/packages/peach-engine/src/metro-asset-path.d.ts +21 -0
  246. package/dist-types/packages/peach-engine/src/metro-fingerprint-registry-client.d.ts +11 -0
  247. package/dist-types/packages/peach-engine/src/metro-fingerprint.d.ts +38 -0
  248. package/dist-types/packages/peach-engine/src/native-preview-bundle.d.ts +44 -0
  249. package/dist-types/packages/peach-engine/src/observability/types.d.ts +74 -0
  250. package/dist-types/packages/peach-engine/src/peach-warm-manifest.d.ts +32 -0
  251. package/dist-types/packages/peach-engine/src/permissions/app-settings-client.d.ts +25 -0
  252. package/dist-types/packages/peach-engine/src/permissions/system-permission-types.d.ts +20 -0
  253. package/dist-types/packages/peach-engine/src/platform/android-back-panel.d.ts +131 -0
  254. package/dist-types/packages/peach-engine/src/platform/android-gesture-exclusion.d.ts +28 -0
  255. package/dist-types/packages/peach-engine/src/platform/android-predictive-back.d.ts +33 -0
  256. package/dist-types/packages/peach-engine/src/platform/system-bars-state.d.ts +14 -0
  257. package/dist-types/packages/peach-engine/src/playwright-sim-host.d.ts +1 -0
  258. package/dist-types/packages/peach-engine/src/preview/bundle-layout.d.ts +8 -0
  259. package/dist-types/packages/peach-engine/src/preview/bundle-variantContract.d.ts +24 -0
  260. package/dist-types/packages/peach-engine/src/preview/capture-bundle.d.ts +26 -0
  261. package/dist-types/packages/peach-engine/src/preview/compress-node.d.ts +2 -0
  262. package/dist-types/packages/peach-engine/src/preview/compress.d.ts +2 -0
  263. package/dist-types/packages/peach-engine/src/preview/presigned-upload.d.ts +60 -0
  264. package/dist-types/packages/peach-engine/src/preview/trace.d.ts +144 -0
  265. package/dist-types/packages/peach-engine/src/preview/upload-protocol.d.ts +152 -0
  266. package/dist-types/packages/peach-engine/src/profiler/animation-recording-loader.d.ts +1 -0
  267. package/dist-types/packages/peach-engine/src/profiler/profile-trace.d.ts +4 -0
  268. package/dist-types/packages/peach-engine/src/react-bridge.d.ts +3 -0
  269. package/dist-types/packages/peach-engine/src/react-native/AppState.d.ts +45 -0
  270. package/dist-types/packages/peach-engine/src/react-native/Appearance.d.ts +34 -0
  271. package/dist-types/packages/peach-engine/src/react-native/framework-colors-data.d.ts +2 -0
  272. package/dist-types/packages/peach-engine/src/react-native/host-services.d.ts +42 -0
  273. package/dist-types/packages/peach-engine/src/react-native/layout-animation.d.ts +22 -0
  274. package/dist-types/packages/peach-engine/src/react-native/platform-colors.d.ts +17 -0
  275. package/dist-types/packages/peach-engine/src/remote-stream/client-config.d.ts +10 -0
  276. package/dist-types/packages/peach-engine/src/remote-stream/cloud-display.d.ts +58 -0
  277. package/dist-types/packages/peach-engine/src/remote-stream/scene-recording.d.ts +45 -0
  278. package/dist-types/packages/peach-engine/src/render-worker/animated-drive-output.d.ts +35 -0
  279. package/dist-types/packages/peach-engine/src/render-worker/app-load.d.ts +16 -0
  280. package/dist-types/packages/peach-engine/src/render-worker/aux-surface-types.d.ts +2 -0
  281. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-shared.d.ts +42 -0
  282. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-webgpu.d.ts +434 -0
  283. package/dist-types/packages/peach-engine/src/render-worker/canvaskit-worker-init.d.ts +12 -0
  284. package/dist-types/packages/peach-engine/src/render-worker/compositor-backend.d.ts +31 -0
  285. package/dist-types/packages/peach-engine/src/render-worker/compositor-gpu.d.ts +202 -0
  286. package/dist-types/packages/peach-engine/src/render-worker/compositor-protocol.d.ts +1945 -0
  287. package/dist-types/packages/peach-engine/src/render-worker/compositor-runtime/scroll-drag-resample.d.ts +44 -0
  288. package/dist-types/packages/peach-engine/src/render-worker/css-keyframes-drive.d.ts +36 -0
  289. package/dist-types/packages/peach-engine/src/render-worker/edit-menu-geometry.d.ts +8 -0
  290. package/dist-types/packages/peach-engine/src/render-worker/engine-resource-relay.d.ts +21 -0
  291. package/dist-types/packages/peach-engine/src/render-worker/expo-widgetContract.d.ts +16 -0
  292. package/dist-types/packages/peach-engine/src/render-worker/gesture-seam-protocol.d.ts +152 -0
  293. package/dist-types/packages/peach-engine/src/render-worker/graph-linked-value.d.ts +29 -0
  294. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler-contract.d.ts +49 -0
  295. package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler.d.ts +12 -0
  296. package/dist-types/packages/peach-engine/src/render-worker/host-service-protocol.d.ts +756 -0
  297. package/dist-types/packages/peach-engine/src/render-worker/image-lifecycle-event.d.ts +22 -0
  298. package/dist-types/packages/peach-engine/src/render-worker/image-pixel-contract.d.ts +48 -0
  299. package/dist-types/packages/peach-engine/src/render-worker/live-frame-mirror.d.ts +34 -0
  300. package/dist-types/packages/peach-engine/src/render-worker/map-command-channel.d.ts +189 -0
  301. package/dist-types/packages/peach-engine/src/render-worker/mapNativeContract.d.ts +101 -0
  302. package/dist-types/packages/peach-engine/src/render-worker/native-dynamic-synchronizable.d.ts +22 -0
  303. package/dist-types/packages/peach-engine/src/render-worker/native-menu-gesture.d.ts +9 -0
  304. package/dist-types/packages/peach-engine/src/render-worker/native-ui-commandContract.d.ts +23 -0
  305. package/dist-types/packages/peach-engine/src/render-worker/native-ui-protocol.d.ts +1087 -0
  306. package/dist-types/packages/peach-engine/src/render-worker/native-widgetContract.d.ts +100 -0
  307. package/dist-types/packages/peach-engine/src/render-worker/nativeAnimMirrorContract.d.ts +174 -0
  308. package/dist-types/packages/peach-engine/src/render-worker/nativeSyncReplyContract.d.ts +11 -0
  309. package/dist-types/packages/peach-engine/src/render-worker/one-native-contentContract.d.ts +54 -0
  310. package/dist-types/packages/peach-engine/src/render-worker/pointerSampleContract.d.ts +14 -0
  311. package/dist-types/packages/peach-engine/src/render-worker/protocol.d.ts +880 -0
  312. package/dist-types/packages/peach-engine/src/render-worker/reanimated-css-contract.d.ts +63 -0
  313. package/dist-types/packages/peach-engine/src/render-worker/reanimated-readiness.d.ts +29 -0
  314. package/dist-types/packages/peach-engine/src/render-worker/resilient-frame-clock.d.ts +22 -0
  315. package/dist-types/packages/peach-engine/src/render-worker/retained-app-load.d.ts +20 -0
  316. package/dist-types/packages/peach-engine/src/render-worker/screen-edge-swipe-commit-protocol.d.ts +1 -0
  317. package/dist-types/packages/peach-engine/src/render-worker/screen-form-sheet-commit-protocol.d.ts +26 -0
  318. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror-tenant.d.ts +37 -0
  319. package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror.d.ts +164 -0
  320. package/dist-types/packages/peach-engine/src/render-worker/shell-event-registry.d.ts +119 -0
  321. package/dist-types/packages/peach-engine/src/render-worker/shell-gesture-regions.d.ts +41 -0
  322. package/dist-types/packages/peach-engine/src/render-worker/shell-protocol.d.ts +603 -0
  323. package/dist-types/packages/peach-engine/src/render-worker/shell-scene-schema.d.ts +101 -0
  324. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-inline-sources.d.ts +13 -0
  325. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-wire.d.ts +87 -0
  326. package/dist-types/packages/peach-engine/src/render-worker/test-bridge-protocol.d.ts +47 -0
  327. package/dist-types/packages/peach-engine/src/render-worker/text-inputContract.d.ts +93 -0
  328. package/dist-types/packages/peach-engine/src/render-worker/tree-sync-port.d.ts +102 -0
  329. package/dist-types/packages/peach-engine/src/render-worker/webgpu-frame-transaction.d.ts +292 -0
  330. package/dist-types/packages/peach-engine/src/render-worker/webgpu-readback-scheduler.d.ts +107 -0
  331. package/dist-types/packages/peach-engine/src/render-worker/webview-capture-protocol.d.ts +16 -0
  332. package/dist-types/packages/peach-engine/src/render-worker/worker-input-runtime.d.ts +211 -0
  333. package/dist-types/packages/peach-engine/src/render-worker/worker-storage.d.ts +33 -0
  334. package/dist-types/packages/peach-engine/src/render-worker/worklet-runtime.d.ts +987 -0
  335. package/dist-types/packages/peach-engine/src/render-worker/worklet-sab.d.ts +24 -0
  336. package/dist-types/packages/peach-engine/src/rolldown-bundle-inventory.d.ts +84 -0
  337. package/dist-types/packages/peach-engine/src/rolldown-production-fingerprint.d.ts +31 -0
  338. package/dist-types/packages/peach-engine/src/screenshots/timeline-assets.d.ts +10 -0
  339. package/dist-types/packages/peach-engine/src/screenshots/tokens.d.ts +9 -0
  340. package/dist-types/packages/peach-engine/src/settings/devices.d.ts +70 -0
  341. package/dist-types/packages/peach-engine/src/settings/duo-fold-bus.d.ts +87 -0
  342. package/dist-types/packages/peach-engine/src/settings/interface-rotation.d.ts +30 -0
  343. package/dist-types/packages/peach-engine/src/settings/react-native-configuration.d.ts +12 -0
  344. package/dist-types/packages/peach-engine/src/settings/scene-geometryContract.d.ts +40 -0
  345. package/dist-types/packages/peach-engine/src/settings/store.d.ts +37 -0
  346. package/dist-types/packages/peach-engine/src/shell-events.d.ts +203 -0
  347. package/dist-types/packages/peach-engine/src/shell-intent.d.ts +68 -0
  348. package/dist-types/packages/peach-engine/src/sootsim-event.d.ts +35 -0
  349. package/dist-types/packages/peach-engine/src/top-overlay-state.d.ts +5 -0
  350. package/dist-types/packages/peach-engine/src/web-authentication-automation-host.d.ts +2 -0
  351. package/dist-types/packages/peach-engine/src/webAuthenticationContract.d.ts +34 -0
  352. package/dist-types/packages/peach-engine/src/webview-automation-host.d.ts +180 -0
  353. package/dist-types/packages/peach-engine/src/wireframe-mode.d.ts +16 -0
  354. package/dist-types/packages/peach-globals/src/frameBreakdownContract.d.ts +16 -0
  355. package/dist-types/packages/peach-globals/src/index.d.ts +3311 -0
  356. package/dist-types/packages/peach-globals/src/nativeSurfaceContract.d.ts +76 -0
  357. package/dist-types/packages/peach-globals/src/pointerSourceEventContract.d.ts +8 -0
  358. package/dist-types/packages/peach-globals/src/profileTrace.d.ts +11 -0
  359. package/dist-types/packages/peach-globals/src/profilerContract.d.ts +223 -0
  360. package/dist-types/packages/peach-kit/src/capabilities.d.ts +721 -0
  361. package/dist-types/packages/peach-kit/src/internal.d.ts +4 -0
  362. package/dist-types/packages/peach-kit/src/materials/types.d.ts +27 -0
  363. package/dist-types/packages/peach-kit/src/materials/uikit-blur-material.d.ts +14 -0
  364. package/dist-types/packages/peach-kit/src/navigation-types.d.ts +11 -0
  365. package/dist-types/packages/peach-kit/src/react-bridge.d.ts +53 -0
  366. package/dist-types/packages/peach-kit/src/runtime.d.ts +26 -0
  367. package/dist-types/packages/peach-kit/src/ui/hosting-safe-area.d.ts +24 -0
  368. package/dist-types/packages/peach-kit/src/ui/popover-placement.d.ts +53 -0
  369. package/dist-types/packages/peach-kit/src/ui/presentationContract.d.ts +17 -0
  370. package/kotlin/ComposeSources/PeachComposeHost.kt +1 -1
  371. package/kotlin/JniSources/com/facebook/jni/HybridData.kt +0 -2
  372. package/kotlin/JniSources/dev/peach/jni/NativeBindings.kt +0 -2
  373. package/kotlin/JniTransportSources/dev/peach/jni/integration/JniTransport.kt +0 -2
  374. package/kotlin/README.md +6 -0
  375. package/package.json +22 -2
  376. package/runtime-companion.json +1 -0
  377. package/skills/contrast/SKILL.md +1 -0
  378. package/src/appBundleResourcesContract.ts +51 -0
  379. package/src/assetCatalogContract.ts +21 -0
  380. package/src/backend-origin.ts +3 -1
  381. package/src/bridge-contract-input.ts +84 -0
  382. package/src/bridge-contract.ts +35 -3
  383. package/src/browser-launch-policy.ts +1 -0
  384. package/src/bundle-channel.mjs +4 -2
  385. package/src/cli-runtime.ts +55 -0
  386. package/src/crash-fingerprint.ts +26 -0
  387. package/src/dev-bundle-resolution.ts +50 -23
  388. package/src/device-catalog.ts +1159 -0
  389. package/src/host/bridge-host.ts +20 -37
  390. package/src/host/browser-pointer.ts +71 -0
  391. package/src/host/dev-server-package-versions.ts +23 -0
  392. package/src/host/fetch-proxy-handler.ts +17 -4
  393. package/src/host/staged-host-files.ts +28 -4
  394. package/src/installed-package-versions.ts +142 -38
  395. package/src/kotlin-host.ts +1 -1
  396. package/src/launchMetadataContract.ts +1 -0
  397. package/src/menu.ts +12 -4
  398. package/src/metro-plugin.ts +4 -4
  399. package/src/metro-project-root.ts +68 -0
  400. package/src/native-app-identity-project.ts +47 -38
  401. package/src/nitro-adapter.lock.json +26 -0
  402. package/src/nitro-adapter.ts +103 -0
  403. package/src/nitro-bundle.ts +24 -10
  404. package/src/nitro-compile.ts +33 -51
  405. package/src/nitro-source.ts +177 -96
  406. package/src/nitroAdapterContract.ts +217 -0
  407. package/src/nitroContract.ts +24 -11
  408. package/src/process-group.ts +41 -34
  409. package/src/react-bridge-importers.ts +28 -0
  410. package/src/reactNativeConfigurationContract.ts +36 -0
  411. package/src/runtime-assets.ts +7 -2
  412. package/src/runtime-delivery.ts +8 -7
  413. package/src/runtimePlatformContract.ts +70 -0
  414. package/src/screenshots/frame-compose.ts +42 -43
  415. package/src/screenshots/org-deck.ts +9 -4
  416. package/src/screenshots/preset-names.ts +29 -0
  417. package/src/screenshots/registry.ts +5 -5
  418. package/src/screenshots/schema.ts +1 -1
  419. package/src/screenshots/screenshotContract.ts +971 -0
  420. package/src/settings-flags.ts +107 -0
  421. package/src/settingsContract.ts +609 -0
  422. package/src/storageSnapshotContract.ts +344 -0
  423. package/src/stub-pattern-matcher.ts +550 -0
  424. package/src/swift-compile.ts +926 -47
  425. package/src/swift-compiler-digest.ts +17 -3
  426. package/src/swift-distribution.lock.json +49 -22
  427. package/src/swift-host.ts +167 -52
  428. package/src/swift-objc-compile.ts +86 -26
  429. package/src/swift-objc-export.ts +532 -0
  430. package/src/swift-objc-import.ts +769 -0
  431. package/src/swift-objc-metadata.ts +285 -10
  432. package/src/swift-objc-sdk.ts +13970 -158
  433. package/src/swift-objc-standin.ts +137 -1
  434. package/src/swift-package.ts +94 -0
  435. package/src/swift-packages.ts +5 -5
  436. package/src/swift-root-lock.ts +241 -92
  437. package/src/swift-submit.ts +6 -0
  438. package/src/swiftContract.ts +99 -0
  439. package/src/target-matcher.ts +6 -1
  440. package/src/vite-plugin.ts +14 -40
  441. package/src/worker-system-chunks.ts +1 -1
  442. package/src/workerChunkContract.ts +5 -0
  443. package/src/worklets-babel.ts +24 -5
  444. package/src/xcode-project.ts +103 -11
  445. package/src/xcode-target-members.ts +10 -3
  446. package/cli/drivers/playwright-sim-host.ts +0 -825
  447. package/kotlin/fixtures/counter/Counter.d.kt.ts +0 -17
  448. package/kotlin/fixtures/counter/Counter.kt +0 -51
  449. package/kotlin/fixtures/counter/CounterApp.native.tsx +0 -61
  450. package/kotlin/fixtures/counter/CounterApp.tsx +0 -3
  451. package/kotlin/fixtures/counter/CounterScreen.d.kt.ts +0 -8
  452. package/kotlin/fixtures/counter/CounterScreen.kt +0 -56
  453. package/kotlin/fixtures/counter/app/_layout.tsx +0 -4
  454. package/kotlin/fixtures/counter/app/index+spa.tsx +0 -1
  455. package/kotlin/fixtures/counter/app/routes.d.ts +0 -18
  456. package/kotlin/fixtures/counter/package.json +0 -20
  457. package/kotlin/fixtures/counter/tsconfig.json +0 -19
  458. package/kotlin/fixtures/counter/vite.config.ts +0 -20
  459. package/kotlin/fixtures/headless-counter/Headless.kt +0 -234
  460. package/kotlin/fixtures/import-animation/Animation.d.kt.ts +0 -7
  461. package/kotlin/fixtures/import-animation/Animation.kt +0 -80
  462. package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +0 -13
  463. package/kotlin/fixtures/import-animation/README.md +0 -24
  464. package/kotlin/fixtures/import-animation/app/_layout.tsx +0 -4
  465. package/kotlin/fixtures/import-animation/app/index+spa.tsx +0 -1
  466. package/kotlin/fixtures/import-animation/app/routes.d.ts +0 -18
  467. package/kotlin/fixtures/import-animation/package.json +0 -23
  468. package/kotlin/fixtures/import-animation/tsconfig.json +0 -20
  469. package/kotlin/fixtures/import-animation/vite.config.ts +0 -20
  470. package/kotlin/fixtures/import-drawing/Drawing.d.kt.ts +0 -7
  471. package/kotlin/fixtures/import-drawing/Drawing.kt +0 -101
  472. package/kotlin/fixtures/import-drawing/ImportDrawing.native.tsx +0 -18
  473. package/kotlin/fixtures/import-drawing/README.md +0 -34
  474. package/kotlin/fixtures/import-drawing/app/_layout.tsx +0 -4
  475. package/kotlin/fixtures/import-drawing/app/index+spa.tsx +0 -1
  476. package/kotlin/fixtures/import-drawing/package.json +0 -23
  477. package/kotlin/fixtures/import-drawing/tsconfig.json +0 -20
  478. package/kotlin/fixtures/import-drawing/vite.config.ts +0 -20
  479. package/kotlin/fixtures/import-editor/Editor.d.kt.ts +0 -7
  480. package/kotlin/fixtures/import-editor/Editor.kt +0 -59
  481. package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +0 -23
  482. package/kotlin/fixtures/import-editor/README.md +0 -27
  483. package/kotlin/fixtures/import-editor/app/_layout.tsx +0 -4
  484. package/kotlin/fixtures/import-editor/app/index+spa.tsx +0 -1
  485. package/kotlin/fixtures/import-editor/package.json +0 -23
  486. package/kotlin/fixtures/import-editor/tsconfig.json +0 -20
  487. package/kotlin/fixtures/import-editor/vite.config.ts +0 -20
  488. package/kotlin/fixtures/import-effects/Effects.d.kt.ts +0 -7
  489. package/kotlin/fixtures/import-effects/Effects.kt +0 -87
  490. package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +0 -13
  491. package/kotlin/fixtures/import-effects/README.md +0 -19
  492. package/kotlin/fixtures/import-effects/app/_layout.tsx +0 -4
  493. package/kotlin/fixtures/import-effects/app/index+spa.tsx +0 -1
  494. package/kotlin/fixtures/import-effects/package.json +0 -23
  495. package/kotlin/fixtures/import-effects/tsconfig.json +0 -20
  496. package/kotlin/fixtures/import-effects/vite.config.ts +0 -20
  497. package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +0 -13
  498. package/kotlin/fixtures/import-layout/Layout.d.kt.ts +0 -7
  499. package/kotlin/fixtures/import-layout/Layout.kt +0 -72
  500. package/kotlin/fixtures/import-layout/README.md +0 -24
  501. package/kotlin/fixtures/import-layout/app/_layout.tsx +0 -4
  502. package/kotlin/fixtures/import-layout/app/index+spa.tsx +0 -1
  503. package/kotlin/fixtures/import-layout/package.json +0 -23
  504. package/kotlin/fixtures/import-layout/tsconfig.json +0 -20
  505. package/kotlin/fixtures/import-layout/vite.config.ts +0 -20
  506. package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +0 -18
  507. package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +0 -7
  508. package/kotlin/fixtures/import-navigation/Navigation.kt +0 -104
  509. package/kotlin/fixtures/import-navigation/README.md +0 -31
  510. package/kotlin/fixtures/import-navigation/app/_layout.tsx +0 -4
  511. package/kotlin/fixtures/import-navigation/app/index+spa.tsx +0 -1
  512. package/kotlin/fixtures/import-navigation/package.json +0 -23
  513. package/kotlin/fixtures/import-navigation/tsconfig.json +0 -20
  514. package/kotlin/fixtures/import-navigation/vite.config.ts +0 -20
  515. package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +0 -29
  516. package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +0 -7
  517. package/kotlin/fixtures/import-overlays/Overlays.kt +0 -93
  518. package/kotlin/fixtures/import-overlays/README.md +0 -34
  519. package/kotlin/fixtures/import-overlays/app/_layout.tsx +0 -4
  520. package/kotlin/fixtures/import-overlays/app/index+spa.tsx +0 -1
  521. package/kotlin/fixtures/import-overlays/package.json +0 -23
  522. package/kotlin/fixtures/import-overlays/tsconfig.json +0 -20
  523. package/kotlin/fixtures/import-overlays/vite.config.ts +0 -20
  524. package/kotlin/fixtures/import-resources/ImportResources.native.tsx +0 -18
  525. package/kotlin/fixtures/import-resources/README.md +0 -26
  526. package/kotlin/fixtures/import-resources/Resources.d.kt.ts +0 -6
  527. package/kotlin/fixtures/import-resources/Resources.kt +0 -72
  528. package/kotlin/fixtures/import-resources/app/_layout.tsx +0 -4
  529. package/kotlin/fixtures/import-resources/app/index+spa.tsx +0 -1
  530. package/kotlin/fixtures/import-resources/package.json +0 -23
  531. package/kotlin/fixtures/import-resources/tsconfig.json +0 -20
  532. package/kotlin/fixtures/import-resources/vite.config.ts +0 -20
  533. package/kotlin/fixtures/import-scroll/ImportNested.native.tsx +0 -10
  534. package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +0 -13
  535. package/kotlin/fixtures/import-scroll/Nested.d.kt.ts +0 -4
  536. package/kotlin/fixtures/import-scroll/Nested.kt +0 -64
  537. package/kotlin/fixtures/import-scroll/README.md +0 -38
  538. package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +0 -7
  539. package/kotlin/fixtures/import-scroll/Scroll.kt +0 -91
  540. package/kotlin/fixtures/import-scroll/app/_layout.tsx +0 -4
  541. package/kotlin/fixtures/import-scroll/app/index+spa.tsx +0 -1
  542. package/kotlin/fixtures/import-scroll/app/nested+spa.tsx +0 -1
  543. package/kotlin/fixtures/import-scroll/package.json +0 -23
  544. package/kotlin/fixtures/import-scroll/tsconfig.json +0 -20
  545. package/kotlin/fixtures/import-scroll/vite.config.ts +0 -20
  546. package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +0 -44
  547. package/kotlin/fixtures/import-selection/README.md +0 -32
  548. package/kotlin/fixtures/import-selection/Selection.d.kt.ts +0 -8
  549. package/kotlin/fixtures/import-selection/Selection.kt +0 -78
  550. package/kotlin/fixtures/import-selection/app/_layout.tsx +0 -4
  551. package/kotlin/fixtures/import-selection/app/index+spa.tsx +0 -1
  552. package/kotlin/fixtures/import-selection/package.json +0 -23
  553. package/kotlin/fixtures/import-selection/tsconfig.json +0 -20
  554. package/kotlin/fixtures/import-selection/vite.config.ts +0 -20
  555. package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +0 -13
  556. package/kotlin/fixtures/import-surfaces/README.md +0 -22
  557. package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +0 -7
  558. package/kotlin/fixtures/import-surfaces/Surfaces.kt +0 -64
  559. package/kotlin/fixtures/import-surfaces/app/_layout.tsx +0 -4
  560. package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +0 -1
  561. package/kotlin/fixtures/import-surfaces/package.json +0 -23
  562. package/kotlin/fixtures/import-surfaces/tsconfig.json +0 -20
  563. package/kotlin/fixtures/import-surfaces/vite.config.ts +0 -20
  564. package/kotlin/fixtures/import-values/ImportValues.native.tsx +0 -61
  565. package/kotlin/fixtures/import-values/README.md +0 -28
  566. package/kotlin/fixtures/import-values/Values.d.kt.ts +0 -15
  567. package/kotlin/fixtures/import-values/Values.kt +0 -84
  568. package/kotlin/fixtures/import-values/app/_layout.tsx +0 -4
  569. package/kotlin/fixtures/import-values/app/index+spa.tsx +0 -1
  570. package/kotlin/fixtures/import-values/package.json +0 -23
  571. package/kotlin/fixtures/import-values/tsconfig.json +0 -20
  572. package/kotlin/fixtures/import-values/vite.config.ts +0 -20
  573. package/kotlin/fixtures/kotlin-app/app/build.gradle.kts +0 -30
  574. package/kotlin/fixtures/kotlin-app/app/src/main/AndroidManifest.xml +0 -13
  575. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/MainActivity.kt +0 -60
  576. package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/ProbeApplication.kt +0 -18
  577. package/kotlin/fixtures/kotlin-app/build.gradle.kts +0 -5
  578. package/kotlin/fixtures/kotlin-app/gradle.properties +0 -4
  579. package/kotlin/fixtures/kotlin-app/settings.gradle.kts +0 -4
  580. package/kotlin/fixtures/kotlin-app-variants/Anim.kt +0 -62
  581. package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +0 -38
  582. package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +0 -36
  583. package/kotlin/fixtures/kotlin-app-variants/Bitmaps.kt +0 -50
  584. package/kotlin/fixtures/kotlin-app-variants/Browse.kt +0 -73
  585. package/kotlin/fixtures/kotlin-app-variants/Colors.kt +0 -41
  586. package/kotlin/fixtures/kotlin-app-variants/Controls.kt +0 -62
  587. package/kotlin/fixtures/kotlin-app-variants/Drag.kt +0 -56
  588. package/kotlin/fixtures/kotlin-app-variants/Draw.kt +0 -74
  589. package/kotlin/fixtures/kotlin-app-variants/Drawables.kt +0 -53
  590. package/kotlin/fixtures/kotlin-app-variants/Focus.kt +0 -62
  591. package/kotlin/fixtures/kotlin-app-variants/Form.kt +0 -47
  592. package/kotlin/fixtures/kotlin-app-variants/Icons.kt +0 -59
  593. package/kotlin/fixtures/kotlin-app-variants/Ime.kt +0 -53
  594. package/kotlin/fixtures/kotlin-app-variants/Lists.kt +0 -57
  595. package/kotlin/fixtures/kotlin-app-variants/Nav.kt +0 -47
  596. package/kotlin/fixtures/kotlin-app-variants/Note.kt +0 -40
  597. package/kotlin/fixtures/kotlin-app-variants/Overlays.kt +0 -56
  598. package/kotlin/fixtures/kotlin-app-variants/Pan.kt +0 -38
  599. package/kotlin/fixtures/kotlin-app-variants/Pickers.kt +0 -44
  600. package/kotlin/fixtures/kotlin-app-variants/Press.kt +0 -43
  601. package/kotlin/fixtures/kotlin-app-variants/Scroll.kt +0 -63
  602. package/kotlin/fixtures/kotlin-app-variants/Sheet.kt +0 -43
  603. package/kotlin/fixtures/kotlin-app-variants/Strings.kt +0 -49
  604. package/kotlin/fixtures/kotlin-app-variants/Tabs.kt +0 -47
  605. package/kotlin/fixtures/kotlin-app-variants/TextWidth.kt +0 -45
  606. package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +0 -50
  607. package/kotlin/fixtures/kotlin-app-variants/Transition.kt +0 -69
  608. package/kotlin/fixtures/kotlin-app-variants/ViewConfig.kt +0 -22
  609. package/kotlin/fixtures/kotlin-app-variants/Widgets.kt +0 -67
  610. package/kotlin/fixtures/runtime-state/RuntimeState.kt +0 -200
  611. package/kotlin/fork/README.md +0 -97
  612. package/kotlin/fork/build.sh +0 -176
  613. package/kotlin/fork/compose-worker-globals.patch +0 -1247
  614. package/kotlin/fork/fork.json +0 -46
  615. package/kotlin/fork/publish.ts +0 -99
  616. package/kotlin/fork/skia-android-shaping.patch +0 -189
  617. package/kotlin/fork/skiko-local.init.gradle +0 -10
  618. package/kotlin/fork/skiko-worker-clock.patch +0 -122
@@ -1,1247 +0,0 @@
1
- diff --git a/compose/ui/ui-text/src/webMain/kotlin/androidx/compose/ui/text/intl/PlatformLocale.web.kt b/compose/ui/ui-text/src/webMain/kotlin/androidx/compose/ui/text/intl/PlatformLocale.web.kt
2
- --- a/compose/ui/ui-text/src/webMain/kotlin/androidx/compose/ui/text/intl/PlatformLocale.web.kt
3
- +++ b/compose/ui/ui-text/src/webMain/kotlin/androidx/compose/ui/text/intl/PlatformLocale.web.kt
4
- @@ -12,6 +12,10 @@
5
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6
- * See the License for the specific language governing permissions and
7
- * limitations under the License.
8
- + *
9
- + * modified for Peach: an explicit locale provider lets a native host supply
10
- + * device languages without exposing browser navigator fields to guest code.
11
- + * see the fork record for the patch and upstream revision.
12
- */
13
-
14
- package androidx.compose.ui.text.intl
15
- @@ -64,8 +68,18 @@
16
- // The locale code en-001 denotes the English language spoken in the World.
17
- private const val FALLBACK_LANGUAGE_TAG = "en-001"
18
-
19
- +private var currentLocaleProvider: () -> LocaleList = {
20
- + localeListFromLanguageTags(userPreferredLanguages())
21
- +}
22
- +
23
- +// the host installs the device provider before constructing its first scene.
24
- +@InternalComposeUiApi
25
- +fun setPlatformLocaleProvider(provider: () -> LocaleList) {
26
- + currentLocaleProvider = provider
27
- +}
28
- +
29
- internal actual fun createPlatformLocaleDelegate(): PlatformLocaleDelegate =
30
- object : PlatformLocaleDelegate {
31
- override val current: LocaleList
32
- - get() = localeListFromLanguageTags(userPreferredLanguages())
33
- + get() = currentLocaleProvider()
34
- }
35
- diff --git a/compose/ui/ui/src/wasmJsMain/kotlin/androidx/compose/ui/Actuals.wasm.kt b/compose/ui/ui/src/wasmJsMain/kotlin/androidx/compose/ui/Actuals.wasm.kt
36
- index 26aa8ea..aa4f6d4 100644
37
- --- a/compose/ui/ui/src/wasmJsMain/kotlin/androidx/compose/ui/Actuals.wasm.kt
38
- +++ b/compose/ui/ui/src/wasmJsMain/kotlin/androidx/compose/ui/Actuals.wasm.kt
39
- @@ -12,16 +12,22 @@
40
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
41
- * See the License for the specific language governing permissions and
42
- * limitations under the License.
43
- + *
44
- + * Modified for Peach (https://peachsim.com): reads worker-safe globals through
45
- + * globalThis instead of window, so this code runs in a Web Worker as well as a
46
- + * document. See the Peach fork record for the patch and upstream revision.
47
- */
48
-
49
- package androidx.compose.ui
50
-
51
- -import kotlinx.browser.window
52
- +import kotlin.js.js
53
-
54
- internal actual fun areObjectsOfSameType(a: Any, b: Any): Boolean {
55
- return a === b || a::class == b::class
56
- }
57
-
58
- internal actual fun currentTimeMillis(): Long {
59
- - return window.performance.now().toLong()
60
- -}
61
-
62
- + return performanceNow().toLong()
63
- +}
64
- +
65
- +private fun performanceNow(): Double = js("globalThis.performance.now()")
66
- diff --git a/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/platform/PlatformClipboard.web.kt b/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/platform/PlatformClipboard.web.kt
67
- index 7aa3e26..47e20a8 100644
68
- --- a/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/platform/PlatformClipboard.web.kt
69
- +++ b/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/platform/PlatformClipboard.web.kt
70
- @@ -12,6 +12,10 @@
71
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72
- * See the License for the specific language governing permissions and
73
- * limitations under the License.
74
- + *
75
- + * Modified for Peach (https://peachsim.com): reads worker-safe globals through
76
- + * globalThis instead of window, so this code runs in a Web Worker as well as a
77
- + * document. See the Peach fork record for the patch and upstream revision.
78
- */
79
-
80
- package androidx.compose.ui.platform
81
- @@ -34,20 +38,20 @@ actual typealias NativeClipboard = W3CTemporaryClipboard
82
- internal fun isFullClipboardApiSupported(): Boolean =
83
- js(
84
- """Boolean(
85
- - window.navigator.clipboard &&
86
- - window.navigator.clipboard.write &&
87
- - window.navigator.clipboard.read &&
88
- + globalThis.navigator.clipboard &&
89
- + globalThis.navigator.clipboard.write &&
90
- + globalThis.navigator.clipboard.read &&
91
- typeof(ClipboardItem) !== 'undefined'
92
- )
93
- """
94
- )
95
-
96
- -internal fun isSecureContext(): Boolean = js("window.isSecureContext === true")
97
- +internal fun isSecureContext(): Boolean = js("globalThis.isSecureContext === true")
98
-
99
- internal fun isFallbackWriteTextApiAvailable(): Boolean =
100
- - js("Boolean(window.navigator.clipboard && window.navigator.clipboard.writeText)")
101
- + js("Boolean(globalThis.navigator.clipboard && globalThis.navigator.clipboard.writeText)")
102
-
103
- -internal fun getW3CClipboard(): NativeClipboard = js("window.navigator.clipboard")
104
- +internal fun getW3CClipboard(): NativeClipboard = js("globalThis.navigator.clipboard")
105
-
106
- /**
107
- * https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API
108
- diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/SystemTheme.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/SystemTheme.kt
109
- index a14f182..9c4862d 100644
110
- --- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/SystemTheme.kt
111
- +++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/SystemTheme.kt
112
- @@ -12,6 +12,11 @@
113
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
114
- * See the License for the specific language governing permissions and
115
- * limitations under the License.
116
- + *
117
- + * modified for Peach: the system theme composition local is visible to a
118
- + * native host, which provides the device's night mode to the scenes it owns,
119
- + * as later upstream releases expose it. see the fork record for the patch and
120
- + * upstream revision.
121
- */
122
-
123
- package androidx.compose.ui
124
- @@ -27,7 +32,8 @@ enum class SystemTheme {
125
- Dark, Light, Unknown
126
- }
127
-
128
- -internal val LocalSystemTheme = staticCompositionLocalOf { currentSystemTheme }
129
- +@InternalComposeUiApi
130
- +val LocalSystemTheme = staticCompositionLocalOf { currentSystemTheme }
131
-
132
- @InternalComposeUiApi
133
- @Composable
134
- diff --git a/compose/material3/material3/src/webMain/kotlin/androidx/compose/material3/internal/PlatformDateFormat.web.kt b/compose/material3/material3/src/webMain/kotlin/androidx/compose/material3/internal/PlatformDateFormat.web.kt
135
- --- a/compose/material3/material3/src/webMain/kotlin/androidx/compose/material3/internal/PlatformDateFormat.web.kt
136
- +++ b/compose/material3/material3/src/webMain/kotlin/androidx/compose/material3/internal/PlatformDateFormat.web.kt
137
- @@ -12,6 +12,9 @@
138
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139
- * See the License for the specific language governing permissions and
140
- * limitations under the License.
141
- + *
142
- + * modified for Peach: UTC date formatting matches Android independent of the browser time zone.
143
- + * see the fork record for the patch and upstream revision.
144
- */
145
-
146
- @file:OptIn(ExperimentalTime::class)
147
- @@ -74,6 +77,7 @@
148
- jsDate.toLocaleDateString(
149
- locales = locale.toLanguageTag(),
150
- options = dateLocaleOptions {
151
- + timeZone = "UTC"
152
- month = it
153
- }
154
- )
155
- @@ -83,6 +87,7 @@
156
- jsDate.toLocaleDateString(
157
- locales = locale.toLanguageTag(),
158
- options = dateLocaleOptions {
159
- + timeZone = "UTC"
160
- weekday = it
161
- }
162
- )
163
- @@ -106,6 +111,7 @@
164
- return jsDate.toLocaleDateString(
165
- locales = locale.toLanguageTag(),
166
- options = dateLocaleOptions {
167
- + timeZone = "UTC"
168
- when {
169
- skeleton.contains("y", true) -> NUMERIC
170
- else -> null
171
- diff --git a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPaint.nonAndroid.kt b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPaint.nonAndroid.kt
172
- --- a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPaint.nonAndroid.kt
173
- +++ b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPaint.nonAndroid.kt
174
- @@ -12,6 +12,9 @@
175
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
176
- * See the License for the specific language governing permissions and
177
- * limitations under the License.
178
- + *
179
- + * modified for Peach: initial stroke join matches the backing Skia paint and Android default.
180
- + * see the fork record for the patch and upstream revision.
181
- */
182
-
183
- @file:JvmName("SkiaBackedPaint_skikoKt")
184
- @@ -99,7 +102,7 @@
185
- field = value
186
- }
187
-
188
- - override var strokeJoin: StrokeJoin = StrokeJoin.Round
189
- + override var strokeJoin: StrokeJoin = StrokeJoin.Miter
190
- set(value) {
191
- internalSkiaPaint.strokeJoin = value.toSkia()
192
- field = value
193
- diff --git a/navigation/navigation-compose/src/webMain/kotlin/androidx/navigation/compose/DefaultNavTransitions.web.kt b/navigation/navigation-compose/src/webMain/kotlin/androidx/navigation/compose/DefaultNavTransitions.web.kt
194
- --- a/navigation/navigation-compose/src/webMain/kotlin/androidx/navigation/compose/DefaultNavTransitions.web.kt
195
- +++ b/navigation/navigation-compose/src/webMain/kotlin/androidx/navigation/compose/DefaultNavTransitions.web.kt
196
- @@ -12,6 +12,9 @@
197
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
198
- * See the License for the specific language governing permissions and
199
- * limitations under the License.
200
- + *
201
- + * modified for Peach: default navigation transitions match the pinned Android implementation.
202
- + * see the fork record for the patch and upstream revision.
203
- */
204
-
205
- package androidx.navigation.compose
206
- @@ -20,24 +23,29 @@
207
- import androidx.compose.animation.EnterTransition
208
- import androidx.compose.animation.ExitTransition
209
- import androidx.compose.animation.SizeTransform
210
- +import androidx.compose.animation.core.spring
211
- +import androidx.compose.animation.core.tween
212
- +import androidx.compose.animation.fadeIn
213
- +import androidx.compose.animation.fadeOut
214
- +import androidx.compose.animation.scaleOut
215
- import androidx.navigation.NavBackStackEntry
216
-
217
- public actual object DefaultNavTransitions {
218
- public actual val enterTransition:
219
- AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition =
220
- - { EnterTransition.None }
221
- + { fadeIn(animationSpec = tween(700)) }
222
-
223
- public actual val exitTransition:
224
- AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition =
225
- - { ExitTransition.None }
226
- + { fadeOut(animationSpec = tween(700)) }
227
-
228
- public actual val predictivePopEnterTransition:
229
- AnimatedContentTransitionScope<NavBackStackEntry>.(Int) -> EnterTransition =
230
- - { EnterTransition.None }
231
- + { fadeIn(spring(dampingRatio = 1.0f, stiffness = 1600.0f)) }
232
-
233
- public actual val predictivePopExitTransition:
234
- AnimatedContentTransitionScope<NavBackStackEntry>.(Int) -> ExitTransition =
235
- - { ExitTransition.None }
236
- + { scaleOut(targetScale = 0.7f) }
237
-
238
-
239
- public actual val sizeTransform:
240
- diff --git a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoText.nonAndroid.kt b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoText.nonAndroid.kt
241
- --- a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoText.nonAndroid.kt
242
- +++ b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoText.nonAndroid.kt
243
- @@ -1,3 +1,4 @@
244
- +// modified for Peach: Android static text uses integer glyph advances.
245
- /*
246
- * Copyright 2026 The Android Open Source Project
247
- *
248
- @@ -123,7 +124,7 @@
249
- )
250
-
251
- Platform.Android -> FontRasterizationSettings(
252
- - subpixelPositioning = true,
253
- + subpixelPositioning = false,
254
- smoothing = FontSmoothing.AntiAlias,
255
- hinting = FontHinting.Slight,
256
- autoHintingForced = false,
257
- diff --git a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt
258
- --- a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt
259
- +++ b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt
260
- @@ -1,3 +1,4 @@
261
- +// modified for Peach: Android static font sizes and advances follow the native paint.
262
- /*
263
- * Copyright 2020 The Android Open Source Project
264
- *
265
- @@ -19,6 +20,10 @@
266
- package androidx.compose.ui.text.platform
267
-
268
- import androidx.compose.ui.InternalComposeUiApi
269
- +import androidx.compose.ui.text.platform.Platform
270
- +import androidx.compose.ui.text.platform.currentPlatform
271
- +import androidx.compose.ui.text.style.TextMotion
272
- +import kotlin.math.floor
273
- import androidx.compose.ui.geometry.Size
274
- import androidx.compose.ui.graphics.BlendMode
275
- import androidx.compose.ui.graphics.Color
276
- @@ -163,6 +168,8 @@
277
-
278
- fun toSkTextStyle(fontFamilyResolver: FontFamily.Resolver): SkTextStyle {
279
- val res = SkTextStyle()
280
- + val resolvedFontSize = if (currentPlatform() == Platform.Android &&
281
- + !fontRasterizationSettings.subpixelPositioning) floor(fontSize) else fontSize
282
- if (textForegroundStyle.color.isSpecified) {
283
- res.color = textForegroundStyle.color.toArgb()
284
- }
285
- @@ -194,7 +201,7 @@
286
- }
287
-
288
- letterSpacing?.let {
289
- - res.letterSpacing = it
290
- + res.letterSpacing = if (fontSize == 0f) it else it * resolvedFontSize / fontSize
291
- }
292
-
293
- res.addFontFeatures(FontFeature.parseW3(fontFeatureSettings.orEmpty()))
294
- @@ -338,6 +345,7 @@
295
- blendMode: BlendMode = DrawScope.DefaultBlendMode,
296
- lineHeight: TextUnit,
297
- lineHeightStyle: LineHeightStyle?,
298
- + textMotion: TextMotion?,
299
- ) = ComputedStyle.Mutable(
300
- textForegroundStyle = spanStyle.toParagraphTextForegroundStyle(),
301
- brushSize = brushSize,
302
- @@ -347,7 +355,10 @@
303
- fontSynthesis = spanStyle.fontSynthesis,
304
- fontFamily = spanStyle.fontFamily,
305
- fontFeatureSettings = spanStyle.fontFeatureSettings,
306
- - fontRasterizationSettings = platformParagraphStyle?.fontRasterizationSettings ?: FontRasterizationSettings.PlatformDefault,
307
- + fontRasterizationSettings = platformParagraphStyle?.fontRasterizationSettings ?:
308
- + if (currentPlatform() == Platform.Android && textMotion === TextMotion.Animated) {
309
- + FontRasterizationSettings(FontSmoothing.AntiAlias, FontHinting.Slight, true, false)
310
- + } else FontRasterizationSettings.PlatformDefault,
311
- letterSpacing = if (spanStyle.letterSpacing.isSpecified) {
312
- with(density) { spanStyle.letterSpacing.toPx() }
313
- } else null,
314
- @@ -401,6 +412,7 @@
315
- blendMode = blendMode,
316
- lineHeight = textStyle.lineHeight,
317
- lineHeightStyle = textStyle.lineHeightStyle,
318
- + textMotion = textStyle.textMotion,
319
- ).toImmutable()
320
- }
321
-
322
- @@ -609,7 +621,8 @@
323
- brushSize = brushSize,
324
- blendMode = blendMode,
325
- lineHeight = textStyle.lineHeight,
326
- - lineHeightStyle = textStyle.lineHeightStyle
327
- + lineHeightStyle = textStyle.lineHeightStyle,
328
- + textMotion = textStyle.textMotion,
329
- )
330
- for (i in 1 until activeStyles.size) {
331
- style.merge(density, activeStyles[i])
332
- diff --git a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoParagraph.nonAndroid.kt b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoParagraph.nonAndroid.kt
333
- --- a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoParagraph.nonAndroid.kt
334
- +++ b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoParagraph.nonAndroid.kt
335
- @@ -1,3 +1,4 @@
336
- +// modified for peach: Android text bounds and intrinsic padding match the platform.
337
- /*
338
- * Copyright 2023 The Android Open Source Project
339
- *
340
- @@ -35,6 +36,8 @@
341
- import androidx.compose.ui.graphics.toComposeRect
342
- import androidx.compose.ui.text.PlatformParagraph
343
- import androidx.compose.ui.text.platform.SkikoParagraphIntrinsics
344
- +import androidx.compose.ui.text.platform.Platform
345
- +import androidx.compose.ui.text.platform.currentPlatform
346
- import androidx.compose.ui.text.platform.cursorHorizontalPosition
347
- import androidx.compose.ui.text.style.LineHeightStyle
348
- import androidx.compose.ui.text.style.ResolvedTextDirection
349
- @@ -43,6 +46,7 @@
350
- import androidx.compose.ui.text.style.TextOverflow
351
- import androidx.compose.ui.unit.Constraints
352
- import androidx.compose.ui.unit.isUnspecified
353
- +import kotlin.math.ceil
354
- import kotlin.math.floor
355
- import org.jetbrains.skia.FontMetrics
356
- import org.jetbrains.skia.IRange
357
- @@ -216,11 +220,31 @@
358
- )
359
- }
360
-
361
- + private val usesAndroidBoringLayout: Boolean
362
- + get() = paragraphIntrinsics.androidBoringMetrics &&
363
- + maxIntrinsicWidth <= width && lineCount == 1 && !didExceedMaxLines
364
- +
365
- override fun getLineLeft(lineIndex: Int): Float =
366
- - lineMetrics.getOrNull(lineIndex)?.left?.toFloat() ?: 0f
367
- + lineMetrics.getOrNull(lineIndex)?.let { line ->
368
- + if (currentPlatform() == Platform.Android && paragraphIntrinsics.style.textAlign == TextAlign.Center) {
369
- + floor((width - line.width.toFloat()) / 2)
370
- + } else if (usesAndroidBoringLayout) {
371
- + if (paragraphIntrinsics.style.textAlign == TextAlign.Right ||
372
- + paragraphIntrinsics.style.textAlign == TextAlign.End)
373
- + width - paragraphIntrinsics.androidBoringWidth else 0f
374
- + } else line.left.toFloat()
375
- + } ?: 0f
376
-
377
- override fun getLineRight(lineIndex: Int): Float =
378
- - lineMetrics.getOrNull(lineIndex)?.right?.toFloat() ?: 0f
379
- + lineMetrics.getOrNull(lineIndex)?.let { line ->
380
- + if (currentPlatform() == Platform.Android && paragraphIntrinsics.style.textAlign == TextAlign.Center) {
381
- + ceil((width + line.width.toFloat()) / 2)
382
- + } else if (usesAndroidBoringLayout) {
383
- + if (paragraphIntrinsics.style.textAlign == TextAlign.Right ||
384
- + paragraphIntrinsics.style.textAlign == TextAlign.End)
385
- + width else paragraphIntrinsics.androidBoringWidth
386
- + } else line.right.toFloat()
387
- + } ?: 0f
388
-
389
- override fun getLineTop(lineIndex: Int) =
390
- lineMetrics.getOrNull(lineIndex)?.let { line ->
391
- diff --git a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphIntrinsics.nonAndroid.kt b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphIntrinsics.nonAndroid.kt
392
- --- a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphIntrinsics.nonAndroid.kt
393
- +++ b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphIntrinsics.nonAndroid.kt
394
- @@ -1,3 +1,4 @@
395
- +// modified for peach: Android text bounds and intrinsic padding match the platform.
396
- @file:OptIn(InternalComposeUiApi::class)
397
-
398
- /*
399
- @@ -23,9 +24,12 @@
400
- import androidx.compose.ui.InternalComposeUiApi
401
- import androidx.compose.ui.text.AnnotatedString
402
- import androidx.compose.ui.text.AnnotatedString.Range
403
- +import androidx.compose.ui.text.Bullet
404
- +import androidx.compose.ui.text.ParagraphStyle
405
- import androidx.compose.ui.text.ParagraphIntrinsics
406
- import androidx.compose.ui.text.Placeholder
407
- import androidx.compose.ui.text.StrongDirectionType
408
- +import androidx.compose.ui.text.SpanStyle
409
- import androidx.compose.ui.text.TextStyle
410
- import androidx.compose.ui.text.firstStrongDirectionType
411
- import androidx.compose.ui.text.font.FontFamily
412
- @@ -33,19 +37,40 @@
413
- import androidx.compose.ui.text.intl.LocaleList
414
- import androidx.compose.ui.text.intl.isRtl
415
- import androidx.compose.ui.text.style.ResolvedTextDirection
416
- +import androidx.compose.ui.text.style.TextIndent
417
- import androidx.compose.ui.text.style.TextDirection
418
- import androidx.compose.ui.unit.Density
419
- +import androidx.compose.ui.unit.TextUnit
420
- +import androidx.compose.ui.unit.isUnspecified
421
- import kotlin.math.ceil
422
-
423
- internal class SkikoParagraphIntrinsics(
424
- val text: String,
425
- - private val style: TextStyle,
426
- + val style: TextStyle,
427
- private val annotations: List<AnnotatedString.Range<out AnnotatedString.Annotation>>,
428
- private val placeholders: List<Range<Placeholder>>,
429
- private val density: Density,
430
- private val fontFamilyResolver: FontFamily.Resolver
431
- ) : ParagraphIntrinsics {
432
- val textDirection = resolveTextDirection(text, style.textDirection, style.localeList)
433
- +
434
- + // android boring layout ceilings the extent without rounding glyph positions.
435
- + val androidBoringMetrics = currentPlatform() == Platform.Android &&
436
- + textDirection == ResolvedTextDirection.Ltr && style.lineHeight.isUnspecified &&
437
- + (style.textIndent == null || style.textIndent == TextIndent.None) &&
438
- + style.baselineShift?.multiplier?.let { it == 0f } != false &&
439
- + placeholders.isEmpty() && annotations.none {
440
- + val annotation = it.item
441
- + annotation is ParagraphStyle || annotation is Bullet ||
442
- + (annotation is SpanStyle && annotation.baselineShift?.multiplier?.let { it != 0f } == true)
443
- + } && text.none {
444
- + it == '\n' || it == '\t' || it in '\u0590'..'\u08FF' ||
445
- + it == '\u200E' || it == '\u200F' || it in '\u202A'..'\u202E' ||
446
- + it in '\u2066'..'\u2069' || it in '\uD800'..'\uDFFF' ||
447
- + it in '\uFB1D'..'\uFDFF' || it in '\uFE70'..'\uFEFE'
448
- + }
449
- + var androidBoringWidth = 0f
450
- + private set
451
-
452
- //we need to track it reactively to invalidate the UI
453
- override var hasStaleResolvedFonts: Boolean by mutableStateOf(false)
454
- @@ -79,6 +104,17 @@
455
- val para = layouter!!.layoutParagraph(Float.POSITIVE_INFINITY)
456
- minIntrinsicWidth = ceil(para.minIntrinsicWidth)
457
- maxIntrinsicWidth = ceil(para.maxIntrinsicWidth)
458
- + androidBoringWidth = maxIntrinsicWidth
459
- + val hasLetterSpacing =
460
- + (style.letterSpacing != TextUnit.Unspecified && style.letterSpacing.value != 0f) ||
461
- + annotations.any {
462
- + val span = it.item
463
- + span is SpanStyle && span.letterSpacing != TextUnit.Unspecified &&
464
- + span.letterSpacing.value != 0f
465
- + }
466
- + if (currentPlatform() == Platform.Android && maxIntrinsicWidth != 0f && hasLetterSpacing) {
467
- + maxIntrinsicWidth += 0.5f
468
- + }
469
- }
470
- }
471
-
472
- diff --git a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt
473
- --- a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt
474
- +++ b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt
475
- @@ -832,7 +832,7 @@
476
- return when (this) {
477
- TextAlign.Left -> SkAlignment.LEFT
478
- TextAlign.Right -> SkAlignment.RIGHT
479
- - TextAlign.Center -> SkAlignment.CENTER
480
- + TextAlign.Center -> if (currentPlatform() == Platform.Android) SkAlignment.CENTER_ANDROID else SkAlignment.CENTER
481
- TextAlign.Justify -> SkAlignment.JUSTIFY
482
- TextAlign.Start -> SkAlignment.START
483
- TextAlign.End -> SkAlignment.END
484
- diff --git a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/RequestFocusOnClick.web.kt b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/RequestFocusOnClick.web.kt
485
- --- a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/RequestFocusOnClick.web.kt
486
- +++ b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/RequestFocusOnClick.web.kt
487
- @@ -12,8 +12,11 @@
488
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
489
- * See the License for the specific language governing permissions and
490
- * limitations under the License.
491
- + *
492
- + * modified for Peach: Android touch focus keeps sibling controls from
493
- + * taking the active field on press. see the fork record for the source pin.
494
- */
495
-
496
- package androidx.compose.foundation
497
-
498
- -internal actual fun isRequestFocusOnClickEnabled(): Boolean = true
499
- +internal actual fun isRequestFocusOnClickEnabled(): Boolean = false
500
- diff --git a/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/focus/Focusability.web.kt b/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/focus/Focusability.web.kt
501
- --- a/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/focus/Focusability.web.kt
502
- +++ b/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/focus/Focusability.web.kt
503
- @@ -12,10 +12,14 @@
504
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
505
- * See the License for the specific language governing permissions and
506
- * limitations under the License.
507
- + *
508
- + * modified for Peach: Android touch focus keeps sibling controls from
509
- + * taking the active field on press. see the fork record for the source pin.
510
- */
511
-
512
- package androidx.compose.ui.focus
513
-
514
- import androidx.compose.ui.node.CompositionLocalConsumerModifierNode
515
-
516
- -internal actual fun systemDefinedCanFocus(node: CompositionLocalConsumerModifierNode) = true
517
-
518
- +internal actual fun systemDefinedCanFocus(node: CompositionLocalConsumerModifierNode) =
519
- + mobilePlatformSystemDefinedCanFocus(node)
520
- diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformContext.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformContext.skiko.kt
521
- --- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformContext.skiko.kt
522
- +++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformContext.skiko.kt
523
- @@ -13,4 +13,7 @@
524
- * See the License for the specific language governing permissions and
525
- * limitations under the License.
526
- + *
527
- + * modified for Peach: dialogs attach a distinct native receiving window and
528
- + * navigation dispatcher, isolating back from the activity underneath.
529
- */
530
-
531
- @@ -51,4 +54,5 @@
532
- import androidx.compose.ui.text.intl.LocaleList
533
- import androidx.compose.ui.unit.Dp
534
- +import androidx.navigationevent.NavigationEventDispatcher
535
- import androidx.lifecycle.Lifecycle
536
- import androidx.lifecycle.LifecycleOwner
537
- @@ -83,4 +87,8 @@
538
- */
539
- val architectureComponentsOwner: PlatformArchitectureComponentsOwner get() = EmptyArchitectureComponentsOwner
540
- +
541
- + // the host owns a dialog window until its composition is disposed.
542
- + fun attachDialogWindow(dispatcher: NavigationEventDispatcher): AutoCloseable =
543
- + error("the native host must attach a dialog receiving window")
544
-
545
- /**
546
- diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Dialog.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Dialog.skiko.kt
547
- --- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Dialog.skiko.kt
548
- +++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Dialog.skiko.kt
549
- @@ -13,4 +13,7 @@
550
- * See the License for the specific language governing permissions and
551
- * limitations under the License.
552
- + *
553
- + * modified for Peach: dialogs attach a distinct native receiving window and
554
- + * navigation dispatcher, isolating back from the activity underneath.
555
- */
556
-
557
- @@ -19,4 +22,5 @@
558
- import androidx.compose.runtime.Composable
559
- import androidx.compose.runtime.CompositionContext
560
- +import androidx.compose.runtime.CompositionLocalProvider
561
- import androidx.compose.runtime.DisposableEffect
562
- import androidx.compose.runtime.Immutable
563
- @@ -34,4 +38,5 @@
564
- import androidx.compose.ui.ComposeUiFlags
565
- import androidx.compose.ui.ExperimentalComposeUiApi
566
- +import androidx.compose.ui.InternalComposeUiApi
567
- import androidx.compose.ui.Modifier
568
- import androidx.compose.ui.MotionDurationScale
569
- @@ -57,4 +62,6 @@
570
- import androidx.compose.ui.platform.union
571
- import androidx.compose.ui.scene.ComposeSceneLayer
572
- +import androidx.compose.ui.scene.LocalComposeSceneContext
573
- +import androidx.compose.ui.scene.requireCurrent
574
- import androidx.compose.ui.scene.Content
575
- import androidx.compose.ui.scene.rememberComposeSceneLayer
576
- @@ -65,4 +72,6 @@
577
- import androidx.compose.ui.unit.center
578
- import androidx.navigationevent.compose.LocalNavigationEventDispatcherOwner
579
- +import androidx.navigationevent.NavigationEventDispatcher
580
- +import androidx.navigationevent.NavigationEventDispatcherOwner
581
- import kotlin.coroutines.CoroutineContext
582
- import kotlin.time.Duration.Companion.seconds
583
- @@ -167,5 +176,5 @@
584
- }
585
-
586
- -@OptIn(InternalComposeApi::class)
587
- +@OptIn(InternalComposeApi::class, InternalComposeUiApi::class)
588
- @Composable
589
- actual fun Dialog(
590
- @@ -182,8 +191,15 @@
591
- onBackHandler.backClickIsEnabled = properties.dismissOnBackPress
592
- }
593
- - val navigationEventDispatcher =
594
- - requireNotNull(LocalNavigationEventDispatcherOwner.current) {
595
- - error("NavigationEventDispatcherOwner not found")
596
- - }.navigationEventDispatcher
597
- + val dialogOwner = remember {
598
- + object : NavigationEventDispatcherOwner {
599
- + override val navigationEventDispatcher = NavigationEventDispatcher()
600
- + }
601
- + }
602
- + val navigationEventDispatcher = dialogOwner.navigationEventDispatcher
603
- + val platformContext = LocalComposeSceneContext.requireCurrent().platformContext
604
- + DisposableEffect(platformContext, navigationEventDispatcher) {
605
- + val window = platformContext.attachDialogWindow(navigationEventDispatcher)
606
- + onDispose { window.close(); navigationEventDispatcher.dispose() }
607
- + }
608
- DisposableEffect(navigationEventDispatcher, onBackHandler) {
609
- navigationEventDispatcher.addHandler(onBackHandler)
610
- @@ -208,5 +224,7 @@
611
- onOutsidePointerEvent = onOutsidePointerEvent,
612
- properties = properties,
613
- - content = content
614
- + content = {
615
- + CompositionLocalProvider(LocalNavigationEventDispatcherOwner provides dialogOwner, content = content)
616
- + }
617
- )
618
- }
619
- diff --git a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/Magnifier.web.kt b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/Magnifier.web.kt
620
- new file mode 100644
621
- --- /dev/null
622
- +++ b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/Magnifier.web.kt
623
- @@ -0,0 +1,470 @@
624
- +/*
625
- + * Copyright 2021 The Android Open Source Project
626
- + *
627
- + * Licensed under the Apache License, Version 2.0 (the "License");
628
- + * you may not use this file except in compliance with the License.
629
- + * You may obtain a copy of the License at
630
- + *
631
- + * http://www.apache.org/licenses/LICENSE-2.0
632
- + *
633
- + * Unless required by applicable law or agreed to in writing, software
634
- + * distributed under the License is distributed on an "AS IS" BASIS,
635
- + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
636
- + * See the License for the specific language governing permissions and
637
- + * limitations under the License.
638
- + */
639
- +
640
- +package androidx.compose.foundation
641
- +
642
- +// modified by peach: android magnifier lifecycle with a scene-owned native backend.
643
- +
644
- +import androidx.compose.runtime.State
645
- +import androidx.compose.runtime.derivedStateOf
646
- +import androidx.compose.runtime.getValue
647
- +import androidx.compose.runtime.mutableStateOf
648
- +import androidx.compose.runtime.neverEqualPolicy
649
- +import androidx.compose.runtime.setValue
650
- +import androidx.compose.runtime.withFrameMillis
651
- +import androidx.compose.ui.Modifier
652
- +import androidx.compose.ui.composed
653
- +import androidx.compose.ui.geometry.Offset
654
- +import androidx.compose.ui.geometry.isSpecified
655
- +import androidx.compose.ui.graphics.drawscope.ContentDrawScope
656
- +import androidx.compose.ui.layout.LayoutCoordinates
657
- +import androidx.compose.ui.layout.positionInRoot
658
- +import androidx.compose.ui.node.DrawModifierNode
659
- +import androidx.compose.ui.node.GlobalPositionAwareModifierNode
660
- +import androidx.compose.ui.node.ModifierNodeElement
661
- +import androidx.compose.ui.node.ObserverModifierNode
662
- +import androidx.compose.ui.node.SemanticsModifierNode
663
- +import androidx.compose.ui.node.observeReads
664
- +import androidx.compose.ui.node.requireDensity
665
- +import androidx.compose.ui.platform.InspectorInfo
666
- +import androidx.compose.ui.semantics.SemanticsPropertyKey
667
- +import androidx.compose.ui.semantics.SemanticsPropertyReceiver
668
- +import androidx.compose.ui.unit.Density
669
- +import androidx.compose.ui.unit.Dp
670
- +import androidx.compose.ui.unit.DpSize
671
- +import androidx.compose.ui.unit.IntSize
672
- +import androidx.compose.ui.unit.toSize
673
- +import kotlinx.coroutines.CoroutineStart
674
- +import kotlinx.coroutines.channels.Channel
675
- +import kotlinx.coroutines.launch
676
- +
677
- +/**
678
- + * A function on elements that are magnified with a [magnifier] modifier that returns the position
679
- + * of the center of the magnified content in the coordinate space of the root composable.
680
- + */
681
- +internal val MagnifierPositionInRoot = SemanticsPropertyKey<() -> Offset>("MagnifierPositionInRoot")
682
- +
683
- +/**
684
- + * Shows a [Magnifier] widget that shows an enlarged version of the content at [sourceCenter]
685
- + * relative to the current layout node.
686
- + *
687
- + * This function returns a no-op modifier on API levels below P (28), since the framework does not
688
- + * support the [Magnifier] widget on those levels. However, even on higher API levels, not all
689
- + * magnifier features are supported on all platforms. Please refer to parameter explanations below
690
- + * to learn more about supported features on different platform versions.
691
- + *
692
- + * This function does not allow configuration of [source bounds][Magnifier.Builder.setSourceBounds]
693
- + * since the magnifier widget does not support constraining to the bounds of composables.
694
- + *
695
- + * @sample androidx.compose.foundation.samples.MagnifierSample
696
- + * @param sourceCenter The offset of the center of the magnified content. Measured in pixels from
697
- + * the top-left of the layout node this modifier is applied to. This offset is passed to
698
- + * [Magnifier.show].
699
- + * @param magnifierCenter The offset of the magnifier widget itself, where the magnified content is
700
- + * rendered over the original content. Measured in density-independent pixels from the top-left of
701
- + * the layout node this modifier is applied to. If left null or returns an
702
- + * [unspecified][DpOffset.Unspecified] value, the magnifier widget will be placed at a default
703
- + * offset relative to [sourceCenter]. The value of that offset is specified by the system.
704
- + * @param onSizeChanged An optional callback that will be invoked when the magnifier widget is
705
- + * initialized to report on its actual size. This can be useful when [size] parameter is left
706
- + * unspecified.
707
- + * @param zoom See [Magnifier.setZoom]. Only supported on API 29+.
708
- + * @param size See [Magnifier.Builder.setSize]. Only supported on API 29+.
709
- + * @param cornerRadius See [Magnifier.Builder.setCornerRadius]. Only supported on API 29+.
710
- + * @param elevation See [Magnifier.Builder.setElevation]. Only supported on API 29+.
711
- + * @param clip See [Magnifier.Builder.setClippingEnabled]. Only supported on API 29+.
712
- + */
713
- +public fun Modifier.magnifier(
714
- + sourceCenter: Density.() -> Offset,
715
- + magnifierCenter: (Density.() -> Offset)? = null,
716
- + onSizeChanged: ((DpSize) -> Unit)? = null,
717
- + zoom: Float = Float.NaN,
718
- + size: DpSize = DpSize.Unspecified,
719
- + cornerRadius: Dp = Dp.Unspecified,
720
- + elevation: Dp = Dp.Unspecified,
721
- + clip: Boolean = true,
722
- +): Modifier {
723
- + return magnifier(
724
- + sourceCenter = sourceCenter,
725
- + magnifierCenter = magnifierCenter,
726
- + onSizeChanged = onSizeChanged,
727
- + zoom = zoom,
728
- + useTextDefault = false,
729
- + size = size,
730
- + cornerRadius = cornerRadius,
731
- + elevation = elevation,
732
- + clippingEnabled = clip,
733
- + )
734
- +}
735
- +
736
- +/**
737
- + * For testing and internal Text usage purposes.
738
- + *
739
- + * TextField and SelectionManager uses this internal API to pass `useTextDefault` as true.
740
- + */
741
- +internal fun Modifier.magnifier(
742
- + sourceCenter: Density.() -> Offset,
743
- + magnifierCenter: (Density.() -> Offset)? = null,
744
- + onSizeChanged: ((DpSize) -> Unit)? = null,
745
- + zoom: Float = Float.NaN,
746
- + useTextDefault: Boolean = false,
747
- + size: DpSize = DpSize.Unspecified,
748
- + cornerRadius: Dp = Dp.Unspecified,
749
- + elevation: Dp = Dp.Unspecified,
750
- + clippingEnabled: Boolean = true,
751
- + platformMagnifierFactory: PlatformMagnifierFactory? = null,
752
- +): Modifier {
753
- + return composed {
754
- + MagnifierElement(
755
- + sourceCenter = sourceCenter,
756
- + magnifierCenter = magnifierCenter,
757
- + onSizeChanged = onSizeChanged,
758
- + useTextDefault = useTextDefault,
759
- + zoom = zoom,
760
- + size = size,
761
- + cornerRadius = cornerRadius,
762
- + elevation = elevation,
763
- + clippingEnabled = clippingEnabled,
764
- + platformMagnifierFactory = platformMagnifierFactory ?: LocalPlatformMagnifierFactory.current,
765
- + )
766
- + }
767
- +}
768
- +
769
- +internal class MagnifierElement(
770
- + private val sourceCenter: Density.() -> Offset,
771
- + private val magnifierCenter: (Density.() -> Offset)? = null,
772
- + private val onSizeChanged: ((DpSize) -> Unit)? = null,
773
- + private val zoom: Float = Float.NaN,
774
- + private val useTextDefault: Boolean = false,
775
- + private val size: DpSize = DpSize.Unspecified,
776
- + private val cornerRadius: Dp = Dp.Unspecified,
777
- + private val elevation: Dp = Dp.Unspecified,
778
- + private val clippingEnabled: Boolean = true,
779
- + private val platformMagnifierFactory: PlatformMagnifierFactory,
780
- +) : ModifierNodeElement<MagnifierNode>() {
781
- +
782
- + override fun create(): MagnifierNode {
783
- + return MagnifierNode(
784
- + sourceCenter = sourceCenter,
785
- + magnifierCenter = magnifierCenter,
786
- + zoom = zoom,
787
- + useTextDefault = useTextDefault,
788
- + size = size,
789
- + cornerRadius = cornerRadius,
790
- + elevation = elevation,
791
- + clippingEnabled = clippingEnabled,
792
- + onSizeChanged = onSizeChanged,
793
- + platformMagnifierFactory = platformMagnifierFactory,
794
- + )
795
- + }
796
- +
797
- + override fun update(node: MagnifierNode) {
798
- + node.update(
799
- + sourceCenter = sourceCenter,
800
- + magnifierCenter = magnifierCenter,
801
- + zoom = zoom,
802
- + useTextDefault = useTextDefault,
803
- + size = size,
804
- + cornerRadius = cornerRadius,
805
- + elevation = elevation,
806
- + clippingEnabled = clippingEnabled,
807
- + onSizeChanged = onSizeChanged,
808
- + platformMagnifierFactory = platformMagnifierFactory,
809
- + )
810
- + }
811
- +
812
- + override fun equals(other: Any?): Boolean {
813
- + if (this === other) return true
814
- + if (other !is MagnifierElement) return false
815
- +
816
- + if (sourceCenter !== other.sourceCenter) return false
817
- + if (magnifierCenter !== other.magnifierCenter) return false
818
- + if (zoom != other.zoom) return false
819
- + if (useTextDefault != other.useTextDefault) return false
820
- + if (size != other.size) return false
821
- + if (cornerRadius != other.cornerRadius) return false
822
- + if (elevation != other.elevation) return false
823
- + if (clippingEnabled != other.clippingEnabled) return false
824
- + if (onSizeChanged !== other.onSizeChanged) return false
825
- + if (platformMagnifierFactory != other.platformMagnifierFactory) return false
826
- +
827
- + return true
828
- + }
829
- +
830
- + override fun hashCode(): Int {
831
- + var result = sourceCenter.hashCode()
832
- + result = 31 * result + magnifierCenter.hashCode()
833
- + result = 31 * result + zoom.hashCode()
834
- + result = 31 * result + useTextDefault.hashCode()
835
- + result = 31 * result + size.hashCode()
836
- + result = 31 * result + cornerRadius.hashCode()
837
- + result = 31 * result + elevation.hashCode()
838
- + result = 31 * result + clippingEnabled.hashCode()
839
- + result = 31 * result + (onSizeChanged?.hashCode() ?: 0)
840
- + result = 31 * result + platformMagnifierFactory.hashCode()
841
- + return result
842
- + }
843
- +
844
- + override fun InspectorInfo.inspectableProperties() {
845
- + name = "magnifier"
846
- + properties["sourceCenter"] = sourceCenter
847
- + properties["magnifierCenter"] = magnifierCenter
848
- + properties["zoom"] = zoom
849
- + properties["size"] = size
850
- + properties["cornerRadius"] = cornerRadius
851
- + properties["elevation"] = elevation
852
- + properties["clippingEnabled"] = clippingEnabled
853
- + }
854
- +}
855
- +
856
- +internal class MagnifierNode(
857
- + var sourceCenter: Density.() -> Offset,
858
- + var magnifierCenter: (Density.() -> Offset)? = null,
859
- + var onSizeChanged: ((DpSize) -> Unit)? = null,
860
- + var zoom: Float = Float.NaN,
861
- + var useTextDefault: Boolean = false,
862
- + var size: DpSize = DpSize.Unspecified,
863
- + var cornerRadius: Dp = Dp.Unspecified,
864
- + var elevation: Dp = Dp.Unspecified,
865
- + var clippingEnabled: Boolean = true,
866
- + var platformMagnifierFactory: PlatformMagnifierFactory,
867
- +) :
868
- + Modifier.Node(),
869
- + GlobalPositionAwareModifierNode,
870
- + DrawModifierNode,
871
- + SemanticsModifierNode,
872
- + ObserverModifierNode {
873
- +
874
- + /**
875
- + * Current density provided by [requireDensity]. Used as a receiver to callback functions that
876
- + * are expected return pixel targeted offsets.
877
- + */
878
- + private var density: Density? = null
879
- +
880
- + /** Current magnifier instance. */
881
- + private var magnifier: PlatformMagnifier? = null
882
- +
883
- + /**
884
- + * The latest [LayoutCoordinates] that is reported by [onGloballyPositioned] callback. Using
885
- + * [neverEqualPolicy] guarantees that every update to this value restarts snapshots aware
886
- + * listeners since the [LayoutCoordinates] instance itself does not change.
887
- + */
888
- + private var layoutCoordinates: LayoutCoordinates? by mutableStateOf(null, neverEqualPolicy())
889
- +
890
- + /**
891
- + * Lazily initialized state that keeps track of anchor Composable's position in root layout.
892
- + * This state should be derived from [layoutCoordinates]. This variable shouldn't be used
893
- + * directly from the code, only [anchorPositionInRoot] should initialize and read from this.
894
- + */
895
- + private var anchorPositionInRootState: State<Offset>? = null
896
- +
897
- + private val anchorPositionInRoot: Offset
898
- + get() {
899
- + if (anchorPositionInRootState == null) {
900
- + anchorPositionInRootState = derivedStateOf {
901
- + layoutCoordinates?.positionInRoot() ?: Offset.Unspecified
902
- + }
903
- + }
904
- + return anchorPositionInRootState?.value ?: Offset.Unspecified
905
- + }
906
- +
907
- + /**
908
- + * Position where [sourceCenter] is mapped on root layout. This is passed to platform magnifier
909
- + * to precisely target the requested location.
910
- + */
911
- + private var sourceCenterInRoot: Offset = Offset.Unspecified
912
- +
913
- + /**
914
- + * Last reported size to [onSizeChanged]. This is compared to the current size before calling
915
- + * the lambda again.
916
- + */
917
- + private var previousSize: IntSize? = null
918
- +
919
- + private var drawSignalChannel: Channel<Unit>? = null
920
- +
921
- + fun update(
922
- + sourceCenter: Density.() -> Offset,
923
- + magnifierCenter: (Density.() -> Offset)?,
924
- + zoom: Float,
925
- + useTextDefault: Boolean,
926
- + size: DpSize,
927
- + cornerRadius: Dp,
928
- + elevation: Dp,
929
- + clippingEnabled: Boolean,
930
- + onSizeChanged: ((DpSize) -> Unit)?,
931
- + platformMagnifierFactory: PlatformMagnifierFactory,
932
- + ) {
933
- + val previousZoom = this.zoom
934
- + val previousSize = this.size
935
- + val previousCornerRadius = this.cornerRadius
936
- + val previousUseTextDefault = this.useTextDefault
937
- + val previousElevation = this.elevation
938
- + val previousClippingEnabled = this.clippingEnabled
939
- + val previousPlatformMagnifierFactory = this.platformMagnifierFactory
940
- + val previousDensity = this.density
941
- +
942
- + this.sourceCenter = sourceCenter
943
- + this.magnifierCenter = magnifierCenter
944
- + this.zoom = zoom
945
- + this.useTextDefault = useTextDefault
946
- + this.size = size
947
- + this.cornerRadius = cornerRadius
948
- + this.elevation = elevation
949
- + this.clippingEnabled = clippingEnabled
950
- + this.onSizeChanged = onSizeChanged
951
- + this.platformMagnifierFactory = platformMagnifierFactory
952
- +
953
- + val density = requireDensity()
954
- +
955
- + val shouldRecreate =
956
- + magnifier != null && // only recreate if it was already created
957
- + // On platforms >=Q, the zoom level can be updated dynamically on an existing
958
- + // magnifier,
959
- + // so if the zoom changes between recompositions we don't need to recreate the
960
- + // magnifier. On older platforms, the zoom can only be set initially, so we use the
961
- + // zoom itself as a key so the magnifier gets recreated if it changes.
962
- + ((!zoom.equalsIncludingNaN(previousZoom) &&
963
- + !platformMagnifierFactory.canUpdateZoom) ||
964
- + size != previousSize ||
965
- + cornerRadius != previousCornerRadius ||
966
- + elevation != previousElevation ||
967
- + useTextDefault != previousUseTextDefault ||
968
- + clippingEnabled != previousClippingEnabled ||
969
- + platformMagnifierFactory != previousPlatformMagnifierFactory ||
970
- + density != previousDensity)
971
- +
972
- + if (shouldRecreate) {
973
- + recreateMagnifier()
974
- + }
975
- +
976
- + updateMagnifier()
977
- + }
978
- +
979
- + override fun onAttach() {
980
- + onObservedReadsChanged()
981
- + drawSignalChannel = Channel()
982
- + // Launch undispatched, otherwise we could miss the first draw signal
983
- + coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) {
984
- + while (true) {
985
- + drawSignalChannel?.receive()
986
- + // don't update the magnifier immediately, actual frame draw happens right after
987
- + // all draw commands are recorded. Magnifier update should happen in the next frame.
988
- + if (magnifier != null) {
989
- + withFrameMillis {}
990
- + magnifier?.updateContent()
991
- + }
992
- + }
993
- + }
994
- + }
995
- +
996
- + override fun onDetach() {
997
- + magnifier?.dismiss()
998
- + magnifier = null
999
- + }
1000
- +
1001
- + override fun onObservedReadsChanged() {
1002
- + observeReads { updateMagnifier() }
1003
- + }
1004
- +
1005
- + private fun recreateMagnifier() {
1006
- + magnifier?.dismiss()
1007
- + val density = (density ?: requireDensity()).also { density = it }
1008
- + magnifier =
1009
- + platformMagnifierFactory.create(
1010
- + useTextDefault = useTextDefault,
1011
- + size = size,
1012
- + cornerRadius = cornerRadius,
1013
- + elevation = elevation,
1014
- + clippingEnabled = clippingEnabled,
1015
- + density = density,
1016
- + initialZoom = zoom,
1017
- + )
1018
- + updateSizeIfNecessary()
1019
- + }
1020
- +
1021
- + private fun updateMagnifier() {
1022
- + val density = density ?: requireDensity().also { density = it }
1023
- +
1024
- + val sourceCenterOffset = sourceCenter(density)
1025
- +
1026
- + // the order of these checks are important since we don't want to query
1027
- + // `anchorPositionInRoot` if `sourceCenterOffset` is unspecified.
1028
- + if (sourceCenterOffset.isSpecified && anchorPositionInRoot.isSpecified) {
1029
- + sourceCenterInRoot = anchorPositionInRoot + sourceCenterOffset
1030
- + // Calculate magnifier center if it's provided. Only accept if the returned
1031
- + // value is specified. Then add [anchorPositionInRoot] for relative positioning.
1032
- + val magnifierCenter =
1033
- + magnifierCenter
1034
- + ?.invoke(density)
1035
- + ?.takeIf { it.isSpecified }
1036
- + ?.let { anchorPositionInRoot + it } ?: Offset.Unspecified
1037
- +
1038
- + if (magnifier == null) {
1039
- + recreateMagnifier()
1040
- + }
1041
- +
1042
- + magnifier?.update(
1043
- + sourceCenter = sourceCenterInRoot,
1044
- + magnifierCenter = magnifierCenter,
1045
- + zoom = zoom,
1046
- + )
1047
- + updateSizeIfNecessary()
1048
- + return
1049
- + }
1050
- +
1051
- + // If the flow reaches here, it means that the magnifier could not be placed at a specified
1052
- + // position. We now need to hide it so it doesn't show up at an invalid location.
1053
- + sourceCenterInRoot = Offset.Unspecified
1054
- + magnifier?.dismiss()
1055
- + }
1056
- +
1057
- + private fun updateSizeIfNecessary() {
1058
- + val magnifier = magnifier ?: return
1059
- + val density = density ?: return
1060
- +
1061
- + if (magnifier.size != previousSize) {
1062
- + onSizeChanged?.invoke(with(density) { magnifier.size.toSize().toDpSize() })
1063
- + previousSize = magnifier.size
1064
- + }
1065
- + }
1066
- +
1067
- + override fun ContentDrawScope.draw() {
1068
- + drawContent()
1069
- + drawSignalChannel?.trySend(Unit)
1070
- + }
1071
- +
1072
- + override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
1073
- + // The mutable state must store the Offset, not the LocalCoordinates, because the same
1074
- + // LocalCoordinates instance may be sent to this callback multiple times, not implement
1075
- + // equals, or be stable, and so won't invalidate the snapshotFlow.
1076
- + layoutCoordinates = coordinates
1077
- + }
1078
- +
1079
- + override fun SemanticsPropertyReceiver.applySemantics() {
1080
- + this[MagnifierPositionInRoot] = { sourceCenterInRoot }
1081
- + }
1082
- +}
1083
- +
1084
- +
1085
- +/**
1086
- + * Normally `Float.NaN == Float.NaN` returns false but we use [Float.NaN] to mean Unspecified. The
1087
- + * comparison between two unspecified values should return _equal_ if we are only interested in
1088
- + * state changes.
1089
- + */
1090
- +internal fun Float.equalsIncludingNaN(other: Float): Boolean {
1091
- + if (this.isNaN() && other.isNaN()) return true
1092
- + return this == other
1093
- +}
1094
- diff --git a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/PlatformMagnifier.web.kt b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/PlatformMagnifier.web.kt
1095
- new file mode 100644
1096
- --- /dev/null
1097
- +++ b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/PlatformMagnifier.web.kt
1098
- @@ -0,0 +1,52 @@
1099
- +/*
1100
- + * Copyright 2021 The Android Open Source Project
1101
- + *
1102
- + * Licensed under the Apache License, Version 2.0 (the "License");
1103
- + * you may not use this file except in compliance with the License.
1104
- + * You may obtain a copy of the License at
1105
- + *
1106
- + * http://www.apache.org/licenses/LICENSE-2.0
1107
- + *
1108
- + * Unless required by applicable law or agreed to in writing, software
1109
- + * distributed under the License is distributed on an "AS IS" BASIS,
1110
- + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1111
- + * See the License for the specific language governing permissions and
1112
- + * limitations under the License.
1113
- + */
1114
- +
1115
- +package androidx.compose.foundation
1116
- +
1117
- +// modified by peach: the native scene supplies the android magnifier backend.
1118
- +import androidx.compose.runtime.ProvidableCompositionLocal
1119
- +import androidx.compose.runtime.Stable
1120
- +import androidx.compose.runtime.staticCompositionLocalOf
1121
- +import androidx.compose.ui.geometry.Offset
1122
- +import androidx.compose.ui.unit.Density
1123
- +import androidx.compose.ui.unit.Dp
1124
- +import androidx.compose.ui.unit.DpSize
1125
- +import androidx.compose.ui.unit.IntSize
1126
- +
1127
- +@Stable
1128
- +public interface PlatformMagnifierFactory {
1129
- + public val canUpdateZoom: Boolean
1130
- + public fun create(
1131
- + useTextDefault: Boolean,
1132
- + size: DpSize,
1133
- + cornerRadius: Dp,
1134
- + elevation: Dp,
1135
- + clippingEnabled: Boolean,
1136
- + density: Density,
1137
- + initialZoom: Float,
1138
- + ): PlatformMagnifier
1139
- +}
1140
- +
1141
- +public interface PlatformMagnifier {
1142
- + public val size: IntSize
1143
- + public fun updateContent(): Unit
1144
- + public fun update(sourceCenter: Offset, magnifierCenter: Offset, zoom: Float): Unit
1145
- + public fun dismiss(): Unit
1146
- +}
1147
- +
1148
- +public val LocalPlatformMagnifierFactory: ProvidableCompositionLocal<PlatformMagnifierFactory> = staticCompositionLocalOf<PlatformMagnifierFactory> {
1149
- + error("the native scene must provide its platform magnifier factory")
1150
- +}
1151
- diff --git a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.web.kt b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.web.kt
1152
- --- a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.web.kt
1153
- +++ b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.web.kt
1154
- @@ -16,6 +16,17 @@
1155
-
1156
- package androidx.compose.foundation.text.selection
1157
-
1158
- +// modified by peach: use android magnifier placement, animation and lifetime.
1159
- +
1160
- +import androidx.compose.foundation.LocalPlatformMagnifierFactory
1161
- +import androidx.compose.foundation.magnifier
1162
- +import androidx.compose.runtime.getValue
1163
- +import androidx.compose.runtime.mutableStateOf
1164
- +import androidx.compose.runtime.remember
1165
- +import androidx.compose.runtime.setValue
1166
- +import androidx.compose.ui.composed
1167
- +import androidx.compose.ui.platform.LocalDensity
1168
- +import androidx.compose.ui.unit.IntSize
1169
- import androidx.compose.foundation.text.TextContextMenuItems
1170
- import androidx.compose.foundation.text.TextContextMenuItems.Copy
1171
- import androidx.compose.foundation.text.TextContextMenuItems.Cut
1172
- @@ -30,7 +41,30 @@
1173
- import kotlinx.coroutines.CoroutineStart
1174
- import kotlinx.coroutines.launch
1175
-
1176
- -internal actual fun Modifier.textFieldMagnifier(manager: TextFieldSelectionManager): Modifier = this
1177
- +internal actual fun Modifier.textFieldMagnifier(manager: TextFieldSelectionManager): Modifier {
1178
- + return composed {
1179
- + val density = LocalDensity.current
1180
- + val factory = LocalPlatformMagnifierFactory.current
1181
- + var magnifierSize by remember { mutableStateOf(IntSize.Zero) }
1182
- + animatedSelectionMagnifier(
1183
- + magnifierCenter = { calculateSelectionMagnifierCenterAndroid(manager, magnifierSize) },
1184
- + platformMagnifier = { center ->
1185
- + Modifier.magnifier(
1186
- + sourceCenter = { center() },
1187
- + onSizeChanged = { size ->
1188
- + magnifierSize =
1189
- + with(density) {
1190
- + IntSize(size.width.roundToPx(), size.height.roundToPx())
1191
- + }
1192
- + },
1193
- + useTextDefault = true,
1194
- + platformMagnifierFactory = factory,
1195
- + )
1196
- + },
1197
- + )
1198
- + }
1199
- +}
1200
- +
1201
-
1202
- /**
1203
- * Whether the selection handle is in the visible bound of the TextField.
1204
- diff --git a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/UndoManager.web.kt b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/UndoManager.web.kt
1205
- --- a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/UndoManager.web.kt
1206
- +++ b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/UndoManager.web.kt
1207
- @@ -16,7 +16,10 @@
1208
-
1209
- package androidx.compose.foundation.text
1210
-
1211
- -import kotlinx.browser.window
1212
- +// modified by peach: use the worker clock without a document global.
1213
- +import kotlin.js.js
1214
-
1215
- -internal actual fun timeNowMillis(): Long = window.performance.now().toLong()
1216
- +internal actual fun timeNowMillis(): Long = performanceNow().toLong()
1217
-
1218
- +
1219
- +private fun performanceNow(): Double = js("globalThis.performance.now()")
1220
- diff --git a/compose/foundation/foundation/src/wasmJsMain/kotlin/androidx/compose/foundation/internal/ClipboardUtils.wasm.kt b/compose/foundation/foundation/src/wasmJsMain/kotlin/androidx/compose/foundation/internal/ClipboardUtils.wasm.kt
1221
- --- a/compose/foundation/foundation/src/wasmJsMain/kotlin/androidx/compose/foundation/internal/ClipboardUtils.wasm.kt
1222
- +++ b/compose/foundation/foundation/src/wasmJsMain/kotlin/androidx/compose/foundation/internal/ClipboardUtils.wasm.kt
1223
- @@ -17,6 +17,8 @@
1224
- @file:OptIn(ExperimentalComposeUiApi::class)
1225
-
1226
- package androidx.compose.foundation.internal
1227
- +
1228
- +// modified by peach: query the worker clipboard capability without a document global.
1229
-
1230
- import androidx.compose.ui.ExperimentalComposeUiApi
1231
- import androidx.compose.ui.InternalComposeUiApi
1232
- @@ -62,13 +64,13 @@
1233
- isClipboardReadSupported()
1234
-
1235
- private fun isClipboardReadSupported(): Boolean =
1236
- - js("Boolean(window.navigator.clipboard && window.navigator.clipboard.read)")
1237
- + js("Boolean(globalThis.navigator.clipboard && globalThis.navigator.clipboard.read)")
1238
-
1239
- internal actual fun Clipboard.isWriteSupported(): Boolean =
1240
- isClipboardWriteSupported()
1241
-
1242
- private fun isClipboardWriteSupported(): Boolean =
1243
- - js("Boolean(window.navigator.clipboard && (window.navigator.clipboard.write || window.navigator.clipboard.writeText))")
1244
- + js("Boolean(globalThis.navigator.clipboard && (globalThis.navigator.clipboard.write || globalThis.navigator.clipboard.writeText))")
1245
-
1246
- @Suppress("UNUSED_PARAMETER")
1247
- private fun doesJsArrayContainValue(jsArray: JsArray<*>, value: JsAny): Boolean =