Commit graph

122 commits

Author SHA1 Message Date
Julie Blanc
c3c9de2ca2 add zoom composant 2026-03-08 08:44:39 +01:00
Julie Blanc
59f6716121 correction page margins 2026-03-07 20:05:48 +01:00
Julie Blanc
3ae2d0e310 style panel settings 2026-03-07 19:59:01 +01:00
Julie Blanc
bd828e697c rebuild style for settings section 2026-03-07 18:51:08 +01:00
Julie Blanc
8bf7afddd2 factorisation ElementPopUp 2026-03-06 18:37:48 +01:00
Julie Blanc
3853d0d6e3 restructuration settings popup 2026-03-06 18:27:14 +01:00
Julie Blanc
c43494f1c2 settings-subsection → section 2026-03-06 18:20:19 +01:00
Julie Blanc
6902a2fd0e display default value in popup 2026-03-06 18:11:36 +01:00
Julie Blanc
1832b031be popup move handle + resize 2026-03-06 18:07:27 +01:00
Julie Blanc
1dad95b726 toggle setting popup on block 2026-03-06 17:53:10 +01:00
Julie Blanc
295f63d271 repair panel CSS 2026-03-06 17:39:09 +01:00
Julie Blanc
564de8aba8 repair panel CSS 2026-03-06 17:18:04 +01:00
Julie Blanc
89e5fe6612 correction sans-serif default 2026-03-05 19:06:27 +01:00
Julie Blanc
bc2317ab69 3 values systeme for heritage 2026-03-05 19:00:29 +01:00
Julie Blanc
449f0eda31 defaults values from panel 2026-03-05 16:51:35 +01:00
Julie Blanc
ace75a3fb2 repair font-family module 2026-03-05 16:32:19 +01:00
Julie Blanc
cb9fd93e51 implement font-family module 2026-03-05 16:29:42 +01:00
Julie Blanc
8b99326de2 font-size, line-height, color → defaults values 2026-03-05 15:59:38 +01:00
Julie Blanc
fa56118e75 toggle all values 2026-03-05 14:49:58 +01:00
Julie Blanc
203ed18aba delete inherance 2026-03-05 11:42:18 +01:00
Julie Blanc
cc36b73325 add border settings 2026-03-05 11:08:44 +01:00
Julie Blanc
fc6391a53d margins + paddings in pop vue 2026-03-05 10:45:55 +01:00
Julie Blanc
154804ee44 add line-height possibility 2026-03-02 17:29:49 +01:00
Julie Blanc
cd65c35994 default styles print
All checks were successful
Deploy / Build and Deploy to Production (push) Successful in 25s
2026-03-02 17:06:42 +01:00
isUnknown
f3c7132044 refactor: simplify ElementPopup with flat refs and style descriptors
All checks were successful
Deploy / Build and Deploy to Production (push) Successful in 22s
Flatten ref({ value }) to simple ref(), replace 9 updateX functions with
a generic updateProp driven by descriptor arrays, and loop over descriptors
in generatePreviewCss/loadValuesFromStylesheet/applyAllStyles. Remove
trivial passthrough computed properties. (-123 lines)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:47:58 +01:00
isUnknown
69d5ebe7ed refactor: extract shared patterns from popup/settings components
- Create useColoris composable (shared Coloris init across 4 files)
- Create useLinkedSpacing composable (linked margin/padding logic from TextSettings)
- Create BasePopup component (shared popup shell, CSS editor, inheritance button)
- Add watchProp helper in ElementPopup (12 watchers → 12 compact lines)
- Use extractSpacing for @page margin parsing in PagePopup and PageSettings

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:35:45 +01:00
isUnknown
0c682c78c0 rename parseCarte → parseMap, fix marker icon size, remove testing checklist
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:10:14 +01:00
isUnknown
41fbe71a1f feat: render full map content (image, intro, markers) in PagedJS
- Fix template check 'carte' → 'map' so map subpages are served by API
- Add parseMarker() and enrich parseCarte() with static image, intro, markers
- Include map children in parseGeoformat() alongside chapters
- Resolve map block references in chapters to full carte data
- Update narrative store flattening with new carte fields
- Replace MapBlock placeholder with full carte rendering (title, image, tags, intro, markers with icons and blocks)
- Add default marker-pin.svg for markers without custom icon

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:00:28 +01:00
isUnknown
ffcb1a9f2e rename: chapitre/projet templates to chapter/project
Standardize French template names to English across blueprints,
content files, PHP templates, Vue components and Pinia stores.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:29:07 +01:00
isUnknown
e806f6ac48 disable: mark font selector and pattern field as upcoming features
All checks were successful
Deploy / Build and Deploy to Production (push) Successful in 21s
Both use field--view-only styling with disabled inputs and
"Fonctionnalité à venir" tooltip. Italic checkbox remains active.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:08:08 +01:00
isUnknown
5d43a772bc fix: target p instead of body for font-style italic in TextSettings
All checks were successful
Deploy / Build and Deploy to Production (push) Successful in 21s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:03:50 +01:00
isUnknown
9f62d3ae5d feat: add custom page format with editable width/height fields
All checks were successful
Deploy / Build and Deploy to Production (push) Successful in 20s
Keep only A4/A5 + "Personnalisé" option. Width/height fields use same
layout as margin fields and are editable only in custom mode.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 14:51:00 +01:00
isUnknown
b808e22274 fix: target p instead of body for text background-color in TextSettings
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 14:44:12 +01:00
isUnknown
b5b495d478 disable: comment out em/rem unit options, keep only px and mm for print
All checks were successful
Deploy / Build and Deploy to Production (push) Successful in 20s
Margins: px + mm only. Font sizes: px only.
em/rem buttons are commented out, not deleted, for potential future use.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 14:16:54 +01:00
isUnknown
de3bb2a274 fix: convert values when switching CSS units to preserve visual size
All checks were successful
Deploy / Build and Deploy to Production (push) Successful in 21s
Previously, changing unit (e.g. mm → px) kept the numeric value unchanged,
causing visual changes. Now values are converted through a px pivot unit
so the rendered size stays the same.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 14:08:30 +01:00
isUnknown
342a6eccf1 fix: update Coloris color swatches in TextSettings after loading custom styles
Dispatch input events on color inputs after syncFromStore so Coloris
updates its ::before pseudo-element swatches with loaded values.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 14:02:33 +01:00
isUnknown
f760e1942a fix: race condition on custom styles loading + misc cleanup
All checks were successful
Deploy / Build and Deploy to Production (push) Successful in 22s
Guard watcher-triggered renders in usePreviewRenderer until first
explicit render completes, preventing premature renders with default
styles. Also: disable Contenu tab, update content/blueprints, add
global disabled button styles, minor formatting.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 13:53:55 +01:00
isUnknown
59dfa18ec7 disable: comment out PagePopup and page hover/highlight feature
Keep the code aside for potential re-activation later.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 13:37:07 +01:00
isUnknown
2b0f4f8742 refactor: comprehensive map-editor plugin refactoring (phases 1-3)
All checks were successful
Deploy / Build and Deploy to Production (push) Successful in 18s
This commit implements a complete refactoring of the map-editor plugin to
improve code organization, reusability, and maintainability.

