feat(ui): capitalize button labels and speed depth transitions

Standard buttons now capitalize each word in their labels. Movement and
depth-shadow changes use an 80ms duration while color transitions stay
at 120ms.
This commit is contained in:
Andras Bacsai 2026-09-08 10:14:03 +02:00
parent 0aba440a94
commit 7f25af3785
5 changed files with 20 additions and 1 deletions

View file

@ -56,6 +56,9 @@ ## 1. Visual direction
face down 2px into the edge and removes the depth until release, keeping the face down 2px into the edge and removes the depth until release, keeping the
overall bottom position stable. Disabled controls stay flat, overall bottom position stable. Disabled controls stay flat,
and focus-visible controls retain the accent ring alongside the depth. and focus-visible controls retain the accent ring alongside the depth.
Movement and depth-shadow changes transition over 80ms; color transitions keep
the shared 120ms duration.
Standard button labels use `capitalize`, giving each word an initial capital.
Highlighted buttons mix the accent equally with black for a pronounced bottom Highlighted buttons mix the accent equally with black for a pronounced bottom
edge, so custom theme colors produce a matching edge instead of a generic one. edge, so custom theme colors produce a matching edge instead of a generic one.
Dark mode matches the depth edge of neutral buttons to their regular border Dark mode matches the depth edge of neutral buttons to their regular border

View file

@ -130,6 +130,10 @@ .split-action-caret {
transition-duration: 120ms; transition-duration: 120ms;
} }
.button {
transition-duration: 120ms, 120ms, 120ms, 80ms, 80ms;
}
.icon-button:not(:disabled):active, .icon-button:not(:disabled):active,
.app-tab:active, .app-tab:active,
.split-action-main:not(:disabled):active, .split-action-main:not(:disabled):active,

View file

@ -126,7 +126,7 @@ @utility select {
} }
@utility button { @utility button {
@apply inline-flex shrink-0 gap-1.5 justify-center items-center whitespace-nowrap px-2.5 h-8 min-h-8 text-[13px] text-black normal-case rounded-md border outline-0 cursor-pointer font-medium transition-colors bg-white border-neutral-200 hover:bg-neutral-100 dark:bg-white/[0.06] dark:text-fg dark:hover:text-fg dark:hover:bg-white/[0.1] dark:border-white/[0.08] hover:text-black disabled:cursor-not-allowed min-w-fit dark:disabled:text-fg-faint disabled:border-neutral-200 dark:disabled:border-white/[0.06] disabled:hover:bg-transparent disabled:bg-transparent disabled:text-neutral-300 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent; @apply inline-flex shrink-0 gap-1.5 justify-center items-center whitespace-nowrap px-2.5 h-8 min-h-8 text-[13px] text-black capitalize rounded-md border outline-0 cursor-pointer font-medium transition-colors bg-white border-neutral-200 hover:bg-neutral-100 dark:bg-white/[0.06] dark:text-fg dark:hover:text-fg dark:hover:bg-white/[0.1] dark:border-white/[0.08] hover:text-black disabled:cursor-not-allowed min-w-fit dark:disabled:text-fg-faint disabled:border-neutral-200 dark:disabled:border-white/[0.06] disabled:hover:bg-transparent disabled:bg-transparent disabled:text-neutral-300 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent;
} }
@utility button-highlighted { @utility button-highlighted {

View file

@ -14,6 +14,7 @@
->not->toContain('.dark .button.button-highlighted:not(:disabled)') ->not->toContain('.dark .button.button-highlighted:not(:disabled)')
->toContain('.button:not(:disabled):hover') ->toContain('.button:not(:disabled):hover')
->toContain('transform: translateY(-1px);') ->toContain('transform: translateY(-1px);')
->toContain('transition-duration: 120ms, 120ms, 120ms, 80ms, 80ms;')
->toContain('.button:not(:disabled):active') ->toContain('.button:not(:disabled):active')
->toContain('transform: translateY(2px);') ->toContain('transform: translateY(2px);')
->not->toContain('transform: translateY(1px);') ->not->toContain('transform: translateY(1px);')

View file

@ -0,0 +1,11 @@
<?php
test('standard buttons capitalize each word in their labels', function () {
$utilities = file_get_contents(resource_path('css/utilities.css'));
preg_match('/@utility button \{(?<styles>[\s\S]*?)\n\}/', $utilities, $matches);
expect($matches['styles'] ?? '')
->toContain('capitalize')
->not->toContain('normal-case');
});