diff --git a/TASKS.md b/TASKS.md index c2f56e4..c10ccf2 100644 --- a/TASKS.md +++ b/TASKS.md @@ -2,19 +2,19 @@ ## Current -### `feat/manual-regression-pass` +### `feat/post-regression-fixes` Status: completed DoD: -- Playwright regression suite passes for the Alpine UI shell -- manual smoke checklist exists for auth, workspace, operations, agents, API keys, logs, usage, secrets, wizard, streaming -- public smoke targets are linked from the regression checklist -- docs and TASKS reflect the current post-streaming baseline +- misleading non-functional UI actions are clearly marked or disabled +- login page no longer suggests working password-reset/SSO/request-access flows +- settings planned capabilities look explicitly read-only and non-interactive +- node checks, UI docker build, affected Playwright specs and workspace check pass ## Next -- `feat/post-regression-fixes` +- `feat/deploy-and-staging-smoke` ## Backlog diff --git a/apps/ui/css/login.css b/apps/ui/css/login.css index 3cb948c..9b00f7f 100644 --- a/apps/ui/css/login.css +++ b/apps/ui/css/login.css @@ -61,7 +61,18 @@ .login-sub { font-size: 13.5px; color: var(--text-muted); - margin-bottom: 28px; + margin-bottom: 12px; +} + +.login-note { + margin-bottom: 24px; + padding: 10px 12px; + border-radius: 9px; + background: rgba(59, 130, 246, 0.08); + border: 1px solid rgba(59, 130, 246, 0.18); + color: var(--text-secondary); + font-size: 12.5px; + line-height: 1.5; } .field { @@ -103,13 +114,31 @@ } .field-link { + display: inline-flex; + align-items: center; + gap: 8px; font-size: 12px; color: var(--accent); text-decoration: none; + background: transparent; + border: none; + padding: 0; } .field-link:hover { text-decoration: underline; } +.field-link.is-disabled, +.field-link:disabled { + color: var(--text-muted); + cursor: not-allowed; + text-decoration: none; +} + +.field-link.is-disabled:hover, +.field-link:disabled:hover { + text-decoration: none; +} + .btn-signin { width: 100%; padding: 10px; @@ -184,9 +213,49 @@ .btn-sso:hover { background: var(--bg-muted); color: var(--text-primary); } +.btn-sso:disabled { + cursor: not-allowed; + opacity: 0.7; + background: var(--bg-overlay); + color: var(--text-muted); +} + +.btn-sso:disabled:hover { + background: var(--bg-overlay); + color: var(--text-muted); +} + +.login-inline-badge { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 2px 7px; + border-radius: 999px; + border: 1px solid rgba(148, 163, 184, 0.24); + background: rgba(148, 163, 184, 0.08); + color: var(--text-muted); + font-size: 10px; + font-weight: 700; + letter-spacing: 0.02em; + text-transform: uppercase; +} + .version-badge { text-align: center; margin-top: 28px; font-size: 11.5px; color: var(--text-muted); } + +.login-footer-action { + display: inline-flex; + align-items: center; + gap: 8px; + margin-left: 6px; + color: var(--text-muted); + background: transparent; + border: none; + padding: 0; + cursor: not-allowed; + font: inherit; +} diff --git a/apps/ui/css/settings.css b/apps/ui/css/settings.css index 452ddc1..339a2aa 100644 --- a/apps/ui/css/settings.css +++ b/apps/ui/css/settings.css @@ -142,3 +142,64 @@ .role-admin { background: rgba(13,148,136,0.1); border-color: rgba(13,148,136,0.25); color: var(--accent); } .role-member { background: var(--bg-overlay); border-color: var(--border); color: var(--text-muted); } .role-viewer { background: rgba(88,166,255,0.07); border-color: var(--blue-border); color: var(--blue); } + +.planned-section-title { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 12px; + font-size: 13.5px; + font-weight: 600; + color: var(--text-primary); +} + +.planned-badge { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 2px 8px; + border-radius: 999px; + border: 1px solid rgba(245, 158, 11, 0.24); + background: rgba(245, 158, 11, 0.09); + color: var(--amber); + font-size: 10px; + font-weight: 700; + letter-spacing: 0.02em; + text-transform: uppercase; +} + +.planned-badge.small { + padding: 1px 7px; +} + +.planned-list { + display: grid; + gap: 12px; +} + +.planned-item { + padding: 14px 16px; + border-radius: var(--radius); + border: 1px solid var(--border); + background: rgba(255, 255, 255, 0.02); +} + +.planned-item-head { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 10px; + margin-bottom: 6px; +} + +.planned-item-title { + font-size: 13px; + font-weight: 600; + color: var(--text-primary); +} + +.planned-item-desc { + font-size: 12.5px; + line-height: 1.5; + color: var(--text-muted); +} diff --git a/apps/ui/html/login.html b/apps/ui/html/login.html index ea49dbb..5a406e3 100644 --- a/apps/ui/html/login.html +++ b/apps/ui/html/login.html @@ -26,6 +26,7 @@
Sign in
Welcome back to your workspace
+
This build supports password sign-in only. Password reset, Google SSO and self-service access requests are not wired yet.
Invalid email or password. Please try again. @@ -41,7 +42,10 @@
@@ -54,7 +58,7 @@
-
Crank v0.9.0-beta
diff --git a/apps/ui/html/settings.html b/apps/ui/html/settings.html index 3100b6a..9cebd9e 100644 --- a/apps/ui/html/settings.html +++ b/apps/ui/html/settings.html @@ -276,7 +276,10 @@
-
Planned security capabilities
+
+ Planned security capabilities + Planned +
@@ -307,7 +310,10 @@
-
Notification preferences
+
+ Notification preferences + Planned +
@@ -321,15 +327,24 @@
-
Operation error spike
+
+
Operation error spike
+ Planned +
Alert when error rate exceeds a rolling threshold for a published tool.
-
Upstream latency degradation
+
+
Upstream latency degradation
+ Planned +
Notify operators when p99 latency rises sharply above the baseline.
-
Quota and usage digests
+
+
Quota and usage digests
+ Planned +
Deliver periodic summaries for quota consumption, errors and workspace activity.
diff --git a/apps/ui/js/i18n.js b/apps/ui/js/i18n.js index 08795de..7a97dc7 100644 --- a/apps/ui/js/i18n.js +++ b/apps/ui/js/i18n.js @@ -407,6 +407,7 @@ var TRANSLATIONS = { 'settings.notifications.title': 'Notification preferences', 'settings.notifications.not_ready_title': 'Notifications are not wired yet.', 'settings.notifications.not_ready_body': 'Alert routing and per-user preferences are planned, but this build does not persist or deliver notification settings.', + 'settings.planned_badge': 'Planned', 'settings.notifications.spike_title': 'Operation error spike', 'settings.notifications.spike_body': 'Alert when error rate exceeds a rolling threshold for a published tool.', 'settings.notifications.latency_title': 'Upstream latency degradation', @@ -924,6 +925,8 @@ var TRANSLATIONS = { 'login.sso_short': 'Google SSO', 'login.request_prefix': "Don't have an account?", 'login.request_link': 'Request access', + 'login.planned_badge': 'Planned', + 'login.password_only': 'This build supports password sign-in only. Password reset, Google SSO and self-service access requests are not wired yet.', 'login.error.required': 'Please enter your email and password.', 'login.error.invalid': 'Invalid email or password. Please try again.', 'login.error.generic': 'Unable to sign in right now. Please try again.', @@ -1332,6 +1335,7 @@ var TRANSLATIONS = { 'settings.notifications.title': 'Настройки уведомлений', 'settings.notifications.not_ready_title': 'Уведомления пока не подключены.', 'settings.notifications.not_ready_body': 'Маршрутизация алертов и настройки на пользователя запланированы, но эта сборка не сохраняет и не доставляет notification settings.', + 'settings.planned_badge': 'Запланировано', 'settings.notifications.spike_title': 'Всплеск ошибок операции', 'settings.notifications.spike_body': 'Алерт, когда доля ошибок превышает скользящий порог для опубликованного инструмента.', 'settings.notifications.latency_title': 'Деградация задержки upstream', @@ -1848,6 +1852,8 @@ var TRANSLATIONS = { 'login.sso_short': 'Google SSO', 'login.request_prefix': 'Нет аккаунта?', 'login.request_link': 'Запросить доступ', + 'login.planned_badge': 'Запланировано', + 'login.password_only': 'В этой сборке доступен только вход по паролю. Сброс пароля, Google SSO и самостоятельный запрос доступа пока не подключены.', 'login.error.required': 'Введите email и пароль.', 'login.error.invalid': 'Неверный email или пароль. Попробуйте еще раз.', 'login.error.generic': 'Сейчас не удается войти. Попробуйте еще раз.',