bootstack 0.1.0a11__tar.gz → 0.1.0a12__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 (505) hide show
  1. {bootstack-0.1.0a11/src/bootstack.egg-info → bootstack-0.1.0a12}/PKG-INFO +36 -19
  2. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/README.md +35 -18
  3. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/pyproject.toml +2 -2
  4. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/__init__.py +8 -8
  5. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/images.py +2 -2
  6. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_runtime/app.py +3 -3
  7. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_runtime/base_window.py +37 -17
  8. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_runtime/toplevel.py +14 -14
  9. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_runtime/utility.py +66 -0
  10. bootstack-0.1.0a12/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
  11. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +3 -0
  12. bootstack-0.1.0a12/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
  13. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +3 -0
  14. bootstack-0.1.0a12/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
  15. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +3 -0
  16. bootstack-0.1.0a12/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
  17. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +3 -0
  18. bootstack-0.1.0a12/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
  19. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +3 -0
  20. bootstack-0.1.0a12/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
  21. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +3 -0
  22. bootstack-0.1.0a12/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
  23. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +3 -0
  24. bootstack-0.1.0a12/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
  25. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +3 -0
  26. bootstack-0.1.0a12/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
  27. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +3 -0
  28. bootstack-0.1.0a12/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
  29. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +3 -0
  30. bootstack-0.1.0a12/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
  31. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +3 -0
  32. bootstack-0.1.0a12/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
  33. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +3 -0
  34. bootstack-0.1.0a12/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
  35. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +3 -0
  36. bootstack-0.1.0a12/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
  37. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +3 -0
  38. bootstack-0.1.0a12/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
  39. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +3 -0
  40. bootstack-0.1.0a12/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
  41. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +3 -0
  42. bootstack-0.1.0a12/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
  43. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +3 -0
  44. bootstack-0.1.0a12/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
  45. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +3 -0
  46. bootstack-0.1.0a12/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
  47. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +3 -0
  48. bootstack-0.1.0a12/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
  49. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +3 -0
  50. bootstack-0.1.0a12/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
  51. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +3 -0
  52. bootstack-0.1.0a12/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
  53. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +3 -0
  54. bootstack-0.1.0a12/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
  55. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +3 -0
  56. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/cli/add.py +5 -4
  57. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/cli/appicon.py +22 -22
  58. bootstack-0.1.0a12/src/bootstack/cli/demo.py +564 -0
  59. bootstack-0.1.0a12/src/bootstack/cli/icons.py +98 -0
  60. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/cli/templates/__init__.py +55 -52
  61. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/constants.py +10 -10
  62. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/data/file_source.py +3 -3
  63. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/data/memory_source.py +34 -14
  64. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/data/writers.py +1 -1
  65. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/dialogs/__init__.py +13 -12
  66. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/__init__.py +10 -14
  67. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/colorchooser.py +82 -33
  68. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/datedialog.py +43 -19
  69. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/dialog.py +61 -7
  70. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/filterdialog.py +16 -11
  71. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/fontdialog.py +3 -16
  72. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/formdialog.py +25 -6
  73. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/message.py +1 -0
  74. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/query.py +1 -0
  75. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/i18n/__init__.py +3 -3
  76. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/i18n/catalog.py +3 -3
  77. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/i18n/specs.py +2 -2
  78. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/images.py +18 -2
  79. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/scheduling/__init__.py +2 -2
  80. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/shortcuts.py +2 -2
  81. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/signals/signal.py +35 -0
  82. bootstack-0.1.0a12/src/bootstack/streams/__init__.py +12 -0
  83. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/frame.py +9 -1
  84. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/typography.py +3 -3
  85. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/types.py +2 -0
  86. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/validation/types.py +4 -4
  87. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/validation/validation_rules.py +70 -4
  88. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/__init__.py +5 -4
  89. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/base.py +58 -6
  90. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/container.py +133 -1
  91. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/field_mixin.py +80 -8
  92. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/window_menu.py +44 -2
  93. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/_parts/numberentry_part.py +30 -2
  94. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/_parts/spinnerentry_part.py +49 -0
  95. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/_parts/textentry_part.py +24 -0
  96. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/avatar.py +1 -1
  97. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/buttongroup.py +1 -1
  98. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/calendar.py +30 -15
  99. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/carousel.py +7 -2
  100. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/compositeframe.py +2 -2
  101. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/contextmenu.py +47 -10
  102. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/field.py +22 -12
  103. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/form.py +63 -27
  104. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/gallery.py +54 -4
  105. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/list/listview.py +6 -13
  106. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/menu/model.py +4 -4
  107. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/meter.py +20 -9
  108. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/pagestack.py +7 -0
  109. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/passwordentry.py +12 -1
  110. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/picture.py +3 -3
  111. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/scrollview.py +3 -4
  112. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/content_host.py +8 -2
  113. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/layout.py +13 -4
  114. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/nav_panel.py +3 -3
  115. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/providers.py +3 -3
  116. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/shell.py +17 -4
  117. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/workspace.py +16 -3
  118. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/slider/_shared.py +34 -8
  119. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/slider/rangeslider.py +186 -57
  120. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/slider/slider.py +141 -49
  121. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/spinnerentry.py +8 -0
  122. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tableview/tableview.py +70 -30
  123. bootstack-0.1.0a12/src/bootstack/widgets/_impl/composites/tabs/tabs.py +974 -0
  124. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tabs/tabview.py +12 -8
  125. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/core.py +34 -3
  126. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +17 -2
  127. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +2 -2
  128. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/search_overlay.py +22 -1
  129. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/style_registry.py +25 -3
  130. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/textarea.py +33 -1
  131. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/timeentry.py +15 -11
  132. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/toolbar.py +31 -3
  133. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tooltip.py +83 -10
  134. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/configure_mixin.py +12 -12
  135. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/font_mixin.py +4 -4
  136. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/icon_mixin.py +4 -4
  137. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/validation_mixin.py +17 -3
  138. bootstack-0.1.0a12/src/bootstack/widgets/_impl/primitives/flexframe.py +448 -0
  139. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/frame.py +53 -0
  140. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/gridframe.py +25 -6
  141. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/packframe.py +5 -2
  142. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/app.py +51 -26
  143. bootstack-0.1.0a12/src/bootstack/widgets/appshell.py +1046 -0
  144. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/button.py +51 -13
  145. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/buttongroup.py +1 -1
  146. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/card.py +56 -43
  147. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/carousel.py +3 -2
  148. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/codeeditor.py +20 -5
  149. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/contextmenu.py +11 -8
  150. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/datefield.py +11 -17
  151. bootstack-0.1.0a11/src/bootstack/widgets/separator.py → bootstack-0.1.0a12/src/bootstack/widgets/divider.py +6 -5
  152. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/expander.py +119 -114
  153. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/form.py +31 -0
  154. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/grid.py +36 -20
  155. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/groupbox.py +56 -43
  156. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/listview.py +2 -2
  157. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/menubutton.py +43 -42
  158. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/numberfield.py +11 -9
  159. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/pagestack.py +57 -46
  160. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/passwordfield.py +2 -3
  161. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/pathfield.py +58 -3
  162. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/scrollview.py +14 -12
  163. bootstack-0.1.0a12/src/bootstack/widgets/sidebar_toggle.py +130 -0
  164. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/slider.py +33 -1
  165. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/spinnerfield.py +26 -3
  166. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/splitview.py +137 -105
  167. bootstack-0.1.0a12/src/bootstack/widgets/stacks.py +249 -0
  168. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/statusbar.py +39 -19
  169. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/tabs.py +66 -48
  170. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/textarea.py +5 -3
  171. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/textfield.py +10 -5
  172. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/timefield.py +13 -19
  173. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/toolbar.py +74 -30
  174. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/tooltip.py +13 -0
  175. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/tree.py +2 -2
  176. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/types.py +19 -3
  177. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/window.py +56 -25
  178. {bootstack-0.1.0a11 → bootstack-0.1.0a12/src/bootstack.egg-info}/PKG-INFO +36 -19
  179. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack.egg-info/SOURCES.txt +3 -3
  180. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/tests/test_public_surface.py +2 -2
  181. bootstack-0.1.0a11/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
  182. bootstack-0.1.0a11/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
  183. bootstack-0.1.0a11/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
  184. bootstack-0.1.0a11/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
  185. bootstack-0.1.0a11/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
  186. bootstack-0.1.0a11/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
  187. bootstack-0.1.0a11/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
  188. bootstack-0.1.0a11/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
  189. bootstack-0.1.0a11/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
  190. bootstack-0.1.0a11/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
  191. bootstack-0.1.0a11/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
  192. bootstack-0.1.0a11/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
  193. bootstack-0.1.0a11/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
  194. bootstack-0.1.0a11/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
  195. bootstack-0.1.0a11/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
  196. bootstack-0.1.0a11/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
  197. bootstack-0.1.0a11/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
  198. bootstack-0.1.0a11/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
  199. bootstack-0.1.0a11/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
  200. bootstack-0.1.0a11/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
  201. bootstack-0.1.0a11/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
  202. bootstack-0.1.0a11/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
  203. bootstack-0.1.0a11/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
  204. bootstack-0.1.0a11/src/bootstack/cli/demo.py +0 -937
  205. bootstack-0.1.0a11/src/bootstack/cli/icons.py +0 -327
  206. bootstack-0.1.0a11/src/bootstack/dialogs/_impl/colordropper.py +0 -257
  207. bootstack-0.1.0a11/src/bootstack/streams/__init__.py +0 -12
  208. bootstack-0.1.0a11/src/bootstack/widgets/_impl/composites/floodgauge.py +0 -427
  209. bootstack-0.1.0a11/src/bootstack/widgets/_impl/composites/tabs/tabs.py +0 -567
  210. bootstack-0.1.0a11/src/bootstack/widgets/appshell.py +0 -798
  211. bootstack-0.1.0a11/src/bootstack/widgets/stacks.py +0 -214
  212. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/LICENSE +0 -0
  213. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/MANIFEST.in +0 -0
  214. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/NOTICE +0 -0
  215. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/setup.cfg +0 -0
  216. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/__main__.py +0 -0
  217. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/__init__.py +0 -0
  218. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/__init__.py +0 -0
  219. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/after.py +0 -0
  220. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/bind.py +0 -0
  221. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/bindtags.py +0 -0
  222. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/busy.py +0 -0
  223. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/clipboard.py +0 -0
  224. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/focus.py +0 -0
  225. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/grab.py +0 -0
  226. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/grid.py +0 -0
  227. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/localization.py +0 -0
  228. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/pack.py +0 -0
  229. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/place.py +0 -0
  230. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/selection.py +0 -0
  231. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/signals.py +0 -0
  232. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/winfo.py +0 -0
  233. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/colorutils.py +0 -0
  234. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/exceptions.py +0 -0
  235. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/mixins/__init__.py +0 -0
  236. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/mixins/ttk_state.py +0 -0
  237. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/mixins/widget.py +0 -0
  238. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/paths.py +0 -0
  239. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/publisher.py +0 -0
  240. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_core/variables.py +0 -0
  241. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_runtime/__init__.py +0 -0
  242. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_runtime/events.py +0 -0
  243. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_runtime/shortcuts.py +0 -0
  244. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_runtime/tk_patch.py +0 -0
  245. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_runtime/visual_focus.py +0 -0
  246. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/_runtime/window_utilities.py +0 -0
  247. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/__init__.py +0 -0
  248. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/bootstack.ico +0 -0
  249. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/bootstack.png +0 -0
  250. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/__init__.py +0 -0
  251. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/badge-pill.png +0 -0
  252. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/badge-square.png +0 -0
  253. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/button-compact.png +0 -0
  254. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/button-default.png +0 -0
  255. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
  256. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
  257. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
  258. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
  259. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
  260. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
  261. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
  262. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
  263. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
  264. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
  265. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
  266. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
  267. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/card.png +0 -0
  268. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/checkbox-checked.png +0 -0
  269. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/checkbox-indeterminate.png +0 -0
  270. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/checkbox-unchecked.png +0 -0
  271. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/field.png +0 -0
  272. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/input-addon-compact.png +0 -0
  273. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/input-addon-default.png +0 -0
  274. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/input-compact.png +0 -0
  275. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/input-default.png +0 -0
  276. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/list-item-separated.png +0 -0
  277. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/list-item.png +0 -0
  278. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/listrow-compact.png +0 -0
  279. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/listrow-default.png +0 -0
  280. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/manifest.toml +0 -0
  281. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/menu-item.png +0 -0
  282. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/navitem-compact.png +0 -0
  283. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/navitem-default.png +0 -0
  284. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/progressbar-h-compact.png +0 -0
  285. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/progressbar-h-default.png +0 -0
  286. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/progressbar-v-compact.png +0 -0
  287. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/progressbar-v-default.png +0 -0
  288. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/radiobutton.png +0 -0
  289. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/scrollbar-horizontal.png +0 -0
  290. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/scrollbar-vertical.png +0 -0
  291. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/slider-handle.png +0 -0
  292. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/slider-track-h.png +0 -0
  293. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/slider-track-v.png +0 -0
  294. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/switch-off.png +0 -0
  295. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/switch-on.png +0 -0
  296. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/tab-h.png +0 -0
  297. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/elements/tab-v.png +0 -0
  298. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/icons/bootstrap.ttf +0 -0
  299. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/icons/glyphmap.json +0 -0
  300. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/assets/icons/icon_metrics.json +0 -0
  301. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/cli/__init__.py +0 -0
  302. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/cli/__main__.py +0 -0
  303. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/cli/build.py +0 -0
  304. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/cli/config.py +0 -0
  305. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/cli/doctor.py +0 -0
  306. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/cli/promote.py +0 -0
  307. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/cli/pyinstaller.py +0 -0
  308. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/cli/run.py +0 -0
  309. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/cli/start.py +0 -0
  310. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/clipboard.py +0 -0
  311. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/data/README.md +0 -0
  312. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/data/__init__.py +0 -0
  313. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/data/_observable.py +0 -0
  314. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/data/base.py +0 -0
  315. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/data/query.py +0 -0
  316. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/data/readers.py +0 -0
  317. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/data/sqlite_source.py +0 -0
  318. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/data/types.py +0 -0
  319. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/errors.py +0 -0
  320. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/events/__init__.py +0 -0
  321. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/events/_event.py +0 -0
  322. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/events/_payloads.py +0 -0
  323. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/events/_subscription.py +0 -0
  324. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/i18n/README.md +0 -0
  325. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/i18n/intl_format.py +0 -0
  326. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/i18n/msgcat.py +0 -0
  327. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/py.typed +0 -0
  328. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/scheduling/_schedule.py +0 -0
  329. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/signals/README.md +0 -0
  330. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/signals/__init__.py +0 -0
  331. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/signals/integration.py +0 -0
  332. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/signals/types.py +0 -0
  333. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/store.py +0 -0
  334. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/streams/_stream.py +0 -0
  335. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/__init__.py +0 -0
  336. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/__init__.py +0 -0
  337. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/badge.py +0 -0
  338. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/button.py +0 -0
  339. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/buttongroup.py +0 -0
  340. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/calendar.py +0 -0
  341. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/checkbutton.py +0 -0
  342. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/combobox.py +0 -0
  343. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/contextmenu.py +0 -0
  344. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/entry.py +0 -0
  345. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/expander.py +0 -0
  346. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/field.py +0 -0
  347. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/label.py +0 -0
  348. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/labelframe.py +0 -0
  349. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/listview.py +0 -0
  350. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/menubar.py +0 -0
  351. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/menubutton.py +0 -0
  352. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/panedwindow.py +0 -0
  353. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/progressbar.py +0 -0
  354. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/radiobutton.py +0 -0
  355. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/scale.py +0 -0
  356. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/scrollbar.py +0 -0
  357. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/separator.py +0 -0
  358. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/sidenav.py +0 -0
  359. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/sizegrip.py +0 -0
  360. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/spinbox.py +0 -0
  361. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/switch.py +0 -0
  362. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/tabitem.py +0 -0
  363. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/togglegroup.py +0 -0
  364. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/toolbutton.py +0 -0
  365. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/tooltip.py +0 -0
  366. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/treeview.py +0 -0
  367. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders/utils.py +0 -0
  368. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders_tk/__init__.py +0 -0
  369. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/builders_tk/defaults.py +0 -0
  370. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/element.py +0 -0
  371. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/fonts.py +0 -0
  372. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/style.py +0 -0
  373. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/style_builder_base.py +0 -0
  374. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/style_builder_mixed.py +0 -0
  375. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/style_builder_tk.py +0 -0
  376. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/style_builder_ttk.py +0 -0
  377. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/style_resolver.py +0 -0
  378. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/theme.py +0 -0
  379. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/theme_provider.py +0 -0
  380. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/themes/__init__.py +0 -0
  381. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/tk_patch.py +0 -0
  382. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/token_maps.py +0 -0
  383. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/types.py +0 -0
  384. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/style/utility.py +0 -0
  385. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/validation/__init__.py +0 -0
  386. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/validation/validation_result.py +0 -0
  387. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/__init__.py +0 -0
  388. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/app_config.py +0 -0
  389. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/context.py +0 -0
  390. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/events.py +0 -0
  391. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/icon_image_props.py +0 -0
  392. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/image_binding.py +0 -0
  393. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/navmodel.py +0 -0
  394. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/options.py +0 -0
  395. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/selection_group.py +0 -0
  396. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/window_controls.py +0 -0
  397. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/__init__.py +0 -0
  398. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/_internal/__init__.py +0 -0
  399. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/_internal/wrapper_base.py +0 -0
  400. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/_parts/__init__.py +0 -0
  401. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/__init__.py +0 -0
  402. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/_dateutils.py +0 -0
  403. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/_image_fit.py +0 -0
  404. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/accordion.py +0 -0
  405. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/dateentry.py +0 -0
  406. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/dropdownbutton.py +0 -0
  407. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/expander.py +0 -0
  408. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/list/__init__.py +0 -0
  409. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/list/listitem.py +0 -0
  410. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/menu/__init__.py +0 -0
  411. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/menu/render_native.py +0 -0
  412. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/menu/render_themed.py +0 -0
  413. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/numericentry.py +0 -0
  414. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/pathentry.py +0 -0
  415. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/radiogroup.py +0 -0
  416. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/scrolledtext.py +0 -0
  417. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/scrolledtext.pyi +0 -0
  418. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/selectbox.py +0 -0
  419. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/__init__.py +0 -0
  420. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/rail.py +0 -0
  421. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/sidenav/__init__.py +0 -0
  422. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/sidenav/header.py +0 -0
  423. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/sidenav/separator.py +0 -0
  424. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/slider/__init__.py +0 -0
  425. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tableview/__init__.py +0 -0
  426. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tableview/types.py +0 -0
  427. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tabs/__init__.py +0 -0
  428. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tabs/tabitem.py +0 -0
  429. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/__init__.py +0 -0
  430. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/change.py +0 -0
  431. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/codeeditor.py +0 -0
  432. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/decoration.py +0 -0
  433. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/diff.py +0 -0
  434. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +0 -0
  435. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +0 -0
  436. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +0 -0
  437. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +0 -0
  438. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/filter.py +0 -0
  439. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/sidebar.py +0 -0
  440. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/undo.py +0 -0
  441. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textentry.py +0 -0
  442. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/toast.py +0 -0
  443. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/toast_stack.py +0 -0
  444. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/togglegroup.py +0 -0
  445. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tree/__init__.py +0 -0
  446. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tree/source_binding.py +0 -0
  447. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tree/treeitem.py +0 -0
  448. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tree/treenode.py +0 -0
  449. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tree/treeview.py +0 -0
  450. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/__init__.py +0 -0
  451. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/entry_mixin.py +0 -0
  452. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/localization_mixin.py +0 -0
  453. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/signal_mixin.py +0 -0
  454. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/__init__.py +0 -0
  455. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/_menubutton.py +0 -0
  456. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/badge.py +0 -0
  457. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/button.py +0 -0
  458. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/card.py +0 -0
  459. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/checkbutton.py +0 -0
  460. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/checktoggle.py +0 -0
  461. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/combobox.py +0 -0
  462. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/entry.py +0 -0
  463. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/label.py +0 -0
  464. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/labelframe.py +0 -0
  465. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/optionmenu.py +0 -0
  466. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/panedwindow.py +0 -0
  467. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/progressbar.py +0 -0
  468. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/radiobutton.py +0 -0
  469. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/radiotoggle.py +0 -0
  470. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/scrollbar.py +0 -0
  471. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/separator.py +0 -0
  472. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/sizegrip.py +0 -0
  473. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/spinbox.py +0 -0
  474. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/switch.py +0 -0
  475. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/treeview.py +0 -0
  476. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/avatar.py +0 -0
  477. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/boolean_controls.py +0 -0
  478. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/calendar.py +0 -0
  479. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/datatable.py +0 -0
  480. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/gallery.py +0 -0
  481. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/gauge.py +0 -0
  482. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/label.py +0 -0
  483. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/picture.py +0 -0
  484. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/progressbar.py +0 -0
  485. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/radio_variants.py +0 -0
  486. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/radiogroup.py +0 -0
  487. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/scrollbar.py +0 -0
  488. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/select.py +0 -0
  489. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/selectbutton.py +0 -0
  490. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/sizegrip.py +0 -0
  491. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/spinbox.py +0 -0
  492. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/theme_toggle.py +0 -0
  493. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/toast.py +0 -0
  494. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack/widgets/togglegroup.py +0 -0
  495. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack.egg-info/dependency_links.txt +0 -0
  496. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack.egg-info/entry_points.txt +0 -0
  497. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack.egg-info/requires.txt +0 -0
  498. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/src/bootstack.egg-info/top_level.txt +0 -0
  499. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/tests/test_images.py +0 -0
  500. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/tests/test_images_gui.py +0 -0
  501. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/tests/test_intl_format.py +0 -0
  502. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/tests/test_navmodel.py +0 -0
  503. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/tests/test_store.py +0 -0
  504. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/tests/test_theme_from_existing.py +0 -0
  505. {bootstack-0.1.0a11 → bootstack-0.1.0a12}/tests/test_validation_rules.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bootstack
