flet 0.82.3.dev7882__tar.gz → 0.82.3.dev7889__tar.gz

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 (303) hide show
  1. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/PKG-INFO +9 -9
  2. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/pyproject.toml +9 -9
  3. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/__init__.py +9 -2
  4. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/app.py +3 -3
  5. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/alignment.py +2 -2
  6. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/animation.py +4 -3
  7. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/base_control.py +47 -6
  8. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/blur.py +2 -2
  9. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/border.py +4 -3
  10. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/border_radius.py +2 -2
  11. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/box.py +7 -6
  12. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/buttons.py +10 -9
  13. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/canvas/path.py +13 -13
  14. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/markdown.py +3 -4
  15. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/device_info.py +12 -11
  16. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/duration.py +2 -2
  17. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/geometry.py +3 -3
  18. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/gradients.py +6 -5
  19. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/keys.py +15 -4
  20. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/margin.py +2 -2
  21. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/auto_complete.py +2 -2
  22. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/expansion_panel.py +66 -19
  23. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/menu_bar.py +3 -3
  24. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/tabs.py +2 -2
  25. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/textfield.py +2 -3
  26. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/tooltip.py +3 -2
  27. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/object_patch.py +265 -175
  28. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/padding.py +2 -2
  29. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/page.py +1 -1
  30. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/painting.py +7 -6
  31. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/text_style.py +3 -3
  32. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/theme.py +45 -44
  33. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/transform.py +9 -8
  34. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/types.py +8 -7
  35. flet-0.82.3.dev7889/src/flet/controls/value_types.py +206 -0
  36. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/messaging/flet_socket_server.py +7 -7
  37. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/messaging/protocol.py +112 -30
  38. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/messaging/pyodide_connection.py +2 -2
  39. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/messaging/session.py +12 -9
  40. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/pubsub/pubsub_hub.py +11 -11
  41. flet-0.82.3.dev7889/src/flet/testing/__init__.py +5 -0
  42. flet-0.82.3.dev7889/src/flet/utils/classproperty.py +11 -0
  43. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/object_model.py +30 -8
  44. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/version.py +1 -1
  45. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet.egg-info/PKG-INFO +9 -9
  46. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet.egg-info/SOURCES.txt +1 -0
  47. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet.egg-info/requires.txt +8 -8
  48. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_datetime.py +0 -2
  49. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_object_diff_frozen.py +5 -4
  50. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_object_diff_in_place.py +1 -1
  51. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_object_diff_memory_churn.py +2 -1
  52. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_patch_dataclass.py +26 -4
  53. flet-0.82.3.dev7882/src/flet/testing/__init__.py +0 -6
  54. flet-0.82.3.dev7882/src/flet/utils/classproperty.py +0 -12
  55. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/README.md +0 -0
  56. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/setup.cfg +0 -0
  57. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/auth/__init__.py +0 -0
  58. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/auth/authorization.py +0 -0
  59. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/auth/authorization_service.py +0 -0
  60. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/auth/group.py +0 -0
  61. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/auth/oauth_provider.py +0 -0
  62. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/auth/oauth_token.py +0 -0
  63. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/auth/providers/__init__.py +0 -0
  64. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/auth/providers/auth0_oauth_provider.py +0 -0
  65. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/auth/providers/azure_oauth_provider.py +0 -0
  66. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/auth/providers/github_oauth_provider.py +0 -0
  67. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/auth/providers/google_oauth_provider.py +0 -0
  68. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/auth/user.py +0 -0
  69. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/canvas/__init__.py +0 -0
  70. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/cli.py +0 -0
  71. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/__init__.py +0 -0
  72. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/component.py +0 -0
  73. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/component_decorator.py +0 -0
  74. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/component_owned.py +0 -0
  75. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/hooks/__init__.py +0 -0
  76. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/hooks/hook.py +0 -0
  77. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/hooks/use_callback.py +0 -0
  78. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/hooks/use_context.py +0 -0
  79. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/hooks/use_effect.py +0 -0
  80. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/hooks/use_memo.py +0 -0
  81. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/hooks/use_ref.py +0 -0
  82. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/hooks/use_state.py +0 -0
  83. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/memo.py +0 -0
  84. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/observable.py +0 -0
  85. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/public_utils.py +0 -0
  86. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/components/utils.py +0 -0
  87. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/__init__.py +0 -0
  88. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/adaptive_control.py +0 -0
  89. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/base_page.py +0 -0
  90. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/colors.py +0 -0
  91. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/context.py +0 -0
  92. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/control.py +0 -0
  93. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/control_event.py +0 -0
  94. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/control_state.py +0 -0
  95. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/__init__.py +0 -0
  96. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/animated_switcher.py +0 -0
  97. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/autofill_group.py +0 -0
  98. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/canvas/__init__.py +0 -0
  99. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/canvas/arc.py +0 -0
  100. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/canvas/canvas.py +0 -0
  101. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/canvas/circle.py +0 -0
  102. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/canvas/color.py +0 -0
  103. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/canvas/fill.py +0 -0
  104. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/canvas/image.py +0 -0
  105. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/canvas/line.py +0 -0
  106. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/canvas/oval.py +0 -0
  107. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/canvas/points.py +0 -0
  108. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/canvas/rect.py +0 -0
  109. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/canvas/shadow.py +0 -0
  110. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/canvas/shape.py +0 -0
  111. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/canvas/text.py +0 -0
  112. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/column.py +0 -0
  113. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/dismissible.py +0 -0
  114. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/drag_target.py +0 -0
  115. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/draggable.py +0 -0
  116. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/flet_app.py +0 -0
  117. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/gesture_detector.py +0 -0
  118. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/grid_view.py +0 -0
  119. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/hero.py +0 -0
  120. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/icon.py +0 -0
  121. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/image.py +0 -0
  122. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/interactive_viewer.py +0 -0
  123. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/keyboard_listener.py +0 -0
  124. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/list_view.py +0 -0
  125. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/merge_semantics.py +0 -0
  126. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/page_view.py +0 -0
  127. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/pagelet.py +0 -0
  128. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/placeholder.py +0 -0
  129. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/reorderable_drag_handle.py +0 -0
  130. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/responsive_row.py +0 -0
  131. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/rotated_box.py +0 -0
  132. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/row.py +0 -0
  133. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/safe_area.py +0 -0
  134. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/screenshot.py +0 -0
  135. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/semantics.py +0 -0
  136. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/shader_mask.py +0 -0
  137. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/shimmer.py +0 -0
  138. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/stack.py +0 -0
  139. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/text.py +0 -0
  140. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/text_span.py +0 -0
  141. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/transparent_pointer.py +0 -0
  142. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/view.py +0 -0
  143. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/window.py +0 -0
  144. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/core/window_drag_area.py +0 -0
  145. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/__init__.py +0 -0
  146. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_action_sheet.py +0 -0
  147. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_action_sheet_action.py +0 -0
  148. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_activity_indicator.py +0 -0
  149. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_alert_dialog.py +0 -0
  150. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_app_bar.py +0 -0
  151. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_bottom_sheet.py +0 -0
  152. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_button.py +0 -0
  153. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_checkbox.py +0 -0
  154. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_colors.py +0 -0
  155. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_context_menu.py +0 -0
  156. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_context_menu_action.py +0 -0
  157. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_date_picker.py +0 -0
  158. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_dialog_action.py +0 -0
  159. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_filled_button.py +0 -0
  160. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_icons.json +0 -0
  161. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_icons.py +0 -0
  162. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_icons.pyi +0 -0
  163. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_list_tile.py +0 -0
  164. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_navigation_bar.py +0 -0
  165. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_picker.py +0 -0
  166. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_radio.py +0 -0
  167. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_segmented_button.py +0 -0
  168. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_slider.py +0 -0
  169. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_sliding_segmented_button.py +0 -0
  170. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_switch.py +0 -0
  171. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_textfield.py +0 -0
  172. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_timer_picker.py +0 -0
  173. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/cupertino/cupertino_tinted_button.py +0 -0
  174. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/dialog_control.py +0 -0
  175. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/embed_json_encoder.py +0 -0
  176. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/events.py +0 -0
  177. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/exceptions.py +0 -0
  178. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/icon_data.py +0 -0
  179. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/id_counter.py +0 -0
  180. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/layout_control.py +0 -0
  181. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/__init__.py +0 -0
  182. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/alert_dialog.py +0 -0
  183. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/app_bar.py +0 -0
  184. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/badge.py +0 -0
  185. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/banner.py +0 -0
  186. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/bottom_app_bar.py +0 -0
  187. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/bottom_sheet.py +0 -0
  188. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/button.py +0 -0
  189. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/card.py +0 -0
  190. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/checkbox.py +0 -0
  191. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/chip.py +0 -0
  192. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/circle_avatar.py +0 -0
  193. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/container.py +0 -0
  194. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/context_menu.py +0 -0
  195. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/datatable.py +0 -0
  196. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/date_picker.py +0 -0
  197. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/date_range_picker.py +0 -0
  198. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/divider.py +0 -0
  199. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/dropdown.py +0 -0
  200. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/dropdownm2.py +0 -0
  201. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/elevated_button.py +0 -0
  202. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/expansion_tile.py +0 -0
  203. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/filled_button.py +0 -0
  204. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/filled_tonal_button.py +0 -0
  205. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/floating_action_button.py +0 -0
  206. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/form_field_control.py +0 -0
  207. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/icon_button.py +0 -0
  208. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/icons.json +0 -0
  209. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/icons.py +0 -0
  210. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/icons.pyi +0 -0
  211. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/list_tile.py +0 -0
  212. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/menu_item_button.py +0 -0
  213. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/navigation_bar.py +0 -0
  214. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/navigation_drawer.py +0 -0
  215. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/navigation_rail.py +0 -0
  216. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/outlined_button.py +0 -0
  217. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/popup_menu_button.py +0 -0
  218. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/progress_bar.py +0 -0
  219. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/progress_ring.py +0 -0
  220. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/radio.py +0 -0
  221. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/radio_group.py +0 -0
  222. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/range_slider.py +0 -0
  223. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/reorderable_list_view.py +0 -0
  224. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/search_bar.py +0 -0
  225. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/segmented_button.py +0 -0
  226. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/selection_area.py +0 -0
  227. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/slider.py +0 -0
  228. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/snack_bar.py +0 -0
  229. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/submenu_button.py +0 -0
  230. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/switch.py +0 -0
  231. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/text_button.py +0 -0
  232. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/time_picker.py +0 -0
  233. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/material/vertical_divider.py +0 -0
  234. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/multi_view.py +0 -0
  235. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/query_string.py +0 -0
  236. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/ref.py +0 -0
  237. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/scrollable_control.py +0 -0
  238. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/__init__.py +0 -0
  239. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/accelerometer.py +0 -0
  240. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/barometer.py +0 -0
  241. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/battery.py +0 -0
  242. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/browser_context_menu.py +0 -0
  243. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/clipboard.py +0 -0
  244. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/connectivity.py +0 -0
  245. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/file_picker.py +0 -0
  246. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/gyroscope.py +0 -0
  247. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/haptic_feedback.py +0 -0
  248. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/magnetometer.py +0 -0
  249. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/screen_brightness.py +0 -0
  250. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/semantics_service.py +0 -0
  251. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/sensor_error_event.py +0 -0
  252. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/service.py +0 -0
  253. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/shake_detector.py +0 -0
  254. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/share.py +0 -0
  255. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/shared_preferences.py +0 -0
  256. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/storage_paths.py +0 -0
  257. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/url_launcher.py +0 -0
  258. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/user_accelerometer.py +0 -0
  259. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/services/wakelock.py +0 -0
  260. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/controls/template_route.py +0 -0
  261. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/fastapi/__init__.py +0 -0
  262. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/messaging/connection.py +0 -0
  263. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/messaging/session_store.py +0 -0
  264. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/pubsub/__init__.py +0 -0
  265. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/pubsub/pubsub_client.py +0 -0
  266. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/py.typed +0 -0
  267. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/security/__init__.py +0 -0
  268. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/testing/finder.py +0 -0
  269. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/testing/flet_test_app.py +0 -0
  270. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/testing/tester.py +0 -0
  271. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/__init__.py +0 -0
  272. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/browser.py +0 -0
  273. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/deprecated.py +0 -0
  274. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/deprecated_enum.py +0 -0
  275. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/files.py +0 -0
  276. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/from_dict.py +0 -0
  277. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/hashing.py +0 -0
  278. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/json_utils.py +0 -0
  279. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/locks.py +0 -0
  280. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/network.py +0 -0
  281. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/once.py +0 -0
  282. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/pip.py +0 -0
  283. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/platform_utils.py +0 -0
  284. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/slugify.py +0 -0
  285. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/strings.py +0 -0
  286. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/typing_utils.py +0 -0
  287. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet/utils/vector.py +0 -0
  288. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet.egg-info/dependency_links.txt +0 -0
  289. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet.egg-info/entry_points.txt +0 -0
  290. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/src/flet.egg-info/top_level.txt +0 -0
  291. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_auth_lazy_imports.py +0 -0
  292. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_base_control.py +0 -0
  293. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_colors.py +0 -0
  294. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_component_effects.py +0 -0
  295. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_component_renderer.py +0 -0
  296. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_dataclasses.py +0 -0
  297. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_events.py +0 -0
  298. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_from_dict.py +0 -0
  299. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_icons.py +0 -0
  300. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_object_diff_performance.py +0 -0
  301. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_observable.py +0 -0
  302. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_session_disconnect_buffering.py +0 -0
  303. {flet-0.82.3.dev7882 → flet-0.82.3.dev7889}/tests/test_skip_double_update.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flet
