pythonnative 0.40.0__cp313-cp313-win_amd64.whl

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 (418) hide show
  1. pythonnative/__init__.py +411 -0
  2. pythonnative/_ios_log.py +92 -0
  3. pythonnative/_yoga.cp313-win_amd64.pyd +0 -0
  4. pythonnative/alerts.py +236 -0
  5. pythonnative/animated.py +1687 -0
  6. pythonnative/animation_graph.py +78 -0
  7. pythonnative/appearance.py +124 -0
  8. pythonnative/bootstrap.py +100 -0
  9. pythonnative/bridge/__init__.py +302 -0
  10. pythonnative/bridge/android.py +78 -0
  11. pythonnative/bridge/codec.py +170 -0
  12. pythonnative/bridge/commits.py +114 -0
  13. pythonnative/bridge/fake.py +243 -0
  14. pythonnative/bridge/ios.py +138 -0
  15. pythonnative/bridge/web.py +489 -0
  16. pythonnative/cli/__init__.py +7 -0
  17. pythonnative/cli/pn.py +1214 -0
  18. pythonnative/component.py +271 -0
  19. pythonnative/components/__init__.py +111 -0
  20. pythonnative/components/_base.py +166 -0
  21. pythonnative/components/controls.py +521 -0
  22. pythonnative/components/layout.py +518 -0
  23. pythonnative/components/lists.py +785 -0
  24. pythonnative/components/media.py +204 -0
  25. pythonnative/components/overlays.py +107 -0
  26. pythonnative/components/pressable.py +252 -0
  27. pythonnative/components/structural.py +167 -0
  28. pythonnative/components/text.py +291 -0
  29. pythonnative/devclient.py +824 -0
  30. pythonnative/devserver/__init__.py +34 -0
  31. pythonnative/devserver/server.py +718 -0
  32. pythonnative/devserver/static/animation_graph.js +82 -0
  33. pythonnative/devserver/static/bridge.js +147 -0
  34. pythonnative/devserver/static/colors.js +70 -0
  35. pythonnative/devserver/static/host.js +552 -0
  36. pythonnative/devserver/static/index.html +60 -0
  37. pythonnative/devserver/static/layout.js +85 -0
  38. pythonnative/devserver/static/preview.css +415 -0
  39. pythonnative/devserver/static/renderer.js +1994 -0
  40. pythonnative/devserver/static/shell.js +345 -0
  41. pythonnative/devserver/static/yoga/LICENSE +21 -0
  42. pythonnative/devserver/static/yoga/binaries/yoga-wasm-base64-esm.js +75 -0
  43. pythonnative/devserver/static/yoga/src/generated/YGEnums.d.ts +189 -0
  44. pythonnative/devserver/static/yoga/src/generated/YGEnums.js +211 -0
  45. pythonnative/devserver/static/yoga/src/generated/YGEnums.js.map +1 -0
  46. pythonnative/devserver/static/yoga/src/index.d.ts +12 -0
  47. pythonnative/devserver/static/yoga/src/index.js +16 -0
  48. pythonnative/devserver/static/yoga/src/index.js.map +1 -0
  49. pythonnative/devserver/static/yoga/src/load.d.ts +11 -0
  50. pythonnative/devserver/static/yoga/src/load.js +17 -0
  51. pythonnative/devserver/static/yoga/src/load.js.map +1 -0
  52. pythonnative/devserver/static/yoga/src/wrapAssembly.d.ts +155 -0
  53. pythonnative/devserver/static/yoga/src/wrapAssembly.js +125 -0
  54. pythonnative/devserver/static/yoga/src/wrapAssembly.js.map +1 -0
  55. pythonnative/devserver/watcher.py +267 -0
  56. pythonnative/devserver/ws.py +421 -0
  57. pythonnative/diagnostics.py +241 -0
  58. pythonnative/element.py +159 -0
  59. pythonnative/equality.py +19 -0
  60. pythonnative/events.py +231 -0
  61. pythonnative/gestures.py +1333 -0
  62. pythonnative/hooks.py +1621 -0
  63. pythonnative/hosts/__init__.py +63 -0
  64. pythonnative/hosts/base.py +596 -0
  65. pythonnative/hosts/native.py +302 -0
  66. pythonnative/hot_reload.py +585 -0
  67. pythonnative/layout.py +328 -0
  68. pythonnative/mutations.py +142 -0
  69. pythonnative/native/android/build.gradle +52 -0
  70. pythonnative/native/android/gradle.properties +3 -0
  71. pythonnative/native/android/settings.gradle +12 -0
  72. pythonnative/native/android/src/main/AndroidManifest.xml +11 -0
  73. pythonnative/native/android/src/main/cpp/CMakeLists.txt +9 -0
  74. pythonnative/native/android/src/main/cpp/yoga_jni.cpp +52 -0
  75. pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeModules.kt +5 -0
  76. pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeProps.kt +3705 -0
  77. pythonnative/native/android/src/main/java/com/pythonnative/generated/PNContracts.kt +129 -0
  78. pythonnative/native/android/src/main/java/com/pythonnative/runtime/PNBridge.kt +261 -0
  79. pythonnative/native/android/src/main/java/com/pythonnative/runtime/PythonHost.kt +20 -0
  80. pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/AnimationGraph.kt +108 -0
  81. pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/AnimationSpecs.kt +141 -0
  82. pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/PNAnimator.kt +257 -0
  83. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/CommitState.kt +106 -0
  84. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/JsonUtil.kt +175 -0
  85. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/MainThread.kt +40 -0
  86. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/PNLog.kt +33 -0
  87. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/PNRegistry.kt +82 -0
  88. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/PNTransaction.kt +80 -0
  89. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/TransactionApplier.kt +117 -0
  90. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/ViewRegistry.kt +74 -0
  91. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/BuiltinComponents.kt +37 -0
  92. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ButtonManager.kt +32 -0
  93. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ComponentManager.kt +213 -0
  94. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ContainerManagers.kt +69 -0
  95. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ControlManagers.kt +186 -0
  96. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/DatePickerManager.kt +123 -0
  97. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ImageLoader.kt +141 -0
  98. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ImageManager.kt +162 -0
  99. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ModalManager.kt +134 -0
  100. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PNColor.kt +201 -0
  101. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PickerManager.kt +86 -0
  102. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PortalManager.kt +55 -0
  103. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PressableManager.kt +122 -0
  104. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ScreenStackManager.kt +110 -0
  105. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ScrollViewManager.kt +214 -0
  106. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/SegmentedControlManager.kt +113 -0
  107. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/StatusBarManager.kt +52 -0
  108. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/TabBarManager.kt +131 -0
  109. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/TextInputManager.kt +250 -0
  110. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/TextManager.kt +233 -0
  111. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ViewStyler.kt +355 -0
  112. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/VirtualListManager.kt +159 -0
  113. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/WebViewManager.kt +149 -0
  114. pythonnative/native/android/src/main/java/com/pythonnative/runtime/gestures/GestureArbiter.kt +233 -0
  115. pythonnative/native/android/src/main/java/com/pythonnative/runtime/gestures/GestureCoordinator.kt +127 -0
  116. pythonnative/native/android/src/main/java/com/pythonnative/runtime/gestures/GestureRecognizers.kt +527 -0
  117. pythonnative/native/android/src/main/java/com/pythonnative/runtime/layout/NativeLayout.kt +145 -0
  118. pythonnative/native/android/src/main/java/com/pythonnative/runtime/layout/YogaNode.kt +29 -0
  119. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/BuiltinModules.kt +73 -0
  120. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/DeviceModules.kt +316 -0
  121. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/HostModule.kt +61 -0
  122. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/MediaModules.kt +200 -0
  123. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/NativeModule.kt +158 -0
  124. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/NotificationsModule.kt +100 -0
  125. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/PermissionsModule.kt +99 -0
  126. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/StorageModules.kt +89 -0
  127. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/SystemModules.kt +178 -0
  128. pythonnative/native/android/src/main/java/com/pythonnative/runtime/plugins/GeneratedPlugins.kt +16 -0
  129. pythonnative/native/android/src/main/java/com/pythonnative/runtime/screens/PNScreenFragment.kt +188 -0
  130. pythonnative/native/android/src/main/java/com/pythonnative/runtime/screens/ScreenRegistry.kt +80 -0
  131. pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNAccessibilityDelegate.kt +48 -0
  132. pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNBorderDrawable.kt +76 -0
  133. pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNEditText.kt +18 -0
  134. pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNFrameLayout.kt +49 -0
  135. pythonnative/native/android/src/test/java/com/pythonnative/runtime/AnimationSpecsTest.kt +75 -0
  136. pythonnative/native/android/src/test/java/com/pythonnative/runtime/GestureArbiterTest.kt +197 -0
  137. pythonnative/native/android/src/test/java/com/pythonnative/runtime/PNColorTest.kt +47 -0
  138. pythonnative/native/android/src/test/java/com/pythonnative/runtime/PNTransactionTest.kt +78 -0
  139. pythonnative/native/android/src/test/java/com/pythonnative/runtime/PromiseTest.kt +89 -0
  140. pythonnative/native/ios/Package.swift +23 -0
  141. pythonnative/native/ios/Sources/PythonNativeKit/Animation/PNAnimationGraph.swift +199 -0
  142. pythonnative/native/ios/Sources/PythonNativeKit/Animation/PNAnimator.swift +312 -0
  143. pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNBridge.swift +255 -0
  144. pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNCommit.swift +104 -0
  145. pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNRegistry.swift +142 -0
  146. pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNTransaction.swift +166 -0
  147. pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNViewRegistry.swift +53 -0
  148. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNButtonManagers.swift +207 -0
  149. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNColor.swift +173 -0
  150. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNComponentManager.swift +183 -0
  151. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNContainerView.swift +56 -0
  152. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNControlManagers.swift +281 -0
  153. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNImageManager.swift +222 -0
  154. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNOverlayManagers.swift +243 -0
  155. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNPressableManager.swift +114 -0
  156. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNScreenStackManager.swift +107 -0
  157. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNScrollViewManager.swift +197 -0
  158. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTabBarManager.swift +106 -0
  159. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTextInputManager.swift +297 -0
  160. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTextManager.swift +230 -0
  161. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTransform.swift +82 -0
  162. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNViewManager.swift +86 -0
  163. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNViewState.swift +87 -0
  164. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNViewStyler.swift +340 -0
  165. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNVirtualListManager.swift +155 -0
  166. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNWebViewManager.swift +124 -0
  167. pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeModules.swift +1 -0
  168. pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeProps.swift +3775 -0
  169. pythonnative/native/ios/Sources/PythonNativeKit/Generated/PNContracts.swift +46 -0
  170. pythonnative/native/ios/Sources/PythonNativeKit/Gestures/PNGestureCoordinator.swift +260 -0
  171. pythonnative/native/ios/Sources/PythonNativeKit/Layout/PNLayout.swift +173 -0
  172. pythonnative/native/ios/Sources/PythonNativeKit/Modules/AlertModule.swift +92 -0
  173. pythonnative/native/ios/Sources/PythonNativeKit/Modules/HostModule.swift +80 -0
  174. pythonnative/native/ios/Sources/PythonNativeKit/Modules/LifecycleModules.swift +174 -0
  175. pythonnative/native/ios/Sources/PythonNativeKit/Modules/MediaModules.swift +177 -0
  176. pythonnative/native/ios/Sources/PythonNativeKit/Modules/PNNativeModule.swift +168 -0
  177. pythonnative/native/ios/Sources/PythonNativeKit/Modules/PermissionModules.swift +266 -0
  178. pythonnative/native/ios/Sources/PythonNativeKit/Modules/SystemModules.swift +251 -0
  179. pythonnative/native/ios/Sources/PythonNativeKit/Plugins/PNPluginRegistration.swift +8 -0
  180. pythonnative/native/ios/Sources/PythonNativeKit/Screens/PNScreenRegistry.swift +46 -0
  181. pythonnative/native/ios/Sources/PythonNativeKit/Screens/PNViewController.swift +237 -0
  182. pythonnative/native/ios/Sources/PythonNativeKit/Support/PNCompat.swift +46 -0
  183. pythonnative/native/ios/Sources/PythonNativeKit/Support/PNJSON.swift +173 -0
  184. pythonnative/native/ios/Sources/PythonNativeKit/Support/PNLog.swift +47 -0
  185. pythonnative/native/ios/Sources/PythonNativeKit/Support/PNWindow.swift +51 -0
  186. pythonnative/native/ios/Tests/PythonNativeKitTests/PNAnimationGraphTests.swift +26 -0
  187. pythonnative/native/ios/Tests/PythonNativeKitTests/PNColorTests.swift +50 -0
  188. pythonnative/native/ios/Tests/PythonNativeKitTests/PNCommitTests.swift +86 -0
  189. pythonnative/native/ios/Tests/PythonNativeKitTests/PNGestureTests.swift +101 -0
  190. pythonnative/native/ios/Tests/PythonNativeKitTests/PNManagerTests.swift +126 -0
  191. pythonnative/native/ios/Tests/PythonNativeKitTests/PNModuleTests.swift +111 -0
  192. pythonnative/native/ios/Tests/PythonNativeKitTests/PNTransactionTests.swift +91 -0
  193. pythonnative/native/yoga/LICENSE +21 -0
  194. pythonnative/native/yoga/Package.swift +9 -0
  195. pythonnative/native/yoga/VENDORED.md +2 -0
  196. pythonnative/native/yoga/include/PNStyle.h +10 -0
  197. pythonnative/native/yoga/include/module.modulemap +5 -0
  198. pythonnative/native/yoga/include/yoga/YGConfig.h +158 -0
  199. pythonnative/native/yoga/include/yoga/YGEnums.h +142 -0
  200. pythonnative/native/yoga/include/yoga/YGMacros.h +99 -0
  201. pythonnative/native/yoga/include/yoga/YGNode.h +304 -0
  202. pythonnative/native/yoga/include/yoga/YGNodeLayout.h +35 -0
  203. pythonnative/native/yoga/include/yoga/YGNodeStyle.h +130 -0
  204. pythonnative/native/yoga/include/yoga/YGPixelGrid.h +29 -0
  205. pythonnative/native/yoga/include/yoga/YGValue.h +84 -0
  206. pythonnative/native/yoga/include/yoga/Yoga.h +21 -0
  207. pythonnative/native/yoga/python.cpp +16 -0
  208. pythonnative/native/yoga/style.cpp +272 -0
  209. pythonnative/native/yoga/yoga/CMakeLists.txt +41 -0
  210. pythonnative/native/yoga/yoga/YGConfig.cpp +92 -0
  211. pythonnative/native/yoga/yoga/YGConfig.h +158 -0
  212. pythonnative/native/yoga/yoga/YGEnums.cpp +262 -0
  213. pythonnative/native/yoga/yoga/YGEnums.h +142 -0
  214. pythonnative/native/yoga/yoga/YGMacros.h +99 -0
  215. pythonnative/native/yoga/yoga/YGNode.cpp +366 -0
  216. pythonnative/native/yoga/yoga/YGNode.h +304 -0
  217. pythonnative/native/yoga/yoga/YGNodeLayout.cpp +92 -0
  218. pythonnative/native/yoga/yoga/YGNodeLayout.h +35 -0
  219. pythonnative/native/yoga/yoga/YGNodeStyle.cpp +405 -0
  220. pythonnative/native/yoga/yoga/YGNodeStyle.h +130 -0
  221. pythonnative/native/yoga/yoga/YGPixelGrid.cpp +22 -0
  222. pythonnative/native/yoga/yoga/YGPixelGrid.h +29 -0
  223. pythonnative/native/yoga/yoga/YGValue.cpp +20 -0
  224. pythonnative/native/yoga/yoga/YGValue.h +84 -0
  225. pythonnative/native/yoga/yoga/Yoga.h +21 -0
  226. pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.cpp +563 -0
  227. pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.h +41 -0
  228. pythonnative/native/yoga/yoga/algorithm/Align.h +72 -0
  229. pythonnative/native/yoga/yoga/algorithm/Baseline.cpp +78 -0
  230. pythonnative/native/yoga/yoga/algorithm/Baseline.h +21 -0
  231. pythonnative/native/yoga/yoga/algorithm/BoundAxis.h +79 -0
  232. pythonnative/native/yoga/yoga/algorithm/Cache.cpp +121 -0
  233. pythonnative/native/yoga/yoga/algorithm/Cache.h +30 -0
  234. pythonnative/native/yoga/yoga/algorithm/CalculateLayout.cpp +2428 -0
  235. pythonnative/native/yoga/yoga/algorithm/CalculateLayout.h +38 -0
  236. pythonnative/native/yoga/yoga/algorithm/FlexDirection.h +120 -0
  237. pythonnative/native/yoga/yoga/algorithm/FlexLine.cpp +124 -0
  238. pythonnative/native/yoga/yoga/algorithm/FlexLine.h +75 -0
  239. pythonnative/native/yoga/yoga/algorithm/PixelGrid.cpp +132 -0
  240. pythonnative/native/yoga/yoga/algorithm/PixelGrid.h +29 -0
  241. pythonnative/native/yoga/yoga/algorithm/SizingMode.h +73 -0
  242. pythonnative/native/yoga/yoga/algorithm/TrailingPosition.h +44 -0
  243. pythonnative/native/yoga/yoga/config/Config.cpp +135 -0
  244. pythonnative/native/yoga/yoga/config/Config.h +92 -0
  245. pythonnative/native/yoga/yoga/debug/AssertFatal.cpp +53 -0
  246. pythonnative/native/yoga/yoga/debug/AssertFatal.h +29 -0
  247. pythonnative/native/yoga/yoga/debug/Log.cpp +107 -0
  248. pythonnative/native/yoga/yoga/debug/Log.h +34 -0
  249. pythonnative/native/yoga/yoga/enums/Align.h +47 -0
  250. pythonnative/native/yoga/yoga/enums/BoxSizing.h +40 -0
  251. pythonnative/native/yoga/yoga/enums/Dimension.h +40 -0
  252. pythonnative/native/yoga/yoga/enums/Direction.h +41 -0
  253. pythonnative/native/yoga/yoga/enums/Display.h +41 -0
  254. pythonnative/native/yoga/yoga/enums/Edge.h +47 -0
  255. pythonnative/native/yoga/yoga/enums/Errata.h +41 -0
  256. pythonnative/native/yoga/yoga/enums/ExperimentalFeature.h +39 -0
  257. pythonnative/native/yoga/yoga/enums/FlexDirection.h +42 -0
  258. pythonnative/native/yoga/yoga/enums/Gutter.h +41 -0
  259. pythonnative/native/yoga/yoga/enums/Justify.h +44 -0
  260. pythonnative/native/yoga/yoga/enums/LogLevel.h +44 -0
  261. pythonnative/native/yoga/yoga/enums/MeasureMode.h +41 -0
  262. pythonnative/native/yoga/yoga/enums/NodeType.h +40 -0
  263. pythonnative/native/yoga/yoga/enums/Overflow.h +41 -0
  264. pythonnative/native/yoga/yoga/enums/PhysicalEdge.h +21 -0
  265. pythonnative/native/yoga/yoga/enums/PositionType.h +41 -0
  266. pythonnative/native/yoga/yoga/enums/Unit.h +42 -0
  267. pythonnative/native/yoga/yoga/enums/Wrap.h +41 -0
  268. pythonnative/native/yoga/yoga/enums/YogaEnums.h +85 -0
  269. pythonnative/native/yoga/yoga/event/event.cpp +87 -0
  270. pythonnative/native/yoga/yoga/event/event.h +130 -0
  271. pythonnative/native/yoga/yoga/module.modulemap +21 -0
  272. pythonnative/native/yoga/yoga/node/CachedMeasurement.h +53 -0
  273. pythonnative/native/yoga/yoga/node/LayoutResults.cpp +48 -0
  274. pythonnative/native/yoga/yoga/node/LayoutResults.h +122 -0
  275. pythonnative/native/yoga/yoga/node/LayoutableChildren.h +148 -0
  276. pythonnative/native/yoga/yoga/node/Node.cpp +443 -0
  277. pythonnative/native/yoga/yoga/node/Node.h +337 -0
  278. pythonnative/native/yoga/yoga/numeric/Comparison.h +81 -0
  279. pythonnative/native/yoga/yoga/numeric/FloatOptional.h +93 -0
  280. pythonnative/native/yoga/yoga/style/SmallValueBuffer.h +133 -0
  281. pythonnative/native/yoga/yoga/style/Style.h +757 -0
  282. pythonnative/native/yoga/yoga/style/StyleLength.h +107 -0
  283. pythonnative/native/yoga/yoga/style/StyleValueHandle.h +98 -0
  284. pythonnative/native/yoga/yoga/style/StyleValuePool.h +127 -0
  285. pythonnative/native_modules/__init__.py +124 -0
  286. pythonnative/native_modules/app_state.py +99 -0
  287. pythonnative/native_modules/battery.py +75 -0
  288. pythonnative/native_modules/biometrics.py +42 -0
  289. pythonnative/native_modules/camera.py +65 -0
  290. pythonnative/native_modules/clipboard.py +46 -0
  291. pythonnative/native_modules/fallback.py +324 -0
  292. pythonnative/native_modules/file_system.py +145 -0
  293. pythonnative/native_modules/haptics.py +75 -0
  294. pythonnative/native_modules/linking.py +123 -0
  295. pythonnative/native_modules/location.py +75 -0
  296. pythonnative/native_modules/net_info.py +112 -0
  297. pythonnative/native_modules/notifications.py +129 -0
  298. pythonnative/native_modules/permissions.py +108 -0
  299. pythonnative/native_modules/registry.py +526 -0
  300. pythonnative/native_modules/secure_store.py +52 -0
  301. pythonnative/native_modules/share.py +51 -0
  302. pythonnative/native_views/__init__.py +375 -0
  303. pythonnative/native_views/base.py +316 -0
  304. pythonnative/native_views/bridge_backend.py +277 -0
  305. pythonnative/navigation/__init__.py +103 -0
  306. pythonnative/navigation/container.py +154 -0
  307. pythonnative/navigation/handle.py +540 -0
  308. pythonnative/navigation/hooks.py +133 -0
  309. pythonnative/navigation/host.py +58 -0
  310. pythonnative/navigation/linking.py +200 -0
  311. pythonnative/navigation/navigators.py +659 -0
  312. pythonnative/navigation/screen.py +149 -0
  313. pythonnative/navigation/state.py +269 -0
  314. pythonnative/net.py +248 -0
  315. pythonnative/platform.py +166 -0
  316. pythonnative/platform_metrics.py +252 -0
  317. pythonnative/preview.py +287 -0
  318. pythonnative/profiling.py +101 -0
  319. pythonnative/project/__init__.py +68 -0
  320. pythonnative/project/android.py +557 -0
  321. pythonnative/project/builder.py +817 -0
  322. pythonnative/project/config.py +773 -0
  323. pythonnative/project/deps.py +719 -0
  324. pythonnative/project/devices.py +304 -0
  325. pythonnative/project/doctor.py +283 -0
  326. pythonnative/project/fingerprint.py +171 -0
  327. pythonnative/project/icons.py +247 -0
  328. pythonnative/project/ios.py +325 -0
  329. pythonnative/project/lockfile.py +100 -0
  330. pythonnative/project/permissions.py +361 -0
  331. pythonnative/project/plugins.py +519 -0
  332. pythonnative/project/runtime_assets.py +183 -0
  333. pythonnative/py.typed +0 -0
  334. pythonnative/query.py +153 -0
  335. pythonnative/reconciler/__init__.py +29 -0
  336. pythonnative/reconciler/boundaries.py +375 -0
  337. pythonnative/reconciler/children.py +88 -0
  338. pythonnative/reconciler/core.py +1165 -0
  339. pythonnative/reconciler/layout_pass.py +393 -0
  340. pythonnative/reconciler/vnode.py +266 -0
  341. pythonnative/refresh.py +55 -0
  342. pythonnative/runtime.py +306 -0
  343. pythonnative/scheduler.py +159 -0
  344. pythonnative/sdk/__init__.py +153 -0
  345. pythonnative/sdk/_components.py +427 -0
  346. pythonnative/sdk/builtins.py +91 -0
  347. pythonnative/sdk/codegen.py +149 -0
  348. pythonnative/sdk/module_codegen.py +184 -0
  349. pythonnative/sdk/schema.py +224 -0
  350. pythonnative/sdk/templates/contracts.kt +46 -0
  351. pythonnative/sdk/templates/contracts.swift +46 -0
  352. pythonnative/storage.py +184 -0
  353. pythonnative/style.py +841 -0
  354. pythonnative/suspense.py +183 -0
  355. pythonnative/templates/android_template/app/build.gradle +75 -0
  356. pythonnative/templates/android_template/app/proguard-rules.pro +21 -0
  357. pythonnative/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt +24 -0
  358. pythonnative/templates/android_template/app/src/debug/AndroidManifest.xml +7 -0
  359. pythonnative/templates/android_template/app/src/main/AndroidManifest.xml +32 -0
  360. pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt +130 -0
  361. pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/ScreenFragment.kt +13 -0
  362. pythonnative/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml +170 -0
  363. pythonnative/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +30 -0
  364. pythonnative/templates/android_template/app/src/main/res/layout/activity_main.xml +10 -0
  365. pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +6 -0
  366. pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +6 -0
  367. pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
  368. pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
  369. pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
  370. pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
  371. pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
  372. pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
  373. pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
  374. pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
  375. pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
  376. pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
  377. pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml +22 -0
  378. pythonnative/templates/android_template/app/src/main/res/values/colors.xml +5 -0
  379. pythonnative/templates/android_template/app/src/main/res/values/strings.xml +5 -0
  380. pythonnative/templates/android_template/app/src/main/res/values/themes.xml +9 -0
  381. pythonnative/templates/android_template/app/src/main/res/values-night/themes.xml +7 -0
  382. pythonnative/templates/android_template/app/src/main/res/xml/backup_rules.xml +13 -0
  383. pythonnative/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml +19 -0
  384. pythonnative/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt +17 -0
  385. pythonnative/templates/android_template/build.gradle +10 -0
  386. pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.jar +0 -0
  387. pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties +6 -0
  388. pythonnative/templates/android_template/gradle.properties +23 -0
  389. pythonnative/templates/android_template/gradlew +185 -0
  390. pythonnative/templates/android_template/gradlew.bat +89 -0
  391. pythonnative/templates/android_template/settings.gradle +17 -0
  392. pythonnative/templates/ios_template/ios_template/AppDelegate.swift +51 -0
  393. pythonnative/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  394. pythonnative/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json +13 -0
  395. pythonnative/templates/ios_template/ios_template/Assets.xcassets/Contents.json +6 -0
  396. pythonnative/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard +25 -0
  397. pythonnative/templates/ios_template/ios_template/BridgingHeader.h +14 -0
  398. pythonnative/templates/ios_template/ios_template/Info.plist +28 -0
  399. pythonnative/templates/ios_template/ios_template/PythonRuntime.swift +390 -0
  400. pythonnative/templates/ios_template/ios_template/SceneDelegate.swift +61 -0
  401. pythonnative/templates/ios_template/ios_template/ViewController.swift +23 -0
  402. pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj +745 -0
  403. pythonnative/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  404. pythonnative/templates/ios_template/ios_templateTests/ios_templateTests.swift +36 -0
  405. pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITests.swift +41 -0
  406. pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift +32 -0
  407. pythonnative/testing/__init__.py +53 -0
  408. pythonnative/testing/backend.py +276 -0
  409. pythonnative/testing/harness.py +369 -0
  410. pythonnative/utils.py +145 -0
  411. pythonnative-0.40.0.dist-info/DELVEWHEEL +2 -0
  412. pythonnative-0.40.0.dist-info/METADATA +150 -0
  413. pythonnative-0.40.0.dist-info/RECORD +418 -0
  414. pythonnative-0.40.0.dist-info/WHEEL +5 -0
  415. pythonnative-0.40.0.dist-info/entry_points.txt +2 -0
  416. pythonnative-0.40.0.dist-info/licenses/LICENSE +21 -0
  417. pythonnative-0.40.0.dist-info/top_level.txt +1 -0
  418. pythonnative.libs/msvcp140-a4c2229bdc2a2a630acdc095b4d86008.dll +0 -0
