Files
pipu-music/apps/web/src/shared/ui/ui.module.css
T
mrleo1nidandClaude Opus 5.5 de4e59d9f8
ci / mobile / mobile (Metro-бандл Android) (push) Canceled after 31s
ci / ts / ts (packages + web) (push) Canceled after 0s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 44s
fix(web): accessibility pass to WCAG 2.1 AA (M7)
An axe-core audit of every screen in both themes found low contrast on white
text over the accent and on caption text, track rows using row roles without
cells, and unlabelled progress bars. Accent fills now use a darker token,
caption text meets 4.5:1, track lists are lists and progress bars are labelled.
The queue drawer slides in from the right as designed, takes focus, closes on
Escape and notes that the wave never ends.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 23:15:03 +03:00

317 lines
5.0 KiB
CSS

.icon {
display: inline-block;
flex: none;
background-color: currentColor;
mask-repeat: no-repeat;
mask-position: center;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
-webkit-mask-position: center;
-webkit-mask-size: contain;
}
.logo {
display: inline-flex;
align-items: center;
gap: 10px;
font-family: var(--font-display);
font-weight: 600;
letter-spacing: -0.02em;
color: var(--text);
}
.logoDot {
border-radius: 50%;
background: radial-gradient(circle at 35% 30%, #9cc6ff, #2f80ff 55%, #3a1fa8);
box-shadow: 0 0 18px rgba(47, 128, 255, 0.55);
}
.button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
height: 44px;
padding: 0 18px;
border-radius: var(--radius-md);
font-weight: 600;
font-size: 14px;
white-space: nowrap;
transition:
background 0.15s,
box-shadow 0.15s,
opacity 0.15s;
}
.button:disabled {
opacity: 0.55;
cursor: default;
}
.button[aria-busy='true'] {
cursor: progress;
}
.primary {
background: var(--accent-fill);
color: #fff;
box-shadow: var(--glow);
}
.primary:hover:not(:disabled) {
background: var(--accent-fill2);
}
.secondary {
background: var(--surface3);
color: var(--text);
}
.secondary:hover:not(:disabled),
.ghost:hover:not(:disabled) {
background: var(--hover);
}
.ghost {
color: var(--text2);
}
.danger {
background: var(--danger-soft);
color: var(--danger);
}
.field {
display: flex;
flex-direction: column;
gap: 6px;
}
.label {
font-size: 13px;
font-weight: 600;
color: var(--text2);
}
.inputWrap {
position: relative;
display: flex;
}
.input {
width: 100%;
height: 48px;
padding: 0 14px;
border-radius: var(--radius-md);
border: 1px solid var(--line2);
background: var(--surface2);
color: var(--text);
font: inherit;
outline: none;
transition:
border-color 0.15s,
box-shadow 0.15s;
}
.input:focus {
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--accent-soft);
}
.inputWrap:has(.reveal) .input {
padding-right: 46px;
}
.mono {
font-family: var(--font-mono);
}
.invalid {
border-color: var(--danger);
}
.reveal {
position: absolute;
right: 6px;
top: 50%;
transform: translateY(-50%);
display: grid;
place-items: center;
width: 36px;
height: 36px;
border-radius: 8px;
color: var(--text3);
}
.reveal:hover {
color: var(--text);
background: var(--hover);
}
.hint {
font-size: 12px;
color: var(--text3);
}
.error {
font-size: 12px;
color: var(--danger);
}
.formError {
padding: 10px 12px;
border-radius: 10px;
background: var(--danger-soft);
color: var(--danger);
font-size: 13px;
font-weight: 500;
}
.segmented {
display: inline-flex;
gap: 2px;
padding: 3px;
border-radius: 10px;
background: var(--surface2);
border: 1px solid var(--line);
}
.segmented button {
height: 32px;
padding: 0 14px;
border-radius: 8px;
font-size: 13px;
font-weight: 600;
color: var(--text2);
}
.segmented button[aria-pressed='true'] {
background: var(--accent-fill);
color: #fff;
}
.overlay {
position: fixed;
inset: 0;
z-index: 50;
display: grid;
place-items: center;
padding: 16px;
background: var(--overlay);
animation: pipuIn 0.2s ease-out;
}
.dialog {
width: 440px;
max-width: 100%;
max-height: calc(100vh - 32px);
overflow: auto;
border-radius: var(--radius-xl);
background: var(--glass);
backdrop-filter: blur(28px) saturate(1.3);
border: 1px solid var(--line2);
box-shadow: var(--shadow);
outline: none;
}
.dialogHead {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 22px 24px 0;
}
.dialogHead h2 {
margin: 0;
font-family: var(--font-display);
font-size: 19px;
font-weight: 600;
letter-spacing: -0.01em;
}
.dialogBody {
display: flex;
flex-direction: column;
gap: 14px;
padding: 18px 24px;
}
.dialogFoot {
display: flex;
justify-content: flex-end;
gap: 10px;
padding: 0 24px 22px;
}
.iconButton {
display: grid;
place-items: center;
width: 36px;
height: 36px;
border-radius: 10px;
color: var(--text2);
}
.iconButton:hover,
.iconButton[aria-expanded='true'] {
background: var(--hover);
color: var(--text);
}
.menuWrap {
position: relative;
}
.menu {
position: absolute;
right: 0;
top: calc(100% + 6px);
z-index: 40;
min-width: 220px;
padding: 6px;
border-radius: var(--radius-lg);
background: var(--elev);
border: 1px solid var(--line2);
box-shadow: var(--shadow);
animation: pipuIn 0.15s ease-out;
}
.menuStart {
left: 0;
right: auto;
}
.menuItem {
display: flex;
align-items: center;
gap: 10px;
width: 100%;
height: 38px;
padding: 0 10px;
border-radius: 8px;
font-size: 14px;
text-align: left;
color: var(--text);
outline: none;
}
.menuItem:hover,
.menuItem:focus-visible {
background: var(--hover);
}
.menuDanger {
color: var(--danger);
}
.avatar {
display: inline-grid;
place-items: center;
flex: none;
border-radius: 50%;
background: linear-gradient(135deg, var(--accent), var(--violet));
color: #fff;
font-weight: 700;
}