3
- Version: 0.1.0a11
3
+ Version: 0.1.0a12
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
@@ -63,11 +63,13 @@ bootstack gives engineers, data scientists, and hobbyists everything to build a
63
63
  polished desktop interface and package it into a standalone executable —
64
64
  declarative, reactive, and batteries-included, all in pure Python.
65
65
 
66
+ <p align="center">
66
67
  <picture>
67
68
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-dark.png">
68
69
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
69
70
  <img alt="bootstack hero demo" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
70
71
  </picture>
72
+ </p>
71
73
 
72
74
  ## Why bootstack?
73
75
 
@@ -75,14 +77,14 @@ Most Python desktop frameworks make you fight the framework. bootstack gets out
75
77
 
76
78
  - **30% less code** — the declarative, context-manager layout eliminates geometry calls, explicit parenting, and most of the wiring boilerplate
77
79
  - **Reads like Python** — nested `with` blocks mirror your UI structure; the code hierarchy *is* the layout
78
- - **Modern layout system** — `HStack`, `VStack`, and `Grid` containers handle spacing, alignment, and fill automatically; CSS conventions (`gap`, `padding`, `margin`, `fill`, `anchor`) without writing CSS
80
+ - **Modern layout system** — `Row`, `Column`, and `Grid` containers handle spacing, alignment, and growth automatically; a screen-axis vocabulary (`gap`, `padding`, `margin`, `horizontal`, `vertical`, `grow`) without writing CSS
79
81
  - **60+ widgets out of the box** — primitives through full composites: tables, trees, calendars, date pickers, gauges, sliders, and more — including a full `CodeEditor` with syntax highlighting, line numbers, bracket matching, smart indent, and search; no external editor dependency required
