+ {/* Ecosystem Health Link */}
+
{/* Filter bar */}
{/* Status filter */}
diff --git a/apps/todo/apps/web/src/lib/components/board-views/BoardViewRenderer.svelte b/apps/todo/apps/web/src/lib/components/board-views/BoardViewRenderer.svelte
index 113969561..39a806e96 100644
--- a/apps/todo/apps/web/src/lib/components/board-views/BoardViewRenderer.svelte
+++ b/apps/todo/apps/web/src/lib/components/board-views/BoardViewRenderer.svelte
@@ -15,6 +15,7 @@
onColumnColorChange?: (colIdx: number, color: string) => void;
onColumnMove?: (colIdx: number, dir: -1 | 1) => void;
onColumnDelete?: (colIdx: number) => void;
+ onAddColumn?: () => void;
}
let {
@@ -24,6 +25,7 @@
onColumnColorChange,
onColumnMove,
onColumnDelete,
+ onAddColumn,
}: Props = $props();
let activeLayout = $derived(layoutOverride || view.layout);
@@ -89,6 +91,7 @@
{onColumnColorChange}
{onColumnMove}
{onColumnDelete}
+ {onAddColumn}
/>
{:else if activeLayout === 'grid'}
{:else}
{/if}
diff --git a/apps/todo/apps/web/src/lib/components/board-views/FokusLayout.svelte b/apps/todo/apps/web/src/lib/components/board-views/FokusLayout.svelte
index bfdbce2e1..f9b9d7c4b 100644
--- a/apps/todo/apps/web/src/lib/components/board-views/FokusLayout.svelte
+++ b/apps/todo/apps/web/src/lib/components/board-views/FokusLayout.svelte
@@ -18,6 +18,7 @@
onColumnColorChange?: (colIdx: number, color: string) => void;
onColumnMove?: (colIdx: number, dir: -1 | 1) => void;
onColumnDelete?: (colIdx: number) => void;
+ onAddColumn?: () => void;
}
let {
@@ -30,6 +31,7 @@
onColumnColorChange,
onColumnMove,
onColumnDelete,
+ onAddColumn,
}: Props = $props();
const PAGE_WIDTH_MAP: Record = {
@@ -164,6 +166,15 @@
{/each}
+
+ {#if onAddColumn}
+
+
+
+ {/if}
@@ -261,6 +272,46 @@
background: rgba(139, 92, 246, 0.04);
}
+ /* Add sheet */
+ .add-sheet {
+ border: 2px dashed rgba(139, 92, 246, 0.3) !important;
+ background: rgba(139, 92, 246, 0.02) !important;
+ box-shadow: none !important;
+ }
+ .add-sheet:hover {
+ border-color: #8b5cf6 !important;
+ background: rgba(139, 92, 246, 0.06) !important;
+ }
+ :global(.dark) .add-sheet {
+ border-color: rgba(139, 92, 246, 0.25) !important;
+ background: rgba(139, 92, 246, 0.04) !important;
+ }
+
+ .add-sheet-btn {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+ width: 100%;
+ height: 100%;
+ min-height: 200px;
+ background: transparent;
+ border: none;
+ cursor: pointer;
+ }
+ .add-sheet-icon {
+ font-size: 2rem;
+ font-weight: 300;
+ color: #8b5cf6;
+ line-height: 1;
+ }
+ .add-sheet-label {
+ font-size: 0.875rem;
+ font-weight: 500;
+ color: #8b5cf6;
+ }
+
/* Page dots */
.page-dots {
display: flex;
diff --git a/apps/todo/apps/web/src/lib/components/board-views/GridLayout.svelte b/apps/todo/apps/web/src/lib/components/board-views/GridLayout.svelte
index 73950f883..c2d12a05c 100644
--- a/apps/todo/apps/web/src/lib/components/board-views/GridLayout.svelte
+++ b/apps/todo/apps/web/src/lib/components/board-views/GridLayout.svelte
@@ -13,6 +13,7 @@
onColumnColorChange?: (colIdx: number, color: string) => void;
onColumnMove?: (colIdx: number, dir: -1 | 1) => void;
onColumnDelete?: (colIdx: number) => void;
+ onAddColumn?: () => void;
}
let {
@@ -25,6 +26,7 @@
onColumnColorChange,
onColumnMove,
onColumnDelete,
+ onAddColumn,
}: Props = $props();
@@ -46,6 +48,15 @@
/>
{/each}
+
+ {#if onAddColumn}
+
+
+
+ {/if}
diff --git a/apps/todo/apps/web/src/lib/components/board-views/KanbanLayout.svelte b/apps/todo/apps/web/src/lib/components/board-views/KanbanLayout.svelte
index 4cd096408..9e353c52d 100644
--- a/apps/todo/apps/web/src/lib/components/board-views/KanbanLayout.svelte
+++ b/apps/todo/apps/web/src/lib/components/board-views/KanbanLayout.svelte
@@ -13,6 +13,7 @@
onColumnColorChange?: (colIdx: number, color: string) => void;
onColumnMove?: (colIdx: number, dir: -1 | 1) => void;
onColumnDelete?: (colIdx: number) => void;
+ onAddColumn?: () => void;
}
let {
@@ -25,6 +26,7 @@
onColumnColorChange,
onColumnMove,
onColumnDelete,
+ onAddColumn,
}: Props = $props();
@@ -46,6 +48,15 @@
/>
{/each}
+
+ {#if onAddColumn}
+
+
+
+ {/if}
diff --git a/apps/todo/apps/web/src/routes/(app)/+page.svelte b/apps/todo/apps/web/src/routes/(app)/+page.svelte
index fad069b46..e69270d07 100644
--- a/apps/todo/apps/web/src/routes/(app)/+page.svelte
+++ b/apps/todo/apps/web/src/routes/(app)/+page.svelte
@@ -4,7 +4,6 @@
import { BoardViewRenderer } from '$lib/components/board-views';
import { todoSettings, type PageWidth } from '$lib/stores/settings.svelte';
import { boardViewsStore } from '$lib/stores/board-views.svelte';
- import { Plus } from '@manacore/shared-icons';
// Get active view + edit mode from layout context
const activeViewCtx: { readonly value: LocalBoardView | null } = getContext('activeView');
@@ -147,17 +146,6 @@
-
- {#if columnsEditable}
-
- {:else}
- Spalten werden automatisch aus der Gruppierung erzeugt.
- {/if}
{/if}
@@ -169,6 +157,7 @@
onColumnColorChange={columnsEditable ? (i, color) => updateColumn(i, { color }) : undefined}
onColumnMove={columnsEditable ? moveColumn : undefined}
onColumnDelete={columnsEditable ? removeColumn : undefined}
+ onAddColumn={columnsEditable && editMode ? addColumn : undefined}
/>
{:else}
@@ -279,38 +268,4 @@
border-color: #8b5cf6;
color: white;
}
-
- /* ── Add Column Bar ───────────────────────────────────── */
- .add-col-bar {
- display: flex;
- padding: 0.5rem 1.5rem;
- flex-shrink: 0;
- border-bottom: 1px solid rgba(139, 92, 246, 0.08);
- }
-
- .col-add-btn {
- display: flex;
- align-items: center;
- gap: 0.375rem;
- padding: 0.25rem 0.75rem;
- font-size: 0.75rem;
- font-weight: 500;
- border-radius: 9999px;
- border: 1px dashed rgba(139, 92, 246, 0.4);
- color: #8b5cf6;
- background: transparent;
- cursor: pointer;
- transition: all 0.15s;
- }
- .col-add-btn:hover {
- border-color: #8b5cf6;
- background: rgba(139, 92, 246, 0.08);
- }
-
- .columns-hint {
- padding: 0.5rem 1.5rem;
- font-size: 0.75rem;
- color: #9ca3af;
- flex-shrink: 0;
- }