frontend: Min/Normal/Max je Bereich (Fenster-Buttons)
Beide Panel-Köpfe (Editor, Diagramm) erhalten drei Fenster-Buttons (minimieren/normal/maximieren). Sie springen den Splitter auf Presets: maximieren des einen = minimieren des anderen (gespiegelte Aktiv-Markierung). Seitlich über --col (72% / 360px / 20%), gestapelt über --diagram-h (72vh / auto / 160px). Freies Ziehen am Splitter hebt das Preset auf. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
707f50a223
commit
4ca2108902
+47
-1
@@ -145,6 +145,15 @@
|
|||||||
.seg label + label span{border-left:1px solid rgba(36,52,71,.14)}
|
.seg label + label span{border-left:1px solid rgba(36,52,71,.14)}
|
||||||
.seg input:checked + span{background:var(--or);color:#fff}
|
.seg input:checked + span{background:var(--or);color:#fff}
|
||||||
.seg input:focus-visible + span{outline:2px solid var(--or);outline-offset:-2px}
|
.seg input:focus-visible + span{outline:2px solid var(--or);outline-offset:-2px}
|
||||||
|
.winbtns{display:inline-flex;gap:4px;align-items:center}
|
||||||
|
.winbtn{
|
||||||
|
width:19px;height:19px;display:grid;place-items:center;
|
||||||
|
border:1px solid rgba(36,52,71,.2);border-radius:5px;
|
||||||
|
background:var(--card);color:var(--muted);cursor:pointer;
|
||||||
|
font-size:.72rem;line-height:1;padding:0;
|
||||||
|
}
|
||||||
|
.winbtn:hover{border-color:var(--or);color:var(--or)}
|
||||||
|
.winbtn.active{background:var(--or);color:#fff;border-color:var(--or)}
|
||||||
textarea{
|
textarea{
|
||||||
display:block;width:100%;min-height:380px;
|
display:block;width:100%;min-height:380px;
|
||||||
border:0;outline:none;resize:vertical;
|
border:0;outline:none;resize:vertical;
|
||||||
@@ -354,7 +363,14 @@
|
|||||||
|
|
||||||
<div class="app" id="app">
|
<div class="app" id="app">
|
||||||
<div class="panel editor">
|
<div class="panel editor">
|
||||||
<div class="panel-head">Struktur (Text)</div>
|
<div class="panel-head">
|
||||||
|
<span>Struktur (Text)</span>
|
||||||
|
<div class="winbtns" aria-label="Editor-Größe">
|
||||||
|
<button type="button" class="winbtn" data-state="b" title="minimieren">—</button>
|
||||||
|
<button type="button" class="winbtn" data-state="normal" title="normal">▢</button>
|
||||||
|
<button type="button" class="winbtn" data-state="a" title="maximieren">■</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="editor-body">
|
<div class="editor-body">
|
||||||
<textarea id="src" spellcheck="false"></textarea>
|
<textarea id="src" spellcheck="false"></textarea>
|
||||||
<details class="agenda">
|
<details class="agenda">
|
||||||
@@ -397,6 +413,11 @@
|
|||||||
<label><input type="radio" name="layout" value="vertikal"><span>vertikal</span></label>
|
<label><input type="radio" name="layout" value="vertikal"><span>vertikal</span></label>
|
||||||
<label><input type="radio" name="layout" value="kompakt"><span>kompakt</span></label>
|
<label><input type="radio" name="layout" value="kompakt"><span>kompakt</span></label>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="winbtns" aria-label="Diagramm-Größe">
|
||||||
|
<button type="button" class="winbtn" data-state="a" title="minimieren">—</button>
|
||||||
|
<button type="button" class="winbtn" data-state="normal" title="normal">▢</button>
|
||||||
|
<button type="button" class="winbtn" data-state="b" title="maximieren">■</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="diagram"><ul class="tree" id="out"></ul></div>
|
<div class="diagram"><ul class="tree" id="out"></ul></div>
|
||||||
<div class="warnings" id="warn"></div>
|
<div class="warnings" id="warn"></div>
|
||||||
@@ -570,11 +591,32 @@ function applyLayout(mode){
|
|||||||
out.classList.toggle('vertical', mode === 'vertikal');
|
out.classList.toggle('vertical', mode === 'vertikal');
|
||||||
out.classList.toggle('kompakt', mode === 'kompakt');
|
out.classList.toggle('kompakt', mode === 'kompakt');
|
||||||
app.classList.toggle('side', mode !== 'horizontal');
|
app.classList.toggle('side', mode !== 'horizontal');
|
||||||
|
applySplit(); /* Preset für die neue Orientierung neu setzen */
|
||||||
}
|
}
|
||||||
document.querySelectorAll('input[name="layout"]').forEach(radio => {
|
document.querySelectorAll('input[name="layout"]').forEach(radio => {
|
||||||
radio.addEventListener('change', () => { if(radio.checked) applyLayout(radio.value); });
|
radio.addEventListener('change', () => { if(radio.checked) applyLayout(radio.value); });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/* ---------- Min/Normal/Max je Bereich (Fenster-Buttons) ---------- */
|
||||||
|
/* Zustand 'a' = Editor bevorzugt, 'b' = Diagramm bevorzugt, 'normal' = Default.
|
||||||
|
Maximieren des einen entspricht Minimieren des anderen. */
|
||||||
|
let splitState = 'normal';
|
||||||
|
function applySplit(){
|
||||||
|
if(app.classList.contains('side')){
|
||||||
|
app.style.removeProperty('--diagram-h');
|
||||||
|
app.style.setProperty('--col', splitState==='a' ? '72%' : splitState==='b' ? '20%' : '360px');
|
||||||
|
} else {
|
||||||
|
app.style.removeProperty('--col');
|
||||||
|
if(splitState==='a') app.style.setProperty('--diagram-h','160px');
|
||||||
|
else if(splitState==='b') app.style.setProperty('--diagram-h','72vh');
|
||||||
|
else app.style.removeProperty('--diagram-h');
|
||||||
|
}
|
||||||
|
document.querySelectorAll('.winbtn').forEach(b => b.classList.toggle('active', b.dataset.state===splitState));
|
||||||
|
}
|
||||||
|
document.querySelectorAll('.winbtn').forEach(b => {
|
||||||
|
b.addEventListener('click', () => { splitState = b.dataset.state; applySplit(); });
|
||||||
|
});
|
||||||
|
|
||||||
/* ---------- Splitter: Bereiche per Drag verteilen ---------- */
|
/* ---------- Splitter: Bereiche per Drag verteilen ---------- */
|
||||||
const gutter = document.getElementById('gutter');
|
const gutter = document.getElementById('gutter');
|
||||||
const diagramEl = document.querySelector('.diagram');
|
const diagramEl = document.querySelector('.diagram');
|
||||||
@@ -584,6 +626,9 @@ gutter.addEventListener('pointerdown', e => {
|
|||||||
gutter.classList.add('dragging');
|
gutter.classList.add('dragging');
|
||||||
gutter.setPointerCapture(e.pointerId);
|
gutter.setPointerCapture(e.pointerId);
|
||||||
document.body.style.userSelect = 'none';
|
document.body.style.userSelect = 'none';
|
||||||
|
/* Freies Ziehen hebt das aktive Preset auf */
|
||||||
|
splitState = 'custom';
|
||||||
|
document.querySelectorAll('.winbtn').forEach(b => b.classList.remove('active'));
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
});
|
});
|
||||||
gutter.addEventListener('pointermove', e => {
|
gutter.addEventListener('pointermove', e => {
|
||||||
@@ -612,6 +657,7 @@ gutter.addEventListener('pointercancel', endDrag);
|
|||||||
const showc = document.getElementById('showc');
|
const showc = document.getElementById('showc');
|
||||||
showc.addEventListener('change', render);
|
showc.addEventListener('change', render);
|
||||||
|
|
||||||
|
applySplit(); /* Startzustand: normal, markiert die normal-Buttons aktiv */
|
||||||
src.value = INITIAL;
|
src.value = INITIAL;
|
||||||
render();
|
render();
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user