UNPKG

rabbitize

Version:

Transform visual UI interactions into automated processes

1,958 lines (1,681 loc) 39.5 kB
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;700&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Cousine:ital,wght@0,400;0,700;1,400;1,700&family=Kanit:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Red+Hat+Mono:ital,wght@0,300..700;1,300..700&family=Ubuntu+Mono:ital,wght@0,400;0,700;1,400;1,700&family=Ubuntu+Sans+Mono:ital,wght@0,400..700;1,400..700&display=swap'); * { margin: 0; padding: 0; box-sizing: border-box; } body { background: var(--bg-base); color: var(--color-primary); font-family: 'Kanit', monospace; font-size: 14px; line-height: 1.6; min-height: 100vh; overflow-x: hidden; } body::before { content: ''; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: repeating-linear-gradient( 0deg, transparent, transparent 2px, rgba(0, 255, 255, 0.03) 2px, rgba(0, 255, 255, 0.03) 4px ); pointer-events: none; z-index: 1; } .container { max-width: 1200px; margin: 0 auto; padding: 40px 20px; position: relative; z-index: 2; } .header { border: 2px solid var(--color-primary); padding: 20px; margin-bottom: 40px; position: relative; background: rgba(0, 255, 255, 0.05); } .header::before, .header::after { content: ''; position: absolute; width: 10px; height: 10px; border: 2px solid var(--color-primary); background: var(--bg-base); } .header::before { top: -6px; left: -6px; } .header::after { bottom: -6px; right: -6px; } h1 { font-size: 28px; font-weight: 700; text-transform: uppercase; letter-spacing: 4px; text-align: center; margin-bottom: 10px; text-shadow: 0 0 20px rgba(0, 255, 255, 0.8); } .subtitle { text-align: center; opacity: 0.7; font-size: 12px; letter-spacing: 2px; } .sessions { margin-top: 40px; } .session-card { border: 1px solid var(--color-primary); padding: 20px; margin-bottom: 20px; background: rgba(0, 255, 255, 0.02); transition: background 0.3s ease, box-shadow 0.3s ease; position: relative; } /* Smooth transitions for updating values */ .command-count, .uptime, .phase { transition: color 0.3s ease; } .command-count:not(:empty):not(:contains("0")) { color: var(--color-primary); font-weight: bold; } .phase { color: var(--color-accent); font-style: italic; } .session-card:hover { background: rgba(0, 255, 255, 0.08); box-shadow: 0 0 30px var(--glow-primary); } .session-card.historical { opacity: 0.8; border-color: var(--text-muted); transition: opacity 0.3s ease, border-color 0.3s ease; } .session-card.historical:hover { opacity: 1; border-color: var(--color-primary); } .session-info { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-bottom: 15px; position: relative; } /* Session cover GIF styling */ .session-cover { position: absolute; left: -130px; top: -21px; width: 100px; height: 100px; overflow: hidden; background: var(--bg-base); } .session-cover img { width: 100%; height: 100%; object-fit: contain; display: block; transition: opacity 0.3s ease, transform 0.3s ease; } .session-cover a { display: block; width: 100%; height: 100%; } .session-cover:hover img { opacity: 0.8; transform: scale(1.05); } /* Adjust session card padding to accommodate cover */ .session-card { margin-left: 115px; } .info-item { font-size: 12px; } .info-label { opacity: 0.6; text-transform: uppercase; letter-spacing: 1px; } .info-value { color: var(--text-primary); font-weight: 400; } /* Session ID link styling */ .session-id-link { color: var(--color-primary); text-decoration: none; transition: all 0.3s ease; border-bottom: 1px solid transparent; } .session-id-link:hover { color: var(--text-primary); border-bottom-color: var(--color-primary); text-shadow: 0 0 5px var(--glow-primary); } /* URL styling */ .url-item { grid-column: 1 / -1; /* Full width */ margin-bottom: 10px; padding-bottom: 10px; border-bottom: 1px solid var(--glow-primary); } .url-value { color: var(--color-primary); font-size: 13px; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; display: block; } .actions { display: flex; gap: 20px; margin-top: 20px; } .action-link { color: var(--color-primary); text-decoration: none; padding: 8px 16px; border: 1px solid var(--color-primary); transition: all 0.3s ease; text-transform: uppercase; font-size: 11px; letter-spacing: 1px; display: inline-block; } .action-link:hover { background: var(--color-primary); color: var(--bg-base); box-shadow: 0 0 20px var(--glow-primary); } .no-sessions { text-align: center; padding: 60px 20px; opacity: 0.6; } .status-indicator { display: inline-block; width: 8px; height: 8px; background: var(--color-success); border-radius: 50%; margin-right: 8px; animation: pulse 2s infinite; } .status-indicator-finished { display: inline-block; width: 8px; height: 8px; background: var(--text-muted); border-radius: 50%; margin-right: 8px; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } .timestamp { position: absolute; top: 20px; right: 20px; font-size: 10px; opacity: 0.5; font-family: monospace; } .glitch { position: relative; display: inline-block; } .glitch::before, .glitch::after { content: attr(data-text); position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .glitch::before { animation: glitch-1 0.5s infinite; color: var(--color-accent); z-index: -1; } .glitch::after { animation: glitch-2 0.5s infinite; color: var(--color-secondary); z-index: -2; } @keyframes glitch-1 { 0%, 100% { clip: rect(30px, 9999px, 10px, 0); transform: skew(0deg); } 20% { clip: rect(10px, 9999px, 40px, 0); transform: skew(0deg); } 40% { clip: rect(50px, 9999px, 30px, 0); transform: skew(0deg); } 60% { clip: rect(20px, 9999px, 60px, 0); transform: skew(0deg); } 80% { clip: rect(40px, 9999px, 20px, 0); transform: skew(0deg); } } @keyframes glitch-2 { 0%, 100% { clip: rect(20px, 9999px, 30px, 0); transform: skew(0deg); } 20% { clip: rect(40px, 9999px, 10px, 0); transform: skew(0deg); } 40% { clip: rect(10px, 9999px, 50px, 0); transform: skew(0deg); } 60% { clip: rect(30px, 9999px, 20px, 0); transform: skew(0deg); } 80% { clip: rect(50px, 9999px, 40px, 0); transform: skew(0deg); } } /* Stream viewer specific styles */ .stream-container { text-align: center; background: var(--bg-base); padding: 20px; border: 1px solid var(--color-primary); border-radius: 0; box-shadow: 0 0 30px var(--glow-primary); position: relative; } .stream-container::before, .stream-container::after { content: ''; position: absolute; width: 20px; height: 20px; border: 1px solid var(--color-primary); } .stream-container::before { top: -1px; left: -1px; border-right: none; border-bottom: none; } .stream-container::after { bottom: -1px; right: -1px; border-left: none; border-top: none; } img#stream { max-width: 100%; height: auto; border: 1px solid var(--color-primary); border-radius: 0; box-shadow: 0 0 20px var(--glow-primary); } .info { margin-top: 20px; text-align: center; color: var(--color-primary); opacity: 0.8; } .info p { margin: 5px 0; } .info code { background: var(--glow-primary); padding: 2px 6px; border: 1px solid var(--glow-primary); border-radius: 2px; font-size: 12px; } .error { color: #ff0066; text-align: center; padding: 20px; border: 1px solid #ff0066; background: rgba(255, 0, 102, 0.1); margin-top: 20px; } /* Modal styles */ .modal { display: none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; background-color: rgba(0, 0, 0, 0.9); backdrop-filter: blur(5px); } .modal-content { position: relative; background-color: var(--bg-base); margin: 5% auto; padding: 0; border: 2px solid var(--color-primary); width: 90%; max-width: 1000px; box-shadow: 0 0 40px var(--glow-primary); animation: modalGlow 2s ease-in-out infinite alternate; } @keyframes modalGlow { from { box-shadow: 0 0 40px var(--glow-primary); } to { box-shadow: 0 0 60px rgba(0, 255, 255, 0.8); } } .modal-header { display: flex; justify-content: space-between; align-items: center; padding: 20px; border-bottom: 1px solid var(--color-primary); background: rgba(0, 255, 255, 0.05); } .modal-title { font-size: 20px; color: var(--color-primary); text-transform: uppercase; letter-spacing: 2px; margin: 0; } .close-btn { color: var(--color-primary); font-size: 28px; border: none; background-color: #00000000; font-weight: bold; cursor: pointer; transition: all 0.3s ease; } .close-btn:hover, .close-btn:focus { color: var(--text-primary); transform: rotate(90deg); } .modal-body { padding: 30px; max-height: 70vh; overflow-y: auto; } /* Custom scrollbar for modal */ .modal-body::-webkit-scrollbar { width: 8px; } .modal-body::-webkit-scrollbar-track { background: var(--glow-primary); } .modal-body::-webkit-scrollbar-thumb { background: var(--color-primary); border-radius: 0; } /* Details section styling */ .details-section h3 { color: var(--color-primary); text-transform: uppercase; letter-spacing: 2px; font-size: 16px; margin: 30px 0 20px 0; padding-bottom: 10px; border-bottom: 1px solid var(--glow-primary); } .details-section h3:first-child { margin-top: 0; } /* Zoom preview container styles */ .zoom-preview-container { margin-top: 15px; min-height: 40px; border-top: 1px solid var(--glow-primary); padding-top: 10px; } .zoom-preview-loading, .zoom-preview-empty, .zoom-preview-error { text-align: center; font-size: 11px; opacity: 0.5; padding: 10px; } .zoom-preview-error { color: #ff0066; } .zoom-preview-grid { display: flex; flex-wrap: wrap; gap: 4px; padding: 5px 0; } .zoom-thumb { width: 40px; height: 40px; object-fit: cover; border: 1px solid var(--glow-primary); background: var(--bg-base); transition: border-color 0.2s ease, box-shadow 0.2s ease; cursor: pointer; position: relative; transform: scale(1); } .zoom-thumb:hover { border-color: var(--color-primary); transform: scale(1.5); z-index: 10; box-shadow: 0 0 20px rgba(0, 255, 255, 0.6); transition: all 0.2s ease; } /* Highlight states for cross-element interaction */ .zoom-thumb.highlight:not(:hover) { border-color: var(--color-secondary); box-shadow: 0 0 15px rgba(255, 0, 255, 0.8); transform: scale(1.3); z-index: 9; } .timing-bar.highlight { filter: brightness(1.5) !important; box-shadow: 0 0 30px currentColor !important; z-index: 20 !important; outline: 2px solid var(--text-primary); } /* Remove old zoom storyboard styles since we moved them inline */ /* Command section styles */ .command-section { margin-bottom: 30px; } .command-section h4 { color: var(--color-accent); text-transform: uppercase; letter-spacing: 1px; font-size: 14px; margin-bottom: 10px; } .command-box { background: rgba(0, 255, 255, 0.05); border: 1px solid var(--color-primary); padding: 20px; margin-bottom: 10px; overflow-x: auto; font-family: 'JetBrains Mono', monospace; font-size: 12px; line-height: 1.4; position: relative; } .command-box::before { content: '>'; position: absolute; left: 5px; top: 20px; color: var(--color-primary); opacity: 0.5; } .command-box code { color: var(--text-primary); white-space: pre; display: block; padding-left: 15px; } /* Copy button styles */ .copy-btn, .details-btn, .rerun-btn { background: transparent; color: var(--color-primary); border: 1px solid var(--color-primary); padding: 8px 16px; cursor: pointer; text-transform: uppercase; font-size: 11px; letter-spacing: 1px; font-family: 'JetBrains Mono', monospace; transition: all 0.3s ease; } .copy-btn:hover, .details-btn:hover { background: var(--color-primary); color: var(--bg-base); box-shadow: 0 0 20px var(--glow-primary); } /* Re-run button with warning colors */ .rerun-btn { color: var(--color-accent); border-color: var(--color-accent); } .rerun-btn:hover { background: var(--color-accent); color: var(--bg-base); box-shadow: 0 0 20px var(--glow-accent); } /* Confirmation modal styles */ .confirm-warning { background: rgba(255, 255, 0, 0.1); border: 1px solid var(--color-accent); padding: 15px; margin: 15px 0; color: var(--color-accent); } .confirm-info { margin: 20px 0; } .confirm-info-item { margin: 5px 0; color: var(--text-secondary); } .confirm-actions { display: flex; gap: 15px; justify-content: flex-end; margin-top: 20px; } .confirm-btn { background: transparent; border: 1px solid var(--color-success); color: var(--color-success); padding: 10px 20px; cursor: pointer; text-transform: uppercase; font-size: 12px; letter-spacing: 1px; font-family: 'JetBrains Mono', monospace; transition: all 0.3s ease; } .confirm-btn:hover { background: var(--color-success); color: var(--bg-base); box-shadow: 0 0 20px rgba(0, 255, 0, 0.5); } .cancel-btn { border-color: var(--text-muted); color: var(--text-muted); } .cancel-btn:hover { background: var(--text-muted); color: var(--bg-base); box-shadow: 0 0 20px rgba(102, 102, 102, 0.5); } .copy-btn:active, .details-btn:active { transform: scale(0.95); } /* Success state for copy button */ .copy-btn.copied { background: var(--color-success); border-color: var(--color-success); color: var(--bg-base); } /* Accordion hierarchy styles */ .client-group { margin-bottom: 30px; border: 1px solid var(--glow-primary); background: rgba(0, 255, 255, 0.01); } .client-header { padding: 15px 20px; background: rgba(0, 255, 255, 0.05); border-bottom: 1px solid var(--glow-primary); display: flex; justify-content: space-between; align-items: center; transition: all 0.3s ease; } .client-header:hover { background: var(--glow-primary); } .client-header-link { text-decoration: none; transition: all 0.3s ease; } .client-header-link h2 { transition: color 0.3s ease; } .client-header-link:hover h2 { color: var(--text-primary); text-shadow: 0 0 10px rgba(0, 255, 255, 0.8); } .client-header h2 { margin: 0; font-size: 18px; color: var(--color-primary); text-transform: uppercase; letter-spacing: 2px; } .client-stats { display: flex; gap: 20px; align-items: center; font-size: 12px; opacity: 0.8; } .toggle-icon { font-size: 20px; color: var(--color-primary); transition: transform 0.3s ease; } .client-group.collapsed .toggle-icon { transform: rotate(-90deg); } .client-content { max-height: 2000px; overflow: hidden; transition: max-height 0.3s ease; } .client-group.collapsed .client-content { max-height: 0; } .test-group { border-top: 1px solid var(--glow-primary); } .test-header { padding: 12px 20px 12px 40px; background: rgba(0, 255, 255, 0.02); display: flex; justify-content: space-between; align-items: center; transition: all 0.3s ease; } .test-header:hover { background: rgba(0, 255, 255, 0.05); } .test-header-link { text-decoration: none; transition: all 0.3s ease; } .test-header-link h3 { transition: color 0.3s ease; } .test-header-link:hover h3 { color: var(--text-primary); text-shadow: 0 0 10px rgba(255, 255, 0, 0.8); } .test-header h3 { margin: 0; font-size: 14px; color: var(--color-accent); text-transform: uppercase; letter-spacing: 1px; } .test-content { padding: 10px; max-height: 2000px; overflow: hidden; transition: max-height 0.3s ease; } .test-group.collapsed .test-content { max-height: 0; padding: 0 10px; } .test-group.collapsed .toggle-icon { transform: rotate(-90deg); } /* Adjust session card margins in accordion */ .test-content .session-card { margin-bottom: 15px; } .test-content .session-card:last-child { margin-bottom: 0; } /* Timing chart styles */ .timing-chart-container { margin-top: 15px; padding: 10px 0; border-top: 1px solid var(--glow-primary); } .timing-chart { position: relative; height: 30px; background: rgba(0, 255, 255, 0.05); border: 1px solid var(--glow-primary); overflow: hidden; margin-bottom: 5px; } /* No animation for timing bars - they appear instantly */ .timing-bar { position: absolute; height: 100%; display: flex; align-items: center; justify-content: center; font-size: 10px; color: var(--bg-base); font-weight: bold; transition: all 0.3s ease; cursor: pointer; overflow: hidden; white-space: nowrap; box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.3); text-shadow: 0 0 2px rgba(255, 255, 255, 0.5); } /* Clickable state indicator */ .timing-bar:active, .zoom-thumb:active { transform: scale(0.95) !important; } .timing-bar:hover { z-index: 10; filter: brightness(1.3); box-shadow: 0 0 20px currentColor; } /* Command type colors */ .timing-bar[data-command=":move-mouse"] { background: var(--color-primary); } .timing-bar[data-command=":click"] { background: var(--color-secondary); } .timing-bar[data-command=":drag"] { background: var(--color-accent); } .timing-bar[data-command=":type"] { background: var(--color-success); } .timing-bar[data-command=":scroll"] { background: #f60; } .timing-bar[data-command=":wait"] { background: var(--text-muted); } .timing-bar[data-command=":navigate"] { background: #00f; } .timing-bar[data-command=":assert"] { background: var(--color-error); } .timing-bar[data-command=":api"] { background: #90f; } .timing-bar[data-command=":key"] { background: var(--color-success); } .timing-bar[data-command=":keypress"] { background: var(--color-success); } .timing-bar[data-command=":select"] { background: #9cf; } .timing-bar[data-command=":upload"] { background: #f90; } .timing-bar[data-command=":screenshot"] { background: #c0f; } .timing-bar[data-command=":exec"] { background: #fc0; } .timing-bar[data-command=":hover"] { background: #6ff; } .timing-bar[data-command=":reload"] { background: #06f; } .timing-bar[data-command=":back"] { background: #66f; } .timing-bar[data-command=":forward"] { background: #99f; } /* Default color for unknown commands */ .timing-bar { background: var(--text-secondary); } /* Gap indicator */ .timing-gap { position: absolute; height: 100%; background: repeating-linear-gradient( 45deg, transparent, transparent 2px, var(--overlay-light) 2px, var(--overlay-light) 4px ); border-left: 1px dashed rgba(255, 255, 255, 0.3); border-right: 1px dashed rgba(255, 255, 255, 0.3); } .timing-stats { display: flex; gap: 20px; font-size: 11px; opacity: 0.8; } .timing-stat { display: flex; gap: 5px; } .timing-stat-label { color: var(--color-primary); text-transform: uppercase; } .timing-tooltip { position: absolute; bottom: 35px; left: 50%; transform: translateX(-50%); background: var(--bg-base); border: 1px solid var(--color-primary); padding: 5px 10px; font-size: 11px; white-space: nowrap; pointer-events: none; opacity: 0; transition: opacity 0.2s ease; z-index: 100; } .timing-bar:hover .timing-tooltip { opacity: 1; } /* Loading state for timing chart */ .timing-chart-loading { text-align: center; font-size: 11px; opacity: 0.5; padding: 20px; } .timing-chart-empty { text-align: center; font-size: 11px; opacity: 0.5; padding: 10px; } /* Step detail overlay styles */ .step-overlay { position: fixed; top: -100%; left: 0; width: 100%; height: 35vh; background: var(--bg-base); border-bottom: 2px solid var(--color-primary); box-shadow: 0 5px 30px var(--glow-primary); z-index: 1000; transition: top 0.3s ease-out; overflow: hidden; } .step-overlay.active { top: 0; } .step-overlay-content { display: flex; height: 100%; padding: 20px; gap: 20px; } .step-overlay-close { position: absolute; top: 10px; right: 20px; font-size: 24px; color: var(--color-primary); cursor: pointer; z-index: 10; transition: all 0.2s ease; } .step-overlay-close:hover { color: var(--text-primary); transform: rotate(90deg); } .step-screenshot-section { flex: 0 0 40%; display: flex; gap: 15px; } .step-screenshot { flex: 1; position: relative; border: 1px solid var(--color-primary); overflow: hidden; background: var(--bg-surface); } .step-screenshot img { width: 100%; height: 100%; object-fit: contain; } .step-screenshot-label { position: absolute; top: 5px; left: 5px; background: var(--overlay-dark); color: var(--color-primary); padding: 2px 8px; font-size: 11px; text-transform: uppercase; border: 1px solid var(--color-primary); } .step-info-section { flex: 1; display: flex; flex-direction: column; gap: 15px; overflow-y: auto; } .step-header { border-bottom: 1px solid var(--glow-primary); padding-bottom: 10px; } .step-title { font-size: 20px; color: var(--color-primary); text-transform: uppercase; margin-bottom: 5px; } .step-command-display { font-family: 'JetBrains Mono', monospace; color: var(--color-accent); font-size: 14px; background: rgba(255, 255, 0, 0.1); padding: 8px 12px; border: 1px solid var(--glow-accent); border-radius: 0; } .step-metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; } .step-metric { background: rgba(0, 255, 255, 0.05); border: 1px solid var(--glow-primary); padding: 10px; } .step-metric-label { font-size: 10px; color: var(--color-primary); text-transform: uppercase; opacity: 0.8; } .step-metric-value { font-size: 16px; color: var(--text-primary); font-weight: bold; } .step-dom-preview { flex: 1; background: rgba(0, 255, 255, 0.02); border: 1px solid var(--glow-primary); padding: 10px; overflow-y: auto; font-family: 'JetBrains Mono', monospace; font-size: 11px; white-space: pre-wrap; color: var(--text-secondary); } .step-video-section { flex: 0 0 30%; display: flex; flex-direction: column; gap: 10px; } .step-video { width: 100%; border: 1px solid var(--color-primary); background: var(--bg-base); } /* Custom scrollbar for step overlay */ .step-info-section::-webkit-scrollbar, .step-dom-preview::-webkit-scrollbar { width: 6px; } .step-info-section::-webkit-scrollbar-track, .step-dom-preview::-webkit-scrollbar-track { background: var(--glow-primary); } .step-info-section::-webkit-scrollbar-thumb, .step-dom-preview::-webkit-scrollbar-thumb { background: var(--color-primary); } /* Global dock styles */ .global-dock { position: fixed; bottom: 0; left: 0; right: 0; background: rgba(0, 0, 0, 0.95); border-top: 2px solid var(--color-primary); z-index: 9999; transition: all 0.3s ease; backdrop-filter: blur(10px); } .global-dock.dock-top { bottom: auto; top: 0; border-top: none; border-bottom: 2px solid var(--color-primary); } .global-dock.minimized { transform: translateY(calc(100% - 30px)); } .global-dock.dock-top.minimized { transform: translateY(calc(-100% + 30px)); } .dock-content { display: flex; align-items: center; padding: 10px 20px; gap: 20px; height: 80px; position: relative; } .dock-label { color: var(--color-secondary); font-size: 12px; font-weight: bold; letter-spacing: 2px; text-transform: uppercase; white-space: nowrap; } .dock-sessions { flex: 1; display: flex; gap: 15px; overflow-x: auto; padding: 0 10px; } .dock-empty { color: var(--text-muted); font-size: 12px; font-style: italic; } .dock-session { display: flex; align-items: center; gap: 10px; padding: 8px 12px; background: var(--glow-primary); border: 1px solid var(--color-primary); cursor: pointer; transition: all 0.3s ease; position: relative; white-space: nowrap; min-width: 200px; } .dock-session:hover { background: var(--glow-primary); transform: translateY(-5px); box-shadow: 0 5px 20px rgba(0, 255, 255, 0.4); } .dock-session-preview { width: 60px; height: 45px; border: 1px solid var(--color-primary); overflow: hidden; flex-shrink: 0; } .dock-session-preview img { width: 100%; height: 100%; object-fit: cover; } .dock-session-info { flex: 1; } .dock-session-client { color: var(--color-primary); font-size: 12px; font-weight: bold; } .dock-session-test { color: var(--color-accent); font-size: 11px; opacity: 0.8; } .dock-session-status { display: flex; align-items: center; gap: 5px; color: var(--color-success); font-size: 11px; } .pulse-dot { width: 8px; height: 8px; background: var(--color-success); border-radius: 50%; animation: pulse 2s infinite; } /* Dock menu */ .dock-menu { display: flex; gap: 10px; border-left: 1px solid var(--glow-primary); padding-left: 20px; } .dock-menu-item { display: flex; flex-direction: column; align-items: center; justify-content: center; width: 50px; height: 50px; background: var(--glow-primary); border: 1px solid var(--color-primary); color: var(--color-primary); text-decoration: none; transition: all 0.3s ease; } .dock-menu-item:hover { background: var(--color-primary); color: var(--bg-base); transform: scale(1.1); } .menu-icon { font-size: 20px; } .menu-label { font-size: 9px; text-transform: uppercase; } /* Dock controls */ .dock-controls { position: absolute; right: 20px; top: 5px; display: flex; gap: 5px; } .dock-control { background: transparent; border: 1px solid var(--text-muted); color: var(--text-muted); padding: 2px 8px; cursor: pointer; font-size: 12px; transition: all 0.2s ease; } .dock-control:hover { border-color: var(--color-primary); color: var(--color-primary); } /* Dock preview popup */ .dock-preview-popup { position: absolute; background: rgba(0, 0, 0, 0.95); border: 2px solid var(--color-primary); padding: 15px; margin-bottom: 10px; min-width: 300px; box-shadow: 0 0 30px var(--glow-primary); z-index: 10000; pointer-events: none; } .dock-preview-header { color: var(--color-primary); font-weight: bold; margin-bottom: 10px; text-transform: uppercase; } .dock-preview-image { width: 100%; height: 200px; border: 1px solid var(--color-primary); margin-bottom: 10px; overflow: hidden; } .dock-preview-image img { width: 100%; height: 100%; object-fit: cover; } .dock-preview-info { font-size: 11px; color: var(--text-secondary); } .dock-preview-info div { margin: 3px 0; } /* Adjust body padding for dock */ body { padding-bottom: 100px; } body.has-dock-top { padding-bottom: 20px; padding-top: 100px; } /* Hide scrollbar for dock sessions */ .dock-sessions::-webkit-scrollbar { height: 4px; } .dock-sessions::-webkit-scrollbar-track { background: var(--glow-primary); } .dock-sessions::-webkit-scrollbar-thumb { background: var(--color-primary); } /* Process debugging panel styles */ .process-panel { display: none; position: fixed; right: 20px; top: 80px; width: 400px; max-height: 80vh; background: rgba(0, 0, 0, 0.95); border: 2px solid var(--color-primary); box-shadow: 0 0 20px var(--glow-primary); z-index: 1000; overflow: hidden; } .process-panel-header { display: flex; justify-content: space-between; align-items: center; padding: 15px; border-bottom: 1px solid var(--color-primary); background: var(--glow-primary); } .process-panel-header h3 { margin: 0; font-size: 14px; letter-spacing: 2px; } .process-panel-content { padding: 15px; max-height: calc(80vh - 60px); overflow-y: auto; } .process-section { margin-bottom: 20px; } .process-section h4 { font-size: 12px; margin-bottom: 10px; color: var(--color-primary); letter-spacing: 1px; } .process-list { display: flex; flex-direction: column; gap: 10px; } .process-item { padding: 10px; border: 1px solid var(--color-primary); background: rgba(0, 255, 255, 0.05); } .process-info { display: flex; gap: 15px; margin-bottom: 5px; font-size: 12px; } .process-pid { color: var(--color-accent); } .process-port { color: var(--color-secondary); } .process-status { text-transform: uppercase; font-weight: bold; } .status-active { color: var(--color-success); } .status-completed { color: var(--color-primary); } .status-terminated { color: var(--color-error); } .process-details { font-size: 11px; color: var(--text-secondary); margin-bottom: 10px; } .process-actions { display: flex; gap: 10px; } .action-btn { padding: 3px 10px; background: var(--bg-base); border: 1px solid var(--color-primary); color: var(--color-primary); cursor: pointer; font-size: 11px; transition: all 0.3s ease; } .action-btn:hover { background: var(--color-primary); color: var(--bg-base); } .action-btn.danger { border-color: var(--color-error); color: var(--color-error); } .action-btn.danger:hover { background: var(--color-error); color: var(--bg-base); } .no-processes, .no-orphans { text-align: center; padding: 20px; color: var(--text-muted); } .orphan-list { display: flex; flex-direction: column; gap: 10px; } .orphan-item { padding: 10px; border: 1px solid var(--color-secondary); background: rgba(255, 0, 255, 0.05); } .orphan-info { display: flex; gap: 15px; margin-bottom: 10px; font-size: 12px; } .log-content { background: var(--bg-base); border: 1px solid var(--color-primary); padding: 15px; max-height: 300px; overflow-y: auto; font-family: monospace; font-size: 12px; white-space: pre-wrap; color: var(--color-success); } .error { color: var(--color-error); text-align: center; padding: 20px; } /* ===== SINGLE PAGE NAVIGATION ===== */ .back-link { position: fixed; top: 20px; left: 20px; color: var(--color-primary); text-decoration: none; padding: 10px 20px; border: 1px solid var(--color-primary); background: var(--overlay-dark); transition: all 0.3s ease; z-index: 100; font-size: 12px; text-transform: uppercase; letter-spacing: 1px; } .back-link:hover { background: var(--color-primary); color: var(--bg-base); box-shadow: 0 0 20px var(--glow-primary); } /* Breadcrumb navigation */ .breadcrumb { display: flex; align-items: center; gap: 10px; margin-bottom: 20px; font-size: 14px; } .breadcrumb a { color: var(--color-primary); text-decoration: none; transition: all 0.3s ease; } .breadcrumb a:hover { color: var(--text-primary); text-shadow: 0 0 10px var(--glow-primary); } .breadcrumb-separator { color: var(--text-muted); } .breadcrumb-current { color: var(--text-primary); } /* Single page containers */ .single-client-container, .single-test-container, .single-session-container { max-width: 1400px; margin: 0 auto; padding: 80px 20px 40px; } /* ===== AI MONOLOGUE PANEL ===== */ .ai-monologue-panel { display: none; margin: 20px 0; border: 1px solid var(--color-primary); background: rgba(0, 0, 0, 0.9); box-shadow: 0 0 30px var(--glow-primary); overflow: hidden; position: relative; } .ai-monologue-panel::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 1px; background: linear-gradient(90deg, transparent, #0ff, transparent); animation: scan-line 3s linear infinite; } @keyframes scan-line { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } } .ai-monologue-header { background: linear-gradient(90deg, var(--bg-base) 0%, var(--color-primary) 50%, var(--bg-base) 100%); background-size: 200% 100%; animation: gradient-shift 3s ease infinite; padding: 10px 20px; border-bottom: 1px solid var(--color-primary); display: flex; align-items: center; justify-content: space-between; } @keyframes gradient-shift { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } .ai-monologue-title { color: var(--bg-base); font-weight: bold; text-transform: uppercase; letter-spacing: 2px; font-size: 14px; } .ai-monologue-status { color: var(--bg-base); font-size: 12px; opacity: 0.8; } /* AI Objective Display */ .ai-objective-container { background: linear-gradient(135deg, rgba(255, 0, 255, 0.1) 0%, var(--glow-primary) 100%); border-bottom: 2px solid var(--color-primary); padding: 20px; position: relative; overflow: hidden; } .ai-objective-container::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 2px; background: linear-gradient(90deg, transparent, #f0f, transparent); animation: objective-scan 4s linear infinite; } @keyframes objective-scan { 0% { left: -100%; } 100% { left: 100%; } } .ai-objective-label { font-size: 11px; text-transform: uppercase; letter-spacing: 2px; color: var(--color-secondary); margin-bottom: 10px; opacity: 0.8; } .ai-objective-text { font-size: 14px; line-height: 1.6; color: var(--text-primary); font-weight: 500; text-shadow: 0 0 10px var(--glow-secondary); } /* AI Message Content */ .ai-monologue-content { display: grid; grid-template-columns: 1fr 1fr; gap: 1px; background: var(--color-primary); border-top: 1px solid var(--color-primary); } .ai-message-box { background: var(--bg-base); padding: 20px; min-height: 200px; position: relative; overflow: auto; max-height: 400px; display: flex; flex-direction: column; } .ai-message-box.user { border-right: 1px solid var(--color-primary); } .ai-message-label { position: absolute; top: 10px; left: 10px; font-size: 10px; text-transform: uppercase; letter-spacing: 1px; opacity: 0.5; } .ai-message-label.user { color: var(--color-accent); } .ai-message-label.model { color: var(--color-success); } .ai-message-content { margin-top: 30px; font-family: 'Courier New', monospace; font-size: 13px; line-height: 1.6; white-space: pre-wrap; word-wrap: break-word; } .ai-message-content .function-call { display: inline-block; background: var(--glow-primary); border: 1px solid var(--color-primary); padding: 2px 6px; margin: 2px 0; font-size: 12px; color: var(--color-primary); } .ai-message-timestamp { position: absolute; bottom: 10px; right: 10px; font-size: 10px; opacity: 0.4; } /* AI Metadata Display */ .ai-metadata-container { margin-top: auto; padding-top: 10px; border-top: 1px solid var(--glow-primary); min-height: 0; } .ai-metadata-table { width: 100%; font-size: 9px; color: var(--color-primary); opacity: 0.7; border-collapse: collapse; margin-top: 5px; } .ai-metadata-table td { padding: 1px 4px; border: 1px solid var(--glow-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 150px; } .ai-metadata-table td:first-child { font-weight: bold; text-align: right; width: 30%; color: var(--color-accent); opacity: 0.8; } /* Pulsing effect for new messages */ @keyframes message-pulse { 0% { opacity: 1; } 50% { opacity: 0.5; } 100% { opacity: 1; } } .ai-message-box.updating { animation: message-pulse 0.5s ease-in-out; } /* No data state */ .ai-no-data { display: flex; align-items: center; justify-content: center; min-height: 200px; color: var(--text-muted); font-style: italic; text-align: center; } /* ===== UTILITY CLASSES ===== */ /* Success/Error Messages */ .success-message { position: fixed; top: 20px; right: 20px; background: var(--color-success); color: var(--bg-base); padding: 15px; border: 2px solid var(--color-success); z-index: 10000; animation: fadeInOut 5s ease-in-out; } @keyframes fadeInOut { 0% { opacity: 0; transform: translateY(-20px); } 10% { opacity: 1; transform: translateY(0); } 90% { opacity: 1; transform: translateY(0); } 100% { opacity: 0; transform: translateY(-20px); } } /* External Process Indicator */ .external-indicator { color: var(--color-secondary); } /* Port Display */ .port-display { color: var(--color-secondary); font-weight: bold; } /* ===== DASHBOARD SPECIFIC ===== */ /* Header layout */ .header-flex { display: flex; align-items: center; justify-content: flex-start; gap: 20px; } .header-logo { display: block; width: 100px; height: 100px; } .header-title { font-size: 40px; margin: 0; } .header-subtitle { margin-top: 5px; } /* Modal sizing */ .modal-large { max-width: 80%; max-height: 80%; } .modal-medium { max-width: 600px; } .modal-body-scroll { overflow: auto; } /* Session indicators */ .active-indicator { color: var(--color-success); } .session-help-text { margin-top: 10px; font-size: 12px; } .session-meta { margin-top: 5px; font-size: 11px; opacity: 0.7; } /* Code editors */ .code-editor { height: 200px; border: 1px solid var(--color-primary); } .code-editor-tall { height: 300px; border: 1px solid var(--color-primary); } .command-section-spaced { margin-top: 20px; } /* Centered text */ .text-center-muted { text-align: center; opacity: 0.6; }