updated styles for homelab

This commit is contained in:
kert
2026-02-08 22:45:09 -05:00
parent 91b78e9a60
commit 8eae87f814
16 changed files with 2109 additions and 165 deletions

View File

@@ -72,7 +72,14 @@
"WebFetch(domain:marimo.io)", "WebFetch(domain:marimo.io)",
"WebFetch(domain:unpkg.com)", "WebFetch(domain:unpkg.com)",
"WebFetch(domain:forums.zotero.org)", "WebFetch(domain:forums.zotero.org)",
"WebFetch(domain:www.gmass.co)" "WebFetch(domain:www.gmass.co)",
"WebFetch(domain:docs.theme-park.dev)",
"WebFetch(domain:plugins.traefik.io)",
"WebFetch(domain:doc.traefik.io)",
"WebFetch(domain:volkovlabs.io)",
"Bash(grep:*)",
"Bash(for f in /home/kert/.claude/projects/-home-kert-stack/*.jsonl)",
"Bash(do grep -o '\"\"file_path\"\":\"\"[^\"\"]*\\\\.js\"\"' \"$f\")"
] ]
} }
} }

View File

@@ -16,6 +16,7 @@ services:
volumes: volumes:
- ./traefik/traefik.yml:/etc/traefik/traefik.yml:ro - ./traefik/traefik.yml:/etc/traefik/traefik.yml:ro
- ./traefik/dynamic:/etc/traefik/dynamic:ro - ./traefik/dynamic:/etc/traefik/dynamic:ro
- ./traefik/plugins:/plugins-local:ro
environment: environment:
- OTEL_SERVICE_NAME=traefik - OTEL_SERVICE_NAME=traefik
security_opt: security_opt:
@@ -162,6 +163,8 @@ services:
- PYTHONPATH=/home/kert/src - PYTHONPATH=/home/kert/src
volumes: volumes:
- ./notebooks:/home/kert/notebooks - ./notebooks:/home/kert/notebooks
- ./notebooks/.marimo-config:/home/kert/.config/marimo:ro
- ./notebooks/home-page-DUMF8ZY4.js:/home/kert/workspace/.venv/lib/python3.13/site-packages/marimo/_static/assets/home-page-DUMF8ZY4.js:ro
- ./data:/home/kert/data - ./data:/home/kert/data
- ./zotero/data:/home/kert/zotero:ro - ./zotero/data:/home/kert/zotero:ro
- ./src:/home/kert/src:ro - ./src:/home/kert/src:ro
@@ -296,6 +299,7 @@ services:
volumes: volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/index.html:/usr/share/nginx/html/index.html:ro - ./nginx/index.html:/usr/share/nginx/html/index.html:ro
- ./nginx/nes-theme.css:/usr/share/nginx/html/nes-theme.css:ro
security_opt: security_opt:
- no-new-privileges:true - no-new-privileges:true
restart: unless-stopped restart: unless-stopped

989
nginx/nes-theme.css Normal file
View File

