UNPKG

git-contextor

Version:

A code context tool with vector search and real-time monitoring, with optional Git integration.

566 lines (519 loc) 11.6 kB
/* * Modern Dashboard Stylesheet for Git Contextor * Inspired by modern UI frameworks like Tailwind CSS. */ :root { --primary-color: #10B981; --background-color: #F8F9FA; --card-background: #FFFFFF; --text-color: #1F2937; --subtle-text-color: #6B7280; --border-color: #E5E7EB; --success-color: #22c55e; --error-color: #ef4444; --font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } /* Base and Layout */ body { font-family: var(--font-family); background-color: var(--background-color); color: var(--subtle-text-color); margin: 0; line-height: 1.6; font-size: 14px; } .container { max-width: 1280px; margin: 0 auto; padding: 0; } header { background-color: var(--card-background); padding: 1rem 1.5rem; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--border-color); box-shadow: 0 1px 2px rgba(0,0,0,0.03); position: sticky; top: 0; z-index: 50; } header h1 { margin: 0; font-size: 1.5rem; color: var(--primary-color); font-weight: 700; } main { padding: 1.5rem; } footer { text-align: center; padding: 1.5rem; color: var(--subtle-text-color); font-size: 0.875rem; border-top: 1px solid var(--border-color); } footer a { color: var(--text-color); text-decoration: none; font-weight: 500; } footer a:hover { color: var(--primary-color); } /* Navigation */ #main-nav { display: flex; gap: 0.5rem; } #main-nav a { text-decoration: none; color: var(--text-color); font-weight: 500; padding: 0.5rem 1rem; border-radius: 6px; transition: all 0.2s; } #main-nav a:hover { background-color: var(--background-color); } #main-nav a.active { background-color: var(--primary-color); color: white; font-weight: 600; } #view-nav { display: flex; gap: 8px; margin-bottom: 1.5rem; border-bottom: 1px solid var(--border-color); } #view-nav a { padding: 0.5rem 1rem; border-radius: 6px 6px 0 0; text-decoration: none; color: var(--subtle-text-color); font-weight: 500; border-bottom: 2px solid transparent; transition: all 0.2s; position: relative; top: 1px; } #view-nav a:hover { color: var(--text-color); } #view-nav a.active { border-bottom: 2px solid var(--primary-color); color: var(--text-color); font-weight: 600; } /* Cards & Grids */ .card { background-color: var(--card-background); padding: 1.5rem; border-radius: 12px; border: 1px solid var(--border-color); box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); margin-bottom: 1.5rem; } .dashboard-grid { display: grid; grid-template-columns: repeat(1, 1fr); gap: 1.5rem; } @media (min-width: 1024px) { .dashboard-grid { grid-template-columns: repeat(2, 1fr); } .full-width { grid-column: 1 / -1; } } .metrics-grid, .config-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); gap: 1.5rem; } .metrics-grid .card, .config-grid .card { margin-bottom: 0; } .card h2, .card h3 { color: var(--text-color); font-size: 1.25rem; font-weight: 600; margin: 0 0 1rem 0; padding-bottom: 1rem; border-bottom: 1px solid var(--border-color); } .card p { margin-top: 0; margin-bottom: 1rem; } .card p:last-child { margin-bottom: 0; } /* Forms & Buttons */ .form-group { margin-bottom: 1rem; } .form-group label { display: block; font-weight: 500; color: var(--text-color); margin-bottom: 0.5rem; } input[type="text"], input[type="number"], input[type="password"], textarea, select { width: 100%; box-sizing: border-box; padding: 0.75rem; border: 1px solid var(--border-color); border-radius: 8px; font-family: inherit; font-size: 1rem; background-color: #fdfdfd; transition: border-color 0.2s, box-shadow 0.2s; } input:focus, textarea:focus, select:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 2px rgba(16, 185, 129, 0.2); } textarea { min-height: 120px; font-family: monospace; font-size: 0.9em; } button { padding: 0.75rem 1.5rem; border: none; background-color: var(--primary-color); color: white; border-radius: 8px; cursor: pointer; font-size: 1rem; font-weight: 500; transition: background-color 0.2s; } button:hover { background-color: #0d9488; } button:disabled { background-color: #9ca3af; cursor: not-allowed; } .button-secondary { padding: 0.5rem 1rem; background-color: var(--card-background); color: var(--text-color); border: 1px solid var(--border-color); font-size: 0.875rem; } .button-secondary:hover { background-color: var(--background-color); } .button-danger { background-color: var(--error-color); border: 1px solid var(--error-color); } .button-danger:hover { background-color: #dc2626; border-color: #dc2626; } .search-input-group { display: flex; flex-wrap: wrap; gap: 1rem; align-items: center; } #search-query, #chat-query { flex-grow: 1; } /* Status & Specific Components */ .status-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1rem; } .status-grid div { background-color: var(--background-color); padding: 0.75rem 1rem; border-radius: 8px; font-size: 0.875rem; } #activity-log { list-style-type: none; padding: 0; margin: 0; max-height: 400px; overflow-y: auto; font-size: 0.875rem; } #activity-log li { padding: 0.5rem 0; border-bottom: 1px solid var(--border-color); } .search-result-card { border: 1px solid var(--border-color); border-radius: 12px; margin-bottom: 1rem; overflow: hidden; } .result-card-header { display: flex; justify-content: space-between; align-items: center; background-color: var(--background-color); padding: 0.5rem 1rem; border-bottom: 1px solid var(--border-color); font-size: 0.875rem; } .result-card-header .file-path { font-weight: 500; color: var(--text-color); font-family: monospace; } .search-result-card pre { margin: 0; } .search-result-card pre code.hljs { padding: 1rem; } /* Docs Page */ .docs-container { display: flex; gap: 1.5rem; align-items: flex-start; } .docs-nav { flex: 0 0 240px; position: sticky; top: calc(1.5rem + 70px); /* main padding + header height */ } .docs-nav a { display: block; text-decoration: none; padding: 0.5rem 1rem; border-radius: 6px; color: var(--subtle-text-color); font-weight: 500; border-left: 2px solid transparent; } .docs-nav a:hover { color: var(--text-color); background-color: var(--background-color); } .docs-nav a.active { background-color: transparent; color: var(--primary-color); border-left-color: var(--primary-color); font-weight: 600; } /* File Browser */ .file-browser-container { display: flex; gap: 1.5rem; min-height: 70vh; max-height: 70vh; } .file-tree-panel { flex: 0 0 320px; background-color: var(--background-color); border-radius: 8px; padding: 0.5rem; overflow-y: auto; border: 1px solid var(--border-color); } .file-viewer-panel { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; } .file-viewer-header { display: flex; justify-content: space-between; align-items: center; padding-bottom: 0.75rem; margin-bottom: 0.75rem; border-bottom: 1px solid var(--border-color); } .file-viewer-header h3 { margin: 0; padding: 0; border: none; font-family: monospace; font-size: 1.1rem; } .file-viewer-content { flex-grow: 1; border: 1px solid var(--border-color); border-radius: 8px; overflow-y: auto; } /* Share with .docs-content */ .docs-content { flex: 1 1 auto; min-width: 0; padding: 0 1rem; } .docs-content h1, .docs-content h2, .docs-content h3, .docs-content h4 { color: var(--text-color); border-bottom: 1px solid var(--border-color); padding-bottom: 0.5rem; margin-top: 1.5rem; margin-bottom: 1rem; } .docs-content code { background-color: #eef1f3; padding: 0.2em 0.4em; font-size: 85%; border-radius: 3px; font-family: monospace; } .docs-content pre { background-color: #f6f8fa; border: 1px solid var(--border-color); border-radius: 6px; padding: 1rem; overflow: auto; } /* File Tree */ .file-tree { list-style: none; padding: 0; margin: 0; font-size: 0.875rem; } .file-tree-node a { display: flex; align-items: center; padding: 0.4rem 0.5rem; text-decoration: none; color: var(--text-color); border-radius: 6px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .file-tree-node a:hover { background-color: #e9e9e9; } .file-tree-node.selected > a { background-color: var(--primary-color); color: white; } .file-tree-node .icon { margin-right: 0.5rem; } .file-tree-subtree { list-style: none; padding-left: 0; display: none; } .file-tree-node.open > .file-tree-subtree { display: block; } .type-directory { cursor: pointer; } .type-directory > a .icon::before { content: '▶'; display: inline-block; transition: transform 0.1s linear; margin-right: 0.2rem; } .file-tree-node.open > a .icon::before { transform: rotate(90deg); } /* Utility classes */ .hidden { display: none !important; } .error-message { margin-top: 1rem; color: var(--error-color); background-color: #fef2f2; border: 1px solid var(--error-color); padding: 0.75rem 1rem; border-radius: 8px; } .toast { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%) translateY(100px); background-color: var(--text-color); color: white; padding: 0.75rem 1.5rem; border-radius: 8px; z-index: 1000; opacity: 0; box-shadow: 0 4px 10px rgba(0,0,0,0.2); transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); } .toast.show { opacity: 1; transform: translateX(-50%) translateY(0); } a.file-link { text-decoration: none; cursor: pointer; color: var(--primary-color); font-weight: 500; } a.file-link:hover { text-decoration: underline; } .danger-zone-actions { display: flex; flex-direction: column; gap: 15px; } .action-item { display: flex; justify-content: space-between; align-items: center; border: 1px solid var(--error-color); padding: 20px; border-radius: 8px; background-color: #fffafa; } .toggle-switch { position: relative; display: inline-block; width: 44px; height: 24px; margin-left: 10px; vertical-align: middle; } .toggle-switch input { opacity: 0; width: 0; height: 0; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; transition: .4s; border-radius: 24px; } .slider:before { position: absolute; content: ""; height: 18px; width: 18px; left: 3px; bottom: 3px; background-color: white; transition: .4s; border-radius: 50%; } input:checked + .slider { background-color: var(--primary-color); } input:checked + .slider:before { transform: translateX(20px); }