Files
tinker_tickets/assets/css/dashboard.css
Jared Vititoe 2657e86d24 Enhance CSS/HTML with semantic elements, utility classes, and breakpoints
- Move inline styles to CSS classes in ticket.css and dashboard.css
- Add intermediate responsive breakpoints (600px, 900px, 1200px)
- Convert HTML to semantic elements (header, section, article)
- Add ARIA attributes for modals and navigation
- Add utility classes for text styling and spacing
- Update cache-busting version numbers

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 10:29:20 -05:00

5344 lines
112 KiB
CSS

/* ===== CSS VARIABLES - TERMINAL EDITION ===== */
:root {
/* Terminal Dark Backgrounds */
--bg-primary: #0a0a0a;
--bg-secondary: #1a1a1a;
--bg-tertiary: #2a2a2a;
/* Terminal Colors */
--terminal-green: #00ff41;
--terminal-green-dim: #00cc33;
--terminal-amber: #ffb000;
--terminal-cyan: #00ffff;
--terminal-red: #ff4444;
--text-primary: #00ff41;
--text-secondary: #00cc33;
--text-muted: #00bb33; /* Improved contrast ratio for WCAG AA */
/* Border & UI */
--border-color: #00ff41;
--shadow: none;
--hover-bg: rgba(0, 255, 65, 0.1);
--border-radius: 0;
/* Priority Colors (Keep existing) */
--priority-1: #ff4d4d;
--priority-2: #ffa726;
--priority-3: #42a5f5;
--priority-4: #66bb6a;
--priority-5: #9e9e9e;
/* Status Colors */
--status-open: #28a745;
--status-pending: #9c27b0;
--status-in-progress: #ffc107;
--status-closed: #dc3545;
/* Terminal Font Stack */
--font-mono: 'Courier New', 'Consolas', 'Monaco', 'Menlo', monospace;
/* Glow Effects - Enhanced for stronger phosphor effect */
--glow-green: 0 0 5px #00ff41, 0 0 10px #00ff41, 0 0 15px #00ff41;
--glow-green-intense: 0 0 8px #00ff41, 0 0 16px #00ff41, 0 0 24px #00ff41, 0 0 32px rgba(0, 255, 65, 0.5);
--glow-red: 0 0 5px #ff4d4d, 0 0 10px #ff4d4d, 0 0 15px #ff4d4d;
--glow-blue: 0 0 5px #42a5f5, 0 0 10px #42a5f5, 0 0 15px #42a5f5;
--glow-amber: 0 0 5px #ffb000, 0 0 10px #ffb000, 0 0 15px #ffb000;
--glow-amber-intense: 0 0 8px #ffb000, 0 0 16px #ffb000, 0 0 24px #ffb000;
--glow-priority-1: 0 0 5px #ff4d4d, 0 0 10px #ff4d4d, 0 0 15px #ff4d4d;
--glow-priority-2: 0 0 5px #ffa726, 0 0 10px #ffa726, 0 0 15px #ffa726;
--glow-priority-3: 0 0 5px #42a5f5, 0 0 10px #42a5f5, 0 0 15px #42a5f5;
--glow-priority-4: 0 0 5px #66bb6a, 0 0 10px #66bb6a, 0 0 15px #66bb6a;
--glow-priority-5: 0 0 5px #9e9e9e, 0 0 10px #9e9e9e, 0 0 15px #9e9e9e;
/* Spacing */
--spacing-xs: 0.5rem;
--spacing-sm: 1rem;
--spacing-md: 1.5rem;
--spacing-lg: 2rem;
/* Transitions */
--transition-default: all 0.3s ease;
/* Z-Index Scale - Centralized stacking context management */
--z-base: 1;
--z-dropdown: 100;
--z-sticky: 200;
--z-fixed: 300;
--z-modal-backdrop: 400;
--z-modal: 500;
--z-popover: 600;
--z-tooltip: 700;
--z-toast: 800;
--z-overlay: 9999;
}
/* Dark theme (now same as light for terminal aesthetic) */
[data-theme="dark"] {
--bg-primary: #0a0a0a;
--bg-secondary: #1a1a1a;
--bg-tertiary: #2a2a2a;
--text-primary: #00ff41;
--text-secondary: #00cc33;
--border-color: #00ff41;
--shadow: none;
--hover-bg: rgba(0, 255, 65, 0.1);
}
/* ===== BASE ELEMENTS - TERMINAL STYLE ===== */
/* Global box-sizing for consistent layouts */
*, *::before, *::after {
box-sizing: border-box;
}
body {
font-family: var(--font-mono);
margin: 0;
padding: var(--spacing-md);
background-color: var(--bg-primary);
color: var(--text-primary);
transition: var(--transition-default);
position: relative;
}
/* CRT Scanline Effect - Subtle retro terminal look */
body::before {
content: '';
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: repeating-linear-gradient(
0deg,
rgba(0, 0, 0, 0.15),
rgba(0, 0, 0, 0.15) 1px,
transparent 1px,
transparent 2px
);
pointer-events: none;
z-index: var(--z-overlay);
animation: scanline 8s linear infinite;
}
@keyframes scanline {
0% {
transform: translateY(0);
}
100% {
transform: translateY(4px);
}
}
/* Screen Flicker Effect */
@keyframes flicker {
0% { opacity: 1; }
10% { opacity: 0.95; }
20% { opacity: 1; }
30% { opacity: 0.97; }
40% { opacity: 1; }
}
@keyframes glitch {
0% { transform: translate(0); }
20% { transform: translate(-2px, 2px); }
40% { transform: translate(-2px, -2px); }
60% { transform: translate(2px, 2px); }
80% { transform: translate(2px, -2px); }
100% { transform: translate(0); }
}
.ascii-frame-outer:hover {
animation: flicker 0.15s ease-in-out 1;
}
/* Random screen glitch every 30 seconds */
body {
animation: flicker 0.2s ease-in-out 30s infinite;
}
/* Subtle data stream effect in corner */
body::after {
content: '10101010';
position: fixed;
bottom: 10px;
right: 10px;
font-family: var(--font-mono);
font-size: 0.6rem;
color: var(--terminal-green);
opacity: 0.1;
pointer-events: none;
letter-spacing: 2px;
animation: data-stream 3s linear infinite;
}
@keyframes data-stream {
0% { content: '10101010'; opacity: 0.1; }
25% { content: '01010101'; opacity: 0.15; }
50% { content: '11001100'; opacity: 0.1; }
75% { content: '00110011'; opacity: 0.15; }
100% { content: '10101010'; opacity: 0.1; }
}
/* ===== ENHANCED TERMINAL ANIMATIONS ===== */
/* Typing cursor effect for focused inputs */
input:focus::placeholder,
textarea:focus::placeholder {
animation: typing-cursor 1s steps(1) infinite;
}
@keyframes typing-cursor {
0%, 50% { opacity: 1; }
51%, 100% { opacity: 0; }
}
/* Glowing border pulse on focus */
input:focus,
textarea:focus,
select:focus {
outline: 2px solid var(--terminal-amber);
outline-offset: 2px;
animation: focus-pulse 2s ease-in-out infinite;
}
@keyframes focus-pulse {
0%, 100% { box-shadow: var(--glow-amber), inset 0 0 10px rgba(0, 0, 0, 0.5); }
50% { box-shadow: var(--glow-amber-intense), inset 0 0 10px rgba(0, 0, 0, 0.5); }
}
/* Focus visible for keyboard navigation */
:focus-visible {
outline: 2px solid var(--terminal-amber);
outline-offset: 2px;
}
/* Screen reader only - visually hidden but accessible */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
/* Reduced motion for accessibility */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
body::before {
animation: none;
}
}
/* Boot-up fade in effect */
@keyframes boot-up {
0% {
opacity: 0;
filter: brightness(2) saturate(0);
}
30% {
opacity: 1;
filter: brightness(1.5) saturate(0.5);
}
100% {
opacity: 1;
filter: brightness(1) saturate(1);
}
}
.ascii-frame-outer {
animation: boot-up 0.8s ease-out;
}
/* Phosphor text glow on important elements */
.stat-value,
.ticket-id,
h1, h2, h3 {
text-shadow: 0 0 2px currentColor, 0 0 4px currentColor;
}
/* Enhanced link hover with underline animation */
a:not(.btn) {
position: relative;
text-decoration: none;
}
a:not(.btn)::after {
content: '';
position: absolute;
bottom: -2px;
left: 0;
width: 0;
height: 1px;
background: currentColor;
box-shadow: 0 0 5px currentColor;
transition: width 0.3s ease;
}
a:not(.btn):hover::after {
width: 100%;
}
/* Matrix-style rain effect on hover for stats */
.stat-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(180deg,
transparent 0%,
rgba(0, 255, 65, 0.03) 50%,
transparent 100%
);
background-size: 100% 200%;
opacity: 0;
transition: opacity 0.3s;
pointer-events: none;
}
.stat-card:hover::before {
opacity: 1;
animation: matrix-rain 2s linear infinite;
}
@keyframes matrix-rain {
0% { background-position: 0 -100%; }
100% { background-position: 0 100%; }
}
/* Smooth table row selection animation */
tbody tr {
transition: all 0.2s ease;
position: relative;
}
tbody tr::before {
content: '>';
position: absolute;
left: -20px;
opacity: 0;
color: var(--terminal-green);
transition: all 0.2s ease;
}
tbody tr:hover::before {
opacity: 1;
left: -15px;
}
/* Button press effect */
.btn {
transition: all 0.15s ease;
position: relative;
overflow: hidden;
}
.btn::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 0;
height: 0;
background: rgba(255, 255, 255, 0.1);
border-radius: 50%;
transform: translate(-50%, -50%);
transition: width 0.4s, height 0.4s;
}
.btn:active::before {
width: 200%;
height: 200%;
}
.btn:active {
transform: scale(0.98);
}
/* Terminal cursor blink for active/selected elements */
.keyboard-selected td:first-child::before {
content: '█';
position: absolute;
left: -25px;
animation: cursor-blink 0.8s steps(1) infinite;
color: var(--terminal-green);
}
@keyframes cursor-blink {
0%, 50% { opacity: 1; }
51%, 100% { opacity: 0; }
}
/* Neon glow effect for priority badges */
.priority-badge {
position: relative;
}
.priority-badge::after {
content: '';
position: absolute;
inset: -2px;
border-radius: inherit;
background: inherit;
filter: blur(6px);
opacity: 0.4;
z-index: -1;
}
/* Smooth scrollbar styling */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: var(--bg-primary);
border: 1px solid var(--terminal-green);
}
::-webkit-scrollbar-thumb {
background: var(--terminal-green);
box-shadow: 0 0 5px var(--terminal-green);
}
::-webkit-scrollbar-thumb:hover {
background: var(--terminal-amber);
box-shadow: 0 0 10px var(--terminal-amber);
}
/* Firefox scrollbar */
* {
scrollbar-width: thin;
scrollbar-color: var(--terminal-green) var(--bg-primary);
}
body.menu-open {
padding-left: 260px;
}
h1 {
color: var(--text-primary);
margin: 0;
}
/* ===== USER HEADER - TERMINAL STYLE ===== */
.user-header {
background: var(--bg-secondary);
padding: 0.5rem 1rem;
color: var(--terminal-green);
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 2px solid var(--terminal-green);
box-shadow: 0 2px 20px rgba(0, 255, 65, 0.2);
box-sizing: border-box;
font-family: var(--font-mono);
position: relative;
}
.user-header::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg,
transparent 0%,
var(--terminal-green) 20%,
var(--terminal-green) 80%,
transparent 100%);
box-shadow: var(--glow-green);
}
.user-header-left,
.user-header-right {
display: flex;
align-items: center;
gap: 0.75rem;
flex-shrink: 1;
min-width: 0;
}
.app-title {
font-weight: bold;
font-size: 1rem;
color: var(--terminal-amber);
text-shadow: var(--glow-amber-intense);
white-space: nowrap;
animation: subtle-pulse 3s ease-in-out infinite;
}
.app-title::before {
content: '>> ';
color: var(--terminal-green);
text-shadow: var(--glow-green);
}
.back-link {
color: var(--terminal-green);
text-decoration: none;
font-weight: bold;
font-size: 1rem;
white-space: nowrap;
text-shadow: var(--glow-green);
}
.back-link:hover {
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
}
.user-name {
color: var(--terminal-green);
font-size: 0.9rem;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.admin-badge {
background: transparent;
color: var(--priority-1);
padding: 0.2rem 0.5rem;
border: 2px solid var(--priority-1);
border-radius: 0; /* Terminal aesthetic - no rounded corners */
font-size: 0.75rem;
font-weight: bold;
white-space: nowrap;
text-shadow: var(--glow-priority-1);
font-family: var(--font-mono);
}
.admin-badge::before {
content: '[';
margin-right: 3px;
}
.admin-badge::after {
content: ']';
margin-left: 3px;
}
/* ===== INTERMEDIATE RESPONSIVE BREAKPOINTS ===== */
/* Large desktop (1200px+) */
@media (min-width: 1200px) {
.dashboard-layout {
max-width: 1800px;
margin: 0 auto;
}
.stats-widgets .stats-row {
grid-template-columns: repeat(6, 1fr);
}
.kanban-board {
grid-template-columns: repeat(4, 1fr);
}
}
/* Medium desktop (900px - 1199px) */
@media (min-width: 900px) and (max-width: 1199px) {
.stats-widgets .stats-row {
grid-template-columns: repeat(3, 1fr);
}
.dashboard-toolbar {
flex-wrap: wrap;
gap: 1rem;
}
.toolbar-center {
order: 3;
width: 100%;
justify-content: flex-start;
}
}
/* Tablet landscape (600px - 899px) */
@media (min-width: 600px) and (max-width: 899px) {
.stats-widgets .stats-row {
grid-template-columns: repeat(2, 1fr);
}
.dashboard-toolbar {
flex-direction: column;
align-items: stretch;
}
.toolbar-left,
.toolbar-center,
.toolbar-right {
width: 100%;
}
.toolbar-search {
width: 100%;
}
.search-box {
flex: 1;
}
.dashboard-sidebar {
width: 200px;
}
.kanban-board {
grid-template-columns: repeat(2, 1fr);
}
table {
font-size: 0.85rem;
}
th, td {
padding: 0.5rem;
}
}
/* Responsive design for smaller screens */
@media (max-width: 768px) {
.user-header {
padding: 0.5rem 0.75rem;
margin-left: 0; /* Remove margin on mobile */
}
.app-title,
.back-link {
font-size: 0.9rem;
}
.user-name {
font-size: 0.85rem;
}
}
/* ===== ASCII BORDER SYSTEM ===== */
.ascii-box {
position: relative;
border: 2px solid var(--terminal-green);
border-radius: 0;
padding: 1rem;
background: var(--bg-secondary);
font-family: var(--font-mono);
}
.ascii-box-heavy {
border: 3px double var(--terminal-green);
}
.ascii-title {
position: relative;
padding: 0.5rem 1rem;
background: var(--bg-primary);
border-bottom: 2px solid var(--terminal-green);
font-family: var(--font-mono);
font-weight: bold;
color: var(--terminal-green);
text-shadow: var(--glow-green);
}
.ascii-title::before {
content: '═══ ';
}
.ascii-title::after {
content: ' ═══';
}
/* Priority-specific border colors */
.ascii-box[data-priority="1"] { border-color: var(--priority-1); }
.ascii-box[data-priority="2"] { border-color: var(--priority-2); }
.ascii-box[data-priority="3"] { border-color: var(--priority-3); }
.ascii-box[data-priority="4"] { border-color: var(--priority-4); }
.ascii-box[data-priority="5"] { border-color: var(--priority-5); }
/* ===== NESTED ASCII FRAME SYSTEM ===== */
/* Main outer container - Heavy double border */
.ascii-frame-outer {
position: relative;
border: 3px double var(--terminal-green);
padding: 0;
background: var(--bg-primary);
margin-bottom: 2rem;
}
.ascii-frame-outer::before {
content: '╔';
position: absolute;
top: -3px;
left: -3px;
font-size: 1.5rem;
color: var(--terminal-green);
line-height: 1;
z-index: var(--z-base);
}
.ascii-frame-outer::after {
content: '╗';
position: absolute;
top: -3px;
right: -3px;
font-size: 1.5rem;
color: var(--terminal-green);
line-height: 1;
z-index: var(--z-base);
}
/* Bottom corners as separate elements with enhanced glow */
.bottom-left-corner,
.bottom-right-corner {
position: absolute;
bottom: -3px;
font-size: 1.5rem;
color: var(--terminal-green);
text-shadow: var(--glow-green);
line-height: 1;
z-index: var(--z-base);
animation: corner-pulse 4s ease-in-out infinite;
}
@keyframes corner-pulse {
0%, 100% { text-shadow: var(--glow-green); }
50% { text-shadow: var(--glow-green-intense); }
}
.bottom-left-corner {
left: -3px;
}
.bottom-right-corner {
right: -3px;
}
/* Inner section frame - Single border */
.ascii-frame-inner {
position: relative;
border: 2px solid var(--terminal-green);
padding: 1rem;
background: var(--bg-secondary);
margin: 1rem;
}
.ascii-frame-inner::before {
content: '┌';
position: absolute;
top: -2px;
left: -2px;
font-size: 1.2rem;
color: var(--terminal-green);
line-height: 1;
}
.ascii-frame-inner::after {
content: '┐';
position: absolute;
top: -2px;
right: -2px;
font-size: 1.2rem;
color: var(--terminal-green);
line-height: 1;
}
/* Section headers with ASCII decoration */
.ascii-section-header {
position: relative;
padding: 0.75rem 1.5rem;
background: var(--bg-primary);
border-bottom: 2px solid var(--terminal-green);
font-family: var(--font-mono);
font-weight: bold;
color: var(--terminal-amber);
text-shadow: var(--glow-amber-intense);
text-transform: uppercase;
letter-spacing: 0.1em;
animation: subtle-pulse 3s ease-in-out infinite;
}
@keyframes subtle-pulse {
0%, 100% { text-shadow: var(--glow-amber); }
50% { text-shadow: var(--glow-amber-intense); }
}
.ascii-section-header::before {
content: '╠═══ ';
color: var(--terminal-green);
margin-right: 0.5rem;
}
.ascii-section-header::after {
content: ' ═══╣';
color: var(--terminal-green);
margin-left: 0.5rem;
}
/* Subsection headers for nested areas */
.ascii-subsection-header {
position: relative;
padding: 0.5rem 1rem;
background: var(--bg-secondary);
border-bottom: 1px solid var(--terminal-green);
font-family: var(--font-mono);
font-weight: bold;
color: var(--terminal-green);
text-transform: uppercase;
font-size: 0.9em;
}
.ascii-subsection-header::before {
content: '├─── ';
color: var(--terminal-green);
}
.ascii-subsection-header::after {
content: ' ───┤';
color: var(--terminal-green);
}
/* Section dividers */
.ascii-divider {
height: 2px;
background: linear-gradient(90deg,
var(--terminal-green) 0%,
var(--terminal-green) 48%,
transparent 48%,
transparent 52%,
var(--terminal-green) 52%,
var(--terminal-green) 100%);
margin: 1.5rem 0;
position: relative;
}
.ascii-divider::before {
content: '╞═══';
position: absolute;
left: -2px;
top: -11px;
color: var(--terminal-green);
font-size: 1.2rem;
text-shadow: var(--glow-green);
letter-spacing: -2px;
}
.ascii-divider::after {
content: '═══╡';
position: absolute;
right: -2px;
top: -11px;
color: var(--terminal-green);
font-size: 1.2rem;
text-shadow: var(--glow-green);
letter-spacing: -2px;
}
/* Content wrapper inside frames */
.ascii-content {
padding: 1rem;
background: var(--bg-secondary);
}
/* Priority-based color variants for outer frames */
.ascii-frame-outer[data-priority="1"],
.ascii-frame-outer[data-priority="1"]::before,
.ascii-frame-outer[data-priority="1"]::after {
border-color: var(--priority-1);
color: var(--priority-1);
}
.ascii-frame-outer[data-priority="1"] .bottom-left-corner,
.ascii-frame-outer[data-priority="1"] .bottom-right-corner {
color: var(--priority-1);
}
.ascii-frame-outer[data-priority="2"],
.ascii-frame-outer[data-priority="2"]::before,
.ascii-frame-outer[data-priority="2"]::after {
border-color: var(--priority-2);
color: var(--priority-2);
}
.ascii-frame-outer[data-priority="2"] .bottom-left-corner,
.ascii-frame-outer[data-priority="2"] .bottom-right-corner {
color: var(--priority-2);
}
.ascii-frame-outer[data-priority="3"],
.ascii-frame-outer[data-priority="3"]::before,
.ascii-frame-outer[data-priority="3"]::after {
border-color: var(--priority-3);
color: var(--priority-3);
}
.ascii-frame-outer[data-priority="3"] .bottom-left-corner,
.ascii-frame-outer[data-priority="3"] .bottom-right-corner {
color: var(--priority-3);
}
.ascii-frame-outer[data-priority="4"],
.ascii-frame-outer[data-priority="4"]::before,
.ascii-frame-outer[data-priority="4"]::after {
border-color: var(--priority-4);
color: var(--priority-4);
}
.ascii-frame-outer[data-priority="4"] .bottom-left-corner,
.ascii-frame-outer[data-priority="4"] .bottom-right-corner {
color: var(--priority-4);
}
.ascii-frame-outer[data-priority="5"],
.ascii-frame-outer[data-priority="5"]::before,
.ascii-frame-outer[data-priority="5"]::after {
border-color: var(--priority-5);
color: var(--priority-5);
}
.ascii-frame-outer[data-priority="5"] .bottom-left-corner,
.ascii-frame-outer[data-priority="5"] .bottom-right-corner {
color: var(--priority-5);
}
/* ===== TERMINAL PROMPT STYLES ===== */
.terminal-prompt::before {
content: '> ';
color: var(--terminal-green);
font-weight: bold;
}
.terminal-command::before {
content: '$ ';
color: var(--terminal-amber);
font-weight: bold;
}
.terminal-checkbox-checked::before {
content: '[✓] ';
color: var(--terminal-green);
}
.terminal-checkbox-unchecked::before {
content: '[ ] ';
color: var(--text-secondary);
}
.terminal-status-active::before {
content: '[●] ';
color: var(--status-open);
}
.terminal-status-inactive::before {
content: '[○] ';
color: var(--text-secondary);
}
/* ===== TEXT GLOW EFFECTS ===== */
.glow-text {
text-shadow: var(--glow-green);
}
.glow-priority-1 { text-shadow: var(--glow-priority-1); }
.glow-priority-2 { text-shadow: var(--glow-priority-2); }
.glow-priority-3 { text-shadow: var(--glow-priority-3); }
.glow-priority-4 { text-shadow: var(--glow-priority-4); }
.glow-priority-5 { text-shadow: var(--glow-priority-5); }
.glow-status-open {
text-shadow: 0 0 5px var(--status-open), 0 0 10px var(--status-open);
}
.glow-status-progress {
text-shadow: 0 0 5px var(--status-in-progress), 0 0 10px var(--status-in-progress);
}
.glow-status-closed {
text-shadow: 0 0 5px var(--status-closed), 0 0 10px var(--status-closed);
}
@keyframes pulse-glow {
0%, 100% {
text-shadow: 0 0 5px currentColor, 0 0 10px currentColor;
}
50% {
text-shadow: 0 0 10px currentColor, 0 0 20px currentColor, 0 0 30px currentColor;
}
}
.pulse-glow {
animation: pulse-glow 2s ease-in-out infinite;
}
/* ===== TYPEWRITER ANIMATION ===== */
@keyframes typewriter {
from { width: 0; }
to { width: 100%; }
}
@keyframes blink-caret {
from, to { border-color: transparent; }
50% { border-color: var(--terminal-green); }
}
.typewriter {
overflow: hidden;
white-space: nowrap;
border-right: 3px solid var(--terminal-green);
animation:
typewriter 2s steps(40, end),
blink-caret 0.75s step-end infinite;
}
.typewriter-slow { animation-duration: 4s; }
.typewriter-fast { animation-duration: 1s; }
.typewriter-multi-line {
overflow: hidden;
animation: reveal-lines 3s steps(20, end) forwards;
}
@keyframes reveal-lines {
from { max-height: 0; }
to { max-height: 500px; }
}
/* ===== LOADING STATES ===== */
.loading-terminal {
display: inline-block;
font-family: var(--font-mono);
color: var(--terminal-green);
}
.loading-terminal::after {
content: '...';
animation: loading-dots 1.5s steps(4, end) infinite;
}
@keyframes loading-dots {
0%, 20% { content: '.'; }
40% { content: '..'; }
60%, 100% { content: '...'; }
}
.spinner-terminal {
display: inline-block;
font-family: var(--font-mono);
color: var(--terminal-green);
}
.spinner-terminal::before { content: '['; }
.spinner-terminal::after {
content: ']';
animation: spinner-rotate 1s linear infinite;
}
@keyframes spinner-rotate {
0% { content: '|]'; }
25% { content: '/]'; }
50% { content: '─]'; }
75% { content: '\\]'; }
100% { content: '|]'; }
}
/* ===== SKELETON LOADING SCREENS ===== */
.skeleton {
position: relative;
overflow: hidden;
background: linear-gradient(90deg,
rgba(0, 255, 65, 0.05) 0%,
rgba(0, 255, 65, 0.1) 50%,
rgba(0, 255, 65, 0.05) 100%
);
background-size: 200% 100%;
animation: skeleton-shimmer 1.5s ease-in-out infinite;
}
@keyframes skeleton-shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
/* Skeleton text line */
.skeleton-text {
height: 1em;
margin: 0.5em 0;
border-radius: 0;
border: 1px solid rgba(0, 255, 65, 0.2);
}
.skeleton-text.short { width: 40%; }
.skeleton-text.medium { width: 70%; }
.skeleton-text.long { width: 90%; }
/* Skeleton table row */
.skeleton-row {
display: flex;
align-items: center;
padding: 12px 8px;
border-bottom: 1px solid rgba(0, 255, 65, 0.1);
gap: 1rem;
}
.skeleton-row .skeleton-cell {
height: 1.2em;
flex: 1;
border: 1px solid rgba(0, 255, 65, 0.15);
}
.skeleton-row .skeleton-cell:first-child { flex: 0 0 100px; }
.skeleton-row .skeleton-cell:nth-child(2) { flex: 0 0 60px; }
.skeleton-row .skeleton-cell:nth-child(3) { flex: 3; }
/* Skeleton stat card */
.skeleton-stat {
padding: 1rem;
border: 2px solid rgba(0, 255, 65, 0.2);
min-height: 80px;
}
.skeleton-stat .skeleton-value {
height: 2rem;
width: 60%;
margin-bottom: 0.5rem;
}
.skeleton-stat .skeleton-label {
height: 1rem;
width: 80%;
}
/* Skeleton comment */
.skeleton-comment {
padding: 1rem;
border: 1px solid rgba(0, 255, 65, 0.2);
margin-bottom: 1rem;
}
.skeleton-comment-header {
display: flex;
gap: 1rem;
margin-bottom: 0.75rem;
}
.skeleton-avatar {
width: 32px;
height: 32px;
border-radius: 0;
border: 1px solid rgba(0, 255, 65, 0.2);
flex-shrink: 0;
}
.skeleton-comment-meta {
flex: 1;
}
/* Terminal-style loading indicator */
.loading-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 10, 2, 0.9);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
z-index: var(--z-dropdown);
font-family: var(--font-mono);
color: var(--terminal-green);
}
.loading-overlay .loading-text {
margin-top: 1rem;
animation: blink-cursor 1s step-end infinite;
}
.loading-overlay .loading-spinner {
font-size: 2rem;
animation: terminal-spin 0.5s linear infinite;
}
@keyframes terminal-spin {
0% { content: '⠋'; }
10% { content: '⠙'; }
20% { content: '⠹'; }
30% { content: '⠸'; }
40% { content: '⠼'; }
50% { content: '⠴'; }
60% { content: '⠦'; }
70% { content: '⠧'; }
80% { content: '⠇'; }
90% { content: '⠏'; }
}
.loading-spinner::before {
content: '⠋';
animation: terminal-spin 0.8s linear infinite;
}
@keyframes blink-cursor {
0%, 50% { opacity: 1; }
51%, 100% { opacity: 0; }
}
/* ===== MESSAGE STYLES ===== */
.error-message {
padding: 15px 20px;
background: rgba(255, 77, 77, 0.1);
border: 2px solid var(--priority-1);
border-radius: 0;
font-family: var(--font-mono);
color: var(--priority-1);
margin: 20px 0;
}
.error-message::before {
content: '[!] ERROR: ';
font-weight: bold;
}
.success-message {
padding: 15px 20px;
background: rgba(40, 167, 69, 0.1);
border: 2px solid var(--status-open);
border-radius: 0;
font-family: var(--font-mono);
color: var(--status-open);
margin: 20px 0;
}
.success-message::before {
content: '[✓] SUCCESS: ';
font-weight: bold;
}
.info-message {
padding: 15px 20px;
background: rgba(66, 165, 245, 0.1);
border: 2px solid var(--priority-3);
border-radius: 0;
font-family: var(--font-mono);
color: var(--priority-3);
margin: 20px 0;
}
.info-message::before {
content: '[i] INFO: ';
font-weight: bold;
}
/* ===== EMPTY STATES ===== */
.empty-state {
text-align: center;
padding: 60px 20px;
font-family: var(--font-mono);
color: var(--terminal-green);
}
.empty-state::before {
content: '\A╔════════════════════════════╗\A║ ║\A║ NO DATA FOUND ║\A║ ║\A╚════════════════════════════╝\A';
white-space: pre;
display: block;
font-size: 0.9rem;
line-height: 1.2;
margin-bottom: 20px;
opacity: 0.7;
}
/* ===== LAYOUT COMPONENTS ===== */
.dashboard-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: var(--spacing-md);
margin-left: 3.75rem;
}
.table-controls {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
padding: 10px;
background: var(--bg-secondary);
border-radius: 0;
box-shadow: var(--shadow);
}
.ticket-count {
font-weight: 500;
color: var(--text-secondary);
}
.table-actions {
display: flex;
gap: 15px;
align-items: center;
}
/* ===== BUTTON STYLES - TERMINAL EDITION ===== */
.btn,
.btn-base,
button {
font-family: var(--font-mono);
background: transparent;
color: var(--terminal-green);
border: 2px solid var(--terminal-green);
border-radius: 0;
padding: 10px 20px;
cursor: pointer;
text-transform: uppercase;
font-weight: bold;
position: relative;
transition: all 0.3s ease;
}
.btn::before,
.btn-base::before,
button::before {
content: '[ ';
}
.btn::after,
.btn-base::after,
button::after {
content: ' ]';
}
.btn:hover,
.btn-base:hover,
button:hover {
background: rgba(0, 255, 65, 0.15);
color: var(--terminal-amber);
border-color: var(--terminal-amber);
text-shadow: var(--glow-amber-intense);
box-shadow: var(--glow-amber-intense);
transform: translateY(-2px);
animation: pulse-glow-box 1.5s ease-in-out infinite;
}
.btn:active,
.btn-base:active,
button:active {
transform: translateY(0);
box-shadow: var(--glow-green-intense);
}
@keyframes pulse-glow-box {
0%, 100% { box-shadow: 0 0 8px currentColor, 0 0 16px currentColor; }
50% { box-shadow: 0 0 12px currentColor, 0 0 24px currentColor, 0 0 32px currentColor; }
}
/* Terminal prompt for primary action buttons */
.btn.create-ticket::before,
.btn.primary::before {
content: '> ';
margin-right: 4px;
}
.btn.create-ticket::after,
.btn.primary::after {
content: '';
}
.btn-primary,
.create-ticket {
background: transparent;
color: var(--terminal-amber);
border: 2px solid var(--terminal-amber);
padding: 0.625rem 1.25rem;
border-radius: 0;
cursor: pointer;
font-weight: bold;
font-family: var(--font-mono);
text-transform: uppercase;
transition: all 0.3s ease;
margin-right: 3.75rem;
text-shadow: var(--glow-amber);
}
.btn-primary::before,
.create-ticket::before {
content: '[ ';
}
.btn-primary::after,
.create-ticket::after {
content: ' ]';
}
.btn-primary:hover,
.create-ticket:hover {
background: rgba(255, 176, 0, 0.1);
color: var(--terminal-green);
border-color: var(--terminal-green);
text-shadow: var(--glow-green);
transform: translateY(-2px);
}
/* ===== TABLE STYLES - TERMINAL EDITION ===== */
table {
width: 100%;
border-collapse: collapse;
background: var(--bg-secondary);
border: 2px solid var(--terminal-green);
border-radius: 0;
box-shadow: none;
font-family: var(--font-mono);
position: relative;
}
/* ASCII corner decorations with glow */
table::before {
content: '┌';
position: absolute;
top: -2px;
left: -2px;
font-size: 1.2rem;
color: var(--terminal-green);
text-shadow: var(--glow-green);
line-height: 1;
z-index: var(--z-base);
}
table::after {
content: '┐';
position: absolute;
top: -2px;
right: -2px;
font-size: 1.2rem;
color: var(--terminal-green);
text-shadow: var(--glow-green);
line-height: 1;
z-index: var(--z-base);
}
th, td {
padding: 12px 16px;
text-align: left;
border: 1px solid var(--terminal-green);
color: var(--terminal-green);
font-family: var(--font-mono);
}
th {
background-color: var(--bg-primary);
font-weight: bold;
text-transform: uppercase;
font-size: 0.85em;
letter-spacing: 0.1em;
position: relative;
cursor: pointer;
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
transition: all 0.3s ease;
}
th:hover {
text-shadow: var(--glow-amber-intense);
background-color: rgba(255, 176, 0, 0.05);
}
/* Add terminal prompt to headers */
th::before {
content: '> ';
color: var(--terminal-green);
margin-right: 4px;
}
tr:hover {
background-color: rgba(0, 255, 65, 0.08);
box-shadow: inset 0 0 20px rgba(0, 255, 65, 0.1);
}
/* Keyboard navigation selected row */
tbody tr.keyboard-selected {
background-color: rgba(0, 255, 65, 0.15) !important;
box-shadow: inset 0 0 30px rgba(0, 255, 65, 0.2), 0 0 10px rgba(0, 255, 65, 0.3);
outline: 2px solid var(--terminal-green);
outline-offset: -2px;
}
tbody tr.keyboard-selected td {
color: var(--terminal-green);
text-shadow: 0 0 5px rgba(0, 255, 65, 0.5);
}
tbody tr td:first-child {
border-left: 6px solid;
}
/* Priority row colors */
tbody tr.priority-1 td:first-child { border-left-color: var(--priority-1); }
tbody tr.priority-2 td:first-child { border-left-color: var(--priority-2); }
tbody tr.priority-3 td:first-child { border-left-color: var(--priority-3); }
tbody tr.priority-4 td:first-child { border-left-color: var(--priority-4); }
tbody tr.priority-5 td:first-child { border-left-color: var(--priority-5); }
/* Priority number styling - TERMINAL STYLE */
td:nth-child(2) {
text-align: center;
}
td:nth-child(2) span {
font-weight: bold;
font-family: var(--font-mono);
padding: 4px 8px;
border-radius: 0;
display: inline-block;
background: transparent;
}
/* Add brackets to priority badges */
td:nth-child(2) span::before {
content: '[';
color: var(--terminal-green);
margin-right: 2px;
}
td:nth-child(2) span::after {
content: ']';
color: var(--terminal-green);
margin-left: 2px;
}
.priority-1 td:nth-child(2) {
color: var(--priority-1);
text-shadow: var(--glow-priority-1);
font-weight: bold;
}
.priority-1 td:nth-child(2)::after {
content: ' ▲▲';
font-size: 0.7em;
}
.priority-2 td:nth-child(2) {
color: var(--priority-2);
text-shadow: var(--glow-priority-2);
font-weight: bold;
}
.priority-2 td:nth-child(2)::after {
content: ' ▲';
font-size: 0.7em;
}
.priority-3 td:nth-child(2) {
color: var(--priority-3);
text-shadow: var(--glow-priority-3);
}
.priority-3 td:nth-child(2)::after {
content: ' ●';
font-size: 0.7em;
}
.priority-4 td:nth-child(2) {
color: var(--priority-4);
text-shadow: var(--glow-priority-4);
}
.priority-4 td:nth-child(2)::after {
content: ' ▼';
font-size: 0.7em;
}
.priority-5 td:nth-child(2) {
color: var(--priority-5);
text-shadow: var(--glow-priority-5);
}
.priority-5 td:nth-child(2)::after {
content: ' ▼▼';
font-size: 0.7em;
}
/* ===== STATUS STYLES - TERMINAL EDITION ===== */
.status-Open {
background-color: transparent !important;
color: var(--status-open) !important;
padding: 4px 12px;
border-radius: 0 !important;
border: 2px solid var(--status-open) !important;
font-size: 0.875rem;
font-weight: 500;
font-family: var(--font-mono);
text-shadow: 0 0 5px var(--status-open), 0 0 10px var(--status-open);
}
.status-Open::before {
content: '[●';
margin-right: 4px;
}
.status-Open::after {
content: ']';
margin-left: 4px;
}
.status-In-Progress {
background-color: transparent !important;
color: var(--status-in-progress) !important;
padding: 4px 12px;
border-radius: 0 !important;
border: 2px solid var(--status-in-progress) !important;
font-size: 0.875rem;
font-weight: 500;
min-width: 140px;
white-space: nowrap;
display: inline-block;
font-family: var(--font-mono);
text-shadow: 0 0 5px var(--status-in-progress), 0 0 10px var(--status-in-progress);
}
.status-In-Progress::before {
content: '[◐';
margin-right: 4px;
animation: spin-status 2s linear infinite;
}
@keyframes spin-status {
0% { content: '[◐'; }
25% { content: '[◓'; }
50% { content: '[◑'; }
75% { content: '[◒'; }
100% { content: '[◐'; }
}
.status-In-Progress::after {
content: ']';
margin-left: 4px;
}
.status-Closed {
background-color: transparent !important;
color: var(--status-closed) !important;
padding: 4px 12px;
border-radius: 0 !important;
border: 2px solid var(--status-closed) !important;
font-size: 0.875rem;
font-weight: 500;
font-family: var(--font-mono);
text-shadow: 0 0 5px var(--status-closed), 0 0 10px var(--status-closed);
}
.status-Closed::before {
content: '[✓';
margin-right: 4px;
}
.status-Closed::after {
content: ']';
margin-left: 4px;
}
.status-Pending {
background-color: transparent !important;
color: var(--status-pending) !important;
padding: 4px 12px;
border-radius: 0 !important;
border: 2px solid var(--status-pending) !important;
font-size: 0.875rem;
font-weight: 500;
font-family: var(--font-mono);
text-shadow: 0 0 5px var(--status-pending), 0 0 10px var(--status-pending);
}
.status-Pending::before {
content: '[⏸';
margin-right: 4px;
}
.status-Pending::after {
content: ']';
margin-left: 4px;
}
/* ===== ACTIVE FILTERS BAR ===== */
.active-filters-bar {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 0.5rem;
padding: 0.75rem 1rem;
margin-bottom: 1rem;
background: rgba(0, 255, 65, 0.05);
border: 1px solid var(--terminal-green);
border-left: 4px solid var(--terminal-amber);
}
.active-filters-label {
font-family: var(--font-mono);
font-size: 0.85rem;
color: var(--terminal-amber);
font-weight: 600;
margin-right: 0.5rem;
}
.active-filters-list {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
flex: 1;
}
.filter-badge {
display: inline-flex;
align-items: center;
gap: 0.4rem;
padding: 0.3rem 0.6rem;
background: rgba(0, 255, 65, 0.1);
border: 1px solid var(--terminal-green);
font-family: var(--font-mono);
font-size: 0.8rem;
color: var(--terminal-green);
animation: filter-appear 0.3s ease-out;
}
@keyframes filter-appear {
from {
opacity: 0;
transform: scale(0.9);
}
to {
opacity: 1;
transform: scale(1);
}
}
.filter-badge[data-filter-type="status"] {
border-color: var(--terminal-cyan);
color: var(--terminal-cyan);
}
.filter-badge[data-filter-type="priority"] {
border-color: var(--terminal-amber);
color: var(--terminal-amber);
}
.filter-badge[data-filter-type="search"] {
border-color: var(--terminal-magenta, #ff79c6);
color: var(--terminal-magenta, #ff79c6);
}
.filter-remove {
background: none;
border: none;
color: inherit;
font-size: 1.1rem;
line-height: 1;
cursor: pointer;
padding: 0 0.2rem;
opacity: 0.7;
transition: opacity 0.2s, transform 0.2s;
}
.filter-remove:hover {
opacity: 1;
transform: scale(1.2);
}
.btn-sm {
padding: 0.3rem 0.6rem;
font-size: 0.8rem;
}
/* ===== SEARCH AND FILTER STYLES - TERMINAL EDITION ===== */
.search-box,
input[type="text"],
input[type="search"],
textarea,
select {
font-family: var(--font-mono);
background: var(--bg-primary);
color: var(--terminal-green);
border: 2px solid var(--terminal-green);
border-radius: 0;
padding: 8px 12px;
transition: all 0.3s ease;
box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.5);
}
.search-box:focus,
input[type="text"]:focus,
input[type="search"]:focus,
textarea:focus,
select:focus {
outline: none;
border-color: var(--terminal-amber);
box-shadow: var(--glow-amber), inset 0 0 10px rgba(0, 0, 0, 0.5);
background: rgba(0, 255, 65, 0.05);
}
.search-box {
margin-left: 1.25rem;
width: 40%;
}
input:focus,
textarea:focus,
select:focus,
.search-box:focus {
outline: none;
border-color: var(--terminal-amber);
box-shadow: 0 0 10px rgba(255, 176, 0, 0.3);
text-shadow: var(--glow-green);
}
.search-container {
margin: 20px 0;
padding: 0 20px;
}
.search-form {
display: flex;
gap: 10px;
align-items: center;
flex-wrap: wrap;
}
/* Terminal prompt before search box */
.search-form::before {
content: '$ SEARCH';
font-family: var(--font-mono);
color: var(--terminal-amber);
font-weight: bold;
text-shadow: var(--glow-amber);
}
/* Checkbox styling */
input[type="checkbox"] {
appearance: none;
width: 18px;
height: 18px;
border: 2px solid var(--terminal-green);
background: var(--bg-primary);
position: relative;
cursor: pointer;
border-radius: 0;
}
input[type="checkbox"]:checked::before {
content: '✓';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: var(--terminal-green);
font-size: 14px;
font-weight: bold;
}
input[type="checkbox"]:checked {
background: rgba(0, 255, 65, 0.1);
}
.search-box:focus {
outline: none;
border-color: #007cba;
}
.search-btn {
padding: 10px 20px;
background-color: #007cba;
color: white;
border: none;
border-radius: 0;
cursor: pointer;
font-size: 16px;
transition: background-color 0.3s;
}
.search-btn:hover {
background-color: #005a87;
}
.clear-search-btn {
padding: 10px 15px;
background-color: #6c757d;
color: white;
text-decoration: none;
border-radius: 0;
font-size: 14px;
transition: background-color 0.3s;
}
.clear-search-btn:hover {
background-color: #545b62;
}
/* Show search results info */
.search-results-info {
margin: 10px 0;
padding: 10px;
background-color: #e7f3ff;
border-left: 4px solid #007cba;
border-radius: 0;
}
/* Status Filter Dropdown */
.status-filter-container {
position: relative;
display: inline-block;
margin-right: 15px;
}
.status-dropdown {
position: relative;
display: inline-block;
}
.dropdown-header {
padding: 8px 15px;
background: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 0;
cursor: pointer;
min-width: 120px;
}
.dropdown-content {
display: none;
position: absolute;
top: 100%;
left: 0;
background: var(--bg-secondary);
min-width: 160px;
box-shadow: var(--shadow);
border-radius: 0;
padding: 10px;
z-index: var(--z-dropdown);
border: 1px solid var(--border-color);
}
.status-dropdown.active .dropdown-content {
display: block;
}
.dropdown-content label {
display: block;
padding: 8px;
cursor: pointer;
transition: background 0.2s;
}
.dropdown-content label:hover {
background: var(--hover-bg);
}
.dropdown-content .save-filter {
margin-top: 10px;
width: 100%;
padding: 8px;
background: #3b82f6;
color: white;
border: none;
border-radius: 0;
cursor: pointer;
}
/* ===== COLLAPSIBLE ASCII BANNER ===== */
.ascii-banner-wrapper {
max-width: 100%;
margin: 0 1rem 1rem 1rem;
border: 2px solid var(--terminal-green);
background: var(--bg-secondary);
}
.ascii-banner-wrapper.collapsed .banner-content {
display: none;
}
.banner-toggle {
width: 100%;
background: var(--bg-secondary);
border: none;
color: var(--terminal-amber);
padding: 0.5rem 1rem;
cursor: pointer;
font-family: var(--font-mono);
text-align: left;
font-size: 0.9rem;
text-shadow: var(--glow-amber);
transition: all 0.2s ease;
}
.banner-toggle:hover {
background: var(--hover-bg);
box-shadow: inset 0 0 20px rgba(255, 176, 0, 0.2);
}
.toggle-icon {
display: inline-block;
width: 1rem;
text-align: center;
color: var(--terminal-green);
transition: transform 0.3s ease;
}
.banner-content {
padding: 1rem;
text-align: center;
}
/* ===== CONDENSED TOOLBAR ===== */
.dashboard-toolbar {
display: flex;
flex-wrap: wrap;
gap: 1rem;
align-items: center;
justify-content: space-between;
padding: 1rem;
background: var(--bg-secondary);
border: 2px solid var(--terminal-green);
margin-bottom: 1rem;
box-shadow: var(--glow-green);
}
.toolbar-left {
display: flex;
align-items: center;
gap: 1rem;
flex: 1;
min-width: 300px;
}
.dashboard-title {
font-family: var(--font-mono);
color: var(--terminal-green);
text-shadow: var(--glow-green);
font-size: 1.5rem;
margin: 0;
white-space: nowrap;
}
.toolbar-search {
display: flex;
gap: 0.5rem;
flex: 1;
}
.toolbar-center {
display: flex;
align-items: center;
gap: 1rem;
}
.toolbar-right {
display: flex;
align-items: center;
}
.ticket-count {
font-family: var(--font-mono);
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
font-size: 0.9rem;
white-space: nowrap;
}
.clear-search-btn {
background: var(--bg-primary);
color: var(--priority-1);
border: 2px solid var(--priority-1);
padding: 0.5rem 0.75rem;
font-family: var(--font-mono);
text-decoration: none;
cursor: pointer;
transition: all 0.2s ease;
}
.clear-search-btn:hover {
background: var(--priority-1);
color: var(--bg-primary);
box-shadow: var(--glow-red);
}
.search-results-info {
background: var(--bg-secondary);
border: 2px solid var(--terminal-amber);
padding: 0.75rem 1rem;
margin-bottom: 1rem;
font-family: var(--font-mono);
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
}
/* Inline Bulk Actions */
.bulk-actions-inline {
padding: 0.75rem 1rem;
background: var(--bg-primary);
border: 2px solid var(--terminal-amber);
border-radius: 0;
margin-bottom: 1rem;
display: flex;
gap: 1rem;
align-items: center;
font-family: var(--font-mono);
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
box-shadow: inset 0 0 20px rgba(255, 176, 0, 0.2);
}
.bulk-actions-inline .btn {
padding: 0.4rem 0.8rem;
font-size: 0.85rem;
}
/* Mobile: Stack toolbar items */
@media (max-width: 1024px) {
.dashboard-toolbar {
flex-direction: column;
align-items: stretch;
}
.toolbar-left,
.toolbar-center,
.toolbar-right {
width: 100%;
justify-content: space-between;
}
.toolbar-search {
min-width: 100%;
}
.dashboard-title {
font-size: 1.2rem;
}
}
@media (max-width: 768px) {
.toolbar-left {
flex-direction: column;
align-items: stretch;
}
.dashboard-title {
text-align: center;
}
}
/* ===== DASHBOARD SIDEBAR LAYOUT ===== */
.dashboard-layout {
display: flex;
gap: 1.5rem;
max-width: 100%;
margin: 0 auto;
padding: 0 1rem;
}
.dashboard-sidebar {
width: 250px;
flex-shrink: 0;
position: sticky;
top: 1rem;
max-height: calc(100vh - 2rem);
overflow-y: auto;
}
.dashboard-sidebar .ascii-frame-inner {
background: var(--bg-secondary);
padding: 1rem;
border: 2px solid var(--terminal-green);
box-shadow: var(--glow-green);
position: relative;
overflow: hidden;
}
.dashboard-sidebar .ascii-frame-inner::before {
content: '│';
position: absolute;
left: 5px;
top: 0;
height: 100%;
color: var(--terminal-green);
opacity: 0.3;
font-size: 1.5rem;
line-height: 1.2;
pointer-events: none;
}
.dashboard-sidebar .ascii-subsection-header {
color: var(--terminal-amber);
text-shadow: var(--glow-amber-intense);
font-family: var(--font-mono);
font-size: 0.95rem;
text-transform: uppercase;
margin-bottom: 1rem;
padding-bottom: 0.5rem;
border-bottom: 2px solid var(--terminal-green);
position: relative;
white-space: nowrap;
overflow: hidden;
}
.dashboard-sidebar .ascii-subsection-header::before {
content: '╔══ ';
color: var(--terminal-green);
text-shadow: var(--glow-green);
}
.dashboard-sidebar .ascii-subsection-header::after {
content: ' ══╗';
color: var(--terminal-green);
text-shadow: var(--glow-green);
}
.filter-group {
margin-bottom: 1.5rem;
}
.filter-group h4 {
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
margin: 0 0 0.5rem 0;
font-size: 0.9rem;
text-transform: uppercase;
font-family: var(--font-mono);
}
.filter-group label {
display: block;
margin: 0.4rem 0;
color: var(--terminal-green);
cursor: pointer;
font-size: 0.85rem;
font-family: var(--font-mono);
transition: all 0.2s ease;
}
.filter-group label:hover {
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
padding-left: 4px;
}
.filter-group input[type="checkbox"] {
margin-right: 0.5rem;
cursor: pointer;
accent-color: var(--terminal-green);
width: 16px;
height: 16px;
border: 2px solid var(--terminal-green);
transition: all 0.2s ease;
}
.filter-group input[type="checkbox"]:checked {
box-shadow: var(--glow-green);
}
.filter-group input[type="checkbox"]:hover {
filter: brightness(1.3);
}
.dashboard-sidebar .btn {
width: 100%;
margin-top: 0.5rem;
padding: 0.5rem;
background: var(--bg-primary);
color: var(--terminal-green);
border: 2px solid var(--terminal-green);
font-family: var(--font-mono);
cursor: pointer;
transition: all 0.2s ease;
}
.dashboard-sidebar .btn:hover {
background: var(--terminal-green);
color: var(--bg-primary);
box-shadow: var(--glow-green);
}
.dashboard-sidebar .btn-secondary {
background: transparent;
color: var(--terminal-amber);
border-color: var(--terminal-amber);
}
.dashboard-sidebar .btn-secondary:hover {
background: var(--terminal-amber);
color: var(--bg-primary);
box-shadow: var(--glow-amber);
}
/* Collapsible Sidebar */
.dashboard-sidebar {
position: relative;
transition: width 0.3s ease, min-width 0.3s ease;
overflow: hidden;
}
.sidebar-content {
transition: opacity 0.2s ease;
width: 250px;
}
/* Collapse button inside sidebar */
.sidebar-collapse-btn {
display: block;
width: 100%;
padding: 0.5rem 1rem;
background: var(--bg-secondary);
border: none;
border-bottom: 2px solid var(--terminal-green);
color: var(--terminal-green);
font-family: var(--font-mono);
font-size: 0.85rem;
cursor: pointer;
text-align: left;
transition: background 0.2s ease;
}
.sidebar-collapse-btn:hover {
background: rgba(0, 255, 65, 0.15);
color: var(--terminal-amber);
}
/* Expand button shown when collapsed */
.sidebar-expand-btn {
display: none;
padding: 0.5rem 1rem;
background: var(--bg-secondary);
border: 2px solid var(--terminal-green);
color: var(--terminal-green);
font-family: var(--font-mono);
font-size: 0.85rem;
cursor: pointer;
white-space: nowrap;
transition: background 0.2s ease;
margin-right: 1rem;
flex-shrink: 0;
}
.sidebar-expand-btn:hover {
background: rgba(0, 255, 65, 0.15);
color: var(--terminal-amber);
border-color: var(--terminal-amber);
}
/* Collapsed state */
.dashboard-sidebar.collapsed {
width: 0;
min-width: 0;
}
.dashboard-sidebar.collapsed .sidebar-content,
.dashboard-sidebar.collapsed .sidebar-collapse-btn {
opacity: 0;
pointer-events: none;
}
.dashboard-layout.sidebar-collapsed .sidebar-expand-btn {
display: block;
}
/* Hide collapse controls on mobile */
@media (max-width: 768px) {
.sidebar-collapse-btn,
.sidebar-expand-btn {
display: none !important;
}
}
.dashboard-main {
flex: 1;
min-width: 0;
}
/* Mobile: Stack sidebar above content */
@media (max-width: 768px) {
.dashboard-layout {
flex-direction: column;
padding: 0 0.5rem;
}
.dashboard-sidebar {
width: 100%;
position: static;
max-height: none;
margin-bottom: 1rem;
}
}
/* ===== BOOT SEQUENCE ===== */
.boot-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: var(--bg-primary);
z-index: var(--z-modal-backdrop);
display: flex;
align-items: center;
justify-content: center;
transition: opacity 0.5s;
}
#boot-text {
font-family: var(--font-mono);
color: var(--terminal-green);
text-shadow: var(--glow-green);
font-size: 0.95rem;
line-height: 1.6;
white-space: pre;
padding: 2rem;
}
/* ===== ASCII LOADING SPINNER ===== */
.loading-spinner {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: var(--z-modal);
background: var(--bg-primary);
border: 3px solid var(--terminal-green);
padding: 2rem;
box-shadow: 0 0 30px rgba(0, 255, 65, 0.5);
font-family: var(--font-mono);
color: var(--terminal-green);
font-size: 1.5rem;
text-shadow: var(--glow-green);
display: none;
}
.loading-spinner.active {
display: block;
}
.spinner-text {
text-align: center;
}
.spinner-frames {
animation: spin-frames 0.8s steps(8) infinite;
}
@keyframes spin-frames {
0% { content: '|'; }
12.5% { content: '/'; }
25% { content: '—'; }
37.5% { content: '\\'; }
50% { content: '|'; }
62.5% { content: '/'; }
75% { content: '—'; }
87.5% { content: '\\'; }
}
.spinner-frames::before {
content: '|';
display: inline-block;
animation: spin-frames 0.8s steps(8) infinite;
}
/* ===== UTILITY STYLES ===== */
.ticket-link {
font-family: 'Courier New', monospace;
font-weight: bold;
color: var(--text-primary) !important;
text-decoration: none;
background: var(--hover-bg);
padding: 4px 8px;
border-radius: 0;
display: inline-block;
border: 1px solid transparent;
transition: all 0.3s ease;
text-shadow: var(--glow-green);
}
.ticket-link::before {
content: '#';
color: var(--terminal-amber);
margin-right: 2px;
}
.ticket-link:hover {
background: rgba(0, 255, 65, 0.2);
border-color: var(--terminal-green);
text-shadow: var(--glow-green-intense);
transform: translateX(2px);
}
/* ===== PAGINATION STYLES ===== */
.pagination {
display: flex;
gap: 0.5rem;
align-items: center;
}
.pagination button {
padding: 0.5rem 0.75rem;
border: 2px solid var(--terminal-green);
background: var(--bg-secondary);
color: var(--terminal-green);
border-radius: 0;
cursor: pointer;
transition: all 0.3s ease;
font-family: var(--font-mono);
text-shadow: var(--glow-green);
}
.pagination button:hover {
background: rgba(0, 255, 65, 0.15);
box-shadow: var(--glow-green);
transform: translateY(-1px);
}
.pagination button.active {
background: var(--terminal-green);
color: var(--bg-primary);
border-color: var(--terminal-green);
box-shadow: var(--glow-green-intense);
font-weight: bold;
}
/* ===== SORTING STYLES ===== */
th::after {
content: '';
position: absolute;
right: 8px;
top: 50%;
transform: translateY(-50%);
width: 0;
height: 0;
border-left: 5px solid transparent;
border-right: 5px solid transparent;
opacity: 0.5;
}
th.sort-asc::after {
border-bottom: 7px solid var(--text-primary);
opacity: 1;
}
th.sort-desc::after {
border-top: 7px solid var(--text-primary);
opacity: 1;
}
/* Dark mode bulk actions */
body.dark-mode .bulk-actions-toolbar {
--toolbar-bg: #2d3748;
--toolbar-border: #ffc107;
--text-primary: #f8f9fa;
background: #2d3748 !important;
}
body.dark-mode .bulk-actions-info {
color: #ffc107;
font-weight: bold;
}
body.dark-mode .btn-bulk {
--btn-bulk-bg: #0d6efd;
--btn-bulk-hover: #0b5ed7;
}
body.dark-mode .btn-secondary {
--btn-secondary-bg: #495057;
--btn-secondary-hover: #343a40;
}
/* Modal styles */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: var(--z-modal);
}
.modal-content {
background: var(--bg-primary, white);
padding: 2rem;
border-radius: 0;
min-width: 300px;
max-width: 500px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
.modal-content h3 {
margin-top: 0;
margin-bottom: 1rem;
color: var(--text-primary, #333);
}
.modal-body {
margin-bottom: 1.5rem;
}
.modal-body label {
display: block;
margin-bottom: 0.5rem;
font-weight: 500;
color: var(--text-primary, #333);
}
.modal-body select {
width: 100%;
padding: 0.5rem;
border: 1px solid var(--border-color, #ddd);
border-radius: 0;
background: var(--bg-secondary, #f8f9fa);
color: var(--text-primary, #333);
}
.modal-footer {
display: flex;
gap: 0.5rem;
justify-content: flex-end;
}
/* Dark mode modal */
body.dark-mode .modal-content {
--bg-primary: #2d3748;
--bg-secondary: #1a202c;
--text-primary: #f7fafc;
--border-color: #4a5568;
}
body.dark-mode .modal-body select {
background: #1a202c;
color: #f7fafc;
border-color: #4a5568;
}
/* Checkbox styling in table */
.ticket-checkbox {
cursor: pointer;
width: 18px;
height: 18px;
}
#selectAllCheckbox {
cursor: pointer;
width: 18px;
height: 18px;
}
/* Checkbox cell - click anywhere to toggle */
.checkbox-cell {
cursor: pointer;
text-align: center;
transition: background-color 0.2s ease;
}
.checkbox-cell:hover {
background-color: rgba(0, 255, 65, 0.15);
}
/* Responsive bulk actions */
@media (max-width: 768px) {
.bulk-actions-toolbar {
flex-direction: column;
align-items: stretch;
}
.bulk-actions-info {
text-align: center;
margin-bottom: 0.5rem;
}
.bulk-actions-buttons {
justify-content: center;
}
}
/* Comprehensive Dark Mode Fix - Dashboard */
body.dark-mode {
background: #1a202c !important;
color: #e2e8f0 !important;
}
body.dark-mode .dashboard-container,
body.dark-mode .dashboard-content {
background: #1a202c !important;
color: #e2e8f0 !important;
}
/* Ensure table has dark background */
body.dark-mode table {
background: #2d3748 !important;
}
body.dark-mode table thead {
background: #1a202c !important;
}
body.dark-mode table tbody tr {
background: #2d3748 !important;
}
body.dark-mode table tbody tr:hover {
background: #374151 !important;
}
body.dark-mode table td,
body.dark-mode table th {
color: #e2e8f0 !important;
border-color: #4a5568 !important;
}
/* Fix search box */
body.dark-mode .search-box,
body.dark-mode input[type="search"],
body.dark-mode input[type="text"] {
background: #2d3748 !important;
color: #e2e8f0 !important;
border-color: #4a5568 !important;
}
/* Fix any white backgrounds in modals */
body.dark-mode .modal-content {
background: #2d3748 !important;
color: #e2e8f0 !important;
}
/* Fix dropdown menus */
body.dark-mode select option {
background: #2d3748 !important;
color: #e2e8f0 !important;
}
/* ===== RESPONSIVE DESIGN - TERMINAL EDITION ===== */
/* Tablet and smaller */
@media (max-width: 1024px) {
/* Smaller ASCII banner */
.ascii-banner {
font-size: 0.6rem !important;
}
/* Reduce table padding */
th, td {
padding: 8px 12px;
}
/* Stack bulk actions */
.bulk-actions-buttons {
flex-direction: column;
}
/* Simplify ASCII corners - use single-line chars */
.ascii-frame-outer::before {
content: '┌';
font-size: 1.2rem;
}
.ascii-frame-outer::after {
content: '┐';
font-size: 1.2rem;
}
.bottom-left-corner {
content: '└';
font-size: 1.2rem;
}
.bottom-right-corner {
content: '┘';
font-size: 1.2rem;
}
/* Simplify section headers */
.ascii-section-header::before {
content: '├─ ';
}
.ascii-section-header::after {
content: ' ─┤';
}
/* Simplify dividers */
.ascii-divider::before {
content: '├';
}
.ascii-divider::after {
content: '┤';
}
}
/* Mobile */
@media (max-width: 768px) {
/* Use compact ASCII banner */
.ascii-banner {
font-size: 0.5rem !important;
}
/* Remove all ASCII corners for mobile */
.ascii-frame-outer::before,
.ascii-frame-outer::after,
.bottom-left-corner,
.bottom-right-corner {
display: none !important;
}
/* Simplify inner frames - remove corners */
.ascii-frame-inner::before,
.ascii-frame-inner::after {
display: none !important;
}
/* Keep section headers but simplify */
.ascii-section-header::before {
content: '> ';
}
.ascii-section-header::after {
content: '';
}
.ascii-section-header {
font-size: 0.9rem;
padding: 0.5rem 1rem;
}
/* Simplify subsection headers */
.ascii-subsection-header::before {
content: '• ';
}
.ascii-subsection-header::after {
content: '';
}
/* Remove dividers on mobile */
.ascii-divider {
display: none;
}
/* Reduce padding in ascii-content */
.ascii-content {
padding: 0.5rem;
}
.ascii-frame-inner {
padding: 0.5rem;
margin: 0.5rem;
border-width: 1px;
}
/* Hide decorative ASCII corners on small screens (legacy) */
table::before,
table::after,
.ticket-container::before,
.ticket-container::after,
.settings-modal::before,
.settings-modal::after {
display: none;
}
/* Simplify borders */
.ticket-header::before {
display: none;
}
/* Full-width hamburger menu */
.hamburger-content {
width: 100%;
left: -100%;
}
.hamburger-content.open {
left: 0;
}
/* Reduce padding everywhere */
.ascii-box,
.terminal-form-group,
.comment,
.timeline-content {
padding: 10px;
}
/* Smaller glow effects */
.glow-text,
[class*="glow-"] {
text-shadow: 0 0 3px currentColor;
}
/* Stack buttons vertically */
.btn,
button {
width: 100%;
margin: 5px 0;
}
/* Reduce font size slightly */
body {
font-size: 14px;
}
/* Smaller table text */
th, td {
font-size: 0.85rem;
padding: 6px 8px;
}
/* Hide some table columns on mobile */
th:nth-child(n+6),
td:nth-child(n+6) {
display: none;
}
}
/* Very small mobile */
@media (max-width: 480px) {
/* Minimal ASCII banner */
.ascii-banner {
font-size: 0.4rem !important;
}
/* Remove all pseudo-element decorations except essential ones */
*::before,
*::after {
content: none !important;
}
/* Collapse nested frames - minimal borders */
.ascii-frame-outer,
.ascii-frame-inner {
border-width: 1px;
padding: 0.25rem;
margin: 0.25rem;
}
/* Section headers without decorations */
.ascii-section-header,
.ascii-subsection-header {
font-size: 0.85rem;
padding: 0.4rem 0.5rem;
text-transform: none;
letter-spacing: normal;
}
/* Minimal content padding */
.ascii-content {
padding: 0.25rem;
}
/* Re-enable essential pseudo-elements */
.search-form::before {
content: '$ ' !important;
}
/* Simplify modals */
.settings-modal,
.modal-content {
width: 95%;
max-width: 95%;
}
/* Reduce ticket container size */
.ticket-container {
width: 95%;
min-width: unset;
margin: 20px auto;
}
/* Stack tabs vertically */
.ticket-tabs {
flex-direction: column;
}
.tab-btn {
width: 100%;
margin-bottom: 5px;
}
}
/* Print styles - terminal aesthetic */
@media print {
body {
background: white;
color: black;
}
.ascii-banner,
.theme-toggle,
.hamburger-menu,
.bulk-actions-toolbar {
display: none;
}
table,
.ticket-container {
border-color: black;
}
/* Remove glows for print */
* {
text-shadow: none !important;
box-shadow: none !important;
}
}
/* ===== TERMINAL TOAST NOTIFICATIONS ===== */
.terminal-toast {
position: fixed;
top: 20px;
right: 20px;
background: var(--bg-secondary);
border: 2px solid var(--terminal-green);
padding: 1rem 1.5rem;
font-family: var(--font-mono);
font-size: 0.9rem;
color: var(--terminal-green);
text-shadow: var(--glow-green);
box-shadow: 0 0 20px rgba(0, 255, 65, 0.3);
z-index: var(--z-toast);
opacity: 0;
transform: translateX(400px);
transition: all 0.3s ease;
max-width: 400px;
word-wrap: break-word;
}
.terminal-toast.show {
opacity: 1;
transform: translateX(0);
}
.toast-icon {
display: inline-block;
margin-right: 0.5rem;
font-weight: bold;
}
.toast-success {
border-color: var(--status-open);
color: var(--status-open);
text-shadow: 0 0 5px var(--status-open);
}
.toast-error {
border-color: var(--status-closed);
color: var(--status-closed);
text-shadow: 0 0 5px var(--status-closed);
}
.toast-warning {
border-color: var(--status-in-progress);
color: var(--status-in-progress);
text-shadow: 0 0 5px var(--status-in-progress);
}
.toast-info {
border-color: var(--terminal-cyan);
color: var(--terminal-cyan);
text-shadow: 0 0 5px var(--terminal-cyan);
}
/* ========================================
SETTINGS MODAL STYLES
======================================== */
/* Settings Icon */
.settings-icon {
background: transparent;
border: 2px solid var(--terminal-green);
color: var(--terminal-green);
font-size: 1.2rem;
padding: 0.25rem 0.5rem;
cursor: pointer;
font-family: var(--font-mono);
transition: all 0.3s ease;
border-radius: 0;
margin-left: 1rem;
}
.settings-icon:hover {
background: var(--terminal-green);
color: var(--bg-primary);
box-shadow: var(--glow-green);
}
/* Settings Modal Container - acts as backdrop */
.settings-modal {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
z-index: var(--z-modal);
background: rgba(0, 0, 0, 0.85);
backdrop-filter: blur(5px);
display: flex;
align-items: center;
justify-content: center;
padding: 1rem;
overflow-y: auto;
}
.settings-content {
position: relative;
background: var(--bg-secondary);
border: 2px solid var(--terminal-green);
box-shadow: 0 0 30px rgba(0, 255, 65, 0.5);
max-width: 800px;
width: 100%;
max-height: calc(90vh - 2rem);
overflow-y: auto;
overflow-x: hidden;
font-family: var(--font-mono);
padding: 2rem;
animation: settingsSlideIn 0.3s ease;
margin: auto;
box-sizing: border-box;
}
@keyframes settingsSlideIn {
from {
opacity: 0;
transform: translateY(-30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Settings Header */
.settings-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 2rem;
padding-bottom: 1rem;
border-bottom: 2px solid var(--terminal-green);
}
.settings-header h3 {
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
font-family: var(--font-mono);
font-size: 1.5rem;
margin: 0;
}
.close-settings {
background: transparent;
border: 2px solid var(--terminal-green);
color: var(--terminal-green);
font-size: 1.5rem;
padding: 0.25rem 0.75rem;
cursor: pointer;
font-family: var(--font-mono);
transition: all 0.3s ease;
}
.close-settings:hover {
background: var(--status-closed);
border-color: var(--status-closed);
color: var(--bg-primary);
box-shadow: 0 0 10px var(--status-closed);
}
/* Settings Body */
.settings-body {
margin-bottom: 2rem;
}
/* Settings Sections */
.settings-section {
margin-bottom: 2rem;
border: 2px solid var(--terminal-green);
padding: 1rem;
}
.settings-section h4 {
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
font-family: var(--font-mono);
margin-bottom: 1rem;
font-size: 1rem;
}
/* Setting Rows */
.setting-row {
margin-bottom: 1rem;
display: flex;
flex-wrap: wrap;
align-items: flex-start;
gap: 0.5rem 1rem;
}
.setting-row:last-child {
margin-bottom: 0;
}
.setting-row label {
color: var(--terminal-green);
font-family: var(--font-mono);
flex-shrink: 0;
}
/* Form elements within setting rows */
.setting-row input[type="text"],
.setting-row input[type="number"],
.setting-row input[type="date"],
.setting-row input[type="time"],
.setting-row select,
.setting-row textarea {
flex: 1;
min-width: 0;
font-family: var(--font-mono);
background: var(--bg-primary);
color: var(--terminal-green);
border: 2px solid var(--terminal-green);
padding: 0.5rem;
}
.setting-row input:focus,
.setting-row select:focus,
.setting-row textarea:focus {
outline: none;
border-color: var(--terminal-amber);
box-shadow: 0 0 10px rgba(255, 193, 7, 0.3);
}
.setting-row textarea {
resize: vertical;
min-height: 100px;
}
/* Checkbox in setting row */
.setting-row label:has(input[type="checkbox"]) {
display: flex;
align-items: center;
gap: 0.5rem;
cursor: pointer;
padding-top: 0;
}
.setting-row input[type="checkbox"] {
flex: none;
min-width: auto;
width: 1.2rem;
height: 1.2rem;
cursor: pointer;
accent-color: var(--terminal-green);
}
/* Compact setting rows - stacked layout for grids/narrow containers */
.setting-row-compact {
flex-direction: column !important;
align-items: stretch !important;
gap: 0.25rem !important;
}
.setting-row-compact label {
min-width: auto !important;
padding-top: 0 !important;
margin-bottom: 0.25rem;
}
.setting-row-compact input,
.setting-row-compact select,
.setting-row-compact textarea {
width: 100% !important;
min-width: auto !important;
}
.setting-select {
flex: 1;
max-width: 200px;
font-family: var(--font-mono);
background: var(--bg-primary);
color: var(--terminal-green);
border: 2px solid var(--terminal-green);
padding: 0.5rem;
cursor: pointer;
}
/* Setting select width variants */
.setting-select-wide {
max-width: 70%;
}
.setting-select-full {
max-width: 100%;
}
.setting-select-narrow {
max-width: 90px;
}
/* Setting row layout variants */
.setting-row-right {
justify-content: flex-end;
}
/* Button size variants for settings */
.btn-setting {
padding: 0.5rem 1rem;
}
/* Utility text classes */
.text-muted {
color: var(--text-muted);
}
.text-small {
font-size: 0.85rem;
}
.text-center {
text-align: center;
}
/* Utility spacing classes */
.mt-sm {
margin-top: 0.25rem;
}
.display-block {
display: block;
}
/* Empty state styling */
.empty-state {
text-align: center;
padding: 3rem;
}
.empty-state-terminal {
color: var(--terminal-green);
text-shadow: var(--glow-green);
font-size: 0.8rem;
line-height: 1.2;
}
/* Separator text */
.separator-text {
color: var(--terminal-green);
}
/* Checkbox column width */
.checkbox-column {
width: 40px;
}
/* Actions column width */
.actions-column {
width: 100px;
text-align: center;
}
.setting-select:focus {
outline: none;
border-color: var(--terminal-amber);
box-shadow: 0 0 10px rgba(255, 193, 7, 0.3);
}
/* Checkbox Group */
.checkbox-group {
display: flex;
gap: 1rem;
flex-wrap: wrap;
flex: 1;
}
.checkbox-group label {
min-width: auto;
display: flex;
align-items: center;
gap: 0.5rem;
cursor: pointer;
}
.checkbox-group input[type="checkbox"] {
cursor: pointer;
}
/* Keyboard Shortcuts Display */
.shortcuts-list {
font-family: var(--font-mono);
}
.shortcut-item {
display: flex;
justify-content: space-between;
padding: 0.5rem 0;
border-bottom: 1px solid var(--terminal-green);
}
.shortcut-item:last-child {
border-bottom: none;
}
.shortcut-item kbd {
background: var(--bg-primary);
border: 2px solid var(--terminal-green);
padding: 0.25rem 0.5rem;
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
font-family: var(--font-mono);
font-size: 0.9rem;
}
.shortcut-item span {
color: var(--terminal-green);
}
/* User Info Grid */
.user-info-grid {
display: grid;
grid-template-columns: 150px 1fr;
gap: 0.5rem 1rem;
font-family: var(--font-mono);
color: var(--terminal-green);
}
.user-info-grid div {
padding: 0.25rem 0;
}
/* Settings Footer */
.settings-footer {
display: flex;
gap: 1rem;
justify-content: flex-end;
padding-top: 1rem;
border-top: 2px solid var(--terminal-green);
}
.settings-footer .btn {
font-family: var(--font-mono);
padding: 0.75rem 1.5rem;
border: 2px solid;
cursor: pointer;
transition: all 0.3s ease;
background: transparent;
}
.settings-footer .btn-primary {
color: var(--status-open);
border-color: var(--status-open);
}
.settings-footer .btn-primary:hover {
background: var(--status-open);
color: var(--bg-primary);
box-shadow: 0 0 15px var(--status-open);
}
.settings-footer .btn-secondary {
color: var(--terminal-green);
border-color: var(--terminal-green);
}
.settings-footer .btn-secondary:hover {
background: var(--terminal-green);
color: var(--bg-primary);
box-shadow: var(--glow-green);
}
/* Table Density Classes */
.table-compact table {
font-size: 0.85rem;
}
.table-compact th,
.table-compact td {
padding: 6px 10px;
}
.table-comfortable table {
font-size: 1rem;
}
.table-comfortable th,
.table-comfortable td {
padding: 16px 20px;
}
/* Responsive Settings Modal */
@media (max-width: 768px) {
.settings-content {
max-width: 95%;
padding: 1rem;
}
.setting-row {
flex-direction: column;
align-items: stretch;
}
.setting-row label {
min-width: auto;
padding-top: 0;
margin-bottom: 0.25rem;
}
.setting-row input[type="text"],
.setting-row input[type="number"],
.setting-row input[type="date"],
.setting-row input[type="time"],
.setting-row select,
.setting-row textarea {
width: 100%;
min-width: auto;
}
.setting-select {
width: 100%;
max-width: 100%;
}
.user-info-grid {
grid-template-columns: 1fr;
}
}
/* Prevent body scroll when modal is open */
body.modal-open {
overflow: hidden;
position: fixed;
width: 100%;
height: 100%;
}
/* ========================================
MARKDOWN FORMATTING STYLES
======================================== */
/* Code blocks */
.code-block {
background: var(--bg-primary);
border: 2px solid var(--terminal-green);
border-left: 4px solid var(--terminal-amber);
padding: 1rem;
margin: 1rem 0;
overflow-x: auto;
font-family: var(--font-mono);
color: var(--terminal-green);
text-shadow: var(--glow-green);
}
.code-block code {
background: transparent;
border: none;
padding: 0;
}
/* Inline code */
code.inline-code {
background: var(--bg-secondary);
border: 1px solid var(--terminal-green);
padding: 0.2rem 0.4rem;
font-family: var(--font-mono);
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
border-radius: 0;
}
/* Markdown headings in content */
[data-markdown] h1,
[data-markdown] h2,
[data-markdown] h3 {
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
font-family: var(--font-mono);
margin: 1.5rem 0 0.5rem 0;
border-bottom: 2px solid var(--terminal-green);
padding-bottom: 0.5rem;
}
[data-markdown] h1 { font-size: 1.8rem; }
[data-markdown] h2 { font-size: 1.5rem; }
[data-markdown] h3 { font-size: 1.2rem; }
/* Markdown lists */
[data-markdown] ul,
[data-markdown] ol {
margin: 1rem 0;
padding-left: 2rem;
}
[data-markdown] li {
color: var(--terminal-green);
margin: 0.5rem 0;
}
[data-markdown] li::marker {
color: var(--terminal-amber);
}
/* Markdown blockquotes */
[data-markdown] blockquote {
border-left: 4px solid var(--terminal-amber);
background: var(--bg-secondary);
padding: 1rem;
margin: 1rem 0;
color: var(--terminal-green);
font-style: italic;
}
/* Markdown links */
[data-markdown] a {
color: var(--terminal-cyan);
text-decoration: none;
border-bottom: 1px dotted var(--terminal-cyan);
transition: all 0.3s ease;
}
[data-markdown] a:hover {
color: var(--terminal-amber);
border-bottom-color: var(--terminal-amber);
text-shadow: var(--glow-amber);
}
/* Horizontal rules */
[data-markdown] hr {
border: none;
border-top: 2px solid var(--terminal-green);
margin: 2rem 0;
}
/* Markdown paragraphs */
[data-markdown] p {
margin: 1rem 0;
line-height: 1.6;
}
/* Strong/bold text */
[data-markdown] strong {
color: var(--terminal-amber);
font-weight: bold;
text-shadow: var(--glow-amber);
}
/* Italic/emphasized text */
[data-markdown] em {
color: var(--terminal-cyan);
font-style: italic;
}
/* Advanced Search Modal */
.advanced-search-modal {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
z-index: var(--z-modal);
background: rgba(0, 0, 0, 0.85);
backdrop-filter: blur(5px);
display: flex;
align-items: center;
justify-content: center;
padding: 1rem;
overflow-y: auto;
}
.advanced-search-content {
position: relative;
background: var(--bg-secondary);
border: 2px solid var(--terminal-green);
box-shadow: 0 0 30px rgba(0, 255, 65, 0.5);
max-width: 900px;
width: 100%;
max-height: calc(90vh - 2rem);
overflow-y: auto;
overflow-x: hidden;
font-family: var(--font-mono);
padding: 2rem;
animation: slideIn 0.3s ease;
box-sizing: border-box;
}
.advanced-search-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 2rem;
border-bottom: 2px solid var(--terminal-green);
padding-bottom: 1rem;
}
.advanced-search-header h3 {
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
font-size: 1.5rem;
margin: 0;
}
.close-advanced-search {
background: transparent;
border: 2px solid var(--terminal-red);
color: var(--terminal-red);
font-size: 1.5rem;
padding: 0.25rem 0.75rem;
cursor: pointer;
font-family: var(--font-mono);
transition: all 0.3s ease;
}
.close-advanced-search:hover {
background: var(--terminal-red);
color: var(--bg-primary);
box-shadow: 0 0 15px rgba(255, 77, 77, 0.7);
}
.advanced-search-body {
font-family: var(--font-mono);
}
.search-section {
margin-bottom: 2rem;
border: 2px solid var(--terminal-green);
padding: 1.5rem;
}
.search-section h4 {
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
margin-bottom: 1rem;
font-size: 1.1rem;
}
.search-field {
margin-bottom: 1rem;
}
.search-field label {
display: block;
color: var(--terminal-green);
margin-bottom: 0.5rem;
}
.search-field input[type="text"],
.search-field input[type="date"],
.search-field input[type="number"],
.search-field select {
width: 100%;
background: var(--bg-primary);
color: var(--terminal-green);
border: 2px solid var(--terminal-green);
padding: 0.75rem;
font-family: var(--font-mono);
font-size: 1rem;
box-sizing: border-box;
}
.search-field input:focus,
.search-field select:focus {
outline: none;
border-color: var(--terminal-amber);
box-shadow: 0 0 10px rgba(255, 193, 7, 0.5);
}
.date-range-group,
.priority-range-group {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
}
.search-field select[multiple] {
min-height: 120px;
}
.advanced-search-footer {
display: flex;
justify-content: flex-end;
gap: 1rem;
margin-top: 2rem;
padding-top: 1rem;
border-top: 2px solid var(--terminal-green);
}
.btn-search-primary {
background: var(--terminal-green);
color: var(--bg-primary);
border: 2px solid var(--terminal-green);
padding: 0.75rem 2rem;
font-family: var(--font-mono);
font-size: 1rem;
cursor: pointer;
transition: all 0.3s ease;
font-weight: bold;
}
.btn-search-primary:hover {
background: transparent;
color: var(--terminal-green);
box-shadow: 0 0 15px rgba(0, 255, 65, 0.7);
}
.btn-search-secondary {
background: transparent;
color: var(--terminal-green);
border: 2px solid var(--terminal-green);
padding: 0.75rem 1.5rem;
font-family: var(--font-mono);
font-size: 1rem;
cursor: pointer;
transition: all 0.3s ease;
}
.btn-search-secondary:hover {
background: var(--terminal-green);
color: var(--bg-primary);
box-shadow: 0 0 15px rgba(0, 255, 65, 0.5);
}
.btn-search-reset {
background: transparent;
color: var(--terminal-amber);
border: 2px solid var(--terminal-amber);
padding: 0.75rem 1.5rem;
font-family: var(--font-mono);
font-size: 1rem;
cursor: pointer;
transition: all 0.3s ease;
}
.btn-search-reset:hover {
background: var(--terminal-amber);
color: var(--bg-primary);
box-shadow: 0 0 15px rgba(255, 193, 7, 0.5);
}
/* Hint text */
.search-hint {
color: var(--terminal-cyan);
font-size: 0.85rem;
margin-top: 0.25rem;
font-style: italic;
}
/* ===== QUICK ACTIONS ===== */
.quick-actions-cell {
text-align: center;
white-space: nowrap;
}
.quick-actions {
display: flex;
gap: 0.25rem;
justify-content: center;
opacity: 0.5;
transition: opacity 0.2s ease;
}
tr:hover .quick-actions {
opacity: 1;
}
.quick-action-btn {
background: transparent;
border: 1px solid var(--terminal-green);
color: var(--terminal-green);
padding: 0.25rem 0.5rem;
font-size: 0.9rem;
cursor: pointer;
transition: all 0.2s ease;
border-radius: 0;
}
.quick-action-btn:hover {
background: var(--terminal-green);
color: var(--bg-primary);
box-shadow: var(--glow-green);
}
/* ===== DASHBOARD STATS WIDGETS ===== */
.stats-widgets {
margin-bottom: 1.5rem;
}
.stats-row {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 1rem;
}
.stat-card {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 1rem;
background: linear-gradient(135deg, var(--bg-secondary) 0%, rgba(0, 255, 65, 0.03) 100%);
border: 2px solid var(--terminal-green);
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
/* Corner accent */
.stat-card::after {
content: '';
position: absolute;
top: 0;
right: 0;
width: 30px;
height: 30px;
background: linear-gradient(135deg, transparent 50%, rgba(0, 255, 65, 0.1) 50%);
transition: all 0.3s ease;
}
.stat-card:hover {
border-color: var(--terminal-amber);
box-shadow: var(--glow-amber);
background: linear-gradient(135deg, var(--bg-secondary) 0%, rgba(255, 176, 0, 0.05) 100%);
}
.stat-card:hover::after {
background: linear-gradient(135deg, transparent 50%, rgba(255, 176, 0, 0.15) 50%);
}
/* Critical stat card styling */
.stat-card.stat-critical {
border-color: var(--priority-1);
background: linear-gradient(135deg, var(--bg-secondary) 0%, rgba(255, 77, 77, 0.08) 100%);
}
.stat-card.stat-critical .stat-value {
color: var(--priority-1);
text-shadow: var(--glow-priority-1);
animation: pulse-glow 2s ease-in-out infinite;
}
.stat-card.stat-critical::after {
background: linear-gradient(135deg, transparent 50%, rgba(255, 77, 77, 0.15) 50%);
}
.stat-icon {
font-size: 1.5rem;
opacity: 0.9;
transition: transform 0.3s ease;
}
.stat-card:hover .stat-icon {
transform: scale(1.1);
}
.stat-content {
flex: 1;
}
.stat-value {
font-size: 1.5rem;
font-weight: bold;
color: var(--terminal-green);
line-height: 1;
text-shadow: var(--glow-green);
}
.stat-label {
font-size: 0.8rem;
color: var(--terminal-green-dim, #008822);
margin-top: 0.25rem;
text-transform: uppercase;
letter-spacing: 0.05em;
}
/* Stat card color variations */
.stat-critical .stat-value {
color: var(--priority-1);
text-shadow: var(--glow-red);
}
.stat-critical {
border-color: var(--priority-1);
}
.stat-unassigned .stat-value {
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
}
.stat-unassigned {
border-color: var(--terminal-amber);
}
/* Mobile responsive stats */
@media (max-width: 768px) {
.stats-row {
grid-template-columns: repeat(2, 1fr);
}
.stat-card {
padding: 0.75rem;
}
.stat-value {
font-size: 1.25rem;
}
.stat-icon {
font-size: 1.25rem;
}
}
@media (max-width: 480px) {
.stats-row {
grid-template-columns: 1fr;
}
}
/* ===== EXPORT DROPDOWN ===== */
.export-dropdown {
position: relative;
display: inline-block;
}
.export-dropdown-content {
display: none;
position: absolute;
top: 100%;
right: 0;
background: var(--bg-primary);
border: 2px solid var(--terminal-green);
min-width: 120px;
z-index: var(--z-dropdown);
box-shadow: 0 0 10px rgba(0, 255, 65, 0.3);
}
.export-dropdown:hover .export-dropdown-content,
.export-dropdown.open .export-dropdown-content {
display: block;
}
.export-dropdown-content a {
display: block;
padding: 0.5rem 1rem;
color: var(--terminal-green);
text-decoration: none;
font-family: var(--font-mono);
transition: all 0.2s ease;
}
.export-dropdown-content a:hover {
background: rgba(0, 255, 65, 0.1);
color: var(--terminal-amber);
}
/* ===== ADMIN DROPDOWN ===== */
.admin-dropdown {
position: relative;
display: inline-block;
}
.admin-dropdown .admin-badge {
cursor: pointer;
padding: 0.3rem 0.6rem;
}
.admin-dropdown-content {
display: none;
position: absolute;
top: 100%;
right: 0;
background: var(--bg-primary);
border: 2px solid var(--priority-1);
min-width: 180px;
z-index: var(--z-popover);
box-shadow: 0 0 15px rgba(255, 77, 77, 0.3);
}
.admin-dropdown-content.show {
display: block;
}
.admin-dropdown-content a {
display: block;
padding: 0.6rem 1rem;
color: var(--terminal-green);
text-decoration: none;
font-family: var(--font-mono);
font-size: 0.85rem;
transition: all 0.2s ease;
border-bottom: 1px solid var(--bg-tertiary);
}
.admin-dropdown-content a:last-child {
border-bottom: none;
}
.admin-dropdown-content a:hover {
background: rgba(255, 77, 77, 0.1);
color: var(--priority-1);
text-shadow: var(--glow-red);
}
/* ===== CLICKABLE STAT CARDS ===== */
.stat-card:hover {
transform: translateY(-2px);
}
.stat-card:active {
transform: translateY(0);
}
/* ===== TABLE OVERFLOW FIX ===== */
.ascii-content {
overflow-x: auto;
}
/* Reduce column widths for better fit */
table th,
table td {
padding: 8px 10px;
font-size: 0.85rem;
}
/* Make title column wrap if needed */
table td:nth-child(4) {
max-width: 180px;
overflow: hidden;
text-overflow: ellipsis;
}
/* ===== TICKET LINK REFERENCES IN COMMENTS ===== */
.ticket-link-ref {
color: var(--terminal-cyan);
text-decoration: none;
font-family: var(--font-mono);
padding: 0.1rem 0.3rem;
border-radius: 0;
background: rgba(0, 255, 255, 0.1);
transition: all 0.2s ease;
}
.ticket-link-ref:hover {
color: var(--terminal-amber);
background: rgba(255, 176, 0, 0.15);
text-shadow: var(--glow-amber);
}
/* ===== USER GROUPS DISPLAY ===== */
.user-groups-list {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
.group-badge {
display: inline-block;
padding: 0.2rem 0.6rem;
background: rgba(0, 255, 255, 0.1);
border: 1px solid var(--terminal-cyan);
color: var(--terminal-cyan);
font-family: var(--font-mono);
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.group-badge:hover {
background: rgba(0, 255, 255, 0.2);
text-shadow: 0 0 5px var(--terminal-cyan);
}
/* ===== VISIBILITY SETTINGS ===== */
.visibility-groups-list {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
}
.visibility-groups-list label {
cursor: pointer;
}
.visibility-groups-list label:hover .group-badge {
background: rgba(0, 255, 255, 0.2);
text-shadow: 0 0 5px var(--terminal-cyan);
}
.visibility-group-checkbox {
width: 16px;
height: 16px;
cursor: pointer;
}
.visibility-group-checkbox:checked + .group-badge {
background: var(--terminal-cyan);
color: var(--bg-primary);
font-weight: bold;
}
.ticket-visibility-settings {
margin-top: 0.75rem;
}
.visibility-groups-display {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
/* ===== INLINE TICKET PREVIEW POPUP ===== */
.ticket-preview-popup {
position: absolute;
z-index: var(--z-modal);
width: 320px;
background: var(--bg-primary);
border: 2px solid var(--terminal-green);
box-shadow: 0 0 20px rgba(0, 255, 65, 0.3);
font-family: var(--font-mono);
padding: 0;
pointer-events: auto;
}
.ticket-preview-popup::before {
content: '┌──────────────────────┐';
display: block;
color: var(--terminal-green);
font-size: 0.7rem;
text-align: center;
padding: 0.25rem;
background: var(--bg-secondary);
border-bottom: 1px solid var(--terminal-green);
}
.preview-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.75rem;
background: var(--bg-secondary);
border-bottom: 1px solid var(--terminal-green);
}
.preview-id {
color: var(--terminal-amber);
font-weight: bold;
text-shadow: var(--glow-amber);
}
.preview-status {
padding: 0.2rem 0.5rem;
font-size: 0.75rem;
text-transform: uppercase;
}
.preview-title {
padding: 0.75rem;
color: var(--terminal-green);
font-size: 0.95rem;
line-height: 1.4;
border-bottom: 1px solid var(--terminal-green);
word-break: break-word;
}
.preview-meta {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0.5rem;
padding: 0.75rem;
font-size: 0.8rem;
color: var(--terminal-green);
}
.preview-meta strong {
color: var(--terminal-cyan);
}
.preview-footer {
padding: 0.5rem 0.75rem;
font-size: 0.75rem;
color: var(--text-muted);
background: var(--bg-secondary);
border-top: 1px solid var(--terminal-green);
}
/* ===== ENHANCED MOBILE RESPONSIVE STYLES ===== */
/* Table wrapper for horizontal scrolling */
.table-wrapper {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
margin: 0 -0.5rem;
padding: 0 0.5rem;
}
@media (max-width: 768px) {
/* Prevent iOS zoom on input focus */
input[type="text"],
input[type="email"],
input[type="search"],
input[type="password"],
input[type="number"],
select,
textarea {
font-size: 16px !important;
}
/* Minimum touch target size (44px) */
.btn,
button,
.tab-btn,
.checkbox-cell,
.quick-action-btn,
input[type="checkbox"],
select {
min-height: 44px;
min-width: 44px;
}
/* Better button spacing */
.btn {
padding: 12px 16px;
margin: 4px 2px;
}
/* Stack toolbar elements */
.dashboard-toolbar {
flex-direction: column;
gap: 1rem;
padding: 1rem;
}
.toolbar-left,
.toolbar-center,
.toolbar-right {
width: 100%;
justify-content: center;
flex-wrap: wrap;
}
.toolbar-search {
flex-direction: column;
width: 100%;
}
.toolbar-search input,
.toolbar-search button {
width: 100%;
margin: 4px 0;
}
.search-box {
width: 100% !important;
max-width: none !important;
}
/* Improve table readability */
table {
font-size: 0.8rem;
}
th, td {
padding: 8px 6px;
min-width: 60px;
}
/* Hide less important columns on mobile */
table th:nth-child(5),
table td:nth-child(5),
table th:nth-child(10),
table td:nth-child(10),
table th:nth-child(11),
table td:nth-child(11) {
display: none;
}
/* Improve stats widgets */
.stats-row {
flex-wrap: wrap;
}
.stat-card {
flex: 1 1 calc(50% - 0.5rem);
min-width: 120px;
}
/* Improve filter groups */
.filter-group label {
min-height: 44px;
display: flex;
align-items: center;
padding: 0.5rem 0;
}
.filter-group input[type="checkbox"] {
width: 20px;
height: 20px;
margin-right: 0.75rem;
}
/* Improve pagination */
.pagination {
flex-wrap: wrap;
justify-content: center;
}
.pagination button {
min-width: 44px;
min-height: 44px;
padding: 8px 12px;
}
/* Better modal sizing */
.modal-content,
.settings-content {
width: 95%;
max-width: 95%;
max-height: 90vh;
overflow-y: auto;
}
/* Hide preview on mobile (not useful with touch) */
.ticket-preview-popup {
display: none !important;
}
/* Improve quick actions */
.quick-actions {
flex-direction: row;
gap: 4px;
}
.quick-action-btn {
padding: 8px;
font-size: 1rem;
}
}
/* ===== VIEW TOGGLE BUTTONS ===== */
.view-toggle {
display: flex;
gap: 0;
border: 2px solid var(--terminal-green);
}
.view-btn {
padding: 0.5rem 1rem;
background: var(--bg-primary);
color: var(--terminal-green);
border: none;
cursor: pointer;
font-size: 1.2rem;
min-width: 44px;
min-height: 44px;
transition: all 0.2s ease;
}
.view-btn::before,
.view-btn::after {
content: '';
}
.view-btn:hover {
background: rgba(0, 255, 65, 0.15);
}
.view-btn.active {
background: var(--terminal-green);
color: var(--bg-primary);
}
/* ===== KANBAN BOARD STYLES ===== */
.card-view-container {
margin-bottom: 2rem;
}
.kanban-board {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 1rem;
min-height: 500px;
}
.kanban-column {
background: var(--bg-secondary);
border: 2px solid var(--terminal-green);
display: flex;
flex-direction: column;
min-height: 400px;
}
.kanban-column-header {
padding: 1rem;
border-bottom: 2px solid var(--terminal-green);
display: flex;
justify-content: space-between;
align-items: center;
font-family: var(--font-mono);
text-transform: uppercase;
letter-spacing: 0.1em;
}
.kanban-column-header.status-Open {
background: rgba(40, 167, 69, 0.1);
color: var(--status-open);
border-color: var(--status-open);
}
.kanban-column-header.status-Pending {
background: rgba(156, 39, 176, 0.1);
color: var(--status-pending);
border-color: var(--status-pending);
}
.kanban-column-header.status-In-Progress {
background: rgba(255, 193, 7, 0.1);
color: var(--status-in-progress);
border-color: var(--status-in-progress);
}
.kanban-column-header.status-Closed {
background: rgba(220, 53, 69, 0.1);
color: var(--status-closed);
border-color: var(--status-closed);
}
.column-title {
font-weight: bold;
}
.column-count {
background: currentColor;
color: var(--bg-primary);
padding: 0.2rem 0.6rem;
font-size: 0.8rem;
font-weight: bold;
}
.kanban-cards {
flex: 1;
padding: 0.5rem;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.kanban-card {
background: var(--bg-primary);
border: 1px solid var(--terminal-green);
padding: 0.75rem;
cursor: pointer;
transition: all 0.2s ease;
font-family: var(--font-mono);
}
.kanban-card:hover {
border-color: var(--terminal-amber);
transform: translateX(4px);
box-shadow: -4px 0 0 var(--terminal-amber);
}
.kanban-card.priority-1 { border-left: 4px solid var(--priority-1); }
.kanban-card.priority-2 { border-left: 4px solid var(--priority-2); }
.kanban-card.priority-3 { border-left: 4px solid var(--priority-3); }
.kanban-card.priority-4 { border-left: 4px solid var(--priority-4); }
.kanban-card.priority-5 { border-left: 4px solid var(--priority-5); }
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.5rem;
font-size: 0.8rem;
}
.card-id {
color: var(--terminal-cyan);
}
.card-priority {
padding: 0.1rem 0.4rem;
font-size: 0.7rem;
font-weight: bold;
}
.card-priority.p1 { background: var(--priority-1); color: white; }
.card-priority.p2 { background: var(--priority-2); color: black; }
.card-priority.p3 { background: var(--priority-3); color: white; }
.card-priority.p4 { background: var(--priority-4); color: black; }
.card-priority.p5 { background: var(--priority-5); color: white; }
.card-title {
color: var(--terminal-green);
font-size: 0.9rem;
line-height: 1.3;
margin-bottom: 0.5rem;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.card-footer {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 0.75rem;
color: var(--text-muted);
}
.card-category {
background: rgba(0, 255, 65, 0.1);
padding: 0.1rem 0.4rem;
}
.card-assignee {
width: 28px;
height: 28px;
background: var(--terminal-cyan);
color: var(--bg-primary);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
font-size: 0.7rem;
}
/* Kanban responsive */
@media (max-width: 1200px) {
.kanban-board {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 768px) {
.kanban-board {
grid-template-columns: 1fr;
}
.kanban-column {
min-height: 200px;
}
}
/* ===== MOBILE-ONLY ELEMENTS - Hidden on Desktop ===== */
.mobile-filter-toggle,
.mobile-bottom-nav,
.mobile-sidebar-close,
.mobile-sidebar-overlay {
display: none !important;
}
/* ===== MARKDOWN TABLE STYLES ===== */
.markdown-table {
width: 100%;
border-collapse: collapse;
margin: 1rem 0;
font-family: var(--font-mono);
font-size: 0.9rem;
}
.markdown-table th,
.markdown-table td {
border: 1px solid var(--terminal-green);
padding: 0.5rem 0.75rem;
text-align: left;
}
.markdown-table th {
background: rgba(0, 255, 65, 0.1);
color: var(--terminal-green);
font-weight: bold;
}
.markdown-table tr:hover td {
background: rgba(0, 255, 65, 0.05);
}
/* Auto-linked URLs styling */
.auto-link {
color: var(--terminal-cyan);
text-decoration: none;
word-break: break-all;
}
.auto-link:hover {
color: var(--terminal-amber);
text-decoration: underline;
}
/* ===== MOBILE STYLES - PHONES (max 768px) ===== */
@media (max-width: 768px) {
/* ===== BASE RESETS ===== */
* {
-webkit-tap-highlight-color: transparent;
}
body {
padding-bottom: 70px; /* Space for mobile nav */
}
/* Prevent iOS zoom on input focus */
input, select, textarea, button {
font-size: 16px !important;
}
/* ===== HEADER - Simplified for mobile ===== */
.user-header {
position: sticky;
top: 0;
z-index: var(--z-dropdown);
padding: 0.5rem 0.75rem;
flex-wrap: nowrap;
gap: 0.5rem;
background: var(--bg-primary);
border-bottom: 2px solid var(--terminal-green);
}
.user-header-left {
flex: 1;
min-width: 0;
}
.user-header-left .app-title {
font-size: 1rem;
white-space: nowrap;
}
.user-header-right {
display: flex;
align-items: center;
gap: 0.25rem;
flex-shrink: 0;
}
.user-header-right .user-name {
display: none; /* Hide username on mobile */
}
.user-header-right .settings-icon {
width: 44px;
height: 44px;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.3rem;
border: none;
background: transparent;
}
.admin-badge {
padding: 0.5rem 0.75rem;
font-size: 0.8rem;
min-height: 44px;
}
/* ===== HIDE DESKTOP ELEMENTS ===== */
.ascii-banner-wrapper,
.sidebar-collapse-btn,
.sidebar-expand-btn {
display: none !important;
}
/* ===== SIDEBAR AS SLIDE-OUT DRAWER ===== */
.dashboard-layout {
flex-direction: column;
padding: 0;
}
.dashboard-sidebar {
position: fixed;
top: 0;
left: 0;
width: 85vw;
max-width: 320px;
height: 100vh;
z-index: 1001;
background: var(--bg-primary);
transform: translateX(-100%);
transition: transform 0.3s ease;
padding: 60px 1rem 1rem 1rem;
overflow-y: auto;
box-shadow: 4px 0 20px rgba(0, 0, 0, 0.8);
}
.dashboard-sidebar.mobile-open {
transform: translateX(0);
}
.dashboard-sidebar .sidebar-content {
display: block;
padding-top: 1rem;
}
/* Mobile sidebar interior styling */
.dashboard-sidebar .ascii-frame-inner {
padding: 1rem !important;
border: 2px solid var(--terminal-green) !important;
background: var(--bg-secondary) !important;
}
.dashboard-sidebar .ascii-subsection-header {
font-size: 1.1rem;
margin-bottom: 1rem;
padding-bottom: 0.5rem;
}
.dashboard-sidebar .filter-group {
margin-bottom: 1.5rem;
padding-bottom: 1rem;
border-bottom: 1px solid rgba(0, 255, 65, 0.3);
}
.dashboard-sidebar .filter-group:last-of-type {
border-bottom: none;
}
.dashboard-sidebar .filter-group h4 {
font-size: 0.95rem;
margin-bottom: 0.75rem;
color: var(--terminal-amber);
}
.dashboard-sidebar .filter-group label {
display: flex;
align-items: center;
padding: 0.75rem 0.5rem;
margin: 0.25rem 0;
min-height: 44px;
font-size: 0.95rem;
background: rgba(0, 255, 65, 0.05);
border-radius: 4px;
}
.dashboard-sidebar .filter-group label:active {
background: rgba(0, 255, 65, 0.15);
}
.dashboard-sidebar .filter-group input[type="checkbox"] {
width: 22px;
height: 22px;
margin-right: 0.75rem;
flex-shrink: 0;
}
.dashboard-sidebar .btn {
width: 100%;
min-height: 48px;
margin-top: 0.5rem;
font-size: 1rem;
}
/* Mobile sidebar overlay */
.mobile-sidebar-overlay {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.7);
z-index: var(--z-popover);
}
.mobile-sidebar-overlay.active {
display: block;
}
/* Close button in sidebar */
.mobile-sidebar-close {
display: flex !important;
position: absolute;
top: 10px;
right: 10px;
width: 44px;
height: 44px;
background: var(--bg-secondary);
border: 2px solid var(--terminal-green);
color: var(--terminal-green);
font-size: 1.5rem;
cursor: pointer;
align-items: center;
justify-content: center;
z-index: var(--z-base);
}
/* ===== MAIN CONTENT AREA ===== */
.dashboard-main {
width: 100%;
padding: 0 0.5rem;
}
/* ===== MOBILE FILTER TOGGLE ===== */
.mobile-filter-toggle {
display: flex !important;
width: 100%;
padding: 0.75rem 1rem;
margin: 0.5rem 0;
background: var(--bg-secondary);
border: 2px solid var(--terminal-green);
color: var(--terminal-green);
font-family: var(--font-mono);
font-size: 0.9rem;
align-items: center;
justify-content: center;
gap: 0.5rem;
cursor: pointer;
}
.mobile-filter-toggle:active {
background: var(--terminal-green);
color: var(--bg-primary);
}
/* ===== STATS WIDGETS ===== */
.stats-widgets {
margin: 0.5rem 0;
}
.stats-row {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 0.5rem;
}
.stat-card {
padding: 0.75rem;
min-height: auto;
}
.stat-value {
font-size: 1.25rem;
}
.stat-label {
font-size: 0.65rem;
}
/* ===== TOOLBAR - Stack vertically ===== */
.dashboard-toolbar {
flex-direction: column;
gap: 0.5rem;
padding: 0.5rem;
margin: 0;
}
.toolbar-left {
width: 100%;
flex-direction: column;
gap: 0.5rem;
}
.toolbar-left .dashboard-title {
display: none; /* Hide title, it's in header */
}
.toolbar-left .toolbar-search {
width: 100%;
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
.toolbar-search .search-box {
flex: 1;
min-width: 0;
min-height: 44px;
padding: 0.5rem 0.75rem;
}
.toolbar-search .btn {
min-height: 44px;
padding: 0.5rem 0.75rem;
}
.toolbar-search .btn-secondary {
display: none; /* Hide advanced search button */
}
.clear-search-btn {
position: absolute;
right: 10px;
top: 50%;
transform: translateY(-50%);
}
.toolbar-center {
width: 100%;
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
justify-content: space-between;
align-items: center;
}
.toolbar-center .view-toggle {
order: 1;
}
.toolbar-center .create-ticket {
order: 2;
flex: 1;
min-height: 44px;
}
.toolbar-center .ticket-count {
order: 3;
width: 100%;
text-align: center;
font-size: 0.8rem;
padding: 0.25rem;
}
.toolbar-center .export-dropdown {
display: none; /* Hide export on mobile */
}
.view-toggle {
display: flex;
}
.view-btn {
min-width: 44px;
min-height: 44px;
padding: 0.5rem;
}
.toolbar-right {
display: none; /* Hide pagination in toolbar - show at bottom */
}
/* ===== TABLE WRAPPER ===== */
.ascii-frame-outer {
margin: 0.5rem 0;
border-width: 2px;
}
.ascii-section-header {
font-size: 0.9rem;
padding: 0.5rem;
}
.ascii-content {
padding: 0;
}
.ascii-frame-inner {
padding: 0;
border: none;
}
.table-wrapper {
width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.table-wrapper table {
min-width: 700px;
}
table {
font-size: 0.8rem;
}
table th,
table td {
padding: 0.75rem 0.5rem;
white-space: nowrap;
}
/* Make ticket ID and title columns wider */
table th:nth-child(1),
table td:nth-child(1) {
min-width: 100px;
}
table th:nth-child(3),
table td:nth-child(3) {
min-width: 200px;
white-space: normal;
}
/* Link touch targets */
table td a {
display: inline-block;
padding: 0.5rem 0;
min-height: 44px;
line-height: 1.5;
}
/* ===== BULK ACTIONS ===== */
.bulk-actions-inline {
position: fixed;
bottom: 70px; /* Above mobile nav */
left: 0;
right: 0;
background: var(--bg-secondary);
border-top: 2px solid var(--terminal-green);
padding: 0.75rem;
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
z-index: 99;
}
.bulk-actions-inline button {
flex: 1 1 calc(50% - 0.5rem);
min-height: 44px;
font-size: 0.8rem;
}
/* ===== PAGINATION - Bottom of page ===== */
.pagination {
display: flex;
justify-content: center;
flex-wrap: wrap;
gap: 0.25rem;
padding: 1rem 0.5rem;
margin-bottom: 1rem;
}
.pagination button {
min-width: 40px;
min-height: 44px;
padding: 0.5rem;
font-size: 0.9rem;
}
/* ===== MODALS ===== */
.modal-overlay {
padding: 0;
align-items: flex-end;
}
.modal-content {
width: 100% !important;
max-width: 100% !important;
max-height: 90vh;
border-radius: 12px 12px 0 0;
margin: 0;
}
.modal-body {
max-height: 60vh;
overflow-y: auto;
padding: 1rem;
}
.modal-body input,
.modal-body select,
.modal-body textarea {
width: 100%;
min-height: 48px;
padding: 0.75rem;
margin-bottom: 0.75rem;
font-size: 16px;
}
.modal-footer {
flex-direction: column;
gap: 0.5rem;
padding: 1rem;
border-top: 1px solid var(--border-color);
}
.modal-footer button {
width: 100%;
min-height: 50px;
font-size: 1rem;
}
/* ===== SETTINGS MODAL ===== */
.settings-modal {
align-items: flex-end;
}
.settings-content {
width: 100% !important;
max-width: 100% !important;
max-height: 85vh;
border-radius: 12px 12px 0 0;
}
/* ===== ADMIN DROPDOWN ===== */
.admin-dropdown-content {
position: fixed;
left: 0;
right: 0;
bottom: 0;
top: auto;
width: 100%;
max-height: 60vh;
overflow-y: auto;
border-radius: 12px 12px 0 0;
z-index: 1002;
}
.admin-dropdown-content a {
padding: 1rem 1.5rem;
min-height: 50px;
display: flex;
align-items: center;
font-size: 1rem;
}
/* ===== KANBAN VIEW ===== */
.kanban-board {
grid-template-columns: 1fr;
gap: 1rem;
}
.kanban-column {
min-height: auto;
}
.kanban-column-header {
padding: 0.75rem;
font-size: 0.9rem;
}
.kanban-cards {
padding: 0.5rem;
max-height: none;
}
.ticket-card {
padding: 0.75rem;
}
/* ===== QUICK ACTIONS ===== */
.quick-actions {
display: flex;
gap: 0.25rem;
}
.quick-action-btn {
min-width: 36px;
min-height: 36px;
padding: 0.25rem;
font-size: 0.9rem;
}
/* ===== MOBILE BOTTOM NAV ===== */
.mobile-bottom-nav {
display: flex !important;
position: fixed;
bottom: 0;
left: 0;
right: 0;
height: 60px;
background: var(--bg-primary);
border-top: 2px solid var(--terminal-green);
z-index: var(--z-dropdown);
padding: 0;
}
.mobile-bottom-nav a,
.mobile-bottom-nav button {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 0.25rem;
background: transparent;
border: none;
color: var(--terminal-green);
text-decoration: none;
font-size: 0.65rem;
font-family: var(--font-mono);
padding: 0.5rem;
}
.mobile-bottom-nav .nav-icon {
font-size: 1.25rem;
}
.mobile-bottom-nav a:active,
.mobile-bottom-nav button:active {
background: rgba(0, 255, 65, 0.2);
}
/* ===== HIDE PREVIEW POPUP ON MOBILE ===== */
.ticket-preview-popup {
display: none !important;
}
}
/* ===== EXTRA SMALL PHONES (max 480px) ===== */
@media (max-width: 480px) {
.user-header-left .app-title {
font-size: 0.9rem;
}
.stats-row {
grid-template-columns: 1fr 1fr;
}
.stat-value {
font-size: 1.1rem;
}
.stat-label {
font-size: 0.6rem;
}
/* Hide more table columns on very small screens */
.table-wrapper table {
min-width: 500px;
}
table th:nth-child(4),
table td:nth-child(4),
table th:nth-child(7),
table td:nth-child(7),
table th:nth-child(8),
table td:nth-child(8) {
display: none;
}
.toolbar-center .create-ticket {
font-size: 0.8rem;
padding: 0.5rem;
}
}
/* ===== LANDSCAPE PHONE ===== */
@media (max-width: 768px) and (orientation: landscape) {
body {
padding-bottom: 50px;
}
.mobile-bottom-nav {
height: 50px;
}
.mobile-bottom-nav .nav-icon {
font-size: 1rem;
}
.mobile-bottom-nav a,
.mobile-bottom-nav button {
font-size: 0.6rem;
}
.modal-content {
max-height: 80vh;
}
.modal-body {
max-height: 50vh;
}
}