diff --git a/web/src/app.css b/web/src/app.css index da14190d..c09049f8 100644 --- a/web/src/app.css +++ b/web/src/app.css @@ -32,6 +32,10 @@ with the Phase 2 Button primitive via --text-on-accent. */ --accent-primary: #9268f8; --accent-primary-soft: #a78bfa; + /* Filled-control variant: the violet band where white text passes AA + (4.96:1) while the fill stays ≥3:1 against --bg-secondary. Used by + Button primary fills; links/text keep --accent-primary. */ + --accent-primary-strong: #7c4ff0; --accent-blue: var(--accent-primary); --accent-green: #4ade80; --accent-purple: #a78bfa; @@ -41,6 +45,9 @@ --accent-gray: #9ca3af; --accent-brown: #a8896c; --accent-red: #ef4444; + /* Solid destructive fill — the red where white text passes AA (4.83:1) + in both themes. Button variant="danger-solid" (final confirms). */ + --accent-red-strong: #dc2626; /* Literal blue for categorical uses (status maps, charts, info badges). Stays blue even if the brand accent changes — see PLAN-2290. */ @@ -651,6 +658,7 @@ dialog.attachment-image-lightbox .attachment-image-lightbox-close:hover { --chip-alpha: 12%; --accent-primary: #7c3aed; --accent-primary-soft: #8b5cf6; + --accent-primary-strong: #7c3aed; --accent-blue: var(--accent-primary); --accent-red: #dc2626; --accent-green: #16a34a; @@ -687,6 +695,7 @@ dialog.attachment-image-lightbox .attachment-image-lightbox-close:hover { --chip-alpha: 12%; --accent-primary: #7c3aed; --accent-primary-soft: #8b5cf6; + --accent-primary-strong: #7c3aed; --accent-blue: var(--accent-primary); --accent-red: #dc2626; --accent-green: #16a34a; diff --git a/web/src/lib/components/OpenChildrenDialog.svelte b/web/src/lib/components/OpenChildrenDialog.svelte index 996988bc..1b2829cc 100644 --- a/web/src/lib/components/OpenChildrenDialog.svelte +++ b/web/src/lib/components/OpenChildrenDialog.svelte @@ -15,6 +15,7 @@ import { page } from '$app/state'; import { openChildrenDialog } from '$lib/stores/openChildrenDialog.svelte'; import Modal from '$lib/components/common/Modal.svelte'; + import Button from '$lib/components/common/Button.svelte'; let active = $derived(openChildrenDialog.active); @@ -118,16 +119,10 @@
{/if} @@ -266,32 +261,6 @@ flex-shrink: 0; } - .btn { - padding: var(--space-2) var(--space-4); - border-radius: var(--radius-md); - font-size: 0.9em; - font-weight: 500; - cursor: pointer; - border: 1px solid transparent; - } - - .btn-secondary { - background: var(--bg-tertiary); - color: var(--text-primary); - border-color: var(--border); - } - .btn-secondary:hover { - background: var(--bg-secondary); - } - - .btn-danger { - background: var(--accent-red); - color: white; - } - .btn-danger:hover { - filter: brightness(1.08); - } - @media (max-width: 600px) { .modal-header, .modal-body, diff --git a/web/src/lib/components/admin/UserSettingsForm.svelte b/web/src/lib/components/admin/UserSettingsForm.svelte index 1c334d60..0aa0265d 100644 --- a/web/src/lib/components/admin/UserSettingsForm.svelte +++ b/web/src/lib/components/admin/UserSettingsForm.svelte @@ -21,6 +21,7 @@ import { untrack } from 'svelte'; import { adminFetch, adminPatch, adminPost, type AdminUser } from '$lib/stores/admin.svelte'; import { api } from '$lib/api/client'; + import Button from '$lib/components/common/Button.svelte'; interface Props { user: AdminUser; @@ -338,32 +339,29 @@ {#if editRole !== (user.role || 'member')} {#if !roleConfirm} -