Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
a990b86
Implement scroll tracking and restore functionality in SingleContent …
johan-bell Jun 9, 2025
8d19bef
Add test for restoring reading progress in SingleContent component
johan-bell Jun 9, 2025
05d8795
Add reading progress tracking functionality with localStorage support
johan-bell Jun 9, 2025
e3d55be
Add tests for reading progress functionality in globalConfig
johan-bell Jun 9, 2025
54c0493
Add ContinueReading component to display watched media with progress …
johan-bell Jun 9, 2025
0b656e0
Update ContinueWatching component title and adjust layout classes
johan-bell Jun 9, 2025
2bab6e3
Add ContinueProgress component to track and display media progress
johan-bell Jun 9, 2025
e2de778
Add ContinueReading component to HomePage for displaying readed content
johan-bell Jun 9, 2025
3d079e3
Refactor ContinueProgress and ContinueReading components to utilize m…
johan-bell Jun 8, 2026
1d9dac0
Remove ContinueProgress component from HomePage as part of a cleanup …
johan-bell Jun 8, 2026
1ed5b99
Add reading time helpers for dwell-based progress tracking.
johan-bell Jun 8, 2026
8a72ec6
Persist in-progress article reading percentage in localStorage.
johan-bell Jun 8, 2026
13f0cc0
Track article reading progress with visibility and scroll velocity ga…
johan-bell Jun 8, 2026
954b486
Wire reading progress tracking into SingleContent text articles.
johan-bell Jun 8, 2026
f52779a
Read Continue Reading rows from saved article progress.
johan-bell Jun 8, 2026
28c91b8
Document dwell-based reading progress tracking.
johan-bell Jun 8, 2026
89b2963
Refactor MockIntersectionObserver constructor and clean up imports in…
johan-bell Jun 8, 2026
5d0bd5e
Enhance reading progress tracker by adding a watch function for impro…
johan-bell Jun 8, 2026
b1a605e
Add WPM-scaled skim cap and idle timeout to reading time helpers.
johan-bell Jun 9, 2026
5ee36b6
Tighten reading progress tracker with block-end, WPM skim, and idle g…
johan-bell Jun 9, 2026
1836577
Extend reading progress tracker tests for new gates and auto-restore.
johan-bell Jun 9, 2026
b907a16
Update reading progress tracker docs and diagram for new gates.
johan-bell Jun 9, 2026
7c64112
Update performanceNowSpy type in reading progress tracker tests for i…
johan-bell Jun 10, 2026
88bede4
tmp
johan-bell Jun 10, 2026
3691354
Refactor reading progress tracker to enhance skim detection and block…
johan-bell Jun 11, 2026
f0c62fd
Enhance reading time utility with detailed comments and new constants…
johan-bell Jun 11, 2026
142b06f
Refactor reading progress tracker tests to incorporate new functions …
johan-bell Jun 11, 2026
1cfcea7
Update reading time tests to include new functions for estimating wor…
johan-bell Jun 11, 2026
454dd4a
Update reading progress tracker documentation and diagram to reflect …
johan-bell Jun 11, 2026
aacd003
Refactor reading progress tracker logic to enable tracking based on t…
johan-bell Jun 11, 2026
bbe014f
Update reading progress tracker tests to use MaybeElement
johan-bell Jun 11, 2026
29c9c7e
Add continue-reading prompt and segment-based progress tracking.
johan-bell Jun 15, 2026
5741ec4
Refactor ContinueReadingPrompt component to simplify visibility logic…
johan-bell Jun 15, 2026
7ea9586
Add reading progress tracker QA specs and sign-off results.
johan-bell Jun 15, 2026
13b25e8
Align ContentTile components with main after rebase.
johan-bell Jun 15, 2026
261154d
delete qa
johan-bell Jun 15, 2026
9f4e1e9
Add reading progress tracker documentation and visual overview
johan-bell Jun 15, 2026
620f15b
Add socket.io message documentation and architecture diagrams
johan-bell Jun 15, 2026
1b6595c
Update documentation and references across multiple files
johan-bell Jun 15, 2026
3735619
Refactor content progress tracking and update UI components
johan-bell Jun 15, 2026
90ca0c4
Enhance SingleContent tests with improved progress tracking and cleanup
johan-bell Jun 15, 2026
1195212
Unify reading and media progress bars on content tiles.
johan-bell Jun 17, 2026
7b093d5
Publish desktop sidebar width as a CSS variable.
johan-bell Jun 17, 2026
d8ce1ea
Redesign the continue-reading prompt as a compact chip.
johan-bell Jun 17, 2026
a6aeca0
Clean up continue-reading i18n seed strings.
johan-bell Jun 17, 2026
619e80f
renameContinue to ContinueProgress component and update related tests
johan-bell Jun 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Luminary is an offline-first content platform. The repo is a monorepo with no ro
- `app/` — Offline-first Vue 3 PWA (Vite, port 4174). See `app/CLAUDE.md`.
- `cms/` — Vue 3 CMS SPA (Vite, port 4175). See `cms/CLAUDE.md`.
- `playwright-tests/` — Standalone E2E suite targeting **deployed** environments. Not wired into any package build. See `playwright-tests/README.md`.
- `docs/` — ADRs (`docs/adr/`) and architecture diagrams.
- `docs/` — ADRs (`docs/adr/`), guides, architecture, and feature docs. Index: `docs/README.md`.

