bootstack 0.1.0a11__tar.gz → 0.1.0a13__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 (507) hide show
  1. {bootstack-0.1.0a11/src/bootstack.egg-info → bootstack-0.1.0a13}/PKG-INFO +43 -19
  2. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/README.md +37 -18
  3. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/pyproject.toml +13 -3
  4. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/__init__.py +10 -9
  5. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/images.py +2 -2
  6. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/app.py +29 -3
  7. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/base_window.py +37 -17
  8. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/toplevel.py +14 -14
  9. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/utility.py +66 -0
  10. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/visual_focus.py +12 -0
  11. bootstack-0.1.0a13/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
  12. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +3 -0
  13. bootstack-0.1.0a13/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
  14. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +3 -0
  15. bootstack-0.1.0a13/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
  16. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +3 -0
  17. bootstack-0.1.0a13/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
  18. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +3 -0
  19. bootstack-0.1.0a13/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
  20. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +3 -0
  21. bootstack-0.1.0a13/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
  22. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +3 -0
  23. bootstack-0.1.0a13/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
  24. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +3 -0
  25. bootstack-0.1.0a13/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
  26. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +3 -0
  27. bootstack-0.1.0a13/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
  28. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +3 -0
  29. bootstack-0.1.0a13/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
  30. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +3 -0
  31. bootstack-0.1.0a13/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
  32. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +3 -0
  33. bootstack-0.1.0a13/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
  34. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +3 -0
  35. bootstack-0.1.0a13/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
  36. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +3 -0
  37. bootstack-0.1.0a13/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
  38. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +3 -0
  39. bootstack-0.1.0a13/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
  40. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +3 -0
  41. bootstack-0.1.0a13/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
  42. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +3 -0
  43. bootstack-0.1.0a13/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
  44. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +3 -0
  45. bootstack-0.1.0a13/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
  46. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +3 -0
  47. bootstack-0.1.0a13/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
  48. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +3 -0
  49. bootstack-0.1.0a13/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
  50. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +3 -0
  51. bootstack-0.1.0a13/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
  52. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +3 -0
  53. bootstack-0.1.0a13/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
  54. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +3 -0
  55. bootstack-0.1.0a13/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
  56. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +3 -0
  57. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/add.py +5 -4
  58. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/appicon.py +22 -22
  59. bootstack-0.1.0a13/src/bootstack/cli/demo.py +564 -0
  60. bootstack-0.1.0a13/src/bootstack/cli/icons.py +98 -0
  61. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/templates/__init__.py +55 -52
  62. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/constants.py +10 -10
  63. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/file_source.py +3 -3
  64. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/memory_source.py +34 -14
  65. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/writers.py +1 -1
  66. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/__init__.py +13 -12
  67. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/__init__.py +10 -14
  68. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/colorchooser.py +82 -33
  69. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/datedialog.py +43 -19
  70. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/dialog.py +61 -7
  71. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/filterdialog.py +16 -11
  72. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/fontdialog.py +3 -16
  73. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/formdialog.py +25 -6
  74. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/message.py +1 -0
  75. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/query.py +1 -0
  76. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/i18n/__init__.py +3 -3
  77. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/i18n/catalog.py +3 -3
  78. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/i18n/specs.py +2 -2
  79. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/images.py +18 -2
  80. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/scheduling/__init__.py +2 -2
  81. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/shortcuts.py +2 -2
  82. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/signals/signal.py +35 -0
  83. bootstack-0.1.0a13/src/bootstack/streams/__init__.py +12 -0
  84. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/frame.py +9 -1
  85. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/style.py +15 -0
  86. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/typography.py +18 -3
  87. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/types.py +2 -0
  88. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/validation/types.py +4 -4
  89. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/validation/validation_rules.py +70 -4
  90. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/__init__.py +6 -4
  91. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/base.py +58 -6
  92. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/container.py +133 -1
  93. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/field_mixin.py +80 -8
  94. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/window_menu.py +44 -2
  95. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/_parts/numberentry_part.py +30 -2
  96. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/_parts/spinnerentry_part.py +49 -0
  97. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/_parts/textentry_part.py +24 -0
  98. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/avatar.py +1 -1
  99. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/buttongroup.py +1 -1
  100. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/calendar.py +30 -15
  101. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/carousel.py +7 -2
  102. bootstack-0.1.0a13/src/bootstack/widgets/_impl/composites/chart.py +883 -0
  103. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/compositeframe.py +2 -2
  104. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/contextmenu.py +47 -10
  105. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/field.py +22 -12
  106. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/form.py +63 -27
  107. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/gallery.py +54 -4
  108. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/list/listview.py +6 -13
  109. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/menu/model.py +4 -4
  110. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/meter.py +20 -9
  111. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/pagestack.py +7 -0
  112. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/passwordentry.py +12 -1
  113. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/picture.py +3 -3
  114. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/scrollview.py +40 -4
  115. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/content_host.py +8 -2
  116. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/layout.py +13 -4
  117. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/nav_panel.py +3 -3
  118. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/providers.py +3 -3
  119. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/shell.py +17 -4
  120. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/workspace.py +16 -3
  121. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/slider/_shared.py +34 -8
  122. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/slider/rangeslider.py +208 -73
  123. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/slider/slider.py +168 -62
  124. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/spinnerentry.py +8 -0
  125. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tableview/tableview.py +70 -30
  126. bootstack-0.1.0a13/src/bootstack/widgets/_impl/composites/tabs/tabs.py +974 -0
  127. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tabs/tabview.py +12 -8
  128. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/codeeditor.py +5 -4
  129. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/core.py +34 -3
  130. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +17 -2
  131. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +2 -2
  132. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/search_overlay.py +22 -1
  133. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/style_registry.py +25 -3
  134. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/textarea.py +33 -1
  135. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/timeentry.py +15 -11
  136. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/toolbar.py +31 -3
  137. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tooltip.py +83 -10
  138. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/configure_mixin.py +12 -12
  139. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/font_mixin.py +4 -4
  140. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/icon_mixin.py +4 -4
  141. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/validation_mixin.py +17 -3
  142. bootstack-0.1.0a13/src/bootstack/widgets/_impl/primitives/flexframe.py +448 -0
  143. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/frame.py +53 -0
  144. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/gridframe.py +25 -6
  145. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/packframe.py +5 -2
  146. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/app.py +51 -26
  147. bootstack-0.1.0a13/src/bootstack/widgets/appshell.py +1046 -0
  148. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/button.py +51 -13
  149. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/buttongroup.py +1 -1
  150. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/card.py +56 -43
  151. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/carousel.py +3 -2
  152. bootstack-0.1.0a13/src/bootstack/widgets/chart.py +302 -0
  153. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/codeeditor.py +57 -15
  154. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/contextmenu.py +11 -8
  155. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/datefield.py +11 -17
  156. bootstack-0.1.0a11/src/bootstack/widgets/separator.py → bootstack-0.1.0a13/src/bootstack/widgets/divider.py +6 -5
  157. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/expander.py +119 -114
  158. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/form.py +31 -0
  159. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/grid.py +36 -20
  160. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/groupbox.py +56 -43
  161. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/label.py +8 -1
  162. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/listview.py +2 -2
  163. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/menubutton.py +43 -42
  164. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/numberfield.py +11 -9
  165. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/pagestack.py +57 -46
  166. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/passwordfield.py +2 -3
  167. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/pathfield.py +58 -3
  168. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/scrollview.py +14 -12
  169. bootstack-0.1.0a13/src/bootstack/widgets/sidebar_toggle.py +130 -0
  170. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/slider.py +33 -1
  171. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/spinnerfield.py +26 -3
  172. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/splitview.py +137 -105
  173. bootstack-0.1.0a13/src/bootstack/widgets/stacks.py +249 -0
  174. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/statusbar.py +39 -19
  175. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/tabs.py +66 -48
  176. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/textarea.py +21 -9
  177. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/textfield.py +10 -5
  178. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/timefield.py +13 -19
  179. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/toolbar.py +74 -30
  180. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/tooltip.py +13 -0
  181. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/tree.py +2 -2
  182. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/types.py +19 -3
  183. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/window.py +56 -25
  184. {bootstack-0.1.0a11 → bootstack-0.1.0a13/src/bootstack.egg-info}/PKG-INFO +43 -19
  185. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack.egg-info/SOURCES.txt +5 -3
  186. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack.egg-info/requires.txt +7 -0
  187. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/tests/test_public_surface.py +3 -3
  188. bootstack-0.1.0a11/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
  189. bootstack-0.1.0a11/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
  190. bootstack-0.1.0a11/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
  191. bootstack-0.1.0a11/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
  192. bootstack-0.1.0a11/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
  193. bootstack-0.1.0a11/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
  194. bootstack-0.1.0a11/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
  195. bootstack-0.1.0a11/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
  196. bootstack-0.1.0a11/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
  197. bootstack-0.1.0a11/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
  198. bootstack-0.1.0a11/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
  199. bootstack-0.1.0a11/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
  200. bootstack-0.1.0a11/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
  201. bootstack-0.1.0a11/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
  202. bootstack-0.1.0a11/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
  203. bootstack-0.1.0a11/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
  204. bootstack-0.1.0a11/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
  205. bootstack-0.1.0a11/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
  206. bootstack-0.1.0a11/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
  207. bootstack-0.1.0a11/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
  208. bootstack-0.1.0a11/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
  209. bootstack-0.1.0a11/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
  210. bootstack-0.1.0a11/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
  211. bootstack-0.1.0a11/src/bootstack/cli/demo.py +0 -937
  212. bootstack-0.1.0a11/src/bootstack/cli/icons.py +0 -327
  213. bootstack-0.1.0a11/src/bootstack/dialogs/_impl/colordropper.py +0 -257
  214. bootstack-0.1.0a11/src/bootstack/streams/__init__.py +0 -12
  215. bootstack-0.1.0a11/src/bootstack/widgets/_impl/composites/floodgauge.py +0 -427
  216. bootstack-0.1.0a11/src/bootstack/widgets/_impl/composites/tabs/tabs.py +0 -567
  217. bootstack-0.1.0a11/src/bootstack/widgets/appshell.py +0 -798
  218. bootstack-0.1.0a11/src/bootstack/widgets/stacks.py +0 -214
  219. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/LICENSE +0 -0
  220. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/MANIFEST.in +0 -0
  221. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/NOTICE +0 -0
  222. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/setup.cfg +0 -0
  223. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/__main__.py +0 -0
  224. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/__init__.py +0 -0
  225. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/__init__.py +0 -0
  226. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/after.py +0 -0
  227. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/bind.py +0 -0
  228. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/bindtags.py +0 -0
  229. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/busy.py +0 -0
  230. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/clipboard.py +0 -0
  231. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/focus.py +0 -0
  232. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/grab.py +0 -0
  233. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/grid.py +0 -0
  234. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/localization.py +0 -0
  235. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/pack.py +0 -0
  236. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/place.py +0 -0
  237. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/selection.py +0 -0
  238. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/signals.py +0 -0
  239. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/winfo.py +0 -0
  240. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/colorutils.py +0 -0
  241. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/exceptions.py +0 -0
  242. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/mixins/__init__.py +0 -0
  243. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/mixins/ttk_state.py +0 -0
  244. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/mixins/widget.py +0 -0
  245. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/paths.py +0 -0
  246. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/publisher.py +0 -0
  247. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/variables.py +0 -0
  248. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/__init__.py +0 -0
  249. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/events.py +0 -0
  250. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/shortcuts.py +0 -0
  251. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/tk_patch.py +0 -0
  252. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/window_utilities.py +0 -0
  253. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/__init__.py +0 -0
  254. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/bootstack.ico +0 -0
  255. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/bootstack.png +0 -0
  256. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/__init__.py +0 -0
  257. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/badge-pill.png +0 -0
  258. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/badge-square.png +0 -0
  259. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/button-compact.png +0 -0
  260. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/button-default.png +0 -0
  261. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
  262. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
  263. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
  264. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
  265. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
  266. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
  267. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
  268. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
  269. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
  270. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
  271. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
  272. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
  273. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/card.png +0 -0
  274. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/checkbox-checked.png +0 -0
  275. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/checkbox-indeterminate.png +0 -0
  276. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/checkbox-unchecked.png +0 -0
  277. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/field.png +0 -0
  278. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/input-addon-compact.png +0 -0
  279. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/input-addon-default.png +0 -0
  280. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/input-compact.png +0 -0
  281. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/input-default.png +0 -0
  282. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/list-item-separated.png +0 -0
  283. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/list-item.png +0 -0
  284. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/listrow-compact.png +0 -0
  285. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/listrow-default.png +0 -0
  286. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/manifest.toml +0 -0
  287. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/menu-item.png +0 -0
  288. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/navitem-compact.png +0 -0
  289. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/navitem-default.png +0 -0
  290. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/progressbar-h-compact.png +0 -0
  291. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/progressbar-h-default.png +0 -0
  292. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/progressbar-v-compact.png +0 -0
  293. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/progressbar-v-default.png +0 -0
  294. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/radiobutton.png +0 -0
  295. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/scrollbar-horizontal.png +0 -0
  296. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/scrollbar-vertical.png +0 -0
  297. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/slider-handle.png +0 -0
  298. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/slider-track-h.png +0 -0
  299. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/slider-track-v.png +0 -0
  300. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/switch-off.png +0 -0
  301. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/switch-on.png +0 -0
  302. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/tab-h.png +0 -0
  303. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/tab-v.png +0 -0
  304. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/icons/bootstrap.ttf +0 -0
  305. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/icons/glyphmap.json +0 -0
  306. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/icons/icon_metrics.json +0 -0
  307. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/__init__.py +0 -0
  308. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/__main__.py +0 -0
  309. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/build.py +0 -0
  310. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/config.py +0 -0
  311. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/doctor.py +0 -0
  312. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/promote.py +0 -0
  313. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/pyinstaller.py +0 -0
  314. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/run.py +0 -0
  315. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/start.py +0 -0
  316. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/clipboard.py +0 -0
  317. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/README.md +0 -0
  318. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/__init__.py +0 -0
  319. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/_observable.py +0 -0
  320. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/base.py +0 -0
  321. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/query.py +0 -0
  322. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/readers.py +0 -0
  323. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/sqlite_source.py +0 -0
  324. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/types.py +0 -0
  325. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/errors.py +0 -0
  326. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/events/__init__.py +0 -0
  327. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/events/_event.py +0 -0
  328. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/events/_payloads.py +0 -0
  329. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/events/_subscription.py +0 -0
  330. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/i18n/README.md +0 -0
  331. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/i18n/intl_format.py +0 -0
  332. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/i18n/msgcat.py +0 -0
  333. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/py.typed +0 -0
  334. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/scheduling/_schedule.py +0 -0
  335. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/signals/README.md +0 -0
  336. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/signals/__init__.py +0 -0
  337. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/signals/integration.py +0 -0
  338. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/signals/types.py +0 -0
  339. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/store.py +0 -0
  340. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/streams/_stream.py +0 -0
  341. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/__init__.py +0 -0
  342. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/__init__.py +0 -0
  343. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/badge.py +0 -0
  344. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/button.py +0 -0
  345. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/buttongroup.py +0 -0
  346. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/calendar.py +0 -0
  347. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/checkbutton.py +0 -0
  348. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/combobox.py +0 -0
  349. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/contextmenu.py +0 -0
  350. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/entry.py +0 -0
  351. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/expander.py +0 -0
  352. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/field.py +0 -0
  353. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/label.py +0 -0
  354. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/labelframe.py +0 -0
  355. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/listview.py +0 -0
  356. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/menubar.py +0 -0
  357. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/menubutton.py +0 -0
  358. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/panedwindow.py +0 -0
  359. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/progressbar.py +0 -0
  360. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/radiobutton.py +0 -0
  361. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/scale.py +0 -0
  362. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/scrollbar.py +0 -0
  363. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/separator.py +0 -0
  364. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/sidenav.py +0 -0
  365. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/sizegrip.py +0 -0
  366. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/spinbox.py +0 -0
  367. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/switch.py +0 -0
  368. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/tabitem.py +0 -0
  369. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/togglegroup.py +0 -0
  370. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/toolbutton.py +0 -0
  371. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/tooltip.py +0 -0
  372. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/treeview.py +0 -0
  373. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/utils.py +0 -0
  374. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders_tk/__init__.py +0 -0
  375. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders_tk/defaults.py +0 -0
  376. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/element.py +0 -0
  377. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/fonts.py +0 -0
  378. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/style_builder_base.py +0 -0
  379. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/style_builder_mixed.py +0 -0
  380. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/style_builder_tk.py +0 -0
  381. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/style_builder_ttk.py +0 -0
  382. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/style_resolver.py +0 -0
  383. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/theme.py +0 -0
  384. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/theme_provider.py +0 -0
  385. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/themes/__init__.py +0 -0
  386. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/tk_patch.py +0 -0
  387. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/token_maps.py +0 -0
  388. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/types.py +0 -0
  389. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/utility.py +0 -0
  390. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/validation/__init__.py +0 -0
  391. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/validation/validation_result.py +0 -0
  392. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/__init__.py +0 -0
  393. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/app_config.py +0 -0
  394. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/context.py +0 -0
  395. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/events.py +0 -0
  396. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/icon_image_props.py +0 -0
  397. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/image_binding.py +0 -0
  398. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/navmodel.py +0 -0
  399. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/options.py +0 -0
  400. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/selection_group.py +0 -0
  401. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/window_controls.py +0 -0
  402. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/__init__.py +0 -0
  403. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/_internal/__init__.py +0 -0
  404. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/_internal/wrapper_base.py +0 -0
  405. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/_parts/__init__.py +0 -0
  406. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/__init__.py +0 -0
  407. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/_dateutils.py +0 -0
  408. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/_image_fit.py +0 -0
  409. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/accordion.py +0 -0
  410. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/dateentry.py +0 -0
  411. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/dropdownbutton.py +0 -0
  412. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/expander.py +0 -0
  413. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/list/__init__.py +0 -0
  414. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/list/listitem.py +0 -0
  415. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/menu/__init__.py +0 -0
  416. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/menu/render_native.py +0 -0
  417. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/menu/render_themed.py +0 -0
  418. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/numericentry.py +0 -0
  419. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/pathentry.py +0 -0
  420. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/radiogroup.py +0 -0
  421. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/scrolledtext.py +0 -0
  422. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/scrolledtext.pyi +0 -0
  423. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/selectbox.py +0 -0
  424. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/__init__.py +0 -0
  425. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/rail.py +0 -0
  426. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/sidenav/__init__.py +0 -0
  427. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/sidenav/header.py +0 -0
  428. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/sidenav/separator.py +0 -0
  429. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/slider/__init__.py +0 -0
  430. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tableview/__init__.py +0 -0
  431. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tableview/types.py +0 -0
  432. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tabs/__init__.py +0 -0
  433. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tabs/tabitem.py +0 -0
  434. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/__init__.py +0 -0
  435. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/change.py +0 -0
  436. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/decoration.py +0 -0
  437. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/diff.py +0 -0
  438. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +0 -0
  439. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +0 -0
  440. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +0 -0
  441. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +0 -0
  442. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/filter.py +0 -0
  443. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/sidebar.py +0 -0
  444. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/undo.py +0 -0
  445. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textentry.py +0 -0
  446. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/toast.py +0 -0
  447. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/toast_stack.py +0 -0
  448. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/togglegroup.py +0 -0
  449. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tree/__init__.py +0 -0
  450. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tree/source_binding.py +0 -0
  451. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tree/treeitem.py +0 -0
  452. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tree/treenode.py +0 -0
  453. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tree/treeview.py +0 -0
  454. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/__init__.py +0 -0
  455. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/entry_mixin.py +0 -0
  456. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/localization_mixin.py +0 -0
  457. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/signal_mixin.py +0 -0
  458. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/__init__.py +0 -0
  459. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/_menubutton.py +0 -0
  460. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/badge.py +0 -0
  461. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/button.py +0 -0
  462. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/card.py +0 -0
  463. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/checkbutton.py +0 -0
  464. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/checktoggle.py +0 -0
  465. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/combobox.py +0 -0
  466. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/entry.py +0 -0
  467. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/label.py +0 -0
  468. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/labelframe.py +0 -0
  469. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/optionmenu.py +0 -0
  470. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/panedwindow.py +0 -0
  471. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/progressbar.py +0 -0
  472. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/radiobutton.py +0 -0
  473. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/radiotoggle.py +0 -0
  474. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/scrollbar.py +0 -0
  475. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/separator.py +0 -0
  476. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/sizegrip.py +0 -0
  477. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/spinbox.py +0 -0
  478. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/switch.py +0 -0
  479. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/treeview.py +0 -0
  480. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/avatar.py +0 -0
  481. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/boolean_controls.py +0 -0
  482. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/calendar.py +0 -0
  483. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/datatable.py +0 -0
  484. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/gallery.py +0 -0
  485. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/gauge.py +0 -0
  486. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/picture.py +0 -0
  487. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/progressbar.py +0 -0
  488. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/radio_variants.py +0 -0
  489. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/radiogroup.py +0 -0
  490. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/scrollbar.py +0 -0
  491. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/select.py +0 -0
  492. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/selectbutton.py +0 -0
  493. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/sizegrip.py +0 -0
  494. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/spinbox.py +0 -0
  495. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/theme_toggle.py +0 -0
  496. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/toast.py +0 -0
  497. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/togglegroup.py +0 -0
  498. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack.egg-info/dependency_links.txt +0 -0
  499. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack.egg-info/entry_points.txt +0 -0
  500. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack.egg-info/top_level.txt +0 -0
  501. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/tests/test_images.py +0 -0
  502. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/tests/test_images_gui.py +0 -0
  503. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/tests/test_intl_format.py +0 -0
  504. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/tests/test_navmodel.py +0 -0
  505. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/tests/test_store.py +0 -0
  506. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/tests/test_theme_from_existing.py +0 -0
  507. {bootstack-0.1.0a11 → bootstack-0.1.0a13}/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.0a13
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
@@ -35,6 +35,11 @@ Requires-Dist: pyarrow>=14; extra == "parquet"
35
35
  Provides-Extra: hdf5
