v0.8.0 — Builtins v2
The big-break builtins release: every component now follows one contract, and the library grows from 21 to 33 components.
The contract — optional auto-generated id (px-<n>), class_name + validated extra_attrs on every root (the carrier for hx-*/data-*/aria-*/Alpine), all copy as props (aria-labels included — i18n-ready), headless IIFE JS under the single window.px namespace with cancelable px:*:before-* hook events, and a documented DOM contract per builtin.
Redesigned — Modal/Drawer (native <dialog>, data-px-open/data-px-close, fragment lifecycle via open_on_mount/remove_on_close), Popover (headless 3-part compound; behavior=False for BYO-state apps), Dropdown (rebuilt on the popover wiring, ships no JS), Notification (auto-shows on mount — OOB toasts need no script tag), Panel/TabGroup (px:before-reveal/px:reveal region events), LazyPanel (when="viewport"|"reveal"|"load" presets), RegionLoader (ex-LoadingOverlay; concurrency-hardened ref-counts, hx-indicator support).
New — ConfirmDialog + PromptDialog (px.confirm/px.prompt, automatic hx-confirm upgrade), ToastHost (HX-Trigger-driven), AvatarStack, PageLoader (htmx-lifecycle navigation loader, loadend-keyed), and five form controls: ChipInput, FormField, ToggleSwitch, SegmentedControl, PasswordInput.
Framework — nested extra-asset collection, autodiscovery warnings, Finder.all_assets() + one-bundle recipe, per-field validation on tag instance reuse, renderer now truly returns Markup.
Tests — suite reorganized into unit/ · integration/ · reactivity/, with 24 playwright tests driving the builtin JS contracts in real chromium (524 total).
Full migration table (0.7.x → 0.8.0): see CHANGELOG.md.
🤖 Generated with Claude Code