bootstack 0.2.2__tar.gz → 0.2.3__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 (494) hide show
  1. bootstack-0.2.3/NOTICE +30 -0
  2. {bootstack-0.2.2/src/bootstack.egg-info → bootstack-0.2.3}/PKG-INFO +302 -302
  3. {bootstack-0.2.2 → bootstack-0.2.3}/pyproject.toml +2 -2
  4. {bootstack-0.2.2 → bootstack-0.2.3}/setup.cfg +4 -4
  5. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/filter.py +3 -1
  6. bootstack-0.2.3/src/bootstack/widgets/_impl/composites/textarea/redirector.py +138 -0
  7. {bootstack-0.2.2 → bootstack-0.2.3/src/bootstack.egg-info}/PKG-INFO +302 -302
  8. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack.egg-info/SOURCES.txt +1 -0
  9. bootstack-0.2.2/NOTICE +0 -10
  10. {bootstack-0.2.2 → bootstack-0.2.3}/LICENSE +0 -0
  11. {bootstack-0.2.2 → bootstack-0.2.3}/MANIFEST.in +0 -0
  12. {bootstack-0.2.2 → bootstack-0.2.3}/README.md +0 -0
  13. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/__init__.py +0 -0
  14. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/__main__.py +0 -0
  15. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/__init__.py +0 -0
  16. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/capabilities/__init__.py +0 -0
  17. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/capabilities/after.py +0 -0
  18. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/capabilities/bind.py +0 -0
  19. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/capabilities/bindtags.py +0 -0
  20. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/capabilities/busy.py +0 -0
  21. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/capabilities/clipboard.py +0 -0
  22. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/capabilities/focus.py +0 -0
  23. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/capabilities/grab.py +0 -0
  24. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/capabilities/grid.py +0 -0
  25. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/capabilities/localization.py +0 -0
  26. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/capabilities/pack.py +0 -0
  27. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/capabilities/place.py +0 -0
  28. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/capabilities/selection.py +0 -0
  29. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/capabilities/signals.py +0 -0
  30. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/capabilities/winfo.py +0 -0
  31. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/colorutils.py +0 -0
  32. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/exceptions.py +0 -0
  33. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/images.py +0 -0
  34. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/mixins/__init__.py +0 -0
  35. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/mixins/ttk_state.py +0 -0
  36. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/mixins/widget.py +0 -0
  37. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/paths.py +0 -0
  38. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/publisher.py +0 -0
  39. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_core/variables.py +0 -0
  40. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_runtime/__init__.py +0 -0
  41. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_runtime/app.py +0 -0
  42. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_runtime/base_window.py +0 -0
  43. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_runtime/events.py +0 -0
  44. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_runtime/shortcuts.py +0 -0
  45. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_runtime/tk_patch.py +0 -0
  46. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_runtime/toplevel.py +0 -0
  47. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_runtime/utility.py +0 -0
  48. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_runtime/visual_focus.py +0 -0
  49. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_runtime/wheel.py +0 -0
  50. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/_runtime/window_utilities.py +0 -0
  51. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/__init__.py +0 -0
  52. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/bootstack.ico +0 -0
  53. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/bootstack.png +0 -0
  54. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/__init__.py +0 -0
  55. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/badge-pill.png +0 -0
  56. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/badge-square.png +0 -0
  57. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/button-compact.png +0 -0
  58. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/button-default.png +0 -0
  59. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
  60. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
  61. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
  62. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
  63. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
  64. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
  65. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
  66. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
  67. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
  68. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
  69. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
  70. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
  71. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/card.png +0 -0
  72. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/checkbox-checked.png +0 -0
  73. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/checkbox-indeterminate.png +0 -0
  74. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/checkbox-unchecked.png +0 -0
  75. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/field.png +0 -0
  76. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/input-addon-compact.png +0 -0
  77. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/input-addon-default.png +0 -0
  78. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/input-compact.png +0 -0
  79. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/input-default.png +0 -0
  80. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/list-item-separated.png +0 -0
  81. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/list-item.png +0 -0
  82. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/listrow-compact.png +0 -0
  83. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/listrow-default.png +0 -0
  84. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/manifest.toml +0 -0
  85. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/menu-item.png +0 -0
  86. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/navitem-compact.png +0 -0
  87. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/navitem-default.png +0 -0
  88. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/progressbar-h-compact.png +0 -0
  89. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/progressbar-h-default.png +0 -0
  90. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/progressbar-v-compact.png +0 -0
  91. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/progressbar-v-default.png +0 -0
  92. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/radiobutton.png +0 -0
  93. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/scrollbar-horizontal.png +0 -0
  94. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/scrollbar-vertical.png +0 -0
  95. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/slider-handle.png +0 -0
  96. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/slider-track-h.png +0 -0
  97. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/slider-track-v.png +0 -0
  98. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/switch-off.png +0 -0
  99. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/switch-on.png +0 -0
  100. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/tab-h.png +0 -0
  101. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/elements/tab-v.png +0 -0
  102. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/icons/bootstrap.ttf +0 -0
  103. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/icons/glyphmap.json +0 -0
  104. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/icons/icon_metrics.json +0 -0
  105. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
  106. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +0 -0
  107. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
  108. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +0 -0
  109. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
  110. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +0 -0
  111. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
  112. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +0 -0
  113. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
  114. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +0 -0
  115. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
  116. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +0 -0
  117. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
  118. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +0 -0
  119. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
  120. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +0 -0
  121. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
  122. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +0 -0
  123. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
  124. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +0 -0
  125. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
  126. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +0 -0
  127. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
  128. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +0 -0
  129. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
  130. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +0 -0
  131. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
  132. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +0 -0
  133. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
  134. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +0 -0
  135. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
  136. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +0 -0
  137. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
  138. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +0 -0
  139. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
  140. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +0 -0
  141. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
  142. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +0 -0
  143. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
  144. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +0 -0
  145. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
  146. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +0 -0
  147. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
  148. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +0 -0
  149. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
  150. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +0 -0
  151. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/cli/__init__.py +0 -0
  152. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/cli/__main__.py +0 -0
  153. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/cli/add.py +0 -0
  154. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/cli/appicon.py +0 -0
  155. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/cli/build.py +0 -0
  156. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/cli/config.py +0 -0
  157. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/cli/demo.py +0 -0
  158. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/cli/dev.py +0 -0
  159. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/cli/doctor.py +0 -0
  160. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/cli/icons.py +0 -0
  161. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/cli/promote.py +0 -0
  162. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/cli/pyinstaller.py +0 -0
  163. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/cli/run.py +0 -0
  164. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/cli/start.py +0 -0
  165. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/cli/templates/__init__.py +0 -0
  166. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/clipboard.py +0 -0
  167. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/constants.py +0 -0
  168. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/data/README.md +0 -0
  169. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/data/__init__.py +0 -0
  170. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/data/_observable.py +0 -0
  171. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/data/base.py +0 -0
  172. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/data/file_source.py +0 -0
  173. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/data/memory_source.py +0 -0
  174. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/data/query.py +0 -0
  175. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/data/readers.py +0 -0
  176. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/data/sqlite_source.py +0 -0
  177. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/data/types.py +0 -0
  178. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/data/writers.py +0 -0
  179. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dev/__init__.py +0 -0
  180. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dev/_capture.py +0 -0
  181. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dev/_env.py +0 -0
  182. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dev/_registry.py +0 -0
  183. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dev/_reloader.py +0 -0
  184. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dev/_reset.py +0 -0
  185. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dev/_watcher.py +0 -0
  186. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dialogs/__init__.py +0 -0
  187. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/__init__.py +0 -0
  188. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/colorchooser.py +0 -0
  189. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/datedialog.py +0 -0
  190. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/dialog.py +0 -0
  191. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/filterdialog.py +0 -0
  192. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/fontdialog.py +0 -0
  193. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/formdialog.py +0 -0
  194. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/message.py +0 -0
  195. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/dialogs/_impl/query.py +0 -0
  196. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/errors.py +0 -0
  197. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/events/__init__.py +0 -0
  198. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/events/_event.py +0 -0
  199. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/events/_payloads.py +0 -0
  200. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/events/_subscription.py +0 -0
  201. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/i18n/README.md +0 -0
  202. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/i18n/__init__.py +0 -0
  203. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/i18n/catalog.py +0 -0
  204. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/i18n/intl_format.py +0 -0
  205. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/i18n/msgcat.py +0 -0
  206. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/i18n/specs.py +0 -0
  207. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/images.py +0 -0
  208. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/py.typed +0 -0
  209. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/scheduling/__init__.py +0 -0
  210. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/scheduling/_schedule.py +0 -0
  211. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/shortcuts.py +0 -0
  212. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/signals/README.md +0 -0
  213. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/signals/__init__.py +0 -0
  214. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/signals/integration.py +0 -0
  215. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/signals/signal.py +0 -0
  216. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/signals/types.py +0 -0
  217. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/store.py +0 -0
  218. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/streams/__init__.py +0 -0
  219. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/streams/_stream.py +0 -0
  220. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/__init__.py +0 -0
  221. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/__init__.py +0 -0
  222. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/badge.py +0 -0
  223. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/button.py +0 -0
  224. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/buttongroup.py +0 -0
  225. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/calendar.py +0 -0
  226. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/checkbutton.py +0 -0
  227. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/combobox.py +0 -0
  228. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/contextmenu.py +0 -0
  229. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/entry.py +0 -0
  230. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/expander.py +0 -0
  231. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/field.py +0 -0
  232. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/frame.py +0 -0
  233. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/label.py +0 -0
  234. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/labelframe.py +0 -0
  235. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/listview.py +0 -0
  236. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/menubar.py +0 -0
  237. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/menubutton.py +0 -0
  238. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/panedwindow.py +0 -0
  239. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/progressbar.py +0 -0
  240. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/radiobutton.py +0 -0
  241. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/scale.py +0 -0
  242. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/scrollbar.py +0 -0
  243. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/separator.py +0 -0
  244. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/sidenav.py +0 -0
  245. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/sizegrip.py +0 -0
  246. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/spinbox.py +0 -0
  247. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/switch.py +0 -0
  248. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/tabitem.py +0 -0
  249. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/togglegroup.py +0 -0
  250. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/toolbutton.py +0 -0
  251. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/tooltip.py +0 -0
  252. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/treeview.py +0 -0
  253. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders/utils.py +0 -0
  254. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders_tk/__init__.py +0 -0
  255. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/builders_tk/defaults.py +0 -0
  256. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/element.py +0 -0
  257. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/fonts.py +0 -0
  258. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/style.py +0 -0
  259. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/style_builder_base.py +0 -0
  260. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/style_builder_mixed.py +0 -0
  261. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/style_builder_tk.py +0 -0
  262. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/style_builder_ttk.py +0 -0
  263. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/style_resolver.py +0 -0
  264. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/theme.py +0 -0
  265. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/theme_provider.py +0 -0
  266. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/themes/__init__.py +0 -0
  267. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/tk_patch.py +0 -0
  268. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/token_maps.py +0 -0
  269. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/types.py +0 -0
  270. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/typography.py +0 -0
  271. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/style/utility.py +0 -0
  272. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/types.py +0 -0
  273. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/validation/__init__.py +0 -0
  274. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/validation/types.py +0 -0
  275. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/validation/validation_result.py +0 -0
  276. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/validation/validation_rules.py +0 -0
  277. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/__init__.py +0 -0
  278. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/__init__.py +0 -0
  279. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/app_config.py +0 -0
  280. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/base.py +0 -0
  281. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/choices.py +0 -0
  282. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/container.py +0 -0
  283. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/context.py +0 -0
  284. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/events.py +0 -0
  285. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/field_mixin.py +0 -0
  286. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/icon_image_props.py +0 -0
  287. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/image_binding.py +0 -0
  288. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/kwargs.py +0 -0
  289. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/navmodel.py +0 -0
  290. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/options.py +0 -0
  291. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/selection_group.py +0 -0
  292. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/window_controls.py +0 -0
  293. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_core/window_menu.py +0 -0
  294. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/__init__.py +0 -0
  295. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/_internal/__init__.py +0 -0
  296. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/_internal/wrapper_base.py +0 -0
  297. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/_parts/__init__.py +0 -0
  298. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/_parts/numberentry_part.py +0 -0
  299. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/_parts/spinnerentry_part.py +0 -0
  300. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/_parts/textentry_part.py +0 -0
  301. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/__init__.py +0 -0
  302. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/_dateutils.py +0 -0
  303. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/_image_fit.py +0 -0
  304. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/accordion.py +0 -0
  305. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/avatar.py +0 -0
  306. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/buttongroup.py +0 -0
  307. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/calendar.py +0 -0
  308. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/carousel.py +0 -0
  309. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/chart.py +0 -0
  310. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/compositeframe.py +0 -0
  311. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/contextmenu.py +0 -0
  312. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/dateentry.py +0 -0
  313. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/dropdownbutton.py +0 -0
  314. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/expander.py +0 -0
  315. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/field.py +0 -0
  316. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/form.py +0 -0
  317. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/gallery.py +0 -0
  318. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/list/__init__.py +0 -0
  319. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/list/listitem.py +0 -0
  320. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/list/listview.py +0 -0
  321. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/menu/__init__.py +0 -0
  322. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/menu/model.py +0 -0
  323. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/menu/render_native.py +0 -0
  324. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/menu/render_themed.py +0 -0
  325. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/meter.py +0 -0
  326. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/numericentry.py +0 -0
  327. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/pagestack.py +0 -0
  328. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/passwordentry.py +0 -0
  329. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/pathentry.py +0 -0
  330. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/picture.py +0 -0
  331. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/radiogroup.py +0 -0
  332. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/scrolledtext.py +0 -0
  333. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/scrolledtext.pyi +0 -0
  334. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/scrollview.py +0 -0
  335. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/selectbox.py +0 -0
  336. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/__init__.py +0 -0
  337. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/content_host.py +0 -0
  338. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/layout.py +0 -0
  339. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/nav_panel.py +0 -0
  340. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/providers.py +0 -0
  341. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/rail.py +0 -0
  342. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/shell.py +0 -0
  343. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/shell/workspace.py +0 -0
  344. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/sidenav/__init__.py +0 -0
  345. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/sidenav/header.py +0 -0
  346. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/sidenav/separator.py +0 -0
  347. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/slider/__init__.py +0 -0
  348. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/slider/_shared.py +0 -0
  349. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/slider/rangeslider.py +0 -0
  350. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/slider/slider.py +0 -0
  351. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/spinnerentry.py +0 -0
  352. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tableview/__init__.py +0 -0
  353. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tableview/tableview.py +0 -0
  354. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tableview/types.py +0 -0
  355. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tabs/__init__.py +0 -0
  356. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tabs/tabitem.py +0 -0
  357. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tabs/tabs.py +0 -0
  358. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tabs/tabview.py +0 -0
  359. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/__init__.py +0 -0
  360. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/change.py +0 -0
  361. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/codeeditor.py +0 -0
  362. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/core.py +0 -0
  363. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/decoration.py +0 -0
  364. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/diff.py +0 -0
  365. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +0 -0
  366. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +0 -0
  367. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +0 -0
  368. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +0 -0
  369. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +0 -0
  370. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +0 -0
  371. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/search_overlay.py +0 -0
  372. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/sidebar.py +0 -0
  373. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/style_registry.py +0 -0
  374. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/textarea.py +0 -0
  375. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textarea/undo.py +0 -0
  376. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/textentry.py +0 -0
  377. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/timeentry.py +0 -0
  378. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/toast.py +0 -0
  379. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/toast_stack.py +0 -0
  380. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/togglegroup.py +0 -0
  381. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/toolbar.py +0 -0
  382. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tooltip.py +0 -0
  383. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tree/__init__.py +0 -0
  384. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tree/source_binding.py +0 -0
  385. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tree/treeitem.py +0 -0
  386. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tree/treenode.py +0 -0
  387. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/composites/tree/treeview.py +0 -0
  388. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/__init__.py +0 -0
  389. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/configure_mixin.py +0 -0
  390. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/entry_mixin.py +0 -0
  391. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/font_mixin.py +0 -0
  392. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/icon_mixin.py +0 -0
  393. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/localization_mixin.py +0 -0
  394. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/signal_mixin.py +0 -0
  395. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/mixins/validation_mixin.py +0 -0
  396. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/__init__.py +0 -0
  397. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/_menubutton.py +0 -0
  398. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/badge.py +0 -0
  399. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/button.py +0 -0
  400. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/card.py +0 -0
  401. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/checkbutton.py +0 -0
  402. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/checktoggle.py +0 -0
  403. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/combobox.py +0 -0
  404. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/entry.py +0 -0
  405. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/flexframe.py +0 -0
  406. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/frame.py +0 -0
  407. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/gridframe.py +0 -0
  408. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/label.py +0 -0
  409. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/labelframe.py +0 -0
  410. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/optionmenu.py +0 -0
  411. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/packframe.py +0 -0
  412. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/panedwindow.py +0 -0
  413. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/progressbar.py +0 -0
  414. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/radiobutton.py +0 -0
  415. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/radiotoggle.py +0 -0
  416. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/scrollbar.py +0 -0
  417. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/separator.py +0 -0
  418. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/sizegrip.py +0 -0
  419. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/spinbox.py +0 -0
  420. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/switch.py +0 -0
  421. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/_impl/primitives/treeview.py +0 -0
  422. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/app.py +0 -0
  423. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/appshell.py +0 -0
  424. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/avatar.py +0 -0
  425. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/boolean_controls.py +0 -0
  426. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/button.py +0 -0
  427. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/buttongroup.py +0 -0
  428. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/calendar.py +0 -0
  429. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/card.py +0 -0
  430. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/carousel.py +0 -0
  431. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/chart.py +0 -0
  432. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/codeeditor.py +0 -0
  433. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/contextmenu.py +0 -0
  434. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/datatable.py +0 -0
  435. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/datefield.py +0 -0
  436. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/divider.py +0 -0
  437. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/expander.py +0 -0
  438. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/form.py +0 -0
  439. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/gallery.py +0 -0
  440. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/gauge.py +0 -0
  441. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/grid.py +0 -0
  442. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/groupbox.py +0 -0
  443. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/label.py +0 -0
  444. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/listview.py +0 -0
  445. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/menubutton.py +0 -0
  446. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/numberfield.py +0 -0
  447. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/pagestack.py +0 -0
  448. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/passwordfield.py +0 -0
  449. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/pathfield.py +0 -0
  450. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/picture.py +0 -0
  451. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/progressbar.py +0 -0
  452. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/radio_variants.py +0 -0
  453. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/radiogroup.py +0 -0
  454. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/scrollbar.py +0 -0
  455. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/scrollview.py +0 -0
  456. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/select.py +0 -0
  457. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/selectbutton.py +0 -0
  458. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/sidebar_toggle.py +0 -0
  459. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/sizegrip.py +0 -0
  460. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/slider.py +0 -0
  461. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/spinbox.py +0 -0
  462. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/spinnerfield.py +0 -0
  463. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/splash.py +0 -0
  464. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/splitview.py +0 -0
  465. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/stacks.py +0 -0
  466. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/statusbar.py +0 -0
  467. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/tabs.py +0 -0
  468. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/textarea.py +0 -0
  469. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/textfield.py +0 -0
  470. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/theme_toggle.py +0 -0
  471. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/timefield.py +0 -0
  472. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/toast.py +0 -0
  473. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/togglegroup.py +0 -0
  474. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/toolbar.py +0 -0
  475. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/tooltip.py +0 -0
  476. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/tree.py +0 -0
  477. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/types.py +0 -0
  478. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack/widgets/window.py +0 -0
  479. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack.egg-info/dependency_links.txt +0 -0
  480. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack.egg-info/entry_points.txt +0 -0
  481. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack.egg-info/requires.txt +0 -0
  482. {bootstack-0.2.2 → bootstack-0.2.3}/src/bootstack.egg-info/top_level.txt +0 -0
  483. {bootstack-0.2.2 → bootstack-0.2.3}/tests/test_dialog_anchor.py +0 -0
  484. {bootstack-0.2.2 → bootstack-0.2.3}/tests/test_events_doc_coverage.py +0 -0
  485. {bootstack-0.2.2 → bootstack-0.2.3}/tests/test_hot_reload.py +0 -0
  486. {bootstack-0.2.2 → bootstack-0.2.3}/tests/test_images.py +0 -0
  487. {bootstack-0.2.2 → bootstack-0.2.3}/tests/test_images_gui.py +0 -0
  488. {bootstack-0.2.2 → bootstack-0.2.3}/tests/test_intl_format.py +0 -0
  489. {bootstack-0.2.2 → bootstack-0.2.3}/tests/test_navmodel.py +0 -0
  490. {bootstack-0.2.2 → bootstack-0.2.3}/tests/test_on_color_contrast.py +0 -0
  491. {bootstack-0.2.2 → bootstack-0.2.3}/tests/test_public_surface.py +0 -0
  492. {bootstack-0.2.2 → bootstack-0.2.3}/tests/test_store.py +0 -0
  493. {bootstack-0.2.2 → bootstack-0.2.3}/tests/test_theme_from_existing.py +0 -0
  494. {bootstack-0.2.2 → bootstack-0.2.3}/tests/test_validation_rules.py +0 -0