36
36
  Requires-Dist: pandas>=2; extra == "hdf5"
37
37
  Requires-Dist: tables>=3.8; extra == "hdf5"
38
+ Provides-Extra: viz
39
+ Requires-Dist: matplotlib>=3.8; extra == "viz"
40
+ Provides-Extra: viz-seaborn
41
+ Requires-Dist: matplotlib>=3.8; extra == "viz-seaborn"
42
+ Requires-Dist: seaborn>=0.13; extra == "viz-seaborn"
38
43
  Provides-Extra: docs
39
44
  Requires-Dist: sphinx>=7.2; extra == "docs"
40
45
  Requires-Dist: pydata-sphinx-theme; extra == "docs"
@@ -63,11 +68,13 @@ bootstack gives engineers, data scientists, and hobbyists everything to build a
63
68
  polished desktop interface and package it into a standalone executable —
64
69
  declarative, reactive, and batteries-included, all in pure Python.
65
70
 
71
+ <p align="center">
66
72
  <picture>
67
73
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-dark.png">
68
74
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
69
75
  <img alt="bootstack hero demo" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
70
76
  </picture>
77
+ </p>
71
78
 
72
79
  ## Why bootstack?
73
80
 
@@ -75,16 +82,17 @@ Most Python desktop frameworks make you fight the framework. bootstack gets out
75
82
 
