d662b50925
Big batch — every secondary page now wears the same glass-card hero that landed on Providers earlier: - notification-trackers, tracking-configs, template-configs - command-trackers, command-configs, command-template-configs - targets (with active-tab title), actions - bots (telegram / email / matrix tabs) - settings, settings/backup, users Each page picks an italic-em emphasis word, an editorial crumb (e.g. 'Routing · Notification', 'Operators · Bots', 'System · Maintenance'), a count meter, and entity-specific status pills derived from live data: 'X armed / Y paused' for trackers and actions, 'X types' for configs/templates, 'X channels' or '$N receivers' for targets. Other changes in this commit: - Button.svelte: redesigned. Primary variant becomes a real Aurora CTA — gradient lavender → orchid pill, 40px tall md / 34px sm, inset highlight, lift + glow on hover. Secondary, danger, ghost variants reworked to match. The 'Add <Type>' button on every page now reads as the page's primary action instead of a flat lavender rectangle. - JinjaEditor: overrode oneDark's hardcoded background with !important so the editor surface picks up var(--color-input-bg). Gutters / scroller / selection / autocomplete tooltip all match Aurora glass tokens now. Template editors stop visually clashing with the surrounding panel. - Aurora pulse dot: rewritten as a self-contained box-shadow glow pulse (no transform, no pseudo-element). The dot's bounding box is now stable so ancestors with overflow:hidden can never clip the visible dot — only the (decorative) outer glow halo. Fixes the 'half-moon clipping' on the dashboard 'On watch' deck. - topbar-action.svelte.ts left in tree but unused (topbar CTA was reverted per your call). Will clean up in a later commit. - Form input baseline styling moved into app.css (rounded 0.625rem, glass background, hover/focus rings) so untouched filter inputs on the per-type pages stop looking out of place. i18n: emphasis / countLabel / armed / paused / receiver / receivers / channelsCount keys added across en + ru. Build clean: 0 errors, 61 pre-existing a11y warnings unchanged.
36 lines
1006 B
TypeScript
36 lines
1006 B
TypeScript
/**
|
|
* Page-scoped primary action for the global topbar CTA.
|
|
*
|
|
* Each route declares its own primary action ("Add Provider",
|
|
* "New Tracker", etc.) by calling `topbarAction.set({...})`
|
|
* inside its `onMount`, and clears it on teardown. The layout
|
|
* reads `topbarAction.current` and renders the button.
|
|
*
|
|
* Falls back to the default "New tracker" CTA when no action is
|
|
* registered (set by the layout itself).
|
|
*/
|
|
export interface TopbarAction {
|
|
/** Visible label, e.g. "Add Provider". */
|
|
label: string;
|
|
/** Optional href — renders as <a>. Mutually exclusive with onclick. */
|
|
href?: string;
|
|
/** Optional click handler — renders as <button>. */
|
|
onclick?: () => void;
|
|
/** Optional MDI/NavIcon name for the leading glyph (default: mdiPlus). */
|
|
icon?: string;
|
|
}
|
|
|
|
let action = $state<TopbarAction | null>(null);
|
|
|
|
export const topbarAction = {
|
|
get current(): TopbarAction | null {
|
|
return action;
|
|
},
|
|
set(next: TopbarAction | null) {
|
|
action = next;
|
|
},
|
|
clear() {
|
|
action = null;
|
|
},
|
|
};
|