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',