80
82
  - **Reactive signals** — observable state that flows between widgets; bind once, update everywhere
81
83
  - **Event and stream pipelines** — compose, filter, debounce, and throttle UI events with a chainable stream API
82
- - **Built-in icons** — the full Bootstrap Icons catalog, theme-aware and DPI-scaled, bundled with the framework
84
+ - **Built-in icons** — the full Bootstrap Icons catalog, theme-aware and recolorable, bundled with the framework
83
85
  - **Built-in localization** — 23 language catalogs, locale-aware number/date/time formatting, runtime language switching
84
86
  - **Semantic styling** — `accent="primary"`, `variant="outline"` — no hard-coded colors; looks right across every theme automatically
85
- - **8 paired light/dark themes** — with a runtime switcher and a custom-theme API
87
+ - **10 paired light/dark themes** — popular dev color schemes plus Bootstrap, with a runtime switcher and a custom-theme API
86
88
  - **Forms and validation** — field-level validators, inline error messages, and a `FormDialog` for quick modal forms
87
89
  - **DataSource abstraction** — one interface over SQLite, in-memory, and file backends with filtering, sorting, pagination, and CRUD
88
90
  - **A real CLI** — scaffold, run, add pages/views/dialogs/themes, and package for distribution
@@ -108,11 +110,13 @@ The widget gallery is a single-window tour of everything bootstack ships — eve
108
110
  bootstack gallery
