bootstack 0.1.3__tar.gz → 0.1.5__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.3/src/bootstack.egg-info → bootstack-0.1.5}/PKG-INFO +7 -6
  2. {bootstack-0.1.3 → bootstack-0.1.5}/README.md +5 -4
  3. {bootstack-0.1.3 → bootstack-0.1.5}/pyproject.toml +3 -3
  4. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/checkbutton.py +14 -2
  5. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/boolean_controls.py +52 -25
  6. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/select.py +27 -0
  7. {bootstack-0.1.3 → bootstack-0.1.5/src/bootstack.egg-info}/PKG-INFO +7 -6
  8. {bootstack-0.1.3 → bootstack-0.1.5}/LICENSE +0 -0
  9. {bootstack-0.1.3 → bootstack-0.1.5}/MANIFEST.in +0 -0
  10. {bootstack-0.1.3 → bootstack-0.1.5}/NOTICE +0 -0
  11. {bootstack-0.1.3 → bootstack-0.1.5}/setup.cfg +0 -0
  12. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/__init__.py +0 -0
  13. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/__main__.py +0 -0
  14. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/__init__.py +0 -0
  15. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/capabilities/__init__.py +0 -0
  16. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/capabilities/after.py +0 -0
  17. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/capabilities/bind.py +0 -0
  18. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/capabilities/bindtags.py +0 -0
  19. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/capabilities/busy.py +0 -0
  20. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/capabilities/clipboard.py +0 -0
  21. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/capabilities/focus.py +0 -0
  22. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/capabilities/grab.py +0 -0
  23. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/capabilities/grid.py +0 -0
  24. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/capabilities/localization.py +0 -0
  25. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/capabilities/pack.py +0 -0
  26. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/capabilities/place.py +0 -0
  27. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/capabilities/selection.py +0 -0
  28. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/capabilities/signals.py +0 -0
  29. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/capabilities/winfo.py +0 -0
  30. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/colorutils.py +0 -0
  31. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/exceptions.py +0 -0
  32. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/images.py +0 -0
  33. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/mixins/__init__.py +0 -0
  34. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/mixins/ttk_state.py +0 -0
  35. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/mixins/widget.py +0 -0
  36. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/paths.py +0 -0
  37. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/publisher.py +0 -0
  38. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_core/variables.py +0 -0
  39. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_runtime/__init__.py +0 -0
  40. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_runtime/app.py +0 -0
  41. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_runtime/base_window.py +0 -0
  42. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_runtime/events.py +0 -0
  43. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_runtime/shortcuts.py +0 -0
  44. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_runtime/tk_patch.py +0 -0
  45. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_runtime/toplevel.py +0 -0
  46. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_runtime/utility.py +0 -0
  47. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_runtime/visual_focus.py +0 -0
  48. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/_runtime/window_utilities.py +0 -0
  49. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/__init__.py +0 -0
  50. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/bootstack.ico +0 -0
  51. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/bootstack.png +0 -0
  52. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/__init__.py +0 -0
  53. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/badge-pill.png +0 -0
  54. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/badge-square.png +0 -0
  55. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/button-compact.png +0 -0
  56. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/button-default.png +0 -0
  57. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
  58. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
  59. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
  60. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
  61. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
  62. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
  63. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
  64. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
  65. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
  66. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
  67. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
  68. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
  69. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/card.png +0 -0
  70. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/checkbox-checked.png +0 -0
  71. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/checkbox-indeterminate.png +0 -0
  72. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/checkbox-unchecked.png +0 -0
  73. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/field.png +0 -0
  74. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/input-addon-compact.png +0 -0
  75. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/input-addon-default.png +0 -0
  76. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/input-compact.png +0 -0
  77. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/input-default.png +0 -0
  78. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/list-item-separated.png +0 -0
  79. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/list-item.png +0 -0
  80. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/listrow-compact.png +0 -0
  81. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/listrow-default.png +0 -0
  82. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/manifest.toml +0 -0
  83. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/menu-item.png +0 -0
  84. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/navitem-compact.png +0 -0
  85. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/navitem-default.png +0 -0
  86. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/progressbar-h-compact.png +0 -0
  87. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/progressbar-h-default.png +0 -0
  88. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/progressbar-v-compact.png +0 -0
  89. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/progressbar-v-default.png +0 -0
  90. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/radiobutton.png +0 -0
  91. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/scrollbar-horizontal.png +0 -0
  92. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/scrollbar-vertical.png +0 -0
  93. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/slider-handle.png +0 -0
  94. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/slider-track-h.png +0 -0
  95. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/slider-track-v.png +0 -0
  96. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/switch-off.png +0 -0
  97. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/switch-on.png +0 -0
  98. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/tab-h.png +0 -0
  99. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/elements/tab-v.png +0 -0
  100. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/icons/bootstrap.ttf +0 -0
  101. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/icons/glyphmap.json +0 -0
  102. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/icons/icon_metrics.json +0 -0
  103. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
  104. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +0 -0
  105. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
  106. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +0 -0
  107. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
  108. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +0 -0
  109. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
  110. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +0 -0
  111. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
  112. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +0 -0
  113. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
  114. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +0 -0
  115. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
  116. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +0 -0
  117. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
  118. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +0 -0
  119. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
  120. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +0 -0
  121. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
  122. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +0 -0
  123. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
  124. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +0 -0
  125. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
  126. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +0 -0
  127. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
  128. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +0 -0
  129. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
  130. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +0 -0
  131. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
  132. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +0 -0
  133. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
  134. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +0 -0
  135. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
  136. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +0 -0
  137. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
  138. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +0 -0
  139. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
  140. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +0 -0
  141. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
  142. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +0 -0
  143. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
  144. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +0 -0
  145. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
  146. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +0 -0
  147. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
  148. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +0 -0
  149. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/cli/__init__.py +0 -0
  150. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/cli/__main__.py +0 -0
  151. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/cli/add.py +0 -0
  152. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/cli/appicon.py +0 -0
  153. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/cli/build.py +0 -0
  154. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/cli/config.py +0 -0
  155. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/cli/demo.py +0 -0
  156. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/cli/dev.py +0 -0
  157. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/cli/doctor.py +0 -0
  158. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/cli/icons.py +0 -0
  159. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/cli/promote.py +0 -0
  160. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/cli/pyinstaller.py +0 -0
  161. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/cli/run.py +0 -0
  162. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/cli/start.py +0 -0
  163. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/cli/templates/__init__.py +0 -0
  164. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/clipboard.py +0 -0
  165. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/constants.py +0 -0
  166. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/data/README.md +0 -0
  167. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/data/__init__.py +0 -0
  168. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/data/_observable.py +0 -0
  169. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/data/base.py +0 -0
  170. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/data/file_source.py +0 -0
  171. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/data/memory_source.py +0 -0
  172. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/data/query.py +0 -0
  173. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/data/readers.py +0 -0
  174. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/data/sqlite_source.py +0 -0
  175. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/data/types.py +0 -0
  176. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/data/writers.py +0 -0
  177. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dev/__init__.py +0 -0
  178. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dev/_capture.py +0 -0
  179. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dev/_env.py +0 -0
  180. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dev/_registry.py +0 -0
  181. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dev/_reloader.py +0 -0
  182. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dev/_reset.py +0 -0
  183. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dev/_watcher.py +0 -0
  184. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dialogs/__init__.py +0 -0
  185. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dialogs/_impl/__init__.py +0 -0
  186. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dialogs/_impl/colorchooser.py +0 -0
  187. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dialogs/_impl/datedialog.py +0 -0
  188. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dialogs/_impl/dialog.py +0 -0
  189. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dialogs/_impl/filterdialog.py +0 -0
  190. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dialogs/_impl/fontdialog.py +0 -0
  191. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dialogs/_impl/formdialog.py +0 -0
  192. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dialogs/_impl/message.py +0 -0
  193. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/dialogs/_impl/query.py +0 -0
  194. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/errors.py +0 -0
  195. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/events/__init__.py +0 -0
  196. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/events/_event.py +0 -0
  197. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/events/_payloads.py +0 -0
  198. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/events/_subscription.py +0 -0
  199. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/i18n/README.md +0 -0
  200. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/i18n/__init__.py +0 -0
  201. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/i18n/catalog.py +0 -0
  202. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/i18n/intl_format.py +0 -0
  203. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/i18n/msgcat.py +0 -0
  204. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/i18n/specs.py +0 -0
  205. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/images.py +0 -0
  206. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/py.typed +0 -0
  207. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/scheduling/__init__.py +0 -0
  208. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/scheduling/_schedule.py +0 -0
  209. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/shortcuts.py +0 -0
  210. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/signals/README.md +0 -0
  211. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/signals/__init__.py +0 -0
  212. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/signals/integration.py +0 -0
  213. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/signals/signal.py +0 -0
  214. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/signals/types.py +0 -0
  215. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/store.py +0 -0
  216. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/streams/__init__.py +0 -0
  217. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/streams/_stream.py +0 -0
  218. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/__init__.py +0 -0
  219. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/__init__.py +0 -0
  220. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/badge.py +0 -0
  221. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/button.py +0 -0
  222. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/buttongroup.py +0 -0
  223. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/calendar.py +0 -0
  224. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/checkbutton.py +0 -0
  225. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/combobox.py +0 -0
  226. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/contextmenu.py +0 -0
  227. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/entry.py +0 -0
  228. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/expander.py +0 -0
  229. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/field.py +0 -0
  230. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/frame.py +0 -0
  231. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/label.py +0 -0
  232. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/labelframe.py +0 -0
  233. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/listview.py +0 -0
  234. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/menubar.py +0 -0
  235. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/menubutton.py +0 -0
  236. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/panedwindow.py +0 -0
  237. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/progressbar.py +0 -0
  238. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/radiobutton.py +0 -0
  239. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/scale.py +0 -0
  240. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/scrollbar.py +0 -0
  241. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/separator.py +0 -0
  242. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/sidenav.py +0 -0
  243. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/sizegrip.py +0 -0
  244. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/spinbox.py +0 -0
  245. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/switch.py +0 -0
  246. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/tabitem.py +0 -0
  247. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/togglegroup.py +0 -0
  248. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/toolbutton.py +0 -0
  249. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/tooltip.py +0 -0
  250. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/treeview.py +0 -0
  251. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders/utils.py +0 -0
  252. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders_tk/__init__.py +0 -0
  253. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/builders_tk/defaults.py +0 -0
  254. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/element.py +0 -0
  255. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/fonts.py +0 -0
  256. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/style.py +0 -0
  257. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/style_builder_base.py +0 -0
  258. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/style_builder_mixed.py +0 -0
  259. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/style_builder_tk.py +0 -0
  260. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/style_builder_ttk.py +0 -0
  261. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/style_resolver.py +0 -0
  262. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/theme.py +0 -0
  263. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/theme_provider.py +0 -0
  264. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/themes/__init__.py +0 -0
  265. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/tk_patch.py +0 -0
  266. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/token_maps.py +0 -0
  267. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/types.py +0 -0
  268. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/typography.py +0 -0
  269. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/style/utility.py +0 -0
  270. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/types.py +0 -0
  271. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/validation/__init__.py +0 -0
  272. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/validation/types.py +0 -0
  273. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/validation/validation_result.py +0 -0
  274. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/validation/validation_rules.py +0 -0
  275. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/__init__.py +0 -0
  276. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_core/__init__.py +0 -0
  277. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_core/app_config.py +0 -0
  278. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_core/base.py +0 -0
  279. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_core/container.py +0 -0
  280. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_core/context.py +0 -0
  281. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_core/events.py +0 -0
  282. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_core/field_mixin.py +0 -0
  283. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_core/icon_image_props.py +0 -0
  284. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_core/image_binding.py +0 -0
  285. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_core/navmodel.py +0 -0
  286. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_core/options.py +0 -0
  287. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_core/selection_group.py +0 -0
  288. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_core/window_controls.py +0 -0
  289. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_core/window_menu.py +0 -0
  290. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/__init__.py +0 -0
  291. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/_internal/__init__.py +0 -0
  292. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/_internal/wrapper_base.py +0 -0
  293. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/_parts/__init__.py +0 -0
  294. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/_parts/numberentry_part.py +0 -0
  295. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/_parts/spinnerentry_part.py +0 -0
  296. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/_parts/textentry_part.py +0 -0
  297. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/__init__.py +0 -0
  298. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/_dateutils.py +0 -0
  299. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/_image_fit.py +0 -0
  300. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/accordion.py +0 -0
  301. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/avatar.py +0 -0
  302. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/buttongroup.py +0 -0
  303. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/calendar.py +0 -0
  304. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/carousel.py +0 -0
  305. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/chart.py +0 -0
  306. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/compositeframe.py +0 -0
  307. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/contextmenu.py +0 -0
  308. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/dateentry.py +0 -0
  309. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/dropdownbutton.py +0 -0
  310. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/expander.py +0 -0
  311. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/field.py +0 -0
  312. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/form.py +0 -0
  313. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/gallery.py +0 -0
  314. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/list/__init__.py +0 -0
  315. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/list/listitem.py +0 -0
  316. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/list/listview.py +0 -0
  317. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/menu/__init__.py +0 -0
  318. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/menu/model.py +0 -0
  319. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/menu/render_native.py +0 -0
  320. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/menu/render_themed.py +0 -0
  321. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/meter.py +0 -0
  322. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/numericentry.py +0 -0
  323. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/pagestack.py +0 -0
  324. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/passwordentry.py +0 -0
  325. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/pathentry.py +0 -0
  326. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/picture.py +0 -0
  327. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/radiogroup.py +0 -0
  328. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/scrolledtext.py +0 -0
  329. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/scrolledtext.pyi +0 -0
  330. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/scrollview.py +0 -0
  331. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/selectbox.py +0 -0
  332. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/shell/__init__.py +0 -0
  333. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/shell/content_host.py +0 -0
  334. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/shell/layout.py +0 -0
  335. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/shell/nav_panel.py +0 -0
  336. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/shell/providers.py +0 -0
  337. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/shell/rail.py +0 -0
  338. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/shell/shell.py +0 -0
  339. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/shell/workspace.py +0 -0
  340. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/sidenav/__init__.py +0 -0
  341. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/sidenav/header.py +0 -0
  342. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/sidenav/separator.py +0 -0
  343. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/slider/__init__.py +0 -0
  344. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/slider/_shared.py +0 -0
  345. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/slider/rangeslider.py +0 -0
  346. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/slider/slider.py +0 -0
  347. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/spinnerentry.py +0 -0
  348. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/tableview/__init__.py +0 -0
  349. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/tableview/tableview.py +0 -0
  350. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/tableview/types.py +0 -0
  351. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/tabs/__init__.py +0 -0
  352. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/tabs/tabitem.py +0 -0
  353. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/tabs/tabs.py +0 -0
  354. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/tabs/tabview.py +0 -0
  355. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/__init__.py +0 -0
  356. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/change.py +0 -0
  357. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/codeeditor.py +0 -0
  358. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/core.py +0 -0
  359. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/decoration.py +0 -0
  360. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/diff.py +0 -0
  361. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +0 -0
  362. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +0 -0
  363. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +0 -0
  364. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +0 -0
  365. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +0 -0
  366. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +0 -0
  367. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/filter.py +0 -0
  368. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/search_overlay.py +0 -0
  369. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/sidebar.py +0 -0
  370. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/style_registry.py +0 -0
  371. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/textarea.py +0 -0
  372. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textarea/undo.py +0 -0
  373. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/textentry.py +0 -0
  374. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/timeentry.py +0 -0
  375. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/toast.py +0 -0
  376. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/toast_stack.py +0 -0
  377. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/togglegroup.py +0 -0
  378. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/toolbar.py +0 -0
  379. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/tooltip.py +0 -0
  380. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/tree/__init__.py +0 -0
  381. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/tree/source_binding.py +0 -0
  382. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/tree/treeitem.py +0 -0
  383. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/tree/treenode.py +0 -0
  384. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/composites/tree/treeview.py +0 -0
  385. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/mixins/__init__.py +0 -0
  386. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/mixins/configure_mixin.py +0 -0
  387. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/mixins/entry_mixin.py +0 -0
  388. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/mixins/font_mixin.py +0 -0
  389. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/mixins/icon_mixin.py +0 -0
  390. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/mixins/localization_mixin.py +0 -0
  391. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/mixins/signal_mixin.py +0 -0
  392. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/mixins/validation_mixin.py +0 -0
  393. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/__init__.py +0 -0
  394. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/_menubutton.py +0 -0
  395. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/badge.py +0 -0
  396. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/button.py +0 -0
  397. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/card.py +0 -0
  398. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/checktoggle.py +0 -0
  399. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/combobox.py +0 -0
  400. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/entry.py +0 -0
  401. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/flexframe.py +0 -0
  402. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/frame.py +0 -0
  403. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/gridframe.py +0 -0
  404. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/label.py +0 -0
  405. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/labelframe.py +0 -0
  406. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/optionmenu.py +0 -0
  407. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/packframe.py +0 -0
  408. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/panedwindow.py +0 -0
  409. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/progressbar.py +0 -0
  410. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/radiobutton.py +0 -0
  411. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/radiotoggle.py +0 -0
  412. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/scrollbar.py +0 -0
  413. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/separator.py +0 -0
  414. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/sizegrip.py +0 -0
  415. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/spinbox.py +0 -0
  416. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/switch.py +0 -0
  417. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/_impl/primitives/treeview.py +0 -0
  418. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/app.py +0 -0
  419. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/appshell.py +0 -0
  420. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/avatar.py +0 -0
  421. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/button.py +0 -0
  422. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/buttongroup.py +0 -0
  423. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/calendar.py +0 -0
  424. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/card.py +0 -0
  425. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/carousel.py +0 -0
  426. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/chart.py +0 -0
  427. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/codeeditor.py +0 -0
  428. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/contextmenu.py +0 -0
  429. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/datatable.py +0 -0
  430. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/datefield.py +0 -0
  431. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/divider.py +0 -0
  432. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/expander.py +0 -0
  433. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/form.py +0 -0
  434. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/gallery.py +0 -0
  435. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/gauge.py +0 -0
  436. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/grid.py +0 -0
  437. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/groupbox.py +0 -0
  438. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/label.py +0 -0
  439. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/listview.py +0 -0
  440. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/menubutton.py +0 -0
  441. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/numberfield.py +0 -0
  442. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/pagestack.py +0 -0
  443. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/passwordfield.py +0 -0
  444. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/pathfield.py +0 -0
  445. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/picture.py +0 -0
  446. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/progressbar.py +0 -0
  447. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/radio_variants.py +0 -0
  448. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/radiogroup.py +0 -0
  449. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/scrollbar.py +0 -0
  450. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/scrollview.py +0 -0
  451. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/selectbutton.py +0 -0
  452. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/sidebar_toggle.py +0 -0
  453. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/sizegrip.py +0 -0
  454. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/slider.py +0 -0
  455. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/spinbox.py +0 -0
  456. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/spinnerfield.py +0 -0
  457. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/splash.py +0 -0
  458. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/splitview.py +0 -0
  459. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/stacks.py +0 -0
  460. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/statusbar.py +0 -0
  461. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/tabs.py +0 -0
  462. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/textarea.py +0 -0
  463. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/textfield.py +0 -0
  464. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/theme_toggle.py +0 -0
  465. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/timefield.py +0 -0
  466. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/toast.py +0 -0
  467. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/togglegroup.py +0 -0
  468. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/toolbar.py +0 -0
  469. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/tooltip.py +0 -0
  470. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/tree.py +0 -0
  471. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/types.py +0 -0
  472. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack/widgets/window.py +0 -0
  473. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack.egg-info/SOURCES.txt +0 -0
  474. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack.egg-info/dependency_links.txt +0 -0
  475. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack.egg-info/entry_points.txt +0 -0
  476. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack.egg-info/requires.txt +0 -0
  477. {bootstack-0.1.3 → bootstack-0.1.5}/src/bootstack.egg-info/top_level.txt +0 -0
  478. {bootstack-0.1.3 → bootstack-0.1.5}/tests/test_dialog_anchor.py +0 -0
  479. {bootstack-0.1.3 → bootstack-0.1.5}/tests/test_events_doc_coverage.py +0 -0
  480. {bootstack-0.1.3 → bootstack-0.1.5}/tests/test_hot_reload.py +0 -0
  481. {bootstack-0.1.3 → bootstack-0.1.5}/tests/test_images.py +0 -0
  482. {bootstack-0.1.3 → bootstack-0.1.5}/tests/test_images_gui.py +0 -0
  483. {bootstack-0.1.3 → bootstack-0.1.5}/tests/test_intl_format.py +0 -0
  484. {bootstack-0.1.3 → bootstack-0.1.5}/tests/test_navmodel.py +0 -0
  485. {bootstack-0.1.3 → bootstack-0.1.5}/tests/test_on_color_contrast.py +0 -0
  486. {bootstack-0.1.3 → bootstack-0.1.5}/tests/test_public_surface.py +0 -0
  487. {bootstack-0.1.3 → bootstack-0.1.5}/tests/test_store.py +0 -0
  488. {bootstack-0.1.3 → bootstack-0.1.5}/tests/test_theme_from_existing.py +0 -0
  489. {bootstack-0.1.3 → bootstack-0.1.5}/tests/test_validation_rules.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bootstack
