bvandeusen
2ac894b5d1
refactor(theme): DRY hardcoded violet values into CSS custom properties
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-08 12:19:38 -04:00
bvandeusen
7e81e50e3e
feat(theme): sweep indigo to violet across all remaining views and components
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-08 12:12:46 -04:00
bvandeusen
749a60b9fd
feat: interactive checkboxes in list note viewer
...
- renderMarkdown() accepts interactiveCheckboxes option: removes disabled=""
and stamps data-task-index on each checkbox in the marked HTML output
- NoteViewerView detects list notes by body content (- [ ] / - [x] pattern)
and passes interactiveCheckboxes: true when rendering
- onBodyChange() handles checkbox change events: toggles the matching line
in the body, optimistically updates the store, then PATCHes the note
- prose.css adds .prose--checklist rules for marked output: no bullet,
flex row, accent-color, line-through on checked items via :has()
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-02 09:31:37 -04:00
bvandeusen
c7ef709633
Multi-user sharing, groups, and in-app notifications
...
Backend:
- Alembic migration 0025: groups, group_memberships, project_shares,
note_shares, notifications tables
- models: Group, GroupMembership, ProjectShare, NoteShare, Notification
- services/access.py: permission resolution (viewer/editor/admin/owner)
- services/groups.py + routes/groups.py: full group CRUD + membership
- services/sharing.py + routes/shares.py: project/note sharing API
- services/notifications.py: in-app notification create/list/mark-read
- routes/in_app_notifications.py: GET/POST notification endpoints
- routes/users.py: user search endpoint
- services/projects.py + services/notes.py: *_for_user variants
- routes updated to use *_for_user on get/list; adds permission field
- app.py: register all new blueprints
Frontend:
- api/client.ts: ShareEntry, GroupEntry, NotificationEntry types + helpers
- stores/notifications.ts: Pinia store with polling
- NotificationBell.vue: bell icon + badge + dropdown toggle + 60s poll
- NotificationsPanel.vue: unread notification list with mark-all-read
- ShareDialog.vue: teleport modal for sharing projects/notes with users/groups
- SharedWithMeView.vue: /shared route listing shared projects and notes
- AppHeader: NotificationBell, Shared nav link
- ProjectView, NoteViewerView, TaskViewerView: Share button + ShareDialog
- SettingsView: Groups admin tab with create/delete groups + member mgmt
- router: /shared route
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-11 15:37:00 -04:00
bvandeusen
978a2627fb
UI refinement: toolbar icons, gradient CTA, Fraunces title, viewer polish
...
MarkdownToolbar:
- Replace text labels with SVG icons (Material Design paths)
- Group buttons with visual separators: text / headings / lists / code / links
- Add Strikethrough and Blockquote buttons (previously missing)
- Active state: tinted bg + ring instead of solid fill; hover lift shadow
- Toolbar container: pill shape with border (matches rest of UI)
editor-shared.css:
- btn-save: gradient + glow (linear-gradient(135deg, #6366f1, #4f46e5))
- title-input: borderless with Fraunces font and focus underline
NoteEditorView:
- Back button label standardized to "← Notes" (was "Back")
- Write/Preview tabs and toolbar now share the same row (flex-direction row)
NoteViewerView:
- Shimmer skeleton loader replaces plain "Loading..." text
- Note title uses Fraunces font at 2rem
- Edit button becomes primary gradient CTA
- Meta line shows clock/pencil SVG icons alongside timestamps
- Backlinks section: card grid with colored type badges (note=indigo, task=amber)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-11 10:57:02 -04:00
bvandeusen
c65aad6639
Upgrade all major frontend dependencies
...
- TipTap 2 → 3: Extension from @tiptap/core, Placeholder from
@tiptap/extensions, TaskList/TaskItem from @tiptap/extension-list,
link: false in StarterKit (now bundles Link), @tiptap/core added
- marked 15 → 17: heading renderer updated to tokens/parseInline API
- Pinia 2 → 3, Vue Router 4 → 5 (no code changes required)
- Vite 6 → 7, @vitejs/plugin-vue 5 → 6, vue-tsc 2 → 3
- TypeScript 5.6 → 5.9: fixed Uint8Array<ArrayBuffer> strictness in
push.ts, removed unused bodyEl ref in NoteViewerView.vue
- .npmrc: legacy-peer-deps=true for TipTap v3 peer dep resolution
TipTap 3 new capabilities now available: static renderer
(createStaticRenderer), MarkViews, @tiptap/extensions package.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-09 21:30:55 -04:00
bvandeusen
16ecd6bbeb
DRY refactoring pass: shared mixins, route helpers, composables, CSS
...
Backend:
- models/base.py: TimestampMixin + CreatedAtMixin; applied to all 10+ models
- routes/utils.py: not_found() + parse_iso_date() helpers; used across all route files
- routes/milestones.py: _milestone_dict() helper replaces 5 repeated to_dict + progress blocks
Frontend:
- 5 new composables: useAutoSave, useEditorGuards, useTagSuggestions,
useFloatingAssist, useListKeyboardNavigation
- ConfirmDialog.vue: reusable confirm modal replacing inline <teleport> blocks
- editor-shared.css: sidebar CSS consolidated from both editor views
- viewer-shared.css: context-bar/breadcrumb CSS consolidated from both viewer views
- NoteEditorView + TaskEditorView: ~120 lines each replaced with composable calls;
duplicate scoped sidebar CSS removed
- NotesListView + TasksListView: inline keyboard-nav replaced with composable
- NoteViewerView + TaskViewerView: duplicate context-bar CSS removed
No behaviour changes. Net: -634 lines, +237 lines across 31 files.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-06 15:26:34 -05:00
bvandeusen
eac4c6d86a
Implement keyboard shortcuts and enrich note/task viewer views
...
Keyboard shortcuts (App.vue):
- g+h/n/t/p/c: navigate to home/notes/tasks/projects/chat
- n / t: new note / new task (when not in an input field)
- Escape: go home (when not typing)
- Shortcuts panel updated to document all working shortcuts
NoteViewerView:
- Context breadcrumb: parent note link (↑), project badge, milestone badge
- Fetches project and parent note titles in parallel on load
- Back button label improved to "← Notes"
TaskViewerView:
- Context breadcrumb: parent task link (uses parent_title from API), project badge, milestone badge
- Sub-tasks section with inline progress bar and status dots (clickable to advance)
- Sub-tasks loaded from /api/notes?parent_id=X&type=task
- Note type extended with optional parent_title field
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-03 19:32:19 -05:00
bvandeusen
7b92d13863
Make Back and Edit navigation consistently styled as bordered buttons
...
Previously .btn-back and .btn-edit in editor/viewer toolbars were plain
primary-colored links while all other toolbar actions were proper buttons.
All four views now use the same bordered button style: subtle border,
secondary text color, hover highlights primary border/text — matching
the existing convert/assist-toggle button aesthetic.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-02-19 17:22:31 -05:00
bvandeusen
0c4e7fe5cb
Redesign writing assistant UI: right-side panel, diff view, proofread, floating inline assist
...
- sectionParser.ts: add parseFallbackSections() — splits heading-less notes
by paragraph boundaries; single-line ≤120 char paragraphs become pseudo-headings
so Q&A-style notes get individual selectable sections in the assist panel
- useAssist.ts: add DiffLine type + computeDiff() (LCS line diff), isProofreading
ref, diff computed, proofread() method (full-document one-click), reset
isProofreading in accept() and reject()
- NoteEditorView + TaskEditorView: complete layout redesign
- Assist panel moves from bottom 33% to right-side 320px column (flex-row)
- ✨ Assist toggle button in toolbar, state persisted to localStorage
- Floating ✨ pill button (teleported to <body>) above text selections;
click opens panel with selection pre-loaded and instruction textarea focused
- Proofread button in panel header: sends entire document, labels streaming
as "Proofreading document..." and review as "Document proofread"
- Review state shows LCS line-level diff (red removed, green added);
"Show full text" toggle switches to rendered proposal
- Mobile (≤768px): panel drops to bottom 45% height
- theme.css: add global .inline-assist-btn styles for teleported floating button
- Site-wide max-width increase: list/chat/settings views 960px→1200px;
viewer layout 1200px→1400px (content area 960px→1100px);
editor pages already at 1400px
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-02-19 16:43:41 -05:00
bvandeusen
e02b681e91
Add invitation system, table of contents, actionable dashboard, and settings improvements
...
Invitation system (Phase 5.7):
- invitation_tokens table (migration 0012) with SHA256-hashed tokens, 7-day expiry
- Admin CRUD endpoints: POST/GET/DELETE /api/admin/invitations
- Branded invitation email with registration link
- /register-invite frontend view with token validation and account creation
- Admin UI: invite form + pending invitations table with revoke
- Configurable base URL setting for email links (replaces hardcoded Config.BASE_URL)
Table of contents + markdown improvements (Phase 5.8):
- TableOfContents component: sticky sidebar, heading parsing, smooth-scroll
- Custom marked renderer adds id attributes to headings for anchor links
- stripFirstLineTags() prevents leading #tags from rendering as headings
- NoteViewerView/TaskViewerView flex layout with TOC sidebar (hidden ≤1200px)
- Model catalog refresh: added llama3.2/3.3, gemma3, qwen3, phi4, deepseek-r1,
qwen2.5-coder, dolphin3; added Reasoning category; removed discontinued models
- Settings model section split into Installed/Available tabs
Actionable dashboard (Phase 5.9):
- due_before/due_after query params on /api/tasks (exclusive < / inclusive >=)
- HomeView rewritten: overdue (red accent), due today, in progress, chats, notes
- 5 parallel API calls via Promise.allSettled
- Client-side done filtering and in-progress deduplication
- Task sections hidden when empty; status toggle removes done tasks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-14 08:46:51 -05:00
bvandeusen
586026bff6
Add Tiptap inline-preview editor, layout improvements, and README
...
Replace plain textarea with Tiptap (ProseMirror) WYSIWYG editor for notes
and tasks. Headings, bold, lists, and code blocks now render inline while
editing. Tags and wikilinks get visual highlighting via decoration plugins,
and autocomplete uses @tiptap/suggestion with heading disambiguation.
Layout: pin navbar with app-shell flex column (100dvh), sticky editor
toolbar above scrolling content, AI Assist panel fixed at bottom 1/3 with
full-height section selector and prompt. Increase max-width to 960px
across all views. Hide assist controls during streaming/review.
Other fixes: markdown paste handling, auto-syncing assist sections via
body watcher, trailing newline on AI accept, ChatView height fix.
Add README.md describing the app, usage guide, and technical overview.
Update summary.md with Phase 5.2 roadmap and current status.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-11 21:24:35 -05:00
bvandeusen
fb18d2c41d
Add note context visibility in chat and standardize UI design tokens
...
Improve chat context: build_context() now returns metadata about auto-found
notes, emitted as an SSE event so the frontend can display context pills
showing which notes influenced the response. Users can promote notes for
deeper context (+) or exclude irrelevant ones (x). A note picker lets users
manually attach notes. Multi-word search uses per-term AND matching, and
auto-search iterates keywords individually for broader OR-style coverage.
Standardize styling: introduce CSS design tokens (--radius-sm/md/lg/pill,
--color-success/warning/overlay, --focus-ring) and migrate all components
to use them. Fix header alignment to full-width, add active nav link state,
replace hardcoded colors with CSS variables, and normalize button padding.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-11 06:49:12 -05:00
bvandeusen
807cde30be
Merge tasks into notes: a task is just a note with task attributes
...
A task is now a note with status/priority/due_date columns set (status IS NOT NULL).
This eliminates the separate tasks table, companion note system, cascade deletes,
bidirectional title sync, and _skip_cascade flags.
Migration (0004):
- Add status, priority, due_date columns to notes table
- Migrate task data from companion notes and orphan tasks
- Drop tasks table and old enum types
Backend:
- models/note.py: Add TaskStatus/TaskPriority enums, task columns, is_task property
- models/task.py: Deleted (merged into note.py)
- models/__init__.py: Re-export enums from note.py, remove Task import
- services/notes.py: Remove companion/cascade logic, add is_task filter,
convert_note_to_task, convert_task_to_note, simplified backlinks
- services/tasks.py: Rewritten as thin wrappers around notes service
- routes/notes.py: Add is_task filter (default false), task fields in CRUD,
convert-to-note endpoint
- routes/tasks.py: description→body (with fallback), remove note_id filter
Frontend:
- types/note.ts: Add TaskStatus, TaskPriority, task fields to Note interface
- types/task.ts: Task is now a re-export alias for Note
- stores/notes.ts: Simplify convertToTask, add convertToNote
- stores/tasks.ts: description→body in createTask/updateTask
- TaskEditorView: description→body, remove companion note UI
- TaskViewerView: description→body, remove companion note link, add Convert to Note
- NoteViewerView: Remove companion task UI, simplify convert-to-task
- TaskCard: description→body, non-null assertions for status/priority
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-10 17:56:12 -05:00
bvandeusen
22a3a3c1d1
Initial commit: note-taking/task-tracking app with LLM integration scaffold
...
Vue 3 + TypeScript frontend with Pinia stores, markdown rendering (marked + DOMPurify),
wikilink/tag linkification, and autocomplete. Quart async backend with SQLAlchemy 2.0,
PostgreSQL ARRAY columns, task-note companion linking, backlinks, and note-to-task
conversion. Docker Compose setup with PostgreSQL 16 and Ollama.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-09 23:35:44 -05:00