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,17 +0,0 @@
1
- // generated by one typegen; edits will be replaced
2
- export declare const Counter: {
3
- read(): Promise<number>
4
- increment(): Promise<number>
5
- reset(): Promise<number>
6
- delayedRead(ms: number): Promise<number>
7
- }
8
-
9
- export declare const CounterEffects: {
10
- recordLocale(current: string, composition: string): Promise<void>
11
- locales(): Promise<string[]>
12
- enter(): Promise<void>
13
- dispose(): Promise<void>
14
- cancel(): Promise<void>
15
- read(): Promise<number[]>
16
- awaitDisposed(): Promise<number[]>
17
- }
@@ -1,51 +0,0 @@
1
- package dev.contrast.composefixtures
2
-
3
- import dev.onejs.one.source.OneModule
4
- import kotlinx.coroutines.delay
5
- import kotlinx.coroutines.flow.MutableStateFlow
6
- import kotlinx.coroutines.flow.first
7
-
8
- object Counter : OneModule {
9
- private var count = 0
10
-
11
- fun read(): Int = count
12
-
13
- fun increment(): Int {
14
- count += 1
15
- return count
16
- }
17
-
18
- fun reset(): Int {
19
- count = 0
20
- return count
21
- }
22
-
23
- suspend fun delayedRead(ms: Int): Int {
24
- require(ms >= 0) { "delay must be nonnegative" }
25
- delay(ms.toLong())
26
- return count
27
- }
28
- }
29
-
30
- // lifecycle counters let the mount probe observe effect cleanup after removal.
31
- object CounterEffects : OneModule {
32
- private var entered = 0
33
- private var disposed = 0
34
- private var cancelled = 0
35
- private val changes = MutableStateFlow(0)
36
- private var compositionLocale = ""
37
- private var currentLocale = ""
38
- internal fun recordLocale(current: String, composition: String) {
39
- currentLocale = current
40
- compositionLocale = composition
41
- }
42
- fun locales(): List<String> = listOf(currentLocale, compositionLocale)
43
- fun enter() { entered += 1; changes.value += 1 }
44
- fun dispose() { disposed += 1; changes.value += 1 }
45
- fun cancel() { cancelled += 1; changes.value += 1 }
46
- fun read(): List<Int> = listOf(entered, disposed, cancelled)
47
- suspend fun awaitDisposed(): List<Int> {
48
- changes.first { entered > 0 && disposed == entered && cancelled == entered }
49
- return read()
50
- }
51
- }
@@ -1,61 +0,0 @@
1
- import { useEffect, useState } from 'react'
2
- import { Pressable, Text, View } from 'react-native'
3
- import { CounterEffects } from './Counter.kt'
4
- import { CounterScreen } from './CounterScreen.kt'
5
-
6
- export default function Index() {
7
- const [title, setTitle] = useState('Kotlin counter')
8
- const [mounted, setMounted] = useState(true)
9
- const [enabled, setEnabled] = useState(true)
10
- const [secondRoot, setSecondRoot] = useState(false)
11
- const [callback, setCallback] = useState(0)
12
- const [secondCallback, setSecondCallback] = useState(0)
13
- const [effects, setEffects] = useState<number[]>([])
14
- const [locales, setLocales] = useState<string[]>([])
15
- useEffect(() => {
16
- if (callback > 0) void CounterEffects.locales().then(setLocales)
17
- }, [callback])
18
- useEffect(() => {
19
- if (!mounted && !secondRoot) void CounterEffects.awaitDisposed().then(setEffects)
20
- }, [mounted, secondRoot])
21
- return (
22
- <View style={{ flex: 1 }}>
23
- {mounted && (
24
- <View testID="counter-root-a" style={{ flex: 1 }}>
25
- <CounterScreen title={title} enabled={enabled} onTap={setCallback} />
26
- </View>
27
- )}
28
- {secondRoot && (
29
- <View testID="counter-root-b" style={{ flex: 1 }}>
30
- <CounterScreen title="Second counter" onTap={setSecondCallback} />
31
- </View>
32
- )}
33
- <View style={{ position: 'absolute', bottom: 40, left: 24 }}>
34
- <Text testID={`callback-${callback}`}>Callback: {callback}</Text>
35
- <Text testID={`second-callback-${secondCallback}`}>
36
- Second callback: {secondCallback}
37
- </Text>
38
- <Text testID={`effects-${effects.join('-')}`}>Effects: {effects.join(',')}</Text>
39
- <Text testID={`locales-${locales.join('-')}`}>Locales: {locales.join(',')}</Text>
40
- <Pressable testID="edit-title" onPress={() => setTitle('Edited title')}>
41
- <Text>Edit title</Text>
42
- </Pressable>
43
- <Pressable testID="unmount" onPress={() => setMounted(false)}>
44
- <Text>Unmount</Text>
45
- </Pressable>
46
- <Pressable testID="toggle-enabled" onPress={() => setEnabled(!enabled)}>
47
- <Text>{enabled ? 'Disable action' : 'Enable action'}</Text>
48
- </Pressable>
49
- <Pressable testID="toggle-second-root" onPress={() => setSecondRoot(!secondRoot)}>
50
- <Text>{secondRoot ? 'Remove root' : 'Add root'}</Text>
51
- </Pressable>
52
- <Pressable
53
- testID="read-effects"
54
- onPress={() => void CounterEffects.read().then(setEffects)}
55
- >
56
- <Text>Read effects</Text>
57
- </Pressable>
58
- </View>
59
- </View>
60
- )
61
- }
@@ -1,3 +0,0 @@
1
- export default function CounterApp() {
2
- throw new Error('the imported Kotlin counter fixture requires an Android device')
3
- }
@@ -1,8 +0,0 @@
1
- // generated by one typegen; edits will be replaced
2
- import type { ReactElement } from 'react'
3
-
4
- export declare function CounterScreen(props: {
5
- title?: string | null
6
- enabled?: boolean | null
7
- onTap?: ((value0: number) => void) | null
8
- }): ReactElement
@@ -1,56 +0,0 @@
1
- package dev.contrast.composefixtures
2
-
3
- import androidx.compose.foundation.layout.Arrangement
4
- import androidx.compose.foundation.layout.Column
5
- import androidx.compose.foundation.layout.fillMaxSize
6
- import androidx.compose.foundation.layout.padding
7
- import androidx.compose.material3.Button
8
- import androidx.compose.material3.MaterialTheme
9
- import androidx.compose.material3.Text
10
- import androidx.compose.runtime.Composable
11
- import androidx.compose.runtime.DisposableEffect
12
- import androidx.compose.runtime.LaunchedEffect
13
- import androidx.compose.runtime.SideEffect
14
- import androidx.compose.ui.platform.LocalLocaleList
15
- import androidx.compose.ui.text.intl.Locale
16
- import kotlinx.coroutines.awaitCancellation
17
- import androidx.compose.runtime.getValue
18
- import androidx.compose.runtime.mutableStateOf
19
- import androidx.compose.runtime.remember
20
- import androidx.compose.runtime.setValue
21
- import androidx.compose.ui.Modifier
22
- import androidx.compose.ui.graphics.Color
23
- import androidx.compose.ui.platform.testTag
24
- import androidx.compose.ui.unit.dp
25
- import androidx.compose.material3.Surface
26
- import androidx.compose.material3.lightColorScheme
27
-
28
- @Composable
29
- fun CounterScreen(title: String? = null, enabled: Boolean? = null, onTap: ((Int) -> Unit)? = null) {
30
- val locales = LocalLocaleList.current
31
- SideEffect { CounterEffects.recordLocale(Locale.current.toLanguageTag(), locales.joinToString(",") { it.toLanguageTag() }) }
32
- DisposableEffect(Unit) {
33
- CounterEffects.enter()
34
- onDispose { CounterEffects.dispose() }
35
- }
36
- LaunchedEffect(Unit) {
37
- try { awaitCancellation() } finally { CounterEffects.cancel() }
38
- }
39
- var count by remember { mutableStateOf(Counter.read()) }
40
- MaterialTheme(colorScheme = lightColorScheme(primary = Color(0xFF6750A4))) {
41
- Surface(modifier = Modifier.fillMaxSize()) {
42
- Column(
43
- modifier = Modifier.fillMaxSize().padding(24.dp),
44
- verticalArrangement = Arrangement.spacedBy(16.dp),
45
- ) {
46
- Text(title ?: "Kotlin counter", style = MaterialTheme.typography.headlineSmall)
47
- Text("Count: $count", modifier = Modifier.testTag("counter-value"))
48
- Button(
49
- onClick = { count = Counter.increment(); onTap?.invoke(count) },
50
- enabled = enabled != false,
51
- modifier = Modifier.testTag("counter-increment"),
52
- ) { Text("Increment") }
53
- }
54
- }
55
- }
56
- }
@@ -1,4 +0,0 @@
1
- import { Slot } from 'one'
2
- export default function Layout() {
3
- return <Slot />
4
- }
@@ -1 +0,0 @@
1
- export { default } from '../CounterApp'
@@ -1,18 +0,0 @@
1
- // deno-lint-ignore-file
2
- /* eslint-disable */
3
- // biome-ignore: needed import
4
- import type { OneRouter } from 'one'
5
-
6
- declare module 'one' {
7
- export namespace OneRouter {
8
- export interface __routes<T extends string = string> extends Record<string, unknown> {
9
- StaticRoutes:
10
- | `/`
11
- | `/_sitemap`
12
- DynamicRoutes: never
13
- DynamicRouteTemplate: never
14
- IsTyped: true
15
-
16
- }
17
- }
18
- }
@@ -1,20 +0,0 @@
1
- {
2
- "name": "peach-kotlin-counter-fixture",
3
- "private": true,
4
- "type": "module",
5
- "dependencies": {
6
- "@react-navigation/core": "catalog:",
7
- "@react-navigation/native": "catalog:",
8
- "one": "catalog:",
9
- "react": "catalog:",
10
- "react-native": "catalog:",
11
- "react-native-reanimated": "catalog:",
12
- "react-native-screens": "catalog:",
13
- "react-native-worklets": "catalog:"
14
- },
15
- "devDependencies": {
16
- "@react-native-community/template": "catalog:",
17
- "peachsim": "workspace:*",
18
- "vite": "catalog:"
19
- }
20
- }
@@ -1,19 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "paths": {
4
- "~/*": ["./*"]
5
- },
6
- "strict": true,
7
- "rootDir": ".",
8
- "module": "Preserve",
9
- // allows react-native style imports without path extensions, for compat with platform-specific files
10
- "moduleResolution": "Bundler",
11
- "preserveSymlinks": true,
12
- "skipLibCheck": true,
13
- "jsx": "react-jsx",
14
- "noImplicitAny": false,
15
- "types": ["node", "react", "vite/client"],
16
- "lib": ["dom", "esnext"]
17
- },
18
- "exclude": ["node_modules", "**/test", "**/dist", "**/types", "**/__tests__"]
19
- }
@@ -1,20 +0,0 @@
1
- import { one } from 'one/vite'
2
- import { peachPlugin } from 'peachsim/vite'
3
- export default {
4
- root: import.meta.dirname,
5
- plugins: [
6
- one({
7
- web: { defaultRenderMode: 'spa' },
8
- native: {
9
- bundler: 'vite',
10
- app: {
11
- name: 'KotlinCounter',
12
- scheme: 'kotlincounter',
13
- android: { applicationId: 'dev.contrast.kotlincounter' },
14
- },
15
- },
16
- }),
17
- peachPlugin(),
18
- ],
19
- server: { host: '0.0.0.0' },
20
- }
@@ -1,234 +0,0 @@
1
- @file:OptIn(androidx.compose.ui.ExperimentalComposeUiApi::class, androidx.compose.ui.InternalComposeUiApi::class, androidx.compose.ui.text.ExperimentalTextApi::class, kotlin.js.ExperimentalWasmJsInterop::class)
2
- package dev.contrast.composefixtures
3
-
4
- import androidx.compose.runtime.Composable
5
- import androidx.compose.runtime.CompositionLocalProvider
6
- import androidx.compose.runtime.getValue
7
- import androidx.compose.runtime.mutableStateOf
8
- import androidx.compose.runtime.remember
9
- import androidx.compose.runtime.setValue
10
- import androidx.compose.runtime.snapshots.Snapshot
11
- import androidx.compose.ui.graphics.asComposeCanvas
12
- import androidx.compose.ui.input.InputMode
13
- import androidx.compose.ui.input.InputModeManager
14
- import androidx.compose.ui.input.pointer.PointerEventType
15
- import androidx.compose.ui.input.pointer.PointerType
16
- import androidx.compose.ui.platform.FrameRecomposer
17
- import androidx.compose.ui.platform.LocalFontFamilyResolver
18
- import androidx.compose.ui.platform.LocalLocaleList
19
- import androidx.compose.ui.platform.PlatformContext
20
- import androidx.compose.ui.platform.WindowInfo
21
- import androidx.compose.ui.platform.registerSkikoComposeImplementation
22
- import androidx.compose.ui.scene.CanvasLayersComposeScene
23
- import androidx.compose.ui.scene.hasInvalidations
24
- import androidx.compose.ui.semantics.SemanticsNode
25
- import androidx.compose.ui.semantics.SemanticsOwner
26
- import androidx.compose.ui.semantics.SemanticsProperties
27
- import androidx.compose.ui.semantics.getOrNull
28
- import androidx.compose.ui.text.font.FontFamily
29
- import androidx.compose.ui.text.font.FontStyle
30
- import androidx.compose.ui.text.font.FontSynthesis
31
- import androidx.compose.ui.text.font.FontVariation
32
- import androidx.compose.ui.text.font.FontWeight
33
- import androidx.compose.ui.text.font.PlatformTypefacesLoader
34
- import androidx.compose.ui.text.font.createPlatformFontFamilyResolver
35
- import androidx.compose.ui.text.font.platformTypefacesLoader
36
- import androidx.compose.ui.text.intl.LocaleList
37
- import androidx.compose.ui.text.intl.setPlatformLocaleProvider
38
- import org.jetbrains.skiko.OS
39
- import org.jetbrains.skiko.setHostOsProvider
40
- import androidx.compose.ui.text.platform.Font
41
- import androidx.compose.ui.unit.Density
42
- import androidx.compose.ui.unit.DpSize
43
- import androidx.compose.ui.unit.IntSize
44
- import androidx.compose.ui.unit.LayoutDirection
45
- import dev.onejs.one.source.OneModule
46
- import kotlin.io.encoding.Base64
47
- import kotlin.js.js
48
- import kotlin.time.TimeSource
49
- import kotlinx.coroutines.Dispatchers
50
- import org.jetbrains.skia.Color
51
- import org.jetbrains.skia.Surface
52
- import org.json.JSONArray
53
- import org.json.JSONObject
54
-
55
- private fun workerGlobals(): String =
56
- js("JSON.stringify({ window: typeof window, document: typeof document, languages: globalThis.navigator.languages })")
57
-
58
- // the simulated Android device as Compose's platform sees it: its screen,
59
- // its locale, touch mode (an Android device starts in it, so a tap shows no
60
- // focus) and the semantics owners inspection reads. everything else is
61
- // Compose's own default for a platform that supplies nothing.
62
- private class PeachPlatformContext(
63
- size: IntSize,
64
- density: Density,
65
- override val localeList: LocaleList,
66
- ) : PlatformContext by PlatformContext.Empty(), PlatformContext.SemanticsOwnerListener {
67
- val semanticsOwners = mutableSetOf<SemanticsOwner>()
68
- override val windowInfo: WindowInfo = object : WindowInfo {
69
- override val isWindowFocused: Boolean get() = true
70
- override val containerSize: IntSize = size
71
- override val containerDpSize: DpSize = with(density) { DpSize(size.width.toDp(), size.height.toDp()) }
72
- }
73
- override val inputModeManager: InputModeManager = object : InputModeManager {
74
- override var inputMode: InputMode by mutableStateOf(InputMode.Touch)
75
- override fun requestInputMode(inputMode: InputMode): Boolean {
76
- this.inputMode = inputMode
77
- return true
78
- }
79
- }
80
- override val semanticsOwnerListener: PlatformContext.SemanticsOwnerListener get() = this
81
- override fun onSemanticsOwnerAppended(semanticsOwner: SemanticsOwner) { semanticsOwners.add(semanticsOwner) }
82
- override fun onSemanticsOwnerRemoved(semanticsOwner: SemanticsOwner) { semanticsOwners.remove(semanticsOwner) }
83
- override fun onSemanticsChange(semanticsOwner: SemanticsOwner) = Unit
84
- override fun onLayoutChange(semanticsOwner: SemanticsOwner, semanticsNodeId: Int) = Unit
85
- }
86
-
87
- // a Pixel 8 screen, rendered to a raster surface one 60 Hz frame at a time
88
- private class DeviceScene(locale: String, content: @Composable () -> Unit) : AutoCloseable {
89
- private val size = IntSize(1080, 2400)
90
- private val density = Density(420f / 160f)
91
- init {
92
- setHostOsProvider { OS.Android }
93
- registerSkikoComposeImplementation()
94
- setPlatformLocaleProvider { LocaleList(locale) }
95
- }
96
- val context = PeachPlatformContext(size, density, LocaleList(locale))
97
- private val recomposer = FrameRecomposer(Dispatchers.Unconfined)
98
- private val scene = CanvasLayersComposeScene(recomposer, density, LayoutDirection.Ltr, size, context)
99
- .also { it.setContent(content = content) }
100
- private val surface = Surface.makeRasterN32Premul(size.width, size.height)
101
- var nanos = 0L
102
- private set
103
-
104
- fun frame(): ByteArray {
105
- Snapshot.sendApplyNotifications()
106
- surface.canvas.clear(Color.TRANSPARENT)
107
- recomposer.performFrame(nanos)
108
- scene.measureAndLayout()
109
- scene.draw(surface.canvas.asComposeCanvas())
110
- nanos += 16_666_667L
111
- val image = surface.makeImageSnapshot()
112
- try {
113
- val data = checkNotNull(image.encodeToData())
114
- try { return data.bytes } finally { data.close() }
115
- } finally { image.close() }
116
- }
117
-
118
- fun settle(from: ByteArray): ByteArray {
119
- var previous = from
120
- repeat(180) {
121
- val next = frame()
122
- if (!recomposer.hasPendingWork() && !scene.hasInvalidations() && next.contentEquals(previous)) return next
123
- previous = next
124
- }
125
- error("scene never settled")
126
- }
127
-
128
- private fun nodes(merged: Boolean): List<SemanticsNode> {
129
- fun collect(node: SemanticsNode): List<SemanticsNode> = listOf(node) + node.children.flatMap { collect(it) }
130
- return context.semanticsOwners.flatMap {
131
- collect(if (merged) it.rootSemanticsNode else it.unmergedRootSemanticsNode)
132
- }
133
- }
134
-
135
- fun node(tag: String): SemanticsNode =
136
- nodes(merged = true).single { it.config.getOrNull(SemanticsProperties.TestTag) == tag }
137
-
138
- // every text node with its bounds, unmerged as Android's accessibility
139
- // hierarchy reports a button's label apart from the button
140
- fun texts(): JSONArray {
141
- val texts = JSONArray()
142
- for (node in nodes(merged = false)) {
143
- val value = text(node) ?: continue
144
- val bounds = node.boundsInRoot
145
- texts.put(JSONObject().put("text", value).put("left", bounds.left).put("top", bounds.top)
146
- .put("right", bounds.right).put("bottom", bounds.bottom))
147
- }
148
- return texts
149
- }
150
-
151
- fun tap(tag: String) {
152
- val center = node(tag).boundsInRoot.center
153
- scene.sendPointerEvent(PointerEventType.Press, center, timeMillis = nanos / 1_000_000L, type = PointerType.Touch)
154
- scene.sendPointerEvent(PointerEventType.Release, center, timeMillis = nanos / 1_000_000L + 20L, type = PointerType.Touch)
155
- }
156
-
157
- override fun close() {
158
- scene.close()
159
- recomposer.close()
160
- surface.close()
161
- }
162
- }
163
-
164
- // Android's default and sans-serif families are Roboto. the app's own
165
- // families resolve as Compose resolves them.
166
- @Composable
167
- private fun AndroidFonts(roboto: FontFamily, content: @Composable () -> Unit) {
168
- val parent = LocalFontFamilyResolver.current
169
- val resolver = remember(parent) {
170
- val backend = checkNotNull(parent.platformTypefacesLoader())
171
- createPlatformFontFamilyResolver(object : PlatformTypefacesLoader by backend {
172
- override val cacheKey: Any get() = this
173
- override fun loadPlatformTypes(fontFamily: FontFamily, fontWeight: FontWeight, fontStyle: FontStyle): Any =
174
- if (fontFamily == FontFamily.Default || fontFamily == FontFamily.SansSerif)
175
- parent.resolve(roboto, fontWeight, fontStyle, FontSynthesis.All).value
176
- else backend.loadPlatformTypes(fontFamily, fontWeight, fontStyle)
177
- })
178
- }
179
- CompositionLocalProvider(LocalFontFamilyResolver provides resolver, content = content)
180
- }
181
-
182
- private fun text(node: SemanticsNode): String? =
183
- node.config.getOrNull(SemanticsProperties.Text)?.joinToString { it.text }
184
-
185
- object Headless : OneModule {
186
- suspend fun capture(font: String): String {
187
- try {
188
- val data = Base64.decode(font)
189
- val roboto = FontFamily(listOf(FontWeight.Normal, FontWeight.Medium, FontWeight.Bold).map { weight ->
190
- Font("Roboto-${weight.weight}", getData = { data }, weight = weight,
191
- variationSettings = FontVariation.Settings(weight, FontStyle.Normal))
192
- })
193
- Counter.reset()
194
- val start = TimeSource.Monotonic.markNow()
195
- DeviceScene("en-US") { AndroidFonts(roboto) { CounterScreen() } }.use { device ->
196
- val first = device.frame()
197
- val firstFrameMs = start.elapsedNow().inWholeMicroseconds / 1000.0
198
- val main = device.settle(first)
199
- val mainTexts = device.texts()
200
- val value = device.node("counter-value")
201
- check(text(value) == "Count: 0")
202
- val buttonBounds = device.node("counter-increment").boundsInRoot
203
- val tapStart = TimeSource.Monotonic.markNow()
204
- device.tap("counter-increment")
205
- val incremented = device.settle(main)
206
- val interactiveMs = tapStart.elapsedNow().inWholeMicroseconds / 1000.0
207
- check(text(device.node("counter-value")) == "Count: 1")
208
- check(Counter.read() == 1)
209
- val incrementedTexts = device.texts()
210
- check(!main.contentEquals(incremented))
211
- return JSONObject().put("main", Base64.encode(main)).put("incremented", Base64.encode(incremented))
212
- .put("mainTexts", mainTexts).put("incrementedTexts", incrementedTexts)
213
- .put("firstFrameMs", firstFrameMs).put("interactiveMs", interactiveMs)
214
- .put("buttonBounds", buttonBounds.toString()).put("valueTop", value.boundsInRoot.top)
215
- .put("settledNanos", device.nanos)
216
- .put("globals", workerGlobals()).toString()
217
- }
218
- } catch (error: Throwable) {
219
- throw IllegalStateException(error.stackTraceToString(), error)
220
- }
221
- }
222
-
223
- // the locale the composition sees is the device's, not the browser's
224
- fun locale(tag: String): String {
225
- try {
226
- var seen: LocaleList? = null
227
- DeviceScene(tag) { seen = LocalLocaleList.current }.use { it.frame() }
228
- return JSONObject().put("device", tag).put("composition", checkNotNull(seen).joinToString(",") { it.toLanguageTag() })
229
- .put("globals", workerGlobals()).toString()
230
- } catch (error: Throwable) {
231
- throw IllegalStateException(error.stackTraceToString(), error)
232
- }
233
- }
234
- }
@@ -1,7 +0,0 @@
1
- // generated by one typegen; edits will be replaced
2
- import type { ReactElement } from 'react'
3
-
4
- export declare function Animation(props: {
5
- title: string
6
- onStep?: ((value0: number) => void) | null
7
- }): ReactElement
@@ -1,80 +0,0 @@
1
- package dev.contrast.kotlinanimation
2
-
3
- import androidx.compose.animation.AnimatedContent
4
- import androidx.compose.animation.AnimatedVisibility
5
- import androidx.compose.animation.animateColorAsState
6
- import androidx.compose.animation.core.animateDp
7
- import androidx.compose.animation.core.animateDpAsState
8
- import androidx.compose.animation.core.updateTransition
9
- import androidx.compose.foundation.background
10
- import androidx.compose.foundation.layout.Arrangement
11
- import androidx.compose.foundation.layout.Box
12
- import androidx.compose.foundation.layout.Column
13
- import androidx.compose.foundation.layout.fillMaxSize
14
- import androidx.compose.foundation.layout.height
15
- import androidx.compose.foundation.layout.padding
16
- import androidx.compose.foundation.layout.width
17
- import androidx.compose.material3.Button
18
- import androidx.compose.material3.MaterialTheme
19
- import androidx.compose.material3.Surface
20
- import androidx.compose.material3.Text
21
- import androidx.compose.material3.lightColorScheme
22
- import androidx.compose.runtime.Composable
23
- import androidx.compose.runtime.LaunchedEffect
24
- import androidx.compose.runtime.getValue
25
- import androidx.compose.runtime.mutableStateOf
26
- import androidx.compose.runtime.remember
27
- import androidx.compose.runtime.setValue
28
- import androidx.compose.runtime.withFrameNanos
29
- import androidx.compose.ui.Modifier
30
- import androidx.compose.ui.graphics.Color
31
- import androidx.compose.ui.graphics.toArgb
32
- import androidx.compose.ui.layout.onGloballyPositioned
33
- import androidx.compose.ui.platform.testTag
34
- import androidx.compose.ui.unit.dp
35
- import kotlin.math.roundToInt
36
-
37
- @Composable
38
- fun Animation(title: String, onStep: ((Int) -> Unit)? = null) {
39
- var count by remember { mutableStateOf(0) }
40
- var expanded by remember { mutableStateOf(false) }
41
- var frameSeen by remember { mutableStateOf(false) }
42
- var boxWidth by remember { mutableStateOf(0) }
43
- var boxHeight by remember { mutableStateOf(0) }
44
- val width by animateDpAsState(if (expanded) 160.dp else 80.dp, label = "width")
45
- val color by animateColorAsState(if (expanded) Color(0xFF3F51B5) else Color(0xFFE91E63), label = "color")
46
- val transition = updateTransition(expanded, label = "panel")
47
- val height by transition.animateDp(label = "height") { if (it) 48.dp else 24.dp }
48
- LaunchedEffect(expanded) {
49
- frameSeen = false
50
- withFrameNanos { frameSeen = true }
51
- }
52
- MaterialTheme(colorScheme = lightColorScheme()) {
53
- Surface(Modifier.fillMaxSize()) {
54
- Column(Modifier.fillMaxSize().padding(16.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) {
55
- Text(title, Modifier.testTag("animation-title"))
56
- Text("Count: $count", Modifier.testTag("animation-count"))
57
- Text(
58
- "expanded=${if (expanded) 1 else 0};width=${width.value.roundToInt()};height=${height.value.roundToInt()};color=${color.toArgb()};box=$boxWidth,$boxHeight;running=${if (transition.isRunning) 1 else 0};frame=${if (frameSeen) 1 else 0}",
59
- Modifier.testTag("animation-state"),
60
- )
61
- Button(onClick = { expanded = !expanded; count += 1; onStep?.invoke(count) }, modifier = Modifier.testTag("animation-toggle")) {
62
- Text(if (expanded) "Compact animation" else "Expand animation")
63
- }
64
- Button(onClick = { count += 1000; onStep?.invoke(count) }, enabled = false, modifier = Modifier.testTag("animation-disabled")) {
65
- Text("Disabled animation step")
66
- }
67
- Box(Modifier.width(width).height(height).background(color).testTag("animation-box").onGloballyPositioned {
68
- boxWidth = it.size.width
69
- boxHeight = it.size.height
70
- })
71
- AnimatedVisibility(expanded) {
72
- Text("Animated panel", Modifier.testTag("animation-panel"))
73
- }
74
- AnimatedContent(expanded, label = "content") { target ->
75
- Text(if (target) "Expanded content" else "Compact content", Modifier.testTag(if (target) "animation-expanded-content" else "animation-compact-content"))
76
- }
77
- }
78
- }
79
- }
80
- }
@@ -1,13 +0,0 @@
1
- import { useState } from 'react'
2
- import { Text, View } from 'react-native'
3
- import { Animation } from './Animation.kt'
4
-
5
- export default function Index() {
6
- const [step, setStep] = useState(0)
7
- return (
8
- <View style={{ flex: 1, backgroundColor: '#fff' }}>
9
- <Animation title={`Animation step ${step}`} onStep={setStep} />
10
- <Text testID="animation-react-step">React step: {step}</Text>
11
- </View>
12
- )
13
- }
@@ -1,24 +0,0 @@
1
- # Imported Compose animation fixture
2
-
3
- A typed React import drives AnimatedVisibility, AnimatedContent, animateDpAsState,
4
- animateColorAsState and updateTransition. Real toggles update the React callback
5
- and title while retaining Compose state. A disabled action preserves both.
6
-
7
- RAN: fresh One Android, then Peach, then an actual Contrast import passed six
8
- states: initial0, expanded1, disabled1, compact2, again3 and reset4. Compact states
9
- settle at width80/height24, ARGB -1499549 and measured box210x63; expanded states
10
- at width160/height48, ARGB -12627531 and box420x126. Every state delivers a frame,
11
- settles the transition and shows the matching panel and exclusive content.
12
-
13
- [Proof and captures](https://r2.sootsim.com/kotlin-evidence/import-animation/badd8e7d78b5327501b5223bd3bc6903e5376b592b077de2073781bdc0faa5c0/proof.json)
14
- bind source commit `67b7bd59e0c84377574dc4f3cde348c76008b7e2`, Kotlin SHA256
15
- `5275bda78f9f82a6df9ce807c5d95f2296d8e14d5d015b23b1c8aa0eeccac381`,
16
- and rebuilt runtime SHA256
17
- `129e6fa055dd4fcabf03386e5b811af59590c96b92f1a7594bd3413ed25df2d7`.
18
- All 64 objects passed hash readback. Negative controls reject a wrong animated
19
- width and a callback from the disabled action.
20
-
21
- Native proof uses debug Android API37 and One canary
22
- `2.0.0-0.canary.1791729656331`. This fixture does not establish intermediate
23
- frames, easing, motion duration, frame rate, text glyph or full-frame pixel
24
- parity. Contrast shell chrome and production delivery are outside this receipt.
@@ -1,4 +0,0 @@
1
- import { Slot } from 'one'
2
- export default function Layout() {
3
- return <Slot />
4
- }
@@ -1 +0,0 @@
1
- export { default } from '../ImportAnimation.native'