fix: keyboard multi-select uses stable IDs, improve Swiss theme, add Brutalist theme

This commit is contained in:
Joel Brock
2026-04-23 09:39:49 -07:00
parent 702bca4396
commit 6a6f9ba4f7
4 changed files with 517 additions and 198 deletions

253
themes/brutalist.css Normal file
View File

@@ -0,0 +1,253 @@
/*
* Outlook Relook — Brutalist Theme
* Stark minimalism. Monospace. Borders only, almost no fills.
* High contrast. Maximum information density. No comfort.
* Inspired by terminal UIs, tax forms, and concrete architecture.
*/
/* ============================================================
LIGHT VARIANT
============================================================ */
html[data-outlook-relook-scheme="light"] {
--or-bg-primary: #ffffff;
--or-bg-secondary: #ffffff;
--or-bg-tertiary: #ffffff;
--or-bg-hover: transparent;
--or-bg-selected: transparent;
--or-text-primary: #000000;
--or-text-secondary: #000000;
--or-text-tertiary: #555555;
--or-text-disabled: #999999;
--or-border: #000000;
--or-border-light: #000000;
--or-accent: var(--or-accent-override, #000000);
--or-accent-hover: var(--or-accent-override, #333333);
--or-shadow: none;
}
/* ============================================================
DARK VARIANT
============================================================ */
html[data-outlook-relook-scheme="dark"] {
--or-bg-primary: #000000;
--or-bg-secondary: #000000;
--or-bg-tertiary: #000000;
--or-bg-hover: transparent;
--or-bg-selected: transparent;
--or-text-primary: #ffffff;
--or-text-secondary: #ffffff;
--or-text-tertiary: #aaaaaa;
--or-text-disabled: #555555;
--or-border: #ffffff;
--or-border-light: #ffffff;
--or-accent: var(--or-accent-override, #ffffff);
--or-accent-hover: var(--or-accent-override, #cccccc);
--or-shadow: none;
}
/* ============================================================
TYPOGRAPHY — Monospace, tight, utilitarian
============================================================ */
html[data-outlook-relook-scheme] *,
html[data-outlook-relook-scheme] *::before,
html[data-outlook-relook-scheme] *::after {
font-family: 'SF Mono', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', monospace !important;
letter-spacing: -0.03em !important;
-webkit-font-smoothing: none !important;
font-smooth: never !important;
}
html[data-outlook-relook-scheme] body {
font-size: 12px !important;
}
/* ============================================================
STRIP EVERYTHING — more aggressive than Swiss
============================================================ */
html[data-outlook-relook-scheme] * {
border-radius: 0 !important;
text-shadow: none !important;
box-shadow: none !important;
background-image: none !important;
transition: none !important;
animation: none !important;
}
/* ============================================================
SURFACES — pure white/black, no distinction between panes
============================================================ */
html[data-outlook-relook-scheme] body {
background-color: var(--or-bg-primary) !important;
color: var(--or-text-primary) !important;
}
/* Top bar — just a bottom border */
html[data-outlook-relook-scheme] [role="banner"],
html[data-outlook-relook-scheme] header {
background-color: var(--or-bg-primary) !important;
border-bottom: 2px solid var(--or-border) !important;
}
/* Folder pane — border only, no background change */
html[data-outlook-relook-scheme] [role="navigation"],
html[data-outlook-relook-scheme] [role="complementary"] {
background-color: var(--or-bg-primary) !important;
border-right: 2px solid var(--or-border) !important;
}
/* Message list — no background */
html[data-outlook-relook-scheme] [role="listbox"],
html[data-outlook-relook-scheme] [role="list"] {
background-color: var(--or-bg-primary) !important;
}
/* Message list items — borders only, no fills */
html[data-outlook-relook-scheme] [role="option"],
html[data-outlook-relook-scheme] [role="listitem"] {
background-color: transparent !important;
border-bottom: 1px solid var(--or-border) !important;
color: var(--or-text-primary) !important;
padding: 3px 8px !important;
}
/* Hover: invert colors instead of fill */
html[data-outlook-relook-scheme="light"] [role="option"]:hover,
html[data-outlook-relook-scheme="light"] [role="listitem"]:hover {
background-color: #000000 !important;
color: #ffffff !important;
}
html[data-outlook-relook-scheme="dark"] [role="option"]:hover,
html[data-outlook-relook-scheme="dark"] [role="listitem"]:hover {
background-color: #ffffff !important;
color: #000000 !important;
}
/* Selected: invert */
html[data-outlook-relook-scheme="light"] [role="option"][aria-selected="true"],
html[data-outlook-relook-scheme="light"] [role="listitem"][aria-selected="true"] {
background-color: #000000 !important;
color: #ffffff !important;
}
html[data-outlook-relook-scheme="dark"] [role="option"][aria-selected="true"],
html[data-outlook-relook-scheme="dark"] [role="listitem"][aria-selected="true"] {
background-color: #ffffff !important;
color: #000000 !important;
}
/* Reading pane */
html[data-outlook-relook-scheme] [role="main"] {
background-color: var(--or-bg-primary) !important;
}
/* ============================================================
TOOLBAR — stark, no visual weight
============================================================ */
html[data-outlook-relook-scheme] [role="toolbar"] {
background-color: var(--or-bg-primary) !important;
border-bottom: 1px solid var(--or-border) !important;
}
html[data-outlook-relook-scheme] [role="toolbar"] button,
html[data-outlook-relook-scheme] [role="toolbar"] [role="button"] {
background-color: transparent !important;
border: 1px solid transparent !important;
color: var(--or-text-primary) !important;
text-transform: uppercase !important;
font-size: 10px !important;
letter-spacing: 0.05em !important;
}
html[data-outlook-relook-scheme] [role="toolbar"] button:hover,
html[data-outlook-relook-scheme] [role="toolbar"] [role="button"]:hover {
border-color: var(--or-border) !important;
background-color: transparent !important;
}
/* ============================================================
BUTTONS — outlined only, never filled
============================================================ */
html[data-outlook-relook-scheme] button,
html[data-outlook-relook-scheme] [role="button"] {
background-color: transparent !important;
color: var(--or-text-primary) !important;
border: 1px solid transparent !important;
}
html[data-outlook-relook-scheme] button:hover,
html[data-outlook-relook-scheme] [role="button"]:hover {
border-color: var(--or-border) !important;
}
/* Links: same color as text, underlined */
html[data-outlook-relook-scheme] a {
color: var(--or-text-primary) !important;
text-decoration: underline !important;
}
html[data-outlook-relook-scheme] a:hover {
text-decoration: none !important;
}
/* ============================================================
FOLDER PANE — all caps, no fills
============================================================ */
html[data-outlook-relook-scheme] [role="treeitem"] {
color: var(--or-text-primary) !important;
background-color: transparent !important;
text-transform: uppercase !important;
font-size: 10px !important;
letter-spacing: 0.06em !important;
border-bottom: 1px solid var(--or-border-light) !important;
}
html[data-outlook-relook-scheme] [role="treeitem"]:hover {
text-decoration: underline !important;
background-color: transparent !important;
}
html[data-outlook-relook-scheme] [role="treeitem"][aria-selected="true"] {
font-weight: 900 !important;
background-color: transparent !important;
}
/* ============================================================
SECONDARY TEXT
============================================================ */
html[data-outlook-relook-scheme] [role="option"] span,
html[data-outlook-relook-scheme] [role="listitem"] span {
color: var(--or-text-tertiary) !important;
font-size: 11px !important;
}
html[data-outlook-relook-scheme] time {
color: var(--or-text-tertiary) !important;
font-size: 10px !important;
text-transform: uppercase !important;
}
/* ============================================================
DIALOGS — bordered box, no fill
============================================================ */
html[data-outlook-relook-scheme] [role="dialog"],
html[data-outlook-relook-scheme] [role="alertdialog"] {
background-color: var(--or-bg-primary) !important;
border: 2px solid var(--or-border) !important;
}
/* ============================================================
SCROLLBARS — hairline
============================================================ */
html[data-outlook-relook-scheme] ::-webkit-scrollbar {
width: 2px !important;
height: 2px !important;
}
html[data-outlook-relook-scheme] ::-webkit-scrollbar-track {
background: transparent !important;
}
html[data-outlook-relook-scheme] ::-webkit-scrollbar-thumb {
background: var(--or-text-primary) !important;
}

View File

@@ -1,6 +1,8 @@
/*
* Outlook Relook — Swiss / Helvetica Theme
* Monochrome, tight grid, no decoration. Content density is king.
* Ruthlessly minimal. Black, white, grey, accent. Nothing else.
* Helvetica Neue everywhere. Zero decoration. Grid discipline.
* If an element doesn't serve the content, it should be invisible.
*/
/* ============================================================
@@ -8,18 +10,18 @@
============================================================ */
html[data-outlook-relook-scheme="light"] {
--or-bg-primary: #ffffff;
--or-bg-secondary: #fafafa;
--or-bg-tertiary: #f0f0f0;
--or-bg-hover: #e8e8e8;
--or-bg-selected: #e0e0e0;
--or-bg-secondary: #ffffff;
--or-bg-tertiary: #f7f7f7;
--or-bg-hover: #f0f0f0;
--or-bg-selected: #f0f0f0;
--or-text-primary: #000000;
--or-text-secondary: #333333;
--or-text-tertiary: #666666;
--or-text-disabled: #999999;
--or-border: #d0d0d0;
--or-border-light: #e5e5e5;
--or-accent: var(--or-accent-override, #000000);
--or-accent-hover: var(--or-accent-override, #333333);
--or-text-secondary: #555555;
--or-text-tertiary: #888888;
--or-text-disabled: #bbbbbb;
--or-border: #000000;
--or-border-light: #e0e0e0;
--or-accent: var(--or-accent-override, #ff0000);
--or-accent-hover: var(--or-accent-override, #cc0000);
--or-shadow: none;
}
@@ -27,71 +29,86 @@ html[data-outlook-relook-scheme="light"] {
DARK VARIANT
============================================================ */
html[data-outlook-relook-scheme="dark"] {
--or-bg-primary: #1a1a1a;
--or-bg-secondary: #222222;
--or-bg-tertiary: #2a2a2a;
--or-bg-hover: #333333;
--or-bg-selected: #3a3a3a;
--or-text-primary: #e8e8e8;
--or-text-secondary: #cccccc;
--or-text-tertiary: #999999;
--or-text-disabled: #666666;
--or-border: #3a3a3a;
--or-border-light: #2f2f2f;
--or-accent: var(--or-accent-override, #e8e8e8);
--or-accent-hover: var(--or-accent-override, #ffffff);
--or-bg-primary: #0a0a0a;
--or-bg-secondary: #0a0a0a;
--or-bg-tertiary: #141414;
--or-bg-hover: #1a1a1a;
--or-bg-selected: #1a1a1a;
--or-text-primary: #ffffff;
--or-text-secondary: #aaaaaa;
--or-text-tertiary: #666666;
--or-text-disabled: #444444;
--or-border: #ffffff;
--or-border-light: #222222;
--or-accent: var(--or-accent-override, #ff3333);
--or-accent-hover: var(--or-accent-override, #ff6666);
--or-shadow: none;
}
/* ============================================================
TYPOGRAPHY
TYPOGRAPHY — Helvetica Neue, aggressively applied
============================================================ */
html[data-outlook-relook-scheme] body,
html[data-outlook-relook-scheme] [role="main"],
html[data-outlook-relook-scheme] [role="navigation"],
html[data-outlook-relook-scheme] [role="complementary"],
html[data-outlook-relook-scheme] [role="banner"],
html[data-outlook-relook-scheme] input,
html[data-outlook-relook-scheme] button,
html[data-outlook-relook-scheme] select,
html[data-outlook-relook-scheme] textarea {
html[data-outlook-relook-scheme] *,
html[data-outlook-relook-scheme] *::before,
html[data-outlook-relook-scheme] *::after {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif !important;
letter-spacing: -0.01em !important;
letter-spacing: -0.02em !important;
-webkit-font-smoothing: antialiased !important;
-moz-osx-font-smoothing: grayscale !important;
}
/* ============================================================
SURFACES & BACKGROUNDS
STRIP ALL DECORATION — the core Swiss principle
============================================================ */
html[data-outlook-relook-scheme] * {
border-radius: 0 !important;
text-shadow: none !important;
box-shadow: none !important;
background-image: none !important;
text-decoration-color: var(--or-text-primary) !important;
outline-color: var(--or-accent) !important;
}
/* Remove ALL gradients, transitions, and transforms from non-essential elements */
html[data-outlook-relook-scheme] button,
html[data-outlook-relook-scheme] [role="button"],
html[data-outlook-relook-scheme] [role="tab"],
html[data-outlook-relook-scheme] [role="menuitem"],
html[data-outlook-relook-scheme] [role="option"],
html[data-outlook-relook-scheme] [role="listitem"],
html[data-outlook-relook-scheme] [role="treeitem"] {
transition: none !important;
animation: none !important;
}
/* ============================================================
SURFACES — flatten everything to white (or black in dark)
============================================================ */
html[data-outlook-relook-scheme] body {
background-color: var(--or-bg-primary) !important;
color: var(--or-text-primary) !important;
}
/* Top bar */
html[data-outlook-relook-scheme] [role="banner"],
html[data-outlook-relook-scheme] header {
background-color: var(--or-bg-primary) !important;
border-bottom: 1px solid var(--or-border) !important;
box-shadow: var(--or-shadow) !important;
}
/* Folder pane */
html[data-outlook-relook-scheme] [role="navigation"],
html[data-outlook-relook-scheme] [role="complementary"] {
background-color: var(--or-bg-secondary) !important;
background-color: var(--or-bg-primary) !important;
border-right: 1px solid var(--or-border-light) !important;
}
/* Message list */
html[data-outlook-relook-scheme] [role="listbox"],
html[data-outlook-relook-scheme] [role="list"] {
background-color: var(--or-bg-primary) !important;
}
/* Message list items */
html[data-outlook-relook-scheme] [role="option"],
html[data-outlook-relook-scheme] [role="listitem"] {
background-color: var(--or-bg-primary) !important;
background-color: transparent !important;
border-bottom: 1px solid var(--or-border-light) !important;
color: var(--or-text-primary) !important;
}
@@ -104,74 +121,81 @@ html[data-outlook-relook-scheme] [role="listitem"]:hover {
html[data-outlook-relook-scheme] [role="option"][aria-selected="true"],
html[data-outlook-relook-scheme] [role="listitem"][aria-selected="true"] {
background-color: var(--or-bg-selected) !important;
border-left: 3px solid var(--or-accent) !important;
}
/* Reading pane */
html[data-outlook-relook-scheme] [role="main"] {
background-color: var(--or-bg-primary) !important;
}
/* ============================================================
DECORATIVE REMOVAL
TOOLBAR — minimal, no background distinction
============================================================ */
html[data-outlook-relook-scheme] * {
border-radius: 0 !important;
text-shadow: none !important;
html[data-outlook-relook-scheme] [role="toolbar"] {
background-color: var(--or-bg-primary) !important;
border-bottom: 1px solid var(--or-border-light) !important;
}
html[data-outlook-relook-scheme] button,
html[data-outlook-relook-scheme] [role="button"],
html[data-outlook-relook-scheme] [role="tab"],
html[data-outlook-relook-scheme] [role="menuitem"] {
box-shadow: none !important;
background-image: none !important;
/* Toolbar buttons: text only, no background */
html[data-outlook-relook-scheme] [role="toolbar"] button,
html[data-outlook-relook-scheme] [role="toolbar"] [role="button"] {
background-color: transparent !important;
border: none !important;
color: var(--or-text-primary) !important;
}
html[data-outlook-relook-scheme] [role="toolbar"] button:hover,
html[data-outlook-relook-scheme] [role="toolbar"] [role="button"]:hover {
background-color: var(--or-bg-hover) !important;
}
/* ============================================================
BUTTONS & INTERACTIVE
BUTTONS — understate everything
============================================================ */
html[data-outlook-relook-scheme] button,
html[data-outlook-relook-scheme] [role="button"] {
background-color: transparent !important;
color: var(--or-text-primary) !important;
}
html[data-outlook-relook-scheme] button:hover,
html[data-outlook-relook-scheme] [role="button"]:hover {
background-color: var(--or-bg-hover) !important;
}
/* Links: accent color, no underline by default */
html[data-outlook-relook-scheme] a {
color: var(--or-accent) !important;
text-decoration: none !important;
}
html[data-outlook-relook-scheme] a:hover {
text-decoration: underline !important;
color: var(--or-accent-hover) !important;
}
/* ============================================================
TOOLBAR / COMMAND BAR
============================================================ */
html[data-outlook-relook-scheme] [role="toolbar"] {
background-color: var(--or-bg-primary) !important;
border-bottom: 1px solid var(--or-border-light) !important;
box-shadow: none !important;
}
/* ============================================================
FOLDER PANE TREE ITEMS
FOLDER PANE — text hierarchy only, no visual chrome
============================================================ */
html[data-outlook-relook-scheme] [role="treeitem"] {
color: var(--or-text-secondary) !important;
background-color: transparent !important;
}
html[data-outlook-relook-scheme] [role="treeitem"]:hover {
background-color: var(--or-bg-hover) !important;
color: var(--or-text-primary) !important;
background-color: transparent !important;
text-decoration: underline !important;
}
html[data-outlook-relook-scheme] [role="treeitem"][aria-selected="true"] {
background-color: var(--or-bg-selected) !important;
color: var(--or-text-primary) !important;
font-weight: 600 !important;
font-weight: 700 !important;
background-color: transparent !important;
}
/* ============================================================
SECONDARY TEXT
SECONDARY TEXT — clear hierarchy
============================================================ */
html[data-outlook-relook-scheme] [role="option"] span,
html[data-outlook-relook-scheme] [role="listitem"] span {
@@ -180,4 +204,32 @@ html[data-outlook-relook-scheme] [role="listitem"] span {
html[data-outlook-relook-scheme] time {
color: var(--or-text-tertiary) !important;
font-size: 11px !important;
text-transform: uppercase !important;
letter-spacing: 0.03em !important;
}
/* ============================================================
DIALOGS & OVERLAYS
============================================================ */
html[data-outlook-relook-scheme] [role="dialog"],
html[data-outlook-relook-scheme] [role="alertdialog"] {
background-color: var(--or-bg-primary) !important;
border: 1px solid var(--or-border) !important;
}
/* ============================================================
SCROLLBARS — thin, monochrome
============================================================ */
html[data-outlook-relook-scheme] ::-webkit-scrollbar {
width: 4px !important;
height: 4px !important;
}
html[data-outlook-relook-scheme] ::-webkit-scrollbar-track {
background: transparent !important;
}
html[data-outlook-relook-scheme] ::-webkit-scrollbar-thumb {
background: var(--or-text-tertiary) !important;
}