diff --git a/src/app/App.tsx b/src/app/App.tsx index 8e7f36c..c8f597b 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -10,12 +10,16 @@ const App: React.FC = () => { return ( -
+
- - +
+ + +
- +
+ +
diff --git a/src/app/components/AddTodoForm/style.css b/src/app/components/AddTodoForm/style.css index 8673f17..4109320 100644 --- a/src/app/components/AddTodoForm/style.css +++ b/src/app/components/AddTodoForm/style.css @@ -1,24 +1,63 @@ .add-todo-form { display: flex; - justify-content: space-between; - border-left: 4px solid var(--primary-color); - padding: 5px; + gap: 0.75rem; + padding: 1.5rem; + background-color: var(--card-background); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-sm); + margin-top: 1.5rem; +} + +@media (max-width: 768px) { + .add-todo-form { + padding: 1rem; + gap: 0.5rem; + } } .add-todo-form input { flex: 1; - padding: 10px; - border: none; - border-bottom: 1px solid var(--primary-color); - background-color: transparent; + padding: 0.75rem 1rem; + border: 2px solid var(--border-color); + border-radius: var(--radius-md); + background-color: var(--secondary-color); color: var(--text-color); + font-size: 1rem; + transition: all 0.2s ease; +} + +.add-todo-form input:focus { + outline: none; + border-color: var(--primary-color); + box-shadow: 0 0 0 3px rgb(59 130 246 / 0.1); +} + +.add-todo-form input:hover { + border-color: var(--primary-color); +} + +.add-todo-form input::placeholder { + color: var(--text-secondary); } .add-todo-form button { - margin-left: 5px; - padding: 10px 15px; + padding: 0.75rem 1.5rem; background-color: var(--primary-color); - color: var(--secondary-color); + color: white; border: none; - border-radius: 4px; + border-radius: var(--radius-md); + font-weight: var(--font-weight-medium); + cursor: pointer; + transition: all 0.2s ease; + box-shadow: var(--shadow-sm); +} + +.add-todo-form button:hover { + background-color: var(--primary-hover); + transform: translateY(-1px); + box-shadow: var(--shadow-md); +} + +.add-todo-form button:active { + transform: translateY(0); } diff --git a/src/app/components/FileSelector/style.css b/src/app/components/FileSelector/style.css index 2d295c3..98f59c2 100644 --- a/src/app/components/FileSelector/style.css +++ b/src/app/components/FileSelector/style.css @@ -1,78 +1,158 @@ +.file-selector { + display: flex; + align-items: center; + gap: 1rem; +} + +@media (max-width: 768px) { + .file-selector { + flex-direction: column; + align-items: flex-start; + gap: 0.75rem; + } +} + .no-file-message { text-align: start; } +.no-file-message p { + color: var(--text-color); + font-size: 1rem; + margin-bottom: 1rem; +} + .file-buttons { display: flex; - justify-content: start; - gap: 8px; - margin-top: 12px; + gap: 0.75rem; +} + +@media (max-width: 768px) { + .file-buttons { + flex-wrap: wrap; + gap: 0.5rem; + } } .create-file-button, .change-file-button, .open-file-button { - padding: 8px 16px; - border-radius: 4px; + padding: 0.75rem 1.5rem; + border-radius: var(--radius-md); cursor: pointer; - font-weight: bold; + font-weight: var(--font-weight-medium); border: none; + transition: all 0.2s ease; + box-shadow: var(--shadow-sm); + font-size: 0.875rem; } .create-file-button { background-color: var(--primary-color); - color: var(--secondary-color); + color: white; +} + +.create-file-button:hover { + background-color: var(--primary-hover); + transform: translateY(-1px); + box-shadow: var(--shadow-md); } .open-file-button { background-color: var(--secondary-color); + color: var(--text-color); + border: 2px solid var(--border-color); +} + +.open-file-button:hover { + background-color: var(--background-color); + border-color: var(--primary-color); color: var(--primary-color); + transform: translateY(-1px); + box-shadow: var(--shadow-md); } .change-file-button { background-color: var(--secondary-color); + color: var(--text-color); + border: 2px solid var(--border-color); +} + +.change-file-button:hover { + background-color: var(--background-color); + border-color: var(--primary-color); color: var(--primary-color); + transform: translateY(-1px); + box-shadow: var(--shadow-md); } -.create-file-button:hover, -.change-file-button:hover, -.open-file-button:hover { - opacity: 0.9; +.create-file-button:disabled, +.change-file-button:disabled, +.open-file-button:disabled { + opacity: 0.6; + cursor: not-allowed; + transform: none; } .file-selected { display: flex; align-items: center; - justify-content: space-between; + gap: 1rem; +} + +.file-info { + display: flex; + flex-direction: column; + gap: 0.75rem; } .file-name { color: var(--text-color); font-size: 0.95rem; + display: flex; + align-items: center; + gap: 0.5rem; +} + +.file-name strong { + font-weight: var(--font-weight-medium); } .save-status { - font-size: 0.9rem; + color: var(--success-color); + font-size: 0.875rem; + font-weight: var(--font-weight-medium); } .browser-warning { - background-color: #fff3cd; - color: #856404; - padding: 5px; - border-radius: 4px; - margin-bottom: 10px; + background-color: #fef3c7; + color: #92400e; + padding: 1rem; + border-radius: var(--radius-md); + margin-bottom: 1rem; + border: 1px solid #f59e0b; +} + +.browser-warning p { + margin: 0; + font-size: 0.875rem; } .error-message { - background-color: #f8d7da; - color: #721c24; - padding: 5px; - border-radius: 4px; - margin-bottom: 10px; + background-color: #fef2f2; + color: #991b1b; + padding: 1rem; + border-radius: var(--radius-md); + margin-bottom: 1rem; + border: 1px solid var(--error-color); } -.file-selected { - display: flex; - align-items: center; - justify-content: space-between; +.error-message p { + margin: 0; + font-size: 0.875rem; +} + +.loading-message { + color: var(--text-secondary); + font-size: 0.875rem; } diff --git a/src/app/components/ThemeToggle/style.css b/src/app/components/ThemeToggle/style.css index bd1b13f..5cdb354 100644 --- a/src/app/components/ThemeToggle/style.css +++ b/src/app/components/ThemeToggle/style.css @@ -1,8 +1,24 @@ .theme-toggle { - padding: 0.5rem; - font-size: 1.5rem; - border: none; - background-color: transparent; - cursor: pointer; - z-index: 100; -} \ No newline at end of file + display: flex; + align-items: center; + justify-content: center; + width: 3rem; + height: 3rem; + border: 1px solid var(--border-color); + background-color: var(--card-background); + border-radius: var(--radius-md); + cursor: pointer; + transition: all 0.2s ease; + box-shadow: var(--shadow-sm); + font-size: 1.25rem; +} + +.theme-toggle:hover { + background-color: var(--border-color); + transform: translateY(-1px); + box-shadow: var(--shadow-md); +} + +.theme-toggle:active { + transform: translateY(0); +} diff --git a/src/app/components/TodoItem/style.css b/src/app/components/TodoItem/style.css index fbe62d1..05b407e 100644 --- a/src/app/components/TodoItem/style.css +++ b/src/app/components/TodoItem/style.css @@ -1,195 +1,288 @@ -.time-spent.editable { - cursor: pointer; - text-decoration: underline dotted; +.todo-item { + display: flex; + flex-direction: column; + gap: 0.75rem; + padding: 1.25rem; + background-color: var(--card-background); + border-radius: var(--radius-md); + box-shadow: var(--shadow-sm); + transition: all 0.2s ease; } -.time-spent.editable:hover { - color: var(--primary-color); +.todo-item:hover { + box-shadow: var(--shadow-md); + transform: translateY(-1px); } -.time-edit { +@media (max-width: 768px) { + .todo-item { + padding: 1rem; + } +} + +.todo-header, +.todo-content { display: flex; align-items: center; + gap: 0.75rem; } -.time-input { - width: 40px; - padding: 2px 4px; - text-align: center; - border: none; - border-bottom: 1px solid var(--primary-color); +.todo-number { + font-family: 'JetBrains Mono', monospace; + font-weight: var(--font-weight-medium); + color: var(--text-secondary); + font-size: 0.875rem; + background-color: var(--border-color); + padding: 0.25rem 0.5rem; + border-radius: var(--radius-sm); + flex-shrink: 0; } -.time-save-btn, -.time-cancel-btn { - width: 24px; - height: 24px; - margin-left: 2px; - border-radius: 50%; - border: 1px solid var(--border-color); - background-color: var(--card-background); - cursor: pointer; - font-size: 0.8rem; +.todo-status { + flex-shrink: 0; } -.time-cancel-btn:hover, -.time-save-btn:hover { - background-color: var(--primary-color); - color: var(--secondary-color); +.todo-status select { + padding: 0.5rem 0.75rem; + border: 2px solid var(--border-color); + border-radius: var(--radius-sm); + background-color: var(--secondary-color); + color: var(--text-color); + font-size: 0.875rem; + cursor: pointer; + transition: all 0.2s ease; + font-weight: var(--font-weight-medium); } -.time-spent.counting { - color: #4caf50; - font-weight: bold; - animation: pulse 1s infinite alternate; +.todo-status select:focus { + outline: none; + border-color: var(--primary-color); + box-shadow: 0 0 0 3px rgb(59 130 246 / 0.1); } -.time-tracking { - margin-left: auto; - display: flex; - align-items: center; - gap: 8px; +.todo-status select:hover { + border-color: var(--primary-color); + background-color: var(--background-color); } -.time-spent { - font-family: monospace; +.todo-text { + flex-grow: 1; + font-size: 1rem; + color: var(--text-color); + line-height: 1.5; } -.start-button, .pause-button { - padding: 3px 8px; - border-radius: 4px; +.todo-text.editable { cursor: pointer; - font-size: 0.8rem; + padding: 0.25rem 0.5rem; + border-radius: var(--radius-sm); + transition: all 0.2s ease; } -.start-button { - background-color: var(--primary-color); - color: var(--secondary-color); - border: none; +.todo-text.editable:hover { + background-color: var(--border-color); + color: var(--primary-color); } -.pause-button { - background-color: var(--primary-color); - color: var(--secondary-color); - border: none; +.todo-text-edit { + display: flex; + align-items: center; + flex-grow: 1; + gap: 0.5rem; } -.todo-item { - display: flex; - flex-direction: column; - gap: 6px; - padding: 5px 5px; - border-left: 4px solid; +.text-input { + flex-grow: 1; + padding: 0.5rem 0.75rem; + border: 2px solid var(--border-color); + border-radius: var(--radius-sm); + background-color: var(--secondary-color); + color: var(--text-color); + font-size: 1rem; } -.todo-header, -.todo-content { +.text-input:focus { + outline: none; + border-color: var(--primary-color); + box-shadow: 0 0 0 3px rgb(59 130 246 / 0.1); +} + +.text-save-btn, +.text-cancel-btn { + width: 2rem; + height: 2rem; display: flex; align-items: center; - gap: 8px; + justify-content: center; + border-radius: var(--radius-sm); + border: 1px solid var(--border-color); + background-color: var(--card-background); + cursor: pointer; + font-size: 0.875rem; + transition: all 0.2s ease; } -.todo-number { - font-family: monospace; - font-weight: bold; - color: var(--text-color); - flex-shrink: 0; +.text-save-btn:hover { + background-color: var(--success-color); + color: white; + border-color: var(--success-color); } -.todo-status { - flex-shrink: 0; +.text-cancel-btn:hover { + background-color: var(--error-color); + color: white; + border-color: var(--error-color); } -.todo-status select { - width: 100%; - padding: 4px; - border: none; - border-bottom: 1px solid var(--primary-color); - background-color: transparent; - color: var(--text-color); +.time-tracking { + margin-left: auto; + display: flex; + align-items: center; + gap: 0.75rem; } -.todo-text { - flex-grow: 1; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; +.time-spent { + font-family: 'JetBrains Mono', monospace; + font-size: 0.875rem; + color: var(--text-secondary); + font-weight: var(--font-weight-medium); } -.todo-text.editable { +.time-spent.editable { cursor: pointer; + padding: 0.25rem 0.5rem; + border-radius: var(--radius-sm); + transition: all 0.2s ease; } -.todo-text.editable:hover { - text-decoration: underline dashed; +.time-spent.editable:hover { + background-color: var(--border-color); color: var(--primary-color); } -.todo-text-edit { +.time-spent.counting { + color: var(--success-color); + font-weight: var(--font-weight-bold); + animation: pulse 1s infinite alternate; +} + +.time-edit { display: flex; align-items: center; - flex-grow: 1; + gap: 0.5rem; } -.text-input { - flex-grow: 1; - padding: 4px 8px; - border: none; - border-bottom: 1px solid var(--primary-color); +.time-input { + width: 3rem; + padding: 0.25rem 0.5rem; + text-align: center; + border: 2px solid var(--border-color); + border-radius: var(--radius-sm); + background-color: var(--secondary-color); + color: var(--text-color); + font-size: 0.875rem; +} + +.time-input:focus { + outline: none; + border-color: var(--primary-color); + box-shadow: 0 0 0 3px rgb(59 130 246 / 0.1); } -.text-save-btn, .text-cancel-btn { - width: 24px; - height: 24px; +.time-save-btn, +.time-cancel-btn { + width: 2rem; + height: 2rem; display: flex; align-items: center; justify-content: center; - border-radius: 50%; + border-radius: var(--radius-sm); border: 1px solid var(--border-color); background-color: var(--card-background); cursor: pointer; - margin-left: 2px; + font-size: 0.875rem; + transition: all 0.2s ease; } -.text-save-btn:hover { - background-color: var(--primary-color); - color: var(--secondary-color); +.time-save-btn:hover { + background-color: var(--success-color); + color: white; + border-color: var(--success-color); } -.text-cancel-btn:hover { - background-color: var(--primary-color); - color: var(--secondary-color); +.time-cancel-btn:hover { + background-color: var(--error-color); + color: white; + border-color: var(--error-color); +} + +.start-button, +.pause-button { + padding: 0.5rem 1rem; + border-radius: var(--radius-sm); + cursor: pointer; + font-size: 0.875rem; + font-weight: var(--font-weight-medium); + border: none; + transition: all 0.2s ease; + box-shadow: var(--shadow-sm); +} + +.start-button { + background-color: var(--success-color); + color: white; +} + +.start-button:hover { + background-color: #059669; + transform: translateY(-1px); + box-shadow: var(--shadow-md); +} + +.pause-button { + background-color: var(--warning-color); + color: white; +} + +.pause-button:hover { + background-color: #d97706; + transform: translateY(-1px); + box-shadow: var(--shadow-md); } .delete-button { background-color: transparent; - color: var(--text-color); - border: 1px solid var(--border-color); - border-radius: 4px; - padding: 4px 8px; + color: var(--error-color); + border: 1px solid var(--error-color); + border-radius: var(--radius-sm); + padding: 0.5rem 1rem; cursor: pointer; - transition: all 0.2s; + transition: all 0.2s ease; flex-shrink: 0; + font-size: 0.875rem; + font-weight: var(--font-weight-medium); } .delete-button:hover { - background-color: #ff4444; + background-color: var(--error-color); color: white; + transform: translateY(-1px); + box-shadow: var(--shadow-md); } .status-open { - border-left-color: #4a86e8; + border-left: 4px solid var(--primary-color); } .status-in-progress { - border-left-color: #fcba03; + border-left: 4px solid var(--warning-color); } .status-done { - border-left-color: #00c851; + border-left: 4px solid var(--success-color); } .completed .todo-text { text-decoration: line-through; - opacity: 0.7; -} \ No newline at end of file + color: var(--text-secondary); +} diff --git a/src/app/components/TodoItem/style.css.backup b/src/app/components/TodoItem/style.css.backup new file mode 100644 index 0000000..fbe62d1 --- /dev/null +++ b/src/app/components/TodoItem/style.css.backup @@ -0,0 +1,195 @@ +.time-spent.editable { + cursor: pointer; + text-decoration: underline dotted; +} + +.time-spent.editable:hover { + color: var(--primary-color); +} + +.time-edit { + display: flex; + align-items: center; +} + +.time-input { + width: 40px; + padding: 2px 4px; + text-align: center; + border: none; + border-bottom: 1px solid var(--primary-color); +} + +.time-save-btn, +.time-cancel-btn { + width: 24px; + height: 24px; + margin-left: 2px; + border-radius: 50%; + border: 1px solid var(--border-color); + background-color: var(--card-background); + cursor: pointer; + font-size: 0.8rem; +} + +.time-cancel-btn:hover, +.time-save-btn:hover { + background-color: var(--primary-color); + color: var(--secondary-color); +} + +.time-spent.counting { + color: #4caf50; + font-weight: bold; + animation: pulse 1s infinite alternate; +} + +.time-tracking { + margin-left: auto; + display: flex; + align-items: center; + gap: 8px; +} + +.time-spent { + font-family: monospace; +} + +.start-button, .pause-button { + padding: 3px 8px; + border-radius: 4px; + cursor: pointer; + font-size: 0.8rem; +} + +.start-button { + background-color: var(--primary-color); + color: var(--secondary-color); + border: none; +} + +.pause-button { + background-color: var(--primary-color); + color: var(--secondary-color); + border: none; +} + +.todo-item { + display: flex; + flex-direction: column; + gap: 6px; + padding: 5px 5px; + border-left: 4px solid; +} + +.todo-header, +.todo-content { + display: flex; + align-items: center; + gap: 8px; +} + +.todo-number { + font-family: monospace; + font-weight: bold; + color: var(--text-color); + flex-shrink: 0; +} + +.todo-status { + flex-shrink: 0; +} + +.todo-status select { + width: 100%; + padding: 4px; + border: none; + border-bottom: 1px solid var(--primary-color); + background-color: transparent; + color: var(--text-color); +} + +.todo-text { + flex-grow: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.todo-text.editable { + cursor: pointer; +} + +.todo-text.editable:hover { + text-decoration: underline dashed; + color: var(--primary-color); +} + +.todo-text-edit { + display: flex; + align-items: center; + flex-grow: 1; +} + +.text-input { + flex-grow: 1; + padding: 4px 8px; + border: none; + border-bottom: 1px solid var(--primary-color); +} + +.text-save-btn, .text-cancel-btn { + width: 24px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + border: 1px solid var(--border-color); + background-color: var(--card-background); + cursor: pointer; + margin-left: 2px; +} + +.text-save-btn:hover { + background-color: var(--primary-color); + color: var(--secondary-color); +} + +.text-cancel-btn:hover { + background-color: var(--primary-color); + color: var(--secondary-color); +} + +.delete-button { + background-color: transparent; + color: var(--text-color); + border: 1px solid var(--border-color); + border-radius: 4px; + padding: 4px 8px; + cursor: pointer; + transition: all 0.2s; + flex-shrink: 0; +} + +.delete-button:hover { + background-color: #ff4444; + color: white; +} + +.status-open { + border-left-color: #4a86e8; +} + +.status-in-progress { + border-left-color: #fcba03; +} + +.status-done { + border-left-color: #00c851; +} + +.completed .todo-text { + text-decoration: line-through; + opacity: 0.7; +} \ No newline at end of file diff --git a/src/app/components/TodoList/style.css b/src/app/components/TodoList/style.css index 69e92f3..3a9f425 100644 --- a/src/app/components/TodoList/style.css +++ b/src/app/components/TodoList/style.css @@ -5,12 +5,46 @@ .todo-lists-container { display: flex; flex-direction: column; - gap: 24px; - margin-top: 20px; - padding: 5px; + gap: 2rem; + padding: min(2rem, 4vw); + max-width: 1000px; + margin: 0 auto; +} + +@media (max-width: 768px) { + .todo-lists-container { + padding: 1rem; + gap: 1.5rem; + } } .active-todos, .completed-todos { width: 100%; + background-color: var(--card-background); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-md); + padding: 1.5rem; +} + +@media (max-width: 768px) { + .active-todos, + .completed-todos { + padding: 1rem; + } +} + +.active-todos h2, +.completed-todos h2 { + color: var(--text-color); + font-size: 1.5rem; + font-weight: var(--font-weight-bold); + margin-bottom: 1.5rem; + padding-bottom: 0.75rem; +} + +.todo-list { + display: flex; + flex-direction: column; + gap: 0.75rem; } diff --git a/src/app/styles/theme.css b/src/app/styles/theme.css index 4e1b2e3..22447a7 100644 --- a/src/app/styles/theme.css +++ b/src/app/styles/theme.css @@ -17,11 +17,24 @@ } :root { - --background-color: #ffffff; - --text-color: #131313; - --border-color: #ffffff; - --primary-color: #000000; + --background-color: #fafafa; + --text-color: #1a1a1a; + --text-secondary: #6b7280; + --border-color: #e5e7eb; + --primary-color: #3b82f6; + --primary-hover: #2563eb; --secondary-color: #ffffff; + --card-background: #ffffff; + --card-border: #f3f4f6; + --success-color: #10b981; + --warning-color: #f59e0b; + --error-color: #ef4444; + --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --radius-sm: 0.375rem; + --radius-md: 0.5rem; + --radius-lg: 0.75rem; --font-family: "Noto Sans Variable", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; --font-weight-light: 300; @@ -31,11 +44,21 @@ } [data-theme="dark"] { - --background-color: #141414; - --text-color: #fcfcfc; - --border-color: #141414; - --primary-color: #ffffff; - --secondary-color: #141414; + --background-color: #0f172a; + --text-color: #f1f5f9; + --text-secondary: #94a3b8; + --border-color: #334155; + --primary-color: #3b82f6; + --primary-hover: #2563eb; + --secondary-color: #1e293b; + --card-background: #1e293b; + --card-border: #334155; + --success-color: #10b981; + --warning-color: #f59e0b; + --error-color: #ef4444; + --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.3); + --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.4); + --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.4), 0 4px 6px -4px rgb(0 0 0 / 0.4); } body { @@ -63,14 +86,43 @@ button { font-weight: var(--font-weight-medium); } +.app-wrapper { + width: 100%; + min-height: 100vh; + background-color: var(--background-color); +} + .app-header { + width: 100%; + background-color: var(--card-background); + border-bottom: 1px solid var(--border-color); + box-shadow: var(--shadow-sm); +} + +.app-header-content { display: flex; justify-content: space-between; align-items: center; - padding: 10px; + padding: 1.5rem min(2rem, 4vw); + max-width: 1200px; + margin: 0 auto; +} + +@media (max-width: 768px) { + .app-header-content { + padding: 1rem; + } } .app-container { - max-width: 1000px; + max-width: 1200px; width: 100%; -} \ No newline at end of file + margin: 0 auto; + padding: 0 min(2rem, 4vw); +} + +@media (max-width: 768px) { + .app-container { + padding: 0 1rem; + } +}