109
111
  ```
110
112
 
113
+ <p align="center">
111
114
  <picture>
112
115
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-dark.png">
113
116
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
114
117
  <img alt="bootstack widget gallery" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
115
118
  </picture>
119
+ </p>
116
120
 
117
121
  ## Quick Start
118
122
 
@@ -128,11 +132,13 @@ with bs.App(title="Hello", padding=16, gap=16) as app:
128
132
  app.run()
129
133
  ```
130
134
 
135
+ <p align="center">
131
136
  <picture>
132
137
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-dark.png">
133
138
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
134
139
  <img alt="bootstack quick start example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
135
140
  </picture>
141
+ </p>
136
142
 
137
143
  For navigation-based apps, use `AppShell` — it gives you stacked toolbars, a sidebar, and a page stack in one call:
138
144
 
@@ -141,11 +147,11 @@ import bootstack as bs
141
147
 
142
148
  shell = bs.AppShell(title="My App", size=(1000, 650))
143
149
 
144
- with shell.add_page("home", text="Home", icon="house"):
145
- bs.Label("Welcome!")
146
-
147
- with shell.add_page("docs", text="Documents", icon="file-earmark-text"):
148
- bs.Label("Your documents.")
150
+ with shell.page_nav() as nav:
151
+ with nav.add_page("home", text="Home", icon="house"):
152
+ bs.Label("Welcome!")
153
+ with nav.add_page("docs", text="Documents", icon="file-earmark-text"):
154
+ bs.Label("Your documents.")
149
155
 
150
156
  shell.run()
151
157
  ```
@@ -154,11 +160,11 @@ shell.run()
154
160
 
155
161
  ### Layout containers
156
162
 
157
- `VStack`, `HStack`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
163
+ `Column`, `Row`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
158
164
 
159
165
  ```python
160
166
  with bs.App(title="Sign In") as app:
161
- with bs.Grid(columns=["auto", 1], gap=(12, 6), sticky_items="ew", padding=16):
167
+ with bs.Grid(columns=["auto", 1], gap=(12, 6), horizontal_items="stretch", padding=16):
162
168
  bs.Label("Name:")
163
169
  bs.TextField(placeholder="Full name")
164
170
  bs.Label("Email:")
@@ -170,11 +176,13 @@ with bs.App(title="Sign In") as app:
170
176
  app.run()
171
177
  ```
172
178
 
179
+ <p align="center">
173
180
  <picture>
174
181
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-dark.png">
175
182
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
176
183
  <img alt="bootstack layout containers example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
177
184
  </picture>
185
+ </p>
178
186
 
179
187
  ### Semantic styling
180
188
 
@@ -186,11 +194,13 @@ bs.Button("Cancel", accent="secondary", variant="outline")
186
194
  bs.Label("Heading", font="heading-lg")
187
195
  ```