bootstack-0.2.3/NOTICE ADDED
@@ -0,0 +1,30 @@
1
+ bootstack
2
+ Copyright (c) 2021 - 2026 Israel Dryer
3
+
4
+ This project is derived from ttkbootstrap
5
+ (https://github.com/israel-dryer/ttkbootstrap),
6
+ Copyright (c) 2021 - 2026 Israel Dryer and ttkbootstrap contributors,
7
+ licensed under the MIT License.
8
+
9
+ The original ttkbootstrap license and copyright notice are preserved above
10
+ in compliance with the MIT License terms.
11
+
12
+ This project also contains code derived from IDLE, part of the CPython
13
+ standard library (https://github.com/python/cpython),
14
+ Copyright (c) 2001-2023 Python Software Foundation; All Rights Reserved,
15
+ licensed under the Python Software Foundation License Agreement, Version 2.
16
+
17
+ src/bootstack/widgets/_impl/composites/textarea/redirector.py
18
+
19
+ is a port of idlelib/redirector.py, carrying its WidgetRedirector and
20
+ OriginalCommand classes and their dispatch logic. Summary of the changes made,
21
+ as the Python Software Foundation License Agreement asks for: the
22
+ OriginalCommand interface was narrowed to three private attributes,
23
+ WidgetRedirector.__repr__ was dropped, the operation name is coerced to a
24
+ string before lookup, the widget reference is retained after close() rather
25
+ than deleted, and type hints and rewritten documentation were added.
26
+
27
+ Other modules in the same package implement designs described in IDLE — the
28
+ Delegator and Percolator chain, UndoDelegator, the editor sidebar, and
29
+ parenmatch's flash-and-restore highlighting — but share no substantial code
30
+ with it and are original implementations.
@@ -1,302 +1,302 @@
1
- Metadata-Version: 2.4
2
- Name: bootstack
3
- Version: 0.2.2
4
- Summary: Build desktop GUI apps in pure Python and ship them as a standalone executable — built on Tk, no Tkinter boilerplate.
5
- Author-email: Israel Dryer <israel.dryer@gmail.com>
6
- License-Expression: MIT
7
- Project-URL: Homepage, https://github.com/israel-dryer/bootstack
8
- Project-URL: Documentation, https://bootstack.org/
9
- Keywords: tkinter,ttk,gui,desktop,python3,ui,widgets,theming,cross-platform,modern,framework,application-framework,desktop-ui,python-gui
10
- Classifier: Development Status :: 4 - Beta
11
- Classifier: Environment :: Win32 (MS Windows)
12
- Classifier: Environment :: MacOS X
13
- Classifier: Environment :: X11 Applications
14
- Classifier: Intended Audience :: Developers
15
- Classifier: Programming Language :: Python :: 3
16
- Classifier: Programming Language :: Python :: 3.12
17
- Classifier: Programming Language :: Python :: 3.13
18
- Classifier: Programming Language :: Python :: 3.14
19
- Classifier: Topic :: Software Development :: User Interfaces
20
- Classifier: Operating System :: OS Independent
21
- Requires-Python: >=3.12
22
- Description-Content-Type: text/markdown
23
- License-File: LICENSE
24
- License-File: NOTICE
25
- Requires-Dist: pillow<=12,>=10
26
- Requires-Dist: pygments>=2.15
27
- Requires-Dist: typing-extensions>=4.10
28
- Requires-Dist: Babel>=2.12
29
- Requires-Dist: python-dateutil>=2.9
30
- Requires-Dist: dateparser>=1.1
31
- Requires-Dist: pywinstyles>=1.8; sys_platform == "win32"
32
- Requires-Dist: screeninfo>=0.8
33
- Provides-Extra: excel
34
- Requires-Dist: XlsxWriter>=3; extra == "excel"
35
- Provides-Extra: parquet
36
- Requires-Dist: pyarrow>=14; extra == "parquet"
37
- Provides-Extra: hdf5
38
- Requires-Dist: pandas>=2; extra == "hdf5"
39
- Requires-Dist: tables>=3.8; extra == "hdf5"
40
- Provides-Extra: viz
41
- Requires-Dist: matplotlib>=3.8; extra == "viz"
42
- Provides-Extra: viz-seaborn
43
- Requires-Dist: matplotlib>=3.8; extra == "viz-seaborn"
44
- Requires-Dist: seaborn>=0.13; extra == "viz-seaborn"
45
- Provides-Extra: docs
46
- Requires-Dist: sphinx>=7.2; extra == "docs"
47
- Requires-Dist: pydata-sphinx-theme; extra == "docs"
48
- Requires-Dist: sphinx-design; extra == "docs"
49
- Requires-Dist: sphinx-copybutton; extra == "docs"
50
- Requires-Dist: sphinx-autobuild; extra == "docs"
51
- Requires-Dist: myst-parser; extra == "docs"
52
- Dynamic: license-file
53
-
54
- ![bootstack](https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/banner-readme.png)
55
-
56
- ![](https://img.shields.io/github/release/israel-dryer/bootstack.svg)
57
- [![Downloads](https://pepy.tech/badge/bootstack)](https://pepy.tech/project/bootstack)
58
- [![Downloads](https://pepy.tech/badge/bootstack/month)](https://pepy.tech/project/bootstack)
59
- ![](https://img.shields.io/github/issues/israel-dryer/bootstack.svg)
60
- ![](https://img.shields.io/github/issues-closed/israel-dryer/bootstack.svg)
61
- ![](https://img.shields.io/github/license/israel-dryer/bootstack.svg)
62
- ![](https://img.shields.io/github/stars/israel-dryer/bootstack.svg)
63
- ![](https://img.shields.io/github/forks/israel-dryer/bootstack.svg)
64
-
65
- > Full documentation is at **[bootstack.org](https://bootstack.org)**.
66
-
67
- ### Desktop apps in pure Python — Tk underneath, none of the boilerplate.
68
-
69
- bootstack is built on Tk, so the install is light and your app ships as a small standalone executable. But you'll never
70
- write a `StringVar` or call `.pack()` — the API is its own. 60+ widgets, reactive state, and a CLI that scaffolds and
71
- packages the whole thing.
72
-
73
- <p align="center">
74
- <picture>
75
- <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-dark.png">
76
- <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
77
- <img alt="bootstack hero demo" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
78
- </picture>
79
- </p>
80
-
81
- ## Why bootstack?
82
-
83
- Most Python desktop frameworks make you fight the framework. bootstack gets out of the way.
84
-
85
- - **30% less code** — the declarative, context-manager layout eliminates geometry calls, explicit parenting, and most of the wiring boilerplate
86
- - **Reads like Python** — nested `with` blocks mirror your UI structure; the code hierarchy *is* the layout
87
- - **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
88
- - **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
89
- - **Reactive signals** — observable state that flows between widgets; bind once, update everywhere
90
- - **Event and stream pipelines** — compose, filter, debounce, and throttle UI events with a chainable stream API
91
- - **Built-in icons** — the full Bootstrap Icons catalog, theme-aware and recolorable, bundled with the framework
92
- - **Built-in localization** — 23 language catalogs, locale-aware number/date/time formatting, runtime language switching
93
- - **Semantic styling** — `accent="primary"`, `variant="outline"` — no hard-coded colors; looks right across every theme automatically
94
- - **10 paired light/dark themes** — popular dev color schemes plus Bootstrap, with a runtime switcher and a custom-theme API
95
- - **Forms and validation** — field-level validators, inline error messages, and a `FormDialog` for quick modal forms
96
- - **DataSource abstraction** — one interface over SQLite, in-memory, and file backends with filtering, sorting, pagination, and CRUD
97
- - **Data visualization** — embed `matplotlib` (and `seaborn`) figures with `Chart`; they recolor with the theme and live-update from a `Signal` or `DataSource` (optional `viz` extra)
98
- - **A real CLI** — scaffold, run, add pages/views/dialogs/themes, and package for distribution
99
- - **Hot reload** — `bootstack dev app.py` updates the running app on save and keeps your place; module-level state and the active page survive the reload
100
- - **PyInstaller packaging built in** — `bootstack build` produces a standalone executable; no separate toolchain required
101
-
102
- ## Hot reload
103
-
104
- Edit and save — the running window updates in place. `bootstack dev app.py`
105
- reloads the UI on every save while keeping your window position, module-level
106
- state, and active page, so you never lose your spot.
107
-
108
- <p align="center">
109
- <video src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/docs/_static/examples/live-reload.mp4" controls muted loop playsinline></video>
110
- </p>
111
-
112
- ## Installation
113
-
114
- Requires Python 3.12+ and Tk/Tcl (bundled with most Python distributions).
115
- Install with pip:
116
-
117
- ```bash
118
- python -m pip install bootstack
119
- ```
120
-
121
- See the [installation guide](https://bootstack.org/getting-started/installation/)
122
- for platform-specific Tk setup and the optional data-format extras.
123
-
124
- ## See it
125
-
126
- 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:
127
-
128
- ```bash
129
- bootstack gallery
130
- ```
131
-
132
- <p align="center">
133
- <picture>
134
- <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-dark.png">
135
- <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
136
- <img alt="bootstack widget gallery" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
137
- </picture>
138
- </p>
139
-
140
- ## Quick Start
141
-
142
- ```python
143
- import bootstack as bs
144
-
145
- with bs.App(title="Hello", padding=16, gap=16) as app:
146
- bs.Label("Hello from bootstack!")
147
- bs.Button("Primary", accent="primary")
148
- bs.Button("Success", accent="success")
149
- bs.Button("Danger Outline", accent="danger", variant="outline")
150
-
151
- app.run()
152
- ```
153
-
154
- <p align="center">
155
- <picture>
156
- <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-dark.png">
157
- <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
158
- <img alt="bootstack quick start example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
159
- </picture>
160
- </p>
161
-
162
- For navigation-based apps, use `AppShell` — it gives you stacked toolbars, a sidebar, and a page stack in one call:
163
-
164
- ```python
165
- import bootstack as bs
166
-
167
- shell = bs.AppShell(title="My App", size=(1000, 650))
168
-
169
- with shell.page_nav() as nav:
170
- with nav.add_page("home", text="Home", icon="house"):
171
- bs.Label("Welcome!")
172
- with nav.add_page("docs", text="Documents", icon="file-earmark-text"):
173
- bs.Label("Your documents.")
174
-
175
- shell.run()
176
- ```
177
-
178
- ## How it works
179
-
180
- ### Layout containers
181
-
182
- `Column`, `Row`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
183
-
184
- ```python
185
- with bs.App(title="Sign In") as app:
186
- with bs.Grid(columns=["auto", 1], gap=(12, 6), horizontal_items="stretch", padding=16):
187
- bs.Label("Name:")
188
- bs.TextField(placeholder="Full name")
189
- bs.Label("Email:")
190
- bs.TextField(placeholder="email@example.com")
191
- bs.Label("Role:")
192
- bs.Select(options=["Admin", "User", "Viewer"], value="User")
193
- bs.Button("Submit", accent="primary", columnspan=2)
194
-
195
- app.run()
196
- ```
197
-
198
- <p align="center">
199
- <picture>
200
- <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-dark.png">
201
- <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
202
- <img alt="bootstack layout containers example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
203
- </picture>
204
- </p>
205
-
206
- ### Semantic styling
207
-
208
- Widgets take an `accent` (color intent) and `variant` (visual weight) instead of hard-coded colors, so the same code looks right across themes and light/dark modes:
209
-
210
- ```python
211
- bs.Button("Save", accent="primary")
212
- bs.Button("Cancel", accent="secondary", variant="outline")
213
- bs.Label("Heading", font="heading-lg")
214
- ```
215
-
216
- <p align="center">
217
- <picture>
218
- <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-dark.png">
219
- <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
220
- <img alt="bootstack semantic styling example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
221
- </picture>
222
- </p>
223
-
224
- ### Signals (optional)
225
-
226
- Plain callbacks work fine for most things. When state needs to flow between widgets, signals give you a small reactive primitive with two-way binding:
227
-
228
- ```python
229
- with bs.App(title="Hello") as app:
230
- name = bs.Signal("World")
231
- bs.Label(textsignal=name) # updates automatically when name changes
232
- bs.TextField(textsignal=name) # two-way binding to the same state
233
-
234
- app.run()
235
- ```
236
-
237
- ## Features
238
-
239
- - **Application scaffolding** — `App` for blank windows, `AppShell` for toolbar + sidebar + page-stack apps, `Workbench` for two-tier workspace apps, `Splash` for a startup intro screen, undecorated windows with custom chrome
240
- - **60+ themed widgets** — primitives plus higher-level composites (DataTable, Tree, ListView, Calendar, DateField, Form, Gauge, ToggleGroup, PageStack, Carousel, Tooltip, and more)
241
- - **Dialogs and messages** — `alert()` / `confirm()` / `ask_*()` prompts and `FormDialog` / `FontDialog` / `FilterDialog`, plus non-blocking `toast()`, `Notification`, and `Snackbar` surfaces
242
- - **Layout containers** — `Column`, `Row`, `Grid`, and `Spacer` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Divider`
243
- - **Design system** — semantic `accent` colors (primary, secondary, success, danger, warning, info) and `variant` tokens (solid, outline, ghost), consistent across widgets
244
- - **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
245
- - **Reactive signals** — observable state with subscribe/set, integrates with widgets via `signal=` / `textsignal=`
246
- - **Forms & validation** — `Form` with built-in field-level validators and inline error messages
247
- - **DataSource** — common interface over in-memory, SQLite, and file backends, with pagination, filtering, sorting, CRUD, and CSV/TSV/Excel export
248
- - **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)
249
- - **Localization (i18n)** — 23 bundled message catalogs, locale-aware number/date/time formatting via Babel, runtime language switching
250
- - **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring and caching
251
- - **Platform support** — DPI awareness, multi-monitor centering, mica/acrylic effects on Windows
252
- - **CLI (`bootstack`)** — project scaffolding, run, add components, theme/i18n setup, doctor, build/package
253
-
254
- ## Widget Categories
255
-
256
- | Category | Widgets |
257
- |----------|---------|
258
- | **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar, ThemeToggle |
259
- | **Inputs** | TextField, PasswordField, PathField, NumberField, SpinnerField, Slider, RangeSlider, TextArea, CodeEditor, DateField, TimeField |
260
- | **Selection** | Checkbox, Switch, ToggleButton, Radio, RadioGroup, ToggleGroup, Select, SelectButton, Calendar |
261
- | **Data Display** | Label, Badge, ListView, Tree, DataTable, ProgressBar, Gauge |
262
- | **Media** | Avatar, Picture, Gallery, Carousel |
263
- | **Layout** | Column, Row, Grid, Spacer, Card, GroupBox, SplitView, ScrollView, Accordion, Divider |
264
- | **Navigation** | AppShell, Workbench, Window, Splash, StatusBar, Tabs, PageStack |
265
- | **Dialogs** | `alert()`, `confirm()`, `ask_*()` prompts, FormDialog, FontDialog, FilterDialog |
266
- | **Overlays** | `toast()`, Notification, Snackbar, Tooltip |
267
- | **Forms** | Form, with field-level validation |
268
-
269
- ## CLI
270
-
271
- bootstack ships with an optional CLI for scaffolding, running, and packaging applications:
272
-
273
- ```bash
274
- bootstack gallery # Launch the interactive widget gallery
275
- bootstack icons # Browse the built-in icon catalog
276
- bootstack appicon # Design an app icon and export it
277
- bootstack start MyApp # Create a new project (basic template)
278
- bootstack start MyApp --template appshell # ...or with sidebar navigation
279
- bootstack run # Run the app defined in the project config
280
- bootstack dev app.py # Run with hot reload (live edit-and-save)
281
- bootstack add page Dashboard # Add a new page (appshell)
282
- bootstack add view Settings # Add a new view (basic)
283
- bootstack add dialog Preferences # Add a new dialog
284
- bootstack doctor # Diagnose project & environment
285
- bootstack promote # Make the project packaging-ready
286
- bootstack build # Package for distribution
287
- ```
288
-
289
- ## Documentation
290
-
291
- Full documentation — guides, the widget catalog, and the API reference — lives at
292
- **[bootstack.org](https://bootstack.org)**.
293
-
294
- ## Contributing
295
-
296
- Contributions are welcome — code, bug reports, and especially **translations**.
297
- See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, the pull-request
298
- workflow, and how to review the bundled language catalogs.
299
-
300
- ## Links
301
-
302
- - **GitHub**: https://github.com/israel-dryer/bootstack
1
+ Metadata-Version: 2.4
2
+ Name: bootstack
3
+ Version: 0.2.3
4
+ Summary: Build desktop GUI apps in pure Python and ship them as a standalone executable — built on Tk, no Tkinter boilerplate.
5
+ Author-email: Israel Dryer <israel.dryer@gmail.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/israel-dryer/bootstack
8
+ Project-URL: Documentation, https://bootstack.org/
9
+ Keywords: tkinter,ttk,gui,desktop,python3,ui,widgets,theming,cross-platform,modern,framework,application-framework,desktop-ui,python-gui
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Environment :: Win32 (MS Windows)
12
+ Classifier: Environment :: MacOS X
13
+ Classifier: Environment :: X11 Applications
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
19
+ Classifier: Topic :: Software Development :: User Interfaces
20
+ Classifier: Operating System :: OS Independent
21
+ Requires-Python: >=3.12
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ License-File: NOTICE
25
+ Requires-Dist: pillow<=12,>=10
26
+ Requires-Dist: pygments>=2.15
27
+ Requires-Dist: typing-extensions>=4.10
28
+ Requires-Dist: Babel>=2.12
29
+ Requires-Dist: python-dateutil>=2.9
30
+ Requires-Dist: dateparser>=1.1
31
+ Requires-Dist: pywinstyles>=1.8; sys_platform == "win32"
32
+ Requires-Dist: screeninfo>=0.8
33
+ Provides-Extra: excel
34
+ Requires-Dist: XlsxWriter>=3; extra == "excel"
35
+ Provides-Extra: parquet
36
+ Requires-Dist: pyarrow>=14; extra == "parquet"
37
+ Provides-Extra: hdf5
38
+ Requires-Dist: pandas>=2; extra == "hdf5"
39
+ Requires-Dist: tables>=3.8; extra == "hdf5"
40
+ Provides-Extra: viz
41
+ Requires-Dist: matplotlib>=3.8; extra == "viz"
42
+ Provides-Extra: viz-seaborn
43
+ Requires-Dist: matplotlib>=3.8; extra == "viz-seaborn"
44
+ Requires-Dist: seaborn>=0.13; extra == "viz-seaborn"
45
+ Provides-Extra: docs
46
+ Requires-Dist: sphinx>=7.2; extra == "docs"
47
+ Requires-Dist: pydata-sphinx-theme; extra == "docs"
48
+ Requires-Dist: sphinx-design; extra == "docs"
49
+ Requires-Dist: sphinx-copybutton; extra == "docs"
50
+ Requires-Dist: sphinx-autobuild; extra == "docs"
51
+ Requires-Dist: myst-parser; extra == "docs"
52
+ Dynamic: license-file
53
+
54
+ ![bootstack](https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/banner-readme.png)
55
+
56
+ ![](https://img.shields.io/github/release/israel-dryer/bootstack.svg)
57
+ [![Downloads](https://pepy.tech/badge/bootstack)](https://pepy.tech/project/bootstack)
58
+ [![Downloads](https://pepy.tech/badge/bootstack/month)](https://pepy.tech/project/bootstack)
59
+ ![](https://img.shields.io/github/issues/israel-dryer/bootstack.svg)
60
+ ![](https://img.shields.io/github/issues-closed/israel-dryer/bootstack.svg)
61
+ ![](https://img.shields.io/github/license/israel-dryer/bootstack.svg)
62
+ ![](https://img.shields.io/github/stars/israel-dryer/bootstack.svg)
63
+ ![](https://img.shields.io/github/forks/israel-dryer/bootstack.svg)
64
+
65
+ > Full documentation is at **[bootstack.org](https://bootstack.org)**.
66
+
67
+ ### Desktop apps in pure Python — Tk underneath, none of the boilerplate.
68
+
69
+ bootstack is built on Tk, so the install is light and your app ships as a small standalone executable. But you'll never
70
+ write a `StringVar` or call `.pack()` — the API is its own. 60+ widgets, reactive state, and a CLI that scaffolds and
71
+ packages the whole thing.
72
+
73
+ <p align="center">
74
+ <picture>
75
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-dark.png">
76
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
77
+ <img alt="bootstack hero demo" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
78
+ </picture>
79
+ </p>
80
+
81
+ ## Why bootstack?
82
+
83
+ Most Python desktop frameworks make you fight the framework. bootstack gets out of the way.
84
+
85
+ - **30% less code** — the declarative, context-manager layout eliminates geometry calls, explicit parenting, and most of the wiring boilerplate
86
+ - **Reads like Python** — nested `with` blocks mirror your UI structure; the code hierarchy *is* the layout
87
+ - **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
88
+ - **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
89
+ - **Reactive signals** — observable state that flows between widgets; bind once, update everywhere
90
+ - **Event and stream pipelines** — compose, filter, debounce, and throttle UI events with a chainable stream API
91
+ - **Built-in icons** — the full Bootstrap Icons catalog, theme-aware and recolorable, bundled with the framework
92
+ - **Built-in localization** — 23 language catalogs, locale-aware number/date/time formatting, runtime language switching
93
+ - **Semantic styling** — `accent="primary"`, `variant="outline"` — no hard-coded colors; looks right across every theme automatically
94
+ - **10 paired light/dark themes** — popular dev color schemes plus Bootstrap, with a runtime switcher and a custom-theme API
95
+ - **Forms and validation** — field-level validators, inline error messages, and a `FormDialog` for quick modal forms
96
+ - **DataSource abstraction** — one interface over SQLite, in-memory, and file backends with filtering, sorting, pagination, and CRUD
97
+ - **Data visualization** — embed `matplotlib` (and `seaborn`) figures with `Chart`; they recolor with the theme and live-update from a `Signal` or `DataSource` (optional `viz` extra)
98
+ - **A real CLI** — scaffold, run, add pages/views/dialogs/themes, and package for distribution
99
+ - **Hot reload** — `bootstack dev app.py` updates the running app on save and keeps your place; module-level state and the active page survive the reload
100
+ - **PyInstaller packaging built in** — `bootstack build` produces a standalone executable; no separate toolchain required
101
+
102
+ ## Hot reload
103
+
104
+ Edit and save — the running window updates in place. `bootstack dev app.py`
105
+ reloads the UI on every save while keeping your window position, module-level
106
+ state, and active page, so you never lose your spot.
107
+
108
+ <p align="center">
109
+ <video src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/docs/_static/examples/live-reload.mp4" controls muted loop playsinline></video>
110
+ </p>
111
+
112
+ ## Installation
113
+
114
+ Requires Python 3.12+ and Tk/Tcl (bundled with most Python distributions).
115
+ Install with pip:
116
+
117
+ ```bash
118
+ python -m pip install bootstack
119
+ ```
120
+
121
+ See the [installation guide](https://bootstack.org/getting-started/installation/)
122
+ for platform-specific Tk setup and the optional data-format extras.
123
+
124
+ ## See it
125
+
126
+ 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:
127
+
128
+ ```bash
129
+ bootstack gallery
130
+ ```
131
+
132
+ <p align="center">
133
+ <picture>
134
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-dark.png">
135
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
136
+ <img alt="bootstack widget gallery" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
137
+ </picture>
138
+ </p>
139
+
140
+ ## Quick Start
141
+
142
+ ```python
143
+ import bootstack as bs
144
+
145
+ with bs.App(title="Hello", padding=16, gap=16) as app:
146
+ bs.Label("Hello from bootstack!")
147
+ bs.Button("Primary", accent="primary")
148
+ bs.Button("Success", accent="success")
149
+ bs.Button("Danger Outline", accent="danger", variant="outline")
150
+
151
+ app.run()
152
+ ```
153
+
154
+ <p align="center">
155
+ <picture>
156
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-dark.png">
157
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
158
+ <img alt="bootstack quick start example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
159
+ </picture>
160
+ </p>
161
+
162
+ For navigation-based apps, use `AppShell` — it gives you stacked toolbars, a sidebar, and a page stack in one call:
163
+
164
+ ```python
165
+ import bootstack as bs
166
+
167
+ shell = bs.AppShell(title="My App", size=(1000, 650))
168
+
169
+ with shell.page_nav() as nav:
170
+ with nav.add_page("home", text="Home", icon="house"):
171
+ bs.Label("Welcome!")
172
+ with nav.add_page("docs", text="Documents", icon="file-earmark-text"):
173
+ bs.Label("Your documents.")
174
+
175
+ shell.run()
176
+ ```
177
+
178
+ ## How it works
179
+
180
+ ### Layout containers
181
+
182
+ `Column`, `Row`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
183
+
184
+ ```python
185
+ with bs.App(title="Sign In") as app:
186
+ with bs.Grid(columns=["auto", 1], gap=(12, 6), horizontal_items="stretch", padding=16):
187
+ bs.Label("Name:")
188
+ bs.TextField(placeholder="Full name")
189
+ bs.Label("Email:")
190
+ bs.TextField(placeholder="email@example.com")
191
+ bs.Label("Role:")
192
+ bs.Select(options=["Admin", "User", "Viewer"], value="User")
193
+ bs.Button("Submit", accent="primary", columnspan=2)
194
+
195
+ app.run()
196
+ ```
197
+
198
+ <p align="center">
199
+ <picture>
200
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-dark.png">
201
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
202
+ <img alt="bootstack layout containers example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
203
+ </picture>
204
+ </p>
205
+
206
+ ### Semantic styling
207
+
208
+ Widgets take an `accent` (color intent) and `variant` (visual weight) instead of hard-coded colors, so the same code looks right across themes and light/dark modes:
209
+
210
+ ```python
211
+ bs.Button("Save", accent="primary")
212
+ bs.Button("Cancel", accent="secondary", variant="outline")
213
+ bs.Label("Heading", font="heading-lg")
214
+ ```
215
+
216
+ <p align="center">
217
+ <picture>
218
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-dark.png">
219
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
220
+ <img alt="bootstack semantic styling example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
221
+ </picture>
222
+ </p>
223
+
224
+ ### Signals (optional)
225
+
226
+ Plain callbacks work fine for most things. When state needs to flow between widgets, signals give you a small reactive primitive with two-way binding:
227
+
228
+ ```python
229
+ with bs.App(title="Hello") as app:
230
+ name = bs.Signal("World")
231
+ bs.Label(textsignal=name) # updates automatically when name changes
232
+ bs.TextField(textsignal=name) # two-way binding to the same state
233
+
234
+ app.run()
235
+ ```
236
+
237
+ ## Features
238
+
239
+ - **Application scaffolding** — `App` for blank windows, `AppShell` for toolbar + sidebar + page-stack apps, `Workbench` for two-tier workspace apps, `Splash` for a startup intro screen, undecorated windows with custom chrome
240
+ - **60+ themed widgets** — primitives plus higher-level composites (DataTable, Tree, ListView, Calendar, DateField, Form, Gauge, ToggleGroup, PageStack, Carousel, Tooltip, and more)
241
+ - **Dialogs and messages** — `alert()` / `confirm()` / `ask_*()` prompts and `FormDialog` / `FontDialog` / `FilterDialog`, plus non-blocking `toast()`, `Notification`, and `Snackbar` surfaces
242
+ - **Layout containers** — `Column`, `Row`, `Grid`, and `Spacer` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Divider`
243
+ - **Design system** — semantic `accent` colors (primary, secondary, success, danger, warning, info) and `variant` tokens (solid, outline, ghost), consistent across widgets
244
+ - **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
245
+ - **Reactive signals** — observable state with subscribe/set, integrates with widgets via `signal=` / `textsignal=`
246
+ - **Forms & validation** — `Form` with built-in field-level validators and inline error messages
247
+ - **DataSource** — common interface over in-memory, SQLite, and file backends, with pagination, filtering, sorting, CRUD, and CSV/TSV/Excel export
248
+ - **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)
249
+ - **Localization (i18n)** — 23 bundled message catalogs, locale-aware number/date/time formatting via Babel, runtime language switching
250
+ - **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring and caching
251
+ - **Platform support** — DPI awareness, multi-monitor centering, mica/acrylic effects on Windows
252
+ - **CLI (`bootstack`)** — project scaffolding, run, add components, theme/i18n setup, doctor, build/package
253
+
254
+ ## Widget Categories
255
+
256
+ | Category | Widgets |
257
+ |----------|---------|
258
+ | **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar, ThemeToggle |
259
+ | **Inputs** | TextField, PasswordField, PathField, NumberField, SpinnerField, Slider, RangeSlider, TextArea, CodeEditor, DateField, TimeField |
260
+ | **Selection** | Checkbox, Switch, ToggleButton, Radio, RadioGroup, ToggleGroup, Select, SelectButton, Calendar |
261
+ | **Data Display** | Label, Badge, ListView, Tree, DataTable, ProgressBar, Gauge |
262
+ | **Media** | Avatar, Picture, Gallery, Carousel |
263
+ | **Layout** | Column, Row, Grid, Spacer, Card, GroupBox, SplitView, ScrollView, Accordion, Divider |
264
+ | **Navigation** | AppShell, Workbench, Window, Splash, StatusBar, Tabs, PageStack |
265
+ | **Dialogs** | `alert()`, `confirm()`, `ask_*()` prompts, FormDialog, FontDialog, FilterDialog |
266
+ | **Overlays** | `toast()`, Notification, Snackbar, Tooltip |
267
+ | **Forms** | Form, with field-level validation |
268
+
269
+ ## CLI
270
+
271
+ bootstack ships with an optional CLI for scaffolding, running, and packaging applications:
272
+
273
+ ```bash
274
+ bootstack gallery # Launch the interactive widget gallery
275
+ bootstack icons # Browse the built-in icon catalog
276
+ bootstack appicon # Design an app icon and export it
277
+ bootstack start MyApp # Create a new project (basic template)
278
+ bootstack start MyApp --template appshell # ...or with sidebar navigation
279
+ bootstack run # Run the app defined in the project config
280
+ bootstack dev app.py # Run with hot reload (live edit-and-save)
281
+ bootstack add page Dashboard # Add a new page (appshell)
282
+ bootstack add view Settings # Add a new view (basic)
283
+ bootstack add dialog Preferences # Add a new dialog
284
+ bootstack doctor # Diagnose project & environment
285
+ bootstack promote # Make the project packaging-ready
286
+ bootstack build # Package for distribution
287
+ ```
288
+
289
+ ## Documentation
290
+
291
+ Full documentation — guides, the widget catalog, and the API reference — lives at
292
+ **[bootstack.org](https://bootstack.org)**.
293
+
294
+ ## Contributing
295
+
296
+ Contributions are welcome — code, bug reports, and especially **translations**.
297
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, the pull-request
298
+ workflow, and how to review the bundled language catalogs.
299
+
300
+ ## Links
301
+
302
+ - **GitHub**: https://github.com/israel-dryer/bootstack