feat: Etherpad-Anbindung ausgebaut (D78)
D31 lieh sich fuer die Echtzeit-Zusammenarbeit ein Etherpad: Das Pad war die Schreibflaeche, Werkbaum die Ansicht. Richtig fuer den Zeitpunkt - die schwere Arbeit war dort getan, und Werkbaum hatte kein Backend. Jetzt hat es eins (D76), das dasselbe besser und im Editor selbst kann. D31 bleibt stehen: Was dort gemessen wurde, ist der Grund, warum die Anbindung nie gut wurde - Export-Drosselung (10 je 90 s), SameSite=Lax beim Autoren-Cookie, abgelehnter Socket-Upgrade. Uebrig blieb ein Neu-laden-Knopf und ein schreibgeschuetztes Textfeld. Ein alter ?etherpad=-Link meldet sich, statt still nichts zu tun: Der Parameter bleibt erkannt und ergibt die zeilenlose Warnung padGone, die auf ?live= zeigt (neun Sprachen). Geholt wird nichts - nachgemessen geht keine Anfrage mehr an den Pad-Host. Vorhandene Pad-Dokumente bleiben liegen und werden dabei besser: ohne Schreibschutz sind sie bearbeitbar und sammeln fruehere Staende. Mit ausgebaut, weil sie nur der Anbindung dienten: remote.js samt Tests, der Ansichts-Waehler und sein Splitter, der Neu-laden-Knopf samt Drosselungs-Zaehler, die Warnungen sourceTimeout/padRateLimit, elf i18n- Schluessel x 9 Sprachen - und src.readOnly ganz, denn nur Pad-Dokumente haben es gesetzt (mit ihm updateSnapBtn und sieben tote Waechter). Auch #srcArea faellt weg: den Kasten gab es nur, damit Pad-Rahmen und Spiegel sich einen Bereich teilen. ?sourceUrl= bleibt unangetastet - beide teilten sich einen Fetch-Pfad, das war die Stelle, an der nichts verrutschen durfte. Im Plan wird aus dem #col.pad-Zweig (14 Knoten samt der ganzen "Update by itself"-Gruppe) ein verworfener Knoten mit Begruendung; der gemeinsame Zeigefinger wandert als #col.point heraus, denn !!! gilt jedem geteilten Dokument. 196 Knoten, 0 Warnungen. Nebengewinn: Der README bekommt endlich den Abschnitt zu ?live= - den gab es nie, die Einstiegs-Beschreibung stand weiter beim Pad. Nachgemessen im Browser: ?etherpad= zeigt die Warnung ohne Netz-Anfrage, ?sourceUrl= laedt unveraendert und ist beschreibbar, Textfeld und Zahlenstreifen liegen buendig, Legenden-Splitter teilt wie zuvor (954+10+300), Falten und Staende funktionieren. 501 Tests, 946 Zeilen weniger.
This commit is contained in:
+3
-54
@@ -270,29 +270,8 @@
|
||||
Horizontal nebeneinander, vertikal (.side) untereinander. */
|
||||
.editor-body{display:flex;align-items:stretch;flex:1 1 auto;min-height:0}
|
||||
.editor-body textarea{flex:1 1 auto;min-width:0;min-height:0}
|
||||
/* Pad-Rahmen | interner Spiegel (D31). Eigener Bereich, damit die
|
||||
Legenden-Aufteilung (D26) unangetastet bleibt. Nur in der Ansicht „beide"
|
||||
bekommt der Spiegel eine feste Größe (`--pcol`/`--prow`) — sonst füllt er
|
||||
wie bisher den Bereich. Die 85 %-Grenze steht zusätzlich hier im CSS, weil
|
||||
der gespeicherte Wert ein px-Wert ist und der Bereich später schrumpfen
|
||||
kann (dieselbe Falle wie bei der Legende, D26). */
|
||||
.src-area{display:flex;align-items:stretch;flex:1 1 auto;min-width:0;min-height:0}
|
||||
.padframe{flex:1 1 auto;min-width:0;min-height:0;border:0;background:var(--card)}
|
||||
.padframe[hidden]{display:none}
|
||||
/* Zeilennummern + Textfeld sind eine Spalte (`.src-wrap`). Der Pad-Splitter
|
||||
teilt gegen diese Spalte — nicht gegen das nackte Textfeld, sonst stünde der
|
||||
Zahlenstreifen außerhalb der geteilten Breite. */
|
||||
/* Zeilennummern + Textfeld sind eine Spalte (`.src-wrap`, D33). */
|
||||
.src-wrap{display:flex;align-items:stretch;flex:1 1 auto;min-width:0;min-height:0}
|
||||
.src-area.pv-both>.src-wrap{
|
||||
flex:0 0 var(--pcol,300px);max-width:85%;
|
||||
border-left:1px dashed rgba(36,52,71,.18);
|
||||
}
|
||||
.src-area.pv-pad>.src-wrap{display:none}
|
||||
.side .src-area,body.mobile .src-area{flex-direction:column}
|
||||
.side .src-area.pv-both>.src-wrap,body.mobile .src-area.pv-both>.src-wrap{
|
||||
flex:0 0 var(--prow,180px);max-width:none;max-height:85%;
|
||||
border-left:0;border-top:1px dashed rgba(36,52,71,.18);
|
||||
}
|
||||
/* Legende: bewusst KEIN <details> mehr. Chrome legt den Details-Inhalt in
|
||||
`::details-content`; dadurch war `.hint` kein Flex-Kind von `.agenda` mehr,
|
||||
`flex:1/min-height:0` liefen ins Leere und der Inhalt wurde geclippt statt
|
||||
@@ -343,17 +322,6 @@
|
||||
.side .agenda.open{width:auto;max-width:none;height:var(--hrow,220px);max-height:85%}
|
||||
.side .hint-gutter{cursor:row-resize}
|
||||
.side .hint-gutter::before{width:38px;height:3px}
|
||||
/* Splitter Pad|Spiegel — gleiches Idiom wie der Legenden-Splitter. */
|
||||
.pad-gutter{
|
||||
flex:0 0 10px;align-self:stretch;
|
||||
cursor:col-resize;touch-action:none;
|
||||
display:flex;align-items:center;justify-content:center;
|
||||
}
|
||||
.pad-gutter[hidden]{display:none}
|
||||
.pad-gutter::before{content:'';width:3px;height:38px;border-radius:2px;background:rgba(36,52,71,.18)}
|
||||
.pad-gutter:hover::before,.pad-gutter.dragging::before{background:var(--or)}
|
||||
.side .pad-gutter,body.mobile .pad-gutter{cursor:row-resize}
|
||||
.side .pad-gutter::before,body.mobile .pad-gutter::before{width:38px;height:3px}
|
||||
|
||||
.panel{
|
||||
background:var(--card);
|
||||
@@ -431,22 +399,9 @@
|
||||
kopieren, aber dieselbe Erfolgs-Rückmeldung geben (Stand sichern, D54). */
|
||||
.copybtn.done .ic-copy,.copybtn.done .ic-main{display:none}
|
||||
.copybtn.done .ic-done{display:block}
|
||||
/* „im Pad bearbeiten" (D31) — nur bei einem ?etherpad=-Dokument sichtbar.
|
||||
Das [hidden] braucht die eigene Regel, weil .copybtn ein display setzt. */
|
||||
.padlink{text-decoration:none}
|
||||
.padlink[hidden],.padrefresh[hidden],.padview[hidden]{display:none}
|
||||
/* Der Ansichts-Wähler zeigt seinen Zustand als Position im Rahmen: geteilt,
|
||||
links gefüllt (Pad) oder rechts gefüllt (Spiegel). Zwei Klassen, damit die
|
||||
Regel die allgemeinere `.copybtn svg{display:block}` sicher schlägt. */
|
||||
.copybtn.padview .ic-both,
|
||||
.copybtn.padview .ic-pad,
|
||||
.copybtn.padview .ic-text{display:none}
|
||||
.copybtn.padview[data-view="both"] .ic-both,
|
||||
.copybtn.padview[data-view="pad"] .ic-pad,
|
||||
.copybtn.padview[data-view="text"] .ic-text{display:block}
|
||||
/* Falt-Durchschalter (SPEC §9/D75): vier Icons, sichtbar ist das des
|
||||
NÄCHSTEN Schritts — `data-next` setzt updateFoldBtn(). Zwei Klassen wie
|
||||
beim Pad-Wähler, damit die Regel `.copybtn svg{display:block}` schlägt. */
|
||||
NÄCHSTEN Schritts — `data-next` setzt updateFoldBtn(). Zwei Klassen, damit
|
||||
die Regel `.copybtn svg{display:block}` schlägt. */
|
||||
.copybtn.foldbtn .fc-small,
|
||||
.copybtn.foldbtn .fc-path,
|
||||
.copybtn.foldbtn .fc-closed,
|
||||
@@ -596,11 +551,6 @@
|
||||
color:var(--ink);background:var(--card);
|
||||
tab-size:2;
|
||||
}
|
||||
/* Pad-Dokument (D31): hier nur lesen, geschrieben wird im Pad. Abgesetzt über
|
||||
den Hintergrund, damit der Schreibschutz nicht als hängendes Textfeld
|
||||
erscheint — die Schrift bleibt aber Tinte: hier wird gelesen, der Plantext
|
||||
ist der Hauptinhalt und kein ausgegrautes Formularfeld. */
|
||||
textarea.readonly{background:#F1F4F7;cursor:default}
|
||||
/* Zeilennummern (D33). Die Warnungen nennen Zeilennummern — ohne Streifen
|
||||
muss man sie im Textfeld abzählen. Jede Zahl steht auf einer **gemessenen**
|
||||
Höhe (`renderLineNos()` in app.js), nicht auf „Zeilenhöhe × n"; seit D49
|
||||
@@ -617,7 +567,6 @@
|
||||
color:var(--muted);
|
||||
-webkit-user-select:none;user-select:none;
|
||||
}
|
||||
.src-wrap.readonly .lineno{background:#F1F4F7}
|
||||
.lineno-inner{position:absolute;top:0;left:0;right:0}
|
||||
.lineno-inner span{
|
||||
position:absolute;right:6px;
|
||||
|
||||
Reference in New Issue
Block a user