76
83
  - **30% less code** — the declarative, context-manager layout eliminates geometry calls, explicit parenting, and most of the wiring boilerplate
77
84
  - **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
85
+ - **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
86
  - **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
87
  - **Reactive signals** — observable state that flows between widgets; bind once, update everywhere
81
88
  - **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
89
+ - **Built-in icons** — the full Bootstrap Icons catalog, theme-aware and recolorable, bundled with the framework
83
90
  - **Built-in localization** — 23 language catalogs, locale-aware number/date/time formatting, runtime language switching
84
91
  - **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
92
+ - **10 paired light/dark themes** — popular dev color schemes plus Bootstrap, with a runtime switcher and a custom-theme API
86
93
  - **Forms and validation** — field-level validators, inline error messages, and a `FormDialog` for quick modal forms
87
94
  - **DataSource abstraction** — one interface over SQLite, in-memory, and file backends with filtering, sorting, pagination, and CRUD
95
+ - **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)
88
96
  - **A real CLI** — scaffold, run, add pages/views/dialogs/themes, and package for distribution
89
97
  - **PyInstaller packaging built in** — `bootstack build` produces a standalone executable; no separate toolchain required
90
98
 
@@ -108,11 +116,13 @@ The widget gallery is a single-window tour of everything bootstack ships — eve
108
116
  bootstack gallery
