New search function et drag and drop clean
This commit is contained in:
@ -69,7 +69,7 @@ class FileTree {
|
||||
|
||||
// Setup drag events pour les fichiers
|
||||
fileItems.forEach(file => {
|
||||
file.addEventListener('dragstart', (e) => this.handleDragStart(e));
|
||||
file.addEventListener('dragstart', (e) => this.handleDragStart(e, 'file'));
|
||||
file.addEventListener('dragend', (e) => this.handleDragEnd(e));
|
||||
// Empêcher htmx de gérer le clic pendant le drag
|
||||
file.addEventListener('click', (e) => {
|
||||
@ -79,49 +79,106 @@ class FileTree {
|
||||
}, true);
|
||||
});
|
||||
|
||||
// Setup drop zones pour les dossiers
|
||||
// Setup drag events pour les dossiers (headers)
|
||||
folderItems.forEach(folder => {
|
||||
const header = folder.querySelector('.folder-header');
|
||||
const isRoot = folder.dataset.isRoot === 'true';
|
||||
|
||||
// La racine ne doit pas être draggable
|
||||
if (!isRoot) {
|
||||
header.setAttribute('draggable', 'true');
|
||||
header.addEventListener('dragstart', (e) => this.handleDragStart(e, 'folder'));
|
||||
header.addEventListener('dragend', (e) => this.handleDragEnd(e));
|
||||
}
|
||||
|
||||
// Tous les dossiers (y compris la racine) sont des drop zones
|
||||
header.addEventListener('dragover', (e) => this.handleDragOver(e));
|
||||
header.addEventListener('dragleave', (e) => this.handleDragLeave(e));
|
||||
header.addEventListener('drop', (e) => this.handleDrop(e));
|
||||
});
|
||||
}
|
||||
|
||||
handleDragStart(e) {
|
||||
const item = e.target;
|
||||
handleDragStart(e, type) {
|
||||
const item = e.currentTarget;
|
||||
item.classList.add('dragging');
|
||||
|
||||
const path = item.dataset.path;
|
||||
let path, name;
|
||||
if (type === 'file') {
|
||||
path = item.dataset.path;
|
||||
name = path.split('/').pop();
|
||||
} else if (type === 'folder') {
|
||||
const folderItem = item.closest('.folder-item');
|
||||
path = folderItem.dataset.path;
|
||||
name = folderItem.querySelector('.folder-name').textContent.trim();
|
||||
}
|
||||
|
||||
e.dataTransfer.effectAllowed = 'move';
|
||||
e.dataTransfer.setData('text/plain', path);
|
||||
e.dataTransfer.setData('application/note-path', path);
|
||||
e.dataTransfer.setData('application/note-type', type);
|
||||
e.dataTransfer.setData('application/note-name', name);
|
||||
|
||||
// Stocker le chemin source pour validation
|
||||
this.draggedPath = path;
|
||||
this.draggedType = type;
|
||||
|
||||
console.log('Drag start:', { type, path, name });
|
||||
}
|
||||
|
||||
handleDragEnd(e) {
|
||||
const item = e.target;
|
||||
const item = e.currentTarget;
|
||||
item.classList.remove('dragging');
|
||||
|
||||
// Supprimer les highlights de tous les dossiers
|
||||
document.querySelectorAll('.folder-item.drag-over').forEach(f => {
|
||||
f.classList.remove('drag-over');
|
||||
});
|
||||
|
||||
// Supprimer l'indicateur de destination
|
||||
const indicator = document.getElementById('drag-destination-indicator');
|
||||
if (indicator) {
|
||||
indicator.remove();
|
||||
}
|
||||
|
||||
this.draggedPath = null;
|
||||
this.draggedType = null;
|
||||
}
|
||||
|
||||
handleDragOver(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
e.dataTransfer.dropEffect = 'move';
|
||||
|
||||
const folderHeader = e.currentTarget;
|
||||
const folderItem = folderHeader.closest('.folder-item');
|
||||
const targetPath = folderItem.dataset.path;
|
||||
|
||||
// Empêcher de déplacer un dossier dans lui-même ou dans ses enfants
|
||||
if (this.draggedType === 'folder' && this.draggedPath) {
|
||||
if (targetPath === this.draggedPath || targetPath.startsWith(this.draggedPath + '/')) {
|
||||
e.dataTransfer.dropEffect = 'none';
|
||||
folderItem.classList.remove('drag-over');
|
||||
this.removeDestinationIndicator();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
e.dataTransfer.dropEffect = 'move';
|
||||
|
||||
if (folderItem && !folderItem.classList.contains('drag-over')) {
|
||||
// Retirer la classe des autres dossiers
|
||||
document.querySelectorAll('.folder-item.drag-over').forEach(f => {
|
||||
if (f !== folderItem) {
|
||||
f.classList.remove('drag-over');
|
||||
}
|
||||
});
|
||||
folderItem.classList.add('drag-over');
|
||||
|
||||
// Afficher l'indicateur de destination
|
||||
this.showDestinationIndicator(folderItem, targetPath);
|
||||
}
|
||||
}
|
||||
|
||||
handleDragLeave(e) {
|
||||
e.stopPropagation();
|
||||
const folderHeader = e.currentTarget;
|
||||
const folderItem = folderHeader.closest('.folder-item');
|
||||
|
||||
@ -131,10 +188,39 @@ class FileTree {
|
||||
e.clientY < rect.top || e.clientY >= rect.bottom) {
|
||||
if (folderItem) {
|
||||
folderItem.classList.remove('drag-over');
|
||||
this.removeDestinationIndicator();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
showDestinationIndicator(folderItem, targetPath) {
|
||||
let indicator = document.getElementById('drag-destination-indicator');
|
||||
if (!indicator) {
|
||||
indicator = document.createElement('div');
|
||||
indicator.id = 'drag-destination-indicator';
|
||||
indicator.className = 'drag-destination-indicator';
|
||||
document.body.appendChild(indicator);
|
||||
}
|
||||
|
||||
const folderName = folderItem.querySelector('.folder-name').textContent.trim();
|
||||
const isRoot = folderItem.dataset.isRoot === 'true';
|
||||
const displayPath = isRoot ? 'notes/' : targetPath;
|
||||
|
||||
indicator.innerHTML = `
|
||||
<span class="indicator-icon">📥</span>
|
||||
<span class="indicator-text">Déplacer vers: <strong>${folderName}</strong></span>
|
||||
<span class="indicator-path">${displayPath}</span>
|
||||
`;
|
||||
indicator.style.display = 'flex';
|
||||
}
|
||||
|
||||
removeDestinationIndicator() {
|
||||
const indicator = document.getElementById('drag-destination-indicator');
|
||||
if (indicator) {
|
||||
indicator.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
handleDrop(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
@ -143,40 +229,57 @@ class FileTree {
|
||||
const folderItem = folderHeader.closest('.folder-item');
|
||||
folderItem.classList.remove('drag-over');
|
||||
|
||||
// Supprimer l'indicateur de destination
|
||||
this.removeDestinationIndicator();
|
||||
|
||||
const sourcePath = e.dataTransfer.getData('application/note-path') ||
|
||||
e.dataTransfer.getData('text/plain');
|
||||
const sourceType = e.dataTransfer.getData('application/note-type');
|
||||
const targetFolderPath = folderItem.dataset.path;
|
||||
|
||||
console.log('Drop event:', {
|
||||
sourcePath,
|
||||
sourceType,
|
||||
targetFolderPath,
|
||||
dataTransfer: e.dataTransfer.types,
|
||||
folderItem: folderItem
|
||||
dataTransfer: e.dataTransfer.types
|
||||
});
|
||||
|
||||
if (!sourcePath || !targetFolderPath) {
|
||||
// Validation : sourcePath doit exister, targetFolderPath peut être vide (racine)
|
||||
if (!sourcePath || targetFolderPath === undefined || targetFolderPath === null) {
|
||||
console.error('Chemins invalides pour le drag & drop', {
|
||||
sourcePath,
|
||||
targetFolderPath,
|
||||
folderItemDataset: folderItem.dataset
|
||||
targetFolderPath
|
||||
});
|
||||
alert(`Erreur: source='${sourcePath}', destination='${targetFolderPath}'`);
|
||||
return;
|
||||
}
|
||||
|
||||
// Ne pas déplacer si c'est le même dossier
|
||||
// Empêcher de déplacer un dossier dans lui-même ou dans ses enfants
|
||||
if (sourceType === 'folder') {
|
||||
if (targetFolderPath === sourcePath || targetFolderPath.startsWith(sourcePath + '/')) {
|
||||
alert('Impossible de déplacer un dossier dans lui-même ou dans un de ses sous-dossiers');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Ne pas déplacer si c'est déjà dans le même dossier parent
|
||||
const sourceDir = sourcePath.includes('/') ?
|
||||
sourcePath.substring(0, sourcePath.lastIndexOf('/')) : '';
|
||||
if (sourceDir === targetFolderPath) {
|
||||
console.log('Déjà dans le même dossier parent, rien à faire');
|
||||
return;
|
||||
}
|
||||
|
||||
// Extraire le nom du fichier
|
||||
const fileName = sourcePath.includes('/') ?
|
||||
// Extraire le nom du fichier/dossier
|
||||
const itemName = sourcePath.includes('/') ?
|
||||
sourcePath.substring(sourcePath.lastIndexOf('/') + 1) :
|
||||
sourcePath;
|
||||
const destinationPath = targetFolderPath + '/' + fileName;
|
||||
|
||||
// Construire le chemin de destination
|
||||
// Si targetFolderPath est vide (racine), ne pas ajouter de slash
|
||||
const destinationPath = targetFolderPath === '' ? itemName : targetFolderPath + '/' + itemName;
|
||||
|
||||
console.log(`Déplacement: ${sourcePath} → ${destinationPath}`);
|
||||
this.moveFile(sourcePath, destinationPath);
|
||||
}
|
||||
|
||||
|
||||
805
generate_notes.sh
Executable file
805
generate_notes.sh
Executable file
@ -0,0 +1,805 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Fonction pour créer une note avec front matter
|
||||
create_note() {
|
||||
local path="$1"
|
||||
local title="$2"
|
||||
local tags="$3"
|
||||
local content="$4"
|
||||
local date=$(date +%d-%m-%Y)
|
||||
local time=$(date +%d-%m-%Y:%H:%M)
|
||||
|
||||
cat > "$path" << NOTEEOF
|
||||
---
|
||||
title: "$title"
|
||||
date: "$date"
|
||||
last_modified: "$time"
|
||||
tags: [$tags]
|
||||
---
|
||||
|
||||
$content
|
||||
NOTEEOF
|
||||
}
|
||||
|
||||
# Créer la structure de dossiers
|
||||
mkdir -p projets/{backend,frontend,mobile}
|
||||
mkdir -p meetings/2025
|
||||
mkdir -p documentation/{api,guides}
|
||||
mkdir -p ideas
|
||||
mkdir -p tasks
|
||||
mkdir -p research/{ai,tech,design}
|
||||
mkdir -p personal
|
||||
mkdir -p archive
|
||||
|
||||
echo "Dossiers créés..."
|
||||
|
||||
# Notes dans projets/backend
|
||||
create_note "projets/backend/api-design.md" "API Design" '"projet", "backend", "api"' \
|
||||
"# API Design
|
||||
|
||||
## Architecture REST
|
||||
|
||||
Notre API suit les principes REST avec les endpoints suivants:
|
||||
|
||||
- \`GET /api/v1/notes\` - Liste toutes les notes
|
||||
- \`GET /api/v1/notes/{path}\` - Récupère une note
|
||||
- \`PUT /api/v1/notes/{path}\` - Crée/met à jour une note
|
||||
- \`DELETE /api/v1/notes/{path}\` - Supprime une note
|
||||
|
||||
## Authentification
|
||||
|
||||
Pour l'instant, pas d'authentification. À implémenter avec JWT.
|
||||
|
||||
## Rate Limiting
|
||||
|
||||
À considérer pour la production."
|
||||
|
||||
create_note "projets/backend/database-schema.md" "Database Schema" '"projet", "backend", "database"' \
|
||||
"# Database Schema
|
||||
|
||||
## Indexer
|
||||
|
||||
L'indexer maintient une structure en mémoire:
|
||||
|
||||
\`\`\`go
|
||||
type Indexer struct {
|
||||
tags map[string][]string
|
||||
docs map[string]*Document
|
||||
mu sync.RWMutex
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
## Performance
|
||||
|
||||
- Indexation en O(n) au démarrage
|
||||
- Recherche en O(1) pour les tags
|
||||
- Re-indexation incrémentale avec fsnotify"
|
||||
|
||||
create_note "projets/backend/deployment.md" "Deployment Strategy" '"projet", "backend", "devops"' \
|
||||
"# Deployment Strategy
|
||||
|
||||
## Production
|
||||
|
||||
1. Compiler le binaire Go
|
||||
2. Copier les fichiers statiques
|
||||
3. Configurer nginx comme reverse proxy
|
||||
4. Systemd pour gérer le service
|
||||
|
||||
## Docker
|
||||
|
||||
À créer un Dockerfile pour faciliter le déploiement.
|
||||
|
||||
\`\`\`dockerfile
|
||||
FROM golang:1.22 AS builder
|
||||
WORKDIR /app
|
||||
COPY . .
|
||||
RUN go build -o server ./cmd/server
|
||||
\`\`\`"
|
||||
|
||||
# Notes dans projets/frontend
|
||||
create_note "projets/frontend/codemirror-integration.md" "CodeMirror Integration" '"projet", "frontend", "editor"' \
|
||||
"# CodeMirror 6 Integration
|
||||
|
||||
## Configuration
|
||||
|
||||
Nous utilisons CodeMirror 6 avec:
|
||||
- \`@codemirror/lang-markdown\` pour le Markdown
|
||||
- \`@codemirror/theme-one-dark\` pour le thème
|
||||
- \`@codemirror/basic-setup\` pour les fonctionnalités de base
|
||||
|
||||
## Slash Commands
|
||||
|
||||
Système de commandes rapides avec \`/\`:
|
||||
- /h1, /h2, /h3 - Titres
|
||||
- /date - Date actuelle
|
||||
- /table - Tableau
|
||||
- /code - Bloc de code
|
||||
|
||||
## Auto-save
|
||||
|
||||
Déclenché après 2 secondes d'inactivité."
|
||||
|
||||
create_note "projets/frontend/vite-build.md" "Vite Build Process" '"projet", "frontend", "build"' \
|
||||
"# Vite Build Process
|
||||
|
||||
## Structure
|
||||
|
||||
\`\`\`
|
||||
frontend/
|
||||
├── src/
|
||||
│ ├── main.js
|
||||
│ ├── editor.js
|
||||
│ ├── file-tree.js
|
||||
│ └── ui.js
|
||||
├── vite.config.js
|
||||
└── package.json
|
||||
\`\`\`
|
||||
|
||||
## Build
|
||||
|
||||
\`npm run build\` génère:
|
||||
- \`project-notes-frontend.es.js\` (ES modules)
|
||||
- \`project-notes-frontend.umd.js\` (UMD)
|
||||
|
||||
## Watch Mode
|
||||
|
||||
\`npm run build -- --watch\` pour le dev."
|
||||
|
||||
create_note "projets/frontend/drag-and-drop.md" "Drag and Drop System" '"projet", "frontend", "ux"' \
|
||||
"# Drag and Drop System
|
||||
|
||||
## Fonctionnalités
|
||||
|
||||
- Déplacer fichiers entre dossiers
|
||||
- Déplacer dossiers entre dossiers
|
||||
- Zone de drop racine
|
||||
- Indicateur visuel de destination
|
||||
|
||||
## Implémentation
|
||||
|
||||
Utilise l'API HTML5 Drag & Drop:
|
||||
- \`dragstart\` / \`dragend\`
|
||||
- \`dragover\` / \`dragleave\`
|
||||
- \`drop\`
|
||||
|
||||
## Validations
|
||||
|
||||
- Impossible de déplacer un dossier dans lui-même
|
||||
- Impossible de déplacer la racine"
|
||||
|
||||
# Notes dans projets/mobile
|
||||
create_note "projets/mobile/responsive-design.md" "Responsive Design" '"projet", "mobile", "css"' \
|
||||
"# Responsive Design
|
||||
|
||||
## Media Queries
|
||||
|
||||
\`\`\`css
|
||||
@media (max-width: 768px) {
|
||||
/* Tablettes */
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
/* Smartphones */
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
## Mobile-First
|
||||
|
||||
- Sidebar masquée par défaut
|
||||
- Preview-only mode
|
||||
- Touch-friendly buttons"
|
||||
|
||||
create_note "projets/mobile/pwa.md" "Progressive Web App" '"projet", "mobile", "pwa"' \
|
||||
"# PWA Features
|
||||
|
||||
## À implémenter
|
||||
|
||||
1. Service Worker
|
||||
2. Manifest.json
|
||||
3. Offline support
|
||||
4. Install prompt
|
||||
|
||||
## Avantages
|
||||
|
||||
- Fonctionne offline
|
||||
- Installable sur mobile
|
||||
- Notifications push possibles"
|
||||
|
||||
# Notes dans meetings
|
||||
create_note "meetings/2025/sprint-planning.md" "Sprint Planning January" '"meeting", "planning"' \
|
||||
"# Sprint Planning - Janvier 2025
|
||||
|
||||
## Participants
|
||||
- Équipe Dev
|
||||
- Product Owner
|
||||
- Scrum Master
|
||||
|
||||
## Objectifs
|
||||
|
||||
1. Améliorer le drag & drop
|
||||
2. Ajouter l'API REST
|
||||
3. Search modal avec Ctrl+K
|
||||
|
||||
## Vélocité
|
||||
|
||||
20 story points pour ce sprint.
|
||||
|
||||
## Risques
|
||||
|
||||
- Complexité du drag & drop de dossiers
|
||||
- Tests E2E à mettre en place"
|
||||
|
||||
create_note "meetings/2025/retrospective.md" "Sprint Retrospective" '"meeting", "retro"' \
|
||||
"# Retrospective - Sprint 1
|
||||
|
||||
## What went well ✅
|
||||
|
||||
- API REST implémentée rapidement
|
||||
- Bonne collaboration
|
||||
- Tests unitaires en place
|
||||
|
||||
## What to improve ⚠️
|
||||
|
||||
- Documentation à jour
|
||||
- CI/CD pipeline
|
||||
- Code reviews plus rapides
|
||||
|
||||
## Action items
|
||||
|
||||
1. Créer CONTRIBUTING.md
|
||||
2. Setup GitHub Actions
|
||||
3. Daily standups à 10h"
|
||||
|
||||
create_note "meetings/client-feedback.md" "Client Feedback Session" '"meeting", "client"' \
|
||||
"# Client Feedback - Session 1
|
||||
|
||||
## Points positifs
|
||||
|
||||
- Interface épurée et rapide
|
||||
- Édition Markdown fluide
|
||||
- Recherche efficace
|
||||
|
||||
## Demandes
|
||||
|
||||
1. Export PDF des notes
|
||||
2. Partage de notes par lien
|
||||
3. Mode collaboratif
|
||||
4. Dark/Light theme toggle
|
||||
|
||||
## Priorités
|
||||
|
||||
Focus sur l'export PDF pour la v1.1"
|
||||
|
||||
# Notes dans documentation/api
|
||||
create_note "documentation/api/endpoints.md" "API Endpoints Reference" '"documentation", "api"' \
|
||||
"# API Endpoints
|
||||
|
||||
## Notes
|
||||
|
||||
### List Notes
|
||||
\`\`\`
|
||||
GET /api/v1/notes
|
||||
\`\`\`
|
||||
|
||||
Returns array of all notes.
|
||||
|
||||
### Get Note
|
||||
\`\`\`
|
||||
GET /api/v1/notes/{path}
|
||||
Accept: application/json | text/markdown
|
||||
\`\`\`
|
||||
|
||||
### Create/Update Note
|
||||
\`\`\`
|
||||
PUT /api/v1/notes/{path}
|
||||
Content-Type: application/json
|
||||
\`\`\`
|
||||
|
||||
### Delete Note
|
||||
\`\`\`
|
||||
DELETE /api/v1/notes/{path}
|
||||
\`\`\`
|
||||
|
||||
## Examples
|
||||
|
||||
See API.md for complete examples."
|
||||
|
||||
create_note "documentation/api/authentication.md" "Authentication Guide" '"documentation", "api", "security"' \
|
||||
"# Authentication
|
||||
|
||||
## Current Status
|
||||
|
||||
⚠️ No authentication currently implemented.
|
||||
|
||||
## Future Implementation
|
||||
|
||||
### JWT Tokens
|
||||
|
||||
\`\`\`
|
||||
POST /api/auth/login
|
||||
{
|
||||
\"username\": \"user\",
|
||||
\"password\": \"pass\"
|
||||
}
|
||||
|
||||
Response:
|
||||
{
|
||||
\"token\": \"eyJhbGc...\"
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
### Bearer Token
|
||||
|
||||
\`\`\`
|
||||
Authorization: Bearer eyJhbGc...
|
||||
\`\`\`
|
||||
|
||||
## Security
|
||||
|
||||
- HTTPS only in production
|
||||
- Reverse proxy with nginx
|
||||
- Rate limiting"
|
||||
|
||||
# Notes dans documentation/guides
|
||||
create_note "documentation/guides/getting-started.md" "Getting Started Guide" '"documentation", "guide", "tutorial"' \
|
||||
"# Getting Started
|
||||
|
||||
## Installation
|
||||
|
||||
1. Clone the repo
|
||||
2. Install Go 1.22+
|
||||
3. Install Node.js dependencies
|
||||
4. Build frontend
|
||||
5. Run server
|
||||
|
||||
\`\`\`bash
|
||||
git clone https://github.com/user/project-notes.git
|
||||
cd project-notes
|
||||
cd frontend && npm install && npm run build
|
||||
cd ..
|
||||
go run ./cmd/server
|
||||
\`\`\`
|
||||
|
||||
## First Steps
|
||||
|
||||
1. Create a note
|
||||
2. Add tags
|
||||
3. Search with Ctrl+K
|
||||
4. Organize with folders"
|
||||
|
||||
create_note "documentation/guides/markdown-syntax.md" "Markdown Syntax Guide" '"documentation", "guide", "markdown"' \
|
||||
"# Markdown Syntax
|
||||
|
||||
## Headers
|
||||
|
||||
\`\`\`markdown
|
||||
# H1
|
||||
## H2
|
||||
### H3
|
||||
\`\`\`
|
||||
|
||||
## Emphasis
|
||||
|
||||
**bold** and *italic*
|
||||
|
||||
## Lists
|
||||
|
||||
- Item 1
|
||||
- Item 2
|
||||
- Nested
|
||||
|
||||
## Code
|
||||
|
||||
Inline \`code\` and blocks:
|
||||
|
||||
\`\`\`python
|
||||
def hello():
|
||||
print('Hello')
|
||||
\`\`\`
|
||||
|
||||
## Tables
|
||||
|
||||
| Column | Column |
|
||||
|--------|--------|
|
||||
| Data | Data |"
|
||||
|
||||
# Notes dans ideas
|
||||
create_note "ideas/mobile-app.md" "Native Mobile App" '"idea", "mobile"' \
|
||||
"# Native Mobile App Idea
|
||||
|
||||
## Concept
|
||||
|
||||
Créer une app native iOS/Android pour l'édition de notes.
|
||||
|
||||
## Tech Stack
|
||||
|
||||
- React Native ou Flutter
|
||||
- Sync avec l'API REST
|
||||
- Offline-first architecture
|
||||
|
||||
## Features
|
||||
|
||||
- Push notifications
|
||||
- Widget home screen
|
||||
- Voice notes
|
||||
- Photo attachments
|
||||
|
||||
## Timeline
|
||||
|
||||
Q2 2025 - Prototype
|
||||
Q3 2025 - Beta testing"
|
||||
|
||||
create_note "ideas/ai-assistant.md" "AI Writing Assistant" '"idea", "ai"' \
|
||||
"# AI Writing Assistant
|
||||
|
||||
## Vision
|
||||
|
||||
Intégrer un assistant IA pour:
|
||||
- Suggestions d'écriture
|
||||
- Résumés automatiques
|
||||
- Tags suggestions
|
||||
- Recherche sémantique
|
||||
|
||||
## APIs
|
||||
|
||||
- OpenAI GPT-4
|
||||
- Anthropic Claude
|
||||
- Local LLM avec Ollama
|
||||
|
||||
## Privacy
|
||||
|
||||
Données restent locales, API optionnelle."
|
||||
|
||||
create_note "ideas/collaboration.md" "Real-time Collaboration" '"idea", "collaboration"' \
|
||||
"# Real-time Collaboration
|
||||
|
||||
## Goal
|
||||
|
||||
Plusieurs utilisateurs éditent la même note simultanément.
|
||||
|
||||
## Technology
|
||||
|
||||
- WebSockets
|
||||
- Operational Transforms ou CRDT
|
||||
- Presence indicators
|
||||
|
||||
## Challenges
|
||||
|
||||
- Conflict resolution
|
||||
- Performance at scale
|
||||
- User permissions"
|
||||
|
||||
# Notes dans tasks
|
||||
create_note "tasks/backlog.md" "Product Backlog" '"task", "planning"' \
|
||||
"# Product Backlog
|
||||
|
||||
## High Priority
|
||||
|
||||
- [ ] Export notes to PDF
|
||||
- [ ] Bulk operations (delete, move)
|
||||
- [ ] Tags management page
|
||||
- [ ] Keyboard shortcuts documentation
|
||||
|
||||
## Medium Priority
|
||||
|
||||
- [ ] Note templates
|
||||
- [ ] Trash/Recycle bin
|
||||
- [ ] Note history/versions
|
||||
- [ ] Full-text search improvements
|
||||
|
||||
## Low Priority
|
||||
|
||||
- [ ] Themes customization
|
||||
- [ ] Plugin system
|
||||
- [ ] Graph view of notes links"
|
||||
|
||||
create_note "tasks/bugs.md" "Known Bugs" '"task", "bug"' \
|
||||
"# Known Bugs
|
||||
|
||||
## Critical
|
||||
|
||||
None currently! 🎉
|
||||
|
||||
## Medium
|
||||
|
||||
- [ ] Search doesn't highlight in preview
|
||||
- [ ] Drag over nested folders can be glitchy
|
||||
- [ ] Mobile: sidebar animation stutters
|
||||
|
||||
## Low
|
||||
|
||||
- [ ] File tree doesn't remember expanded state
|
||||
- [ ] Tags with special chars break search
|
||||
- [ ] Long filenames overflow in sidebar
|
||||
|
||||
## Fixed
|
||||
|
||||
- [x] Slash commands not working consistently
|
||||
- [x] Drag and drop to root not working"
|
||||
|
||||
# Notes dans research/ai
|
||||
create_note "research/ai/semantic-search.md" "Semantic Search Research" '"research", "ai", "search"' \
|
||||
"# Semantic Search
|
||||
|
||||
## Current Search
|
||||
|
||||
Keyword-based with scoring.
|
||||
|
||||
## Semantic Search
|
||||
|
||||
Use embeddings for similarity:
|
||||
- OpenAI embeddings API
|
||||
- Local models (sentence-transformers)
|
||||
- Vector database (Pinecone, Weaviate)
|
||||
|
||||
## Implementation
|
||||
|
||||
1. Generate embeddings for all notes
|
||||
2. Store in vector DB
|
||||
3. Query with user search
|
||||
4. Return top-k similar
|
||||
|
||||
## Cost Analysis
|
||||
|
||||
OpenAI: $0.0001 per 1K tokens
|
||||
Local: Free but slower"
|
||||
|
||||
create_note "research/ai/auto-tagging.md" "Automatic Tagging" '"research", "ai", "nlp"' \
|
||||
"# Automatic Tagging
|
||||
|
||||
## Goal
|
||||
|
||||
Suggest tags based on note content.
|
||||
|
||||
## Approaches
|
||||
|
||||
### Rule-based
|
||||
- Keyword extraction
|
||||
- TF-IDF
|
||||
|
||||
### ML-based
|
||||
- Zero-shot classification
|
||||
- Fine-tuned model
|
||||
|
||||
### Hybrid
|
||||
- Combine both approaches
|
||||
|
||||
## Training Data
|
||||
|
||||
Use existing notes with tags as training set."
|
||||
|
||||
# Notes dans research/tech
|
||||
create_note "research/tech/go-performance.md" "Go Performance Optimization" '"research", "tech", "performance"' \
|
||||
"# Go Performance
|
||||
|
||||
## Current Bottlenecks
|
||||
|
||||
- Full re-index on file changes
|
||||
- No caching of parsed front matter
|
||||
|
||||
## Optimizations
|
||||
|
||||
### Incremental Indexing
|
||||
Only re-parse changed files.
|
||||
|
||||
### Caching
|
||||
\`\`\`go
|
||||
type Cache struct {
|
||||
entries map[string]*CachedEntry
|
||||
mu sync.RWMutex
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
### Profiling
|
||||
\`\`\`bash
|
||||
go test -cpuprofile=cpu.prof
|
||||
go tool pprof cpu.prof
|
||||
\`\`\`"
|
||||
|
||||
create_note "research/tech/websockets.md" "WebSockets for Live Updates" '"research", "tech", "websocket"' \
|
||||
"# WebSockets
|
||||
|
||||
## Use Cases
|
||||
|
||||
- Live file tree updates
|
||||
- Real-time collaboration
|
||||
- Presence indicators
|
||||
|
||||
## Libraries
|
||||
|
||||
- \`gorilla/websocket\`
|
||||
- \`nhooyr.io/websocket\`
|
||||
|
||||
## Architecture
|
||||
|
||||
\`\`\`
|
||||
Client <-> WebSocket <-> Hub <-> Indexer
|
||||
\`\`\`
|
||||
|
||||
## Broadcasting
|
||||
|
||||
\`\`\`go
|
||||
type Hub struct {
|
||||
clients map[*Client]bool
|
||||
broadcast chan []byte
|
||||
}
|
||||
\`\`\`"
|
||||
|
||||
# Notes dans research/design
|
||||
create_note "research/design/ui-inspiration.md" "UI Design Inspiration" '"research", "design", "ui"' \
|
||||
"# UI Inspiration
|
||||
|
||||
## Apps to Study
|
||||
|
||||
- Notion - Clean, minimal
|
||||
- Obsidian - Graph view
|
||||
- Bear - Beautiful typography
|
||||
- Craft - Smooth animations
|
||||
|
||||
## Design Systems
|
||||
|
||||
- Material Design 3
|
||||
- Apple HIG
|
||||
- Tailwind components
|
||||
|
||||
## Colors
|
||||
|
||||
Current: Material Darker
|
||||
Consider:
|
||||
- Nord theme
|
||||
- Dracula
|
||||
- Catppuccin"
|
||||
|
||||
create_note "research/design/typography.md" "Typography Research" '"research", "design", "typography"' \
|
||||
"# Typography
|
||||
|
||||
## Current Fonts
|
||||
|
||||
- System fonts for UI
|
||||
- Fira Code for code
|
||||
|
||||
## Alternatives
|
||||
|
||||
### Sans-serif
|
||||
- Inter
|
||||
- Poppins
|
||||
- Public Sans
|
||||
|
||||
### Monospace
|
||||
- JetBrains Mono
|
||||
- Cascadia Code
|
||||
- Source Code Pro
|
||||
|
||||
## Readability
|
||||
|
||||
- Line height: 1.6
|
||||
- Max width: 65ch
|
||||
- Font size: 16px base"
|
||||
|
||||
# Notes dans personal
|
||||
create_note "personal/learning-goals.md" "2025 Learning Goals" '"personal", "learning"' \
|
||||
"# Learning Goals 2025
|
||||
|
||||
## Technical
|
||||
|
||||
- [ ] Master Go concurrency patterns
|
||||
- [ ] Learn Rust basics
|
||||
- [ ] Deep dive into databases
|
||||
- [ ] System design courses
|
||||
|
||||
## Soft Skills
|
||||
|
||||
- [ ] Technical writing
|
||||
- [ ] Public speaking
|
||||
- [ ] Mentoring
|
||||
|
||||
## Books to Read
|
||||
|
||||
1. Designing Data-Intensive Applications
|
||||
2. The Pragmatic Programmer
|
||||
3. Clean Architecture"
|
||||
|
||||
create_note "personal/book-notes.md" "Book Notes" '"personal", "notes", "books"' \
|
||||
"# Book Notes
|
||||
|
||||
## Currently Reading
|
||||
|
||||
**Atomic Habits** by James Clear
|
||||
|
||||
Key takeaways:
|
||||
- 1% improvement daily = 37x better in a year
|
||||
- Identity-based habits
|
||||
- Environment design
|
||||
|
||||
## Want to Read
|
||||
|
||||
- Deep Work - Cal Newport
|
||||
- The Mom Test - Rob Fitzpatrick
|
||||
- Shape Up - Basecamp"
|
||||
|
||||
# Notes dans archive
|
||||
create_note "archive/old-ideas.md" "Archived Ideas" '"archive", "ideas"' \
|
||||
"# Archived Ideas
|
||||
|
||||
Ideas that didn't make the cut:
|
||||
|
||||
## WYSIWYG Editor
|
||||
Too complex, Markdown is better.
|
||||
|
||||
## Desktop App
|
||||
Web app is sufficient.
|
||||
|
||||
## Blockchain Integration
|
||||
No real use case.
|
||||
|
||||
## Gamification
|
||||
Not aligned with minimalist approach."
|
||||
|
||||
# Quelques notes à la racine
|
||||
create_note "welcome.md" "Welcome" '"default"' \
|
||||
"# Welcome to Project Notes
|
||||
|
||||
This is your personal note-taking app.
|
||||
|
||||
## Quick Start
|
||||
|
||||
1. Press **Ctrl/Cmd+K** to search
|
||||
2. Click **✨ Nouvelle note** to create
|
||||
3. Use **/** for quick Markdown commands
|
||||
|
||||
## Features
|
||||
|
||||
- **Fast** - Go backend, instant search
|
||||
- **Simple** - Just Markdown files
|
||||
- **Organized** - Folders, tags, drag & drop
|
||||
- **Beautiful** - Dark theme, live preview
|
||||
|
||||
Enjoy! 📝"
|
||||
|
||||
create_note "todo.md" "Quick TODO List" '"task", "todo"' \
|
||||
"# TODO
|
||||
|
||||
## Today
|
||||
- [x] Fix drag & drop
|
||||
- [x] Add root drop zone
|
||||
- [ ] Write documentation
|
||||
- [ ] Deploy to production
|
||||
|
||||
## This Week
|
||||
- [ ] Add export feature
|
||||
- [ ] Improve mobile experience
|
||||
- [ ] Write blog post
|
||||
|
||||
## Someday
|
||||
- [ ] Collaboration features
|
||||
- [ ] Mobile app
|
||||
- [ ] Plugin system"
|
||||
|
||||
create_note "scratch.md" "Scratch Pad" '"default"' \
|
||||
"# Scratch Pad
|
||||
|
||||
Random thoughts and quick notes...
|
||||
|
||||
## Ideas
|
||||
- Maybe add a daily note feature?
|
||||
- Graph view of linked notes
|
||||
- Vim mode for power users
|
||||
|
||||
## Links
|
||||
- https://example.com
|
||||
- https://github.com/user/repo
|
||||
|
||||
## Code Snippet
|
||||
|
||||
\`\`\`javascript
|
||||
const hello = () => {
|
||||
console.log('Hello World');
|
||||
};
|
||||
\`\`\`"
|
||||
|
||||
echo "✅ Structure créée avec succès!"
|
||||
echo ""
|
||||
echo "📊 Statistiques:"
|
||||
echo "- Dossiers: $(find . -type d | wc -l)"
|
||||
echo "- Notes: $(find . -name '*.md' | wc -l)"
|
||||
echo "- Tags uniques: $(grep -h "^tags:" **/*.md 2>/dev/null | sort -u | wc -l)"
|
||||
@ -266,7 +266,6 @@ func (h *Handler) generateHomeMarkdown() string {
|
||||
// En-tête
|
||||
sb.WriteString("# 📚 Index des Notes\n\n")
|
||||
sb.WriteString("_Mise à jour automatique • " + time.Now().Format("02/01/2006 à 15:04") + "_\n\n")
|
||||
sb.WriteString("---\n\n")
|
||||
|
||||
// Construire l'arborescence
|
||||
tree, err := h.buildFileTree()
|
||||
@ -278,7 +277,16 @@ func (h *Handler) generateHomeMarkdown() string {
|
||||
|
||||
// Compter le nombre de notes
|
||||
noteCount := h.countNotes(tree)
|
||||
|
||||
// Section des tags (en premier)
|
||||
h.generateTagsSection(&sb)
|
||||
|
||||
// Statistiques
|
||||
sb.WriteString(fmt.Sprintf("**%d note(s) au total**\n\n", noteCount))
|
||||
sb.WriteString("---\n\n")
|
||||
|
||||
// Titre de l'arborescence
|
||||
sb.WriteString("## 📂 Toutes les notes\n\n")
|
||||
|
||||
// Générer l'arborescence en Markdown
|
||||
h.generateMarkdownTree(&sb, tree, 0)
|
||||
@ -286,6 +294,29 @@ func (h *Handler) generateHomeMarkdown() string {
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// generateTagsSection génère la section des tags avec comptage
|
||||
func (h *Handler) generateTagsSection(sb *strings.Builder) {
|
||||
tags := h.idx.GetAllTagsWithCount()
|
||||
|
||||
if len(tags) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
sb.WriteString("## 🏷️ Tags\n\n")
|
||||
sb.WriteString("<div class=\"tags-cloud\">\n")
|
||||
|
||||
for _, tc := range tags {
|
||||
// Créer un lien HTML discret et fonctionnel
|
||||
sb.WriteString(fmt.Sprintf(
|
||||
`<a href="#" class="tag-item" hx-get="/api/search?query=tag:%s" hx-target="#search-results" hx-swap="innerHTML"><kbd class="tag-badge">#%s</kbd> <mark class="tag-count">%d</mark></a>`,
|
||||
tc.Tag, tc.Tag, tc.Count,
|
||||
))
|
||||
sb.WriteString("\n")
|
||||
}
|
||||
|
||||
sb.WriteString("</div>\n\n")
|
||||
}
|
||||
|
||||
// countNotes compte le nombre de fichiers .md dans l'arborescence
|
||||
func (h *Handler) countNotes(node *TreeNode) int {
|
||||
count := 0
|
||||
|
||||
@ -638,3 +638,33 @@ func extractFrontMatter(path string) (frontMatter, error) {
|
||||
fm, _, err := ExtractFrontMatterAndBody(path)
|
||||
return frontMatter{Tags: fm.Tags}, err
|
||||
}
|
||||
|
||||
// TagCount représente un tag avec son nombre d'utilisations
|
||||
type TagCount struct {
|
||||
Tag string
|
||||
Count int
|
||||
}
|
||||
|
||||
// GetAllTagsWithCount retourne tous les tags avec leur nombre d'utilisations, triés par popularité
|
||||
func (i *Indexer) GetAllTagsWithCount() []TagCount {
|
||||
i.mu.RLock()
|
||||
defer i.mu.RUnlock()
|
||||
|
||||
result := make([]TagCount, 0, len(i.tags))
|
||||
for tag, files := range i.tags {
|
||||
result = append(result, TagCount{
|
||||
Tag: tag,
|
||||
Count: len(files),
|
||||
})
|
||||
}
|
||||
|
||||
// Trier par popularité (nombre décroissant), puis par nom alphabétique
|
||||
sort.Slice(result, func(a, b int) bool {
|
||||
if result[a].Count == result[b].Count {
|
||||
return result[a].Tag < result[b].Tag
|
||||
}
|
||||
return result[a].Count > result[b].Count
|
||||
})
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
22
notes/archive/old-ideas.md
Normal file
22
notes/archive/old-ideas.md
Normal file
@ -0,0 +1,22 @@
|
||||
---
|
||||
title: "Archived Ideas"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["archive", "ideas"]
|
||||
---
|
||||
|
||||
# Archived Ideas
|
||||
|
||||
Ideas that didn't make the cut:
|
||||
|
||||
## WYSIWYG Editor
|
||||
Too complex, Markdown is better.
|
||||
|
||||
## Desktop App
|
||||
Web app is sufficient.
|
||||
|
||||
## Blockchain Integration
|
||||
No real use case.
|
||||
|
||||
## Gamification
|
||||
Not aligned with minimalist approach.
|
||||
41
notes/documentation/api/authentication.md
Normal file
41
notes/documentation/api/authentication.md
Normal file
@ -0,0 +1,41 @@
|
||||
---
|
||||
title: "Authentication Guide"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["documentation", "api", "security"]
|
||||
---
|
||||
|
||||
# Authentication
|
||||
|
||||
## Current Status
|
||||
|
||||
⚠️ No authentication currently implemented.
|
||||
|
||||
## Future Implementation
|
||||
|
||||
### JWT Tokens
|
||||
|
||||
```
|
||||
POST /api/auth/login
|
||||
{
|
||||
"username": "user",
|
||||
"password": "pass"
|
||||
}
|
||||
|
||||
Response:
|
||||
{
|
||||
"token": "eyJhbGc..."
|
||||
}
|
||||
```
|
||||
|
||||
### Bearer Token
|
||||
|
||||
```
|
||||
Authorization: Bearer eyJhbGc...
|
||||
```
|
||||
|
||||
## Security
|
||||
|
||||
- HTTPS only in production
|
||||
- Reverse proxy with nginx
|
||||
- Rate limiting
|
||||
38
notes/documentation/api/endpoints.md
Normal file
38
notes/documentation/api/endpoints.md
Normal file
@ -0,0 +1,38 @@
|
||||
---
|
||||
title: "API Endpoints Reference"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["documentation", "api"]
|
||||
---
|
||||
|
||||
# API Endpoints
|
||||
|
||||
## Notes
|
||||
|
||||
### List Notes
|
||||
```
|
||||
GET /api/v1/notes
|
||||
```
|
||||
|
||||
Returns array of all notes.
|
||||
|
||||
### Get Note
|
||||
```
|
||||
GET /api/v1/notes/{path}
|
||||
Accept: application/json | text/markdown
|
||||
```
|
||||
|
||||
### Create/Update Note
|
||||
```
|
||||
PUT /api/v1/notes/{path}
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
||||
### Delete Note
|
||||
```
|
||||
DELETE /api/v1/notes/{path}
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
See API.md for complete examples.
|
||||
31
notes/documentation/guides/getting-started.md
Normal file
31
notes/documentation/guides/getting-started.md
Normal file
@ -0,0 +1,31 @@
|
||||
---
|
||||
title: "Getting Started Guide"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["documentation", "guide", "tutorial"]
|
||||
---
|
||||
|
||||
# Getting Started
|
||||
|
||||
## Installation
|
||||
|
||||
1. Clone the repo
|
||||
2. Install Go 1.22+
|
||||
3. Install Node.js dependencies
|
||||
4. Build frontend
|
||||
5. Run server
|
||||
|
||||
```bash
|
||||
git clone https://github.com/user/project-notes.git
|
||||
cd project-notes
|
||||
cd frontend && npm install && npm run build
|
||||
cd ..
|
||||
go run ./cmd/server
|
||||
```
|
||||
|
||||
## First Steps
|
||||
|
||||
1. Create a note
|
||||
2. Add tags
|
||||
3. Search with Ctrl+K
|
||||
4. Organize with folders
|
||||
41
notes/documentation/guides/markdown-syntax.md
Normal file
41
notes/documentation/guides/markdown-syntax.md
Normal file
@ -0,0 +1,41 @@
|
||||
---
|
||||
title: "Markdown Syntax Guide"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["documentation", "guide", "markdown"]
|
||||
---
|
||||
|
||||
# Markdown Syntax
|
||||
|
||||
## Headers
|
||||
|
||||
```markdown
|
||||
# H1
|
||||
## H2
|
||||
### H3
|
||||
```
|
||||
|
||||
## Emphasis
|
||||
|
||||
**bold** and *italic*
|
||||
|
||||
## Lists
|
||||
|
||||
- Item 1
|
||||
- Item 2
|
||||
- Nested
|
||||
|
||||
## Code
|
||||
|
||||
Inline `code` and blocks:
|
||||
|
||||
```python
|
||||
def hello():
|
||||
print('Hello')
|
||||
```
|
||||
|
||||
## Tables
|
||||
|
||||
| Column | Column |
|
||||
|--------|--------|
|
||||
| Data | Data |
|
||||
26
notes/ideas/ai-assistant.md
Normal file
26
notes/ideas/ai-assistant.md
Normal file
@ -0,0 +1,26 @@
|
||||
---
|
||||
title: "AI Writing Assistant"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["idea", "ai"]
|
||||
---
|
||||
|
||||
# AI Writing Assistant
|
||||
|
||||
## Vision
|
||||
|
||||
Intégrer un assistant IA pour:
|
||||
- Suggestions d'écriture
|
||||
- Résumés automatiques
|
||||
- Tags suggestions
|
||||
- Recherche sémantique
|
||||
|
||||
## APIs
|
||||
|
||||
- OpenAI GPT-4
|
||||
- Anthropic Claude
|
||||
- Local LLM avec Ollama
|
||||
|
||||
## Privacy
|
||||
|
||||
Données restent locales, API optionnelle.
|
||||
24
notes/ideas/collaboration.md
Normal file
24
notes/ideas/collaboration.md
Normal file
@ -0,0 +1,24 @@
|
||||
---
|
||||
title: "Real-time Collaboration"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["idea", "collaboration"]
|
||||
---
|
||||
|
||||
# Real-time Collaboration
|
||||
|
||||
## Goal
|
||||
|
||||
Plusieurs utilisateurs éditent la même note simultanément.
|
||||
|
||||
## Technology
|
||||
|
||||
- WebSockets
|
||||
- Operational Transforms ou CRDT
|
||||
- Presence indicators
|
||||
|
||||
## Challenges
|
||||
|
||||
- Conflict resolution
|
||||
- Performance at scale
|
||||
- User permissions
|
||||
30
notes/ideas/mobile-app.md
Normal file
30
notes/ideas/mobile-app.md
Normal file
@ -0,0 +1,30 @@
|
||||
---
|
||||
title: "Native Mobile App"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["idea", "mobile"]
|
||||
---
|
||||
|
||||
# Native Mobile App Idea
|
||||
|
||||
## Concept
|
||||
|
||||
Créer une app native iOS/Android pour l'édition de notes.
|
||||
|
||||
## Tech Stack
|
||||
|
||||
- React Native ou Flutter
|
||||
- Sync avec l'API REST
|
||||
- Offline-first architecture
|
||||
|
||||
## Features
|
||||
|
||||
- Push notifications
|
||||
- Widget home screen
|
||||
- Voice notes
|
||||
- Photo attachments
|
||||
|
||||
## Timeline
|
||||
|
||||
Q2 2025 - Prototype
|
||||
Q3 2025 - Beta testing
|
||||
26
notes/meetings/2025/retrospective.md
Normal file
26
notes/meetings/2025/retrospective.md
Normal file
@ -0,0 +1,26 @@
|
||||
---
|
||||
title: "Sprint Retrospective"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["meeting", "retro"]
|
||||
---
|
||||
|
||||
# Retrospective - Sprint 1
|
||||
|
||||
## What went well ✅
|
||||
|
||||
- API REST implémentée rapidement
|
||||
- Bonne collaboration
|
||||
- Tests unitaires en place
|
||||
|
||||
## What to improve ⚠️
|
||||
|
||||
- Documentation à jour
|
||||
- CI/CD pipeline
|
||||
- Code reviews plus rapides
|
||||
|
||||
## Action items
|
||||
|
||||
1. Créer CONTRIBUTING.md
|
||||
2. Setup GitHub Actions
|
||||
3. Daily standups à 10h
|
||||
28
notes/meetings/2025/sprint-planning.md
Normal file
28
notes/meetings/2025/sprint-planning.md
Normal file
@ -0,0 +1,28 @@
|
||||
---
|
||||
title: "Sprint Planning January"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["meeting", "planning"]
|
||||
---
|
||||
|
||||
# Sprint Planning - Janvier 2025
|
||||
|
||||
## Participants
|
||||
- Équipe Dev
|
||||
- Product Owner
|
||||
- Scrum Master
|
||||
|
||||
## Objectifs
|
||||
|
||||
1. Améliorer le drag & drop
|
||||
2. Ajouter l'API REST
|
||||
3. Search modal avec Ctrl+K
|
||||
|
||||
## Vélocité
|
||||
|
||||
20 story points pour ce sprint.
|
||||
|
||||
## Risques
|
||||
|
||||
- Complexité du drag & drop de dossiers
|
||||
- Tests E2E à mettre en place
|
||||
25
notes/meetings/client-feedback.md
Normal file
25
notes/meetings/client-feedback.md
Normal file
@ -0,0 +1,25 @@
|
||||
---
|
||||
title: "Client Feedback Session"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["meeting", "client"]
|
||||
---
|
||||
|
||||
# Client Feedback - Session 1
|
||||
|
||||
## Points positifs
|
||||
|
||||
- Interface épurée et rapide
|
||||
- Édition Markdown fluide
|
||||
- Recherche efficace
|
||||
|
||||
## Demandes
|
||||
|
||||
1. Export PDF des notes
|
||||
2. Partage de notes par lien
|
||||
3. Mode collaboratif
|
||||
4. Dark/Light theme toggle
|
||||
|
||||
## Priorités
|
||||
|
||||
Focus sur l'export PDF pour la v1.1
|
||||
23
notes/personal/book-notes.md
Normal file
23
notes/personal/book-notes.md
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
title: "Book Notes"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["personal", "notes", "books"]
|
||||
---
|
||||
|
||||
# Book Notes
|
||||
|
||||
## Currently Reading
|
||||
|
||||
**Atomic Habits** by James Clear
|
||||
|
||||
Key takeaways:
|
||||
- 1% improvement daily = 37x better in a year
|
||||
- Identity-based habits
|
||||
- Environment design
|
||||
|
||||
## Want to Read
|
||||
|
||||
- Deep Work - Cal Newport
|
||||
- The Mom Test - Rob Fitzpatrick
|
||||
- Shape Up - Basecamp
|
||||
27
notes/personal/learning-goals.md
Normal file
27
notes/personal/learning-goals.md
Normal file
@ -0,0 +1,27 @@
|
||||
---
|
||||
title: "2025 Learning Goals"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["personal", "learning"]
|
||||
---
|
||||
|
||||
# Learning Goals 2025
|
||||
|
||||
## Technical
|
||||
|
||||
- [ ] Master Go concurrency patterns
|
||||
- [ ] Learn Rust basics
|
||||
- [ ] Deep dive into databases
|
||||
- [ ] System design courses
|
||||
|
||||
## Soft Skills
|
||||
|
||||
- [ ] Technical writing
|
||||
- [ ] Public speaking
|
||||
- [ ] Mentoring
|
||||
|
||||
## Books to Read
|
||||
|
||||
1. Designing Data-Intensive Applications
|
||||
2. The Pragmatic Programmer
|
||||
3. Clean Architecture
|
||||
25
notes/projets/backend/api-design.md
Normal file
25
notes/projets/backend/api-design.md
Normal file
@ -0,0 +1,25 @@
|
||||
---
|
||||
title: "API Design"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["projet", "backend", "api"]
|
||||
---
|
||||
|
||||
# API Design
|
||||
|
||||
## Architecture REST
|
||||
|
||||
Notre API suit les principes REST avec les endpoints suivants:
|
||||
|
||||
- `GET /api/v1/notes` - Liste toutes les notes
|
||||
- `GET /api/v1/notes/{path}` - Récupère une note
|
||||
- `PUT /api/v1/notes/{path}` - Crée/met à jour une note
|
||||
- `DELETE /api/v1/notes/{path}` - Supprime une note
|
||||
|
||||
## Authentification
|
||||
|
||||
Pour l'instant, pas d'authentification. À implémenter avec JWT.
|
||||
|
||||
## Rate Limiting
|
||||
|
||||
À considérer pour la production.
|
||||
26
notes/projets/backend/database-schema.md
Normal file
26
notes/projets/backend/database-schema.md
Normal file
@ -0,0 +1,26 @@
|
||||
---
|
||||
title: "Database Schema"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["projet", "backend", "database"]
|
||||
---
|
||||
|
||||
# Database Schema
|
||||
|
||||
## Indexer
|
||||
|
||||
L'indexer maintient une structure en mémoire:
|
||||
|
||||
```go
|
||||
type Indexer struct {
|
||||
tags map[string][]string
|
||||
docs map[string]*Document
|
||||
mu sync.RWMutex
|
||||
}
|
||||
```
|
||||
|
||||
## Performance
|
||||
|
||||
- Indexation en O(n) au démarrage
|
||||
- Recherche en O(1) pour les tags
|
||||
- Re-indexation incrémentale avec fsnotify
|
||||
26
notes/projets/backend/deployment.md
Normal file
26
notes/projets/backend/deployment.md
Normal file
@ -0,0 +1,26 @@
|
||||
---
|
||||
title: "Deployment Strategy"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["projet", "backend", "devops"]
|
||||
---
|
||||
|
||||
# Deployment Strategy
|
||||
|
||||
## Production
|
||||
|
||||
1. Compiler le binaire Go
|
||||
2. Copier les fichiers statiques
|
||||
3. Configurer nginx comme reverse proxy
|
||||
4. Systemd pour gérer le service
|
||||
|
||||
## Docker
|
||||
|
||||
À créer un Dockerfile pour faciliter le déploiement.
|
||||
|
||||
```dockerfile
|
||||
FROM golang:1.22 AS builder
|
||||
WORKDIR /app
|
||||
COPY . .
|
||||
RUN go build -o server ./cmd/server
|
||||
```
|
||||
27
notes/projets/frontend/codemirror-integration.md
Normal file
27
notes/projets/frontend/codemirror-integration.md
Normal file
@ -0,0 +1,27 @@
|
||||
---
|
||||
title: "CodeMirror Integration"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["projet", "frontend", "editor"]
|
||||
---
|
||||
|
||||
# CodeMirror 6 Integration
|
||||
|
||||
## Configuration
|
||||
|
||||
Nous utilisons CodeMirror 6 avec:
|
||||
- `@codemirror/lang-markdown` pour le Markdown
|
||||
- `@codemirror/theme-one-dark` pour le thème
|
||||
- `@codemirror/basic-setup` pour les fonctionnalités de base
|
||||
|
||||
## Slash Commands
|
||||
|
||||
Système de commandes rapides avec `/`:
|
||||
- /h1, /h2, /h3 - Titres
|
||||
- /date - Date actuelle
|
||||
- /table - Tableau
|
||||
- /code - Bloc de code
|
||||
|
||||
## Auto-save
|
||||
|
||||
Déclenché après 2 secondes d'inactivité.
|
||||
27
notes/projets/frontend/drag-and-drop.md
Normal file
27
notes/projets/frontend/drag-and-drop.md
Normal file
@ -0,0 +1,27 @@
|
||||
---
|
||||
title: "Drag and Drop System"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["projet", "frontend", "ux"]
|
||||
---
|
||||
|
||||
# Drag and Drop System
|
||||
|
||||
## Fonctionnalités
|
||||
|
||||
- Déplacer fichiers entre dossiers
|
||||
- Déplacer dossiers entre dossiers
|
||||
- Zone de drop racine
|
||||
- Indicateur visuel de destination
|
||||
|
||||
## Implémentation
|
||||
|
||||
Utilise l'API HTML5 Drag & Drop:
|
||||
- `dragstart` / `dragend`
|
||||
- `dragover` / `dragleave`
|
||||
- `drop`
|
||||
|
||||
## Validations
|
||||
|
||||
- Impossible de déplacer un dossier dans lui-même
|
||||
- Impossible de déplacer la racine
|
||||
31
notes/projets/frontend/vite-build.md
Normal file
31
notes/projets/frontend/vite-build.md
Normal file
@ -0,0 +1,31 @@
|
||||
---
|
||||
title: "Vite Build Process"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["projet", "frontend", "build"]
|
||||
---
|
||||
|
||||
# Vite Build Process
|
||||
|
||||
## Structure
|
||||
|
||||
```
|
||||
frontend/
|
||||
├── src/
|
||||
│ ├── main.js
|
||||
│ ├── editor.js
|
||||
│ ├── file-tree.js
|
||||
│ └── ui.js
|
||||
├── vite.config.js
|
||||
└── package.json
|
||||
```
|
||||
|
||||
## Build
|
||||
|
||||
`npm run build` génère:
|
||||
- `project-notes-frontend.es.js` (ES modules)
|
||||
- `project-notes-frontend.umd.js` (UMD)
|
||||
|
||||
## Watch Mode
|
||||
|
||||
`npm run build -- --watch` pour le dev.
|
||||
21
notes/projets/mobile/pwa.md
Normal file
21
notes/projets/mobile/pwa.md
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
title: "Progressive Web App"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["projet", "mobile", "pwa"]
|
||||
---
|
||||
|
||||
# PWA Features
|
||||
|
||||
## À implémenter
|
||||
|
||||
1. Service Worker
|
||||
2. Manifest.json
|
||||
3. Offline support
|
||||
4. Install prompt
|
||||
|
||||
## Avantages
|
||||
|
||||
- Fonctionne offline
|
||||
- Installable sur mobile
|
||||
- Notifications push possibles
|
||||
26
notes/projets/mobile/responsive-design.md
Normal file
26
notes/projets/mobile/responsive-design.md
Normal file
@ -0,0 +1,26 @@
|
||||
---
|
||||
title: "Responsive Design"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["projet", "mobile", "css"]
|
||||
---
|
||||
|
||||
# Responsive Design
|
||||
|
||||
## Media Queries
|
||||
|
||||
```css
|
||||
@media (max-width: 768px) {
|
||||
/* Tablettes */
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
/* Smartphones */
|
||||
}
|
||||
```
|
||||
|
||||
## Mobile-First
|
||||
|
||||
- Sidebar masquée par défaut
|
||||
- Preview-only mode
|
||||
- Touch-friendly buttons
|
||||
29
notes/research/ai/auto-tagging.md
Normal file
29
notes/research/ai/auto-tagging.md
Normal file
@ -0,0 +1,29 @@
|
||||
---
|
||||
title: "Automatic Tagging"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["research", "ai", "nlp"]
|
||||
---
|
||||
|
||||
# Automatic Tagging
|
||||
|
||||
## Goal
|
||||
|
||||
Suggest tags based on note content.
|
||||
|
||||
## Approaches
|
||||
|
||||
### Rule-based
|
||||
- Keyword extraction
|
||||
- TF-IDF
|
||||
|
||||
### ML-based
|
||||
- Zero-shot classification
|
||||
- Fine-tuned model
|
||||
|
||||
### Hybrid
|
||||
- Combine both approaches
|
||||
|
||||
## Training Data
|
||||
|
||||
Use existing notes with tags as training set.
|
||||
31
notes/research/ai/semantic-search.md
Normal file
31
notes/research/ai/semantic-search.md
Normal file
@ -0,0 +1,31 @@
|
||||
---
|
||||
title: "Semantic Search Research"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["research", "ai", "search"]
|
||||
---
|
||||
|
||||
# Semantic Search
|
||||
|
||||
## Current Search
|
||||
|
||||
Keyword-based with scoring.
|
||||
|
||||
## Semantic Search
|
||||
|
||||
Use embeddings for similarity:
|
||||
- OpenAI embeddings API
|
||||
- Local models (sentence-transformers)
|
||||
- Vector database (Pinecone, Weaviate)
|
||||
|
||||
## Implementation
|
||||
|
||||
1. Generate embeddings for all notes
|
||||
2. Store in vector DB
|
||||
3. Query with user search
|
||||
4. Return top-k similar
|
||||
|
||||
## Cost Analysis
|
||||
|
||||
OpenAI: /tmp/generate_notes.sh.0001 per 1K tokens
|
||||
Local: Free but slower
|
||||
31
notes/research/design/typography.md
Normal file
31
notes/research/design/typography.md
Normal file
@ -0,0 +1,31 @@
|
||||
---
|
||||
title: "Typography Research"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["research", "design", "typography"]
|
||||
---
|
||||
|
||||
# Typography
|
||||
|
||||
## Current Fonts
|
||||
|
||||
- System fonts for UI
|
||||
- Fira Code for code
|
||||
|
||||
## Alternatives
|
||||
|
||||
### Sans-serif
|
||||
- Inter
|
||||
- Poppins
|
||||
- Public Sans
|
||||
|
||||
### Monospace
|
||||
- JetBrains Mono
|
||||
- Cascadia Code
|
||||
- Source Code Pro
|
||||
|
||||
## Readability
|
||||
|
||||
- Line height: 1.6
|
||||
- Max width: 65ch
|
||||
- Font size: 16px base
|
||||
29
notes/research/design/ui-inspiration.md
Normal file
29
notes/research/design/ui-inspiration.md
Normal file
@ -0,0 +1,29 @@
|
||||
---
|
||||
title: "UI Design Inspiration"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["research", "design", "ui"]
|
||||
---
|
||||
|
||||
# UI Inspiration
|
||||
|
||||
## Apps to Study
|
||||
|
||||
- Notion - Clean, minimal
|
||||
- Obsidian - Graph view
|
||||
- Bear - Beautiful typography
|
||||
- Craft - Smooth animations
|
||||
|
||||
## Design Systems
|
||||
|
||||
- Material Design 3
|
||||
- Apple HIG
|
||||
- Tailwind components
|
||||
|
||||
## Colors
|
||||
|
||||
Current: Material Darker
|
||||
Consider:
|
||||
- Nord theme
|
||||
- Dracula
|
||||
- Catppuccin
|
||||
32
notes/research/tech/go-performance.md
Normal file
32
notes/research/tech/go-performance.md
Normal file
@ -0,0 +1,32 @@
|
||||
---
|
||||
title: "Go Performance Optimization"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["research", "tech", "performance"]
|
||||
---
|
||||
|
||||
# Go Performance
|
||||
|
||||
## Current Bottlenecks
|
||||
|
||||
- Full re-index on file changes
|
||||
- No caching of parsed front matter
|
||||
|
||||
## Optimizations
|
||||
|
||||
### Incremental Indexing
|
||||
Only re-parse changed files.
|
||||
|
||||
### Caching
|
||||
```go
|
||||
type Cache struct {
|
||||
entries map[string]*CachedEntry
|
||||
mu sync.RWMutex
|
||||
}
|
||||
```
|
||||
|
||||
### Profiling
|
||||
```bash
|
||||
go test -cpuprofile=cpu.prof
|
||||
go tool pprof cpu.prof
|
||||
```
|
||||
34
notes/research/tech/websockets.md
Normal file
34
notes/research/tech/websockets.md
Normal file
@ -0,0 +1,34 @@
|
||||
---
|
||||
title: "WebSockets for Live Updates"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["research", "tech", "websocket"]
|
||||
---
|
||||
|
||||
# WebSockets
|
||||
|
||||
## Use Cases
|
||||
|
||||
- Live file tree updates
|
||||
- Real-time collaboration
|
||||
- Presence indicators
|
||||
|
||||
## Libraries
|
||||
|
||||
- `gorilla/websocket`
|
||||
- `nhooyr.io/websocket`
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
Client <-> WebSocket <-> Hub <-> Indexer
|
||||
```
|
||||
|
||||
## Broadcasting
|
||||
|
||||
```go
|
||||
type Hub struct {
|
||||
clients map[*Client]bool
|
||||
broadcast chan []byte
|
||||
}
|
||||
```
|
||||
27
notes/scratch.md
Normal file
27
notes/scratch.md
Normal file
@ -0,0 +1,27 @@
|
||||
---
|
||||
title: "Scratch Pad"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["default"]
|
||||
---
|
||||
|
||||
# Scratch Pad
|
||||
|
||||
Random thoughts and quick notes...
|
||||
|
||||
## Ideas
|
||||
- Maybe add a daily note feature?
|
||||
- Graph view of linked notes
|
||||
- Vim mode for power users
|
||||
|
||||
## Links
|
||||
- https://example.com
|
||||
- https://github.com/user/repo
|
||||
|
||||
## Code Snippet
|
||||
|
||||
```javascript
|
||||
const hello = () => {
|
||||
console.log('Hello World');
|
||||
};
|
||||
```
|
||||
28
notes/tasks/backlog.md
Normal file
28
notes/tasks/backlog.md
Normal file
@ -0,0 +1,28 @@
|
||||
---
|
||||
title: "Product Backlog"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["task", "planning"]
|
||||
---
|
||||
|
||||
# Product Backlog
|
||||
|
||||
## High Priority
|
||||
|
||||
- [ ] Export notes to PDF
|
||||
- [ ] Bulk operations (delete, move)
|
||||
- [ ] Tags management page
|
||||
- [ ] Keyboard shortcuts documentation
|
||||
|
||||
## Medium Priority
|
||||
|
||||
- [ ] Note templates
|
||||
- [ ] Trash/Recycle bin
|
||||
- [ ] Note history/versions
|
||||
- [ ] Full-text search improvements
|
||||
|
||||
## Low Priority
|
||||
|
||||
- [ ] Themes customization
|
||||
- [ ] Plugin system
|
||||
- [ ] Graph view of notes links
|
||||
29
notes/tasks/bugs.md
Normal file
29
notes/tasks/bugs.md
Normal file
@ -0,0 +1,29 @@
|
||||
---
|
||||
title: "Known Bugs"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["task", "bug"]
|
||||
---
|
||||
|
||||
# Known Bugs
|
||||
|
||||
## Critical
|
||||
|
||||
None currently! 🎉
|
||||
|
||||
## Medium
|
||||
|
||||
- [ ] Search doesn't highlight in preview
|
||||
- [ ] Drag over nested folders can be glitchy
|
||||
- [ ] Mobile: sidebar animation stutters
|
||||
|
||||
## Low
|
||||
|
||||
- [ ] File tree doesn't remember expanded state
|
||||
- [ ] Tags with special chars break search
|
||||
- [ ] Long filenames overflow in sidebar
|
||||
|
||||
## Fixed
|
||||
|
||||
- [x] Slash commands not working consistently
|
||||
- [x] Drag and drop to root not working
|
||||
24
notes/todo.md
Normal file
24
notes/todo.md
Normal file
@ -0,0 +1,24 @@
|
||||
---
|
||||
title: "Quick TODO List"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["task", "todo"]
|
||||
---
|
||||
|
||||
# TODO
|
||||
|
||||
## Today
|
||||
- [x] Fix drag & drop
|
||||
- [x] Add root drop zone
|
||||
- [ ] Write documentation
|
||||
- [ ] Deploy to production
|
||||
|
||||
## This Week
|
||||
- [ ] Add export feature
|
||||
- [ ] Improve mobile experience
|
||||
- [ ] Write blog post
|
||||
|
||||
## Someday
|
||||
- [ ] Collaboration features
|
||||
- [ ] Mobile app
|
||||
- [ ] Plugin system
|
||||
25
notes/welcome.md
Normal file
25
notes/welcome.md
Normal file
@ -0,0 +1,25 @@
|
||||
---
|
||||
title: "Welcome"
|
||||
date: "10-11-2025"
|
||||
last_modified: "10-11-2025:19:21"
|
||||
tags: ["default"]
|
||||
---
|
||||
|
||||
# Welcome to Project Notes
|
||||
|
||||
This is your personal note-taking app.
|
||||
|
||||
## Quick Start
|
||||
|
||||
1. Press **Ctrl/Cmd+K** to search
|
||||
2. Click **✨ Nouvelle note** to create
|
||||
3. Use **/** for quick Markdown commands
|
||||
|
||||
## Features
|
||||
|
||||
- **Fast** - Go backend, instant search
|
||||
- **Simple** - Just Markdown files
|
||||
- **Organized** - Folders, tags, drag & drop
|
||||
- **Beautiful** - Dark theme, live preview
|
||||
|
||||
Enjoy! 📝
|
||||
272
static/theme.css
272
static/theme.css
@ -1133,14 +1133,35 @@ body, html {
|
||||
|
||||
/* Drag and drop styles */
|
||||
.file-item.dragging {
|
||||
opacity: 0.5;
|
||||
opacity: 0.4;
|
||||
background: var(--bg-tertiary);
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
.folder-header.dragging {
|
||||
opacity: 0.4;
|
||||
background: var(--bg-tertiary);
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
.folder-item.drag-over .folder-header {
|
||||
background: linear-gradient(135deg, var(--accent-blue), var(--accent-violet));
|
||||
color: white;
|
||||
box-shadow: var(--shadow-glow);
|
||||
border: 2px solid var(--accent-blue);
|
||||
border-radius: var(--radius-md);
|
||||
animation: pulse 1s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0%, 100% {
|
||||
transform: scale(1);
|
||||
box-shadow: var(--shadow-glow);
|
||||
}
|
||||
50% {
|
||||
transform: scale(1.02);
|
||||
box-shadow: 0 0 30px rgba(88, 166, 255, 0.4);
|
||||
}
|
||||
}
|
||||
|
||||
.file-item.drag-over {
|
||||
@ -1149,6 +1170,109 @@ body, html {
|
||||
box-shadow: var(--shadow-glow);
|
||||
}
|
||||
|
||||
/* Indicateur de destination pendant le drag */
|
||||
.drag-destination-indicator {
|
||||
position: fixed;
|
||||
bottom: 20px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
background: var(--bg-secondary);
|
||||
border: 2px solid var(--accent-blue);
|
||||
border-radius: var(--radius-lg);
|
||||
padding: var(--spacing-md) var(--spacing-lg);
|
||||
box-shadow: var(--shadow-lg), var(--shadow-glow);
|
||||
z-index: 10000;
|
||||
display: none;
|
||||
align-items: center;
|
||||
gap: var(--spacing-md);
|
||||
min-width: 300px;
|
||||
animation: slideUp 0.3s ease;
|
||||
}
|
||||
|
||||
.drag-destination-indicator .indicator-icon {
|
||||
font-size: 1.5rem;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.drag-destination-indicator .indicator-text {
|
||||
color: var(--text-primary);
|
||||
font-size: 0.95rem;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.drag-destination-indicator .indicator-text strong {
|
||||
color: var(--accent-blue);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.drag-destination-indicator .indicator-path {
|
||||
font-size: 0.75rem;
|
||||
color: var(--text-muted);
|
||||
font-family: 'Fira Code', 'Cascadia Code', monospace;
|
||||
padding: 2px 6px;
|
||||
background: var(--bg-tertiary);
|
||||
border-radius: var(--radius-sm);
|
||||
border: 1px solid var(--border-primary);
|
||||
}
|
||||
|
||||
/* Curseur pendant le drag */
|
||||
.folder-header[draggable="true"] {
|
||||
cursor: grab;
|
||||
}
|
||||
|
||||
.folder-header[draggable="true"]:active {
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
/* Zone de drop racine */
|
||||
.root-drop-zone {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.root-folder-header {
|
||||
background: var(--bg-tertiary);
|
||||
border: 1px solid var(--border-primary);
|
||||
border-radius: var(--radius-md);
|
||||
padding: var(--spacing-sm) var(--spacing-md) !important;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
cursor: default !important; /* Pas draggable */
|
||||
transition: all var(--transition-fast);
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.root-folder-header .folder-icon {
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
.root-folder-header .folder-name {
|
||||
font-weight: 600;
|
||||
color: var(--text-primary);
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.root-folder-header .root-hint {
|
||||
font-size: 0.75rem;
|
||||
color: var(--text-muted);
|
||||
font-family: 'Fira Code', 'Cascadia Code', monospace;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
/* Quand on drag au-dessus de la racine */
|
||||
.root-drop-zone.drag-over .root-folder-header {
|
||||
background: linear-gradient(135deg, var(--accent-blue), var(--accent-violet));
|
||||
color: white;
|
||||
border-color: var(--accent-blue);
|
||||
box-shadow: var(--shadow-glow);
|
||||
animation: pulse 1s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.root-drop-zone.drag-over .root-folder-header .folder-name,
|
||||
.root-drop-zone.drag-over .root-folder-header .root-hint {
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* Folder creation button */
|
||||
.folder-create-btn {
|
||||
background: var(--bg-tertiary);
|
||||
@ -1221,10 +1345,15 @@ body, html {
|
||||
.folder-header {
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
padding: 0.5rem 0;
|
||||
padding: 0.4rem 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
transition: all var(--transition-fast);
|
||||
}
|
||||
|
||||
.folder-header:hover {
|
||||
color: var(--accent-blue);
|
||||
}
|
||||
|
||||
.folder-icon {
|
||||
@ -1236,7 +1365,7 @@ body, html {
|
||||
}
|
||||
|
||||
.file {
|
||||
padding: 0.5rem 0;
|
||||
padding: 0.3rem 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
@ -1244,30 +1373,37 @@ body, html {
|
||||
|
||||
.file-icon {
|
||||
flex-shrink: 0;
|
||||
opacity: 0.6;
|
||||
transition: opacity var(--transition-fast);
|
||||
}
|
||||
|
||||
.file a {
|
||||
color: var(--accent-blue);
|
||||
color: var(--text-primary);
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
word-break: break-word;
|
||||
flex: 1;
|
||||
font-size: 0.95rem;
|
||||
transition: color var(--transition-fast);
|
||||
}
|
||||
|
||||
.file a:hover {
|
||||
color: var(--accent-blue-hover);
|
||||
text-decoration: underline;
|
||||
color: var(--accent-blue);
|
||||
}
|
||||
|
||||
.file:hover .file-icon {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* Indentation levels - Desktop */
|
||||
.indent-level-1 { padding-left: 0; }
|
||||
.indent-level-2 { padding-left: 1.5rem; }
|
||||
.indent-level-3 { padding-left: 3rem; }
|
||||
.indent-level-4 { padding-left: 4.5rem; }
|
||||
.indent-level-5 { padding-left: 6rem; }
|
||||
.indent-level-6 { padding-left: 7.5rem; }
|
||||
.indent-level-7 { padding-left: 9rem; }
|
||||
.indent-level-8 { padding-left: 10.5rem; }
|
||||
.indent-level-2 { padding-left: 0.5rem; }
|
||||
.indent-level-3 { padding-left: 1rem; }
|
||||
.indent-level-4 { padding-left: 1.5rem; }
|
||||
.indent-level-5 { padding-left: 2rem; }
|
||||
.indent-level-6 { padding-left: 2.5rem; }
|
||||
.indent-level-7 { padding-left: 3rem; }
|
||||
.indent-level-8 { padding-left: 3.5rem; }
|
||||
|
||||
/* ========================================
|
||||
RESPONSIVE DESIGN - Mobile & Tablet
|
||||
@ -1506,9 +1642,9 @@ body, html {
|
||||
.indent-level-3 { padding-left: 1.5rem !important; }
|
||||
.indent-level-4 { padding-left: 2.25rem !important; }
|
||||
.indent-level-5 { padding-left: 3rem !important; }
|
||||
.indent-level-6 { padding-left: 3.75rem !important; }
|
||||
.indent-level-7 { padding-left: 4.5rem !important; }
|
||||
.indent-level-8 { padding-left: 5.25rem !important; }
|
||||
.indent-level-6 { padding-left: 3.5rem !important; }
|
||||
.indent-level-7 { padding-left: 4rem !important; }
|
||||
.indent-level-8 { padding-left: 4.5rem !important; }
|
||||
|
||||
/* Les dossiers et fichiers */
|
||||
.folder,
|
||||
@ -2044,3 +2180,107 @@ body, html {
|
||||
.search-modal-results::-webkit-scrollbar-thumb:hover {
|
||||
background: var(--text-muted);
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Tags Cloud (Home Page)
|
||||
========================================================================== */
|
||||
|
||||
.tags-cloud {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 6px;
|
||||
padding: 12px 0;
|
||||
margin: 12px 0 24px 0;
|
||||
max-height: 150px;
|
||||
overflow-y: auto;
|
||||
line-height: 1.4;
|
||||
border-bottom: 1px solid var(--border-primary);
|
||||
}
|
||||
|
||||
.tag-item {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 3px 8px;
|
||||
background: transparent;
|
||||
border: 1px solid var(--border-primary);
|
||||
border-radius: 4px;
|
||||
text-decoration: none;
|
||||
font-size: 0.8rem;
|
||||
transition: all var(--transition-fast);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.tag-item:hover {
|
||||
background: var(--bg-tertiary);
|
||||
border-color: var(--accent-blue);
|
||||
}
|
||||
|
||||
.tag-item:active {
|
||||
transform: scale(0.98);
|
||||
}
|
||||
|
||||
/* Badge style pour le tag (kbd) - version discrète */
|
||||
.tag-badge {
|
||||
background: transparent;
|
||||
color: var(--text-secondary);
|
||||
padding: 0;
|
||||
font-family: inherit;
|
||||
font-size: 1em;
|
||||
font-weight: 500;
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.tag-item:hover .tag-badge {
|
||||
color: var(--accent-blue);
|
||||
}
|
||||
|
||||
/* Badge count style (mark) - version discrète */
|
||||
.tag-count {
|
||||
background: transparent;
|
||||
color: var(--text-muted);
|
||||
padding: 0;
|
||||
border-radius: 0;
|
||||
font-size: 0.9em;
|
||||
font-weight: 400;
|
||||
border: none;
|
||||
min-width: auto;
|
||||
}
|
||||
|
||||
.tag-item:hover .tag-count {
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
|
||||
/* Scrollbar pour le nuage de tags */
|
||||
.tags-cloud::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
}
|
||||
|
||||
.tags-cloud::-webkit-scrollbar-track {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.tags-cloud::-webkit-scrollbar-thumb {
|
||||
background: var(--border-primary);
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.tags-cloud::-webkit-scrollbar-thumb:hover {
|
||||
background: var(--text-muted);
|
||||
}
|
||||
|
||||
/* Responsive */
|
||||
@media (max-width: 768px) {
|
||||
.tags-cloud {
|
||||
gap: 4px;
|
||||
max-height: 120px;
|
||||
}
|
||||
|
||||
.tag-item {
|
||||
font-size: 0.75rem;
|
||||
padding: 2px 6px;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,14 @@
|
||||
<!-- Zone de drop racine -->
|
||||
<div class="root-drop-zone folder-item" data-path="" data-is-dir="true" data-is-root="true">
|
||||
<div class="folder-header root-folder-header">
|
||||
<span class="folder-icon">🏠</span>
|
||||
<span class="folder-name">Racine</span>
|
||||
<span class="root-hint">(notes/)</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr style="border: none; border-top: 1px solid var(--border-primary); margin: 0.75rem 0;">
|
||||
|
||||
{{if .Tree}}
|
||||
{{if .Tree.Children}}
|
||||
{{template "tree-node" .Tree}}
|
||||
|
||||
Reference in New Issue
Block a user