**Always read the relevant subpackage's `CLAUDE.md` before working there.** This file only covers cross-package concerns.

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ lu·​mi·​nary - ˈlü-mə-ˌner-ē
- `app`: Web and native frontend app
- `cms`: Backend CMS for managing content
- `shared`: Shared library used by the CMS and app
- `docs`: Documentation, including ADRs
- `docs`: Documentation — see [docs/README.md](./docs/README.md) (ADRs, guides, architecture, features)

## Architectural Decision Records

Expand Down Expand Up @@ -49,4 +49,4 @@ See the [Shared readme](./shared/README.md)

### Project automation

See the [Project automation readme](./docs/project-addons/automation/project-automation.md)
See the [Project automation guide](./docs/guides/project-automation.md)
2 changes: 1 addition & 1 deletion api/src/db/schemaUpgrade/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ Schema upgrades can be safely removed when:
curl http://admin:password@localhost:5984/database/_schemas
```
2. **Archive old upgrades** (optional but recommended):
- Move old upgrade files to `docs/historical-upgrades/` for reference
- Move old upgrade files to `docs/archive/historical-upgrades/` for reference
- Include git commit hash and date when they were removed
3. **Remove from codebase**:
- Delete old upgrade files
Expand Down
5 changes: 4 additions & 1 deletion api/src/db/seedingDocs/lang-eng.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,17 @@
"settings.device_info.title": "Device info",
"settings.device_info.description": "Provide these details when contacting support",
"home.title": "Home",
"home.continue": "Continue Watching",
"home.continue": "Continue",
"home.continueListening": "Continue Listening",
"explore.title": "Explore",
"explore.other": "Other",
"watch.title": "Watch",
"home.newest": "Newest",
"content.related_title": "Related",
"content.coming_soon": "Coming soon",
"content.continueReading.prompt": "Continue where you left off?",
"content.continueReading.action": "Continue where you left off",
"content.continueReading.dismiss": "Start from top",
"notification.login.title": "You are missing out!",
"notification.login.message": "Click here to create an account or log in",
"notification.offline.title": "You are offline.",
Expand Down
5 changes: 4 additions & 1 deletion api/src/db/seedingDocs/lang-fra.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,17 @@
"settings.device_info.title": "Informations sur l'appareil",
"settings.device_info.description": "Fournissez ces détails lors de la prise de contact avec le support",
"home.title": "Accueil",
"home.continue": "Continuer à regarder",
"home.continue": "Continuer",
"home.continueListening": "Continuer à écouter",
"explore.title": "Explore",
"explore.other": "Autre",
"watch.title": "Regarde",
"home.newest": "Nouveaux",
"content.related_title": "Contenus similaires",
"content.coming_soon": "Bientôt disponible",
"content.continueReading.prompt": "Reprendre où vous vous êtes arrêté ?",
"content.continueReading.action": "Reprendre où vous vous êtes arrêté",
"content.continueReading.dismiss": "Recommencer depuis le début",
"notification.login.title": "Vous manquez quelque chose!",
"notification.login.message": "Cliquez ici pour créer un compte ou vous connecter.",
"notification.offline.title": "Vous êtes hors ligne.",
Expand Down
6 changes: 3 additions & 3 deletions api/src/permissions/permissions.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -683,7 +683,7 @@ export class PermissionSystem extends EventEmitter {
}

/**
* Update upstream inherited permissions on the parent group's map for a given ACL entry (referring to (1) in permissionSystem.drawio.svg)
* Update upstream inherited permissions on the parent group's map for a given ACL entry (referring to (1) in docs/architecture/diagrams/permissionSystem.drawio.svg)
* This function is an event handler for the AclEntryUpdatedEvent, and should only be called from within a group (PermissionSystem) object (i.e. do not call it on parent or child groups)
*/
private upsertUpstreamInheritedMap(event: AclEntryUpdatedEvent) {
Expand All @@ -697,7 +697,7 @@ export class PermissionSystem extends EventEmitter {
}

/**
* Update downstream inherited group maps for a given DocType in the passed ACL group map (referring to (3) in permissionSystem.drawio.svg)
* Update downstream inherited group maps for a given DocType in the passed ACL group map (referring to (3) in docs/architecture/diagrams/permissionSystem.drawio.svg)
*/
private upsertDownstreamInheritedMap(aclGroup: AclGroupMap, type: DocType) {
const parentGroup = aclGroup.ref;
Expand Down Expand Up @@ -740,7 +740,7 @@ export class PermissionSystem extends EventEmitter {
}

/**
* Iteratively forward inherited group maps until the top level parent has been reached (referring to (3) in permissionSystem.drawio.svg)
* Iteratively forward inherited group maps until the top level parent has been reached (referring to (3) in docs/architecture/diagrams/permissionSystem.drawio.svg)
*/
private forwardInheritedMap(
target: Uuid,
Expand Down
4 changes: 3 additions & 1 deletion app/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,9 @@ Uses `@auth0/auth0-vue` with multiple providers selected at runtime from `AuthPr