109
117
  ```
110
118
 
119
+ <p align="center">
111
120
  <picture>
112
121
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-dark.png">
113
122
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
114
123
  <img alt="bootstack widget gallery" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
115
124
  </picture>
125
+ </p>
116
126
 
117
127
  ## Quick Start
118
128
 
@@ -128,11 +138,13 @@ with bs.App(title="Hello", padding=16, gap=16) as app:
128
138
  app.run()
129
139
  ```
130
140
 
141
+ <p align="center">
131
142
  <picture>
132
143
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-dark.png">
133
144
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
134
145
  <img alt="bootstack quick start example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
135
146
  </picture>
147
+ </p>
136
148
 
137
149
  For navigation-based apps, use `AppShell` — it gives you stacked toolbars, a sidebar, and a page stack in one call:
138
150
 
@@ -141,11 +153,11 @@ import bootstack as bs
141
153
 
142
154
  shell = bs.AppShell(title="My App", size=(1000, 650))
143
155
 
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.")
156
+ with shell.page_nav() as nav:
157
+ with nav.add_page("home", text="Home", icon="house"):
158
+ bs.Label("Welcome!")
159
+ with nav.add_page("docs", text="Documents", icon="file-earmark-text"):
160
+ bs.Label("Your documents.")
149
161
 
