diff --git a/apps/web/src/App.css b/apps/web/src/App.css
index cf58ad4..7d1bf87 100644
--- a/apps/web/src/App.css
+++ b/apps/web/src/App.css
@@ -11,6 +11,12 @@ main {
}
}
+.section-divider {
+ height: 1px;
+ background: #e8e8e8;
+ margin: 40px 0;
+}
+
.app-header {
display: flex;
align-items: center;
@@ -57,7 +63,6 @@ h1 {
color: #111;
margin: 0 0 16px 0;
padding-bottom: 10px;
- border-bottom: 1px solid #e8e8e8;
display: flex;
align-items: center;
user-select: none;
diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx
index 23871d9..44f10a1 100644
--- a/apps/web/src/App.tsx
+++ b/apps/web/src/App.tsx
@@ -126,6 +126,7 @@ function App() {
tasks={todaysTasks}
onComplete={handleCompleteTask}
/>
+
>
diff --git a/apps/web/src/components/TodaysTasks.css b/apps/web/src/components/TodaysTasks.css
index c3ebc13..33a0f87 100644
--- a/apps/web/src/components/TodaysTasks.css
+++ b/apps/web/src/components/TodaysTasks.css
@@ -116,4 +116,77 @@
}
}
+/* When I have time — drawer */
+.wiht-drawer {
+ width: 100%;
+ border: 2px dashed #ddd;
+ border-radius: 6px;
+ cursor: pointer;
+ user-select: none;
+ transition: border-color 0.2s, background 0.2s;
+ margin-bottom: 4px;
+}
+.wiht-drawer:hover {
+ border-color: #de6c90;
+ background: rgba(170, 59, 255, 0.03);
+}
+
+.wiht-drawer--open {
+ border-style: solid;
+ border-color: #de6c90;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+ border-bottom: none;
+ background: rgba(170, 59, 255, 0.04);
+}
+
+.wiht-drawer-header {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 14px 16px;
+}
+
+.wiht-drawer-icon {
+ font-size: 13px;
+ color: #de6c90;
+ width: 14px;
+ flex-shrink: 0;
+}
+
+.wiht-drawer-label {
+ flex: 1;
+ font-size: 15px;
+ font-weight: 600;
+ color: #444;
+}
+
+.wiht-drawer:hover .wiht-drawer-label {
+ color: #de6c90;
+}
+
+.wiht-drawer--open .wiht-drawer-label {
+ color: #de6c90;
+}
+
+.wiht-drawer-badge {
+ font-size: 12px;
+ font-weight: 600;
+ background: #de6c90;
+ color: white;
+ border-radius: 10px;
+ padding: 2px 9px;
+ min-width: 24px;
+ text-align: center;
+}
+
+.wiht-drawer-body {
+ border: 2px solid #de6c90;
+ border-top: none;
+ border-bottom-left-radius: 6px;
+ border-bottom-right-radius: 6px;
+ padding: 16px;
+ margin-bottom: 4px;
+ background: white;
+}
diff --git a/apps/web/src/components/TodaysTasks.tsx b/apps/web/src/components/TodaysTasks.tsx
index 9d1bcf6..bc0670a 100644
--- a/apps/web/src/components/TodaysTasks.tsx
+++ b/apps/web/src/components/TodaysTasks.tsx
@@ -35,31 +35,34 @@ export default function TodaysTasks({ tasks, onComplete }: TodaysTasksProps) {
)}
-
- setShowWhenIHaveTime(!showWhenIHaveTime)}
- >
- {t.whenIHaveTime}
- {whenIHaveTimeTasks.length}
- {showWhenIHaveTime ? '▾' : '▸'}
-
- {showWhenIHaveTime && (
- whenIHaveTimeTasks.length === 0 ? (
+ {/* When I have time — collapsible drawer */}
+ setShowWhenIHaveTime(!showWhenIHaveTime)}
+ role="button"
+ tabIndex={0}
+ onKeyDown={(e) => e.key === 'Enter' && setShowWhenIHaveTime(v => !v)}
+ >
+
+ {showWhenIHaveTime ? '▾' : '▸'}
+ {t.whenIHaveTime}
+ {whenIHaveTimeTasks.length}
+
+
+
+ {showWhenIHaveTime && (
+
+ {whenIHaveTimeTasks.length === 0 ? (
{t.nothingHere}
) : (
{whenIHaveTimeTasks.map(task => (
-
+
))}
- )
- )}
-
+ )}
+
+ )}
);
}
diff --git a/apps/web/src/i18n/translations.ts b/apps/web/src/i18n/translations.ts
index 0fa47e4..210fa5d 100644
--- a/apps/web/src/i18n/translations.ts
+++ b/apps/web/src/i18n/translations.ts
@@ -2,7 +2,7 @@ export type Locale = 'en' | 'fr';
export const translations = {
en: {
- appName: 'TODO',
+ appName: 'Stuff to do',
// API status
statusLoading: 'Connecting to API…',
statusOk: '✓ API & database connected',
@@ -52,7 +52,7 @@ export const translations = {
switchLang: 'FR',
},
fr: {
- appName: 'TODO',
+ appName: 'Y\'a des trucs à faire ?',
// API status
statusLoading: 'Connexion à l\'API…',
statusOk: '✓ API & base de données connectées',