peachsim 0.1.629 → 0.1.631

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 (128) hide show
  1. package/README.md +8 -4
  2. package/cli/app-fonts.ts +23 -4
  3. package/cli/bridge-flow-runner.ts +45 -31
  4. package/cli/cli-update.ts +2 -7
  5. package/cli/cloud-test-tunnel.ts +16 -3
  6. package/cli/command-registry.ts +1 -0
  7. package/cli/commands/compat.ts +11 -60
  8. package/cli/commands/config.ts +1 -1
  9. package/cli/commands/control.ts +40 -8
  10. package/cli/commands/daemon-mac-app.ts +4 -2
  11. package/cli/commands/daemon.ts +4 -4
  12. package/cli/commands/detect.ts +289 -26
  13. package/cli/commands/device.ts +2 -3
  14. package/cli/commands/inspect/actions.ts +125 -90
  15. package/cli/commands/inspect/core.ts +1 -1
  16. package/cli/commands/inspect.ts +10 -1
  17. package/cli/commands/maestro.ts +3 -1
  18. package/cli/commands/platform.ts +1 -1
  19. package/cli/commands/project-report.ts +386 -0
  20. package/cli/commands/projectReportContract.ts +42 -0
  21. package/cli/commands/report-issue.ts +38 -54
  22. package/cli/commands/screenshot-layers.ts +1 -1
  23. package/cli/commands/screenshot.ts +1 -1
  24. package/cli/commands/setup.ts +6 -4
  25. package/cli/commands/skills.ts +0 -31
  26. package/cli/commands/telemetry.ts +8 -3
  27. package/cli/commands/test.ts +347 -134
  28. package/cli/drivers/playwright-provisioning.ts +3 -2
  29. package/cli/drivers/playwright-sim-host.ts +25 -9
  30. package/cli/main.ts +19 -3
  31. package/cli/outbound-endpoints.ts +2 -5
  32. package/cli/privacy.ts +1 -2
  33. package/cli/runtime-diagnostics.ts +51 -0
  34. package/cli/telemetry.ts +78 -7
  35. package/detox/index.ts +77 -51
  36. package/dist-lib/agent-daemon-client.cjs +1 -1
  37. package/dist-lib/agent-events.cjs +1 -1
  38. package/dist-lib/agent-identity.cjs +1 -1
  39. package/dist-lib/agent-sessions.cjs +1 -1
  40. package/dist-lib/attached-projects.cjs +1 -1
  41. package/dist-lib/auth/shared-session.cjs +1 -1
  42. package/dist-lib/backend-origin.cjs +1 -1
  43. package/dist-lib/beta.cjs +1 -1
  44. package/dist-lib/beta.mjs +1 -1
  45. package/dist-lib/bridge-constants.cjs +1 -1
  46. package/dist-lib/bridge-contract-input.cjs +1 -1
  47. package/dist-lib/bridge-contract-input.mjs +1 -1
  48. package/dist-lib/bridge-contract.cjs +1 -1
  49. package/dist-lib/bridge-contract.mjs +1 -1
  50. package/dist-lib/capture-contract.cjs +1 -1
  51. package/dist-lib/capture-contract.mjs +1 -1
  52. package/dist-lib/cli-constants.cjs +1 -1
  53. package/dist-lib/cloud-contract.cjs +1 -1
  54. package/dist-lib/cloud-contract.mjs +1 -1
  55. package/dist-lib/cloud-test-args.cjs +1 -1
  56. package/dist-lib/cloud-test-args.mjs +1 -1
  57. package/dist-lib/cloud.cjs +1 -1
  58. package/dist-lib/cloud.mjs +1 -1
  59. package/dist-lib/config.cjs +1 -1
  60. package/dist-lib/detox/index.cjs +130 -33
  61. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  62. package/dist-lib/home-paths.cjs +8 -5
  63. package/dist-lib/host/bridge-host.cjs +353 -290
  64. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  65. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  66. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  67. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  68. package/dist-lib/host/websocket-proxy.cjs +1 -1
  69. package/dist-lib/index.cjs +257 -121
  70. package/dist-lib/jump-to-source-babel.cjs +1 -1
  71. package/dist-lib/jump-to-source-native.cjs +1 -1
  72. package/dist-lib/{vite-kotlin.cjs → kotlin-host.cjs} +130 -19
  73. package/dist-lib/menu.cjs +11 -1
  74. package/dist-lib/menu.mjs +11 -1
  75. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  76. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  77. package/dist-lib/metro-production-bundle.cjs +1 -1
  78. package/dist-lib/metro-production-bundle.mjs +1 -1
  79. package/dist-lib/metro.cjs +132 -9
  80. package/dist-lib/native-app-identity.cjs +278 -0
  81. package/dist-lib/native-app-identity.mjs +245 -0
  82. package/dist-lib/profiles.cjs +1 -1
  83. package/dist-lib/public-brand.cjs +1 -1
  84. package/dist-lib/react-native-host-modules.cjs +1 -1
  85. package/dist-lib/react-native-host-modules.mjs +1 -1
  86. package/dist-lib/render-mode.cjs +1 -1
  87. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  88. package/dist-lib/sdk.cjs +112 -87
  89. package/dist-lib/sdk.mjs +111 -87
  90. package/dist-lib/skills.cjs +1270 -709
  91. package/dist-lib/swift-compile.cjs +1 -1
  92. package/dist-lib/swift-compile.mjs +1 -1
  93. package/dist-lib/swift-package.cjs +1 -1
  94. package/dist-lib/swift-package.mjs +1 -1
  95. package/dist-lib/swift-submit.cjs +1 -1
  96. package/dist-lib/swift-submit.mjs +1 -1
  97. package/dist-lib/swift.cjs +672 -275
  98. package/dist-lib/vite-swift.cjs +1 -1
  99. package/dist-lib/vite.cjs +11 -28
  100. package/kotlin/README.md +32 -4
  101. package/kotlin/fixtures/counter/Counter.kt +26 -0
  102. package/kotlin/fixtures/counter/CounterScreen.kt +40 -0
  103. package/kotlin/fixtures/headless-counter/Headless.kt +228 -0
  104. package/kotlin/fixtures/runtime-state/RuntimeState.kt +200 -0
  105. package/kotlin/fork/LICENSE +178 -0
  106. package/kotlin/fork/NOTICE +25 -0
  107. package/kotlin/fork/README.md +59 -0
  108. package/kotlin/fork/build.sh +128 -0
  109. package/kotlin/fork/compose-worker-globals.patch +96 -0
  110. package/kotlin/fork/fork.json +33 -0
  111. package/kotlin/fork/publish.ts +77 -0
  112. package/kotlin/fork/skiko-worker-clock.patch +33 -0
  113. package/kotlin/toolchain.json +288 -0
  114. package/package.json +13 -5
  115. package/skills/contrast/SKILL.md +1 -0
  116. package/src/automatic-update-policy.ts +17 -0
  117. package/src/home-paths.ts +11 -9
  118. package/src/host/bridge-host.ts +3 -1
  119. package/src/{vite-plugin-kotlin.ts → kotlin-host.ts} +155 -12
  120. package/src/menu.ts +11 -0
  121. package/src/metro-plugin.ts +18 -0
  122. package/src/native-app-identity.ts +376 -0
  123. package/src/native-firebase-config.ts +90 -0
  124. package/src/screenshots/frame-compose.ts +1 -1
  125. package/src/screenshots/registry.ts +1 -1
  126. package/src/screenshots/schema.ts +2 -2
  127. package/src/vite-plugin-one.ts +11 -28
  128. package/src/vite-plugin.ts +6 -1
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.629 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -2835,6 +2835,12 @@ var settingsSchema = {
2835
2835
  options: import_menu.SOOTSIM_RENDER_RESOLUTION_LEVELS,
2836
2836
  group: "simulator"
2837
2837
  },
