feat: implement reactive EditorPanel with bidirectional sync

- Reorganize editor components into dedicated folder
- Create PageSettings component with page format, margins, background controls
- Create TextSettings component (structure only, to be populated)
- Implement debounced updates (1s delay) to stylesheet store
- Add bidirectional sync between EditorPanel and StylesheetViewer
- Preserve scroll position as percentage when reloading preview
- Move @page rules from App.vue to stylesheet.css for unified management
- Extend css-parsing utils to handle text values (e.g., 'A4', 'portrait')
- Remove unnecessary comments, use explicit naming instead

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
isUnknown 2025-12-03 15:20:49 +01:00
parent b8cb77c0e5
commit 9f10971041
7 changed files with 1104 additions and 166 deletions

View file

@ -0,0 +1,84 @@
<template>
<aside id="editor-panel">
<nav class="tabs">
<button
type="button"
:class="{ active: activeTab === 'document' }"
@click="activeTab = 'document'"
>
Document
</button>
<button
type="button"
:class="{ active: activeTab === 'code' }"
@click="activeTab = 'code'"
>
Code
</button>
<button
type="button"
:class="{ active: activeTab === 'contenu' }"
@click="activeTab = 'contenu'"
>
Contenu
</button>
</nav>
<div class="tab-content">
<div v-if="activeTab === 'document'" class="tab-panel">
<PageSettings />
<TextSettings />
</div>
<div v-else-if="activeTab === 'code'" class="tab-panel">
<!-- Code tab content -->
</div>
<div v-else-if="activeTab === 'contenu'" class="tab-panel">
<!-- Contenu tab content -->
</div>
</div>
</aside>
</template>
<script setup>
import { ref } from 'vue';
import PageSettings from './PageSettings.vue';
import TextSettings from './TextSettings.vue';
// Tab management
const activeTab = ref('document');
</script>
<style scoped>
#editor-panel {
position: fixed;
top: 0;
left: 0;
width: 250px;
height: 100vh;
background: #f5f5f5;
padding: 1rem;
box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);
overflow-y: auto;
}
h3 {
margin-top: 0;
}
.control {
margin-bottom: 1rem;
}
.control label {
display: block;
margin-bottom: 0.25rem;
font-size: 0.875rem;
}
.control input {
width: 80px;
padding: 0.25rem;
}
</style>