188
196
 
197
+ <p align="center">
189
198
  <picture>
190
199
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-dark.png">
191
200
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
192
201
  <img alt="bootstack semantic styling example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
193
202
  </picture>
203
+ </p>
194
204
 
195
205
  ### Signals (optional)
196
206
 
@@ -207,17 +217,17 @@ app.run()
207
217
 
208
218
  ## Features
209
219
 
210
- - **Application scaffolding** — `App` for blank windows, `AppShell` for command-bar + sidebar + page-stack apps, undecorated windows with custom chrome
220
+ - **Application scaffolding** — `App` for blank windows, `AppShell` for toolbar + sidebar + page-stack apps, `Workbench` for two-tier workspace apps, undecorated windows with custom chrome
211
221
  - **60+ themed widgets** — primitives plus higher-level composites (DataTable, Tree, ListView, Calendar, DateField, Form, Gauge, ToggleGroup, PageStack, Carousel, Tooltip, and more)
212
222
  - **Dialogs and messages** — `alert()` / `confirm()` / `ask_*()` prompts and `FormDialog` / `FontDialog` / `FilterDialog`, plus non-blocking `toast()`, `Notification`, and `Snackbar` surfaces
213
- - **Layout containers** — `VStack`, `HStack`, and `Grid` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Expander`
223
+ - **Layout containers** — `Column`, `Row`, `Grid`, and `Spacer` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Divider`
214
224
  - **Design system** — semantic `accent` colors (primary, secondary, success, danger, warning, info) and `variant` tokens (solid, outline, ghost), consistent across widgets
215
- - **Built-in themes** — paired light/dark variants (amber, aurora, bootstrap, classic, docs, forest, ocean, rose) with runtime theme switching and a custom-theme API
225
+ - **Built-in themes** — 10 paired light/dark variants (bootstrap, catppuccin, dracula, everforest, gruvbox, nord, one, pydata, solarized, tokyo-night) with runtime theme switching and a custom-theme API
216
226
  - **Reactive signals** — observable state with subscribe/set, integrates with widgets via `signal=` / `textsignal=`
217
227
  - **Forms & validation** — `Form` with built-in field-level validators and inline error messages
218
228
  - **DataSource** — common interface over in-memory, SQLite, and file backends, with pagination, filtering, sorting, CRUD, and CSV/TSV/Excel export
219
229
  - **Localization (i18n)** — 23 bundled message catalogs, locale-aware number/date/time formatting via Babel, runtime language switching
220
- - **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring, DPI scaling, and caching
230
+ - **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring and caching
221
231
  - **Platform support** — DPI awareness, multi-monitor centering, mica/acrylic effects on Windows
222
232
  - **CLI (`bootstack`)** — project scaffolding, run, add components, theme/i18n setup, doctor, build/package
223
233
 
@@ -225,13 +235,13 @@ app.run()
225
235
 
226
236
  | Category | Widgets |
227
237
  |----------|---------|
228
- | **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar |
238
+ | **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar, ThemeToggle |
229
239
  | **Inputs** | TextField, PasswordField, PathField, NumberField, SpinnerField, Slider, RangeSlider, TextArea, CodeEditor, DateField, TimeField |
230
240
  | **Selection** | Checkbox, Switch, ToggleButton, Radio, RadioGroup, ToggleGroup, Select, SelectButton, Calendar |
231
241
  | **Data Display** | Label, Badge, ListView, Tree, DataTable, ProgressBar, Gauge |
232
242
  | **Media** | Avatar, Picture, Gallery, Carousel |
233
- | **Layout** | VStack, HStack, Grid, Card, GroupBox, SplitView, ScrollView, Accordion, Separator |
234
- | **Navigation** | AppShell, SideNav, StatusBar, Tabs, PageStack |
243
+ | **Layout** | Column, Row, Grid, Spacer, Card, GroupBox, SplitView, ScrollView, Accordion, Divider |
244
+ | **Navigation** | AppShell, Workbench, Window, StatusBar, Tabs, PageStack |
235
245
  | **Dialogs** | `alert()`, `confirm()`, `ask_*()` prompts, FormDialog, FontDialog, FilterDialog |
236
246
  | **Overlays** | `toast()`, Notification, Snackbar, Tooltip |
237
247
  | **Forms** | Form, with field-level validation |
@@ -243,14 +253,15 @@ bootstack ships with an optional CLI for scaffolding, running, and packaging app
243
253
  ```bash
244
254
  bootstack gallery # Launch the interactive widget gallery
245
255
  bootstack icons # Browse the built-in icon catalog
256
+ bootstack appicon # Design an app icon and export it
246
257
  bootstack start MyApp # Create a new project (basic template)
247
258
  bootstack start MyApp --template appshell # ...or with sidebar navigation
248
259
  bootstack run # Run the app defined in the project config
249
260
  bootstack add page Dashboard # Add a new page (appshell)
250
261
  bootstack add view Settings # Add a new view (basic)
251
262
  bootstack add dialog Preferences # Add a new dialog
252
- bootstack add i18n --languages en es fr # Add i18n support
253
263
  bootstack doctor # Diagnose project & environment
264
+ bootstack promote # Make the project packaging-ready
254
265
  bootstack build # Package for distribution
255
266
  ```
256
267
 
@@ -259,6 +270,12 @@ bootstack build # Package for distribution
259
270
  Full documentation — guides, the widget catalog, and the API reference — lives at