@@ -0,0 +1,21 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ /**
11
+ * `#include <yoga/Yoga.h>` includes all of Yoga's public headers.
12
+ */
13
+
14
+ #include <yoga/YGConfig.h>
15
+ #include <yoga/YGEnums.h>
16
+ #include <yoga/YGMacros.h>
17
+ #include <yoga/YGNode.h>
18
+ #include <yoga/YGNodeLayout.h>
19
+ #include <yoga/YGNodeStyle.h>
20
+ #include <yoga/YGPixelGrid.h>
21
+ #include <yoga/YGValue.h>
@@ -0,0 +1,563 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #include <yoga/algorithm/AbsoluteLayout.h>
9
+ #include <yoga/algorithm/Align.h>
10
+ #include <yoga/algorithm/BoundAxis.h>
11
+ #include <yoga/algorithm/CalculateLayout.h>
12
+ #include <yoga/algorithm/TrailingPosition.h>
13
+
14
+ namespace facebook::yoga {
15
+
16
+ static inline void setFlexStartLayoutPosition(
17
+ const yoga::Node* const parent,
18
+ yoga::Node* child,
19
+ const Direction direction,
20
+ const FlexDirection axis,
21
+ const float containingBlockWidth) {
22
+ float position = child->style().computeFlexStartMargin(
23
+ axis, direction, containingBlockWidth) +
24
+ parent->getLayout().border(flexStartEdge(axis));
25
+
26
+ if (!child->hasErrata(Errata::AbsolutePositionWithoutInsetsExcludesPadding)) {
27
+ position += parent->getLayout().padding(flexStartEdge(axis));
28
+ }
29
+
30
+ child->setLayoutPosition(position, flexStartEdge(axis));
31
+ }
32
+
33
+ static inline void setFlexEndLayoutPosition(
34
+ const yoga::Node* const parent,
35
+ yoga::Node* child,
36
+ const Direction direction,
37
+ const FlexDirection axis,
38
+ const float containingBlockWidth) {
39
+ float flexEndPosition = parent->getLayout().border(flexEndEdge(axis)) +
40
+ child->style().computeFlexEndMargin(
41
+ axis, direction, containingBlockWidth);
42
+
43
+ if (!child->hasErrata(Errata::AbsolutePositionWithoutInsetsExcludesPadding)) {
44
+ flexEndPosition += parent->getLayout().padding(flexEndEdge(axis));
45
+ }
46
+
47
+ child->setLayoutPosition(
48
+ getPositionOfOppositeEdge(flexEndPosition, axis, parent, child),
49
+ flexStartEdge(axis));
50
+ }
51
+
52
+ static inline void setCenterLayoutPosition(
53
+ const yoga::Node* const parent,
54
+ yoga::Node* child,
55
+ const Direction direction,
56
+ const FlexDirection axis,
57
+ const float containingBlockWidth) {
58
+ float parentContentBoxSize =
59
+ parent->getLayout().measuredDimension(dimension(axis)) -
60
+ parent->getLayout().border(flexStartEdge(axis)) -
61
+ parent->getLayout().border(flexEndEdge(axis));
62
+
63
+ if (!child->hasErrata(Errata::AbsolutePositionWithoutInsetsExcludesPadding)) {
64
+ parentContentBoxSize -= parent->getLayout().padding(flexStartEdge(axis));
65
+ parentContentBoxSize -= parent->getLayout().padding(flexEndEdge(axis));
66
+ }
67
+
68
+ const float childOuterSize =
69
+ child->getLayout().measuredDimension(dimension(axis)) +
70
+ child->style().computeMarginForAxis(axis, containingBlockWidth);
71
+
72
+ float position = (parentContentBoxSize - childOuterSize) / 2.0f +
73
+ parent->getLayout().border(flexStartEdge(axis)) +
74
+ child->style().computeFlexStartMargin(
75
+ axis, direction, containingBlockWidth);
76
+
77
+ if (!child->hasErrata(Errata::AbsolutePositionWithoutInsetsExcludesPadding)) {
78
+ position += parent->getLayout().padding(flexStartEdge(axis));
79
+ }
80
+
81
+ child->setLayoutPosition(position, flexStartEdge(axis));
82
+ }
83
+
84
+ static void justifyAbsoluteChild(
85
+ const yoga::Node* const parent,
86
+ yoga::Node* child,
87
+ const Direction direction,
88
+ const FlexDirection mainAxis,
89
+ const float containingBlockWidth) {
90
+ const Justify parentJustifyContent = parent->style().justifyContent();
91
+ switch (parentJustifyContent) {
92
+ case Justify::FlexStart:
93
+ case Justify::SpaceBetween:
94
+ setFlexStartLayoutPosition(
95
+ parent, child, direction, mainAxis, containingBlockWidth);
96
+ break;
97
+ case Justify::FlexEnd:
98
+ setFlexEndLayoutPosition(
99
+ parent, child, direction, mainAxis, containingBlockWidth);
100
+ break;
101
+ case Justify::Center:
102
+ case Justify::SpaceAround:
103
+ case Justify::SpaceEvenly:
104
+ setCenterLayoutPosition(
105
+ parent, child, direction, mainAxis, containingBlockWidth);
106
+ break;
107
+ }
108
+ }
109
+
110
+ static void alignAbsoluteChild(
111
+ const yoga::Node* const parent,
112
+ yoga::Node* child,
113
+ const Direction direction,
114
+ const FlexDirection crossAxis,
115
+ const float containingBlockWidth) {
116
+ Align itemAlign = resolveChildAlignment(parent, child);
117
+ const Wrap parentWrap = parent->style().flexWrap();
118
+ if (parentWrap == Wrap::WrapReverse) {
119
+ if (itemAlign == Align::FlexEnd) {
120
+ itemAlign = Align::FlexStart;
121
+ } else if (itemAlign != Align::Center) {
122
+ itemAlign = Align::FlexEnd;
123
+ }
124
+ }
125
+
126
+ switch (itemAlign) {
127
+ case Align::Auto:
128
+ case Align::FlexStart:
129
+ case Align::Baseline:
130
+ case Align::SpaceAround:
131
+ case Align::SpaceBetween:
132
+ case Align::Stretch:
133
+ case Align::SpaceEvenly:
134
+ setFlexStartLayoutPosition(
135
+ parent, child, direction, crossAxis, containingBlockWidth);
136
+ break;
137
+ case Align::FlexEnd:
138
+ setFlexEndLayoutPosition(
139
+ parent, child, direction, crossAxis, containingBlockWidth);
140
+ break;
141
+ case Align::Center:
142
+ setCenterLayoutPosition(
143
+ parent, child, direction, crossAxis, containingBlockWidth);
144
+ break;
145
+ }
146
+ }
147
+
148
+ /*
149
+ * Absolutely positioned nodes do not participate in flex layout and thus their
150
+ * positions can be determined independently from the rest of their siblings.
151
+ * For each axis there are essentially two cases:
152
+ *
153
+ * 1) The node has insets defined. In this case we can just use these to
154
+ * determine the position of the node.
155
+ * 2) The node does not have insets defined. In this case we look at the style
156
+ * of the parent to position the node. Things like justify content and
157
+ * align content will move absolute children around. If none of these
158
+ * special properties are defined, the child is positioned at the start
159
+ * (defined by flex direction) of the leading flex line.
160
+ *
161
+ * This function does that positioning for the given axis. The spec has more
162
+ * information on this topic: https://www.w3.org/TR/css-flexbox-1/#abspos-items
163
+ */
164
+ static void positionAbsoluteChild(
165
+ const yoga::Node* const containingNode,
166
+ const yoga::Node* const parent,
167
+ yoga::Node* child,
168
+ const Direction direction,
169
+ const FlexDirection axis,
170
+ const bool isMainAxis,
171
+ const float containingBlockWidth,
172
+ const float containingBlockHeight) {
173
+ const bool isAxisRow = isRow(axis);
174
+ const float containingBlockSize =
175
+ isAxisRow ? containingBlockWidth : containingBlockHeight;
176
+
177
+ // The inline-start position takes priority over the end position in the case
178
+ // that they are both set and the node has a fixed width. Thus we only have 2
179
+ // cases here: if inline-start is defined and if inline-end is defined.
180
+ //
181
+ // Despite checking inline-start to honor prioritization of insets, we write
182
+ // to the flex-start edge because this algorithm works by positioning on the
183
+ // flex-start edge and then filling in the flex-end direction at the end if
184
+ // necessary.
185
+ if (child->style().isInlineStartPositionDefined(axis, direction) &&
186
+ !child->style().isInlineStartPositionAuto(axis, direction)) {
187
+ const float positionRelativeToInlineStart =
188
+ child->style().computeInlineStartPosition(
189
+ axis, direction, containingBlockSize) +
190
+ containingNode->style().computeInlineStartBorder(axis, direction) +
191
+ child->style().computeInlineStartMargin(
192
+ axis, direction, containingBlockSize);
193
+ const float positionRelativeToFlexStart =
194
+ inlineStartEdge(axis, direction) != flexStartEdge(axis)
195
+ ? getPositionOfOppositeEdge(
196
+ positionRelativeToInlineStart, axis, containingNode, child)
197
+ : positionRelativeToInlineStart;
198
+
199
+ child->setLayoutPosition(positionRelativeToFlexStart, flexStartEdge(axis));
200
+ } else if (
201
+ child->style().isInlineEndPositionDefined(axis, direction) &&
202
+ !child->style().isInlineEndPositionAuto(axis, direction)) {
203
+ const float positionRelativeToInlineStart =
204
+ containingNode->getLayout().measuredDimension(dimension(axis)) -
205
+ child->getLayout().measuredDimension(dimension(axis)) -
206
+ containingNode->style().computeInlineEndBorder(axis, direction) -
207
+ child->style().computeInlineEndMargin(
208
+ axis, direction, containingBlockSize) -
209
+ child->style().computeInlineEndPosition(
210
+ axis, direction, containingBlockSize);
211
+ const float positionRelativeToFlexStart =
212
+ inlineStartEdge(axis, direction) != flexStartEdge(axis)
213
+ ? getPositionOfOppositeEdge(
214
+ positionRelativeToInlineStart, axis, containingNode, child)
215
+ : positionRelativeToInlineStart;
216
+
217
+ child->setLayoutPosition(positionRelativeToFlexStart, flexStartEdge(axis));
218
+ } else {
219
+ isMainAxis ? justifyAbsoluteChild(
220
+ parent, child, direction, axis, containingBlockWidth)
221
+ : alignAbsoluteChild(
222
+ parent, child, direction, axis, containingBlockWidth);
223
+ }
224
+ }
225
+
226
+ void layoutAbsoluteChild(
227
+ const yoga::Node* const containingNode,
228
+ const yoga::Node* const node,
229
+ yoga::Node* const child,
230
+ const float containingBlockWidth,
231
+ const float containingBlockHeight,
232
+ const SizingMode widthMode,
233
+ const Direction direction,
234
+ LayoutData& layoutMarkerData,
235
+ const uint32_t depth,
236
+ const uint32_t generationCount) {
237
+ const FlexDirection mainAxis =
238
+ resolveDirection(node->style().flexDirection(), direction);
239
+ const FlexDirection crossAxis = resolveCrossDirection(mainAxis, direction);
240
+ const bool isMainAxisRow = isRow(mainAxis);
241
+
242
+ float childWidth = YGUndefined;
243
+ float childHeight = YGUndefined;
244
+ SizingMode childWidthSizingMode = SizingMode::MaxContent;
245
+ SizingMode childHeightSizingMode = SizingMode::MaxContent;
246
+
247
+ auto marginRow = child->style().computeMarginForAxis(
248
+ FlexDirection::Row, containingBlockWidth);
249
+ auto marginColumn = child->style().computeMarginForAxis(
250
+ FlexDirection::Column, containingBlockWidth);
251
+
252
+ if (child->hasDefiniteLength(Dimension::Width, containingBlockWidth)) {
253
+ childWidth = child
254
+ ->getResolvedDimension(
255
+ direction,
256
+ Dimension::Width,
257
+ containingBlockWidth,
258
+ containingBlockWidth)
259
+ .unwrap() +
260
+ marginRow;
261
+ } else {
262
+ // If the child doesn't have a specified width, compute the width based on
263
+ // the left/right offsets if they're defined.
264
+ if (child->style().isFlexStartPositionDefined(
265
+ FlexDirection::Row, direction) &&
266
+ child->style().isFlexEndPositionDefined(
267
+ FlexDirection::Row, direction) &&
268
+ !child->style().isFlexStartPositionAuto(
269
+ FlexDirection::Row, direction) &&
270
+ !child->style().isFlexEndPositionAuto(FlexDirection::Row, direction)) {
271
+ childWidth =
272
+ containingNode->getLayout().measuredDimension(Dimension::Width) -
273
+ (containingNode->style().computeFlexStartBorder(
274
+ FlexDirection::Row, direction) +
275
+ containingNode->style().computeFlexEndBorder(
276
+ FlexDirection::Row, direction)) -
277
+ (child->style().computeFlexStartPosition(
278
+ FlexDirection::Row, direction, containingBlockWidth) +
279
+ child->style().computeFlexEndPosition(
280
+ FlexDirection::Row, direction, containingBlockWidth));
281
+ childWidth = boundAxis(
282
+ child,
283
+ FlexDirection::Row,
284
+ direction,
285
+ childWidth,
286
+ containingBlockWidth,
287
+ containingBlockWidth);
288
+ }
289
+ }
290
+
291
+ if (child->hasDefiniteLength(Dimension::Height, containingBlockHeight)) {
292
+ childHeight = child
293
+ ->getResolvedDimension(
294
+ direction,
295
+ Dimension::Height,
296
+ containingBlockHeight,
297
+ containingBlockWidth)
298
+ .unwrap() +
299
+ marginColumn;
300
+ } else {
301
+ // If the child doesn't have a specified height, compute the height based
302
+ // on the top/bottom offsets if they're defined.
303
+ if (child->style().isFlexStartPositionDefined(
304
+ FlexDirection::Column, direction) &&
305
+ child->style().isFlexEndPositionDefined(
306
+ FlexDirection::Column, direction) &&
307
+ !child->style().isFlexStartPositionAuto(
308
+ FlexDirection::Column, direction) &&
309
+ !child->style().isFlexEndPositionAuto(
310
+ FlexDirection::Column, direction)) {
311
+ childHeight =
312
+ containingNode->getLayout().measuredDimension(Dimension::Height) -
313
+ (containingNode->style().computeFlexStartBorder(
314
+ FlexDirection::Column, direction) +
315
+ containingNode->style().computeFlexEndBorder(
316
+ FlexDirection::Column, direction)) -
317
+ (child->style().computeFlexStartPosition(
318
+ FlexDirection::Column, direction, containingBlockHeight) +
319
+ child->style().computeFlexEndPosition(
320
+ FlexDirection::Column, direction, containingBlockHeight));
321
+ childHeight = boundAxis(
322
+ child,
323
+ FlexDirection::Column,
324
+ direction,
325
+ childHeight,
326
+ containingBlockHeight,
327
+ containingBlockWidth);
328
+ }
329
+ }
330
+
331
+ // Exactly one dimension needs to be defined for us to be able to do aspect
332
+ // ratio calculation. One dimension being the anchor and the other being
333
+ // flexible.
334
+ const auto& childStyle = child->style();
335
+ if (yoga::isUndefined(childWidth) ^ yoga::isUndefined(childHeight)) {
336
+ if (childStyle.aspectRatio().isDefined()) {
337
+ if (yoga::isUndefined(childWidth)) {
338
+ childWidth = marginRow +
339
+ (childHeight - marginColumn) * childStyle.aspectRatio().unwrap();
340
+ } else if (yoga::isUndefined(childHeight)) {
341
+ childHeight = marginColumn +
342
+ (childWidth - marginRow) / childStyle.aspectRatio().unwrap();
343
+ }
344
+ }
345
+ }
346
+
347
+ // If we're still missing one or the other dimension, measure the content.
348
+ if (yoga::isUndefined(childWidth) || yoga::isUndefined(childHeight)) {
349
+ childWidthSizingMode = yoga::isUndefined(childWidth)
350
+ ? SizingMode::MaxContent
351
+ : SizingMode::StretchFit;
352
+ childHeightSizingMode = yoga::isUndefined(childHeight)
353
+ ? SizingMode::MaxContent
354
+ : SizingMode::StretchFit;
355
+
356
+ // If the size of the owner is defined then try to constrain the absolute
357
+ // child to that size as well. This allows text within the absolute child
358
+ // to wrap to the size of its owner. This is the same behavior as many
359
+ // browsers implement.
360
+ if (!isMainAxisRow && yoga::isUndefined(childWidth) &&
361
+ widthMode != SizingMode::MaxContent &&
362
+ yoga::isDefined(containingBlockWidth) && containingBlockWidth > 0) {
363
+ childWidth = containingBlockWidth;
364
+ childWidthSizingMode = SizingMode::FitContent;
365
+ }
366
+
367
+ calculateLayoutInternal(
368
+ child,
369
+ childWidth,
370
+ childHeight,
371
+ direction,
372
+ childWidthSizingMode,
373
+ childHeightSizingMode,
374
+ containingBlockWidth,
375
+ containingBlockHeight,
376
+ false,
377
+ LayoutPassReason::kAbsMeasureChild,
378
+ layoutMarkerData,
379
+ depth,
380
+ generationCount);
381
+ childWidth = child->getLayout().measuredDimension(Dimension::Width) +
382
+ child->style().computeMarginForAxis(
383
+ FlexDirection::Row, containingBlockWidth);
384
+ childHeight = child->getLayout().measuredDimension(Dimension::Height) +
385
+ child->style().computeMarginForAxis(
386
+ FlexDirection::Column, containingBlockWidth);
387
+ }
388
+
389
+ calculateLayoutInternal(
390
+ child,
391
+ childWidth,
392
+ childHeight,
393
+ direction,
394
+ SizingMode::StretchFit,
395
+ SizingMode::StretchFit,
396
+ containingBlockWidth,
397
+ containingBlockHeight,
398
+ true,
399
+ LayoutPassReason::kAbsLayout,
400
+ layoutMarkerData,
401
+ depth,
402
+ generationCount);
403
+
404
+ positionAbsoluteChild(
405
+ containingNode,
406
+ node,
407
+ child,
408
+ direction,
409
+ mainAxis,
410
+ true /*isMainAxis*/,
411
+ containingBlockWidth,
412
+ containingBlockHeight);
413
+ positionAbsoluteChild(
414
+ containingNode,
415
+ node,
416
+ child,
417
+ direction,
418
+ crossAxis,
419
+ false /*isMainAxis*/,
420
+ containingBlockWidth,
421
+ containingBlockHeight);
422
+ }
423
+
424
+ bool layoutAbsoluteDescendants(
425
+ yoga::Node* containingNode,
426
+ yoga::Node* currentNode,
427
+ SizingMode widthSizingMode,
428
+ Direction currentNodeDirection,
429
+ LayoutData& layoutMarkerData,
430
+ uint32_t currentDepth,
431
+ uint32_t generationCount,
432
+ float currentNodeLeftOffsetFromContainingBlock,
433
+ float currentNodeTopOffsetFromContainingBlock,
434
+ float containingNodeAvailableInnerWidth,
435
+ float containingNodeAvailableInnerHeight) {
436
+ bool hasNewLayout = false;
437
+ for (auto child : currentNode->getLayoutChildren()) {
438
+ if (child->style().display() == Display::None) {
439
+ continue;
440
+ } else if (child->style().positionType() == PositionType::Absolute) {
441
+ const bool absoluteErrata =
442
+ currentNode->hasErrata(Errata::AbsolutePercentAgainstInnerSize);
443
+ const float containingBlockWidth = absoluteErrata
444
+ ? containingNodeAvailableInnerWidth
445
+ : containingNode->getLayout().measuredDimension(Dimension::Width) -
446
+ containingNode->style().computeBorderForAxis(FlexDirection::Row);
447
+ const float containingBlockHeight = absoluteErrata
448
+ ? containingNodeAvailableInnerHeight
449
+ : containingNode->getLayout().measuredDimension(Dimension::Height) -
450
+ containingNode->style().computeBorderForAxis(
451
+ FlexDirection::Column);
452
+
453
+ layoutAbsoluteChild(
454
+ containingNode,
455
+ currentNode,
456
+ child,
457
+ containingBlockWidth,
458
+ containingBlockHeight,
459
+ widthSizingMode,
460
+ currentNodeDirection,
461
+ layoutMarkerData,
462
+ currentDepth,
463
+ generationCount);
464
+
465
+ hasNewLayout = hasNewLayout || child->getHasNewLayout();
466
+
467
+ /*
468
+ * At this point the child has its position set but only on its the
469
+ * parent's flexStart edge. Additionally, this position should be
470
+ * interpreted relative to the containing block of the child if it had
471
+ * insets defined. So we need to adjust the position by subtracting the
472
+ * the parents offset from the containing block. However, getting that
473
+ * offset is complicated since the two nodes can have different main/cross
474
+ * axes.
475
+ */
476
+ const FlexDirection parentMainAxis = resolveDirection(
477
+ currentNode->style().flexDirection(), currentNodeDirection);
478
+ const FlexDirection parentCrossAxis =
479
+ resolveCrossDirection(parentMainAxis, currentNodeDirection);
480
+
481
+ if (needsTrailingPosition(parentMainAxis)) {
482
+ const bool mainInsetsDefined = isRow(parentMainAxis)
483
+ ? child->style().horizontalInsetsDefined()
484
+ : child->style().verticalInsetsDefined();
485
+ setChildTrailingPosition(
486
+ mainInsetsDefined ? containingNode : currentNode,
487
+ child,
488
+ parentMainAxis);
489
+ }
490
+ if (needsTrailingPosition(parentCrossAxis)) {
491
+ const bool crossInsetsDefined = isRow(parentCrossAxis)
492
+ ? child->style().horizontalInsetsDefined()
493
+ : child->style().verticalInsetsDefined();
494
+ setChildTrailingPosition(
495
+ crossInsetsDefined ? containingNode : currentNode,
496
+ child,
497
+ parentCrossAxis);
498
+ }
499
+
500
+ /*
501
+ * At this point we know the left and top physical edges of the child are
502
+ * set with positions that are relative to the containing block if insets
503
+ * are defined
504
+ */
505
+ const float childLeftPosition =
506
+ child->getLayout().position(PhysicalEdge::Left);
507
+ const float childTopPosition =
508
+ child->getLayout().position(PhysicalEdge::Top);
509
+
510
+ const float childLeftOffsetFromParent =
511
+ child->style().horizontalInsetsDefined()
512
+ ? (childLeftPosition - currentNodeLeftOffsetFromContainingBlock)
513
+ : childLeftPosition;
514
+ const float childTopOffsetFromParent =
515
+ child->style().verticalInsetsDefined()
516
+ ? (childTopPosition - currentNodeTopOffsetFromContainingBlock)
517
+ : childTopPosition;
518
+
519
+ child->setLayoutPosition(childLeftOffsetFromParent, PhysicalEdge::Left);
520
+ child->setLayoutPosition(childTopOffsetFromParent, PhysicalEdge::Top);
521
+ } else if (
522
+ child->style().positionType() == PositionType::Static &&
523
+ !child->alwaysFormsContainingBlock()) {
524
+ // We may write new layout results for absolute descendants of "child"
525
+ // which are positioned relative to the current containing block instead
526
+ // of their parent. "child" may not be dirty, or have new constraints, so
527
+ // absolute positioning may be the first time during this layout pass that
528
+ // we need to mutate these descendents. Make sure the path of
529
+ // nodes to them is mutable before positioning.
530
+ child->cloneChildrenIfNeeded();
531
+ const Direction childDirection =
532
+ child->resolveDirection(currentNodeDirection);
533
+ // By now all descendants of the containing block that are not absolute
534
+ // will have their positions set for left and top.
535
+ const float childLeftOffsetFromContainingBlock =
536
+ currentNodeLeftOffsetFromContainingBlock +
537
+ child->getLayout().position(PhysicalEdge::Left);
538
+ const float childTopOffsetFromContainingBlock =
539
+ currentNodeTopOffsetFromContainingBlock +
540
+ child->getLayout().position(PhysicalEdge::Top);
541
+
542
+ hasNewLayout = layoutAbsoluteDescendants(
543
+ containingNode,
544
+ child,
545
+ widthSizingMode,
546
+ childDirection,
547
+ layoutMarkerData,
548
+ currentDepth + 1,
549
+ generationCount,
550
+ childLeftOffsetFromContainingBlock,
551
+ childTopOffsetFromContainingBlock,
552
+ containingNodeAvailableInnerWidth,
553
+ containingNodeAvailableInnerHeight) ||
554
+ hasNewLayout;
555
+
556
+ if (hasNewLayout) {
557
+ child->setHasNewLayout(hasNewLayout);
558
+ }
559
+ }
560
+ }
561
+ return hasNewLayout;
562
+ }
563
+ } // namespace facebook::yoga
@@ -0,0 +1,41 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ #include <yoga/event/event.h>
11
+ #include <yoga/node/Node.h>
12
+
13
+ namespace facebook::yoga {
14
+
15
+ void layoutAbsoluteChild(
16
+ const yoga::Node* containingNode,
17
+ const yoga::Node* node,
18
+ yoga::Node* child,
19
+ float containingBlockWidth,
20
+ float containingBlockHeight,
21
+ SizingMode widthMode,
22
+ Direction direction,
23
+ LayoutData& layoutMarkerData,
24
+ uint32_t depth,
25
+ uint32_t generationCount);
26
+
27
+ // Returns if some absolute descendant has new layout
28
+ bool layoutAbsoluteDescendants(
29
+ yoga::Node* containingNode,
30
+ yoga::Node* currentNode,
31
+ SizingMode widthSizingMode,
32
+ Direction currentNodeDirection,
33
+ LayoutData& layoutMarkerData,
34
+ uint32_t currentDepth,
35
+ uint32_t generationCount,
36
+ float currentNodeMainOffsetFromContainingBlock,
37
+ float currentNodeCrossOffsetFromContainingBlock,
38
+ float containingNodeAvailableInnerWidth,
39
+ float containingNodeAvailableInnerHeight);
40
+
41
+ } // namespace facebook::yoga
@@ -0,0 +1,72 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ #include <yoga/Yoga.h>
11
+
12
+ #include <yoga/algorithm/FlexDirection.h>
13
+ #include <yoga/node/Node.h>
14
+
15
+ namespace facebook::yoga {
16
+
17
+ inline Align resolveChildAlignment(
18
+ const yoga::Node* node,
19
+ const yoga::Node* child) {
20
+ const Align align = child->style().alignSelf() == Align::Auto
21
+ ? node->style().alignItems()
22
+ : child->style().alignSelf();
23
+ if (align == Align::Baseline && isColumn(node->style().flexDirection())) {
24
+ return Align::FlexStart;
25
+ }
26
+ return align;
27
+ }
28
+
29
+ /**
30
+ * Fallback alignment to use on overflow
31
+ * https://www.w3.org/TR/css-align-3/#distribution-values
32
+ */
33
+ constexpr Align fallbackAlignment(Align align) {
34
+ switch (align) {
35
+ // Fallback to flex-start
36
+ case Align::SpaceBetween:
37
+ case Align::Stretch:
38
+ return Align::FlexStart;
39
+
40
+ // Fallback to safe center. TODO (T208209388): This should be aligned to
41
+ // Start instead of FlexStart (for row-reverse containers)
42
+ case Align::SpaceAround:
43
+ case Align::SpaceEvenly:
44
+ return Align::FlexStart;
45
+ default:
46
+ return align;
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Fallback alignment to use on overflow
52
+ * https://www.w3.org/TR/css-align-3/#distribution-values
53
+ */
54
+ constexpr Justify fallbackAlignment(Justify align) {
55
+ switch (align) {
56
+ // Fallback to flex-start
57
+ case Justify::SpaceBetween:
58
+ // TODO: Support `justify-content: stretch`
59
+ // case Justify::Stretch:
60
+ return Justify::FlexStart;
61
+
62
+ // Fallback to safe center. TODO (T208209388): This should be aligned to
63
+ // Start instead of FlexStart (for row-reverse containers)
64
+ case Justify::SpaceAround:
65
+ case Justify::SpaceEvenly:
66
+ return Justify::FlexStart;
67
+ default:
68
+ return align;
69
+ }
70
+ }
71
+
72
+ } // namespace facebook::yoga