diff --git a/ui/src/app.css b/ui/src/app.css index 230fae2..f92a2ab 100644 --- a/ui/src/app.css +++ b/ui/src/app.css @@ -267,14 +267,17 @@ textarea { border: 1px solid var(--border); border-radius: var(--radius); padding: 8px 12px; - outline: none; - transition: all 0.2s ease; + transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease, color 0.2s ease; backdrop-filter: blur(4px); text-shadow: var(--text-glow); } -input:focus, -textarea:focus { +input:focus-visible, +textarea:focus-visible, +button:focus-visible, +a:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; border-color: var(--accent); box-shadow: 0 0 8px var(--border-glow); } @@ -349,7 +352,7 @@ button:disabled { a { color: var(--accent); text-decoration: none; - transition: all 0.2s ease; + transition: color 0.2s ease, text-shadow 0.2s ease; text-shadow: 0 0 2px color-mix(in srgb, var(--accent) 50%, transparent); } @@ -444,3 +447,19 @@ body.effects-disabled button:hover:not(:disabled) { transform: translate(0) } } + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } + + body:not(.effects-disabled)::before, + body:not(.effects-disabled)::after { + animation: none !important; + } +} diff --git a/ui/src/lib/components/ChannelList.svelte b/ui/src/lib/components/ChannelList.svelte index 342d350..34bcd94 100644 --- a/ui/src/lib/components/ChannelList.svelte +++ b/ui/src/lib/components/ChannelList.svelte @@ -228,7 +228,7 @@ {#if schema?.hasAccounts && isNamedAccount(entry.account)} {entry.account} {/if} - +
@@ -355,7 +355,7 @@ padding: 1rem; margin-bottom: 0.75rem; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2); - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .channel-row:hover { @@ -449,7 +449,7 @@ font-size: 0.875rem; font-family: var(--font-mono); outline: none; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2); } @@ -486,7 +486,7 @@ color: var(--fg-dim); font-size: 1rem; cursor: pointer; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .remove-btn:hover { background: color-mix(in srgb, var(--error, #e55) 15%, transparent); @@ -514,7 +514,7 @@ font-size: 0.8rem; font-family: var(--font-mono); cursor: pointer; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; text-transform: uppercase; letter-spacing: 1px; } @@ -552,7 +552,7 @@ text-transform: uppercase; letter-spacing: 1px; cursor: pointer; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .add-btn:hover { border-color: var(--accent); @@ -591,7 +591,7 @@ background: var(--bg-surface); border: 1px solid var(--border); border-radius: 2px; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.5); } .toggle-slider::before { @@ -603,7 +603,7 @@ top: 3px; background: var(--fg-dim); border-radius: 2px; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .toggle input:checked + .toggle-slider { background: color-mix(in srgb, var(--accent) 20%, transparent); @@ -654,7 +654,7 @@ border-bottom: 1px solid var(--border); color: var(--fg); cursor: pointer; - transition: all 0.15s ease; + transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease, color 0.15s ease, transform 0.15s ease, text-shadow 0.15s ease; text-align: left; font-family: var(--font-mono); } diff --git a/ui/src/lib/components/ComponentCard.svelte b/ui/src/lib/components/ComponentCard.svelte index 34a5d83..d8f54f1 100644 --- a/ui/src/lib/components/ComponentCard.svelte +++ b/ui/src/lib/components/ComponentCard.svelte @@ -77,7 +77,7 @@ border-radius: 4px; padding: 1.5rem; color: var(--fg); - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; backdrop-filter: blur(4px); } @@ -165,7 +165,7 @@ padding: 0.375rem 0.75rem; border-radius: 2px; cursor: pointer; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; text-transform: uppercase; letter-spacing: 1px; font-weight: bold; diff --git a/ui/src/lib/components/ConfigEditor.svelte b/ui/src/lib/components/ConfigEditor.svelte index 03e8c55..278f853 100644 --- a/ui/src/lib/components/ConfigEditor.svelte +++ b/ui/src/lib/components/ConfigEditor.svelte @@ -185,7 +185,7 @@ text-transform: uppercase; letter-spacing: 1px; cursor: pointer; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, text-shadow 0.2s ease; } .mode-btn:first-child { border-radius: 2px 0 0 2px; @@ -218,7 +218,7 @@ font-weight: 700; text-transform: uppercase; letter-spacing: 1px; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, text-shadow 0.2s ease; box-shadow: inset 0 0 8px color-mix(in srgb, var(--accent) 30%, transparent); } .save-btn:hover:not(:disabled) { @@ -275,11 +275,12 @@ font-size: 0.875rem; resize: none; line-height: 1.6; - outline: none; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, text-shadow 0.2s ease; box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.5); } - .raw-editor:focus { + .raw-editor:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; border-color: var(--accent); box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.5), 0 0 8px var(--border-glow); } diff --git a/ui/src/lib/components/ConfigEditorUI.svelte b/ui/src/lib/components/ConfigEditorUI.svelte index 44be914..ec401d6 100644 --- a/ui/src/lib/components/ConfigEditorUI.svelte +++ b/ui/src/lib/components/ConfigEditorUI.svelte @@ -652,7 +652,7 @@ font-weight: 700; text-transform: uppercase; letter-spacing: 1px; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .accordion-header:hover { background: color-mix(in srgb, var(--accent) 5%, transparent); @@ -699,7 +699,7 @@ font-size: 0.875rem; font-family: var(--font-mono); outline: none; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2); box-sizing: border-box; } @@ -767,7 +767,7 @@ font-size: 0.75rem; cursor: pointer; opacity: 0.6; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .remove-btn:hover { opacity: 1; @@ -799,7 +799,7 @@ font-weight: 700; text-transform: uppercase; letter-spacing: 1px; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; width: 100%; } .add-channel-btn:hover { @@ -834,7 +834,7 @@ text-align: left; cursor: pointer; font-family: var(--font-mono); - transition: all 0.15s ease; + transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease, color 0.15s ease, transform 0.15s ease, text-shadow 0.15s ease; } .add-channel-dropdown button:hover { background: color-mix(in srgb, var(--accent) 15%, transparent); diff --git a/ui/src/lib/components/InstanceCard.svelte b/ui/src/lib/components/InstanceCard.svelte index dae88ef..7947915 100644 --- a/ui/src/lib/components/InstanceCard.svelte +++ b/ui/src/lib/components/InstanceCard.svelte @@ -92,7 +92,7 @@ border: 1px solid var(--border); border-radius: 4px; color: var(--fg); - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; backdrop-filter: blur(4px); } .card:hover { @@ -155,7 +155,7 @@ text-transform: uppercase; letter-spacing: 1px; cursor: pointer; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; text-shadow: var(--text-glow); } .card-actions button:hover { diff --git a/ui/src/lib/components/LogViewer.svelte b/ui/src/lib/components/LogViewer.svelte index 40ceba4..df4f58a 100644 --- a/ui/src/lib/components/LogViewer.svelte +++ b/ui/src/lib/components/LogViewer.svelte @@ -137,7 +137,7 @@ font-family: var(--font-mono); text-transform: uppercase; letter-spacing: 0.8px; - transition: all 0.15s ease; + transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease, color 0.15s ease, transform 0.15s ease, text-shadow 0.15s ease; } .source-btn:hover { background: color-mix(in srgb, var(--accent) 10%, transparent); @@ -191,7 +191,7 @@ font-family: var(--font-mono); text-transform: uppercase; cursor: pointer; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .clear-btn:hover { background: color-mix(in srgb, var(--accent) 20%, transparent); diff --git a/ui/src/lib/components/ProviderList.svelte b/ui/src/lib/components/ProviderList.svelte index 2ce08d4..800f785 100644 --- a/ui/src/lib/components/ProviderList.svelte +++ b/ui/src/lib/components/ProviderList.svelte @@ -389,18 +389,21 @@ class="icon-btn" onclick={() => moveUp(i)} disabled={i === 0} - title="Move up">↑
@@ -553,7 +556,7 @@ padding: 1rem; margin-bottom: 0.75rem; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2); - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .provider-row:hover { @@ -588,7 +591,7 @@ font-size: 0.875rem; font-family: var(--font-mono); outline: none; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .provider-row-header select:focus { @@ -614,7 +617,7 @@ color: var(--fg-dim); font-size: 1rem; cursor: pointer; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .icon-btn:hover:not(:disabled) { @@ -662,7 +665,7 @@ font-size: 0.875rem; font-family: var(--font-mono); outline: none; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2); } @@ -749,7 +752,7 @@ text-transform: uppercase; letter-spacing: 1px; cursor: pointer; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .status-dot { @@ -825,7 +828,7 @@ cursor: pointer; text-align: left; font-family: var(--font-mono); - transition: all 0.15s ease; + transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease, color 0.15s ease, transform 0.15s ease, text-shadow 0.15s ease; } .saved-item:last-child { diff --git a/ui/src/lib/components/Sidebar.svelte b/ui/src/lib/components/Sidebar.svelte index 0bf74a9..89a8d42 100644 --- a/ui/src/lib/components/Sidebar.svelte +++ b/ui/src/lib/components/Sidebar.svelte @@ -196,7 +196,7 @@ font-size: 0.875rem; text-transform: uppercase; letter-spacing: 1px; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; border-left: 3px solid transparent; } @@ -264,7 +264,7 @@ font-size: 0.875rem; text-transform: uppercase; letter-spacing: 1px; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; border-left: 3px solid transparent; } diff --git a/ui/src/lib/components/StructuredConfigEditor.svelte b/ui/src/lib/components/StructuredConfigEditor.svelte index f1fdad1..e34c1fb 100644 --- a/ui/src/lib/components/StructuredConfigEditor.svelte +++ b/ui/src/lib/components/StructuredConfigEditor.svelte @@ -292,7 +292,7 @@ font-size: 0.875rem; font-family: var(--font-mono); outline: none; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .field input:focus, diff --git a/ui/src/lib/components/TopBar.svelte b/ui/src/lib/components/TopBar.svelte index 36c0315..b8c373c 100644 --- a/ui/src/lib/components/TopBar.svelte +++ b/ui/src/lib/components/TopBar.svelte @@ -169,13 +169,14 @@ font-family: var(--font-mono); font-size: 0.75rem; text-transform: uppercase; - outline: none; cursor: pointer; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease; } - .theme-select:focus, + .theme-select:focus-visible, .theme-select:hover { + outline: 2px solid var(--accent); + outline-offset: 2px; border-color: var(--accent); box-shadow: 0 0 8px var(--border-glow); } diff --git a/ui/src/lib/components/WizardRenderer.svelte b/ui/src/lib/components/WizardRenderer.svelte index 2aa04fe..c5284cf 100644 --- a/ui/src/lib/components/WizardRenderer.svelte +++ b/ui/src/lib/components/WizardRenderer.svelte @@ -580,7 +580,7 @@ color: var(--fg-dim); cursor: pointer; padding: 0.25rem 0; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .step-dot:disabled { cursor: default; } @@ -608,7 +608,7 @@ font-size: 0.75rem; font-weight: 700; font-family: var(--font-mono); - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .step-label { @@ -616,7 +616,7 @@ font-weight: 700; text-transform: uppercase; letter-spacing: 1px; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .step-line { @@ -624,7 +624,7 @@ height: 1px; background: var(--border); margin: 0 0.75rem; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .step-line.completed { background: var(--accent); box-shadow: 0 0 4px var(--border-glow); } @@ -659,7 +659,7 @@ font-size: 0.875rem; font-family: var(--font-mono); outline: none; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2); } @@ -690,7 +690,7 @@ font-size: 0.875rem; font-family: var(--font-mono); outline: none; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2); cursor: pointer; } @@ -721,7 +721,7 @@ letter-spacing: 1px; cursor: pointer; width: 100%; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; margin-top: 1rem; } .advanced-toggle:hover { @@ -792,7 +792,7 @@ font-size: 0.875rem; font-weight: 700; cursor: pointer; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; text-transform: uppercase; letter-spacing: 2px; text-shadow: var(--text-glow); @@ -824,7 +824,7 @@ font-size: 0.875rem; font-weight: 700; cursor: pointer; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; text-transform: uppercase; letter-spacing: 2px; } diff --git a/ui/src/lib/components/WizardStep.svelte b/ui/src/lib/components/WizardStep.svelte index 509213d..1a54184 100644 --- a/ui/src/lib/components/WizardStep.svelte +++ b/ui/src/lib/components/WizardStep.svelte @@ -236,7 +236,7 @@ padding: 0.75rem 1rem; color: var(--fg); cursor: pointer; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .option-btn:hover { @@ -314,7 +314,7 @@ font-size: 0.875rem; font-family: var(--font-mono); outline: none; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2); } @@ -351,7 +351,7 @@ padding: 0.6rem 0.75rem; color: var(--fg); cursor: pointer; - transition: all 0.1s ease; + transition: background-color 0.1s ease, border-color 0.1s ease, box-shadow 0.1s ease, color 0.1s ease, transform 0.1s ease, text-shadow 0.1s ease; } .dropdown-item:last-child { @@ -410,7 +410,7 @@ font-size: 0.875rem; font-family: var(--font-mono); outline: none; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2); } @@ -446,7 +446,7 @@ background: var(--bg-surface); border: 1px solid var(--border); border-radius: 2px; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.5); } @@ -459,7 +459,7 @@ top: 3px; background: var(--fg-dim); border-radius: 2px; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .toggle input:checked + .toggle-slider { diff --git a/ui/src/lib/components/orchestration/CheckpointTimeline.svelte b/ui/src/lib/components/orchestration/CheckpointTimeline.svelte index 9b50f33..99b8065 100644 --- a/ui/src/lib/components/orchestration/CheckpointTimeline.svelte +++ b/ui/src/lib/components/orchestration/CheckpointTimeline.svelte @@ -80,7 +80,7 @@ background: var(--border); border: 2px solid var(--fg-dim); flex-shrink: 0; - transition: all 0.2s ease; + transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, color 0.2s ease, transform 0.2s ease, text-shadow 0.2s ease; } .dot.selected { background: var(--accent); diff --git a/ui/src/lib/components/orchestration/InterruptPanel.svelte b/ui/src/lib/components/orchestration/InterruptPanel.svelte index 136bcd5..5730d4a 100644 --- a/ui/src/lib/components/orchestration/InterruptPanel.svelte +++ b/ui/src/lib/components/orchestration/InterruptPanel.svelte @@ -30,9 +30,9 @@ } - -
-