diff --git a/.github/specs/feat-nav-selector-icons.md b/.github/specs/feat-nav-selector-icons.md
new file mode 100644
index 0000000..c51e6bf
--- /dev/null
+++ b/.github/specs/feat-nav-selector-icons.md
@@ -0,0 +1,58 @@
+# Feature: Change navigation selector icons
+
+## Overview
+
+**Goal:** The current view navigation that is displayed in parent mode currently displays custom svg drawing for Children, Tasks, Rewards, and Notifications. I have new png image files that I'd like to replace them with.
+
+**User Story:**
+As a user, when I am in parent mode, I should be able to use the navigation selector as usual but see the updated images in the buttons.
+
+**Rules:**
+The size of the navigation view-selector should still remain the same for both desktop and mobile. The images should replace the svg drawings.
+This will most likely only affect ParentView.vue / ParentLayout.vue
+
+**Drawing to image replacements:**
+aria-label: "Children" -> frontend/vue-app/public/nav/children.png
+aria-label: "Tasks" -> frontend/vue-app/public/nav/chores.png
+aria-label: "Rewards" -> frontend/vue-app/public/nav/rewards.png
+aria-label: "Notifications" -> frontend/vue-app/public/nav/notifications.png
+
+---
+
+## Data Model Changes
+
+### Backend Model
+
+### Frontend Model
+
+---
+
+## Backend Implementation
+
+## Backend Tests
+
+- [ ]
+
+---
+
+## Frontend Implementation
+
+## Frontend Tests
+
+- [ ]
+
+---
+
+## Future Considerations
+
+---
+
+## Acceptance Criteria (Definition of Done)
+
+### Backend
+
+- [ ]
+
+### Frontend
+
+- [ ]
diff --git a/.gitignore b/.gitignore
index ea75d07..5c297ec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,5 @@ frontend/vue-app/playwright-report/
frontend/vue-app/test-results/
backend/test-results/
.vscode/keybindings.json
+.DS_Store
+**/.DS_Store
diff --git a/frontend/vue-app/public/nav/children.png b/frontend/vue-app/public/nav/children.png
new file mode 100644
index 0000000..6b5733f
Binary files /dev/null and b/frontend/vue-app/public/nav/children.png differ
diff --git a/frontend/vue-app/public/children.png b/frontend/vue-app/public/nav/children1.png
similarity index 100%
rename from frontend/vue-app/public/children.png
rename to frontend/vue-app/public/nav/children1.png
diff --git a/frontend/vue-app/public/chores.png b/frontend/vue-app/public/nav/chores.png
similarity index 100%
rename from frontend/vue-app/public/chores.png
rename to frontend/vue-app/public/nav/chores.png
diff --git a/frontend/vue-app/public/notifications.png b/frontend/vue-app/public/nav/notifications.png
similarity index 100%
rename from frontend/vue-app/public/notifications.png
rename to frontend/vue-app/public/nav/notifications.png
diff --git a/frontend/vue-app/public/rewards.png b/frontend/vue-app/public/nav/rewards.png
similarity index 100%
rename from frontend/vue-app/public/rewards.png
rename to frontend/vue-app/public/nav/rewards.png
diff --git a/frontend/vue-app/src/components/child/ParentView.vue b/frontend/vue-app/src/components/child/ParentView.vue
index 57b1baa..8c1993a 100644
--- a/frontend/vue-app/src/components/child/ParentView.vue
+++ b/frontend/vue-app/src/components/child/ParentView.vue
@@ -301,7 +301,10 @@ function handleChoreConfirmation(event: Event) {
function isChoreCompletedToday(item: ChildTask): boolean {
if (item.pending_status !== 'approved' || !item.approved_at) return false
const today = new Date().toISOString().slice(0, 10)
- return item.approved_at.slice(0, 10) === today
+ if (item.approved_at.slice(0, 10) !== today) return false
+ // If the task has a schedule and today is not a scheduled day, don't show as completed
+ if (item.schedule && !isScheduledToday(item.schedule, new Date())) return false
+ return true
}
function isChorePending(item: ChildTask): boolean {
diff --git a/frontend/vue-app/src/layout/ParentLayout.vue b/frontend/vue-app/src/layout/ParentLayout.vue
index 9b532a4..f909681 100644
--- a/frontend/vue-app/src/layout/ParentLayout.vue
+++ b/frontend/vue-app/src/layout/ParentLayout.vue
@@ -1,7 +1,13 @@
@@ -69,22 +113,7 @@ onMounted(async () => {
aria-label="Children"
title="Children"
>
-
-
+
@@ -293,8 +280,37 @@ onMounted(async () => {
color: var(--button-active-text);
}
-.view-selector button.active svg {
- stroke: var(--button-active-text);
+.nav-icon {
+ width: 24px;
+ height: 24px;
+ object-fit: contain;
+ opacity: 0.55;
+ transition: opacity 0.18s;
+ display: block;
+}
+
+.nav-icon-wrap {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.notification-badge {
+ position: absolute;
+ top: -3px;
+ right: -3px;
+ width: 8px;
+ height: 8px;
+ background: var(--btn-danger, #ef4444);
+ border-radius: 50%;
+ border: 1.5px solid var(--button-bg, #fff);
+ pointer-events: none;
+}
+
+.view-selector button.active .nav-icon,
+.view-selector button:hover .nav-icon {
+ opacity: 1;
}
.view-selector button:hover:not(.active) {