Tabular widget makes client-side HTTP calls to data_url DSPY which
fail with 401 because session cookie not passed in AJAX requests.
Server-side Jinja2 loop avoids this entirely — all model data rendered
in initial page load.
Tabular handles paging client-side — scroll to bottom auto-loads more.
Record_view renders each model as a card (icon + name + description).
Removed all server-side pagination logic from the template.
- All filter buttons use location.href with fully server-constructed URLs
No more mixing {{active_provider}} (stale server var) with dynamic JS state
- SearchBar, category, provider, pagination all use location.href pattern
- Card uses width:100% (fill DynamicColumn slot) + cheight:14 (fixed height)
- Model plaza root is VBox (not VScrollPanel), scroll delegated to cards area
- All filter buttons now script-update rw.opts.url + rw.show_widget()
instead of urlwidget target navigation (which silently failed)
- Root wrapped in VScrollPanel so scroll position preserved
- Card cwidth 25→22 for better column fit
- Page buttons also use RefreshWidget update pattern
- Handle llm.pricing_display when it's a string (not array)
- Card cwidth 15→25 to fill DynamicColumn properly
- Added page/page_size pagination with prev/next buttons
- page param forwarded through model_plaza→plaza_model_cards
New layout:
- Search bar (top) with fuzzy name/description match
- Category tabs (wrapping, single-select)
- Provider sidebar (left, single-select)
- Card grid (right, sorted by name, refreshed on filter change)
- Both category/provider unselected = all published models
Added get_plaza_models() for flat filtered model listing.
Supports combined filtering: provider + category + search.