feat(phase2): phase 6 - integration & polish

Fix all build/type/lint errors, write 60 new tests (175 total),
update seed with new widget types and team board permissions,
install missing svelte-i18n dependency, fix DynamicIcon for Svelte 5.
This commit is contained in:
2026-03-24 23:43:31 +03:00
parent 5bb4fbcedf
commit 87ed928a3a
17 changed files with 2057 additions and 59 deletions
@@ -44,7 +44,7 @@
let {
section,
boardId,
boardId: _boardId = '',
apps,
onWidgetsUpdate,
addWidgetSectionId,
@@ -54,6 +54,9 @@
onDeleteWidget
}: Props = $props();
// boardId reserved for future per-section API calls
void _boardId;
let widgets = $state<WidgetData[]>([...section.widgets]);
// Keep local state in sync when parent data changes
+3 -2
View File
@@ -18,10 +18,11 @@
}
const iconComponent = $derived(
name ? (icons as Record<string, unknown>)[toPascalCase(name)] ?? null : null
name ? ((icons as Record<string, unknown>)[toPascalCase(name)] as typeof import('svelte').SvelteComponent | undefined) ?? null : null
);
</script>
{#if iconComponent}
<svelte:component this={iconComponent} {size} class={className} />
{@const Icon = iconComponent}
<Icon {size} class={className} />
{/if}
@@ -37,6 +37,7 @@
<div class="flex h-full flex-col rounded-xl border border-border bg-card p-4">
<div class="prose prose-sm prose-invert max-w-none flex-1 overflow-auto text-foreground">
<!-- eslint-disable-next-line svelte/no-at-html-tags -- content is sanitized above -->
{@html renderedContent}
</div>
</div>