150
162
  shell.run()
151
163
  ```
@@ -154,11 +166,11 @@ shell.run()
154
166
 
155
167
  ### Layout containers
156
168
 
157
- `VStack`, `HStack`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
169
+ `Column`, `Row`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
158
170
 
159
171
  ```python
160
172
  with bs.App(title="Sign In") as app:
161
- with bs.Grid(columns=["auto", 1], gap=(12, 6), sticky_items="ew", padding=16):
173
+ with bs.Grid(columns=["auto", 1], gap=(12, 6), horizontal_items="stretch", padding=16):
162
174
  bs.Label("Name:")
163
175
  bs.TextField(placeholder="Full name")
164
176
  bs.Label("Email:")
@@ -170,11 +182,13 @@ with bs.App(title="Sign In") as app:
170
182
  app.run()
171
183
  ```
172
184
 
185
+ <p align="center">
173
186
  <picture>
174
187
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-dark.png">
175
188
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
176
189
  <img alt="bootstack layout containers example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
177
190
  </picture>
191
+ </p>
178
192
 
179
193
  ### Semantic styling
180
194
 
@@ -186,11 +200,13 @@ bs.Button("Cancel", accent="secondary", variant="outline")
186
200
  bs.Label("Heading", font="heading-lg")
187
201
  ```
188
202
 
203
+ <p align="center">
189
204
  <picture>
190
205
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-dark.png">
191
206
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
192
207
  <img alt="bootstack semantic styling example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
193
208
  </picture>
209
+ </p>
194
210
 
195
211
  ### Signals (optional)
196
212
 
@@ -207,17 +223,18 @@ app.run()
207
223
 
208
224
  ## Features
209
225
 
210
- - **Application scaffolding** — `App` for blank windows, `AppShell` for command-bar + sidebar + page-stack apps, undecorated windows with custom chrome
226
+ - **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
227
  - **60+ themed widgets** — primitives plus higher-level composites (DataTable, Tree, ListView, Calendar, DateField, Form, Gauge, ToggleGroup, PageStack, Carousel, Tooltip, and more)
212
228
  - **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`
229
+ - **Layout containers** — `Column`, `Row`, `Grid`, and `Spacer` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Divider`
214
230
  - **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
231
+ - **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
232
  - **Reactive signals** — observable state with subscribe/set, integrates with widgets via `signal=` / `textsignal=`
217
233
  - **Forms & validation** — `Form` with built-in field-level validators and inline error messages