260
271
  **[bootstack.org](https://bootstack.org)**.
261
272
 
273
+ ## Contributing
274
+
275
+ Contributions are welcome — code, bug reports, and especially **translations**.
276
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, the pull-request
277
+ workflow, and how to review the bundled language catalogs.
278
+
262
279
  ## Links
263
280
 
264
281
  - **GitHub**: https://github.com/israel-dryer/bootstack
@@ -18,11 +18,13 @@ bootstack gives engineers, data scientists, and hobbyists everything to build a
18
18
  polished desktop interface and package it into a standalone executable —
19
19
  declarative, reactive, and batteries-included, all in pure Python.
20
20
 
21
+ <p align="center">
21
22
  <picture>
22
23
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-dark.png">
23
24
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
24
25
  <img alt="bootstack hero demo" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
25
26
  </picture>
27
+ </p>
26
28
 
27
29
  ## Why bootstack?
28
30
 
@@ -30,14 +32,14 @@ Most Python desktop frameworks make you fight the framework. bootstack gets out
30
32
 
31
33
  - **30% less code** — the declarative, context-manager layout eliminates geometry calls, explicit parenting, and most of the wiring boilerplate
32
34
  - **Reads like Python** — nested `with` blocks mirror your UI structure; the code hierarchy *is* the layout
33
- - **Modern layout system** — `HStack`, `VStack`, and `Grid` containers handle spacing, alignment, and fill automatically; CSS conventions (`gap`, `padding`, `margin`, `fill`, `anchor`) without writing CSS
35
+ - **Modern layout system** — `Row`, `Column`, and `Grid` containers handle spacing, alignment, and growth automatically; a screen-axis vocabulary (`gap`, `padding`, `margin`, `horizontal`, `vertical`, `grow`) without writing CSS
34
36
  - **60+ widgets out of the box** — primitives through full composites: tables, trees, calendars, date pickers, gauges, sliders, and more — including a full `CodeEditor` with syntax highlighting, line numbers, bracket matching, smart indent, and search; no external editor dependency required
35
37
  - **Reactive signals** — observable state that flows between widgets; bind once, update everywhere
36
38
  - **Event and stream pipelines** — compose, filter, debounce, and throttle UI events with a chainable stream API
37
- - **Built-in icons** — the full Bootstrap Icons catalog, theme-aware and DPI-scaled, bundled with the framework
39
+ - **Built-in icons** — the full Bootstrap Icons catalog, theme-aware and recolorable, bundled with the framework
38
40
  - **Built-in localization** — 23 language catalogs, locale-aware number/date/time formatting, runtime language switching
39
41
  - **Semantic styling** — `accent="primary"`, `variant="outline"` — no hard-coded colors; looks right across every theme automatically
40
- - **8 paired light/dark themes** — with a runtime switcher and a custom-theme API
42
+ - **10 paired light/dark themes** — popular dev color schemes plus Bootstrap, with a runtime switcher and a custom-theme API
41
43
  - **Forms and validation** — field-level validators, inline error messages, and a `FormDialog` for quick modal forms
42
44
  - **DataSource abstraction** — one interface over SQLite, in-memory, and file backends with filtering, sorting, pagination, and CRUD
43
45
  - **A real CLI** — scaffold, run, add pages/views/dialogs/themes, and package for distribution
@@ -63,11 +65,13 @@ The widget gallery is a single-window tour of everything bootstack ships — eve
63
65
  bootstack gallery
64
66
  ```
65
67
 
68
+ <p align="center">
66
69
  <picture>
67
70
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-dark.png">
68
71
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
69
72
  <img alt="bootstack widget gallery" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
70
73
  </picture>
74
+ </p>
71
75
 
72
76
  ## Quick Start
73
77
 
@@ -83,11 +87,13 @@ with bs.App(title="Hello", padding=16, gap=16) as app:
83
87
  app.run()
84
88
  ```
85
89
 
90
+ <p align="center">
86
91
  <picture>
87
92
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-dark.png">
88
93
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
89
94
  <img alt="bootstack quick start example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
90
95
  </picture>
96
+ </p>
91
97
 
92
98
  For navigation-based apps, use `AppShell` — it gives you stacked toolbars, a sidebar, and a page stack in one call:
93
99
 
@@ -96,11 +102,11 @@ import bootstack as bs
96
102
 
97
103
  shell = bs.AppShell(title="My App", size=(1000, 650))
98
104
 
99
- with shell.add_page("home", text="Home", icon="house"):
100
- bs.Label("Welcome!")
101
-
102
- with shell.add_page("docs", text="Documents", icon="file-earmark-text"):
103
- bs.Label("Your documents.")
105
+ with shell.page_nav() as nav:
106
+ with nav.add_page("home", text="Home", icon="house"):
107
+ bs.Label("Welcome!")
108
+ with nav.add_page("docs", text="Documents", icon="file-earmark-text"):
109
+ bs.Label("Your documents.")
104
110
 
105
111
  shell.run()
106
112
  ```
@@ -109,11 +115,11 @@ shell.run()
109
115
 
110
116
  ### Layout containers
111
117
 
112
- `VStack`, `HStack`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
118
+ `Column`, `Row`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
113
119
 
114
120
  ```python
115
121
  with bs.App(title="Sign In") as app:
116
- with bs.Grid(columns=["auto", 1], gap=(12, 6), sticky_items="ew", padding=16):
122
+ with bs.Grid(columns=["auto", 1], gap=(12, 6), horizontal_items="stretch", padding=16):
117
123
  bs.Label("Name:")
118
124
  bs.TextField(placeholder="Full name")
119
125
  bs.Label("Email:")
@@ -125,11 +131,13 @@ with bs.App(title="Sign In") as app:
125
131
  app.run()
126
132
  ```
127
133
 
134
+ <p align="center">
128
135
  <picture>
129
136
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-dark.png">
130
137
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
131
138
  <img alt="bootstack layout containers example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
132
139
  </picture>
140
+ </p>
133
141
 
134
142
  ### Semantic styling
135
143
 
@@ -141,11 +149,13 @@ bs.Button("Cancel", accent="secondary", variant="outline")
141
149
  bs.Label("Heading", font="heading-lg")
142
150
  ```
143
151
 
152
+ <p align="center">
144
153
  <picture>
145
154
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-dark.png">
146
155
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
147
156
  <img alt="bootstack semantic styling example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
148
157
  </picture>
158
+ </p>
149
159
 
150
160
  ### Signals (optional)
151
161
 
@@ -162,17 +172,17 @@ app.run()
162
172
 
163
173
  ## Features
164
174
 
165
- - **Application scaffolding** — `App` for blank windows, `AppShell` for command-bar + sidebar + page-stack apps, undecorated windows with custom chrome
175
+ - **Application scaffolding** — `App` for blank windows, `AppShell` for toolbar + sidebar + page-stack apps, `Workbench` for two-tier workspace apps, undecorated windows with custom chrome
166
176
  - **60+ themed widgets** — primitives plus higher-level composites (DataTable, Tree, ListView, Calendar, DateField, Form, Gauge, ToggleGroup, PageStack, Carousel, Tooltip, and more)
167
177
  - **Dialogs and messages** — `alert()` / `confirm()` / `ask_*()` prompts and `FormDialog` / `FontDialog` / `FilterDialog`, plus non-blocking `toast()`, `Notification`, and `Snackbar` surfaces
168
- - **Layout containers** — `VStack`, `HStack`, and `Grid` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Expander`
178
+ - **Layout containers** — `Column`, `Row`, `Grid`, and `Spacer` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Divider`
169
179
  - **Design system** — semantic `accent` colors (primary, secondary, success, danger, warning, info) and `variant` tokens (solid, outline, ghost), consistent across widgets
170
- - **Built-in themes** — paired light/dark variants (amber, aurora, bootstrap, classic, docs, forest, ocean, rose) with runtime theme switching and a custom-theme API
180
+ - **Built-in themes** — 10 paired light/dark variants (bootstrap, catppuccin, dracula, everforest, gruvbox, nord, one, pydata, solarized, tokyo-night) with runtime theme switching and a custom-theme API
171
181
  - **Reactive signals** — observable state with subscribe/set, integrates with widgets via `signal=` / `textsignal=`
172
182
  - **Forms & validation** — `Form` with built-in field-level validators and inline error messages
173
183
  - **DataSource** — common interface over in-memory, SQLite, and file backends, with pagination, filtering, sorting, CRUD, and CSV/TSV/Excel export
174
184
  - **Localization (i18n)** — 23 bundled message catalogs, locale-aware number/date/time formatting via Babel, runtime language switching
175
- - **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring, DPI scaling, and caching
185
+ - **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring and caching
176
186
  - **Platform support** — DPI awareness, multi-monitor centering, mica/acrylic effects on Windows
177
187
  - **CLI (`bootstack`)** — project scaffolding, run, add components, theme/i18n setup, doctor, build/package
178
188
 
@@ -180,13 +190,13 @@ app.run()
180
190
 
181
191
  | Category | Widgets |
182
192
  |----------|---------|
183
- | **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar |
193
+ | **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar, ThemeToggle |
184
194
  | **Inputs** | TextField, PasswordField, PathField, NumberField, SpinnerField, Slider, RangeSlider, TextArea, CodeEditor, DateField, TimeField |
185
195
  | **Selection** | Checkbox, Switch, ToggleButton, Radio, RadioGroup, ToggleGroup, Select, SelectButton, Calendar |
186
196
  | **Data Display** | Label, Badge, ListView, Tree, DataTable, ProgressBar, Gauge |
187
197
  | **Media** | Avatar, Picture, Gallery, Carousel |
188
- | **Layout** | VStack, HStack, Grid, Card, GroupBox, SplitView, ScrollView, Accordion, Separator |
189
- | **Navigation** | AppShell, SideNav, StatusBar, Tabs, PageStack |
198
+ | **Layout** | Column, Row, Grid, Spacer, Card, GroupBox, SplitView, ScrollView, Accordion, Divider |
199
+ | **Navigation** | AppShell, Workbench, Window, StatusBar, Tabs, PageStack |
190
200
  | **Dialogs** | `alert()`, `confirm()`, `ask_*()` prompts, FormDialog, FontDialog, FilterDialog |
191
201
  | **Overlays** | `toast()`, Notification, Snackbar, Tooltip |
192
202
  | **Forms** | Form, with field-level validation |
@@ -198,14 +208,15 @@ bootstack ships with an optional CLI for scaffolding, running, and packaging app
198
208
  ```bash
199
209
  bootstack gallery # Launch the interactive widget gallery
200
210
  bootstack icons # Browse the built-in icon catalog
211
+ bootstack appicon # Design an app icon and export it
201
212
  bootstack start MyApp # Create a new project (basic template)
202
213
  bootstack start MyApp --template appshell # ...or with sidebar navigation
203
214
  bootstack run # Run the app defined in the project config
204
215
  bootstack add page Dashboard # Add a new page (appshell)
205
216
  bootstack add view Settings # Add a new view (basic)
206
217
  bootstack add dialog Preferences # Add a new dialog
207
- bootstack add i18n --languages en es fr # Add i18n support
208
218
  bootstack doctor # Diagnose project & environment
219
+ bootstack promote # Make the project packaging-ready
209
220
  bootstack build # Package for distribution
210
221
  ```
211
222
 
@@ -214,6 +225,12 @@ bootstack build # Package for distribution
214
225
  Full documentation — guides, the widget catalog, and the API reference — lives at
215
226
  **[bootstack.org](https://bootstack.org)**.
216
227
 
228
+ ## Contributing
229
+
230
+ Contributions are welcome — code, bug reports, and especially **translations**.
231
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, the pull-request
232
+ workflow, and how to review the bundled language catalogs.
233
+
217
234
  ## Links
218
235
 
219
236
  - **GitHub**: https://github.com/israel-dryer/bootstack
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "bootstack"
7
- version = "0.1.0a11"
7
+ version = "0.1.0a12"
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"
@@ -100,7 +100,7 @@ where = ["src"]
100
100
  ]
101
101
 
102
102
  [tool.bumpversion]
103
- current_version = "0.1.0a11"
103
+ current_version = "0.1.0a12"
104
104
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)((?P<pre>a|b|rc)(?P<pre_n>\\d+))?"
105
105
  serialize = [
106
106
  "{major}.{minor}.{patch}{pre}{pre_n}",
@@ -11,9 +11,9 @@ Example:
11
11
  app.run()
12
12
  ```
13
13
 
14
- The top-level ``bootstack`` namespace holds what you *compose a UI* with: every
15
- widget, ``App``/``AppShell``/``Window``, ``Signal``, the dialog verbs
16
- (``alert``/``confirm``/``ask_*``/``toast``), and ``set_theme``/``toggle_theme``.
14
+ The top-level `bootstack` namespace holds what you *compose a UI* with: every
15
+ widget, `App`/`AppShell`/`Window`, `Signal`, the dialog verbs
16
+ (`alert`/`confirm`/`ask_*`/`toast`), and `set_theme`/`toggle_theme`.
17
17
  Framework primitives you reference *by type to configure behavior* live in
18
18
  submodules — for example::
19
19
 
@@ -56,11 +56,11 @@ from bootstack.dialogs import (
56
56
 
57
57
  # ── Application & windows ─────────────────────────────────────────────────────
58
58
  from bootstack.widgets.app import App
59
- from bootstack.widgets.appshell import AppShell
59
+ from bootstack.widgets.appshell import AppShell, Workbench
60
60
  from bootstack.widgets.window import Window
61
61
 
62
62
  # ── Public widget layer ───────────────────────────────────────────────────────
63
- from bootstack.widgets.stacks import HStack, VStack
63
+ from bootstack.widgets.stacks import Row, Column, Spacer
64
64
  from bootstack.widgets.grid import Grid
65
65
  from bootstack.widgets.boolean_controls import Checkbox, Switch, ToggleButton
66
66
  from bootstack.widgets.theme_toggle import ThemeToggle
@@ -90,7 +90,7 @@ from bootstack.widgets.radiogroup import RadioGroup
90
90
  from bootstack.widgets.scrollview import ScrollView
91
91
  from bootstack.widgets.select import Select
92
92
  from bootstack.widgets.selectbutton import SelectButton
93
- from bootstack.widgets.separator import Separator
93
+ from bootstack.widgets.divider import Divider
94
94
  from bootstack.widgets.splitview import SplitView, SplitPane
95
95
  from bootstack.widgets.slider import RangeSlider, Slider
96
96
  from bootstack.widgets.spinnerfield import SpinnerField
@@ -127,9 +127,9 @@ __all__ = [
127
127
  "ask_date_range", "ask_item", "ask_color", "ask_font", "ask_filter",
128
128
  "ask_save_file", "ask_open_file", "ask_open_files", "ask_directory",
129
129
  # Application & windows
130
- "App", "AppShell", "Window",
130
+ "App", "AppShell", "Workbench", "Window",
131
131
  # Layout
132
- "HStack", "VStack", "Grid", "Card", "GroupBox", "Separator", "ScrollView",
132
+ "Row", "Column", "Spacer", "Grid", "Card", "GroupBox", "Divider", "ScrollView",
133
133
  "SplitView", "SplitPane", "Accordion", "AccordionSection",
134
134
  # Actions
135
135
  "Button", "ButtonGroup", "ThemeToggle", "MenuButton", "Toolbar", "StatusBar",
@@ -354,9 +354,9 @@ class _ImageService:
354
354
  LANCZOS blur at non-integer DPI scale factors (e.g., 125%, 150%).
355
355
 
356
356
  Args:
357
- name: Bootstrap icon name (e.g., ``"house"``, ``"arrow-right-fill"``).
357
+ name: Bootstrap icon name (e.g., `"house"`, `"arrow-right-fill"`).
358
358
  size: Requested pixel size. Snapped to the nearest even integer.
359
- color: Foreground color as a hex string (e.g., ``"#ffffff"``).
359
+ color: Foreground color as a hex string (e.g., `"#ffffff"`).
360
360
 
361
361
  Returns:
362
362
  A cached Tk-compatible PhotoImage for the icon.
@@ -476,10 +476,10 @@ class App(BaseWindow, WidgetCapabilitiesMixin, tkinter.Tk):
476
476
  override_redirect: If `True`, creates a window without standard
477
477
  decorations (title bar, borders, etc.).
478
478
  center_on_screen: If True (default), center the app window on
479
- the screen when ``mainloop()`` starts.
479
+ the screen when `mainloop()` starts.
480
480
  on_close: Callback invoked when the user clicks the close button.
481
- Return ``False`` to veto the close; return ``None`` or ``True``
482
- to allow it. Equivalent to calling ``add_close_handler(fn)``
481
+ Return `False` to veto the close; return `None` or `True`
482
+ to allow it. Equivalent to calling `add_close_handler(fn)`
483
483
  after construction.
484
484
  **kwargs: Additional keyword arguments to pass to the
485
485
  underlying `tkinter.Tk` constructor.
@@ -196,10 +196,25 @@ class BaseWindow:
196
196
  pywinstyles.apply_style(self, window_style)
197
197
  self._window_style_applied = True
198
198
  self.after(0, self._update_chrome_color)
199
- self.bind('<<ThemeChanged>>', lambda e: self.after(0, self._update_chrome_color), add='+')
199
+ self.bind('<<ThemeChanged>>', self._schedule_chrome_update, add='+')
200
200
  except Exception:
201
201
  pass
202
202
 
203
+ def _schedule_chrome_update(self, _event=None) -> None:
204
+ """Coalesce chrome re-tinting on theme change.
205
+
206
+ The toplevel receives `<<ThemeChanged>>` ~1400x per theme rebuild (once
207
+ per ttk style reconfigure). Cancel any pending update and schedule a
208
+ single one so the (DWM) chrome repaint runs once, not hundreds of times.
209
+ """
210
+ pending = getattr(self, '_chrome_update_after', None)
211
+ if pending is not None:
212
+ try:
213
+ self.after_cancel(pending)
214
+ except Exception:
215
+ pass
216
+ self._chrome_update_after = self.after(0, self._update_chrome_color)
217
+
203
218
  def _update_chrome_color(self) -> None:
204
219
  if getattr(self, '_updating_chrome', False):
205
220
  return
@@ -208,10 +223,15 @@ class BaseWindow:
208
223
  import pywinstyles
209
224
  from bootstack.style.style import get_theme_provider
210
225
  color = get_theme_provider().colors['chrome']
211
- pywinstyles.change_header_color(self, color)
212
- # Match the window border to the chrome too, so it honors the theme
213
- # (otherwise Windows leaves a light default border in dark mode).
214
- pywinstyles.change_border_color(self, color)
226
+ # The DWM header/border calls are expensive (~100ms each); skip them
227
+ # when the chrome color is unchanged (redundant theme events, or a
228
+ # theme switch that keeps the same chrome).
229
+ if getattr(self, '_chrome_color_applied', None) != color:
230
+ self._chrome_color_applied = color
231
+ pywinstyles.change_header_color(self, color)
232
+ # Match the window border to the chrome too, so it honors the
233
+ # theme (otherwise Windows leaves a light border in dark mode).
234
+ pywinstyles.change_border_color(self, color)
215
235
  except Exception:
216
236
  pass
217
237
  finally:
@@ -322,9 +342,9 @@ class BaseWindow:
322
342
  def _close_dispatch(self) -> None:
323
343
  """WM_DELETE_WINDOW handler that runs registered close handlers.
324
344
 
325
- Runs each handler in registration order. If any returns ``False`` the
326
- close is vetoed and the window stays open. If all pass (return ``None``
327
- or ``True``), ``_do_close()`` is called to perform the actual close.
345
+ Runs each handler in registration order. If any returns `False` the
346
+ close is vetoed and the window stays open. If all pass (return `None`
347
+ or `True`), `_do_close()` is called to perform the actual close.
328
348
  """
329
349
  for handler in list(getattr(self, '_close_handlers', [])):
330
350
  try:
@@ -339,7 +359,7 @@ class BaseWindow:
339
359
  """Perform the default close action.
340
360
 
341
361
  Subclasses may override this to change what happens after all handlers
342
- pass. The default is ``self.destroy()``.
362
+ pass. The default is `self.destroy()`.
343
363
  """
344
364
  try:
345
365
  self.destroy()
@@ -350,8 +370,8 @@ class BaseWindow:
350
370
  """Close the window programmatically, bypassing the close handlers.
351
371
 
352
372
  This is the uniform close contract every top-level window honors. It
353
- performs the default close action directly (``_do_close()``), so the
354
- veto handlers registered with ``add_close_handler()`` — which guard the
373
+ performs the default close action directly (`_do_close()`), so the
374
+ veto handlers registered with `add_close_handler()` — which guard the
355
375
  user clicking the window's close button — are not run. The application
356
376
  root overrides this to quit its event loop instead.
357
377
  """
@@ -360,13 +380,13 @@ class BaseWindow:
360
380
  def add_close_handler(self, callback: Callable[[], bool | None]) -> None:
361
381
  """Register a callback invoked when the window's close button is clicked.
362
382
 
363
- Handlers are called in registration order. Return ``False`` from a
364
- handler to veto the close; return ``None`` or ``True`` to allow it.
383
+ Handlers are called in registration order. Return `False` from a
384
+ handler to veto the close; return `None` or `True` to allow it.
365
385
  All handlers that pass are run before the window closes.
366
386
 
367
387
  Args:
368
388
  callback: Called with no arguments when close is requested.
369
- Return ``False`` to cancel the close, ``None`` or ``True`` to proceed.
389
+ Return `False` to cancel the close, `None` or `True` to proceed.
370
390
  """
371
391
  self._init_close_handlers()
372
392
  self._close_handlers.append(callback)
@@ -625,12 +645,12 @@ class BaseWindow:
625
645
  def on_close(self, handler: Callable[[], bool | None]) -> None:
626
646
  """Register a handler for the window close button.
627
647
 
628
- Equivalent to ``add_close_handler(handler)``. Handlers are called in
629
- registration order; return ``False`` to veto the close.
648
+ Equivalent to `add_close_handler(handler)`. Handlers are called in
649
+ registration order; return `False` to veto the close.
630
650
 
631
651
  Args:
632
652
  handler: Called with no arguments when close is requested.
633
- Return ``False`` to cancel, ``None`` or ``True`` to proceed.
653
+ Return `False` to cancel, `None` or `True` to proceed.
634
654
  """
635
655
  self.add_close_handler(handler)
636
656