Files
HoneyOS/web/looks/win95.html
T
marcandClaude Opus 5 84cc5d619e feat: HoneyOS – Retro-Schreibtisch und Leiste für die eigenen Apps
Statische Oberfläche vor Aether und InkNote: kein Backend, kein Build,
nginx liefert web/ aus. Jede App bleibt ihre eigene PWA auf ihrer eigenen
Domain – HoneyOS ist Startpunkt und Umschalter, kein iframe-Rahmen.

- zwei Betriebsarten aus einem Datenstand: Terminal (Kacheln, Tastatur)
  und Desktop (Symbole, verschiebbare Fenster, Taskleiste)
- honeybar.js als Drop-in für die Apps, rendert im Shadow DOM, damit
  Tailwind und die InkNote-Palette einander nicht in die Quere kommen
- Konfiguration vollständig aus der .env: das Skript in
  /docker-entrypoint.d/ schreibt config.json beim Containerstart
- optionaler _ME-Pfad pro App zeigt an, wer angemeldet ist; ohne CORS
  bleibt die Anzeige leer, ohne dass etwas kaputtgeht

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 14:45:55 +02:00

226 lines
9.8 KiB
HTML

<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>HoneyOS — Look: Windows 95</title>
<style>
/* ── Windows 95 ──────────────────────────────────────────────────────
Alles lebt von zwei Kanten: hell oben/links, dunkel unten/rechts.
Das ist der gesamte 3D-Effekt, mehr steckt nicht dahinter. */
* { box-sizing: border-box; }
html, body { height: 100%; margin: 0; }
body {
font: 11px/1.4 "MS Sans Serif", Tahoma, Verdana, "DejaVu Sans", sans-serif;
color: #000;
background: #008080;
overflow: hidden;
-webkit-font-smoothing: none;
}
.raised {
border: 2px outset;
border-color: #fff #404040 #404040 #fff;
background: #c0c0c0;
box-shadow: inset -1px -1px 0 #808080, inset 1px 1px 0 #dfdfdf;
}
.sunken {
border: 2px solid;
border-color: #808080 #fff #fff #808080;
background: #c0c0c0;
box-shadow: inset 1px 1px 0 #404040, inset -1px -1px 0 #dfdfdf;
}
/* Schreibtisch-Symbole */
.desk { position: absolute; top: 12px; left: 12px; width: 84px; }
.deskicon {
width: 84px; padding: 6px 2px; text-align: center; color: #fff; cursor: default;
margin-bottom: 6px;
}
.deskicon svg { display: block; margin: 0 auto 4px; image-rendering: pixelated; }
.deskicon .label { display: inline-block; padding: 1px 3px; text-shadow: 1px 1px 0 rgba(0,0,0,.6); }
.deskicon.sel .label { background: #000080; text-shadow: none; outline: 1px dotted #fff; }
.deskicon.sel svg { filter: hue-rotate(0deg) brightness(.85); }
/* Fenster */
.win { position: absolute; padding: 3px; }
.titlebar {
display: flex; align-items: center; gap: 4px;
height: 18px; padding: 0 2px 0 3px;
background: linear-gradient(90deg, #000080, #1084d0);
color: #fff; font-weight: 700;
}
.titlebar.inactive { background: linear-gradient(90deg, #808080, #b5b5b5); }
.titlebar .t { flex: 1; }
.tbtn {
width: 16px; height: 14px; font: 700 10px/10px "MS Sans Serif", Tahoma, sans-serif;
display: grid; place-items: center; padding-bottom: 2px;
}
.menustrip { display: flex; gap: 12px; padding: 2px 5px; }
.menustrip span { cursor: default; }
.menustrip span:hover { background: #000080; color: #fff; }
.win-body { padding: 10px; }
#status { left: 120px; top: 30px; width: 292px; }
#status h1 { font-size: 11px; margin: 0 0 8px; font-weight: 700; }
.rows { display: grid; grid-template-columns: 1fr auto; gap: 3px 10px; margin-bottom: 10px; }
.rows span:nth-child(even) { font-weight: 700; }
.field { padding: 6px 8px; color: #000; }
.note { color: #404040; }
.buttons { display: flex; gap: 6px; justify-content: flex-end; margin-top: 12px; }
.btn { padding: 3px 14px; min-width: 72px; text-align: center; cursor: default; }
.btn.default { outline: 1px solid #000; outline-offset: 1px; }
#progs { left: 436px; top: 30px; width: 300px; }
.listview { padding: 4px; height: 148px; background: #fff; }
.row { display: flex; align-items: center; gap: 8px; padding: 3px 4px; }
.row.sel { background: #000080; color: #fff; }
.row .sub { margin-left: auto; color: #606060; }
.row.sel .sub { color: #c0c0c0; }
.statusfields { display: flex; gap: 3px; margin-top: 4px; }
.statusfields div { padding: 2px 6px; }
.statusfields div:first-child { flex: 1; }
/* Leiste */
#bar { left: 120px; top: 236px; width: 616px; }
.bardemo {
display: flex; align-items: center; gap: 4px; padding: 2px 3px;
}
.bardemo .pill { padding: 2px 10px; cursor: default; }
.bardemo .right { margin-left: auto; display: flex; gap: 4px; align-items: center; }
.barhost { margin-top: 3px; padding: 14px 10px; background: #fff; color: #404040; }
/* Taskleiste */
.taskbar {
position: absolute; left: 0; right: 0; bottom: 0; height: 28px;
display: flex; align-items: center; gap: 4px; padding: 2px 3px;
}
.start { display: flex; align-items: center; gap: 4px; padding: 2px 8px 2px 4px; font-weight: 700; cursor: default; }
.divider { width: 2px; height: 20px; border-left: 1px solid #808080; border-right: 1px solid #fff; margin: 0 2px; }
.task { padding: 3px 10px; width: 154px; text-align: left; cursor: default; }
.task.pressed {
border-color: #808080 #fff #fff #808080;
box-shadow: inset 1px 1px 0 #404040;
background: repeating-conic-gradient(#c0c0c0 0 25%, #dfdfdf 0 50%) 0 0/2px 2px;
font-weight: 700;
}
.tray { margin-left: auto; display: flex; align-items: center; gap: 6px; padding: 2px 8px; }
.switch { position: absolute; right: 12px; top: 12px; padding: 4px 8px; }
.switch a { color: #000080; }
</style>
</head>
<body>
<!-- Schreibtisch -->
<div class="desk">
<div class="deskicon sel">
<svg width="32" height="32" viewBox="0 0 16 16" shape-rendering="crispEdges">
<path fill="#000" d="M5 4h6v1h1v1h1v1h1v5H2V8h1V7h1V6h1z"/>
<path fill="#dfe8f5" d="M5 5h6v1h1v1h1v4H3V8h1V7h1z"/>
<path fill="#7fa8d8" d="M4 9h9v2H4z"/>
</svg>
<span class="label">Aether</span>
</div>
<div class="deskicon">
<svg width="32" height="32" viewBox="0 0 16 16" shape-rendering="crispEdges">
<path fill="#000" d="M3 1h10v14H3z"/>
<path fill="#fffbe6" d="M4 2h8v12H4z"/>
<path fill="#c07000" d="M5 4h6v1H5zm0 3h6v1H5zm0 3h4v1H5z"/>
<path fill="#e0b040" d="M10 9h3v1h-3z"/>
</svg>
<span class="label">InkNote</span>
</div>
</div>
<!-- Statusfenster -->
<div class="win raised" id="status">
<div class="titlebar">
<span class="t">HoneyOS</span>
<span class="tbtn raised">_</span><span class="tbtn raised">&#9633;</span><span class="tbtn raised">&times;</span>
</div>
<div class="menustrip"><span><u>D</u>atei</span><span><u>A</u>nsicht</span><span><u>?</u></span></div>
<div class="win-body">
<h1>Willkommen zurück, marc.</h1>
<div class="rows">
<span>Programme</span><span>2</span>
<span>erreichbar</span><span>2 von 2</span>
<span>Version</span><span>0.1</span>
</div>
<div class="field sunken note">Jedes Programm läuft auf seiner eigenen Domain.<br />HoneyOS öffnet sie nur.</div>
<div class="buttons">
<span class="btn raised default">OK</span>
<span class="btn raised">Einstellungen</span>
</div>
</div>
</div>
<!-- Programme -->
<div class="win raised" id="progs">
<div class="titlebar inactive">
<span class="t">Programme</span>
<span class="tbtn raised">_</span><span class="tbtn raised">&#9633;</span><span class="tbtn raised">&times;</span>
</div>
<div class="win-body" style="padding: 4px">
<div class="listview sunken">
<div class="row sel">
<svg width="16" height="16" viewBox="0 0 16 16" shape-rendering="crispEdges">
<path fill="#000" d="M5 4h6v1h1v1h1v1h1v5H2V8h1V7h1V6h1z"/><path fill="#dfe8f5" d="M5 5h6v1h1v1h1v4H3V8h1V7h1z"/>
</svg>
Aether <span class="sub">Cloud &amp; Dateien</span>
</div>
<div class="row">
<svg width="16" height="16" viewBox="0 0 16 16" shape-rendering="crispEdges">
<path fill="#000" d="M3 1h10v14H3z"/><path fill="#fffbe6" d="M4 2h8v12H4z"/><path fill="#c07000" d="M5 4h6v1H5zm0 3h6v1H5z"/>
</svg>
InkNote <span class="sub">Notizen</span>
</div>
<div class="row">
<svg width="16" height="16" viewBox="0 0 16 16" shape-rendering="crispEdges">
<path fill="#404040" d="M7 3h2v4h4v2H9v4H7V9H3V7h4z"/>
</svg>
Programm hinzufügen…
</div>
</div>
<div class="statusfields">
<div class="sunken">3 Objekte</div>
<div class="sunken">alles bereit</div>
</div>
</div>
</div>
<!-- Leiste -->
<div class="win raised" id="bar">
<div class="titlebar inactive"><span class="t">so sähe die Leiste in InkNote aus</span><span class="tbtn raised">&times;</span></div>
<div class="win-body" style="padding: 4px">
<div class="bardemo sunken" style="background:#c0c0c0">
<span class="pill raised"><b>HoneyOS</b></span>
<span class="divider"></span>
<span class="pill raised">Aether</span>
<span class="pill raised task pressed" style="width:auto">InkNote</span>
<span class="right"><span class="pill sunken">marc</span><span class="pill sunken">02:47</span></span>
</div>
<div class="barhost sunken">… hier beginnt die App selbst, mit ihrem eigenen Aussehen.</div>
</div>
</div>
<div class="switch raised">
Look: <b>Windows 95</b> &nbsp;·&nbsp; <a href="../index.html">Amber-CRT</a> &nbsp;·&nbsp; <a href="./system7.html">System 7</a>
</div>
<!-- Taskleiste -->
<div class="taskbar raised">
<span class="start raised">
<svg width="16" height="14" viewBox="0 0 8 7" shape-rendering="crispEdges">
<path fill="#ff2f2f" d="M0 1h3v2H0z"/><path fill="#2fbf2f" d="M4 0h4v3H4z"/>
<path fill="#2f6fff" d="M0 4h3v2H0z"/><path fill="#ffd02f" d="M4 4h4v3H4z"/>
</svg>
Start
</span>
<span class="divider"></span>
<span class="task raised pressed">HoneyOS</span>
<span class="task raised">Programme</span>
<span class="tray sunken">02:47</span>
</div>
</body>
</html>