218
234
  - **DataSource** — common interface over in-memory, SQLite, and file backends, with pagination, filtering, sorting, CRUD, and CSV/TSV/Excel export
235
+ - **Data visualization** — `Chart` embeds `matplotlib`/`seaborn` figures that theme themselves and live-update from a `Signal` or `DataSource`; managed render, blitting animation, and a themed navigation toolbar (optional `viz` / `viz-seaborn` extras)
219
236
  - **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
237
+ - **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring and caching
221
238
  - **Platform support** — DPI awareness, multi-monitor centering, mica/acrylic effects on Windows
222
239
  - **CLI (`bootstack`)** — project scaffolding, run, add components, theme/i18n setup, doctor, build/package
223
240
 
@@ -225,13 +242,13 @@ app.run()
225
242
 
226
243
  | Category | Widgets |
227
244
  |----------|---------|
228
- | **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar |
245
+ | **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar, ThemeToggle |
229
246
  | **Inputs** | TextField, PasswordField, PathField, NumberField, SpinnerField, Slider, RangeSlider, TextArea, CodeEditor, DateField, TimeField |
230
247
  | **Selection** | Checkbox, Switch, ToggleButton, Radio, RadioGroup, ToggleGroup, Select, SelectButton, Calendar |
231
248
  | **Data Display** | Label, Badge, ListView, Tree, DataTable, ProgressBar, Gauge |
232
249
  | **Media** | Avatar, Picture, Gallery, Carousel |
233
- | **Layout** | VStack, HStack, Grid, Card, GroupBox, SplitView, ScrollView, Accordion, Separator |
234
- | **Navigation** | AppShell, SideNav, StatusBar, Tabs, PageStack |
250
+ | **Layout** | Column, Row, Grid, Spacer, Card, GroupBox, SplitView, ScrollView, Accordion, Divider |
251
+ | **Navigation** | AppShell, Workbench, Window, StatusBar, Tabs, PageStack |
235
252
  | **Dialogs** | `alert()`, `confirm()`, `ask_*()` prompts, FormDialog, FontDialog, FilterDialog |
236
253
  | **Overlays** | `toast()`, Notification, Snackbar, Tooltip |
237
254
  | **Forms** | Form, with field-level validation |
@@ -243,14 +260,15 @@ bootstack ships with an optional CLI for scaffolding, running, and packaging app
243
260
  ```bash
244
261
  bootstack gallery # Launch the interactive widget gallery
245
262
  bootstack icons # Browse the built-in icon catalog
263
+ bootstack appicon # Design an app icon and export it
246
264
  bootstack start MyApp # Create a new project (basic template)
247
265
  bootstack start MyApp --template appshell # ...or with sidebar navigation
248
266
  bootstack run # Run the app defined in the project config
249
267
  bootstack add page Dashboard # Add a new page (appshell)
250
268
  bootstack add view Settings # Add a new view (basic)
251
269
  bootstack add dialog Preferences # Add a new dialog
252
- bootstack add i18n --languages en es fr # Add i18n support
253
270
  bootstack doctor # Diagnose project & environment
271
+ bootstack promote # Make the project packaging-ready
254
272
  bootstack build # Package for distribution
255
273
  ```
256
274
 
@@ -259,6 +277,12 @@ bootstack build # Package for distribution
259
277
  Full documentation — guides, the widget catalog, and the API reference — lives at
260
278
  **[bootstack.org](https://bootstack.org)**.
261
279
 
280
+ ## Contributing
281
+
282
+ Contributions are welcome — code, bug reports, and especially **translations**.
283
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, the pull-request
284
+ workflow, and how to review the bundled language catalogs.
285
+
262
286
  ## Links
263
287
 
264
288
  - **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,16 +32,17 @@ 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
45
+ - **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)
43
46
  - **A real CLI** — scaffold, run, add pages/views/dialogs/themes, and package for distribution
44
47
  - **PyInstaller packaging built in** — `bootstack build` produces a standalone executable; no separate toolchain required
45
48
 
@@ -63,11 +66,13 @@ The widget gallery is a single-window tour of everything bootstack ships — eve
63
66
  bootstack gallery
64
67
  ```
65
68
 
69
+ <p align="center">
66
70
  <picture>
67
71
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-dark.png">
68
72
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
69
73
  <img alt="bootstack widget gallery" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
70
74
  </picture>
75
+ </p>
71
76
 
72
77
  ## Quick Start
73
78
 
@@ -83,11 +88,13 @@ with bs.App(title="Hello", padding=16, gap=16) as app:
83
88
  app.run()
84
89
  ```
85
90
 
91
+ <p align="center">
86
92
  <picture>
87
93
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-dark.png">
88
94
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
89
95
  <img alt="bootstack quick start example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
90
96
  </picture>
97
+ </p>
91
98
 
92
99
  For navigation-based apps, use `AppShell` — it gives you stacked toolbars, a sidebar, and a page stack in one call:
93
100
 
@@ -96,11 +103,11 @@ import bootstack as bs
96
103
 
97
104
  shell = bs.AppShell(title="My App", size=(1000, 650))
98
105
 
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.")
106
+ with shell.page_nav() as nav:
107
+ with nav.add_page("home", text="Home", icon="house"):
108
+ bs.Label("Welcome!")
109
+ with nav.add_page("docs", text="Documents", icon="file-earmark-text"):
110
+ bs.Label("Your documents.")
104
111
 
105
112
  shell.run()
106
113
  ```
@@ -109,11 +116,11 @@ shell.run()
109
116
 
110
117
  ### Layout containers
111
118
 
112
- `VStack`, `HStack`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
119
+ `Column`, `Row`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
113
120
 
114
121
  ```python
115
122
  with bs.App(title="Sign In") as app:
116
- with bs.Grid(columns=["auto", 1], gap=(12, 6), sticky_items="ew", padding=16):
123
+ with bs.Grid(columns=["auto", 1], gap=(12, 6), horizontal_items="stretch", padding=16):
117
124
  bs.Label("Name:")
