bootstack 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (489) hide show
  1. bootstack-0.1.0/LICENSE +21 -0
  2. bootstack-0.1.0/MANIFEST.in +6 -0
  3. bootstack-0.1.0/NOTICE +10 -0
  4. bootstack-0.1.0/PKG-INFO +301 -0
  5. bootstack-0.1.0/README.md +249 -0
  6. bootstack-0.1.0/pyproject.toml +151 -0
  7. bootstack-0.1.0/setup.cfg +4 -0
  8. bootstack-0.1.0/src/bootstack/__init__.py +157 -0
  9. bootstack-0.1.0/src/bootstack/__main__.py +5 -0
  10. bootstack-0.1.0/src/bootstack/_core/__init__.py +21 -0
  11. bootstack-0.1.0/src/bootstack/_core/capabilities/__init__.py +45 -0
  12. bootstack-0.1.0/src/bootstack/_core/capabilities/after.py +103 -0
  13. bootstack-0.1.0/src/bootstack/_core/capabilities/bind.py +192 -0
  14. bootstack-0.1.0/src/bootstack/_core/capabilities/bindtags.py +112 -0
  15. bootstack-0.1.0/src/bootstack/_core/capabilities/busy.py +72 -0
  16. bootstack-0.1.0/src/bootstack/_core/capabilities/clipboard.py +89 -0
  17. bootstack-0.1.0/src/bootstack/_core/capabilities/focus.py +118 -0
  18. bootstack-0.1.0/src/bootstack/_core/capabilities/grab.py +65 -0
  19. bootstack-0.1.0/src/bootstack/_core/capabilities/grid.py +211 -0
  20. bootstack-0.1.0/src/bootstack/_core/capabilities/localization.py +231 -0
  21. bootstack-0.1.0/src/bootstack/_core/capabilities/pack.py +140 -0
  22. bootstack-0.1.0/src/bootstack/_core/capabilities/place.py +113 -0
  23. bootstack-0.1.0/src/bootstack/_core/capabilities/selection.py +136 -0
  24. bootstack-0.1.0/src/bootstack/_core/capabilities/signals.py +244 -0
  25. bootstack-0.1.0/src/bootstack/_core/capabilities/winfo.py +315 -0
  26. bootstack-0.1.0/src/bootstack/_core/colorutils.py +234 -0
  27. bootstack-0.1.0/src/bootstack/_core/exceptions.py +25 -0
  28. bootstack-0.1.0/src/bootstack/_core/images.py +463 -0
  29. bootstack-0.1.0/src/bootstack/_core/mixins/__init__.py +1 -0
  30. bootstack-0.1.0/src/bootstack/_core/mixins/ttk_state.py +35 -0
  31. bootstack-0.1.0/src/bootstack/_core/mixins/widget.py +132 -0
  32. bootstack-0.1.0/src/bootstack/_core/paths.py +49 -0
  33. bootstack-0.1.0/src/bootstack/_core/publisher.py +149 -0
  34. bootstack-0.1.0/src/bootstack/_core/variables.py +62 -0
  35. bootstack-0.1.0/src/bootstack/_runtime/__init__.py +3 -0
  36. bootstack-0.1.0/src/bootstack/_runtime/app.py +930 -0
  37. bootstack-0.1.0/src/bootstack/_runtime/base_window.py +945 -0
  38. bootstack-0.1.0/src/bootstack/_runtime/events.py +399 -0
  39. bootstack-0.1.0/src/bootstack/_runtime/shortcuts.py +496 -0
  40. bootstack-0.1.0/src/bootstack/_runtime/tk_patch.py +43 -0
  41. bootstack-0.1.0/src/bootstack/_runtime/toplevel.py +276 -0
  42. bootstack-0.1.0/src/bootstack/_runtime/utility.py +457 -0
  43. bootstack-0.1.0/src/bootstack/_runtime/visual_focus.py +240 -0
  44. bootstack-0.1.0/src/bootstack/_runtime/window_utilities.py +1123 -0
  45. bootstack-0.1.0/src/bootstack/assets/__init__.py +21 -0
  46. bootstack-0.1.0/src/bootstack/assets/bootstack.ico +0 -0
  47. bootstack-0.1.0/src/bootstack/assets/bootstack.png +0 -0
  48. bootstack-0.1.0/src/bootstack/assets/elements/__init__.py +0 -0
  49. bootstack-0.1.0/src/bootstack/assets/elements/badge-pill.png +0 -0
  50. bootstack-0.1.0/src/bootstack/assets/elements/badge-square.png +0 -0
  51. bootstack-0.1.0/src/bootstack/assets/elements/button-compact.png +0 -0
  52. bootstack-0.1.0/src/bootstack/assets/elements/button-default.png +0 -0
  53. bootstack-0.1.0/src/bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
  54. bootstack-0.1.0/src/bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
  55. bootstack-0.1.0/src/bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
  56. bootstack-0.1.0/src/bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
  57. bootstack-0.1.0/src/bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
  58. bootstack-0.1.0/src/bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
  59. bootstack-0.1.0/src/bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
  60. bootstack-0.1.0/src/bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
  61. bootstack-0.1.0/src/bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
  62. bootstack-0.1.0/src/bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
  63. bootstack-0.1.0/src/bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
  64. bootstack-0.1.0/src/bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
  65. bootstack-0.1.0/src/bootstack/assets/elements/card.png +0 -0
  66. bootstack-0.1.0/src/bootstack/assets/elements/checkbox-checked.png +0 -0
  67. bootstack-0.1.0/src/bootstack/assets/elements/checkbox-indeterminate.png +0 -0
  68. bootstack-0.1.0/src/bootstack/assets/elements/checkbox-unchecked.png +0 -0
  69. bootstack-0.1.0/src/bootstack/assets/elements/field.png +0 -0
  70. bootstack-0.1.0/src/bootstack/assets/elements/input-addon-compact.png +0 -0
  71. bootstack-0.1.0/src/bootstack/assets/elements/input-addon-default.png +0 -0
  72. bootstack-0.1.0/src/bootstack/assets/elements/input-compact.png +0 -0
  73. bootstack-0.1.0/src/bootstack/assets/elements/input-default.png +0 -0
  74. bootstack-0.1.0/src/bootstack/assets/elements/list-item-separated.png +0 -0
  75. bootstack-0.1.0/src/bootstack/assets/elements/list-item.png +0 -0
  76. bootstack-0.1.0/src/bootstack/assets/elements/listrow-compact.png +0 -0
  77. bootstack-0.1.0/src/bootstack/assets/elements/listrow-default.png +0 -0
  78. bootstack-0.1.0/src/bootstack/assets/elements/manifest.toml +361 -0
  79. bootstack-0.1.0/src/bootstack/assets/elements/menu-item.png +0 -0
  80. bootstack-0.1.0/src/bootstack/assets/elements/navitem-compact.png +0 -0
  81. bootstack-0.1.0/src/bootstack/assets/elements/navitem-default.png +0 -0
  82. bootstack-0.1.0/src/bootstack/assets/elements/progressbar-h-compact.png +0 -0
  83. bootstack-0.1.0/src/bootstack/assets/elements/progressbar-h-default.png +0 -0
  84. bootstack-0.1.0/src/bootstack/assets/elements/progressbar-v-compact.png +0 -0
  85. bootstack-0.1.0/src/bootstack/assets/elements/progressbar-v-default.png +0 -0
  86. bootstack-0.1.0/src/bootstack/assets/elements/radiobutton.png +0 -0
  87. bootstack-0.1.0/src/bootstack/assets/elements/scrollbar-horizontal.png +0 -0
  88. bootstack-0.1.0/src/bootstack/assets/elements/scrollbar-vertical.png +0 -0
  89. bootstack-0.1.0/src/bootstack/assets/elements/slider-handle.png +0 -0
  90. bootstack-0.1.0/src/bootstack/assets/elements/slider-track-h.png +0 -0
  91. bootstack-0.1.0/src/bootstack/assets/elements/slider-track-v.png +0 -0
  92. bootstack-0.1.0/src/bootstack/assets/elements/switch-off.png +0 -0
  93. bootstack-0.1.0/src/bootstack/assets/elements/switch-on.png +0 -0
  94. bootstack-0.1.0/src/bootstack/assets/elements/tab-h.png +0 -0
  95. bootstack-0.1.0/src/bootstack/assets/elements/tab-v.png +0 -0
  96. bootstack-0.1.0/src/bootstack/assets/icons/bootstrap.ttf +0 -0
  97. bootstack-0.1.0/src/bootstack/assets/icons/glyphmap.json +2080 -0
  98. bootstack-0.1.0/src/bootstack/assets/icons/icon_metrics.json +12470 -0
  99. bootstack-0.1.0/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
  100. bootstack-0.1.0/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +856 -0
  101. bootstack-0.1.0/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
  102. bootstack-0.1.0/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +878 -0
  103. bootstack-0.1.0/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
  104. bootstack-0.1.0/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +856 -0
  105. bootstack-0.1.0/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
  106. bootstack-0.1.0/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +856 -0
  107. bootstack-0.1.0/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
  108. bootstack-0.1.0/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +856 -0
  109. bootstack-0.1.0/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
  110. bootstack-0.1.0/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +878 -0
  111. bootstack-0.1.0/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
  112. bootstack-0.1.0/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +856 -0
  113. bootstack-0.1.0/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
  114. bootstack-0.1.0/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +856 -0
  115. bootstack-0.1.0/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
  116. bootstack-0.1.0/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +854 -0
  117. bootstack-0.1.0/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
  118. bootstack-0.1.0/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +845 -0
  119. bootstack-0.1.0/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
  120. bootstack-0.1.0/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +844 -0
  121. bootstack-0.1.0/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
  122. bootstack-0.1.0/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +917 -0
  123. bootstack-0.1.0/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
  124. bootstack-0.1.0/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +845 -0
  125. bootstack-0.1.0/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
  126. bootstack-0.1.0/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +844 -0
  127. bootstack-0.1.0/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
  128. bootstack-0.1.0/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +844 -0
  129. bootstack-0.1.0/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
  130. bootstack-0.1.0/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +845 -0
  131. bootstack-0.1.0/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
  132. bootstack-0.1.0/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +845 -0
  133. bootstack-0.1.0/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
  134. bootstack-0.1.0/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +845 -0
  135. bootstack-0.1.0/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
  136. bootstack-0.1.0/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +845 -0
  137. bootstack-0.1.0/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
  138. bootstack-0.1.0/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +845 -0
  139. bootstack-0.1.0/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
  140. bootstack-0.1.0/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +845 -0
  141. bootstack-0.1.0/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
  142. bootstack-0.1.0/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +845 -0
  143. bootstack-0.1.0/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
  144. bootstack-0.1.0/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +845 -0
  145. bootstack-0.1.0/src/bootstack/cli/__init__.py +133 -0
  146. bootstack-0.1.0/src/bootstack/cli/__main__.py +6 -0
  147. bootstack-0.1.0/src/bootstack/cli/add.py +395 -0
  148. bootstack-0.1.0/src/bootstack/cli/appicon.py +285 -0
  149. bootstack-0.1.0/src/bootstack/cli/build.py +115 -0
  150. bootstack-0.1.0/src/bootstack/cli/config.py +313 -0
  151. bootstack-0.1.0/src/bootstack/cli/demo.py +564 -0
  152. bootstack-0.1.0/src/bootstack/cli/dev.py +153 -0
  153. bootstack-0.1.0/src/bootstack/cli/doctor.py +195 -0
  154. bootstack-0.1.0/src/bootstack/cli/icons.py +98 -0
  155. bootstack-0.1.0/src/bootstack/cli/promote.py +120 -0
  156. bootstack-0.1.0/src/bootstack/cli/pyinstaller.py +268 -0
  157. bootstack-0.1.0/src/bootstack/cli/run.py +95 -0
  158. bootstack-0.1.0/src/bootstack/cli/start.py +117 -0
  159. bootstack-0.1.0/src/bootstack/cli/templates/__init__.py +931 -0
  160. bootstack-0.1.0/src/bootstack/clipboard.py +48 -0
  161. bootstack-0.1.0/src/bootstack/constants.py +318 -0
  162. bootstack-0.1.0/src/bootstack/data/README.md +615 -0
  163. bootstack-0.1.0/src/bootstack/data/__init__.py +78 -0
  164. bootstack-0.1.0/src/bootstack/data/_observable.py +276 -0
  165. bootstack-0.1.0/src/bootstack/data/base.py +780 -0
  166. bootstack-0.1.0/src/bootstack/data/file_source.py +367 -0
  167. bootstack-0.1.0/src/bootstack/data/memory_source.py +450 -0
  168. bootstack-0.1.0/src/bootstack/data/query.py +367 -0
  169. bootstack-0.1.0/src/bootstack/data/readers.py +289 -0
  170. bootstack-0.1.0/src/bootstack/data/sqlite_source.py +869 -0
  171. bootstack-0.1.0/src/bootstack/data/types.py +354 -0
  172. bootstack-0.1.0/src/bootstack/data/writers.py +232 -0
  173. bootstack-0.1.0/src/bootstack/dev/__init__.py +36 -0
  174. bootstack-0.1.0/src/bootstack/dev/_capture.py +141 -0
  175. bootstack-0.1.0/src/bootstack/dev/_env.py +43 -0
  176. bootstack-0.1.0/src/bootstack/dev/_registry.py +140 -0
  177. bootstack-0.1.0/src/bootstack/dev/_reloader.py +351 -0
  178. bootstack-0.1.0/src/bootstack/dev/_reset.py +50 -0
  179. bootstack-0.1.0/src/bootstack/dev/_watcher.py +91 -0
  180. bootstack-0.1.0/src/bootstack/dialogs/__init__.py +948 -0
  181. bootstack-0.1.0/src/bootstack/dialogs/_impl/__init__.py +47 -0
  182. bootstack-0.1.0/src/bootstack/dialogs/_impl/colorchooser.py +588 -0
  183. bootstack-0.1.0/src/bootstack/dialogs/_impl/datedialog.py +450 -0
  184. bootstack-0.1.0/src/bootstack/dialogs/_impl/dialog.py +594 -0
  185. bootstack-0.1.0/src/bootstack/dialogs/_impl/filterdialog.py +358 -0
  186. bootstack-0.1.0/src/bootstack/dialogs/_impl/fontdialog.py +364 -0
  187. bootstack-0.1.0/src/bootstack/dialogs/_impl/formdialog.py +564 -0
  188. bootstack-0.1.0/src/bootstack/dialogs/_impl/message.py +486 -0
  189. bootstack-0.1.0/src/bootstack/dialogs/_impl/query.py +570 -0
  190. bootstack-0.1.0/src/bootstack/errors.py +67 -0
  191. bootstack-0.1.0/src/bootstack/events/__init__.py +111 -0
  192. bootstack-0.1.0/src/bootstack/events/_event.py +135 -0
  193. bootstack-0.1.0/src/bootstack/events/_payloads.py +539 -0
  194. bootstack-0.1.0/src/bootstack/events/_subscription.py +38 -0
  195. bootstack-0.1.0/src/bootstack/i18n/README.md +77 -0
  196. bootstack-0.1.0/src/bootstack/i18n/__init__.py +23 -0
  197. bootstack-0.1.0/src/bootstack/i18n/catalog.py +121 -0
  198. bootstack-0.1.0/src/bootstack/i18n/intl_format.py +584 -0
  199. bootstack-0.1.0/src/bootstack/i18n/msgcat.py +425 -0
  200. bootstack-0.1.0/src/bootstack/i18n/specs.py +156 -0
  201. bootstack-0.1.0/src/bootstack/images.py +563 -0
  202. bootstack-0.1.0/src/bootstack/py.typed +1 -0
  203. bootstack-0.1.0/src/bootstack/scheduling/__init__.py +11 -0
  204. bootstack-0.1.0/src/bootstack/scheduling/_schedule.py +218 -0
  205. bootstack-0.1.0/src/bootstack/shortcuts.py +21 -0
  206. bootstack-0.1.0/src/bootstack/signals/README.md +98 -0
  207. bootstack-0.1.0/src/bootstack/signals/__init__.py +10 -0
  208. bootstack-0.1.0/src/bootstack/signals/integration.py +100 -0
  209. bootstack-0.1.0/src/bootstack/signals/signal.py +353 -0
  210. bootstack-0.1.0/src/bootstack/signals/types.py +6 -0
  211. bootstack-0.1.0/src/bootstack/store.py +286 -0
  212. bootstack-0.1.0/src/bootstack/streams/__init__.py +12 -0
  213. bootstack-0.1.0/src/bootstack/streams/_stream.py +321 -0
  214. bootstack-0.1.0/src/bootstack/style/__init__.py +38 -0
  215. bootstack-0.1.0/src/bootstack/style/builders/__init__.py +51 -0
  216. bootstack-0.1.0/src/bootstack/style/builders/badge.py +46 -0
  217. bootstack-0.1.0/src/bootstack/style/builders/button.py +339 -0
  218. bootstack-0.1.0/src/bootstack/style/builders/buttongroup.py +311 -0
  219. bootstack-0.1.0/src/bootstack/style/builders/calendar.py +271 -0
  220. bootstack-0.1.0/src/bootstack/style/builders/checkbutton.py +110 -0
  221. bootstack-0.1.0/src/bootstack/style/builders/combobox.py +113 -0
  222. bootstack-0.1.0/src/bootstack/style/builders/contextmenu.py +268 -0
  223. bootstack-0.1.0/src/bootstack/style/builders/entry.py +82 -0
  224. bootstack-0.1.0/src/bootstack/style/builders/expander.py +148 -0
  225. bootstack-0.1.0/src/bootstack/style/builders/field.py +335 -0
  226. bootstack-0.1.0/src/bootstack/style/builders/frame.py +50 -0
  227. bootstack-0.1.0/src/bootstack/style/builders/label.py +28 -0
  228. bootstack-0.1.0/src/bootstack/style/builders/labelframe.py +34 -0
  229. bootstack-0.1.0/src/bootstack/style/builders/listview.py +369 -0
  230. bootstack-0.1.0/src/bootstack/style/builders/menubar.py +91 -0
  231. bootstack-0.1.0/src/bootstack/style/builders/menubutton.py +359 -0
  232. bootstack-0.1.0/src/bootstack/style/builders/panedwindow.py +25 -0
  233. bootstack-0.1.0/src/bootstack/style/builders/progressbar.py +67 -0
  234. bootstack-0.1.0/src/bootstack/style/builders/radiobutton.py +99 -0
  235. bootstack-0.1.0/src/bootstack/style/builders/scale.py +64 -0
  236. bootstack-0.1.0/src/bootstack/style/builders/scrollbar.py +225 -0
  237. bootstack-0.1.0/src/bootstack/style/builders/separator.py +49 -0
  238. bootstack-0.1.0/src/bootstack/style/builders/sidenav.py +643 -0
  239. bootstack-0.1.0/src/bootstack/style/builders/sizegrip.py +15 -0
  240. bootstack-0.1.0/src/bootstack/style/builders/spinbox.py +119 -0
  241. bootstack-0.1.0/src/bootstack/style/builders/switch.py +70 -0
  242. bootstack-0.1.0/src/bootstack/style/builders/tabitem.py +204 -0
  243. bootstack-0.1.0/src/bootstack/style/builders/togglegroup.py +294 -0
  244. bootstack-0.1.0/src/bootstack/style/builders/toolbutton.py +275 -0
  245. bootstack-0.1.0/src/bootstack/style/builders/tooltip.py +26 -0
  246. bootstack-0.1.0/src/bootstack/style/builders/treeview.py +193 -0
  247. bootstack-0.1.0/src/bootstack/style/builders/utils.py +455 -0
  248. bootstack-0.1.0/src/bootstack/style/builders_tk/__init__.py +16 -0
  249. bootstack-0.1.0/src/bootstack/style/builders_tk/defaults.py +229 -0
  250. bootstack-0.1.0/src/bootstack/style/element.py +173 -0
  251. bootstack-0.1.0/src/bootstack/style/fonts.py +123 -0
  252. bootstack-0.1.0/src/bootstack/style/style.py +609 -0
  253. bootstack-0.1.0/src/bootstack/style/style_builder_base.py +716 -0
  254. bootstack-0.1.0/src/bootstack/style/style_builder_mixed.py +93 -0
  255. bootstack-0.1.0/src/bootstack/style/style_builder_tk.py +109 -0
  256. bootstack-0.1.0/src/bootstack/style/style_builder_ttk.py +353 -0
  257. bootstack-0.1.0/src/bootstack/style/style_resolver.py +447 -0
  258. bootstack-0.1.0/src/bootstack/style/theme.py +245 -0
  259. bootstack-0.1.0/src/bootstack/style/theme_provider.py +471 -0
  260. bootstack-0.1.0/src/bootstack/style/themes/__init__.py +128 -0
  261. bootstack-0.1.0/src/bootstack/style/tk_patch.py +5 -0
  262. bootstack-0.1.0/src/bootstack/style/token_maps.py +41 -0
  263. bootstack-0.1.0/src/bootstack/style/types.py +32 -0
  264. bootstack-0.1.0/src/bootstack/style/typography.py +523 -0
  265. bootstack-0.1.0/src/bootstack/style/utility.py +746 -0
  266. bootstack-0.1.0/src/bootstack/types.py +39 -0
  267. bootstack-0.1.0/src/bootstack/validation/__init__.py +6 -0
  268. bootstack-0.1.0/src/bootstack/validation/types.py +15 -0
  269. bootstack-0.1.0/src/bootstack/validation/validation_result.py +17 -0
  270. bootstack-0.1.0/src/bootstack/validation/validation_rules.py +205 -0
  271. bootstack-0.1.0/src/bootstack/widgets/__init__.py +74 -0
  272. bootstack-0.1.0/src/bootstack/widgets/_core/__init__.py +31 -0
  273. bootstack-0.1.0/src/bootstack/widgets/_core/app_config.py +266 -0
  274. bootstack-0.1.0/src/bootstack/widgets/_core/base.py +461 -0
  275. bootstack-0.1.0/src/bootstack/widgets/_core/container.py +334 -0
  276. bootstack-0.1.0/src/bootstack/widgets/_core/context.py +35 -0
  277. bootstack-0.1.0/src/bootstack/widgets/_core/events.py +130 -0
  278. bootstack-0.1.0/src/bootstack/widgets/_core/field_mixin.py +353 -0
  279. bootstack-0.1.0/src/bootstack/widgets/_core/icon_image_props.py +72 -0
  280. bootstack-0.1.0/src/bootstack/widgets/_core/image_binding.py +93 -0
  281. bootstack-0.1.0/src/bootstack/widgets/_core/navmodel.py +345 -0
  282. bootstack-0.1.0/src/bootstack/widgets/_core/options.py +210 -0
  283. bootstack-0.1.0/src/bootstack/widgets/_core/selection_group.py +130 -0
  284. bootstack-0.1.0/src/bootstack/widgets/_core/window_controls.py +96 -0
  285. bootstack-0.1.0/src/bootstack/widgets/_core/window_menu.py +246 -0
  286. bootstack-0.1.0/src/bootstack/widgets/_impl/__init__.py +1 -0
  287. bootstack-0.1.0/src/bootstack/widgets/_impl/_internal/__init__.py +0 -0
  288. bootstack-0.1.0/src/bootstack/widgets/_impl/_internal/wrapper_base.py +307 -0
  289. bootstack-0.1.0/src/bootstack/widgets/_impl/_parts/__init__.py +11 -0
  290. bootstack-0.1.0/src/bootstack/widgets/_impl/_parts/numberentry_part.py +385 -0
  291. bootstack-0.1.0/src/bootstack/widgets/_impl/_parts/spinnerentry_part.py +434 -0
  292. bootstack-0.1.0/src/bootstack/widgets/_impl/_parts/textentry_part.py +406 -0
  293. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/__init__.py +33 -0
  294. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/_dateutils.py +33 -0
  295. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/_image_fit.py +105 -0
  296. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/accordion.py +381 -0
  297. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/avatar.py +191 -0
  298. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/buttongroup.py +371 -0
  299. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/calendar.py +972 -0
  300. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/carousel.py +567 -0
  301. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/chart.py +882 -0
  302. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/compositeframe.py +298 -0
  303. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/contextmenu.py +1951 -0
  304. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/dateentry.py +404 -0
  305. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/dropdownbutton.py +325 -0
  306. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/expander.py +515 -0
  307. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/field.py +670 -0
  308. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/form.py +1066 -0
  309. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/gallery.py +551 -0
  310. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/list/__init__.py +15 -0
  311. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/list/listitem.py +802 -0
  312. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/list/listview.py +1433 -0
  313. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/menu/__init__.py +18 -0
  314. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/menu/model.py +358 -0
  315. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/menu/render_native.py +134 -0
  316. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/menu/render_themed.py +134 -0
  317. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/meter.py +860 -0
  318. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/numericentry.py +201 -0
  319. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/pagestack.py +395 -0
  320. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/passwordentry.py +142 -0
  321. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/pathentry.py +168 -0
  322. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/picture.py +289 -0
  323. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/radiogroup.py +511 -0
  324. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/scrolledtext.py +375 -0
  325. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/scrolledtext.pyi +186 -0
  326. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/scrollview.py +764 -0
  327. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/selectbox.py +1026 -0
  328. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/shell/__init__.py +40 -0
  329. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/shell/content_host.py +52 -0
  330. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/shell/layout.py +335 -0
  331. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/shell/nav_panel.py +345 -0
  332. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/shell/providers.py +558 -0
  333. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/shell/rail.py +117 -0
  334. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/shell/shell.py +581 -0
  335. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/shell/workspace.py +273 -0
  336. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/sidenav/__init__.py +16 -0
  337. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/sidenav/header.py +81 -0
  338. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/sidenav/separator.py +44 -0
  339. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/slider/__init__.py +7 -0
  340. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/slider/_shared.py +195 -0
  341. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/slider/rangeslider.py +982 -0
  342. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/slider/slider.py +851 -0
  343. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/spinnerentry.py +185 -0
  344. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/tableview/__init__.py +5 -0
  345. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/tableview/tableview.py +3388 -0
  346. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/tableview/types.py +169 -0
  347. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/tabs/__init__.py +23 -0
  348. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/tabs/tabitem.py +389 -0
  349. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/tabs/tabs.py +974 -0
  350. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/tabs/tabview.py +650 -0
  351. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/__init__.py +26 -0
  352. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/change.py +46 -0
  353. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/codeeditor.py +526 -0
  354. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/core.py +495 -0
  355. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/decoration.py +42 -0
  356. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/diff.py +127 -0
  357. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +1 -0
  358. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +138 -0
  359. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +158 -0
  360. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +138 -0
  361. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +312 -0
  362. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +177 -0
  363. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/filter.py +171 -0
  364. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/search_overlay.py +459 -0
  365. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/sidebar.py +88 -0
  366. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/style_registry.py +178 -0
  367. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/textarea.py +606 -0
  368. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textarea/undo.py +217 -0
  369. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/textentry.py +57 -0
  370. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/timeentry.py +176 -0
  371. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/toast.py +390 -0
  372. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/toast_stack.py +156 -0
  373. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/togglegroup.py +418 -0
  374. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/toolbar.py +608 -0
  375. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/tooltip.py +491 -0
  376. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/tree/__init__.py +7 -0
  377. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/tree/source_binding.py +136 -0
  378. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/tree/treeitem.py +393 -0
  379. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/tree/treenode.py +174 -0
  380. bootstack-0.1.0/src/bootstack/widgets/_impl/composites/tree/treeview.py +841 -0
  381. bootstack-0.1.0/src/bootstack/widgets/_impl/mixins/__init__.py +24 -0
  382. bootstack-0.1.0/src/bootstack/widgets/_impl/mixins/configure_mixin.py +216 -0
  383. bootstack-0.1.0/src/bootstack/widgets/_impl/mixins/entry_mixin.py +134 -0
  384. bootstack-0.1.0/src/bootstack/widgets/_impl/mixins/font_mixin.py +368 -0
  385. bootstack-0.1.0/src/bootstack/widgets/_impl/mixins/icon_mixin.py +61 -0
  386. bootstack-0.1.0/src/bootstack/widgets/_impl/mixins/localization_mixin.py +253 -0
  387. bootstack-0.1.0/src/bootstack/widgets/_impl/mixins/signal_mixin.py +268 -0
  388. bootstack-0.1.0/src/bootstack/widgets/_impl/mixins/validation_mixin.py +226 -0
  389. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/__init__.py +49 -0
  390. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/_menubutton.py +107 -0
  391. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/badge.py +45 -0
  392. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/button.py +76 -0
  393. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/card.py +45 -0
  394. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/checkbutton.py +124 -0
  395. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/checktoggle.py +62 -0
  396. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/combobox.py +156 -0
  397. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/entry.py +87 -0
  398. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/flexframe.py +448 -0
  399. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/frame.py +185 -0
  400. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/gridframe.py +546 -0
  401. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/label.py +84 -0
  402. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/labelframe.py +54 -0
  403. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/optionmenu.py +387 -0
  404. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/packframe.py +227 -0
  405. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/panedwindow.py +45 -0
  406. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/progressbar.py +83 -0
  407. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/radiobutton.py +115 -0
  408. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/radiotoggle.py +54 -0
  409. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/scrollbar.py +42 -0
  410. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/separator.py +43 -0
  411. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/sizegrip.py +33 -0
  412. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/spinbox.py +95 -0
  413. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/switch.py +44 -0
  414. bootstack-0.1.0/src/bootstack/widgets/_impl/primitives/treeview.py +69 -0
  415. bootstack-0.1.0/src/bootstack/widgets/app.py +371 -0
  416. bootstack-0.1.0/src/bootstack/widgets/appshell.py +1179 -0
  417. bootstack-0.1.0/src/bootstack/widgets/avatar.py +140 -0
  418. bootstack-0.1.0/src/bootstack/widgets/boolean_controls.py +455 -0
  419. bootstack-0.1.0/src/bootstack/widgets/button.py +224 -0
  420. bootstack-0.1.0/src/bootstack/widgets/buttongroup.py +239 -0
  421. bootstack-0.1.0/src/bootstack/widgets/calendar.py +195 -0
  422. bootstack-0.1.0/src/bootstack/widgets/card.py +159 -0
  423. bootstack-0.1.0/src/bootstack/widgets/carousel.py +241 -0
  424. bootstack-0.1.0/src/bootstack/widgets/chart.py +302 -0
  425. bootstack-0.1.0/src/bootstack/widgets/codeeditor.py +675 -0
  426. bootstack-0.1.0/src/bootstack/widgets/contextmenu.py +371 -0
  427. bootstack-0.1.0/src/bootstack/widgets/datatable.py +688 -0
  428. bootstack-0.1.0/src/bootstack/widgets/datefield.py +395 -0
  429. bootstack-0.1.0/src/bootstack/widgets/divider.py +60 -0
  430. bootstack-0.1.0/src/bootstack/widgets/expander.py +579 -0
  431. bootstack-0.1.0/src/bootstack/widgets/form.py +200 -0
  432. bootstack-0.1.0/src/bootstack/widgets/gallery.py +250 -0
  433. bootstack-0.1.0/src/bootstack/widgets/gauge.py +168 -0
  434. bootstack-0.1.0/src/bootstack/widgets/grid.py +121 -0
  435. bootstack-0.1.0/src/bootstack/widgets/groupbox.py +162 -0
  436. bootstack-0.1.0/src/bootstack/widgets/label.py +229 -0
  437. bootstack-0.1.0/src/bootstack/widgets/listview.py +354 -0
  438. bootstack-0.1.0/src/bootstack/widgets/menubutton.py +419 -0
  439. bootstack-0.1.0/src/bootstack/widgets/numberfield.py +431 -0
  440. bootstack-0.1.0/src/bootstack/widgets/pagestack.py +345 -0
  441. bootstack-0.1.0/src/bootstack/widgets/passwordfield.py +383 -0
  442. bootstack-0.1.0/src/bootstack/widgets/pathfield.py +454 -0
  443. bootstack-0.1.0/src/bootstack/widgets/picture.py +251 -0
  444. bootstack-0.1.0/src/bootstack/widgets/progressbar.py +106 -0
  445. bootstack-0.1.0/src/bootstack/widgets/radio_variants.py +271 -0
  446. bootstack-0.1.0/src/bootstack/widgets/radiogroup.py +228 -0
  447. bootstack-0.1.0/src/bootstack/widgets/scrollbar.py +64 -0
  448. bootstack-0.1.0/src/bootstack/widgets/scrollview.py +186 -0
  449. bootstack-0.1.0/src/bootstack/widgets/select.py +302 -0
  450. bootstack-0.1.0/src/bootstack/widgets/selectbutton.py +182 -0
  451. bootstack-0.1.0/src/bootstack/widgets/sidebar_toggle.py +130 -0
  452. bootstack-0.1.0/src/bootstack/widgets/sizegrip.py +42 -0
  453. bootstack-0.1.0/src/bootstack/widgets/slider.py +408 -0
  454. bootstack-0.1.0/src/bootstack/widgets/spinbox.py +147 -0
  455. bootstack-0.1.0/src/bootstack/widgets/spinnerfield.py +413 -0
  456. bootstack-0.1.0/src/bootstack/widgets/splash.py +367 -0
  457. bootstack-0.1.0/src/bootstack/widgets/splitview.py +482 -0
  458. bootstack-0.1.0/src/bootstack/widgets/stacks.py +249 -0
  459. bootstack-0.1.0/src/bootstack/widgets/statusbar.py +189 -0
  460. bootstack-0.1.0/src/bootstack/widgets/tabs.py +425 -0
  461. bootstack-0.1.0/src/bootstack/widgets/textarea.py +459 -0
  462. bootstack-0.1.0/src/bootstack/widgets/textfield.py +410 -0
  463. bootstack-0.1.0/src/bootstack/widgets/theme_toggle.py +92 -0
  464. bootstack-0.1.0/src/bootstack/widgets/timefield.py +340 -0
  465. bootstack-0.1.0/src/bootstack/widgets/toast.py +314 -0
  466. bootstack-0.1.0/src/bootstack/widgets/togglegroup.py +231 -0
  467. bootstack-0.1.0/src/bootstack/widgets/toolbar.py +347 -0
  468. bootstack-0.1.0/src/bootstack/widgets/tooltip.py +94 -0
  469. bootstack-0.1.0/src/bootstack/widgets/tree.py +648 -0
  470. bootstack-0.1.0/src/bootstack/widgets/types.py +305 -0
  471. bootstack-0.1.0/src/bootstack/widgets/window.py +307 -0
  472. bootstack-0.1.0/src/bootstack.egg-info/PKG-INFO +301 -0
  473. bootstack-0.1.0/src/bootstack.egg-info/SOURCES.txt +487 -0
  474. bootstack-0.1.0/src/bootstack.egg-info/dependency_links.txt +1 -0
  475. bootstack-0.1.0/src/bootstack.egg-info/entry_points.txt +2 -0
  476. bootstack-0.1.0/src/bootstack.egg-info/requires.txt +34 -0
  477. bootstack-0.1.0/src/bootstack.egg-info/top_level.txt +1 -0
  478. bootstack-0.1.0/tests/test_dialog_anchor.py +44 -0
  479. bootstack-0.1.0/tests/test_events_doc_coverage.py +32 -0
  480. bootstack-0.1.0/tests/test_hot_reload.py +339 -0
  481. bootstack-0.1.0/tests/test_images.py +139 -0
  482. bootstack-0.1.0/tests/test_images_gui.py +72 -0
  483. bootstack-0.1.0/tests/test_intl_format.py +99 -0
  484. bootstack-0.1.0/tests/test_navmodel.py +327 -0
  485. bootstack-0.1.0/tests/test_on_color_contrast.py +65 -0
  486. bootstack-0.1.0/tests/test_public_surface.py +192 -0
  487. bootstack-0.1.0/tests/test_store.py +169 -0
  488. bootstack-0.1.0/tests/test_theme_from_existing.py +64 -0
  489. bootstack-0.1.0/tests/test_validation_rules.py +152 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 - 2026 Israel Dryer
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,6 @@
1
+ include LICENSE
2
+ include README.md
3
+
4
+ graft src/bootstack
5
+
6
+ global-exclude *.py[cod] __pycache__/* .DS_Store
bootstack-0.1.0/NOTICE ADDED
@@ -0,0 +1,10 @@
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.
@@ -0,0 +1,301 @@
1
+ Metadata-Version: 2.4
2
+ Name: bootstack
3
+ Version: 0.1.0
4
+ Summary: From idea to a shipped desktop app, fast — a declarative, reactive, batteries-included Python UI framework with 60+ widgets, semantic theming, and built-in packaging.
5
+ 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: typing-extensions>=4.10
27
+ Requires-Dist: Babel>=2.12
28
+ Requires-Dist: python-dateutil>=2.9
29
+ Requires-Dist: dateparser>=1.1
30
+ Requires-Dist: pywinstyles>=1.8; sys_platform == "win32"
31
+ Requires-Dist: screeninfo>=0.8
32
+ Provides-Extra: excel
33
+ Requires-Dist: XlsxWriter>=3; extra == "excel"
34
+ Provides-Extra: parquet
35
+ Requires-Dist: pyarrow>=14; extra == "parquet"
36
+ Provides-Extra: hdf5
37
+ Requires-Dist: pandas>=2; extra == "hdf5"
38
+ Requires-Dist: tables>=3.8; extra == "hdf5"
39
+ Provides-Extra: viz
40
+ Requires-Dist: matplotlib>=3.8; extra == "viz"
41
+ Provides-Extra: viz-seaborn
42
+ Requires-Dist: matplotlib>=3.8; extra == "viz-seaborn"
43
+ Requires-Dist: seaborn>=0.13; extra == "viz-seaborn"
44
+ Provides-Extra: docs
45
+ Requires-Dist: sphinx>=7.2; extra == "docs"
46
+ Requires-Dist: pydata-sphinx-theme; extra == "docs"
47
+ Requires-Dist: sphinx-design; extra == "docs"
48
+ Requires-Dist: sphinx-copybutton; extra == "docs"
49
+ Requires-Dist: sphinx-autobuild; extra == "docs"
50
+ Requires-Dist: myst-parser; extra == "docs"
51
+ Dynamic: license-file
52
+
53
+ ![bootstack](https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/banner-readme.png)
54
+
55
+ ![](https://img.shields.io/github/release/israel-dryer/bootstack.svg)
56
+ [![Downloads](https://pepy.tech/badge/bootstack)](https://pepy.tech/project/bootstack)
57
+ [![Downloads](https://pepy.tech/badge/bootstack/month)](https://pepy.tech/project/bootstack)
58
+ ![](https://img.shields.io/github/issues/israel-dryer/bootstack.svg)
59
+ ![](https://img.shields.io/github/issues-closed/israel-dryer/bootstack.svg)
60
+ ![](https://img.shields.io/github/license/israel-dryer/bootstack.svg)
61
+ ![](https://img.shields.io/github/stars/israel-dryer/bootstack.svg)
62
+ ![](https://img.shields.io/github/forks/israel-dryer/bootstack.svg)
63
+
64
+ > Full documentation is at **[bootstack.org](https://bootstack.org)**.
65
+
66
+ ### From idea to a shipped desktop app — fast.
67
+
68
+ bootstack gives engineers, data scientists, and hobbyists everything to build a
69
+ polished desktop interface and package it into a standalone executable —
70
+ declarative, reactive, and batteries-included, all in pure Python.
71
+
72
+ <p align="center">
73
+ <picture>
74
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-dark.png">
75
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
76
+ <img alt="bootstack hero demo" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
77
+ </picture>
78
+ </p>
79
+
80
+ ## Why bootstack?
81
+
82
+ Most Python desktop frameworks make you fight the framework. bootstack gets out of the way.
83
+
84
+ - **30% less code** — the declarative, context-manager layout eliminates geometry calls, explicit parenting, and most of the wiring boilerplate
85
+ - **Reads like Python** — nested `with` blocks mirror your UI structure; the code hierarchy *is* the layout
86
+ - **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
87
+ - **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
88
+ - **Reactive signals** — observable state that flows between widgets; bind once, update everywhere
89
+ - **Event and stream pipelines** — compose, filter, debounce, and throttle UI events with a chainable stream API
90
+ - **Built-in icons** — the full Bootstrap Icons catalog, theme-aware and recolorable, bundled with the framework
91
+ - **Built-in localization** — 23 language catalogs, locale-aware number/date/time formatting, runtime language switching
92
+ - **Semantic styling** — `accent="primary"`, `variant="outline"` — no hard-coded colors; looks right across every theme automatically
93
+ - **10 paired light/dark themes** — popular dev color schemes plus Bootstrap, with a runtime switcher and a custom-theme API
94
+ - **Forms and validation** — field-level validators, inline error messages, and a `FormDialog` for quick modal forms
95
+ - **DataSource abstraction** — one interface over SQLite, in-memory, and file backends with filtering, sorting, pagination, and CRUD
96
+ - **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)
97
+ - **A real CLI** — scaffold, run, add pages/views/dialogs/themes, and package for distribution
98
+ - **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
99
+ - **PyInstaller packaging built in** — `bootstack build` produces a standalone executable; no separate toolchain required
100
+
101
+ ## Hot reload
102
+
103
+ Edit and save — the running window updates in place. `bootstack dev app.py`
104
+ reloads the UI on every save while keeping your window position, module-level
105
+ state, and active page, so you never lose your spot.
106
+
107
+ <p align="center">
108
+ <video src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/docs/_static/examples/live-reload.mp4" controls muted loop playsinline></video>
109
+ </p>
110
+
111
+ ## Installation
112
+
113
+ Requires Python 3.12+ and Tk/Tcl (bundled with most Python distributions).
114
+ Install with pip:
115
+
116
+ ```bash
117
+ python -m pip install bootstack
118
+ ```
119
+
120
+ See the [installation guide](https://bootstack.org/getting-started/installation/)
121
+ for platform-specific Tk setup and the optional data-format extras.
122
+
123
+ ## See it
124
+
125
+ 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:
126
+
127
+ ```bash
128
+ bootstack gallery
129
+ ```
130
+
131
+ <p align="center">
132
+ <picture>
133
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-dark.png">
134
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
135
+ <img alt="bootstack widget gallery" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
136
+ </picture>
137
+ </p>
138
+
139
+ ## Quick Start
140
+
141
+ ```python
142
+ import bootstack as bs
143
+
144
+ with bs.App(title="Hello", padding=16, gap=16) as app:
145
+ bs.Label("Hello from bootstack!")
146
+ bs.Button("Primary", accent="primary")
147
+ bs.Button("Success", accent="success")
148
+ bs.Button("Danger Outline", accent="danger", variant="outline")
149
+
150
+ app.run()
151
+ ```
152
+
153
+ <p align="center">
154
+ <picture>
155
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-dark.png">
156
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
157
+ <img alt="bootstack quick start example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
158
+ </picture>
159
+ </p>
160
+
161
+ For navigation-based apps, use `AppShell` — it gives you stacked toolbars, a sidebar, and a page stack in one call:
162
+
163
+ ```python
164
+ import bootstack as bs
165
+
166
+ shell = bs.AppShell(title="My App", size=(1000, 650))
167
+
168
+ with shell.page_nav() as nav:
169
+ with nav.add_page("home", text="Home", icon="house"):
170
+ bs.Label("Welcome!")
171
+ with nav.add_page("docs", text="Documents", icon="file-earmark-text"):
172
+ bs.Label("Your documents.")
173
+
174
+ shell.run()
175
+ ```
176
+
177
+ ## How it works
178
+
179
+ ### Layout containers
180
+
181
+ `Column`, `Row`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
182
+
183
+ ```python
184
+ with bs.App(title="Sign In") as app:
185
+ with bs.Grid(columns=["auto", 1], gap=(12, 6), horizontal_items="stretch", padding=16):
186
+ bs.Label("Name:")
187
+ bs.TextField(placeholder="Full name")
188
+ bs.Label("Email:")
189
+ bs.TextField(placeholder="email@example.com")
190
+ bs.Label("Role:")
191
+ bs.Select(options=["Admin", "User", "Viewer"], value="User")
192
+ bs.Button("Submit", accent="primary", columnspan=2)
193
+
194
+ app.run()
195
+ ```
196
+
197
+ <p align="center">
198
+ <picture>
199
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-dark.png">
200
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
201
+ <img alt="bootstack layout containers example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
202
+ </picture>
203
+ </p>
204
+
205
+ ### Semantic styling
206
+
207
+ 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:
208
+
209
+ ```python
210
+ bs.Button("Save", accent="primary")
211
+ bs.Button("Cancel", accent="secondary", variant="outline")
212
+ bs.Label("Heading", font="heading-lg")
213
+ ```
214
+
215
+ <p align="center">
216
+ <picture>
217
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-dark.png">
218
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
219
+ <img alt="bootstack semantic styling example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
220
+ </picture>
221
+ </p>
222
+
223
+ ### Signals (optional)
224
+
225
+ 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:
226
+
227
+ ```python
228
+ with bs.App(title="Hello") as app:
229
+ name = bs.Signal("World")
230
+ bs.Label(textsignal=name) # updates automatically when name changes
231
+ bs.TextField(textsignal=name) # two-way binding to the same state
232
+
233
+ app.run()
234
+ ```
235
+
236
+ ## Features
237
+
238
+ - **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
239
+ - **60+ themed widgets** — primitives plus higher-level composites (DataTable, Tree, ListView, Calendar, DateField, Form, Gauge, ToggleGroup, PageStack, Carousel, Tooltip, and more)
240
+ - **Dialogs and messages** — `alert()` / `confirm()` / `ask_*()` prompts and `FormDialog` / `FontDialog` / `FilterDialog`, plus non-blocking `toast()`, `Notification`, and `Snackbar` surfaces
241
+ - **Layout containers** — `Column`, `Row`, `Grid`, and `Spacer` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Divider`
242
+ - **Design system** — semantic `accent` colors (primary, secondary, success, danger, warning, info) and `variant` tokens (solid, outline, ghost), consistent across widgets
243
+ - **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
244
+ - **Reactive signals** — observable state with subscribe/set, integrates with widgets via `signal=` / `textsignal=`
245
+ - **Forms & validation** — `Form` with built-in field-level validators and inline error messages
246
+ - **DataSource** — common interface over in-memory, SQLite, and file backends, with pagination, filtering, sorting, CRUD, and CSV/TSV/Excel export
247
+ - **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)
248
+ - **Localization (i18n)** — 23 bundled message catalogs, locale-aware number/date/time formatting via Babel, runtime language switching
249
+ - **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring and caching
250
+ - **Platform support** — DPI awareness, multi-monitor centering, mica/acrylic effects on Windows
251
+ - **CLI (`bootstack`)** — project scaffolding, run, add components, theme/i18n setup, doctor, build/package
252
+
253
+ ## Widget Categories
254
+
255
+ | Category | Widgets |
256
+ |----------|---------|
257
+ | **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar, ThemeToggle |
258
+ | **Inputs** | TextField, PasswordField, PathField, NumberField, SpinnerField, Slider, RangeSlider, TextArea, CodeEditor, DateField, TimeField |
259
+ | **Selection** | Checkbox, Switch, ToggleButton, Radio, RadioGroup, ToggleGroup, Select, SelectButton, Calendar |
260
+ | **Data Display** | Label, Badge, ListView, Tree, DataTable, ProgressBar, Gauge |
261
+ | **Media** | Avatar, Picture, Gallery, Carousel |
262
+ | **Layout** | Column, Row, Grid, Spacer, Card, GroupBox, SplitView, ScrollView, Accordion, Divider |
263
+ | **Navigation** | AppShell, Workbench, Window, Splash, StatusBar, Tabs, PageStack |
264
+ | **Dialogs** | `alert()`, `confirm()`, `ask_*()` prompts, FormDialog, FontDialog, FilterDialog |
265
+ | **Overlays** | `toast()`, Notification, Snackbar, Tooltip |
266
+ | **Forms** | Form, with field-level validation |
267
+
268
+ ## CLI
269
+
270
+ bootstack ships with an optional CLI for scaffolding, running, and packaging applications:
271
+
272
+ ```bash
273
+ bootstack gallery # Launch the interactive widget gallery
274
+ bootstack icons # Browse the built-in icon catalog
275
+ bootstack appicon # Design an app icon and export it
276
+ bootstack start MyApp # Create a new project (basic template)
277
+ bootstack start MyApp --template appshell # ...or with sidebar navigation
278
+ bootstack run # Run the app defined in the project config
279
+ bootstack dev app.py # Run with hot reload (live edit-and-save)
280
+ bootstack add page Dashboard # Add a new page (appshell)
281
+ bootstack add view Settings # Add a new view (basic)
282
+ bootstack add dialog Preferences # Add a new dialog
283
+ bootstack doctor # Diagnose project & environment
284
+ bootstack promote # Make the project packaging-ready
285
+ bootstack build # Package for distribution
286
+ ```
287
+
288
+ ## Documentation
289
+
290
+ Full documentation — guides, the widget catalog, and the API reference — lives at
291
+ **[bootstack.org](https://bootstack.org)**.
292
+
293
+ ## Contributing
294
+
295
+ Contributions are welcome — code, bug reports, and especially **translations**.
296
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, the pull-request
297
+ workflow, and how to review the bundled language catalogs.
298
+
299
+ ## Links
300
+
301
+ - **GitHub**: https://github.com/israel-dryer/bootstack
@@ -0,0 +1,249 @@
1
+ ![bootstack](https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/banner-readme.png)
2
+
3
+ ![](https://img.shields.io/github/release/israel-dryer/bootstack.svg)
4
+ [![Downloads](https://pepy.tech/badge/bootstack)](https://pepy.tech/project/bootstack)
5
+ [![Downloads](https://pepy.tech/badge/bootstack/month)](https://pepy.tech/project/bootstack)
6
+ ![](https://img.shields.io/github/issues/israel-dryer/bootstack.svg)
7
+ ![](https://img.shields.io/github/issues-closed/israel-dryer/bootstack.svg)
8
+ ![](https://img.shields.io/github/license/israel-dryer/bootstack.svg)
9
+ ![](https://img.shields.io/github/stars/israel-dryer/bootstack.svg)
10
+ ![](https://img.shields.io/github/forks/israel-dryer/bootstack.svg)
11
+
12
+ > Full documentation is at **[bootstack.org](https://bootstack.org)**.
13
+
14
+ ### From idea to a shipped desktop app — fast.
15
+
16
+ bootstack gives engineers, data scientists, and hobbyists everything to build a
17
+ polished desktop interface and package it into a standalone executable —
18
+ declarative, reactive, and batteries-included, all in pure Python.
19
+
20
+ <p align="center">
21
+ <picture>
22
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-dark.png">
23
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
24
+ <img alt="bootstack hero demo" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
25
+ </picture>
26
+ </p>
27
+
28
+ ## Why bootstack?
29
+
30
+ Most Python desktop frameworks make you fight the framework. bootstack gets out of the way.
31
+
32
+ - **30% less code** — the declarative, context-manager layout eliminates geometry calls, explicit parenting, and most of the wiring boilerplate
33
+ - **Reads like Python** — nested `with` blocks mirror your UI structure; the code hierarchy *is* the layout
34
+ - **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
35
+ - **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
36
+ - **Reactive signals** — observable state that flows between widgets; bind once, update everywhere
37
+ - **Event and stream pipelines** — compose, filter, debounce, and throttle UI events with a chainable stream API
38
+ - **Built-in icons** — the full Bootstrap Icons catalog, theme-aware and recolorable, bundled with the framework
39
+ - **Built-in localization** — 23 language catalogs, locale-aware number/date/time formatting, runtime language switching
40
+ - **Semantic styling** — `accent="primary"`, `variant="outline"` — no hard-coded colors; looks right across every theme automatically
41
+ - **10 paired light/dark themes** — popular dev color schemes plus Bootstrap, with a runtime switcher and a custom-theme API
42
+ - **Forms and validation** — field-level validators, inline error messages, and a `FormDialog` for quick modal forms
43
+ - **DataSource abstraction** — one interface over SQLite, in-memory, and file backends with filtering, sorting, pagination, and CRUD
44
+ - **Data visualization** — embed `matplotlib` (and `seaborn`) figures with `Chart`; they recolor with the theme and live-update from a `Signal` or `DataSource` (optional `viz` extra)
45
+ - **A real CLI** — scaffold, run, add pages/views/dialogs/themes, and package for distribution
46
+ - **Hot reload** — `bootstack dev app.py` updates the running app on save and keeps your place; module-level state and the active page survive the reload
47
+ - **PyInstaller packaging built in** — `bootstack build` produces a standalone executable; no separate toolchain required
48
+
49
+ ## Hot reload
50
+
51
+ Edit and save — the running window updates in place. `bootstack dev app.py`
52
+ reloads the UI on every save while keeping your window position, module-level
53
+ state, and active page, so you never lose your spot.
54
+
55
+ <p align="center">
56
+ <video src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/docs/_static/examples/live-reload.mp4" controls muted loop playsinline></video>
57
+ </p>
58
+
59
+ ## Installation
60
+
61
+ Requires Python 3.12+ and Tk/Tcl (bundled with most Python distributions).
62
+ Install with pip:
63
+
64
+ ```bash
65
+ python -m pip install bootstack
66
+ ```
67
+
68
+ See the [installation guide](https://bootstack.org/getting-started/installation/)
69
+ for platform-specific Tk setup and the optional data-format extras.
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
+
79
+ <p align="center">
80
+ <picture>
81
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-dark.png">
82
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
83
+ <img alt="bootstack widget gallery" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
84
+ </picture>
85
+ </p>
86
+
87
+ ## Quick Start
88
+
89
+ ```python
90
+ import bootstack as bs
91
+
92
+ with bs.App(title="Hello", padding=16, gap=16) as app:
93
+ bs.Label("Hello from bootstack!")
94
+ bs.Button("Primary", accent="primary")
95
+ bs.Button("Success", accent="success")
96
+ bs.Button("Danger Outline", accent="danger", variant="outline")
97
+
98
+ app.run()
99
+ ```
100
+
101
+ <p align="center">
102
+ <picture>
103
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-dark.png">
104
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
105
+ <img alt="bootstack quick start example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
106
+ </picture>
107
+ </p>
108
+
109
+ For navigation-based apps, use `AppShell` — it gives you stacked toolbars, a sidebar, and a page stack in one call:
110
+
111
+ ```python
112
+ import bootstack as bs
113
+
114
+ shell = bs.AppShell(title="My App", size=(1000, 650))
115
+
116
+ with shell.page_nav() as nav:
117
+ with nav.add_page("home", text="Home", icon="house"):
118
+ bs.Label("Welcome!")
119
+ with nav.add_page("docs", text="Documents", icon="file-earmark-text"):
120
+ bs.Label("Your documents.")
121
+
122
+ shell.run()
123
+ ```
124
+
125
+ ## How it works
126
+
127
+ ### Layout containers
128
+
129
+ `Column`, `Row`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
130
+
131
+ ```python
132
+ with bs.App(title="Sign In") as app:
133
+ with bs.Grid(columns=["auto", 1], gap=(12, 6), horizontal_items="stretch", padding=16):
134
+ bs.Label("Name:")
135
+ bs.TextField(placeholder="Full name")
136
+ bs.Label("Email:")
137
+ bs.TextField(placeholder="email@example.com")
138
+ bs.Label("Role:")
139
+ bs.Select(options=["Admin", "User", "Viewer"], value="User")
140
+ bs.Button("Submit", accent="primary", columnspan=2)
141
+
142
+ app.run()
143
+ ```
144
+
145
+ <p align="center">
146
+ <picture>
147
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-dark.png">
148
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
149
+ <img alt="bootstack layout containers example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
150
+ </picture>
151
+ </p>
152
+
153
+ ### Semantic styling
154
+
155
+ 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:
156
+
157
+ ```python
158
+ bs.Button("Save", accent="primary")
159
+ bs.Button("Cancel", accent="secondary", variant="outline")
160
+ bs.Label("Heading", font="heading-lg")
161
+ ```
162
+
163
+ <p align="center">
164
+ <picture>
165
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-dark.png">
166
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
167
+ <img alt="bootstack semantic styling example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
168
+ </picture>
169
+ </p>
170
+
171
+ ### Signals (optional)
172
+
173
+ 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:
174
+
175
+ ```python
176
+ with bs.App(title="Hello") as app:
177
+ name = bs.Signal("World")
178
+ bs.Label(textsignal=name) # updates automatically when name changes
179
+ bs.TextField(textsignal=name) # two-way binding to the same state
180
+
181
+ app.run()
182
+ ```
183
+
184
+ ## Features
185
+
186
+ - **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
187
+ - **60+ themed widgets** — primitives plus higher-level composites (DataTable, Tree, ListView, Calendar, DateField, Form, Gauge, ToggleGroup, PageStack, Carousel, Tooltip, and more)
188
+ - **Dialogs and messages** — `alert()` / `confirm()` / `ask_*()` prompts and `FormDialog` / `FontDialog` / `FilterDialog`, plus non-blocking `toast()`, `Notification`, and `Snackbar` surfaces
189
+ - **Layout containers** — `Column`, `Row`, `Grid`, and `Spacer` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Divider`
190
+ - **Design system** — semantic `accent` colors (primary, secondary, success, danger, warning, info) and `variant` tokens (solid, outline, ghost), consistent across widgets
191
+ - **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
192
+ - **Reactive signals** — observable state with subscribe/set, integrates with widgets via `signal=` / `textsignal=`
193
+ - **Forms & validation** — `Form` with built-in field-level validators and inline error messages
194
+ - **DataSource** — common interface over in-memory, SQLite, and file backends, with pagination, filtering, sorting, CRUD, and CSV/TSV/Excel export
195
+ - **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)
196
+ - **Localization (i18n)** — 23 bundled message catalogs, locale-aware number/date/time formatting via Babel, runtime language switching
197
+ - **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring and caching
198
+ - **Platform support** — DPI awareness, multi-monitor centering, mica/acrylic effects on Windows
199
+ - **CLI (`bootstack`)** — project scaffolding, run, add components, theme/i18n setup, doctor, build/package
200
+
201
+ ## Widget Categories
202
+
203
+ | Category | Widgets |
204
+ |----------|---------|
205
+ | **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar, ThemeToggle |
206
+ | **Inputs** | TextField, PasswordField, PathField, NumberField, SpinnerField, Slider, RangeSlider, TextArea, CodeEditor, DateField, TimeField |
207
+ | **Selection** | Checkbox, Switch, ToggleButton, Radio, RadioGroup, ToggleGroup, Select, SelectButton, Calendar |
208
+ | **Data Display** | Label, Badge, ListView, Tree, DataTable, ProgressBar, Gauge |
209
+ | **Media** | Avatar, Picture, Gallery, Carousel |
210
+ | **Layout** | Column, Row, Grid, Spacer, Card, GroupBox, SplitView, ScrollView, Accordion, Divider |
211
+ | **Navigation** | AppShell, Workbench, Window, Splash, StatusBar, Tabs, PageStack |
212
+ | **Dialogs** | `alert()`, `confirm()`, `ask_*()` prompts, FormDialog, FontDialog, FilterDialog |
213
+ | **Overlays** | `toast()`, Notification, Snackbar, Tooltip |
214
+ | **Forms** | Form, with field-level validation |
215
+
216
+ ## CLI
217
+
218
+ bootstack ships with an optional CLI for scaffolding, running, and packaging applications:
219
+
220
+ ```bash
221
+ bootstack gallery # Launch the interactive widget gallery
222
+ bootstack icons # Browse the built-in icon catalog
223
+ bootstack appicon # Design an app icon and export it
224
+ bootstack start MyApp # Create a new project (basic template)
225
+ bootstack start MyApp --template appshell # ...or with sidebar navigation
226
+ bootstack run # Run the app defined in the project config
227
+ bootstack dev app.py # Run with hot reload (live edit-and-save)
228
+ bootstack add page Dashboard # Add a new page (appshell)
229
+ bootstack add view Settings # Add a new view (basic)
230
+ bootstack add dialog Preferences # Add a new dialog
231
+ bootstack doctor # Diagnose project & environment
232
+ bootstack promote # Make the project packaging-ready
233
+ bootstack build # Package for distribution
234
+ ```
235
+
236
+ ## Documentation
237
+
238
+ Full documentation — guides, the widget catalog, and the API reference — lives at
239
+ **[bootstack.org](https://bootstack.org)**.
240
+
241
+ ## Contributing
242
+
243
+ Contributions are welcome — code, bug reports, and especially **translations**.
244
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, the pull-request
245
+ workflow, and how to review the bundled language catalogs.
246
+
247
+ ## Links
248
+
249
+ - **GitHub**: https://github.com/israel-dryer/bootstack