bootstack 0.1.0a3__tar.gz → 0.1.0a5__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 (429) hide show
  1. {bootstack-0.1.0a3/src/bootstack.egg-info → bootstack-0.1.0a5}/PKG-INFO +20 -4
  2. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/README.md +19 -3
  3. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/pyproject.toml +2 -2
  4. bootstack-0.1.0a5/src/bootstack/assets/bootstack-dark.ico +0 -0
  5. bootstack-0.1.0a5/src/bootstack/assets/bootstack-light.ico +0 -0
  6. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/cli/__init__.py +11 -4
  7. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/cli/demo.py +3 -3
  8. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/runtime/app.py +10 -0
  9. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/runtime/base_window.py +37 -12
  10. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/runtime/window_utilities.py +12 -5
  11. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/toast.py +8 -1
  12. {bootstack-0.1.0a3 → bootstack-0.1.0a5/src/bootstack.egg-info}/PKG-INFO +20 -4
  13. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack.egg-info/SOURCES.txt +2 -0
  14. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/LICENSE +0 -0
  15. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/MANIFEST.in +0 -0
  16. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/NOTICE +0 -0
  17. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/setup.cfg +0 -0
  18. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/__init__.py +0 -0
  19. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/__main__.py +0 -0
  20. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/api/__init__.py +0 -0
  21. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/api/app.py +0 -0
  22. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/api/constants.py +0 -0
  23. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/api/data.py +0 -0
  24. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/api/dialogs.py +0 -0
  25. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/api/i18n.py +0 -0
  26. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/api/localization.py +0 -0
  27. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/api/menu.py +0 -0
  28. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/api/style.py +0 -0
  29. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/api/utils.py +0 -0
  30. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/api/widgets.py +0 -0
  31. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/__init__.py +0 -0
  32. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/bootstack-transparent.png +0 -0
  33. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/bootstack.ico +0 -0
  34. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/bootstack.png +0 -0
  35. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/__init__.py +0 -0
  36. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/badge-pill.png +0 -0
  37. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/badge-square.png +0 -0
  38. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/border.png +0 -0
  39. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/button-compact.png +0 -0
  40. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/button-default.png +0 -0
  41. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/button-group-horizontal-after-compact.png +0 -0
  42. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/button-group-horizontal-after-default.png +0 -0
  43. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/button-group-horizontal-before-compact.png +0 -0
  44. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/button-group-horizontal-before-default.png +0 -0
  45. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/button-group-horizontal-center-compact.png +0 -0
  46. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/button-group-horizontal-center-default.png +0 -0
  47. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/button-group-vertical-after-compact.png +0 -0
  48. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/button-group-vertical-after-default.png +0 -0
  49. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/button-group-vertical-before-compact.png +0 -0
  50. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/button-group-vertical-before-default.png +0 -0
  51. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/button-group-vertical-center-compact.png +0 -0
  52. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/button-group-vertical-center-default.png +0 -0
  53. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/checkbox-checked.png +0 -0
  54. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/checkbox-indeterminate.png +0 -0
  55. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/checkbox-unchecked.png +0 -0
  56. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/field.png +0 -0
  57. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/input-after-compact.png +0 -0
  58. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/input-after-default.png +0 -0
  59. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/input-before-compact.png +0 -0
  60. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/input-before-default.png +0 -0
  61. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/input-compact.png +0 -0
  62. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/input-default.png +0 -0
  63. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/list-item-separated.png +0 -0
  64. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/list-item.png +0 -0
  65. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/manifest.toml +0 -0
  66. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/menu-item.png +0 -0
  67. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/nav-button-compact.png +0 -0
  68. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/nav-button-default.png +0 -0
  69. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/nav-icon-button-compact.png +0 -0
  70. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/nav-icon-button-default.png +0 -0
  71. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/notebook-client-border.png +0 -0
  72. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/notebook-tab-active.png +0 -0
  73. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/notebook-tab-bar.png +0 -0
  74. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/notebook-tab-normal.png +0 -0
  75. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/notebook-tab-pill.png +0 -0
  76. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/progress-bar-horizontal-striped.png +0 -0
  77. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/progress-bar-solid.png +0 -0
  78. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/progress-bar-thin.png +0 -0
  79. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/progress-bar-vertical-striped.png +0 -0
  80. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/radio-selected.png +0 -0
  81. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/radio-unselected.png +0 -0
  82. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/scrollbar-horizontal.png +0 -0
  83. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/scrollbar-vertical.png +0 -0
  84. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/slider-handle-focus.png +0 -0
  85. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/slider-handle.png +0 -0
  86. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/slider-track-horizontal.png +0 -0
  87. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/slider-track-vertical.png +0 -0
  88. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/switch-off.png +0 -0
  89. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/switch-on.png +0 -0
  90. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/tabs-bar-horizontal.png +0 -0
  91. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/tabs-bar-vertical.png +0 -0
  92. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/elements/tabs-pill.png +0 -0
  93. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
  94. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +0 -0
  95. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +0 -0
  96. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
  97. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +0 -0
  98. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
  99. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +0 -0
  100. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
  101. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +0 -0
  102. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
  103. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +0 -0
  104. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
  105. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +0 -0
  106. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
  107. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +0 -0
  108. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
  109. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +0 -0
  110. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
  111. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +0 -0
  112. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
  113. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +0 -0
  114. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
  115. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +0 -0
  116. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
  117. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +0 -0
  118. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
  119. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +0 -0
  120. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
  121. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +0 -0
  122. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
  123. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +0 -0
  124. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
  125. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +0 -0
  126. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
  127. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +0 -0
  128. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
  129. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +0 -0
  130. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
  131. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +0 -0
  132. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
  133. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +0 -0
  134. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
  135. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +0 -0
  136. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
  137. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +0 -0
  138. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/__init__.py +0 -0
  139. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/amber-dark.json +0 -0
  140. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/amber-light.json +0 -0
  141. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/aurora-dark.json +0 -0
  142. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/aurora-light.json +0 -0
  143. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/bootstrap-dark.json +0 -0
  144. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/bootstrap-light.json +0 -0
  145. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/classic-dark.json +0 -0
  146. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/classic-light.json +0 -0
  147. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/docs-dark.json +0 -0
  148. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/docs-light.json +0 -0
  149. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/forest-dark.json +0 -0
  150. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/forest-light.json +0 -0
  151. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/ocean-dark.json +0 -0
  152. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/ocean-light.json +0 -0
  153. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/rose-dark.json +0 -0
  154. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/themes/rose-light.json +0 -0
  155. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/__init__.py +0 -0
  156. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/badge-default.png +0 -0
  157. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/badge-pill.png +0 -0
  158. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/border.png +0 -0
  159. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/button-group-horizontal-after.png +0 -0
  160. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/button-group-horizontal-before.png +0 -0
  161. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/button-group-horizontal-center.png +0 -0
  162. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/button-group-vertical-after.png +0 -0
  163. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/button-group-vertical-before.png +0 -0
  164. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/button-group-vertical-center.png +0 -0
  165. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/button.png +0 -0
  166. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/checkbox-checked.png +0 -0
  167. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/checkbox-indeterminate.png +0 -0
  168. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/checkbox-unchecked.png +0 -0
  169. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/field.png +0 -0
  170. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/icon-button.png +0 -0
  171. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/input-inner.png +0 -0
  172. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/input-prefix.png +0 -0
  173. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/input-suffix.png +0 -0
  174. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/input.png +0 -0
  175. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/list-item-focus.png +0 -0
  176. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/list-item-separated.png +0 -0
  177. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/menu-item-separated.png +0 -0
  178. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/notebook-client-border.png +0 -0
  179. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/notebook-pill-active.png +0 -0
  180. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/notebook-pill-inactive.png +0 -0
  181. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/notebook-tab-active.png +0 -0
  182. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/notebook-tab-border.png +0 -0
  183. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/notebook-tab-normal.png +0 -0
  184. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/notebook-underline.png +0 -0
  185. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/progress-bar-horizontal-default.png +0 -0
  186. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/progress-bar-horizontal-striped.png +0 -0
  187. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/progress-bar-vertical-default.png +0 -0
  188. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/progress-bar-vertical-striped.png +0 -0
  189. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/progress-trough-horizontal.png +0 -0
  190. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/progress-trough-vertical.png +0 -0
  191. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/radio-selected.png +0 -0
  192. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/radio-unselected.png +0 -0
  193. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/scrollbar-horizontal-rounded.png +0 -0
  194. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/scrollbar-vertical-rounded.png +0 -0
  195. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/separator-horizontal.png +0 -0
  196. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/separator-vertical.png +0 -0
  197. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/slider-handle-focus.png +0 -0
  198. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/slider-handle.png +0 -0
  199. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/slider-track-horizontal.png +0 -0
  200. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/slider-track-vertical.png +0 -0
  201. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/switch-off.png +0 -0
  202. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/switch-on.png +0 -0
  203. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/tabs-bar-horizontal.png +0 -0
  204. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/tabs-bar-vertical.png +0 -0
  205. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/assets/widgets/tabs-pill.png +0 -0
  206. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/cli/__main__.py +0 -0
  207. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/cli/add.py +0 -0
  208. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/cli/build.py +0 -0
  209. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/cli/config.py +0 -0
  210. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/cli/doctor.py +0 -0
  211. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/cli/list_cmd.py +0 -0
  212. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/cli/promote.py +0 -0
  213. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/cli/pyinstaller.py +0 -0
  214. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/cli/run.py +0 -0
  215. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/cli/start.py +0 -0
  216. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/cli/templates/__init__.py +0 -0
  217. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/constants.py +0 -0
  218. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/__init__.py +0 -0
  219. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/capabilities/__init__.py +0 -0
  220. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/capabilities/after.py +0 -0
  221. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/capabilities/bind.py +0 -0
  222. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/capabilities/bindtags.py +0 -0
  223. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/capabilities/busy.py +0 -0
  224. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/capabilities/clipboard.py +0 -0
  225. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/capabilities/focus.py +0 -0
  226. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/capabilities/grab.py +0 -0
  227. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/capabilities/grid.py +0 -0
  228. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/capabilities/localization.py +0 -0
  229. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/capabilities/pack.py +0 -0
  230. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/capabilities/place.py +0 -0
  231. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/capabilities/selection.py +0 -0
  232. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/capabilities/signals.py +0 -0
  233. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/capabilities/winfo.py +0 -0
  234. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/colorutils.py +0 -0
  235. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/exceptions.py +0 -0
  236. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/images.py +0 -0
  237. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/localization/README.md +0 -0
  238. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/localization/__init__.py +0 -0
  239. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/localization/intl_format.py +0 -0
  240. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/localization/msgcat.py +0 -0
  241. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/localization/specs.py +0 -0
  242. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/mixins/__init__.py +0 -0
  243. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/mixins/ttk_state.py +0 -0
  244. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/mixins/widget.py +0 -0
  245. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/publisher.py +0 -0
  246. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/signals/README.md +0 -0
  247. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/signals/__init__.py +0 -0
  248. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/signals/integration.py +0 -0
  249. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/signals/signal.py +0 -0
  250. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/signals/types.py +0 -0
  251. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/validation/__init__.py +0 -0
  252. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/validation/types.py +0 -0
  253. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/validation/validation_result.py +0 -0
  254. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/validation/validation_rules.py +0 -0
  255. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/core/variables.py +0 -0
  256. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/datasource/README.md +0 -0
  257. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/datasource/__init__.py +0 -0
  258. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/datasource/base.py +0 -0
  259. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/datasource/file_source.py +0 -0
  260. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/datasource/memory_source.py +0 -0
  261. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/datasource/sqlite_source.py +0 -0
  262. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/datasource/types.py +0 -0
  263. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/dialogs/__init__.py +0 -0
  264. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/dialogs/colorchooser.py +0 -0
  265. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/dialogs/colordropper.py +0 -0
  266. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/dialogs/datedialog.py +0 -0
  267. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/dialogs/dialog.py +0 -0
  268. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/dialogs/filterdialog.py +0 -0
  269. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/dialogs/fontdialog.py +0 -0
  270. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/dialogs/formdialog.py +0 -0
  271. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/dialogs/message.py +0 -0
  272. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/dialogs/query.py +0 -0
  273. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/py.typed +0 -0
  274. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/runtime/__init__.py +0 -0
  275. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/runtime/events.py +0 -0
  276. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/runtime/menu.py +0 -0
  277. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/runtime/shortcuts.py +0 -0
  278. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/runtime/tk_patch.py +0 -0
  279. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/runtime/toplevel.py +0 -0
  280. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/runtime/utility.py +0 -0
  281. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/runtime/visual_focus.py +0 -0
  282. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/__init__.py +0 -0
  283. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/bootstyle.py +0 -0
  284. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/bootstyle_builder_base.py +0 -0
  285. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/bootstyle_builder_mixed.py +0 -0
  286. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/bootstyle_builder_tk.py +0 -0
  287. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/bootstyle_builder_ttk.py +0 -0
  288. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/__init__.py +0 -0
  289. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/badge.py +0 -0
  290. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/button.py +0 -0
  291. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/buttongroup.py +0 -0
  292. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/calendar.py +0 -0
  293. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/checkbutton.py +0 -0
  294. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/combobox.py +0 -0
  295. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/contextmenu.py +0 -0
  296. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/entry.py +0 -0
  297. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/expander.py +0 -0
  298. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/field.py +0 -0
  299. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/frame.py +0 -0
  300. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/label.py +0 -0
  301. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/labelframe.py +0 -0
  302. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/listview.py +0 -0
  303. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/menubar.py +0 -0
  304. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/menubutton.py +0 -0
  305. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/notebook.py +0 -0
  306. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/panedwindow.py +0 -0
  307. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/progressbar.py +0 -0
  308. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/radiobutton.py +0 -0
  309. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/scale.py +0 -0
  310. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/scrollbar.py +0 -0
  311. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/separator.py +0 -0
  312. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/sidenav.py +0 -0
  313. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/sizegrip.py +0 -0
  314. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/spinbox.py +0 -0
  315. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/switch.py +0 -0
  316. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/tabitem.py +0 -0
  317. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/toolbutton.py +0 -0
  318. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/tooltip.py +0 -0
  319. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/treeview.py +0 -0
  320. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders/utils.py +0 -0
  321. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders_tk/__init__.py +0 -0
  322. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/builders_tk/defaults.py +0 -0
  323. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/element.py +0 -0
  324. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/style.py +0 -0
  325. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/theme_provider.py +0 -0
  326. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/tk_patch.py +0 -0
  327. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/token_maps.py +0 -0
  328. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/types.py +0 -0
  329. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/typography.py +0 -0
  330. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/style/utility.py +0 -0
  331. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/themes/__init__.py +0 -0
  332. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/themes/standard.py +0 -0
  333. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/themes/user.py +0 -0
  334. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/__init__.py +0 -0
  335. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/__init__.py +0 -0
  336. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/accordion.py +0 -0
  337. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/appshell.py +0 -0
  338. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/buttongroup.py +0 -0
  339. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/calendar.py +0 -0
  340. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/compositeframe.py +0 -0
  341. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/contextmenu.py +0 -0
  342. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/dateentry.py +0 -0
  343. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/dropdownbutton.py +0 -0
  344. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/expander.py +0 -0
  345. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/field.py +0 -0
  346. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/floodgauge.py +0 -0
  347. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/form.py +0 -0
  348. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/labeledscale.py +0 -0
  349. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/list/__init__.py +0 -0
  350. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/list/listitem.py +0 -0
  351. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/list/listview.py +0 -0
  352. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/menubar.py +0 -0
  353. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/meter.py +0 -0
  354. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/numericentry.py +0 -0
  355. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/pagestack.py +0 -0
  356. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/passwordentry.py +0 -0
  357. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/pathentry.py +0 -0
  358. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/radiogroup.py +0 -0
  359. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/scrolledtext.py +0 -0
  360. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/scrolledtext.pyi +0 -0
  361. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/scrollview.py +0 -0
  362. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/selectbox.py +0 -0
  363. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/sidenav/__init__.py +0 -0
  364. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/sidenav/group.py +0 -0
  365. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/sidenav/header.py +0 -0
  366. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/sidenav/item.py +0 -0
  367. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/sidenav/separator.py +0 -0
  368. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/sidenav/view.py +0 -0
  369. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/spinnerentry.py +0 -0
  370. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/tableview/__init__.py +0 -0
  371. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/tableview/tableview.py +0 -0
  372. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/tableview/types.py +0 -0
  373. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/tabs/__init__.py +0 -0
  374. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/tabs/tabitem.py +0 -0
  375. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/tabs/tabs.py +0 -0
  376. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/tabs/tabview.py +0 -0
  377. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/textentry.py +0 -0
  378. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/timeentry.py +0 -0
  379. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/togglegroup.py +0 -0
  380. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/toolbar.py +0 -0
  381. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/composites/tooltip.py +0 -0
  382. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/internal/__init__.py +0 -0
  383. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/internal/wrapper_base.py +0 -0
  384. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/mixins/__init__.py +0 -0
  385. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/mixins/configure_mixin.py +0 -0
  386. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/mixins/entry_mixin.py +0 -0
  387. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/mixins/font_mixin.py +0 -0
  388. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/mixins/icon_mixin.py +0 -0
  389. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/mixins/localization_mixin.py +0 -0
  390. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/mixins/signal_mixin.py +0 -0
  391. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/mixins/validation_mixin.py +0 -0
  392. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/parts/__init__.py +0 -0
  393. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/parts/numberentry_part.py +0 -0
  394. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/parts/spinnerentry_part.py +0 -0
  395. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/parts/textentry_part.py +0 -0
  396. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/__init__.py +0 -0
  397. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/badge.py +0 -0
  398. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/button.py +0 -0
  399. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/card.py +0 -0
  400. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/checkbutton.py +0 -0
  401. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/checktoggle.py +0 -0
  402. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/combobox.py +0 -0
  403. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/entry.py +0 -0
  404. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/frame.py +0 -0
  405. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/gridframe.py +0 -0
  406. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/label.py +0 -0
  407. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/labelframe.py +0 -0
  408. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/menubutton.py +0 -0
  409. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/notebook.py +0 -0
  410. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/optionmenu.py +0 -0
  411. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/packframe.py +0 -0
  412. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/panedwindow.py +0 -0
  413. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/progressbar.py +0 -0
  414. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/radiobutton.py +0 -0
  415. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/radiotoggle.py +0 -0
  416. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/scale.py +0 -0
  417. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/scrollbar.py +0 -0
  418. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/separator.py +0 -0
  419. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/sizegrip.py +0 -0
  420. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/spinbox.py +0 -0
  421. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/switch.py +0 -0
  422. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/primitives/treeview.py +0 -0
  423. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack/widgets/types.py +0 -0
  424. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack.egg-info/dependency_links.txt +0 -0
  425. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack.egg-info/entry_points.txt +0 -0
  426. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack.egg-info/requires.txt +0 -0
  427. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/src/bootstack.egg-info/top_level.txt +0 -0
  428. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/tests/test_togglegroup.py +0 -0
  429. {bootstack-0.1.0a3 → bootstack-0.1.0a5}/tests/test_variables.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bootstack