## Phase 1: Extraction of composables and factory functions

**New composables:**
- `useMarkers.js`: Centralized marker state and CRUD operations
  - Exports: markers, selectedMarkerId, editingMarker refs
  - Computed: canAddMarker, hasMarkers, selectedMarker
  - Methods: addMarker, updateMarker, deleteMarker, selectMarker, etc.
  - Includes createMarker() factory to eliminate code duplication

- `useMapData.js`: Map data persistence (YAML load/save)
  - Exports: center, zoom refs
  - Methods: loadMapData, saveMapData, debouncedSave
  - Handles lifecycle cleanup of debounce timeouts

**Benefits:**
- Eliminated code duplication (2 identical marker creation blocks)
- Separated business logic from UI concerns
- Improved testability with pure functions
- Added JSDoc documentation throughout

## Phase 2: Component extraction

**New components:**
- `MarkerList.vue`: Extracted sidebar UI from MapEditor.vue
  - Props: markers, selectedMarkerId, maxMarkers
  - Emits: add-marker, select-marker, edit-marker, delete-marker, select-location
  - Includes integrated GeocodeSearch component
  - Self-contained styles with scoped CSS

**Benefits:**
- MapEditor.vue reduced from 370 → 230 lines (-40%)
- Clear separation of concerns (orchestration vs presentation)
- Reusable component for potential future use
- Easier to test and maintain

