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,518 @@
1
+ """Container factories: ``View``, ``Column``, ``Row``, ``Spacer``, ``ScrollView``, and the inset-aware wrappers.
2
+
3
+ ``SafeAreaView`` and ``KeyboardAvoidingView`` are thin factories over
4
+ hook-driven composites (``_SafeAreaContainer`` and
5
+ ``_KeyboardAvoidingContainer``) that subscribe to the platform metrics
6
+ and re-render when the insets or keyboard height change.
7
+ """
8
+
9
+ from typing import Any, Callable, Dict, List, Literal, Optional, Tuple, Union
10
+
11
+ from ..component import component
12
+ from ..element import Element
13
+ from ..hooks import Ref, use_keyboard_height, use_safe_area_insets, use_state
14
+ from ..style import AccessibilityState, StyleProp, resolve_style
15
+ from ._base import _make_element, _refresh_control_props
16
+
17
+
18
+ def View(
19
+ *children: Element,
20
+ style: StyleProp = None,
21
+ gestures: Optional[List[Any]] = None,
22
+ hit_slop: Optional[Union[float, Dict[str, float]]] = None,
23
+ on_layout: Optional[Callable[[Dict[str, float]], None]] = None,
24
+ accessibility_label: Optional[str] = None,
25
+ accessibility_hint: Optional[str] = None,
26
+ accessibility_role: Optional[str] = None,
27
+ accessible: Optional[bool] = None,
28
+ accessibility_state: Optional[AccessibilityState] = None,
29
+ accessibility_live_region: Optional[Literal["none", "polite", "assertive"]] = None,
30
+ test_id: Optional[str] = None,
31
+ ref: Optional[Ref] = None,
32
+ key: Optional[str] = None,
33
+ ) -> Element:
34
+ """Universal flex container (like React Native's ``View``).
35
+
36
+ Defaults to ``flex_direction: "column"`` (override via ``style``).
37
+
38
+ Flex container properties (passed via ``style``):
39
+
40
+ - ``flex_direction``: ``"column"`` (default), ``"row"``,
41
+ ``"column_reverse"``, ``"row_reverse"``.
42
+ - ``flex_wrap``: ``"nowrap"`` (default), ``"wrap"``,
43
+ ``"wrap_reverse"``, with ``align_content`` controlling how
44
+ wrapped lines share leftover cross-axis space.
45
+ - ``justify_content``: main-axis distribution. Accepts
46
+ ``"flex_start"`` (default), ``"center"``, ``"flex_end"``,
47
+ ``"space_between"``, ``"space_around"``, ``"space_evenly"``.
48
+ - ``align_items``: cross-axis alignment. Accepts ``"stretch"``
49
+ (default), ``"flex_start"``, ``"center"``, ``"flex_end"``.
50
+ - ``direction``: ``"ltr"`` (default) or ``"rtl"``. Flips rows and
51
+ resolves ``margin_start`` / ``padding_end`` / absolute ``start``
52
+ / ``end`` insets.
53
+ - ``overflow``: ``"visible"`` (default) or ``"hidden"``.
54
+ - ``spacing`` (alias ``gap``; per-axis ``row_gap`` /
55
+ ``column_gap``), ``padding``, ``background_color``,
56
+ ``border_radius``, ``border_width``, ``border_color``,
57
+ ``shadow_color``, ``shadow_offset``, ``shadow_opacity``,
58
+ ``shadow_radius``, ``elevation``, ``opacity``, ``transform``.
59
+
60
+ Args:
61
+ *children: Child elements rendered inside the container.
62
+ style: Style dict (or list of dicts).
63
+ gestures: Optional list of gesture descriptors from
64
+ `pythonnative.gestures` (e.g. ``[gestures.Pan(on_change=…)]``)
65
+ recognized natively on this view.
66
+ hit_slop: Extend the touch target beyond the view's bounds
67
+ without changing layout: a uniform number of points, or a
68
+ dict with any of ``top`` / ``left`` / ``bottom`` /
69
+ ``right``.
70
+ on_layout: Callback invoked with
71
+ ``{"x", "y", "width", "height"}`` after this view is laid
72
+ out, and again whenever its frame changes.
73
+ accessibility_label: Spoken description for screen readers.
74
+ accessibility_hint: Spoken extra detail (iOS only).
75
+ accessibility_role: Semantic role for assistive tech.
76
+ accessible: Override whether the element is exposed to AT.
77
+ accessibility_state: Current widget state for assistive tech,
78
+ e.g. ``{"disabled": True, "selected": False}``. Recognized
79
+ keys: ``disabled``, ``selected``, ``checked``, ``busy``,
80
+ ``expanded``.
81
+ accessibility_live_region: How AT announces dynamic changes to
82
+ this view: ``"none"``, ``"polite"``, or ``"assertive"``
83
+ (Android only).
84
+ test_id: Stable identifier for UI tests; exposed as
85
+ ``resource-id`` on Android and ``accessibilityIdentifier``
86
+ on iOS.
87
+ ref: Optional [`Ref`][pythonnative.Ref] from ``use_ref()``.
88
+ key: Stable identity for keyed reconciliation.
89
+
90
+ Returns:
91
+ An [`Element`][pythonnative.Element] of type ``"View"``.
92
+ """
93
+ return _make_element(
94
+ "View",
95
+ *children,
96
+ style=style,
97
+ ref=ref,
98
+ key=key,
99
+ gestures=gestures,
100
+ hit_slop=hit_slop,
101
+ on_layout=on_layout,
102
+ accessibility_label=accessibility_label,
103
+ accessibility_hint=accessibility_hint,
104
+ accessibility_role=accessibility_role,
105
+ accessible=accessible,
106
+ accessibility_state=accessibility_state,
107
+ accessibility_live_region=accessibility_live_region,
108
+ test_id=test_id,
109
+ _defaults={"flex_direction": "column"},
110
+ )
111
+
112
+
113
+ def Column(
114
+ *children: Element,
115
+ style: StyleProp = None,
116
+ gestures: Optional[List[Any]] = None,
117
+ hit_slop: Optional[Union[float, Dict[str, float]]] = None,
118
+ on_layout: Optional[Callable[[Dict[str, float]], None]] = None,
119
+ accessibility_label: Optional[str] = None,
120
+ accessibility_hint: Optional[str] = None,
121
+ accessibility_role: Optional[str] = None,
122
+ accessible: Optional[bool] = None,
123
+ accessibility_state: Optional[AccessibilityState] = None,
124
+ accessibility_live_region: Optional[Literal["none", "polite", "assertive"]] = None,
125
+ test_id: Optional[str] = None,
126
+ ref: Optional[Ref] = None,
127
+ key: Optional[str] = None,
128
+ ) -> Element:
129
+ """Arrange children vertically.
130
+
131
+ Convenience wrapper around [`View`][pythonnative.View] with
132
+ ``flex_direction`` locked to ``"column"``. Use ``View`` directly if
133
+ you need to switch between row and column at runtime.
134
+
135
+ Accepts every [`View`][pythonnative.View] prop (gestures, hit slop,
136
+ accessibility, ``test_id``); only ``flex_direction`` is fixed.
137
+
138
+ Args:
139
+ *children: Child elements stacked top to bottom.
140
+ style: Style dict (or list of dicts).
141
+ gestures: Gesture descriptors recognized natively on this view.
142
+ hit_slop: Extra touch target beyond the bounds (see ``View``).
143
+ on_layout: Callback invoked with
144
+ ``{"x", "y", "width", "height"}`` after layout and on
145
+ frame changes.
146
+ accessibility_label: Spoken description for screen readers.
147
+ accessibility_hint: Spoken extra detail (iOS only).
148
+ accessibility_role: Semantic role for assistive tech.
149
+ accessible: Override whether the element is exposed to AT.
150
+ accessibility_state: Current widget state for assistive tech.
151
+ accessibility_live_region: How AT announces dynamic changes
152
+ (Android only).
153
+ test_id: Stable identifier for UI tests.
154
+ ref: Optional [`Ref`][pythonnative.Ref] for native-view access.
155
+ key: Stable identity for keyed reconciliation.
156
+
157
+ Returns:
158
+ An [`Element`][pythonnative.Element] of type ``"Column"``.
159
+ """
160
+ return _make_element(
161
+ "Column",
162
+ *children,
163
+ style=style,
164
+ ref=ref,
165
+ key=key,
166
+ gestures=gestures,
167
+ hit_slop=hit_slop,
168
+ on_layout=on_layout,
169
+ accessibility_label=accessibility_label,
170
+ accessibility_hint=accessibility_hint,
171
+ accessibility_role=accessibility_role,
172
+ accessible=accessible,
173
+ accessibility_state=accessibility_state,
174
+ accessibility_live_region=accessibility_live_region,
175
+ test_id=test_id,
176
+ _forced={"flex_direction": "column"},
177
+ )
178
+
179
+
180
+ def Row(
181
+ *children: Element,
182
+ style: StyleProp = None,
183
+ gestures: Optional[List[Any]] = None,
184
+ hit_slop: Optional[Union[float, Dict[str, float]]] = None,
185
+ on_layout: Optional[Callable[[Dict[str, float]], None]] = None,
186
+ accessibility_label: Optional[str] = None,
187
+ accessibility_hint: Optional[str] = None,
188
+ accessibility_role: Optional[str] = None,
189
+ accessible: Optional[bool] = None,
190
+ accessibility_state: Optional[AccessibilityState] = None,
191
+ accessibility_live_region: Optional[Literal["none", "polite", "assertive"]] = None,
192
+ test_id: Optional[str] = None,
193
+ ref: Optional[Ref] = None,
194
+ key: Optional[str] = None,
195
+ ) -> Element:
196
+ """Arrange children horizontally.
197
+
198
+ Convenience wrapper around [`View`][pythonnative.View] with
199
+ ``flex_direction`` locked to ``"row"``. Use ``View`` directly if you
200
+ need to switch between row and column at runtime.
201
+
202
+ Accepts every [`View`][pythonnative.View] prop (gestures, hit slop,
203
+ accessibility, ``test_id``); only ``flex_direction`` is fixed.
204
+
205
+ Args:
206
+ *children: Child elements arranged left to right.
207
+ style: Style dict (or list of dicts).
208
+ gestures: Gesture descriptors recognized natively on this view.
209
+ hit_slop: Extra touch target beyond the bounds (see ``View``).
210
+ on_layout: Callback invoked with
211
+ ``{"x", "y", "width", "height"}`` after layout and on
212
+ frame changes.
213
+ accessibility_label: Spoken description for screen readers.
214
+ accessibility_hint: Spoken extra detail (iOS only).
215
+ accessibility_role: Semantic role for assistive tech.
216
+ accessible: Override whether the element is exposed to AT.
217
+ accessibility_state: Current widget state for assistive tech.
218
+ accessibility_live_region: How AT announces dynamic changes
219
+ (Android only).
220
+ test_id: Stable identifier for UI tests.
221
+ ref: Optional [`Ref`][pythonnative.Ref] for native-view access.
222
+ key: Stable identity for keyed reconciliation.
223
+
224
+ Returns:
225
+ An [`Element`][pythonnative.Element] of type ``"Row"``.
226
+ """
227
+ return _make_element(
228
+ "Row",
229
+ *children,
230
+ style=style,
231
+ ref=ref,
232
+ key=key,
233
+ gestures=gestures,
234
+ hit_slop=hit_slop,
235
+ on_layout=on_layout,
236
+ accessibility_label=accessibility_label,
237
+ accessibility_hint=accessibility_hint,
238
+ accessibility_role=accessibility_role,
239
+ accessible=accessible,
240
+ accessibility_state=accessibility_state,
241
+ accessibility_live_region=accessibility_live_region,
242
+ test_id=test_id,
243
+ _forced={"flex_direction": "row"},
244
+ )
245
+
246
+
247
+ def Spacer(
248
+ *,
249
+ size: Optional[float] = None,
250
+ flex: Optional[float] = None,
251
+ key: Optional[str] = None,
252
+ ) -> Element:
253
+ """Insert empty space inside a flex container.
254
+
255
+ Pass ``size`` for a fixed gap, or ``flex`` to expand and absorb
256
+ remaining space.
257
+
258
+ Args:
259
+ size: Fixed gap in dp/pt along the parent's main axis. Mirrored
260
+ on both axes: whichever axis the parent's
261
+ ``flex_direction`` chooses as main becomes the actual gap.
262
+ flex: Flex-grow weight; useful for pushing siblings to the
263
+ opposite end of a [`Row`][pythonnative.Row] or
264
+ [`Column`][pythonnative.Column].
265
+ key: Stable identity for keyed reconciliation.
266
+
267
+ Returns:
268
+ An [`Element`][pythonnative.Element] of type ``"Spacer"``.
269
+ """
270
+ width = size if size is not None else None
271
+ height = size if size is not None else None
272
+ return _make_element(
273
+ "Spacer",
274
+ key=key,
275
+ size=size,
276
+ width=width,
277
+ height=height,
278
+ flex=flex,
279
+ )
280
+
281
+
282
+ def ScrollView(
283
+ *children: Element,
284
+ refresh_control: Optional[Element] = None,
285
+ scroll_axis: Optional[Literal["vertical", "horizontal"]] = None,
286
+ on_scroll: Optional[Callable[[Dict[str, float]], None]] = None,
287
+ shows_scroll_indicator: bool = True,
288
+ paging_enabled: bool = False,
289
+ bounces: bool = True,
290
+ content_container_style: StyleProp = None,
291
+ keyboard_dismiss_mode: Optional[Literal["none", "on_drag", "interactive"]] = None,
292
+ style: StyleProp = None,
293
+ ref: Optional[Ref] = None,
294
+ key: Optional[str] = None,
295
+ ) -> Element:
296
+ """Wrap children in a scrollable container.
297
+
298
+ ``ScrollView`` typically takes a single child (a ``Column`` or
299
+ ``Row`` aggregating the scrollable content). It accepts ``*children``
300
+ for ergonomic call sites; the underlying native scroll view stacks
301
+ them on its content axis.
302
+
303
+ Args:
304
+ *children: Child elements to scroll.
305
+ refresh_control: Optional [`RefreshControl`][pythonnative.RefreshControl]
306
+ element attached to the scroll view for pull-to-refresh.
307
+ scroll_axis: ``"vertical"`` (default) or ``"horizontal"``.
308
+ on_scroll: Callback invoked with ``{"x": …, "y": …}`` content
309
+ offsets as the user scrolls.
310
+ shows_scroll_indicator: When ``False``, hides the scroll bar.
311
+ paging_enabled: When ``True``, the scroll view snaps to
312
+ multiples of its own size (carousel behavior).
313
+ bounces: When ``False``, disables the iOS rubber-band overscroll.
314
+ content_container_style: Style applied to the inner content
315
+ wrapper (padding, alignment, spacing of the scrollable
316
+ content), distinct from ``style`` (the scroll view frame).
317
+ keyboard_dismiss_mode: ``"none"`` (default), ``"on_drag"``, or
318
+ ``"interactive"``. Controls whether scrolling dismisses
319
+ the keyboard.
320
+ style: Style dict (or list of dicts).
321
+ ref: Optional [`Ref`][pythonnative.Ref] from ``use_ref()``.
322
+ key: Stable identity for keyed reconciliation.
323
+
324
+ Returns:
325
+ An [`Element`][pythonnative.Element] of type ``"ScrollView"``.
326
+ """
327
+ return _make_element(
328
+ "ScrollView",
329
+ *children,
330
+ style=style,
331
+ ref=ref,
332
+ key=key,
333
+ refresh_control=_refresh_control_props(refresh_control, owner="ScrollView"),
334
+ scroll_axis=scroll_axis,
335
+ on_scroll=on_scroll,
336
+ shows_scroll_indicator=False if shows_scroll_indicator is False else None,
337
+ paging_enabled=paging_enabled or None,
338
+ bounces=False if bounces is False else None,
339
+ content_container_style=resolve_style(content_container_style) or None,
340
+ keyboard_dismiss_mode=keyboard_dismiss_mode,
341
+ )
342
+
343
+
344
+ # ======================================================================
345
+ # SafeAreaView
346
+ # ======================================================================
347
+
348
+ _SAFE_AREA_EDGES: Tuple[str, ...] = ("top", "left", "bottom", "right")
349
+
350
+
351
+ def _numeric_edge_padding(style: Dict[str, Any], edge: str) -> float:
352
+ """Return the numeric padding already declared for ``edge`` in ``style``.
353
+
354
+ Only numeric values participate; percentage strings and dict
355
+ shorthands are left alone (the inset simply overrides them for
356
+ that edge). Resolution order matches the layout engine:
357
+ ``padding_{edge}`` beats the axis shorthand, which beats
358
+ ``padding``.
359
+ """
360
+ axis_key = "padding_vertical" if edge in ("top", "bottom") else "padding_horizontal"
361
+ for key in (f"padding_{edge}", axis_key, "padding"):
362
+ value = style.get(key)
363
+ if isinstance(value, (int, float)) and not isinstance(value, bool):
364
+ return float(value)
365
+ return 0.0
366
+
367
+
368
+ @component
369
+ def _SafeAreaContainer(
370
+ *children: Element,
371
+ edges: Optional[Tuple[str, ...]] = None,
372
+ style: Optional[Dict[str, Any]] = None,
373
+ ) -> Element:
374
+ """Hook-driven body of `SafeAreaView`.
375
+
376
+ Reads the live insets via
377
+ [`use_safe_area_insets`][pythonnative.use_safe_area_insets] (so the
378
+ subtree re-renders when the platform publishes new values, e.g. on
379
+ rotation) and adds each selected edge's inset on top of any padding
380
+ the user declared for that edge.
381
+ """
382
+ insets = use_safe_area_insets()
383
+ resolved: Dict[str, Any] = dict(style or {})
384
+ selected = edges or _SAFE_AREA_EDGES
385
+ for edge in _SAFE_AREA_EDGES:
386
+ if edge not in selected:
387
+ continue
388
+ inset = float(getattr(insets, edge, 0.0) or 0.0)
389
+ if inset > 0:
390
+ resolved[f"padding_{edge}"] = _numeric_edge_padding(resolved, edge) + inset
391
+ return Element("SafeAreaView", resolved, list(children))
392
+
393
+
394
+ def SafeAreaView(
395
+ *children: Element,
396
+ edges: Optional[Tuple[Literal["top", "left", "bottom", "right"], ...]] = None,
397
+ style: StyleProp = None,
398
+ key: Optional[str] = None,
399
+ ) -> Element:
400
+ """Container that respects safe-area insets (notch, status bar, home indicator).
401
+
402
+ Applies the platform-reported insets as extra padding on the
403
+ selected edges and re-renders automatically when the insets change
404
+ (rotation, split view). User padding on an inset edge is added to
405
+ the inset, matching ``react-native-safe-area-context``.
406
+
407
+ Args:
408
+ *children: Child elements that should avoid system UI overlays.
409
+ edges: Which edges to pad; defaults to all four.
410
+ style: Style dict (or list of dicts).
411
+ key: Stable identity for keyed reconciliation.
412
+
413
+ Returns:
414
+ An [`Element`][pythonnative.Element] that renders a
415
+ ``"SafeAreaView"`` container.
416
+ """
417
+ return _SafeAreaContainer(
418
+ *children,
419
+ edges=tuple(edges) if edges else None,
420
+ style=resolve_style(style),
421
+ ).with_key(key)
422
+
423
+
424
+ # ======================================================================
425
+ # KeyboardAvoidingView
426
+ # ======================================================================
427
+
428
+
429
+ @component
430
+ def _KeyboardAvoidingContainer(
431
+ *children: Element,
432
+ behavior: Literal["padding", "position", "height"] = "padding",
433
+ keyboard_vertical_offset: float = 0.0,
434
+ style: Optional[Dict[str, Any]] = None,
435
+ ) -> Element:
436
+ """Hook-driven body of `KeyboardAvoidingView`.
437
+
438
+ Subscribes to the platform-reported keyboard height via
439
+ [`use_keyboard_height`][pythonnative.use_keyboard_height] and
440
+ applies the shift according to ``behavior``:
441
+
442
+ - ``"padding"``: adds the shift as bottom padding, resizing the
443
+ content area (the default, and the right choice for forms
444
+ inside a full-height container).
445
+ - ``"position"``: translates the whole container upward without
446
+ resizing it (useful for pinned footers/toolbars).
447
+ - ``"height"``: shrinks the container's own height by the shift.
448
+ The resting height is captured via ``on_layout`` while the
449
+ keyboard is hidden, so flex-sized containers work too.
450
+ """
451
+ keyboard = use_keyboard_height()
452
+ base_height, set_base_height = use_state(0.0)
453
+ mode = behavior or "padding"
454
+ offset = float(keyboard_vertical_offset or 0.0)
455
+ shift = max(0.0, keyboard - offset) if keyboard > 0 else 0.0
456
+ resolved: Dict[str, Any] = dict(style or {})
457
+ props: Dict[str, Any] = resolved
458
+ if mode == "height":
459
+
460
+ def _record_layout(frame: Dict[str, float]) -> None:
461
+ if keyboard <= 0:
462
+ measured = float(frame.get("height", 0.0))
463
+ if measured > 0 and abs(measured - base_height) > 0.5:
464
+ set_base_height(measured)
465
+
466
+ props = dict(resolved)
467
+ props["on_layout"] = _record_layout
468
+ if shift > 0 and base_height > 0:
469
+ props["height"] = max(0.0, base_height - shift)
470
+ elif shift > 0:
471
+ if mode == "position":
472
+ transform = list(resolved.get("transform") or [])
473
+ transform.append({"translate_y": -shift})
474
+ resolved["transform"] = transform
475
+ else:
476
+ resolved["padding_bottom"] = _numeric_edge_padding(resolved, "bottom") + shift
477
+ return Element("KeyboardAvoidingView", props, list(children))
478
+
479
+
480
+ def KeyboardAvoidingView(
481
+ *children: Element,
482
+ behavior: Literal["padding", "position", "height"] = "padding",
483
+ keyboard_vertical_offset: float = 0.0,
484
+ style: StyleProp = None,
485
+ key: Optional[str] = None,
486
+ ) -> Element:
487
+ """Wrap content that should shift up when the keyboard is shown.
488
+
489
+ Subscribes to the platform-reported keyboard height (via
490
+ [`use_keyboard_height`][pythonnative.use_keyboard_height]
491
+ internally) and shifts its content so the focused text input stays
492
+ visible. On iOS the height comes from
493
+ ``UIKeyboardWillShowNotification``; on Android from the window's
494
+ IME insets.
495
+
496
+ Args:
497
+ *children: Children rendered inside the avoiding container.
498
+ behavior: ``"padding"`` (adds bottom padding, resizing the
499
+ content), ``"position"`` (translates the container upward
500
+ without resizing), or ``"height"`` (shrinks the
501
+ container's height by the keyboard overlap, matching
502
+ React Native's ``"height"`` behavior).
503
+ keyboard_vertical_offset: Distance in layout units already
504
+ covered by other UI (e.g. a nav bar); subtracted from the
505
+ keyboard height before applying the shift.
506
+ style: Style dict (or list of dicts).
507
+ key: Stable identity for keyed reconciliation.
508
+
509
+ Returns:
510
+ An [`Element`][pythonnative.Element] that renders a
511
+ ``"KeyboardAvoidingView"`` container.
512
+ """
513
+ return _KeyboardAvoidingContainer(
514
+ *children,
515
+ behavior=behavior,
516
+ keyboard_vertical_offset=keyboard_vertical_offset,
517
+ style=resolve_style(style),
518
+ ).with_key(key)