Files
oikos/web/node_modules/@surdeddd/wmkit/dist/themes/glass.css
dtoro d4d99a7473
Some checks failed
ci / build-test (push) Has been cancelled
ci / docker-build (push) Has been cancelled
feat: Phase 1 — extract the client (web SPA + desktop) to dtoro/oikos-web
Problem: the hexagonal refactor churns the backend tree for nine more
phases; the UI delivery stack (web/ SPA, cmd/desktop Wails wrapper,
compose/web image) must move to its own repo first so doc/layout
rewrites land once on a backend-only tree.

Change:
- New repo git.hubris.network/dtoro/oikos-web (v0.33.0): web/, desktop/
  (updateURL repointed to oikos-web releases), compose/, own CI (web +
  desktop jobs), own deploy script (CI-green gate, TOCTOU guard,
  version-tagged images, prune-to-3), own webhook receiver on :9798 +
  launchd unit, own compose project publishing the same 8091:80.
- Cutover executed on mac-mini in order: oikos stack's web service
  stopped+removed, oikos-web project brought up on 8091; outer Caddy
  untouched (targets the published port) — serving + Authentik flow +
  /wails 404 quirk verified post-cutover.
- Stripped from oikos: web/, cmd/desktop/, compose/web/, desktop CI
  workflow, ci.yml web job, Makefile ui/desktop/desktop-package/install
  targets, the compose web service, oikos-web from deploy.sh's fallback
  prune list; wails + go-keyring dropped from go.mod, vendor synced.
- README / CONTRIBUTING / AGENTS.md / .agents dev+operations docs now
  point at the new repo; mbse + mascot design docs carry a path note.

Risk: production SPA serving depends on the new pipeline now; rollback
is versioned-image re-up of the old web service from a pre-split
checkout (port 8091). Desktop builds installed before the split still
check dtoro/oikos releases — one manual reinstall, noted in the
oikos-web release notes.

Verification: go vet, make test (race), make generate-check, golangci
(no new findings; baseline down 400→365); post-cutover curls —
localhost:8091 200, /wails/runtime.js 404, outer Caddy 302 Authentik.
2026-08-15 22:27:52 +02:00

203 lines
4.4 KiB
CSS

[data-wm-desktop] {
--wm-radius: 14px;
--wm-bg: rgba(22, 24, 34, 0.55);
--wm-bg-focused: rgba(26, 28, 40, 0.68);
--wm-border: rgba(255, 255, 255, 0.09);
--wm-border-focused: rgba(255, 255, 255, 0.22);
--wm-shadow: 0 8px 28px rgba(0, 0, 0, 0.35);
--wm-shadow-focused: 0 18px 48px rgba(0, 0, 0, 0.5);
--wm-titlebar-bg: rgba(255, 255, 255, 0.04);
--wm-text: rgba(240, 242, 250, 0.92);
--wm-text-dim: rgba(240, 242, 250, 0.55);
--wm-accent: #7c6cff;
--wm-blur: 22px;
--wm-transition: 240ms cubic-bezier(0.32, 0.72, 0, 1);
position: relative;
overflow: hidden;
}
[data-wm-window] {
display: flex;
flex-direction: column;
box-sizing: border-box;
color: var(--wm-text);
background: var(--wm-bg);
-webkit-backdrop-filter: blur(var(--wm-blur)) saturate(1.4);
backdrop-filter: blur(var(--wm-blur)) saturate(1.4);
border: 1px solid var(--wm-border);
border-radius: var(--wm-radius);
box-shadow: var(--wm-shadow);
outline: none;
contain: layout style;
transition:
transform var(--wm-transition),
width var(--wm-transition),
height var(--wm-transition),
box-shadow 180ms ease,
border-color 180ms ease,
opacity 180ms ease;
animation: wm-window-in 220ms cubic-bezier(0.32, 0.72, 0, 1);
}
[data-wm-window][hidden] {
display: none;
}
[data-wm-window][data-wm-focused] {
background: var(--wm-bg-focused);
border-color: var(--wm-border-focused);
box-shadow: var(--wm-shadow-focused);
}
[data-wm-window][data-wm-dragging],
[data-wm-window][data-wm-resizing] {
transition:
box-shadow 180ms ease,
border-color 180ms ease;
user-select: none;
-webkit-user-select: none;
}
[data-wm-window][data-wm-stage="maximized"],
[data-wm-window][data-wm-stage="snapped"] {
border-radius: 0;
}
[data-wm-window][data-wm-flash] {
animation: wm-flash 320ms ease;
}
[data-wm-window] [data-wm-drag] {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 14px;
background: var(--wm-titlebar-bg);
border-bottom: 1px solid var(--wm-border);
border-radius: var(--wm-radius) var(--wm-radius) 0 0;
cursor: default;
user-select: none;
-webkit-user-select: none;
flex-shrink: 0;
}
[data-wm-window][data-wm-stage="maximized"] [data-wm-drag],
[data-wm-window][data-wm-stage="snapped"] [data-wm-drag] {
border-radius: 0;
}
[data-wm-window] [data-wm-title] {
flex: 1;
font-size: 13px;
font-weight: 600;
letter-spacing: 0.01em;
color: var(--wm-text);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
[data-wm-window] [data-wm-controls] {
display: flex;
gap: 8px;
align-items: center;
}
[data-wm-window] [data-wm-close],
[data-wm-window] [data-wm-minimize],
[data-wm-window] [data-wm-maximize] {
width: 13px;
height: 13px;
border-radius: 50%;
border: none;
padding: 0;
cursor: pointer;
transition:
filter 120ms ease,
transform 120ms ease;
}
[data-wm-window] [data-wm-close]:hover,
[data-wm-window] [data-wm-minimize]:hover,
[data-wm-window] [data-wm-maximize]:hover {
filter: brightness(1.25);
transform: scale(1.12);
}
[data-wm-window] [data-wm-close]:focus-visible,
[data-wm-window] [data-wm-minimize]:focus-visible,
[data-wm-window] [data-wm-maximize]:focus-visible {
outline: 2px solid var(--wm-accent);
outline-offset: 2px;
}
[data-wm-window] [data-wm-close] {
background: #ff5f57;
}
[data-wm-window] [data-wm-minimize] {
background: #febc2e;
}
[data-wm-window] [data-wm-maximize] {
background: #28c840;
}
[data-wm-window] [data-wm-content] {
flex: 1;
overflow: auto;
padding: 14px;
font-size: 14px;
line-height: 1.55;
}
[data-wm-snap-preview] {
background: color-mix(in srgb, var(--wm-accent) 18%, transparent);
border: 1.5px solid color-mix(in srgb, var(--wm-accent) 55%, transparent);
border-radius: var(--wm-radius);
-webkit-backdrop-filter: blur(4px);
backdrop-filter: blur(4px);
transition:
transform 140ms cubic-bezier(0.32, 0.72, 0, 1),
width 140ms ease,
height 140ms ease;
}
@keyframes wm-window-in {
from {
opacity: 0;
scale: 0.96;
}
to {
opacity: 1;
scale: 1;
}
}
@keyframes wm-flash {
0%,
100% {
translate: 0 0;
}
20% {
translate: -6px 0;
}
45% {
translate: 5px 0;
}
70% {
translate: -3px 0;
}
90% {
translate: 2px 0;
}
}
@media (prefers-reduced-motion: reduce) {
[data-wm-window],
[data-wm-snap-preview] {
transition: none;
animation: none;
}
}