118
125
  bs.TextField(placeholder="Full name")
119
126
  bs.Label("Email:")
@@ -125,11 +132,13 @@ with bs.App(title="Sign In") as app:
125
132
  app.run()
126
133
  ```
127
134
 
135
+ <p align="center">
128
136
  <picture>
129
137
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-dark.png">
130
138
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
131
139
  <img alt="bootstack layout containers example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
132
140
  </picture>
141
+ </p>
133
142
 
134
143
  ### Semantic styling
135
144
 
@@ -141,11 +150,13 @@ bs.Button("Cancel", accent="secondary", variant="outline")
141
150
  bs.Label("Heading", font="heading-lg")
142
151
  ```
143
152
 
153
+ <p align="center">
144
154
  <picture>
145
155
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-dark.png">
146
156
  <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
147
157
  <img alt="bootstack semantic styling example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
148
158
  </picture>
159
+ </p>
149
160
 
150
161
  ### Signals (optional)
151
162
 
@@ -162,17 +173,18 @@ app.run()
162
173
 
163
174
  ## Features
164
175
 
165
- - **Application scaffolding** — `App` for blank windows, `AppShell` for command-bar + sidebar + page-stack apps, undecorated windows with custom chrome
176
+ - **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
177
  - **60+ themed widgets** — primitives plus higher-level composites (DataTable, Tree, ListView, Calendar, DateField, Form, Gauge, ToggleGroup, PageStack, Carousel, Tooltip, and more)
167
178
  - **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`
179
+ - **Layout containers** — `Column`, `Row`, `Grid`, and `Spacer` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Divider`
169
180
  - **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
181
+ - **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
182
  - **Reactive signals** — observable state with subscribe/set, integrates with widgets via `signal=` / `textsignal=`
172
183
  - **Forms & validation** — `Form` with built-in field-level validators and inline error messages
173
184
  - **DataSource** — common interface over in-memory, SQLite, and file backends, with pagination, filtering, sorting, CRUD, and CSV/TSV/Excel export
185
+ - **Data visualization** — `Chart` embeds `matplotlib`/`seaborn` figures that theme themselves and live-update from a `Signal` or `DataSource`; managed render, blitting animation, and a themed navigation toolbar (optional `viz` / `viz-seaborn` extras)
174
186
  - **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
187
+ - **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring and caching
176
188
  - **Platform support** — DPI awareness, multi-monitor centering, mica/acrylic effects on Windows
177
189
  - **CLI (`bootstack`)** — project scaffolding, run, add components, theme/i18n setup, doctor, build/package
178
190
 
@@ -180,13 +192,13 @@ app.run()
180
192
 
181
193
  | Category | Widgets |
182
194
  |----------|---------|
183
- | **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar |
195
+ | **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar, ThemeToggle |
184
196
  | **Inputs** | TextField, PasswordField, PathField, NumberField, SpinnerField, Slider, RangeSlider, TextArea, CodeEditor, DateField, TimeField |
185
197
  | **Selection** | Checkbox, Switch, ToggleButton, Radio, RadioGroup, ToggleGroup, Select, SelectButton, Calendar |
186
198
  | **Data Display** | Label, Badge, ListView, Tree, DataTable, ProgressBar, Gauge |
187
199
  | **Media** | Avatar, Picture, Gallery, Carousel |
188
- | **Layout** | VStack, HStack, Grid, Card, GroupBox, SplitView, ScrollView, Accordion, Separator |
189
- | **Navigation** | AppShell, SideNav, StatusBar, Tabs, PageStack |
200
+ | **Layout** | Column, Row, Grid, Spacer, Card, GroupBox, SplitView, ScrollView, Accordion, Divider |
201
+ | **Navigation** | AppShell, Workbench, Window, StatusBar, Tabs, PageStack |
190
202
  | **Dialogs** | `alert()`, `confirm()`, `ask_*()` prompts, FormDialog, FontDialog, FilterDialog |
191
203
  | **Overlays** | `toast()`, Notification, Snackbar, Tooltip |
192
204
  | **Forms** | Form, with field-level validation |
@@ -198,14 +210,15 @@ bootstack ships with an optional CLI for scaffolding, running, and packaging app
198
210
  ```bash
199
211
  bootstack gallery # Launch the interactive widget gallery
200
212
  bootstack icons # Browse the built-in icon catalog
213
+ bootstack appicon # Design an app icon and export it
201
214
  bootstack start MyApp # Create a new project (basic template)
202
215
  bootstack start MyApp --template appshell # ...or with sidebar navigation
203
216
  bootstack run # Run the app defined in the project config
204
217
  bootstack add page Dashboard # Add a new page (appshell)
205
218
  bootstack add view Settings # Add a new view (basic)
206
219
  bootstack add dialog Preferences # Add a new dialog
207
- bootstack add i18n --languages en es fr # Add i18n support
208
220
  bootstack doctor # Diagnose project & environment
221
+ bootstack promote # Make the project packaging-ready
209
222
  bootstack build # Package for distribution
210
223
  ```
211
224
 
@@ -214,6 +227,12 @@ bootstack build # Package for distribution
214
227
  Full documentation — guides, the widget catalog, and the API reference — lives at
