diff --git a/scripts/ui-drift-audit.sh b/scripts/ui-drift-audit.sh index beb87a2..b20b68d 100755 --- a/scripts/ui-drift-audit.sh +++ b/scripts/ui-drift-audit.sh @@ -40,24 +40,33 @@ def included(path: pathlib.Path) -> bool: def approved_ui(path: pathlib.Path) -> bool: return "components" in path.parts and "ui" in path.parts -def collect(pattern: re.Pattern[str], exclude_approved_ui: bool) -> list[tuple[str, int, str]]: +def collect( + pattern: re.Pattern[str], + exclude_approved_ui: bool, + label: str, +) -> list[tuple[str, int, str]]: matches = [] for path in sorted(web_src.rglob("*")): if not path.is_file() or not included(path): continue if exclude_approved_ui and approved_ui(path): continue + rel = path.relative_to(web_src).as_posix() + if label == "hardcoded color literals" and rel == "index.css": + continue try: lines = path.read_text(encoding="utf-8").splitlines() except UnicodeDecodeError: continue - rel = path.relative_to(web_src).as_posix() for line_number, line in enumerate(lines, start=1): if pattern.search(line): matches.append((rel, line_number, line.rstrip())) return matches -results = [(label, title, collect(pattern, exclude_approved_ui)) for label, title, pattern, exclude_approved_ui in patterns] +results = [ + (label, title, collect(pattern, exclude_approved_ui, label)) + for label, title, pattern, exclude_approved_ui in patterns +] total = sum(len(matches) for _, _, matches in results) print(f"UI drift audit mode={mode}") diff --git a/web/src/lib/TierPolicy.ts b/web/src/lib/TierPolicy.ts index f6767f9..c280b46 100644 --- a/web/src/lib/TierPolicy.ts +++ b/web/src/lib/TierPolicy.ts @@ -12,19 +12,19 @@ export const TIER_POLICIES: Record = { allowedRiskStyleIds: ['safe'], maxDailyProfitTargetUsd: 0, // No profit target adjustment label: 'Free Tier', - color: '#94a3b8' // Zinc-400 + color: 'var(--bl-text-secondary)' }, pro: { allowedRiskStyleIds: ['safe', 'balanced'], maxDailyProfitTargetUsd: 100, label: 'Pro Tier', - color: '#3b82f6' // Blue-500 + color: 'var(--bl-info-strong)' }, elite: { allowedRiskStyleIds: ['safe', 'balanced', 'aggressive'], maxDailyProfitTargetUsd: 10000, label: 'Elite Tier', - color: '#00ff88' // Primary Green + color: 'var(--bl-success)' } }; diff --git a/web/src/tabs/EntriesTab.tsx b/web/src/tabs/EntriesTab.tsx index 4b9ea60..251b00b 100644 --- a/web/src/tabs/EntriesTab.tsx +++ b/web/src/tabs/EntriesTab.tsx @@ -141,7 +141,7 @@ export const EntriesTab = ({ botState = DEFAULT_BOT_STATE }: EntriesTabProps) => const entryState = deriveEntryState(entry, botState); return (
-
+
{/* Card Top */}
@@ -248,7 +248,7 @@ export const EntriesTab = ({ botState = DEFAULT_BOT_STATE }: EntriesTabProps) => {/* 2. FORM DRAWER (IF ADDING/EDITING) */} {(isAdding || editingEntry) && ( -
+

diff --git a/web/src/tabs/MembershipTab.tsx b/web/src/tabs/MembershipTab.tsx index 8c69bcc..47464e3 100644 --- a/web/src/tabs/MembershipTab.tsx +++ b/web/src/tabs/MembershipTab.tsx @@ -22,7 +22,7 @@ const PlanCard: React.FC<{ }> = ({ id, policy }) => { const isElite = id === 'elite'; const isPro = id === 'pro'; - const themeColor = isElite ? '#00ff88' : isPro ? '#3498db' : '#929292'; + const themeColor = isElite ? 'var(--bl-success)' : isPro ? 'var(--bl-info-strong)' : 'var(--bl-text-secondary)'; const price = id === 'free' ? '$0' : id === 'pro' ? '$49' : '$199'; const description = id === 'free' @@ -78,7 +78,7 @@ const PlanCard: React.FC<{ /mo

- + Professional grade DNA
diff --git a/web/src/tabs/PositionsTab.tsx b/web/src/tabs/PositionsTab.tsx index c4a6c0d..f288a56 100644 --- a/web/src/tabs/PositionsTab.tsx +++ b/web/src/tabs/PositionsTab.tsx @@ -1299,7 +1299,7 @@ export const PositionsTab = ({ botState, onManageHolding }: PositionsTabProps) = variant="ghost" size="sm" className={`h-auto rounded-none px-4 py-3 text-sm font-semibold transition-all border-b-2 ${selectedProfileId === 'all' - ? 'border-[#00ff88] text-[#00ff88]' + ? 'border-[var(--bl-success)] text-[var(--bl-success)]' : 'border-transparent text-gray-500 hover:text-white' }`} > @@ -1313,7 +1313,7 @@ export const PositionsTab = ({ botState, onManageHolding }: PositionsTabProps) = variant="ghost" size="sm" className={`h-auto rounded-none px-4 py-3 text-sm font-semibold transition-all border-b-2 ${selectedProfileId === p.id - ? 'border-[#00ff88] text-[#00ff88]' + ? 'border-[var(--bl-success)] text-[var(--bl-success)]' : 'border-transparent text-gray-500 hover:text-white' }`} > @@ -2002,11 +2002,11 @@ export const PositionsTab = ({ botState, onManageHolding }: PositionsTabProps) = {trace.stateReason}
- {trace.entryOrder && } - {trace.hasHistoryMatch && } - {trace.state === 'PARTIAL_EXIT' && } - {trace.hasCancel && } - {trace.state === 'CLOSED' && } + {trace.entryOrder && } + {trace.hasHistoryMatch && } + {trace.state === 'PARTIAL_EXIT' && } + {trace.hasCancel && } + {trace.state === 'CLOSED' && }
diff --git a/web/src/tabs/SettingsTab.tsx b/web/src/tabs/SettingsTab.tsx index b3342b0..a9500ce 100644 --- a/web/src/tabs/SettingsTab.tsx +++ b/web/src/tabs/SettingsTab.tsx @@ -220,7 +220,7 @@ export const SettingsTab = ({ botState }: SettingsTabProps) => { {/* Break */}
-
+
Research & Screener Credentials
@@ -250,7 +250,7 @@ export const SettingsTab = ({ botState }: SettingsTabProps) => {
-
+
Alpaca Credentials
@@ -314,8 +314,8 @@ export const SettingsTab = ({ botState }: SettingsTabProps) => {