## Phase 3: Utils restructuring with JSDoc

**New structure:**
```
utils/
├── constants.js           # NOMINATIM_API, MAP_DEFAULTS, DEBOUNCE_DELAYS
├── api/
│   └── nominatim.js      # geocode() with full JSDoc typedefs
└── helpers/
    └── debounce.js       # Generic debounce utility
```

**Removed:**
- `utils/geocoding.js` (replaced by modular structure)

**Benefits:**
- Constants centralized for easy configuration
- API layer separated from helpers
- Complete JSDoc type annotations for better IDE support
- Better organization following standard patterns

## Updated components

**MapEditor.vue:**
- Now uses useMarkers and useMapData composables
- Uses MarkerList component instead of inline template
- Cleaner setup function with better separation
- Reduced from 537 → 256 lines (CSS moved to MarkerList)

**GeocodeSearch.vue:**
- Updated imports to use new utils structure
- Uses DEBOUNCE_DELAYS constant instead of hardcoded value

## Build verification

-  npm run build successful
-  Bundle size unchanged (806.10 kB / 223.46 KiB gzipped)
-  All functionality preserved
-  No breaking changes

## Documentation

- Added comprehensive README.md with:
  - Architecture overview
  - Composables usage examples
  - Component API documentation
  - Data flow diagrams
  - Development guide

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-28 16:29:15 +01:00
isUnknown
be7bb66e70 refactor: extract App.vue logic into composables (762→230 lines)
All checks were successful
Deploy / Build and Deploy to Production (push) Successful in 14s
Extracted complex logic from App.vue into focused, reusable composables:

New composables:
- useKeyboardShortcuts.js (~80 lines): Keyboard shortcuts (Cmd/Ctrl+S, P, Escape, \)
- useIframeInteractions.js (~370 lines): Page/element hover, labels, clicks, popups
- usePreviewRenderer.js (~160 lines): Double buffering, transitions, scroll persistence
- usePrintPreview.js (~70 lines): Print dialog and style collection

Benefits:
- 70% reduction in App.vue size (532 lines extracted)
- Better separation of concerns
- Improved maintainability and testability
- Clearer code organization

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 17:20:10 +01:00
isUnknown
dac532a932 feat: add Cmd/Ctrl+P shortcut to trigger print preview
Added Cmd+P (Mac) or Ctrl+P (Windows/Linux) to trigger printPreview():
- Prevents default browser print dialog
- Triggers custom print preview function
- Updated print button tooltip to show keyboard shortcut
- Added platform detection for correct symbol display (⌘ or Ctrl)

Works in all contexts (main document and iframe).

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 17:11:18 +01:00
isUnknown
4d39a83a63 feat: add backslash shortcut to toggle editor panel
Added \ key to toggle the editor panel open/closed:
- Opens to 'document' tab when panel is closed
- Closes panel when it's open
- Updated button tooltips to indicate the keyboard shortcut

Works in all contexts (main document and iframe).

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 17:10:26 +01:00
isUnknown
8e2f0a10e2 feat: add Escape key shortcut to close popups
Added Escape key handler to close ElementPopup or PagePopup when open.
The handler checks which popup is visible and calls its close method.

