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,271 @@
1
+ """The ``@component`` decorator and the [`Component`][pythonnative.Component] type.
2
+
3
+ A component is a plain Python function that takes props and returns a
4
+ [`Node`][pythonnative.element.Node]: an [`Element`][pythonnative.Element],
5
+ a list of elements, or ``None``. Decorating it with
6
+ [`@component`][pythonnative.component.component] turns it into a
7
+ [`Component`][pythonnative.Component]: a callable that *describes* a
8
+ render (it returns an ``Element`` whose ``type`` is the component)
9
+ instead of performing one. The reconciler invokes the function body
10
+ later, with hook state installed.
11
+
12
+ The decorator preserves the function's signature for type checkers via
13
+ :class:`typing.ParamSpec`, so ``Greeting(nme="x")`` is a static error
14
+ and editors autocomplete props from the function definition.
15
+
16
+ Children
17
+ --------
18
+
19
+ Children are positional. A component that accepts children declares a
20
+ ``*children`` parameter, exactly like the built-in containers:
21
+
22
+ ```python
23
+ @pn.component
24
+ def Card(*children: pn.Element, title: str = "") -> pn.Element:
25
+ return pn.Column(pn.Text(title, style=pn.style(bold=True)), *children)
26
+
27
+ Card(pn.Text("body"), title="Hello")
28
+ ```
29
+
30
+ Positional arguments to a component *without* ``*children`` bind to its
31
+ positional parameters, so ``Greeting("World")`` works for
32
+ ``def Greeting(name: str)``.
33
+
34
+ Keys
35
+ ----
36
+
37
+ Every component accepts ``key=`` at the call site for keyed
38
+ reconciliation. ``key`` is consumed by the framework and is not passed
39
+ to the function unless the function declares a ``key`` parameter
40
+ itself. Declaring it (``key: str | None = None``) is the way to keep
41
+ strict type checkers happy when a component is rendered in a list;
42
+ otherwise use [`Element.with_key`][pythonnative.element.Element.with_key].
43
+ """
44
+
45
+ from __future__ import annotations
46
+
47
+ import functools
48
+ import inspect
49
+ from typing import Any, Awaitable, Callable, Dict, Generic, List, Optional, ParamSpec, Tuple, Union, overload
50
+
51
+ from .element import Element, Node
52
+
53
+ __all__ = ["Component", "RenderFn", "component", "memo", "is_component"]
54
+
55
+ P = ParamSpec("P")
56
+
57
+ RenderFn = Callable[P, Union[Node, Awaitable[Node]]]
58
+ """A component body: returns a [`Node`][pythonnative.element.Node], or awaits one when ``async def``."""
59
+
60
+
61
+ class Component(Generic[P]):
62
+ """A render-function wrapped by [`@component`][pythonnative.component.component].
63
+
64
+ Calling a ``Component`` does not run the function; it returns an
65
+ [`Element`][pythonnative.Element] describing the call so the
66
+ reconciler can mount it, preserve its hook state across renders,
67
+ and re-run it when its state or props change.
68
+
69
+ Attributes:
70
+ fn: The original render function.
71
+ display_name: Name shown in diagnostics and dev tooling
72
+ (defaults to ``fn.__name__``).
73
+ memoized: Whether [`memo`][pythonnative.memo] was applied, in
74
+ which case the reconciler skips re-rendering this component
75
+ when its props are shallowly equal to the previous render.
76
+ accepts_children: Whether ``fn`` declares ``*children``.
77
+ """
78
+
79
+ __slots__ = (
80
+ "fn",
81
+ "display_name",
82
+ "memoized",
83
+ "props_equal",
84
+ "accepts_children",
85
+ "_positional",
86
+ "_declares_key",
87
+ "_is_async",
88
+ "refresh_signature",
89
+ "__wrapped__",
90
+ "__dict__",
91
+ )
92
+
93
+ def __init__(self, fn: RenderFn[P], *, display_name: Optional[str] = None) -> None:
94
+ if isinstance(fn, Component):
95
+ raise TypeError(f"{fn!r} is already a component; remove the duplicate @component")
96
+ sig = inspect.signature(fn)
97
+ positional: List[str] = []
98
+ accepts_children = False
99
+ declares_key = False
100
+ for name, param in sig.parameters.items():
101
+ if param.kind in (inspect.Parameter.POSITIONAL_ONLY, inspect.Parameter.POSITIONAL_OR_KEYWORD):
102
+ positional.append(name)
103
+ elif param.kind is inspect.Parameter.VAR_POSITIONAL:
104
+ accepts_children = True
105
+ if name == "key":
106
+ declares_key = True
107
+ from .refresh import hook_signature
108
+
109
+ self.refresh_signature = hook_signature(fn)
110
+ self.fn = fn
111
+ self.display_name = display_name or getattr(fn, "__name__", "Component")
112
+ self.memoized = False
113
+ self.props_equal: Optional[Callable[[Dict[str, Any], Dict[str, Any]], bool]] = None
114
+ self.accepts_children = accepts_children
115
+ self._positional: Tuple[str, ...] = tuple(positional)
116
+ self._declares_key = declares_key
117
+ self._is_async = inspect.iscoroutinefunction(fn)
118
+ self.__wrapped__ = fn
119
+ functools.update_wrapper(self, fn, updated=())
120
+
121
+ # ------------------------------------------------------------------
122
+ # Element construction
123
+ # ------------------------------------------------------------------
124
+
125
+ def __call__(self, *args: P.args, **kwargs: P.kwargs) -> Element:
126
+ """Describe a render of this component with the given props."""
127
+ props: Dict[str, Any] = dict(kwargs)
128
+ key = props.pop("key", None) if not self._declares_key else props.get("key")
129
+ children: List[Any] = []
130
+ if args:
131
+ if self.accepts_children:
132
+ children = list(args)
133
+ else:
134
+ names = self._positional
135
+ if len(args) > len(names):
136
+ raise TypeError(
137
+ f"{self.display_name}() takes {len(names)} positional argument(s) but "
138
+ f"{len(args)} were given. Declare *children to accept child elements."
139
+ )
140
+ for name, value in zip(names, args):
141
+ if name in props:
142
+ raise TypeError(f"{self.display_name}() got multiple values for argument {name!r}")
143
+ props[name] = value
144
+ return Element(self, props, children, key=key if isinstance(key, str) or key is None else str(key))
145
+
146
+ # ------------------------------------------------------------------
147
+ # Rendering (used by the reconciler)
148
+ # ------------------------------------------------------------------
149
+
150
+ def render(self, element: Element) -> Any:
151
+ """Invoke the render function for ``element``.
152
+
153
+ Children stored on the element are passed positionally; props
154
+ are passed by keyword. Returns whatever the function returned
155
+ (an element, a list, ``None``, or a coroutine for ``async def``
156
+ bodies).
157
+ """
158
+ if self.accepts_children:
159
+ return self.fn(*element.children, **element.props)
160
+ return self.fn(**element.props) # type: ignore[call-arg]
161
+
162
+ @property
163
+ def is_async(self) -> bool:
164
+ """Whether the render function is an ``async def``."""
165
+ return self._is_async
166
+
167
+ def __repr__(self) -> str:
168
+ flags = " memo" if self.memoized else ""
169
+ return f"<Component {self.display_name}{flags}>"
170
+
171
+ def __get__(self, instance: Any, owner: Any = None) -> "Component[P]":
172
+ # Components stored on classes (rare) should not bind ``self``.
173
+ return self
174
+
175
+
176
+ def component(fn: RenderFn[P]) -> Component[P]:
177
+ """Turn a render function into a [`Component`][pythonnative.Component].
178
+
179
+ The decorated function may use hooks (``use_state``, ``use_effect``,
180
+ etc.) and returns an [`Element`][pythonnative.Element] tree, a list
181
+ of elements, or ``None``. Each call site creates an independent
182
+ component instance with its own hook state.
183
+
184
+ Args:
185
+ fn: The render function. May be ``async def``; the body is then
186
+ driven by the reconciler and suspends on pending awaits (see
187
+ [`Suspense`][pythonnative.Suspense]).
188
+
189
+ Returns:
190
+ A ``Component`` whose call signature mirrors ``fn`` (plus the
191
+ framework ``key=`` keyword).
192
+
193
+ Example:
194
+ ```python
195
+ import pythonnative as pn
196
+
197
+ @pn.component
198
+ def Greeting(name: str = "World"):
199
+ return pn.Text(f"Hello, {name}!")
200
+ ```
201
+ """
202
+ return Component(fn)
203
+
204
+
205
+ @overload
206
+ def memo(
207
+ target: Component[P], *, equal: Optional[Callable[[Dict[str, Any], Dict[str, Any]], bool]] = None
208
+ ) -> Component[P]: ...
209
+
210
+
211
+ @overload
212
+ def memo(
213
+ target: None = None, *, equal: Optional[Callable[[Dict[str, Any], Dict[str, Any]], bool]] = None
214
+ ) -> Callable[[Component[P]], Component[P]]: ...
215
+
216
+
217
+ def memo(
218
+ target: Optional[Component[P]] = None,
219
+ *,
220
+ equal: Optional[Callable[[Dict[str, Any], Dict[str, Any]], bool]] = None,
221
+ ) -> Any:
222
+ """Skip a component's render when its props haven't changed.
223
+
224
+ Apply on top of ``@component``. When the reconciler re-renders the
225
+ parent tree, a memoized child is skipped (its previously-rendered
226
+ subtree is reused) iff its props and children are equal to the
227
+ previous render and none of its own state setters fired. Props are
228
+ compared shallowly by default: callables by identity, everything
229
+ else by ``==``.
230
+
231
+ Pair with [`use_callback`][pythonnative.use_callback] when passing
232
+ callbacks as props, otherwise a fresh closure defeats the memo.
233
+
234
+ Args:
235
+ target: A [`Component`][pythonnative.Component].
236
+ equal: Optional custom comparator ``(old_props, new_props) ->
237
+ bool`` replacing the shallow comparison.
238
+
239
+ Returns:
240
+ The same component, marked for memoization (or a decorator when
241
+ called with keyword arguments only).
242
+
243
+ Example:
244
+ ```python
245
+ @pn.memo
246
+ @pn.component
247
+ def ExpensiveRow(label: str):
248
+ ...
249
+
250
+ @pn.memo(equal=lambda a, b: a["id"] == b["id"])
251
+ @pn.component
252
+ def Row(id: int, extra: dict):
253
+ ...
254
+ ```
255
+ """
256
+
257
+ def apply(comp: Component[P]) -> Component[P]:
258
+ if not isinstance(comp, Component):
259
+ raise TypeError("@memo must wrap a @component; write @memo above @component")
260
+ comp.memoized = True
261
+ comp.props_equal = equal
262
+ return comp
263
+
264
+ if target is None:
265
+ return apply
266
+ return apply(target)
267
+
268
+
269
+ def is_component(obj: Any) -> bool:
270
+ """Return whether ``obj`` is a [`Component`][pythonnative.Component]."""
271
+ return isinstance(obj, Component)
@@ -0,0 +1,111 @@
1
+ """Built-in element factories.
2
+
3
+ Each factory function (``Text``, ``Button``, …) is a fully-typed thin
4
+ wrapper that builds an [`Element`][pythonnative.Element] through the
5
+ shared ``_make_element`` helper, so style resolution, ``ref``
6
+ attachment, ``None``-default dropping, and forced overrides (e.g.
7
+ ``Column``'s fixed ``flex_direction``) live in exactly one place. The
8
+ factory signatures themselves are the canonical prop schemas: editors
9
+ and type checkers validate calls directly against them.
10
+
11
+ The factories are grouped by concern into submodules (``text``,
12
+ ``media``, ``controls``, ``layout``, ``pressable``, ``overlays``,
13
+ ``structural``, ``lists``); everything public is re-exported here, so
14
+ ``from pythonnative.components import Text`` keeps working.
15
+
16
+ Example:
17
+ ```python
18
+ import pythonnative as pn
19
+
20
+ pn.Column(
21
+ pn.Text("Hello", style=pn.style(font_size=18)),
22
+ pn.Button("Tap", on_press=lambda: print("tapped")),
23
+ style=pn.style(spacing=12, padding=16),
24
+ )
25
+ ```
26
+ """
27
+
28
+ from ._base import _SPAN_STYLE_KEYS, _flatten_text_spans, _make_element # noqa: F401
29
+ from .controls import (
30
+ ActivityIndicator,
31
+ Checkbox,
32
+ DatePicker,
33
+ Picker,
34
+ ProgressBar,
35
+ RefreshControl,
36
+ SegmentedControl,
37
+ Slider,
38
+ StatusBar,
39
+ Switch,
40
+ )
41
+ from .layout import ( # noqa: F401
42
+ _SAFE_AREA_EDGES,
43
+ Column,
44
+ KeyboardAvoidingView,
45
+ Row,
46
+ SafeAreaView,
47
+ ScrollView,
48
+ Spacer,
49
+ View,
50
+ _KeyboardAvoidingContainer,
51
+ _numeric_edge_padding,
52
+ _SafeAreaContainer,
53
+ )
54
+ from .lists import ( # noqa: F401
55
+ _DEFAULT_ROW_EXTENT,
56
+ FlatList,
57
+ ListController,
58
+ SectionList,
59
+ _dispatch_scroll_command,
60
+ _native_lists_supported,
61
+ _NativeList,
62
+ _RowSpec,
63
+ _VirtualizedList,
64
+ )
65
+ from .media import Image, ImageBackground, WebView
66
+ from .overlays import Modal, Portal
67
+ from .pressable import Pressable, TouchableOpacity, _StatefulPressable # noqa: F401
68
+ from .structural import ErrorBoundary, Fragment, Suspense
69
+ from .text import Button, Text, TextInput
70
+
71
+ __all__ = [
72
+ "ActivityIndicator",
73
+ "Button",
74
+ "Checkbox",
75
+ "Column",
76
+ "DatePicker",
77
+ "ErrorBoundary",
78
+ "FlatList",
79
+ "Fragment",
80
+ "Image",
81
+ "ImageBackground",
82
+ "KeyboardAvoidingView",
83
+ "ListController",
84
+ "Modal",
85
+ "Picker",
86
+ "Portal",
87
+ "Pressable",
88
+ "ProgressBar",
89
+ "RefreshControl",
90
+ "Row",
91
+ "SafeAreaView",
92
+ "ScrollView",
93
+ "SectionList",
94
+ "SegmentedControl",
95
+ "Slider",
96
+ "Spacer",
97
+ "StatusBar",
98
+ "Suspense",
99
+ "Switch",
100
+ "Text",
101
+ "TextInput",
102
+ "TouchableOpacity",
103
+ "View",
104
+ "WebView",
105
+ ]
106
+
107
+ # Factories are the single source for Python signatures and native contracts.
108
+ from ..sdk.builtins import install as _install_native_contracts
109
+
110
+ _install_native_contracts(globals())
111
+ del _install_native_contracts
@@ -0,0 +1,166 @@
1
+ """Shared private helpers behind the built-in element factories.
2
+
3
+ Every factory in this package routes through :func:`_make_element`, so
4
+ style resolution, ``ref`` attachment, ``None``-default dropping, and
5
+ forced overrides live in exactly one place. The rich-text span
6
+ flattening used by ``Text`` also lives here so it can be shared.
7
+ """
8
+
9
+ from typing import Any, Dict, List, Optional, Tuple
10
+
11
+ from ..element import Element
12
+ from ..hooks import Ref
13
+ from ..style import StyleProp, resolve_style, validate_style_keys
14
+
15
+ # ======================================================================
16
+ # Canonical element builder
17
+ # ======================================================================
18
+
19
+
20
+ def _make_element(
21
+ name: str,
22
+ *children: Element,
23
+ style: StyleProp = None,
24
+ ref: Optional[Ref] = None,
25
+ key: Optional[str] = None,
26
+ _defaults: Optional[Dict[str, Any]] = None,
27
+ _forced: Optional[Dict[str, Any]] = None,
28
+ **props: Any,
29
+ ) -> Element:
30
+ """Build an [`Element`][pythonnative.Element] of type ``name``.
31
+
32
+ This is the single helper every built-in factory routes through, so
33
+ the cross-cutting concerns that used to be duplicated per component
34
+ live in one place:
35
+
36
+ 1. ``style`` is flattened via
37
+ [`resolve_style`][pythonnative.style.resolve_style] (list-of-dicts
38
+ and ``None`` both handled).
39
+ 2. ``_defaults`` are filled in for keys not already present (used for
40
+ things like ``View``'s default ``flex_direction: "column"`` that
41
+ a user style may legitimately override).
42
+ 3. ``**props`` are merged on top, with ``None`` values *dropped* so
43
+ optional kwargs don't pollute the prop dict.
44
+ 4. ``ref`` is attached under the reserved ``"ref"`` key.
45
+ 5. ``_forced`` overrides everything (used by ``Column`` / ``Row`` to
46
+ lock their flex direction regardless of user style).
47
+
48
+ Args:
49
+ name: Element type name (e.g. ``"Text"``).
50
+ *children: Child elements.
51
+ style: Style dict, list of dicts, or ``None``.
52
+ ref: Optional [`Ref`][pythonnative.Ref] from ``use_ref()``; the
53
+ reconciler populates ``ref.current`` with the underlying
54
+ native view.
55
+ key: Stable identity for keyed reconciliation.
56
+ _defaults: Internal: fill-only-if-missing prop defaults.
57
+ _forced: Internal: prop overrides applied last.
58
+ **props: Per-component props. ``None`` values are dropped.
59
+
60
+ Returns:
61
+ A fresh [`Element`][pythonnative.Element].
62
+ """
63
+ from ..sdk.builtins import validate_props
64
+
65
+ validate_props(name, props)
66
+ out: Dict[str, Any] = dict(resolve_style(style))
67
+ if out:
68
+ validate_style_keys(out, owner=name)
69
+ if _defaults:
70
+ for k, v in _defaults.items():
71
+ out.setdefault(k, v)
72
+ for k, v in props.items():
73
+ if v is not None:
74
+ out[k] = v
75
+ if ref is not None:
76
+ out["ref"] = ref
77
+ if _forced:
78
+ out.update(_forced)
79
+ return Element(name, out, list(children), key=key)
80
+
81
+
82
+ # ======================================================================
83
+ # RefreshControl attachment
84
+ # ======================================================================
85
+
86
+ REFRESH_CONTROL_TYPE = "RefreshControl"
87
+ """Element type produced by [`RefreshControl`][pythonnative.RefreshControl]."""
88
+
89
+
90
+ def _refresh_control_props(control: Optional[Element], *, owner: str) -> Optional[Dict[str, Any]]:
91
+ """Turn a ``RefreshControl`` element into the ``refresh_control`` wire prop.
92
+
93
+ Scroll containers hold their refresh control as a prop rather than
94
+ a child (the native side attaches a ``UIRefreshControl`` /
95
+ ``SwipeRefreshLayout`` to the scroll view itself), so the element
96
+ is unwrapped here into the flat dict the bridge and the event
97
+ extractor expect. Keeping it an element on the Python side means
98
+ users build it like every other piece of UI and get a clear error
99
+ if they pass the wrong thing.
100
+
101
+ Raises:
102
+ TypeError: If ``control`` is not a ``RefreshControl`` element.
103
+ """
104
+ if control is None:
105
+ return None
106
+ if not isinstance(control, Element) or control.type != REFRESH_CONTROL_TYPE:
107
+ raise TypeError(
108
+ f"{owner}(refresh_control=...) expects pn.RefreshControl(...), got {type(control).__name__}: {control!r}"
109
+ )
110
+ return dict(control.props)
111
+
112
+
113
+ # ======================================================================
114
+ # Rich text spans
115
+ # ======================================================================
116
+
117
+
118
+ # Style keys that can vary per span inside a rich-text run. Layout
119
+ # keys are excluded: spans are inline fragments of one paragraph and
120
+ # have no boxes of their own.
121
+ _SPAN_STYLE_KEYS = (
122
+ "color",
123
+ "background_color",
124
+ "font_size",
125
+ "font_family",
126
+ "font_weight",
127
+ "bold",
128
+ "italic",
129
+ "text_decoration",
130
+ "letter_spacing",
131
+ )
132
+
133
+
134
+ def _flatten_text_spans(
135
+ parts: Tuple[Any, ...],
136
+ inherited: Dict[str, Any],
137
+ ) -> List[Dict[str, Any]]:
138
+ """Flatten nested ``Text`` parts into a flat list of styled spans.
139
+
140
+ Strings become spans carrying only the inherited style overrides;
141
+ nested ``Text`` elements contribute their own span-style keys
142
+ (merged over what they inherit) and recurse into their parts.
143
+ """
144
+ spans: List[Dict[str, Any]] = []
145
+ for part in parts:
146
+ if part is None:
147
+ continue
148
+ if isinstance(part, Element):
149
+ props = part.props or {}
150
+ child_style = dict(inherited)
151
+ for k in _SPAN_STYLE_KEYS:
152
+ if props.get(k) is not None:
153
+ child_style[k] = props[k]
154
+ nested = props.get("spans")
155
+ if nested:
156
+ for span in nested:
157
+ merged = dict(child_style)
158
+ for k in _SPAN_STYLE_KEYS:
159
+ if span.get(k) is not None:
160
+ merged[k] = span[k]
161
+ spans.append({"text": span.get("text", ""), **merged})
162
+ else:
163
+ spans.append({"text": str(props.get("text", "")), **child_style})
164
+ else:
165
+ spans.append({"text": str(part), **inherited})
166
+ return spans