a11y: Touch-Target System mit Token-basierter Sizing (Redesign Phase E)

- Neue Tokens: --target-sm (32px), --target-md (40px), --target-lg (48px)
- Globale min-height:44px Regel aus reset.css entfernt
- Alle 28 min-height:unset Overrides eliminiert
- Strategy A: Buttons, Nav-Items, Inputs → 48px mobile, 40px desktop
- Strategy B: Kleine Elemente (Checkboxen, Swatches, Delete-Buttons)
  → ::before Pseudo-Element expandiert Touch-Area auf 48×48px

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
ulsklyc
2026-03-26 13:43:12 +01:00
parent 73cd322a71
commit 152246185e
10 changed files with 124 additions and 39 deletions
+8 -2
View File
@@ -259,7 +259,13 @@
justify-content: center; justify-content: center;
opacity: 0; opacity: 0;
transition: opacity var(--transition-fast), color var(--transition-fast); transition: opacity var(--transition-fast), color var(--transition-fast);
min-height: unset; position: relative;
}
.budget-entry__delete::before {
content: '';
position: absolute;
inset: -10px;
} }
.budget-entry:hover .budget-entry__delete { .budget-entry:hover .budget-entry__delete {
@@ -308,7 +314,7 @@
background: none; background: none;
color: var(--color-text-secondary); color: var(--color-text-secondary);
transition: all var(--transition-fast); transition: all var(--transition-fast);
min-height: unset; min-height: var(--target-lg);
} }
.amount-type-btn--income.amount-type-btn--active { .amount-type-btn--income.amount-type-btn--active {
+9 -1
View File
@@ -79,7 +79,7 @@
color: var(--color-text-secondary); color: var(--color-text-secondary);
cursor: pointer; cursor: pointer;
transition: all var(--transition-fast); transition: all var(--transition-fast);
min-height: unset; min-height: var(--target-lg);
white-space: nowrap; white-space: nowrap;
} }
@@ -530,6 +530,14 @@
border: 2px solid transparent; border: 2px solid transparent;
cursor: pointer; cursor: pointer;
transition: transform var(--transition-fast), border-color var(--transition-fast); transition: transform var(--transition-fast), border-color var(--transition-fast);
position: relative;
}
.color-swatch::before {
content: '';
position: absolute;
inset: -10px;
border-radius: var(--radius-full);
} }
.color-swatch:hover { .color-swatch:hover {
+1 -1
View File
@@ -203,7 +203,7 @@
justify-content: center; justify-content: center;
color: var(--color-text-secondary); color: var(--color-text-secondary);
transition: background-color var(--transition-fast), color var(--transition-fast); transition: background-color var(--transition-fast), color var(--transition-fast);
min-height: unset; min-height: var(--target-lg);
text-decoration: none; text-decoration: none;
} }
+27 -14
View File
@@ -152,7 +152,8 @@
color: var(--color-text-tertiary); color: var(--color-text-tertiary);
transition: color var(--transition-fast); transition: color var(--transition-fast);
-webkit-tap-highlight-color: transparent; -webkit-tap-highlight-color: transparent;
min-height: unset; min-height: var(--target-lg);
min-width: var(--target-lg);
text-decoration: none; text-decoration: none;
} }
@@ -322,7 +323,7 @@
border-radius: var(--radius-sm); border-radius: var(--radius-sm);
padding: 8px var(--space-2); padding: 8px var(--space-2);
gap: 0; gap: 0;
min-height: unset; min-height: var(--target-lg);
font-size: var(--text-sm); font-size: var(--text-sm);
color: var(--color-text-secondary); color: var(--color-text-secondary);
background: transparent; background: transparent;
@@ -629,6 +630,13 @@
border-radius: var(--radius-full); border-radius: var(--radius-full);
color: var(--color-text-secondary); color: var(--color-text-secondary);
transition: background-color var(--transition-fast); transition: background-color var(--transition-fast);
position: relative;
}
.modal-panel__close::before {
content: '';
position: absolute;
inset: -8px;
} }
.modal-panel__close:hover { .modal-panel__close:hover {
@@ -678,7 +686,7 @@
border-radius: var(--radius-sm); border-radius: var(--radius-sm);
font-size: var(--text-sm); font-size: var(--text-sm);
font-weight: var(--font-weight-medium); font-weight: var(--font-weight-medium);
min-height: 36px; min-height: var(--target-lg);
transition: transition:
background-color var(--transition-fast), background-color var(--transition-fast),
box-shadow var(--transition-fast), box-shadow var(--transition-fast),
@@ -687,10 +695,9 @@
white-space: nowrap; white-space: nowrap;
} }
/* Touch-Targets: 44px auf Mobile */ @media (min-width: 1024px) {
@media (max-width: 1023px) {
.btn { .btn {
min-height: 44px; min-height: var(--target-md);
} }
} }
@@ -747,15 +754,15 @@
.btn--icon { .btn--icon {
padding: var(--space-2); padding: var(--space-2);
min-height: 36px; min-height: var(--target-lg);
min-width: 36px; min-width: var(--target-lg);
border-radius: var(--radius-sm); border-radius: var(--radius-sm);
} }
@media (max-width: 1023px) { @media (min-width: 1024px) {
.btn--icon { .btn--icon {
min-height: 44px; min-height: var(--target-md);
min-width: 44px; min-width: var(--target-md);
} }
} }
@@ -807,12 +814,12 @@
color: var(--color-text-primary); color: var(--color-text-primary);
font-size: var(--text-md); font-size: var(--text-md);
transition: border-color var(--transition-fast), box-shadow var(--transition-fast); transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
min-height: 44px; min-height: var(--target-lg);
} }
@media (min-width: 1024px) { @media (min-width: 1024px) {
.input { .input {
min-height: 36px; min-height: var(--target-md);
font-size: var(--text-base); font-size: var(--text-base);
} }
} }
@@ -1172,7 +1179,13 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
transition: all var(--transition-fast); transition: all var(--transition-fast);
min-height: unset; position: relative;
}
.rrule-day::before {
content: '';
position: absolute;
inset: -4px;
} }
.rrule-day:hover { .rrule-day:hover {
+16 -4
View File
@@ -161,7 +161,7 @@
font-size: var(--text-sm); font-size: var(--text-sm);
padding: var(--space-2); padding: var(--space-2);
transition: color var(--transition-fast); transition: color var(--transition-fast);
min-height: unset; min-height: var(--target-lg);
} }
.meal-slot__add-btn:hover { .meal-slot__add-btn:hover {
@@ -230,10 +230,16 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
min-height: unset; position: relative;
transition: color var(--transition-fast), background-color var(--transition-fast); transition: color var(--transition-fast), background-color var(--transition-fast);
} }
.meal-card__action-btn::before {
content: '';
position: absolute;
inset: -12px;
}
.meal-card__action-btn:hover { .meal-card__action-btn:hover {
color: var(--color-danger); color: var(--color-danger);
background-color: var(--color-surface-2); background-color: var(--color-surface-2);
@@ -310,10 +316,16 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
flex-shrink: 0; flex-shrink: 0;
min-height: unset; position: relative;
transition: color var(--transition-fast); transition: color var(--transition-fast);
} }
.ingredient-row__remove::before {
content: '';
position: absolute;
inset: -8px;
}
.ingredient-row__remove:hover { .ingredient-row__remove:hover {
color: var(--color-danger); color: var(--color-danger);
} }
@@ -328,7 +340,7 @@
border: none; border: none;
cursor: pointer; cursor: pointer;
padding: var(--space-1) 0; padding: var(--space-1) 0;
min-height: unset; min-height: var(--target-lg);
} }
/* Einkaufsliste-Auswahl im Modal */ /* Einkaufsliste-Auswahl im Modal */
+22 -2
View File
@@ -98,12 +98,18 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
min-height: unset; position: relative;
opacity: 0; opacity: 0;
transition: opacity var(--transition-fast), background-color var(--transition-fast); transition: opacity var(--transition-fast), background-color var(--transition-fast);
color: var(--color-text-primary); color: var(--color-text-primary);
} }
.note-card__pin::before {
content: '';
position: absolute;
inset: -12px;
}
.note-card--pinned .note-card__pin { .note-card--pinned .note-card__pin {
opacity: 1; opacity: 1;
background: var(--color-overlay-light); background: var(--color-overlay-light);
@@ -177,12 +183,18 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
min-height: unset; position: relative;
color: var(--color-text-tertiary); color: var(--color-text-tertiary);
opacity: 0; opacity: 0;
transition: opacity var(--transition-fast), background-color var(--transition-fast); transition: opacity var(--transition-fast), background-color var(--transition-fast);
} }
.note-card__delete::before {
content: '';
position: absolute;
inset: -12px;
}
.note-card:hover .note-card__delete { .note-card:hover .note-card__delete {
opacity: 1; opacity: 1;
} }
@@ -229,10 +241,18 @@
height: 28px; height: 28px;
border-radius: var(--radius-full); border-radius: var(--radius-full);
border: 2px solid transparent; border: 2px solid transparent;
position: relative;
cursor: pointer; cursor: pointer;
transition: transform var(--transition-fast), border-color var(--transition-fast); transition: transform var(--transition-fast), border-color var(--transition-fast);
} }
.note-color-swatch::before {
content: '';
position: absolute;
inset: -10px;
border-radius: var(--radius-full);
}
.note-color-swatch:hover { transform: scale(1.15); } .note-color-swatch:hover { transform: scale(1.15); }
.note-color-swatch--active { border-color: var(--color-text-primary); transform: scale(1.1); } .note-color-swatch--active { border-color: var(--color-text-primary); transform: scale(1.1); }
-5
View File
@@ -59,11 +59,6 @@ h1, h2, h3, h4, h5, h6 {
line-height: var(--line-height-tight); line-height: var(--line-height-tight);
} }
/* Touch-Targets: Mindestgröße 44px */
button, [role="button"], input[type="checkbox"], input[type="radio"] {
min-height: 44px;
}
/* Fokus-Styles (Accessibility) */ /* Fokus-Styles (Accessibility) */
:focus-visible { :focus-visible {
outline: 2px solid var(--color-accent); outline: 2px solid var(--color-accent);
+18 -6
View File
@@ -90,7 +90,7 @@
cursor: pointer; cursor: pointer;
flex-shrink: 0; flex-shrink: 0;
transition: all var(--transition-fast); transition: all var(--transition-fast);
min-height: unset; min-height: var(--target-lg);
} }
.list-tab__new:hover { .list-tab__new:hover {
@@ -182,8 +182,8 @@
color: var(--color-text-secondary); color: var(--color-text-secondary);
font-size: var(--text-sm); font-size: var(--text-sm);
text-align: center; text-align: center;
min-height: unset; min-height: var(--target-lg);
height: 30px; height: auto;
} }
.quick-add__qty:focus { .quick-add__qty:focus {
@@ -223,7 +223,7 @@
cursor: pointer; cursor: pointer;
flex-shrink: 0; flex-shrink: 0;
transition: background-color var(--transition-fast); transition: background-color var(--transition-fast);
min-height: unset; min-height: var(--target-lg);
} }
.quick-add__btn:hover { background-color: var(--color-accent-hover); } .quick-add__btn:hover { background-color: var(--color-accent-hover); }
@@ -325,7 +325,13 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
transition: all var(--transition-fast); transition: all var(--transition-fast);
min-height: unset; position: relative;
}
.item-check::before {
content: '';
position: absolute;
inset: -12px;
} }
.item-check--checked { .item-check--checked {
@@ -387,11 +393,17 @@
cursor: pointer; cursor: pointer;
opacity: 0; opacity: 0;
transition: opacity var(--transition-fast), color var(--transition-fast); transition: opacity var(--transition-fast), color var(--transition-fast);
min-height: unset; position: relative;
border: none; border: none;
flex-shrink: 0; flex-shrink: 0;
} }
.item-delete::before {
content: '';
position: absolute;
inset: -8px;
}
.shopping-item:hover .item-delete, .shopping-item:hover .item-delete,
.shopping-item:focus-within .item-delete { .shopping-item:focus-within .item-delete {
opacity: 1; opacity: 1;
+16 -4
View File
@@ -61,7 +61,7 @@
font-weight: var(--font-weight-medium); font-weight: var(--font-weight-medium);
color: var(--color-text-secondary); color: var(--color-text-secondary);
transition: background-color var(--transition-fast), color var(--transition-fast); transition: background-color var(--transition-fast), color var(--transition-fast);
min-height: unset; min-height: var(--target-lg);
cursor: pointer; cursor: pointer;
} }
@@ -265,7 +265,13 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
transition: border-color var(--transition-fast), background-color var(--transition-fast); transition: border-color var(--transition-fast), background-color var(--transition-fast);
min-height: unset; position: relative;
}
.task-status-btn::before {
content: '';
position: absolute;
inset: -13px;
} }
.task-status-btn--done { .task-status-btn--done {
@@ -433,7 +439,13 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
transition: all var(--transition-fast); transition: all var(--transition-fast);
min-height: unset; position: relative;
}
.subtask-item__checkbox::before {
content: '';
position: absolute;
inset: -15px;
} }
.subtask-item__checkbox--done { .subtask-item__checkbox--done {
@@ -463,7 +475,7 @@
cursor: pointer; cursor: pointer;
text-align: left; text-align: left;
margin-top: var(--space-2); margin-top: var(--space-2);
min-height: unset; min-height: var(--target-lg);
transition: border-color var(--transition-fast), color var(--transition-fast); transition: border-color var(--transition-fast), color var(--transition-fast);
} }
+7
View File
@@ -199,6 +199,13 @@
--space-12: 48px; --space-12: 48px;
--space-16: 64px; --space-16: 64px;
/* --------------------------------------------------------
* 11b. Touch-Target Sizes
* -------------------------------------------------------- */
--target-sm: 32px;
--target-md: 40px;
--target-lg: 48px;
/* -------------------------------------------------------- /* --------------------------------------------------------
* 12. Layout * 12. Layout
* -------------------------------------------------------- */ * -------------------------------------------------------- */