2838
+ slowAnimations: {
2839
+ type: "boolean",
2840
+ default: false,
2841
+ description: "Run simulated app and OS animations at one tenth speed",
2842
+ group: "simulator"
2843
+ },
2838
2844
  showTouches: {
2839
2845
  type: "boolean",
2840
2846
  default: false,
@@ -3069,6 +3075,7 @@ function readUrlSettingOverrides(search) {
3069
3075
  out.colorScheme = colorScheme;
3070
3076
  }
3071
3077
  for (const key of [
3078
+ "slowAnimations",
3072
3079
  "reduceMotion",
3073
3080
  "boldText",
3074
3081
  "largerAccessibilitySizes",
@@ -3154,6 +3161,7 @@ function getDefaults() {
3154
3161
  // ../peach-engine/src/settings/persistence.ts
3155
3162
  var STORAGE_KEY = "sootsim:settings";
3156
3163
  var PERSISTED_KEYS = [
3164
+ "slowAnimations",
3157
3165
  "productAnalytics",
3158
3166
  "crashReports",
3159
3167
  "colorScheme",
@@ -3868,7 +3876,7 @@ function getTimelineChannel() {
3868
3876
  return cached;
3869
3877
  }
3870
3878
  const bc = new globalObj.BroadcastChannel(TIMELINE_BROADCAST_CHANNEL);
3871
- const listeners7 = /* @__PURE__ */ new Set();
3879
+ const listeners8 = /* @__PURE__ */ new Set();
3872
3880
  bc.onmessage = (ev) => {
3873
3881
  const e = ev.data;
3874
3882
  if (!e || typeof e !== "object") return;
@@ -3880,7 +3888,7 @@ function getTimelineChannel() {
3880
3888
  } else if (e.type !== "control") {
3881
3889
  return;
3882
3890
  }
3883
- for (const fn of listeners7) {
3891
+ for (const fn of listeners8) {
3884
3892
  try {
3885
3893
  fn(e);
3886
3894
  } catch {
@@ -3895,8 +3903,8 @@ function getTimelineChannel() {
3895
3903
  }
3896
3904
  },
3897
3905
  subscribe(listener) {
3898
- listeners7.add(listener);
3899
- return () => listeners7.delete(listener);
3906
+ listeners8.add(listener);
3907
+ return () => listeners8.delete(listener);
3900
3908
  },
3901
3909
  close() {
3902
3910
  try {
@@ -4248,10 +4256,10 @@ function peekDeviceSpec() {
4248
4256
  return spec;
4249
4257
  }
4250
4258
  function onDeviceSpecChange(listener) {
4251
- const listeners7 = getListenerSet();
4252
- listeners7.add(listener);
4259
+ const listeners8 = getListenerSet();
4260
+ listeners8.add(listener);
4253
4261
  return () => {
4254
- listeners7.delete(listener);
4262
+ listeners8.delete(listener);
4255
4263
  };
4256
4264
  }
4257
4265
 
@@ -5256,6 +5264,19 @@ function isNativeAnimationGraph(value) {
5256
5264
  }
5257
5265
  return false;
5258
5266
  }
5267
+ function samplePiecewiseLinear(input, inputRange, outputRange, clamp) {
5268
+ let i = 0;
5269
+ for (; i < inputRange.length - 1; i++) {
5270
+ if (input <= inputRange[i + 1]) break;
5271
+ }
5272
+ i = Math.min(i, inputRange.length - 2);
5273
+ if (inputRange[i + 1] === inputRange[i]) {
5274
+ return input <= inputRange[i] ? outputRange[i] : outputRange[i + 1];
5275
+ }
5276
+ const t = (input - inputRange[i]) / (inputRange[i + 1] - inputRange[i]);
5277
+ const clamped = clamp ? Math.max(0, Math.min(1, t)) : t;
5278
+ return outputRange[i] + (outputRange[i + 1] - outputRange[i]) * clamped;
5279
+ }
5259
5280
  function cubicBezierAxisAt(t, p1, p2) {
5260
5281
  const u = 1 - t;
5261
5282
  return 3 * u * u * t * p1 + 3 * u * t * t * p2 + t * t * t;
@@ -5280,6 +5301,46 @@ function sampleCubicBezierEasing(x, x1, y1, x2, y2) {
5280
5301
  }
5281
5302
  return cubicBezierAxisAt((lo + hi) / 2, y1, y2);
5282
5303
  }
5304
+ function sampleNativeAnimationGraph(graph, epochMs) {
5305
+ if (graph.kind === "interpolate") {
5306
+ return samplePiecewiseLinear(
5307
+ sampleNativeAnimationGraph(graph.parent, epochMs),
5308
+ graph.inputRange,
5309
+ graph.outputRange,
5310
+ graph.clamp
5311
+ );
5312
+ }
5313
+ if (graph.kind === "spring") {
5314
+ const elapsedMs = epochMs - graph.anchorEpochMs;
5315
+ if (elapsedMs <= 0) return graph.from;
5316
+ if (elapsedMs >= graph.restMs) return graph.to;
5317
+ return evaluateRNSpringAt(graph.from, graph, graph.to, elapsedMs / 1e3).position;
5318
+ }
5319
+ if (graph.kind === "timed") {
5320
+ const elapsedMs = epochMs - graph.anchorEpochMs;
5321
+ if (elapsedMs <= 0) return graph.from;
5322
+ if (elapsedMs >= graph.durationMs) return graph.to;
5323
+ const eased = sampleCubicBezierEasing(
5324
+ elapsedMs / graph.durationMs,
5325
+ graph.x1,
5326
+ graph.y1,
5327
+ graph.x2,
5328
+ graph.y2
5329
+ );
5330
+ return graph.from + (graph.to - graph.from) * eased;
5331
+ }
5332
+ const span = graph.to - graph.from;
5333
+ if (span === 0) return graph.anchorValue;
5334
+ const progressed = (epochMs - graph.anchorEpochMs) / graph.periodMs * span;
5335
+ const wrapped = (graph.anchorValue + progressed - graph.from) % span;
5336
+ return graph.from + (wrapped < 0 ? wrapped + span : wrapped);
5337
+ }
5338
+ function getNativeAnimationGraphEndEpochMs(graph) {
5339
+ if (graph.kind === "interpolate") return getNativeAnimationGraphEndEpochMs(graph.parent);
5340
+ if (graph.kind === "spring") return graph.anchorEpochMs + graph.restMs;
5341
+ if (graph.kind === "timed") return graph.anchorEpochMs + graph.durationMs;
5342
+ return null;
5343
+ }
5283
5344
  function createTimedAnimationGraph(fromValue, toValue, durationMs, easing, anchorEpochMs) {
5284
5345
  const points = easing.__bezier;
5285
5346
  if (!points || points.length !== 4 || !points.every(isFiniteNumber)) return null;
@@ -5299,15 +5360,70 @@ function createTimedAnimationGraph(fromValue, toValue, durationMs, easing, ancho
5299
5360
  };
5300
5361
  }
5301
5362
 
5363
+ // ../peach-engine/src/engine/animation-timeline.ts
5364
+ var hostTimeOrigin = performance.timeOrigin;
5365
+ var clock = { anchorH: 0, anchorA: 0, rate: 1, revision: 0 };
5366
+ var steppedHostNow = null;
5367
+ var steppedAnimationNow = null;
5368
+ var listeners5 = /* @__PURE__ */ new Set();
5369
+ function mapHostAnimationTime(hostNow) {
5370
+ return clock.anchorA + (hostNow - clock.anchorH) * clock.rate;
5371
+ }
5372
+ function getRawHostTime() {
5373
+ return steppedHostNow ?? performance.timeOrigin + performance.now() - hostTimeOrigin;
5374
+ }
5375
+ function getAnimationTime() {
5376
+ return steppedAnimationNow ?? mapHostAnimationTime(getRawHostTime());
5377
+ }
5378
+ function getAnimationTimeOrigin() {
5379
+ return hostTimeOrigin;
5380
+ }
5381
+ function subscribeAnimationClock(listener) {
5382
+ listeners5.add(listener);
5383
+ return () => {
5384
+ listeners5.delete(listener);
5385
+ };
5386
+ }
5387
+ function animationDelayToWallTime(delayMs) {
5388
+ return Math.max(0, delayMs) / clock.rate;
5389
+ }
5390
+ var deadlineListeners = /* @__PURE__ */ new Set();
5391
+ function scheduleAnimationDeadline(deadline, callback) {
5392
+ let timer = null;
5393
+ let active = true;
5394
+ const cancel = () => {
5395
+ active = false;
5396
+ if (timer !== null) clearTimeout(timer);
5397
+ timer = null;
5398
+ listeners5.delete(update);
5399
+ deadlineListeners.delete(update);
5400
+ };
5401
+ const update = () => {
5402
+ if (!active) return;
5403
+ if (timer !== null) clearTimeout(timer);
5404
+ timer = null;
5405
+ const remaining = deadline - getAnimationTime();
5406
+ if (remaining <= 0) {
5407
+ cancel();
5408
+ callback();
5409
+ } else if (steppedHostNow === null) {
5410
+ timer = setTimeout(update, animationDelayToWallTime(remaining));
5411
+ }
5412
+ };
5413
+ listeners5.add(update);
5414
+ deadlineListeners.add(update);
5415
+ queueMicrotask(update);
5416
+ return cancel;
5417
+ }
5418
+
5302
5419
  // ../peach-engine/src/engine/frame-clock.ts
5303
- var animationEpochMs = null;
5304
5420
  function getAnimationEpochTime() {
5305
- return animationEpochMs ?? Date.now();
5421
+ return getAnimationTimeOrigin() + getAnimationTime();
5306
5422
  }
5307
5423
  function getAnimationTimestamp() {
5308
5424
  const readTimestamp = Reflect.get(globalThis, "_getAnimationTimestamp");
5309
- const timestamp = typeof readTimestamp === "function" ? Number(readTimestamp()) : performance.now();
5310
- return Number.isFinite(timestamp) ? timestamp : performance.now();
5425
+ const timestamp = typeof readTimestamp === "function" ? Number(readTimestamp()) : getAnimationTime();
5426
+ return Number.isFinite(timestamp) ? timestamp : getAnimationTime();
5311
5427
  }
5312
5428
  var fallbackTimers = /* @__PURE__ */ new Map();
5313
5429
  var nextFallbackFrameId = -1;
@@ -5321,18 +5437,19 @@ function requestFrame(callback) {
5321
5437
  const id2 = nextFallbackFrameId--;
5322
5438
  const timer2 = setTimeout(() => {
5323
5439
  fallbackTimers.delete(id2);
5324
- callback(performance.now());
5440
+ callback(getAnimationTime());
5325
5441
  }, 16);
5326
5442
  fallbackTimers.set(id2, timer2);
5327
5443
  return id2;
5328
5444
  }
5329
5445
  const raf = ensureSootSim().state.requestAnimationFrame;
5330
5446
  if (typeof raf === "function") return raf(callback);
5331
- if (typeof requestAnimationFrame === "function") return requestAnimationFrame(callback);
5447
+ if (typeof requestAnimationFrame === "function")
5448
+ return requestAnimationFrame((now) => callback(mapHostAnimationTime(now)));
5332
5449
  const id = nextFallbackFrameId--;
5333
5450
  const timer = setTimeout(() => {
5334
5451
  fallbackTimers.delete(id);
5335
- callback(performance.now());
5452
+ callback(getAnimationTime());
5336
5453
  }, 16);
5337
5454
  fallbackTimers.set(id, timer);
5338
5455
  return id;
@@ -5358,6 +5475,8 @@ function isLockstepCaptureActive() {
5358
5475
  }
5359
5476
 
5360
5477
  // ../peach-engine/src/engine/native-animation-driver.ts
5478
+ var activeAnimations = /* @__PURE__ */ new Map();
5479
+ var rafId = null;
5361
5480
  var remoteReleaseCallback = null;
5362
5481
  var externalValueGraphs = /* @__PURE__ */ new WeakMap();
5363
5482
  var externalGraphChangeListeners = /* @__PURE__ */ new Set();
@@ -5375,6 +5494,52 @@ function clearExternalValueAnimationGraph(value) {
5375
5494
  notifyExternalGraphChange(value, null);
5376
5495
  remoteReleaseCallback?.(value);
5377
5496
  }
5497
+ function clearRemoteCompletionTimer(anim) {
5498
+ if (anim.remoteCompletionTimer !== null) {
5499
+ clearTimeout(anim.remoteCompletionTimer);
5500
+ anim.remoteCompletionTimer = null;
5501
+ }
5502
+ }
5503
+ var lockstepActive = false;
5504
+ function scheduleRemoteCompletion(anim) {
5505
+ if (lockstepActive || anim.remoteCompletionTimer !== null || !anim.graph) return;
5506
+ const endEpochMs = getNativeAnimationGraphEndEpochMs(anim.graph);
5507
+ if (endEpochMs === null) return;
5508
+ anim.remoteCompletionTimer = setTimeout(
5509
+ () => {
5510
+ anim.remoteCompletionTimer = null;
5511
+ if (lockstepActive || activeAnimations.get(anim.id) !== anim || !anim.remoteDriven)
5512
+ return;
5513
+ if (getAnimationEpochTime() < endEpochMs) {
5514
+ scheduleRemoteCompletion(anim);
5515
+ return;
5516
+ }
5517
+ activeAnimations.delete(anim.id);
5518
+ settleRemoteDrivenValue(anim);
5519
+ remoteReleaseCallback?.(anim.value);
5520
+ anim.callback?.({ finished: true, reason: "completed" });
5521
+ if (activeAnimations.size === 0) stopLoop();
5522
+ },
5523
+ animationDelayToWallTime(endEpochMs - getAnimationEpochTime())
5524
+ );
5525
+ }
5526
+ subscribeAnimationClock(() => {
5527
+ for (const anim of activeAnimations.values()) {
5528
+ clearRemoteCompletionTimer(anim);
5529
+ if (anim.remoteDriven) scheduleRemoteCompletion(anim);
5530
+ }
5531
+ });
5532
+ function settleRemoteDrivenValue(anim) {
5533
+ if (anim.remoteDriven && anim.graph) {
5534
+ anim.value._value = sampleNativeAnimationGraph(anim.graph, getAnimationEpochTime());
5535
+ }
5536
+ }
5537
+ function stopLoop() {
5538
+ if (rafId != null) {
5539
+ cancelFrame(rafId);
5540
+ rafId = null;
5541
+ }
5542
+ }
5378
5543
 
5379
5544
  // ../peach-engine/src/engine/animated.ts
5380
5545
  function cubicBezier(x1, y1, x2, y2) {
@@ -5628,12 +5793,13 @@ var TIMING_CONVERGE_STEP_GRACE_MS = 120;
5628
5793
  function timing(value, config) {
5629
5794
  const duration = config.duration ?? 500;
5630
5795
  const easing = config.easing ?? defaultTimingEasing;
5631
- let rafId = null;
5796
+ let rafId2 = null;
5632
5797
  let startTime = null;
5633
5798
  let fromValue;
5634
5799
  let stopped = false;
5635
5800
  let completed = false;
5636
5801
  let engineAnimationId = null;
5802
+ let unsubscribeClock = null;
5637
5803
  let convergeTimer = null;
5638
5804
  let endCallback = null;
5639
5805
  let animationStartedAt = 0;
@@ -5647,6 +5813,8 @@ function timing(value, config) {
5647
5813
  }
5648
5814
  function clearRegistration() {
5649
5815
  clearConvergeTimer();
5816
+ unsubscribeClock?.();
5817
+ unsubscribeClock = null;
5650
5818
  if (engineAnimationId != null) {
5651
5819
  unregisterEngineAnimation(engineAnimationId);
5652
5820
  engineAnimationId = null;
@@ -5665,9 +5833,9 @@ function timing(value, config) {
5665
5833
  const shouldNotifyCancel = !completed;
5666
5834
  completed = true;
5667
5835
  clearRegistration();
5668
- if (rafId !== null) {
5669
- cancelFrame(rafId);
5670
- rafId = null;
5836
+ if (rafId2 !== null) {
5837
+ cancelFrame(rafId2);
5838
+ rafId2 = null;
5671
5839
  }
5672
5840
  if (shouldNotifyCancel) {
5673
5841
  if (animationEventId !== null) {
@@ -5693,6 +5861,7 @@ function timing(value, config) {
5693
5861
  fromValue = value.getValue();
5694
5862
  const toValue = config.toValue;
5695
5863
  startTime = null;
5864
+ const watchdogStart = getAnimationTimestamp();
5696
5865
  animationStartedAt = performance.now();
5697
5866
  engineAnimationId = registerEngineAnimation({
5698
5867
  value,
@@ -5747,13 +5916,18 @@ function timing(value, config) {
5747
5916
  convergeTimer = null;
5748
5917
  if (stopped || completed) return;
5749
5918
  if (isLockstepCaptureActive()) {
5750
- scheduleConverge(duration + TIMING_CONVERGE_STEP_GRACE_MS);
5919
+ scheduleConverge(TIMING_CONVERGE_STEP_GRACE_MS);
5920
+ return;
5921
+ }
5922
+ const remaining = duration - (getAnimationTimestamp() - (startTime ?? watchdogStart));
5923
+ if (remaining > 0) {
5924
+ scheduleConverge(TIMING_CONVERGE_STEP_GRACE_MS);
5751
5925
  return;
5752
5926
  }
5753
5927
  completed = true;
5754
- if (rafId !== null) {
5755
- cancelFrame(rafId);
5756
- rafId = null;
5928
+ if (rafId2 !== null) {
5929
+ cancelFrame(rafId2);
5930
+ rafId2 = null;
5757
5931
  }
5758
5932
  value._setValueFromAnimation(toValue);
5759
5933
  clearRegistration();
@@ -5773,9 +5947,14 @@ function timing(value, config) {
5773
5947
  }
5774
5948
  notifyEnd({ finished: true });
5775
5949
  };
5776
- const scheduleConverge = (delayMs) => {
5950
+ const scheduleConverge = (graceMs) => {
5777
5951
  clearConvergeTimer();
5778
- convergeTimer = setTimeout(finishFromWatchdog, delayMs);
5952
+ convergeTimer = setTimeout(
5953
+ finishFromWatchdog,
5954
+ animationDelayToWallTime(
5955
+ duration - (getAnimationTimestamp() - (startTime ?? watchdogStart))
5956
+ ) + graceMs
5957
+ );
5779
5958
  };
5780
5959
  function step(timestamp) {
5781
5960
  if (stopped) {
@@ -5783,12 +5962,12 @@ function timing(value, config) {
5783
5962
  return;
5784
5963
  }
5785
5964
  if (completed) {
5786
- rafId = null;
5965
+ rafId2 = null;
5787
5966
  return;
5788
5967
  }
5789
5968
  if (startTime === null) {
5790
5969
  startTime = timestamp;
5791
- scheduleConverge(duration + TIMING_CONVERGE_STEP_GRACE_MS);
5970
+ scheduleConverge(TIMING_CONVERGE_STEP_GRACE_MS);
5792
5971
  }
5793
5972
  const elapsed = timestamp - startTime;
5794
5973
  const progress = Math.min(elapsed / duration, 1);
@@ -5801,9 +5980,9 @@ function timing(value, config) {
5801
5980
  }
5802
5981
  fireEngineAnimationStepRender(value);
5803
5982
  if (progress < 1) {
5804
- rafId = requestFrame(step);
5983
+ rafId2 = requestFrame(step);
5805
5984
  } else {
5806
- rafId = null;
5985
+ rafId2 = null;
5807
5986
  completed = true;
5808
5987
  clearRegistration();
5809
5988
  const eventId = animationEventId;
@@ -5823,8 +6002,11 @@ function timing(value, config) {
5823
6002
  notifyEnd({ finished: true });
5824
6003
  }
5825
6004
  }
5826
- scheduleConverge(duration + TIMING_CONVERGE_START_GRACE_MS);
5827
- rafId = requestFrame(step);
6005
+ unsubscribeClock = subscribeAnimationClock(
6006
+ () => scheduleConverge(TIMING_CONVERGE_STEP_GRACE_MS)
6007
+ );
6008
+ scheduleConverge(TIMING_CONVERGE_START_GRACE_MS);
6009
+ rafId2 = requestFrame(step);
5828
6010
  }
5829
6011
  animation = { start, stop };
5830
6012
  return animation;
@@ -6711,6 +6893,10 @@ var COLOR_STYLE_PROPS = /* @__PURE__ */ new Set([
6711
6893
  "borderRightColor",
6712
6894
  "borderStartColor",
6713
6895
  "borderEndColor",
6896
+ "borderBlockColor",
6897
+ "borderBlockStartColor",
6898
+ "borderBlockEndColor",
6899
+ "overlayColor",
6714
6900
  "textDecorationColor",
6715
6901
  "textShadowColor",
6716
6902
  "tintColor",
@@ -7359,13 +7545,13 @@ var loadedVectors = /* @__PURE__ */ new Map();
7359
7545
  var failedVectors = /* @__PURE__ */ new Set();
7360
7546
  var assetPromises = /* @__PURE__ */ new Map();
7361
7547
  var symbolPromises = /* @__PURE__ */ new Map();
7362
- var listeners5 = /* @__PURE__ */ new Map();
7548
+ var listeners6 = /* @__PURE__ */ new Map();
7363
7549
  function clearCatalogState() {
7364
7550
  loadedVectors.clear();
7365
7551
  failedVectors.clear();
7366
7552
  assetPromises.clear();
7367
7553
  symbolPromises.clear();
7368
- listeners5.clear();
7554
+ listeners6.clear();
7369
7555
  }
7370
7556
  onMaterialSymbolCatalogConfigure(clearCatalogState);
7371
7557
 
@@ -7453,12 +7639,14 @@ function isMetroAssetRegistryModulePath(modulePath) {
7453
7639
  return modulePath.includes("polyfill:assets-registry") || modulePath.includes("@react-native/assets-registry/registry") || modulePath.includes("assets-registry/registry") || modulePath.includes("react-native/asset-registry") || modulePath.includes("react-native/src/asset-registry");
7454
7640
  }
7455
7641
 
7642
+ // ../peach-compat/src/stubs/browser-object-url.ts
7643
+ var BrowserURL = globalThis.URL;
7644
+ var createBrowserObjectURL = BrowserURL.createObjectURL.bind(BrowserURL);
7645
+ var revokeBrowserObjectURL = BrowserURL.revokeObjectURL.bind(BrowserURL);
7646
+
7456
7647
  // ../peach-engine/src/native-globals.ts
7457
7648
  var nativeGlobals = globalThis;
7458
7649
  var NativeBlob = nativeGlobals.Blob;
7459
- var NativeURL = nativeGlobals.URL;
7460
- var nativeCreateObjectURL = URL.createObjectURL.bind(URL);
7461
- var nativeRevokeObjectURL = URL.revokeObjectURL.bind(URL);
7462
7650
  var NativeTextDecoder = nativeGlobals.TextDecoder;
7463
7651
  var NativeTextEncoder = nativeGlobals.TextEncoder;
7464
7652
  var NativeXMLHttpRequest = nativeGlobals.XMLHttpRequest;
@@ -7480,36 +7668,6 @@ var nativeMatchMedia = typeof window !== "undefined" && typeof window.matchMedia
7480
7668
  return false;
7481
7669
  }
7482
7670
  }));
7483
- function installBlobLock() {
7484
- const desc = Object.getOwnPropertyDescriptor(URL, "createObjectURL");
7485
- if (desc && desc.configurable === false && desc.get) {
7486
- return;
7487
- }
7488
- try {
7489
- Object.defineProperty(URL, "createObjectURL", {
7490
- configurable: false,
7491
- enumerable: false,
7492
- get() {
7493
- return nativeCreateObjectURL;
7494
- },
7495
- set(_) {
7496
- }
7497
- });
7498
- } catch {
7499
- }
7500
- try {
7501
- Object.defineProperty(URL, "revokeObjectURL", {
7502
- configurable: false,
7503
- enumerable: false,
7504
- get() {
7505
- return nativeRevokeObjectURL;
7506
- },
7507
- set(_) {
7508
- }
7509
- });
7510
- } catch {
7511
- }
7512
- }
7513
7671
  function installMatchMediaLock() {
7514
7672
  const g = globalThis;
7515
7673
  const desc = Object.getOwnPropertyDescriptor(g, "matchMedia");
@@ -7554,9 +7712,6 @@ function installNetworkingLock() {
7554
7712
  installCodecOrNetGlobalLock("XMLHttpRequest", NativeXMLHttpRequest);
7555
7713
  installCodecOrNetGlobalLock("FormData", NativeFormData);
7556
7714
  }
7557
- function installURLLock() {
7558
- installCodecOrNetGlobalLock("URL", NativeURL);
7559
- }
7560
7715
  function restoreNativeBlobHelpers() {
7561
7716
  const g = globalThis;
7562
7717
  if (g.Blob !== NativeBlob) {
@@ -7565,11 +7720,9 @@ function restoreNativeBlobHelpers() {
7565
7720
  } catch {
7566
7721
  }
7567
7722
  }
7568
- installBlobLock();
7569
7723
  installTextCodecLock();
7570
7724
  installMatchMediaLock();
7571
7725
  installNetworkingLock();
7572
- installURLLock();
7573
7726
  }
7574
7727
  restoreNativeBlobHelpers();
7575
7728
  var LOCKED_GLOBALS = /* @__PURE__ */ new Set([
@@ -7577,8 +7730,7 @@ var LOCKED_GLOBALS = /* @__PURE__ */ new Set([
7577
7730
  "TextEncoder",
7578
7731
  "Blob",
7579
7732
  "XMLHttpRequest",
7580
- "FormData",
7581
- "URL"
7733
+ "FormData"
7582
7734
  ]);
7583
7735
  function patchedDefineProperty(target, key, descriptor) {
7584
7736
  const onGlobal = target === globalThis;
@@ -9856,9 +10008,9 @@ var liveScrollIndicators = /* @__PURE__ */ new Set();
9856
10008
  function clearScrollIndicatorFade(node) {
9857
10009
  const state5 = indicatorStates.get(node);
9858
10010
  if (!state5) return;
9859
- if (state5.fadeTimerId !== null && state5.fadeTimerId !== void 0) {
9860
- clearTimeout(state5.fadeTimerId);
9861
- state5.fadeTimerId = null;
10011
+ if (state5.cancelFadeTimer !== null && state5.cancelFadeTimer !== void 0) {
10012
+ state5.cancelFadeTimer();
10013
+ state5.cancelFadeTimer = null;
9862
10014
  }
9863
10015
  state5.opacity = 0;
9864
10016
  state5.lastActiveTime = 0;
@@ -10052,6 +10204,57 @@ var INLINE_STYLE_PROP_KEYS = [
10052
10204
  "transform"
10053
10205
  ];
10054
10206
  var INLINE_STYLE_PROP_SET = new Set(INLINE_STYLE_PROP_KEYS);
10207
+ var FABRIC_STYLE_PROP_SET = /* @__PURE__ */ new Set([
10208
+ ...INLINE_STYLE_PROP_SET,
10209
+ "insetBlock",
10210
+ "insetBlockEnd",
10211
+ "insetBlockStart",
10212
+ "insetInline",
10213
+ "insetInlineEnd",
10214
+ "insetInlineStart",
10215
+ "marginBlock",
10216
+ "marginBlockEnd",
10217
+ "marginBlockStart",
10218
+ "marginInline",
10219
+ "marginInlineEnd",
10220
+ "marginInlineStart",
10221
+ "paddingBlock",
10222
+ "paddingBlockEnd",
10223
+ "paddingBlockStart",
10224
+ "paddingInline",
10225
+ "paddingInlineEnd",
10226
+ "paddingInlineStart",
10227
+ "experimental_backgroundSize",
10228
+ "experimental_backgroundPosition",
10229
+ "experimental_backgroundRepeat",
10230
+ "backfaceVisibility",
10231
+ "borderBlockColor",
10232
+ "borderBlockEndColor",
10233
+ "borderBlockStartColor",
10234
+ "borderCurve",
10235
+ "borderEndEndRadius",
10236
+ "borderEndStartRadius",
10237
+ "borderStartEndRadius",
10238
+ "borderStartStartRadius",
10239
+ "borderTopEndRadius",
10240
+ "borderTopStartRadius",
10241
+ "cursor",
10242
+ "userSelect",
10243
+ "verticalAlign",
10244
+ "overlayColor",
10245
+ "resizeMode",
10246
+ "objectFit"
10247
+ ]);
10248
+ function mergeFabricRawProps(hostProps, rawProps) {
10249
+ const props = { ...hostProps };
10250
+ const style = {};
10251
+ for (const [key, value] of Object.entries(rawProps)) {
10252
+ if (FABRIC_STYLE_PROP_SET.has(key)) style[key] = value;
10253
+ else props[key] = value;
10254
+ }
10255
+ props.style = [hostProps.style, style];
10256
+ return props;
10257
+ }
10055
10258
  function extractOrderedStyleInput(type, props) {
10056
10259
  let out = null;
10057
10260
  let pending = null;
@@ -10367,6 +10570,9 @@ function resolveStyleValue(value, key) {
10367
10570
  if (typeof value === "boolean") return value;
10368
10571
  if (typeof value !== "object") return value;
10369
10572
  if (key && COLOR_STYLE_PROPS.has(key)) {
10573
+ if (value.space === "srgb") {
10574
+ return `rgba(${value.r * 255},${value.g * 255},${value.b * 255},${value.a})`;
10575
+ }
10370
10576
  const platformColor = resolveAndroidPlatformColor(value);
10371
10577
  if (platformColor) return normalizeColorStyleValue(key, platformColor);
10372
10578
  }
@@ -11596,7 +11802,8 @@ function attachNativeHostInstanceFields(node) {
11596
11802
  ["_nativeTag", node.id],
11597
11803
  ["__viewTag", node.id],
11598
11804
  ["__internalInstanceHandle", { stateNode: { node } }],
11599
- ["_viewConfig", viewConfig]
11805
+ ["_viewConfig", viewConfig],
11806
+ ["__viewConfig", viewConfig]
11600
11807
  ]) {
11601
11808
  Object.defineProperty(node, key, {
11602
11809
  value,
@@ -11751,6 +11958,8 @@ var SootSimNode = class _SootSimNode {
11751
11958
  id;
11752
11959
  type;
11753
11960
  props;
11961
+ lastReactProps;
11962
+ fabricNativeProps = null;
11754
11963
  // exact Tamagui token provenance for this node's resolved style, read from
11755
11964
  // the host style layers on ingestion (before flatten/resolve). empty for
11756
11965
  // ordinary React Native nodes; frozen into
@@ -11808,8 +12017,6 @@ var SootSimNode = class _SootSimNode {
11808
12017
  _scrollOffsetX = 0;
11809
12018
  _scrollOffsetY = 0;
11810
12019
  _scrollOffsetListeners = null;
11811
- _scrollFollowContentEndX = false;
11812
- _scrollFollowContentEndY = false;
11813
12020
  _maintainVisibleContentPositionAnchor = null;
11814
12021
  _maintainVisibleContentPositionAnchorFromMutation = false;
11815
12022
  // a scroll content container's children extent (engine/scroll.ts), valid
@@ -12047,6 +12254,19 @@ var SootSimNode = class _SootSimNode {
12047
12254
  return this.unstable_getBoundingClientRect();
12048
12255
  }
12049
12256
  // RN ref compatibility
12257
+ commitFabricRawProps(props) {
12258
+ let root = this;
12259
+ while (root.parent) root = root.parent;
12260
+ if (root === this || root.type !== "root") return null;
12261
+ this.updateProps(
12262
+ mergeFabricRawProps(
12263
+ { ...this.props, style: flattenStyle2(this.props.style) },
12264
+ props
12265
+ ),
12266
+ "native"
12267
+ );
12268
+ return root;
12269
+ }
12050
12270
  __setNativePropsImpl;
12051
12271
  __dispatchCommandImpl;
12052
12272
  markAnimatedNativePropKeys(props) {
@@ -12293,7 +12513,6 @@ var SootSimNode = class _SootSimNode {
12293
12513
  return;
12294
12514
  }
12295
12515
  if (this.scrollOffsetX === next) return;
12296
- this._scrollFollowContentEndX = false;
12297
12516
  this.scrollOffsetX = next;
12298
12517
  this.__scroll?.syncExternalOffset?.();
12299
12518
  this.markImperativeScrollDirty();
@@ -12314,7 +12533,6 @@ var SootSimNode = class _SootSimNode {
12314
12533
  return;
12315
12534
  }
12316
12535
  if (this.scrollOffsetY === next) return;
12317
- this._scrollFollowContentEndY = false;
12318
12536
  this.scrollOffsetY = next;
12319
12537
  this.__scroll?.syncExternalOffset?.();
12320
12538
  this.markImperativeScrollDirty();
@@ -12353,6 +12571,7 @@ var SootSimNode = class _SootSimNode {
12353
12571
  }
12354
12572
  }
12355
12573
  if (this.__scroll?.scrollToOffset) {
12574
+ this._flushPendingLayout();
12356
12575
  this.__scroll.scrollToOffset({
12357
12576
  ...hasX ? { x: nextLeft } : {},
12358
12577
  ...hasY ? { y: nextTop } : {},
@@ -12368,8 +12587,6 @@ var SootSimNode = class _SootSimNode {
12368
12587
  if (this.scrollOffsetX === nextLeft && this.scrollOffsetY === nextTop) {
12369
12588
  return;
12370
12589
  }
12371
- const requestedLeft = nextLeft;
12372
- const requestedTop = nextTop;
12373
12590
  const contentBounds = getScrollContentBounds(this);
12374
12591
  const maxScroll = getScrollContentEndOffset(this, this.props);
12375
12592
  const maxScrollX = maxScroll.x;
@@ -12388,12 +12605,6 @@ var SootSimNode = class _SootSimNode {
12388
12605
  ),
12389
12606
  Math.min(maxScrollY, nextTop)
12390
12607
  );
12391
- if (hasX) {
12392
- this._scrollFollowContentEndX = maxScrollX > 0 && requestedLeft >= maxScrollX - 0.5;
12393
- }
12394
- if (hasY) {
12395
- this._scrollFollowContentEndY = maxScrollY > 0 && requestedTop >= maxScrollY - 0.5;
12396
- }
12397
12608
  this.scrollOffsetX = nextLeft;
12398
12609
  this.scrollOffsetY = nextTop;
12399
12610
  this.__scroll?.syncExternalOffset?.();
@@ -12441,8 +12652,12 @@ var SootSimNode = class _SootSimNode {
12441
12652
  animated: arg1?.animated !== false
12442
12653
  });
12443
12654
  }
12655
+ // a command runs against the committed tree: fabric mounts a commit before
12656
+ // the ui thread runs a command issued after it (both queue on the main
12657
+ // queue), so a scrollToEnd from an effect sees the rows that commit added
12444
12658
  scrollToEnd(options) {
12445
12659
  if (this.__scroll?.scrollToOffset) {
12660
+ this._flushPendingLayout();
12446
12661
  const target = Number.MAX_SAFE_INTEGER;
12447
12662
  const opts = this.props?.horizontal === true ? { x: target, y: 0, animated: options?.animated !== false } : { x: 0, y: target, animated: options?.animated !== false };
12448
12663
  this.__scroll.scrollToOffset({
@@ -12638,6 +12853,7 @@ var SootSimNode = class _SootSimNode {
12638
12853
  _svgPath = null;
12639
12854
  _svgPathData = null;
12640
12855
  _svgPathBounds = null;
12856
+ _svgPathTightBounds = null;
12641
12857
  _svgPathCkVersion = 0;
12642
12858
  // cached emoji grapheme ranges for native-emoji overdraw. computed once
12643
12859
  // alongside the paragraph; null when native emoji isn't available.
@@ -12677,6 +12893,7 @@ var SootSimNode = class _SootSimNode {
12677
12893
  );
12678
12894
  this.type = type;
12679
12895
  this.props = props;
12896
+ this.lastReactProps = props;
12680
12897
  if (type === "image") queueImageLoad(this);
12681
12898
  this._wireRevision = nextWireRevision();
12682
12899
  this._wireSubtreeRevision = this._wireRevision;
@@ -12752,7 +12969,26 @@ var SootSimNode = class _SootSimNode {
12752
12969
  }
12753
12970
  updateProps(newProps, source = "react") {
12754
12971
  if (source === "react") {
12972
+ if (this.fabricNativeProps) {
12973
+ const previous = {
12974
+ ...this.lastReactProps,
12975
+ ...flattenStyle2(getNodeStyleInput(this.type, this.lastReactProps))
12976
+ };
12977
+ const next = {
12978
+ ...newProps,
12979
+ ...flattenStyle2(getNodeStyleInput(this.type, newProps))
12980
+ };
12981
+ for (const key of Object.keys(this.fabricNativeProps)) {
12982
+ if (!styleValuesEqual(previous[key], next[key])) {
12983
+ this.fabricNativeProps[key] = next[key] ?? null;
12984
+ }
12985
+ }
12986
+ }
12987
+ this.lastReactProps = newProps;
12755
12988
  newProps = this.mergeAnimatedNativePropsForReact(newProps);
12989
+ if (this.fabricNativeProps) {
12990
+ newProps = mergeFabricRawProps(newProps, this.fabricNativeProps);
12991
+ }
12756
12992
  }
12757
12993
  const oldProps = this.props;
12758
12994
  const oldStyleInput = oldProps.style;
@@ -12832,7 +13068,7 @@ var SootSimNode = class _SootSimNode {
12832
13068
  if (scrollContentOffsetChanged) {
12833
13069
  const nextOffset = readContentOffsetProp(newProps.contentOffset);
12834
13070
  if (nextOffset) {
12835
- moved = this.__scroll?.scrollToOffset?.({
13071
+ moved = this.__scroll?.shiftScrollTo?.(nextOffset) === true || this.__scroll?.scrollToOffset?.({
12836
13072
  ...nextOffset,
12837
13073
  animated: false,
12838
13074
  fireScroll: true,
@@ -13308,6 +13544,34 @@ var CanvasKitPaintPool = class {
13308
13544
  var _paintPool = new CanvasKitPaintPool();
13309
13545
  var _surfacePool = new CanvasKitSiblingSurfacePool(2);
13310
13546
 
13547
+ // ../peach-engine/src/platform/adapter.ts
13548
+ var IOS_ADAPTER = Object.freeze({
13549
+ id: "ios",
13550
+ displayName: "iOS",
13551
+ isIOS: true,
13552
+ isAndroid: false,
13553
+ select: (registry) => registry.ios
13554
+ });
13555
+ var ANDROID_ADAPTER = Object.freeze({
13556
+ id: "android",
13557
+ displayName: "Android",
13558
+ isIOS: false,
13559
+ isAndroid: true,
13560
+ select: (registry) => registry.android
13561
+ });
13562
+ var RUNTIME_PLATFORM_ADAPTERS = Object.freeze({
13563
+ ios: IOS_ADAPTER,
13564
+ android: ANDROID_ADAPTER
13565
+ });
13566
+ function getRuntimePlatformAdapter(platform) {
13567
+ return RUNTIME_PLATFORM_ADAPTERS[platform];
13568
+ }
13569
+
13570
+ // ../peach-engine/src/platform/current-platform.ts
13571
+ function currentRuntimePlatform() {
13572
+ return Platform.OS;
13573
+ }
13574
+
13311
13575
  // ../peach-engine/src/engine/node-helpers.ts
13312
13576
  function readNumberish(v) {
13313
13577
  if (typeof v === "number") return v;
@@ -14088,7 +14352,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14088
14352
  d: "M8.602 23.115L15.398 23.115 15.398 15.545C15.398 15.006 15.047 14.654 14.508 14.654L9.504 14.654C8.965 14.654 8.602 15.006 8.602 15.545ZM-0.984 12.193C-0.656 12.193-0.387 12.018-0.141 11.818L11.59 1.963C11.719 1.857 11.871 1.799 12 1.799 12.141 1.799 12.281 1.857 12.41 1.963L24.152 11.818C24.387 12.018 24.656 12.193 24.984 12.193 25.617 12.193 25.992 11.736 25.992 11.256 25.992 10.986 25.887 10.705 25.617 10.494L13.406 0.24C12.961-0.135 12.48-0.322 12-0.322 11.52-0.322 11.039-0.135 10.594 0.24L-1.617 10.494C-1.875 10.705-1.992 10.986-1.992 11.256-1.992 11.736-1.617 12.193-0.984 12.193ZM19.629 5.971L22.57 8.455 22.57 3.17C22.57 2.654 22.242 2.326 21.727 2.326L20.473 2.326C19.969 2.326 19.629 2.654 19.629 3.17ZM4.078 24.322L19.934 24.322C21.598 24.322 22.57 23.373 22.57 21.732L22.57 8.748 20.684 7.471 20.684 21.264C20.684 22.025 20.273 22.436 19.535 22.436L4.477 22.436C3.727 22.436 3.316 22.025 3.316 21.264L3.316 7.482 1.43 8.748 1.43 21.732C1.43 23.385 2.402 24.322 4.078 24.322Z"
14089
14353
  }
14090
14354
  ],
14091
- box: [-5, -2.425, 34, 28.867]
14355
+ box: [-5, -2.425, 34, 28.867],
14356
+ controlBoxes: { house: [18.666666666666668, 15.666666666666666, 3] }
14092
14357
  },
14093
14358
  "house.fill": {
14094
14359
  viewBox: "0 0 24 24",
@@ -14098,7 +14363,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14098
14363
  d: "M8.836 22.436L8.836 15.545C8.836 15.006 9.199 14.654 9.738 14.654L14.273 14.654C14.824 14.654 15.164 15.006 15.164 15.545L15.164 22.436ZM1.664 21.744C1.664 23.373 2.648 24.322 4.301 24.322L19.711 24.322C21.363 24.322 22.336 23.373 22.336 21.744L22.336 12.439 12.703 4.365C12.258 3.99 11.73 4.002 11.297 4.365L1.664 12.439ZM-0.984 12.193C-0.656 12.193-0.387 12.018-0.141 11.818L11.59 1.963C11.719 1.857 11.871 1.799 12 1.799 12.141 1.799 12.281 1.857 12.41 1.963L24.152 11.818C24.387 12.018 24.656 12.193 24.984 12.193 25.617 12.193 25.992 11.736 25.992 11.256 25.992 10.986 25.887 10.705 25.617 10.494L13.406 0.24C12.961-0.135 12.48-0.322 12-0.322 11.52-0.322 11.039-0.135 10.594 0.24L-1.617 10.494C-1.875 10.705-1.992 10.986-1.992 11.256-1.992 11.736-1.617 12.193-0.984 12.193ZM19.629 5.971L22.57 8.455 22.57 3.17C22.57 2.654 22.242 2.326 21.727 2.326L20.473 2.326C19.969 2.326 19.629 2.654 19.629 3.17Z"
14099
14364
  }
14100
14365
  ],
14101
- box: [-5, -2.425, 34, 28.867]
14366
+ box: [-5, -2.425, 34, 28.867],
14367
+ controlBoxes: { "house.fill": [18.666666666666668, 15.666666666666666, 3] }
14102
14368
  },
14103
14369
  magnifyingglass: {
14104
14370
  viewBox: "0 0 24 24",
@@ -14108,7 +14374,10 @@ var COMMON_SF_SYMBOL_VECTORS = {
14108
14374
  d: "M0.551 9.791C0.551 14.947 4.746 19.143 9.902 19.143 11.941 19.143 13.805 18.486 15.34 17.385L21.105 23.162C21.375 23.432 21.727 23.561 22.102 23.561 22.898 23.561 23.449 22.963 23.449 22.178 23.449 21.803 23.309 21.463 23.063 21.217L17.332 15.451C18.539 13.881 19.254 11.924 19.254 9.791 19.254 4.635 15.059 0.439 9.902 0.439 4.746 0.439 0.551 4.635 0.551 9.791ZM2.555 9.791C2.555 5.736 5.848 2.443 9.902 2.443 13.957 2.443 17.25 5.736 17.25 9.791 17.25 13.846 13.957 17.139 9.902 17.139 5.848 17.139 2.555 13.846 2.555 9.791Z"
14109
14375
  }
14110
14376
  ],
14111
- box: [-2.15, -1.675, 28.3, 27.367]
14377
+ box: [-2.15, -1.675, 28.3, 27.367],
14378
+ controlBoxes: {
14379
+ magnifyingglass: [15.333333333333334, 14.666666666666666, 2.6666666666666665]
14380
+ }
14112
14381
  },
14113
14382
  "person.crop.circle": {
14114
14383
  viewBox: "0 0 24 24",
@@ -14118,7 +14387,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14118
14387
  d: "M12 23.953C18.598 23.953 23.953 18.598 23.953 12 23.953 5.402 18.598 0.047 12 0.047 5.402 0.047 0.047 5.402 0.047 12 0.047 18.598 5.402 23.953 12 23.953ZM12 21.961C6.492 21.961 2.039 17.508 2.039 12 2.039 6.492 6.492 2.039 12 2.039 17.508 2.039 21.961 6.492 21.961 12 21.961 17.508 17.508 21.961 12 21.961ZM20.016 19.723L19.98 19.594C19.406 17.871 16.313 15.984 12 15.984 7.699 15.984 4.605 17.871 4.02 19.582L3.984 19.723C6.094 21.809 9.715 23.027 12 23.027 14.297 23.027 17.883 21.82 20.016 19.723ZM12 13.992C14.262 14.016 16.02 12.094 16.02 9.574 16.02 7.207 14.25 5.25 12 5.25 9.75 5.25 7.969 7.207 7.98 9.574 7.992 12.094 9.75 13.969 12 13.992Z"
14119
14388
  }
14120
14389
  ],
14121
- box: [-2.075, -2.05, 28.167, 28.1]
14390
+ box: [-2.075, -2.05, 28.167, 28.1],
14391
+ controlBoxes: { "person.crop.circle": [15, 15, 3] }
14122
14392
  },
14123
14393
  gearshape: {
14124
14394
  viewBox: "0 0 24 24",
@@ -14128,7 +14398,10 @@ var COMMON_SF_SYMBOL_VECTORS = {
14128
14398
  d: "M10.816 24.527L13.184 24.527C14.086 24.527 14.789 23.977 14.988 23.109L15.492 20.918 15.867 20.789 17.777 21.961C18.539 22.43 19.418 22.324 20.063 21.68L21.703 20.051C22.348 19.406 22.453 18.516 21.984 17.766L20.789 15.867 20.93 15.516 23.121 15C23.977 14.801 24.539 14.086 24.539 13.195L24.539 10.875C24.539 9.984 23.988 9.281 23.121 9.07L20.953 8.543 20.801 8.168 21.996 6.27C22.465 5.52 22.371 4.641 21.715 3.984L20.074 2.344C19.441 1.711 18.563 1.594 17.801 2.063L15.891 3.234 15.492 3.082 14.988 0.891C14.789 0.023 14.086-0.527 13.184-0.527L10.816-0.527C9.914-0.527 9.211 0.023 9.012 0.891L8.496 3.082 8.098 3.234 6.199 2.063C5.438 1.594 4.547 1.711 3.914 2.344L2.285 3.984C1.629 4.641 1.523 5.52 2.004 6.27L3.188 8.168 3.047 8.543 0.879 9.07C0.012 9.281-0.539 9.984-0.539 10.875L-0.539 13.195C-0.539 14.086 0.023 14.801 0.879 15L3.07 15.516 3.199 15.867 2.016 17.766C1.535 18.516 1.652 19.406 2.297 20.051L3.926 21.68C4.57 22.324 5.461 22.43 6.223 21.961L8.121 20.789 8.496 20.918 9.012 23.109C9.211 23.977 9.914 24.527 10.816 24.527ZM11.004 22.699C10.805 22.699 10.699 22.617 10.664 22.43L9.961 19.523C9.246 19.348 8.578 19.066 8.074 18.75L5.52 20.32C5.379 20.426 5.215 20.414 5.086 20.262L3.703 18.879C3.574 18.75 3.563 18.609 3.656 18.445L5.227 15.914C4.957 15.422 4.652 14.754 4.465 14.039L1.559 13.348C1.371 13.313 1.289 13.207 1.289 13.008L1.289 11.051C1.289 10.84 1.359 10.746 1.559 10.711L4.453 10.008C4.641 9.246 4.992 8.555 5.203 8.121L3.645 5.59C3.539 5.414 3.551 5.273 3.68 5.133L5.074 3.773C5.215 3.633 5.344 3.621 5.52 3.715L8.051 5.25C8.555 4.969 9.27 4.676 9.973 4.477L10.664 1.57C10.699 1.383 10.805 1.301 11.004 1.301L12.996 1.301C13.195 1.301 13.301 1.383 13.324 1.57L14.039 4.5C14.766 4.688 15.398 4.98 15.926 5.262L18.469 3.715C18.656 3.621 18.773 3.633 18.926 3.773L20.309 5.133C20.449 5.273 20.449 5.414 20.344 5.59L18.785 8.121C19.008 8.555 19.348 9.246 19.535 10.008L22.441 10.711C22.629 10.746 22.711 10.84 22.711 11.051L22.711 13.008C22.711 13.207 22.617 13.313 22.441 13.348L19.523 14.039C19.336 14.754 19.043 15.422 18.762 15.914L20.332 18.445C20.426 18.609 20.426 18.75 20.285 18.879L18.914 20.262C18.773 20.414 18.621 20.426 18.469 20.32L15.914 18.75C15.41 19.066 14.754 19.348 14.039 19.523L13.324 22.43C13.301 22.617 13.195 22.699 12.996 22.699ZM12 16.465C14.473 16.465 16.465 14.473 16.465 12 16.465 9.527 14.473 7.535 12 7.535 9.527 7.535 7.535 9.527 7.535 12 7.535 14.473 9.527 16.465 12 16.465ZM12 14.648C10.535 14.648 9.352 13.465 9.352 12 9.352 10.535 10.535 9.352 12 9.352 13.465 9.352 14.648 10.535 14.648 12 14.648 13.465 13.465 14.648 12 14.648Z"
14129
14399
  }
14130
14400
  ],
14131
- box: [-2.65, -2.625, 29.3, 29.267]
14401
+ box: [-2.65, -2.625, 29.3, 29.267],
14402
+ controlBoxes: {
14403
+ gearshape: [15.666666666666666, 15.666666666666666, 3.3333333333333335]
14404
+ }
14132
14405
  },
14133
14406
  "photo.on.rectangle": {
14134
14407
  viewBox: "0 0 24 24",
@@ -14138,7 +14411,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14138
14411
  d: "M6.926 23.25L22.617 23.25C24.656 23.25 25.746 22.219 25.746 20.168L25.746 19.418 20.309 14.285C19.852 13.863 19.289 13.652 18.727 13.652 18.141 13.652 17.625 13.84 17.145 14.273L12.41 18.469 10.523 16.77C10.078 16.359 9.598 16.172 9.094 16.172 8.637 16.172 8.203 16.359 7.746 16.746L3.797 20.18C3.797 22.219 4.887 23.25 6.926 23.25ZM11.566 14.543C12.926 14.543 14.039 13.406 14.039 12.035 14.039 10.688 12.926 9.551 11.566 9.551 10.195 9.551 9.082 10.688 9.082 12.035 9.082 13.406 10.195 14.543 11.566 14.543ZM1.102 18.445L4.008 18.445 4.008 16.559 1.125 16.559C-0.047 16.559-0.691 15.938-0.691 14.719L-0.691 3.867C-0.691 2.648-0.047 2.016 1.125 2.016L17.074 2.016C18.234 2.016 18.902 2.648 18.902 3.867L18.902 6.316 20.789 6.316 20.789 3.762C20.789 1.348 19.547 0.129 17.109 0.129L1.102 0.129C-1.359 0.129-2.578 1.348-2.578 3.762L-2.578 14.813C-2.578 17.238-1.359 18.445 1.102 18.445ZM6.891 23.871L22.898 23.871C25.336 23.871 26.578 22.652 26.578 20.238L26.578 9.188C26.578 6.773 25.336 5.555 22.898 5.555L6.891 5.555C4.43 5.555 3.211 6.773 3.211 9.188L3.211 20.238C3.211 22.664 4.43 23.871 6.891 23.871ZM6.914 21.984C5.742 21.984 5.098 21.363 5.098 20.145L5.098 9.293C5.098 8.074 5.742 7.441 6.914 7.441L22.863 7.441C24.023 7.441 24.691 8.074 24.691 9.293L24.691 20.145C24.691 21.363 24.023 21.984 22.863 21.984Z"
14139
14412
  }
14140
14413
  ],
14141
- box: [-5.575, -1.975, 35.2, 27.967]
14414
+ box: [-5.575, -1.975, 35.2, 27.967],
14415
+ controlBoxes: { "photo.on.rectangle": [19.333333333333332, 15, 3] }
14142
14416
  },
14143
14417
  "heart.fill": {
14144
14418
  viewBox: "0 0 24 24",
@@ -14148,7 +14422,11 @@ var COMMON_SF_SYMBOL_VECTORS = {
14148
14422
  d: "M12 22.758C12.246 22.758 12.598 22.594 12.855 22.441 19.453 18.223 23.637 13.313 23.637 8.32 23.637 4.172 20.789 1.242 17.109 1.242 14.824 1.242 13.066 2.508 12 4.441 10.957 2.52 9.176 1.242 6.891 1.242 3.211 1.242 0.363 4.172 0.363 8.32 0.363 13.313 4.547 18.223 11.156 22.441 11.402 22.594 11.754 22.758 12 22.758Z"
14149
14423
  }
14150
14424
  ],
14151
- box: [-2.65, -0.875, 29.267, 25.767]
14425
+ box: [-2.65, -0.875, 29.267, 25.767],
14426
+ controlBoxes: {
14427
+ "heart.fill": [16, 13.666666666666666, 2.3333333333333335],
14428
+ "suit.heart.fill": [16, 13.666666666666666, 2.3333333333333335]
14429
+ }
14152
14430
  },
14153
14431
  "checkmark.circle.fill": {
14154
14432
  viewBox: "0 0 24 24",
@@ -14158,7 +14436,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14158
14436
  d: "M12 23.953C18.598 23.953 23.953 18.586 23.953 12 23.953 5.402 18.598 0.047 12 0.047 5.414 0.047 0.047 5.402 0.047 12 0.047 18.586 5.414 23.953 12 23.953ZM10.688 17.73C10.289 17.73 9.961 17.566 9.656 17.156L6.715 13.547C6.539 13.313 6.434 13.055 6.434 12.785 6.434 12.258 6.844 11.824 7.371 11.824 7.711 11.824 7.969 11.93 8.262 12.316L10.641 15.387 15.645 7.348C15.867 6.996 16.172 6.809 16.477 6.809 16.992 6.809 17.473 7.16 17.473 7.711 17.473 7.969 17.32 8.238 17.18 8.484L11.672 17.156C11.426 17.543 11.086 17.73 10.688 17.73Z"
14159
14437
  }
14160
14438
  ],
14161
- box: [-2.075, -2.05, 28.167, 28.1]
14439
+ box: [-2.075, -2.05, 28.167, 28.1],
14440
+ controlBoxes: { "checkmark.circle.fill": [15, 15, 3] }
14162
14441
  },
14163
14442
  "xmark.circle.fill": {
14164
14443
  viewBox: "0 0 24 24",
@@ -14168,7 +14447,11 @@ var COMMON_SF_SYMBOL_VECTORS = {
14168
14447
  d: "M12 23.953C18.598 23.953 23.953 18.586 23.953 12 23.953 5.402 18.598 0.047 12 0.047 5.414 0.047 0.047 5.402 0.047 12 0.047 18.586 5.414 23.953 12 23.953ZM8.063 16.922C7.523 16.922 7.102 16.488 7.102 15.949 7.102 15.691 7.195 15.445 7.383 15.27L10.629 12.012 7.383 8.766C7.195 8.578 7.102 8.344 7.102 8.086 7.102 7.535 7.523 7.125 8.063 7.125 8.332 7.125 8.543 7.219 8.73 7.395L12 10.652 15.293 7.383C15.492 7.184 15.703 7.102 15.961 7.102 16.5 7.102 16.934 7.523 16.934 8.063 16.934 8.332 16.852 8.543 16.641 8.754L13.383 12.012 16.629 15.258C16.828 15.434 16.922 15.68 16.922 15.949 16.922 16.488 16.488 16.922 15.938 16.922 15.668 16.922 15.422 16.828 15.246 16.641L12 13.383 8.766 16.641C8.578 16.828 8.332 16.922 8.063 16.922Z"
14169
14448
  }
14170
14449
  ],
14171
- box: [-2.075, -2.05, 28.167, 28.1]
14450
+ box: [-2.075, -2.05, 28.167, 28.1],
14451
+ controlBoxes: {
14452
+ "multiply.circle.fill": [15, 15, 3],
14453
+ "xmark.circle.fill": [15, 15, 3]
14454
+ }
14172
14455
  },
14173
14456
  "rectangle.stack": {
14174
14457
  viewBox: "0 0 24 24",
@@ -14178,7 +14461,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14178
14461
  d: "M3.404 24.973L20.596 24.973C23.033 24.973 24.275 23.754 24.275 21.34L24.275 9.305C24.275 6.891 23.033 5.672 20.596 5.672L3.404 5.672C0.943 5.672-0.275 6.891-0.275 9.305L-0.275 21.34C-0.275 23.754 0.943 24.973 3.404 24.973ZM3.428 23.086C2.256 23.086 1.611 22.453 1.611 21.234L1.611 9.41C1.611 8.191 2.256 7.559 3.428 7.559L20.561 7.559C21.721 7.559 22.389 8.191 22.389 9.41L22.389 21.234C22.389 22.453 21.721 23.086 20.561 23.086ZM2.197 3.785L21.814 3.785C21.639 2.719 21.135 2.133 19.963 2.133L4.049 2.133C2.877 2.133 2.373 2.719 2.197 3.785ZM4.611 0.539L19.4 0.539C19.33-0.457 18.768-0.973 17.678-0.973L6.322-0.973C5.244-0.973 4.682-0.457 4.611 0.539Z"
14179
14462
  }
14180
14463
  ],
14181
- box: [-3.25, -3.075, 30.533, 32.033]
14464
+ box: [-3.25, -3.075, 30.533, 32.033],
14465
+ controlBoxes: { "rectangle.stack": [17, 17.333333333333332, 4.333333333333333] }
14182
14466
  },
14183
14467
  "circle.grid.2x2": {
14184
14468
  viewBox: "0 0 24 24",
@@ -14188,7 +14472,10 @@ var COMMON_SF_SYMBOL_VECTORS = {
14188
14472
  d: "M5.959 11.074C8.783 11.074 11.068 8.789 11.068 5.965 11.068 3.141 8.783 0.855 5.959 0.855 3.135 0.855 0.85 3.141 0.85 5.965 0.85 8.789 3.135 11.074 5.959 11.074ZM5.959 9.246C4.143 9.246 2.678 7.781 2.678 5.965 2.678 4.148 4.143 2.684 5.959 2.684 7.775 2.684 9.24 4.148 9.24 5.965 9.24 7.781 7.775 9.246 5.959 9.246ZM18.041 11.074C20.865 11.074 23.15 8.789 23.15 5.965 23.15 3.141 20.865 0.855 18.041 0.855 15.217 0.855 12.932 3.141 12.932 5.965 12.932 8.789 15.217 11.074 18.041 11.074ZM18.041 9.246C16.225 9.246 14.76 7.781 14.76 5.965 14.76 4.148 16.225 2.684 18.041 2.684 19.857 2.684 21.322 4.148 21.322 5.965 21.322 7.781 19.857 9.246 18.041 9.246ZM5.959 23.145C8.783 23.145 11.068 20.859 11.068 18.035 11.068 15.211 8.783 12.926 5.959 12.926 3.135 12.926 0.85 15.211 0.85 18.035 0.85 20.859 3.135 23.145 5.959 23.145ZM5.959 21.316C4.143 21.316 2.678 19.852 2.678 18.035 2.678 16.219 4.143 14.754 5.959 14.754 7.775 14.754 9.24 16.219 9.24 18.035 9.24 19.852 7.775 21.316 5.959 21.316ZM18.041 23.145C20.865 23.145 23.15 20.859 23.15 18.035 23.15 15.211 20.865 12.926 18.041 12.926 15.217 12.926 12.932 15.211 12.932 18.035 12.932 20.859 15.217 23.145 18.041 23.145ZM18.041 21.316C16.225 21.316 14.76 19.852 14.76 18.035 14.76 16.219 16.225 14.754 18.041 14.754 19.857 14.754 21.322 16.219 21.322 18.035 21.322 19.852 19.857 21.316 18.041 21.316Z"
14189
14473
  }
14190
14474
  ],
14191
- box: [-2.15, -1.25, 28.3, 26.5]
14475
+ box: [-2.15, -1.25, 28.3, 26.5],
14476
+ controlBoxes: {
14477
+ "circle.grid.2x2": [15.666666666666666, 14.333333333333334, 2.3333333333333335]
14478
+ }
14192
14479
  },
14193
14480
  message: {
14194
14481
  viewBox: "0 0 24 24",
@@ -14198,7 +14485,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14198
14485
  d: "M12 23.408C19.875 23.408 25.629 18.604 25.629 11.994 25.629 5.361 19.863 0.592 12 0.592 4.125 0.592-1.629 5.361-1.629 11.994-1.629 14.186-0.984 16.225 0.141 17.877 0.691 18.697 0.891 19.271 0.891 19.752 0.891 20.373 0.703 20.877 0.164 21.346-0.762 22.131-0.281 23.408 0.938 23.408 2.402 23.408 4.031 22.904 5.238 22.072 7.219 22.939 9.527 23.408 12 23.408ZM12 21.521C9.762 21.521 7.758 21.1 6.059 20.338 5.309 20.01 4.77 20.104 4.055 20.525 3.551 20.842 2.965 21.111 2.367 21.24 2.613 20.83 2.777 20.361 2.777 19.752 2.777 18.885 2.461 17.936 1.711 16.811 0.773 15.451 0.258 13.799 0.258 11.994 0.258 6.498 5.109 2.479 12 2.479 18.891 2.479 23.742 6.498 23.742 11.994 23.742 17.49 18.891 21.521 12 21.521Z"
14199
14486
  }
14200
14487
  ],
14201
- box: [-3.75, -1.525, 31.5, 27.067]
14488
+ box: [-3.75, -1.525, 31.5, 27.067],
14489
+ controlBoxes: { message: [17, 14.666666666666666, 2] }
14202
14490
  },
14203
14491
  eye: {
14204
14492
  viewBox: "0 0 24 24",
@@ -14208,7 +14496,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14208
14496
  d: "M12.006 22.043C21.475 22.043 28.014 14.391 28.014 12 28.014 9.598 21.463 1.957 12.006 1.957 2.666 1.957-4.014 9.598-4.014 12-4.014 14.391 2.654 22.043 12.006 22.043ZM12.006 20.191C4.283 20.191-1.963 13.652-1.963 12-1.963 10.605 4.283 3.809 12.006 3.809 19.693 3.809 25.963 10.605 25.963 12 25.963 13.652 19.693 20.191 12.006 20.191ZM12.006 18.551C15.639 18.551 18.58 15.609 18.58 11.977 18.58 8.344 15.639 5.402 12.006 5.402 8.373 5.402 5.42 8.344 5.42 11.977 5.42 15.609 8.373 18.551 12.006 18.551ZM12.006 14.168C10.799 14.168 9.826 13.195 9.826 11.988 9.826 10.781 10.799 9.809 12.006 9.809 13.213 9.809 14.186 10.781 14.186 11.988 14.186 13.195 13.213 14.168 12.006 14.168Z"
14209
14497
  }
14210
14498
  ],
14211
- box: [-6.425, -0.15, 36.833, 24.3]
14499
+ box: [-6.425, -0.15, 36.833, 24.3],
14500
+ controlBoxes: { eye: [20.333333333333332, 13, 2] }
14212
14501
  },
14213
14502
  globe: {
14214
14503
  viewBox: "0 0 24 24",
@@ -14218,7 +14507,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14218
14507
  d: "M12 23.297C15.258 23.297 17.918 18.48 17.918 12.023 17.918 5.531 15.27 0.715 12 0.715 8.73 0.715 6.082 5.531 6.082 12.023 6.082 18.48 8.742 23.297 12 23.297ZM12 21.867C9.703 21.867 7.652 17.25 7.652 12.023 7.652 6.703 9.703 2.133 12 2.133 14.297 2.133 16.348 6.703 16.348 12.023 16.348 17.25 14.297 21.867 12 21.867ZM12 23.613C12.422 23.613 12.773 23.262 12.773 22.84L12.773 1.266C12.773 0.844 12.422 0.492 12 0.492 11.578 0.492 11.238 0.844 11.238 1.266L11.238 22.84C11.238 23.262 11.578 23.613 12 23.613ZM4.711 19.852C6.281 18.609 8.801 17.941 12 17.941 15.199 17.941 17.719 18.609 19.289 19.852 19.629 20.121 20.074 20.156 20.379 19.863 20.672 19.57 20.695 19.09 20.367 18.797 18.797 17.379 15.609 16.406 12 16.406 8.391 16.406 5.203 17.379 3.633 18.797 3.305 19.09 3.328 19.57 3.621 19.863 3.926 20.156 4.371 20.121 4.711 19.852ZM1.453 12.762L22.781 12.762C23.203 12.762 23.555 12.422 23.555 12 23.555 11.578 23.203 11.227 22.781 11.227L1.453 11.227C1.031 11.227 0.68 11.578 0.68 12 0.68 12.422 1.031 12.762 1.453 12.762ZM12 7.652C15.609 7.652 18.797 6.68 20.367 5.262 20.695 4.957 20.672 4.488 20.379 4.195 20.074 3.902 19.629 3.938 19.289 4.207 17.719 5.438 15.199 6.117 12 6.117 8.801 6.117 6.281 5.438 4.711 4.207 4.371 3.938 3.926 3.902 3.621 4.195 3.328 4.488 3.305 4.957 3.633 5.262 5.203 6.68 8.391 7.652 12 7.652ZM12 23.953C18.598 23.953 23.953 18.598 23.953 12 23.953 5.402 18.598 0.047 12 0.047 5.402 0.047 0.047 5.402 0.047 12 0.047 18.598 5.402 23.953 12 23.953ZM12 22.359C6.281 22.359 1.641 17.719 1.641 12 1.641 6.281 6.281 1.641 12 1.641 17.719 1.641 22.359 6.281 22.359 12 22.359 17.719 17.719 22.359 12 22.359Z"
14219
14508
  }
14220
14509
  ],
14221
- box: [-2.075, -2.05, 28.167, 28.1]
14510
+ box: [-2.075, -2.05, 28.167, 28.1],
14511
+ controlBoxes: { globe: [15, 15, 3] }
14222
14512
  },
14223
14513
  "trash.fill": {
14224
14514
  viewBox: "0 0 24 24",
@@ -14228,7 +14518,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14228
14518
  d: "M8.426 21.486C7.969 21.486 7.676 21.217 7.652 20.771L7.301 7.869C7.289 7.436 7.582 7.154 8.051 7.154 8.484 7.154 8.789 7.424 8.801 7.857L9.176 20.771C9.188 21.205 8.883 21.486 8.426 21.486ZM12 21.486C11.543 21.486 11.227 21.205 11.227 20.771L11.227 7.869C11.227 7.436 11.543 7.154 12 7.154 12.457 7.154 12.785 7.436 12.785 7.869L12.785 20.771C12.785 21.205 12.457 21.486 12 21.486ZM15.586 21.486C15.129 21.486 14.824 21.205 14.836 20.771L15.199 7.869C15.211 7.424 15.516 7.154 15.949 7.154 16.418 7.154 16.711 7.436 16.699 7.869L16.348 20.771C16.324 21.217 16.031 21.486 15.586 21.486ZM6.855 4.307L8.719 4.307 8.719 1.799C8.719 1.131 9.188 0.697 9.891 0.697L14.086 0.697C14.789 0.697 15.258 1.131 15.258 1.799L15.258 4.307 17.121 4.307 17.121 1.682C17.121-0.018 16.02-1.049 14.215-1.049L9.762-1.049C7.957-1.049 6.855-0.018 6.855 1.682ZM1.535 5.244L22.477 5.244C22.957 5.244 23.344 4.834 23.344 4.354 23.344 3.873 22.957 3.475 22.477 3.475L1.535 3.475C1.066 3.475 0.656 3.873 0.656 4.354 0.656 4.846 1.066 5.244 1.535 5.244ZM6.633 25.049L17.379 25.049C19.055 25.049 20.18 23.959 20.262 22.283L21.082 4.998 2.918 4.998 3.75 22.295C3.832 23.971 4.934 25.049 6.633 25.049Z"
14229
14519
  }
14230
14520
  ],
14231
- box: [-1.15, -3.15, 26.3, 30.3]
14521
+ box: [-1.15, -3.15, 26.3, 30.3],
14522
+ controlBoxes: { "trash.fill": [14.333333333333334, 16.333333333333332, 3] }
14232
14523
  },
14233
14524
  checklist: {
14234
14525
  viewBox: "0 0 24 24",
@@ -14238,7 +14529,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14238
14529
  d: "M3.914 23.836C6.668 23.836 8.965 21.539 8.965 18.785 8.965 16.008 6.668 13.723 3.914 13.723 1.148 13.723-1.137 16.02-1.137 18.785-1.137 21.539 1.16 23.836 3.914 23.836ZM3.914 22.125C2.098 22.125 0.574 20.59 0.574 18.785 0.574 16.969 2.109 15.434 3.914 15.434 5.719 15.434 7.254 16.969 7.254 18.785 7.254 20.59 5.719 22.125 3.914 22.125ZM12.527 6.176L24.176 6.176C24.703 6.176 25.137 5.754 25.137 5.227 25.137 4.699 24.703 4.289 24.176 4.289L12.527 4.289C11.988 4.289 11.578 4.699 11.578 5.227 11.578 5.754 11.988 6.176 12.527 6.176ZM12.527 19.723L24.176 19.723C24.703 19.723 25.137 19.313 25.137 18.785 25.137 18.246 24.703 17.836 24.176 17.836L12.527 17.836C11.988 17.836 11.578 18.246 11.578 18.785 11.578 19.313 11.988 19.723 12.527 19.723ZM3.914 10.277C6.668 10.277 8.965 7.969 8.965 5.215 8.965 2.449 6.668 0.164 3.914 0.164 1.148 0.164-1.137 2.449-1.137 5.215-1.137 7.969 1.16 10.277 3.914 10.277ZM3.316 7.934C3.07 7.934 2.906 7.805 2.73 7.605L1.418 6.023C1.313 5.883 1.266 5.754 1.266 5.566 1.266 5.227 1.523 4.957 1.84 4.957 2.063 4.957 2.227 5.051 2.379 5.25L3.293 6.41 5.379 3.059C5.52 2.848 5.695 2.73 5.906 2.73 6.234 2.73 6.516 2.988 6.516 3.281 6.516 3.445 6.469 3.586 6.363 3.762L3.914 7.605C3.785 7.816 3.574 7.934 3.316 7.934Z"
14239
14530
  }
14240
14531
  ],
14241
- box: [-4.15, -1.95, 32.3, 27.9]
14532
+ box: [-4.15, -1.95, 32.3, 27.9],
14533
+ controlBoxes: { checklist: [17.666666666666668, 15, 3] }
14242
14534
  },
14243
14535
  newspaper: {
14244
14536
  viewBox: "0 0 24 24",
@@ -14248,7 +14540,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14248
14540
  d: "M-1.324 21.023C-1.324 23.355-0.164 24.563 2.215 24.563L21.645 24.563C24.105 24.563 25.324 23.355 25.324 20.941L25.324 3.07C25.324 0.656 24.105-0.563 21.645-0.563L7.523-0.563C5.074-0.563 3.844 0.656 3.844 3.07L3.844 8.66 1.043 8.66C-0.445 8.66-1.324 9.469-1.324 10.863ZM0.563 21.023L0.563 11.227C0.563 10.793 0.82 10.547 1.254 10.547L3.844 10.547 3.844 21.023C3.844 21.996 3.129 22.676 2.215 22.676 1.289 22.676 0.563 21.961 0.563 21.023ZM5.332 22.676C5.59 22.172 5.73 21.586 5.73 20.906L5.73 3.176C5.73 1.957 6.387 1.324 7.559 1.324L21.609 1.324C22.781 1.324 23.438 1.957 23.438 3.176L23.438 20.836C23.438 22.055 22.781 22.676 21.609 22.676ZM8.777 6.422L20.414 6.422C20.824 6.422 21.141 6.094 21.141 5.684 21.141 5.285 20.824 4.98 20.414 4.98L8.777 4.98C8.355 4.98 8.039 5.285 8.039 5.684 8.039 6.094 8.355 6.422 8.777 6.422ZM8.777 10.547L20.414 10.547C20.824 10.547 21.141 10.23 21.141 9.832 21.141 9.422 20.824 9.105 20.414 9.105L8.777 9.105C8.355 9.105 8.039 9.422 8.039 9.832 8.039 10.23 8.355 10.547 8.777 10.547ZM9.469 18.902L12.504 18.902C13.395 18.902 13.934 18.363 13.934 17.473L13.934 14.684C13.934 13.781 13.395 13.242 12.504 13.242L9.469 13.242C8.566 13.242 8.027 13.781 8.027 14.684L8.027 17.473C8.027 18.363 8.566 18.902 9.469 18.902ZM16.043 14.684L20.402 14.684C20.824 14.684 21.129 14.379 21.129 13.98 21.129 13.559 20.824 13.242 20.402 13.242L16.043 13.242C15.621 13.242 15.316 13.559 15.316 13.98 15.316 14.379 15.621 14.684 16.043 14.684ZM16.043 18.902L20.402 18.902C20.824 18.902 21.129 18.598 21.129 18.199 21.129 17.789 20.824 17.461 20.402 17.461L16.043 17.461C15.621 17.461 15.316 17.789 15.316 18.199 15.316 18.598 15.621 18.902 16.043 18.902Z"
14249
14541
  }
14250
14542
  ],
14251
- box: [-4.325, -2.675, 32.7, 29.367]
14543
+ box: [-4.325, -2.675, 32.7, 29.367],
14544
+ controlBoxes: { newspaper: [18, 15.666666666666666, 3.3333333333333335] }
14252
14545
  },
14253
14546
  bell: {
14254
14547
  viewBox: "0 0 24 24",
@@ -14258,7 +14551,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14258
14551
  d: "M0.943 18.445C0.943 19.301 1.6 19.863 2.713 19.863L7.658 19.863C7.752 22.125 9.521 24.105 11.994 24.105 14.479 24.105 16.248 22.137 16.342 19.863L21.287 19.863C22.389 19.863 23.057 19.301 23.057 18.445 23.057 17.273 21.861 16.219 20.854 15.176 20.08 14.367 19.869 12.703 19.775 11.355 19.693 6.738 18.498 3.762 15.381 2.637 14.982 1.102 13.729-0.105 11.994-0.105 10.271-0.105 9.006 1.102 8.619 2.637 5.502 3.762 4.307 6.738 4.225 11.355 4.131 12.703 3.92 14.367 3.146 15.176 2.127 16.219 0.943 17.273 0.943 18.445ZM3.217 18.094L3.217 17.953C3.428 17.613 4.131 16.922 4.74 16.242 5.584 15.305 5.982 13.793 6.088 11.508 6.182 6.387 7.705 4.758 9.709 4.207 10.002 4.137 10.166 3.996 10.178 3.691 10.213 2.473 10.916 1.617 11.994 1.617 13.084 1.617 13.775 2.473 13.822 3.691 13.834 3.996 13.986 4.137 14.279 4.207 16.295 4.758 17.818 6.387 17.912 11.508 18.018 13.793 18.416 15.305 19.248 16.242 19.869 16.922 20.561 17.613 20.771 17.953L20.771 18.094ZM9.486 19.863L14.514 19.863C14.42 21.457 13.412 22.453 11.994 22.453 10.588 22.453 9.568 21.457 9.486 19.863Z"
14259
14552
  }
14260
14553
  ],
14261
- box: [-1.575, -2.2, 27.167, 28.4]
14554
+ box: [-1.575, -2.2, 27.167, 28.4],
14555
+ controlBoxes: { bell: [14.666666666666666, 15.333333333333334, 3] }
14262
14556
  },
14263
14557
  "plus.circle": {
14264
14558
  viewBox: "0 0 24 24",
@@ -14268,7 +14562,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14268
14562
  d: "M12 23.953C18.598 23.953 23.953 18.598 23.953 12 23.953 5.402 18.598 0.047 12 0.047 5.402 0.047 0.047 5.402 0.047 12 0.047 18.598 5.402 23.953 12 23.953ZM12 21.961C6.492 21.961 2.039 17.508 2.039 12 2.039 6.492 6.492 2.039 12 2.039 17.508 2.039 21.961 6.492 21.961 12 21.961 17.508 17.508 21.961 12 21.961ZM12.973 16.418L12.973 7.559C12.973 6.961 12.563 6.551 11.977 6.551 11.402 6.551 11.004 6.961 11.004 7.559L11.004 16.418C11.004 17.004 11.402 17.414 11.977 17.414 12.563 17.414 12.973 17.016 12.973 16.418ZM7.559 12.961L16.43 12.961C17.016 12.961 17.426 12.574 17.426 12 17.426 11.414 17.016 11.004 16.43 11.004L7.559 11.004C6.961 11.004 6.563 11.414 6.563 12 6.563 12.574 6.961 12.961 7.559 12.961Z"
14269
14563
  }
14270
14564
  ],
14271
- box: [-2.075, -2.05, 28.167, 28.1]
14565
+ box: [-2.075, -2.05, 28.167, 28.1],
14566
+ controlBoxes: { "plus.circle": [15, 15, 3] }
14272
14567
  },
14273
14568
  "book.closed": {
14274
14569
  viewBox: "0 0 24 24",
@@ -14278,7 +14573,10 @@ var COMMON_SF_SYMBOL_VECTORS = {
14278
14573
  d: "M5.742 24.557L20.918 24.557C21.434 24.557 21.855 24.146 21.855 23.619 21.855 23.209 21.574 22.846 21.199 22.717 19.723 22.131 19.418 20.221 20.871 18.756 21.316 18.311 21.855 17.736 21.855 16.564L21.855 3.123C21.855 0.686 20.648-0.557 18.223-0.557L5.777-0.557C3.352-0.557 2.145 0.674 2.145 3.123L2.145 20.936C2.145 23.35 3.363 24.557 5.742 24.557ZM4.031 17.783L4.031 3.158C4.031 1.986 4.652 1.33 5.859 1.33L18.129 1.33C19.348 1.33 19.969 1.986 19.969 3.158L19.969 16.307C19.969 16.939 19.605 17.303 18.949 17.303L5.941 17.303C5.18 17.303 4.547 17.467 4.031 17.783ZM5.848 22.67C4.664 22.67 4.031 22.037 4.031 20.924 4.031 19.869 4.781 19.189 5.953 19.189L17.977 19.189C18.129 19.189 18.27 19.178 18.387 19.154 17.836 20.373 17.93 21.662 18.551 22.67ZM5.414 18.311L6.949 18.311 6.949 0.873 5.414 0.873Z"
14279
14574
  }
14280
14575
  ],
14281
- box: [-0.875, -2.675, 25.767, 29.367]
14576
+ box: [-0.875, -2.675, 25.767, 29.367],
14577
+ controlBoxes: {
14578
+ "book.closed": [14.333333333333334, 15.666666666666666, 3.3333333333333335]
14579
+ }
14282
14580
  },
14283
14581
  plus: {
14284
14582
  viewBox: "0 0 24 24",
@@ -14288,7 +14586,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14288
14586
  d: "M13.055 20.625L13.055 3.375C13.055 2.813 12.574 2.332 12 2.332 11.426 2.332 10.957 2.813 10.957 3.375L10.957 20.625C10.957 21.188 11.426 21.668 12 21.668 12.574 21.668 13.055 21.188 13.055 20.625ZM3.375 13.043L20.625 13.043C21.188 13.043 21.668 12.574 21.668 12 21.668 11.426 21.188 10.945 20.625 10.945L3.375 10.945C2.813 10.945 2.332 11.426 2.332 12 2.332 12.574 2.813 13.043 3.375 13.043Z"
14289
14587
  }
14290
14588
  ],
14291
- box: [-0.675, 0.225, 25.367, 23.567]
14589
+ box: [-0.675, 0.225, 25.367, 23.567],
14590
+ controlBoxes: { plus: [14, 12.666666666666666, 1.6666666666666667] }
14292
14591
  },
14293
14592
  grid: {
14294
14593
  viewBox: "0 0 24 24",
@@ -14298,7 +14597,8 @@ var COMMON_SF_SYMBOL_VECTORS = {
14298
14597
  d: "M7.676 23.104C8.215 23.104 8.555 22.752 8.555 22.178L8.555 1.834C8.555 1.26 8.215 0.896 7.676 0.896 7.113 0.896 6.785 1.26 6.785 1.834L6.785 22.178C6.785 22.752 7.113 23.104 7.676 23.104ZM16.266 23.104C16.805 23.104 17.145 22.752 17.145 22.178L17.145 1.834C17.145 1.26 16.805 0.896 16.266 0.896 15.703 0.896 15.375 1.26 15.375 1.834L15.375 22.178C15.375 22.752 15.703 23.104 16.266 23.104ZM1.605 17.092L22.395 17.092C22.98 17.092 23.332 16.752 23.332 16.201 23.332 15.65 22.98 15.322 22.395 15.322L1.605 15.322C1.02 15.322 0.668 15.65 0.668 16.201 0.668 16.752 1.02 17.092 1.605 17.092ZM1.605 8.725L22.395 8.725C22.98 8.725 23.332 8.385 23.332 7.846 23.332 7.295 22.98 6.955 22.395 6.955L1.605 6.955C1.02 6.955 0.668 7.295 0.668 7.846 0.668 8.385 1.02 8.725 1.605 8.725Z"
14299
14598
  }
14300
14599
  ],
14301
- box: [-2.35, -1.225, 28.667, 26.467]
14600
+ box: [-2.35, -1.225, 28.667, 26.467],
14601
+ controlBoxes: { grid: [15.666666666666666, 14.333333333333334, 2.3333333333333335] }
14302
14602
  },
14303
14603
  banknote: {
14304
14604
  viewBox: "0 0 24 24",
@@ -14308,7 +14608,10 @@ var COMMON_SF_SYMBOL_VECTORS = {
14308
14608
  d: "M-3.469 20.748C-3.469 21.311-3.094 21.686-2.531 21.686L26.543 21.686C27.105 21.686 27.469 21.311 27.469 20.748L27.469 3.24C27.469 2.678 27.105 2.314 26.543 2.314L-2.531 2.314C-3.094 2.314-3.469 2.678-3.469 3.24ZM-1.582 19.459L-1.582 4.541C-1.582 4.283-1.488 4.201-1.242 4.201L25.242 4.201C25.5 4.201 25.582 4.283 25.582 4.541L25.582 19.459C25.582 19.705 25.5 19.799 25.242 19.799L-1.242 19.799C-1.488 19.799-1.582 19.705-1.582 19.459ZM-0.316 17.842C-0.316 18.287-0.07 18.533 0.363 18.533L23.648 18.533C24.07 18.533 24.328 18.287 24.328 17.842L24.328 6.146C24.328 5.713 24.07 5.455 23.648 5.455L0.363 5.455C-0.07 5.455-0.316 5.713-0.316 6.146ZM0.867 17.08L0.867 6.908C0.867 6.732 0.949 6.639 1.125 6.639L22.875 6.639C23.051 6.639 23.145 6.732 23.145 6.908L23.145 17.08C23.145 17.256 23.051 17.35 22.875 17.35L1.125 17.35C0.949 17.35 0.867 17.256 0.867 17.08ZM11.953 18.533C14.484 18.533 16.5 15.99 16.5 11.982 16.5 7.986 14.484 5.455 11.953 5.455 9.492 5.455 7.512 7.986 7.512 11.982 7.512 15.99 9.492 18.533 11.953 18.533ZM11.953 17.15C10.289 17.15 8.871 15.17 8.871 11.982 8.871 8.807 10.289 6.838 11.953 6.838 13.688 6.838 15.152 8.807 15.152 11.982 15.152 15.17 13.688 17.15 11.953 17.15Z"
14309
14609
  }
14310
14610
  ],
14311
- box: [-6.475, 0.2, 36.933, 23.567]
14611
+ box: [-6.475, 0.2, 36.933, 23.567],
14612
+ controlBoxes: {
14613
+ banknote: [20.333333333333332, 12.666666666666666, 1.6666666666666667]
14614
+ }
14312
14615
  },
14313
14616
  "banknote.fill": {
14314
14617
  viewBox: "0 0 24 24",
@@ -14318,7 +14621,10 @@ var COMMON_SF_SYMBOL_VECTORS = {
14318
14621
  d: "M-3.469 20.748C-3.469 21.311-3.094 21.686-2.531 21.686L26.543 21.686C27.105 21.686 27.469 21.311 27.469 20.748L27.469 3.24C27.469 2.678 27.105 2.314 26.543 2.314L-2.531 2.314C-3.094 2.314-3.469 2.678-3.469 3.24ZM-1.324 18.826L-1.324 5.174C-1.324 4.705-1.055 4.459-0.621 4.459L24.621 4.459C25.066 4.459 25.324 4.705 25.324 5.174L25.324 18.826C25.324 19.283 25.066 19.541 24.621 19.541L-0.621 19.541C-1.055 19.541-1.324 19.283-1.324 18.826ZM-0.105 18.041C-0.105 18.229 0 18.322 0.176 18.322L9.34 18.322C8.098 17.057 7.371 14.818 7.371 11.982 7.371 9.158 8.098 6.932 9.316 5.678L0.176 5.678C0 5.678-0.105 5.771-0.105 5.959ZM8.777 11.982C8.777 15.639 10.043 18.088 11.953 18.088 13.922 18.088 15.246 15.639 15.246 11.982 15.246 8.326 13.922 5.889 11.953 5.889 10.043 5.889 8.777 8.326 8.777 11.982ZM14.637 18.322L23.824 18.322C24 18.322 24.105 18.229 24.105 18.041L24.105 5.959C24.105 5.771 24 5.678 23.824 5.678L14.648 5.678C15.902 6.932 16.641 9.158 16.641 11.982 16.641 14.818 15.891 17.057 14.637 18.322Z"
14319
14622
  }
14320
14623
  ],
14321
- box: [-6.475, 0.2, 36.933, 23.567]
14624
+ box: [-6.475, 0.2, 36.933, 23.567],
14625
+ controlBoxes: {
14626
+ "banknote.fill": [20.333333333333332, 12.666666666666666, 1.6666666666666667]
14627
+ }
14322
14628
  },
14323
14629
  "wallet.pass": {
14324
14630
  viewBox: "0 0 24 24",
@@ -14328,7 +14634,10 @@ var COMMON_SF_SYMBOL_VECTORS = {
14328
14634
  d: "M5.777 24.563L18.223 24.563C20.637 24.563 21.855 23.332 21.855 20.895L21.855 3.117C21.855 0.668 20.648-0.563 18.223-0.563L14.742-0.563C14.344-0.563 14.086-0.281 14.086 0.141 14.086 1.359 13.242 2.215 12 2.215 10.758 2.215 9.902 1.359 9.902 0.141 9.902-0.281 9.645-0.563 9.246-0.563L5.777-0.563C3.352-0.563 2.145 0.668 2.145 3.117L2.145 20.895C2.145 23.332 3.363 24.563 5.777 24.563ZM5.871 22.676C4.652 22.676 4.031 22.02 4.031 20.859L4.031 3.152C4.031 1.98 4.652 1.324 5.871 1.324L9.211 1.324 8.121 0.656C8.332 2.707 9.855 4.043 12 4.043 14.145 4.043 15.668 2.707 15.891 0.656L14.789 1.324 18.129 1.324C19.348 1.324 19.969 1.98 19.969 3.152L19.969 20.859C19.969 22.02 19.348 22.676 18.129 22.676ZM7.559 8.168L16.453 8.168C16.863 8.168 17.168 7.852 17.168 7.43 17.168 7.031 16.863 6.715 16.453 6.715L7.559 6.715C7.137 6.715 6.832 7.031 6.832 7.43 6.832 7.852 7.137 8.168 7.559 8.168ZM7.559 12.328L11.766 12.328C12.188 12.328 12.492 12.012 12.492 11.613 12.492 11.203 12.188 10.887 11.766 10.887L7.559 10.887C7.137 10.887 6.832 11.203 6.832 11.613 6.832 12.012 7.137 12.328 7.559 12.328Z"
14329
14635
  }
14330
14636
  ],
14331
- box: [-0.875, -2.675, 25.767, 29.367]
14637
+ box: [-0.875, -2.675, 25.767, 29.367],
14638
+ controlBoxes: {
14639
+ "wallet.pass": [14.333333333333334, 15.666666666666666, 3.3333333333333335]
14640
+ }
14332
14641
  },
14333
14642
  "chevron.backward": {
14334
14643
  viewBox: "0 0 24 24",
@@ -14338,7 +14647,11 @@ var COMMON_SF_SYMBOL_VECTORS = {
14338
14647
  d: "M6.27 12C6.27 12.293 6.375 12.551 6.598 12.773L15.891 21.855C16.09 22.066 16.348 22.172 16.652 22.172 17.262 22.172 17.73 21.715 17.73 21.105 17.73 20.801 17.602 20.543 17.414 20.344L8.883 12 17.414 3.656C17.602 3.457 17.73 3.188 17.73 2.895 17.73 2.285 17.262 1.828 16.652 1.828 16.348 1.828 16.09 1.934 15.891 2.133L6.598 11.227C6.375 11.438 6.27 11.707 6.27 12Z"
14339
14648
  }
14340
14649
  ],
14341
- box: [4.75, -0.275, 17.5, 24.567]
14650
+ box: [4.75, -0.275, 17.5, 24.567],
14651
+ controlBoxes: {
14652
+ "chevron.backward": [9.333333333333334, 13.333333333333334, 2],
14653
+ "chevron.left": [9.333333333333334, 13.333333333333334, 2]
14654
+ }
14342
14655
  }
14343
14656
  };
14344
14657
 
@@ -14352,11 +14665,11 @@ var symbolPromises2 = /* @__PURE__ */ new Map();
14352
14665
  var failedVectors2 = /* @__PURE__ */ new Set();
14353
14666
  var loadedPalettes = /* @__PURE__ */ new Map();
14354
14667
  var palettePromises = /* @__PURE__ */ new Map();
14355
- var listeners6 = /* @__PURE__ */ new Map();
14668
+ var listeners7 = /* @__PURE__ */ new Map();
14356
14669
  var catalogBaseUrl = null;
14357
14670
  var onCatalogRegister = null;
14358
14671
  function isRecord(value) {
14359
- return typeof value === "object" && value !== null;
14672
+ return typeof value === "object" && value !== null && !Array.isArray(value);
14360
14673
  }
14361
14674
  function isVectorLayer(value) {
14362
14675
  if (!isRecord(value) || typeof value.d !== "string") return false;
@@ -14368,8 +14681,24 @@ function parseVector(value) {
14368
14681
  }
14369
14682
  const layers = value.layers.filter(isVectorLayer);
14370
14683
  if (layers.length === 0) return null;
14684
+ let controlBoxes;
14685
+ if (value.controlBoxes !== void 0) {
14686
+ if (!isRecord(value.controlBoxes)) return null;
14687
+ controlBoxes = {};
14688
+ for (const [name, metrics] of Object.entries(value.controlBoxes)) {
14689
+ if (!Array.isArray(metrics) || metrics.length !== 3 || !metrics.every((item) => typeof item === "number" && Number.isFinite(item)) || metrics[0] <= 0 || metrics[1] <= 0)
14690
+ return null;
14691
+ controlBoxes[name] = [metrics[0], metrics[1], metrics[2]];
14692
+ }
14693
+ }
14371
14694
  const box = value.box;
14372
- return Array.isArray(box) && box.length === 4 && box.every((item) => typeof item === "number") ? { viewBox: "0 0 24 24", advance: value.advance, box: [box[0], box[1], box[2], box[3]], layers } : { viewBox: "0 0 24 24", advance: value.advance, layers };
14695
+ return Array.isArray(box) && box.length === 4 && box.every((item) => typeof item === "number") ? {
14696
+ viewBox: "0 0 24 24",
14697
+ advance: value.advance,
14698
+ box: [box[0], box[1], box[2], box[3]],
14699
+ controlBoxes,
14700
+ layers
14701
+ } : { viewBox: "0 0 24 24", advance: value.advance, controlBoxes, layers };
14373
14702
  }
14374
14703
  function nameBucket(name) {
14375
14704
  let hash = 2166136261;
@@ -14452,16 +14781,16 @@ function isSfSymbolCatalogConfigured() {
14452
14781
  return catalogBaseUrl !== null;
14453
14782
  }
14454
14783
  function subscribeSfSymbolVector(name, listener) {
14455
- const nameListeners = listeners6.get(name) ?? /* @__PURE__ */ new Set();
14784
+ const nameListeners = listeners7.get(name) ?? /* @__PURE__ */ new Set();
14456
14785
  nameListeners.add(listener);
14457
- listeners6.set(name, nameListeners);
14786
+ listeners7.set(name, nameListeners);
14458
14787
  return () => {
14459
14788
  nameListeners.delete(listener);
14460
- if (nameListeners.size === 0) listeners6.delete(name);
14789
+ if (nameListeners.size === 0) listeners7.delete(name);
14461
14790
  };
14462
14791
  }
14463
14792
  function notifyLoaded(name, loaded) {
14464
- for (const listener of listeners6.get(name) ?? []) listener();
14793
+ for (const listener of listeners7.get(name) ?? []) listener();
14465
14794
  if (loaded) onCatalogRegister?.();
14466
14795
  }
14467
14796
  function requestSfSymbolVector(name) {
@@ -15291,6 +15620,7 @@ onDeviceSpecChange(_updateExports);
15291
15620
  var DEFAULT_AUX_SHELL_SCENE = {
15292
15621
  state: "home",
15293
15622
  activeAppId: null,
15623
+ systemAlertAppId: null,
15294
15624
  prewarmAppId: null,
15295
15625
  showSwitcher: false,
15296
15626
  isLocked: false,
@@ -15327,6 +15657,7 @@ var DEFAULT_AUX_SHELL_SCENE = {
15327
15657
  recentApps: []
15328
15658
  };
15329
15659
  var currentScene = DEFAULT_AUX_SHELL_SCENE;
15660
+ var systemAlertAppId = createSignal(null);
15330
15661
  function readAuxShellScene() {
15331
15662
  return currentScene;
15332
15663
  }
@@ -15440,7 +15771,7 @@ var pendingActionSheets = /* @__PURE__ */ new Map();
15440
15771
  var pendingAndroidPermissions = /* @__PURE__ */ new Map();
15441
15772
  var pendingShareSheets = /* @__PURE__ */ new Map();
15442
15773
  var nextRequestId = 1;
15443
- function showAlert(title, message, buttons, onDismiss, options, prompt, traitScheme) {
15774
+ function showAlert(title, message, buttons, onDismiss, options, prompt, traitScheme, systemPresentation) {
15444
15775
  const config = {
15445
15776
  title,
15446
15777
  message,
@@ -15462,7 +15793,8 @@ function showAlert(title, message, buttons, onDismiss, options, prompt, traitSch
15462
15793
  })),
15463
15794
  prompt
15464
15795
  };
15465
- if (!postTenantNativeUIRequest({ kind: "alert.show", requestId, spec, traitScheme })) {
15796
+ const request = systemPresentation ? { kind: "systemAlert.show", requestId, spec, ...systemPresentation } : { kind: "alert.show", requestId, spec, traitScheme };
15797
+ if (!postTenantNativeUIRequest(request)) {
15466
15798
  handleAlertResult(requestId, null);
15467
15799
  }
15468
15800
  return requestId;
@@ -15724,15 +16056,6 @@ function createToastAndroidNativeModule(toastAndroid) {
15724
16056
  };
15725
16057
  }
15726
16058
 
15727
- // ../peach-engine/src/react-native/source-code-native-module.ts
15728
- var SourceCodeNativeModule = {
15729
- getConstants: () => {
15730
- const g = globalThis;
15731
- const scriptURL = g.__sootsim_bundle_url || (g.__sootsim_bundle_origin ? `${g.__sootsim_bundle_origin}/index.bundle` : "http://localhost:8081/index.bundle");
15732
- return { scriptURL };
15733
- }
15734
- };
15735
-
15736
16059
  // ../peach-engine/src/react-native/AppState.ts
15737
16060
  var currentState = "active";
15738
16061
  var AppStateNativeModule = {
@@ -15776,14 +16099,17 @@ function configureNextLayoutAnimation(config, onComplete, onError) {
15776
16099
  })
15777
16100
  );
15778
16101
  let completionHasRun = false;
15779
- let raceWithAnimationId = null;
16102
+ let cancelCompletion = null;
15780
16103
  const complete = () => {
15781
16104
  if (completionHasRun) return;
15782
16105
  completionHasRun = true;
15783
- if (raceWithAnimationId !== null) clearTimeout(raceWithAnimationId);
16106
+ cancelCompletion?.();
15784
16107
  onComplete?.();
15785
16108
  };
15786
- raceWithAnimationId = setTimeout(complete, duration + 17);
16109
+ cancelCompletion = scheduleAnimationDeadline(
16110
+ getAnimationTime() + duration + 17,
16111
+ complete
16112
+ );
15787
16113
  setPendingLayoutAnimation(config);
15788
16114
  }
15789
16115
 
@@ -16054,6 +16380,15 @@ var Settings = {
16054
16380
  }
16055
16381
  };
16056
16382
 
16383
+ // ../peach-engine/src/react-native/source-code-native-module.ts
16384
+ var SourceCodeNativeModule = {
16385
+ getConstants: () => {
16386
+ const g = globalThis;
16387
+ const scriptURL = g.__sootsim_bundle_url || (g.__sootsim_bundle_origin ? `${g.__sootsim_bundle_origin}/index.bundle` : "http://localhost:8081/index.bundle");
16388
+ return { scriptURL };
16389
+ }
16390
+ };
16391
+
16057
16392
  // ../peach-engine/src/components/Text.tsx
16058
16393
  var import_react8 = require("react");
16059
16394
  function Text(props) {
@@ -17142,8 +17477,9 @@ function AndroidRipple({
17142
17477
  const progressAv = (0, import_react15.useRef)(new AnimatedValue(0)).current;
17143
17478
  const opacityAv = (0, import_react15.useRef)(new AnimatedValue(0)).current;
17144
17479
  const completedRef = (0, import_react15.useRef)(false);
17145
- const enteredAtRef = (0, import_react15.useRef)(performance.now());
17480
+ const enteredAtRef = (0, import_react15.useRef)(getAnimationTime());
17146
17481
  (0, import_react15.useEffect)(() => {
17482
+ enteredAtRef.current = getAnimationTime();
17147
17483
  const expand = timing(progressAv, {
17148
17484
  toValue: 1,
17149
17485
  duration: RIPPLE_EXPAND_MS,
@@ -17164,25 +17500,24 @@ function AndroidRipple({
17164
17500
  (0, import_react15.useEffect)(() => {
17165
17501
  if (!released) return;
17166
17502
  let fade = null;
17167
- const remainingEnterMs = Math.max(
17168
- 0,
17169
- RIPPLE_EXPAND_MS - (performance.now() - enteredAtRef.current)
17503
+ const cancelFadeDeadline = scheduleAnimationDeadline(
17504
+ enteredAtRef.current + RIPPLE_EXPAND_MS,
17505
+ () => {
17506
+ fade = timing(opacityAv, {
17507
+ toValue: 0,
17508
+ duration: RIPPLE_FADE_MS,
17509
+ easing: Easing.linear
17510
+ });
17511
+ fade.start(() => {
17512
+ if (!completedRef.current) {
17513
+ completedRef.current = true;
17514
+ onComplete();
17515
+ }
17516
+ });
17517
+ }
17170
17518
  );
17171
- const timeout = setTimeout(() => {
17172
- fade = timing(opacityAv, {
17173
- toValue: 0,
17174
- duration: RIPPLE_FADE_MS,
17175
- easing: Easing.linear
17176
- });
17177
- fade.start(() => {
17178
- if (!completedRef.current) {
17179
- completedRef.current = true;
17180
- onComplete();
17181
- }
17182
- });
17183
- }, remainingEnterMs);
17184
17519
  return () => {
17185
- clearTimeout(timeout);
17520
+ cancelFadeDeadline();
17186
17521
  fade?.stop();
17187
17522
  };
17188
17523
  }, [released, opacityAv, onComplete]);
@@ -17335,10 +17670,7 @@ function PressableInner(props, ref) {
17335
17670
  onLongPress,
17336
17671
  onInteractionFinished,
17337
17672
  minPressDuration,
17338
- onPress: props.testID === "signInButton" ? ((e) => {
17339
- console.log("[probe-press] signInButton onPress fired");
17340
- onPress?.(e);
17341
- }) : onPress,
17673
+ onPress,
17342
17674
  onPressIn(event) {
17343
17675
  if (shouldUpdatePressed) {
17344
17676
  setPressed(true);
@@ -17377,7 +17709,6 @@ function PressableInner(props, ref) {
17377
17709
  onPressMove,
17378
17710
  onPressOut,
17379
17711
  pressRetentionOffset,
17380
- props.testID,
17381
17712
  releaseRipple,
17382
17713
  shouldUpdatePressed,
17383
17714
  startRipple,
@@ -17432,23 +17763,37 @@ Pressable.displayName = "Pressable";
17432
17763
  var import_react17 = require("react");
17433
17764
 
17434
17765
  // ../peach-engine/src/components/touchable-core.ts
17435
- function buildTouchableViewProps(props, ref, wrapped) {
17766
+ function useTouchablePressability(props, wrapped) {
17767
+ return usePressability_default({
17768
+ cancelable: !props.rejectResponderTermination,
17769
+ disabled: props.disabled,
17770
+ hitSlop: props.hitSlop,
17771
+ delayLongPress: props.delayLongPress,
17772
+ delayPressIn: props.delayPressIn,
17773
+ delayPressOut: props.delayPressOut,
17774
+ minPressDuration: 0,
17775
+ pressRectOffset: props.pressRetentionOffset,
17776
+ onLongPress: props.onLongPress,
17777
+ onPress: wrapped.onPress ?? props.onPress,
17778
+ onPressIn: wrapped.onPressIn,
17779
+ onPressOut: wrapped.onPressOut
17780
+ });
17781
+ }
17782
+ function buildTouchableViewProps(props, ref) {
17436
17783
  const {
17437
17784
  // destructured only to transform or drop them; `rest` carries everything
17438
- // else (delays, hitSlop, onLayout, focusable, TV focus props, a11y props,
17439
- // etc.) straight through to the underlying view.
17785
+ // else (hitSlop, onLayout, focusable, TV focus props, a11y props, etc.)
17786
+ // straight through to the underlying view.
17440
17787
  children: _children,
17441
17788
  disabled = false,
17442
- onPress,
17443
- onPressIn: _userPressIn,
17444
- onPressOut: _userPressOut,
17445
- onLongPress,
17789
+ onPress: _onPress,
17790
+ onPressIn: _onPressIn,
17791
+ onPressOut: _onPressOut,
17792
+ onLongPress: _onLongPress,
17446
17793
  accessibilityRole,
17447
17794
  accessibilityState,
17448
17795
  id,
17449
17796
  nativeID,
17450
- // RN-specific knobs that sootsim doesn't wire — keep the names so
17451
- // component authors don't see a typed regression, but don't forward.
17452
17797
  rejectResponderTermination: _rejectResponderTermination,
17453
17798
  touchSoundDisabled: _touchSoundDisabled,
17454
17799
  ...rest
@@ -17456,10 +17801,6 @@ function buildTouchableViewProps(props, ref, wrapped) {
17456
17801
  return {
17457
17802
  ...rest,
17458
17803
  ref,
17459
- onPress: disabled ? void 0 : onPress,
17460
- onPressIn: disabled ? void 0 : wrapped.onPressIn,
17461
- onPressOut: disabled ? void 0 : wrapped.onPressOut,
17462
- onLongPress: disabled ? void 0 : onLongPress,
17463
17804
  id,
17464
17805
  nativeID: nativeID ?? id,
17465
17806
  accessibilityRole: accessibilityRole ?? "button",
@@ -17540,11 +17881,16 @@ function TouchableOpacityInner(props, ref) {
17540
17881
  animationRef.current?.stop();
17541
17882
  };
17542
17883
  }, []);
17543
- const viewProps = buildTouchableViewProps(props, ref, {
17884
+ const viewProps = buildTouchableViewProps(props, ref);
17885
+ const eventHandlers = useTouchablePressability(props, {
17544
17886
  onPressIn: handlePressIn,
17545
17887
  onPressOut: handlePressOut
17546
17888
  });
17547
- return (0, import_react17.createElement)("sootsim-view", { ...viewProps, style: animatedStyle }, children);
17889
+ return (0, import_react17.createElement)(
17890
+ "sootsim-view",
17891
+ { ...viewProps, ...eventHandlers, style: animatedStyle },
17892
+ children
17893
+ );
17548
17894
  }
17549
17895
  var TouchableOpacity = (0, import_react17.forwardRef)(TouchableOpacityInner);
17550
17896
  TouchableOpacity.displayName = "TouchableOpacity";
@@ -20000,6 +20346,11 @@ function resolveSfSymbolIconName(name) {
20000
20346
  }
20001
20347
  function makeRoot(size, name, children, vector, box = "square") {
20002
20348
  const imageBox = box === "image" ? vector?.box : void 0;
20349
+ const controlBox = box === "footnote" ? vector?.controlBoxes?.[name] : void 0;
20350
+ const footnote = IOS_UIKIT_TEXT_METRICS.l.footnote;
20351
+ if (box === "footnote" && (!controlBox || size !== footnote.fontSize)) {
20352
+ throw new Error(`SF Symbol footnote metrics unavailable: ${name} at ${size}pt`);
20353
+ }
20003
20354
  const [boxX, boxY, boxWidth, boxHeight] = imageBox ?? [
20004
20355
  12 - (vector && box !== "square" ? vector.advance : 24) / 2,
20005
20356
  0,
@@ -20008,20 +20359,26 @@ function makeRoot(size, name, children, vector, box = "square") {
20008
20359
  ];
20009
20360
  const scale = PixelRatio.get();
20010
20361
  const snap = (points) => imageBox ? Math.ceil(points * scale - 1e-6) / scale : points;
20011
- const width = snap(boxWidth * size / 24);
20012
- const height = snap(boxHeight * size / 24);
20362
+ const width = controlBox ? controlBox[0] : snap(boxWidth * size / 24);
20363
+ const height = controlBox ? controlBox[1] : snap(boxHeight * size / 24);
20013
20364
  const advance = width * 24 / size;
20014
20365
  const tall = height * 24 / size;
20015
- const left = boxX + boxWidth / 2 - advance / 2;
20016
- const top = boxY + boxHeight / 2 - tall / 2;
20366
+ const left = controlBox ? 12 - advance / 2 : boxX + boxWidth / 2 - advance / 2;
20367
+ const top = controlBox ? 12 - tall / 2 : boxY + boxHeight / 2 - tall / 2;
20368
+ const baselineShift = controlBox ? Math.round(footnote.ascent * scale) / scale - Math.ceil(footnote.lineHeight * scale) / scale / 2 - (height / 2 - controlBox[2]) : 0;
20017
20369
  return (0, import_react20.createElement)(
20018
20370
  "svg-root",
20019
20371
  {
20020
20372
  width,
20021
20373
  height,
20022
20374
  viewBox: `${left} ${top} ${advance} ${tall}`,
20023
- style: { width, height },
20024
- sfSymbolName: name
20375
+ style: {
20376
+ width,
20377
+ height,
20378
+ ...controlBox ? { transform: [{ translateY: baselineShift }] } : {}
20379
+ },
20380
+ sfSymbolName: name,
20381
+ ...controlBox ? { sfSymbolControlImage: true } : {}
20025
20382
  },
20026
20383
  ...children
20027
20384
  );
@@ -20180,34 +20537,6 @@ function SfSymbolIcon(props) {
20180
20537
  );
20181
20538
  }
20182
20539
 
20183
- // ../peach-engine/src/platform/adapter.ts
20184
- var IOS_ADAPTER = Object.freeze({
20185
- id: "ios",
20186
- displayName: "iOS",
20187
- isIOS: true,
20188
- isAndroid: false,
20189
- select: (registry) => registry.ios
20190
- });
20191
- var ANDROID_ADAPTER = Object.freeze({
20192
- id: "android",
20193
- displayName: "Android",
20194
- isIOS: false,
20195
- isAndroid: true,
20196
- select: (registry) => registry.android
20197
- });
20198
- var RUNTIME_PLATFORM_ADAPTERS = Object.freeze({
20199
- ios: IOS_ADAPTER,
20200
- android: ANDROID_ADAPTER
20201
- });
20202
- function getRuntimePlatformAdapter(platform) {
20203
- return RUNTIME_PLATFORM_ADAPTERS[platform];
20204
- }
20205
-
20206
- // ../peach-engine/src/platform/current-platform.ts
20207
- function currentRuntimePlatform() {
20208
- return Platform.OS;
20209
- }
20210
-
20211
20540
  // ../peach-engine/src/components/text-input-submit-behavior.ts
20212
20541
  function resolveTextInputSubmitBehavior(props) {
20213
20542
  const multiline = props?.multiline === true;
@@ -20922,8 +21251,24 @@ var TextInput = (0, import_react21.forwardRef)(function TextInput2(props, ref) {
20922
21251
  placeholderTextColor = DEFAULT_TEXT_INPUT_PLACEHOLDER_COLOR,
20923
21252
  onContentSizeChange,
20924
21253
  clearButtonMode = "never",
21254
+ onPress,
21255
+ onPressIn,
21256
+ onPressOut,
21257
+ rejectResponderTermination = true,
20925
21258
  ...rest
20926
21259
  } = props;
21260
+ const isAndroid = getRuntimePlatformAdapter(currentRuntimePlatform()).isAndroid;
21261
+ const pressabilityConfig = (0, import_react21.useMemo)(
21262
+ () => ({
21263
+ cancelable: isAndroid ? null : !rejectResponderTermination,
21264
+ hitSlop: rest.hitSlop,
21265
+ onPress,
21266
+ onPressIn,
21267
+ onPressOut
21268
+ }),
21269
+ [isAndroid, onPress, onPressIn, onPressOut, rejectResponderTermination, rest.hitSlop]
21270
+ );
21271
+ const pressHandlers = usePressability_default(pressabilityConfig) ?? {};
20927
21272
  const nativeText = typeof text === "string" ? text : void 0;
20928
21273
  const controlledValue = value;
20929
21274
  const hostRef = (0, import_react21.useRef)(null);
@@ -20940,10 +21285,10 @@ var TextInput = (0, import_react21.forwardRef)(function TextInput2(props, ref) {
20940
21285
  const showPlaceholder = !rawDisplayText && placeholder;
20941
21286
  const isMultiline = rest.multiline === true;
20942
21287
  const [editing, setEditing] = (0, import_react21.useState)(false);
20943
- const showClearButton = !isMultiline && rawDisplayText.length > 0 && !getRuntimePlatformAdapter(currentRuntimePlatform()).isAndroid && (clearButtonMode === "always" || clearButtonMode === "while-editing" && editing || clearButtonMode === "unless-editing" && !editing);
21288
+ const showClearButton = !isMultiline && rawDisplayText.length > 0 && !isAndroid && (clearButtonMode === "always" || clearButtonMode === "while-editing" && editing || clearButtonMode === "unless-editing" && !editing);
20944
21289
  const justifyContent = isMultiline ? "flex-start" : "center";
20945
21290
  const scrollEnabledProp = rest.scrollEnabled;
20946
- const scrollsInternally = isMultiline ? scrollEnabledProp !== false : true;
21291
+ const clipsToBounds = !isMultiline || scrollEnabledProp !== false || !isAndroid;
20947
21292
  (0, import_react21.useEffect)(() => {
20948
21293
  if (isControlled) {
20949
21294
  lastControlledValueRef.current = controlledValue;
@@ -21290,14 +21635,13 @@ var TextInput = (0, import_react21.forwardRef)(function TextInput2(props, ref) {
21290
21635
  // `flexDirection: 'row'` (e.g. Mattermost's FloatingTextInput).
21291
21636
  flexDirection: "column",
21292
21637
  justifyContent,
21293
- // UITextField/UITextView always clip to their frame natively. without
21294
- // this, a long single-line value or a tall multiline value paints
21295
- // outside the input border and the caret floats in no-mans-land.
21296
- // scrollEnabled=false multiline grows to fit content (no overflow),
21297
- // so the clip becomes a no-op rather than a behavior change.
21298
- ...scrollsInternally ? { overflow: "hidden" } : null
21638
+ // without this, a long single-line value or a tall multiline value
21639
+ // paints outside the input border and the caret floats in
21640
+ // no-mans-land.
21641
+ ...clipsToBounds ? { overflow: "hidden" } : null
21299
21642
  },
21300
21643
  ...rest,
21644
+ ...pressHandlers,
21301
21645
  ...onContentSizeChange ? { onLayout: handleHostLayout } : null,
21302
21646
  onFocus: handleFocus,
21303
21647
  onBlur: handleBlur,
@@ -21395,8 +21739,8 @@ var import_react23 = require("react");
21395
21739
 
21396
21740
  // ../peach-engine/src/vendor/react-native-lists/deepDiffer.ts
21397
21741
  var logListeners;
21398
- function unstable_setLogListeners(listeners7) {
21399
- logListeners = listeners7 ?? void 0;
21742
+ function unstable_setLogListeners(listeners8) {
21743
+ logListeners = listeners8 ?? void 0;
21400
21744
  }
21401
21745
  function deepDiffer(one, two, maxDepthOrOptions = -1, maybeOptions) {
21402
21746
  const options = typeof maxDepthOrOptions === "number" ? maybeOptions : maxDepthOrOptions;
@@ -23100,7 +23444,6 @@ var {
23100
23444
  thumbMargin: THUMB_MARGIN
23101
23445
  } = IOS_SWITCH_METRICS;
23102
23446
  var ON_POS = TRACK_WIDTH - IOS_THUMB_WIDTH - THUMB_MARGIN;
23103
- var LIFT_MIN_MS = 14 * 1e3 / 60;
23104
23447
  var THUMB_LAYER = {
23105
23448
  position: "absolute",
23106
23449
  left: 0,
@@ -23561,6 +23904,7 @@ function TouchableHighlightInner(props, ref) {
23561
23904
  onHideUnderlay,
23562
23905
  onPressIn,
23563
23906
  onPressOut,
23907
+ onPress,
23564
23908
  delayPressOut,
23565
23909
  style,
23566
23910
  children
@@ -23619,31 +23963,40 @@ function TouchableHighlightInner(props, ref) {
23619
23963
  );
23620
23964
  const handlePressOut = (0, import_react36.useCallback)(
23621
23965
  (e) => {
23622
- const delay = typeof delayPressOut === "number" ? delayPressOut : 0;
23966
+ if (hideTimerRef.current === null) hide();
23967
+ onPressOut?.(e);
23968
+ },
23969
+ [hide, onPressOut]
23970
+ );
23971
+ const handlePress = (0, import_react36.useCallback)(
23972
+ (e) => {
23623
23973
  clearHideTimer();
23624
- if (delay > 0) {
23625
- hideTimerRef.current = setTimeout(() => {
23626
- hideTimerRef.current = null;
23627
- hide();
23628
- }, delay);
23629
- } else {
23974
+ show();
23975
+ hideTimerRef.current = setTimeout(() => {
23976
+ hideTimerRef.current = null;
23630
23977
  hide();
23631
- }
23632
- onPressOut?.(e);
23978
+ }, delayPressOut ?? 0);
23979
+ onPress?.(e);
23633
23980
  },
23634
- [clearHideTimer, delayPressOut, hide, onPressOut]
23981
+ [clearHideTimer, delayPressOut, hide, onPress, show]
23635
23982
  );
23636
23983
  (0, import_react36.useEffect)(() => {
23637
23984
  return () => clearHideTimer();
23638
23985
  }, [clearHideTimer]);
23639
- const viewProps = buildTouchableViewProps(props, ref, {
23986
+ const viewProps = buildTouchableViewProps(props, ref);
23987
+ const eventHandlers = useTouchablePressability(props, {
23988
+ onPress: handlePress,
23640
23989
  onPressIn: handlePressIn,
23641
23990
  onPressOut: handlePressOut
23642
23991
  });
23643
23992
  const renderedChild = (0, import_react36.isValidElement)(child) ? (0, import_react36.cloneElement)(child, {
23644
23993
  style: [child.props?.style, childOpacityOverlay]
23645
23994
  }) : child;
23646
- return (0, import_react36.createElement)("sootsim-view", { ...viewProps, style: outerStyle }, renderedChild);
23995
+ return (0, import_react36.createElement)(
23996
+ "sootsim-view",
23997
+ { ...viewProps, ...eventHandlers, style: outerStyle },
23998
+ renderedChild
23999
+ );
23647
24000
  }
23648
24001
  var TouchableHighlight = (0, import_react36.forwardRef)(TouchableHighlightInner);
23649
24002
  TouchableHighlight.displayName = "TouchableHighlight";
@@ -23852,6 +24205,16 @@ var VirtualRow = createVirtualCollectionView(
23852
24205
  VirtualRowGenerator
23853
24206
  );
23854
24207
 
24208
+ // ../peach-compat/src/stubs/rn-libraries/AssetRegistry.ts
24209
+ function createHostAssetRegistry() {
24210
+ const assets = [];
24211
+ return {
24212
+ registerAsset: (asset) => assets.push(asset),
24213
+ getAssetByID: (assetId) => assets[assetId - 1]
24214
+ };
24215
+ }
24216
+ var activeRegistry = createHostAssetRegistry();
24217
+
23855
24218
  // ../peach-engine/src/react-native/RefreshControl.ts
23856
24219
  var import_react42 = require("react");
23857
24220
 
@@ -25035,7 +25398,7 @@ function scalarAnimation(kind, value, config) {
25035
25398
  var nextScalarDriverId = 1;
25036
25399
  var activeScalarDriverIds = /* @__PURE__ */ new Set();
25037
25400
  function createScalarDriver(kind, value, config) {
25038
- let rafId = null;
25401
+ let rafId2 = null;
25039
25402
  let workerBridge = null;
25040
25403
  let done = false;
25041
25404
  let onEnd = null;
@@ -25044,7 +25407,7 @@ function createScalarDriver(kind, value, config) {
25044
25407
  const finish = (result, finalValue) => {
25045
25408
  if (done) return;
25046
25409
  done = true;
25047
- rafId = null;
25410
+ rafId2 = null;
25048
25411
  workerBridge = null;
25049
25412
  if (scalarDriverId !== null) activeScalarDriverIds.delete(scalarDriverId);
25050
25413
  scalarDriverId = null;
@@ -25099,9 +25462,9 @@ function createScalarDriver(kind, value, config) {
25099
25462
  const progress = Math.min((timestamp - startedAt3) / duration, 1);
25100
25463
  update(fromValue + easing(progress) * (config.toValue - fromValue));
25101
25464
  if (progress === 1) finish({ finished: true });
25102
- else rafId = requestAnimationFrame(tick2);
25465
+ else rafId2 = requestAnimationFrame(tick2);
25103
25466
  };
25104
- rafId = requestAnimationFrame(tick2);
25467
+ rafId2 = requestAnimationFrame(tick2);
25105
25468
  return;
25106
25469
  }
25107
25470
  if (kind === "spring") {
@@ -25137,10 +25500,10 @@ function createScalarDriver(kind, value, config) {
25137
25500
  update(config.toValue);
25138
25501
  finish({ finished: true });
25139
25502
  } else {
25140
- rafId = requestAnimationFrame(tick2);
25503
+ rafId2 = requestAnimationFrame(tick2);
25141
25504
  }
25142
25505
  };
25143
- rafId = requestAnimationFrame(tick2);
25506
+ rafId2 = requestAnimationFrame(tick2);
25144
25507
  return;
25145
25508
  }
25146
25509
  const deceleration = config.deceleration ?? 0.998;
@@ -25170,10 +25533,10 @@ function createScalarDriver(kind, value, config) {
25170
25533
  if (Math.abs(lastValue - next) < 0.1) finish({ finished: true });
25171
25534
  else {
25172
25535
  lastValue = next;
25173
- rafId = requestAnimationFrame(tick);
25536
+ rafId2 = requestAnimationFrame(tick);
25174
25537
  }
25175
25538
  };
25176
- rafId = requestAnimationFrame(tick);
25539
+ rafId2 = requestAnimationFrame(tick);
25177
25540
  };
25178
25541
  const delay = config.delay ?? 0;
25179
25542
  if (delay <= 0) {
@@ -25184,13 +25547,13 @@ function createScalarDriver(kind, value, config) {
25184
25547
  const waitForDelay = (timestamp) => {
25185
25548
  if (done) return;
25186
25549
  if (timestamp - startedAt >= delay) start();
25187
- else rafId = requestAnimationFrame(waitForDelay);
25550
+ else rafId2 = requestAnimationFrame(waitForDelay);
25188
25551
  };
25189
- rafId = requestAnimationFrame(waitForDelay);
25552
+ rafId2 = requestAnimationFrame(waitForDelay);
25190
25553
  },
25191
25554
  stop(onStopped) {
25192
25555
  if (done) return;
25193
- if (rafId !== null) cancelAnimationFrame(rafId);
25556
+ if (rafId2 !== null) cancelAnimationFrame(rafId2);
25194
25557
  if (workerBridge) {
25195
25558
  afterStop = onStopped ?? null;
25196
25559
  stopNative();
@@ -25560,7 +25923,7 @@ function canOpenTenantUrl(url) {
25560
25923
  }
25561
25924
  function openSettings() {
25562
25925
  const open = (0, engine_config_exports.getOptionalEngineConfig)()?.nativePermissions?.openSettings;
25563
- return open ? open() : Promise.reject(
25926
+ return open ? open({ kind: "app" }) : Promise.reject(
25564
25927
  new Error(
25565
25928
  "[sootsim] app settings are unavailable before the native bridge installs"
25566
25929
  )
@@ -25850,7 +26213,7 @@ var NativeEventEmitter = class {
25850
26213
  if (count > 0) this._nativeModule?.removeListeners?.(count);
25851
26214
  } else {
25852
26215
  const count = [..._deviceEventListeners.values()].reduce(
25853
- (total, listeners7) => total + listeners7.size,
26216
+ (total, listeners8) => total + listeners8.size,
25854
26217
  0
25855
26218
  );
25856
26219
  for (const registrations of Array.from(_nativeEventRegistrations.values())) {
@@ -25869,9 +26232,9 @@ var NativeEventEmitter = class {
25869
26232
  return _deviceEventListeners.get(eventType)?.size ?? 0;
25870
26233
  }
25871
26234
  emit(eventType, ...args) {
25872
- const listeners7 = _deviceEventListeners.get(eventType);
25873
- if (!listeners7) return;
25874
- for (const listener of Array.from(listeners7)) listener(...args);
26235
+ const listeners8 = _deviceEventListeners.get(eventType);
26236
+ if (!listeners8) return;
26237
+ for (const listener of Array.from(listeners8)) listener(...args);
25875
26238
  }
25876
26239
  };
25877
26240
  var DeviceEventEmitter = new NativeEventEmitter();
@@ -26410,17 +26773,17 @@ function createSootSimRnfsManagerModule() {
26410
26773
  };
26411
26774
  }
26412
26775
  function createSootSimFileAccessModule() {
26413
- const listeners7 = {
26776
+ const listeners8 = {
26414
26777
  complete: /* @__PURE__ */ new Set(),
26415
26778
  error: /* @__PURE__ */ new Set(),
26416
26779
  progress: /* @__PURE__ */ new Set()
26417
26780
  };
26418
26781
  const emit2 = (kind, event) => {
26419
- for (const listener of Array.from(listeners7[kind])) listener(event);
26782
+ for (const listener of Array.from(listeners8[kind])) listener(event);
26420
26783
  };
26421
26784
  const subscribe = (kind, listener) => {
26422
- listeners7[kind].add(listener);
26423
- return { remove: () => listeners7[kind].delete(listener) };
26785
+ listeners8[kind].add(listener);
26786
+ return { remove: () => listeners8[kind].delete(listener) };
26424
26787
  };
26425
26788
  const readText = (pathLike) => getSootSimStorage().getItem(getSootSimRnfsStorageKey(pathLike)) ?? "";
26426
26789
  const writeText = (pathLike, value) => {
@@ -27097,26 +27460,26 @@ var EventEmitter = class {
27097
27460
  "EventEmitter.addListener(...): 2nd argument must be a function."
27098
27461
  );
27099
27462
  }
27100
- let listeners7 = this._listeners.get(eventType);
27101
- if (!listeners7) {
27102
- listeners7 = /* @__PURE__ */ new Set();
27103
- this._listeners.set(eventType, listeners7);
27463
+ let listeners8 = this._listeners.get(eventType);
27464
+ if (!listeners8) {
27465
+ listeners8 = /* @__PURE__ */ new Set();
27466
+ this._listeners.set(eventType, listeners8);
27104
27467
  }
27105
27468
  const registration = {
27106
27469
  listener,
27107
27470
  context,
27108
27471
  remove: () => {
27109
- listeners7.delete(registration);
27110
- if (listeners7.size === 0) this._listeners.delete(eventType);
27472
+ listeners8.delete(registration);
27473
+ if (listeners8.size === 0) this._listeners.delete(eventType);
27111
27474
  }
27112
27475
  };
27113
- listeners7.add(registration);
27476
+ listeners8.add(registration);
27114
27477
  return registration;
27115
27478
  }
27116
27479
  removeListener(eventType, listener) {
27117
- const listeners7 = this._listeners.get(eventType);
27118
- if (!listeners7) return;
27119
- for (const registration of listeners7) {
27480
+ const listeners8 = this._listeners.get(eventType);
27481
+ if (!listeners8) return;
27482
+ for (const registration of listeners8) {
27120
27483
  if (registration.listener === listener) registration.remove();
27121
27484
  }
27122
27485
  }
@@ -27125,9 +27488,9 @@ var EventEmitter = class {
27125
27488
  else this._listeners.clear();
27126
27489
  }
27127
27490
  emit(eventType, ...args) {
27128
- const listeners7 = this._listeners.get(eventType);
27129
- if (!listeners7) return;
27130
- for (const registration of Array.from(listeners7)) {
27491
+ const listeners8 = this._listeners.get(eventType);
27492
+ if (!listeners8) return;
27493
+ for (const registration of Array.from(listeners8)) {
27131
27494
  registration.listener.apply(registration.context, args);
27132
27495
  }
27133
27496
  }
@@ -27175,7 +27538,8 @@ var VerticalBarColumnRegistryContext = (0, import_react44.createContext)(
27175
27538
  var VerticalBarSceneFocusContext = (0, import_react44.createContext)(true);
27176
27539
  var VerticalBarColumnMetricsContext = (0, import_react44.createContext)({
27177
27540
  availableHeaderHeight: null,
27178
- availableToolbarHeight: null
27541
+ availableToolbarHeight: null,
27542
+ availableTopToolbarHeight: null
27179
27543
  });
27180
27544
  var SPLIT_COLUMN_CHROME_KEY = "__peachSplitColumnChromeContext";
27181
27545
  var splitColumnChromeGlobals = globalThis;
@@ -27198,6 +27562,7 @@ var import_react46 = require("react");
27198
27562
  // ../peach-engine/src/components/SegmentedControl.tsx
27199
27563
  var import_react47 = require("react");
27200
27564
  var SYSTEM_TEXT = dynamicColor("#000000", "#ffffff");
27565
+ var STRETCH_GAIN = 1.87 / 60;
27201
27566
 
27202
27567
  // ../peach-compat/src/stubs/blur-utils.ts
27203
27568
  var import_react48 = require("react");
@@ -27390,10 +27755,10 @@ function getDuoFoldRest() {
27390
27755
  }
27391
27756
  }
27392
27757
  function subscribeDuoFoldProgress(fn) {
27393
- const listeners7 = getListenerSet2();
27394
- listeners7.add(fn);
27758
+ const listeners8 = getListenerSet2();
27759
+ listeners8.add(fn);
27395
27760
  return () => {
27396
- listeners7.delete(fn);
27761
+ listeners8.delete(fn);
27397
27762
  };
27398
27763
  }
27399
27764
 
@@ -29625,6 +29990,7 @@ var NODE_COMPONENTS = {
29625
29990
  StyledToggle: import_ui.ZStack,
29626
29991
  SwipeActions: import_ui.SwipeActions,
29627
29992
  Text: import_ui.Text,
29993
+ TextEditor: import_ui.TextField,
29628
29994
  TextField: import_ui.TextField,
29629
29995
  Toggle: import_ui.Toggle,
29630
29996
  Tab: SwiftTabScene,
@@ -30187,6 +30553,9 @@ function nodeProps(node, deliver) {
30187
30553
  );
30188
30554
  return {
30189
30555
  ...align === void 0 ? {} : { style: align },
30556
+ // a vertical field grows with its lines and wraps a long one instead
30557
+ // of scrolling a single line (textfieldaxis, ios 27)
30558
+ ...props.axis === "vertical" ? { axis: "vertical" } : {},
30190
30559
  // a prompt is what the empty field shows, in the title's place; the
30191
30560
  // title still names the field (ios 27 controls oracle: SecureField
30192
30561
  // "Code" with prompt "6 digits" reads 6 digits)
@@ -30207,6 +30576,34 @@ function nodeProps(node, deliver) {
30207
30576
  ...focusProps(node, deliver)
30208
30577
  };
30209
30578
  }
30579
+ case "TextEditor": {
30580
+ const onChangeText = handlerId(node, "onChangeText");
30581
+ return {
30582
+ axis: "vertical",
30583
+ scrollEnabled: props.scrollEnabled !== false,
30584
+ // the tree's text-field control: describe collapses the engine input
30585
+ // host, so the role rides on the node describe keeps, as a
30586
+ // TextField's does
30587
+ accessibilityRole: "text-field",
30588
+ // a UITextView fills its offer on both axes and insets its text 8pt
30589
+ // from the top and bottom and 5pt from the sides, and its lines are
30590
+ // body lines (texteditor, ios 27: an empty editor in a padded stack
30591
+ // spans 370 and the rest of the height; text ink starts 5.33pt in and
30592
+ // 11.67pt down, and lines are 22pt apart)
30593
+ style: {
30594
+ lineHeight: textStyleAt("large", "body").lineHeight,
30595
+ flex: 1,
30596
+ alignSelf: "stretch",
30597
+ paddingTop: 8,
30598
+ paddingBottom: 8,
30599
+ paddingHorizontal: 5,
30600
+ textAlignVertical: "top"
30601
+ },
30602
+ ...typeof props.value === "string" ? { value: props.value } : {},
30603
+ ...onChangeText === void 0 ? {} : { onChangeText: (value) => deliver(onChangeText, value) },
30604
+ ...focusProps(node, deliver)
30605
+ };
30606
+ }
30210
30607
  case "Slider": {
30211
30608
  const onValueChange = handlerId(node, "onValueChange");
30212
30609
  return {
@@ -32328,7 +32725,7 @@ function createRoot(mountTree) {
32328
32725
  let state5 = { tree: null, isView: false, error: null };
32329
32726
  let swap = Promise.resolve();
32330
32727
  let disposed = false;
32331
- const listeners7 = /* @__PURE__ */ new Set();
32728
+ const listeners8 = /* @__PURE__ */ new Set();
32332
32729
  const cache2 = { entries: /* @__PURE__ */ new Map() };
32333
32730
  let lastSwift = null;
32334
32731
  let lastWasm = null;
@@ -32344,7 +32741,7 @@ function createRoot(mountTree) {
32344
32741
  exitSlots.delete(id);
32345
32742
  if (state5.tree === null || lastSwift === null) return;
32346
32743
  state5 = { ...state5, tree: restoreSlots(lastSwift) };
32347
- for (const listener of listeners7) listener();
32744
+ for (const listener of listeners8) listener();
32348
32745
  };
32349
32746
  const stampExit = (node, transaction) => {
32350
32747
  const transition = (0, import_ui.readTransitionModifier)(node.m);
@@ -32497,7 +32894,7 @@ function createRoot(mountTree) {
32497
32894
  const display = lastSwift === null ? null : restoreSlots(lastSwift);
32498
32895
  const changed = display !== state5.tree || next.error !== state5.error || next.isView !== state5.isView;
32499
32896
  state5 = { tree: display, isView: next.isView, error: next.error, transaction };
32500
- if (changed) for (const listener of listeners7) listener();
32897
+ if (changed) for (const listener of listeners8) listener();
32501
32898
  if (timer !== null) clearTimeout(timer);
32502
32899
  timer = null;
32503
32900
  if (timelineTimer !== null) {
@@ -32661,8 +33058,8 @@ function createRoot(mountTree) {
32661
33058
  const component = function SwiftRoot() {
32662
33059
  const rendered = (0, import_react53.useSyncExternalStore)(
32663
33060
  (listener) => {
32664
- listeners7.add(listener);
32665
- return () => listeners7.delete(listener);
33061
+ listeners8.add(listener);
33062
+ return () => listeners8.delete(listener);
32666
33063
  },
32667
33064
  () => state5
32668
33065
  );
@@ -32697,7 +33094,7 @@ function createRoot(mountTree) {
32697
33094
  instance?.unmount();
32698
33095
  appearance.remove();
32699
33096
  dimensions2.remove();
32700
- listeners7.clear();
33097
+ listeners8.clear();
32701
33098
  instance = null;
32702
33099
  cache2.entries.clear();
32703
33100
  },