feat: implement comprehensive task management system with SCSS modules

- Add complete task management functionality with atomic design
- Create TaskCard component with checkbox and delete functionality
- Implement TaskForm with drawer interface for task editing
- Add Tasks organism with right-side drawer and completion states
- Move TodayProgress and QuickActions to Sidebar for better UX
- Implement SCSS modules for all components with proper styling
- Add task statistics to progress tracking
- Update store with task management actions and persistence
- Improve layout with 30/70 column split for tasks and timer
- Add SASS dependency for SCSS compilation
- Ensure completed tasks are non-editable with proper visual states
This commit is contained in:
Carlos Gutierrez
2025-09-02 19:42:32 -04:00
parent 2faa54fa17
commit 8f9e4f54df
17 changed files with 1485 additions and 180 deletions

View File

@@ -0,0 +1,38 @@
.container {
padding: 1.5rem;
max-width: 64rem;
margin: 0 auto;
display: flex;
flex-direction: column;
gap: 2rem;
animation: fadeIn 0.3s ease-in-out;
}
.grid {
display: grid;
grid-template-columns: 1fr;
gap: 2rem;
}
@media (min-width: 768px) {
.grid {
grid-template-columns: 35% 1fr;
}
}
@media (min-width: 1024px) {
.grid {
grid-template-columns: 30% 1fr;
}
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}

View File

@@ -0,0 +1,61 @@
.card {
// Card container styles
}
.cardContent {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.actionButton {
width: 100%;
justify-content: flex-start;
gap: 0.75rem;
height: auto;
padding: 0.75rem;
min-height: 5rem;
transition: all 0.2s ease;
}
.soundButton {
&:hover {
border-color: hsl(var(--accent));
background-color: hsl(var(--accent) / 0.05);
}
}
.exportButton {
&:hover {
border-color: hsl(var(--chart-2));
background-color: hsl(var(--chart-2) / 0.05);
}
}
.buttonContent {
text-align: left;
flex: 1;
min-width: 0;
}
.buttonTitle {
font-weight: 500;
word-break: break-words;
}
.buttonDescription {
font-size: 0.875rem;
color: hsl(var(--muted-foreground));
word-break: break-words;
line-height: 1.5;
}
.soundIcon {
color: hsl(var(--accent));
flex-shrink: 0;
}
.exportIcon {
color: hsl(var(--chart-2));
flex-shrink: 0;
}

View File

@@ -0,0 +1,123 @@
.card {
cursor: pointer !important;
transition: all 0.2s ease !important;
display: flex !important;
flex-direction: column !important;
justify-content: center !important;
align-items: flex-start !important;
&:hover {
box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1) !important;
transform: scale(1.02) !important;
}
&.completed {
opacity: 0.6 !important;
background-color: hsl(var(--muted) / 0.5) !important;
cursor: default !important;
&:hover {
box-shadow: none !important;
transform: none !important;
opacity: 0.6 !important;
}
}
}
.cardContent {
padding: 1rem !important;
width: 100% !important;
}
.content {
display: flex !important;
align-items: center !important;
justify-content: space-between !important;
gap: 0.75rem !important;
width: 100% !important;
}
.mainContent {
flex: 1 !important;
min-width: 0 !important;
}
.title {
font-weight: 500 !important;
font-size: 0.875rem !important;
line-height: 1.25 !important;
margin-bottom: 0.25rem !important;
&.completed {
text-decoration: line-through !important;
color: hsl(var(--muted-foreground)) !important;
}
}
.description {
font-size: 0.75rem !important;
color: hsl(var(--muted-foreground)) !important;
display: -webkit-box !important;
-webkit-line-clamp: 2 !important;
-webkit-box-orient: vertical !important;
overflow: hidden !important;
}
.metaInfo {
display: flex !important;
align-items: center !important;
gap: 0.5rem !important;
margin-top: 0.5rem !important;
}
.metaItem {
font-size: 0.75rem !important;
color: hsl(var(--muted-foreground)) !important;
}
.actions {
display: flex !important;
flex-direction: column !important;
align-items: flex-end !important;
gap: 0.5rem !important;
flex-shrink: 0 !important;
}
.deleteButton {
background: none !important;
border: none !important;
cursor: pointer !important;
padding: 0.25rem !important;
border-radius: 0.25rem !important;
transition: all 0.2s ease !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
&:hover {
background-color: hsl(var(--destructive) / 0.1) !important;
color: hsl(var(--destructive)) !important;
}
}
.deleteIcon {
width: 1rem !important;
height: 1rem !important;
color: hsl(var(--destructive)) !important;
transition: color 0.2s ease !important;
}
.checkbox {
flex-shrink: 0 !important;
margin: 0 !important;
align-self: center !important;
}
.completionIndicator {
width: 1rem !important;
height: 1rem !important;
border-radius: 50% !important;
background-color: #22c55e !important;
flex-shrink: 0 !important;
margin-top: 0.25rem !important;
}

View File

@@ -0,0 +1,41 @@
.form {
// Form container styles
}
.formContent {
display: flex;
flex-direction: column;
gap: 1rem;
}
.field {
// Individual field container
}
.fieldGrid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
}
.input {
margin-top: 0.5rem;
}
.textarea {
margin-top: 0.5rem;
}
.buttonGroup {
display: flex;
gap: 0.5rem;
padding-top: 1rem;
}
.submitButton {
flex: 1;
}
.cancelButton {
// Cancel button styles
}

View File

@@ -0,0 +1,56 @@
.card {
height: 100%;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: center;
}
.cardContent {
flex: 1;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: center;
}
.container {
display: flex;
flex-direction: column;
gap: 1rem;
}
.taskList {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.emptyState {
font-size: 0.875rem;
color: hsl(var(--muted-foreground));
text-align: center;
padding: 2rem 0;
}
.completedSection {
padding-top: 1rem;
border-top: 1px solid hsl(var(--border));
}
.completedTitle {
font-size: 0.875rem;
font-weight: 500;
color: hsl(var(--muted-foreground));
margin-bottom: 0.75rem;
}
.completedList {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.sheetContent {
padding: 1rem;
}

View File

@@ -0,0 +1,54 @@
.card {
margin-top: 1.5rem;
}
.cardContent {
display: flex;
flex-direction: column;
gap: 1rem;
}
.statRow {
display: flex;
align-items: center;
justify-content: space-between;
}
.statLabel {
font-size: 0.875rem;
color: hsl(var(--muted-foreground));
word-break: break-words;
}
.statValue {
font-weight: 500;
flex-shrink: 0;
margin-left: 0.5rem;
}
.completionValue {
color: hsl(var(--chart-2));
}
.progressBar {
width: 100%;
background-color: hsl(var(--muted));
border-radius: 9999px;
height: 0.5rem;
}
.progressFill {
background-color: hsl(var(--chart-2));
height: 0.5rem;
border-radius: 9999px;
transition: all 0.3s ease;
}
.taskStats {
padding-top: 1rem;
border-top: 1px solid hsl(var(--border));
}
.taskStatsTitle {
margin-bottom: 0.75rem;
}