ff423fe3ba
feat(git): strict conventional-commit parsing
2026-09-16 11:45:15 +02:00
38d3758d2d
feat(brand): align default client brand colour with new teal palette
2026-09-16 11:34:51 +02:00
40af2b4c98
feat(theme): retune tokens to Modern Color Palette
...
Palette:
#051a2d Deep Navy -> page (dark base) + text-primary (light)
#068187 Teal Green -> brand (light mode, AA contrast on white)
#10bbc3 Aqua Blue -> brand (dark mode, vibrant on navy)
#fea24f Sunset Orange -> priority-high
#a60e35 Crimson Red -> accent + priority-critical
The plan's reservation rules are preserved: the crimson accent still appears
only on overdue dates, the inbox count badge, and critical priority.
2026-09-16 11:34:29 +02:00
52e6bae17b
fix(admin): extract default brand colour to .ts so the colour check stays clean
2026-09-16 11:32:50 +02:00
6112db1bb6
feat(archive): archived card list with unarchive
2026-09-16 11:31:00 +02:00
7ec075567b
feat(admin): issue, reset and deactivate manager accounts
2026-09-16 11:29:56 +02:00
5cd74762fe
feat(admin): projects page seeding a full board on create
2026-09-16 11:29:08 +02:00
6d0a9c4852
feat(admin): clients page with creation and deactivation
2026-09-16 11:28:34 +02:00
c9affddb97
feat(admin): shared table shell
2026-09-16 11:27:55 +02:00
42adc45b16
feat(actions): column management guarded by board invariants
2026-09-16 11:27:46 +02:00
101112f566
feat(actions): issue and deactivate client-manager accounts
2026-09-16 11:27:25 +02:00
294d2aa11e
feat(actions): client and project management with seeded boards
2026-09-16 11:27:01 +02:00
c2446d85eb
feat(admin): data loaders and owner-only route gate
2026-09-16 11:26:37 +02:00
287d70c42c
feat(users): active flag, backfilled, enforced at sign-in
2026-09-16 11:26:16 +02:00
ed048c5bb3
feat(auth): generated one-time passwords for new accounts
2026-09-16 11:25:52 +02:00
d1fdc72d29
feat(slug): URL-safe unique slugs for clients and projects
2026-09-16 11:25:36 +02:00
043d8ddc8c
feat(board): add cards as owner, request features as client
2026-09-16 11:06:06 +02:00
07656a5bc7
feat(board): open a card without breaking drag
2026-09-16 11:05:33 +02:00
c4a8ad2860
feat(card): detail page with checklist, comments and history
2026-09-16 11:04:48 +02:00
0b60c791b5
feat(card): activity timeline visible to both roles
2026-09-16 11:00:02 +02:00
e567093b99
feat(card): comment thread with role-appropriate write path
2026-09-16 10:59:54 +02:00
dd9cbe6c24
feat(card): checklist with progress and owner editing
2026-09-16 10:59:45 +02:00
1f1f9854ff
feat(actions): subtask and owner comment mutations
2026-09-16 10:59:37 +02:00
32927ed350
feat(actions): owner card create, update, accept and archive
2026-09-16 10:59:16 +02:00
e191b87c80
feat(data): card detail loader scoped by read rules
2026-09-16 10:58:55 +02:00
083fdd0ce5
feat(activity): superuser-backed audit log helper
2026-09-16 10:58:35 +02:00
d4bf5b5bb0
feat(activity): render audit rows as readable sentences
2026-09-16 10:58:16 +02:00
6f2d563b3d
feat(time): relative timestamp formatting
2026-09-16 10:57:55 +02:00
f082670f8a
fix(board): guard optimistic move against a refresh landing mid-save
...
activeId clears the instant the pointer is released, so gating the
focus-refresh on it alone left a window between drop and server
confirmation where a refresh could overwrite the optimistic position with
stale state and the card would appear to snap back. Tracks a separate
saving flag, and reverts on a thrown fetch as well as a non-ok response.
Also corrects a comment: sensors are created unconditionally; what keeps a
client manager from dragging is that they never render DndContext.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 10:51:35 +02:00
e419bc21db
fix(login): use theme tokens instead of hardcoded neutral colours
...
The login page was still on Plan 1a's dark-only palette, so in light theme
it rendered a near-black card on a light page with the heading black-on-black
and effectively invisible. This is the first screen a client ever sees.
Plan 1b Task 13 required the hardcoded-colour grep to return nothing; it was
not run.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 10:36:01 +02:00
bb39519801
feat(board): refresh the board when the window regains focus
2026-09-16 10:03:41 +02:00
972d45d38b
feat(board): owner drag and drop with optimistic persistence
2026-09-16 10:03:22 +02:00
4649c82432
feat(api): owner card move route using the caller's own token
2026-09-16 10:02:51 +02:00
f4568e4745
feat(board): column, card tile and client control presentation
2026-09-16 10:02:29 +02:00
a876ad6118
feat(home): role-aware project list with inbox badges
2026-09-16 10:02:02 +02:00
2eda3e7a39
feat(shell): floating panel layout with labelled icon rail
2026-09-16 10:01:45 +02:00
153484390f
feat(data): board and project summary loaders scoped by read rules
2026-09-16 10:01:21 +02:00
5d3323e765
feat(board): drop position arithmetic with same-column handling
2026-09-16 10:00:57 +02:00
193fe5bd86
feat(board): whole-day due date classification and formatting
2026-09-16 10:00:37 +02:00
2949fdabb7
feat(ui): pill, icon button and dropdown primitives
2026-09-16 10:00:20 +02:00
a839c4f5ad
feat(theme): light/dark/system toggle with no first-paint flash
2026-09-16 09:59:46 +02:00
99b465e402
feat(theme): semantic token system for light and dark
2026-09-16 09:59:25 +02:00
76438f6e90
feat(api): client routes for inbox card creation and comments
2026-09-16 09:44:04 +02:00
72f9de6999
feat(api): client PATCH route for card priority and target date
2026-09-16 09:43:36 +02:00
91e53f150a
feat(auth): PocketBase login, logout and signed-out redirect
2026-09-16 09:43:18 +02:00
30c1405f72
feat(activity): derive audit rows from card patches
2026-09-16 09:42:42 +02:00
6a6df8076b
feat(cards): positive field whitelist for client-manager writes
2026-09-16 09:42:26 +02:00
d14694ceab
feat(auth): pure access predicates for role and client scoping
2026-09-16 09:42:02 +02:00
f9e3e576f0
feat(pb): browser, server and superuser PocketBase clients
2026-09-16 09:41:46 +02:00
88a3761857
feat(ordering): fractional card positions with rebalance guard
2026-09-16 09:40:09 +02:00