215
228
  **[bootstack.org](https://bootstack.org)**.
216
229
 
230
+ ## Contributing
231
+
232
+ Contributions are welcome — code, bug reports, and especially **translations**.
233
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, the pull-request
234
+ workflow, and how to review the bundled language catalogs.
235
+
217
236
  ## Links
218
237
 
219
238
  - **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.0a13"
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"
@@ -73,6 +73,15 @@ hdf5 = [
73
73
  "pandas>=2",
74
74
  "tables>=3.8",
75
75
  ]
76
+ # Visualization — embed matplotlib figures in a Chart widget.
77
+ viz = [
78
+ "matplotlib>=3.8",
79
+ ]
80
+ # Visualization with seaborn convenience layer on top of matplotlib.
81
+ viz-seaborn = [
82
+ "matplotlib>=3.8",
83
+ "seaborn>=0.13",
84
+ ]
76
85
  docs = [
77
86
  "sphinx>=7.2",
78
87
  "pydata-sphinx-theme",
@@ -100,7 +109,7 @@ where = ["src"]
100
109
  ]
101
110
 
102
111
  [tool.bumpversion]
103
- current_version = "0.1.0a11"
112
+ current_version = "0.1.0a13"
104
113
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)((?P<pre>a|b|rc)(?P<pre_n>\\d+))?"
105
114
  serialize = [
106
115
  "{major}.{minor}.{patch}{pre}{pre_n}",
@@ -129,9 +138,10 @@ search = "version = \"{current_version}\""
129
138
  replace = "version = \"{new_version}\""
130
139
 
131
140
  [tool.pytest.ini_options]
132
- testpaths = ["tests/cli", "tests/widgets/public"]
141
+ testpaths = ["tests/cli", "tests/widgets/public", "tests/data"]
133
142
  markers = [
134
143
  "gui: requires a Tk display (deselect with -m 'not gui')",
144
+ "isolated: constructs its own Tk root (App/AppShell/Window kwargs); must run in a dedicated process. Run the suite via `python tests/run_gui.py`, which executes the shared-root suite once and each isolated module in its own process.",
135
145
  ]
136
146
 
137
147
  [tool.ruff.lint]
@@ -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
@@ -81,6 +81,7 @@ from bootstack.widgets.pagestack import PageStack, StackPage
81
81
  from bootstack.widgets.pathfield import PathField
82
82
  from bootstack.widgets.avatar import Avatar
83
83
  from bootstack.widgets.carousel import Carousel
84
+ from bootstack.widgets.chart import Chart
84
85
  from bootstack.widgets.gallery import Gallery
85
86
  from bootstack.widgets.passwordfield import PasswordField
86
87
  from bootstack.widgets.picture import Picture
@@ -90,7 +91,7 @@ from bootstack.widgets.radiogroup import RadioGroup
90
91
  from bootstack.widgets.scrollview import ScrollView
91
92
  from bootstack.widgets.select import Select
92
93
  from bootstack.widgets.selectbutton import SelectButton
93
- from bootstack.widgets.separator import Separator
94
+ from bootstack.widgets.divider import Divider
94
95
  from bootstack.widgets.splitview import SplitView, SplitPane
95
96
  from bootstack.widgets.slider import RangeSlider, Slider
96
97
  from bootstack.widgets.spinnerfield import SpinnerField
@@ -127,9 +128,9 @@ __all__ = [
127
128
  "ask_date_range", "ask_item", "ask_color", "ask_font", "ask_filter",
128
129
  "ask_save_file", "ask_open_file", "ask_open_files", "ask_directory",
129
130
  # Application & windows
130
- "App", "AppShell", "Window",
131
+ "App", "AppShell", "Workbench", "Window",
131
132
  # Layout
132
- "HStack", "VStack", "Grid", "Card", "GroupBox", "Separator", "ScrollView",
133
+ "Row", "Column", "Spacer", "Grid", "Card", "GroupBox", "Divider", "ScrollView",
133
134
  "SplitView", "SplitPane", "Accordion", "AccordionSection",
134
135
  # Actions
135
136
  "Button", "ButtonGroup", "ThemeToggle", "MenuButton", "Toolbar", "StatusBar",
@@ -143,7 +144,7 @@ __all__ = [
143
144
  # Data display
144
145
  "Label", "Badge", "ProgressBar", "Gauge", "ListView", "DataTable", "Tree", "TreeNode",
145
146
  # Media
146
- "Picture", "Gallery", "Carousel", "Avatar",
147
+ "Picture", "Gallery", "Carousel", "Avatar", "Chart",
147
148
  # Navigation
148
149
  "PageStack", "StackPage", "Tabs", "TabPage",
149
150
  # Overlays
@@ -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.
@@ -675,6 +675,32 @@ class App(BaseWindow, WidgetCapabilitiesMixin, tkinter.Tk):
675
675
  except tkinter.TclError:
676
676
  pass
677
677
  clear_current_app(self)
678
+ # Drop every process-wide cache that holds a Tk object bound to THIS
679
+ # root's interpreter — the Style singleton, the named/derived font
680
+ # caches, the nine-patch PhotoImage cache, and the visual-focus root
681
+ # ref. This must happen *before* super().destroy(): those cached
682
+ # PhotoImage/TkFont objects run `image delete`/`font delete` in their
683
+ # finalizers, and if they outlive the interpreter that owns them the
684
+ # call lands on a foreign/dead interpreter — a native crash in ttk
685
+ # element_create on the *next* root (the C layer, so Python can't catch
686
+ # it). Releasing + gc.collect() while this root is still alive lets the
687
+ # finalizers run cleanly. Only when no other App is live (single-App is
688
+ # the norm; this also lets the GUI test suite run module-after-module in
689
+ # one process, and fixes reopen-an-app-after-close in production).
690
+ if not has_current_app():
691
+ try:
692
+ import gc
693
+ from bootstack.style.style import reset_style
694
+ from bootstack.style.typography import Typography
695
+ from bootstack._core.images import _ImageService
696
+ from bootstack._runtime.visual_focus import reset_visual_focus_root
697
+ reset_style()
698
+ Typography.reset()
699
+ _ImageService.clear_cache()
700
+ reset_visual_focus_root()
701
+ gc.collect()
702
+ except Exception:
703
+ pass
678
704
  super().destroy()
679
705
 
680
706
  # ----- Window state persistence ------------------------------------------