From d34043a48110bf88c2cc3cc3dbe56fc96d2af79d Mon Sep 17 00:00:00 2001 From: Jer Miller Date: Tue, 7 Apr 2026 14:17:33 -0600 Subject: [PATCH] Fix login accessibility, remove ALL CAPS, and make today button always-visible - Login: improve trust text contrast (#595959, 7:1 ratio), add password label, add role="alert" to error container, include recovery hint in error message - Remove all 30 text-transform: uppercase declarations across 13 app workspace files, lowercase HTML text to match, remove paired letter-spacing - Facet modal: lowercase heading, label, and button text - Today button: always visible with de-emphasized/prominent states based on current day, add aria-label and :focus-visible ring - Update test assertion to match new error message Files changed: convey/templates/login.html, convey/root.py, convey/static/app.css, convey/static/app.js, convey/templates/date_nav.html, tests/test_password.py, and 14 app workspace files (search, home, settings, agents, health, dev, entities, todos, import, stats, calendar/_day, graph, support, stats/dashboard.js) --- apps/agents/workspace.html | 66 +++++++++++++--------------------- apps/calendar/_day.html | 4 +-- apps/dev/workspace.html | 6 ++-- apps/entities/workspace.html | 12 +++---- apps/graph/workspace.html | 8 ++--- apps/health/workspace.html | 36 ++++++++----------- apps/home/workspace.html | 28 ++++++--------- apps/import/workspace.html | 2 -- apps/search/workspace.html | 6 ++-- apps/settings/workspace.html | 24 ++++--------- apps/stats/dashboard.js | 14 ++++---- apps/stats/workspace.html | 2 -- apps/support/workspace.html | 1 - apps/todos/workspace.html | 2 -- convey/root.py | 2 +- convey/static/app.css | 28 +++++++++++---- convey/static/app.js | 12 +++---- convey/templates/date_nav.html | 8 ++++- convey/templates/login.html | 7 ++-- tests/test_password.py | 2 +- 20 files changed, 117 insertions(+), 153 deletions(-) diff --git a/apps/agents/workspace.html b/apps/agents/workspace.html index 3ad95da32..967400a5d 100644 --- a/apps/agents/workspace.html +++ b/apps/agents/workspace.html @@ -75,8 +75,6 @@ .section-title { font-size: 0.85rem; font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.05em; color: #666; margin-bottom: 0.75rem; padding-bottom: 0.25rem; @@ -249,8 +247,6 @@ font-weight: 600; color: #666; font-size: 0.85rem; - text-transform: uppercase; - letter-spacing: 0.03em; } .runs-table tr { @@ -429,8 +425,6 @@ .meta-label { font-size: 0.72rem; - text-transform: uppercase; - letter-spacing: 0.03em; color: #6b7280; } @@ -550,8 +544,6 @@ font-weight: 600; color: #7c4dff; font-size: 0.78rem; - text-transform: uppercase; - letter-spacing: 0.03em; } .event-thinking .thinking-text { @@ -570,8 +562,6 @@ font-weight: 600; color: #0288d1; font-size: 0.78rem; - text-transform: uppercase; - letter-spacing: 0.03em; } .event-tool .tool-name { @@ -613,8 +603,6 @@ font-size: 0.75rem; font-weight: 600; color: #666; - text-transform: uppercase; - letter-spacing: 0.03em; margin-top: 0.4rem; } @@ -641,8 +629,6 @@ font-weight: 600; color: #d32f2f; font-size: 0.78rem; - text-transform: uppercase; - letter-spacing: 0.03em; } .event-error .error-message { @@ -682,8 +668,6 @@ font-weight: 600; color: #388e3c; font-size: 0.78rem; - text-transform: uppercase; - letter-spacing: 0.03em; } .event-finish .finish-result { @@ -918,16 +902,16 @@ - Time - Model - Provider - Runtime + time + model + provider + runtime 💭 🔧 💰 - Facet - Output - Prompt + facet + output + prompt @@ -1198,13 +1182,13 @@ // Render system agents if (organized.system.length > 0) { - container.appendChild(renderSection('System Agents', organized.system)); + container.appendChild(renderSection('system agents', organized.system)); } // Render app agent sections const appNames = Object.keys(organized.apps).sort(); for (const appName of appNames) { - const title = appName.charAt(0).toUpperCase() + appName.slice(1); + const title = appName; container.appendChild(renderSection(title, organized.apps[appName])); } } @@ -1670,13 +1654,13 @@ status.className = 'run-status-badge'; if (data.status === 'running') { status.classList.add('status-running'); - status.textContent = 'Running'; + status.textContent = 'running'; } else if (data.failed) { status.classList.add('status-failed'); - status.textContent = 'Failed'; + status.textContent = 'failed'; } else { status.classList.add('status-completed'); - status.textContent = 'Completed'; + status.textContent = 'completed'; } titleRow.appendChild(status); @@ -1731,14 +1715,14 @@ grid.appendChild(item); } - addMetaItem('Started', formatTimestamp(data.start) || '\u2014'); - addMetaItem('Runtime', formatRuntime(data.runtime_seconds)); - addMetaItem('Model', formatModel(data.model), data.model || ''); - addMetaItem('Provider', data.provider || '\u2014'); - addMetaItem('Thinking', String(data.thinking_count || 0)); - addMetaItem('Tools', String(data.tool_count || 0)); + addMetaItem('started', formatTimestamp(data.start) || '\u2014'); + addMetaItem('runtime', formatRuntime(data.runtime_seconds)); + addMetaItem('model', formatModel(data.model), data.model || ''); + addMetaItem('provider', data.provider || '\u2014'); + addMetaItem('thinking', String(data.thinking_count || 0)); + addMetaItem('tools', String(data.tool_count || 0)); const costInfo = formatCost(data.cost); - addMetaItem('Cost', costInfo.text, costInfo.title); + addMetaItem('cost', costInfo.text, costInfo.title); card.appendChild(grid); return card; @@ -1888,7 +1872,7 @@ const text = event.summary || event.content || ''; block.innerHTML = '' + escapeHtml(formatTimestamp(event.ts)) + '' + - 'Thinking' + + 'thinking' + (text ? '
' + escapeHtml(text) + '
' : ''); return block; @@ -1909,7 +1893,7 @@ const headerLine = document.createElement('div'); headerLine.innerHTML = '' + escapeHtml(formatTimestamp(ts)) + '' + - 'Tool ' + + 'tool ' + '' + escapeHtml(toolName) + '' + (incomplete ? 'did not complete' : ''); @@ -1942,7 +1926,7 @@ if (args && Object.keys(args).length > 0) { const argsLabel = document.createElement('div'); argsLabel.className = 'tool-section-label'; - argsLabel.textContent = 'Args'; + argsLabel.textContent = 'args'; details.appendChild(argsLabel); const argsPre = document.createElement('pre'); argsPre.textContent = JSON.stringify(args, null, 2); @@ -1952,7 +1936,7 @@ if (result) { const resultLabel = document.createElement('div'); resultLabel.className = 'tool-section-label'; - resultLabel.textContent = 'Result'; + resultLabel.textContent = 'result'; details.appendChild(resultLabel); const resultPre = document.createElement('pre'); resultPre.textContent = result; @@ -1978,7 +1962,7 @@ let html = '' + escapeHtml(formatTimestamp(event.ts)) + '' + - 'Error ' + + 'error ' + '' + escapeHtml(event.error || 'Unknown error') + ''; if (event.trace) { @@ -2009,7 +1993,7 @@ const label = document.createElement('span'); label.className = 'event-label'; - label.textContent = 'Result'; + label.textContent = 'result'; block.appendChild(label); if (event.result && event.result.trim()) { diff --git a/apps/calendar/_day.html b/apps/calendar/_day.html index 459a8e4b0..fa8c93c34 100644 --- a/apps/calendar/_day.html +++ b/apps/calendar/_day.html @@ -113,8 +113,6 @@ margin: 0 0 0.5em 0; font-size: 0.85em; color: #666; - text-transform: uppercase; - letter-spacing: 0.5px; } .all-day-cards { @@ -494,7 +492,7 @@ let html = ''; if (untimedEvents.length) { - html += '

All Day / Scheduled

'; + html += '

all day / scheduled

'; untimedEvents.forEach((o, i) => { const idx = list.indexOf(o); const isPlanned = o.occurred === false; diff --git a/apps/dev/workspace.html b/apps/dev/workspace.html index 8701df416..1d86c5fbf 100644 --- a/apps/dev/workspace.html +++ b/apps/dev/workspace.html @@ -138,8 +138,6 @@ .dev-stat-label { font-size: 0.75rem; color: #6b7280; - text-transform: uppercase; - letter-spacing: 0.05em; margin-top: 0.25rem; } @@ -524,11 +522,11 @@ function showStats() { statsEl.innerHTML = `
${count}
-
Active Notifications
+
active notifications
${lastNotificationId || 'N/A'}
-
Last ID
+
last id
`; log(`Stats: ${count} active notifications`); diff --git a/apps/entities/workspace.html b/apps/entities/workspace.html index ac1babd9e..951f6eb89 100644 --- a/apps/entities/workspace.html +++ b/apps/entities/workspace.html @@ -20,8 +20,6 @@ font-size: 0.85em; font-weight: 600; color: #6c757d; - text-transform: uppercase; - letter-spacing: 0.05em; margin-bottom: 0.75em; padding-bottom: 0.5em; border-bottom: 1px solid #e9ecef; @@ -276,8 +274,6 @@ font-size: 0.9em; font-weight: 600; color: #495057; - text-transform: uppercase; - letter-spacing: 0.05em; } /* Description section */ @@ -1009,7 +1005,7 @@ tr:hover .entity-delete-btn {

- Detected Entities + detected entities

@@ -1041,12 +1037,12 @@ tr:hover .entity-delete-btn {
-

Description

+

description

-

Observations

+

observations

@@ -1055,7 +1051,7 @@ tr:hover .entity-delete-btn {