Files
tinker_tickets/assets/css/dashboard.css
Jared Vititoe c449100c28 Phase 4: Light mode removal + CreateTicketView restructuring
## Light Mode Removal & Optimization
- Removed theme toggle functionality from dashboard.js
- Forced dark mode only (terminal aesthetic)
- Cleaned up .theme-toggle CSS class and styles
- Removed body.light-mode CSS rules from all view files
- Simplified user-header styles to use static dark colors
- Removed CSS custom properties (--header-bg, --header-text, --border-color)
- Removed margin-right for theme toggle button (no longer needed)

## CreateTicketView Complete Restructuring
- Added user header with back link and user info
- Restructured into 6 vertical nested ASCII sections:
  1. Form Header - Create New Ticket introduction
  2. Template Selection - Optional template dropdown
  3. Basic Information - Title input field
  4. Ticket Metadata - Status, Priority, Category, Type (4-column)
  5. Detailed Description - Main textarea
  6. Form Actions - Create/Cancel buttons
- Each section wrapped in ascii-section-header → ascii-content → ascii-frame-inner
- Added ASCII dividers between all sections
- Added ╚╝ bottom corner characters to outer frame
- Improved error message styling with priority-1 color
- Added helpful placeholder text and hints

## Files Modified
- assets/css/dashboard.css: Removed theme toggle CSS (~19 lines)
- assets/js/dashboard.js: Removed initThemeToggle() and forced dark mode
- views/DashboardView.php: Simplified user-header CSS (removed light mode)
- views/TicketView.php: Simplified user-header CSS (removed light mode)
- views/CreateTicketView.php: Complete restructuring (98→242 lines)

## Code Quality
- Maintained all existing functionality and event handlers
- Kept all class names for JavaScript compatibility
- Consistent nested frame structure across all pages
- Zero breaking changes to backend or business logic
- Optimized by removing ~660 unused lines total

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-07 10:52:10 -05:00

