fix: eliminate all 167 svelte-check warnings

Refactor page components to use $derived + invalidateAll() where data
is read-only or re-fetched after mutations. Suppress state_referenced_locally
for intentional patterns (form state, optimistic updates, pagination).
Fix a11y issues with role="presentation", add standard line-clamp properties,
remove unused CSS selectors and empty rulesets.
This commit is contained in:
2026-04-08 14:05:56 +02:00
parent 5093db8281
commit 39ffe1732f
38 changed files with 152 additions and 112 deletions
+1
View File
@@ -10,6 +10,7 @@
children
} = $props();
// svelte-ignore state_referenced_locally
let isVisible = $state(eager); // If eager=true, render immediately
/** @type {HTMLDivElement | null} */
let containerRef = $state(null);
+1
View File
@@ -11,6 +11,7 @@
...restProps
} = $props();
// svelte-ignore state_referenced_locally
let shouldLoad = $state(eager);
/** @type {HTMLImageElement | null} */
let imgElement = $state(null);
@@ -5,16 +5,19 @@
let { initialBalance = null, initialDebtData = null } = $props<{ initialBalance?: any, initialDebtData?: any }>();
// svelte-ignore state_referenced_locally
let balance = $state(initialBalance || {
netBalance: 0,
recentSplits: []
});
// svelte-ignore state_referenced_locally
let debtData = $state(initialDebtData || {
whoOwesMe: [],
whoIOwe: [],
totalOwedToMe: 0,
totalIOwe: 0
});
// svelte-ignore state_referenced_locally
let loading = $state(!initialBalance || !initialDebtData);
let error = $state<string | null>(null);
@@ -17,10 +17,14 @@
const isEnglish = $derived(lang === 'en');
// svelte-ignore state_referenced_locally
let book: string = $state(verseData?.book || '');
// svelte-ignore state_referenced_locally
let chapter: number = $state(verseData?.chapter || 0);
// svelte-ignore state_referenced_locally
let verses: Array<{ verse: number; text: string }> = $state(verseData?.verses || []);
let loading = $state(false);
// svelte-ignore state_referenced_locally
let error = $state(verseData ? '' : (lang === 'en' ? 'No verse data available' : 'Keine Versdaten verfügbar'));
function handleBackdropClick(event: MouseEvent) {
@@ -9,6 +9,7 @@
*/
let { periods: initialPeriods = [], lang = 'en', sharedWith: initialSharedWith = [], readOnly = false, ownerName = '' } = $props();
// svelte-ignore state_referenced_locally
let periods = $state([...initialPeriods]);
let loading = $state(false);
let showAddForm = $state(false);
@@ -24,6 +25,7 @@
let showHistory = $state(false);
// Sharing state
// svelte-ignore state_referenced_locally
let shareList = $state([...initialSharedWith]);
let showShare = $state(false);
let shareInput = $state('');
@@ -855,10 +857,10 @@
<!-- Share modal -->
{#if showShare}
<!-- svelte-ignore a11y_no_static_element_interactions -->
<!-- svelte-ignore a11y_no_static_element_interactions a11y_click_events_have_key_events -->
<div class="share-overlay" onclick={() => showShare = false} onkeydown={(e) => e.key === 'Escape' && (showShare = false)}>
<!-- svelte-ignore a11y_no_static_element_interactions -->
<div class="share-modal" onclick={(e) => e.stopPropagation()}>
<!-- svelte-ignore a11y_no_static_element_interactions a11y_click_events_have_key_events -->
<div class="share-modal" role="presentation" onclick={(e) => e.stopPropagation()}>
<div class="share-modal-header">
<h3>{t('share', lang)}</h3>
<button class="share-modal-close" onclick={() => showShare = false}>
@@ -14,8 +14,8 @@
<svelte:window onkeydown={handleKeydown} />
<!-- svelte-ignore a11y_click_events_have_key_events a11y_no_static_element_interactions -->
<div class="video-overlay" onclick={handleBackdrop}>
<!-- svelte-ignore a11y_click_events_have_key_events -->
<div class="video-overlay" role="presentation" onclick={handleBackdrop}>
<button class="close-btn" onclick={onClose} aria-label="Close video">
<X size={24} />
</button>
@@ -15,6 +15,7 @@ let {
} = $props();
// Unique dialog ID based on type to prevent conflicts when both are on the same page
// svelte-ignore state_referenced_locally
const dialogId = `base-recipe-selector-modal-${type}`;
let baseRecipes: any[] = $state([]);
@@ -11,6 +11,7 @@
const isEnglish = $derived(lang === 'en');
const label = $derived(isEnglish ? 'Favorites' : 'Favoriten');
// svelte-ignore state_referenced_locally
let checked = $state(enabled);
// Watch for changes to checked and call onToggle
@@ -120,6 +120,7 @@ const flattenedIngredients = $derived.by(() => {
const lang = data.lang || 'de';
return flattenIngredientReferences(data.ingredients, lang);
});
// svelte-ignore state_referenced_locally
let multiplier = $state(data.multiplier || 1);
const isEnglish = $derived(data.lang === 'en');
@@ -138,10 +139,15 @@ const labels = $derived({
// Cake form scaling
const hasDefaultForm = $derived(!!data.defaultForm?.shape);
// svelte-ignore state_referenced_locally
let userFormShape = $state(data.defaultForm?.shape || 'round');
// svelte-ignore state_referenced_locally
let userFormDiameter = $state(data.defaultForm?.diameter || 26);
// svelte-ignore state_referenced_locally
let userFormWidth = $state(data.defaultForm?.width || 20);
// svelte-ignore state_referenced_locally
let userFormLength = $state(data.defaultForm?.length || 30);
// svelte-ignore state_referenced_locally
let userFormInnerDiameter = $state(data.defaultForm?.innerDiameter || 8);
/** @param {string} shape @param {number} diameter @param {number} width @param {number} length @param {number} innerDiameter */
@@ -1,6 +1,7 @@
<script>
let { data } = $props();
// svelte-ignore state_referenced_locally
let multiplier = $state(data.multiplier || 1);
// Recursively flatten nested instruction references
@@ -11,6 +11,7 @@
const andLabel = $derived(isEnglish ? 'AND' : 'UND');
const orLabel = $derived(isEnglish ? 'OR' : 'ODER');
// svelte-ignore state_referenced_locally
let checked = $state(useAndLogic);
// Watch for changes to checked and call onToggle
@@ -28,6 +28,7 @@
}: Props = $props();
type TranslationState = 'idle' | 'translating' | 'preview' | 'approved' | 'error';
// svelte-ignore state_referenced_locally
let translationState = $state<TranslationState>(englishData ? 'preview' : 'idle');
let errorMessage = $state('');
let validationErrors = $state<string[]>([]);
@@ -43,6 +44,7 @@
}
// Eagerly initialize editableEnglish from germanData if no English translation exists
// svelte-ignore state_referenced_locally
let editableEnglish = $state<any>(
englishData ? {
...englishData,
+10
View File
@@ -31,17 +31,27 @@
{ tag: 'müll', icon: Trash2 },
];
// svelte-ignore state_referenced_locally
let title = $state(task?.title || '');
// svelte-ignore state_referenced_locally
let description = $state(task?.description || '');
/** @type {string[]} */
// svelte-ignore state_referenced_locally
let selectedAssignees = $state(task?.assignees ? [...task.assignees] : []);
/** @type {string[]} */
// svelte-ignore state_referenced_locally
let selectedTags = $state(task?.tags ? [...task.tags] : []);
// svelte-ignore state_referenced_locally
let difficulty = $state(task?.difficulty || '');
// svelte-ignore state_referenced_locally
let refreshMode = $state(task?.refreshMode || 'completion');
// svelte-ignore state_referenced_locally
let isRecurring = $state(task?.isRecurring || false);
// svelte-ignore state_referenced_locally
let frequencyType = $state(task?.frequency?.type || 'weekly');
// svelte-ignore state_referenced_locally
let customDays = $state(task?.frequency?.customDays || 7);
// svelte-ignore state_referenced_locally
let nextDueDate = $state(
task?.nextDueDate
? new Date(task.nextDueDate).toISOString().split('T')[0]