bootstack 0.1.0a16__tar.gz → 0.1.2__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 (489) hide show
  1. {bootstack-0.1.0a16/src/bootstack.egg-info → bootstack-0.1.2}/PKG-INFO +21 -7
  2. {bootstack-0.1.0a16 → bootstack-0.1.2}/README.md +15 -4
  3. {bootstack-0.1.0a16 → bootstack-0.1.2}/pyproject.toml +9 -4
  4. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_runtime/window_utilities.py +73 -0
  5. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/cli/__init__.py +4 -1
  6. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/cli/add.py +11 -4
  7. bootstack-0.1.2/src/bootstack/cli/dev.py +153 -0
  8. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/cli/run.py +1 -1
  9. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/cli/templates/__init__.py +162 -193
  10. bootstack-0.1.2/src/bootstack/dev/__init__.py +36 -0
  11. bootstack-0.1.2/src/bootstack/dev/_capture.py +141 -0
  12. bootstack-0.1.2/src/bootstack/dev/_env.py +43 -0
  13. bootstack-0.1.2/src/bootstack/dev/_registry.py +140 -0
  14. bootstack-0.1.2/src/bootstack/dev/_reloader.py +351 -0
  15. bootstack-0.1.2/src/bootstack/dev/_reset.py +50 -0
  16. bootstack-0.1.2/src/bootstack/dev/_watcher.py +91 -0
  17. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/dialogs/_impl/dialog.py +24 -8
  18. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/style.py +79 -51
  19. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/style_builder_base.py +29 -6
  20. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/style_resolver.py +10 -6
  21. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/__init__.py +8 -13
  22. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_core/base.py +34 -2
  23. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_core/window_menu.py +16 -0
  24. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/avatar.py +1 -2
  25. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/carousel.py +1 -2
  26. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/chart.py +1 -2
  27. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/contextmenu.py +29 -2
  28. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/expander.py +7 -0
  29. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/gallery.py +1 -2
  30. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/list/listview.py +1 -2
  31. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/meter.py +13 -15
  32. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/pagestack.py +49 -5
  33. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/picture.py +1 -2
  34. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/shell/nav_panel.py +3 -1
  35. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/shell/shell.py +48 -6
  36. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/slider/_shared.py +12 -4
  37. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/slider/rangeslider.py +18 -14
  38. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/slider/slider.py +18 -14
  39. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/tableview/tableview.py +23 -8
  40. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/toast_stack.py +9 -4
  41. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/combobox.py +9 -8
  42. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/frame.py +4 -52
  43. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/app.py +111 -0
  44. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/appshell.py +134 -1
  45. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/button.py +1 -0
  46. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/label.py +1 -0
  47. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/menubutton.py +1 -0
  48. {bootstack-0.1.0a16 → bootstack-0.1.2/src/bootstack.egg-info}/PKG-INFO +21 -7
  49. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack.egg-info/SOURCES.txt +11 -0
  50. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack.egg-info/requires.txt +2 -0
  51. bootstack-0.1.2/tests/test_dialog_anchor.py +44 -0
  52. bootstack-0.1.2/tests/test_hot_reload.py +339 -0
  53. bootstack-0.1.2/tests/test_on_color_contrast.py +65 -0
  54. {bootstack-0.1.0a16 → bootstack-0.1.2}/tests/test_public_surface.py +34 -0
  55. {bootstack-0.1.0a16 → bootstack-0.1.2}/LICENSE +0 -0
  56. {bootstack-0.1.0a16 → bootstack-0.1.2}/MANIFEST.in +0 -0
  57. {bootstack-0.1.0a16 → bootstack-0.1.2}/NOTICE +0 -0
  58. {bootstack-0.1.0a16 → bootstack-0.1.2}/setup.cfg +0 -0
  59. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/__init__.py +0 -0
  60. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/__main__.py +0 -0
  61. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/__init__.py +0 -0
  62. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/capabilities/__init__.py +0 -0
  63. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/capabilities/after.py +0 -0
  64. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/capabilities/bind.py +0 -0
  65. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/capabilities/bindtags.py +0 -0
  66. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/capabilities/busy.py +0 -0
  67. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/capabilities/clipboard.py +0 -0
  68. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/capabilities/focus.py +0 -0
  69. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/capabilities/grab.py +0 -0
  70. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/capabilities/grid.py +0 -0
  71. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/capabilities/localization.py +0 -0
  72. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/capabilities/pack.py +0 -0
  73. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/capabilities/place.py +0 -0
  74. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/capabilities/selection.py +0 -0
  75. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/capabilities/signals.py +0 -0
  76. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/capabilities/winfo.py +0 -0
  77. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/colorutils.py +0 -0
  78. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/exceptions.py +0 -0
  79. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/images.py +0 -0
  80. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/mixins/__init__.py +0 -0
  81. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/mixins/ttk_state.py +0 -0
  82. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/mixins/widget.py +0 -0
  83. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/paths.py +0 -0
  84. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/publisher.py +0 -0
  85. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_core/variables.py +0 -0
  86. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_runtime/__init__.py +0 -0
  87. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_runtime/app.py +0 -0
  88. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_runtime/base_window.py +0 -0
  89. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_runtime/events.py +0 -0
  90. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_runtime/shortcuts.py +0 -0
  91. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_runtime/tk_patch.py +0 -0
  92. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_runtime/toplevel.py +0 -0
  93. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_runtime/utility.py +0 -0
  94. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/_runtime/visual_focus.py +0 -0
  95. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/__init__.py +0 -0
  96. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/bootstack.ico +0 -0
  97. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/bootstack.png +0 -0
  98. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/__init__.py +0 -0
  99. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/badge-pill.png +0 -0
  100. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/badge-square.png +0 -0
  101. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/button-compact.png +0 -0
  102. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/button-default.png +0 -0
  103. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
  104. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
  105. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
  106. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
  107. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
  108. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
  109. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
  110. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
  111. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
  112. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
  113. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
  114. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
  115. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/card.png +0 -0
  116. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/checkbox-checked.png +0 -0
  117. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/checkbox-indeterminate.png +0 -0
  118. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/checkbox-unchecked.png +0 -0
  119. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/field.png +0 -0
  120. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/input-addon-compact.png +0 -0
  121. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/input-addon-default.png +0 -0
  122. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/input-compact.png +0 -0
  123. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/input-default.png +0 -0
  124. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/list-item-separated.png +0 -0
  125. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/list-item.png +0 -0
  126. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/listrow-compact.png +0 -0
  127. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/listrow-default.png +0 -0
  128. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/manifest.toml +0 -0
  129. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/menu-item.png +0 -0
  130. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/navitem-compact.png +0 -0
  131. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/navitem-default.png +0 -0
  132. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/progressbar-h-compact.png +0 -0
  133. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/progressbar-h-default.png +0 -0
  134. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/progressbar-v-compact.png +0 -0
  135. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/progressbar-v-default.png +0 -0
  136. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/radiobutton.png +0 -0
  137. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/scrollbar-horizontal.png +0 -0
  138. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/scrollbar-vertical.png +0 -0
  139. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/slider-handle.png +0 -0
  140. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/slider-track-h.png +0 -0
  141. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/slider-track-v.png +0 -0
  142. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/switch-off.png +0 -0
  143. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/switch-on.png +0 -0
  144. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/tab-h.png +0 -0
  145. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/elements/tab-v.png +0 -0
  146. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/icons/bootstrap.ttf +0 -0
  147. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/icons/glyphmap.json +0 -0
  148. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/icons/icon_metrics.json +0 -0
  149. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
  150. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +0 -0
  151. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
  152. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +0 -0
  153. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
  154. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +0 -0
  155. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
  156. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +0 -0
  157. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
  158. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +0 -0
  159. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
  160. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +0 -0
  161. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
  162. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +0 -0
  163. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
  164. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +0 -0
  165. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
  166. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +0 -0
  167. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
  168. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +0 -0
  169. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
  170. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +0 -0
  171. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
  172. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +0 -0
  173. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
  174. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +0 -0
  175. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
  176. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +0 -0
  177. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
  178. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +0 -0
  179. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
  180. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +0 -0
  181. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
  182. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +0 -0
  183. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
  184. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +0 -0
  185. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
  186. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +0 -0
  187. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
  188. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +0 -0
  189. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
  190. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +0 -0
  191. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
  192. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +0 -0
  193. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
  194. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +0 -0
  195. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/cli/__main__.py +0 -0
  196. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/cli/appicon.py +0 -0
  197. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/cli/build.py +0 -0
  198. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/cli/config.py +0 -0
  199. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/cli/demo.py +0 -0
  200. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/cli/doctor.py +0 -0
  201. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/cli/icons.py +0 -0
  202. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/cli/promote.py +0 -0
  203. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/cli/pyinstaller.py +0 -0
  204. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/cli/start.py +0 -0
  205. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/clipboard.py +0 -0
  206. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/constants.py +0 -0
  207. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/data/README.md +0 -0
  208. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/data/__init__.py +0 -0
  209. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/data/_observable.py +0 -0
  210. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/data/base.py +0 -0
  211. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/data/file_source.py +0 -0
  212. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/data/memory_source.py +0 -0
  213. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/data/query.py +0 -0
  214. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/data/readers.py +0 -0
  215. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/data/sqlite_source.py +0 -0
  216. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/data/types.py +0 -0
  217. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/data/writers.py +0 -0
  218. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/dialogs/__init__.py +0 -0
  219. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/dialogs/_impl/__init__.py +0 -0
  220. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/dialogs/_impl/colorchooser.py +0 -0
  221. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/dialogs/_impl/datedialog.py +0 -0
  222. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/dialogs/_impl/filterdialog.py +0 -0
  223. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/dialogs/_impl/fontdialog.py +0 -0
  224. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/dialogs/_impl/formdialog.py +0 -0
  225. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/dialogs/_impl/message.py +0 -0
  226. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/dialogs/_impl/query.py +0 -0
  227. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/errors.py +0 -0
  228. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/events/__init__.py +0 -0
  229. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/events/_event.py +0 -0
  230. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/events/_payloads.py +0 -0
  231. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/events/_subscription.py +0 -0
  232. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/i18n/README.md +0 -0
  233. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/i18n/__init__.py +0 -0
  234. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/i18n/catalog.py +0 -0
  235. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/i18n/intl_format.py +0 -0
  236. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/i18n/msgcat.py +0 -0
  237. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/i18n/specs.py +0 -0
  238. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/images.py +0 -0
  239. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/py.typed +0 -0
  240. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/scheduling/__init__.py +0 -0
  241. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/scheduling/_schedule.py +0 -0
  242. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/shortcuts.py +0 -0
  243. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/signals/README.md +0 -0
  244. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/signals/__init__.py +0 -0
  245. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/signals/integration.py +0 -0
  246. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/signals/signal.py +0 -0
  247. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/signals/types.py +0 -0
  248. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/store.py +0 -0
  249. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/streams/__init__.py +0 -0
  250. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/streams/_stream.py +0 -0
  251. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/__init__.py +0 -0
  252. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/__init__.py +0 -0
  253. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/badge.py +0 -0
  254. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/button.py +0 -0
  255. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/buttongroup.py +0 -0
  256. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/calendar.py +0 -0
  257. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/checkbutton.py +0 -0
  258. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/combobox.py +0 -0
  259. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/contextmenu.py +0 -0
  260. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/entry.py +0 -0
  261. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/expander.py +0 -0
  262. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/field.py +0 -0
  263. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/frame.py +0 -0
  264. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/label.py +0 -0
  265. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/labelframe.py +0 -0
  266. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/listview.py +0 -0
  267. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/menubar.py +0 -0
  268. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/menubutton.py +0 -0
  269. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/panedwindow.py +0 -0
  270. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/progressbar.py +0 -0
  271. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/radiobutton.py +0 -0
  272. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/scale.py +0 -0
  273. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/scrollbar.py +0 -0
  274. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/separator.py +0 -0
  275. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/sidenav.py +0 -0
  276. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/sizegrip.py +0 -0
  277. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/spinbox.py +0 -0
  278. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/switch.py +0 -0
  279. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/tabitem.py +0 -0
  280. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/togglegroup.py +0 -0
  281. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/toolbutton.py +0 -0
  282. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/tooltip.py +0 -0
  283. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/treeview.py +0 -0
  284. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders/utils.py +0 -0
  285. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders_tk/__init__.py +0 -0
  286. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/builders_tk/defaults.py +0 -0
  287. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/element.py +0 -0
  288. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/fonts.py +0 -0
  289. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/style_builder_mixed.py +0 -0
  290. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/style_builder_tk.py +0 -0
  291. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/style_builder_ttk.py +0 -0
  292. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/theme.py +0 -0
  293. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/theme_provider.py +0 -0
  294. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/themes/__init__.py +0 -0
  295. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/tk_patch.py +0 -0
  296. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/token_maps.py +0 -0
  297. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/types.py +0 -0
  298. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/typography.py +0 -0
  299. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/style/utility.py +0 -0
  300. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/types.py +0 -0
  301. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/validation/__init__.py +0 -0
  302. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/validation/types.py +0 -0
  303. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/validation/validation_result.py +0 -0
  304. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/validation/validation_rules.py +0 -0
  305. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_core/__init__.py +0 -0
  306. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_core/app_config.py +0 -0
  307. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_core/container.py +0 -0
  308. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_core/context.py +0 -0
  309. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_core/events.py +0 -0
  310. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_core/field_mixin.py +0 -0
  311. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_core/icon_image_props.py +0 -0
  312. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_core/image_binding.py +0 -0
  313. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_core/navmodel.py +0 -0
  314. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_core/options.py +0 -0
  315. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_core/selection_group.py +0 -0
  316. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_core/window_controls.py +0 -0
  317. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/__init__.py +0 -0
  318. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/_internal/__init__.py +0 -0
  319. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/_internal/wrapper_base.py +0 -0
  320. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/_parts/__init__.py +0 -0
  321. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/_parts/numberentry_part.py +0 -0
  322. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/_parts/spinnerentry_part.py +0 -0
  323. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/_parts/textentry_part.py +0 -0
  324. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/__init__.py +0 -0
  325. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/_dateutils.py +0 -0
  326. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/_image_fit.py +0 -0
  327. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/accordion.py +0 -0
  328. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/buttongroup.py +0 -0
  329. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/calendar.py +0 -0
  330. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/compositeframe.py +0 -0
  331. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/dateentry.py +0 -0
  332. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/dropdownbutton.py +0 -0
  333. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/field.py +0 -0
  334. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/form.py +0 -0
  335. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/list/__init__.py +0 -0
  336. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/list/listitem.py +0 -0
  337. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/menu/__init__.py +0 -0
  338. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/menu/model.py +0 -0
  339. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/menu/render_native.py +0 -0
  340. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/menu/render_themed.py +0 -0
  341. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/numericentry.py +0 -0
  342. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/passwordentry.py +0 -0
  343. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/pathentry.py +0 -0
  344. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/radiogroup.py +0 -0
  345. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/scrolledtext.py +0 -0
  346. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/scrolledtext.pyi +0 -0
  347. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/scrollview.py +0 -0
  348. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/selectbox.py +0 -0
  349. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/shell/__init__.py +0 -0
  350. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/shell/content_host.py +0 -0
  351. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/shell/layout.py +0 -0
  352. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/shell/providers.py +0 -0
  353. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/shell/rail.py +0 -0
  354. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/shell/workspace.py +0 -0
  355. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/sidenav/__init__.py +0 -0
  356. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/sidenav/header.py +0 -0
  357. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/sidenav/separator.py +0 -0
  358. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/slider/__init__.py +0 -0
  359. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/spinnerentry.py +0 -0
  360. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/tableview/__init__.py +0 -0
  361. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/tableview/types.py +0 -0
  362. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/tabs/__init__.py +0 -0
  363. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/tabs/tabitem.py +0 -0
  364. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/tabs/tabs.py +0 -0
  365. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/tabs/tabview.py +0 -0
  366. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/__init__.py +0 -0
  367. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/change.py +0 -0
  368. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/codeeditor.py +0 -0
  369. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/core.py +0 -0
  370. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/decoration.py +0 -0
  371. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/diff.py +0 -0
  372. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +0 -0
  373. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +0 -0
  374. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +0 -0
  375. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +0 -0
  376. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +0 -0
  377. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +0 -0
  378. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/filter.py +0 -0
  379. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/search_overlay.py +0 -0
  380. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/sidebar.py +0 -0
  381. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/style_registry.py +0 -0
  382. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/textarea.py +0 -0
  383. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textarea/undo.py +0 -0
  384. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/textentry.py +0 -0
  385. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/timeentry.py +0 -0
  386. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/toast.py +0 -0
  387. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/togglegroup.py +0 -0
  388. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/toolbar.py +0 -0
  389. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/tooltip.py +0 -0
  390. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/tree/__init__.py +0 -0
  391. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/tree/source_binding.py +0 -0
  392. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/tree/treeitem.py +0 -0
  393. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/tree/treenode.py +0 -0
  394. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/composites/tree/treeview.py +0 -0
  395. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/mixins/__init__.py +0 -0
  396. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/mixins/configure_mixin.py +0 -0
  397. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/mixins/entry_mixin.py +0 -0
  398. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/mixins/font_mixin.py +0 -0
  399. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/mixins/icon_mixin.py +0 -0
  400. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/mixins/localization_mixin.py +0 -0
  401. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/mixins/signal_mixin.py +0 -0
  402. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/mixins/validation_mixin.py +0 -0
  403. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/__init__.py +0 -0
  404. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/_menubutton.py +0 -0
  405. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/badge.py +0 -0
  406. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/button.py +0 -0
  407. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/card.py +0 -0
  408. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/checkbutton.py +0 -0
  409. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/checktoggle.py +0 -0
  410. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/entry.py +0 -0
  411. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/flexframe.py +0 -0
  412. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/gridframe.py +0 -0
  413. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/label.py +0 -0
  414. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/labelframe.py +0 -0
  415. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/optionmenu.py +0 -0
  416. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/packframe.py +0 -0
  417. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/panedwindow.py +0 -0
  418. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/progressbar.py +0 -0
  419. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/radiobutton.py +0 -0
  420. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/radiotoggle.py +0 -0
  421. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/scrollbar.py +0 -0
  422. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/separator.py +0 -0
  423. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/sizegrip.py +0 -0
  424. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/spinbox.py +0 -0
  425. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/switch.py +0 -0
  426. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/_impl/primitives/treeview.py +0 -0
  427. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/avatar.py +0 -0
  428. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/boolean_controls.py +0 -0
  429. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/buttongroup.py +0 -0
  430. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/calendar.py +0 -0
  431. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/card.py +0 -0
  432. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/carousel.py +0 -0
  433. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/chart.py +0 -0
  434. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/codeeditor.py +0 -0
  435. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/contextmenu.py +0 -0
  436. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/datatable.py +0 -0
  437. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/datefield.py +0 -0
  438. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/divider.py +0 -0
  439. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/expander.py +0 -0
  440. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/form.py +0 -0
  441. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/gallery.py +0 -0
  442. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/gauge.py +0 -0
  443. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/grid.py +0 -0
  444. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/groupbox.py +0 -0
  445. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/listview.py +0 -0
  446. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/numberfield.py +0 -0
  447. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/pagestack.py +0 -0
  448. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/passwordfield.py +0 -0
  449. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/pathfield.py +0 -0
  450. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/picture.py +0 -0
  451. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/progressbar.py +0 -0
  452. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/radio_variants.py +0 -0
  453. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/radiogroup.py +0 -0
  454. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/scrollbar.py +0 -0
  455. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/scrollview.py +0 -0
  456. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/select.py +0 -0
  457. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/selectbutton.py +0 -0
  458. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/sidebar_toggle.py +0 -0
  459. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/sizegrip.py +0 -0
  460. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/slider.py +0 -0
  461. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/spinbox.py +0 -0
  462. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/spinnerfield.py +0 -0
  463. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/splash.py +0 -0
  464. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/splitview.py +0 -0
  465. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/stacks.py +0 -0
  466. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/statusbar.py +0 -0
  467. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/tabs.py +0 -0
  468. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/textarea.py +0 -0
  469. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/textfield.py +0 -0
  470. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/theme_toggle.py +0 -0
  471. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/timefield.py +0 -0
  472. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/toast.py +0 -0
  473. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/togglegroup.py +0 -0
  474. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/toolbar.py +0 -0
  475. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/tooltip.py +0 -0
  476. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/tree.py +0 -0
  477. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/types.py +0 -0
  478. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack/widgets/window.py +0 -0
  479. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack.egg-info/dependency_links.txt +0 -0
  480. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack.egg-info/entry_points.txt +0 -0
  481. {bootstack-0.1.0a16 → bootstack-0.1.2}/src/bootstack.egg-info/top_level.txt +0 -0
  482. {bootstack-0.1.0a16 → bootstack-0.1.2}/tests/test_events_doc_coverage.py +0 -0
  483. {bootstack-0.1.0a16 → bootstack-0.1.2}/tests/test_images.py +0 -0
  484. {bootstack-0.1.0a16 → bootstack-0.1.2}/tests/test_images_gui.py +0 -0
  485. {bootstack-0.1.0a16 → bootstack-0.1.2}/tests/test_intl_format.py +0 -0
  486. {bootstack-0.1.0a16 → bootstack-0.1.2}/tests/test_navmodel.py +0 -0
  487. {bootstack-0.1.0a16 → bootstack-0.1.2}/tests/test_store.py +0 -0
  488. {bootstack-0.1.0a16 → bootstack-0.1.2}/tests/test_theme_from_existing.py +0 -0
  489. {bootstack-0.1.0a16 → bootstack-0.1.2}/tests/test_validation_rules.py +0 -0
