v0.1.0
0.1.0 — first stable release
The first stable release of bootstack. The public compose API — everything
you import as bootstack as bs plus the curated submodules (bootstack.data,
bootstack.style, bootstack.events, bootstack.dialogs, …) — is now frozen
under Semantic Versioning. Breaking changes to it will not land before 1.0 except
as documented, versioned migrations.
Highlights
- Applications and windows —
App,Window, and two navigation shells:
AppShell(single sidebar) andWorkbench(two-tier rail + workspaces), plus
a borderlessSplashintro screen. Undecorated windows auto-inject a draggable
titlebar and border. - A full widget catalog — layout (
Row/Column/Grid/Card/ScrollView/
SplitView/Accordion), inputs (TextField/NumberField/DateField/
TextArea/CodeEditor/Slider/…), selection (Checkbox/Switch/Select/
Calendar/…), data display (DataTable/Tree/ListView/Label/Badge/
Gauge/…), media (Picture/Gallery/Carousel/Avatar/Chart), navigation
(Tabs/PageStack), and overlays (Tooltip/toast/Notification/Snackbar). - Reactive state —
Signalfor two-way widget binding; a typed event system
(on_change()/on_click()/… returning cancelableSubscriptions or composable
Streams); reactiveForm.valid/Form.errors. - Theming — light/dark themes,
set_theme/toggle_theme,ThemeToggle,
system-appearance following, and a publicbootstack.styleAPI. - Data —
bootstack.datasource protocol (memory/SQLite/file-backed) with a
filtering DSL (col/any_of/all_of), a non-scalar data bag carried across
Tree/DataTable/ListView, and large-file streaming. - Dialogs — verbs (
alert/confirm/ask_*) at the top level plus dialog
classes inbootstack.dialogs(Dialog/FormDialog/…). - Tooling — a
bootstackCLI (start/run/add/doctor/appicon/…) and
application packaging.
Provisional (excluded from the freeze)
bootstack.dev— the hot-reload workflow (reloadable,is_dev_mode, and
thebootstack devcommand) is experimental. Its surface is carved out of
the 0.1.0 freeze and may change before a later release.
Migrating from the 0.1.0aN alpha series
Pre-1.0 alphas were never a stable contract; this summarizes the notable breaks
for anyone who tracked an alpha. (If you are installing bootstack for the first
time, you can ignore this section.)
Renamed
- Layout:
HStack→Row,VStack→Column,Separator→Divider; added
Spacer. The layout vocabulary moved to screen-axis terms —fill/expand/
anchor/stickyare replaced byhorizontal/vertical/growwith edge-name
values (left/center/right/stretch). The legacy kwargs now raise. Table→DataTable(and decoupled from any specific data source).Toolbar→CommandBarfor the app-level bar (app.commandbar);app.menu→
app.menubar; the standalonebs.MenuBarwas removed in favor ofapp.menubar.Signal.subscribe()now returns a cancelable handle (was a string token).- Selection: per-widget
get_selected()/selected_rows/selected_nodeswere
unified into a single polymorphic.selectionaccessor across
ListView/DataTable/Tree. - Navigation: the single
AppShellwas split intoAppShell(single sidebar) and
Workbench(two-tier workspaces); nav providers becamepage_nav()/list_nav()
/tree_nav()/custom_nav()(the oldpanel()is nowcustom_nav()).
Removed / moved
AppSettingsandsettings=were removed. All former settings are now flat
App(...)/AppShell(...)keyword arguments (theme,locale,
remember_window_state, …), with symmetricapp.*properties. Passing
settings=raisesTypeError.- Top-level namespace curated to the compose surface only. Types you reference
to configure behavior moved to submodules — e.g.Theme/get_theme_color
(bootstack.style),col/SqliteDataSource(bootstack.data),
ValidationRule(bootstack.validation),Event/Subscription
(bootstack.events),AccentToken(bootstack.types). Dialog classes
(Dialog/FormDialog/…) moved tobootstack.dialogs; the dialog verbs
(alert/confirm/ask_*) stay top-level. Toastwas split intotoast()(function),Notification,Snackbar, and
snackbar().MessageCatalog,IntlFormatter,get_current_app, andImagewere demoted to
internal (import widgets/icons via the publicbootstack.imagesAPI).Scaleand theVariantTokentype were removed.
Changed (behavior)
TimeFieldnow starts empty (it previously defaulted to the current time,
which silently defeatedrequired=True).- Field validation runs against the field's typed value; rules are type-aware
(a newrangerule for number/date/time bounds), andfield.valid/field.error
are reactiveSignals. Toolbar.add_widget/StatusBar.add_widgetare now class-based
(add_widget(WidgetClass, **kwargs)).
What's Changed
- feat(dev): hot reload via
bootstack dev(provisional) by @israel-dryer in #329 - feat(cli): scaffold builder functions instead of class-based views (#321, #320 P2) by @israel-dryer in #330
- docs(ia): fold Production into the User Guide; rename Topics + Composing Fields (#323, #324) by @israel-dryer in #331
- fix(dev): hot-reload follow-ups #325, #326, #327 (+ #328 docs) by @israel-dryer in #333
- fix(ship-gate): text= guard + cli run double-cwd (#149) by @israel-dryer in #334
- refactor(theme): unify theme repaint onto a single walk by @israel-dryer in #338
- ship-gate: public-surface audit, Release Notes, stable install (#149) by @israel-dryer in #335
- fix(macos): keep nav pages mapped + anchor toasts to the visible frame (#336, #337) by @israel-dryer in #339
- fix(theme): readable, consistent text-on-accent across all themes by @israel-dryer in #340
- test: fix two dead gui tests (stale theme mechanism + broken fixture) by @israel-dryer in #341
- chore: drop pre-release framing ahead of the 0.1.0 stable cut by @israel-dryer in #342
- ci(release): use the curated CHANGELOG as the GitHub Release notes by @israel-dryer in #343
Full Changelog: v0.1.0a16...v0.1.0