### i18n

UI strings live in CouchDB Language documents, loaded at runtime (`src/i18n.ts`). English seed is `../api/src/db/seedingDocs/lang-eng.json`. See `../docs/translations.md` for the workflow.
UI strings live in CouchDB Language documents, loaded at runtime (`src/i18n.ts`). English seed is `../api/src/db/seedingDocs/lang-eng.json`. See `../docs/guides/translations.md` for the workflow.

Reading progress (segments, gates, homepage row): `../docs/features/reading-progress-tracker/README.md`.

### Plugins

Expand Down
12 changes: 9 additions & 3 deletions app/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ This is the frontend of the Luminary app. It's an offline-first Vue app that run

Cross-cutting services follow a **contract + injection key + build-time virtual module** pattern: Vite resolves each `virtual:…` id to an entry under **`src/build-time/plugins/<name>/`**, and **`src/build-time/contracts/plugin-registry.ts`** registers those services on the app. Feature code uses **`inject`** with keys from **`token.ts`** under **`src/build-time/contracts/`**, not direct imports of adapter code.

**Example in this repo:** the **demo banner** (`virtual:demo-banner`, `src/build-time/plugins/demo-banner/`). Full pattern and diagrams: **[docs/vue-plugin-architecture/README.md](../docs/vue-plugin-architecture/README.md)**. Step-by-step for a **second** plugin: **[Adding another build-swapped plugin](../docs/vue-plugin-architecture/README.md#adding-another-plugin)**.
**Example in this repo:** the **demo banner** (`virtual:demo-banner`, `src/build-time/plugins/demo-banner/`). Full pattern and diagrams: **[docs/features/vue-plugin-architecture/README.md](../docs/features/vue-plugin-architecture/README.md)**. Step-by-step for a **second** plugin: **[Adding another build-swapped plugin](../docs/features/vue-plugin-architecture/README.md#adding-another-plugin)**.

## Project structure

Expand Down Expand Up @@ -67,16 +67,22 @@ app/

UI strings are stored in CouchDB language documents and loaded at runtime via `src/i18n.ts` using [vue-i18n](https://vue-i18n.intlify.dev/). The default English strings are seeded from `api/src/db/seedingDocs/lang-eng.json`.

See [docs/translations.md](../docs/translations.md) for details on:
See [docs/guides/translations.md](../docs/guides/translations.md) for details on:

- How to add or update translation strings
- Strings that contain named interpolation placeholders (`{variable}`)
- Strings that are shown only under specific UI conditions
- Strings reserved for future use

## Reading progress

The app tracks how far a user has read through article text and surfaces in-progress posts on the homepage **Continue Reading** row. Segment-based gates (visibility, skim detection, dwell time) ensure progress reflects actual reading, including long paragraphs on small screens.

Full design, diagrams, and constants: **[docs/features/reading-progress-tracker/README.md](../docs/features/reading-progress-tracker/README.md)**.

## Local setup

Refer to the [setup guide](../docs/setup-vue-app.md).
Refer to the [setup guide](../docs/guides/setup-vue-app.md).

When running `npm run dev` the local reloading server of the app will start at http://localhost:4174.

Expand Down
2 changes: 1 addition & 1 deletion app/src/build-time/plugins/Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@ This folder holds **implementations** of app services that depend on the build t
2. Implement the service (and optional UI shell) in `./<name>/`.
3. Register `virtual:<name>` in `buildTargetVirtuals.ts` and call `install*` from `plugin-registry.ts`.

Full diagrams and bootstrap details: **[docs/vue-plugin-architecture/README.md](../../../../docs/vue-plugin-architecture/README.md)**.
Full diagrams and bootstrap details: **[docs/features/vue-plugin-architecture/README.md](../../../../docs/features/vue-plugin-architecture/README.md)**.
Loading
Loading