bootstack 0.1.0a11__tar.gz → 0.1.0a13__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.
- {bootstack-0.1.0a11/src/bootstack.egg-info → bootstack-0.1.0a13}/PKG-INFO +43 -19
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/README.md +37 -18
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/pyproject.toml +13 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/__init__.py +10 -9
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/images.py +2 -2
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/app.py +29 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/base_window.py +37 -17
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/toplevel.py +14 -14
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/utility.py +66 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/visual_focus.py +12 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a13/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +3 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/add.py +5 -4
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/appicon.py +22 -22
- bootstack-0.1.0a13/src/bootstack/cli/demo.py +564 -0
- bootstack-0.1.0a13/src/bootstack/cli/icons.py +98 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/templates/__init__.py +55 -52
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/constants.py +10 -10
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/file_source.py +3 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/memory_source.py +34 -14
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/writers.py +1 -1
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/__init__.py +13 -12
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/__init__.py +10 -14
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/colorchooser.py +82 -33
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/datedialog.py +43 -19
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/dialog.py +61 -7
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/filterdialog.py +16 -11
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/fontdialog.py +3 -16
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/formdialog.py +25 -6
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/message.py +1 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/dialogs/_impl/query.py +1 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/i18n/__init__.py +3 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/i18n/catalog.py +3 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/i18n/specs.py +2 -2
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/images.py +18 -2
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/scheduling/__init__.py +2 -2
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/shortcuts.py +2 -2
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/signals/signal.py +35 -0
- bootstack-0.1.0a13/src/bootstack/streams/__init__.py +12 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/frame.py +9 -1
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/style.py +15 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/typography.py +18 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/types.py +2 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/validation/types.py +4 -4
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/validation/validation_rules.py +70 -4
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/__init__.py +6 -4
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/base.py +58 -6
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/container.py +133 -1
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/field_mixin.py +80 -8
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/window_menu.py +44 -2
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/_parts/numberentry_part.py +30 -2
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/_parts/spinnerentry_part.py +49 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/_parts/textentry_part.py +24 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/avatar.py +1 -1
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/buttongroup.py +1 -1
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/calendar.py +30 -15
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/carousel.py +7 -2
- bootstack-0.1.0a13/src/bootstack/widgets/_impl/composites/chart.py +883 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/compositeframe.py +2 -2
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/contextmenu.py +47 -10
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/field.py +22 -12
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/form.py +63 -27
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/gallery.py +54 -4
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/list/listview.py +6 -13
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/menu/model.py +4 -4
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/meter.py +20 -9
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/pagestack.py +7 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/passwordentry.py +12 -1
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/picture.py +3 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/scrollview.py +40 -4
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/content_host.py +8 -2
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/layout.py +13 -4
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/nav_panel.py +3 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/providers.py +3 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/shell.py +17 -4
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/workspace.py +16 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/slider/_shared.py +34 -8
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/slider/rangeslider.py +208 -73
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/slider/slider.py +168 -62
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/spinnerentry.py +8 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tableview/tableview.py +70 -30
- bootstack-0.1.0a13/src/bootstack/widgets/_impl/composites/tabs/tabs.py +974 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tabs/tabview.py +12 -8
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/codeeditor.py +5 -4
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/core.py +34 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +17 -2
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +2 -2
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/search_overlay.py +22 -1
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/style_registry.py +25 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/textarea.py +33 -1
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/timeentry.py +15 -11
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/toolbar.py +31 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tooltip.py +83 -10
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/configure_mixin.py +12 -12
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/font_mixin.py +4 -4
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/icon_mixin.py +4 -4
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/validation_mixin.py +17 -3
- bootstack-0.1.0a13/src/bootstack/widgets/_impl/primitives/flexframe.py +448 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/frame.py +53 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/gridframe.py +25 -6
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/packframe.py +5 -2
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/app.py +51 -26
- bootstack-0.1.0a13/src/bootstack/widgets/appshell.py +1046 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/button.py +51 -13
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/buttongroup.py +1 -1
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/card.py +56 -43
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/carousel.py +3 -2
- bootstack-0.1.0a13/src/bootstack/widgets/chart.py +302 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/codeeditor.py +57 -15
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/contextmenu.py +11 -8
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/datefield.py +11 -17
- bootstack-0.1.0a11/src/bootstack/widgets/separator.py → bootstack-0.1.0a13/src/bootstack/widgets/divider.py +6 -5
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/expander.py +119 -114
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/form.py +31 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/grid.py +36 -20
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/groupbox.py +56 -43
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/label.py +8 -1
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/listview.py +2 -2
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/menubutton.py +43 -42
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/numberfield.py +11 -9
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/pagestack.py +57 -46
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/passwordfield.py +2 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/pathfield.py +58 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/scrollview.py +14 -12
- bootstack-0.1.0a13/src/bootstack/widgets/sidebar_toggle.py +130 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/slider.py +33 -1
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/spinnerfield.py +26 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/splitview.py +137 -105
- bootstack-0.1.0a13/src/bootstack/widgets/stacks.py +249 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/statusbar.py +39 -19
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/tabs.py +66 -48
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/textarea.py +21 -9
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/textfield.py +10 -5
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/timefield.py +13 -19
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/toolbar.py +74 -30
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/tooltip.py +13 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/tree.py +2 -2
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/types.py +19 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/window.py +56 -25
- {bootstack-0.1.0a11 → bootstack-0.1.0a13/src/bootstack.egg-info}/PKG-INFO +43 -19
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack.egg-info/SOURCES.txt +5 -3
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack.egg-info/requires.txt +7 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/tests/test_public_surface.py +3 -3
- bootstack-0.1.0a11/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a11/src/bootstack/cli/demo.py +0 -937
- bootstack-0.1.0a11/src/bootstack/cli/icons.py +0 -327
- bootstack-0.1.0a11/src/bootstack/dialogs/_impl/colordropper.py +0 -257
- bootstack-0.1.0a11/src/bootstack/streams/__init__.py +0 -12
- bootstack-0.1.0a11/src/bootstack/widgets/_impl/composites/floodgauge.py +0 -427
- bootstack-0.1.0a11/src/bootstack/widgets/_impl/composites/tabs/tabs.py +0 -567
- bootstack-0.1.0a11/src/bootstack/widgets/appshell.py +0 -798
- bootstack-0.1.0a11/src/bootstack/widgets/stacks.py +0 -214
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/LICENSE +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/MANIFEST.in +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/NOTICE +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/setup.cfg +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/__main__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/after.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/bind.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/bindtags.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/busy.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/clipboard.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/focus.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/grab.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/grid.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/localization.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/pack.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/place.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/selection.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/signals.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/capabilities/winfo.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/colorutils.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/exceptions.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/mixins/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/mixins/ttk_state.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/mixins/widget.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/paths.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/publisher.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_core/variables.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/events.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/shortcuts.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/tk_patch.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/_runtime/window_utilities.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/bootstack.ico +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/bootstack.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/badge-pill.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/badge-square.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/button-compact.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/button-default.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/card.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/checkbox-checked.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/checkbox-indeterminate.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/checkbox-unchecked.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/field.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/input-addon-compact.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/input-addon-default.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/input-compact.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/input-default.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/list-item-separated.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/list-item.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/listrow-compact.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/listrow-default.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/manifest.toml +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/menu-item.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/navitem-compact.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/navitem-default.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/progressbar-h-compact.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/progressbar-h-default.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/progressbar-v-compact.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/progressbar-v-default.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/radiobutton.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/scrollbar-horizontal.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/scrollbar-vertical.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/slider-handle.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/slider-track-h.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/slider-track-v.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/switch-off.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/switch-on.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/tab-h.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/elements/tab-v.png +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/icons/bootstrap.ttf +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/icons/glyphmap.json +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/assets/icons/icon_metrics.json +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/__main__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/build.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/config.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/doctor.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/promote.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/pyinstaller.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/run.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/cli/start.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/clipboard.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/README.md +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/_observable.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/base.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/query.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/readers.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/sqlite_source.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/data/types.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/errors.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/events/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/events/_event.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/events/_payloads.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/events/_subscription.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/i18n/README.md +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/i18n/intl_format.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/i18n/msgcat.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/py.typed +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/scheduling/_schedule.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/signals/README.md +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/signals/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/signals/integration.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/signals/types.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/store.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/streams/_stream.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/badge.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/button.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/buttongroup.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/calendar.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/checkbutton.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/combobox.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/contextmenu.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/entry.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/expander.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/field.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/label.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/labelframe.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/listview.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/menubar.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/menubutton.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/panedwindow.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/progressbar.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/radiobutton.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/scale.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/scrollbar.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/separator.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/sidenav.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/sizegrip.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/spinbox.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/switch.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/tabitem.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/togglegroup.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/toolbutton.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/tooltip.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/treeview.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders/utils.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders_tk/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/builders_tk/defaults.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/element.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/fonts.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/style_builder_base.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/style_builder_mixed.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/style_builder_tk.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/style_builder_ttk.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/style_resolver.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/theme.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/theme_provider.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/themes/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/tk_patch.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/token_maps.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/types.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/style/utility.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/validation/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/validation/validation_result.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/app_config.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/context.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/events.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/icon_image_props.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/image_binding.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/navmodel.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/options.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/selection_group.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_core/window_controls.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/_internal/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/_internal/wrapper_base.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/_parts/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/_dateutils.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/_image_fit.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/accordion.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/dateentry.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/dropdownbutton.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/expander.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/list/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/list/listitem.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/menu/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/menu/render_native.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/menu/render_themed.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/numericentry.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/pathentry.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/radiogroup.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/scrolledtext.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/scrolledtext.pyi +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/selectbox.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/shell/rail.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/sidenav/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/sidenav/header.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/sidenav/separator.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/slider/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tableview/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tableview/types.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tabs/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tabs/tabitem.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/change.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/decoration.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/diff.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/filter.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/sidebar.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textarea/undo.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/textentry.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/toast.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/toast_stack.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/togglegroup.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tree/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tree/source_binding.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tree/treeitem.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tree/treenode.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/composites/tree/treeview.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/entry_mixin.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/localization_mixin.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/mixins/signal_mixin.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/__init__.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/_menubutton.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/badge.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/button.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/card.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/checkbutton.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/checktoggle.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/combobox.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/entry.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/label.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/labelframe.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/optionmenu.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/panedwindow.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/progressbar.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/radiobutton.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/radiotoggle.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/scrollbar.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/separator.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/sizegrip.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/spinbox.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/switch.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/_impl/primitives/treeview.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/avatar.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/boolean_controls.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/calendar.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/datatable.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/gallery.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/gauge.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/picture.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/progressbar.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/radio_variants.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/radiogroup.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/scrollbar.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/select.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/selectbutton.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/sizegrip.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/spinbox.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/theme_toggle.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/toast.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack/widgets/togglegroup.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack.egg-info/dependency_links.txt +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack.egg-info/entry_points.txt +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/src/bootstack.egg-info/top_level.txt +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/tests/test_images.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/tests/test_images_gui.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/tests/test_intl_format.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/tests/test_navmodel.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/tests/test_store.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/tests/test_theme_from_existing.py +0 -0
- {bootstack-0.1.0a11 → bootstack-0.1.0a13}/tests/test_validation_rules.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bootstack
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.0a13
|
|
4
4
|
Summary: From idea to a shipped desktop app, fast — a declarative, reactive, batteries-included Python UI framework with 60+ widgets, semantic theming, and built-in packaging.
|
|
5
5
|
Author-email: Israel Dryer <israel.dryer@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -35,6 +35,11 @@ Requires-Dist: pyarrow>=14; extra == "parquet"
|
|
|
35
35
|
Provides-Extra: hdf5
|
|
36
36
|
Requires-Dist: pandas>=2; extra == "hdf5"
|
|
37
37
|
Requires-Dist: tables>=3.8; extra == "hdf5"
|
|
38
|
+
Provides-Extra: viz
|
|
39
|
+
Requires-Dist: matplotlib>=3.8; extra == "viz"
|
|
40
|
+
Provides-Extra: viz-seaborn
|
|
41
|
+
Requires-Dist: matplotlib>=3.8; extra == "viz-seaborn"
|
|
42
|
+
Requires-Dist: seaborn>=0.13; extra == "viz-seaborn"
|
|
38
43
|
Provides-Extra: docs
|
|
39
44
|
Requires-Dist: sphinx>=7.2; extra == "docs"
|
|
40
45
|
Requires-Dist: pydata-sphinx-theme; extra == "docs"
|
|
@@ -63,11 +68,13 @@ bootstack gives engineers, data scientists, and hobbyists everything to build a
|
|
|
63
68
|
polished desktop interface and package it into a standalone executable —
|
|
64
69
|
declarative, reactive, and batteries-included, all in pure Python.
|
|
65
70
|
|
|
71
|
+
<p align="center">
|
|
66
72
|
<picture>
|
|
67
73
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-dark.png">
|
|
68
74
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
|
|
69
75
|
<img alt="bootstack hero demo" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
|
|
70
76
|
</picture>
|
|
77
|
+
</p>
|
|
71
78
|
|
|
72
79
|
## Why bootstack?
|
|
73
80
|
|
|
@@ -75,16 +82,17 @@ Most Python desktop frameworks make you fight the framework. bootstack gets out
|
|
|
75
82
|
|
|
76
83
|
- **30% less code** — the declarative, context-manager layout eliminates geometry calls, explicit parenting, and most of the wiring boilerplate
|
|
77
84
|
- **Reads like Python** — nested `with` blocks mirror your UI structure; the code hierarchy *is* the layout
|
|
78
|
-
- **Modern layout system** — `
|
|
85
|
+
- **Modern layout system** — `Row`, `Column`, and `Grid` containers handle spacing, alignment, and growth automatically; a screen-axis vocabulary (`gap`, `padding`, `margin`, `horizontal`, `vertical`, `grow`) without writing CSS
|
|
79
86
|
- **60+ widgets out of the box** — primitives through full composites: tables, trees, calendars, date pickers, gauges, sliders, and more — including a full `CodeEditor` with syntax highlighting, line numbers, bracket matching, smart indent, and search; no external editor dependency required
|
|
80
87
|
- **Reactive signals** — observable state that flows between widgets; bind once, update everywhere
|
|
81
88
|
- **Event and stream pipelines** — compose, filter, debounce, and throttle UI events with a chainable stream API
|
|
82
|
-
- **Built-in icons** — the full Bootstrap Icons catalog, theme-aware and
|
|
89
|
+
- **Built-in icons** — the full Bootstrap Icons catalog, theme-aware and recolorable, bundled with the framework
|
|
83
90
|
- **Built-in localization** — 23 language catalogs, locale-aware number/date/time formatting, runtime language switching
|
|
84
91
|
- **Semantic styling** — `accent="primary"`, `variant="outline"` — no hard-coded colors; looks right across every theme automatically
|
|
85
|
-
- **
|
|
92
|
+
- **10 paired light/dark themes** — popular dev color schemes plus Bootstrap, with a runtime switcher and a custom-theme API
|
|
86
93
|
- **Forms and validation** — field-level validators, inline error messages, and a `FormDialog` for quick modal forms
|
|
87
94
|
- **DataSource abstraction** — one interface over SQLite, in-memory, and file backends with filtering, sorting, pagination, and CRUD
|
|
95
|
+
- **Data visualization** — embed `matplotlib` (and `seaborn`) figures with `Chart`; they recolor with the theme and live-update from a `Signal` or `DataSource` (optional `viz` extra)
|
|
88
96
|
- **A real CLI** — scaffold, run, add pages/views/dialogs/themes, and package for distribution
|
|
89
97
|
- **PyInstaller packaging built in** — `bootstack build` produces a standalone executable; no separate toolchain required
|
|
90
98
|
|
|
@@ -108,11 +116,13 @@ The widget gallery is a single-window tour of everything bootstack ships — eve
|
|
|
108
116
|
bootstack gallery
|
|
109
117
|
```
|
|
110
118
|
|
|
119
|
+
<p align="center">
|
|
111
120
|
<picture>
|
|
112
121
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-dark.png">
|
|
113
122
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
|
|
114
123
|
<img alt="bootstack widget gallery" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
|
|
115
124
|
</picture>
|
|
125
|
+
</p>
|
|
116
126
|
|
|
117
127
|
## Quick Start
|
|
118
128
|
|
|
@@ -128,11 +138,13 @@ with bs.App(title="Hello", padding=16, gap=16) as app:
|
|
|
128
138
|
app.run()
|
|
129
139
|
```
|
|
130
140
|
|
|
141
|
+
<p align="center">
|
|
131
142
|
<picture>
|
|
132
143
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-dark.png">
|
|
133
144
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
|
|
134
145
|
<img alt="bootstack quick start example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
|
|
135
146
|
</picture>
|
|
147
|
+
</p>
|
|
136
148
|
|
|
137
149
|
For navigation-based apps, use `AppShell` — it gives you stacked toolbars, a sidebar, and a page stack in one call:
|
|
138
150
|
|
|
@@ -141,11 +153,11 @@ import bootstack as bs
|
|
|
141
153
|
|
|
142
154
|
shell = bs.AppShell(title="My App", size=(1000, 650))
|
|
143
155
|
|
|
144
|
-
with shell.
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
with
|
|
148
|
-
|
|
156
|
+
with shell.page_nav() as nav:
|
|
157
|
+
with nav.add_page("home", text="Home", icon="house"):
|
|
158
|
+
bs.Label("Welcome!")
|
|
159
|
+
with nav.add_page("docs", text="Documents", icon="file-earmark-text"):
|
|
160
|
+
bs.Label("Your documents.")
|
|
149
161
|
|
|
150
162
|
shell.run()
|
|
151
163
|
```
|
|
@@ -154,11 +166,11 @@ shell.run()
|
|
|
154
166
|
|
|
155
167
|
### Layout containers
|
|
156
168
|
|
|
157
|
-
`
|
|
169
|
+
`Column`, `Row`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
|
|
158
170
|
|
|
159
171
|
```python
|
|
160
172
|
with bs.App(title="Sign In") as app:
|
|
161
|
-
with bs.Grid(columns=["auto", 1], gap=(12, 6),
|
|
173
|
+
with bs.Grid(columns=["auto", 1], gap=(12, 6), horizontal_items="stretch", padding=16):
|
|
162
174
|
bs.Label("Name:")
|
|
163
175
|
bs.TextField(placeholder="Full name")
|
|
164
176
|
bs.Label("Email:")
|
|
@@ -170,11 +182,13 @@ with bs.App(title="Sign In") as app:
|
|
|
170
182
|
app.run()
|
|
171
183
|
```
|
|
172
184
|
|
|
185
|
+
<p align="center">
|
|
173
186
|
<picture>
|
|
174
187
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-dark.png">
|
|
175
188
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
|
|
176
189
|
<img alt="bootstack layout containers example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
|
|
177
190
|
</picture>
|
|
191
|
+
</p>
|
|
178
192
|
|
|
179
193
|
### Semantic styling
|
|
180
194
|
|
|
@@ -186,11 +200,13 @@ bs.Button("Cancel", accent="secondary", variant="outline")
|
|
|
186
200
|
bs.Label("Heading", font="heading-lg")
|
|
187
201
|
```
|
|
188
202
|
|
|
203
|
+
<p align="center">
|
|
189
204
|
<picture>
|
|
190
205
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-dark.png">
|
|
191
206
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
|
|
192
207
|
<img alt="bootstack semantic styling example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
|
|
193
208
|
</picture>
|
|
209
|
+
</p>
|
|
194
210
|
|
|
195
211
|
### Signals (optional)
|
|
196
212
|
|
|
@@ -207,17 +223,18 @@ app.run()
|
|
|
207
223
|
|
|
208
224
|
## Features
|
|
209
225
|
|
|
210
|
-
- **Application scaffolding** — `App` for blank windows, `AppShell` for
|
|
226
|
+
- **Application scaffolding** — `App` for blank windows, `AppShell` for toolbar + sidebar + page-stack apps, `Workbench` for two-tier workspace apps, undecorated windows with custom chrome
|
|
211
227
|
- **60+ themed widgets** — primitives plus higher-level composites (DataTable, Tree, ListView, Calendar, DateField, Form, Gauge, ToggleGroup, PageStack, Carousel, Tooltip, and more)
|
|
212
228
|
- **Dialogs and messages** — `alert()` / `confirm()` / `ask_*()` prompts and `FormDialog` / `FontDialog` / `FilterDialog`, plus non-blocking `toast()`, `Notification`, and `Snackbar` surfaces
|
|
213
|
-
- **Layout containers** — `
|
|
229
|
+
- **Layout containers** — `Column`, `Row`, `Grid`, and `Spacer` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Divider`
|
|
214
230
|
- **Design system** — semantic `accent` colors (primary, secondary, success, danger, warning, info) and `variant` tokens (solid, outline, ghost), consistent across widgets
|
|
215
|
-
- **Built-in themes** — paired light/dark variants (
|
|
231
|
+
- **Built-in themes** — 10 paired light/dark variants (bootstrap, catppuccin, dracula, everforest, gruvbox, nord, one, pydata, solarized, tokyo-night) with runtime theme switching and a custom-theme API
|
|
216
232
|
- **Reactive signals** — observable state with subscribe/set, integrates with widgets via `signal=` / `textsignal=`
|
|
217
233
|
- **Forms & validation** — `Form` with built-in field-level validators and inline error messages
|
|
218
234
|
- **DataSource** — common interface over in-memory, SQLite, and file backends, with pagination, filtering, sorting, CRUD, and CSV/TSV/Excel export
|
|
235
|
+
- **Data visualization** — `Chart` embeds `matplotlib`/`seaborn` figures that theme themselves and live-update from a `Signal` or `DataSource`; managed render, blitting animation, and a themed navigation toolbar (optional `viz` / `viz-seaborn` extras)
|
|
219
236
|
- **Localization (i18n)** — 23 bundled message catalogs, locale-aware number/date/time formatting via Babel, runtime language switching
|
|
220
|
-
- **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring
|
|
237
|
+
- **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring and caching
|
|
221
238
|
- **Platform support** — DPI awareness, multi-monitor centering, mica/acrylic effects on Windows
|
|
222
239
|
- **CLI (`bootstack`)** — project scaffolding, run, add components, theme/i18n setup, doctor, build/package
|
|
223
240
|
|
|
@@ -225,13 +242,13 @@ app.run()
|
|
|
225
242
|
|
|
226
243
|
| Category | Widgets |
|
|
227
244
|
|----------|---------|
|
|
228
|
-
| **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar |
|
|
245
|
+
| **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar, ThemeToggle |
|
|
229
246
|
| **Inputs** | TextField, PasswordField, PathField, NumberField, SpinnerField, Slider, RangeSlider, TextArea, CodeEditor, DateField, TimeField |
|
|
230
247
|
| **Selection** | Checkbox, Switch, ToggleButton, Radio, RadioGroup, ToggleGroup, Select, SelectButton, Calendar |
|
|
231
248
|
| **Data Display** | Label, Badge, ListView, Tree, DataTable, ProgressBar, Gauge |
|
|
232
249
|
| **Media** | Avatar, Picture, Gallery, Carousel |
|
|
233
|
-
| **Layout** |
|
|
234
|
-
| **Navigation** | AppShell,
|
|
250
|
+
| **Layout** | Column, Row, Grid, Spacer, Card, GroupBox, SplitView, ScrollView, Accordion, Divider |
|
|
251
|
+
| **Navigation** | AppShell, Workbench, Window, StatusBar, Tabs, PageStack |
|
|
235
252
|
| **Dialogs** | `alert()`, `confirm()`, `ask_*()` prompts, FormDialog, FontDialog, FilterDialog |
|
|
236
253
|
| **Overlays** | `toast()`, Notification, Snackbar, Tooltip |
|
|
237
254
|
| **Forms** | Form, with field-level validation |
|
|
@@ -243,14 +260,15 @@ bootstack ships with an optional CLI for scaffolding, running, and packaging app
|
|
|
243
260
|
```bash
|
|
244
261
|
bootstack gallery # Launch the interactive widget gallery
|
|
245
262
|
bootstack icons # Browse the built-in icon catalog
|
|
263
|
+
bootstack appicon # Design an app icon and export it
|
|
246
264
|
bootstack start MyApp # Create a new project (basic template)
|
|
247
265
|
bootstack start MyApp --template appshell # ...or with sidebar navigation
|
|
248
266
|
bootstack run # Run the app defined in the project config
|
|
249
267
|
bootstack add page Dashboard # Add a new page (appshell)
|
|
250
268
|
bootstack add view Settings # Add a new view (basic)
|
|
251
269
|
bootstack add dialog Preferences # Add a new dialog
|
|
252
|
-
bootstack add i18n --languages en es fr # Add i18n support
|
|
253
270
|
bootstack doctor # Diagnose project & environment
|
|
271
|
+
bootstack promote # Make the project packaging-ready
|
|
254
272
|
bootstack build # Package for distribution
|
|
255
273
|
```
|
|
256
274
|
|
|
@@ -259,6 +277,12 @@ bootstack build # Package for distribution
|
|
|
259
277
|
Full documentation — guides, the widget catalog, and the API reference — lives at
|
|
260
278
|
**[bootstack.org](https://bootstack.org)**.
|
|
261
279
|
|
|
280
|
+
## Contributing
|
|
281
|
+
|
|
282
|
+
Contributions are welcome — code, bug reports, and especially **translations**.
|
|
283
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, the pull-request
|
|
284
|
+
workflow, and how to review the bundled language catalogs.
|
|
285
|
+
|
|
262
286
|
## Links
|
|
263
287
|
|
|
264
288
|
- **GitHub**: https://github.com/israel-dryer/bootstack
|
|
@@ -18,11 +18,13 @@ bootstack gives engineers, data scientists, and hobbyists everything to build a
|
|
|
18
18
|
polished desktop interface and package it into a standalone executable —
|
|
19
19
|
declarative, reactive, and batteries-included, all in pure Python.
|
|
20
20
|
|
|
21
|
+
<p align="center">
|
|
21
22
|
<picture>
|
|
22
23
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-dark.png">
|
|
23
24
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
|
|
24
25
|
<img alt="bootstack hero demo" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
|
|
25
26
|
</picture>
|
|
27
|
+
</p>
|
|
26
28
|
|
|
27
29
|
## Why bootstack?
|
|
28
30
|
|
|
@@ -30,16 +32,17 @@ Most Python desktop frameworks make you fight the framework. bootstack gets out
|
|
|
30
32
|
|
|
31
33
|
- **30% less code** — the declarative, context-manager layout eliminates geometry calls, explicit parenting, and most of the wiring boilerplate
|
|
32
34
|
- **Reads like Python** — nested `with` blocks mirror your UI structure; the code hierarchy *is* the layout
|
|
33
|
-
- **Modern layout system** — `
|
|
35
|
+
- **Modern layout system** — `Row`, `Column`, and `Grid` containers handle spacing, alignment, and growth automatically; a screen-axis vocabulary (`gap`, `padding`, `margin`, `horizontal`, `vertical`, `grow`) without writing CSS
|
|
34
36
|
- **60+ widgets out of the box** — primitives through full composites: tables, trees, calendars, date pickers, gauges, sliders, and more — including a full `CodeEditor` with syntax highlighting, line numbers, bracket matching, smart indent, and search; no external editor dependency required
|
|
35
37
|
- **Reactive signals** — observable state that flows between widgets; bind once, update everywhere
|
|
36
38
|
- **Event and stream pipelines** — compose, filter, debounce, and throttle UI events with a chainable stream API
|
|
37
|
-
- **Built-in icons** — the full Bootstrap Icons catalog, theme-aware and
|
|
39
|
+
- **Built-in icons** — the full Bootstrap Icons catalog, theme-aware and recolorable, bundled with the framework
|
|
38
40
|
- **Built-in localization** — 23 language catalogs, locale-aware number/date/time formatting, runtime language switching
|
|
39
41
|
- **Semantic styling** — `accent="primary"`, `variant="outline"` — no hard-coded colors; looks right across every theme automatically
|
|
40
|
-
- **
|
|
42
|
+
- **10 paired light/dark themes** — popular dev color schemes plus Bootstrap, with a runtime switcher and a custom-theme API
|
|
41
43
|
- **Forms and validation** — field-level validators, inline error messages, and a `FormDialog` for quick modal forms
|
|
42
44
|
- **DataSource abstraction** — one interface over SQLite, in-memory, and file backends with filtering, sorting, pagination, and CRUD
|
|
45
|
+
- **Data visualization** — embed `matplotlib` (and `seaborn`) figures with `Chart`; they recolor with the theme and live-update from a `Signal` or `DataSource` (optional `viz` extra)
|
|
43
46
|
- **A real CLI** — scaffold, run, add pages/views/dialogs/themes, and package for distribution
|
|
44
47
|
- **PyInstaller packaging built in** — `bootstack build` produces a standalone executable; no separate toolchain required
|
|
45
48
|
|
|
@@ -63,11 +66,13 @@ The widget gallery is a single-window tour of everything bootstack ships — eve
|
|
|
63
66
|
bootstack gallery
|
|
64
67
|
```
|
|
65
68
|
|
|
69
|
+
<p align="center">
|
|
66
70
|
<picture>
|
|
67
71
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-dark.png">
|
|
68
72
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
|
|
69
73
|
<img alt="bootstack widget gallery" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
|
|
70
74
|
</picture>
|
|
75
|
+
</p>
|
|
71
76
|
|
|
72
77
|
## Quick Start
|
|
73
78
|
|
|
@@ -83,11 +88,13 @@ with bs.App(title="Hello", padding=16, gap=16) as app:
|
|
|
83
88
|
app.run()
|
|
84
89
|
```
|
|
85
90
|
|
|
91
|
+
<p align="center">
|
|
86
92
|
<picture>
|
|
87
93
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-dark.png">
|
|
88
94
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
|
|
89
95
|
<img alt="bootstack quick start example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
|
|
90
96
|
</picture>
|
|
97
|
+
</p>
|
|
91
98
|
|
|
92
99
|
For navigation-based apps, use `AppShell` — it gives you stacked toolbars, a sidebar, and a page stack in one call:
|
|
93
100
|
|
|
@@ -96,11 +103,11 @@ import bootstack as bs
|
|
|
96
103
|
|
|
97
104
|
shell = bs.AppShell(title="My App", size=(1000, 650))
|
|
98
105
|
|
|
99
|
-
with shell.
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
with
|
|
103
|
-
|
|
106
|
+
with shell.page_nav() as nav:
|
|
107
|
+
with nav.add_page("home", text="Home", icon="house"):
|
|
108
|
+
bs.Label("Welcome!")
|
|
109
|
+
with nav.add_page("docs", text="Documents", icon="file-earmark-text"):
|
|
110
|
+
bs.Label("Your documents.")
|
|
104
111
|
|
|
105
112
|
shell.run()
|
|
106
113
|
```
|
|
@@ -109,11 +116,11 @@ shell.run()
|
|
|
109
116
|
|
|
110
117
|
### Layout containers
|
|
111
118
|
|
|
112
|
-
`
|
|
119
|
+
`Column`, `Row`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
|
|
113
120
|
|
|
114
121
|
```python
|
|
115
122
|
with bs.App(title="Sign In") as app:
|
|
116
|
-
with bs.Grid(columns=["auto", 1], gap=(12, 6),
|
|
123
|
+
with bs.Grid(columns=["auto", 1], gap=(12, 6), horizontal_items="stretch", padding=16):
|
|
117
124
|
bs.Label("Name:")
|
|
118
125
|
bs.TextField(placeholder="Full name")
|
|
119
126
|
bs.Label("Email:")
|
|
@@ -125,11 +132,13 @@ with bs.App(title="Sign In") as app:
|
|
|
125
132
|
app.run()
|
|
126
133
|
```
|
|
127
134
|
|
|
135
|
+
<p align="center">
|
|
128
136
|
<picture>
|
|
129
137
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-dark.png">
|
|
130
138
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
|
|
131
139
|
<img alt="bootstack layout containers example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
|
|
132
140
|
</picture>
|
|
141
|
+
</p>
|
|
133
142
|
|
|
134
143
|
### Semantic styling
|
|
135
144
|
|
|
@@ -141,11 +150,13 @@ bs.Button("Cancel", accent="secondary", variant="outline")
|
|
|
141
150
|
bs.Label("Heading", font="heading-lg")
|
|
142
151
|
```
|
|
143
152
|
|
|
153
|
+
<p align="center">
|
|
144
154
|
<picture>
|
|
145
155
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-dark.png">
|
|
146
156
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
|
|
147
157
|
<img alt="bootstack semantic styling example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
|
|
148
158
|
</picture>
|
|
159
|
+
</p>
|
|
149
160
|
|
|
150
161
|
### Signals (optional)
|
|
151
162
|
|
|
@@ -162,17 +173,18 @@ app.run()
|
|
|
162
173
|
|
|
163
174
|
## Features
|
|
164
175
|
|
|
165
|
-
- **Application scaffolding** — `App` for blank windows, `AppShell` for
|
|
176
|
+
- **Application scaffolding** — `App` for blank windows, `AppShell` for toolbar + sidebar + page-stack apps, `Workbench` for two-tier workspace apps, undecorated windows with custom chrome
|
|
166
177
|
- **60+ themed widgets** — primitives plus higher-level composites (DataTable, Tree, ListView, Calendar, DateField, Form, Gauge, ToggleGroup, PageStack, Carousel, Tooltip, and more)
|
|
167
178
|
- **Dialogs and messages** — `alert()` / `confirm()` / `ask_*()` prompts and `FormDialog` / `FontDialog` / `FilterDialog`, plus non-blocking `toast()`, `Notification`, and `Snackbar` surfaces
|
|
168
|
-
- **Layout containers** — `
|
|
179
|
+
- **Layout containers** — `Column`, `Row`, `Grid`, and `Spacer` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Divider`
|
|
169
180
|
- **Design system** — semantic `accent` colors (primary, secondary, success, danger, warning, info) and `variant` tokens (solid, outline, ghost), consistent across widgets
|
|
170
|
-
- **Built-in themes** — paired light/dark variants (
|
|
181
|
+
- **Built-in themes** — 10 paired light/dark variants (bootstrap, catppuccin, dracula, everforest, gruvbox, nord, one, pydata, solarized, tokyo-night) with runtime theme switching and a custom-theme API
|
|
171
182
|
- **Reactive signals** — observable state with subscribe/set, integrates with widgets via `signal=` / `textsignal=`
|
|
172
183
|
- **Forms & validation** — `Form` with built-in field-level validators and inline error messages
|
|
173
184
|
- **DataSource** — common interface over in-memory, SQLite, and file backends, with pagination, filtering, sorting, CRUD, and CSV/TSV/Excel export
|
|
185
|
+
- **Data visualization** — `Chart` embeds `matplotlib`/`seaborn` figures that theme themselves and live-update from a `Signal` or `DataSource`; managed render, blitting animation, and a themed navigation toolbar (optional `viz` / `viz-seaborn` extras)
|
|
174
186
|
- **Localization (i18n)** — 23 bundled message catalogs, locale-aware number/date/time formatting via Babel, runtime language switching
|
|
175
|
-
- **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring
|
|
187
|
+
- **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring and caching
|
|
176
188
|
- **Platform support** — DPI awareness, multi-monitor centering, mica/acrylic effects on Windows
|
|
177
189
|
- **CLI (`bootstack`)** — project scaffolding, run, add components, theme/i18n setup, doctor, build/package
|
|
178
190
|
|
|
@@ -180,13 +192,13 @@ app.run()
|
|
|
180
192
|
|
|
181
193
|
| Category | Widgets |
|
|
182
194
|
|----------|---------|
|
|
183
|
-
| **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar |
|
|
195
|
+
| **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar, ThemeToggle |
|
|
184
196
|
| **Inputs** | TextField, PasswordField, PathField, NumberField, SpinnerField, Slider, RangeSlider, TextArea, CodeEditor, DateField, TimeField |
|
|
185
197
|
| **Selection** | Checkbox, Switch, ToggleButton, Radio, RadioGroup, ToggleGroup, Select, SelectButton, Calendar |
|
|
186
198
|
| **Data Display** | Label, Badge, ListView, Tree, DataTable, ProgressBar, Gauge |
|
|
187
199
|
| **Media** | Avatar, Picture, Gallery, Carousel |
|
|
188
|
-
| **Layout** |
|
|
189
|
-
| **Navigation** | AppShell,
|
|
200
|
+
| **Layout** | Column, Row, Grid, Spacer, Card, GroupBox, SplitView, ScrollView, Accordion, Divider |
|
|
201
|
+
| **Navigation** | AppShell, Workbench, Window, StatusBar, Tabs, PageStack |
|
|
190
202
|
| **Dialogs** | `alert()`, `confirm()`, `ask_*()` prompts, FormDialog, FontDialog, FilterDialog |
|
|
191
203
|
| **Overlays** | `toast()`, Notification, Snackbar, Tooltip |
|
|
192
204
|
| **Forms** | Form, with field-level validation |
|
|
@@ -198,14 +210,15 @@ bootstack ships with an optional CLI for scaffolding, running, and packaging app
|
|
|
198
210
|
```bash
|
|
199
211
|
bootstack gallery # Launch the interactive widget gallery
|
|
200
212
|
bootstack icons # Browse the built-in icon catalog
|
|
213
|
+
bootstack appicon # Design an app icon and export it
|
|
201
214
|
bootstack start MyApp # Create a new project (basic template)
|
|
202
215
|
bootstack start MyApp --template appshell # ...or with sidebar navigation
|
|
203
216
|
bootstack run # Run the app defined in the project config
|
|
204
217
|
bootstack add page Dashboard # Add a new page (appshell)
|
|
205
218
|
bootstack add view Settings # Add a new view (basic)
|
|
206
219
|
bootstack add dialog Preferences # Add a new dialog
|
|
207
|
-
bootstack add i18n --languages en es fr # Add i18n support
|
|
208
220
|
bootstack doctor # Diagnose project & environment
|
|
221
|
+
bootstack promote # Make the project packaging-ready
|
|
209
222
|
bootstack build # Package for distribution
|
|
210
223
|
```
|
|
211
224
|
|
|
@@ -214,6 +227,12 @@ bootstack build # Package for distribution
|
|
|
214
227
|
Full documentation — guides, the widget catalog, and the API reference — lives at
|
|
215
228
|
**[bootstack.org](https://bootstack.org)**.
|
|
216
229
|
|
|
230
|
+
## Contributing
|
|
231
|
+
|
|
232
|
+
Contributions are welcome — code, bug reports, and especially **translations**.
|
|
233
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, the pull-request
|
|
234
|
+
workflow, and how to review the bundled language catalogs.
|
|
235
|
+
|
|
217
236
|
## Links
|
|
218
237
|
|
|
219
238
|
- **GitHub**: https://github.com/israel-dryer/bootstack
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "bootstack"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.0a13"
|
|
8
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."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -73,6 +73,15 @@ hdf5 = [
|
|
|
73
73
|
"pandas>=2",
|
|
74
74
|
"tables>=3.8",
|
|
75
75
|
]
|
|
76
|
+
# Visualization — embed matplotlib figures in a Chart widget.
|
|
77
|
+
viz = [
|
|
78
|
+
"matplotlib>=3.8",
|
|
79
|
+
]
|
|
80
|
+
# Visualization with seaborn convenience layer on top of matplotlib.
|
|
81
|
+
viz-seaborn = [
|
|
82
|
+
"matplotlib>=3.8",
|
|
83
|
+
"seaborn>=0.13",
|
|
84
|
+
]
|
|
76
85
|
docs = [
|
|
77
86
|
"sphinx>=7.2",
|
|
78
87
|
"pydata-sphinx-theme",
|
|
@@ -100,7 +109,7 @@ where = ["src"]
|
|
|
100
109
|
]
|
|
101
110
|
|
|
102
111
|
[tool.bumpversion]
|
|
103
|
-
current_version = "0.1.
|
|
112
|
+
current_version = "0.1.0a13"
|
|
104
113
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)((?P<pre>a|b|rc)(?P<pre_n>\\d+))?"
|
|
105
114
|
serialize = [
|
|
106
115
|
"{major}.{minor}.{patch}{pre}{pre_n}",
|
|
@@ -129,9 +138,10 @@ search = "version = \"{current_version}\""
|
|
|
129
138
|
replace = "version = \"{new_version}\""
|
|
130
139
|
|
|
131
140
|
[tool.pytest.ini_options]
|
|
132
|
-
testpaths = ["tests/cli", "tests/widgets/public"]
|
|
141
|
+
testpaths = ["tests/cli", "tests/widgets/public", "tests/data"]
|
|
133
142
|
markers = [
|
|
134
143
|
"gui: requires a Tk display (deselect with -m 'not gui')",
|
|
144
|
+
"isolated: constructs its own Tk root (App/AppShell/Window kwargs); must run in a dedicated process. Run the suite via `python tests/run_gui.py`, which executes the shared-root suite once and each isolated module in its own process.",
|
|
135
145
|
]
|
|
136
146
|
|
|
137
147
|
[tool.ruff.lint]
|
|
@@ -11,9 +11,9 @@ Example:
|
|
|
11
11
|
app.run()
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
The top-level
|
|
15
|
-
widget,
|
|
16
|
-
(
|
|
14
|
+
The top-level `bootstack` namespace holds what you *compose a UI* with: every
|
|
15
|
+
widget, `App`/`AppShell`/`Window`, `Signal`, the dialog verbs
|
|
16
|
+
(`alert`/`confirm`/`ask_*`/`toast`), and `set_theme`/`toggle_theme`.
|
|
17
17
|
Framework primitives you reference *by type to configure behavior* live in
|
|
18
18
|
submodules — for example::
|
|
19
19
|
|
|
@@ -56,11 +56,11 @@ from bootstack.dialogs import (
|
|
|
56
56
|
|
|
57
57
|
# ── Application & windows ─────────────────────────────────────────────────────
|
|
58
58
|
from bootstack.widgets.app import App
|
|
59
|
-
from bootstack.widgets.appshell import AppShell
|
|
59
|
+
from bootstack.widgets.appshell import AppShell, Workbench
|
|
60
60
|
from bootstack.widgets.window import Window
|
|
61
61
|
|
|
62
62
|
# ── Public widget layer ───────────────────────────────────────────────────────
|
|
63
|
-
from bootstack.widgets.stacks import
|
|
63
|
+
from bootstack.widgets.stacks import Row, Column, Spacer
|
|
64
64
|
from bootstack.widgets.grid import Grid
|
|
65
65
|
from bootstack.widgets.boolean_controls import Checkbox, Switch, ToggleButton
|
|
66
66
|
from bootstack.widgets.theme_toggle import ThemeToggle
|
|
@@ -81,6 +81,7 @@ from bootstack.widgets.pagestack import PageStack, StackPage
|
|
|
81
81
|
from bootstack.widgets.pathfield import PathField
|
|
82
82
|
from bootstack.widgets.avatar import Avatar
|
|
83
83
|
from bootstack.widgets.carousel import Carousel
|
|
84
|
+
from bootstack.widgets.chart import Chart
|
|
84
85
|
from bootstack.widgets.gallery import Gallery
|
|
85
86
|
from bootstack.widgets.passwordfield import PasswordField
|
|
86
87
|
from bootstack.widgets.picture import Picture
|
|
@@ -90,7 +91,7 @@ from bootstack.widgets.radiogroup import RadioGroup
|
|
|
90
91
|
from bootstack.widgets.scrollview import ScrollView
|
|
91
92
|
from bootstack.widgets.select import Select
|
|
92
93
|
from bootstack.widgets.selectbutton import SelectButton
|
|
93
|
-
from bootstack.widgets.
|
|
94
|
+
from bootstack.widgets.divider import Divider
|
|
94
95
|
from bootstack.widgets.splitview import SplitView, SplitPane
|
|
95
96
|
from bootstack.widgets.slider import RangeSlider, Slider
|
|
96
97
|
from bootstack.widgets.spinnerfield import SpinnerField
|
|
@@ -127,9 +128,9 @@ __all__ = [
|
|
|
127
128
|
"ask_date_range", "ask_item", "ask_color", "ask_font", "ask_filter",
|
|
128
129
|
"ask_save_file", "ask_open_file", "ask_open_files", "ask_directory",
|
|
129
130
|
# Application & windows
|
|
130
|
-
"App", "AppShell", "Window",
|
|
131
|
+
"App", "AppShell", "Workbench", "Window",
|
|
131
132
|
# Layout
|
|
132
|
-
"
|
|
133
|
+
"Row", "Column", "Spacer", "Grid", "Card", "GroupBox", "Divider", "ScrollView",
|
|
133
134
|
"SplitView", "SplitPane", "Accordion", "AccordionSection",
|
|
134
135
|
# Actions
|
|
135
136
|
"Button", "ButtonGroup", "ThemeToggle", "MenuButton", "Toolbar", "StatusBar",
|
|
@@ -143,7 +144,7 @@ __all__ = [
|
|
|
143
144
|
# Data display
|
|
144
145
|
"Label", "Badge", "ProgressBar", "Gauge", "ListView", "DataTable", "Tree", "TreeNode",
|
|
145
146
|
# Media
|
|
146
|
-
"Picture", "Gallery", "Carousel", "Avatar",
|
|
147
|
+
"Picture", "Gallery", "Carousel", "Avatar", "Chart",
|
|
147
148
|
# Navigation
|
|
148
149
|
"PageStack", "StackPage", "Tabs", "TabPage",
|
|
149
150
|
# Overlays
|
|
@@ -354,9 +354,9 @@ class _ImageService:
|
|
|
354
354
|
LANCZOS blur at non-integer DPI scale factors (e.g., 125%, 150%).
|
|
355
355
|
|
|
356
356
|
Args:
|
|
357
|
-
name: Bootstrap icon name (e.g.,
|
|
357
|
+
name: Bootstrap icon name (e.g., `"house"`, `"arrow-right-fill"`).
|
|
358
358
|
size: Requested pixel size. Snapped to the nearest even integer.
|
|
359
|
-
color: Foreground color as a hex string (e.g.,
|
|
359
|
+
color: Foreground color as a hex string (e.g., `"#ffffff"`).
|
|
360
360
|
|
|
361
361
|
Returns:
|
|
362
362
|
A cached Tk-compatible PhotoImage for the icon.
|
|
@@ -476,10 +476,10 @@ class App(BaseWindow, WidgetCapabilitiesMixin, tkinter.Tk):
|
|
|
476
476
|
override_redirect: If `True`, creates a window without standard
|
|
477
477
|
decorations (title bar, borders, etc.).
|
|
478
478
|
center_on_screen: If True (default), center the app window on
|
|
479
|
-
the screen when
|
|
479
|
+
the screen when `mainloop()` starts.
|
|
480
480
|
on_close: Callback invoked when the user clicks the close button.
|
|
481
|
-
Return
|
|
482
|
-
to allow it. Equivalent to calling
|
|
481
|
+
Return `False` to veto the close; return `None` or `True`
|
|
482
|
+
to allow it. Equivalent to calling `add_close_handler(fn)`
|
|
483
483
|
after construction.
|
|
484
484
|
**kwargs: Additional keyword arguments to pass to the
|
|
485
485
|
underlying `tkinter.Tk` constructor.
|
|
@@ -675,6 +675,32 @@ class App(BaseWindow, WidgetCapabilitiesMixin, tkinter.Tk):
|
|
|
675
675
|
except tkinter.TclError:
|
|
676
676
|
pass
|
|
677
677
|
clear_current_app(self)
|
|
678
|
+
# Drop every process-wide cache that holds a Tk object bound to THIS
|
|
679
|
+
# root's interpreter — the Style singleton, the named/derived font
|
|
680
|
+
# caches, the nine-patch PhotoImage cache, and the visual-focus root
|
|
681
|
+
# ref. This must happen *before* super().destroy(): those cached
|
|
682
|
+
# PhotoImage/TkFont objects run `image delete`/`font delete` in their
|
|
683
|
+
# finalizers, and if they outlive the interpreter that owns them the
|
|
684
|
+
# call lands on a foreign/dead interpreter — a native crash in ttk
|
|
685
|
+
# element_create on the *next* root (the C layer, so Python can't catch
|
|
686
|
+
# it). Releasing + gc.collect() while this root is still alive lets the
|
|
687
|
+
# finalizers run cleanly. Only when no other App is live (single-App is
|
|
688
|
+
# the norm; this also lets the GUI test suite run module-after-module in
|
|
689
|
+
# one process, and fixes reopen-an-app-after-close in production).
|
|
690
|
+
if not has_current_app():
|
|
691
|
+
try:
|
|
692
|
+
import gc
|
|
693
|
+
from bootstack.style.style import reset_style
|
|
694
|
+
from bootstack.style.typography import Typography
|
|
695
|
+
from bootstack._core.images import _ImageService
|
|
696
|
+
from bootstack._runtime.visual_focus import reset_visual_focus_root
|
|
697
|
+
reset_style()
|
|
698
|
+
Typography.reset()
|
|
699
|
+
_ImageService.clear_cache()
|
|
700
|
+
reset_visual_focus_root()
|
|
701
|
+
gc.collect()
|
|
702
|
+
except Exception:
|
|
703
|
+
pass
|
|
678
704
|
super().destroy()
|
|
679
705
|
|
|
680
706
|
# ----- Window state persistence ------------------------------------------
|