3
- Version: 0.82.3.dev7882
3
+ Version: 0.82.3.dev7889
4
4
  Summary: Flet for Python - easily build interactive multi-platform apps in Python
5
5
  Author-email: "Appveyor Systems Inc." <hello@flet.dev>
6
6
  License-Expression: Apache-2.0
@@ -9,23 +9,23 @@ Project-URL: Repository, https://github.com/flet-dev/flet
9
9
  Project-URL: Documentation, https://docs.flet.dev/
10
10
  Requires-Python: >=3.10
11
11
  Description-Content-Type: text/markdown
12
- Requires-Dist: flet-cli==0.82.3.dev7882; extra == "cli"
13
- Requires-Dist: flet-web==0.82.3.dev7882; extra == "web"
12
+ Requires-Dist: flet-cli==0.82.3.dev7889; extra == "cli"
13
+ Requires-Dist: flet-web==0.82.3.dev7889; extra == "web"
14
14
  Requires-Dist: oauthlib>=3.2.2; platform_system != "Pyodide"
15
15
  Requires-Dist: httpx>=0.28.1; platform_system != "Pyodide"
16
16
  Requires-Dist: repath>=0.9.0
17
17
  Requires-Dist: msgpack>=1.1.0
18
18
  Requires-Dist: typing-extensions; python_version < "3.11"
