# Frontend Specification

## Overview

The QuickNotes frontend is built with Svelte and SvelteKit, providing a responsive single-page application experience. It communicates with the backend via RESTful API calls and provides a user-friendly interface for managing notes, read later items, and feeds.

## Technology Stack

- **SvelteKit**: Framework for building the frontend application
- **Bulma CSS**: CSS framework for styling
- **FontAwesome**: Icon library
- **D3.js**: Used for the notes graph visualization
- **Marked**: Markdown parsing and rendering

## Architecture

The frontend follows the SvelteKit architecture:

1. **Routes**: Defined in the `src/routes` directory, with each route corresponding to a page in the application
2. **Components**: Reusable UI components in the `src/lib/components` directory
3. **Stores**: Svelte stores for state management in the `src/lib` directory
4. **API Client**: Functions for communicating with the backend API in the `src/lib/api` directory

## Routes

| Route | Component | Description |
|-------|-----------|-------------|
| `/` | `+page.svelte` | Home page with list of notes |
| `/notes/new` | `notes/new/+page.svelte` | Create a new note |
| `/notes/:id` | `notes/[id]/+page.svelte` | View or edit a specific note |
| `/notes/graph` | `notes/graph/+page.svelte` | View the notes graph |
| `/readlist` | `readlist/+page.svelte` | List of read later items |
| `/readlist/:id` | `readlist/[id]/+page.svelte` | View a specific read later item |
| `/feeds` | `feeds/+page.svelte` | List of feeds |
| `/feeds/:id` | `feeds/[id]/+page.svelte` | View entries from a specific feed |
| `/feeds/entries/:id` | `feeds/entries/[id]/+page.svelte` | View a specific feed entry |

## Components

### Layout Components

- **Navigation**: Main navigation bar with links to different sections
- **Footer**: Page footer with application information
- **Layout**: Main layout component that wraps all pages

### UI Components

- **CardList**: Reusable component for displaying lists of items as cards
- **SearchBar**: Search input with filtering functionality
- **Pagination**: Pagination controls for lists
- **Modal**: Modal dialog for confirmations and forms
- **Tabs**: Tabbed interface for switching between views
- **Dropdown**: Dropdown menu for actions
- **Toast**: Notification component for displaying messages

### Feature Components

- **NoteEditor**: Markdown editor for creating and editing notes
- **NoteViewer**: Component for rendering note content with Markdown support
- **NoteGraph**: D3.js-based graph visualization of note connections
- **ReadLaterForm**: Form for saving new read later items
- **ArticleViewer**: Component for displaying read later items with clean formatting
- **FeedList**: Component for displaying a list of feeds
- **EntryList**: Component for displaying a list of feed entries

## State Management

The frontend uses Svelte stores for state management:

1. **Notes Store**: Manages the state of notes
   ```javascript
   // Example notes store
   export const notes = writable([]);
   
   // Load notes from the API
   notes.load = async () => {
     const response = await fetch('/api/notes');
     const data = await response.json();
     notes.set(data);
   };
   
   // Add other methods for CRUD operations
   ```

2. **Readlist Store**: Manages the state of read later items
3. **Feeds Store**: Manages the state of feeds and entries

## API Integration

The frontend communicates with the backend API using the Fetch API:

```javascript
// Example API client function
export async function fetchNotes() {
  const response = await fetch('/api/notes');
  if (!response.ok) {
    const error = await response.json();
    throw new Error(error.message || 'Failed to fetch notes');
  }
  return await response.json();
}
```

## User Interface

### Home Page

- List of notes with search functionality
- Buttons for creating new notes and importing from Obsidian
- Link to the notes graph visualization

### Note Editor

- Markdown editor with preview functionality
- Title input field
- Save and cancel buttons
- Auto-save functionality

### Note Viewer

- Rendered Markdown content
- Links to related notes
- Edit and delete buttons

### Notes Graph

- Interactive graph visualization of note connections
- Zoom and pan controls
- Search functionality to find specific notes in the graph

### Readlist Page

- List of read later items with filters for read/unread and archived/unarchived
- Form for saving new items
- Buttons for marking as read, archiving, and deleting

### Article Viewer

- Clean, reader-friendly display of article content
- Buttons for marking as read, archiving, and returning to the list

### Feeds Page

- List of subscribed feeds with unread counts
- Form for subscribing to new feeds
- Buttons for refreshing, editing, and unsubscribing

### Feed Entries Page

- List of entries from a specific feed or all feeds
- Filters for read/unread status
- Buttons for marking as read/unread

## Responsive Design

The frontend is designed to be responsive and work well on different screen sizes:

1. **Desktop**: Full layout with sidebar navigation
2. **Tablet**: Adapted layout with collapsible navigation
3. **Mobile**: Simplified layout with mobile-friendly controls

## Accessibility

The frontend follows accessibility best practices:

1. **Semantic HTML**: Using appropriate HTML elements for their intended purpose
2. **ARIA Attributes**: Adding ARIA attributes where necessary
3. **Keyboard Navigation**: Ensuring all functionality is accessible via keyboard
4. **Color Contrast**: Ensuring sufficient contrast for text and UI elements

## Performance Optimization

The frontend is optimized for performance:

1. **Code Splitting**: Loading only the necessary code for each route
2. **Lazy Loading**: Loading components and data only when needed
3. **Caching**: Caching API responses where appropriate
4. **Optimized Assets**: Minimizing CSS and JavaScript files

## Testing

The frontend includes tests using Playwright for end-to-end testing:

1. **Page Tests**: Testing each page's functionality
2. **Component Tests**: Testing individual components
3. **Integration Tests**: Testing the interaction between components
4. **API Mock Tests**: Testing with mocked API responses