3
- Version: 0.1.3
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.
3
+ Version: 0.1.5
4
+ Summary: Build desktop GUI apps in pure Python and ship them as a standalone executable built on Tk, no Tkinter boilerplate.
5
5
  Author-email: Israel Dryer <israel.dryer@gmail.com>
6
6
  License-Expression: MIT
7
7
  Project-URL: Homepage, https://github.com/israel-dryer/bootstack
@@ -64,11 +64,12 @@ Dynamic: license-file
64
64
 
65
65
  > Full documentation is at **[bootstack.org](https://bootstack.org)**.
66
66
 
67
- ### From idea to a shipped desktop app fast.
67
+ ### Desktop apps in pure Python Tk underneath, none of the boilerplate.
68
68
 
69
- bootstack gives engineers, data scientists, and hobbyists everything to build a
70
- polished desktop interface and package it into a standalone executable
71
- declarative, reactive, and batteries-included, all in pure Python.
69
+ bootstack is built on Tk, so the install is light, there's no Qt license, and
70
+ your app ships as a small standalone executable. But you'll never write a
71
+ `StringVar` or call `.pack()` the API is its own. 60+ widgets, reactive state,
72
+ and a CLI that scaffolds and packages the whole thing.
72
73
 
73
74
  <p align="center">
74
75
  <picture>
@@ -11,11 +11,12 @@
11
11
 
12
12
  > Full documentation is at **[bootstack.org](https://bootstack.org)**.
13
13
 
14
- ### From idea to a shipped desktop app fast.
14
+ ### Desktop apps in pure Python Tk underneath, none of the boilerplate.
15
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.
16
+ bootstack is built on Tk, so the install is light, there's no Qt license, and
17
+ your app ships as a small standalone executable. But you'll never write a
18
+ `StringVar` or call `.pack()` the API is its own. 60+ widgets, reactive state,
19
+ and a CLI that scaffolds and packages the whole thing.
19
20
 
20
21
  <p align="center">
21
22
  <picture>
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "bootstack"
7
- version = "0.1.3"
8
- description = "From idea to a shipped desktop app, fast a declarative, reactive, batteries-included Python UI framework with 60+ widgets, semantic theming, and built-in packaging."
7
+ version = "0.1.5"
8
+ description = "Build desktop GUI apps in pure Python and ship them as a standalone executable built on Tk, no Tkinter boilerplate."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
11
11
  license = "MIT"
@@ -114,7 +114,7 @@ where = ["src"]
114
114
  ]
115
115
 
116
116
  [tool.bumpversion]
117
- current_version = "0.1.3"
117
+ current_version = "0.1.5"
118
118
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)((?P<pre>a|b|rc)(?P<pre_n>\\d+))?"
119
119
  serialize = [
120
120
  "{major}.{minor}.{patch}{pre}{pre_n}",
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from tkinter import ttk
3
+ from tkinter import StringVar, ttk
4
4
  from typing import Any, Callable, Literal, TYPE_CHECKING
5
5
 
6
6
  from typing_extensions import Unpack
@@ -94,9 +94,21 @@ class CheckButton(LocalizationMixin, SignalMixin, TextSignalMixin, IconMixin, TT
94
94
  signal_provided = 'signal' in kwargs
95
95
  variable_provided = 'variable' in kwargs
96
96
  initial_value = kwargs.pop('value', None)
97
+ # Only non-bool on/off values need a StringVar. A BooleanVar (the type
98
+ # inferred from the ttk class) coerces the value to True/False, which
99
+ # loses a string or other custom `onvalue`/`offvalue`; a StringVar holds
100
+ # it verbatim (mirrors RadioGroup / ToggleGroup, which track with a
101
+ # StringVar). For the default bool control we keep the BooleanVar so its
102
+ # reactive `signal` stays boolean — the common case is unchanged.
103
+ custom_values = any(
104
+ not isinstance(kwargs.get(k, True), bool) for k in ('onvalue', 'offvalue')
105
+ )
106
+ injected_variable = not signal_provided and not variable_provided and custom_values
107
+ if injected_variable:
108
+ kwargs['variable'] = StringVar(master=master)
97
109
  kwargs.update(style_options=self._capture_style_options(['icon_only', 'icon', 'on_icon', 'off_icon', 'show_indicator', 'anchor'], kwargs))
98
110
  super().__init__(master, **kwargs)
99
- if initial_value is not None and not signal_provided and not variable_provided:
111
+ if initial_value is not None and not signal_provided and injected_variable:
100
112
  self.variable.set(initial_value)
101
113
 
102
114
  def get(self) -> Any:
@@ -81,29 +81,14 @@ class _BooleanControlBase(PublicWidgetBase):
81
81
 
82
82
  self._internal = self._internal_class(tk_master, **internal_kwargs)
83
83
 
84
- # Seed initial value when no signal was passed.
85
- # tristate=False: default to unchecked_value so the box never shows the
86
- # indeterminate dash unexpectedly. tristate=True: leave unseeded so the
87
- # initial state is None (indeterminate) unless value= was explicitly given.
88
- if signal is None:
89
- if value is not None:
90
- self._internal.set(value)
91
- elif not _tristate:
92
- self._internal.set(unchecked_value)
93
-
94
- # Track the previous value so on_change can report it. The control may be
95
- # tristate (checked / unchecked / indeterminate), so prev cannot be derived
96
- # from the new value alone — and the command fires after Tk updates the var.
97
- self._prev_value = self._internal.get()
98
-
99
84
  # Wire command → virtual events so on_change() / on_check() subscriptions work.
100
85
  def _command():
101
- v = self._internal.get()
86
+ v = self.value
102
87
  prev, self._prev_value = self._prev_value, v
103
88
  self._internal.event_generate(
104
89
  "<<Change>>", data=ChangeEvent(value=v, prev_value=prev)
105
90
  )
106
- if v == self._checked_value:
91
+ if self._internal.instate(("selected",)):
107
92
  self._internal.event_generate("<<ToggleOn>>")
108
93
  else:
109
94
  self._internal.event_generate("<<ToggleOff>>")
@@ -111,8 +96,51 @@ class _BooleanControlBase(PublicWidgetBase):
111
96
  _ctor_callback()
112
97
 
113
98
  self._internal.configure(command=_command)
99
+
100
+ # Seed the initial state when no signal was passed. tristate + no value
101
+ # starts indeterminate (the documented behavior); otherwise start from
102
+ # the given value, defaulting to unchecked. This must run AFTER
103
+ # configure(command=...), which resets the ttk state (clearing an
104
+ # indeterminate `alternate` flag set earlier).
105
+ if signal is None:
106
+ if value is not None:
107
+ self._apply_value(value)
108
+ elif _tristate:
109
+ self._apply_value(None)
110
+ else:
111
+ self._apply_value(unchecked_value)
112
+
113
+ # Track the previous value so on_change can report it. The control may be
114
+ # tristate (checked / unchecked / indeterminate), so prev cannot be derived
115
+ # from the new value alone — and the command fires after Tk updates state.
116
+ self._prev_value = self.value
117
+
114
118
  self._attach_to_parent(layout_kw)
115
119
 
120
+ def _apply_value(self, v: Any) -> None:
121
+ """Drive the internal control to represent `v`.
122
+
123
+ Maps the public value onto the ttk widget's on/off values and the
124
+ indeterminate (`alternate`) state. A variable write clears `alternate`,
125
+ so indeterminate is set by writing the off value first and then flagging
126
+ the state.
127
+ """
128
+ on = self._internal.cget("onvalue")
129
+ off = self._internal.cget("offvalue")
130
+ if v is None and self._tristate:
131
+ # Writing the var clears `alternate`, so set the off value first and
132
+ # then flag the indeterminate state.
133
+ self._internal.set(off)
134
+ self._internal.state(("alternate",))
135
+ elif v == self._checked_value:
136
+ self._internal.set(on)
137
+ elif v == self._unchecked_value or v is None:
138
+ self._internal.set(off)
139
+ else:
140
+ # A value that matches neither on nor off — pass it through so the
141
+ # widget reflects it (best effort for custom values).
142
+ self._internal.set(v)
143
+
116
144
  # ----- Properties -----
117
145
 
118
146
  @property
@@ -123,25 +151,24 @@ class _BooleanControlBase(PublicWidgetBase):
123
151
  unchecked, or `None` when in the indeterminate state (only possible
124
152
  when `tristate=True`).
125
153
  """
126
- v = self._internal.get()
127
- if v == self._checked_value:
154
+ if self._tristate and self._internal.instate(("alternate",)):
155
+ return None
156
+ if self._internal.instate(("selected",)):
128
157
  return self._checked_value
129
- if v == self._unchecked_value:
130
- return self._unchecked_value
131
- return None
158
+ return self._unchecked_value
132
159
 
133
160
  @value.setter
134
161
  def value(self, v: Any) -> None:
135
- self._internal.set(v)
162
+ self._apply_value(v)
136
163
 
137
164
  @property
138
165
  def checked(self) -> bool:
139
166
  """Whether the control is in the checked/on state."""
140
- return self._internal.get() == self._checked_value
167
+ return bool(self._internal.instate(("selected",)))
141
168
 
142
169
  @checked.setter
143
170
  def checked(self, v: bool) -> None:
144
- self._internal.set(self._checked_value if v else self._internal.cget("offvalue"))
171
+ self._apply_value(self._checked_value if v else self._unchecked_value)
145
172
 
146
173
  @property
147
174
  def signal(self) -> "Signal | None":
@@ -9,6 +9,7 @@ from bootstack.widgets._core.events import resolve_event, register_widget_events
9
9
  from bootstack.widgets._core.options import record_to_dict
10
10
  from bootstack.events import ChangeEvent, Subscription
11
11
  from bootstack.streams import Stream
12
+ from bootstack.validation import RuleType
12
13
  from bootstack.widgets.textfield import _INNER_ENTRY_SEQUENCES
13
14
  from bootstack.widgets.types import AccentToken, Event, Option, OptionDict, WidgetDensity
14
15
 
@@ -140,6 +141,32 @@ class Select(PublicWidgetBase):
140
141
  self._internal = _InternalSelectBox(tk_master, **internal_kwargs)
141
142
  self._attach_to_parent(layout_kw)
142
143
 
144
+ # ----- Validation -----
145
+
146
+ def add_validation_rule(self, rule_type: RuleType, **kwargs: Any) -> None:
147
+ """Add a validation rule to the field.
148
+
149
+ Rules run automatically on blur or key events depending on the rule
150
+ type, or manually via `validate()`. Multiple rules can be added;
151
+ they are evaluated in order and stop at the first failure.
152
+
153
+ Args:
154
+ rule_type: The kind of validation rule to apply — `'required'`,
155
+ `'stringLength'`, `'pattern'`, `'email'`, `'compare'`, or
156
+ `'custom'`.
157
+ **kwargs: Rule-specific options:
158
+
159
+ - `message` *(all rules)* — override the default error message.
160
+ - `trigger` *(all rules)* — when to run: `'always'` (key and
161
+ blur), `'key'`, `'blur'`, or `'manual'`. Each rule type has
162
+ its own sensible default.
163
+ - `min`, `max` *(stringLength)* — minimum/maximum character count.
164
+ - `pattern` *(pattern)* — regex string the value must match.
165
+ - `other_field` *(compare)* — field whose value must match.
166
+ - `func` *(custom)* — callable `(value) -> bool`.
167
+ """
168
+ self._internal.add_validation_rule(rule_type, **kwargs)
169
+
143
170
  # ----- Event routing -----
144
171
 
145
172
  def _entry_widget(self) -> tkinter.Misc:
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bootstack
3
- Version: 0.1.3
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.
3
+ Version: 0.1.5
4
+ Summary: Build desktop GUI apps in pure Python and ship them as a standalone executable built on Tk, no Tkinter boilerplate.
5
5
  Author-email: Israel Dryer <israel.dryer@gmail.com>
6
6
  License-Expression: MIT
7
7
  Project-URL: Homepage, https://github.com/israel-dryer/bootstack
@@ -64,11 +64,12 @@ Dynamic: license-file
64
64
 
65
65
  > Full documentation is at **[bootstack.org](https://bootstack.org)**.
66
66
 
67
- ### From idea to a shipped desktop app fast.
67
+ ### Desktop apps in pure Python Tk underneath, none of the boilerplate.
68
68
 
69
- bootstack gives engineers, data scientists, and hobbyists everything to build a
70
- polished desktop interface and package it into a standalone executable
71
- declarative, reactive, and batteries-included, all in pure Python.
69
+ bootstack is built on Tk, so the install is light, there's no Qt license, and
70
+ your app ships as a small standalone executable. But you'll never write a
71
+ `StringVar` or call `.pack()` the API is its own. 60+ widgets, reactive state,
72
+ and a CLI that scaffolds and packages the whole thing.
72
73
 
73
74
  <p align="center">
74
75
  <picture>
File without changes
File without changes
File without changes
File without changes