@@ -1,15 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bootstack
3
- Version: 0.1.0a16
3
+ Version: 0.1.2
4
4
  Summary: From idea to a shipped desktop app, fast — a declarative, reactive, batteries-included Python UI framework with 60+ widgets, semantic theming, and built-in packaging.
5
5
  Author-email: Israel Dryer <israel.dryer@gmail.com>
6
6
  License-Expression: MIT
7
7
  Project-URL: Homepage, https://github.com/israel-dryer/bootstack
8
8
  Project-URL: Documentation, https://bootstack.org/
9
9
  Keywords: tkinter,ttk,gui,desktop,python3,ui,widgets,theming,cross-platform,modern,framework,application-framework,desktop-ui,python-gui
10
- Classifier: Development Status :: 3 - Alpha
10
+ Classifier: Development Status :: 4 - Beta
11
11
  Classifier: Environment :: Win32 (MS Windows)
12
- Classifier: Environment :: X11 Applications :: GTK
12
+ Classifier: Environment :: MacOS X
13
+ Classifier: Environment :: X11 Applications
13
14
  Classifier: Intended Audience :: Developers
14
15
  Classifier: Programming Language :: Python :: 3
15
16
  Classifier: Programming Language :: Python :: 3.12
@@ -22,6 +23,7 @@ Description-Content-Type: text/markdown
22
23
  License-File: LICENSE