@@ -0,0 +1,989 @@
/* NES SPORTS THEME - Universal Injectable CSS
Injected via Traefik rewrite-body plugin into:
Grafana, Traefik Dashboard, RustFS/MinIO, Jaeger, Prometheus, Trino
Palette matches: Gitea, Woodpecker, Marimo, nginx dashboard themes */
@import url('https://fonts.googleapis.com/css2?family=Press+Start+2P&family=IBM+Plex+Mono:wght@400;500;600&display=swap');
/* ============================================
NES COLOR PALETTE
============================================ */
:root {
--nes-black: #0f0f0f;
--nes-dark-gray: #1a1a2e;
--nes-gray: #4a4a68;
--nes-light-gray: #9090a8;
--nes-white: #f0f0f0;
--nes-dark-blue: #1a1a40;
--nes-blue: #2840a0;
--nes-mid-blue: #4060c0;
--nes-light-blue: #70a0e0;
--nes-sky: #90c0f0;
--nes-red: #d03030;
--nes-orange: #e07020;
--nes-yellow: #e0b040;
--nes-green: #40a040;
--nes-light-green: #80d080;
--nes-cyan: #40b0c0;
--nes-cream: #e8d8c0;
}
/* ============================================
BASE STYLES
============================================ */
body, html {
font-family: 'IBM Plex Mono', 'Courier New', monospace !important;
background: linear-gradient(180deg, #0a0a28 0%, #1a1a40 30%, #1a1a40 70%, #0a0a28 100%) !important;
background-attachment: fixed !important;
color: var(--nes-white) !important;
}
/* ============================================
HEADINGS
============================================ */
h1, h2, h3, h4, h5, h6 {
font-family: 'Press Start 2P', 'IBM Plex Mono', monospace !important;
letter-spacing: 0.5px !important;
line-height: 1.8 !important;
}
h1 {
font-size: 16px !important;
color: var(--nes-light-green) !important;
}
h2 {
font-size: 13px !important;
color: var(--nes-sky) !important;
}
h3 {
font-size: 11px !important;
color: var(--nes-yellow) !important;
}
h4, h5, h6 {
font-size: 10px !important;
color: var(--nes-cream) !important;
}
/* ============================================
NAVIGATION / HEADER BARS
============================================ */
nav,
header,
[class*="navbar"],
[class*="header"],
[class*="toolbar"],
[class*="topbar"],
[class*="top-bar"],
[class*="app-bar"] {
background: var(--nes-dark-gray) !important;
border-bottom: 3px solid var(--nes-gray) !important;
color: var(--nes-white) !important;
}
/* ============================================
SIDEBAR / NAVIGATION MENUS
============================================ */
aside,
[class*="sidebar"],
[class*="sidenav"],
[class*="side-nav"],
[class*="drawer"],
[class*="menu-panel"] {
background: var(--nes-black) !important;
border-right: 3px solid var(--nes-gray) !important;
color: var(--nes-white) !important;
}
/* ============================================
TABLES (Scoreboard style)
============================================ */
table {
border-collapse: collapse !important;
font-family: 'IBM Plex Mono', monospace !important;
}
th {
background: var(--nes-blue) !important;
color: var(--nes-white) !important;
font-family: 'Press Start 2P', monospace !important;
font-size: 9px !important;
padding: 10px 12px !important;
text-transform: uppercase !important;
letter-spacing: 1px !important;
border: 1px solid var(--nes-mid-blue) !important;
}
td {
background: var(--nes-black) !important;
color: var(--nes-cream) !important;
padding: 8px 12px !important;
border: 1px solid var(--nes-dark-gray) !important;
font-size: 13px !important;
}
tr:nth-child(even) td {
background: var(--nes-dark-gray) !important;
}
tr:hover td {
background: rgba(40, 64, 160, 0.3) !important;
}
/* ============================================
BUTTONS
============================================ */
button,
[role="button"],
.btn,
[class*="button"] {
font-family: 'IBM Plex Mono', monospace !important;
font-weight: 500 !important;
background: var(--nes-dark-gray) !important;
color: var(--nes-white) !important;
border: 2px solid var(--nes-gray) !important;
border-radius: 4px !important;
transition: all 0.15s ease !important;
}
button:hover,
[role="button"]:hover,
.btn:hover,
[class*="button"]:hover {
background: var(--nes-blue) !important;
border-color: var(--nes-light-blue) !important;
}
button:active,
[role="button"]:active {
transform: translate(1px, 1px) !important;
box-shadow: none !important;
}
/* Primary action buttons */
button[type="submit"],
[class*="primary"],
[class*="submit"] {
background: var(--nes-green) !important;
color: var(--nes-black) !important;
border: 2px solid var(--nes-light-green) !important;
}
button[type="submit"]:hover,
[class*="primary"]:hover {
background: var(--nes-light-green) !important;
}
/* ============================================
INPUTS AND FORMS
============================================ */
input,
textarea,
select,
[class*="input"],
[contenteditable="true"] {
font-family: 'IBM Plex Mono', monospace !important;
background: var(--nes-dark-gray) !important;
color: var(--nes-white) !important;
border: 2px solid var(--nes-gray) !important;
border-radius: 4px !important;
}
input:focus,
textarea:focus,
select:focus {
border-color: var(--nes-light-blue) !important;
outline: none !important;
box-shadow: 0 0 0 2px rgba(112, 160, 224, 0.3) !important;
}
/* ============================================
CODE BLOCKS
============================================ */
pre, code {
font-family: 'IBM Plex Mono', monospace !important;
}
code {
background: var(--nes-dark-gray) !important;
color: var(--nes-light-green) !important;
padding: 2px 6px !important;
border-radius: 3px !important;
}
pre {
background: var(--nes-black) !important;
border: 2px solid var(--nes-gray) !important;
border-radius: 4px !important;
padding: 12px !important;
}
pre code {
background: transparent !important;
padding: 0 !important;
}
/* ============================================
LINKS
============================================ */
a {
color: var(--nes-sky) !important;
text-decoration: none !important;
transition: color 0.15s ease !important;
}
a:hover {
color: var(--nes-white) !important;
text-decoration: underline !important;
}
a:visited {
color: var(--nes-light-blue) !important;
}
/* ============================================
CARDS / PANELS / CONTAINERS
============================================ */
[class*="card"],
[class*="panel"],
[class*="widget"],
[class*="Paper"],
[class*="container"]:not(body):not(html) {
background: var(--nes-black) !important;
border: 2px solid var(--nes-gray) !important;
color: var(--nes-white) !important;
}
/* ============================================
DROPDOWNS / MENUS / POPOVERS
============================================ */
[role="menu"],
[role="listbox"],
[class*="dropdown"],
[class*="popover"],
[class*="tooltip"],
[class*="Popover"],
[class*="Menu-list"],
[class*="MenuList"] {
background: var(--nes-dark-gray) !important;
border: 2px solid var(--nes-gray) !important;
color: var(--nes-white) !important;
}
[role="menuitem"]:hover,
[role="option"]:hover,
[class*="MenuItem"]:hover {
background: var(--nes-blue) !important;
color: var(--nes-white) !important;
}
/* ============================================
BADGES / PILLS / CHIPS / TAGS
============================================ */
[class*="badge"],
[class*="chip"],
[class*="tag"],
[class*="label"],
[class*="pill"] {
font-family: 'IBM Plex Mono', monospace !important;
font-size: 11px !important;
background: var(--nes-blue) !important;
color: var(--nes-white) !important;
border: 1px solid var(--nes-mid-blue) !important;
}
/* Status indicators */
[class*="success"],
[class*="healthy"],
[class*="running"],
[class*="active"],
[class*="ok"] {
color: var(--nes-light-green) !important;
}
[class*="error"],
[class*="danger"],
[class*="failed"],
[class*="critical"] {
color: var(--nes-red) !important;
}
[class*="warning"],
[class*="pending"] {
color: var(--nes-yellow) !important;
}
/* ============================================
SCROLLBARS
============================================ */
::-webkit-scrollbar {
width: 12px;
height: 12px;
}
::-webkit-scrollbar-track {
background: var(--nes-dark-gray);
}
::-webkit-scrollbar-thumb {
background: var(--nes-gray);
border-radius: 6px;
border: 2px solid var(--nes-dark-gray);
}
::-webkit-scrollbar-thumb:hover {
background: var(--nes-light-gray);
}
/* ============================================
TEXT SELECTION
============================================ */
::selection {
background: var(--nes-blue) !important;
color: var(--nes-white) !important;
}
/* ============================================
FOCUS STYLES
============================================ */
:focus-visible {
outline: 2px solid var(--nes-light-blue) !important;
outline-offset: 2px !important;
}
/* ============================================
CRT SCANLINE OVERLAY
============================================ */
body::after {
content: "";
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: 9998;
background: repeating-linear-gradient(
0deg,
transparent,
transparent 2px,
rgba(0, 0, 0, 0.06) 2px,
rgba(0, 0, 0, 0.06) 4px
);
}
/* ============================================
POWER-ON ANIMATION
============================================ */
@keyframes power-on {
0% { opacity: 0; filter: brightness(2) saturate(0); }
30% { opacity: 1; filter: brightness(1.5) saturate(0.5); }
100% { opacity: 1; filter: brightness(1) saturate(1); }
}
body {
animation: power-on 0.8s ease-out;
}
/* ============================================
HIDE SERVICE LOGOS (universal)
============================================ */
[class*="logo"],
[class*="Logo"],
[class*="brand-logo"],
img[src*="logo"],
img[alt*="logo" i],
img[alt*="Logo" i] {
display: none !important;
}
/* ================================================================
GRAFANA-SPECIFIC
================================================================ */
/* Hide Grafana logo */
.grafana-app .preloader__logo,
.grafana-app [class*="Logo"],
.grafana-app img[src*="logo"],
.grafana-app [class*="branding"] img,
.grafana-app [class*="Branding"] img,
.grafana-app [class*="sidemenu"] img[class*="logo"],
.grafana-app [aria-label="Home"] img {
display: none !important;
}
/* Main app background */
.grafana-app,
.main-view,
.scroll-canvas {
background: transparent !important;
}
/* Top navbar */
.grafana-app .navbar,
.grafana-app nav,
.grafana-app [class*="NavBar"],
.grafana-app [class*="Topbar"],
.grafana-app [aria-label="Main menu"] {
background: var(--nes-dark-gray) !important;
border-bottom: 3px solid var(--nes-gray) !important;
}
/* Sidenav */
.grafana-app [class*="sidemenu"],
.grafana-app [class*="NavBar"][class*="wrapper"] {
background: var(--nes-black) !important;
border-right: 3px solid var(--nes-gray) !important;
}
/* Dashboard container */
.grafana-app .dashboard-container,
.grafana-app [class*="DashboardPage"] {
background: transparent !important;
}
/* Panels */
.grafana-app .panel-container,
.grafana-app [class*="panel-content"],
.grafana-app [class*="PanelChrome"] {
background: var(--nes-black) !important;
border: 2px solid var(--nes-gray) !important;
border-radius: 0 !important;
box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.3) !important;
}
/* Panel headers */
.grafana-app .panel-title,
.grafana-app [class*="panel-header"],
.grafana-app [class*="PanelHeader"] {
background: var(--nes-dark-gray) !important;
font-family: 'Press Start 2P', monospace !important;
font-size: 9px !important;
color: var(--nes-sky) !important;
}
/* Explore page */
.grafana-app [class*="explore"],
.grafana-app [class*="Explore"] {
background: transparent !important;
}
/* Grafana query editor */
.grafana-app [class*="query-editor"],
.grafana-app [class*="QueryEditor"] {
background: var(--nes-dark-gray) !important;
border: 2px solid var(--nes-gray) !important;
}
/* Alert list */
.grafana-app [class*="AlertList"],
.grafana-app [class*="alert-rule"] {
background: var(--nes-black) !important;
border: 1px solid var(--nes-gray) !important;
}
/* Grafana page toolbar */
.grafana-app [class*="page-toolbar"],
.grafana-app [class*="PageToolbar"] {
background: var(--nes-dark-gray) !important;
}
/* ================================================================
JAEGER-SPECIFIC
================================================================ */
/* Hide Jaeger logo */
[class*="TracePageHeader--titleRow"] img,
[class*="TopNav"] img,
[class*="TopNav"] svg[class*="logo"],
[class*="jaeger-logo"],
header img[alt*="Jaeger" i] {
display: none !important;
}
/* Header bar */
.jaeger-ui .TopNav,
.jaeger-ui [class*="TopNav"],
[class*="jaeger"] [class*="TopNav"],
[data-testid="TopNav"] {
background: var(--nes-dark-gray) !important;
border-bottom: 3px solid var(--nes-gray) !important;
}
/* Trace page */
.TracePage,
[class*="TracePage"] {
background: transparent !important;
}
/* Timeline viewer */
.TraceTimelineViewer,
[class*="TraceTimelineViewer"] {
background: var(--nes-black) !important;
border: 2px solid var(--nes-gray) !important;
}
/* Span bars */
[class*="SpanBar"] {
border-radius: 0 !important;
}
/* Search form */
.SearchForm,
[class*="SearchForm"],
[class*="search-form"] {
background: var(--nes-dark-gray) !important;
border: 2px solid var(--nes-gray) !important;
padding: 12px !important;
}
/* Trace result list */
[class*="ResultItem"],
[class*="result-item"] {
background: var(--nes-black) !important;
border: 1px solid var(--nes-gray) !important;
margin-bottom: 4px !important;
}
[class*="ResultItem"]:hover,
[class*="result-item"]:hover {
background: rgba(40, 64, 160, 0.3) !important;
}
/* Span detail */
[class*="SpanDetail"],
[class*="AccordianKeyValues"] {
background: var(--nes-dark-gray) !important;
}
/* Jaeger-specific selects */
.jaeger-ui select,
[class*="jaeger"] select {
background: var(--nes-dark-gray) !important;
color: var(--nes-white) !important;
border: 2px solid var(--nes-gray) !important;
}
/* ================================================================
PROMETHEUS-SPECIFIC
================================================================ */
/* Hide Prometheus logo */
nav.navbar img,
nav.navbar svg,
.navbar-brand img,
.navbar-brand svg {
display: none !important;
}
/* Main navbar */
.prometheus-app nav.navbar,
nav.navbar {
background: var(--nes-dark-gray) !important;
border-bottom: 3px solid var(--nes-gray) !important;
}
nav.navbar .navbar-brand {
font-family: 'Press Start 2P', monospace !important;
font-size: 10px !important;
color: var(--nes-light-green) !important;
}
/* Expression input */
.prometheus-app .expression-input,
[class*="expression-input"],
.cm-expression-input {
background: var(--nes-black) !important;
border: 3px solid var(--nes-gray) !important;
color: var(--nes-white) !important;
font-family: 'IBM Plex Mono', monospace !important;
}
/* Graph container */
.graph-container,
[class*="graph-container"],
.panel {
background: var(--nes-black) !important;
border: 2px solid var(--nes-gray) !important;
border-radius: 0 !important;
box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.3) !important;
}
/* Graph tab controls */
.graph-controls,
[class*="graph-controls"],
.nav-tabs {
background: var(--nes-dark-gray) !important;
border-bottom: 2px solid var(--nes-gray) !important;
}
.nav-tabs .nav-link,
.nav-tabs a {
color: var(--nes-light-gray) !important;
}
.nav-tabs .nav-link.active,
.nav-tabs .active a {
color: var(--nes-sky) !important;
border-bottom: 3px solid var(--nes-mid-blue) !important;
background: transparent !important;
}
/* Alert/Rule manager */
.rules-head,
[class*="rules"] th {
background: var(--nes-blue) !important;
}
/* Prometheus targets page */
.target-head,
[class*="scrape-pool"] h2 {
font-family: 'Press Start 2P', monospace !important;
font-size: 10px !important;
}
/* Status badges */
.badge-success,
.label-success {
background: var(--nes-green) !important;
color: var(--nes-white) !important;
}
.badge-danger,
.label-danger {
background: var(--nes-red) !important;
color: var(--nes-white) !important;
}
.badge-warning,
.label-warning {
background: var(--nes-orange) !important;
color: var(--nes-white) !important;
}
/* ================================================================
TRAEFIK DASHBOARD-SPECIFIC
================================================================ */
/* Hide Traefik logo */
#app img[src*="logo"],
#app img[alt*="Traefik" i],
#app [class*="logo"] img,
#app [class*="logo"] svg,
#app [class*="brand"] img {
display: none !important;
}
/* Vue app root */
#app {
background: transparent !important;
}
/* Traefik top nav */
#app nav,
#app [class*="nav-bar"],
#app .navbar {
background: var(--nes-dark-gray) !important;
border-bottom: 3px solid var(--nes-gray) !important;
}
/* Sidebar */
#app [class*="sidebar"],
#app [class*="side-menu"],
#app aside {
background: var(--nes-black) !important;
border-right: 3px solid var(--nes-gray) !important;
}
/* Sidebar menu items */
#app [class*="sidebar"] a,
#app [class*="side-menu"] a {
color: var(--nes-light-gray) !important;
border-left: 3px solid transparent !important;
}
#app [class*="sidebar"] a:hover,
#app [class*="side-menu"] a:hover,
#app [class*="sidebar"] a.active,
#app [class*="side-menu"] a.active {
color: var(--nes-sky) !important;
background: rgba(40, 64, 160, 0.2) !important;
border-left-color: var(--nes-mid-blue) !important;
}
/* Main content area */
#app main,
#app [class*="main-content"],
#app [class*="page-body"] {
background: transparent !important;
}
/* Status indicators */
#app [class*="status"][class*="positive"],
#app [class*="status"][class*="success"],
#app [class*="pill"][class*="green"],
#app [class*="positive"] {
background: var(--nes-green) !important;
color: var(--nes-white) !important;
}
#app [class*="status"][class*="negative"],
#app [class*="status"][class*="error"],
#app [class*="pill"][class*="red"],
#app [class*="negative"] {
background: var(--nes-red) !important;
color: var(--nes-white) !important;
}
#app [class*="status"][class*="warning"],
#app [class*="pill"][class*="orange"] {
background: var(--nes-orange) !important;
color: var(--nes-white) !important;
}
/* Traefik table rows */
#app table tr:hover td {
background: rgba(40, 64, 160, 0.3) !important;
}
/* Service detail panels */
#app [class*="detail"],
#app [class*="panel-block"] {
background: var(--nes-black) !important;
border: 2px solid var(--nes-gray) !important;
}
/* ================================================================
RUSTFS / MINIO CONSOLE-SPECIFIC (Material UI)
================================================================ */
/* Hide MinIO/RustFS logo */
#root img[src*="logo"],
#root img[alt*="MinIO" i],
#root img[alt*="RustFS" i],
#root [class*="logo"] img,
#root [class*="logo"] svg,
#root [class*="Logo"] img,
#root [class*="Logo"] svg {
display: none !important;
}
/* MUI root */
#root {
background: transparent !important;
}
/* App bar */
#root .MuiAppBar-root,
#root [class*="MuiAppBar"] {
background: var(--nes-dark-gray) !important;
border-bottom: 3px solid var(--nes-gray) !important;
box-shadow: none !important;
}
/* MUI Drawer / Sidebar */
#root .MuiDrawer-root,
#root .MuiDrawer-paper,
#root [class*="MuiDrawer"] {
background: var(--nes-black) !important;
border-right: 3px solid var(--nes-gray) !important;
}
/* Drawer list items */
#root .MuiListItem-root,
#root .MuiListItemButton-root,
#root [class*="MuiListItem"] {
color: var(--nes-light-gray) !important;
}
#root .MuiListItem-root:hover,
#root .MuiListItemButton-root:hover,
#root [class*="MuiListItem"]:hover {
background: rgba(40, 64, 160, 0.2) !important;
color: var(--nes-sky) !important;
}
#root .Mui-selected,
#root [class*="Mui-selected"] {
background: rgba(40, 64, 160, 0.3) !important;
color: var(--nes-sky) !important;
}
/* MUI Paper */
#root .MuiPaper-root,
#root [class*="MuiPaper"] {
background: var(--nes-black) !important;
color: var(--nes-white) !important;
border: 2px solid var(--nes-gray) !important;
box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.3) !important;
}
/* MUI Buttons */
#root .MuiButton-root,
#root [class*="MuiButton"] {
font-family: 'IBM Plex Mono', monospace !important;
background: var(--nes-dark-gray) !important;
color: var(--nes-white) !important;
border: 2px solid var(--nes-gray) !important;
border-radius: 4px !important;
text-transform: none !important;
box-shadow: none !important;
}
#root .MuiButton-root:hover,
#root [class*="MuiButton"]:hover {
background: var(--nes-blue) !important;
border-color: var(--nes-light-blue) !important;
}
#root .MuiButton-containedPrimary,
#root [class*="MuiButton-containedPrimary"] {
background: var(--nes-green) !important;
color: var(--nes-black) !important;
border: 2px solid var(--nes-light-green) !important;
}
#root .MuiButton-containedPrimary:hover {
background: var(--nes-light-green) !important;
}
/* MUI Table */
#root .MuiTableCell-root,
#root [class*="MuiTableCell"] {
border-color: var(--nes-gray) !important;
color: var(--nes-cream) !important;
font-family: 'IBM Plex Mono', monospace !important;
}
#root .MuiTableCell-head,
#root [class*="MuiTableCell-head"] {
background: var(--nes-blue) !important;
color: var(--nes-white) !important;
font-family: 'Press Start 2P', monospace !important;
font-size: 9px !important;
text-transform: uppercase !important;
}
#root .MuiTableRow-root:hover,
#root [class*="MuiTableRow"]:hover {
background: rgba(40, 64, 160, 0.3) !important;
}
/* MUI Inputs */
#root .MuiInputBase-root,
#root .MuiOutlinedInput-root,
#root [class*="MuiInputBase"],
#root [class*="MuiOutlinedInput"] {
background: var(--nes-dark-gray) !important;
color: var(--nes-white) !important;
}
#root .MuiOutlinedInput-notchedOutline,
#root [class*="notchedOutline"] {
border-color: var(--nes-gray) !important;
}
#root .MuiInputLabel-root,
#root [class*="MuiInputLabel"] {
color: var(--nes-light-gray) !important;
}
/* MUI Dialogs */
#root .MuiDialog-paper,
#root [class*="MuiDialog-paper"] {
background: var(--nes-dark-gray) !important;
border: 3px solid var(--nes-gray) !important;
}
/* MUI Tabs */
#root .MuiTab-root,
#root [class*="MuiTab"] {
color: var(--nes-light-gray) !important;
font-family: 'IBM Plex Mono', monospace !important;
text-transform: none !important;
}
#root .MuiTab-root.Mui-selected,
#root [class*="MuiTab"][class*="Mui-selected"] {
color: var(--nes-sky) !important;
}
#root .MuiTabs-indicator,
#root [class*="MuiTabs-indicator"] {
background: var(--nes-mid-blue) !important;
}
/* MUI Breadcrumbs */
#root .MuiBreadcrumbs-root,
#root [class*="MuiBreadcrumbs"] {
color: var(--nes-light-gray) !important;
}
/* MUI Chips */
#root .MuiChip-root,
#root [class*="MuiChip"] {
background: var(--nes-blue) !important;
color: var(--nes-white) !important;
border: 1px solid var(--nes-mid-blue) !important;
}
/* MUI Icons */
#root .MuiSvgIcon-root,
#root [class*="MuiSvgIcon"],
#root svg {
color: var(--nes-light-gray) !important;
fill: currentColor !important;
}
/* ================================================================
TRINO-SPECIFIC
============================================ */
/* Trino has a simple UI - mostly tables and headers */
body > h2,
body > h3 {
font-family: 'Press Start 2P', monospace !important;
color: var(--nes-sky) !important;
padding: 10px 0 !important;
border-bottom: 3px solid var(--nes-gray) !important;
margin-bottom: 15px !important;
}
/* Trino status page tables */
body > table {
width: 100% !important;
margin: 15px 0 !important;
}
/* Trino worker status */
[class*="query-list"],
[class*="query-detail"] {
background: var(--nes-black) !important;
border: 2px solid var(--nes-gray) !important;
}
/* Progress bars used by various services */
progress,
[role="progressbar"],
[class*="progress-bar"],
[class*="ProgressBar"] {
background: var(--nes-dark-gray) !important;
border: 1px solid var(--nes-gray) !important;
border-radius: 0 !important;
}
progress::-webkit-progress-bar {
background: var(--nes-dark-gray) !important;
}
progress::-webkit-progress-value {
background: var(--nes-mid-blue) !important;
}