Works in all contexts (main document and iframe) using the existing
handleKeyboardShortcut function.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 17:09:28 +01:00
isUnknown
91ef119697 fix: keyboard shortcut Cmd/Ctrl+S now works when focus is in preview iframe
Added keyboard event listener to iframe document to capture shortcuts
when user is focused inside the preview. Previously, keyboard events
inside iframes didn't bubble up to the parent document.

Changes:
- Add handleKeyboardShortcut function in App.vue
- Attach keydown listener to main document (for focus outside iframe)
- Attach keydown listener to iframe document (for focus inside iframe)
- Clean up listener on unmount

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 17:07:02 +01:00
isUnknown
e229deb0f6 fix color picker z-index (always above)
All checks were successful
Deploy / Build and Deploy to Production (push) Successful in 16s
2026-01-09 17:03:11 +01:00
isUnknown
83455b7098 fix: improve Coloris color picker visibility and button clickability
All checks were successful
Deploy / Build and Deploy to Production (push) Successful in 16s
- Fix grid layout: add second column for input (grid-template-columns: var(--input-h) 1fr)
- Ensure color picker button is clickable with cursor pointer and pointer-events auto
- Set color picker z-index to 10000 to display above all UI elements
- Add global styles to ensure Coloris button is always clickable

Fixes issues where:
- Color picker appeared behind ElementPopup
- Button was not consistently clickable
- Grid layout was missing second column definition

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 16:54:10 +01:00
isUnknown
9127520ff7 feat: add keyboard shortcut Cmd/Ctrl+S to SaveButton
- Add Cmd+S (Mac) or Ctrl+S (Windows/Linux) keyboard shortcut to save CSS
- Detect platform to display correct shortcut symbol (⌘ or Ctrl)
- Prevent default browser save behavior
- Translate tooltips to French
- Show shortcut in button tooltip

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 16:46:48 +01:00
isUnknown
cb5d056b51 fix: restore TextSettings functionality after store refactoring
All checks were successful
Deploy / Build and Deploy to Production (push) Successful in 16s
Fixed TextSettings fields not updating the stylesheet and preview after
the store refactoring that made content a computed property.

- Add missing font watcher in TextSettings.vue
- Update useCssUpdater.js to use store.replaceBlock() instead of
  writing to readonly store.content
- Update createRule() to append to store.customCss instead of store.content

All TextSettings fields (font, size, margins, padding, alignment) now
correctly update the stylesheet and preview.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 16:42:34 +01:00
isUnknown
e42eeab437 feat: add scrollable CSS editor and complete stylesheet export
Add two improvements to StylesheetViewer:

1. Scrollable CSS sections
   - Add max-height (500px) and overflow-y to custom CSS editor
   - Applies to both read-only and editable modes
   - Improves UX when content exceeds viewport

2. Complete stylesheet export button
   - Exports merged base CSS + custom CSS to single file
   - Filename format: <narrative-slug>-style.print.css
   - Includes informative comments:
     * Header with narrative title and download date
     * Section markers for base CSS and custom CSS
   - Full-width button below custom CSS section
   - Download via blob + automatic cleanup

Export file structure:
- Header comment (narrative info, date)
- Base CSS section with comment
- Custom CSS section with comment

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 16:30:18 +01:00
isUnknown
e88c217b1e feat: add CSS file import with drag & drop support
All checks were successful
Deploy / Build and Deploy to Production (push) Successful in 16s
Add CssFileImport component to StylesheetViewer allowing users to
import CSS files to replace custom CSS content.

Features:
- Click to select file via file dialog
- Drag & drop support with visual feedback
- File validation (.css only, max 1MB)
- Error messages for invalid files
- Direct replacement of customCss content

New component:
- src/components/ui/CssFileImport.vue

Integration:
- Added at top of StylesheetViewer
- Emits 'import' event with file content
- Content replaces customCss in store

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 14:41:56 +01:00