From 9ed681d067469c71b34ae00399bb97f2c6c3f6a1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 26 Jan 2026 00:42:56 +0000 Subject: [PATCH 1/3] Initial plan From 7833f8a0500bbdfab8093e6559216929dd09f1f8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 26 Jan 2026 00:51:04 +0000 Subject: [PATCH 2/3] Add Trust HUD, Ethics Drawer, Data Provenance, Risk Safety, and Mini-map modules Co-authored-by: HeadyConnection <250789142+HeadyConnection@users.noreply.github.com> --- .../apps/heady_admin_ui/css/animations.css | 35 ++ .../heady_admin_ui/css/data-provenance.css | 272 ++++++++++ .../apps/heady_admin_ui/css/ethics-drawer.css | 267 ++++++++++ .../apps/heady_admin_ui/css/mini-map.css | 491 ++++++++++++++++++ .../apps/heady_admin_ui/css/risk-safety.css | 313 +++++++++++ .../apps/heady_admin_ui/css/trust-hud.css | 281 ++++++++++ .../apps/heady_admin_ui/index.html | 10 + .../apps/heady_admin_ui/js/data-provenance.js | 309 +++++++++++ .../apps/heady_admin_ui/js/ethics-drawer.js | 218 ++++++++ .../apps/heady_admin_ui/js/main.js | 12 + .../apps/heady_admin_ui/js/mini-map.js | 376 ++++++++++++++ .../apps/heady_admin_ui/js/risk-safety.js | 281 ++++++++++ .../apps/heady_admin_ui/js/trust-hud.js | 331 ++++++++++++ 13 files changed, 3196 insertions(+) create mode 100644 HeadySystems_v13/apps/heady_admin_ui/css/data-provenance.css create mode 100644 HeadySystems_v13/apps/heady_admin_ui/css/ethics-drawer.css create mode 100644 HeadySystems_v13/apps/heady_admin_ui/css/mini-map.css create mode 100644 HeadySystems_v13/apps/heady_admin_ui/css/risk-safety.css create mode 100644 HeadySystems_v13/apps/heady_admin_ui/css/trust-hud.css create mode 100644 HeadySystems_v13/apps/heady_admin_ui/js/data-provenance.js create mode 100644 HeadySystems_v13/apps/heady_admin_ui/js/ethics-drawer.js create mode 100644 HeadySystems_v13/apps/heady_admin_ui/js/mini-map.js create mode 100644 HeadySystems_v13/apps/heady_admin_ui/js/risk-safety.js create mode 100644 HeadySystems_v13/apps/heady_admin_ui/js/trust-hud.js diff --git a/HeadySystems_v13/apps/heady_admin_ui/css/animations.css b/HeadySystems_v13/apps/heady_admin_ui/css/animations.css index e17441eb..258ec846 100644 --- a/HeadySystems_v13/apps/heady_admin_ui/css/animations.css +++ b/HeadySystems_v13/apps/heady_admin_ui/css/animations.css @@ -769,3 +769,38 @@ .jello { animation: jello 1s ease-in-out; } + +/* ======================================== + Enhanced Reduced Motion Support + ======================================== */ + +/* When reduce-motion class is on body, disable all animations */ +body.reduce-motion *, +body.reduce-motion *::before, +body.reduce-motion *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; +} + +/* Keep essential transitions for usability */ +body.reduce-motion button, +body.reduce-motion a, +body.reduce-motion input, +body.reduce-motion select { + transition: background-color 0.15s ease, color 0.15s ease, opacity 0.15s ease !important; +} + +/* Replace pulses with gentle fades */ +body.reduce-motion .pulse, +body.reduce-motion .pulse-success, +body.reduce-motion .pulse-info, +body.reduce-motion .pulse-warning { + animation: gentle-fade 3s ease-in-out infinite; +} + +@keyframes gentle-fade { + 0%, 100% { opacity: 0.8; } + 50% { opacity: 1; } +} + diff --git a/HeadySystems_v13/apps/heady_admin_ui/css/data-provenance.css b/HeadySystems_v13/apps/heady_admin_ui/css/data-provenance.css new file mode 100644 index 00000000..9e34a6bc --- /dev/null +++ b/HeadySystems_v13/apps/heady_admin_ui/css/data-provenance.css @@ -0,0 +1,272 @@ +/* ======================================== + Data Provenance Styles + ======================================== */ + +.provenance-pills { + display: flex; + gap: var(--spacing-sm); + margin: var(--spacing-md) 0; + flex-wrap: wrap; +} + +.provenance-pill { + display: inline-flex; + align-items: center; + gap: var(--spacing-xs); + padding: var(--spacing-xs) var(--spacing-sm); + border-radius: var(--radius-full); + font-size: 0.8rem; + font-weight: 500; + cursor: pointer; + position: relative; + transition: all 0.2s ease; +} + +.provenance-pill.local-data { + background: rgba(16, 185, 129, 0.2); + border: 1px solid rgba(16, 185, 129, 0.4); + color: var(--color-success); +} + +.provenance-pill.remote-data { + background: rgba(59, 130, 246, 0.2); + border: 1px solid rgba(59, 130, 246, 0.4); + color: var(--color-info); +} + +.provenance-pill:hover { + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); +} + +.pill-icon { + font-size: 1rem; +} + +.pill-label { + white-space: nowrap; +} + +.pill-arrow { + font-size: 0.9rem; + margin-left: var(--spacing-xs); +} + +.pill-arrow.animate-flow { + animation: flow-arrow 2s ease-in-out infinite; +} + +@keyframes flow-arrow { + 0%, 100% { + opacity: 0.6; + transform: translateX(0); + } + 50% { + opacity: 1; + transform: translateX(3px); + } +} + +.pill-tooltip { + position: absolute; + top: calc(100% + 8px); + left: 50%; + transform: translateX(-50%); + background: rgba(0, 0, 0, 0.95); + color: white; + padding: var(--spacing-md); + border-radius: var(--radius-md); + min-width: 200px; + max-width: 300px; + z-index: 100; + opacity: 0; + pointer-events: none; + transition: opacity 0.2s ease; + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3); +} + +.pill-tooltip.visible { + opacity: 1; +} + +.pill-tooltip::before { + content: ''; + position: absolute; + top: -6px; + left: 50%; + transform: translateX(-50%); + width: 0; + height: 0; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid rgba(0, 0, 0, 0.95); +} + +.pill-tooltip strong { + display: block; + margin-bottom: var(--spacing-sm); + font-size: 0.9rem; +} + +.pill-tooltip ul { + margin: 0; + padding-left: var(--spacing-md); + font-size: 0.85rem; + line-height: 1.6; +} + +.pill-tooltip li { + margin-bottom: var(--spacing-xs); +} + +/* Math Tooltips */ +.has-math-tooltip { + cursor: help; + position: relative; +} + +.has-math-tooltip::after { + content: 'π'; + position: absolute; + top: -8px; + right: -8px; + font-size: 0.8rem; + opacity: 0.5; + transition: opacity 0.2s ease; +} + +.has-math-tooltip:hover::after { + opacity: 1; +} + +.math-tooltip { + position: absolute; + background: var(--bg-card); + backdrop-filter: blur(20px); + border: 1px solid var(--border-color); + border-radius: var(--radius-md); + padding: var(--spacing-md); + min-width: 250px; + box-shadow: var(--shadow-xl); + z-index: 999; +} + +.math-tooltip-header { + padding-bottom: var(--spacing-sm); + margin-bottom: var(--spacing-sm); + border-bottom: 1px solid var(--border-color); + font-size: 0.95rem; +} + +.math-tooltip-row { + display: flex; + justify-content: space-between; + padding: var(--spacing-xs) 0; + font-size: 0.85rem; +} + +.math-tooltip-row .label { + color: var(--text-secondary); + font-weight: 500; +} + +.math-tooltip-row .value { + color: var(--text-primary); + font-weight: 600; +} + +.math-tooltip-row .value.scope-local { + color: var(--color-success); +} + +.math-tooltip-row .value.scope-remote { + color: var(--color-info); +} + +/* Enhanced Notifications */ +.enhanced-notification { + padding: var(--spacing-md); + border-radius: var(--radius-md); + background: rgba(255, 255, 255, 0.05); + margin-bottom: var(--spacing-sm); +} + +.notification-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--spacing-xs); +} + +.notification-source { + font-size: 0.75rem; + color: var(--text-secondary); + display: flex; + align-items: center; + gap: var(--spacing-xs); +} + +.lineage-icon { + font-size: 0.9rem; + cursor: help; +} + +.notification-meta { + display: flex; + gap: var(--spacing-md); + margin-top: var(--spacing-sm); + font-size: 0.75rem; +} + +.notification-severity { + padding: 2px var(--spacing-xs); + border-radius: var(--radius-sm); + font-weight: 500; +} + +.notification-severity.success { + background: rgba(16, 185, 129, 0.2); + color: var(--color-success); +} + +.notification-severity.info { + background: rgba(59, 130, 246, 0.2); + color: var(--color-info); +} + +.notification-severity.warning { + background: rgba(245, 158, 11, 0.2); + color: var(--color-warning); +} + +.notification-reason { + color: var(--text-secondary); +} + +/* Responsive */ +@media (max-width: 768px) { + .pill-tooltip { + left: 0; + transform: none; + max-width: 90vw; + } + + .pill-tooltip::before { + left: var(--spacing-md); + } + + .math-tooltip { + max-width: 90vw; + } +} + +/* Reduced motion support */ +@media (prefers-reduced-motion: reduce) { + .pill-arrow.animate-flow { + animation: none; + } + + .provenance-pill:hover { + transform: none; + } +} diff --git a/HeadySystems_v13/apps/heady_admin_ui/css/ethics-drawer.css b/HeadySystems_v13/apps/heady_admin_ui/css/ethics-drawer.css new file mode 100644 index 00000000..4023dc88 --- /dev/null +++ b/HeadySystems_v13/apps/heady_admin_ui/css/ethics-drawer.css @@ -0,0 +1,267 @@ +/* ======================================== + Ethics Drawer Styles + ======================================== */ + +.ethics-drawer { + position: fixed; + top: 0; + right: 0; + height: 100vh; + width: 400px; + max-width: 90vw; + z-index: 999; + pointer-events: none; + transform: translateX(100%); + transition: transform 0.3s ease; +} + +.ethics-drawer.open { + pointer-events: all; + transform: translateX(0); +} + +.ethics-drawer-content { + height: 100%; + background: var(--bg-card); + backdrop-filter: blur(20px); + border-left: 1px solid var(--border-color); + display: flex; + flex-direction: column; + overflow: hidden; + box-shadow: -10px 0 30px rgba(0, 0, 0, 0.3); +} + +.ethics-drawer-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--spacing-lg); + border-bottom: 1px solid var(--border-color); + background: rgba(99, 102, 241, 0.1); +} + +.ethics-drawer-header h2 { + display: flex; + align-items: center; + gap: var(--spacing-sm); + font-size: 1.5rem; + margin: 0; +} + +.ethics-drawer-close { + background: none; + border: none; + color: var(--text-primary); + font-size: 1.5rem; + cursor: pointer; + padding: var(--spacing-xs); + border-radius: 50%; + transition: all 0.2s ease; + line-height: 1; +} + +.ethics-drawer-close:hover { + background: rgba(255, 255, 255, 0.1); + transform: rotate(90deg); +} + +.ethics-drawer-body { + flex: 1; + overflow-y: auto; + padding: var(--spacing-lg); +} + +.ethics-intro { + color: var(--text-secondary); + font-size: 0.95rem; + margin-bottom: var(--spacing-xl); + padding: var(--spacing-md); + background: rgba(99, 102, 241, 0.1); + border-left: 3px solid var(--color-primary); + border-radius: var(--radius-sm); +} + +.ethics-principles { + display: flex; + flex-direction: column; + gap: var(--spacing-lg); + margin-bottom: var(--spacing-2xl); +} + +.ethics-principle { + display: flex; + gap: var(--spacing-md); + padding: var(--spacing-md); + background: rgba(255, 255, 255, 0.05); + border-radius: var(--radius-md); + transition: all 0.2s ease; +} + +.ethics-principle:hover { + background: rgba(255, 255, 255, 0.08); + transform: translateX(-5px); +} + +.principle-icon { + font-size: 2rem; + flex-shrink: 0; +} + +.principle-content h3 { + font-size: 1.1rem; + margin-bottom: var(--spacing-xs); + color: var(--text-primary); +} + +.principle-content p { + font-size: 0.9rem; + color: var(--text-secondary); + line-height: 1.5; + margin-bottom: var(--spacing-sm); +} + +.principle-link { + font-size: 0.85rem; + color: var(--color-primary); + text-decoration: none; + font-weight: 500; + transition: color 0.2s ease; +} + +.principle-link:hover { + color: var(--color-secondary); + text-decoration: underline; +} + +.ethics-footer { + border-top: 1px solid var(--border-color); + padding-top: var(--spacing-lg); + display: flex; + flex-direction: column; + gap: var(--spacing-sm); +} + +.ethics-footer p { + margin: 0; +} + +.ethics-footer a { + color: var(--color-primary); + text-decoration: none; + transition: color 0.2s ease; +} + +.ethics-footer a:hover { + color: var(--color-secondary); +} + +.ethics-drawer-overlay { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background: rgba(0, 0, 0, 0.5); + opacity: 0; + transition: opacity 0.3s ease; + pointer-events: none; + z-index: -1; +} + +.ethics-drawer.open .ethics-drawer-overlay { + opacity: 1; + pointer-events: all; +} + +/* Ethics Drawer Toggle Button */ +.ethics-drawer-toggle { + display: flex; + align-items: center; + gap: var(--spacing-xs); + padding: var(--spacing-sm) var(--spacing-md); + background: var(--gradient-purple); + border: none; + border-radius: var(--radius-md); + color: white; + font-size: 0.9rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + box-shadow: 0 2px 8px rgba(99, 102, 241, 0.3); +} + +.ethics-drawer-toggle:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.4); +} + +.ethics-drawer-toggle:focus { + outline: 2px solid var(--color-primary); + outline-offset: 2px; +} + +.ethics-drawer-toggle .label { + font-size: 0.85rem; +} + +/* Ethics Notes */ +.ethics-note { + display: flex; + align-items: flex-start; + gap: var(--spacing-xs); + padding: var(--spacing-sm); + margin-top: var(--spacing-sm); + background: rgba(245, 158, 11, 0.1); + border-left: 3px solid var(--color-warning); + border-radius: var(--radius-sm); + font-size: 0.85rem; + color: var(--text-secondary); +} + +.ethics-note-icon { + flex-shrink: 0; + font-size: 1rem; +} + +.ethics-note-text { + line-height: 1.4; +} + +/* Responsive */ +@media (max-width: 768px) { + .ethics-drawer { + width: 100vw; + } + + .ethics-drawer-toggle .label { + display: none; + } + + .ethics-drawer-toggle { + padding: var(--spacing-sm); + border-radius: 50%; + width: 40px; + height: 40px; + justify-content: center; + } +} + +/* Reduced motion support */ +@media (prefers-reduced-motion: reduce) { + .ethics-drawer { + transition: none; + } + + .ethics-drawer-overlay { + transition: none; + } + + .ethics-drawer-close:hover, + .ethics-drawer-toggle:hover { + transform: none; + } + + .ethics-principle:hover { + transform: none; + } +} diff --git a/HeadySystems_v13/apps/heady_admin_ui/css/mini-map.css b/HeadySystems_v13/apps/heady_admin_ui/css/mini-map.css new file mode 100644 index 00000000..20d1a0d4 --- /dev/null +++ b/HeadySystems_v13/apps/heady_admin_ui/css/mini-map.css @@ -0,0 +1,491 @@ +/* ======================================== + Mini-map & Navigation Styles + ======================================== */ + +.mini-map { + position: fixed; + right: var(--spacing-lg); + top: 50%; + transform: translateY(-50%); + z-index: 998; + display: flex; + flex-direction: column; + gap: var(--spacing-xs); + transition: all 0.3s ease; +} + +.mini-map.minimized .mini-map-items { + opacity: 0; + pointer-events: none; + transform: translateX(100px); +} + +.mini-map-toggle { + background: var(--bg-card); + backdrop-filter: blur(20px); + border: 1px solid var(--border-color); + border-radius: 50%; + width: 48px; + height: 48px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.2s ease; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); + align-self: flex-end; +} + +.mini-map-toggle:hover { + background: var(--bg-card-hover); + transform: scale(1.1); +} + +.mini-map-toggle .icon { + font-size: 1.5rem; +} + +.mini-map-items { + display: flex; + flex-direction: column; + gap: var(--spacing-xs); + transition: all 0.3s ease; +} + +.mini-map-item { + background: var(--bg-card); + backdrop-filter: blur(20px); + border: 1px solid var(--border-color); + border-radius: var(--radius-md); + padding: var(--spacing-sm) var(--spacing-md); + display: flex; + align-items: center; + gap: var(--spacing-sm); + cursor: pointer; + transition: all 0.2s ease; + color: var(--text-secondary); + font-size: 0.9rem; + min-width: 200px; + position: relative; + overflow: hidden; +} + +.mini-map-item:hover { + background: var(--bg-card-hover); + color: var(--text-primary); + transform: translateX(-5px); + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.2); +} + +.mini-map-item.active { + background: rgba(99, 102, 241, 0.2); + border-color: var(--color-primary); + color: var(--text-primary); +} + +.mini-map-item.active::before { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 3px; + background: var(--color-primary); +} + +.item-icon { + font-size: 1.2rem; +} + +.item-label { + flex: 1; + font-weight: 500; +} + +.item-key { + font-size: 0.7rem; + padding: 2px var(--spacing-xs); + background: rgba(255, 255, 255, 0.1); + border-radius: var(--radius-sm); + font-family: var(--font-mono); +} + +/* Section Highlight Effect */ +.section-highlight { + animation: highlight-section 2s ease; +} + +@keyframes highlight-section { + 0%, 100% { + box-shadow: none; + } + 50% { + box-shadow: 0 0 30px rgba(99, 102, 241, 0.5); + } +} + +/* Settings Panel */ +.settings-panel { + position: fixed; + top: 0; + right: 0; + width: 450px; + max-width: 90vw; + height: 100vh; + background: var(--bg-card); + backdrop-filter: blur(20px); + border-left: 1px solid var(--border-color); + box-shadow: -10px 0 30px rgba(0, 0, 0, 0.3); + z-index: 1000; + display: flex; + flex-direction: column; + overflow: hidden; +} + +.settings-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--spacing-lg); + border-bottom: 1px solid var(--border-color); + background: rgba(99, 102, 241, 0.1); +} + +.settings-header h2 { + display: flex; + align-items: center; + gap: var(--spacing-sm); + margin: 0; + font-size: 1.5rem; +} + +.settings-close { + background: none; + border: none; + color: var(--text-primary); + font-size: 1.5rem; + cursor: pointer; + padding: var(--spacing-xs); + border-radius: 50%; + transition: all 0.2s ease; + line-height: 1; +} + +.settings-close:hover { + background: rgba(255, 255, 255, 0.1); + transform: rotate(90deg); +} + +.settings-body { + flex: 1; + overflow-y: auto; + padding: var(--spacing-lg); +} + +.settings-section { + margin-bottom: var(--spacing-2xl); +} + +.settings-section h3 { + font-size: 1.1rem; + margin-bottom: var(--spacing-lg); + color: var(--text-primary); + padding-bottom: var(--spacing-sm); + border-bottom: 2px solid var(--border-color); +} + +.setting-item { + margin-bottom: var(--spacing-lg); +} + +.setting-label { + display: flex; + align-items: center; + gap: var(--spacing-sm); + font-size: 0.95rem; + font-weight: 500; + color: var(--text-primary); + cursor: pointer; + margin-bottom: var(--spacing-sm); +} + +.setting-label input[type="checkbox"] { + width: 18px; + height: 18px; + cursor: pointer; +} + +.setting-label input[type="range"] { + width: 100%; + margin: var(--spacing-sm) 0; +} + +.retention-display { + display: flex; + align-items: center; + gap: var(--spacing-sm); + font-size: 0.9rem; + color: var(--text-secondary); + margin-top: var(--spacing-xs); +} + +#retention-value { + font-weight: 600; + color: var(--text-primary); +} + +.risk-band { + padding: 2px var(--spacing-xs); + border-radius: var(--radius-sm); + font-size: 0.75rem; + font-weight: 500; +} + +.risk-band.low { + background: rgba(16, 185, 129, 0.2); + color: var(--color-success); +} + +.risk-band.medium { + background: rgba(245, 158, 11, 0.2); + color: var(--color-warning); +} + +.risk-band.high { + background: rgba(239, 68, 68, 0.2); + color: var(--color-error); +} + +.outbound-list { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); +} + +.outbound-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--spacing-sm); + background: rgba(255, 255, 255, 0.05); + border-radius: var(--radius-sm); +} + +.outbound-name { + font-size: 0.9rem; + color: var(--text-primary); +} + +.outbound-status { + font-size: 0.8rem; + padding: 2px var(--spacing-xs); + border-radius: var(--radius-sm); + font-weight: 500; +} + +.outbound-status.active { + background: rgba(16, 185, 129, 0.2); + color: var(--color-success); +} + +.outbound-status.inactive { + background: rgba(107, 114, 128, 0.2); + color: var(--text-secondary); +} + +.setting-link { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--spacing-sm) var(--spacing-md); + background: rgba(255, 255, 255, 0.05); + border-radius: var(--radius-md); + color: var(--color-primary); + text-decoration: none; + transition: all 0.2s ease; +} + +.setting-link:hover { + background: rgba(255, 255, 255, 0.1); + transform: translateX(5px); +} + +.sync-status { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: var(--spacing-sm); + background: rgba(255, 255, 255, 0.05); + border-radius: var(--radius-sm); +} + +.sync-label { + font-size: 0.9rem; + color: var(--text-secondary); +} + +.sync-chip { + display: flex; + align-items: center; + gap: var(--spacing-xs); + padding: 4px var(--spacing-sm); + border-radius: var(--radius-sm); + font-size: 0.8rem; + font-weight: 500; +} + +.sync-chip.saved { + background: rgba(16, 185, 129, 0.2); + color: var(--color-success); +} + +.sync-icon { + font-size: 0.9rem; +} + +/* Theme Swatches */ +.theme-swatches, +.accent-swatches { + display: flex; + gap: var(--spacing-sm); + margin-top: var(--spacing-sm); +} + +.theme-swatch { + display: flex; + flex-direction: column; + align-items: center; + gap: var(--spacing-xs); + padding: var(--spacing-sm); + background: rgba(255, 255, 255, 0.05); + border: 2px solid transparent; + border-radius: var(--radius-md); + cursor: pointer; + transition: all 0.2s ease; +} + +.theme-swatch:hover { + background: rgba(255, 255, 255, 0.1); +} + +.theme-swatch.active { + border-color: var(--color-primary); + background: rgba(99, 102, 241, 0.1); +} + +.swatch-color { + width: 40px; + height: 40px; + border-radius: 50%; + border: 2px solid var(--border-color); +} + +.swatch-label { + font-size: 0.85rem; + color: var(--text-secondary); +} + +.accent-swatch { + width: 48px; + height: 48px; + border-radius: 50%; + border: 3px solid transparent; + cursor: pointer; + transition: all 0.2s ease; +} + +.accent-swatch:hover { + transform: scale(1.1); + border-color: white; +} + +/* Shortcuts List */ +.shortcuts-list { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + margin-bottom: var(--spacing-lg); +} + +.shortcut-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--spacing-sm); + background: rgba(255, 255, 255, 0.05); + border-radius: var(--radius-sm); +} + +.shortcut-action { + font-size: 0.9rem; + color: var(--text-secondary); +} + +kbd { + padding: 4px var(--spacing-sm); + background: rgba(255, 255, 255, 0.1); + border: 1px solid var(--border-color); + border-radius: var(--radius-sm); + font-family: var(--font-mono); + font-size: 0.8rem; + color: var(--text-primary); +} + +.reset-shortcuts { + padding: var(--spacing-sm) var(--spacing-lg); + background: rgba(255, 255, 255, 0.1); + border: 1px solid var(--border-color); + border-radius: var(--radius-md); + color: var(--text-primary); + cursor: pointer; + transition: all 0.2s ease; + width: 100%; +} + +.reset-shortcuts:hover { + background: rgba(255, 255, 255, 0.15); +} + +/* Responsive */ +@media (max-width: 768px) { + .mini-map { + right: var(--spacing-sm); + } + + .mini-map-item { + min-width: 50px; + padding: var(--spacing-sm); + } + + .item-label, + .item-key { + display: none; + } + + .mini-map.minimized .mini-map-items { + transform: translateX(70px); + } + + .settings-panel { + width: 100vw; + } +} + +/* Reduced motion support */ +@media (prefers-reduced-motion: reduce) { + .mini-map-toggle:hover { + transform: none; + } + + .mini-map-item:hover { + transform: none; + } + + .settings-close:hover { + transform: none; + } + + .highlight-section { + animation: none; + } +} diff --git a/HeadySystems_v13/apps/heady_admin_ui/css/risk-safety.css b/HeadySystems_v13/apps/heady_admin_ui/css/risk-safety.css new file mode 100644 index 00000000..0705cf3b --- /dev/null +++ b/HeadySystems_v13/apps/heady_admin_ui/css/risk-safety.css @@ -0,0 +1,313 @@ +/* ======================================== + Risk & Safety Styles + ======================================== */ + +.has-risk-badge { + position: relative; +} + +.risk-badge { + position: absolute; + top: -6px; + right: -6px; + width: 20px; + height: 20px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.7rem; + pointer-events: none; + z-index: 10; + animation: pulse-badge 2s ease-in-out infinite; +} + +.risk-badge.risk-high { + background: var(--color-error); + box-shadow: 0 0 10px rgba(239, 68, 68, 0.5); +} + +.risk-badge.risk-medium { + background: var(--color-warning); + box-shadow: 0 0 10px rgba(245, 158, 11, 0.5); +} + +.risk-badge.risk-low { + background: var(--color-info); + box-shadow: 0 0 10px rgba(59, 130, 246, 0.5); +} + +@keyframes pulse-badge { + 0%, 100% { + transform: scale(1); + opacity: 1; + } + 50% { + transform: scale(1.1); + opacity: 0.9; + } +} + +/* Risk Tooltip */ +.risk-tooltip { + background: var(--bg-card); + backdrop-filter: blur(20px); + border: 1px solid var(--border-color); + border-radius: var(--radius-md); + overflow: hidden; + box-shadow: var(--shadow-xl); + min-width: 200px; + max-width: 300px; +} + +.risk-tooltip-header { + padding: var(--spacing-sm) var(--spacing-md); + font-weight: 600; + font-size: 0.85rem; +} + +.risk-tooltip-header.high { + background: rgba(239, 68, 68, 0.2); + color: var(--color-error); +} + +.risk-tooltip-header.medium { + background: rgba(245, 158, 11, 0.2); + color: var(--color-warning); +} + +.risk-tooltip-header.low { + background: rgba(59, 130, 246, 0.2); + color: var(--color-info); +} + +.risk-tooltip-body { + padding: var(--spacing-md); + font-size: 0.85rem; + color: var(--text-secondary); + line-height: 1.4; +} + +/* Risk Interstitial */ +.risk-interstitial-overlay { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background: rgba(0, 0, 0, 0.7); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + backdrop-filter: blur(5px); +} + +.risk-interstitial { + max-width: 500px; + width: 90%; + background: var(--bg-card); + backdrop-filter: blur(20px); + border: 1px solid var(--border-color); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-xl); + overflow: hidden; +} + +.risk-header { + padding: var(--spacing-xl); + border-bottom: 3px solid; + text-align: center; +} + +.risk-icon { + font-size: 4rem; + margin-bottom: var(--spacing-md); + animation: risk-icon-pulse 1.5s ease-in-out infinite; +} + +@keyframes risk-icon-pulse { + 0%, 100% { + transform: scale(1); + } + 50% { + transform: scale(1.1); + } +} + +.risk-header h2 { + margin: 0; + font-size: 1.5rem; + color: var(--text-primary); +} + +.risk-body { + padding: var(--spacing-xl); +} + +.risk-description { + font-size: 1rem; + color: var(--text-secondary); + margin-bottom: var(--spacing-lg); + line-height: 1.6; +} + +.risk-details { + background: rgba(255, 255, 255, 0.05); + border-radius: var(--radius-md); + padding: var(--spacing-md); +} + +.risk-detail-row { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--spacing-sm) 0; + font-size: 0.9rem; +} + +.risk-detail-row:not(:last-child) { + border-bottom: 1px solid var(--border-color); +} + +.risk-detail-row .label { + color: var(--text-secondary); + font-weight: 500; +} + +.risk-detail-row .value { + color: var(--text-primary); + font-weight: 600; + display: flex; + align-items: center; + gap: var(--spacing-sm); +} + +.risk-score-bar { + width: 100px; + height: 8px; + background: rgba(255, 255, 255, 0.1); + border-radius: var(--radius-full); + overflow: hidden; +} + +.risk-score-fill { + height: 100%; + border-radius: var(--radius-full); + transition: width 0.3s ease; +} + +.risk-score-value { + font-size: 0.85rem; + min-width: 40px; + text-align: right; +} + +.risk-actions { + padding: var(--spacing-lg) var(--spacing-xl); + background: rgba(255, 255, 255, 0.03); + display: flex; + gap: var(--spacing-md); + justify-content: flex-end; +} + +.risk-cancel, +.risk-confirm { + padding: var(--spacing-sm) var(--spacing-xl); + border: none; + border-radius: var(--radius-md); + font-size: 0.95rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease; +} + +.risk-cancel { + background: rgba(255, 255, 255, 0.1); + color: var(--text-primary); +} + +.risk-cancel:hover { + background: rgba(255, 255, 255, 0.15); + transform: translateY(-2px); +} + +.risk-confirm { + color: white; +} + +.risk-confirm:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); +} + +.risk-cancel:focus, +.risk-confirm:focus { + outline: 2px solid var(--color-primary); + outline-offset: 2px; +} + +/* Action Toast */ +.action-toast { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: var(--spacing-md) var(--spacing-lg); + background: var(--gradient-emerald); + color: white; + border-radius: var(--radius-md); + box-shadow: var(--shadow-xl); + font-size: 0.9rem; + font-weight: 500; + transition: opacity 0.3s ease; +} + +.toast-icon { + font-size: 1.2rem; +} + +/* Fade out animation */ +.fade-out { + animation: fadeOut 0.3s ease forwards; +} + +@keyframes fadeOut { + to { + opacity: 0; + transform: scale(0.95); + } +} + +/* Responsive */ +@media (max-width: 768px) { + .risk-interstitial { + max-width: 95%; + } + + .risk-header, + .risk-body { + padding: var(--spacing-lg); + } + + .risk-actions { + flex-direction: column; + } + + .risk-cancel, + .risk-confirm { + width: 100%; + } +} + +/* Reduced motion support */ +@media (prefers-reduced-motion: reduce) { + .pulse-badge, + .risk-icon-pulse { + animation: none; + } + + .risk-cancel:hover, + .risk-confirm:hover { + transform: none; + } +} diff --git a/HeadySystems_v13/apps/heady_admin_ui/css/trust-hud.css b/HeadySystems_v13/apps/heady_admin_ui/css/trust-hud.css new file mode 100644 index 00000000..4e6bcb12 --- /dev/null +++ b/HeadySystems_v13/apps/heady_admin_ui/css/trust-hud.css @@ -0,0 +1,281 @@ +/* ======================================== + Trust HUD Styles + ======================================== */ + +.trust-hud { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: var(--spacing-sm) var(--spacing-md); + background: rgba(99, 102, 241, 0.1); + border: 1px solid rgba(99, 102, 241, 0.3); + border-radius: var(--radius-full); + backdrop-filter: blur(10px); + transition: all 0.3s ease; + max-width: fit-content; +} + +.trust-hud.minimized .trust-hud-items { + display: none; +} + +.trust-hud-toggle { + background: none; + border: none; + color: var(--text-primary); + cursor: pointer; + font-size: 1.2rem; + padding: var(--spacing-xs); + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + transition: all 0.2s ease; +} + +.trust-hud-toggle:hover { + background: rgba(99, 102, 241, 0.2); + transform: scale(1.1); +} + +.trust-hud-toggle:focus { + outline: 2px solid var(--color-primary); + outline-offset: 2px; +} + +.trust-hud-items { + display: flex; + gap: var(--spacing-md); + align-items: center; +} + +.trust-hud-item { + display: flex; + align-items: center; + gap: var(--spacing-xs); + padding: var(--spacing-xs) var(--spacing-sm); + background: rgba(255, 255, 255, 0.05); + border-radius: var(--radius-md); + cursor: pointer; + transition: all 0.2s ease; + position: relative; +} + +.trust-hud-item:hover { + background: rgba(255, 255, 255, 0.1); + transform: translateY(-2px); +} + +.trust-hud-item:focus { + outline: 2px solid var(--color-primary); + outline-offset: 2px; +} + +.hud-icon { + font-size: 1rem; + display: inline-flex; +} + +.hud-label { + font-size: 0.75rem; + color: var(--text-secondary); + white-space: nowrap; +} + +.hud-value { + font-size: 0.85rem; + font-weight: 600; + color: var(--text-primary); + white-space: nowrap; +} + +/* Subtle animations for HUD items */ +.pulse-subtle { + animation: pulse-subtle 3s ease-in-out infinite; +} + +@keyframes pulse-subtle { + 0%, 100% { + opacity: 0.8; + } + 50% { + opacity: 1; + } +} + +.sparkle-subtle { + animation: sparkle-subtle 4s ease-in-out infinite; +} + +@keyframes sparkle-subtle { + 0%, 100% { + filter: brightness(1); + } + 50% { + filter: brightness(1.3); + } +} + +.pulse-success-subtle { + animation: pulse-success-subtle 3s ease-in-out infinite; +} + +@keyframes pulse-success-subtle { + 0%, 100% { + filter: drop-shadow(0 0 2px rgba(16, 185, 129, 0.3)); + } + 50% { + filter: drop-shadow(0 0 6px rgba(16, 185, 129, 0.6)); + } +} + +/* Change glow animation */ +.changed-glow { + animation: change-glow 1s ease-out; +} + +@keyframes change-glow { + 0% { + box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.7); + } + 50% { + box-shadow: 0 0 10px 5px rgba(99, 102, 241, 0.4); + } + 100% { + box-shadow: 0 0 0 0 rgba(99, 102, 241, 0); + } +} + +.changed-subtle { + background: rgba(99, 102, 241, 0.2) !important; +} + +/* Trust Detail Modal */ +.trust-detail-modal { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + max-width: 500px; + width: 90%; + padding: var(--spacing-xl); + background: var(--bg-card); + backdrop-filter: blur(20px); + border: 1px solid var(--border-color); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-xl); + z-index: 1000; +} + +.trust-detail-modal h3 { + margin-bottom: var(--spacing-lg); + font-size: 1.5rem; + color: var(--text-primary); +} + +.detail-grid { + display: flex; + flex-direction: column; + gap: var(--spacing-md); +} + +.detail-row { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--spacing-sm); + background: rgba(255, 255, 255, 0.05); + border-radius: var(--radius-sm); +} + +.detail-label { + font-size: 0.9rem; + color: var(--text-secondary); + font-weight: 500; +} + +.detail-value { + font-size: 0.95rem; + color: var(--text-primary); + font-weight: 600; +} + +.detail-value.status-active { + color: var(--color-success); +} + +.close-modal { + position: absolute; + top: var(--spacing-md); + right: var(--spacing-md); + background: none; + border: none; + color: var(--text-secondary); + font-size: 1.5rem; + cursor: pointer; + padding: var(--spacing-xs); + border-radius: 50%; + transition: all 0.2s ease; + line-height: 1; +} + +.close-modal:hover { + background: rgba(255, 255, 255, 0.1); + color: var(--text-primary); + transform: rotate(90deg); +} + +/* Trust Tooltip */ +.trust-tooltip { + position: fixed; + background: rgba(0, 0, 0, 0.9); + color: white; + padding: var(--spacing-xs) var(--spacing-sm); + border-radius: var(--radius-sm); + font-size: 0.85rem; + white-space: nowrap; + z-index: 999; + pointer-events: none; +} + +/* Responsive adjustments */ +@media (max-width: 768px) { + .trust-hud { + flex-wrap: wrap; + } + + .trust-hud-items { + flex-wrap: wrap; + gap: var(--spacing-sm); + } + + .trust-hud-item { + flex: 1 1 auto; + min-width: fit-content; + } + + .hud-label { + display: none; + } +} + +/* Reduced motion support */ +@media (prefers-reduced-motion: reduce) { + .pulse-subtle, + .sparkle-subtle, + .pulse-success-subtle { + animation: none; + } + + .changed-glow { + animation: none; + } + + .trust-hud-item:hover { + transform: none; + } + + .close-modal:hover { + transform: none; + } +} diff --git a/HeadySystems_v13/apps/heady_admin_ui/index.html b/HeadySystems_v13/apps/heady_admin_ui/index.html index 0087274d..437f3116 100644 --- a/HeadySystems_v13/apps/heady_admin_ui/index.html +++ b/HeadySystems_v13/apps/heady_admin_ui/index.html @@ -7,6 +7,11 @@