bootstack 0.1.0__py3-none-any.whl

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 (471) hide show
  1. bootstack/__init__.py +157 -0
  2. bootstack/__main__.py +5 -0
  3. bootstack/_core/__init__.py +21 -0
  4. bootstack/_core/capabilities/__init__.py +45 -0
  5. bootstack/_core/capabilities/after.py +103 -0
  6. bootstack/_core/capabilities/bind.py +192 -0
  7. bootstack/_core/capabilities/bindtags.py +112 -0
  8. bootstack/_core/capabilities/busy.py +72 -0
  9. bootstack/_core/capabilities/clipboard.py +89 -0
  10. bootstack/_core/capabilities/focus.py +118 -0
  11. bootstack/_core/capabilities/grab.py +65 -0
  12. bootstack/_core/capabilities/grid.py +211 -0
  13. bootstack/_core/capabilities/localization.py +231 -0
  14. bootstack/_core/capabilities/pack.py +140 -0
  15. bootstack/_core/capabilities/place.py +113 -0
  16. bootstack/_core/capabilities/selection.py +136 -0
  17. bootstack/_core/capabilities/signals.py +244 -0
  18. bootstack/_core/capabilities/winfo.py +315 -0
  19. bootstack/_core/colorutils.py +234 -0
  20. bootstack/_core/exceptions.py +25 -0
  21. bootstack/_core/images.py +463 -0
  22. bootstack/_core/mixins/__init__.py +1 -0
  23. bootstack/_core/mixins/ttk_state.py +35 -0
  24. bootstack/_core/mixins/widget.py +132 -0
  25. bootstack/_core/paths.py +49 -0
  26. bootstack/_core/publisher.py +149 -0
  27. bootstack/_core/variables.py +62 -0
  28. bootstack/_runtime/__init__.py +3 -0
  29. bootstack/_runtime/app.py +930 -0
  30. bootstack/_runtime/base_window.py +945 -0
  31. bootstack/_runtime/events.py +399 -0
  32. bootstack/_runtime/shortcuts.py +496 -0
  33. bootstack/_runtime/tk_patch.py +43 -0
  34. bootstack/_runtime/toplevel.py +276 -0
  35. bootstack/_runtime/utility.py +457 -0
  36. bootstack/_runtime/visual_focus.py +240 -0
  37. bootstack/_runtime/window_utilities.py +1123 -0
  38. bootstack/assets/__init__.py +21 -0
  39. bootstack/assets/bootstack.ico +0 -0
  40. bootstack/assets/bootstack.png +0 -0
  41. bootstack/assets/elements/__init__.py +0 -0
  42. bootstack/assets/elements/badge-pill.png +0 -0
  43. bootstack/assets/elements/badge-square.png +0 -0
  44. bootstack/assets/elements/button-compact.png +0 -0
  45. bootstack/assets/elements/button-default.png +0 -0
  46. bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
  47. bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
  48. bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
  49. bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
  50. bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
  51. bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
  52. bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
  53. bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
  54. bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
  55. bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
  56. bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
  57. bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
  58. bootstack/assets/elements/card.png +0 -0
  59. bootstack/assets/elements/checkbox-checked.png +0 -0
  60. bootstack/assets/elements/checkbox-indeterminate.png +0 -0
  61. bootstack/assets/elements/checkbox-unchecked.png +0 -0
  62. bootstack/assets/elements/field.png +0 -0
  63. bootstack/assets/elements/input-addon-compact.png +0 -0
  64. bootstack/assets/elements/input-addon-default.png +0 -0
  65. bootstack/assets/elements/input-compact.png +0 -0
  66. bootstack/assets/elements/input-default.png +0 -0
  67. bootstack/assets/elements/list-item-separated.png +0 -0
  68. bootstack/assets/elements/list-item.png +0 -0
  69. bootstack/assets/elements/listrow-compact.png +0 -0
  70. bootstack/assets/elements/listrow-default.png +0 -0
  71. bootstack/assets/elements/manifest.toml +361 -0
  72. bootstack/assets/elements/menu-item.png +0 -0
  73. bootstack/assets/elements/navitem-compact.png +0 -0
  74. bootstack/assets/elements/navitem-default.png +0 -0
  75. bootstack/assets/elements/progressbar-h-compact.png +0 -0
  76. bootstack/assets/elements/progressbar-h-default.png +0 -0
  77. bootstack/assets/elements/progressbar-v-compact.png +0 -0
  78. bootstack/assets/elements/progressbar-v-default.png +0 -0
  79. bootstack/assets/elements/radiobutton.png +0 -0
  80. bootstack/assets/elements/scrollbar-horizontal.png +0 -0
  81. bootstack/assets/elements/scrollbar-vertical.png +0 -0
  82. bootstack/assets/elements/slider-handle.png +0 -0
  83. bootstack/assets/elements/slider-track-h.png +0 -0
  84. bootstack/assets/elements/slider-track-v.png +0 -0
  85. bootstack/assets/elements/switch-off.png +0 -0
  86. bootstack/assets/elements/switch-on.png +0 -0
  87. bootstack/assets/elements/tab-h.png +0 -0
  88. bootstack/assets/elements/tab-v.png +0 -0
  89. bootstack/assets/icons/bootstrap.ttf +0 -0
  90. bootstack/assets/icons/glyphmap.json +2080 -0
  91. bootstack/assets/icons/icon_metrics.json +12470 -0
  92. bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
  93. bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +856 -0
  94. bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
  95. bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +878 -0
  96. bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
  97. bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +856 -0
  98. bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
  99. bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +856 -0
  100. bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
  101. bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +856 -0
  102. bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
  103. bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +878 -0
  104. bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
  105. bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +856 -0
  106. bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
  107. bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +856 -0
  108. bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
  109. bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +854 -0
  110. bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
  111. bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +845 -0
  112. bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
  113. bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +844 -0
  114. bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
  115. bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +917 -0
  116. bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
  117. bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +845 -0
  118. bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
  119. bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +844 -0
  120. bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
  121. bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +844 -0
  122. bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
  123. bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +845 -0
  124. bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
  125. bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +845 -0
  126. bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
  127. bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +845 -0
  128. bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
  129. bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +845 -0
  130. bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
  131. bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +845 -0
  132. bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
  133. bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +845 -0
  134. bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
  135. bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +845 -0
  136. bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
  137. bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +845 -0
  138. bootstack/cli/__init__.py +133 -0
  139. bootstack/cli/__main__.py +6 -0
  140. bootstack/cli/add.py +395 -0
  141. bootstack/cli/appicon.py +285 -0
  142. bootstack/cli/build.py +115 -0
  143. bootstack/cli/config.py +313 -0
  144. bootstack/cli/demo.py +564 -0
  145. bootstack/cli/dev.py +153 -0
  146. bootstack/cli/doctor.py +195 -0
  147. bootstack/cli/icons.py +98 -0
  148. bootstack/cli/promote.py +120 -0
  149. bootstack/cli/pyinstaller.py +268 -0
  150. bootstack/cli/run.py +95 -0
  151. bootstack/cli/start.py +117 -0
  152. bootstack/cli/templates/__init__.py +931 -0
  153. bootstack/clipboard.py +48 -0
  154. bootstack/constants.py +318 -0
  155. bootstack/data/README.md +615 -0
  156. bootstack/data/__init__.py +78 -0
  157. bootstack/data/_observable.py +276 -0
  158. bootstack/data/base.py +780 -0
  159. bootstack/data/file_source.py +367 -0
  160. bootstack/data/memory_source.py +450 -0
  161. bootstack/data/query.py +367 -0
  162. bootstack/data/readers.py +289 -0
  163. bootstack/data/sqlite_source.py +869 -0
  164. bootstack/data/types.py +354 -0
  165. bootstack/data/writers.py +232 -0
  166. bootstack/dev/__init__.py +36 -0
  167. bootstack/dev/_capture.py +141 -0
  168. bootstack/dev/_env.py +43 -0
  169. bootstack/dev/_registry.py +140 -0
  170. bootstack/dev/_reloader.py +351 -0
  171. bootstack/dev/_reset.py +50 -0
  172. bootstack/dev/_watcher.py +91 -0
  173. bootstack/dialogs/__init__.py +948 -0
  174. bootstack/dialogs/_impl/__init__.py +47 -0
  175. bootstack/dialogs/_impl/colorchooser.py +588 -0
  176. bootstack/dialogs/_impl/datedialog.py +450 -0
  177. bootstack/dialogs/_impl/dialog.py +594 -0
  178. bootstack/dialogs/_impl/filterdialog.py +358 -0
  179. bootstack/dialogs/_impl/fontdialog.py +364 -0
  180. bootstack/dialogs/_impl/formdialog.py +564 -0
  181. bootstack/dialogs/_impl/message.py +486 -0
  182. bootstack/dialogs/_impl/query.py +570 -0
  183. bootstack/errors.py +67 -0
  184. bootstack/events/__init__.py +111 -0
  185. bootstack/events/_event.py +135 -0
  186. bootstack/events/_payloads.py +539 -0
  187. bootstack/events/_subscription.py +38 -0
  188. bootstack/i18n/README.md +77 -0
  189. bootstack/i18n/__init__.py +23 -0
  190. bootstack/i18n/catalog.py +121 -0
  191. bootstack/i18n/intl_format.py +584 -0
  192. bootstack/i18n/msgcat.py +425 -0
  193. bootstack/i18n/specs.py +156 -0
  194. bootstack/images.py +563 -0
  195. bootstack/py.typed +1 -0
  196. bootstack/scheduling/__init__.py +11 -0
  197. bootstack/scheduling/_schedule.py +218 -0
  198. bootstack/shortcuts.py +21 -0
  199. bootstack/signals/README.md +98 -0
  200. bootstack/signals/__init__.py +10 -0
  201. bootstack/signals/integration.py +100 -0
  202. bootstack/signals/signal.py +353 -0
  203. bootstack/signals/types.py +6 -0
  204. bootstack/store.py +286 -0
  205. bootstack/streams/__init__.py +12 -0
  206. bootstack/streams/_stream.py +321 -0
  207. bootstack/style/__init__.py +38 -0
  208. bootstack/style/builders/__init__.py +51 -0
  209. bootstack/style/builders/badge.py +46 -0
  210. bootstack/style/builders/button.py +339 -0
  211. bootstack/style/builders/buttongroup.py +311 -0
  212. bootstack/style/builders/calendar.py +271 -0
  213. bootstack/style/builders/checkbutton.py +110 -0
  214. bootstack/style/builders/combobox.py +113 -0
  215. bootstack/style/builders/contextmenu.py +268 -0
  216. bootstack/style/builders/entry.py +82 -0
  217. bootstack/style/builders/expander.py +148 -0
  218. bootstack/style/builders/field.py +335 -0
  219. bootstack/style/builders/frame.py +50 -0
  220. bootstack/style/builders/label.py +28 -0
  221. bootstack/style/builders/labelframe.py +34 -0
  222. bootstack/style/builders/listview.py +369 -0
  223. bootstack/style/builders/menubar.py +91 -0
  224. bootstack/style/builders/menubutton.py +359 -0
  225. bootstack/style/builders/panedwindow.py +25 -0
  226. bootstack/style/builders/progressbar.py +67 -0
  227. bootstack/style/builders/radiobutton.py +99 -0
  228. bootstack/style/builders/scale.py +64 -0
  229. bootstack/style/builders/scrollbar.py +225 -0
  230. bootstack/style/builders/separator.py +49 -0
  231. bootstack/style/builders/sidenav.py +643 -0
  232. bootstack/style/builders/sizegrip.py +15 -0
  233. bootstack/style/builders/spinbox.py +119 -0
  234. bootstack/style/builders/switch.py +70 -0
  235. bootstack/style/builders/tabitem.py +204 -0
  236. bootstack/style/builders/togglegroup.py +294 -0
  237. bootstack/style/builders/toolbutton.py +275 -0
  238. bootstack/style/builders/tooltip.py +26 -0
  239. bootstack/style/builders/treeview.py +193 -0
  240. bootstack/style/builders/utils.py +455 -0
  241. bootstack/style/builders_tk/__init__.py +16 -0
  242. bootstack/style/builders_tk/defaults.py +229 -0
  243. bootstack/style/element.py +173 -0
  244. bootstack/style/fonts.py +123 -0
  245. bootstack/style/style.py +609 -0
  246. bootstack/style/style_builder_base.py +716 -0
  247. bootstack/style/style_builder_mixed.py +93 -0
  248. bootstack/style/style_builder_tk.py +109 -0
  249. bootstack/style/style_builder_ttk.py +353 -0
  250. bootstack/style/style_resolver.py +447 -0
  251. bootstack/style/theme.py +245 -0
  252. bootstack/style/theme_provider.py +471 -0
  253. bootstack/style/themes/__init__.py +128 -0
  254. bootstack/style/tk_patch.py +5 -0
  255. bootstack/style/token_maps.py +41 -0
  256. bootstack/style/types.py +32 -0
  257. bootstack/style/typography.py +523 -0
  258. bootstack/style/utility.py +746 -0
  259. bootstack/types.py +39 -0
  260. bootstack/validation/__init__.py +6 -0
  261. bootstack/validation/types.py +15 -0
  262. bootstack/validation/validation_result.py +17 -0
  263. bootstack/validation/validation_rules.py +205 -0
  264. bootstack/widgets/__init__.py +74 -0
  265. bootstack/widgets/_core/__init__.py +31 -0
  266. bootstack/widgets/_core/app_config.py +266 -0
  267. bootstack/widgets/_core/base.py +461 -0
  268. bootstack/widgets/_core/container.py +334 -0
  269. bootstack/widgets/_core/context.py +35 -0
  270. bootstack/widgets/_core/events.py +130 -0
  271. bootstack/widgets/_core/field_mixin.py +353 -0
  272. bootstack/widgets/_core/icon_image_props.py +72 -0
  273. bootstack/widgets/_core/image_binding.py +93 -0
  274. bootstack/widgets/_core/navmodel.py +345 -0
  275. bootstack/widgets/_core/options.py +210 -0
  276. bootstack/widgets/_core/selection_group.py +130 -0
  277. bootstack/widgets/_core/window_controls.py +96 -0
  278. bootstack/widgets/_core/window_menu.py +246 -0
  279. bootstack/widgets/_impl/__init__.py +1 -0
  280. bootstack/widgets/_impl/_internal/__init__.py +0 -0
  281. bootstack/widgets/_impl/_internal/wrapper_base.py +307 -0
  282. bootstack/widgets/_impl/_parts/__init__.py +11 -0
  283. bootstack/widgets/_impl/_parts/numberentry_part.py +385 -0
  284. bootstack/widgets/_impl/_parts/spinnerentry_part.py +434 -0
  285. bootstack/widgets/_impl/_parts/textentry_part.py +406 -0
  286. bootstack/widgets/_impl/composites/__init__.py +33 -0
  287. bootstack/widgets/_impl/composites/_dateutils.py +33 -0
  288. bootstack/widgets/_impl/composites/_image_fit.py +105 -0
  289. bootstack/widgets/_impl/composites/accordion.py +381 -0
  290. bootstack/widgets/_impl/composites/avatar.py +191 -0
  291. bootstack/widgets/_impl/composites/buttongroup.py +371 -0
  292. bootstack/widgets/_impl/composites/calendar.py +972 -0
  293. bootstack/widgets/_impl/composites/carousel.py +567 -0
  294. bootstack/widgets/_impl/composites/chart.py +882 -0
  295. bootstack/widgets/_impl/composites/compositeframe.py +298 -0
  296. bootstack/widgets/_impl/composites/contextmenu.py +1951 -0
  297. bootstack/widgets/_impl/composites/dateentry.py +404 -0
  298. bootstack/widgets/_impl/composites/dropdownbutton.py +325 -0
  299. bootstack/widgets/_impl/composites/expander.py +515 -0
  300. bootstack/widgets/_impl/composites/field.py +670 -0
  301. bootstack/widgets/_impl/composites/form.py +1066 -0
  302. bootstack/widgets/_impl/composites/gallery.py +551 -0
  303. bootstack/widgets/_impl/composites/list/__init__.py +15 -0
  304. bootstack/widgets/_impl/composites/list/listitem.py +802 -0
  305. bootstack/widgets/_impl/composites/list/listview.py +1433 -0
  306. bootstack/widgets/_impl/composites/menu/__init__.py +18 -0
  307. bootstack/widgets/_impl/composites/menu/model.py +358 -0
  308. bootstack/widgets/_impl/composites/menu/render_native.py +134 -0
  309. bootstack/widgets/_impl/composites/menu/render_themed.py +134 -0
  310. bootstack/widgets/_impl/composites/meter.py +860 -0
  311. bootstack/widgets/_impl/composites/numericentry.py +201 -0
  312. bootstack/widgets/_impl/composites/pagestack.py +395 -0
  313. bootstack/widgets/_impl/composites/passwordentry.py +142 -0
  314. bootstack/widgets/_impl/composites/pathentry.py +168 -0
  315. bootstack/widgets/_impl/composites/picture.py +289 -0
  316. bootstack/widgets/_impl/composites/radiogroup.py +511 -0
  317. bootstack/widgets/_impl/composites/scrolledtext.py +375 -0
  318. bootstack/widgets/_impl/composites/scrolledtext.pyi +186 -0
  319. bootstack/widgets/_impl/composites/scrollview.py +764 -0
  320. bootstack/widgets/_impl/composites/selectbox.py +1026 -0
  321. bootstack/widgets/_impl/composites/shell/__init__.py +40 -0
  322. bootstack/widgets/_impl/composites/shell/content_host.py +52 -0
  323. bootstack/widgets/_impl/composites/shell/layout.py +335 -0
  324. bootstack/widgets/_impl/composites/shell/nav_panel.py +345 -0
  325. bootstack/widgets/_impl/composites/shell/providers.py +558 -0
  326. bootstack/widgets/_impl/composites/shell/rail.py +117 -0
  327. bootstack/widgets/_impl/composites/shell/shell.py +581 -0
  328. bootstack/widgets/_impl/composites/shell/workspace.py +273 -0
  329. bootstack/widgets/_impl/composites/sidenav/__init__.py +16 -0
  330. bootstack/widgets/_impl/composites/sidenav/header.py +81 -0
  331. bootstack/widgets/_impl/composites/sidenav/separator.py +44 -0
  332. bootstack/widgets/_impl/composites/slider/__init__.py +7 -0
  333. bootstack/widgets/_impl/composites/slider/_shared.py +195 -0
  334. bootstack/widgets/_impl/composites/slider/rangeslider.py +982 -0
  335. bootstack/widgets/_impl/composites/slider/slider.py +851 -0
  336. bootstack/widgets/_impl/composites/spinnerentry.py +185 -0
  337. bootstack/widgets/_impl/composites/tableview/__init__.py +5 -0
  338. bootstack/widgets/_impl/composites/tableview/tableview.py +3388 -0
  339. bootstack/widgets/_impl/composites/tableview/types.py +169 -0
  340. bootstack/widgets/_impl/composites/tabs/__init__.py +23 -0
  341. bootstack/widgets/_impl/composites/tabs/tabitem.py +389 -0
  342. bootstack/widgets/_impl/composites/tabs/tabs.py +974 -0
  343. bootstack/widgets/_impl/composites/tabs/tabview.py +650 -0
  344. bootstack/widgets/_impl/composites/textarea/__init__.py +26 -0
  345. bootstack/widgets/_impl/composites/textarea/change.py +46 -0
  346. bootstack/widgets/_impl/composites/textarea/codeeditor.py +526 -0
  347. bootstack/widgets/_impl/composites/textarea/core.py +495 -0
  348. bootstack/widgets/_impl/composites/textarea/decoration.py +42 -0
  349. bootstack/widgets/_impl/composites/textarea/diff.py +127 -0
  350. bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +1 -0
  351. bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +138 -0
  352. bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +158 -0
  353. bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +138 -0
  354. bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +312 -0
  355. bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +177 -0
  356. bootstack/widgets/_impl/composites/textarea/filter.py +171 -0
  357. bootstack/widgets/_impl/composites/textarea/search_overlay.py +459 -0
  358. bootstack/widgets/_impl/composites/textarea/sidebar.py +88 -0
  359. bootstack/widgets/_impl/composites/textarea/style_registry.py +178 -0
  360. bootstack/widgets/_impl/composites/textarea/textarea.py +606 -0
  361. bootstack/widgets/_impl/composites/textarea/undo.py +217 -0
  362. bootstack/widgets/_impl/composites/textentry.py +57 -0
  363. bootstack/widgets/_impl/composites/timeentry.py +176 -0
  364. bootstack/widgets/_impl/composites/toast.py +390 -0
  365. bootstack/widgets/_impl/composites/toast_stack.py +156 -0
  366. bootstack/widgets/_impl/composites/togglegroup.py +418 -0
  367. bootstack/widgets/_impl/composites/toolbar.py +608 -0
  368. bootstack/widgets/_impl/composites/tooltip.py +491 -0
  369. bootstack/widgets/_impl/composites/tree/__init__.py +7 -0
  370. bootstack/widgets/_impl/composites/tree/source_binding.py +136 -0
  371. bootstack/widgets/_impl/composites/tree/treeitem.py +393 -0
  372. bootstack/widgets/_impl/composites/tree/treenode.py +174 -0
  373. bootstack/widgets/_impl/composites/tree/treeview.py +841 -0
  374. bootstack/widgets/_impl/mixins/__init__.py +24 -0
  375. bootstack/widgets/_impl/mixins/configure_mixin.py +216 -0
  376. bootstack/widgets/_impl/mixins/entry_mixin.py +134 -0
  377. bootstack/widgets/_impl/mixins/font_mixin.py +368 -0
  378. bootstack/widgets/_impl/mixins/icon_mixin.py +61 -0
  379. bootstack/widgets/_impl/mixins/localization_mixin.py +253 -0
  380. bootstack/widgets/_impl/mixins/signal_mixin.py +268 -0
  381. bootstack/widgets/_impl/mixins/validation_mixin.py +226 -0
  382. bootstack/widgets/_impl/primitives/__init__.py +49 -0
  383. bootstack/widgets/_impl/primitives/_menubutton.py +107 -0
  384. bootstack/widgets/_impl/primitives/badge.py +45 -0
  385. bootstack/widgets/_impl/primitives/button.py +76 -0
  386. bootstack/widgets/_impl/primitives/card.py +45 -0
  387. bootstack/widgets/_impl/primitives/checkbutton.py +124 -0
  388. bootstack/widgets/_impl/primitives/checktoggle.py +62 -0
  389. bootstack/widgets/_impl/primitives/combobox.py +156 -0
  390. bootstack/widgets/_impl/primitives/entry.py +87 -0
  391. bootstack/widgets/_impl/primitives/flexframe.py +448 -0
  392. bootstack/widgets/_impl/primitives/frame.py +185 -0
  393. bootstack/widgets/_impl/primitives/gridframe.py +546 -0
  394. bootstack/widgets/_impl/primitives/label.py +84 -0
  395. bootstack/widgets/_impl/primitives/labelframe.py +54 -0
  396. bootstack/widgets/_impl/primitives/optionmenu.py +387 -0
  397. bootstack/widgets/_impl/primitives/packframe.py +227 -0
  398. bootstack/widgets/_impl/primitives/panedwindow.py +45 -0
  399. bootstack/widgets/_impl/primitives/progressbar.py +83 -0
  400. bootstack/widgets/_impl/primitives/radiobutton.py +115 -0
  401. bootstack/widgets/_impl/primitives/radiotoggle.py +54 -0
  402. bootstack/widgets/_impl/primitives/scrollbar.py +42 -0
  403. bootstack/widgets/_impl/primitives/separator.py +43 -0
  404. bootstack/widgets/_impl/primitives/sizegrip.py +33 -0
  405. bootstack/widgets/_impl/primitives/spinbox.py +95 -0
  406. bootstack/widgets/_impl/primitives/switch.py +44 -0
  407. bootstack/widgets/_impl/primitives/treeview.py +69 -0
  408. bootstack/widgets/app.py +371 -0
  409. bootstack/widgets/appshell.py +1179 -0
  410. bootstack/widgets/avatar.py +140 -0
  411. bootstack/widgets/boolean_controls.py +455 -0
  412. bootstack/widgets/button.py +224 -0
  413. bootstack/widgets/buttongroup.py +239 -0
  414. bootstack/widgets/calendar.py +195 -0
  415. bootstack/widgets/card.py +159 -0
  416. bootstack/widgets/carousel.py +241 -0
  417. bootstack/widgets/chart.py +302 -0
  418. bootstack/widgets/codeeditor.py +675 -0
  419. bootstack/widgets/contextmenu.py +371 -0
  420. bootstack/widgets/datatable.py +688 -0
  421. bootstack/widgets/datefield.py +395 -0
  422. bootstack/widgets/divider.py +60 -0
  423. bootstack/widgets/expander.py +579 -0
  424. bootstack/widgets/form.py +200 -0
  425. bootstack/widgets/gallery.py +250 -0
  426. bootstack/widgets/gauge.py +168 -0
  427. bootstack/widgets/grid.py +121 -0
  428. bootstack/widgets/groupbox.py +162 -0
  429. bootstack/widgets/label.py +229 -0
  430. bootstack/widgets/listview.py +354 -0
  431. bootstack/widgets/menubutton.py +419 -0
  432. bootstack/widgets/numberfield.py +431 -0
  433. bootstack/widgets/pagestack.py +345 -0
  434. bootstack/widgets/passwordfield.py +383 -0
  435. bootstack/widgets/pathfield.py +454 -0
  436. bootstack/widgets/picture.py +251 -0
  437. bootstack/widgets/progressbar.py +106 -0
  438. bootstack/widgets/radio_variants.py +271 -0
  439. bootstack/widgets/radiogroup.py +228 -0
  440. bootstack/widgets/scrollbar.py +64 -0
  441. bootstack/widgets/scrollview.py +186 -0
  442. bootstack/widgets/select.py +302 -0
  443. bootstack/widgets/selectbutton.py +182 -0
  444. bootstack/widgets/sidebar_toggle.py +130 -0
  445. bootstack/widgets/sizegrip.py +42 -0
  446. bootstack/widgets/slider.py +408 -0
  447. bootstack/widgets/spinbox.py +147 -0
  448. bootstack/widgets/spinnerfield.py +413 -0
  449. bootstack/widgets/splash.py +367 -0
  450. bootstack/widgets/splitview.py +482 -0
  451. bootstack/widgets/stacks.py +249 -0
  452. bootstack/widgets/statusbar.py +189 -0
  453. bootstack/widgets/tabs.py +425 -0
  454. bootstack/widgets/textarea.py +459 -0
  455. bootstack/widgets/textfield.py +410 -0
  456. bootstack/widgets/theme_toggle.py +92 -0
  457. bootstack/widgets/timefield.py +340 -0
  458. bootstack/widgets/toast.py +314 -0
  459. bootstack/widgets/togglegroup.py +231 -0
  460. bootstack/widgets/toolbar.py +347 -0
  461. bootstack/widgets/tooltip.py +94 -0
  462. bootstack/widgets/tree.py +648 -0
  463. bootstack/widgets/types.py +305 -0
  464. bootstack/widgets/window.py +307 -0
  465. bootstack-0.1.0.dist-info/METADATA +301 -0
  466. bootstack-0.1.0.dist-info/RECORD +471 -0
  467. bootstack-0.1.0.dist-info/WHEEL +5 -0
  468. bootstack-0.1.0.dist-info/entry_points.txt +2 -0
  469. bootstack-0.1.0.dist-info/licenses/LICENSE +21 -0
  470. bootstack-0.1.0.dist-info/licenses/NOTICE +10 -0
  471. bootstack-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,159 @@
