Skip to content

Commit b5ef908

Browse files
committed
release: finalize FocusFlow v1.0
1 parent 938c187 commit b5ef908

74 files changed

Lines changed: 4809 additions & 1071 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 103 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -1,216 +1,162 @@
1-
<div align="center">
1+
# FocusFlow
22

3-
# DevBreak
3+
FocusFlow is an installable Angular productivity workspace for focused work, lightweight task planning, and healthier recovery habits.
44

5-
**A calm Angular productivity workspace for focused work, operational task flow, and sustainable recovery habits.**
6-
7-
![Angular](https://img.shields.io/badge/Angular-21-DD0031?style=for-the-badge&logo=angular&logoColor=white)
8-
![TypeScript](https://img.shields.io/badge/TypeScript-5.9-3178C6?style=for-the-badge&logo=typescript&logoColor=white)
9-
![RxJS](https://img.shields.io/badge/RxJS-7.8-B7178C?style=for-the-badge&logo=reactivex&logoColor=white)
10-
![SCSS](https://img.shields.io/badge/SCSS-Responsive%20UX-CC6699?style=for-the-badge&logo=sass&logoColor=white)
11-
![Cypress](https://img.shields.io/badge/Cypress-E2E-17202C?style=for-the-badge&logo=cypress&logoColor=white)
12-
13-
</div>
14-
15-
---
5+
It combines a focus timer, Pomodoro workflows, a Kanban board, and wellness-aware break suggestions in a frontend-only PWA that works well on desktop, tablet, and mobile.
166

177
## Overview
188

19-
DevBreak is a portfolio-grade productivity workspace built with Angular. It combines an operational Kanban board, focus sessions, keyboard-first workflows, wellness-aware reminders, local persistence, accessibility support, and responsive dashboard ergonomics.
9+
FocusFlow is built around a simple idea: productivity tools should support attention without ignoring recovery. The app helps users plan tasks, run focused sessions, track meaningful daily progress, and take small movement or wellness breaks without adding noise to the workflow.
2010

21-
The product is intentionally calm: it helps users move work forward without turning productivity into a noisy scoring system.
11+
The application is fully client-side and offline-first. User preferences, sessions, tasks, wellness exercises, language settings, and productivity state are persisted locally with safe restoration and fallback behavior.
2212

23-
---
13+
## Features
2414

25-
## Highlights
15+
- Focus timer with completion tracking and daily productivity stats
16+
- Pomodoro mode with configurable focus, short break, and long break durations
17+
- Wellness mode for movement-friendly work sessions
18+
- Hybrid mode that blends focus sessions with active recovery prompts
19+
- Kanban workspace with task creation, editing, completion, archiving, restore, filtering, sorting, and drag/drop-ready workflows
20+
- Custom wellness exercises by category, including stretching, mobility, cardio, strength, and Pilates
21+
- Sound personalization with volume, preset, and repeat alert settings
22+
- Runtime internationalization for English, Spanish, and French
23+
- Installable PWA support with manifest, service worker, offline asset caching, and app-like standalone behavior
24+
- LocalStorage-backed offline persistence with defensive normalization for legacy or malformed data
25+
- Responsive layouts for desktop, installed PWA windows, tablets, and mobile screens
26+
- Accessibility-minded interaction design with keyboard navigation, focus handling, labels, and live announcements
2627

27-
- Operational Kanban board with create, edit, archive, restore, drag/drop-ready workflows
28-
- Quick-add per column for low-friction task capture
29-
- Advanced filters, sorting, density modes, and search
30-
- Focus ownership mode with active-task workflow
31-
- Timer and Pomodoro sessions with resilient timestamp-based persistence
32-
- Adaptive wellness reminders for hydration, posture, and movement recovery
33-
- Contextual recovery suggestions and lightweight wellness consistency tracking
34-
- Keyboard shortcut personalization with conflict prevention
35-
- Workspace and daily productivity reset actions
36-
- Dark/light themes, reduced-motion support, and responsive layouts
37-
- Cypress E2E coverage for core workflows, persistence, keyboard, and accessibility behavior
28+
## Tech Stack
3829

39-
---
30+
- Angular
31+
- TypeScript
32+
- RxJS
33+
- SCSS
34+
- Angular CDK
35+
- Angular service worker / PWA support
36+
- ngx-translate
37+
- Vitest / Angular test runner
38+
- Cypress
4039

41-
## Product Philosophy
40+
## Architecture
4241

43-
DevBreak is not a Pomodoro clone and not a fitness tracker. It is a focused workspace that treats productivity and recovery as part of the same workflow.
42+
FocusFlow uses a frontend-only Angular architecture with feature modules for the timer and Kanban workspace. State is owned by focused Angular services and exposed through RxJS streams so UI components can stay mostly presentational.
4443

45-
Wellness guidance is intentionally subtle:
44+
The app does not require a backend. Persistence is handled through localStorage with validation and normalization on restore. Productivity metrics are derived from canonical session and task history instead of separate drifting counters.
4645

47-
- no blocking modals
48-
- no gamification pressure
49-
- no productivity guilt
50-
- no invasive notifications
51-
- supportive summaries only after meaningful activity exists
46+
Core architectural choices:
5247

53-
---
48+
- Client-side only, deployable as static assets
49+
- Offline-first PWA behavior after the first visit
50+
- Service-owned state for timer, session history, tasks, wellness preferences, shortcuts, language, and workspace mode
51+
- Derived productivity stats for completed sessions, skipped sessions, focus minutes, streaks, completed tasks, and recovery rhythm
52+
- Lightweight persistence with safe fallbacks instead of sync infrastructure
5453

55-
## Architecture
54+
## Installation
5655

57-
The app uses a modular feature structure with service-owned state and presentational component boundaries.
56+
Install dependencies:
5857

59-
```text
60-
src/app/
61-
features/
62-
kanban/
63-
components/
64-
models/
65-
services/
66-
timer/
67-
components/
68-
models/
69-
services/
70-
models/
71-
services/
58+
```bash
59+
npm install
7260
```
7361

74-
Key architectural choices:
75-
76-
- RxJS streams for timer, workspace mode, focus, wellness, and derived UI state
77-
- LocalStorage persistence with validation and safe fallbacks
78-
- Angular CDK DragDrop for board interactions
79-
- Focused presentational component boundaries for settings, timer actions, wellness cards, and insights
80-
- CSS variables for density, theme, and responsive ergonomics
81-
- Minimal global state, no backend assumptions, no heavyweight store layer
62+
Run the development server:
8263

83-
---
84-
85-
## Accessibility
86-
87-
DevBreak includes an accessibility pass across semantics, keyboard behavior, screen-reader feedback, and motion preferences.
64+
```bash
65+
npm start
66+
```
8867

89-
- Landmark and heading structure
90-
- Accessible form labels and icon/control labels
91-
- Visible focus states
92-
- ESC handling and focus restoration
93-
- Keyboard activation parity for primary workflows
94-
- ARIA live regions for meaningful state changes
95-
- `prefers-reduced-motion` support
96-
- Cypress coverage for keyboard and accessibility-critical flows
68+
Open the app:
9769

98-
---
70+
```text
71+
http://localhost:4200/
72+
```
9973

100-
## Testing & Reliability
74+
Create a production build:
10175

10276
```bash
103-
npm test
10477
npm run build
105-
npm run e2e
10678
```
10779

108-
Current validation status:
109-
110-
- 56 automated tests passing
111-
- Production build passing
112-
- Cypress workflow coverage stable
113-
114-
Coverage includes:
115-
116-
- Unit tests for timer persistence, wellness heuristics, shortcuts, filters, density, and component behavior
117-
- Cypress E2E tests for Kanban, focus sessions, persistence restore, keyboard workflows, and reduced-motion smoke coverage
118-
- Production build validation through Angular budgets
119-
120-
Note for local Windows shells: if Cypress inherits `ELECTRON_RUN_AS_NODE`, clear it before running E2E.
80+
Run the unit test suite:
12181

122-
```powershell
123-
Remove-Item Env:ELECTRON_RUN_AS_NODE -ErrorAction SilentlyContinue
124-
$env:CYPRESS_SKIP_VERIFY='true'
125-
npm run e2e
82+
```bash
83+
npm test -- --watch=false
12684
```
12785

128-
---
129-
130-
## Tech Stack
131-
132-
- Angular
133-
- TypeScript
134-
- RxJS
135-
- SCSS
136-
- Angular CDK
137-
- Vitest / Angular unit testing
138-
- Cypress
139-
- GitHub Actions
140-
141-
---
142-
143-
## Getting Started
144-
145-
Use the Node version in `.nvmrc`.
86+
Run Cypress E2E tests:
14687

14788
```bash
148-
npm install
149-
npm start
89+
npm run e2e
15090
```
15191

152-
Open:
92+
## PWA Support
15393

154-
```text
155-
http://localhost:4200/
156-
```
94+
FocusFlow includes Angular service worker support and a configured web app manifest.
15795

158-
Production build:
96+
The production build supports:
15997

160-
```bash
161-
npm run build
162-
```
98+
- Desktop installation in Chromium-based browsers such as Chrome and Edge
99+
- Android installation through supported mobile browsers
100+
- Standalone app display mode
101+
- Offline reload after the first successful visit
102+
- Cached application shell and static assets
103+
- Local persistence for tasks, settings, wellness exercises, language, theme, and productivity history
163104

164-
---
105+
Because the app is frontend-only, offline support is intentionally local-first. There is no account system or cloud sync layer.
165106

166-
## Deployment
107+
## Accessibility
167108

168-
The app is static-build ready.
109+
Accessibility is treated as part of the product surface, not as a separate mode.
169110

170-
### GitHub Pages
111+
The app includes:
171112

172-
The included workflow builds the Angular app with a repository-based `base-href`, uploads `dist/devbreak-timer/browser`, and adds a `404.html` fallback for SPA-compatible refresh behavior.
113+
- Keyboard-accessible primary flows
114+
- Visible focus states
115+
- Focus restoration for settings and dialog-like interactions
116+
- Escape handling where appropriate
117+
- Form labels and accessible control names
118+
- ARIA live announcements for important timer and task state changes
119+
- Responsive layouts that preserve readable controls on small screens
120+
- Reduced-motion considerations in the UI layer
173121

174-
Required repository setting:
122+
## Screenshots
175123

176-
```text
177-
Settings -> Pages -> Source -> GitHub Actions
178-
```
124+
Screenshots are intentionally left as placeholders so they can reflect the final deployed build.
179125

180-
### Vercel
126+
### Desktop
181127

182-
Recommended settings:
128+
Add a desktop screenshot here.
183129

184-
```text
185-
Framework Preset: Angular
186-
Build Command: npm run build
187-
Output Directory: dist/devbreak-timer/browser
188-
Install Command: npm ci
189-
```
130+
### Mobile
131+
132+
Add a mobile screenshot here.
190133

191-
For SPA fallback routing, add a Vercel rewrite if routes are introduced later.
134+
### Wellness Mode
192135

193-
---
136+
Add a wellness mode screenshot here.
194137

195-
## GitHub Actions
138+
### Kanban Workspace
196139

197-
Workflows are intentionally lightweight:
140+
Add a Kanban workspace screenshot here.
198141

199-
- CI: install, unit tests, production build
200-
- Pages deploy: install, unit tests, production build, upload static artifact
142+
## Future Improvements
201143

202-
Cypress remains available for local and future CI expansion without making the default pipeline heavy.
144+
FocusFlow is intentionally complete as a local-first PWA, but a few realistic extensions would fit the product:
203145

204-
---
146+
- Optional cloud sync for users who want multi-device continuity
147+
- Richer productivity and recovery analytics
148+
- More built-in wellness exercise presets
149+
- Optional import/export for local data portability
150+
- Additional language packs
205151

206-
## Portfolio Notes
152+
## Release Notes
207153

208-
DevBreak demonstrates production-minded frontend work:
154+
FocusFlow is designed as a polished portfolio project that demonstrates production-minded Angular development:
209155

210-
- product-oriented UX decisions
211-
- accessible keyboard-first interaction design
212-
- resilient local persistence
213-
- maintainable Angular boundaries
214-
- responsive operational UI
215-
- calm wellness-aware behavior
216-
- meaningful automated reliability coverage
156+
- Modular frontend architecture
157+
- Offline-first PWA integration
158+
- Responsive operational UI
159+
- Local persistence and defensive state restoration
160+
- Runtime i18n
161+
- Accessibility-aware interaction design
162+
- Behavior-focused tests around session tracking, tasks, wellness logic, and productivity stats

angular.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
"budgets": [
4848
{
4949
"type": "initial",
50-
"maximumWarning": "500kB",
50+
"maximumWarning": "550kB",
5151
"maximumError": "1MB"
5252
},
5353
{
@@ -56,7 +56,8 @@
5656
"maximumError": "10kb"
5757
}
5858
],
59-
"outputHashing": "all"
59+
"outputHashing": "all",
60+
"serviceWorker": "ngsw-config.json"
6061
},
6162
"development": {
6263
"optimization": false,

cypress/e2e/keyboard-accessibility.cy.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,22 @@ describe('Keyboard and accessibility workflows', () => {
8080
cy.focused().should('have.attr', 'data-testid', 'settings-button');
8181
});
8282

83+
it('keeps keyboard focus inside the settings dialog until it closes', () => {
84+
cy.visit('/');
85+
86+
cy.getByTestId('settings-button').click();
87+
cy.focused().should('contain.text', 'Close');
88+
89+
cy.focused().type('{shift+tab}');
90+
cy.focused().should('contain.text', 'Apply');
91+
92+
cy.focused().type('{tab}');
93+
cy.focused().should('contain.text', 'Close');
94+
95+
cy.get('body').type('{esc}');
96+
cy.focused().should('have.attr', 'data-testid', 'settings-button');
97+
});
98+
8399
it('keeps workflows usable with reduced motion enabled', () => {
84100
cy.clock(now, ['Date', 'setInterval', 'clearInterval']);
85101
cy.visit('/', {

0 commit comments

Comments
 (0)