@
feat(ui): add DataTable and Toaster, drop the legacy Table, fix overlay dialogs DataTable replaces the 20-line Table scaffold entirely: columns, sorting, filtering, pagination, selection, bulk actions, comparison layout, sticky first column, custom HTML cells, and a remote source driven by a `request` output rather than a function prop (props travel as HTML attributes, so a function arrives as its own source text). Toaster replaces the hand-rolled status div: tone icons, actions, hover pause/resume and a progress bar. Overlays audit -- Modal and Drawer declared aria-modal="true" but nothing ever moved focus into the panel, so the @keydown handler on their root never ran and closeOnEscape did nothing. Focus, focus restore, a Tab trap and a body scroll lock now live in the reactive runtime, shared by both. ContextMenu placed pointer menus by subtracting a guessed 340x420 from the viewport, which pushed every menu that was not that size away from the pointer; it now positions at the pointer and lets the anchored clamp pull it back once it can be measured. The reactive runtime size budget moves 150k -> 175k to cover anchored overlays, dialog behaviour, the toaster and the DataTable client half. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> @
This commit is contained in:
@@ -521,7 +521,33 @@ export function renderThemeCss(theme: ResolvedTheme): string {
|
||||
|
||||
return (
|
||||
blocks.join("\n") +
|
||||
'\nhtml,body{font-family:var(--wire-font-sans,"Plus Jakarta Sans",ui-sans-serif,system-ui,sans-serif);}\n'
|
||||
'\nhtml,body{font-family:var(--wire-font-sans,"Plus Jakarta Sans",ui-sans-serif,system-ui,sans-serif);}\n' +
|
||||
// <wrn-slot> wraps content spliced into a component's <slot> so the client
|
||||
// runtime can tell which scope authored it. It is a pure ownership marker
|
||||
// and must never introduce a box: an unknown element would otherwise
|
||||
// default to display:inline and break the component's own flex/grid layout.
|
||||
/*
|
||||
* Shape and elevation tokens the Wire UI stylesheet depends on.
|
||||
*
|
||||
* ui.css references --wire-radius-sm (51 times) and --wire-radius-md (21)
|
||||
* but nothing ever defined them, so every component using them fell back
|
||||
* to square corners in any app that did not declare them itself.
|
||||
* --wire-shadow-1 had the same problem: the showcase declared it
|
||||
* privately, so the library looked right there and flat everywhere else.
|
||||
* Defining them with the rest of the theme keeps a component looking the
|
||||
* same in every app; an app can still override them.
|
||||
*/
|
||||
":root{--wire-radius-sm:0.55rem;--wire-radius-md:0.9rem;--wire-radius-lg:1.35rem;" +
|
||||
"--wire-shadow-1:0 1px 2px color-mix(in srgb, black 22%, transparent)," +
|
||||
"0 10px 30px color-mix(in srgb, black 14%, transparent);}\n" +
|
||||
"wrn-slot{display:contents;}\n" +
|
||||
// A [data-for] element is the loop TEMPLATE, not a rendered row: the server
|
||||
// ships it with mustaches unresolved ({item.title}) and hydration replaces
|
||||
// it with a comment marker. Painted as-is it flashes one blank, literal
|
||||
// row on every page load before the runtime boots. Hiding it costs
|
||||
// nothing after hydration -- the runtime strips data-for from the clones
|
||||
// it renders, so this only ever matches the template itself.
|
||||
"[data-for]{display:none !important;}\n"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user