diff --git a/app/config/architecture-inventory.json b/app/config/architecture-inventory.json
index 13c30d1..192928a 100644
--- a/app/config/architecture-inventory.json
+++ b/app/config/architecture-inventory.json
@@ -373,12 +373,12 @@
"/shared/tokens.css?v=20260820-2",
"/shared/base.css?v=20260806-1",
"/shared/shell.css?v=20260820-2",
- "/shared/auth.css?v=20260806-1",
+ "/shared/auth.css?v=20260820-3",
"/shared/components/controls.css?v=20260820-1",
"/shared/components/navigation.css?v=20260820-1",
"/shared/components/cards.css?v=20260820-1",
"/shared/components/tables.css?v=20260820-1",
- "/shared/components/dialogs.css?v=20260806-1",
+ "/shared/components/dialogs.css?v=20260820-3",
"/shared/components/feedback.css?v=20260806-1",
"/pages/market/foundation.css?v=20260806-1",
"/pages/sentiment/foundation.css?v=20260820-2",
@@ -389,10 +389,10 @@
"/pages/themes/foundation.css?v=20260820-1",
"/pages/popularity/foundation.css?v=20260820-1",
"/pages/dragon-tiger/foundation.css?v=20260820-1",
- "/pages/screener/foundation.css?v=20260806-2",
+ "/pages/screener/foundation.css?v=20260820-3",
"/pages/mentor/foundation.css?v=20260820-2",
"/pages/heaven/foundation.css?v=20260806-2",
- "/pages/review/foundation.css?v=20260806-1"
+ "/pages/review/foundation.css?v=20260820-3"
],
"frontend_composition": {
"shell": "frontend/index.html",
@@ -441,8 +441,8 @@
},
{
"path": "frontend/pages/screener/foundation.css",
- "bytes": 102987,
- "lines": 6565
+ "bytes": 103623,
+ "lines": 6580
},
{
"path": "frontend/pages/heaven/page.js",
diff --git a/app/frontend/index.html b/app/frontend/index.html
index 3b2b1a9..bb8f046 100644
--- a/app/frontend/index.html
+++ b/app/frontend/index.html
@@ -20,12 +20,12 @@
-
+
-
+
@@ -36,10 +36,10 @@
-
+
-
+
diff --git a/app/frontend/pages/review/foundation.css b/app/frontend/pages/review/foundation.css
index 9c3bf19..f30f6fd 100644
--- a/app/frontend/pages/review/foundation.css
+++ b/app/frontend/pages/review/foundation.css
@@ -242,7 +242,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
border-radius: 10px;
- box-shadow: var(--shadow-xs);
+ box-shadow: var(--shadow-card);
min-height: 0px !important;
}
@@ -276,15 +276,15 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
}
.watchlist-section .data-table thead th {
- height: 32px;
+ height: 36px;
- padding: 6px 12px;
+ padding: 0 12px;
}
.watchlist-section .data-table tbody td {
- height: 44px;
+ height: 40px;
- padding: 7px 12px;
+ padding: 0 12px;
}
.trade-journal-section .trade-log-summary:empty {
@@ -384,7 +384,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
}
#reviewWorkspaceView .review-history-toggle {
- min-height: 30px;
+ min-height: 32px;
display: inline-flex;
@@ -398,13 +398,13 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
border: 1px solid var(--review-line);
- border-radius: 7px;
+ border-radius: 8px;
background: var(--surface);
- color: rgb(55, 65, 81);
+ color: var(--text-secondary);
- font-size: 11.5px;
+ font-size: var(--font-size-label);
white-space: nowrap;
}
@@ -469,7 +469,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
background: var(--surface);
- box-shadow: rgba(16, 24, 40, 0.05) 0px 1px 2px;
+ box-shadow: var(--shadow-card);
}
#reviewWorkspaceView .review-card-heading > div {
@@ -515,9 +515,9 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
}
#reviewWorkspaceView .data-table thead th {
- height: 32px;
+ height: 36px;
- padding: 6px 12px;
+ padding: 0 12px;
border-bottom: 1px solid var(--review-line-soft);
@@ -525,21 +525,21 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
color: var(--review-faint);
- font-size: 10.5px;
+ font-size: var(--font-size-caption);
- font-weight: 600;
+ font-weight: var(--font-weight-semibold);
}
#reviewWorkspaceView .data-table tbody td {
- height: 48px;
+ height: 40px;
- padding: 7px 12px;
+ padding: 0 12px;
border-bottom: 1px solid var(--review-line-soft);
- color: rgb(55, 65, 81);
+ color: var(--text-primary);
- font-size: 12px;
+ font-size: var(--font-size-table);
}
#reviewWorkspaceView .data-table tbody tr:last-child td {
@@ -559,17 +559,17 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
#reviewWorkspaceView .stock-cell strong {
color: var(--review-ink);
- font-size: 12px;
+ font-size: var(--font-size-table);
}
#reviewWorkspaceView .stock-cell small {
color: var(--review-faint);
- font-size: 10px;
+ font-size: var(--font-size-aux);
}
#reviewWorkspaceView .review-watch-mark {
- color: rgb(209, 213, 219);
+ color: var(--text-tertiary);
font-size: 15px;
@@ -577,7 +577,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
}
#reviewWorkspaceView .review-watch-mark.red {
- color: rgb(224, 69, 54);
+ color: var(--market-up);
}
#reviewWorkspaceView .review-row-actions {
@@ -601,19 +601,19 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
}
#reviewWorkspaceView .table-action {
- min-height: 25px;
+ min-height: 32px;
padding: 0px 6px;
border: 0px;
- border-radius: 5px;
+ border-radius: 8px;
background: transparent;
color: var(--review-blue);
- font-size: 10.5px;
+ font-size: var(--font-size-label);
}
#reviewWorkspaceView .table-action:hover {
@@ -621,13 +621,13 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
}
#reviewWorkspaceView .table-action.down {
- color: rgb(139, 146, 158);
+ color: var(--text-tertiary);
}
#reviewWorkspaceView .table-action.down:hover {
background: var(--surface-hover);
- color: rgb(209, 67, 67);
+ color: var(--market-up);
}
#reviewWorkspaceView .trade-log-table-frame .empty-state {
@@ -667,7 +667,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
}
#reviewWorkspaceView .trade-log-heading .button {
- min-height: 29px;
+ min-height: 32px;
display: inline-flex;
@@ -679,13 +679,13 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
padding: 0px 10px;
- border-radius: 7px;
+ border-radius: 8px;
background: var(--review-blue);
color: var(--text-inverse);
- font-size: 11.5px;
+ font-size: var(--font-size-label);
}
#reviewWorkspaceView .trade-log-heading .button:hover {
@@ -831,35 +831,35 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
}
#reviewWorkspaceView .trade-action-add {
- border-color: rgb(241, 196, 192);
+ border-color: var(--market-up);
- background: rgb(253, 236, 234);
+ background: var(--market-up-soft);
- color: rgb(214, 62, 50);
+ color: var(--market-up);
}
#reviewWorkspaceView .trade-action-buy {
- border-color: rgb(241, 196, 192);
+ border-color: var(--market-up);
- background: rgb(253, 236, 234);
+ background: var(--market-up-soft);
- color: rgb(214, 62, 50);
+ color: var(--market-up);
}
#reviewWorkspaceView .trade-action-sell {
- border-color: rgb(188, 225, 202);
+ border-color: var(--market-down);
- background: rgb(234, 247, 239);
+ background: var(--market-down-soft);
- color: rgb(22, 139, 67);
+ color: var(--market-down);
}
#reviewWorkspaceView .trade-action-trim {
- border-color: rgb(188, 225, 202);
+ border-color: var(--market-down);
- background: rgb(234, 247, 239);
+ background: var(--market-down-soft);
- color: rgb(22, 139, 67);
+ color: var(--market-down);
}
#reviewWorkspaceView .trade-tags {
@@ -879,7 +879,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
background: var(--review-blue-soft);
- color: rgb(82, 112, 167);
+ color: var(--action);
font-size: 8.5px;
}
@@ -899,7 +899,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
white-space: nowrap;
- color: rgb(75, 85, 99);
+ color: var(--text-secondary);
font-size: 10.5px;
@@ -989,7 +989,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
}
#reviewWorkspaceView .journal-form .button {
- min-height: 34px;
+ min-height: 32px;
display: inline-flex;
@@ -1001,13 +1001,13 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
padding: 0px 14px;
- border-radius: 7px;
+ border-radius: 8px;
background: var(--review-blue);
color: var(--text-inverse);
- font-size: 12px;
+ font-size: var(--font-size-label);
}
#reviewWorkspaceView .journal-form .button:hover {
@@ -1247,9 +1247,9 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
color: var(--review-ink);
- font-size: 19px;
+ font-size: var(--font-size-page-title);
- font-weight: 750;
+ font-weight: var(--font-weight-semibold);
}
#reviewWorkspaceView .review-page-title .section-subtitle {
@@ -1261,7 +1261,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
white-space: nowrap;
- font-size: 12px;
+ font-size: var(--font-size-caption);
}
#reviewWorkspaceView .review-card-heading {
@@ -1285,13 +1285,13 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
color: var(--review-ink);
- font-size: 14.5px;
+ font-size: var(--font-size-card-title);
- font-weight: 720;
+ font-weight: var(--font-weight-semibold);
}
#reviewWorkspaceView .review-add-watch {
- min-height: 29px;
+ min-height: 32px;
display: inline-flex;
@@ -1303,23 +1303,23 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
padding: 0px 10px;
- border: 1px solid rgb(185, 205, 248);
+ border: 1px solid var(--color-action-line);
- border-radius: 7px;
+ border-radius: 8px;
- background: rgb(245, 248, 255);
+ background: var(--action-soft);
color: var(--review-blue);
- font-size: 11.5px;
+ font-size: var(--font-size-label);
- font-weight: 650;
+ font-weight: var(--font-weight-semibold);
}
#reviewWorkspaceView .review-add-watch:hover {
- border-color: rgb(142, 176, 244);
+ border-color: var(--action);
- background: rgb(234, 241, 255);
+ background: var(--selected);
}
#reviewWorkspaceView .review-add-watch .lucide {
@@ -1374,17 +1374,17 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
}
#reviewWorkspaceView .review-watchlist-table .stock-cell strong {
- font-size: 12.5px;
+ font-size: var(--font-size-table);
- font-weight: 680;
+ font-weight: var(--font-weight-semibold);
}
#reviewWorkspaceView .review-watchlist-table .stock-cell small {
- font-size: 10.5px;
+ font-size: var(--font-size-aux);
}
#reviewWorkspaceView .watch-attention-score {
- color: rgb(63, 75, 94);
+ color: var(--text-primary);
font-size: 12px;
@@ -1452,11 +1452,11 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
#reviewWorkspaceView .journal-summary-field input:focus {
border-color: var(--review-blue-line);
- box-shadow: rgba(37, 99, 235, 0.08) 0px 0px 0px 2px;
+ box-shadow: 0 0 0 2px var(--focus-ring);
}
#reviewWorkspaceView .journal-summary-field input::placeholder {
- color: rgb(166, 173, 183);
+ color: var(--text-tertiary);
}
#reviewWorkspaceView .journal-form textarea {
@@ -1543,7 +1543,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
.watchlist-editor-form .form-field > label,
.watchlist-editor-form .form-field > span {
- color: rgb(55, 65, 81);
+ color: var(--text-secondary);
font-size: 12px;
@@ -1561,7 +1561,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
padding: 0px 11px;
- border: 1px solid rgb(223, 227, 232);
+ border: 1px solid var(--border-strong);
border-radius: 8px;
@@ -1569,9 +1569,9 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
}
.watchlist-search-control:focus-within {
- border-color: rgb(184, 202, 244);
+ border-color: var(--color-action-line);
- box-shadow: rgba(37, 99, 235, 0.07) 0px 0px 0px 3px;
+ box-shadow: 0 0 0 3px var(--focus-ring);
}
.watchlist-search-control .lucide {
@@ -1579,7 +1579,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
height: 15px;
- color: rgb(154, 163, 176);
+ color: var(--text-tertiary);
}
.watchlist-search-control input {
@@ -1591,7 +1591,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
outline: 0px;
- color: rgb(31, 41, 55);
+ color: var(--text-primary);
font-style: inherit;
@@ -1645,13 +1645,13 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
border-style: none none solid;
- border-color: currentcolor currentcolor rgb(238, 240, 243);
+ border-color: currentcolor currentcolor var(--border);
border-image: none;
background: var(--surface);
- color: rgb(31, 41, 55);
+ color: var(--text-primary);
text-align: left;
}
@@ -1673,7 +1673,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
}
.watchlist-search-results button small {
- color: rgb(139, 148, 161);
+ color: var(--text-tertiary);
font-size: 10.5px;
}
@@ -1681,7 +1681,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
.watchlist-search-results button > b {
margin-left: auto;
- color: rgb(105, 115, 134);
+ color: var(--text-secondary);
font-size: 11px;
@@ -1691,7 +1691,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
.watchlist-search-status {
padding: 14px 10px;
- color: rgb(139, 148, 161);
+ color: var(--text-tertiary);
font-size: 11.5px;
@@ -1709,7 +1709,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
padding: 10px 12px;
- border: 1px solid rgb(220, 229, 247);
+ border: 1px solid var(--action-soft);
border-radius: 8px;
@@ -1733,9 +1733,9 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
border-radius: 7px;
- background: rgb(232, 239, 255);
+ background: var(--action-soft);
- color: rgb(37, 99, 235);
+ color: var(--action);
}
.watchlist-selection-icon .lucide {
@@ -1753,7 +1753,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
}
.watchlist-selection strong {
- color: rgb(31, 41, 55);
+ color: var(--text-primary);
font-size: 13.5px;
}
@@ -1763,13 +1763,13 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
gap: 8px;
- color: rgb(123, 132, 145);
+ color: var(--text-tertiary);
font-size: 10.5px;
}
.watchlist-selection span b {
- color: rgb(82, 96, 113);
+ color: var(--text-secondary);
font-weight: 600;
}
@@ -1791,7 +1791,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
resize: vertical;
- border: 1px solid rgb(223, 227, 232);
+ border: 1px solid var(--border-strong);
border-radius: 8px;
@@ -1825,9 +1825,9 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
}
.watchlist-editor-form textarea:focus {
- border-color: rgb(184, 202, 244);
+ border-color: var(--color-action-line);
- box-shadow: rgba(37, 99, 235, 0.07) 0px 0px 0px 3px;
+ box-shadow: 0 0 0 3px var(--focus-ring);
}
#reviewWorkspaceView .trade-log-table th:nth-child(1) {
@@ -1873,7 +1873,7 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
font-size: 12px;
- font-weight: 650;
+ font-weight: var(--font-weight-semibold);
min-height: 0px;
@@ -2201,3 +2201,8 @@ body[data-active-view="reviewWorkspaceView"] .overview-strip {
height: auto;
}
}
+
+#reviewWorkspaceView .data-table thead th:first-child,
+#reviewWorkspaceView .data-table tbody td:first-child {
+ text-align: left;
+}
diff --git a/app/frontend/pages/screener/foundation.css b/app/frontend/pages/screener/foundation.css
index 0938796..abbffd9 100644
--- a/app/frontend/pages/screener/foundation.css
+++ b/app/frontend/pages/screener/foundation.css
@@ -1,8 +1,8 @@
/* Canonical CSS owner: screener. Historical layers consolidated 2026-08-02. */
#screenerView .section-toolbar h2 {
- font-size: 17px;
+ font-size: var(--font-size-page-title);
- font-weight: 800;
+ font-weight: var(--font-weight-semibold);
}
@media (max-width: 767px) {
@@ -25,7 +25,7 @@
.curated-detail-header > div > span,
.quant-panel-heading span {
- color: rgb(100, 116, 139);
+ color: var(--text-secondary);
font-size: 12px;
@@ -35,7 +35,7 @@
:where(#screenerView) .curated-detail-header h3 {
margin: 3px 0px 0px;
- color: rgb(17, 24, 39);
+ color: var(--text-primary);
letter-spacing: 0px;
}
@@ -45,7 +45,7 @@
border-radius: 5px;
- background: rgb(232, 238, 252);
+ background: var(--action-soft);
}
:where(#screenerView) .curated-search .lucide {
@@ -55,19 +55,19 @@
:where(#screenerView) .curated-search input {
background: transparent;
- color: rgb(17, 24, 39);
+ color: var(--text-primary);
}
.curated-strategy-card.active .curated-strategy-rank {
- background: rgb(220, 232, 255);
+ background: var(--action-soft);
- color: rgb(29, 78, 216);
+ color: var(--action);
}
:where(#screenerView) .curated-detail-header p {
margin: 9px 0px 0px;
- color: rgb(100, 116, 139);
+ color: var(--text-secondary);
}
.curated-strategy-badges {
@@ -87,9 +87,9 @@
border-radius: 5px;
- background: rgb(241, 245, 249);
+ background: var(--hover);
- color: rgb(71, 85, 105);
+ color: var(--text-secondary);
font-weight: 650;
@@ -97,9 +97,9 @@
}
.curated-strategy-badges span:first-child {
- background: rgb(234, 241, 255);
+ background: var(--action-soft);
- color: rgb(29, 78, 216);
+ color: var(--action);
}
:where(#screenerView) .mini-section-heading {
@@ -111,11 +111,11 @@
:where(#screenerView) .mini-section-heading h4 {
font-weight: 740;
- color: rgb(31, 41, 55);
+ color: var(--text-primary);
}
.mini-section-heading > span {
- color: rgb(100, 116, 139);
+ color: var(--text-secondary);
font-size: 12px;
}
@@ -141,15 +141,15 @@
gap: 12px;
- border-bottom: 1px solid rgb(238, 240, 243);
+ border-bottom: 1px solid var(--border);
}
:where(#screenerView) .curated-rule-row span {
- color: rgb(71, 85, 105);
+ color: var(--text-secondary);
}
:where(#screenerView) .curated-rule-row strong {
- color: rgb(17, 24, 39);
+ color: var(--text-primary);
font-variant-numeric: tabular-nums;
}
@@ -163,7 +163,7 @@
.curated-score-row > span:first-child {
overflow: hidden;
- color: rgb(71, 85, 105);
+ color: var(--text-secondary);
text-overflow: ellipsis;
@@ -177,7 +177,7 @@
border-radius: 4px;
- background: rgb(237, 240, 244);
+ background: var(--surface-muted);
}
.curated-score-track i {
@@ -187,11 +187,11 @@
border-radius: inherit;
- background: rgb(79, 118, 199);
+ background: var(--action);
}
.curated-score-row strong {
- color: rgb(51, 65, 85);
+ color: var(--text-primary);
text-align: right;
@@ -211,11 +211,11 @@
}
:where(#screenerView) .curated-data-status > .lucide {
- color: rgb(22, 163, 74);
+ color: var(--market-down);
}
.curated-data-status.missing > .lucide {
- color: rgb(217, 119, 6);
+ color: var(--warning-color);
}
.curated-data-status span {
@@ -225,13 +225,13 @@
:where(#screenerView) .curated-data-status strong {
display: block;
- color: rgb(51, 65, 85);
+ color: var(--text-primary);
}
:where(#screenerView) .curated-data-status small {
display: block;
- color: rgb(124, 135, 152);
+ color: var(--text-tertiary);
}
.quant-universe-grid .form-field {
@@ -239,16 +239,16 @@
}
.quant-universe-grid input[type="number"] {
- height: 40px;
+ height: 32px;
}
.quant-rule-row input:focus,
.quant-rule-row select:focus {
- border-color: rgb(37, 99, 235);
+ border-color: var(--action);
outline: 0px;
- box-shadow: rgba(37, 99, 235, 0.1) 0px 0px 0px 3px;
+ box-shadow: 0 0 0 3px var(--focus-ring);
}
:where(#screenerView) .quant-remove-button {
@@ -268,7 +268,7 @@
float: right;
- color: rgb(29, 78, 216);
+ color: var(--action);
}
:where(#screenerView) .quant-weight-status > div {
@@ -278,7 +278,7 @@
:where(#screenerView) .quant-weight-status i {
width: 100%;
- background: rgb(37, 99, 235);
+ background: var(--action);
transition: width 180ms, background 180ms;
}
@@ -305,7 +305,7 @@
}
.quant-summary-pane {
- border-top: 1px solid rgb(229, 231, 235);
+ border-top: 1px solid var(--border);
border-left: 0px;
}
@@ -549,7 +549,7 @@
padding: 12px;
- background: rgb(248, 249, 251);
+ background: var(--surface-subtle);
}
#screenerView .strategy-list {
@@ -575,7 +575,7 @@
}
#screenerView .strategy-item.active {
- border-color: rgb(201, 219, 241);
+ border-color: var(--color-action-line);
background: var(--action-soft);
}
@@ -724,7 +724,7 @@
#screenerView .backtest-panel {
padding: 10px 14px 12px;
- background: rgb(251, 252, 253);
+ background: var(--surface-subtle);
}
#screenerView .backtest-panel > .workspace-heading {
@@ -1099,7 +1099,7 @@
}
.tracking-status.active {
- border-color: rgb(197, 215, 237);
+ border-color: var(--color-action-line);
background: var(--action-soft);
@@ -1107,7 +1107,7 @@
}
.tracking-status.complete {
- border-color: rgb(185, 223, 207);
+ border-color: var(--market-down);
background: var(--market-down-soft);
@@ -1149,9 +1149,9 @@
border-radius: 50%;
- background: rgb(229, 231, 235);
+ background: var(--border);
- color: rgb(156, 163, 175);
+ color: var(--text-tertiary);
font-size: 11px;
@@ -1189,11 +1189,11 @@
.screener-strategy-title b.neutral {
background: var(--surface-muted);
- color: rgb(107, 114, 128);
+ color: var(--text-secondary);
}
:where(#screenerView) .screener-strategy-summary p {
- color: rgb(107, 114, 128);
+ color: var(--text-secondary);
font-size: 12px;
}
@@ -1225,7 +1225,7 @@
border-right: 0px;
- border-bottom-color: rgb(238, 240, 243);
+ border-bottom-color: var(--border);
}
#screenerView .screener-result-frame th {
@@ -1235,13 +1235,13 @@
border-right: 0px;
- border-bottom-color: rgb(238, 240, 243);
+ border-bottom-color: var(--border);
height: 38px;
background: var(--table-header);
- color: rgb(107, 114, 128);
+ color: var(--text-secondary);
font-size: 12px;
}
@@ -1281,7 +1281,7 @@
background: var(--surface);
- box-shadow: rgba(15, 23, 42, 0.16) -12px 0px 32px;
+ box-shadow: var(--shadow-float);
}
.strategy-drawer[open] {
@@ -1323,7 +1323,7 @@
}
.strategy-drawer-header span {
- color: rgb(156, 163, 175);
+ color: var(--text-tertiary);
font-size: 10.5px;
}
@@ -1365,7 +1365,7 @@
border-bottom: 1px solid var(--border);
- background: rgb(248, 249, 251);
+ background: var(--surface-subtle);
}
#screenerView .strategy-drawer .strategy-list {
@@ -1602,7 +1602,7 @@
padding-top: 5px;
- border-top: 1px solid rgb(238, 240, 243);
+ border-top: 1px solid var(--border);
}
#screenerView .screener-backtest-strip {
@@ -1684,7 +1684,7 @@
background: var(--surface);
- color: rgb(31, 41, 55);
+ color: var(--text-primary);
font-style: inherit;
@@ -1722,7 +1722,7 @@
padding: 0px 9px;
- color: rgb(31, 41, 55);
+ color: var(--text-primary);
font: inherit;
@@ -1749,7 +1749,7 @@
.curated-library-pane {
border-right: 0px;
- border-bottom: 1px solid rgb(229, 231, 235);
+ border-bottom: 1px solid var(--border);
display: block;
@@ -1788,9 +1788,9 @@
}
.curated-search:focus-within {
- border-color: rgb(142, 172, 239);
+ border-color: var(--action);
- box-shadow: rgba(53, 106, 230, 0.1) 0px 0px 0px 3px;
+ box-shadow: 0 0 0 3px var(--focus-ring);
}
:where(#screenerView) .screener-page-heading {
@@ -1824,7 +1824,7 @@
}
:where(#screenerView) .curated-library-heading h3 {
- color: rgb(17, 24, 39);
+ color: var(--text-primary);
letter-spacing: 0px;
}
@@ -1870,7 +1870,7 @@
justify-content: space-between;
- border-bottom: 1px solid rgb(232, 235, 239);
+ border-bottom: 1px solid var(--border);
}
:where(#screenerView) .curated-execution-bar {
@@ -1890,7 +1890,7 @@
}
#screenerView .regime-evidence strong {
- color: rgb(146, 88, 6);
+ color: var(--warning-color);
font-size: 12px;
@@ -1902,7 +1902,7 @@
overflow: visible;
- color: rgb(162, 106, 24);
+ color: var(--warning-color);
font-size: 10.5px;
@@ -2350,7 +2350,7 @@ body[data-active-view="screenerView"] .overview-strip {
}
:where(#screenerView) .curated-strategy-card:hover {
- box-shadow: rgba(37, 99, 235, 0.08) 0px 4px 14px;
+ box-shadow: var(--shadow-raised);
}
:where(#screenerView) .quant-screener-panel {
@@ -2414,7 +2414,7 @@ body[data-active-view="screenerView"] .overview-strip {
border-radius: 999px;
- background: rgb(223, 229, 238);
+ background: var(--border-strong);
accent-color: var(--primary);
@@ -2532,19 +2532,19 @@ body[data-active-view="screenerView"] .overview-strip {
color: var(--r2-ink);
- font-size: 17px;
+ font-size: var(--font-size-page-title);
- font-weight: 800;
+ font-weight: var(--font-weight-semibold);
}
#screenerView .screener-page-heading .section-subtitle {
color: var(--r2-faint);
- font-size: 12px;
+ font-size: var(--font-size-caption);
}
#screenerView .screener-mode-tabs {
- min-height: 34px;
+ min-height: 32px;
display: inline-flex;
@@ -2662,7 +2662,7 @@ body[data-active-view="screenerView"] .overview-strip {
}
#screenerView .step-line.complete {
- background: rgb(134, 213, 160);
+ background: var(--market-down);
}
#screenerView .screener-overview-card {
@@ -2712,7 +2712,7 @@ body[data-active-view="screenerView"] .overview-strip {
border-radius: 5px;
- background: rgb(244, 246, 248);
+ background: var(--surface-muted);
color: var(--r2-sub);
@@ -2766,7 +2766,7 @@ body[data-active-view="screenerView"] .overview-strip {
}
#screenerView .regime-option:hover {
- border-color: rgb(187, 200, 219);
+ border-color: var(--border-strong);
color: var(--r2-ink);
}
@@ -2979,7 +2979,7 @@ body[data-active-view="screenerView"] .overview-strip {
#screenerView .result-toolbar .count-badge {
border-radius: 5px;
- background: rgb(241, 243, 246);
+ background: var(--surface-muted);
color: var(--r2-sub);
@@ -3039,25 +3039,29 @@ body[data-active-view="screenerView"] .overview-strip {
}
#screenerView .data-table {
- font-size: 11.5px;
+ font-size: var(--font-size-table);
}
#screenerView .data-table thead th {
- height: 39px;
+ height: 36px;
- padding: 8px 11px;
+ padding: 0 12px;
background: var(--table-header);
color: var(--r2-sub);
- font-size: 10.5px;
+ font-size: var(--font-size-caption);
+
+ font-weight: var(--font-weight-semibold);
}
#screenerView .data-table tbody td {
- height: 45px;
+ height: 40px;
- padding: 8px 11px;
+ padding: 0 12px;
+
+ font-size: var(--font-size-table);
}
#screenerView .data-table .stock-name {
@@ -3069,7 +3073,7 @@ body[data-active-view="screenerView"] .overview-strip {
overflow: hidden;
- color: rgb(95, 107, 124);
+ color: var(--text-secondary);
text-overflow: ellipsis;
}
@@ -3091,13 +3095,13 @@ body[data-active-view="screenerView"] .overview-strip {
#screenerView .probability-value small {
margin-top: 3px;
- font-weight: 500;
+ font-weight: var(--font-weight-medium);
display: block;
color: var(--r2-faint);
- font-size: 9px;
+ font-size: var(--font-size-aux);
}
#screenerView .tracking-summary {
@@ -3341,7 +3345,7 @@ body[data-active-view="screenerView"] .overview-strip {
}
#screenerView .curated-school-filters button.active {
- border-color: rgb(197, 212, 241);
+ border-color: var(--color-action-line);
background: var(--scr-blue-soft);
@@ -3562,7 +3566,7 @@ body[data-active-view="screenerView"] .overview-strip {
border-radius: 5px;
- background: rgb(238, 241, 245);
+ background: var(--surface-muted);
color: var(--r2-sub);
@@ -3598,7 +3602,7 @@ body[data-active-view="screenerView"] .overview-strip {
border-radius: 4px;
- background: rgb(238, 241, 245);
+ background: var(--surface-muted);
color: var(--r2-faint);
@@ -3953,7 +3957,7 @@ body[data-active-view="screenerView"] .overview-strip {
border-radius: 6px;
- background: rgb(247, 248, 250);
+ background: var(--surface-subtle);
}
#screenerView .quant-rule-rows {
@@ -3989,7 +3993,7 @@ body[data-active-view="screenerView"] .overview-strip {
min-height: 30px;
- border: 1px solid rgb(220, 225, 232);
+ border: 1px solid var(--border-strong);
border-radius: 6px;
@@ -4003,7 +4007,7 @@ body[data-active-view="screenerView"] .overview-strip {
min-height: 30px;
- border: 1px solid rgb(220, 225, 232);
+ border: 1px solid var(--border-strong);
border-radius: 6px;
@@ -4075,7 +4079,7 @@ body[data-active-view="screenerView"] .overview-strip {
border-radius: 3px;
- background: rgb(232, 235, 240);
+ background: var(--surface-muted);
}
#screenerView .quant-weight-status i {
@@ -4109,7 +4113,7 @@ body[data-active-view="screenerView"] .overview-strip {
}
#screenerView .strategy-drawer::backdrop {
- background: rgba(20, 29, 44, 0.38);
+ background: var(--backdrop);
backdrop-filter: blur(3px);
}
@@ -4587,7 +4591,7 @@ body[data-active-view="screenerView"] .overview-strip {
}
#screenerTrackingView .tracking-back-button:hover {
- border-color: rgb(185, 200, 228);
+ border-color: var(--color-action-line);
color: var(--scr-blue);
}
@@ -4743,23 +4747,27 @@ body[data-active-view="screenerView"] .overview-strip {
}
#screenerTrackingView .data-table {
- font-size: 11.5px;
+ font-size: var(--font-size-table);
}
#screenerTrackingView .data-table thead th {
- height: 39px;
+ height: 36px;
- padding: 8px 11px;
+ padding: 0 12px;
background: var(--table-header);
- font-size: 10.5px;
+ font-size: var(--font-size-caption);
+
+ font-weight: var(--font-weight-semibold);
}
#screenerTrackingView .data-table tbody td {
- height: 46px;
+ height: 40px;
- padding: 8px 11px;
+ padding: 0 12px;
+
+ font-size: var(--font-size-table);
}
#screenerTrackingView .stock-cell {
@@ -4775,7 +4783,7 @@ body[data-active-view="screenerView"] .overview-strip {
#screenerTrackingView .stock-cell small {
color: var(--r2-faint);
- font-size: 9px;
+ font-size: var(--font-size-aux);
}
#screenerTrackingView .table-action.danger {
@@ -5495,7 +5503,7 @@ body[data-active-view="screenerView"] .overview-strip {
flex-direction: column;
- border: 1px solid rgb(243, 201, 195);
+ border: 1px solid var(--market-up);
border-radius: 9px;
@@ -5677,7 +5685,7 @@ body[data-active-view="screenerView"] .overview-strip {
}
#screenerView .screener-tracking-entry:focus-visible {
- outline: rgba(37, 99, 235, 0.45) solid 2px;
+ outline: 2px solid var(--action);
outline-offset: 2px;
}
@@ -5729,11 +5737,11 @@ body[data-active-view="screenerView"] .overview-strip {
padding: 3px 8px;
- border: 1px solid rgb(217, 226, 239);
+ border: 1px solid var(--border-strong);
border-radius: 5px;
- background: rgb(247, 249, 252);
+ background: var(--surface-subtle);
color: var(--r2-sub);
@@ -6563,3 +6571,10 @@ body[data-active-view="screenerView"] .overview-strip {
gap: 3px;
}
}
+
+#screenerView .data-table thead th:first-child,
+#screenerView .data-table tbody td:first-child,
+#screenerTrackingView .data-table thead th:first-child,
+#screenerTrackingView .data-table tbody td:first-child {
+ text-align: left;
+}
diff --git a/app/frontend/shared/auth.css b/app/frontend/shared/auth.css
index 3a12e66..a2b0949 100644
--- a/app/frontend/shared/auth.css
+++ b/app/frontend/shared/auth.css
@@ -12,7 +12,7 @@
padding: 20px;
- background: rgb(237, 241, 244);
+ background: var(--canvas);
}
.auth-gate[hidden] {
@@ -26,13 +26,13 @@
padding: 26px;
- border: 1px solid var(--line-strong);
+ border: 1px solid var(--border-strong);
- border-radius: 6px;
+ border-radius: 12px;
background: var(--surface);
- box-shadow: var(--shadow);
+ box-shadow: var(--shadow-raised);
}
.auth-brand {
@@ -46,7 +46,9 @@
.auth-brand h1 {
margin: 0px;
- font-size: 22px;
+ font-size: var(--font-size-page-title);
+
+ font-weight: var(--font-weight-semibold);
}
.auth-brand span {
@@ -54,9 +56,9 @@
margin-top: 5px;
- color: var(--text-muted);
+ color: var(--text-3);
- font-size: 12px;
+ font-size: var(--font-size-caption);
}
.auth-tabs {
@@ -88,11 +90,11 @@
}
.auth-tab.active {
- border-bottom-color: var(--coral);
+ border-bottom-color: var(--action);
- color: var(--text);
+ color: var(--text-1);
- font-weight: 750;
+ font-weight: var(--font-weight-semibold);
}
.auth-form {
@@ -106,15 +108,15 @@
.auth-form .button {
width: 100%;
- min-height: 40px;
+ min-height: 32px;
}
.auth-error {
margin: 0px;
- color: rgb(185, 54, 39);
+ color: var(--market-up);
- font-size: 12px;
+ font-size: var(--font-size-caption);
line-height: 1.5;
}
@@ -146,23 +148,23 @@
.admin-section-picker select {
width: 100%;
- min-height: 40px;
+ min-height: 32px;
padding: 0px 11px;
- border: 1px solid var(--line-strong);
+ border: 1px solid var(--border-strong);
- border-radius: 5px;
+ border-radius: 8px;
background: var(--surface);
color: var(--text-primary);
- font-size: 13px;
+ font-size: var(--font-size-label);
}
.admin-section-picker select:focus-visible {
- outline: 2px solid var(--blue);
+ outline: 2px solid var(--action);
outline-offset: 2px;
}
@@ -307,13 +309,13 @@
min-width: 0px;
- height: 34px;
+ height: 32px;
padding: 0px 8px;
- border: 1px solid var(--line-strong);
+ border: 1px solid var(--border-strong);
- border-radius: 4px;
+ border-radius: 8px;
background: var(--surface);
}
@@ -386,11 +388,11 @@
}
.connection-status.connected {
- border-color: rgb(167, 222, 201);
+ border-color: var(--market-down);
background: var(--green-soft);
- color: rgb(8, 106, 75);
+ color: var(--market-down);
}
.settings-dialog form {
@@ -594,7 +596,7 @@
.account-dropdown button {
width: 100%;
- min-height: 40px;
+ min-height: 36px;
display: grid;
@@ -636,7 +638,7 @@
outline: none;
- box-shadow: inset 0 0 0 2px var(--focus-ring, #1268c4);
+ box-shadow: inset 0 0 0 2px var(--focus-ring);
}
.account-dropdown button svg {
@@ -662,16 +664,16 @@
}
.account-dropdown .account-menu-danger {
- color: rgb(181, 58, 66);
+ color: var(--market-up);
grid-template-columns: 18px minmax(0px, 1fr);
}
.account-dropdown .account-menu-danger:focus-visible,
.account-dropdown .account-menu-danger:hover {
- color: rgb(163, 47, 55);
+ color: var(--market-up);
- background: rgb(255, 242, 243);
+ background: var(--market-up-soft);
}
button.account-role-badge {
@@ -685,11 +687,11 @@ button.account-role-badge {
button.account-role-badge:hover {
filter: brightness(0.98);
- box-shadow: rgba(67, 76, 86, 0.14) 0px 3px 10px;
+ box-shadow: var(--shadow-card);
}
button.account-role-badge:focus-visible {
- outline: 2px solid var(--blue);
+ outline: 2px solid var(--action);
outline-offset: 2px;
}
@@ -701,9 +703,9 @@ button.account-role-badge:focus-visible {
}
.admin-role-badge {
- color: rgb(83, 103, 124);
+ color: var(--text-secondary);
- background: rgb(244, 247, 250);
+ background: var(--surface-muted);
}
.vip-role-badge {
@@ -719,7 +721,7 @@ button.account-role-badge:focus-visible {
.vip-role-badge.is-nonmember {
color: rgb(105, 117, 128);
- background: rgb(244, 246, 248);
+ background: var(--surface-muted);
border-color: rgb(203, 211, 218);
@@ -825,7 +827,7 @@ button.account-role-badge:focus-visible {
}
.member-gate strong {
- color: rgb(60, 70, 80);
+ color: var(--text-primary);
font-size: 14px;
}
@@ -877,7 +879,7 @@ button.account-role-badge:focus-visible {
margin-bottom: 12px;
- color: rgb(83, 103, 124);
+ color: var(--text-secondary);
}
.privacy-note svg {
@@ -889,7 +891,7 @@ button.account-role-badge:focus-visible {
margin-top: 3px;
- color: rgb(52, 116, 95);
+ color: var(--market-down);
}
.membership-status-grid {
@@ -905,17 +907,17 @@ button.account-role-badge:focus-visible {
.membership-status-grid > div {
padding: 12px 13px;
- border: 1px solid var(--line, #e2e8ee);
+ border: 1px solid var(--border);
border-radius: 10px;
- background: rgb(251, 252, 253);
+ background: var(--surface-subtle);
}
.membership-status-grid span {
display: block;
- color: rgb(116, 128, 140);
+ color: var(--text-tertiary);
font-size: 11px;
}
@@ -925,7 +927,7 @@ button.account-role-badge:focus-visible {
margin-top: 5px;
- color: rgb(38, 50, 61);
+ color: var(--text-primary);
font-size: 15px;
@@ -935,7 +937,7 @@ button.account-role-badge:focus-visible {
.membership-comparison {
overflow: hidden;
- border: 1px solid var(--line, #e2e8ee);
+ border: 1px solid var(--border);
border-radius: 10px;
@@ -953,7 +955,7 @@ button.account-role-badge:focus-visible {
padding: 9px 11px;
- border-top: 1px solid var(--line, #e2e8ee);
+ border-top: 1px solid var(--border);
}
.membership-comparison > div:first-child {
@@ -961,21 +963,21 @@ button.account-role-badge:focus-visible {
}
.membership-comparison-head {
- color: rgb(105, 118, 131);
+ color: var(--text-secondary);
- background: rgb(247, 249, 251);
+ background: var(--surface-subtle);
font-weight: 700;
}
.membership-comparison b {
- color: rgb(39, 108, 88);
+ color: var(--market-down);
font-weight: 600;
}
.membership-comparison b.muted {
- color: rgb(154, 164, 173);
+ color: var(--text-tertiary);
}
.membership-comparison b.available {
@@ -993,7 +995,7 @@ button.account-role-badge:focus-visible {
margin-top: 14px;
- color: rgb(93, 105, 116);
+ color: var(--text-secondary);
font-size: 12px;
}
@@ -1085,7 +1087,7 @@ button.account-role-badge:focus-visible {
}
.account-settings-dialog {
- border-radius: 9px;
+ border-radius: 12px;
}
.settings-dialog {
@@ -1095,7 +1097,7 @@ button.account-role-badge:focus-visible {
overflow-x: hidden;
- border-radius: 9px;
+ border-radius: 12px;
}
.account-dropdown {
@@ -1115,17 +1117,17 @@ button.account-role-badge:focus-visible {
padding: 7px;
- background: rgba(255, 255, 255, 0.98);
+ background: var(--surface);
transform-origin: right top;
animation: account-menu-in 180ms var(--ease-out) both;
- border-color: var(--border);
+ border: 1px solid var(--border);
- border-radius: 7px;
+ border-radius: 8px;
- box-shadow: rgba(22, 34, 46, 0.15) 0px 14px 35px;
+ box-shadow: var(--shadow-float);
}
@media (max-width: 767px) {
@@ -1214,7 +1216,7 @@ button.account-role-badge:focus-visible {
border-radius: 7px;
- background: rgb(37, 99, 235);
+ background: var(--action);
color: var(--text-inverse);
@@ -1308,17 +1310,17 @@ button.account-role-badge:focus-visible {
.settings-dialog:not(.heaven-reading-dialog) .settings-section-heading h3 {
margin: 0px;
- color: rgb(39, 52, 67);
+ color: var(--text-primary);
- font-size: 14px;
+ font-size: var(--font-size-card-title);
- font-weight: 720;
+ font-weight: var(--font-weight-semibold);
}
.settings-dialog:not(.heaven-reading-dialog) .settings-section-heading > span {
- color: rgb(124, 135, 149);
+ color: var(--text-tertiary);
- font-size: 10.5px;
+ font-size: var(--font-size-aux);
}
.settings-dialog:not(.heaven-reading-dialog) .form-field {
@@ -1327,7 +1329,7 @@ button.account-role-badge:focus-visible {
.settings-dialog:not(.heaven-reading-dialog) .form-field > label,
.settings-dialog:not(.heaven-reading-dialog) .form-field > span {
- color: rgb(78, 91, 106);
+ color: var(--text-secondary);
font-size: 11px;
@@ -1335,7 +1337,7 @@ button.account-role-badge:focus-visible {
}
.settings-dialog:not(.heaven-reading-dialog) :is(input, select, textarea) {
- border-color: rgb(213, 220, 229);
+ border-color: var(--border-strong);
border-radius: 7px;
}
@@ -1375,7 +1377,7 @@ button.account-role-badge:focus-visible {
}
.account-settings-dialog .settings-lead {
- color: rgb(96, 109, 124);
+ color: var(--text-secondary);
font-size: 12px;
@@ -1397,7 +1399,7 @@ button.account-role-badge:focus-visible {
padding: 11px 12px;
- border-color: rgb(223, 228, 234);
+ border-color: var(--border-strong);
border-radius: 7px;
@@ -1425,7 +1427,7 @@ button.account-role-badge:focus-visible {
}
.account-settings-dialog .membership-comparison {
- border-color: rgb(223, 228, 234);
+ border-color: var(--border-strong);
border-radius: 7px;
}
@@ -1435,7 +1437,7 @@ button.account-role-badge:focus-visible {
padding: 8px 11px;
- border-color: rgb(230, 234, 239);
+ border-color: var(--border);
}
.account-settings-dialog .membership-comparison-head {
@@ -1449,11 +1451,11 @@ button.account-role-badge:focus-visible {
.account-settings-dialog .privacy-note {
padding: 10px 11px;
- border: 1px solid rgb(220, 232, 226);
+ border: 1px solid var(--market-down);
border-radius: 7px;
- background: rgb(245, 250, 247);
+ background: var(--market-down-soft);
}
.account-settings-dialog .account-birth-form {
@@ -1475,7 +1477,7 @@ button.account-role-badge:focus-visible {
border-radius: 7px;
- color: rgb(102, 115, 132);
+ color: var(--text-secondary);
font-size: 11px;
}
@@ -1489,7 +1491,7 @@ button.account-role-badge:focus-visible {
border-bottom: 1px solid var(--dialog-line);
- background: rgb(251, 252, 253);
+ background: var(--surface-subtle);
}
.admin-dialog .admin-section-picker label {
@@ -1497,13 +1499,13 @@ button.account-role-badge:focus-visible {
}
.admin-dialog .admin-section-picker select {
- min-height: 36px;
+ min-height: 32px;
- border-color: rgb(212, 220, 229);
+ border-color: var(--border-strong);
- border-radius: 7px;
+ border-radius: 8px;
- font-size: 12px;
+ font-size: var(--font-size-label);
}
.admin-dialog .admin-panel {
@@ -1635,7 +1637,7 @@ button.account-role-badge:focus-visible {
}
:root[data-theme="dark"] :is(.loading-overlay, .auth-gate) {
- background: color-mix(in srgb, var(--canvas) 92%, transparent);
+ background: var(--backdrop);
}
:root[data-theme="dark"] :is(.auth-shell) {
diff --git a/app/frontend/shared/components/dialogs.css b/app/frontend/shared/components/dialogs.css
index 64bea7a..233b36b 100644
--- a/app/frontend/shared/components/dialogs.css
+++ b/app/frontend/shared/components/dialogs.css
@@ -10,7 +10,9 @@
.dialog-header h2 {
margin: 2px 0px 0px;
- font-size: 19px;
+ font-size: 16px;
+
+ font-weight: var(--font-weight-semibold);
letter-spacing: 0px;
}
@@ -36,9 +38,9 @@
}
.admin-dialog .model-row {
- border-color: rgb(223, 228, 234);
+ border-color: var(--border);
- border-radius: 7px;
+ border-radius: 8px;
background: var(--surface-subtle);
}
@@ -240,11 +242,11 @@
}
.alert-button.has-alerts {
- border-color: rgb(214, 180, 93);
+ border-color: var(--warning-color);
- background: rgb(255, 249, 233);
+ background: var(--warning-soft);
- color: rgb(138, 97, 0);
+ color: var(--warning-color);
}
.alert-badge {
@@ -526,17 +528,17 @@
}
.assistant-message.user .assistant-message-content {
- border-color: rgb(190, 210, 235);
+ border-color: var(--color-action-line);
background: var(--action-soft);
}
.assistant-message.is-error .assistant-message-content {
- border-color: rgb(239, 197, 200);
+ border-color: var(--market-up);
background: var(--market-up-soft);
- color: rgb(139, 47, 52);
+ color: var(--market-up);
}
.assistant-message-content p {
@@ -778,7 +780,7 @@
gap: 16px;
- padding: 14px 18px;
+ padding: 20px;
min-height: 62px;
@@ -786,7 +788,7 @@
}
.assistant-dialog {
- border-radius: 9px;
+ border-radius: 12px;
width: min(820px, -32px + 100vw);
@@ -796,9 +798,9 @@
}
.dialog-eyebrow {
- color: var(--text-muted);
+ color: var(--text-3);
- font-size: 12px;
+ font-size: var(--font-size-caption);
}
.global-search-dialog {
@@ -806,7 +808,7 @@
border-radius: 8px;
- box-shadow: rgba(26, 37, 47, 0.22) 0px 22px 70px, rgba(26, 37, 47, 0.1) 0px 3px 14px;
+ box-shadow: var(--shadow-float);
max-width: 700px;
@@ -892,13 +894,13 @@
font: 11px / 1.2 ui-monospace, SFMono-Regular, Consolas, monospace;
- border-color: rgb(214, 221, 229);
+ border-color: var(--border-strong);
border-radius: 5px;
- background: rgb(247, 248, 250);
+ background: var(--surface-subtle);
- color: rgb(125, 136, 150);
+ color: var(--text-tertiary);
}
.global-search-results {
@@ -920,7 +922,7 @@
padding: 9px 10px 5px;
- color: rgb(135, 146, 160);
+ color: var(--text-tertiary);
font-size: 10px;
}
@@ -957,9 +959,9 @@
.global-search-result.is-active,
.global-search-result:hover {
- background: rgb(238, 244, 255);
+ background: var(--action-soft);
- color: rgb(31, 85, 165);
+ color: var(--action);
}
.global-search-result-icon {
@@ -973,7 +975,7 @@
color: var(--text-muted);
- border-color: rgb(224, 229, 235);
+ border-color: var(--border);
border-radius: 7px;
@@ -1003,7 +1005,7 @@
border-color: var(--dialog-line);
- background: rgb(251, 252, 253);
+ background: var(--surface-subtle);
}
.alerts-dialog .alert-form {
@@ -1077,7 +1079,7 @@
padding: 16px 18px;
- background: rgb(247, 249, 251);
+ background: var(--surface-subtle);
}
.assistant-dialog .assistant-message {
@@ -1087,9 +1089,9 @@
}
.assistant-dialog .assistant-message-content {
- border-color: rgb(220, 227, 235);
+ border-color: var(--border);
- border-radius: 7px;
+ border-radius: 8px;
font-size: 12.5px;
@@ -1197,7 +1199,7 @@
z-index: 95;
- box-shadow: rgba(0, 0, 0, 0.12) -8px 0px 24px;
+ box-shadow: var(--shadow-float);
transition: right 0.25s;
diff --git a/app/tests/e2e/app-shell.spec.js b/app/tests/e2e/app-shell.spec.js
index 956d656..ca6e359 100644
--- a/app/tests/e2e/app-shell.spec.js
+++ b/app/tests/e2e/app-shell.spec.js
@@ -3300,3 +3300,80 @@ test("merged header keeps date, detail fields and 13 pool columns after dual-rev
}
await expect(page.locator("#dataDateMetric")).toBeVisible();
});
+
+test("B-199 screener review and account surfaces fit day night viewports", async ({ page }) => {
+ const fs = require("node:fs");
+ const path = require("node:path");
+ const shotDir = path.join(__dirname, "../../runtime/b199-shots");
+ fs.mkdirSync(shotDir, { recursive: true });
+ const pageErrors = [];
+ page.on("pageerror", (error) => pageErrors.push(String(error)));
+
+ const overflowX = () => page.evaluate(() => document.documentElement.scrollWidth - window.innerWidth);
+ const shot = (name) => page.screenshot({ path: path.join(shotDir, `${name}.png`), fullPage: true });
+
+ await mockApplication(page, session("admin", true));
+ await page.setViewportSize({ width: 1600, height: 1000 });
+ await page.goto("/index.html");
+
+ await page.locator('[data-view="screenerView"]').first().click();
+ await expect(page.locator("#screenerView")).toHaveClass(/active-view/);
+ expect(await overflowX()).toBeLessThanOrEqual(1);
+ await shot("screener-1600-day");
+
+ await page.locator('[data-view="reviewWorkspaceView"]').first().click();
+ await expect(page.locator("#reviewWorkspaceView")).toHaveClass(/active-view/);
+ expect(await overflowX()).toBeLessThanOrEqual(1);
+ await shot("review-1600-day");
+
+ await openHeaderCommandMenu(page);
+ await page.locator("#accountButton").click();
+ await page.locator('[data-account-panel="membership"]').click();
+ await expect(page.locator("#settingsDialog")).toBeVisible();
+ await shot("account-1600-day");
+ await page.locator("#closeSettingsDialog").click();
+
+ await openHeaderCommandMenu(page);
+ await page.locator("#settingsButton").click();
+ await expect(page.locator("#adminDialog")).toBeVisible();
+ await shot("admin-1600-day");
+ await page.locator("#closeAdminDialog").click();
+
+ await page.locator("#themeToggle").click();
+ await expect(page.locator("html")).toHaveAttribute("data-theme", "dark");
+ await page.locator('[data-view="screenerView"]').first().click();
+ expect(await overflowX()).toBeLessThanOrEqual(1);
+ await shot("screener-1600-night");
+ await page.locator('[data-view="reviewWorkspaceView"]').first().click();
+ expect(await overflowX()).toBeLessThanOrEqual(1);
+ await shot("review-1600-night");
+
+ await page.setViewportSize({ width: 1280, height: 800 });
+ await page.locator('[data-view="screenerView"]').first().click();
+ expect(await overflowX()).toBeLessThanOrEqual(1);
+ await shot("screener-1280-night");
+ await page.locator('[data-view="reviewWorkspaceView"]').first().click();
+ expect(await overflowX()).toBeLessThanOrEqual(1);
+ await shot("review-1280-night");
+
+ await page.locator("#themeToggle").click();
+ await expect(page.locator("html")).toHaveAttribute("data-theme", "light");
+ await page.locator('[data-view="screenerView"]').first().click();
+ expect(await overflowX()).toBeLessThanOrEqual(1);
+ await shot("screener-1280-day");
+ await page.locator('[data-view="reviewWorkspaceView"]').first().click();
+ expect(await overflowX()).toBeLessThanOrEqual(1);
+ await shot("review-1280-day");
+
+ await page.locator('[data-view="screenerView"]').first().click();
+ await page.setViewportSize({ width: 390, height: 844 });
+ await expect(page.locator("#screenerView")).toHaveClass(/active-view/);
+ expect(await overflowX()).toBeLessThanOrEqual(1);
+ await shot("screener-390-day");
+ await page.locator(".mobile-primary-tab[data-view=\"reviewWorkspaceView\"]").click();
+ await expect(page.locator("#reviewWorkspaceView")).toHaveClass(/active-view/);
+ expect(await overflowX()).toBeLessThanOrEqual(1);
+ await shot("review-390-day");
+
+ expect(pageErrors).toEqual([]);
+});