vn6295337's picture
UI improvements: icons, labels, status, and print layout
b3d4d5b
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
/* Dark mode only - no light theme */
:root {
--background: 222 47% 6%;
--foreground: 210 40% 98%;
--card: 222 47% 9%;
--card-foreground: 210 40% 98%;
--popover: 222 47% 9%;
--popover-foreground: 210 40% 98%;
--primary: 221 83% 53%;
--primary-foreground: 210 40% 98%;
--secondary: 217 33% 17%;
--secondary-foreground: 210 40% 98%;
--muted: 217 33% 17%;
--muted-foreground: 215 20% 65%;
--accent: 221 83% 53%;
--accent-foreground: 210 40% 98%;
--destructive: 0 63% 31%;
--destructive-foreground: 210 40% 98%;
--success: 142 76% 36%;
--success-foreground: 210 40% 98%;
--warning: 38 92% 50%;
--warning-foreground: 222 47% 11%;
--border: 217 33% 17%;
--input: 217 33% 17%;
--ring: 221 83% 53%;
--radius: 0.5rem;
/* SWOT quadrant colors */
--strength: 142 76% 36%;
--weakness: 0 84% 60%;
--opportunity: 221 83% 53%;
--threat: 38 92% 50%;
--sidebar-background: 240 5.9% 10%;
--sidebar-foreground: 240 4.8% 95.9%;
--sidebar-primary: 224.3 76.3% 48%;
--sidebar-primary-foreground: 0 0% 100%;
--sidebar-accent: 240 3.7% 15.9%;
--sidebar-accent-foreground: 240 4.8% 95.9%;
--sidebar-border: 240 3.7% 15.9%;
--sidebar-ring: 217.2 91.2% 59.8%;
/* ProcessFlow SVG Colors - Dark theme with black containers */
/* Container styling: black bg, light gray border, gray icons/text */
--pf-idle-fill: #000000;
--pf-idle-stroke: #6B7280;
--pf-executing-fill: #000000;
--pf-executing-stroke: #F59E0B;
--pf-completed-fill: #000000;
--pf-completed-stroke: #10B981;
--pf-failed-fill: #000000;
--pf-failed-stroke: #EF4444;
--pf-partial-fill: #000000;
--pf-partial-stroke: #F59E0B;
/* Cache states */
--pf-cache-hit-fill: #000000;
--pf-cache-hit-stroke: #10B981;
--pf-cache-miss-fill: #000000;
--pf-cache-miss-stroke: #EF4444;
/* LLM providers */
--pf-llm-idle-fill: #000000;
--pf-llm-idle-stroke: #6B7280;
--pf-llm-active-fill: #000000;
--pf-llm-active-stroke: #3B82F6;
--pf-llm-completed-fill: #000000;
--pf-llm-completed-stroke: #2563EB;
--pf-llm-failed-fill: #000000;
--pf-llm-failed-stroke: #EF4444;
/* Connector colors */
--pf-connector-idle: #4B5563;
--pf-connector-executing: #F59E0B;
--pf-connector-completed: #10B981;
--pf-connector-failed: #EF4444;
/* Group box - unchanged */
--pf-group-fill: rgba(31, 41, 55, 0.3);
--pf-group-stroke: #4B5563;
/* Text and icon colors - gray */
--pf-icon-color: #9CA3AF;
--pf-text-label: #9CA3AF;
--pf-text-idle: #9CA3AF;
--pf-text-active: #9CA3AF;
--pf-text-mcp: #9CA3AF;
--pf-llm-text-idle: #9CA3AF;
--pf-llm-text-active: #9CA3AF;
--pf-llm-text-completed: #9CA3AF;
--pf-llm-text-failed: #F87171;
--pf-group-label: #9CA3AF;
}
}
@layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground font-sans antialiased;
font-family: 'Inter', system-ui, sans-serif;
}
code, pre {
font-family: 'JetBrains Mono', monospace;
}
}
@layer utilities {
/* Fade animations */
.animate-fade-in {
animation: fadeIn 0.5s ease-out forwards;
}
.animate-slide-up {
animation: slideUp 0.4s ease-out forwards;
}
.animate-slide-in-left {
animation: slideInLeft 0.4s ease-out forwards;
}
.animate-slide-in-right {
animation: slideInRight 0.4s ease-out forwards;
}
.animate-scale-in {
animation: scaleIn 0.3s ease-out forwards;
}
.animate-pulse-soft {
animation: pulseSoft 2s ease-in-out infinite;
}
/* Button state colors */
.btn-amber {
@apply bg-amber-500 hover:bg-amber-600 text-white;
}
.btn-amber-outline {
@apply border border-amber-500 text-amber-500 hover:bg-amber-500/10 bg-transparent;
}
.btn-amber-pulse {
animation: buttonPulse 1.5s ease-in-out infinite;
}
.btn-green {
@apply bg-green-600 hover:bg-green-700 text-white;
}
@keyframes buttonPulse {
0%, 100% { box-shadow: 0 0 0 0 rgba(245, 158, 11, 0.7); }
50% { box-shadow: 0 0 15px 5px rgba(245, 158, 11, 0.4); }
}
/* Staggered animations for cards */
.stagger-1 { animation-delay: 0.1s; }
.stagger-2 { animation-delay: 0.2s; }
.stagger-3 { animation-delay: 0.3s; }
.stagger-4 { animation-delay: 0.4s; }
/* Card hover effects */
.card-hover {
@apply transition-all duration-300 ease-out;
}
.card-hover:hover {
@apply shadow-lg -translate-y-1;
}
/* Button hover glow */
.btn-glow {
@apply transition-all duration-300;
}
.btn-glow:hover:not(:disabled) {
box-shadow: 0 0 20px hsl(var(--primary) / 0.4);
}
/* Progress bar animation */
.progress-animated .progress-bar {
transition: width 0.5s ease-out;
}
/* SWOT card borders with gradient */
.swot-strength {
@apply border-l-4;
border-left-color: hsl(var(--strength));
}
.swot-weakness {
@apply border-l-4;
border-left-color: hsl(var(--weakness));
}
.swot-opportunity {
@apply border-l-4;
border-left-color: hsl(var(--opportunity));
}
.swot-threat {
@apply border-l-4;
border-left-color: hsl(var(--threat));
}
/* Glassmorphism effect */
.glass {
@apply bg-white/80 dark:bg-gray-900/80 backdrop-blur-lg;
}
/* Text gradient */
.text-gradient {
@apply bg-clip-text text-transparent bg-gradient-to-r from-primary to-accent;
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes slideInLeft {
from {
opacity: 0;
transform: translateX(-20px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes slideInRight {
from {
opacity: 0;
transform: translateX(20px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes scaleIn {
from {
opacity: 0;
transform: scale(0.95);
}
to {
opacity: 1;
transform: scale(1);
}
}
@keyframes pulseSoft {
0%, 100% { opacity: 1; }
50% { opacity: 0.7; }
}
}
/* === ProcessFlow SVG Styles === */
/* Node base styles */
.pf-node {
transition: fill 0.3s ease, stroke 0.3s ease, opacity 0.3s ease;
}
.pf-node:hover {
filter: brightness(1.15);
cursor: pointer;
}
/* Node states */
.pf-node-idle {
fill: var(--pf-idle-fill);
stroke: var(--pf-idle-stroke);
}
.pf-node-executing {
fill: var(--pf-executing-fill);
stroke: var(--pf-executing-stroke);
}
.pf-node-completed {
fill: var(--pf-completed-fill);
stroke: var(--pf-completed-stroke);
}
.pf-node-failed {
fill: var(--pf-failed-fill);
stroke: var(--pf-failed-stroke);
}
.pf-node-partial {
fill: var(--pf-partial-fill);
stroke: var(--pf-partial-stroke);
}
.pf-node-skipped {
fill: var(--pf-idle-fill);
stroke: var(--pf-idle-stroke);
stroke-dasharray: 3 2;
stroke-width: 1.5;
opacity: 0.6;
}
/* Agents - thin border same as MCP servers */
.pf-agent {
stroke-width: 1;
}
/* No border for non-agent nodes */
.pf-no-border {
stroke: none !important;
stroke-width: 0 !important;
}
/* Agent executing state with drop-shadow for sophistication */
.pf-agent.pf-node-executing {
filter: drop-shadow(0 0 6px rgba(99, 102, 241, 0.7));
}
/* Cache states */
.pf-cache-idle {
fill: var(--pf-idle-fill);
stroke: var(--pf-idle-stroke);
}
.pf-cache-checking {
fill: var(--pf-executing-fill);
stroke: var(--pf-executing-stroke);
}
.pf-cache-hit {
fill: var(--pf-cache-hit-fill);
stroke: var(--pf-cache-hit-stroke);
}
.pf-cache-miss {
fill: var(--pf-cache-miss-fill);
stroke: var(--pf-cache-miss-stroke);
}
/* Connector styles */
.pf-connector {
transition: stroke 0.3s ease;
}
.pf-connector-idle {
stroke: var(--pf-connector-idle);
}
.pf-connector-executing {
stroke: var(--pf-connector-executing);
animation: pfPulse 1.5s ease-in-out infinite;
}
.pf-connector-completed {
stroke: var(--pf-connector-completed);
}
.pf-connector-failed {
stroke: var(--pf-connector-failed);
}
/* Orchestration connector - coordinated reasoning signal */
.pf-orchestration {
stroke-dasharray: 6 3;
stroke-width: 2;
}
/* Success halo - completion confidence signal */
.pf-success-halo {
stroke: rgba(34, 197, 94, 0.6);
stroke-width: 2;
fill: none;
animation: successGlow 2s ease-in-out infinite;
}
@keyframes successGlow {
0%, 100% { stroke-opacity: 0.6; }
50% { stroke-opacity: 1; }
}
/* MCP aggregate - capability layer styling */
.pf-mcp-aggregate {
stroke-width: 1.5;
stroke-dasharray: 2 2;
}
/* MCP individual nodes - lighter treatment as data feeders */
.pf-node-mcp {
stroke-width: 1.2;
opacity: 0.75;
}
/* Group labels */
.pf-group-label {
fill: var(--pf-group-label);
}
/* Icon styling - gray */
.pf-icon {
color: var(--pf-icon-color);
}
/* Text label styling - gray */
.pf-text-label {
fill: var(--pf-text-label);
}
/* Agent text styling - white, larger */
.pf-text-agent {
fill: #FFFFFF;
}
/* LLM Provider styles */
.pf-llm {
transition: fill 0.3s ease, stroke 0.3s ease, opacity 0.3s ease;
}
.pf-llm:hover {
filter: brightness(1.1);
}
.pf-llm-idle {
fill: var(--pf-llm-idle-fill);
stroke: var(--pf-idle-stroke);
}
.pf-llm-executing {
fill: var(--pf-llm-active-fill);
stroke: var(--pf-executing-stroke);
}
.pf-llm-completed {
fill: var(--pf-llm-completed-fill);
stroke: var(--pf-completed-stroke);
}
.pf-llm-failed {
fill: var(--pf-llm-failed-fill);
stroke: var(--pf-llm-failed-stroke);
}
/* Group box styles */
.pf-group {
fill: var(--pf-group-fill);
stroke: var(--pf-group-stroke);
transition: fill 0.3s ease;
}
/* Text styles */
.pf-text-idle {
fill: var(--pf-text-idle);
}
.pf-text-active {
fill: var(--pf-text-active);
}
.pf-text-mcp {
fill: var(--pf-text-mcp);
}
.pf-llm-text-idle {
fill: var(--pf-llm-text-idle);
}
.pf-llm-text-executing {
fill: var(--pf-llm-text-active);
}
.pf-llm-text-completed {
fill: var(--pf-llm-text-completed);
}
.pf-llm-text-failed {
fill: var(--pf-llm-text-failed);
}
/* F.10 - Only pulse animation for executing nodes, no glow */
.pf-pulse {
animation: pfPulse 1.5s ease-in-out infinite;
}
@keyframes pfPulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.6; }
}
/* Animation discipline: completed states = static confidence */
.pf-node-completed {
animation: none !important;
}
.pf-llm-completed {
animation: none !important;
}
/* Smooth scrollbar */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
@apply bg-muted rounded-full;
}
::-webkit-scrollbar-thumb {
@apply bg-muted-foreground/30 rounded-full;
}
::-webkit-scrollbar-thumb:hover {
@apply bg-muted-foreground/50;
}
/* Mobile touch-friendly styles */
@media (max-width: 640px) {
/* Larger touch targets on mobile */
button,
[role="button"],
input,
select,
textarea {
min-height: 44px;
}
/* Prevent text size adjustment on orientation change */
html {
-webkit-text-size-adjust: 100%;
}
/* Better tap highlight */
* {
-webkit-tap-highlight-color: transparent;
}
/* Improve scrolling performance */
.overflow-y-auto,
.overflow-x-auto {
-webkit-overflow-scrolling: touch;
}
}
/* Safe area insets for notched devices */
@supports (padding: max(0px)) {
.container {
padding-left: max(1rem, env(safe-area-inset-left));
padding-right: max(1rem, env(safe-area-inset-right));
}
footer {
padding-bottom: max(0.75rem, env(safe-area-inset-bottom));
}
}
/* Improve focus states for accessibility */
@layer utilities {
.focus-ring {
@apply focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 focus:ring-offset-background;
}
}
/* Print styles for PDF export */
@media print {
/* Reset colors for print */
:root {
--background: 0 0% 100%;
--foreground: 0 0% 0%;
--card: 0 0% 100%;
--card-foreground: 0 0% 0%;
--muted-foreground: 0 0% 30%;
}
/* Hide non-essential elements */
header,
footer,
aside,
.print\:hidden,
button:not(.print\:block),
[role="tablist"] {
display: none !important;
}
/* Full width main content */
main {
width: 100% !important;
max-width: 100% !important;
padding: 0 !important;
margin: 0 !important;
}
.container {
max-width: 100% !important;
padding: 0 !important;
}
/* Show all tab content for print */
[role="tabpanel"] {
display: block !important;
opacity: 1 !important;
}
/* Compact card styles for single page fit */
.card {
border: 1px solid #ddd !important;
box-shadow: none !important;
break-inside: avoid;
page-break-inside: avoid;
margin-bottom: 0.5rem !important;
}
.card-header {
padding: 0.5rem 0.75rem !important;
}
.card-content {
padding: 0.5rem 0.75rem !important;
}
/* Ensure text is black - compact sizing */
body {
color: black !important;
background: white !important;
font-size: 10pt;
line-height: 1.3;
}
/* Page size: 8.27" x 11" (most restrictive common between A4 width and Letter height) */
@page {
margin: 0.5in;
size: 8.27in 11in;
}
/* Compact SWOT grid */
.grid.md\:grid-cols-2 {
gap: 0.5rem !important;
}
/* Compact list items */
ul.space-y-2 {
gap: 0.25rem !important;
}
ul.space-y-2 li {
margin-bottom: 0.125rem !important;
}
/* Source data panel compact */
.divide-y > div {
padding-top: 0.25rem !important;
padding-bottom: 0.25rem !important;
}
/* Prevent orphans and widows */
p, li {
orphans: 3;
widows: 3;
}
/* Hide process flow and metrics panel */
.h-\[260px\] {
display: none !important;
}
/* Compact headings */
h2 {
font-size: 14pt !important;
margin-bottom: 0.5rem !important;
}
h3 {
font-size: 11pt !important;
}
/* Quality evaluation compact */
.space-y-6 {
gap: 0.75rem !important;
}
}