23
24
  License-File: NOTICE
24
25
  Requires-Dist: pillow<=12,>=10
26
+ Requires-Dist: pygments>=2.15
25
27
  Requires-Dist: typing-extensions>=4.10
26
28
  Requires-Dist: Babel>=2.12
27
29
  Requires-Dist: python-dateutil>=2.9
@@ -46,6 +48,7 @@ Requires-Dist: pydata-sphinx-theme; extra == "docs"
46
48
  Requires-Dist: sphinx-design; extra == "docs"
47
49
  Requires-Dist: sphinx-copybutton; extra == "docs"
48
50
  Requires-Dist: sphinx-autobuild; extra == "docs"
51
+ Requires-Dist: myst-parser; extra == "docs"
49
52
  Dynamic: license-file
50
53
 
51
54
  ![bootstack](https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/banner-readme.png)
@@ -59,8 +62,7 @@ Dynamic: license-file
59
62
  ![](https://img.shields.io/github/stars/israel-dryer/bootstack.svg)
60
63
  ![](https://img.shields.io/github/forks/israel-dryer/bootstack.svg)
61
64
 
62
- > **Pre-release.** The API may still change before 1.0. Full documentation is at
63
- > **[bootstack.org](https://bootstack.org)**.
65
+ > Full documentation is at **[bootstack.org](https://bootstack.org)**.
64
66
 
65
67
  ### From idea to a shipped desktop app — fast.
66
68
 
@@ -94,15 +96,26 @@ Most Python desktop frameworks make you fight the framework. bootstack gets out
94
96
  - **DataSource abstraction** — one interface over SQLite, in-memory, and file backends with filtering, sorting, pagination, and CRUD
95
97
  - **Data visualization** — embed `matplotlib` (and `seaborn`) figures with `Chart`; they recolor with the theme and live-update from a `Signal` or `DataSource` (optional `viz` extra)
96
98
  - **A real CLI** — scaffold, run, add pages/views/dialogs/themes, and package for distribution
99
+ - **Hot reload** — `bootstack dev app.py` updates the running app on save and keeps your place; module-level state and the active page survive the reload
97
100
  - **PyInstaller packaging built in** — `bootstack build` produces a standalone executable; no separate toolchain required
98
101
 
102
+ ## Hot reload
103
+
104
+ Edit and save — the running window updates in place. `bootstack dev app.py`
105
+ reloads the UI on every save while keeping your window position, module-level
106
+ state, and active page, so you never lose your spot.
107
+
108
+ <p align="center">
109
+ <video src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/docs/_static/examples/live-reload.mp4" controls muted loop playsinline></video>
110
+ </p>
111
+
99
112
  ## Installation
100
113
 
101
114
  Requires Python 3.12+ and Tk/Tcl (bundled with most Python distributions).
102
- bootstack is in pre-release, so opt in with `--pre`:
115
+ Install with pip:
103
116
 
104
117
  ```bash
105
- python -m pip install --pre bootstack
118
+ python -m pip install bootstack
106
119
  ```
107
120
 
108
121
  See the [installation guide](https://bootstack.org/getting-started/installation/)
@@ -264,6 +277,7 @@ bootstack appicon # Design an app icon and export it
264
277
  bootstack start MyApp # Create a new project (basic template)
265
278
  bootstack start MyApp --template appshell # ...or with sidebar navigation
266
279
  bootstack run # Run the app defined in the project config
280
+ bootstack dev app.py # Run with hot reload (live edit-and-save)
267
281
  bootstack add page Dashboard # Add a new page (appshell)
268
282
  bootstack add view Settings # Add a new view (basic)
269
283
  bootstack add dialog Preferences # Add a new dialog
@@ -9,8 +9,7 @@
9
9
  ![](https://img.shields.io/github/stars/israel-dryer/bootstack.svg)
10
10
  ![](https://img.shields.io/github/forks/israel-dryer/bootstack.svg)
11
11
 
12
- > **Pre-release.** The API may still change before 1.0. Full documentation is at
13
- > **[bootstack.org](https://bootstack.org)**.
12
+ > Full documentation is at **[bootstack.org](https://bootstack.org)**.
14
13
 
15
14
  ### From idea to a shipped desktop app — fast.
16
15
 
@@ -44,15 +43,26 @@ Most Python desktop frameworks make you fight the framework. bootstack gets out
44
43
  - **DataSource abstraction** — one interface over SQLite, in-memory, and file backends with filtering, sorting, pagination, and CRUD
45
44
  - **Data visualization** — embed `matplotlib` (and `seaborn`) figures with `Chart`; they recolor with the theme and live-update from a `Signal` or `DataSource` (optional `viz` extra)
46
45
  - **A real CLI** — scaffold, run, add pages/views/dialogs/themes, and package for distribution
46
+ - **Hot reload** — `bootstack dev app.py` updates the running app on save and keeps your place; module-level state and the active page survive the reload
47
47
  - **PyInstaller packaging built in** — `bootstack build` produces a standalone executable; no separate toolchain required
48
48
 
49
+ ## Hot reload
50
+
51
+ Edit and save — the running window updates in place. `bootstack dev app.py`
52
+ reloads the UI on every save while keeping your window position, module-level
53
+ state, and active page, so you never lose your spot.
54
+
55
+ <p align="center">
56
+ <video src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/docs/_static/examples/live-reload.mp4" controls muted loop playsinline></video>
57
+ </p>
58
+
49
59
  ## Installation
50
60
 
51
61
  Requires Python 3.12+ and Tk/Tcl (bundled with most Python distributions).
52
- bootstack is in pre-release, so opt in with `--pre`:
62
+ Install with pip:
53
63
 
54
64
  ```bash
55
- python -m pip install --pre bootstack
65
+ python -m pip install bootstack
56
66
  ```
57
67
 
58
68
  See the [installation guide](https://bootstack.org/getting-started/installation/)
@@ -214,6 +224,7 @@ bootstack appicon # Design an app icon and export it
214
224
  bootstack start MyApp # Create a new project (basic template)
215
225
  bootstack start MyApp --template appshell # ...or with sidebar navigation
216
226
  bootstack run # Run the app defined in the project config
227
+ bootstack dev app.py # Run with hot reload (live edit-and-save)
217
228
  bootstack add page Dashboard # Add a new page (appshell)
218
229
  bootstack add view Settings # Add a new view (basic)
219
230
  bootstack add dialog Preferences # Add a new dialog
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "bootstack"
7
- version = "0.1.0a16"
7
+ version = "0.1.2"
8
8
  description = "From idea to a shipped desktop app, fast — a declarative, reactive, batteries-included Python UI framework with 60+ widgets, semantic theming, and built-in packaging."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -29,9 +29,10 @@ keywords = [
29
29
  "python-gui"
30
30
  ]
31
31
  classifiers = [
32
- "Development Status :: 3 - Alpha",
32
+ "Development Status :: 4 - Beta",
33
33
  "Environment :: Win32 (MS Windows)",
34
- "Environment :: X11 Applications :: GTK",
34
+ "Environment :: MacOS X",
35
+ "Environment :: X11 Applications",
35
36
  "Intended Audience :: Developers",
36
37
  "Programming Language :: Python :: 3",
37
38
  "Programming Language :: Python :: 3.12",
@@ -44,6 +45,9 @@ classifiers = [
44
45
  dependencies = [
45
46
  "pillow>=10,<=12",
46
47
 
48
+ # Syntax highlighting for the CodeEditor widget
49
+ "pygments>=2.15",
50
+
47
51
  # Backported typing primitives (Self, Unpack, ParamSpec, etc.)
48
52
  "typing-extensions>=4.10",
49
53
 
@@ -88,6 +92,7 @@ docs = [
88
92
  "sphinx-design",
89
93
  "sphinx-copybutton",
90
94
  "sphinx-autobuild",
95
+ "myst-parser",
91
96
  ]
92
97
 
93
98
  [project.urls]
@@ -109,7 +114,7 @@ where = ["src"]
109
114
  ]
110
115
 
111
116
  [tool.bumpversion]
112
- current_version = "0.1.0a16"
117
+ current_version = "0.1.2"
113
118
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)((?P<pre>a|b|rc)(?P<pre_n>\\d+))?"
114
119
  serialize = [
115
120
  "{major}.{minor}.{patch}{pre}{pre_n}",
@@ -52,6 +52,79 @@ class WindowPositioning:
52
52
  >>> # Returns adjusted coordinates within screen bounds
53
53
  """
54
54
 
55
+ # Per-process cache of the macOS visible frame (work area) per monitor rect,
56
+ # keyed by the full monitor bounds. Computed once via a clamped probe.
57
+ _work_area_cache: dict[Tuple[int, int, int, int], Tuple[int, int, int, int]] = {}
58
+
59
+ @staticmethod
60
+ def get_work_area(
61
+ root: Optional[tkinter.Misc],
62
+ monitor_rect: Tuple[int, int, int, int],
63
+ ) -> Tuple[int, int, int, int]:
64
+ """Return the usable area of a monitor, OS-reserved strips excluded.
65
+
66
+ On macOS the menu bar (top) and Dock sit *inside* the physical monitor
67
+ bounds, so anchoring a window to the raw monitor rect lands it under the
68
+ Dock. Tk exposes no `NSScreen.visibleFrame` accessor, so this clamps a
69
+ throwaway, fully transparent managed Toplevel to the monitor — Aqua snaps
70
+ a managed window to the visible frame — and reads back the realized
71
+ origin and size. The result is cached per monitor rect.
72
+
73
+ Off macOS the full `monitor_rect` is returned unchanged: the X11/Windows
74
+ transient path already clears the taskbar via a topmost overlay.
75
+
76
+ Args:
77
+ root: A live widget used to parent the probe. If None, the full
78
+ `monitor_rect` is returned unchanged.
79
+ monitor_rect: `(x, y, w, h)` full bounds of the target monitor.
80
+
81
+ Returns:
82
+ `(x, y, w, h)` of the usable work area within `monitor_rect`.
83
+ """
84
+ if root is None:
85
+ return monitor_rect
86
+ try:
87
+ if root.tk.call("tk", "windowingsystem") != "aqua":
88
+ return monitor_rect
89
+ except tkinter.TclError:
90
+ return monitor_rect
91
+
92
+ cached = WindowPositioning._work_area_cache.get(monitor_rect)
93
+ if cached is not None:
94
+ return cached
95
+
96
+ mx, my, mw, mh = monitor_rect
97
+ area = monitor_rect
98
+ probe: Optional[tkinter.Toplevel] = None
99
+ try:
100
+ probe = tkinter.Toplevel(root)
101
+ try:
102
+ probe.attributes("-alpha", 0.0) # invisible — no flash
103
+ except tkinter.TclError:
104
+ pass
105
+ # Oversize and place at the monitor origin; a managed Aqua window is
106
+ # clamped to that monitor's visible frame, so the realized geometry
107
+ # is the work area (menu bar + Dock excluded).
108
+ probe.geometry(f"{mw * 2}x{mh * 2}+{mx}+{my}")
109
+ probe.update_idletasks()
110
+ x, y = probe.winfo_rootx(), probe.winfo_rooty()
111
+ w, h = probe.winfo_width(), probe.winfo_height()
112
+ # Guard a degenerate probe (e.g. 1x1 if it never mapped): only trust
113
+ # a result that fills most of the monitor.
114
+ if w >= mw // 2 and h >= mh // 2:
115
+ area = (x, y, w, h)
116
+ except tkinter.TclError:
117
+ pass
118
+ finally:
119
+ if probe is not None:
120
+ try:
121
+ probe.destroy()
122
+ except tkinter.TclError:
123
+ pass
124
+
125
+ WindowPositioning._work_area_cache[monitor_rect] = area
126
+ return area
127
+
55
128
  @staticmethod
56
129
  def _get_monitor_at_point(x: int, y: int) -> Optional[Tuple[int, int, int, int]]:
57
130
  """Find the monitor containing the given point.
@@ -9,6 +9,7 @@ The bootstack CLI provides commands for:
9
9
  Usage:
10
10
  bootstack start <appname> Create a new project
11
11
  bootstack run [path] Run the application
12
+ bootstack dev [path] Run with hot reload (live edit-and-save)
12
13
  bootstack promote --pyinstaller Enable PyInstaller support
13
14
  bootstack build Build for distribution
14
15
  bootstack add page <ClassName> Add a new page (AppShell)
@@ -26,7 +27,7 @@ import argparse
26
27
  import sys
27
28
  from typing import Sequence
28
29
 
29
- from bootstack.cli import add, appicon, build, doctor, icons, promote, run, start
30
+ from bootstack.cli import add, appicon, build, dev, doctor, icons, promote, run, start
30
31
  from bootstack.cli.demo import run_demo
31
32
 
32
33
 
@@ -42,6 +43,7 @@ Examples:
42
43
  bootstack start MyApp --template appshell Create an AppShell project
43
44
  bootstack start MyApp --theme superhero Use a specific theme
44
45
  bootstack run Run the application
46
+ bootstack dev app.py Run with hot reload
45
47
  bootstack promote --pyinstaller Enable PyInstaller support
46
48
  bootstack build Build for distribution
47
49
  bootstack add view SettingsView Add a new view
@@ -75,6 +77,7 @@ For more information on a command:
75
77
  # Register commands
76
78
  start.add_parser(subparsers)
77
79
  run.add_parser(subparsers)
80
+ dev.add_parser(subparsers)
78
81
  promote.add_parser(subparsers)
79
82
  build.add_parser(subparsers)
80
83
  add.add_parser(subparsers)
@@ -6,7 +6,12 @@ import argparse
6
6
  from pathlib import Path
7
7
 
8
8
  from bootstack.cli.config import TtkbConfig, find_config
9
- from bootstack.cli.templates import create_dialog, create_page, create_view
9
+ from bootstack.cli.templates import (
10
+ _build_func_name,
11
+ create_dialog,
12
+ create_page,
13
+ create_view,
14
+ )
10
15
 
11
16
 
12
17
  def add_parser(subparsers: argparse._SubParsersAction) -> None:
@@ -202,6 +207,7 @@ def run_add_page(args: argparse.Namespace) -> None:
202
207
  scrollable = args.scrollable
203
208
  file_path = create_page(class_name, target_dir, scrollable=scrollable)
204
209
 
210
+ func_name = _build_func_name(class_name)
205
211
  print(f"Created page: {file_path.relative_to(project_root)}")
206
212
  print()
207
213
  print("This created the file only - it is NOT yet shown in the sidebar.")
@@ -209,10 +215,11 @@ def run_add_page(args: argparse.Namespace) -> None:
209
215
  print("inside your shell.page_nav() block:")
210
216
  print()
211
217
  import_module = f"{module_name}.pages" if module_name else "<module>.pages"
212
- print(f" from {import_module}.{file_path.stem} import {class_name}")
218
+ print(f" from {import_module}.{file_path.stem} import {func_name}")
213
219
  scrollable_arg = ", scrollable=True" if scrollable else ""
214
- print(f' with nav.add_page("<id>", text="<Label>", icon="<icon>"{scrollable_arg}):')
215
- print(f" {class_name}()")
220
+ print(f' with nav.add_page("<id>", text="<Label>", icon="<icon>",')
221
+ print(f' padding=20, gap=12, horizontal_items="stretch"{scrollable_arg}):')
222
+ print(f" {func_name}()")
216
223
 
217
224
 
218
225
  def run_add_dialog(args: argparse.Namespace) -> None:
@@ -0,0 +1,153 @@
1
+ """bootstack dev command - Run an application with hot reload.
2
+
3
+ PROVISIONAL — the dev workflow ships in 0.1.0 but is carved out of the API
4
+ freeze and may change in a minor release.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import argparse
10
+ import os
11
+ import subprocess
12
+ import sys
13
+ import threading
14
+ from pathlib import Path
15
+
16
+ from bootstack.cli.config import TtkbConfig, find_config
17
+
18
+
19
+ def add_parser(subparsers: argparse._SubParsersAction) -> None:
20
+ """Add the 'dev' subcommand parser."""
21
+ parser = subparsers.add_parser(
22
+ "dev",
23
+ help="Run the application with hot reload",
24
+ description=(
25
+ "Run the application with live reload. Saving a source file updates "
26
+ "the running app. A module-level `with bs.App()` reloads in place "
27
+ "(state preserved); anything else falls back to a process restart."
28
+ ),
29
+ )
30
+ parser.add_argument(
31
+ "path",
32
+ nargs="?",
33
+ default=None,
34
+ help="Path to entry point or directory with bootstack.toml (default: current directory)",
35
+ )
36
+ parser.add_argument(
37
+ "--restart",
38
+ action="store_true",
39
+ help="Always reload by restarting the process, even for a module-level app",
40
+ )
41
+ parser.set_defaults(func=run_dev)
42
+
43
+
44
+ def run_dev(args: argparse.Namespace) -> None:
45
+ """Execute the dev command."""
46
+ resolved = _resolve_entry(args.path)
47
+ if resolved is None:
48
+ return
49
+ entry_point, project_root = resolved
50
+
51
+ if not entry_point.exists():
52
+ print(f"Error: Entry point '{entry_point}' does not exist.")
53
+ return
54
+
55
+ try:
56
+ display_path = entry_point.relative_to(project_root)
57
+ except ValueError:
58
+ display_path = entry_point
59
+ print(f"Starting {display_path} with hot reload...")
60
+ print("(Save a file to reload. Press Ctrl+C to stop.)")
61
+ print()
62
+
63
+ env = dict(os.environ)
64
+ env["BOOTSTACK_DEV"] = "1"
65
+ env["BOOTSTACK_DEV_MODE"] = "restart" if args.restart else "inprocess"
66
+
67
+ src_dir = project_root / "src"
68
+ if src_dir.exists():
69
+ python_path = env.get("PYTHONPATH", "")
70
+ env["PYTHONPATH"] = (
71
+ f"{src_dir}{os.pathsep}{python_path}" if python_path else str(src_dir)
72
+ )
73
+
74
+ # Supervise the app here rather than letting it os.execv itself on restart:
75
+ # on Windows execv does not replace the process in place — it spawns a new
76
+ # PID and terminates the caller, which would drop this supervisor after the
77
+ # first reload and orphan the app. The child re-launches by exiting with
78
+ # DEV_RESTART_EXIT_CODE; looping subprocess.run is portable and re-establishes
79
+ # cwd + env on every relaunch.
80
+ from bootstack.dev._env import DEV_RESTART_EXIT_CODE
81
+
82
+ try:
83
+ while True:
84
+ result = subprocess.run(
85
+ [sys.executable, str(entry_point.resolve())],
86
+ cwd=str(project_root),
87
+ env=env,
88
+ )
89
+ if result.returncode == DEV_RESTART_EXIT_CODE:
90
+ continue # a valid edit asked for a clean restart
91
+ if result.returncode == 0:
92
+ sys.exit(0) # the app window was closed normally
93
+ # The app crashed (e.g. an edit raised at import). Don't end the
94
+ # session — stay alive and relaunch when the file is fixed and
95
+ # saved. This is the restart-mode counterpart to the in-process
96
+ # error banner's fix-and-save recovery; the child's own watcher
97
+ # died with it, so the supervisor watches in the meantime.
98
+ print(
99
+ f"\n[bootstack dev] app exited with code {result.returncode} - "
100
+ "waiting for a change to retry (Ctrl+C to stop)...",
101
+ flush=True,
102
+ )
103
+ _wait_for_change(str(project_root))
104
+ except KeyboardInterrupt:
105
+ print("\nStopped.")
106
+ sys.exit(0)
107
+
108
+
109
+ def _wait_for_change(root: str) -> None:
110
+ """Block until a watched source file under `root` changes (or Ctrl+C).
111
+
112
+ Used by the restart supervisor to stay alive after the app crashes: rather
113
+ than ending the dev session, it waits for the next save and lets the loop
114
+ relaunch.
115
+ """
116
+ from bootstack.dev._watcher import PollWatcher
117
+
118
+ changed = threading.Event()
119
+ watcher = PollWatcher(root, lambda _paths: changed.set())
120
+ watcher.start()
121
+ try:
122
+ # Short timed waits keep Ctrl+C responsive on Windows, where a bare
123
+ # Event.wait() with no timeout can swallow the interrupt.
124
+ while not changed.wait(0.3):
125
+ pass
126
+ finally:
127
+ watcher.stop()
128
+
129
+
130
+ def _resolve_entry(path: str | None) -> tuple[Path, Path] | None:
131
+ """Resolve (entry_point, project_root) from a path or bootstack.toml."""
132
+ if path:
133
+ p = Path(path)
134
+ if p.is_file() and p.suffix == ".py":
135
+ return p, p.parent
136
+ if p.is_dir():
137
+ config_path = p / "bootstack.toml"
138
+ if not config_path.exists():
139
+ print(f"Error: No bootstack.toml found in '{p}'")
140
+ return None
141
+ config = TtkbConfig.load(config_path)
142
+ return p / config.app.entry, p
143
+ print(f"Error: '{path}' is not a valid file or directory")
144
+ return None
145
+
146
+ config_path = find_config()
147
+ if config_path is None:
148
+ print("Error: No bootstack.toml found in current directory or parents.")
149
+ print("Pass a path: bootstack dev app.py")
150
+ return None
151
+ config = TtkbConfig.load(config_path)
152
+ project_root = config_path.parent
153
+ return project_root / config.app.entry, project_root
@@ -85,7 +85,7 @@ def run_run(args: argparse.Namespace) -> None:
85
85
 
86
86
  try:
87
87
  result = subprocess.run(
88
- [sys.executable, str(entry_point)],
88
+ [sys.executable, str(entry_point.resolve())],
89
89
  cwd=str(project_root),
90
90
  env=env,
91
91
  )