1
+ from __future__ import annotations
2
+
3
+ import tkinter
4
+ from typing import Any
5
+
6
+ from bootstack.widgets._impl.primitives.flexframe import FlexFrame
7
+ from bootstack.widgets._impl.primitives.gridframe import GridFrame
8
+ from bootstack.widgets._core.container import (
9
+ PublicContainer, GRID_KEYS, place_flex_child, grid_sticky,
10
+ _reject_legacy_child_kwargs,
11
+ )
12
+ from bootstack.widgets.types import (
13
+ AccentToken, Padding, LayoutKind, AutoFlow,
14
+ )
15
+
16
+
17
+ class Card(PublicContainer):
18
+ """A card-surface container that groups content with an elevated background and border.
19
+
20
+ Renders with the `card` surface token, so nested cards step up through the
21
+ surface hierarchy automatically (`background` → `card` → `overlay`).
22
+ Children are arranged by the internal layout selected with `layout`.
23
+
24
+ Args:
25
+ layout: Internal layout manager. Defaults to `'column'`.
26
+ padding: Space in pixels between the card border and its content.
27
+ A single value applies to all sides; `(x, y)` sets the horizontal
28
+ and vertical amounts. Defaults to `16`.
29
+ gap: Space in pixels between child widgets. Defaults to `0`.
30
+ horizontal_items: How children sit on the horizontal axis — edge values
31
+ `'left'`/`'center'`/`'right'`/`'stretch'`, plus the `'space-*'` modes
32
+ when horizontal is the stacking axis (`'row'`). Override per child
33
+ with `horizontal`. Defaults to `'stretch'` in grid mode, `'center'` in a column
34
+ and `'left'` in a row.
35
+ vertical_items: How children sit on the vertical axis — edge values
36
+ `'top'`/`'center'`/`'bottom'`/`'stretch'`, plus the `'space-*'` modes
37
+ when vertical is the stacking axis (`'column'`). Override per child
38
+ with `vertical`. Defaults to `'stretch'` in grid mode, `'center'` in a row and `'top'` in a column.
39
+ grow_items: For `'column'`/`'row'` layout, when `True` every child
40
+ grows equally to share the stacking axis. Defaults to `False`.
41
+ columns: Column definitions for `'grid'` layout. An integer sets
42
+ the number of equal-weight columns; a list sets per-column weights
43
+ or sizes — integers are relative weights, `'auto'` sizes to
44
+ content, `'Npx'` sets a fixed pixel width (e.g.
45
+ `[1, 2, 'auto', '120px']`).
46
+ rows: Row definitions for `'grid'` layout, same format as `columns`.
47
+ auto_flow: Grid auto-placement direction. Defaults to `'row'`.
48
+ accent: Color intent token applied to the card border. When set, the
49
+ card interior uses a subtle tint of that accent. When omitted, the
50
+ card uses the next surface step with no border color.
51
+ parent: Override the context-stack parent widget.
52
+ **kwargs: Layout placement options applied by the parent container —
53
+ `fill`, `expand`, `anchor`, `margin`, `row`, `column`, `sticky`.
54
+ See :doc:`/tasks/layout`.
55
+ """
56
+
57
+ def __init__(
58
+ self,
59
+ *,
60
+ layout: LayoutKind = "column",
61
+ padding: Padding | None = 16,
62
+ gap: int = 0,
63
+ horizontal_items: str | None = None,
64
+ vertical_items: str | None = None,
65
+ grow_items: bool = False,
66
+ columns: int | list[int | str] | None = None,
67
+ rows: int | list[int | str] | None = None,
68
+ auto_flow: AutoFlow = "row",
69
+ accent: AccentToken | str | None = None,
70
+ parent: Any = None,
71
+ **kwargs: Any,
72
+ ) -> None:
73
+ self._parent = self._resolve_parent(parent)
74
+ self._layout = layout
75
+ layout_kw = self._split_layout_kwargs(kwargs)
76
+
77
+ # One horizontal_items/vertical_items pair serves both modes; the sensible
78
+ # default differs — grid cells fill (stretch), stacked children sit at the
79
+ # leading edge (left/top).
80
+ if horizontal_items is None:
81
+ horizontal_items = (
82
+ "stretch" if layout == "grid"
83
+ else "center" if layout == "column" else "left"
84
+ )
85
+ if vertical_items is None:
86
+ vertical_items = (
87
+ "stretch" if layout == "grid"
88
+ else "center" if layout == "row" else "top"
89
+ )
90
+
91
+ tk_master = self._parent._child_master() if self._parent else None
92
+
93
+ # Determine the surface children will sit on:
94
+ # - With accent: always accent[subtle], fixed — accent is the identity, not an elevation marker
95
+ # - Without accent: alternate between card and card_raised at each nesting level
96
+ _SURFACE_STEPS = {
97
+ "background": "card",
98
+ "content": "card",
99
+ "card": "card_raised",
100
+ "card_raised": "card",
101
+ }
102
+ parent_surface = getattr(tk_master, '_surface', 'background') or 'background'
103
+ effective_surface = f'{accent}[subtle]' if accent is not None else _SURFACE_STEPS.get(parent_surface, 'card')
104
+
105
+ if layout in ("column", "row"):
106
+ self._internal = FlexFrame(
107
+ tk_master,
108
+ direction="vertical" if layout == "column" else "horizontal",
109
+ variant="card",
110
+ show_border=True,
111
+ surface=effective_surface,
112
+ **({"accent": accent} if accent is not None else {}),
113
+ padding=padding,
114
+ gap=gap,
115
+ horizontal_items=horizontal_items,
116
+ vertical_items=vertical_items,
117
+ grow_items=grow_items,
118
+ )
119
+ elif layout == "grid":
120
+ self._internal = GridFrame(
121
+ tk_master,
122
+ variant="card",
123
+ show_border=True,
124
+ surface=effective_surface,
125
+ **({"accent": accent} if accent is not None else {}),
126
+ padding=padding,
127
+ columns=columns,
128
+ rows=rows,
129
+ gap=gap,
130
+ auto_flow=auto_flow,
131
+ )
132
+ else:
133
+ raise ValueError(
134
+ f"Card layout must be 'column', 'row', or 'grid', got {layout!r}"
135
+ )
136
+
137
+ self._horizontal_items = horizontal_items
138
+ self._vertical_items = vertical_items
139
+ self._attach_to_parent(layout_kw)
140
+
141
+ def _child_master(self) -> tkinter.Misc:
142
+ return self._internal
143
+
144
+ def _default_layout_method(self) -> str:
145
+ return "grid" if self._layout == "grid" else "flex"
146
+
147
+ def guide_layout(self, child: Any, **layout_kw: Any) -> None:
148
+ if self._layout == "grid":
149
+ return super().guide_layout(child, **layout_kw)
150
+ place_flex_child(self._internal, child, layout_kw, "Card")
151
+
152
+ def _merge_layout_options(self, child: Any, layout_kw: dict) -> tuple[str, dict]:
153
+ # Only reached for grid layout (column/row use the flex path above).
154
+ _reject_legacy_child_kwargs(layout_kw, "Card")
155
+ options = {k: v for k, v in layout_kw.items() if k in GRID_KEYS}
156
+ h = layout_kw.get("horizontal") or self._horizontal_items
157
+ v = layout_kw.get("vertical") or self._vertical_items
158
+ options["sticky"] = grid_sticky(h, v)
159
+ return ("grid", options)
@@ -0,0 +1,241 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, Callable, Literal, overload, TYPE_CHECKING
4
+
5
+ from bootstack.events import Event, Subscription
6
+ from bootstack.streams import Stream
7
+ from bootstack.widgets._core.base import PublicWidgetBase
8
+ from bootstack.widgets._core.events import register_widget_events
9
+ from bootstack.widgets._impl.composites.carousel import Carousel as _InternalCarousel
10
+ from bootstack.widgets.types import AccentToken, SurfaceToken
11
+
12
+ if TYPE_CHECKING:
13
+ from bootstack.data.types import DataSourceProtocol
14
+
15
+ ImageFit = Literal["contain", "cover", "fill", "none", "scale-down"]
16
+ Transition = Literal["slide", "fade", "none"]
17
+ Indicator = Literal["dots", "count", "none"]
18
+
19
+
20
+ class Carousel(PublicWidgetBase):
21
+ """Shows one image slide at a time, with prev/next navigation.
22
+
23
+ `Carousel` steps through a collection of image records one slide at a time —
24
+ the focus-on-one counterpart to :doc:`Gallery </widgets/gallery>`. It pairs
25
+ naturally with `Gallery.on_item_activate` to open a full-size pop-up viewer:
26
+ a `Carousel` over the same `items`, starting at the activated slide.
27
+
28
+ Each record names the image through `image_field` (an `Image`, a file path,
29
+ or a PIL image) and, optionally, a caption through `caption_field`. Navigate
30
+ with the on-screen chevrons, the arrow keys, the indicator dots, or the
31
+ `next`/`previous`/`go_to` methods.
32
+
33
+ Args:
34
+ items: Initial list of record dicts.
35
+ data_source: A data source for database- or API-backed data.
36
+ image_field: Record key holding each slide's image. Default `'image'`.
37
+ caption_field: Record key for the caption overlaid on each slide.
38
+ Default `None` (no captions).
39
+ index: The slide shown first. Default `0`.
40
+ fit: How each image is scaled into the stage — `'contain'` (default,
41
+ shows the whole image), `'cover'`, `'fill'`, `'none'`, or
42
+ `'scale-down'`. See :doc:`Picture </widgets/picture>`.
43
+ transition: Animation between slides — `'slide'` (default), `'fade'`, or
44
+ `'none'`.
45
+ show_arrows: Show the overlaid prev/next chevrons. Default `True`.
46
+ indicator: The slide indicator — `'dots'` (default; auto-switches to a
47
+ counter when there are many slides), `'count'`, or `'none'`.
48
+ autoplay: Auto-advance through the slides. Default `False`.
49
+ interval: Autoplay dwell time per slide, in milliseconds. Default `4000`.
50
+ loop: Wrap around past the first and last slides. Default `True`.
51
+ corner_radius: Rounded-corner radius for the slide image, in pixels.
52
+ Default `0`.
53
+ aspect_ratio: Width-to-height ratio used to derive the carousel's minimum
54
+ height when it sits in a container that doesn't impose one (a scroll
55
+ view, an auto-fit window) — a larger ratio gives a wider, shorter
56
+ floor. Default `1.5`. Ignored when `height` is set. `fill`/`expand`
57
+ still grow the stage past this floor.
58
+ height: Explicit minimum height for the slide stage, in pixels. Overrides
59
+ `aspect_ratio`. Default `None` (derive from `aspect_ratio`).
60
+ accent: Color intent token to brand the active indicator dot. By default
61
+ the dots are neutral (white), which reads on any image; set this to
62
+ color the active dot.
63
+ surface: Background surface token shown behind a letterboxed slide.
64
+ parent: Override the context-stack parent.
65
+ **kwargs: Layout placement options applied by the parent container —
66
+ `fill`, `expand`, `anchor`, `margin`, `row`, `column`, `sticky`.
67
+ See :doc:`/tasks/layout`.
68
+ """
69
+
70
+ def __init__(
71
+ self,
72
+ *,
73
+ items: list[dict] | None = None,
74
+ data_source: "DataSourceProtocol | None" = None,
75
+ image_field: str = "image",
76
+ caption_field: str | None = None,
77
+ index: int = 0,
78
+ fit: ImageFit = "contain",
79
+ transition: Transition = "slide",
80
+ show_arrows: bool = True,
81
+ indicator: Indicator = "dots",
82
+ autoplay: bool = False,
83
+ interval: int = 4000,
84
+ loop: bool = True,
85
+ corner_radius: int = 0,
86
+ aspect_ratio: float = 1.5,
87
+ height: int | None = None,
88
+ accent: AccentToken | str | None = None,
89
+ surface: SurfaceToken | str | None = None,
90
+ parent: Any = None,
91
+ **kwargs: Any,
92
+ ) -> None:
93
+ self._parent = self._resolve_parent(parent)
94
+ layout_kw = self._split_layout_kwargs(kwargs)
95
+ tk_master = self._parent._child_master() if self._parent else None
96
+
97
+ internal_kwargs: dict[str, Any] = {
98
+ "image_field": image_field,
99
+ "caption_field": caption_field,
100
+ "index": index,
101
+ "fit": fit,
102
+ "transition": transition,
103
+ "show_arrows": show_arrows,
104
+ "indicator": indicator,
105
+ "autoplay": autoplay,
106
+ "interval": interval,
107
+ "loop": loop,
108
+ "corner_radius": corner_radius,
109
+ "aspect_ratio": aspect_ratio,
110
+ "height": height,
111
+ }
112
+ if items is not None:
113
+ internal_kwargs["items"] = items
114
+ if data_source is not None:
115
+ internal_kwargs["datasource"] = data_source
116
+ if accent is not None:
117
+ internal_kwargs["accent"] = accent
118
+ if surface is not None:
119
+ internal_kwargs["surface"] = surface
120
+
121
+ self._internal = _InternalCarousel(tk_master, **internal_kwargs)
122
+ self._internal.pack_propagate(False)
123
+ self._attach_to_parent(layout_kw)
124
+
125
+ # ----- Navigation -----
126
+
127
+ @property
128
+ def index(self) -> int:
129
+ """The index of the currently shown slide. Assign to jump to a slide."""
130
+ return self._internal.index
131
+
132
+ @index.setter
133
+ def index(self, value: int) -> None:
134
+ self._internal.go_to(int(value))
135
+
136
+ @property
137
+ def current(self) -> dict | None:
138
+ """The currently shown record — the data bag — or `None` when empty."""
139
+ return self._internal.current
140
+
141
+ @property
142
+ def count(self) -> int:
143
+ """The number of slides."""
144
+ return self._internal.count
145
+
146
+ def next(self) -> None:
147
+ """Advance to the next slide."""
148
+ self._internal.next()
149
+
150
+ def previous(self) -> None:
151
+ """Go back to the previous slide."""
152
+ self._internal.previous()
153
+
154
+ def go_to(self, index: int) -> None:
155
+ """Jump to the slide at `index`, animating in the right direction.
156
+
157
+ Args:
158
+ index: The slide index to show.
159
+ """
160
+ self._internal.go_to(int(index))
161
+
162
+ # ----- Autoplay -----
163
+
164
+ @property
165
+ def is_playing(self) -> bool:
166
+ """Whether autoplay is currently running."""
167
+ return self._internal.is_playing
168
+
169
+ def play(self) -> None:
170
+ """Start auto-advancing through the slides."""
171
+ self._internal.play()
172
+
173
+ def pause(self) -> None:
174
+ """Stop auto-advancing."""
175
+ self._internal.pause()
176
+
177
+ def stop(self) -> None:
178
+ """Stop auto-advancing and return to the first slide."""
179
+ self._internal.stop()
180
+
181
+ # ----- Data -----
182
+
183
+ @property
184
+ def data_source(self) -> "DataSourceProtocol":
185
+ """The underlying data source instance."""
186
+ return self._internal.get_datasource()
187
+
188
+ def reload(self) -> None:
189
+ """Reload from the data source and refresh the current slide."""
190
+ self._internal.reload()
191
+
192
+ # ----- Events -----
193
+
194
+ @overload
195
+ def on_change(self) -> Stream: ...
196
+ @overload
197
+ def on_change(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
198
+ def on_change(
199
+ self, handler: Callable[[dict[str, Any]], Any] | None = None
200
+ ) -> Stream | Subscription:
201
+ """Fired when the active slide changes.
202
+
203
+ Args:
204
+ handler: Called with the now-current record `dict` — read fields with
205
+ `e["field"]`. Omit to get a composable
206
+ :class:`~bootstack.streams.Stream`.
207
+
208
+ Returns:
209
+ A cancellable :class:`~bootstack.events.Subscription` when a handler
210
+ is given, otherwise a :class:`~bootstack.streams.Stream`.
211
+ """
212
+ return self.on("change", handler)
213
+
214
+ @overload
215
+ def on_item_click(self) -> Stream: ...
216
+ @overload
217
+ def on_item_click(self, handler: Callable[[dict[str, Any]], Any]) -> Subscription: ...
218
+ def on_item_click(
219
+ self, handler: Callable[[dict[str, Any]], Any] | None = None
220
+ ) -> Stream | Subscription:
221
+ """Fired when the current slide is clicked.
222
+
223
+ The natural hook for closing a pop-up viewer or opening a detail view.
224
+
225
+ Args:
226
+ handler: Called with the current record `dict`. Omit to get a
227
+ composable :class:`~bootstack.streams.Stream`.
228
+
229
+ Returns:
230
+ A cancellable :class:`~bootstack.events.Subscription` when a handler
231
+ is given, otherwise a :class:`~bootstack.streams.Stream`.
232
+ """
233
+ return self.on("item_click", handler)
234
+
235
+
236
+ _CAROUSEL_EVENTS: dict[str, str] = {
237
+ "change": "<<Change>>",
238
+ "item_click": "<<ItemClick>>",
239
+ }
240
+
241
+ register_widget_events(Carousel, _CAROUSEL_EVENTS)