3
- Version: 0.1.0a3
3
+ Version: 0.1.0a5
4
4
  Summary: A full UI framework for Python desktop apps built on tkinter — rich widgets, theming, and application structure out of the box.
5
5
  Author-email: Israel Dryer <israel.dryer@gmail.com>
6
6
  License-Expression: MIT
@@ -44,9 +44,16 @@ Dynamic: license-file
44
44
  ![](https://img.shields.io/github/forks/israel-dryer/bootstack.svg)
45
45
 
46
46
 
47
- **bootstack** is a batteries-included desktop application framework for Python, built on Tk. It grew out of [ttkbootstrap](https://github.com/israel-dryer/ttkbootstrap) — which brought Bootstrap-style theming to ttk widgets — and bundles the layers you'd expect from a modern framework around it: app scaffolding, layout containers, semantic styling, reactive signals, forms and validation, i18n, a data layer, and a CLI for scaffolding and packaging.
47
+ > **From the maker of [ttkbootstrap](https://github.com/israel-dryer/ttkbootstrap).**
48
48
 
49
- The aim is to take you from `pip install` to a working, themed application without wiring those pieces together yourself or dropping down to raw Tk geometry calls.
49
+ **bootstack** is a batteries-included desktop framework for Python, built on Tk.
50
+
51
+ 60+ themed widgets. Reactive state. Declarative layout. Built-in icons and localization. A CLI that scaffolds, builds, and ships. Everything ttkbootstrap was missing.
52
+
53
+ <p align="center">
54
+ <img src="docs/assets/hero-demo-app-light.png" width="49%" alt="bootstack Data Analysis Workbench — light theme">
55
+ <img src="docs/assets/hero-demo-app-dark.png" width="49%" alt="bootstack Data Analysis Workbench — dark theme">
56
+ </p>
50
57
 
51
58
  > **Active alpha.** APIs may change before the first stable release.
52
59
  > See the [documentation](https://bootstack.org) for guides and the API reference.
@@ -61,6 +68,14 @@ bootstack is currently in **active alpha**, so the `--pre` flag is required to o
61
68
  pip install --pre bootstack
62
69
  ```
63
70
 
71
+ ## See it
72
+
73
+ The widget gallery is a single-window tour of everything bootstack ships — every widget, theme switcher, accent variants, and layout containers. Fastest way to see the framework in action without writing a line of code:
74
+
75
+ ```bash
76
+ bootstack gallery
77
+ ```
78
+
64
79
  ## Quick Start
65
80
 
66
81
  ```python
@@ -136,7 +151,7 @@ bs.Button(app, text="+1", command=lambda: counter.set(counter.get() + 1))
136
151
  ## Features
137
152
 
138
153
  - **Application scaffolding** — `App` for blank windows, `AppShell` for toolbar + sidebar + page-stack apps, frameless windows with custom chrome
139
- - **60+ widgets** — ttk-derived primitives plus higher-level composites (TableView, Calendar, DateEntry, Form, FloodGauge, Meter, ToggleGroup, PageStack, Toast, Tooltip, and more)
154
+ - **60+ themed widgets** — ttk-derived primitives plus higher-level composites (TableView, Calendar, DateEntry, Form, FloodGauge, Meter, ToggleGroup, PageStack, Toast, Tooltip, and more)
140
155
  - **9 dialogs** — Message, Query, ColorChooser, ColorDropper, DateDialog, FontDialog, FilterDialog, FormDialog, plus a `Dialog` base
141
156
  - **Layout containers** — `PackFrame` and `GridFrame` for declarative layouts; `ScrollView`, `PanedWindow`, `Accordion`, `Card`, `Expander`
142
157
  - **Design system** — semantic `accent` colors (primary, secondary, success, danger, warning, info) and `variant` tokens (solid, outline, ghost, link, text), consistent across widgets
@@ -168,6 +183,7 @@ bs.Button(app, text="+1", command=lambda: counter.set(counter.get() + 1))
168
183
  bootstack ships with an optional CLI for scaffolding, running, and packaging applications:
169
184
 
170
185
  ```bash
186
+ bootstack gallery # Launch the interactive widget gallery
171
187
  bootstack start MyApp # Create a new project (basic template)
172
188
  bootstack start MyApp --template appshell # ...or with sidebar navigation
173
189
  bootstack run # Run the app defined in the project config
@@ -10,9 +10,16 @@
10
10
  ![](https://img.shields.io/github/forks/israel-dryer/bootstack.svg)
11
11
 
12
12
 
13
- **bootstack** is a batteries-included desktop application framework for Python, built on Tk. It grew out of [ttkbootstrap](https://github.com/israel-dryer/ttkbootstrap) — which brought Bootstrap-style theming to ttk widgets — and bundles the layers you'd expect from a modern framework around it: app scaffolding, layout containers, semantic styling, reactive signals, forms and validation, i18n, a data layer, and a CLI for scaffolding and packaging.
13
+ > **From the maker of [ttkbootstrap](https://github.com/israel-dryer/ttkbootstrap).**
14
14
 
15
- The aim is to take you from `pip install` to a working, themed application without wiring those pieces together yourself or dropping down to raw Tk geometry calls.
15
+ **bootstack** is a batteries-included desktop framework for Python, built on Tk.
16
+
17
+ 60+ themed widgets. Reactive state. Declarative layout. Built-in icons and localization. A CLI that scaffolds, builds, and ships. Everything ttkbootstrap was missing.
18
+
19
+ <p align="center">
20
+ <img src="docs/assets/hero-demo-app-light.png" width="49%" alt="bootstack Data Analysis Workbench — light theme">
21
+ <img src="docs/assets/hero-demo-app-dark.png" width="49%" alt="bootstack Data Analysis Workbench — dark theme">
22
+ </p>
16
23
 
17
24
  > **Active alpha.** APIs may change before the first stable release.
18
25
  > See the [documentation](https://bootstack.org) for guides and the API reference.
@@ -27,6 +34,14 @@ bootstack is currently in **active alpha**, so the `--pre` flag is required to o
27
34
  pip install --pre bootstack
28
35
  ```
29
36
 
37
+ ## See it
38
+
39
+ The widget gallery is a single-window tour of everything bootstack ships — every widget, theme switcher, accent variants, and layout containers. Fastest way to see the framework in action without writing a line of code:
40
+
41
+ ```bash
42
+ bootstack gallery
43
+ ```
44
+
30
45
  ## Quick Start
31
46
 
32
47
  ```python
@@ -102,7 +117,7 @@ bs.Button(app, text="+1", command=lambda: counter.set(counter.get() + 1))
102
117
  ## Features
103
118
 
104
119
  - **Application scaffolding** — `App` for blank windows, `AppShell` for toolbar + sidebar + page-stack apps, frameless windows with custom chrome
105
- - **60+ widgets** — ttk-derived primitives plus higher-level composites (TableView, Calendar, DateEntry, Form, FloodGauge, Meter, ToggleGroup, PageStack, Toast, Tooltip, and more)
120
+ - **60+ themed widgets** — ttk-derived primitives plus higher-level composites (TableView, Calendar, DateEntry, Form, FloodGauge, Meter, ToggleGroup, PageStack, Toast, Tooltip, and more)
106
121
  - **9 dialogs** — Message, Query, ColorChooser, ColorDropper, DateDialog, FontDialog, FilterDialog, FormDialog, plus a `Dialog` base
107
122
  - **Layout containers** — `PackFrame` and `GridFrame` for declarative layouts; `ScrollView`, `PanedWindow`, `Accordion`, `Card`, `Expander`
108
123
  - **Design system** — semantic `accent` colors (primary, secondary, success, danger, warning, info) and `variant` tokens (solid, outline, ghost, link, text), consistent across widgets
@@ -134,6 +149,7 @@ bs.Button(app, text="+1", command=lambda: counter.set(counter.get() + 1))
134
149
  bootstack ships with an optional CLI for scaffolding, running, and packaging applications:
135
150
 
136
151
  ```bash
152
+ bootstack gallery # Launch the interactive widget gallery
137
153
  bootstack start MyApp # Create a new project (basic template)
138
154
  bootstack start MyApp --template appshell # ...or with sidebar navigation
139
155
  bootstack run # Run the app defined in the project config
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "bootstack"
7
- version = "0.1.0a3"
7
+ version = "0.1.0a5"
8
8
  description = "A full UI framework for Python desktop apps built on tkinter — rich widgets, theming, and application structure out of the box."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -82,7 +82,7 @@ where = ["src"]
82
82
  ]
83
83
 
84
84
  [tool.bumpversion]
85
- current_version = "0.1.0a3"
85
+ current_version = "0.1.0a5"
86
86
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)((?P<pre>a|b|rc)(?P<pre_n>\\d+))?"
87
87
  serialize = [
88
88
  "{major}.{minor}.{patch}{pre}{pre_n}",
@@ -19,7 +19,7 @@ Usage:
19
19
  bootstack add i18n Add i18n support
20
20
  bootstack list themes List available themes
21
21
  bootstack doctor Diagnose project and environment health
22
- bootstack demo Launch the widget demo
22
+ bootstack gallery Launch the widget gallery
23
23
  """
24
24
 
25
25
  from __future__ import annotations
@@ -49,7 +49,7 @@ Examples:
49
49
  bootstack add view SettingsView Add a new view
50
50
  bootstack list themes List available themes
51
51
  bootstack doctor Diagnose project and environment health
52
- bootstack demo Launch the widget demo
52
+ bootstack gallery Launch the widget gallery
53
53
 
54
54
  For more information on a command:
55
55
  bootstack <command> --help
@@ -83,10 +83,17 @@ For more information on a command:
83
83
  list_cmd.add_parser(subparsers)
84
84
  doctor.add_parser(subparsers)
85
85
 
86
- # Demo command (kept for backwards compatibility)
86
+ # Gallery command
87
+ gallery_parser = subparsers.add_parser(
88
+ "gallery",
89
+ help="Launch the widget gallery",
90
+ )
91
+ gallery_parser.set_defaults(func=lambda args: run_demo())
92
+
93
+ # demo is kept as a backwards-compatible alias
87
94
  demo_parser = subparsers.add_parser(
88
95
  "demo",
89
- help="Launch the widget demo",
96
+ help=argparse.SUPPRESS,
90
97
  )
91
98
  demo_parser.set_defaults(func=lambda args: run_demo())
92
99
 
@@ -1,5 +1,5 @@
1
1
  """
2
- bootstack Widget Gallery
2
+ Widget Gallery
3
3
 
4
4
  An AppShell-based showcase of bootstack widgets, organized by category
5
5
  to mirror the documentation structure. Each sidebar item opens a page
@@ -1170,7 +1170,7 @@ def _build_theme_page(page):
1170
1170
  def run_demo():
1171
1171
  """Run the bootstack widget gallery as an AppShell application."""
1172
1172
  shell = bs.AppShell(
1173
- title="bootstack Widget Gallery",
1173
+ title="Widget Gallery",
1174
1174
  theme="bootstrap-light",
1175
1175
  size=(1100, 750),
1176
1176
  )
@@ -1261,7 +1261,7 @@ def setup_demo(master):
1261
1261
 
1262
1262
  bs.Label(
1263
1263
  master,
1264
- text="Use 'bootstack demo' to launch the full Widget Gallery.",
1264
+ text="Use 'bootstack gallery' to launch the Widget Gallery.",
1265
1265
  font="heading-lg",
1266
1266
  padding=40,
1267
1267
  ).pack(fill=BOTH, expand=YES)
@@ -540,6 +540,16 @@ class App(BaseWindow, WidgetCapabilitiesMixin, tkinter.Tk):
540
540
  if self._hdpi:
541
541
  enable_high_dpi_awareness()
542
542
 
543
+ # Tell Windows this is a distinct app so the taskbar uses our icon
544
+ # instead of the generic python.exe icon.
545
+ if sys.platform == 'win32':
546
+ try:
547
+ import ctypes
548
+ app_id = f"bootstack.{(self.settings.app_name or 'app').lower().replace(' ', '.')}"
549
+ ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(app_id)
550
+ except Exception:
551
+ pass
552
+
543
553
  # Initialize Tk
544
554
  tkinter.Tk.__init__(self, **kwargs)
545
555
  self.withdraw() # hide immediately until ready to show.
@@ -18,6 +18,7 @@ The BaseWindow mixin provides:
18
18
 
19
19
  from __future__ import annotations
20
20
 
21
+ import sys
21
22
  import tkinter
22
23
  from typing import Literal, Optional, Tuple, Callable, Any
23
24
 
@@ -185,9 +186,25 @@ class BaseWindow:
185
186
  import pywinstyles
186
187
  pywinstyles.apply_style(self, window_style)
187
188
  self._window_style_applied = True
189
+ self.after(0, self._update_chrome_color)
190
+ self.bind('<<ThemeChanged>>', lambda e: self.after(0, self._update_chrome_color), add='+')
188
191
  except Exception:
189
192
  pass
190
193
 
194
+ def _update_chrome_color(self) -> None:
195
+ if getattr(self, '_updating_chrome', False):
196
+ return
197
+ self._updating_chrome = True
198
+ try:
199
+ import pywinstyles
200
+ from bootstack.style.style import get_theme_provider
201
+ color = get_theme_provider().colors['chrome']
202
+ pywinstyles.change_header_color(self, color)
203
+ except Exception:
204
+ pass
205
+ finally:
206
+ self._updating_chrome = False
207
+
191
208
  def _setup_alpha(self, alpha: float) -> None:
192
209
  """Configure window alpha transparency in a platform-aware manner.
193
210
 
@@ -229,40 +246,48 @@ class BaseWindow:
229
246
  On failure to load custom icon, falls back to default icon if enabled.
230
247
  """
231
248
  if iconphoto is None:
232
- # No custom icon provided - use default if enabled
233
249
  if default_icon_enabled:
234
250
  try:
235
251
  from pathlib import Path
236
252
  import bootstack
237
- icon_path = Path(bootstack.__file__).parent / 'assets' / 'bootstack.png'
238
- self._icon = tkinter.PhotoImage(file=str(icon_path), master=self)
239
- self.iconphoto(True, self._icon)
253
+ assets = Path(bootstack.__file__).parent / 'assets'
254
+ if sys.platform == 'win32':
255
+ ico = assets / 'bootstack-light.ico'
256
+ if not ico.exists():
257
+ ico = assets / 'bootstack.ico'
258
+ self.wm_iconbitmap(str(ico))
259
+ else:
260
+ self._icon = tkinter.PhotoImage(file=str(assets / 'bootstack.png'), master=self)
261
+ self.iconphoto(True, self._icon)
240
262
  except (ImportError, FileNotFoundError, tkinter.TclError, Exception):
241
- # Icon file not available or failed to load - silently continue
242
263
  pass
243
264
  return
244
265
 
245
266
  # User provided a custom icon
246
267
  try:
247
- # Check if it's already a PhotoImage object
248
268
  if isinstance(iconphoto, tkinter.PhotoImage):
249
269
  self._icon = iconphoto
250
270
  self.iconphoto(True, self._icon)
271
+ elif str(iconphoto).lower().endswith('.ico'):
272
+ self.wm_iconbitmap(str(iconphoto))
251
273
  else:
252
- # Assume it's a file path
253
274
  self._icon = tkinter.PhotoImage(file=iconphoto, master=self)
254
275
  self.iconphoto(True, self._icon)
255
276
  except (tkinter.TclError, Exception) as e:
256
- # Failed to load user icon
257
277
  print(f'Failed to load icon: {iconphoto} - {e}')
258
278
  if default_icon_enabled:
259
- # Fall back to default bootstack.png
260
279
  try:
261
280
  from pathlib import Path
262
281
  import bootstack
263
- icon_path = Path(bootstack.__file__).parent / 'assets' / 'bootstack.png'
264
- self._icon = tkinter.PhotoImage(file=str(icon_path), master=self)
265
- self.iconphoto(True, self._icon)
282
+ assets = Path(bootstack.__file__).parent / 'assets'
283
+ if sys.platform == 'win32':
284
+ ico = assets / 'bootstack-light.ico'
285
+ if not ico.exists():
286
+ ico = assets / 'bootstack.ico'
287
+ self.wm_iconbitmap(str(ico))
288
+ else:
289
+ self._icon = tkinter.PhotoImage(file=str(assets / 'bootstack.png'), master=self)
290
+ self.iconphoto(True, self._icon)
266
291
  except (ImportError, FileNotFoundError, tkinter.TclError, Exception):
267
292
  pass
268
293
 
@@ -224,11 +224,18 @@ import bootstack.runtime.toplevel >>> parent = tkinter.Tk()
224
224
  w_width = window.winfo_reqwidth()
225
225
  w_height = window.winfo_reqheight()
226
226
 
227
- # Use virtual root for multi-monitor support
228
- screen_x0 = window.winfo_vrootx()
229
- screen_y0 = window.winfo_vrooty()
230
- screen_width = window.winfo_vrootwidth()
231
- screen_height = window.winfo_vrootheight()
227
+ # Use the monitor containing the proposed position when screeninfo is
228
+ # available — on Windows, winfo_vroot* only covers the primary monitor,
229
+ # so clamping with it moves windows that legitimately belong on a
230
+ # secondary monitor back onto the primary.
231
+ monitor = WindowPositioning._get_monitor_at_point(x, y)
232
+ if monitor:
233
+ screen_x0, screen_y0, screen_width, screen_height = monitor
234
+ else:
235
+ screen_x0 = window.winfo_vrootx()
236
+ screen_y0 = window.winfo_vrooty()
237
+ screen_width = window.winfo_vrootwidth()
238
+ screen_height = window.winfo_vrootheight()
232
239
 
233
240
  # Calculate screen boundaries
234
241
  screen_x1 = screen_x0 + screen_width
@@ -311,7 +311,14 @@ class Toast:
311
311
 
312
312
  # ------ Positioning -------
313
313
 
314
- # Update layout to get final window size
314
+ # Deiconify off-screen first so the geometry manager runs a full
315
+ # layout pass on a mapped window. winfo_height() returns 1 on a
316
+ # withdrawn window, causing the toast to be placed with ~0 height
317
+ # and therefore positioned flush against the screen edge.
318
+ top.deiconify()
319
+ top.geometry(
320
+ f"+{top.winfo_screenwidth() * 2}+{top.winfo_screenheight() * 2}"
321
+ )
315
322
  top.update_idletasks()
316
323
 
317
324
  # Apply positioning using WindowPositioning utilities
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bootstack
3
- Version: 0.1.0a3
3
+ Version: 0.1.0a5
4
4
  Summary: A full UI framework for Python desktop apps built on tkinter — rich widgets, theming, and application structure out of the box.
5
5
  Author-email: Israel Dryer <israel.dryer@gmail.com>
6
6
  License-Expression: MIT
@@ -44,9 +44,16 @@ Dynamic: license-file
44
44
  ![](https://img.shields.io/github/forks/israel-dryer/bootstack.svg)
45
45
 
46
46
 
47
- **bootstack** is a batteries-included desktop application framework for Python, built on Tk. It grew out of [ttkbootstrap](https://github.com/israel-dryer/ttkbootstrap) — which brought Bootstrap-style theming to ttk widgets — and bundles the layers you'd expect from a modern framework around it: app scaffolding, layout containers, semantic styling, reactive signals, forms and validation, i18n, a data layer, and a CLI for scaffolding and packaging.
47
+ > **From the maker of [ttkbootstrap](https://github.com/israel-dryer/ttkbootstrap).**
48
48
 
49
- The aim is to take you from `pip install` to a working, themed application without wiring those pieces together yourself or dropping down to raw Tk geometry calls.
49
+ **bootstack** is a batteries-included desktop framework for Python, built on Tk.
50
+
51
+ 60+ themed widgets. Reactive state. Declarative layout. Built-in icons and localization. A CLI that scaffolds, builds, and ships. Everything ttkbootstrap was missing.
52
+
53
+ <p align="center">
54
+ <img src="docs/assets/hero-demo-app-light.png" width="49%" alt="bootstack Data Analysis Workbench — light theme">
55
+ <img src="docs/assets/hero-demo-app-dark.png" width="49%" alt="bootstack Data Analysis Workbench — dark theme">
56
+ </p>
50
57
 
51
58
  > **Active alpha.** APIs may change before the first stable release.
52
59
  > See the [documentation](https://bootstack.org) for guides and the API reference.
@@ -61,6 +68,14 @@ bootstack is currently in **active alpha**, so the `--pre` flag is required to o
61
68
  pip install --pre bootstack
62
69
  ```
63
70
 
71
+ ## See it
72
+
73
+ The widget gallery is a single-window tour of everything bootstack ships — every widget, theme switcher, accent variants, and layout containers. Fastest way to see the framework in action without writing a line of code:
74
+
75
+ ```bash
76
+ bootstack gallery
77
+ ```
78
+
64
79
  ## Quick Start
65
80
 
66
81
  ```python
@@ -136,7 +151,7 @@ bs.Button(app, text="+1", command=lambda: counter.set(counter.get() + 1))
136
151
  ## Features
137
152
 
138
153
  - **Application scaffolding** — `App` for blank windows, `AppShell` for toolbar + sidebar + page-stack apps, frameless windows with custom chrome
139
- - **60+ widgets** — ttk-derived primitives plus higher-level composites (TableView, Calendar, DateEntry, Form, FloodGauge, Meter, ToggleGroup, PageStack, Toast, Tooltip, and more)
154
+ - **60+ themed widgets** — ttk-derived primitives plus higher-level composites (TableView, Calendar, DateEntry, Form, FloodGauge, Meter, ToggleGroup, PageStack, Toast, Tooltip, and more)
140
155
  - **9 dialogs** — Message, Query, ColorChooser, ColorDropper, DateDialog, FontDialog, FilterDialog, FormDialog, plus a `Dialog` base
141
156
  - **Layout containers** — `PackFrame` and `GridFrame` for declarative layouts; `ScrollView`, `PanedWindow`, `Accordion`, `Card`, `Expander`
142
157
  - **Design system** — semantic `accent` colors (primary, secondary, success, danger, warning, info) and `variant` tokens (solid, outline, ghost, link, text), consistent across widgets
@@ -168,6 +183,7 @@ bs.Button(app, text="+1", command=lambda: counter.set(counter.get() + 1))
168
183
  bootstack ships with an optional CLI for scaffolding, running, and packaging applications:
169
184
 
170
185
  ```bash
186
+ bootstack gallery # Launch the interactive widget gallery
171
187
  bootstack start MyApp # Create a new project (basic template)
172
188
  bootstack start MyApp --template appshell # ...or with sidebar navigation
173
189
  bootstack run # Run the app defined in the project config
@@ -25,6 +25,8 @@ src/bootstack/api/style.py
25
25
  src/bootstack/api/utils.py
26
26
  src/bootstack/api/widgets.py
27
27
  src/bootstack/assets/__init__.py
28
+ src/bootstack/assets/bootstack-dark.ico
29
+ src/bootstack/assets/bootstack-light.ico
28
30
  src/bootstack/assets/bootstack-transparent.png
29
31
  src/bootstack/assets/bootstack.ico
30
32
  src/bootstack/assets/bootstack.png
File without changes
File without changes
File without changes
File without changes