1923 lines
40 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-amber: #ffb000;
--terminal-cyan: #00ffff;
--text-primary: #00ff41;
--text-secondary: #00cc33;
--text-muted: #008822;
/* 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 (Keep existing) */
--status-open: #28a745;
--status-in-progress: #ffc107;
--status-closed: #dc3545;
/* Terminal Font Stack */
--font-mono: 'Courier New', 'Consolas', 'Monaco', 'Menlo', monospace;
/* Glow Effects */
--glow-green: 0 0 5px #00ff41, 0 0 10px #00ff41;
--glow-red: 0 0 5px #ff4d4d, 0 0 10px #ff4d4d;
--glow-blue: 0 0 5px #42a5f5, 0 0 10px #42a5f5;
--glow-amber: 0 0 5px #ffb000, 0 0 10px #ffb000;
--glow-priority-1: 0 0 5px #ff4d4d, 0 0 10px #ff4d4d;
--glow-priority-2: 0 0 5px #ffa726, 0 0 10px #ffa726;
--glow-priority-3: 0 0 5px #42a5f5, 0 0 10px #42a5f5;
--glow-priority-4: 0 0 5px #66bb6a, 0 0 10px #66bb6a;
--glow-priority-5: 0 0 5px #9e9e9e, 0 0 10px #9e9e9e;
/* Spacing */
--spacing-xs: 0.5rem;
--spacing-sm: 1rem;
--spacing-md: 1.5rem;
--spacing-lg: 2rem;
/* Transitions */
--transition-default: all 0.3s ease;
}
/* 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 ===== */
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);
}
body.menu-open {
padding-left: 260px;
}
h1 {
color: var(--text-primary);
margin: 0;
}
/* ===== 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: 10;
}
.ascii-frame-outer::after {
content: '╗';
position: absolute;
top: -3px;
right: -3px;
font-size: 1.5rem;
color: var(--terminal-green);
line-height: 1;
z-index: 10;
}
/* Bottom corners as separate elements */
.bottom-left-corner,
.bottom-right-corner {
position: absolute;
bottom: -3px;
font-size: 1.5rem;
color: var(--terminal-green);
line-height: 1;
z-index: 10;
}
.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);
text-transform: uppercase;
letter-spacing: 0.1em;
}
.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;
}
.ascii-divider::after {
content: '╡';
position: absolute;
right: -2px;
top: -11px;
color: var(--terminal-green);
font-size: 1.2rem;
}
/* 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: '|]'; }
}
/* ===== 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: 8px;
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.1);
color: var(--terminal-amber);
border-color: var(--terminal-amber);
text-shadow: var(--glow-amber);
transform: translateY(-2px);
}
.btn:active,
.btn-base:active,
button:active {
transform: translateY(0);
box-shadow: 0 0 20px rgba(0, 255, 65, 0.5);
}
.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 */
table::before {
content: '┌';
position: absolute;
top: -2px;
left: -2px;
font-size: 1.2rem;
color: var(--terminal-green);
line-height: 1;
z-index: 10;
}
table::after {
content: '┐';
position: absolute;
top: -2px;
right: -2px;
font-size: 1.2rem;
color: var(--terminal-green);
line-height: 1;
z-index: 10;
}
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);
}
/* Add terminal prompt to headers */
th::before {
content: '> ';
color: var(--terminal-green);
margin-right: 4px;
}
tr:hover {
background-color: rgba(0, 255, 65, 0.05);
}
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);
}
.priority-2 td:nth-child(2) {
color: var(--priority-2);
text-shadow: var(--glow-priority-2);
}
.priority-3 td:nth-child(2) {
color: var(--priority-3);
text-shadow: var(--glow-priority-3);
}
.priority-4 td:nth-child(2) {
color: var(--priority-4);
text-shadow: var(--glow-priority-4);
}
.priority-5 td:nth-child(2) {
color: var(--priority-5);
text-shadow: var(--glow-priority-5);
}
/* ===== 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: 100px;
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;
}
.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-Resolved {
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-Resolved::before {
content: '[';
margin-right: 4px;
}
.status-Resolved::after {
content: ']';
margin-left: 4px;
}
/* ===== 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;
}
.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: 5px;
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: 5px;
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: 4px;
}
/* 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: 4px;
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: 4px;
padding: 10px;
z-index: 100;
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: 4px;
cursor: pointer;
}
/* ===== HAMBURGER MENU STYLES - TERMINAL EDITION ===== */
.hamburger-menu {
position: absolute;
top: 20px;
left: 20px;
z-index: 100;
}
.hamburger-icon {
cursor: pointer;
font-size: 24px;
background: var(--bg-secondary);
padding: 12px;
border: 2px solid var(--terminal-green);
border-radius: 0;
box-shadow: none;
font-family: var(--font-mono);
color: var(--terminal-green);
}
.hamburger-icon::before {
content: '[';
margin-right: 4px;
}
.hamburger-icon::after {
content: ']';
margin-left: 4px;
}
.hamburger-content {
position: fixed;
top: 0;
left: -300px;
width: 250px;
height: 100%;
background: var(--bg-primary);
border-right: 3px double var(--terminal-green);
transition: left 0.3s ease;
padding: 20px;
overflow-y: auto;
z-index: 99;
font-family: var(--font-mono);
box-shadow: 0 0 30px rgba(0, 255, 65, 0.3);
}
/* ASCII decoration at top */
.hamburger-content::before {
content: '╔═══════════════════╗\A║ MENU SYSTEM ║\A╚═══════════════════╝';
white-space: pre;
display: block;
color: var(--terminal-green);
font-family: var(--font-mono);
font-size: 0.8rem;
margin-bottom: 20px;
line-height: 1.2;
}
.hamburger-content.open {
left: 0;
}
.hamburger-content h3 {
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
font-family: var(--font-mono);
text-transform: uppercase;
margin-top: 20px;
margin-bottom: 10px;
}
.hamburger-content h3::before {
content: '> ';
color: var(--terminal-green);
}
.close-hamburger {
position: absolute;
top: 10px;
right: 10px;
cursor: pointer;
font-size: 24px;
background: transparent;
padding: 10px;
border: 2px solid var(--terminal-green);
border-radius: 0;
box-shadow: none;
color: var(--terminal-green);
font-family: var(--font-mono);
}
.close-hamburger::before {
content: '[';
}
.close-hamburger::after {
content: ']';
}
.close-hamburger:hover {
color: var(--priority-1);
border-color: var(--priority-1);
text-shadow: var(--glow-red);
}
/* Hamburger menu inline editing styles - TERMINAL */
.ticket-info-editable {
padding: 10px 0;
}
.editable-field, .info-field {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
position: relative;
padding: 10px;
border: 1px solid var(--terminal-green);
background: rgba(0, 255, 65, 0.03);
}
.editable-field label, .info-field label {
flex: 0 0 auto;
margin-right: 10px;
color: var(--terminal-green);
font-family: var(--font-mono);
}
.editable-value {
flex: 1;
text-align: right;
min-height: 20px;
display: inline-block;
cursor: pointer;
padding: 4px 8px;
border-radius: 0;
transition: all 0.2s;
color: var(--terminal-amber);
}
.editable-value::before {
content: '[ ';
color: var(--terminal-green);
}
.editable-value::after {
content: ' ]';
color: var(--terminal-green);
}
.editable-value:hover {
background-color: rgba(0, 255, 65, 0.1) !important;
text-shadow: var(--glow-amber);
}
.edit-dropdown {
position: absolute;
top: 100%;
right: 0;
background: var(--bg-primary);
border: 2px solid var(--terminal-green);
border-radius: 0;
padding: 8px;
box-shadow: 0 0 20px rgba(0, 255, 65, 0.3);
z-index: 1000;
min-width: 150px;
}
.field-select {
width: 100%;
padding: 4px 8px;
border: 2px solid var(--terminal-green);
border-radius: 0;
margin-bottom: 8px;
background: var(--bg-primary);
color: var(--terminal-green);
font-family: var(--font-mono);
color: var(--text-primary);
}
.edit-actions {
display: flex;
gap: 4px;
justify-content: flex-end;
}
.save-btn, .cancel-btn {
padding: 4px 8px;
border: none;
border-radius: 3px;
cursor: pointer;
font-size: 12px;
min-width: 24px;
}
.save-btn {
background: #28a745;
color: white;
}
.save-btn:hover {
background: #218838;
}
.cancel-btn {
background: #dc3545;
color: white;
}
.cancel-btn:hover {
background: #c82333;
}
.info-field span {
flex: 1;
text-align: right;
color: var(--text-secondary);
}
/* ===== 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: 4px;
display: inline-block;
}
.ticket-link:hover {
background: var(--border-color);
}
/* ===== PAGINATION STYLES ===== */
.pagination {
display: flex;
gap: 0.5rem;
align-items: center;
}
.pagination button {
padding: 0.5rem 0.75rem;
border: 1px solid var(--border-color);
background: var(--bg-secondary);
color: var(--text-primary);
border-radius: 0.375rem;
cursor: pointer;
transition: all 0.2s ease;
}
.pagination button:hover {
background: var(--hover-bg);
}
.pagination button.active {
background: #3b82f6;
color: white;
border-color: #3b82f6;
}
/* ===== 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;
}
/* ===== SETTINGS MODAL STYLES - TERMINAL EDITION ===== */
.settings-modal-backdrop {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.85);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
}
.settings-modal {
background: var(--bg-primary);
border: 3px double var(--terminal-green);
border-radius: 0;
width: 500px;
max-width: 90%;
box-shadow: 0 0 30px rgba(0, 255, 65, 0.3);
padding: 0;
position: relative;
font-family: var(--font-mono);
}
/* ASCII corners for modal */
.settings-modal::before {
content: '╔';
position: absolute;
top: -3px;
left: -3px;
font-size: 1.5rem;
color: var(--terminal-green);
line-height: 1;
}
.settings-modal::after {
content: '╗';
position: absolute;
top: -3px;
right: -3px;
font-size: 1.5rem;
color: var(--terminal-green);
line-height: 1;
}
.settings-modal-header {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 2px solid var(--terminal-green);
padding: 15px 20px;
margin: 0;
background: var(--bg-secondary);
}
.settings-modal-header h2 {
margin: 0;
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
font-family: var(--font-mono);
text-transform: uppercase;
}
.settings-modal-header h2::before {
content: '═══ ';
color: var(--terminal-green);
}
.settings-modal-header h2::after {
content: ' ═══';
color: var(--terminal-green);
}
.close-modal {
background: none;
border: none;
font-size: 24px;
cursor: pointer;
color: var(--terminal-green);
font-family: var(--font-mono);
}
.close-modal::before {
content: '[';
}
.close-modal::after {
content: ']';
}
.close-modal:hover {
color: var(--priority-1);
text-shadow: var(--glow-red);
}
.setting-group {
margin-bottom: 15px;
padding: 0 20px;
}
.setting-group label {
display: block;
margin-bottom: 8px;
color: var(--terminal-green);
font-family: var(--font-mono);
}
.setting-group label::before {
content: '> ';
color: var(--terminal-amber);
}
.setting-group select {
width: 100%;
padding: 10px;
border: 2px solid var(--terminal-green);
border-radius: 0;
background: var(--bg-primary);
color: var(--terminal-green);
font-family: var(--font-mono);
}
.settings-modal-footer {
display: flex;
justify-content: flex-end;
gap: 10px;
border-top: 2px solid var(--terminal-green);
padding: 15px 20px;
background: var(--bg-secondary);
}
.save-settings, .cancel-settings {
padding: 10px 20px;
border-radius: 0;
border: 2px solid var(--terminal-green);
background: transparent;
color: var(--terminal-green);
cursor: pointer;
transition: all 0.3s ease;
font-family: var(--font-mono);
font-weight: bold;
text-transform: uppercase;
}
.save-settings::before,
.cancel-settings::before {
content: '[ ';
}
.save-settings::after,
.cancel-settings::after {
content: ' ]';
}
.save-settings {
color: var(--terminal-amber);
border-color: var(--terminal-amber);
}
.save-settings:hover,
.cancel-settings:hover {
background: rgba(0, 255, 65, 0.1);
text-shadow: var(--glow-green);
}
.save-settings {
background: #3b82f6;
color: white;
}
.cancel-settings {
background: var(--hover-bg);
color: var(--text-primary);
}
/* Bulk Actions Styles (Admin only) */
.bulk-actions-toolbar {
display: none;
justify-content: space-between;
align-items: center;
padding: 1rem;
background: var(--toolbar-bg, #1a202c);
border: 1px solid var(--toolbar-border, #ffc107);
border-radius: 8px;
margin: 1rem 0;
}
.bulk-actions-info {
font-weight: bold;
color: var(--text-primary, #333);
}
.bulk-actions-buttons {
display: flex;
gap: 0.5rem;
flex-wrap: wrap;
}
.btn-bulk {
padding: 0.5rem 1rem;
background: var(--btn-bulk-bg, #007bff);
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 0.9rem;
transition: background 0.2s ease;
}
.btn-bulk:hover {
background: var(--btn-bulk-hover, #0056b3);
}
.btn-secondary {
padding: 0.5rem 1rem;
background: var(--btn-secondary-bg, #6c757d);
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 0.9rem;
transition: background 0.2s ease;
}
.btn-secondary:hover {
background: var(--btn-secondary-hover, #5a6268);
}
/* 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: 10000;
}
.modal-content {
background: var(--bg-primary, white);
padding: 2rem;
border-radius: 8px;
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: 4px;
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;
}
/* 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;
}
}
/* Mobile */
@media (max-width: 768px) {
/* Use compact ASCII banner */
.ascii-banner {
font-size: 0.5rem !important;
}
/* Hide decorative ASCII corners on small screens */
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 */
*::before,
*::after {
content: none !important;
}
/* 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;
}
}