View File

@@ -13,6 +13,14 @@ http {
root /usr/share/nginx/html; root /usr/share/nginx/html;
index index.html; index index.html;
# CORS for CSS files (loaded cross-origin by themed services)
location ~* \.css$ {
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Methods "GET, OPTIONS";
add_header Cache-Control "public, max-age=3600";
try_files $uri =404;
}
location / { location / {
try_files $uri $uri/ =404; try_files $uri $uri/ =404;
} }

View File

@@ -0,0 +1,3 @@
[display]
theme = "dark"
custom_css = ["/home/kert/.config/marimo/retro-arcade.css"]

View File

@@ -0,0 +1,663 @@
/* NES SPORTS THEME - RBI Baseball / Tecmo Super Bowl */
/* Uses marimo's native CSS variable system for proper theming */
@import url('https://fonts.googleapis.com/css2?family=Press+Start+2P&family=IBM+Plex+Mono:wght@400;500;600&display=swap');
/* ============================================
FONT CONFIGURATION
============================================ */
:root {
--marimo-monospace-font: 'IBM Plex Mono', 'Courier New', monospace;
--marimo-text-font: 'IBM Plex Mono', 'Courier New', monospace;
--marimo-heading-font: 'Press Start 2P', 'IBM Plex Mono', monospace;
}
/* ============================================
NES COLOR PALETTE
============================================ */
:root {
/* Core NES colors */
--nes-black: #0f0f0f;
--nes-dark-gray: #1a1a2e;
--nes-gray: #4a4a68;
--nes-light-gray: #9090a8;
--nes-white: #f0f0f0;
/* NES blues (the classic Tecmo/RBI look) */
--nes-dark-blue: #1a1a40;
--nes-blue: #2840a0;
--nes-mid-blue: #4060c0;
--nes-light-blue: #70a0e0;
--nes-sky: #90c0f0;
/* Accent colors */
--nes-red: #d03030;
--nes-orange: #e07020;
--nes-yellow: #e0b040;
--nes-green: #40a040;
--nes-light-green: #80d080;
--nes-cyan: #40b0c0;
--nes-cream: #e8d8c0;
}
/* ============================================
MARIMO THEME VARIABLES (Dark Mode)
============================================ */
:root {
/* Base colors */
--background: var(--nes-dark-blue);
--foreground: var(--nes-white);
/* Muted/secondary text */
--muted: var(--nes-dark-gray);
--muted-foreground: var(--nes-light-gray);
/* Popover/dropdown backgrounds */
--popover: var(--nes-dark-gray);
--popover-foreground: var(--nes-white);
/* Cards (cells) */
--card: var(--nes-black);
--card-foreground: var(--nes-white);
/* Borders and inputs */
--border: var(--nes-gray);
--input: var(--nes-dark-gray);
/* Primary action color */
--primary: var(--nes-mid-blue);
--primary-foreground: var(--nes-white);
/* Secondary elements */
--secondary: var(--nes-gray);
--secondary-foreground: var(--nes-white);
/* Accent/highlight */
--accent: var(--nes-light-blue);
--accent-foreground: var(--nes-black);
/* Focus ring */
--ring: var(--nes-light-blue);
}
/* ============================================
SEMANTIC COLORS
============================================ */
:root {
/* Error states */
--destructive: var(--nes-red);
--destructive-foreground: var(--nes-white);
--error: var(--nes-red);
--error-foreground: var(--nes-white);
/* Success states */
--success: var(--nes-green);
--success-foreground: var(--nes-white);
/* Action buttons (run, etc) */
--action: var(--nes-green);
--action-hover: var(--nes-light-green);
--action-foreground: var(--nes-black);
/* Links */
--link: var(--nes-sky);
--link-visited: var(--nes-light-blue);
/* Stale indicator */
--stale: rgba(224, 176, 64, 0.25);
}
/* ============================================
SHADOWS (subtle, NES-style)
============================================ */
:root {
--base-shadow: rgba(0, 0, 0, 0.4);
--base-shadow-darker: rgba(0, 0, 0, 0.6);
--base-shadow-opacity: 20%;
}
/* ============================================
BACKGROUND GRADIENT (Tecmo field style)
============================================ */
:root {
--background-image: linear-gradient(
180deg,
#0a0a28 0%,
#1a1a40 30%,
#1a1a40 70%,
#0a0a28 100%
);
--background-repeat: no-repeat;
--background-attachment: fixed;
--background-size: cover;
}
body {
background-image: var(--background-image) !important;
background-repeat: var(--background-repeat) !important;
background-attachment: var(--background-attachment) !important;
background-size: var(--background-size) !important;
}
/* ============================================
CODE EDITOR - CODEMIRROR STYLING
============================================ */
.cm-editor {
font-family: var(--marimo-monospace-font) !important;
font-size: 14px !important;
background: var(--nes-black) !important;
}
.cm-content {
font-family: var(--marimo-monospace-font) !important;
}
.cm-line {
font-family: var(--marimo-monospace-font) !important;
color: var(--nes-white) !important;
}
.cm-gutters {
background: var(--nes-dark-gray) !important;
border-right: 2px solid var(--nes-gray) !important;
}
.cm-lineNumbers .cm-gutterElement {
color: var(--nes-light-gray) !important;
font-family: var(--marimo-monospace-font) !important;
font-size: 12px !important;
}
/* Syntax highlighting */
.cm-keyword, .tok-keyword { color: var(--nes-sky) !important; }
.cm-string, .tok-string { color: var(--nes-light-green) !important; }
.cm-number, .tok-number { color: var(--nes-yellow) !important; }
.cm-comment, .tok-comment { color: var(--nes-light-gray) !important; font-style: italic !important; }
.cm-function, .tok-function { color: var(--nes-cream) !important; }
.cm-variableName, .tok-variableName { color: var(--nes-white) !important; }
.cm-operator, .tok-operator { color: var(--nes-cyan) !important; }
.cm-propertyName, .tok-propertyName { color: var(--nes-light-blue) !important; }
.tok-standard, .cm-builtin { color: var(--nes-orange) !important; }
.tok-definition, .cm-def { color: var(--nes-sky) !important; }
.tok-typeName { color: var(--nes-yellow) !important; }
.tok-bool { color: var(--nes-orange) !important; }
/* Cursor */
.cm-cursor {
border-left: 2px solid var(--nes-light-green) !important;
}
/* Selection */
.cm-selectionBackground,
::selection {
background: var(--nes-blue) !important;
}
/* Active line */
.cm-activeLine {
background: rgba(64, 96, 192, 0.15) !important;
}
/* ============================================
HEADINGS (Press Start 2P for that NES feel)
============================================ */
h1, h2, h3, h4, h5, h6 {
font-family: var(--marimo-heading-font) !important;
letter-spacing: 0.5px !important;
line-height: 1.8 !important;
}
h1 {
font-size: 18px !important;
color: var(--nes-light-green) !important;
}
h2 {
font-size: 14px !important;
color: var(--nes-sky) !important;
}
h3 {
font-size: 12px !important;
color: var(--nes-yellow) !important;
}
h4, h5, h6 {
font-size: 11px !important;
color: var(--nes-cream) !important;
}
/* ============================================
TABLES (Scoreboard style)
============================================ */
table {
border-collapse: collapse !important;
font-family: var(--marimo-monospace-font) !important;
}
th {
background: var(--nes-blue) !important;
color: var(--nes-white) !important;
font-family: var(--marimo-heading-font) !important;
font-size: 10px !important;
padding: 10px 12px !important;
text-transform: uppercase !important;
letter-spacing: 1px !important;
border: 1px solid var(--nes-mid-blue) !important;
}
td {
background: var(--nes-black) !important;
color: var(--nes-cream) !important;
padding: 8px 12px !important;
border: 1px solid var(--nes-dark-gray) !important;
font-size: 13px !important;
}
tr:nth-child(even) td {
background: var(--nes-dark-gray) !important;
}
tr:hover td {
background: var(--nes-dark-blue) !important;
}
/* ============================================
BUTTONS (NES menu style)
============================================ */
button,
[role="button"],
.btn {
font-family: var(--marimo-monospace-font) !important;
font-weight: 500 !important;
border-radius: 4px !important;
transition: all 0.15s ease !important;
}
/* Primary/action buttons should be visible */
button[data-variant="primary"],
button.primary,
[data-action="run"] {
background: var(--nes-green) !important;
color: var(--nes-black) !important;
border: 2px solid var(--nes-light-green) !important;
}
button[data-variant="primary"]:hover,
button.primary:hover,
[data-action="run"]:hover {
background: var(--nes-light-green) !important;
}
/* ============================================
INPUTS AND FORMS
============================================ */
input,
textarea,
select {
font-family: var(--marimo-monospace-font) !important;
background: var(--nes-dark-gray) !important;
color: var(--nes-white) !important;
border: 2px solid var(--nes-gray) !important;
border-radius: 4px !important;
padding: 8px 12px !important;
}
input:focus,
textarea:focus,
select:focus {
border-color: var(--nes-light-blue) !important;
outline: none !important;
box-shadow: 0 0 0 2px rgba(112, 160, 224, 0.3) !important;
}
/* ============================================
CODE BLOCKS (in markdown)
============================================ */
pre, code {
font-family: var(--marimo-monospace-font) !important;
}
code {
background: var(--nes-dark-gray) !important;
color: var(--nes-light-green) !important;
padding: 2px 6px !important;
border-radius: 3px !important;
font-size: 0.9em !important;
}
pre {
background: var(--nes-black) !important;
border: 2px solid var(--nes-gray) !important;
border-radius: 4px !important;
padding: 12px !important;
}
pre code {
background: transparent !important;
padding: 0 !important;
}
/* ============================================
LINKS
============================================ */
a {
color: var(--nes-sky) !important;
text-decoration: none !important;
transition: color 0.15s ease !important;
}
a:hover {
color: var(--nes-white) !important;
text-decoration: underline !important;
}
a:visited {
color: var(--nes-light-blue) !important;
}
/* ============================================
SCROLLBARS
============================================ */
::-webkit-scrollbar {
width: 12px;
height: 12px;
}
::-webkit-scrollbar-track {
background: var(--nes-dark-gray);
}
::-webkit-scrollbar-thumb {
background: var(--nes-gray);
border-radius: 6px;
border: 2px solid var(--nes-dark-gray);
}
::-webkit-scrollbar-thumb:hover {
background: var(--nes-light-gray);
}
/* ============================================
MISC UI REFINEMENTS
============================================ */
/* Tooltips */
[role="tooltip"],
[data-state="open"][data-side] {
font-family: var(--marimo-monospace-font) !important;
font-size: 12px !important;
background: var(--nes-black) !important;
color: var(--nes-white) !important;
border: 2px solid var(--nes-gray) !important;
border-radius: 4px !important;
}
/* Dropdown menus */
[role="menu"],
[role="listbox"] {
background: var(--nes-dark-gray) !important;
border: 2px solid var(--nes-gray) !important;
border-radius: 4px !important;
}
[role="menuitem"]:hover,
[role="option"]:hover,
[role="menuitem"][data-highlighted],
[role="option"][data-highlighted] {
background: var(--nes-blue) !important;
color: var(--nes-white) !important;
}
/* Badges and pills */
[class*="badge"],
[class*="pill"],
[class*="tag"] {
font-family: var(--marimo-monospace-font) !important;
font-size: 11px !important;
font-weight: 500 !important;
}
/* Focus visible for accessibility */
:focus-visible {
outline: 2px solid var(--nes-light-blue) !important;
outline-offset: 2px !important;
}
/* ============================================
CELL OUTPUT AREA
============================================ */
[data-testid="outputs"],
.output-area {
background: rgba(26, 26, 64, 0.5) !important;
border-top: 2px solid var(--nes-gray) !important;
padding: 12px !important;
}
/* DataFrame outputs */
[class*="dataframe"] {
font-family: var(--marimo-monospace-font) !important;
}
/* Plot/chart containers */
[class*="plot"],
[class*="chart"],
svg {
background: transparent !important;
}
/* ============================================
CRT SCANLINE OVERLAY
============================================ */
body::after {
content: "";
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: 9998;
background: repeating-linear-gradient(
0deg,
transparent,
transparent 2px,
rgba(0, 0, 0, 0.06) 2px,
rgba(0, 0, 0, 0.06) 4px
);
}
/* ============================================
HOME PAGE - "CREATE NEW NOTEBOOK" CARD
============================================ */
/* The "Create a new notebook" link card */
a[rel="noreferrer"][target="_blank"] {
background: linear-gradient(135deg, #1a1a40 0%, #2840a0 100%) !important;
border: 3px solid var(--nes-mid-blue) !important;
border-radius: 0 !important;
box-shadow:
4px 4px 0 var(--nes-black),
inset 0 0 20px rgba(64, 96, 192, 0.2) !important;
position: relative;
overflow: hidden;
}
a[rel="noreferrer"][target="_blank"]::before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 50%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
rgba(144, 192, 240, 0.08),
transparent
);
animation: cartridge-shine 4s ease-in-out infinite;
}
@keyframes cartridge-shine {
0% { left: -50%; }
50% { left: 100%; }
100% { left: 100%; }
}
a[rel="noreferrer"][target="_blank"]:hover {
border-color: var(--nes-light-green) !important;
box-shadow:
4px 4px 0 var(--nes-black),
0 0 15px rgba(128, 208, 128, 0.3),
inset 0 0 20px rgba(128, 208, 128, 0.1) !important;
}
a[rel="noreferrer"][target="_blank"] h2 {
font-family: var(--marimo-heading-font) !important;
font-size: 12px !important;
color: var(--nes-light-green) !important;
text-transform: uppercase !important;
letter-spacing: 2px !important;
}
/* ============================================
HOME PAGE - SECTION HEADERS
============================================ */
/* "Running notebooks" / "Recent notebooks" / "Workspace" headers */
h2.text-xl {
font-family: var(--marimo-heading-font) !important;
font-size: 11px !important;
text-transform: uppercase !important;
letter-spacing: 2px !important;
color: var(--nes-yellow) !important;
padding-bottom: 6px;
border-bottom: 2px solid var(--nes-gray);
}
/* ============================================
HOME PAGE - FILE LISTS (notebook lists)
============================================ */
/* The bordered list containers */
.divide-y.border.rounded {
border: 3px solid var(--nes-gray) !important;
border-radius: 0 !important;
box-shadow: 4px 4px 0 var(--nes-black) !important;
background: var(--nes-black) !important;
}
/* Individual file rows */
.divide-y.border > a,
.divide-y.border > div > a {
border-color: var(--nes-dark-gray) !important;
transition: all 0.1s ease !important;
}
.divide-y.border > a:hover,
.divide-y.border > div > a:hover {
background: rgba(40, 64, 160, 0.3) !important;
border-left: 3px solid var(--nes-light-green) !important;
}
/* File names in lists */
.divide-y.border a .flex-1 span {
font-family: var(--marimo-monospace-font) !important;
}
/* ============================================
HOME PAGE - WORKSPACE FILE TREE
============================================ */
/* Tree row hover */
[class*="cursor-pointer"][class*="whitespace-nowrap"]:hover {
background: rgba(40, 64, 160, 0.25) !important;
}
/* Directory names - slightly brighter */
[class*="cursor-pointer"][class*="whitespace-nowrap"] span {
font-family: var(--marimo-monospace-font) !important;
font-size: 13px !important;
}
/* ============================================
PIXEL-PERFECT BORDERS (NES cartridge feel)
============================================ */
/* Override all rounded corners for that crisp 8-bit look */
.rounded-lg,
.rounded-md {
border-radius: 0 !important;
}
/* Keep small UI elements slightly rounded */
.rounded-sm,
.rounded {
border-radius: 2px !important;
}
/* ============================================
TOP BAR / ACTION BUTTONS
============================================ */
/* Settings and shutdown buttons in top right */
.absolute.top-3.right-5 button {
border: 2px solid var(--nes-gray) !important;
border-radius: 0 !important;
background: var(--nes-dark-gray) !important;
box-shadow: 2px 2px 0 var(--nes-black) !important;
}
.absolute.top-3.right-5 button:hover {
background: var(--nes-blue) !important;
border-color: var(--nes-light-blue) !important;
}
.absolute.top-3.right-5 button:active {
box-shadow: none !important;
transform: translate(2px, 2px);
}
/* ============================================
SEARCH INPUT - PIXEL STYLE
============================================ */
input#search {
border: 3px solid var(--nes-gray) !important;
border-radius: 0 !important;
background: var(--nes-black) !important;
box-shadow: inset 2px 2px 0 rgba(0, 0, 0, 0.3) !important;
font-family: var(--marimo-monospace-font) !important;
}
input#search:focus {
border-color: var(--nes-light-blue) !important;
box-shadow:
inset 2px 2px 0 rgba(0, 0, 0, 0.3),
0 0 8px rgba(112, 160, 224, 0.3) !important;
}
/* ============================================
POWER-ON GLOW (subtle animation on page)
============================================ */
@keyframes power-on {
0% { opacity: 0; filter: brightness(2) saturate(0); }
30% { opacity: 1; filter: brightness(1.5) saturate(0.5); }
100% { opacity: 1; filter: brightness(1) saturate(1); }
}
#root {
animation: power-on 0.8s ease-out;
}
/* ============================================
BLINKING CURSOR / READY INDICATOR
============================================ */
@keyframes blink-cursor {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
.cm-cursor {
animation: blink-cursor 1s step-end infinite !important;
}
/* ============================================
NES-STYLE BUTTON PRESS EFFECT
============================================ */
button:active,
[role="button"]:active {
transform: translate(1px, 1px) !important;
box-shadow: none !important;
}

File diff suppressed because one or more lines are too long

View File

@@ -442,3 +442,222 @@ a:visited {
svg { svg {
background: transparent !important; background: transparent !important;
} }
/* ============================================
CRT SCANLINE OVERLAY
============================================ */
body::after {
content: "";
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: 9998;
background: repeating-linear-gradient(
0deg,
transparent,
transparent 2px,
rgba(0, 0, 0, 0.06) 2px,
rgba(0, 0, 0, 0.06) 4px
);
}
/* ============================================
HOME PAGE - "CREATE NEW NOTEBOOK" CARD
============================================ */
/* The "Create a new notebook" link card */
a[rel="noreferrer"][target="_blank"] {
background: linear-gradient(135deg, #1a1a40 0%, #2840a0 100%) !important;
border: 3px solid var(--nes-mid-blue) !important;
border-radius: 0 !important;
box-shadow:
4px 4px 0 var(--nes-black),
inset 0 0 20px rgba(64, 96, 192, 0.2) !important;
position: relative;
overflow: hidden;
}
a[rel="noreferrer"][target="_blank"]::before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 50%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
rgba(144, 192, 240, 0.08),
transparent
);
animation: cartridge-shine 4s ease-in-out infinite;
}
@keyframes cartridge-shine {
0% { left: -50%; }
50% { left: 100%; }
100% { left: 100%; }
}
a[rel="noreferrer"][target="_blank"]:hover {
border-color: var(--nes-light-green) !important;
box-shadow:
4px 4px 0 var(--nes-black),
0 0 15px rgba(128, 208, 128, 0.3),
inset 0 0 20px rgba(128, 208, 128, 0.1) !important;
}
a[rel="noreferrer"][target="_blank"] h2 {
font-family: var(--marimo-heading-font) !important;
font-size: 12px !important;
color: var(--nes-light-green) !important;
text-transform: uppercase !important;
letter-spacing: 2px !important;
}
/* ============================================
HOME PAGE - SECTION HEADERS
============================================ */
/* "Running notebooks" / "Recent notebooks" / "Workspace" headers */
h2.text-xl {
font-family: var(--marimo-heading-font) !important;
font-size: 11px !important;
text-transform: uppercase !important;
letter-spacing: 2px !important;
color: var(--nes-yellow) !important;
padding-bottom: 6px;
border-bottom: 2px solid var(--nes-gray);
}
/* ============================================
HOME PAGE - FILE LISTS (notebook lists)
============================================ */
/* The bordered list containers */
.divide-y.border.rounded {
border: 3px solid var(--nes-gray) !important;
border-radius: 0 !important;
box-shadow: 4px 4px 0 var(--nes-black) !important;
background: var(--nes-black) !important;
}
/* Individual file rows */
.divide-y.border > a,
.divide-y.border > div > a {
border-color: var(--nes-dark-gray) !important;
transition: all 0.1s ease !important;
}
.divide-y.border > a:hover,
.divide-y.border > div > a:hover {
background: rgba(40, 64, 160, 0.3) !important;
border-left: 3px solid var(--nes-light-green) !important;
}
/* File names in lists */
.divide-y.border a .flex-1 span {
font-family: var(--marimo-monospace-font) !important;
}
/* ============================================
HOME PAGE - WORKSPACE FILE TREE
============================================ */
/* Tree row hover */
[class*="cursor-pointer"][class*="whitespace-nowrap"]:hover {
background: rgba(40, 64, 160, 0.25) !important;
}
/* Directory names - slightly brighter */
[class*="cursor-pointer"][class*="whitespace-nowrap"] span {
font-family: var(--marimo-monospace-font) !important;
font-size: 13px !important;
}
/* ============================================
PIXEL-PERFECT BORDERS (NES cartridge feel)
============================================ */
/* Override all rounded corners for that crisp 8-bit look */
.rounded-lg,
.rounded-md {
border-radius: 0 !important;
}
/* Keep small UI elements slightly rounded */
.rounded-sm,
.rounded {
border-radius: 2px !important;
}
/* ============================================
TOP BAR / ACTION BUTTONS
============================================ */
/* Settings and shutdown buttons in top right */
.absolute.top-3.right-5 button {
border: 2px solid var(--nes-gray) !important;
border-radius: 0 !important;
background: var(--nes-dark-gray) !important;
box-shadow: 2px 2px 0 var(--nes-black) !important;
}
.absolute.top-3.right-5 button:hover {
background: var(--nes-blue) !important;
border-color: var(--nes-light-blue) !important;
}
.absolute.top-3.right-5 button:active {
box-shadow: none !important;
transform: translate(2px, 2px);
}
/* ============================================
SEARCH INPUT - PIXEL STYLE
============================================ */
input#search {
border: 3px solid var(--nes-gray) !important;
border-radius: 0 !important;
background: var(--nes-black) !important;
box-shadow: inset 2px 2px 0 rgba(0, 0, 0, 0.3) !important;
font-family: var(--marimo-monospace-font) !important;
}
input#search:focus {
border-color: var(--nes-light-blue) !important;
box-shadow:
inset 2px 2px 0 rgba(0, 0, 0, 0.3),
0 0 8px rgba(112, 160, 224, 0.3) !important;
}
/* ============================================
POWER-ON GLOW (subtle animation on page)
============================================ */
@keyframes power-on {
0% { opacity: 0; filter: brightness(2) saturate(0); }
30% { opacity: 1; filter: brightness(1.5) saturate(0.5); }
100% { opacity: 1; filter: brightness(1) saturate(1); }
}
#root {
animation: power-on 0.8s ease-out;
}
/* ============================================
BLINKING CURSOR / READY INDICATOR
============================================ */
@keyframes blink-cursor {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
.cm-cursor {
animation: blink-cursor 1s step-end infinite !important;
}
/* ============================================
NES-STYLE BUTTON PRESS EFFECT
============================================ */
button:active,
[role="button"]:active {
transform: translate(1px, 1px) !important;
box-shadow: none !important;
}

View File

@@ -2,213 +2,211 @@
import marimo import marimo
__generated_with = "0.9.14" __generated_with = "0.19.9"
app = marimo.App( app = marimo.App()
layout_file="layouts/sample.slides.json")
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.md( mo.md(r"""
r""" # Sample Markdown Block
# Sample Markdown Block
--- ---
# Header 1 # Header 1
## Header 2 ## Header 2
### Header 3 ### Header 3
#### Header 4 #### Header 4
##### Header 5 ##### Header 5
###### Header 6 ###### Header 6
--- ---
**Bold** | *Italic:* | ~~Strikethrough~~ | `Inline Code` **Bold** | *Italic:* | ~~Strikethrough~~ | `Inline Code`
--- ---
> "The only way to do great work is to love what you do." > "The only way to do great work is to love what you do."
> — *Steve Jobs* > — *Steve Jobs*
""" """)
) return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.md( mo.md(r"""
r""" ---
---
1. Item One 1. Item One
2. Item Two 2. Item Two
3. Item Three 3. Item Three
--- ---
- Bullet One - Bullet One
- Bullet Two - Bullet Two
- Bullet Three - Bullet Three
--- ---
1. Main Item 1. Main Item
- Sub Item - Sub Item
- Sub-sub Item - Sub-sub Item
--- ---
[Marimo](https://marimo.io/) [Marimo](https://marimo.io/)
""" """)
) return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.md( mo.md("""
""" | Syntax | Description | Example |
| Syntax | Description | Example | |-------------|-------------|-------------------|
|-------------|-------------|-------------------| | **Header** | Row Title | Content Here |
| **Header** | Row Title | Content Here | | **Row 1** | First Cell | `Some code` |
| **Row 1** | First Cell | `Some code` | | **Row 2** | Second Cell | *Italicized text* |
| **Row 2** | Second Cell | *Italicized text* |
--- ---
```python ```python
def greet(name: str) -> str: def greet(name: str) -> str:
\"""Return a greeting message.\""" "\""Return a greeting message."\""
return f"Hello, {name}!" return f"Hello, {name}!"
``` ```
--- ---
Here is a sentence with a footnote reference[^1]. Here is a sentence with a footnote reference[^1].
[^1]: This is the footnote content. [^1]: This is the footnote content.
--- ---
- Inline: $E = mc^2$ - Inline: $E = mc^2$
- Block: - Block:
$$ $$
f(x) = \\int_{-\\infty}^{\\infty} e^{-x^2} \\, dx f(x) = \int_{-\infty}^{\infty} e^{-x^2} \, dx
$$ $$
""" """)
) return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.md(r"""# Incomplete Reference of Different Args' Use""") mo.md(r"""
# Incomplete Reference of Different Args' Use
""")
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.md( mo.md(r"""
r""" ## `bg-muted` & `text-muted-foreground`
## `bg-muted` & `text-muted-foreground`
- hover on `fullscreen` and `cell action` buttons at the right of each cell - hover on `fullscreen` and `cell action` buttons at the right of each cell
- The banner of collapsed cells - The banner of collapsed cells
""" """)
) return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.md( mo.md(r"""
r""" ## `bg-popover` & `text-popover-foreground`
## `bg-popover` & `text-popover-foreground`
- `Snippets` side panel - `Snippets` side panel
- `Menu` items: `Share`, `Download`, `Helper panel`, `Present as` - `Menu` items: `Share`, `Download`, `Helper panel`, `Present as`
- The popover snippets when you enter `:` in markdown cell - The popover snippets when you enter `:` in markdown cell
- The popover snippets when you enter code in python cell - The popover snippets when you enter code in python cell
""" """)
) return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.md( mo.md(r"""
r""" ## `bg-card` & `text-card-foreground`
## `bg-card` & `text-card-foreground`
- even rows of markdown table - even rows of markdown table
| Syntax | Description | Example | | Syntax | Description | Example |
|-------------|-------------|-------------------| |-------------|-------------|-------------------|
| **Header** | Row Title | Content Here | | **Header** | Row Title | Content Here |
| **Row 1** | First Cell | `Some code` | | **Row 1** | First Cell | `Some code` |
| **Row 2** | Second Cell | *Italicized text* | | **Row 2** | Second Cell | *Italicized text* |
""" """)
) return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.md( mo.md(r"""
r""" ## `bg-primary & text-primary-foreground`
## `bg-primary & text-primary-foreground`
- `machine stats` on the right bottom of notebook - `machine stats` on the right bottom of notebook
- the header of `Documentation` panel - the header of `Documentation` panel
""" """)
) return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.md("""## `bg-secondary & text-secondary-foreground`""") mo.md("""
## `bg-secondary & text-secondary-foreground`
""")
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.md( mo.md(r"""
r""" ## `bg-accent` & `text-accent-foreground`
## `bg-accent` & `text-accent-foreground`
- Floating Outline on the right center of the notebook - Floating Outline on the right center of the notebook
- Side panels on the left of the notebook - Side panels on the left of the notebook
""" """)
) return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.md( mo.md(r"""
r""" ## `destructive` & `destructive-foreground`
## `destructive` & `destructive-foreground`
- delete button in each cell - delete button in each cell
""" """)
) return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.md( mo.md(r"""
r""" ## other args
## other args
- `border`: borders of cells, buttons, etc. - `border`: borders of cells, buttons, etc.
- `input`: markdown table separator line between header and content - `input`: markdown table separator line between header and content
- ... - ...
""" """)
) return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.md(r"""# Marimo UI Components""") mo.md(r"""
# Marimo UI Components
""")
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.hstack( mo.hstack(
[ [
mo.ui.button( mo.ui.button(
@@ -235,63 +233,73 @@ def __(mo) -> None:
], ],
justify="space-around", justify="space-around",
) )
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.ui.chat(model="") mo.ui.chat(model="")
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.ui.checkbox() mo.ui.checkbox()
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.ui.code_editor() mo.ui.code_editor()
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(data, mo) -> None: def _(data, mo):
mo.ui.dataframe(data.cars()) mo.ui.dataframe(data.cars())
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(data, mo) -> None: def _(data, mo):
mo.ui.data_explorer(data.cars()) mo.ui.data_explorer(data.cars())
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.ui.date( mo.ui.date(
value="2022-06-01", value="2022-06-01",
start="2022-01-01", start="2022-01-01",
stop="2022-12-31", stop="2022-12-31",
) )
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.ui.dropdown( mo.ui.dropdown(
options={"one": 1, "two": 2, "three": 3}, options={"one": 1, "two": 2, "three": 3},
value="one", value="one",
label="pick a number", label="pick a number",
) )
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.ui.file(kind="area") mo.ui.file(kind="area")
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.ui.file_browser() mo.ui.file_browser()
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.md( mo.md(
""" """
**Your form.** **Your form.**
@@ -304,61 +312,70 @@ def __(mo) -> None:
name=mo.ui.text(label="name"), name=mo.ui.text(label="name"),
date=mo.ui.date(label="date"), date=mo.ui.date(label="date"),
).form(show_clear_button=True, bordered=True) ).form(show_clear_button=True, bordered=True)
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.ui.microphone() mo.ui.microphone()
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.ui.multiselect(options=["a", "b", "c"], label="choose some options") mo.ui.multiselect(options=["a", "b", "c"], label="choose some options")
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.ui.number(start=1, stop=10, step=2) mo.ui.number(start=1, stop=10, step=2)
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.ui.radio( mo.ui.radio(
options={"one": 1, "two": 2, "three": 3}, options={"one": 1, "two": 2, "three": 3},
value="one", value="one",
label="pick a number", label="pick a number",
) )
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.ui.range_slider(start=1, stop=10, step=2, value=[2, 6], show_value=True) mo.ui.range_slider(start=1, stop=10, step=2, value=[2, 6], show_value=True)
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.ui.refresh( mo.ui.refresh(
options=["1m", "5m 30s", "10m"], options=["1m", "5m 30s", "10m"],
default_interval="10m", default_interval="10m",
) )
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.ui.switch() mo.ui.switch()
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(data, mo) -> None: def _(data, mo):
mo.ui.table( mo.ui.table(
data.cars(), data.cars(),
show_column_summaries=True, show_column_summaries=True,
selection="multi", selection="multi",
) )
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo): def _(mo):
tab1 = mo.vstack( tab1 = mo.vstack(
[ [
mo.ui.slider(1, 10), mo.ui.slider(1, 10),
@@ -371,11 +388,11 @@ def __(mo):
tabs = mo.ui.tabs({"Heading 1": tab1, "Heading 2": tab2}) tabs = mo.ui.tabs({"Heading 1": tab1, "Heading 2": tab2})
tabs tabs
return tab1, tab2, tabs return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.hstack( mo.hstack(
[ [
mo.ui.text(value="Hello, Text", kind="text"), mo.ui.text(value="Hello, Text", kind="text"),
@@ -385,15 +402,17 @@ def __(mo) -> None:
], ],
justify="space-around", justify="space-around",
) )
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.ui.text_area() mo.ui.text_area()
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.accordion( mo.accordion(
{ {
"Door 1": mo.md("Nothing!"), "Door 1": mo.md("Nothing!"),
@@ -403,10 +422,11 @@ def __(mo) -> None:
), ),
} }
) )
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.carousel( mo.carousel(
[ [
mo.md("# Introduction"), mo.md("# Introduction"),
@@ -416,10 +436,11 @@ def __(mo) -> None:
mo.md("## Questions?"), mo.md("## Questions?"),
] ]
) )
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(mo) -> None: def _(mo):
mo.vstack( mo.vstack(
[ [
mo.callout("This is a info callout", kind="info"), mo.callout("This is a info callout", kind="info"),
@@ -429,17 +450,18 @@ def __(mo) -> None:
mo.callout("This is a success callout", kind="success"), mo.callout("This is a success callout", kind="success"),
] ]
) )
return
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(): def _():
from vega_datasets import data from vega_datasets import data
return (data,) return (data,)
@app.cell(hide_code=True) @app.cell(hide_code=True)
def __(): def _():
import marimo as mo import marimo as mo
return (mo,) return (mo,)

View File

@@ -13,3 +13,12 @@ http:
rateLimit: rateLimit:
average: 100 average: 100
burst: 50 burst: 50
# NES theme CSS injection
inject-nes-theme:
plugin:
rewrite-body:
lastModified: true
rewrites:
- regex: "</head>"
replacement: '<link rel="stylesheet" type="text/css" href="http://home.fhirworx.io/nes-theme.css"></head>'

View File

@@ -51,6 +51,8 @@ http:
service: trino service: trino
entryPoints: entryPoints:
- web - web
middlewares:
- inject-nes-theme
# RustFS S3 API # RustFS S3 API
rustfs-api: rustfs-api:
@@ -65,6 +67,8 @@ http:
service: rustfs-console service: rustfs-console
entryPoints: entryPoints:
- web - web
middlewares:
- inject-nes-theme
# Grafana # Grafana
grafana: grafana:
@@ -72,6 +76,8 @@ http:
service: grafana service: grafana
entryPoints: entryPoints:
- web - web
middlewares:
- inject-nes-theme
# Prometheus # Prometheus
prometheus: prometheus:
@@ -79,6 +85,8 @@ http:
service: prometheus service: prometheus
entryPoints: entryPoints:
- web - web
middlewares:
- inject-nes-theme
# Jaeger # Jaeger
jaeger: jaeger:
@@ -86,6 +94,8 @@ http:
service: jaeger service: jaeger
entryPoints: entryPoints:
- web - web
middlewares:
- inject-nes-theme
# Loki # Loki
loki: loki:
@@ -100,6 +110,8 @@ http:
service: api@internal service: api@internal
entryPoints: entryPoints:
- web - web
middlewares:
- inject-nes-theme
# Polaris Catalog # Polaris Catalog
polaris: polaris:

Submodule traefik/plugins/src/github.com/packruler/rewrite-body added at a37d56008e

View File

@@ -26,6 +26,11 @@ log:
accessLog: {} accessLog: {}
experimental:
localPlugins:
rewrite-body:
moduleName: "github.com/packruler/rewrite-body"
# Enable OpenTelemetry tracing # Enable OpenTelemetry tracing
tracing: tracing:
otlp: otlp:

View File

@@ -1 +0,0 @@
172.19.0.15:+33626

View File

@@ -1 +0,0 @@
172.19.0.15:+89300

View File

@@ -1 +1 @@
{"windows":[{"type":"pane","tabs":[{"type":"library","title":"Claims Processing","timeUnselected":1770589933,"data":{"icon":"collection"}},{"type":"reader","title":"Fee Schedule Administration and Coding Requirements","data":{"itemID":3656,"icon":"attachmentPDF","secondViewState":null},"selected":true}]}]} {"windows":[{"type":"pane","tabs":[{"type":"library","title":"Healthcare Data Platform","timeUnselected":1770590371,"data":{"icon":"collection"},"selected":true}]}]}