19
19
  Provides-Extra: all
20
- Requires-Dist: flet-cli==0.82.3.dev7882; extra == "all"
21
- Requires-Dist: flet-web==0.82.3.dev7882; extra == "all"
22
- Requires-Dist: flet-desktop==0.82.3.dev7882; extra == "all"
20
+ Requires-Dist: flet-cli==0.82.3.dev7889; extra == "all"
21
+ Requires-Dist: flet-web==0.82.3.dev7889; extra == "all"
22
+ Requires-Dist: flet-desktop==0.82.3.dev7889; extra == "all"
23
23
  Provides-Extra: cli
24
- Requires-Dist: flet-cli==0.82.3.dev7882; extra == "cli"
24
+ Requires-Dist: flet-cli==0.82.3.dev7889; extra == "cli"
25
25
  Provides-Extra: desktop
26
- Requires-Dist: flet-desktop==0.82.3.dev7882; extra == "desktop"
26
+ Requires-Dist: flet-desktop==0.82.3.dev7889; extra == "desktop"
27
27
  Provides-Extra: web
28
- Requires-Dist: flet-web==0.82.3.dev7882; extra == "web"
28
+ Requires-Dist: flet-web==0.82.3.dev7889; extra == "web"
29
29
 
30
30
  <p align="center">
