Files
dionotes-client/assets/css/layout.css
MDietermann 570c804d3f feat: Selector-UI nach der gewaehlten Prototyp-Variante
Setzt Issue #8 um: eine Ansicht statt Reiter. Die Liste der bekannten
Workspaces fuehrt, das Hinzufuegen sitzt als Nebenaktion in der Fusszeile und
wird nur beim leeren Erststart zur Primaeraktion. Oeffnen ist der
Alltagsfall, Hinzufuegen passiert pro Workspace genau einmal - zwei
gleichrangige Reiter haetten bei jedem Start eine Entscheidung verlangt, die
fast immer dieselbe ist.

Ein Eintrag zeigt den Ordnernamen, darunter den Pfad in der Code-Schrift. Der
Pfad wird bei Ueberlaenge vorne gekuerzt, weil sein Ende mehr aussagt als sein
Anfang.

Die Zustandspruefung laeuft nebenlaeufig ueber use_resource und
spawn_blocking. Ohne das wuerde ein nicht eingehaengtes Netzlaufwerk den
Selector einfrieren: dort laeuft schon is_dir() in ein Timeout von Sekunden,
und zwar auf dem Bildschirm, den jeder Start zuerst zeigt. Solange die
Pruefung laeuft, bleiben die Eintraege unmarkiert.

Die drei Zustaende aus #6 bekommen eigene Farben und Formulierungen - nicht
erreichbar, kein Workspace mehr, beschaedigt -, weil sie zu verschiedenen
Handlungen fuehren. Ein defekter Eintrag wird gedaempft, bleibt aber
anklickbar und verschwindet nie automatisch: Meist fehlt nur gerade das
Laufwerk, und ein Klick versucht es erneut.

OpenError ist dafuer Clone und PartialEq geworden; Io traegt jetzt die
Meldung als String statt io::Error, der beides nicht kann.
2026-08-28 10:38:13 +02:00

107 lines
2.6 KiB
CSS

/* ==========================================================================
Layout — app shell and the two top-level screens. Structure only, no skin.
========================================================================== */
#main {
height: 100dvh;
display: flex;
flex-direction: column;
overflow: hidden;
}
/* --- Workspace selector ----------------------------------------------------
The pre-editor screen. One view, no tabs: the list of known workspaces
leads, adding one is the secondary action in the footer. Opening is the
everyday case; adding happens once per workspace.
-------------------------------------------------------------------------- */
.selector-shell {
flex: 1;
min-height: 0;
width: 100%;
max-width: 40rem;
margin: 0 auto;
padding: var(--dn-space-7) var(--dn-space-5);
display: flex;
flex-direction: column;
gap: var(--dn-space-5);
}
.selector-head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: var(--dn-space-4);
}
.selector-title {
font-size: var(--dn-text-xl);
font-weight: 600;
}
/* Nur die Liste scrollt — Kopf und Fuß bleiben stehen. */
.selector-list-wrap {
flex: 1;
min-height: 0;
overflow-y: auto;
overscroll-behavior: contain;
}
.selector-foot {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--dn-space-3);
padding-top: var(--dn-space-4);
border-top: 1px solid var(--dn-border);
}
/* --- Editor shell ----------------------------------------------------------
Fixed-width file rail + fluid editor. Both scroll independently.
-------------------------------------------------------------------------- */
.layout-container {
flex: 1;
min-height: 0;
display: flex;
flex-direction: row;
}
.files-bar {
flex: 0 0 var(--dn-sidebar-width);
min-width: 0;
display: flex;
flex-direction: column;
gap: 1px;
padding: var(--dn-space-2);
background: var(--dn-bg-sunken);
border-right: 1px solid var(--dn-border);
overflow-y: auto;
overscroll-behavior: contain;
}
.editor-container {
flex: 1;
min-width: 0;
overflow: auto;
}
.editor-class {
height: 100%;
cursor: text;
}
/* Below tablet the rail collapses to a strip across the shell's full width. */
@media (max-width: 640px) {
.layout-container {
flex-direction: column;
}
.files-bar {
flex: 0 0 auto;
max-height: 40dvh;
border-right: 0;
border-bottom: 1px solid var(--dn-border);
}
}