fix(badges): auto-focus input after accordion animation + mute placeholder text

Auto-focus: requestAnimationFrame (~16ms) fired before the 185ms accordion
animation ended — input was still 0px/clipped so focus() silently failed.
Changed to setTimeout(210ms) so focus lands after the animation completes.

Placeholder color: placeholders show the current badge value (e.g. 'John Smith')
so without explicit styling they look identical to filled text. Added scoped
CSS rules setting placeholder to gray-400 (light) / gray-500 (dark) so it reads
clearly as a hint rather than existing content.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scott Idem
2026-04-14 16:42:58 -04:00
parent a81d65ce7e
commit 7733ef8708

View File

@@ -577,7 +577,10 @@ let select_ref_badge_type: HTMLSelectElement | undefined = $state();
$effect(() => {
const field = active_field;
if (!field) return;
requestAnimationFrame(() => {
// Wait for the accordion CSS animation (185ms ease-out) to finish before focusing.
// requestAnimationFrame fires at ~16ms — the input is still 0px / overflow:hidden
// at that point, so focus() silently fails. 210ms clears the animation safely.
setTimeout(() => {
switch (field) {
case 'name':
input_ref_name?.focus();
@@ -601,7 +604,7 @@ $effect(() => {
select_ref_badge_type?.focus();
break;
}
});
}, 210);
});
// --- Dirty detection: compare live edit value against the last-saved badge obj ---
@@ -2131,6 +2134,19 @@ let allow_tracking_open = $derived(
font-size: 1.05rem;
}
/* Placeholder text must read clearly as a hint, not as filled content.
The placeholders show the current badge value (e.g. "John Smith") so
without this they look identical to a filled-in field. */
.ctrl-accordion-inner input::placeholder,
.ctrl-accordion-inner textarea::placeholder {
color: #9ca3af; /* gray-400 — visually distinct from input text */
opacity: 1; /* Firefox sets opacity: 0.54 by default; override it */
}
:global(.dark) .ctrl-accordion-inner input::placeholder,
:global(.dark) .ctrl-accordion-inner textarea::placeholder {
color: #6b7280; /* gray-500 in dark mode — readable but clearly a hint */
}
/* ---- Entrance animation for form content ----
Triggered each time .open is applied to the parent accordion.
Pairs with the height animation: content fades + zooms in from