31
31
  <a href="https://flet.dev"><img src="https://raw.githubusercontent.com/flet-dev/flet/refs/heads/main/media/logo/flet-logo.svg" height="150" alt="Flet logo"></a>
@@ -1,14 +1,14 @@
1
1
  [project]
2
2
  name = "flet"
3
- version = "0.82.3.dev7882"
3
+ version = "0.82.3.dev7889"
4
4
  description = "Flet for Python - easily build interactive multi-platform apps in Python"
5
5
  authors = [{name = "Appveyor Systems Inc.", email = "hello@flet.dev"}]
6
6
  license = "Apache-2.0"
7
7
  readme = "README.md"
8
8
  requires-python = ">=3.10"
9
9
  dependencies = [
10
- "flet-cli==0.82.3.dev7882; extra == 'cli'",
11
- "flet-web==0.82.3.dev7882; extra == 'web'",
10
+ "flet-cli==0.82.3.dev7889; extra == 'cli'",
11
+ "flet-web==0.82.3.dev7889; extra == 'web'",
12
12
  "oauthlib >=3.2.2; platform_system != 'Pyodide'",
13
13
  "httpx >=0.28.1; platform_system != 'Pyodide'",
14
14
  "repath >=0.9.0",
@@ -23,15 +23,15 @@ Documentation = "https://docs.flet.dev/"
23
23
 
24
24
  [project.optional-dependencies]
25
25
  all = [
26
- "flet-cli==0.82.3.dev7882",
27
- "flet-web==0.82.3.dev7882",
28
- "flet-desktop==0.82.3.dev7882",
26
+ "flet-cli==0.82.3.dev7889",
27
+ "flet-web==0.82.3.dev7889",
28
+ "flet-desktop==0.82.3.dev7889",
29
29
  ]
30
- cli = ["flet-cli==0.82.3.dev7882"]
30
+ cli = ["flet-cli==0.82.3.dev7889"]
31
31
  desktop = [
32
- "flet-desktop==0.82.3.dev7882",
32
+ "flet-desktop==0.82.3.dev7889",
33
33
  ]
34
- web = ["flet-web==0.82.3.dev7882"]
34
+ web = ["flet-web==0.82.3.dev7889"]
35
35
 
36
36
  [project.scripts]
37
37
  flet = "flet.cli:main"
@@ -26,7 +26,7 @@ from flet.controls.animation import (
26
26
  AnimationStyle,
27
27
  AnimationValue,
28
28
  )
29
- from flet.controls.base_control import BaseControl, control
29
+ from flet.controls.base_control import BaseControl, Value, control, value
30
30
  from flet.controls.base_page import BasePage, PageMediaData, PageResizeEvent
31
31
  from flet.controls.blur import (
32
32
  Blur,
@@ -304,7 +304,11 @@ from flet.controls.material.divider import Divider
304
304
  from flet.controls.material.dropdown import Dropdown, DropdownOption
305
305
  from flet.controls.material.dropdownm2 import DropdownM2
306
306
  from flet.controls.material.elevated_button import ElevatedButton
307
- from flet.controls.material.expansion_panel import ExpansionPanel, ExpansionPanelList
307
+ from flet.controls.material.expansion_panel import (
308
+ ExpansionPanel,
309
+ ExpansionPanelList,
310
+ ExpansionPanelListChangeEvent,
311
+ )
308
312
  from flet.controls.material.expansion_tile import ExpansionTile, TileAffinity
309
313
  from flet.controls.material.filled_button import FilledButton
310
314
  from flet.controls.material.filled_tonal_button import FilledTonalButton
@@ -775,6 +779,7 @@ __all__ = [
775
779
  "EventHandler",
776
780
  "ExpansionPanel",
777
781
  "ExpansionPanelList",
782
+ "ExpansionPanelListChangeEvent",
778
783
  "ExpansionTile",
779
784
  "ExpansionTileTheme",
780
785
  "FilePicker",
@@ -1058,6 +1063,7 @@ __all__ = [
1058
1063
  "UrlTarget",
1059
1064
  "UserAccelerometer",
1060
1065
  "UserAccelerometerReadingEvent",
1066
+ "Value",
1061
1067
  "ValueKey",
1062
1068
  "VerticalAlignment",
1063
1069
  "VerticalDivider",
@@ -1106,6 +1112,7 @@ __all__ = [
1106
1112
  "use_memo",
1107
1113
  "use_ref",
1108
1114
  "use_state",
1115
+ "value",
1109
1116
  ]
1110
1117
 
1111
1118
  _THEME_EXPORTS = {
@@ -221,7 +221,7 @@ async def run_async(
221
221
  if url_prefix is not None:
222
222
  print(url_prefix, page_url)
223
223
  else:
224
- logger.info(f"App URL: {page_url}")
224
+ logger.info("App URL: %s", page_url)
225
225
 
226
226
  if view == AppView.WEB_BROWSER and url_prefix is None and not force_web_server:
227
227
  open_in_browser(page_url)
@@ -438,7 +438,7 @@ async def __run_web_server(
438
438
  if port == 0:
439
439
  port = get_free_tcp_port()
440
440
 
441
- logger.info(f"Starting Flet web server on port {port}...")
441
+ logger.info("Starting Flet web server on port %s...", port)
442
442
 
443
443
  log_level = logging.getLogger("flet").getEffectiveLevel()
444
444
  if log_level == logging.CRITICAL or log_level == logging.NOTSET:
@@ -520,7 +520,7 @@ def __get_assets_dir_path(assets_dir: Optional[str], relative_to_cwd=False):
520
520
  .joinpath(assets_dir)
521
521
  .resolve()
522
522
  )
523
- logger.info(f"Assets path configured: {assets_dir}")
523
+ logger.info("Assets path configured: %s", assets_dir)
524
524
 
525
525
  env_assets_dir = os.getenv("FLET_ASSETS_DIR")
526
526
  if env_assets_dir:
@@ -1,7 +1,7 @@
1
- from dataclasses import dataclass
2
1
  from enum import Enum
3
2
  from typing import ClassVar, Optional
4
3
 
4
+ from flet.controls.base_control import value
5
5
  from flet.controls.types import Number
6
6
 
7
7
  __all__ = [
@@ -29,7 +29,7 @@ class Axis(Enum):
29
29
  """
30
30
 
31
31
 
32
- @dataclass
32
+ @value
33
33
  class Alignment:
34
34
  """
35
35
  Defines an alignment relative to the center.
@@ -1,7 +1,8 @@
1
- from dataclasses import dataclass, field
1
+ from dataclasses import field
2
2
  from enum import Enum
3
3
  from typing import Optional, Union
4
4
 
5
+ from flet.controls.base_control import value
5
6
  from flet.controls.duration import Duration, DurationValue
6
7
 
7
8
  __all__ = [
@@ -228,7 +229,7 @@ class AnimationCurve(Enum):
228
229
  """
229
230
 
230
231
 
231
- @dataclass
232
+ @value
232
233
  class Animation:
233
234
  """
234
235
  Explicit animation configuration for animatable control properties.
@@ -267,7 +268,7 @@ class Animation:
267
268
  )
268
269
 
269
270
 
270
- @dataclass
271
+ @value
271
272
  class AnimationStyle:
272
273
  """
273
274
  Used to override the default parameters of an animation.
@@ -7,8 +7,8 @@ from typing import TYPE_CHECKING, Any, Callable, Optional, TypeVar, Union, overl
7
7
  from flet.controls.context import _context_page, context
8
8
  from flet.controls.control_event import ControlEvent, get_event_field_type
9
9
  from flet.controls.id_counter import ControlId
10
- from flet.controls.keys import KeyValue
11
10
  from flet.controls.ref import Ref
11
+ from flet.controls.value_types import Prop, Value, _install_props, value
12
12
  from flet.utils.from_dict import from_dict
13
13
  from flet.utils.object_model import get_param_count
14
14
 
@@ -23,14 +23,26 @@ else:
23
23
 
24
24
  if TYPE_CHECKING:
25
25
  from .base_page import BasePage
26
+ from .keys import KeyValue
26
27
  from .page import Page
27
28
 
28
29
  __all__ = [
29
30
  "BaseControl",
31
+ "Prop",
32
+ "Value",
30
33
  "control",
31
34
  "skip_field",
35
+ "value",
32
36
  ]
33
37
 
38
+ # ---------------------------------------------------------------------------
39
+ # Sparse property tracking is defined in value_types.py to avoid circular
40
+ # imports: value types (Duration, Alignment, etc.) need @value but are
41
+ # imported transitively by this module.
42
+ # Prop, Value, _install_props and value are re-exported from here
43
+ # for backwards compatibility.
44
+ # ---------------------------------------------------------------------------
45
+
34
46
 
35
47
  def skip_field():
36
48
  """
@@ -123,6 +135,7 @@ def _apply_control(
123
135
  ) -> type[T]:
124
136
  """Applies @control logic, ensuring compatibility with @dataclass."""
125
137
  cls = dataclass(**dataclass_kwargs)(cls) # Apply @dataclass first
138
+ _install_props(cls) # Install Prop descriptors for sparse tracking
126
139
 
127
140
  orig_post_init = getattr(cls, "__post_init__", lambda self, *args: None)
128
141
 
@@ -147,6 +160,26 @@ class BaseControl:
147
160
  Base class for all Flet controls and services.
148
161
  """
149
162
 
163
+ # ------------------------------------------------------------------
164
+ # Sparse property tracking — MUST be the first two init=False fields
165
+ # so the dataclass-generated __init__ initialises them before any
166
+ # Prop.__set__ call for init=True fields.
167
+ # ------------------------------------------------------------------
168
+ _values: dict = field(
169
+ default_factory=dict,
170
+ init=False,
171
+ repr=False,
172
+ compare=False,
173
+ metadata={"skip": True},
174
+ )
175
+ _dirty: dict = field(
176
+ default_factory=dict,
177
+ init=False,
178
+ repr=False,
179
+ compare=False,
180
+ metadata={"skip": True},
181
+ )
182
+
150
183
  _i: int = field(init=False, compare=False)
151
184
  """
152
185
  Runtime-generated internal control id used by the session protocol.
@@ -162,7 +195,7 @@ class BaseControl:
162
195
  Arbitrary data of any type.
163
196
  """
164
197
 
165
- key: Optional[KeyValue] = None
198
+ key: Optional["KeyValue"] = None
166
199
 
167
200
  ref: InitVar[Optional[Ref["BaseControl"]]] = None
168
201
  """A reference to this control."""
@@ -195,6 +228,9 @@ class BaseControl:
195
228
  ref.current = self
196
229
 
197
230
  self.init()
231
+ # Construction is not a mutation: clear dirty tracking so only
232
+ # post-construction mutations are visible to the non-frozen diff.
233
+ self._dirty.clear()
198
234
 
199
235
  # control_id = self._i
200
236
  # object_id = id(self)
@@ -228,7 +264,7 @@ class BaseControl:
228
264
  return parent_ref() if parent_ref else None
229
265
 
230
266
  @property
231
- def page(self) -> Union["Page", "BasePage"]:
267
+ def page(self) -> "Union[Page, BasePage]":
232
268
  """
233
269
  The page to which this control belongs to.
234
270
  """
@@ -311,7 +347,7 @@ class BaseControl:
311
347
  Override to start resources that require an attached page, for example
312
348
  subscriptions, timers, or service listeners.
313
349
  """
314
- controls_log.debug(f"{self}.did_mount()")
350
+ controls_log.debug("%s.did_mount()", self)
315
351
  pass
316
352
 
317
353
  def will_unmount(self):
@@ -321,7 +357,7 @@ class BaseControl:
321
357
  Override to dispose resources created in `did_mount()`, such as
322
358
  subscriptions, timers, or external handles.
323
359
  """
324
- controls_log.debug(f"{self}.will_unmount()")
360
+ controls_log.debug("%s.will_unmount()", self)
325
361
  pass
326
362
 
327
363
  # public methods
@@ -398,7 +434,7 @@ class BaseControl:
398
434
  _context_page.set(self.page)
399
435
  context.reset_auto_update()
400
436
 
401
- controls_log.debug(f"Trigger event {self}.{field_name} {e}")
437
+ controls_log.debug("Trigger event %s.%s %s", self, field_name, e)
402
438
 
403
439
  if not self.page:
404
440
  raise RuntimeError(
@@ -460,3 +496,8 @@ class BaseControl:
460
496
  Return a debug-friendly control identifier string.
461
497
  """
462
498
  return f"{self._c}({self._i} - {id(self)})"
499
+
500
+
501
+ # Install Prop descriptors for BaseControl's own public fields (key).
502
+ # Subclasses decorated with @control get this called via _apply_control.
503
+ _install_props(BaseControl)
@@ -1,7 +1,7 @@
1
- from dataclasses import dataclass
2
1
  from enum import Enum
3
2
  from typing import Optional, Union
4
3
 
4
+ from flet.controls.base_control import value
5
5
  from flet.controls.types import Number
6
6
 
7
7
  __all__ = [
@@ -37,7 +37,7 @@ class BlurTileMode(Enum):
37
37
  """
38
38
 
39
39
 
40
- @dataclass
40
+ @value
41
41
  class Blur:
42
42
  """
43
43
  Gaussian blur configuration.
@@ -1,7 +1,8 @@
1
- from dataclasses import dataclass, field
1
+ from dataclasses import field
2
2
  from enum import Enum
3
3
  from typing import Optional, Union
4
4
 
5
+ from flet.controls.base_control import value
5
6
  from flet.controls.colors import Colors
6
7
  from flet.controls.types import ColorValue, Number
7
8
  from flet.utils import deprecated
@@ -52,7 +53,7 @@ class BorderStyle(Enum):
52
53
  """Draw the border as a solid line."""
53
54
 
54
55
 
55
- @dataclass
56
+ @value
56
57
  class BorderSide:
57
58
  """
58
59
  Creates the side of a border.
@@ -172,7 +173,7 @@ class BorderSide:
172
173
  return BorderSide(width=0.0, style=BorderStyle.NONE)
173
174
 
174
175
 
175
- @dataclass
176
+ @value
176
177
  class Border:
177
178
  """
178
179
  A border comprised of four sides: `top`, `right`, `bottom`, `left`.
@@ -1,6 +1,6 @@
1
- import dataclasses
2
1
  from typing import Optional, Union
3
2
 
3
+ from flet.controls.base_control import value
4
4
  from flet.controls.types import Number
5
5
  from flet.utils import deprecated
6
6
 
@@ -14,7 +14,7 @@ __all__ = [
14
14
  ]
15
15
 
16
16
 
17
- @dataclasses.dataclass
17
+ @value
18
18
  class BorderRadius:
19
19
  """
20
20
  Corner radii for a rectangle, defined for all four corners.
@@ -1,8 +1,9 @@
1
- from dataclasses import dataclass, field
1
+ from dataclasses import field
2
2
  from enum import Enum
3
3
  from typing import Optional, Union
4
4
 
5
5
  from flet.controls.alignment import Alignment
6
+ from flet.controls.base_control import value
6
7
  from flet.controls.border import Border
7
8
  from flet.controls.border_radius import BorderRadiusValue
8
9
  from flet.controls.colors import Colors
@@ -29,7 +30,7 @@ __all__ = [
29
30
  ]
30
31
 
31
32
 
32
- @dataclass
33
+ @value
33
34
  class ColorFilter:
34
35
  """
35
36
  Defines a color filter.
@@ -122,7 +123,7 @@ class BlurStyle(Enum):
122
123
  """
123
124
 
124
125
 
125
- @dataclass
126
+ @value
126
127
  class BoxShadow:
127
128
  """
128
129
  Configuration for a box's shadow.
@@ -276,7 +277,7 @@ class BoxFit(Enum):
276
277
  """ # noqa: E501
277
278
 
278
279
 
279
- @dataclass
280
+ @value
280
281
  class DecorationImage:
281
282
  """
282
283
  An image for a box decoration.
@@ -381,7 +382,7 @@ class DecorationImage:
381
382
  )
382
383
 
383
384
 
384
- @dataclass
385
+ @value
385
386
  class BoxDecoration:
386
387
  """
387
388
  BoxDecoration provides a description of how to paint a box.
@@ -470,7 +471,7 @@ class BoxDecoration:
470
471
  )
471
472
 
472
473
 
473
- @dataclass
474
+ @value
474
475
  class BoxConstraints:
475
476
  """
476
477
  Constraints that must be respected by a size of a box.
@@ -1,7 +1,8 @@
1
- from dataclasses import dataclass, field
1
+ from dataclasses import field
2
2
  from typing import Optional
3
3
 
4
4
  from flet.controls.alignment import Alignment
5
+ from flet.controls.base_control import value
5
6
  from flet.controls.border import BorderSide
6
7
  from flet.controls.border_radius import BorderRadiusValue
7
8
  from flet.controls.control_state import ControlStateValue
@@ -27,7 +28,7 @@ __all__ = [
27
28
  ]
28
29
 
29
30
 
30
- @dataclass
31
+ @value
31
32
  class ShapeBorder:
32
33
  """
33
34
  Base class for shape outlines. Not intended to be used directly.
@@ -38,7 +39,7 @@ class ShapeBorder:
38
39
  """
39
40
 
40
41
 
41
- @dataclass
42
+ @value
42
43
  class OutlinedBorder(ShapeBorder):
43
44
  """
44
45
  An abstract class that can be used to create custom borders.
@@ -60,7 +61,7 @@ class OutlinedBorder(ShapeBorder):
60
61
  _type: Optional[str] = field(init=False, repr=False, compare=False, default=None)
61
62
 
62
63
 
63
- @dataclass
64
+ @value
64
65
  class StadiumBorder(OutlinedBorder):
65
66
  """
66
67
  A border that looks like a stadium.
@@ -82,7 +83,7 @@ class StadiumBorder(OutlinedBorder):
82
83
  )
83
84
 
84
85
 
85
- @dataclass
86
+ @value
86
87
  class RoundedRectangleBorder(OutlinedBorder):
87
88
  """
88
89
  A border with rounded rectangle corners.
@@ -111,7 +112,7 @@ class RoundedRectangleBorder(OutlinedBorder):
111
112
  )
112
113
 
113
114
 
114
- @dataclass
115
+ @value
115
116
  class CircleBorder(OutlinedBorder):
116
117
  """
117
118
  A border with a circle shape.
@@ -139,7 +140,7 @@ class CircleBorder(OutlinedBorder):
139
140
  )
140
141
 
141
142
 
142
- @dataclass
143
+ @value
143
144
  class BeveledRectangleBorder(RoundedRectangleBorder):
144
145
  """
145
146
  A border with beveled rectangle corners.
@@ -163,7 +164,7 @@ class BeveledRectangleBorder(RoundedRectangleBorder):
163
164
  )
164
165
 
165
166
 
166
- @dataclass
167
+ @value
167
168
  class ContinuousRectangleBorder(RoundedRectangleBorder):
168
169
  """
169
170
  A border with continuous rectangle corners.
@@ -187,7 +188,7 @@ class ContinuousRectangleBorder(RoundedRectangleBorder):
187
188
  )
188
189
 
189
190
 
190
- @dataclass
191
+ @value
191
192
  class ButtonStyle:
192
193
  """
193
194
  Allows controlling all visual aspects of a button, such as shape, foreground, \
@@ -1,7 +1,7 @@
1
- from dataclasses import dataclass, field
1
+ from dataclasses import field
2
2
  from typing import Optional
3
3
 
4
- from flet.controls.base_control import control
4
+ from flet.controls.base_control import control, value
5
5
  from flet.controls.border_radius import BorderRadiusValue
6
6
  from flet.controls.core.canvas.shape import Shape
7
7
  from flet.controls.painting import Paint
@@ -20,7 +20,7 @@ class Path(Shape):
20
20
  (see `Path.Close`).
21
21
  """
22
22
 
23
- @dataclass(kw_only=True)
23
+ @value(kw_only=True)
24
24
  class PathElement:
25
25
  """
26
26
  Base type for elements stored in `Path.elements`.
@@ -47,7 +47,7 @@ class Path(Shape):
47
47
  A style to draw a path with.
48
48
  """
49
49
 
50
- @dataclass
50
+ @value
51
51
  class MoveTo(PathElement):
52
52
  """
53
53
  Starts a new sub-path at the given point (`x`,`y`).
@@ -59,7 +59,7 @@ class Path(Shape):
59
59
  def __post_init__(self):
60
60
  self._type = "MoveTo"
61
61
 
62
- @dataclass
62
+ @value
63
63
  class LineTo(PathElement):
64
64
  """
65
65
  Adds a straight line segment from the current point to the given point \
@@ -72,7 +72,7 @@ class Path(Shape):
72
72
  def __post_init__(self):
73
73
  self._type = "LineTo"
74
74
 
75
- @dataclass
75
+ @value
76
76
  class QuadraticTo(PathElement):
77
77
  """
78
78
  Adds a bezier segment that curves from the current point to the given point \
@@ -92,7 +92,7 @@ class Path(Shape):
92
92
  def __post_init__(self):
93
93
  self._type = "QuadraticTo"
94
94
 
95
- @dataclass
95
+ @value
96
96
  class CubicTo(PathElement):
97
97
  """
98
98
  Adds a cubic bezier segment that curves from the current point to the given \
@@ -109,7 +109,7 @@ class Path(Shape):
109
109
  def __post_init__(self):
110
110
  self._type = "CubicTo"
111
111
 
112
- @dataclass
112
+ @value
113
113
  class SubPath(PathElement):
114
114
  """
115
115
  Adds the sub-path described by `elements` to the given point (`x`,`y`).
@@ -122,7 +122,7 @@ class Path(Shape):
122
122
  def __post_init__(self):
123
123
  self._type = "SubPath"
124
124
 
125
- @dataclass
125
+ @value
126
126
  class Arc(PathElement):
127
127
  """
128
128
  Adds a new sub-path with one arc segment that consists of the arc that follows \
@@ -167,7 +167,7 @@ class Path(Shape):
167
167
  def __post_init__(self):
168
168
  self._type = "Arc"
169
169
 
170
- @dataclass
170
+ @value
171
171
  class ArcTo(PathElement):
172
172
  """
173
173
  Appends up to four conic curves weighted to describe an oval of `radius` and \
@@ -216,7 +216,7 @@ class Path(Shape):
216
216
  def __post_init__(self):
217
217
  self._type = "ArcTo"
218
218
 
219
- @dataclass
219
+ @value
220
220
  class Oval(PathElement):
221
221
  """
222
222
  Adds a new sub-path that consists of a curve that forms the ellipse that fills \
@@ -246,7 +246,7 @@ class Path(Shape):
246
246
  def __post_init__(self):
247
247
  self._type = "Oval"
248
248
 
249
- @dataclass
249
+ @value
250
250
  class Rect(PathElement):
251
251
  """
252
252
  Adds a rectangle as a new sub-path.
@@ -280,7 +280,7 @@ class Path(Shape):
280
280
  def __post_init__(self):
281
281
  self._type = "Rect"
282
282
 
283
- @dataclass
283
+ @value
284
284
  class Close(PathElement):
285
285
  """
286
286
  Closes the last sub-path, as if a straight line had been drawn from the \
@@ -1,8 +1,7 @@
1
- from dataclasses import dataclass
2
1
  from enum import Enum
3
2
  from typing import Optional, Union
4
3
 
5
- from flet.controls.base_control import control
4
+ from flet.controls.base_control import control, value
6
5
  from flet.controls.box import BoxDecoration
7
6
  from flet.controls.control import Control
8
7
  from flet.controls.control_event import ControlEventHandler, EventHandler
@@ -55,7 +54,7 @@ class MarkdownExtensionSet(Enum):
55
54
  """
56
55
 
57
56
 
58
- @dataclass
57
+ @value
59
58
  class MarkdownStyleSheet:
60
59
  """
61
60
  Style overrides for markdown element rendering.
@@ -676,7 +675,7 @@ class MarkdownCodeTheme(Enum):
676
675
  """
677
676
 
678
677
 
679
- @dataclass
678
+ @value
680
679
  class MarkdownCustomCodeTheme:
681
680
  """
682
681
  Custom text-style mapping for code token highlighting.