bootstack 0.1.0a10__tar.gz → 0.1.0a12__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.0a10/src/bootstack.egg-info → bootstack-0.1.0a12}/PKG-INFO +37 -20
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/README.md +36 -19
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/pyproject.toml +2 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/__init__.py +11 -10
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/__init__.py +3 -13
- bootstack-0.1.0a12/src/bootstack/_core/exceptions.py +25 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/images.py +2 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_runtime/app.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_runtime/base_window.py +37 -17
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_runtime/tk_patch.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_runtime/toplevel.py +14 -14
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_runtime/utility.py +69 -3
- bootstack-0.1.0a12/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +3 -0
- bootstack-0.1.0a12/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +3 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/cli/add.py +5 -4
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/cli/appicon.py +24 -23
- bootstack-0.1.0a12/src/bootstack/cli/demo.py +564 -0
- bootstack-0.1.0a12/src/bootstack/cli/icons.py +98 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/cli/templates/__init__.py +68 -65
- bootstack-0.1.0a12/src/bootstack/clipboard.py +48 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/constants.py +11 -12
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/data/file_source.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/data/memory_source.py +34 -14
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/data/writers.py +1 -1
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/dialogs/__init__.py +13 -12
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/__init__.py +10 -14
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/colorchooser.py +82 -33
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/datedialog.py +43 -19
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/dialog.py +63 -9
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/filterdialog.py +16 -11
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/fontdialog.py +3 -16
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/formdialog.py +25 -6
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/message.py +6 -5
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/dialogs/_impl/query.py +1 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/errors.py +27 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/i18n/__init__.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/i18n/catalog.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/i18n/specs.py +2 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/images.py +18 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/scheduling/__init__.py +2 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/shortcuts.py +2 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/signals/signal.py +42 -20
- bootstack-0.1.0a12/src/bootstack/streams/__init__.py +12 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/__init__.py +1 -1
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/badge.py +6 -6
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/button.py +10 -10
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/buttongroup.py +8 -8
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/calendar.py +9 -9
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/checkbutton.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/combobox.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/contextmenu.py +11 -11
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/entry.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/expander.py +9 -9
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/field.py +13 -13
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/frame.py +14 -6
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/label.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/labelframe.py +4 -4
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/listview.py +27 -27
- bootstack-0.1.0a12/src/bootstack/style/builders/menubar.py +91 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/menubutton.py +11 -11
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/panedwindow.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/progressbar.py +6 -6
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/radiobutton.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/scale.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/scrollbar.py +9 -9
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/separator.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/sidenav.py +21 -21
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/sizegrip.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/spinbox.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/switch.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/tabitem.py +11 -11
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/togglegroup.py +8 -8
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/toolbutton.py +8 -8
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/tooltip.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/treeview.py +4 -4
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders/utils.py +21 -21
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders_tk/__init__.py +1 -1
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/builders_tk/defaults.py +33 -33
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/style.py +16 -16
- bootstack-0.1.0a10/src/bootstack/style/bootstyle_builder_base.py → bootstack-0.1.0a12/src/bootstack/style/style_builder_base.py +3 -3
- bootstack-0.1.0a10/src/bootstack/style/bootstyle_builder_mixed.py → bootstack-0.1.0a12/src/bootstack/style/style_builder_mixed.py +5 -5
- bootstack-0.1.0a10/src/bootstack/style/bootstyle_builder_tk.py → bootstack-0.1.0a12/src/bootstack/style/style_builder_tk.py +7 -7
- bootstack-0.1.0a10/src/bootstack/style/bootstyle_builder_ttk.py → bootstack-0.1.0a12/src/bootstack/style/style_builder_ttk.py +26 -26
- bootstack-0.1.0a10/src/bootstack/style/bootstyle.py → bootstack-0.1.0a12/src/bootstack/style/style_resolver.py +15 -97
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/theme.py +62 -1
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/theme_provider.py +1 -1
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/typography.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/types.py +4 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/validation/types.py +4 -4
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/validation/validation_rules.py +70 -4
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/__init__.py +6 -5
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/base.py +58 -28
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/container.py +133 -1
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/field_mixin.py +81 -9
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/navmodel.py +13 -9
- bootstack-0.1.0a12/src/bootstack/widgets/_core/window_menu.py +230 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/_internal/wrapper_base.py +14 -16
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/_parts/numberentry_part.py +31 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/_parts/spinnerentry_part.py +51 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/_parts/textentry_part.py +26 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/avatar.py +1 -1
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/buttongroup.py +4 -4
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/calendar.py +30 -15
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/carousel.py +15 -1
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/compositeframe.py +2 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/contextmenu.py +50 -13
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/dropdownbutton.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/field.py +24 -14
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/form.py +63 -27
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/gallery.py +63 -4
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/list/listview.py +7 -14
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/menu/model.py +4 -4
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/menu/render_themed.py +55 -47
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/meter.py +20 -9
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/pagestack.py +23 -9
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/passwordentry.py +12 -1
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/picture.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/radiogroup.py +4 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/scrollview.py +3 -4
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/content_host.py +8 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/layout.py +30 -34
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/nav_panel.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/providers.py +3 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/shell.py +17 -4
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/workspace.py +16 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/slider/_shared.py +34 -8
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/slider/rangeslider.py +186 -57
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/slider/slider.py +141 -49
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/spinnerentry.py +8 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tableview/tableview.py +72 -32
- bootstack-0.1.0a12/src/bootstack/widgets/_impl/composites/tabs/tabs.py +974 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tabs/tabview.py +42 -22
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/core.py +35 -4
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +17 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +2 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/search_overlay.py +22 -1
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/style_registry.py +25 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/textarea.py +33 -1
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/timeentry.py +15 -11
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/togglegroup.py +6 -5
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/toolbar.py +224 -25
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tooltip.py +83 -10
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/configure_mixin.py +12 -12
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/font_mixin.py +5 -5
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/icon_mixin.py +5 -5
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/validation_mixin.py +17 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/_menubutton.py +2 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/combobox.py +2 -2
- bootstack-0.1.0a12/src/bootstack/widgets/_impl/primitives/flexframe.py +448 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/frame.py +53 -10
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/gridframe.py +25 -6
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/optionmenu.py +6 -6
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/packframe.py +5 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/app.py +51 -45
- bootstack-0.1.0a12/src/bootstack/widgets/appshell.py +1046 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/button.py +51 -13
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/buttongroup.py +1 -1
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/card.py +56 -43
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/carousel.py +11 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/codeeditor.py +20 -5
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/contextmenu.py +11 -8
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/datefield.py +11 -17
- bootstack-0.1.0a10/src/bootstack/widgets/separator.py → bootstack-0.1.0a12/src/bootstack/widgets/divider.py +6 -5
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/expander.py +119 -114
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/form.py +31 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/gallery.py +6 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/grid.py +36 -20
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/groupbox.py +56 -43
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/label.py +5 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/listview.py +2 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/menubutton.py +43 -42
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/numberfield.py +11 -9
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/pagestack.py +71 -47
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/passwordfield.py +2 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/pathfield.py +58 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/scrollview.py +14 -12
- bootstack-0.1.0a12/src/bootstack/widgets/sidebar_toggle.py +130 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/slider.py +33 -1
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/spinnerfield.py +26 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/splitview.py +137 -105
- bootstack-0.1.0a12/src/bootstack/widgets/stacks.py +249 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/statusbar.py +46 -14
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/tabs.py +92 -52
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/textarea.py +5 -3
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/textfield.py +10 -5
- bootstack-0.1.0a12/src/bootstack/widgets/theme_toggle.py +92 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/timefield.py +13 -19
- bootstack-0.1.0a12/src/bootstack/widgets/toolbar.py +324 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/tooltip.py +13 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/tree.py +2 -2
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/types.py +21 -8
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/window.py +56 -40
- {bootstack-0.1.0a10 → bootstack-0.1.0a12/src/bootstack.egg-info}/PKG-INFO +37 -20
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack.egg-info/SOURCES.txt +12 -9
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/tests/test_navmodel.py +6 -5
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/tests/test_public_surface.py +8 -6
- bootstack-0.1.0a12/tests/test_theme_from_existing.py +64 -0
- bootstack-0.1.0a10/src/bootstack/_core/exceptions.py +0 -95
- bootstack-0.1.0a10/src/bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
- bootstack-0.1.0a10/src/bootstack/cli/demo.py +0 -923
- bootstack-0.1.0a10/src/bootstack/cli/icons.py +0 -327
- bootstack-0.1.0a10/src/bootstack/dialogs/_impl/colordropper.py +0 -257
- bootstack-0.1.0a10/src/bootstack/streams/__init__.py +0 -12
- bootstack-0.1.0a10/src/bootstack/style/builders/menubar.py +0 -74
- bootstack-0.1.0a10/src/bootstack/widgets/_core/window_menu.py +0 -299
- bootstack-0.1.0a10/src/bootstack/widgets/_impl/composites/floodgauge.py +0 -427
- bootstack-0.1.0a10/src/bootstack/widgets/_impl/composites/tabs/tabs.py +0 -565
- bootstack-0.1.0a10/src/bootstack/widgets/appshell.py +0 -815
- bootstack-0.1.0a10/src/bootstack/widgets/commandbar.py +0 -177
- bootstack-0.1.0a10/src/bootstack/widgets/stacks.py +0 -214
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/LICENSE +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/MANIFEST.in +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/NOTICE +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/setup.cfg +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/__main__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/after.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/bind.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/bindtags.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/busy.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/clipboard.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/focus.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/grab.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/grid.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/localization.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/pack.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/place.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/selection.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/signals.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/capabilities/winfo.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/colorutils.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/mixins/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/mixins/ttk_state.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/mixins/widget.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/paths.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/publisher.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_core/variables.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_runtime/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_runtime/events.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_runtime/shortcuts.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_runtime/visual_focus.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/_runtime/window_utilities.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/bootstack.ico +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/bootstack.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/badge-pill.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/badge-square.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/button-compact.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/button-default.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/card.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/checkbox-checked.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/checkbox-indeterminate.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/checkbox-unchecked.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/field.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/input-addon-compact.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/input-addon-default.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/input-compact.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/input-default.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/list-item-separated.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/list-item.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/listrow-compact.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/listrow-default.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/manifest.toml +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/menu-item.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/navitem-compact.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/navitem-default.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/progressbar-h-compact.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/progressbar-h-default.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/progressbar-v-compact.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/progressbar-v-default.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/radiobutton.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/scrollbar-horizontal.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/scrollbar-vertical.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/slider-handle.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/slider-track-h.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/slider-track-v.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/switch-off.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/switch-on.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/tab-h.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/elements/tab-v.png +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/icons/bootstrap.ttf +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/icons/glyphmap.json +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/assets/icons/icon_metrics.json +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/cli/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/cli/__main__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/cli/build.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/cli/config.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/cli/doctor.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/cli/promote.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/cli/pyinstaller.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/cli/run.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/cli/start.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/data/README.md +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/data/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/data/_observable.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/data/base.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/data/query.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/data/readers.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/data/sqlite_source.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/data/types.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/events/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/events/_event.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/events/_payloads.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/events/_subscription.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/i18n/README.md +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/i18n/intl_format.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/i18n/msgcat.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/py.typed +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/scheduling/_schedule.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/signals/README.md +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/signals/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/signals/integration.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/signals/types.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/store.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/streams/_stream.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/element.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/fonts.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/themes/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/tk_patch.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/token_maps.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/types.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/style/utility.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/validation/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/validation/validation_result.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/app_config.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/context.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/events.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/icon_image_props.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/image_binding.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/options.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/selection_group.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_core/window_controls.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/_internal/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/_parts/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/_dateutils.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/_image_fit.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/accordion.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/dateentry.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/expander.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/list/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/list/listitem.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/menu/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/menu/render_native.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/numericentry.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/pathentry.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/scrolledtext.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/scrolledtext.pyi +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/selectbox.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/shell/rail.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/sidenav/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/sidenav/header.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/sidenav/separator.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/slider/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tableview/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tableview/types.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tabs/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tabs/tabitem.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/change.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/codeeditor.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/decoration.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/diff.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/filter.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/sidebar.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textarea/undo.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/textentry.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/toast.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/toast_stack.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tree/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tree/source_binding.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tree/treeitem.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tree/treenode.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/composites/tree/treeview.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/entry_mixin.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/localization_mixin.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/mixins/signal_mixin.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/__init__.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/badge.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/button.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/card.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/checkbutton.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/checktoggle.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/entry.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/label.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/labelframe.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/panedwindow.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/progressbar.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/radiobutton.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/radiotoggle.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/scrollbar.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/separator.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/sizegrip.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/spinbox.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/switch.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/_impl/primitives/treeview.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/avatar.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/boolean_controls.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/calendar.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/datatable.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/gauge.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/picture.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/progressbar.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/radio_variants.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/radiogroup.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/scrollbar.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/select.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/selectbutton.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/sizegrip.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/spinbox.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/toast.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack/widgets/togglegroup.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack.egg-info/dependency_links.txt +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack.egg-info/entry_points.txt +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack.egg-info/requires.txt +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/src/bootstack.egg-info/top_level.txt +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/tests/test_images.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/tests/test_images_gui.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/tests/test_intl_format.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/tests/test_store.py +0 -0
- {bootstack-0.1.0a10 → bootstack-0.1.0a12}/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.0a12
|
|
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
|
|
@@ -63,11 +63,13 @@ bootstack gives engineers, data scientists, and hobbyists everything to build a
|
|
|
63
63
|
polished desktop interface and package it into a standalone executable —
|
|
64
64
|
declarative, reactive, and batteries-included, all in pure Python.
|
|
65
65
|
|
|
66
|
+
<p align="center">
|
|
66
67
|
<picture>
|
|
67
68
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-dark.png">
|
|
68
69
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
|
|
69
70
|
<img alt="bootstack hero demo" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/hero-light.png">
|
|
70
71
|
</picture>
|
|
72
|
+
</p>
|
|
71
73
|
|
|
72
74
|
## Why bootstack?
|
|
73
75
|
|
|
@@ -75,14 +77,14 @@ Most Python desktop frameworks make you fight the framework. bootstack gets out
|
|
|
75
77
|
|
|
76
78
|
- **30% less code** — the declarative, context-manager layout eliminates geometry calls, explicit parenting, and most of the wiring boilerplate
|
|
77
79
|
- **Reads like Python** — nested `with` blocks mirror your UI structure; the code hierarchy *is* the layout
|
|
78
|
-
- **Modern layout system** — `
|
|
80
|
+
- **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
81
|
- **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
82
|
- **Reactive signals** — observable state that flows between widgets; bind once, update everywhere
|
|
81
83
|
- **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
|
|
84
|
+
- **Built-in icons** — the full Bootstrap Icons catalog, theme-aware and recolorable, bundled with the framework
|
|
83
85
|
- **Built-in localization** — 23 language catalogs, locale-aware number/date/time formatting, runtime language switching
|
|
84
86
|
- **Semantic styling** — `accent="primary"`, `variant="outline"` — no hard-coded colors; looks right across every theme automatically
|
|
85
|
-
- **
|
|
87
|
+
- **10 paired light/dark themes** — popular dev color schemes plus Bootstrap, with a runtime switcher and a custom-theme API
|
|
86
88
|
- **Forms and validation** — field-level validators, inline error messages, and a `FormDialog` for quick modal forms
|
|
87
89
|
- **DataSource abstraction** — one interface over SQLite, in-memory, and file backends with filtering, sorting, pagination, and CRUD
|
|
88
90
|
- **A real CLI** — scaffold, run, add pages/views/dialogs/themes, and package for distribution
|
|
@@ -108,11 +110,13 @@ The widget gallery is a single-window tour of everything bootstack ships — eve
|
|
|
108
110
|
bootstack gallery
|
|
109
111
|
```
|
|
110
112
|
|
|
113
|
+
<p align="center">
|
|
111
114
|
<picture>
|
|
112
115
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-dark.png">
|
|
113
116
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
|
|
114
117
|
<img alt="bootstack widget gallery" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
|
|
115
118
|
</picture>
|
|
119
|
+
</p>
|
|
116
120
|
|
|
117
121
|
## Quick Start
|
|
118
122
|
|
|
@@ -128,24 +132,26 @@ with bs.App(title="Hello", padding=16, gap=16) as app:
|
|
|
128
132
|
app.run()
|
|
129
133
|
```
|
|
130
134
|
|
|
135
|
+
<p align="center">
|
|
131
136
|
<picture>
|
|
132
137
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-dark.png">
|
|
133
138
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
|
|
134
139
|
<img alt="bootstack quick start example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
|
|
135
140
|
</picture>
|
|
141
|
+
</p>
|
|
136
142
|
|
|
137
|
-
For navigation-based apps, use `AppShell` — it gives you
|
|
143
|
+
For navigation-based apps, use `AppShell` — it gives you stacked toolbars, a sidebar, and a page stack in one call:
|
|
138
144
|
|
|
139
145
|
```python
|
|
140
146
|
import bootstack as bs
|
|
141
147
|
|
|
142
148
|
shell = bs.AppShell(title="My App", size=(1000, 650))
|
|
143
149
|
|
|
144
|
-
with shell.
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
with
|
|
148
|
-
|
|
150
|
+
with shell.page_nav() as nav:
|
|
151
|
+
with nav.add_page("home", text="Home", icon="house"):
|
|
152
|
+
bs.Label("Welcome!")
|
|
153
|
+
with nav.add_page("docs", text="Documents", icon="file-earmark-text"):
|
|
154
|
+
bs.Label("Your documents.")
|
|
149
155
|
|
|
150
156
|
shell.run()
|
|
151
157
|
```
|
|
@@ -154,11 +160,11 @@ shell.run()
|
|
|
154
160
|
|
|
155
161
|
### Layout containers
|
|
156
162
|
|
|
157
|
-
`
|
|
163
|
+
`Column`, `Row`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
|
|
158
164
|
|
|
159
165
|
```python
|
|
160
166
|
with bs.App(title="Sign In") as app:
|
|
161
|
-
with bs.Grid(columns=["auto", 1], gap=(12, 6),
|
|
167
|
+
with bs.Grid(columns=["auto", 1], gap=(12, 6), horizontal_items="stretch", padding=16):
|
|
162
168
|
bs.Label("Name:")
|
|
163
169
|
bs.TextField(placeholder="Full name")
|
|
164
170
|
bs.Label("Email:")
|
|
@@ -170,11 +176,13 @@ with bs.App(title="Sign In") as app:
|
|
|
170
176
|
app.run()
|
|
171
177
|
```
|
|
172
178
|
|
|
179
|
+
<p align="center">
|
|
173
180
|
<picture>
|
|
174
181
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-dark.png">
|
|
175
182
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
|
|
176
183
|
<img alt="bootstack layout containers example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
|
|
177
184
|
</picture>
|
|
185
|
+
</p>
|
|
178
186
|
|
|
179
187
|
### Semantic styling
|
|
180
188
|
|
|
@@ -186,11 +194,13 @@ bs.Button("Cancel", accent="secondary", variant="outline")
|
|
|
186
194
|
bs.Label("Heading", font="heading-lg")
|
|
187
195
|
```
|
|
188
196
|
|
|
197
|
+
<p align="center">
|
|
189
198
|
<picture>
|
|
190
199
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-dark.png">
|
|
191
200
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
|
|
192
201
|
<img alt="bootstack semantic styling example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
|
|
193
202
|
</picture>
|
|
203
|
+
</p>
|
|
194
204
|
|
|
195
205
|
### Signals (optional)
|
|
196
206
|
|
|
@@ -207,17 +217,17 @@ app.run()
|
|
|
207
217
|
|
|
208
218
|
## Features
|
|
209
219
|
|
|
210
|
-
- **Application scaffolding** — `App` for blank windows, `AppShell` for
|
|
220
|
+
- **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
221
|
- **60+ themed widgets** — primitives plus higher-level composites (DataTable, Tree, ListView, Calendar, DateField, Form, Gauge, ToggleGroup, PageStack, Carousel, Tooltip, and more)
|
|
212
222
|
- **Dialogs and messages** — `alert()` / `confirm()` / `ask_*()` prompts and `FormDialog` / `FontDialog` / `FilterDialog`, plus non-blocking `toast()`, `Notification`, and `Snackbar` surfaces
|
|
213
|
-
- **Layout containers** — `
|
|
223
|
+
- **Layout containers** — `Column`, `Row`, `Grid`, and `Spacer` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Divider`
|
|
214
224
|
- **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 (
|
|
225
|
+
- **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
226
|
- **Reactive signals** — observable state with subscribe/set, integrates with widgets via `signal=` / `textsignal=`
|
|
217
227
|
- **Forms & validation** — `Form` with built-in field-level validators and inline error messages
|
|
218
228
|
- **DataSource** — common interface over in-memory, SQLite, and file backends, with pagination, filtering, sorting, CRUD, and CSV/TSV/Excel export
|
|
219
229
|
- **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
|
|
230
|
+
- **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring and caching
|
|
221
231
|
- **Platform support** — DPI awareness, multi-monitor centering, mica/acrylic effects on Windows
|
|
222
232
|
- **CLI (`bootstack`)** — project scaffolding, run, add components, theme/i18n setup, doctor, build/package
|
|
223
233
|
|
|
@@ -225,13 +235,13 @@ app.run()
|
|
|
225
235
|
|
|
226
236
|
| Category | Widgets |
|
|
227
237
|
|----------|---------|
|
|
228
|
-
| **Actions** | Button, ButtonGroup, MenuButton, ContextMenu,
|
|
238
|
+
| **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar, ThemeToggle |
|
|
229
239
|
| **Inputs** | TextField, PasswordField, PathField, NumberField, SpinnerField, Slider, RangeSlider, TextArea, CodeEditor, DateField, TimeField |
|
|
230
240
|
| **Selection** | Checkbox, Switch, ToggleButton, Radio, RadioGroup, ToggleGroup, Select, SelectButton, Calendar |
|
|
231
241
|
| **Data Display** | Label, Badge, ListView, Tree, DataTable, ProgressBar, Gauge |
|
|
232
242
|
| **Media** | Avatar, Picture, Gallery, Carousel |
|
|
233
|
-
| **Layout** |
|
|
234
|
-
| **Navigation** | AppShell,
|
|
243
|
+
| **Layout** | Column, Row, Grid, Spacer, Card, GroupBox, SplitView, ScrollView, Accordion, Divider |
|
|
244
|
+
| **Navigation** | AppShell, Workbench, Window, StatusBar, Tabs, PageStack |
|
|
235
245
|
| **Dialogs** | `alert()`, `confirm()`, `ask_*()` prompts, FormDialog, FontDialog, FilterDialog |
|
|
236
246
|
| **Overlays** | `toast()`, Notification, Snackbar, Tooltip |
|
|
237
247
|
| **Forms** | Form, with field-level validation |
|
|
@@ -243,14 +253,15 @@ bootstack ships with an optional CLI for scaffolding, running, and packaging app
|
|
|
243
253
|
```bash
|
|
244
254
|
bootstack gallery # Launch the interactive widget gallery
|
|
245
255
|
bootstack icons # Browse the built-in icon catalog
|
|
256
|
+
bootstack appicon # Design an app icon and export it
|
|
246
257
|
bootstack start MyApp # Create a new project (basic template)
|
|
247
258
|
bootstack start MyApp --template appshell # ...or with sidebar navigation
|
|
248
259
|
bootstack run # Run the app defined in the project config
|
|
249
260
|
bootstack add page Dashboard # Add a new page (appshell)
|
|
250
261
|
bootstack add view Settings # Add a new view (basic)
|
|
251
262
|
bootstack add dialog Preferences # Add a new dialog
|
|
252
|
-
bootstack add i18n --languages en es fr # Add i18n support
|
|
253
263
|
bootstack doctor # Diagnose project & environment
|
|
264
|
+
bootstack promote # Make the project packaging-ready
|
|
254
265
|
bootstack build # Package for distribution
|
|
255
266
|
```
|
|
256
267
|
|
|
@@ -259,6 +270,12 @@ bootstack build # Package for distribution
|
|
|
259
270
|
Full documentation — guides, the widget catalog, and the API reference — lives at
|
|
260
271
|
**[bootstack.org](https://bootstack.org)**.
|
|
261
272
|
|
|
273
|
+
## Contributing
|
|
274
|
+
|
|
275
|
+
Contributions are welcome — code, bug reports, and especially **translations**.
|
|
276
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, the pull-request
|
|
277
|
+
workflow, and how to review the bundled language catalogs.
|
|
278
|
+
|
|
262
279
|
## Links
|
|
263
280
|
|
|
264
281
|
- **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,14 +32,14 @@ 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
|
|
43
45
|
- **A real CLI** — scaffold, run, add pages/views/dialogs/themes, and package for distribution
|
|
@@ -63,11 +65,13 @@ The widget gallery is a single-window tour of everything bootstack ships — eve
|
|
|
63
65
|
bootstack gallery
|
|
64
66
|
```
|
|
65
67
|
|
|
68
|
+
<p align="center">
|
|
66
69
|
<picture>
|
|
67
70
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-dark.png">
|
|
68
71
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
|
|
69
72
|
<img alt="bootstack widget gallery" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/gallery-light.png">
|
|
70
73
|
</picture>
|
|
74
|
+
</p>
|
|
71
75
|
|
|
72
76
|
## Quick Start
|
|
73
77
|
|
|
@@ -83,24 +87,26 @@ with bs.App(title="Hello", padding=16, gap=16) as app:
|
|
|
83
87
|
app.run()
|
|
84
88
|
```
|
|
85
89
|
|
|
90
|
+
<p align="center">
|
|
86
91
|
<picture>
|
|
87
92
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-dark.png">
|
|
88
93
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
|
|
89
94
|
<img alt="bootstack quick start example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-quickstart-light.png">
|
|
90
95
|
</picture>
|
|
96
|
+
</p>
|
|
91
97
|
|
|
92
|
-
For navigation-based apps, use `AppShell` — it gives you
|
|
98
|
+
For navigation-based apps, use `AppShell` — it gives you stacked toolbars, a sidebar, and a page stack in one call:
|
|
93
99
|
|
|
94
100
|
```python
|
|
95
101
|
import bootstack as bs
|
|
96
102
|
|
|
97
103
|
shell = bs.AppShell(title="My App", size=(1000, 650))
|
|
98
104
|
|
|
99
|
-
with shell.
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
with
|
|
103
|
-
|
|
105
|
+
with shell.page_nav() as nav:
|
|
106
|
+
with nav.add_page("home", text="Home", icon="house"):
|
|
107
|
+
bs.Label("Welcome!")
|
|
108
|
+
with nav.add_page("docs", text="Documents", icon="file-earmark-text"):
|
|
109
|
+
bs.Label("Your documents.")
|
|
104
110
|
|
|
105
111
|
shell.run()
|
|
106
112
|
```
|
|
@@ -109,11 +115,11 @@ shell.run()
|
|
|
109
115
|
|
|
110
116
|
### Layout containers
|
|
111
117
|
|
|
112
|
-
`
|
|
118
|
+
`Column`, `Row`, and `Grid` let you describe a layout once instead of repeating geometry calls on each child:
|
|
113
119
|
|
|
114
120
|
```python
|
|
115
121
|
with bs.App(title="Sign In") as app:
|
|
116
|
-
with bs.Grid(columns=["auto", 1], gap=(12, 6),
|
|
122
|
+
with bs.Grid(columns=["auto", 1], gap=(12, 6), horizontal_items="stretch", padding=16):
|
|
117
123
|
bs.Label("Name:")
|
|
118
124
|
bs.TextField(placeholder="Full name")
|
|
119
125
|
bs.Label("Email:")
|
|
@@ -125,11 +131,13 @@ with bs.App(title="Sign In") as app:
|
|
|
125
131
|
app.run()
|
|
126
132
|
```
|
|
127
133
|
|
|
134
|
+
<p align="center">
|
|
128
135
|
<picture>
|
|
129
136
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-dark.png">
|
|
130
137
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
|
|
131
138
|
<img alt="bootstack layout containers example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-layout-light.png">
|
|
132
139
|
</picture>
|
|
140
|
+
</p>
|
|
133
141
|
|
|
134
142
|
### Semantic styling
|
|
135
143
|
|
|
@@ -141,11 +149,13 @@ bs.Button("Cancel", accent="secondary", variant="outline")
|
|
|
141
149
|
bs.Label("Heading", font="heading-lg")
|
|
142
150
|
```
|
|
143
151
|
|
|
152
|
+
<p align="center">
|
|
144
153
|
<picture>
|
|
145
154
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-dark.png">
|
|
146
155
|
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
|
|
147
156
|
<img alt="bootstack semantic styling example" src="https://raw.githubusercontent.com/israel-dryer/bootstack/main/assets/readme/ex-semantic-styling-light.png">
|
|
148
157
|
</picture>
|
|
158
|
+
</p>
|
|
149
159
|
|
|
150
160
|
### Signals (optional)
|
|
151
161
|
|
|
@@ -162,17 +172,17 @@ app.run()
|
|
|
162
172
|
|
|
163
173
|
## Features
|
|
164
174
|
|
|
165
|
-
- **Application scaffolding** — `App` for blank windows, `AppShell` for
|
|
175
|
+
- **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
176
|
- **60+ themed widgets** — primitives plus higher-level composites (DataTable, Tree, ListView, Calendar, DateField, Form, Gauge, ToggleGroup, PageStack, Carousel, Tooltip, and more)
|
|
167
177
|
- **Dialogs and messages** — `alert()` / `confirm()` / `ask_*()` prompts and `FormDialog` / `FontDialog` / `FilterDialog`, plus non-blocking `toast()`, `Notification`, and `Snackbar` surfaces
|
|
168
|
-
- **Layout containers** — `
|
|
178
|
+
- **Layout containers** — `Column`, `Row`, `Grid`, and `Spacer` for declarative layouts; `Card`, `GroupBox`, `ScrollView`, `SplitView`, `Accordion`, `Divider`
|
|
169
179
|
- **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 (
|
|
180
|
+
- **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
181
|
- **Reactive signals** — observable state with subscribe/set, integrates with widgets via `signal=` / `textsignal=`
|
|
172
182
|
- **Forms & validation** — `Form` with built-in field-level validators and inline error messages
|
|
173
183
|
- **DataSource** — common interface over in-memory, SQLite, and file backends, with pagination, filtering, sorting, CRUD, and CSV/TSV/Excel export
|
|
174
184
|
- **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
|
|
185
|
+
- **Icons & images** — Bootstrap Icons catalog with theme-aware recoloring and caching
|
|
176
186
|
- **Platform support** — DPI awareness, multi-monitor centering, mica/acrylic effects on Windows
|
|
177
187
|
- **CLI (`bootstack`)** — project scaffolding, run, add components, theme/i18n setup, doctor, build/package
|
|
178
188
|
|
|
@@ -180,13 +190,13 @@ app.run()
|
|
|
180
190
|
|
|
181
191
|
| Category | Widgets |
|
|
182
192
|
|----------|---------|
|
|
183
|
-
| **Actions** | Button, ButtonGroup, MenuButton, ContextMenu,
|
|
193
|
+
| **Actions** | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar, ThemeToggle |
|
|
184
194
|
| **Inputs** | TextField, PasswordField, PathField, NumberField, SpinnerField, Slider, RangeSlider, TextArea, CodeEditor, DateField, TimeField |
|
|
185
195
|
| **Selection** | Checkbox, Switch, ToggleButton, Radio, RadioGroup, ToggleGroup, Select, SelectButton, Calendar |
|
|
186
196
|
| **Data Display** | Label, Badge, ListView, Tree, DataTable, ProgressBar, Gauge |
|
|
187
197
|
| **Media** | Avatar, Picture, Gallery, Carousel |
|
|
188
|
-
| **Layout** |
|
|
189
|
-
| **Navigation** | AppShell,
|
|
198
|
+
| **Layout** | Column, Row, Grid, Spacer, Card, GroupBox, SplitView, ScrollView, Accordion, Divider |
|
|
199
|
+
| **Navigation** | AppShell, Workbench, Window, StatusBar, Tabs, PageStack |
|
|
190
200
|
| **Dialogs** | `alert()`, `confirm()`, `ask_*()` prompts, FormDialog, FontDialog, FilterDialog |
|
|
191
201
|
| **Overlays** | `toast()`, Notification, Snackbar, Tooltip |
|
|
192
202
|
| **Forms** | Form, with field-level validation |
|
|
@@ -198,14 +208,15 @@ bootstack ships with an optional CLI for scaffolding, running, and packaging app
|
|
|
198
208
|
```bash
|
|
199
209
|
bootstack gallery # Launch the interactive widget gallery
|
|
200
210
|
bootstack icons # Browse the built-in icon catalog
|
|
211
|
+
bootstack appicon # Design an app icon and export it
|
|
201
212
|
bootstack start MyApp # Create a new project (basic template)
|
|
202
213
|
bootstack start MyApp --template appshell # ...or with sidebar navigation
|
|
203
214
|
bootstack run # Run the app defined in the project config
|
|
204
215
|
bootstack add page Dashboard # Add a new page (appshell)
|
|
205
216
|
bootstack add view Settings # Add a new view (basic)
|
|
206
217
|
bootstack add dialog Preferences # Add a new dialog
|
|
207
|
-
bootstack add i18n --languages en es fr # Add i18n support
|
|
208
218
|
bootstack doctor # Diagnose project & environment
|
|
219
|
+
bootstack promote # Make the project packaging-ready
|
|
209
220
|
bootstack build # Package for distribution
|
|
210
221
|
```
|
|
211
222
|
|
|
@@ -214,6 +225,12 @@ bootstack build # Package for distribution
|
|
|
214
225
|
Full documentation — guides, the widget catalog, and the API reference — lives at
|
|
215
226
|
**[bootstack.org](https://bootstack.org)**.
|
|
216
227
|
|
|
228
|
+
## Contributing
|
|
229
|
+
|
|
230
|
+
Contributions are welcome — code, bug reports, and especially **translations**.
|
|
231
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, the pull-request
|
|
232
|
+
workflow, and how to review the bundled language catalogs.
|
|
233
|
+
|
|
217
234
|
## Links
|
|
218
235
|
|
|
219
236
|
- **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.0a12"
|
|
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"
|
|
@@ -100,7 +100,7 @@ where = ["src"]
|
|
|
100
100
|
]
|
|
101
101
|
|
|
102
102
|
[tool.bumpversion]
|
|
103
|
-
current_version = "0.1.
|
|
103
|
+
current_version = "0.1.0a12"
|
|
104
104
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)((?P<pre>a|b|rc)(?P<pre_n>\\d+))?"
|
|
105
105
|
serialize = [
|
|
106
106
|
"{major}.{minor}.{patch}{pre}{pre_n}",
|
|
@@ -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,13 +56,14 @@ 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
|
+
from bootstack.widgets.theme_toggle import ThemeToggle
|
|
66
67
|
from bootstack.widgets.button import Button
|
|
67
68
|
from bootstack.widgets.card import Card
|
|
68
69
|
from bootstack.widgets.buttongroup import ButtonGroup
|
|
@@ -89,7 +90,7 @@ from bootstack.widgets.radiogroup import RadioGroup
|
|
|
89
90
|
from bootstack.widgets.scrollview import ScrollView
|
|
90
91
|
from bootstack.widgets.select import Select
|
|
91
92
|
from bootstack.widgets.selectbutton import SelectButton
|
|
92
|
-
from bootstack.widgets.
|
|
93
|
+
from bootstack.widgets.divider import Divider
|
|
93
94
|
from bootstack.widgets.splitview import SplitView, SplitPane
|
|
94
95
|
from bootstack.widgets.slider import RangeSlider, Slider
|
|
95
96
|
from bootstack.widgets.spinnerfield import SpinnerField
|
|
@@ -101,7 +102,7 @@ from bootstack.widgets.tree import Tree, TreeNode
|
|
|
101
102
|
from bootstack.widgets.textfield import TextField
|
|
102
103
|
from bootstack.widgets.toast import toast, Notification, Snackbar, snackbar
|
|
103
104
|
from bootstack.widgets.togglegroup import ToggleGroup
|
|
104
|
-
from bootstack.widgets.
|
|
105
|
+
from bootstack.widgets.toolbar import Toolbar
|
|
105
106
|
from bootstack.widgets.statusbar import StatusBar
|
|
106
107
|
from bootstack.widgets.tooltip import Tooltip
|
|
107
108
|
|
|
@@ -126,12 +127,12 @@ __all__ = [
|
|
|
126
127
|
"ask_date_range", "ask_item", "ask_color", "ask_font", "ask_filter",
|
|
127
128
|
"ask_save_file", "ask_open_file", "ask_open_files", "ask_directory",
|
|
128
129
|
# Application & windows
|
|
129
|
-
"App", "AppShell", "Window",
|
|
130
|
+
"App", "AppShell", "Workbench", "Window",
|
|
130
131
|
# Layout
|
|
131
|
-
"
|
|
132
|
+
"Row", "Column", "Spacer", "Grid", "Card", "GroupBox", "Divider", "ScrollView",
|
|
132
133
|
"SplitView", "SplitPane", "Accordion", "AccordionSection",
|
|
133
134
|
# Actions
|
|
134
|
-
"Button", "ButtonGroup", "MenuButton", "
|
|
135
|
+
"Button", "ButtonGroup", "ThemeToggle", "MenuButton", "Toolbar", "StatusBar",
|
|
135
136
|
"ContextMenu", "ContextMenuItem",
|
|
136
137
|
# Inputs
|
|
137
138
|
"TextField", "PasswordField", "NumberField", "PathField", "SpinnerField",
|
|
@@ -4,14 +4,9 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from . import colorutils, publisher, capabilities
|
|
6
6
|
from bootstack._core.exceptions import (
|
|
7
|
-
TTKBootstrapError,
|
|
8
|
-
LayoutError,
|
|
9
7
|
ThemeError,
|
|
10
|
-
ConfigError,
|
|
11
|
-
StateError,
|
|
12
8
|
NavigationError,
|
|
13
|
-
|
|
14
|
-
BootstyleParsingError,
|
|
9
|
+
StyleBuilderError,
|
|
15
10
|
ConfigurationWarning,
|
|
16
11
|
)
|
|
17
12
|
|
|
@@ -19,13 +14,8 @@ __all__ = [
|
|
|
19
14
|
"colorutils",
|
|
20
15
|
"publisher",
|
|
21
16
|
"capabilities",
|
|
22
|
-
"TTKBootstrapError",
|
|
23
|
-
"LayoutError",
|
|
24
17
|
"ThemeError",
|
|
25
|
-
"ConfigError",
|
|
26
|
-
"StateError",
|
|
27
18
|
"NavigationError",
|
|
28
|
-
"
|
|
29
|
-
"BootstyleParsingError",
|
|
19
|
+
"StyleBuilderError",
|
|
30
20
|
"ConfigurationWarning",
|
|
31
|
-
]
|
|
21
|
+
]
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
# These are defined in the public `bootstack.errors` home and re-exported here
|
|
4
|
+
# for the internal call sites that import from `bootstack._core`.
|
|
5
|
+
from bootstack.errors import (
|
|
6
|
+
NavigationError,
|
|
7
|
+
StyleBuilderError,
|
|
8
|
+
ThemeError,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ConfigurationWarning(Warning):
|
|
13
|
+
"""Issued when a widget receives a deprecated or questionable configuration option.
|
|
14
|
+
|
|
15
|
+
Examples: supplying an unsupported value for a configuration key, or
|
|
16
|
+
passing mutually exclusive options.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"ConfigurationWarning",
|
|
22
|
+
"NavigationError",
|
|
23
|
+
"StyleBuilderError",
|
|
24
|
+
"ThemeError",
|
|
25
|
+
]
|
|
@@ -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.
|