diff --git a/.gitignore b/.gitignore
index 763bcc3..dbb0a33 100644
--- a/.gitignore
+++ b/.gitignore
@@ -43,6 +43,21 @@ Thumbs.db
# Local configuration
.claude/
*.local.json
+.env
+.env.local
+.env.production
+
+# Secrets
+*.pem
+*.key
+
+# POS static uploads
+pos/static/images/parts/
+
+# SQLite databases
+*.db
+*.db-shm
+*.db-wal
# Temporary files
*.tmp
@@ -54,6 +69,10 @@ Thumbs.db
# Data files (TecDoc downloads, too large for git)
data/
+vehicle_database/
+CapturasWeb/
+.pytest_cache/
+node_modules/
# SQLite WAL files
*.db-shm
diff --git a/config.py b/config.py
index 4b0f627..d7573bf 100644
--- a/config.py
+++ b/config.py
@@ -4,10 +4,12 @@ Central configuration for Nexus Autoparts.
import os
# Database
-DB_URL = os.environ.get(
- "DATABASE_URL",
- "postgresql://nexus:nexus_autoparts_2026@localhost/nexus_autoparts"
-)
+DB_URL = os.environ.get("DATABASE_URL")
+if not DB_URL:
+ raise ValueError(
+ "DATABASE_URL environment variable is required. "
+ "Example: postgresql://user:pass@localhost/nexus_autoparts"
+ )
# Legacy SQLite path (used only by migration script)
SQLITE_PATH = os.path.join(
@@ -16,7 +18,13 @@ SQLITE_PATH = os.path.join(
)
# JWT Authentication
-JWT_SECRET = os.environ.get("JWT_SECRET", "nexus-saas-secret-change-in-prod-2026")
+JWT_SECRET = os.environ.get("JWT_SECRET")
+if not JWT_SECRET:
+ raise ValueError(
+ "JWT_SECRET environment variable is required. "
+ "Generate one with: python3 -c 'import secrets; print(secrets.token_hex(32))'"
+ )
+
JWT_ACCESS_EXPIRES = 900 # 15 minutes
JWT_REFRESH_EXPIRES = 2592000 # 30 days
diff --git a/dashboard/admin.css b/dashboard/admin.css
new file mode 100644
index 0000000..ddd8a43
--- /dev/null
+++ b/dashboard/admin.css
@@ -0,0 +1,585 @@
+/* Extracted from admin.html */
+
+/* Admin-specific variable overrides */
+ :root {
+ --text-secondary: #8888aa;
+ --success: #00d68f;
+ --warning: #ffaa00;
+ }
+
+ /* Layout */
+ .container {
+ display: flex;
+ min-height: calc(100vh - 60px);
+ padding-top: 60px;
+ }
+
+ /* Sidebar */
+ .sidebar {
+ width: 250px;
+ background: var(--bg-secondary);
+ border-right: 1px solid var(--border);
+ padding: 1rem 0;
+ flex-shrink: 0;
+ }
+
+ .sidebar-section {
+ padding: 0.5rem 1rem;
+ margin-bottom: 0.5rem;
+ }
+
+ .sidebar-section h3 {
+ font-size: 0.75rem;
+ text-transform: uppercase;
+ color: var(--text-secondary);
+ margin-bottom: 0.5rem;
+ letter-spacing: 0.05em;
+ }
+
+ .sidebar-item {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ padding: 0.75rem 1rem;
+ color: var(--text-secondary);
+ text-decoration: none;
+ cursor: pointer;
+ transition: all 0.2s;
+ border-left: 3px solid transparent;
+ }
+
+ .sidebar-item:hover {
+ background: var(--bg-tertiary);
+ color: var(--text-primary);
+ }
+
+ .sidebar-item.active {
+ background: var(--bg-tertiary);
+ color: var(--accent);
+ border-left-color: var(--accent);
+ }
+
+ .sidebar-item .icon {
+ width: 20px;
+ text-align: center;
+ }
+
+ /* Main Content */
+ .main-content {
+ flex: 1;
+ padding: 2rem;
+ overflow-x: auto;
+ }
+
+ .page-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 2rem;
+ }
+
+ .page-title {
+ font-size: 1.75rem;
+ font-weight: 600;
+ }
+
+ .page-actions {
+ display: flex;
+ gap: 1rem;
+ }
+
+ /* Buttons */
+ .btn {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.75rem 1.5rem;
+ border: none;
+ border-radius: 8px;
+ font-size: 0.9rem;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s;
+ text-decoration: none;
+ }
+
+ .btn-primary {
+ background: var(--accent);
+ color: white;
+ }
+
+ .btn-primary:hover {
+ background: var(--accent-hover);
+ }
+
+ .btn-secondary {
+ background: var(--bg-tertiary);
+ color: var(--text-primary);
+ border: 1px solid var(--border);
+ }
+
+ .btn-secondary:hover {
+ background: var(--border);
+ }
+
+ .btn-success {
+ background: var(--success);
+ color: white;
+ }
+
+ .btn-danger {
+ background: var(--danger);
+ color: white;
+ }
+
+ .btn-sm {
+ padding: 0.5rem 0.75rem;
+ font-size: 0.8rem;
+ }
+
+ /* Cards */
+ .card {
+ background: var(--bg-secondary);
+ border: 1px solid var(--border);
+ border-radius: 12px;
+ padding: 1.5rem;
+ margin-bottom: 1.5rem;
+ }
+
+ .card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 1rem;
+ padding-bottom: 1rem;
+ border-bottom: 1px solid var(--border);
+ }
+
+ .card-title {
+ font-size: 1.1rem;
+ font-weight: 600;
+ }
+
+ /* Tables */
+ .table-wrapper {
+ overflow-x: auto;
+ }
+
+ table {
+ width: 100%;
+ border-collapse: collapse;
+ }
+
+ th, td {
+ text-align: left;
+ padding: 1rem;
+ border-bottom: 1px solid var(--border);
+ }
+
+ th {
+ font-weight: 600;
+ color: var(--text-secondary);
+ font-size: 0.85rem;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ background: var(--bg-tertiary);
+ }
+
+ tr:hover td {
+ background: rgba(255, 107, 53, 0.05);
+ }
+
+ .actions-cell {
+ display: flex;
+ gap: 0.5rem;
+ }
+
+ /* Forms - admin-specific */
+ select.form-input {
+ cursor: pointer;
+ }
+
+ textarea.form-input {
+ min-height: 100px;
+ resize: vertical;
+ }
+
+ .form-row {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 1rem;
+ }
+
+ /* Modal */
+ .modal-overlay {
+ display: none;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.8);
+ z-index: 1000;
+ justify-content: center;
+ align-items: flex-start;
+ padding: 2rem;
+ overflow-y: auto;
+ }
+
+ .modal-overlay.active {
+ display: flex;
+ }
+
+ .modal {
+ background: var(--bg-secondary);
+ border: 1px solid var(--border);
+ border-radius: 16px;
+ width: 100%;
+ max-width: 600px;
+ margin-top: 2rem;
+ }
+
+ .modal-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 1.5rem;
+ border-bottom: 1px solid var(--border);
+ }
+
+ .modal-title {
+ font-size: 1.25rem;
+ font-weight: 600;
+ }
+
+ .modal-close {
+ background: none;
+ border: none;
+ color: var(--text-secondary);
+ font-size: 1.5rem;
+ cursor: pointer;
+ padding: 0.5rem;
+ line-height: 1;
+ }
+
+ .modal-close:hover {
+ color: var(--text-primary);
+ }
+
+ .modal-body {
+ padding: 1.5rem;
+ }
+
+ .modal-footer {
+ display: flex;
+ justify-content: flex-end;
+ gap: 1rem;
+ padding: 1.5rem;
+ border-top: 1px solid var(--border);
+ }
+
+ /* File Upload */
+ .file-upload {
+ border: 2px dashed var(--border);
+ border-radius: 12px;
+ padding: 2rem;
+ text-align: center;
+ cursor: pointer;
+ transition: all 0.2s;
+ }
+
+ .file-upload:hover {
+ border-color: var(--accent);
+ background: rgba(255, 107, 53, 0.05);
+ }
+
+ .file-upload.dragover {
+ border-color: var(--accent);
+ background: rgba(255, 107, 53, 0.1);
+ }
+
+ .file-upload input {
+ display: none;
+ }
+
+ .file-upload-icon {
+ font-size: 2.5rem;
+ margin-bottom: 1rem;
+ }
+
+ .file-upload-text {
+ color: var(--text-secondary);
+ }
+
+ .file-upload-text strong {
+ color: var(--accent);
+ }
+
+ /* Stats Grid */
+ .stats-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 1.5rem;
+ margin-bottom: 2rem;
+ }
+
+ .stat-card {
+ background: var(--bg-secondary);
+ border: 1px solid var(--border);
+ border-radius: 12px;
+ padding: 1.5rem;
+ }
+
+ .stat-value {
+ font-size: 2rem;
+ font-weight: 700;
+ color: var(--accent);
+ }
+
+ .stat-label {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ margin-top: 0.25rem;
+ }
+
+ /* Badge */
+ .badge {
+ display: inline-block;
+ padding: 0.25rem 0.75rem;
+ border-radius: 20px;
+ font-size: 0.75rem;
+ font-weight: 600;
+ }
+
+ .badge-economy { background: #444; color: #ccc; }
+ .badge-standard { background: #2a5a2a; color: #7fff7f; }
+ .badge-premium { background: #5a5a2a; color: #ffff7f; }
+ .badge-oem { background: #2a2a5a; color: #7f7fff; }
+
+ /* Pagination */
+ .pagination {
+ display: flex;
+ justify-content: center;
+ gap: 0.5rem;
+ margin-top: 1.5rem;
+ }
+
+ .pagination button {
+ padding: 0.5rem 1rem;
+ background: var(--bg-tertiary);
+ border: 1px solid var(--border);
+ border-radius: 6px;
+ color: var(--text-primary);
+ cursor: pointer;
+ }
+
+ .pagination button:hover:not(:disabled) {
+ background: var(--accent);
+ }
+
+ .pagination button:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+
+ .pagination button.active {
+ background: var(--accent);
+ }
+
+ /* Search */
+ .search-box {
+ position: relative;
+ max-width: 300px;
+ }
+
+ .search-box input {
+ width: 100%;
+ padding: 0.75rem 1rem 0.75rem 2.5rem;
+ background: var(--bg-tertiary);
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ color: var(--text-primary);
+ }
+
+ .search-box::before {
+ content: "🔍";
+ position: absolute;
+ left: 0.75rem;
+ top: 50%;
+ transform: translateY(-50%);
+ font-size: 0.9rem;
+ }
+
+ /* Tab navigation */
+ .tab-nav {
+ display: flex;
+ gap: 0.5rem;
+ margin-bottom: 1.5rem;
+ border-bottom: 1px solid var(--border);
+ padding-bottom: 0.5rem;
+ }
+
+ .tab-btn {
+ padding: 0.75rem 1.5rem;
+ background: none;
+ border: none;
+ color: var(--text-secondary);
+ cursor: pointer;
+ border-radius: 8px 8px 0 0;
+ transition: all 0.2s;
+ }
+
+ .tab-btn:hover {
+ color: var(--text-primary);
+ background: var(--bg-tertiary);
+ }
+
+ .tab-btn.active {
+ color: var(--accent);
+ background: var(--bg-tertiary);
+ border-bottom: 2px solid var(--accent);
+ }
+
+ .tab-content {
+ display: none;
+ }
+
+ .tab-content.active {
+ display: block;
+ }
+
+ /* Hidden sections */
+ .admin-section {
+ display: none;
+ }
+
+ .admin-section.active {
+ display: block;
+ }
+
+ /* Loading */
+ .loading {
+ text-align: center;
+ padding: 2rem;
+ color: var(--text-secondary);
+ }
+
+ .spinner {
+ display: inline-block;
+ width: 40px;
+ height: 40px;
+ border: 3px solid var(--border);
+ border-top-color: var(--accent);
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ }
+
+ /* Image Upload */
+ .image-upload-container {
+ display: flex;
+ gap: 1rem;
+ align-items: flex-start;
+ }
+
+ .image-preview {
+ width: 120px;
+ height: 120px;
+ background: var(--bg-tertiary);
+ border: 2px dashed var(--border);
+ border-radius: 8px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ overflow: hidden;
+ flex-shrink: 0;
+ }
+
+ .image-preview img {
+ max-width: 100%;
+ max-height: 100%;
+ object-fit: contain;
+ }
+
+ .image-placeholder {
+ color: var(--text-secondary);
+ font-size: 0.85rem;
+ text-align: center;
+ }
+
+ .image-upload-actions {
+ flex: 1;
+ }
+
+ .image-upload-actions input[type="file"] {
+ display: none;
+ }
+
+ .part-thumbnail {
+ width: 50px;
+ height: 50px;
+ object-fit: contain;
+ border-radius: 4px;
+ background: var(--bg-tertiary);
+ }
+
+ /* Bulk Parts Selector */
+ .bulk-parts-container {
+ max-height: 400px;
+ overflow-y: auto;
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ padding: 1rem;
+ background: var(--bg-tertiary);
+ }
+
+ .bulk-part-item {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ padding: 0.75rem;
+ border-bottom: 1px solid var(--border);
+ cursor: pointer;
+ transition: background 0.2s;
+ }
+
+ .bulk-part-item:last-child {
+ border-bottom: none;
+ }
+
+ .bulk-part-item:hover {
+ background: var(--bg-hover, rgba(255, 107, 53, 0.1));
+ }
+
+ .bulk-part-item.selected {
+ background: rgba(0, 214, 143, 0.15);
+ border-color: var(--success);
+ }
+
+ .bulk-part-item input[type="checkbox"] {
+ width: 18px;
+ height: 18px;
+ accent-color: var(--accent);
+ }
+
+ .bulk-part-info {
+ flex: 1;
+ }
+
+ .bulk-part-number {
+ font-family: monospace;
+ color: var(--accent);
+ font-size: 0.85rem;
+ }
+
+ .bulk-part-name {
+ font-weight: 500;
+ }
+
+ .bulk-part-group {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ }
+
+ .bulk-part-qty {
+ width: 60px;
+ }
diff --git a/dashboard/admin.html b/dashboard/admin.html
index cfb4769..eeab4e1 100644
--- a/dashboard/admin.html
+++ b/dashboard/admin.html
@@ -6,592 +6,7 @@
Admin Panel - Nexus Autoparts
-
+
diff --git a/dashboard/admin.min.css b/dashboard/admin.min.css
new file mode 100644
index 0000000..ddd8a43
--- /dev/null
+++ b/dashboard/admin.min.css
@@ -0,0 +1,585 @@
+/* Extracted from admin.html */
+
+/* Admin-specific variable overrides */
+ :root {
+ --text-secondary: #8888aa;
+ --success: #00d68f;
+ --warning: #ffaa00;
+ }
+
+ /* Layout */
+ .container {
+ display: flex;
+ min-height: calc(100vh - 60px);
+ padding-top: 60px;
+ }
+
+ /* Sidebar */
+ .sidebar {
+ width: 250px;
+ background: var(--bg-secondary);
+ border-right: 1px solid var(--border);
+ padding: 1rem 0;
+ flex-shrink: 0;
+ }
+
+ .sidebar-section {
+ padding: 0.5rem 1rem;
+ margin-bottom: 0.5rem;
+ }
+
+ .sidebar-section h3 {
+ font-size: 0.75rem;
+ text-transform: uppercase;
+ color: var(--text-secondary);
+ margin-bottom: 0.5rem;
+ letter-spacing: 0.05em;
+ }
+
+ .sidebar-item {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ padding: 0.75rem 1rem;
+ color: var(--text-secondary);
+ text-decoration: none;
+ cursor: pointer;
+ transition: all 0.2s;
+ border-left: 3px solid transparent;
+ }
+
+ .sidebar-item:hover {
+ background: var(--bg-tertiary);
+ color: var(--text-primary);
+ }
+
+ .sidebar-item.active {
+ background: var(--bg-tertiary);
+ color: var(--accent);
+ border-left-color: var(--accent);
+ }
+
+ .sidebar-item .icon {
+ width: 20px;
+ text-align: center;
+ }
+
+ /* Main Content */
+ .main-content {
+ flex: 1;
+ padding: 2rem;
+ overflow-x: auto;
+ }
+
+ .page-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 2rem;
+ }
+
+ .page-title {
+ font-size: 1.75rem;
+ font-weight: 600;
+ }
+
+ .page-actions {
+ display: flex;
+ gap: 1rem;
+ }
+
+ /* Buttons */
+ .btn {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.75rem 1.5rem;
+ border: none;
+ border-radius: 8px;
+ font-size: 0.9rem;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s;
+ text-decoration: none;
+ }
+
+ .btn-primary {
+ background: var(--accent);
+ color: white;
+ }
+
+ .btn-primary:hover {
+ background: var(--accent-hover);
+ }
+
+ .btn-secondary {
+ background: var(--bg-tertiary);
+ color: var(--text-primary);
+ border: 1px solid var(--border);
+ }
+
+ .btn-secondary:hover {
+ background: var(--border);
+ }
+
+ .btn-success {
+ background: var(--success);
+ color: white;
+ }
+
+ .btn-danger {
+ background: var(--danger);
+ color: white;
+ }
+
+ .btn-sm {
+ padding: 0.5rem 0.75rem;
+ font-size: 0.8rem;
+ }
+
+ /* Cards */
+ .card {
+ background: var(--bg-secondary);
+ border: 1px solid var(--border);
+ border-radius: 12px;
+ padding: 1.5rem;
+ margin-bottom: 1.5rem;
+ }
+
+ .card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 1rem;
+ padding-bottom: 1rem;
+ border-bottom: 1px solid var(--border);
+ }
+
+ .card-title {
+ font-size: 1.1rem;
+ font-weight: 600;
+ }
+
+ /* Tables */
+ .table-wrapper {
+ overflow-x: auto;
+ }
+
+ table {
+ width: 100%;
+ border-collapse: collapse;
+ }
+
+ th, td {
+ text-align: left;
+ padding: 1rem;
+ border-bottom: 1px solid var(--border);
+ }
+
+ th {
+ font-weight: 600;
+ color: var(--text-secondary);
+ font-size: 0.85rem;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ background: var(--bg-tertiary);
+ }
+
+ tr:hover td {
+ background: rgba(255, 107, 53, 0.05);
+ }
+
+ .actions-cell {
+ display: flex;
+ gap: 0.5rem;
+ }
+
+ /* Forms - admin-specific */
+ select.form-input {
+ cursor: pointer;
+ }
+
+ textarea.form-input {
+ min-height: 100px;
+ resize: vertical;
+ }
+
+ .form-row {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 1rem;
+ }
+
+ /* Modal */
+ .modal-overlay {
+ display: none;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.8);
+ z-index: 1000;
+ justify-content: center;
+ align-items: flex-start;
+ padding: 2rem;
+ overflow-y: auto;
+ }
+
+ .modal-overlay.active {
+ display: flex;
+ }
+
+ .modal {
+ background: var(--bg-secondary);
+ border: 1px solid var(--border);
+ border-radius: 16px;
+ width: 100%;
+ max-width: 600px;
+ margin-top: 2rem;
+ }
+
+ .modal-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 1.5rem;
+ border-bottom: 1px solid var(--border);
+ }
+
+ .modal-title {
+ font-size: 1.25rem;
+ font-weight: 600;
+ }
+
+ .modal-close {
+ background: none;
+ border: none;
+ color: var(--text-secondary);
+ font-size: 1.5rem;
+ cursor: pointer;
+ padding: 0.5rem;
+ line-height: 1;
+ }
+
+ .modal-close:hover {
+ color: var(--text-primary);
+ }
+
+ .modal-body {
+ padding: 1.5rem;
+ }
+
+ .modal-footer {
+ display: flex;
+ justify-content: flex-end;
+ gap: 1rem;
+ padding: 1.5rem;
+ border-top: 1px solid var(--border);
+ }
+
+ /* File Upload */
+ .file-upload {
+ border: 2px dashed var(--border);
+ border-radius: 12px;
+ padding: 2rem;
+ text-align: center;
+ cursor: pointer;
+ transition: all 0.2s;
+ }
+
+ .file-upload:hover {
+ border-color: var(--accent);
+ background: rgba(255, 107, 53, 0.05);
+ }
+
+ .file-upload.dragover {
+ border-color: var(--accent);
+ background: rgba(255, 107, 53, 0.1);
+ }
+
+ .file-upload input {
+ display: none;
+ }
+
+ .file-upload-icon {
+ font-size: 2.5rem;
+ margin-bottom: 1rem;
+ }
+
+ .file-upload-text {
+ color: var(--text-secondary);
+ }
+
+ .file-upload-text strong {
+ color: var(--accent);
+ }
+
+ /* Stats Grid */
+ .stats-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 1.5rem;
+ margin-bottom: 2rem;
+ }
+
+ .stat-card {
+ background: var(--bg-secondary);
+ border: 1px solid var(--border);
+ border-radius: 12px;
+ padding: 1.5rem;
+ }
+
+ .stat-value {
+ font-size: 2rem;
+ font-weight: 700;
+ color: var(--accent);
+ }
+
+ .stat-label {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ margin-top: 0.25rem;
+ }
+
+ /* Badge */
+ .badge {
+ display: inline-block;
+ padding: 0.25rem 0.75rem;
+ border-radius: 20px;
+ font-size: 0.75rem;
+ font-weight: 600;
+ }
+
+ .badge-economy { background: #444; color: #ccc; }
+ .badge-standard { background: #2a5a2a; color: #7fff7f; }
+ .badge-premium { background: #5a5a2a; color: #ffff7f; }
+ .badge-oem { background: #2a2a5a; color: #7f7fff; }
+
+ /* Pagination */
+ .pagination {
+ display: flex;
+ justify-content: center;
+ gap: 0.5rem;
+ margin-top: 1.5rem;
+ }
+
+ .pagination button {
+ padding: 0.5rem 1rem;
+ background: var(--bg-tertiary);
+ border: 1px solid var(--border);
+ border-radius: 6px;
+ color: var(--text-primary);
+ cursor: pointer;
+ }
+
+ .pagination button:hover:not(:disabled) {
+ background: var(--accent);
+ }
+
+ .pagination button:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+
+ .pagination button.active {
+ background: var(--accent);
+ }
+
+ /* Search */
+ .search-box {
+ position: relative;
+ max-width: 300px;
+ }
+
+ .search-box input {
+ width: 100%;
+ padding: 0.75rem 1rem 0.75rem 2.5rem;
+ background: var(--bg-tertiary);
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ color: var(--text-primary);
+ }
+
+ .search-box::before {
+ content: "🔍";
+ position: absolute;
+ left: 0.75rem;
+ top: 50%;
+ transform: translateY(-50%);
+ font-size: 0.9rem;
+ }
+
+ /* Tab navigation */
+ .tab-nav {
+ display: flex;
+ gap: 0.5rem;
+ margin-bottom: 1.5rem;
+ border-bottom: 1px solid var(--border);
+ padding-bottom: 0.5rem;
+ }
+
+ .tab-btn {
+ padding: 0.75rem 1.5rem;
+ background: none;
+ border: none;
+ color: var(--text-secondary);
+ cursor: pointer;
+ border-radius: 8px 8px 0 0;
+ transition: all 0.2s;
+ }
+
+ .tab-btn:hover {
+ color: var(--text-primary);
+ background: var(--bg-tertiary);
+ }
+
+ .tab-btn.active {
+ color: var(--accent);
+ background: var(--bg-tertiary);
+ border-bottom: 2px solid var(--accent);
+ }
+
+ .tab-content {
+ display: none;
+ }
+
+ .tab-content.active {
+ display: block;
+ }
+
+ /* Hidden sections */
+ .admin-section {
+ display: none;
+ }
+
+ .admin-section.active {
+ display: block;
+ }
+
+ /* Loading */
+ .loading {
+ text-align: center;
+ padding: 2rem;
+ color: var(--text-secondary);
+ }
+
+ .spinner {
+ display: inline-block;
+ width: 40px;
+ height: 40px;
+ border: 3px solid var(--border);
+ border-top-color: var(--accent);
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ }
+
+ /* Image Upload */
+ .image-upload-container {
+ display: flex;
+ gap: 1rem;
+ align-items: flex-start;
+ }
+
+ .image-preview {
+ width: 120px;
+ height: 120px;
+ background: var(--bg-tertiary);
+ border: 2px dashed var(--border);
+ border-radius: 8px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ overflow: hidden;
+ flex-shrink: 0;
+ }
+
+ .image-preview img {
+ max-width: 100%;
+ max-height: 100%;
+ object-fit: contain;
+ }
+
+ .image-placeholder {
+ color: var(--text-secondary);
+ font-size: 0.85rem;
+ text-align: center;
+ }
+
+ .image-upload-actions {
+ flex: 1;
+ }
+
+ .image-upload-actions input[type="file"] {
+ display: none;
+ }
+
+ .part-thumbnail {
+ width: 50px;
+ height: 50px;
+ object-fit: contain;
+ border-radius: 4px;
+ background: var(--bg-tertiary);
+ }
+
+ /* Bulk Parts Selector */
+ .bulk-parts-container {
+ max-height: 400px;
+ overflow-y: auto;
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ padding: 1rem;
+ background: var(--bg-tertiary);
+ }
+
+ .bulk-part-item {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ padding: 0.75rem;
+ border-bottom: 1px solid var(--border);
+ cursor: pointer;
+ transition: background 0.2s;
+ }
+
+ .bulk-part-item:last-child {
+ border-bottom: none;
+ }
+
+ .bulk-part-item:hover {
+ background: var(--bg-hover, rgba(255, 107, 53, 0.1));
+ }
+
+ .bulk-part-item.selected {
+ background: rgba(0, 214, 143, 0.15);
+ border-color: var(--success);
+ }
+
+ .bulk-part-item input[type="checkbox"] {
+ width: 18px;
+ height: 18px;
+ accent-color: var(--accent);
+ }
+
+ .bulk-part-info {
+ flex: 1;
+ }
+
+ .bulk-part-number {
+ font-family: monospace;
+ color: var(--accent);
+ font-size: 0.85rem;
+ }
+
+ .bulk-part-name {
+ font-weight: 500;
+ }
+
+ .bulk-part-group {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ }
+
+ .bulk-part-qty {
+ width: 60px;
+ }
diff --git a/dashboard/catalog-public.css b/dashboard/catalog-public.css
new file mode 100644
index 0000000..0f13c41
--- /dev/null
+++ b/dashboard/catalog-public.css
@@ -0,0 +1,537 @@
+/* Extracted from catalog-public.html */
+
+/* ── Reset ── */
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
+ html { scroll-behavior: smooth; scrollbar-width: none; }
+ html::-webkit-scrollbar { width: 0; }
+
+ body {
+ font-family: var(--font-body);
+ background: var(--color-bg-base);
+ color: var(--color-text-primary);
+ line-height: var(--leading-body);
+ min-height: 100vh;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ overflow-x: hidden;
+ }
+ a { color: var(--color-text-accent); text-decoration: none; }
+ a:hover { text-decoration: underline; }
+
+ /* ==========================================================================
+ HEADER — Glassmorphism sticky (matches landing)
+ ========================================================================== */
+
+ .site-header {
+ position: sticky; top: 0;
+ z-index: var(--z-sticky);
+ background: var(--glass-bg);
+ backdrop-filter: blur(var(--glass-blur));
+ -webkit-backdrop-filter: blur(var(--glass-blur));
+ border-bottom: 1px solid var(--glass-border);
+ }
+ .site-header .inner {
+ max-width: var(--content-xl); margin: 0 auto;
+ padding: 0 var(--space-6);
+ display: flex; align-items: center; justify-content: space-between;
+ height: 56px;
+ }
+ .logo {
+ font-family: var(--font-heading); font-size: var(--text-h5);
+ font-weight: var(--heading-weight-primary);
+ color: var(--color-text-accent);
+ text-transform: uppercase; letter-spacing: var(--tracking-wide);
+ text-decoration: none;
+ position: relative;
+ }
+ .logo::after {
+ content: '';
+ position: absolute;
+ bottom: -3px; left: 0; right: 0;
+ height: 2px;
+ background: var(--gradient-accent);
+ border-radius: 1px;
+ opacity: 0.5;
+ filter: blur(1px);
+ }
+ .header-right { display: flex; gap: var(--space-3); align-items: center; }
+
+ /* ── Catalog mode toggle (OEM / Local) ── */
+ .mode-toggle {
+ display: inline-flex;
+ padding: 3px;
+ background: var(--glass-bg);
+ backdrop-filter: blur(8px);
+ -webkit-backdrop-filter: blur(8px);
+ border: 1px dashed var(--glass-border);
+ border-radius: var(--radius-md);
+ gap: 2px;
+ }
+ .mode-toggle button {
+ background: transparent;
+ border: none;
+ color: var(--color-text-muted);
+ padding: 4px 12px;
+ border-radius: calc(var(--radius-md) - 3px);
+ font-family: var(--font-mono);
+ font-size: var(--text-caption);
+ font-weight: var(--font-weight-semibold);
+ text-transform: uppercase;
+ letter-spacing: var(--tracking-wider);
+ cursor: pointer;
+ transition: all 0.2s var(--ease-out);
+ }
+ .mode-toggle button:hover {
+ color: var(--color-text-accent);
+ }
+ .mode-toggle button.is-active {
+ background: var(--color-primary-muted);
+ color: var(--color-text-accent);
+ box-shadow: 0 0 12px var(--glow-color-soft);
+ }
+
+ .theme-toggle {
+ width: 36px; height: 36px;
+ display: flex; align-items: center; justify-content: center;
+ background: transparent;
+ border: 1px dashed var(--glass-border);
+ border-radius: var(--radius-md);
+ color: var(--color-text-muted);
+ cursor: pointer; font-size: 1rem;
+ transition: var(--transition-fast);
+ }
+ .theme-toggle:hover {
+ border-color: var(--color-border-accent);
+ color: var(--color-text-accent);
+ box-shadow: 0 0 12px var(--glow-color-soft);
+ }
+ .header-back {
+ font-size: var(--text-body-sm);
+ color: var(--color-text-secondary);
+ text-decoration: none;
+ transition: color 0.2s;
+ }
+ .header-back:hover { color: var(--color-text-accent); text-decoration: none; }
+
+ /* ==========================================================================
+ SEARCH BAR — Glass style
+ ========================================================================== */
+
+ .search-bar {
+ max-width: var(--content-xl); margin: 0 auto;
+ padding: var(--space-4) var(--space-6);
+ }
+ .search-wrapper {
+ display: flex; gap: var(--space-2);
+ }
+ .search-wrapper input {
+ flex: 1;
+ padding: var(--space-3) var(--space-4);
+ background: var(--glass-bg);
+ backdrop-filter: blur(8px);
+ -webkit-backdrop-filter: blur(8px);
+ border: 1px solid var(--glass-border);
+ border-radius: var(--radius-md);
+ color: var(--color-text-primary);
+ font-family: var(--font-body);
+ font-size: var(--text-body);
+ outline: none;
+ transition: all 0.25s var(--ease-out);
+ }
+ .search-wrapper input:focus {
+ border-color: var(--color-border-focus);
+ box-shadow: 0 0 0 3px var(--glow-color-soft), 0 0 20px var(--glow-color-soft);
+ }
+ .search-wrapper input::placeholder { color: var(--color-text-muted); }
+
+ /* 3D search button */
+ .search-wrapper button {
+ padding: var(--space-3) var(--space-5);
+ background: var(--gradient-accent);
+ color: var(--btn-primary-text);
+ border: none; border-radius: var(--radius-md);
+ font-family: var(--font-body); font-size: var(--text-body);
+ font-weight: var(--font-weight-semibold); cursor: pointer;
+ transition: all 0.25s var(--ease-out);
+ box-shadow: 0 3px 0 var(--color-primary-active),
+ 0 4px 10px var(--glow-color-soft);
+ position: relative;
+ overflow: hidden;
+ }
+ .search-wrapper button:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 0 var(--color-primary-active),
+ 0 8px 20px var(--glow-color);
+ }
+ .search-wrapper button:active {
+ transform: translateY(1px);
+ box-shadow: 0 1px 0 var(--color-primary-active);
+ }
+ /* Shimmer */
+ .search-wrapper button::after {
+ content: '';
+ position: absolute;
+ top: 0; left: -100%; width: 60%; height: 100%;
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
+ transition: left 0.5s ease;
+ }
+ .search-wrapper button:hover::after { left: 120%; }
+
+ /* ==========================================================================
+ REGION BAR — Glass pills
+ ========================================================================== */
+
+ .region-bar {
+ background: var(--glass-bg);
+ backdrop-filter: blur(8px);
+ -webkit-backdrop-filter: blur(8px);
+ border-bottom: 1px solid var(--glass-border);
+ padding: var(--space-2) 0;
+ }
+ .region-inner {
+ max-width: var(--content-xl); margin: 0 auto;
+ padding: 0 var(--space-6);
+ display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap;
+ }
+ .region-label {
+ font-size: var(--text-caption); font-weight: var(--font-weight-semibold);
+ color: var(--color-text-muted); text-transform: uppercase;
+ letter-spacing: var(--tracking-widest); margin-right: var(--space-2);
+ font-family: var(--font-mono);
+ }
+ .region-btn {
+ background: transparent;
+ border: 1px dashed var(--glass-border);
+ color: var(--color-text-muted);
+ padding: var(--space-1) var(--space-3);
+ border-radius: var(--radius-md); cursor: pointer;
+ font-size: var(--text-caption);
+ font-family: var(--font-body);
+ transition: all 0.25s ease;
+ }
+ .region-btn:hover {
+ border-color: var(--color-border-accent);
+ color: var(--color-text-accent);
+ box-shadow: 0 0 12px var(--glow-color-soft);
+ }
+ .region-btn.is-active {
+ background: var(--color-primary-muted);
+ color: var(--color-text-accent);
+ border-color: var(--color-border-accent);
+ border-style: solid;
+ font-weight: var(--font-weight-semibold);
+ box-shadow: 0 0 16px var(--glow-color-soft);
+ }
+
+ /* ==========================================================================
+ BREADCRUMB
+ ========================================================================== */
+
+ .breadcrumb {
+ max-width: var(--content-xl); margin: 0 auto;
+ padding: var(--space-2) var(--space-6);
+ display: flex; flex-wrap: wrap; gap: var(--space-1);
+ font-size: var(--text-body-sm);
+ color: var(--color-text-muted);
+ font-family: var(--font-mono);
+ }
+ .breadcrumb a { color: var(--color-text-accent); }
+ .breadcrumb .sep { margin: 0 var(--space-1); color: var(--color-text-muted); opacity: 0.4; }
+
+ /* ==========================================================================
+ MAIN CONTENT
+ ========================================================================== */
+
+ .main {
+ max-width: var(--content-xl); margin: 0 auto;
+ padding: var(--space-4) var(--space-6) var(--space-16);
+ }
+ .main h2 {
+ font-family: var(--font-heading); font-size: var(--text-h3);
+ font-weight: var(--heading-weight-primary);
+ margin-bottom: var(--space-6);
+ letter-spacing: var(--heading-tracking-h3);
+ }
+
+ /* ==========================================================================
+ NAV GRID — Glass cards for brands/models/years/engines/categories/groups
+ ========================================================================== */
+
+ .nav-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
+ gap: var(--space-3);
+ }
+ .nav-card {
+ background: var(--glass-bg);
+ backdrop-filter: blur(var(--glass-blur));
+ -webkit-backdrop-filter: blur(var(--glass-blur));
+ border: 1px solid var(--glass-border);
+ border-radius: var(--radius-md);
+ padding: var(--space-4) var(--space-5);
+ cursor: pointer;
+ transition: all 0.3s var(--ease-out);
+ display: flex; align-items: center; justify-content: space-between;
+ position: relative;
+ overflow: hidden;
+ }
+ /* Top accent line on hover */
+ .nav-card::before {
+ content: '';
+ position: absolute;
+ top: 0; left: 0; right: 0;
+ height: 2px;
+ background: var(--gradient-accent);
+ transform: scaleX(0);
+ transform-origin: left;
+ transition: transform 0.3s var(--ease-out);
+ }
+ .nav-card:hover::before { transform: scaleX(1); }
+ .nav-card:hover {
+ border-color: var(--color-border-accent);
+ box-shadow: 0 4px 20px var(--glow-color-soft);
+ transform: translateY(-2px);
+ }
+ .nav-card .name {
+ font-weight: var(--font-weight-semibold);
+ font-size: var(--text-body);
+ }
+ .nav-card .count {
+ font-size: var(--text-caption);
+ color: var(--color-text-muted);
+ font-family: var(--font-mono);
+ }
+
+ /* ==========================================================================
+ PARTS LIST — Glass rows with glow
+ ========================================================================== */
+
+ .parts-list { display: flex; flex-direction: column; gap: var(--space-3); }
+ .part-row {
+ background: var(--glass-bg);
+ backdrop-filter: blur(var(--glass-blur));
+ -webkit-backdrop-filter: blur(var(--glass-blur));
+ border: 1px solid var(--glass-border);
+ border-radius: var(--radius-md);
+ padding: var(--space-4) var(--space-5);
+ display: grid;
+ grid-template-columns: 1fr auto;
+ gap: var(--space-3);
+ transition: all 0.3s var(--ease-out);
+ }
+ .part-row:hover {
+ border-color: var(--color-border-accent);
+ box-shadow: 0 4px 20px var(--glow-color-soft);
+ }
+
+ /* Local-mode priority highlights */
+ .part-row--tier1 {
+ border-color: var(--color-border-accent);
+ box-shadow: 0 0 16px var(--glow-color-soft);
+ }
+ .part-manu {
+ display: inline-flex; align-items: center; gap: 6px;
+ padding: 3px 10px; margin-bottom: var(--space-2);
+ background: var(--color-primary-muted);
+ border: 1px solid var(--glass-border);
+ border-radius: var(--radius-sm);
+ font-size: var(--text-caption);
+ font-weight: var(--font-weight-bold);
+ text-transform: uppercase;
+ letter-spacing: var(--tracking-wider);
+ color: var(--color-text-accent);
+ font-family: var(--font-mono);
+ }
+ .part-row--tier2 .part-manu {
+ background: var(--color-surface-2);
+ color: var(--color-text-secondary);
+ }
+ .part-manu .manu-tier { color: var(--color-primary); font-size: 13px; }
+ .part-oem-sub { color: var(--color-text-muted); font-weight: var(--font-weight-regular); font-size: var(--text-caption); }
+
+ .part-stock {
+ display: inline-block;
+ margin-top: var(--space-2);
+ padding: 2px 10px;
+ border-radius: var(--radius-full);
+ font-size: var(--text-caption);
+ font-weight: var(--font-weight-semibold);
+ }
+ .part-stock--yes { background: rgba(63,185,80,0.15); color: #3FB950; border: 1px solid rgba(63,185,80,0.3); }
+ .part-stock--no { background: var(--color-surface-2); color: var(--color-text-muted); border: 1px dashed var(--glass-border); }
+ .part-name {
+ font-weight: var(--font-weight-semibold);
+ font-size: var(--text-body);
+ }
+ .part-oem {
+ font-family: var(--font-mono);
+ font-size: var(--text-body-sm);
+ color: var(--color-text-accent);
+ }
+ .part-desc {
+ font-size: var(--text-body-sm);
+ color: var(--color-text-secondary);
+ margin-top: var(--space-1);
+ }
+ .part-alts {
+ font-size: var(--text-caption);
+ color: var(--color-text-muted);
+ margin-top: var(--space-2);
+ }
+ .part-alts span {
+ display: inline-block;
+ background: var(--color-primary-muted);
+ padding: 2px var(--space-2);
+ border-radius: var(--radius-sm);
+ margin-right: var(--space-1);
+ margin-bottom: var(--space-1);
+ font-family: var(--font-mono);
+ border: 1px dashed var(--glass-border);
+ }
+ .part-img {
+ width: 80px; height: 80px;
+ object-fit: contain;
+ border-radius: var(--radius-sm);
+ background: var(--glass-bg);
+ border: 1px solid var(--glass-border);
+ }
+ .part-detail-btn {
+ font-size: var(--text-caption);
+ color: var(--color-text-accent);
+ cursor: pointer;
+ border: none; background: none; font-family: var(--font-body);
+ padding: var(--space-1) 0;
+ transition: color 0.2s;
+ }
+ .part-detail-btn:hover { text-decoration: underline; }
+
+ /* ==========================================================================
+ PAGINATION — Glass buttons
+ ========================================================================== */
+
+ .pagination {
+ display: flex; justify-content: center; gap: var(--space-2);
+ margin-top: var(--space-6);
+ }
+ .pagination button {
+ padding: var(--space-2) var(--space-4);
+ background: var(--glass-bg);
+ backdrop-filter: blur(8px);
+ border: 1px solid var(--glass-border);
+ border-radius: var(--radius-md);
+ color: var(--color-text-primary);
+ cursor: pointer; font-family: var(--font-body);
+ transition: all 0.25s ease;
+ }
+ .pagination button:hover {
+ border-color: var(--color-border-accent);
+ box-shadow: 0 0 12px var(--glow-color-soft);
+ }
+ .pagination button.active {
+ background: var(--gradient-accent);
+ color: var(--btn-primary-text);
+ border-color: transparent;
+ box-shadow: 0 3px 0 var(--color-primary-active),
+ 0 4px 12px var(--glow-color-soft);
+ }
+ .pagination button:disabled { opacity: .4; cursor: default; }
+
+ /* ==========================================================================
+ SEARCH RESULTS
+ ========================================================================== */
+
+ .search-results { display: flex; flex-direction: column; gap: var(--space-3); }
+
+ /* ==========================================================================
+ PART DETAIL MODAL — Glass overlay
+ ========================================================================== */
+
+ .modal-overlay {
+ display: none;
+ position: fixed; inset: 0;
+ background: var(--overlay-backdrop);
+ z-index: var(--z-modal);
+ justify-content: center; align-items: flex-start;
+ padding: var(--space-10) var(--space-4);
+ overflow-y: auto;
+ backdrop-filter: blur(4px);
+ -webkit-backdrop-filter: blur(4px);
+ }
+ .modal-overlay.open { display: flex; }
+ .modal-content {
+ background: var(--glass-bg-strong);
+ backdrop-filter: blur(24px);
+ -webkit-backdrop-filter: blur(24px);
+ border: 1px solid var(--glass-border);
+ border-radius: var(--radius-lg);
+ max-width: 700px; width: 100%;
+ padding: var(--space-8);
+ position: relative;
+ box-shadow: 0 24px 48px rgba(0,0,0,0.3);
+ }
+ .modal-close {
+ position: absolute; top: var(--space-3); right: var(--space-3);
+ background: none; border: none; color: var(--color-text-muted);
+ font-size: 1.5rem; cursor: pointer; line-height: 1;
+ transition: color 0.2s;
+ }
+ .modal-close:hover { color: var(--color-text-accent); }
+ .detail-section { margin-top: var(--space-6); }
+ .detail-section h4 {
+ font-family: var(--font-heading);
+ font-size: var(--text-h6);
+ font-weight: var(--heading-weight-secondary);
+ margin-bottom: var(--space-3);
+ color: var(--color-text-accent);
+ }
+ .alt-table {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: var(--text-body-sm);
+ }
+ .alt-table th, .alt-table td {
+ padding: var(--space-2) var(--space-3);
+ text-align: left;
+ border-bottom: 1px solid var(--glass-border);
+ }
+ .alt-table th {
+ color: var(--color-text-muted);
+ font-weight: var(--font-weight-semibold);
+ text-transform: uppercase;
+ font-size: var(--text-caption);
+ letter-spacing: var(--tracking-widest);
+ font-family: var(--font-mono);
+ }
+
+ /* ==========================================================================
+ LOADING / EMPTY
+ ========================================================================== */
+
+ .loading {
+ text-align: center; padding: var(--space-10);
+ color: var(--color-text-muted);
+ font-size: var(--text-body);
+ }
+ .empty {
+ text-align: center; padding: var(--space-10);
+ color: var(--color-text-muted);
+ }
+
+ /* ==========================================================================
+ FOOTER
+ ========================================================================== */
+
+ .site-footer {
+ padding: var(--space-4) 0; text-align: center;
+ border-top: 1px solid var(--color-border);
+ font-size: var(--text-caption); color: var(--color-text-muted);
+ }
+
+ /* ==========================================================================
+ RESPONSIVE
+ ========================================================================== */
+
+ @media (max-width: 640px) {
+ .nav-grid { grid-template-columns: 1fr; }
+ .part-row { grid-template-columns: 1fr; }
+ }
diff --git a/dashboard/catalog-public.html b/dashboard/catalog-public.html
index 19336b3..64a320f 100644
--- a/dashboard/catalog-public.html
+++ b/dashboard/catalog-public.html
@@ -11,543 +11,7 @@
})();
-
+
diff --git a/dashboard/catalog-public.min.css b/dashboard/catalog-public.min.css
new file mode 100644
index 0000000..0f13c41
--- /dev/null
+++ b/dashboard/catalog-public.min.css
@@ -0,0 +1,537 @@
+/* Extracted from catalog-public.html */
+
+/* ── Reset ── */
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
+ html { scroll-behavior: smooth; scrollbar-width: none; }
+ html::-webkit-scrollbar { width: 0; }
+
+ body {
+ font-family: var(--font-body);
+ background: var(--color-bg-base);
+ color: var(--color-text-primary);
+ line-height: var(--leading-body);
+ min-height: 100vh;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ overflow-x: hidden;
+ }
+ a { color: var(--color-text-accent); text-decoration: none; }
+ a:hover { text-decoration: underline; }
+
+ /* ==========================================================================
+ HEADER — Glassmorphism sticky (matches landing)
+ ========================================================================== */
+
+ .site-header {
+ position: sticky; top: 0;
+ z-index: var(--z-sticky);
+ background: var(--glass-bg);
+ backdrop-filter: blur(var(--glass-blur));
+ -webkit-backdrop-filter: blur(var(--glass-blur));
+ border-bottom: 1px solid var(--glass-border);
+ }
+ .site-header .inner {
+ max-width: var(--content-xl); margin: 0 auto;
+ padding: 0 var(--space-6);
+ display: flex; align-items: center; justify-content: space-between;
+ height: 56px;
+ }
+ .logo {
+ font-family: var(--font-heading); font-size: var(--text-h5);
+ font-weight: var(--heading-weight-primary);
+ color: var(--color-text-accent);
+ text-transform: uppercase; letter-spacing: var(--tracking-wide);
+ text-decoration: none;
+ position: relative;
+ }
+ .logo::after {
+ content: '';
+ position: absolute;
+ bottom: -3px; left: 0; right: 0;
+ height: 2px;
+ background: var(--gradient-accent);
+ border-radius: 1px;
+ opacity: 0.5;
+ filter: blur(1px);
+ }
+ .header-right { display: flex; gap: var(--space-3); align-items: center; }
+
+ /* ── Catalog mode toggle (OEM / Local) ── */
+ .mode-toggle {
+ display: inline-flex;
+ padding: 3px;
+ background: var(--glass-bg);
+ backdrop-filter: blur(8px);
+ -webkit-backdrop-filter: blur(8px);
+ border: 1px dashed var(--glass-border);
+ border-radius: var(--radius-md);
+ gap: 2px;
+ }
+ .mode-toggle button {
+ background: transparent;
+ border: none;
+ color: var(--color-text-muted);
+ padding: 4px 12px;
+ border-radius: calc(var(--radius-md) - 3px);
+ font-family: var(--font-mono);
+ font-size: var(--text-caption);
+ font-weight: var(--font-weight-semibold);
+ text-transform: uppercase;
+ letter-spacing: var(--tracking-wider);
+ cursor: pointer;
+ transition: all 0.2s var(--ease-out);
+ }
+ .mode-toggle button:hover {
+ color: var(--color-text-accent);
+ }
+ .mode-toggle button.is-active {
+ background: var(--color-primary-muted);
+ color: var(--color-text-accent);
+ box-shadow: 0 0 12px var(--glow-color-soft);
+ }
+
+ .theme-toggle {
+ width: 36px; height: 36px;
+ display: flex; align-items: center; justify-content: center;
+ background: transparent;
+ border: 1px dashed var(--glass-border);
+ border-radius: var(--radius-md);
+ color: var(--color-text-muted);
+ cursor: pointer; font-size: 1rem;
+ transition: var(--transition-fast);
+ }
+ .theme-toggle:hover {
+ border-color: var(--color-border-accent);
+ color: var(--color-text-accent);
+ box-shadow: 0 0 12px var(--glow-color-soft);
+ }
+ .header-back {
+ font-size: var(--text-body-sm);
+ color: var(--color-text-secondary);
+ text-decoration: none;
+ transition: color 0.2s;
+ }
+ .header-back:hover { color: var(--color-text-accent); text-decoration: none; }
+
+ /* ==========================================================================
+ SEARCH BAR — Glass style
+ ========================================================================== */
+
+ .search-bar {
+ max-width: var(--content-xl); margin: 0 auto;
+ padding: var(--space-4) var(--space-6);
+ }
+ .search-wrapper {
+ display: flex; gap: var(--space-2);
+ }
+ .search-wrapper input {
+ flex: 1;
+ padding: var(--space-3) var(--space-4);
+ background: var(--glass-bg);
+ backdrop-filter: blur(8px);
+ -webkit-backdrop-filter: blur(8px);
+ border: 1px solid var(--glass-border);
+ border-radius: var(--radius-md);
+ color: var(--color-text-primary);
+ font-family: var(--font-body);
+ font-size: var(--text-body);
+ outline: none;
+ transition: all 0.25s var(--ease-out);
+ }
+ .search-wrapper input:focus {
+ border-color: var(--color-border-focus);
+ box-shadow: 0 0 0 3px var(--glow-color-soft), 0 0 20px var(--glow-color-soft);
+ }
+ .search-wrapper input::placeholder { color: var(--color-text-muted); }
+
+ /* 3D search button */
+ .search-wrapper button {
+ padding: var(--space-3) var(--space-5);
+ background: var(--gradient-accent);
+ color: var(--btn-primary-text);
+ border: none; border-radius: var(--radius-md);
+ font-family: var(--font-body); font-size: var(--text-body);
+ font-weight: var(--font-weight-semibold); cursor: pointer;
+ transition: all 0.25s var(--ease-out);
+ box-shadow: 0 3px 0 var(--color-primary-active),
+ 0 4px 10px var(--glow-color-soft);
+ position: relative;
+ overflow: hidden;
+ }
+ .search-wrapper button:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 0 var(--color-primary-active),
+ 0 8px 20px var(--glow-color);
+ }
+ .search-wrapper button:active {
+ transform: translateY(1px);
+ box-shadow: 0 1px 0 var(--color-primary-active);
+ }
+ /* Shimmer */
+ .search-wrapper button::after {
+ content: '';
+ position: absolute;
+ top: 0; left: -100%; width: 60%; height: 100%;
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
+ transition: left 0.5s ease;
+ }
+ .search-wrapper button:hover::after { left: 120%; }
+
+ /* ==========================================================================
+ REGION BAR — Glass pills
+ ========================================================================== */
+
+ .region-bar {
+ background: var(--glass-bg);
+ backdrop-filter: blur(8px);
+ -webkit-backdrop-filter: blur(8px);
+ border-bottom: 1px solid var(--glass-border);
+ padding: var(--space-2) 0;
+ }
+ .region-inner {
+ max-width: var(--content-xl); margin: 0 auto;
+ padding: 0 var(--space-6);
+ display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap;
+ }
+ .region-label {
+ font-size: var(--text-caption); font-weight: var(--font-weight-semibold);
+ color: var(--color-text-muted); text-transform: uppercase;
+ letter-spacing: var(--tracking-widest); margin-right: var(--space-2);
+ font-family: var(--font-mono);
+ }
+ .region-btn {
+ background: transparent;
+ border: 1px dashed var(--glass-border);
+ color: var(--color-text-muted);
+ padding: var(--space-1) var(--space-3);
+ border-radius: var(--radius-md); cursor: pointer;
+ font-size: var(--text-caption);
+ font-family: var(--font-body);
+ transition: all 0.25s ease;
+ }
+ .region-btn:hover {
+ border-color: var(--color-border-accent);
+ color: var(--color-text-accent);
+ box-shadow: 0 0 12px var(--glow-color-soft);
+ }
+ .region-btn.is-active {
+ background: var(--color-primary-muted);
+ color: var(--color-text-accent);
+ border-color: var(--color-border-accent);
+ border-style: solid;
+ font-weight: var(--font-weight-semibold);
+ box-shadow: 0 0 16px var(--glow-color-soft);
+ }
+
+ /* ==========================================================================
+ BREADCRUMB
+ ========================================================================== */
+
+ .breadcrumb {
+ max-width: var(--content-xl); margin: 0 auto;
+ padding: var(--space-2) var(--space-6);
+ display: flex; flex-wrap: wrap; gap: var(--space-1);
+ font-size: var(--text-body-sm);
+ color: var(--color-text-muted);
+ font-family: var(--font-mono);
+ }
+ .breadcrumb a { color: var(--color-text-accent); }
+ .breadcrumb .sep { margin: 0 var(--space-1); color: var(--color-text-muted); opacity: 0.4; }
+
+ /* ==========================================================================
+ MAIN CONTENT
+ ========================================================================== */
+
+ .main {
+ max-width: var(--content-xl); margin: 0 auto;
+ padding: var(--space-4) var(--space-6) var(--space-16);
+ }
+ .main h2 {
+ font-family: var(--font-heading); font-size: var(--text-h3);
+ font-weight: var(--heading-weight-primary);
+ margin-bottom: var(--space-6);
+ letter-spacing: var(--heading-tracking-h3);
+ }
+
+ /* ==========================================================================
+ NAV GRID — Glass cards for brands/models/years/engines/categories/groups
+ ========================================================================== */
+
+ .nav-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
+ gap: var(--space-3);
+ }
+ .nav-card {
+ background: var(--glass-bg);
+ backdrop-filter: blur(var(--glass-blur));
+ -webkit-backdrop-filter: blur(var(--glass-blur));
+ border: 1px solid var(--glass-border);
+ border-radius: var(--radius-md);
+ padding: var(--space-4) var(--space-5);
+ cursor: pointer;
+ transition: all 0.3s var(--ease-out);
+ display: flex; align-items: center; justify-content: space-between;
+ position: relative;
+ overflow: hidden;
+ }
+ /* Top accent line on hover */
+ .nav-card::before {
+ content: '';
+ position: absolute;
+ top: 0; left: 0; right: 0;
+ height: 2px;
+ background: var(--gradient-accent);
+ transform: scaleX(0);
+ transform-origin: left;
+ transition: transform 0.3s var(--ease-out);
+ }
+ .nav-card:hover::before { transform: scaleX(1); }
+ .nav-card:hover {
+ border-color: var(--color-border-accent);
+ box-shadow: 0 4px 20px var(--glow-color-soft);
+ transform: translateY(-2px);
+ }
+ .nav-card .name {
+ font-weight: var(--font-weight-semibold);
+ font-size: var(--text-body);
+ }
+ .nav-card .count {
+ font-size: var(--text-caption);
+ color: var(--color-text-muted);
+ font-family: var(--font-mono);
+ }
+
+ /* ==========================================================================
+ PARTS LIST — Glass rows with glow
+ ========================================================================== */
+
+ .parts-list { display: flex; flex-direction: column; gap: var(--space-3); }
+ .part-row {
+ background: var(--glass-bg);
+ backdrop-filter: blur(var(--glass-blur));
+ -webkit-backdrop-filter: blur(var(--glass-blur));
+ border: 1px solid var(--glass-border);
+ border-radius: var(--radius-md);
+ padding: var(--space-4) var(--space-5);
+ display: grid;
+ grid-template-columns: 1fr auto;
+ gap: var(--space-3);
+ transition: all 0.3s var(--ease-out);
+ }
+ .part-row:hover {
+ border-color: var(--color-border-accent);
+ box-shadow: 0 4px 20px var(--glow-color-soft);
+ }
+
+ /* Local-mode priority highlights */
+ .part-row--tier1 {
+ border-color: var(--color-border-accent);
+ box-shadow: 0 0 16px var(--glow-color-soft);
+ }
+ .part-manu {
+ display: inline-flex; align-items: center; gap: 6px;
+ padding: 3px 10px; margin-bottom: var(--space-2);
+ background: var(--color-primary-muted);
+ border: 1px solid var(--glass-border);
+ border-radius: var(--radius-sm);
+ font-size: var(--text-caption);
+ font-weight: var(--font-weight-bold);
+ text-transform: uppercase;
+ letter-spacing: var(--tracking-wider);
+ color: var(--color-text-accent);
+ font-family: var(--font-mono);
+ }
+ .part-row--tier2 .part-manu {
+ background: var(--color-surface-2);
+ color: var(--color-text-secondary);
+ }
+ .part-manu .manu-tier { color: var(--color-primary); font-size: 13px; }
+ .part-oem-sub { color: var(--color-text-muted); font-weight: var(--font-weight-regular); font-size: var(--text-caption); }
+
+ .part-stock {
+ display: inline-block;
+ margin-top: var(--space-2);
+ padding: 2px 10px;
+ border-radius: var(--radius-full);
+ font-size: var(--text-caption);
+ font-weight: var(--font-weight-semibold);
+ }
+ .part-stock--yes { background: rgba(63,185,80,0.15); color: #3FB950; border: 1px solid rgba(63,185,80,0.3); }
+ .part-stock--no { background: var(--color-surface-2); color: var(--color-text-muted); border: 1px dashed var(--glass-border); }
+ .part-name {
+ font-weight: var(--font-weight-semibold);
+ font-size: var(--text-body);
+ }
+ .part-oem {
+ font-family: var(--font-mono);
+ font-size: var(--text-body-sm);
+ color: var(--color-text-accent);
+ }
+ .part-desc {
+ font-size: var(--text-body-sm);
+ color: var(--color-text-secondary);
+ margin-top: var(--space-1);
+ }
+ .part-alts {
+ font-size: var(--text-caption);
+ color: var(--color-text-muted);
+ margin-top: var(--space-2);
+ }
+ .part-alts span {
+ display: inline-block;
+ background: var(--color-primary-muted);
+ padding: 2px var(--space-2);
+ border-radius: var(--radius-sm);
+ margin-right: var(--space-1);
+ margin-bottom: var(--space-1);
+ font-family: var(--font-mono);
+ border: 1px dashed var(--glass-border);
+ }
+ .part-img {
+ width: 80px; height: 80px;
+ object-fit: contain;
+ border-radius: var(--radius-sm);
+ background: var(--glass-bg);
+ border: 1px solid var(--glass-border);
+ }
+ .part-detail-btn {
+ font-size: var(--text-caption);
+ color: var(--color-text-accent);
+ cursor: pointer;
+ border: none; background: none; font-family: var(--font-body);
+ padding: var(--space-1) 0;
+ transition: color 0.2s;
+ }
+ .part-detail-btn:hover { text-decoration: underline; }
+
+ /* ==========================================================================
+ PAGINATION — Glass buttons
+ ========================================================================== */
+
+ .pagination {
+ display: flex; justify-content: center; gap: var(--space-2);
+ margin-top: var(--space-6);
+ }
+ .pagination button {
+ padding: var(--space-2) var(--space-4);
+ background: var(--glass-bg);
+ backdrop-filter: blur(8px);
+ border: 1px solid var(--glass-border);
+ border-radius: var(--radius-md);
+ color: var(--color-text-primary);
+ cursor: pointer; font-family: var(--font-body);
+ transition: all 0.25s ease;
+ }
+ .pagination button:hover {
+ border-color: var(--color-border-accent);
+ box-shadow: 0 0 12px var(--glow-color-soft);
+ }
+ .pagination button.active {
+ background: var(--gradient-accent);
+ color: var(--btn-primary-text);
+ border-color: transparent;
+ box-shadow: 0 3px 0 var(--color-primary-active),
+ 0 4px 12px var(--glow-color-soft);
+ }
+ .pagination button:disabled { opacity: .4; cursor: default; }
+
+ /* ==========================================================================
+ SEARCH RESULTS
+ ========================================================================== */
+
+ .search-results { display: flex; flex-direction: column; gap: var(--space-3); }
+
+ /* ==========================================================================
+ PART DETAIL MODAL — Glass overlay
+ ========================================================================== */
+
+ .modal-overlay {
+ display: none;
+ position: fixed; inset: 0;
+ background: var(--overlay-backdrop);
+ z-index: var(--z-modal);
+ justify-content: center; align-items: flex-start;
+ padding: var(--space-10) var(--space-4);
+ overflow-y: auto;
+ backdrop-filter: blur(4px);
+ -webkit-backdrop-filter: blur(4px);
+ }
+ .modal-overlay.open { display: flex; }
+ .modal-content {
+ background: var(--glass-bg-strong);
+ backdrop-filter: blur(24px);
+ -webkit-backdrop-filter: blur(24px);
+ border: 1px solid var(--glass-border);
+ border-radius: var(--radius-lg);
+ max-width: 700px; width: 100%;
+ padding: var(--space-8);
+ position: relative;
+ box-shadow: 0 24px 48px rgba(0,0,0,0.3);
+ }
+ .modal-close {
+ position: absolute; top: var(--space-3); right: var(--space-3);
+ background: none; border: none; color: var(--color-text-muted);
+ font-size: 1.5rem; cursor: pointer; line-height: 1;
+ transition: color 0.2s;
+ }
+ .modal-close:hover { color: var(--color-text-accent); }
+ .detail-section { margin-top: var(--space-6); }
+ .detail-section h4 {
+ font-family: var(--font-heading);
+ font-size: var(--text-h6);
+ font-weight: var(--heading-weight-secondary);
+ margin-bottom: var(--space-3);
+ color: var(--color-text-accent);
+ }
+ .alt-table {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: var(--text-body-sm);
+ }
+ .alt-table th, .alt-table td {
+ padding: var(--space-2) var(--space-3);
+ text-align: left;
+ border-bottom: 1px solid var(--glass-border);
+ }
+ .alt-table th {
+ color: var(--color-text-muted);
+ font-weight: var(--font-weight-semibold);
+ text-transform: uppercase;
+ font-size: var(--text-caption);
+ letter-spacing: var(--tracking-widest);
+ font-family: var(--font-mono);
+ }
+
+ /* ==========================================================================
+ LOADING / EMPTY
+ ========================================================================== */
+
+ .loading {
+ text-align: center; padding: var(--space-10);
+ color: var(--color-text-muted);
+ font-size: var(--text-body);
+ }
+ .empty {
+ text-align: center; padding: var(--space-10);
+ color: var(--color-text-muted);
+ }
+
+ /* ==========================================================================
+ FOOTER
+ ========================================================================== */
+
+ .site-footer {
+ padding: var(--space-4) 0; text-align: center;
+ border-top: 1px solid var(--color-border);
+ font-size: var(--text-caption); color: var(--color-text-muted);
+ }
+
+ /* ==========================================================================
+ RESPONSIVE
+ ========================================================================== */
+
+ @media (max-width: 640px) {
+ .nav-grid { grid-template-columns: 1fr; }
+ .part-row { grid-template-columns: 1fr; }
+ }
diff --git a/dashboard/customer-landing.css b/dashboard/customer-landing.css
new file mode 100644
index 0000000..d5dc822
--- /dev/null
+++ b/dashboard/customer-landing.css
@@ -0,0 +1,941 @@
+/* Extracted from customer-landing.html */
+
+/* Landing page-specific header extras */
+ .header-actions {
+ display: flex;
+ align-items: center;
+ gap: 1.5rem;
+ }
+
+ .search-btn, .cart-btn {
+ width: 42px;
+ height: 42px;
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.3s;
+ font-size: 1.2rem;
+ position: relative;
+ }
+
+ .search-btn:hover, .cart-btn:hover {
+ background: var(--accent);
+ border-color: var(--accent);
+ }
+
+ .cart-badge {
+ position: absolute;
+ top: -5px;
+ right: -5px;
+ width: 20px;
+ height: 20px;
+ background: var(--accent);
+ border-radius: 50%;
+ font-size: 0.7rem;
+ font-weight: 700;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ /* Footer logo (reuses .logo classes) */
+ .footer .logo {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ text-decoration: none;
+ }
+
+ .footer .logo-icon {
+ width: 42px;
+ height: 42px;
+ background: linear-gradient(135deg, var(--accent) 0%, #ff4500 100%);
+ border-radius: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.5rem;
+ box-shadow: 0 4px 20px var(--accent-glow);
+ }
+
+ .footer .logo-text {
+ font-family: 'Orbitron', sans-serif;
+ font-size: 1.4rem;
+ font-weight: 700;
+ background: linear-gradient(135deg, #fff 0%, var(--accent) 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ }
+
+ /* Hero Section */
+ .hero {
+ min-height: 100vh;
+ display: flex;
+ align-items: center;
+ padding: 8rem 3rem 4rem;
+ position: relative;
+ overflow: hidden;
+ }
+
+ .hero-bg {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background:
+ radial-gradient(ellipse at 20% 50%, rgba(255, 107, 53, 0.15) 0%, transparent 50%),
+ radial-gradient(ellipse at 80% 20%, rgba(255, 69, 0, 0.1) 0%, transparent 40%);
+ z-index: 0;
+ }
+
+ .hero-grid {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-image:
+ linear-gradient(rgba(255, 107, 53, 0.03) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(255, 107, 53, 0.03) 1px, transparent 1px);
+ background-size: 50px 50px;
+ z-index: 0;
+ }
+
+ .hero-content {
+ max-width: 1400px;
+ margin: 0 auto;
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 4rem;
+ align-items: center;
+ width: 100%;
+ position: relative;
+ z-index: 1;
+ }
+
+ .hero-text h1 {
+ font-family: 'Orbitron', sans-serif;
+ font-size: 3.5rem;
+ font-weight: 700;
+ line-height: 1.2;
+ margin-bottom: 1.5rem;
+ }
+
+ .hero-text h1 span {
+ color: var(--accent);
+ text-shadow: 0 0 30px var(--accent-glow);
+ }
+
+ .hero-text p {
+ font-size: 1.2rem;
+ color: var(--text-secondary);
+ line-height: 1.8;
+ margin-bottom: 2.5rem;
+ max-width: 500px;
+ }
+
+ .hero-buttons {
+ display: flex;
+ gap: 1rem;
+ }
+
+ .btn-large {
+ padding: 1rem 2rem;
+ font-size: 1rem;
+ }
+
+ .btn-outline {
+ background: transparent;
+ border: 2px solid var(--border);
+ color: var(--text-primary);
+ }
+
+ .btn-outline:hover {
+ border-color: var(--accent);
+ color: var(--accent);
+ }
+
+ .hero-stats {
+ display: flex;
+ gap: 3rem;
+ margin-top: 3rem;
+ padding-top: 2rem;
+ border-top: 1px solid var(--border);
+ }
+
+ .hero-stat {
+ text-align: center;
+ }
+
+ .hero-stat-value {
+ font-family: 'Orbitron', sans-serif;
+ font-size: 2rem;
+ font-weight: 700;
+ color: var(--accent);
+ }
+
+ .hero-stat-label {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-top: 0.25rem;
+ }
+
+ .hero-visual {
+ position: relative;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .hero-image {
+ width: 500px;
+ height: 400px;
+ background: linear-gradient(135deg, var(--bg-card) 0%, var(--bg-hover) 100%);
+ border-radius: 20px;
+ border: 1px solid var(--border);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 8rem;
+ position: relative;
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
+ }
+
+ .hero-image::before {
+ content: '';
+ position: absolute;
+ top: -2px;
+ left: -2px;
+ right: -2px;
+ bottom: -2px;
+ background: linear-gradient(135deg, var(--accent), transparent, var(--accent));
+ border-radius: 22px;
+ z-index: -1;
+ opacity: 0.5;
+ }
+
+ .floating-card {
+ position: absolute;
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 12px;
+ padding: 1rem 1.5rem;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
+ }
+
+ .floating-card-1 {
+ top: 20px;
+ right: -20px;
+ animation: float 3s ease-in-out infinite;
+ }
+
+ .floating-card-2 {
+ bottom: 40px;
+ left: -30px;
+ animation: float 3s ease-in-out infinite 1.5s;
+ }
+
+ @keyframes float {
+ 0%, 100% { transform: translateY(0); }
+ 50% { transform: translateY(-10px); }
+ }
+
+ .floating-card-text {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ }
+
+ .floating-card-value {
+ font-family: 'Orbitron', sans-serif;
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: var(--accent);
+ }
+
+ /* Categories Section */
+ .categories {
+ padding: 5rem 3rem;
+ background: var(--bg-secondary);
+ }
+
+ .section-header {
+ text-align: center;
+ margin-bottom: 3rem;
+ }
+
+ .section-tag {
+ display: inline-block;
+ padding: 0.5rem 1rem;
+ background: rgba(255, 107, 53, 0.1);
+ border: 1px solid var(--accent);
+ border-radius: 20px;
+ color: var(--accent);
+ font-size: 0.85rem;
+ font-weight: 600;
+ margin-bottom: 1rem;
+ }
+
+ .section-title {
+ font-family: 'Orbitron', sans-serif;
+ font-size: 2.5rem;
+ font-weight: 700;
+ margin-bottom: 1rem;
+ }
+
+ .section-subtitle {
+ color: var(--text-secondary);
+ font-size: 1.1rem;
+ }
+
+ .categories-grid {
+ max-width: 1400px;
+ margin: 0 auto;
+ display: grid;
+ grid-template-columns: repeat(6, 1fr);
+ gap: 1.5rem;
+ }
+
+ .category-card {
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 16px;
+ padding: 2rem 1rem;
+ text-align: center;
+ cursor: pointer;
+ transition: all 0.3s;
+ text-decoration: none;
+ color: inherit;
+ display: block;
+ }
+
+ .category-card:hover {
+ transform: translateY(-5px);
+ border-color: var(--accent);
+ box-shadow: 0 10px 30px var(--accent-glow);
+ }
+
+ .category-icon {
+ width: 70px;
+ height: 70px;
+ background: var(--bg-hover);
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 2rem;
+ margin: 0 auto 1rem;
+ transition: all 0.3s;
+ }
+
+ .category-card:hover .category-icon {
+ background: var(--accent);
+ transform: scale(1.1);
+ }
+
+ .category-name {
+ font-weight: 600;
+ margin-bottom: 0.5rem;
+ }
+
+ .category-count {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ }
+
+ /* Featured Products */
+ .featured {
+ padding: 5rem 3rem;
+ }
+
+ .featured-header {
+ max-width: 1400px;
+ margin: 0 auto 3rem;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ .view-all {
+ color: var(--accent);
+ text-decoration: none;
+ font-weight: 600;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ transition: gap 0.3s;
+ }
+
+ .view-all:hover {
+ gap: 1rem;
+ }
+
+ .products-grid {
+ max-width: 1400px;
+ margin: 0 auto;
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 1.5rem;
+ }
+
+ .product-card {
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 16px;
+ overflow: hidden;
+ transition: all 0.3s;
+ }
+
+ .product-card:hover {
+ transform: translateY(-5px);
+ border-color: var(--accent);
+ box-shadow: 0 15px 40px rgba(0, 0, 0, 0.4);
+ }
+
+ .product-image {
+ height: 200px;
+ background: var(--bg-hover);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 4rem;
+ position: relative;
+ }
+
+ .product-badge {
+ position: absolute;
+ top: 1rem;
+ left: 1rem;
+ padding: 0.4rem 0.8rem;
+ background: var(--accent);
+ border-radius: 6px;
+ font-size: 0.75rem;
+ font-weight: 700;
+ }
+
+ .product-badge.premium {
+ background: linear-gradient(135deg, #f59e0b, #d97706);
+ }
+
+ .product-badge.economy {
+ background: var(--success);
+ }
+
+ .product-wishlist {
+ position: absolute;
+ top: 1rem;
+ right: 1rem;
+ width: 36px;
+ height: 36px;
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.3s;
+ }
+
+ .product-wishlist:hover {
+ background: var(--accent);
+ border-color: var(--accent);
+ }
+
+ .product-info {
+ padding: 1.5rem;
+ }
+
+ .product-category {
+ font-size: 0.8rem;
+ color: var(--accent);
+ font-weight: 600;
+ margin-bottom: 0.5rem;
+ }
+
+ .product-name {
+ font-weight: 600;
+ font-size: 1.1rem;
+ margin-bottom: 0.5rem;
+ line-height: 1.4;
+ }
+
+ .product-oem {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ font-family: monospace;
+ margin-bottom: 0.5rem;
+ }
+
+ .product-compatibility {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 1rem;
+ }
+
+ .product-footer {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ .product-price {
+ font-family: 'Orbitron', sans-serif;
+ font-size: 1.3rem;
+ font-weight: 700;
+ color: var(--accent);
+ }
+
+ .product-price .original {
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ text-decoration: line-through;
+ margin-left: 0.5rem;
+ }
+
+ .btn-add-cart {
+ width: 40px;
+ height: 40px;
+ background: var(--bg-hover);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.3s;
+ font-size: 1.2rem;
+ }
+
+ .btn-add-cart:hover {
+ background: var(--accent);
+ border-color: var(--accent);
+ }
+
+ /* Brands Section */
+ .brands {
+ padding: 5rem 3rem;
+ background: var(--bg-secondary);
+ }
+
+ .brands-grid {
+ max-width: 1200px;
+ margin: 0 auto;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 2rem;
+ flex-wrap: wrap;
+ }
+
+ .brand-item {
+ width: 140px;
+ height: 70px;
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.9rem;
+ font-weight: 700;
+ color: var(--text-secondary);
+ transition: all 0.3s;
+ cursor: pointer;
+ text-align: center;
+ padding: 0.5rem;
+ }
+
+ .brand-item:hover {
+ border-color: var(--accent);
+ color: var(--accent);
+ transform: translateY(-3px);
+ }
+
+ /* VIN Section */
+ .vin-section {
+ padding: 5rem 3rem;
+ position: relative;
+ overflow: hidden;
+ }
+
+ .vin-bg {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background:
+ radial-gradient(ellipse at 30% 50%, rgba(255, 107, 53, 0.1) 0%, transparent 50%);
+ }
+
+ .vin-content {
+ max-width: 800px;
+ margin: 0 auto;
+ text-align: center;
+ position: relative;
+ z-index: 1;
+ }
+
+ .vin-form {
+ display: flex;
+ gap: 1rem;
+ max-width: 600px;
+ margin: 2rem auto 0;
+ }
+
+ .vin-input {
+ flex: 1;
+ padding: 1rem 1.5rem;
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ color: var(--text-primary);
+ font-size: 1rem;
+ font-family: monospace;
+ text-transform: uppercase;
+ letter-spacing: 2px;
+ outline: none;
+ transition: border-color 0.3s;
+ }
+
+ .vin-input:focus {
+ border-color: var(--accent);
+ }
+
+ .vin-input::placeholder {
+ color: var(--text-secondary);
+ text-transform: none;
+ letter-spacing: normal;
+ }
+
+ /* CTA Section */
+ .cta {
+ padding: 5rem 3rem;
+ background: var(--bg-secondary);
+ position: relative;
+ overflow: hidden;
+ }
+
+ .cta-bg {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background:
+ radial-gradient(ellipse at 50% 50%, rgba(255, 107, 53, 0.15) 0%, transparent 60%);
+ }
+
+ .cta-content {
+ max-width: 800px;
+ margin: 0 auto;
+ text-align: center;
+ position: relative;
+ z-index: 1;
+ }
+
+ .cta-title {
+ font-family: 'Orbitron', sans-serif;
+ font-size: 2.5rem;
+ font-weight: 700;
+ margin-bottom: 1rem;
+ }
+
+ .cta-subtitle {
+ color: var(--text-secondary);
+ font-size: 1.1rem;
+ margin-bottom: 2rem;
+ }
+
+ .cta-form {
+ display: flex;
+ gap: 1rem;
+ max-width: 500px;
+ margin: 0 auto;
+ }
+
+ .cta-input {
+ flex: 1;
+ padding: 1rem 1.5rem;
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ color: var(--text-primary);
+ font-size: 1rem;
+ outline: none;
+ transition: border-color 0.3s;
+ }
+
+ .cta-input:focus {
+ border-color: var(--accent);
+ }
+
+ .cta-input::placeholder {
+ color: var(--text-secondary);
+ }
+
+ /* Footer */
+ .footer {
+ background: var(--bg-primary);
+ border-top: 1px solid var(--border);
+ padding: 4rem 3rem 2rem;
+ }
+
+ .footer-content {
+ max-width: 1400px;
+ margin: 0 auto;
+ display: grid;
+ grid-template-columns: 2fr 1fr 1fr 1fr;
+ gap: 3rem;
+ }
+
+ .footer-brand p {
+ color: var(--text-secondary);
+ margin: 1rem 0;
+ line-height: 1.8;
+ }
+
+ .social-links {
+ display: flex;
+ gap: 1rem;
+ }
+
+ .social-link {
+ width: 40px;
+ height: 40px;
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.3s;
+ text-decoration: none;
+ color: var(--text-secondary);
+ }
+
+ .social-link:hover {
+ background: var(--accent);
+ border-color: var(--accent);
+ color: white;
+ }
+
+ .footer-title {
+ font-weight: 700;
+ margin-bottom: 1.5rem;
+ font-size: 1.1rem;
+ }
+
+ .footer-links {
+ list-style: none;
+ }
+
+ .footer-links li {
+ margin-bottom: 0.75rem;
+ }
+
+ .footer-links a {
+ color: var(--text-secondary);
+ text-decoration: none;
+ transition: color 0.3s;
+ }
+
+ .footer-links a:hover {
+ color: var(--accent);
+ }
+
+ .footer-bottom {
+ max-width: 1400px;
+ margin: 3rem auto 0;
+ padding-top: 2rem;
+ border-top: 1px solid var(--border);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ }
+
+ /* Loading skeleton */
+ .skeleton {
+ background: linear-gradient(90deg, var(--bg-hover) 25%, var(--bg-card) 50%, var(--bg-hover) 75%);
+ background-size: 200% 100%;
+ animation: shimmer 1.5s infinite;
+ border-radius: 8px;
+ }
+
+ @keyframes shimmer {
+ 0% { background-position: 200% 0; }
+ 100% { background-position: -200% 0; }
+ }
+
+ /* Search Modal */
+ .search-modal {
+ display: none;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.8);
+ z-index: 2000;
+ align-items: flex-start;
+ justify-content: center;
+ padding-top: 15vh;
+ }
+
+ .search-modal.active {
+ display: flex;
+ }
+
+ .search-modal-content {
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 16px;
+ width: 100%;
+ max-width: 600px;
+ padding: 1.5rem;
+ }
+
+ .search-modal-input {
+ width: 100%;
+ padding: 1rem 1.5rem;
+ background: var(--bg-hover);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ color: var(--text-primary);
+ font-size: 1.1rem;
+ outline: none;
+ }
+
+ .search-modal-input:focus {
+ border-color: var(--accent);
+ }
+
+ .search-results {
+ margin-top: 1rem;
+ max-height: 400px;
+ overflow-y: auto;
+ }
+
+ .search-result-item {
+ padding: 1rem;
+ border-radius: 8px;
+ cursor: pointer;
+ transition: background 0.2s;
+ }
+
+ .search-result-item:hover {
+ background: var(--bg-hover);
+ }
+
+ .search-result-name {
+ font-weight: 600;
+ }
+
+ .search-result-oem {
+ font-size: 0.85rem;
+ color: var(--accent);
+ font-family: monospace;
+ }
+
+ /* Mobile menu */
+ .mobile-menu-btn {
+ display: none;
+ background: none;
+ border: none;
+ font-size: 1.5rem;
+ cursor: pointer;
+ color: var(--text-primary);
+ }
+
+ @media (max-width: 1024px) {
+ .hero-content {
+ grid-template-columns: 1fr;
+ text-align: center;
+ }
+
+ .hero-text p {
+ margin: 0 auto 2.5rem;
+ }
+
+ .hero-buttons {
+ justify-content: center;
+ }
+
+ .hero-stats {
+ justify-content: center;
+ }
+
+ .hero-visual {
+ display: none;
+ }
+
+ .categories-grid {
+ grid-template-columns: repeat(3, 1fr);
+ }
+
+ .products-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ .footer-content {
+ grid-template-columns: 1fr 1fr;
+ }
+ }
+
+ @media (max-width: 768px) {
+ .header {
+ padding: 1rem;
+ }
+
+ .nav-links {
+ display: none;
+ }
+
+ .mobile-menu-btn {
+ display: block;
+ }
+
+ .hero {
+ padding: 6rem 1rem 3rem;
+ }
+
+ .hero-text h1 {
+ font-size: 2.5rem;
+ }
+
+ .categories, .featured, .brands, .vin-section, .cta {
+ padding: 3rem 1rem;
+ }
+
+ .categories-grid {
+ grid-template-columns: repeat(2, 1fr);
+ gap: 1rem;
+ }
+
+ .products-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .vin-form, .cta-form {
+ flex-direction: column;
+ }
+
+ .footer-content {
+ grid-template-columns: 1fr;
+ }
+
+ .footer-bottom {
+ flex-direction: column;
+ gap: 1rem;
+ text-align: center;
+ }
+ }
diff --git a/dashboard/customer-landing.html b/dashboard/customer-landing.html
index 65b7127..909337e 100644
--- a/dashboard/customer-landing.html
+++ b/dashboard/customer-landing.html
@@ -6,947 +6,7 @@
Nexus Autoparts - Tu conexión directa con las partes que necesitas
-
+
diff --git a/dashboard/customer-landing.min.css b/dashboard/customer-landing.min.css
new file mode 100644
index 0000000..d5dc822
--- /dev/null
+++ b/dashboard/customer-landing.min.css
@@ -0,0 +1,941 @@
+/* Extracted from customer-landing.html */
+
+/* Landing page-specific header extras */
+ .header-actions {
+ display: flex;
+ align-items: center;
+ gap: 1.5rem;
+ }
+
+ .search-btn, .cart-btn {
+ width: 42px;
+ height: 42px;
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.3s;
+ font-size: 1.2rem;
+ position: relative;
+ }
+
+ .search-btn:hover, .cart-btn:hover {
+ background: var(--accent);
+ border-color: var(--accent);
+ }
+
+ .cart-badge {
+ position: absolute;
+ top: -5px;
+ right: -5px;
+ width: 20px;
+ height: 20px;
+ background: var(--accent);
+ border-radius: 50%;
+ font-size: 0.7rem;
+ font-weight: 700;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ /* Footer logo (reuses .logo classes) */
+ .footer .logo {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ text-decoration: none;
+ }
+
+ .footer .logo-icon {
+ width: 42px;
+ height: 42px;
+ background: linear-gradient(135deg, var(--accent) 0%, #ff4500 100%);
+ border-radius: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.5rem;
+ box-shadow: 0 4px 20px var(--accent-glow);
+ }
+
+ .footer .logo-text {
+ font-family: 'Orbitron', sans-serif;
+ font-size: 1.4rem;
+ font-weight: 700;
+ background: linear-gradient(135deg, #fff 0%, var(--accent) 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ }
+
+ /* Hero Section */
+ .hero {
+ min-height: 100vh;
+ display: flex;
+ align-items: center;
+ padding: 8rem 3rem 4rem;
+ position: relative;
+ overflow: hidden;
+ }
+
+ .hero-bg {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background:
+ radial-gradient(ellipse at 20% 50%, rgba(255, 107, 53, 0.15) 0%, transparent 50%),
+ radial-gradient(ellipse at 80% 20%, rgba(255, 69, 0, 0.1) 0%, transparent 40%);
+ z-index: 0;
+ }
+
+ .hero-grid {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-image:
+ linear-gradient(rgba(255, 107, 53, 0.03) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(255, 107, 53, 0.03) 1px, transparent 1px);
+ background-size: 50px 50px;
+ z-index: 0;
+ }
+
+ .hero-content {
+ max-width: 1400px;
+ margin: 0 auto;
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 4rem;
+ align-items: center;
+ width: 100%;
+ position: relative;
+ z-index: 1;
+ }
+
+ .hero-text h1 {
+ font-family: 'Orbitron', sans-serif;
+ font-size: 3.5rem;
+ font-weight: 700;
+ line-height: 1.2;
+ margin-bottom: 1.5rem;
+ }
+
+ .hero-text h1 span {
+ color: var(--accent);
+ text-shadow: 0 0 30px var(--accent-glow);
+ }
+
+ .hero-text p {
+ font-size: 1.2rem;
+ color: var(--text-secondary);
+ line-height: 1.8;
+ margin-bottom: 2.5rem;
+ max-width: 500px;
+ }
+
+ .hero-buttons {
+ display: flex;
+ gap: 1rem;
+ }
+
+ .btn-large {
+ padding: 1rem 2rem;
+ font-size: 1rem;
+ }
+
+ .btn-outline {
+ background: transparent;
+ border: 2px solid var(--border);
+ color: var(--text-primary);
+ }
+
+ .btn-outline:hover {
+ border-color: var(--accent);
+ color: var(--accent);
+ }
+
+ .hero-stats {
+ display: flex;
+ gap: 3rem;
+ margin-top: 3rem;
+ padding-top: 2rem;
+ border-top: 1px solid var(--border);
+ }
+
+ .hero-stat {
+ text-align: center;
+ }
+
+ .hero-stat-value {
+ font-family: 'Orbitron', sans-serif;
+ font-size: 2rem;
+ font-weight: 700;
+ color: var(--accent);
+ }
+
+ .hero-stat-label {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-top: 0.25rem;
+ }
+
+ .hero-visual {
+ position: relative;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .hero-image {
+ width: 500px;
+ height: 400px;
+ background: linear-gradient(135deg, var(--bg-card) 0%, var(--bg-hover) 100%);
+ border-radius: 20px;
+ border: 1px solid var(--border);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 8rem;
+ position: relative;
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
+ }
+
+ .hero-image::before {
+ content: '';
+ position: absolute;
+ top: -2px;
+ left: -2px;
+ right: -2px;
+ bottom: -2px;
+ background: linear-gradient(135deg, var(--accent), transparent, var(--accent));
+ border-radius: 22px;
+ z-index: -1;
+ opacity: 0.5;
+ }
+
+ .floating-card {
+ position: absolute;
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 12px;
+ padding: 1rem 1.5rem;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
+ }
+
+ .floating-card-1 {
+ top: 20px;
+ right: -20px;
+ animation: float 3s ease-in-out infinite;
+ }
+
+ .floating-card-2 {
+ bottom: 40px;
+ left: -30px;
+ animation: float 3s ease-in-out infinite 1.5s;
+ }
+
+ @keyframes float {
+ 0%, 100% { transform: translateY(0); }
+ 50% { transform: translateY(-10px); }
+ }
+
+ .floating-card-text {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ }
+
+ .floating-card-value {
+ font-family: 'Orbitron', sans-serif;
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: var(--accent);
+ }
+
+ /* Categories Section */
+ .categories {
+ padding: 5rem 3rem;
+ background: var(--bg-secondary);
+ }
+
+ .section-header {
+ text-align: center;
+ margin-bottom: 3rem;
+ }
+
+ .section-tag {
+ display: inline-block;
+ padding: 0.5rem 1rem;
+ background: rgba(255, 107, 53, 0.1);
+ border: 1px solid var(--accent);
+ border-radius: 20px;
+ color: var(--accent);
+ font-size: 0.85rem;
+ font-weight: 600;
+ margin-bottom: 1rem;
+ }
+
+ .section-title {
+ font-family: 'Orbitron', sans-serif;
+ font-size: 2.5rem;
+ font-weight: 700;
+ margin-bottom: 1rem;
+ }
+
+ .section-subtitle {
+ color: var(--text-secondary);
+ font-size: 1.1rem;
+ }
+
+ .categories-grid {
+ max-width: 1400px;
+ margin: 0 auto;
+ display: grid;
+ grid-template-columns: repeat(6, 1fr);
+ gap: 1.5rem;
+ }
+
+ .category-card {
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 16px;
+ padding: 2rem 1rem;
+ text-align: center;
+ cursor: pointer;
+ transition: all 0.3s;
+ text-decoration: none;
+ color: inherit;
+ display: block;
+ }
+
+ .category-card:hover {
+ transform: translateY(-5px);
+ border-color: var(--accent);
+ box-shadow: 0 10px 30px var(--accent-glow);
+ }
+
+ .category-icon {
+ width: 70px;
+ height: 70px;
+ background: var(--bg-hover);
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 2rem;
+ margin: 0 auto 1rem;
+ transition: all 0.3s;
+ }
+
+ .category-card:hover .category-icon {
+ background: var(--accent);
+ transform: scale(1.1);
+ }
+
+ .category-name {
+ font-weight: 600;
+ margin-bottom: 0.5rem;
+ }
+
+ .category-count {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ }
+
+ /* Featured Products */
+ .featured {
+ padding: 5rem 3rem;
+ }
+
+ .featured-header {
+ max-width: 1400px;
+ margin: 0 auto 3rem;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ .view-all {
+ color: var(--accent);
+ text-decoration: none;
+ font-weight: 600;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ transition: gap 0.3s;
+ }
+
+ .view-all:hover {
+ gap: 1rem;
+ }
+
+ .products-grid {
+ max-width: 1400px;
+ margin: 0 auto;
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 1.5rem;
+ }
+
+ .product-card {
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 16px;
+ overflow: hidden;
+ transition: all 0.3s;
+ }
+
+ .product-card:hover {
+ transform: translateY(-5px);
+ border-color: var(--accent);
+ box-shadow: 0 15px 40px rgba(0, 0, 0, 0.4);
+ }
+
+ .product-image {
+ height: 200px;
+ background: var(--bg-hover);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 4rem;
+ position: relative;
+ }
+
+ .product-badge {
+ position: absolute;
+ top: 1rem;
+ left: 1rem;
+ padding: 0.4rem 0.8rem;
+ background: var(--accent);
+ border-radius: 6px;
+ font-size: 0.75rem;
+ font-weight: 700;
+ }
+
+ .product-badge.premium {
+ background: linear-gradient(135deg, #f59e0b, #d97706);
+ }
+
+ .product-badge.economy {
+ background: var(--success);
+ }
+
+ .product-wishlist {
+ position: absolute;
+ top: 1rem;
+ right: 1rem;
+ width: 36px;
+ height: 36px;
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.3s;
+ }
+
+ .product-wishlist:hover {
+ background: var(--accent);
+ border-color: var(--accent);
+ }
+
+ .product-info {
+ padding: 1.5rem;
+ }
+
+ .product-category {
+ font-size: 0.8rem;
+ color: var(--accent);
+ font-weight: 600;
+ margin-bottom: 0.5rem;
+ }
+
+ .product-name {
+ font-weight: 600;
+ font-size: 1.1rem;
+ margin-bottom: 0.5rem;
+ line-height: 1.4;
+ }
+
+ .product-oem {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ font-family: monospace;
+ margin-bottom: 0.5rem;
+ }
+
+ .product-compatibility {
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ margin-bottom: 1rem;
+ }
+
+ .product-footer {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ .product-price {
+ font-family: 'Orbitron', sans-serif;
+ font-size: 1.3rem;
+ font-weight: 700;
+ color: var(--accent);
+ }
+
+ .product-price .original {
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ text-decoration: line-through;
+ margin-left: 0.5rem;
+ }
+
+ .btn-add-cart {
+ width: 40px;
+ height: 40px;
+ background: var(--bg-hover);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.3s;
+ font-size: 1.2rem;
+ }
+
+ .btn-add-cart:hover {
+ background: var(--accent);
+ border-color: var(--accent);
+ }
+
+ /* Brands Section */
+ .brands {
+ padding: 5rem 3rem;
+ background: var(--bg-secondary);
+ }
+
+ .brands-grid {
+ max-width: 1200px;
+ margin: 0 auto;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 2rem;
+ flex-wrap: wrap;
+ }
+
+ .brand-item {
+ width: 140px;
+ height: 70px;
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.9rem;
+ font-weight: 700;
+ color: var(--text-secondary);
+ transition: all 0.3s;
+ cursor: pointer;
+ text-align: center;
+ padding: 0.5rem;
+ }
+
+ .brand-item:hover {
+ border-color: var(--accent);
+ color: var(--accent);
+ transform: translateY(-3px);
+ }
+
+ /* VIN Section */
+ .vin-section {
+ padding: 5rem 3rem;
+ position: relative;
+ overflow: hidden;
+ }
+
+ .vin-bg {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background:
+ radial-gradient(ellipse at 30% 50%, rgba(255, 107, 53, 0.1) 0%, transparent 50%);
+ }
+
+ .vin-content {
+ max-width: 800px;
+ margin: 0 auto;
+ text-align: center;
+ position: relative;
+ z-index: 1;
+ }
+
+ .vin-form {
+ display: flex;
+ gap: 1rem;
+ max-width: 600px;
+ margin: 2rem auto 0;
+ }
+
+ .vin-input {
+ flex: 1;
+ padding: 1rem 1.5rem;
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ color: var(--text-primary);
+ font-size: 1rem;
+ font-family: monospace;
+ text-transform: uppercase;
+ letter-spacing: 2px;
+ outline: none;
+ transition: border-color 0.3s;
+ }
+
+ .vin-input:focus {
+ border-color: var(--accent);
+ }
+
+ .vin-input::placeholder {
+ color: var(--text-secondary);
+ text-transform: none;
+ letter-spacing: normal;
+ }
+
+ /* CTA Section */
+ .cta {
+ padding: 5rem 3rem;
+ background: var(--bg-secondary);
+ position: relative;
+ overflow: hidden;
+ }
+
+ .cta-bg {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background:
+ radial-gradient(ellipse at 50% 50%, rgba(255, 107, 53, 0.15) 0%, transparent 60%);
+ }
+
+ .cta-content {
+ max-width: 800px;
+ margin: 0 auto;
+ text-align: center;
+ position: relative;
+ z-index: 1;
+ }
+
+ .cta-title {
+ font-family: 'Orbitron', sans-serif;
+ font-size: 2.5rem;
+ font-weight: 700;
+ margin-bottom: 1rem;
+ }
+
+ .cta-subtitle {
+ color: var(--text-secondary);
+ font-size: 1.1rem;
+ margin-bottom: 2rem;
+ }
+
+ .cta-form {
+ display: flex;
+ gap: 1rem;
+ max-width: 500px;
+ margin: 0 auto;
+ }
+
+ .cta-input {
+ flex: 1;
+ padding: 1rem 1.5rem;
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ color: var(--text-primary);
+ font-size: 1rem;
+ outline: none;
+ transition: border-color 0.3s;
+ }
+
+ .cta-input:focus {
+ border-color: var(--accent);
+ }
+
+ .cta-input::placeholder {
+ color: var(--text-secondary);
+ }
+
+ /* Footer */
+ .footer {
+ background: var(--bg-primary);
+ border-top: 1px solid var(--border);
+ padding: 4rem 3rem 2rem;
+ }
+
+ .footer-content {
+ max-width: 1400px;
+ margin: 0 auto;
+ display: grid;
+ grid-template-columns: 2fr 1fr 1fr 1fr;
+ gap: 3rem;
+ }
+
+ .footer-brand p {
+ color: var(--text-secondary);
+ margin: 1rem 0;
+ line-height: 1.8;
+ }
+
+ .social-links {
+ display: flex;
+ gap: 1rem;
+ }
+
+ .social-link {
+ width: 40px;
+ height: 40px;
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.3s;
+ text-decoration: none;
+ color: var(--text-secondary);
+ }
+
+ .social-link:hover {
+ background: var(--accent);
+ border-color: var(--accent);
+ color: white;
+ }
+
+ .footer-title {
+ font-weight: 700;
+ margin-bottom: 1.5rem;
+ font-size: 1.1rem;
+ }
+
+ .footer-links {
+ list-style: none;
+ }
+
+ .footer-links li {
+ margin-bottom: 0.75rem;
+ }
+
+ .footer-links a {
+ color: var(--text-secondary);
+ text-decoration: none;
+ transition: color 0.3s;
+ }
+
+ .footer-links a:hover {
+ color: var(--accent);
+ }
+
+ .footer-bottom {
+ max-width: 1400px;
+ margin: 3rem auto 0;
+ padding-top: 2rem;
+ border-top: 1px solid var(--border);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ }
+
+ /* Loading skeleton */
+ .skeleton {
+ background: linear-gradient(90deg, var(--bg-hover) 25%, var(--bg-card) 50%, var(--bg-hover) 75%);
+ background-size: 200% 100%;
+ animation: shimmer 1.5s infinite;
+ border-radius: 8px;
+ }
+
+ @keyframes shimmer {
+ 0% { background-position: 200% 0; }
+ 100% { background-position: -200% 0; }
+ }
+
+ /* Search Modal */
+ .search-modal {
+ display: none;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.8);
+ z-index: 2000;
+ align-items: flex-start;
+ justify-content: center;
+ padding-top: 15vh;
+ }
+
+ .search-modal.active {
+ display: flex;
+ }
+
+ .search-modal-content {
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 16px;
+ width: 100%;
+ max-width: 600px;
+ padding: 1.5rem;
+ }
+
+ .search-modal-input {
+ width: 100%;
+ padding: 1rem 1.5rem;
+ background: var(--bg-hover);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ color: var(--text-primary);
+ font-size: 1.1rem;
+ outline: none;
+ }
+
+ .search-modal-input:focus {
+ border-color: var(--accent);
+ }
+
+ .search-results {
+ margin-top: 1rem;
+ max-height: 400px;
+ overflow-y: auto;
+ }
+
+ .search-result-item {
+ padding: 1rem;
+ border-radius: 8px;
+ cursor: pointer;
+ transition: background 0.2s;
+ }
+
+ .search-result-item:hover {
+ background: var(--bg-hover);
+ }
+
+ .search-result-name {
+ font-weight: 600;
+ }
+
+ .search-result-oem {
+ font-size: 0.85rem;
+ color: var(--accent);
+ font-family: monospace;
+ }
+
+ /* Mobile menu */
+ .mobile-menu-btn {
+ display: none;
+ background: none;
+ border: none;
+ font-size: 1.5rem;
+ cursor: pointer;
+ color: var(--text-primary);
+ }
+
+ @media (max-width: 1024px) {
+ .hero-content {
+ grid-template-columns: 1fr;
+ text-align: center;
+ }
+
+ .hero-text p {
+ margin: 0 auto 2.5rem;
+ }
+
+ .hero-buttons {
+ justify-content: center;
+ }
+
+ .hero-stats {
+ justify-content: center;
+ }
+
+ .hero-visual {
+ display: none;
+ }
+
+ .categories-grid {
+ grid-template-columns: repeat(3, 1fr);
+ }
+
+ .products-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ .footer-content {
+ grid-template-columns: 1fr 1fr;
+ }
+ }
+
+ @media (max-width: 768px) {
+ .header {
+ padding: 1rem;
+ }
+
+ .nav-links {
+ display: none;
+ }
+
+ .mobile-menu-btn {
+ display: block;
+ }
+
+ .hero {
+ padding: 6rem 1rem 3rem;
+ }
+
+ .hero-text h1 {
+ font-size: 2.5rem;
+ }
+
+ .categories, .featured, .brands, .vin-section, .cta {
+ padding: 3rem 1rem;
+ }
+
+ .categories-grid {
+ grid-template-columns: repeat(2, 1fr);
+ gap: 1rem;
+ }
+
+ .products-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .vin-form, .cta-form {
+ flex-direction: column;
+ }
+
+ .footer-content {
+ grid-template-columns: 1fr;
+ }
+
+ .footer-bottom {
+ flex-direction: column;
+ gap: 1rem;
+ text-align: center;
+ }
+ }
diff --git a/dashboard/demo.css b/dashboard/demo.css
new file mode 100644
index 0000000..f764b70
--- /dev/null
+++ b/dashboard/demo.css
@@ -0,0 +1,709 @@
+/* Extracted from demo.html */
+
+*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
+
+ :root {
+ --bg: #0a0a0f;
+ --bg2: #12121a;
+ --card: #1a1a24;
+ --hover: #252532;
+ --border: #2a2a3a;
+ --accent: #ff6b35;
+ --accent-glow: rgba(255, 107, 53, 0.25);
+ --text: #ffffff;
+ --text2: #a0a0b0;
+ --success: #22c55e;
+ --info: #3b82f6;
+ }
+
+ body {
+ font-family: 'DM Sans', sans-serif;
+ background: var(--bg);
+ color: var(--text);
+ min-height: 100vh;
+ }
+
+ /* --- Header --- */
+ .header {
+ position: fixed;
+ top: 0; left: 0; right: 0;
+ z-index: 100;
+ background: rgba(18, 18, 26, 0.92);
+ backdrop-filter: blur(24px);
+ -webkit-backdrop-filter: blur(24px);
+ border-bottom: 1px solid var(--border);
+ padding: 0.7rem 2rem;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+
+ .logo {
+ display: flex;
+ align-items: center;
+ gap: 0.7rem;
+ }
+
+ .logo-mark {
+ width: 40px; height: 40px;
+ background: linear-gradient(135deg, var(--accent), #ff4500);
+ border-radius: 10px;
+ display: flex; align-items: center; justify-content: center;
+ font-size: 1.3rem;
+ box-shadow: 0 3px 16px var(--accent-glow);
+ }
+
+ .logo-text {
+ font-family: 'Outfit', sans-serif;
+ font-weight: 800;
+ font-size: 1.3rem;
+ background: linear-gradient(135deg, #fff, var(--accent));
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ }
+
+ .logo-sub {
+ font-size: 0.6rem;
+ color: var(--text2);
+ letter-spacing: 0.12em;
+ text-transform: uppercase;
+ }
+
+ .header-search {
+ position: relative;
+ width: 340px;
+ }
+
+ .header-search input {
+ width: 100%;
+ padding: 0.5rem 0.8rem 0.5rem 2.2rem;
+ background: var(--card);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ color: var(--text);
+ font-family: 'DM Sans', sans-serif;
+ font-size: 0.85rem;
+ outline: none;
+ transition: border-color 0.2s;
+ }
+
+ .header-search input:focus { border-color: var(--accent); }
+ .header-search input::placeholder { color: var(--text2); }
+
+ .header-search svg {
+ position: absolute;
+ left: 0.7rem; top: 50%;
+ transform: translateY(-50%);
+ width: 16px; height: 16px;
+ color: var(--text2);
+ pointer-events: none;
+ }
+
+ .search-drop {
+ position: absolute;
+ top: calc(100% + 4px);
+ left: 0; right: 0;
+ background: var(--card);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ max-height: 320px;
+ overflow-y: auto;
+ box-shadow: 0 12px 40px rgba(0,0,0,0.5);
+ display: none;
+ z-index: 200;
+ }
+
+ .search-drop.open { display: block; }
+
+ .search-item {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0.55rem 0.8rem;
+ border-bottom: 1px solid var(--border);
+ cursor: pointer;
+ transition: background 0.15s;
+ }
+
+ .search-item:last-child { border-bottom: none; }
+ .search-item:hover { background: var(--hover); }
+
+ .search-item .si-oem {
+ font-family: 'JetBrains Mono', monospace;
+ font-weight: 600;
+ font-size: 0.85rem;
+ color: var(--accent);
+ }
+
+ .search-item .si-name {
+ font-size: 0.8rem;
+ color: var(--text2);
+ margin-left: 0.5rem;
+ }
+
+ .search-item .si-cat {
+ font-size: 0.7rem;
+ color: var(--text2);
+ }
+
+ .badge-demo {
+ font-size: 0.65rem;
+ font-weight: 700;
+ background: var(--accent);
+ color: #fff;
+ padding: 0.2rem 0.6rem;
+ border-radius: 5px;
+ letter-spacing: 0.08em;
+ }
+
+ /* --- Main --- */
+ .main {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 4.5rem 1.5rem 2rem;
+ }
+
+ /* --- Breadcrumb --- */
+ .breadcrumb {
+ display: flex;
+ align-items: center;
+ gap: 0.4rem;
+ margin-bottom: 1rem;
+ font-size: 0.8rem;
+ flex-wrap: wrap;
+ }
+
+ .breadcrumb span {
+ color: var(--text2);
+ }
+
+ .breadcrumb a {
+ color: var(--accent);
+ text-decoration: none;
+ cursor: pointer;
+ }
+
+ .breadcrumb a:hover { text-decoration: underline; }
+
+ .breadcrumb .sep {
+ color: var(--border);
+ }
+
+ /* --- Section title --- */
+ .section-title {
+ font-family: 'Outfit', sans-serif;
+ font-weight: 700;
+ font-size: 1.4rem;
+ margin-bottom: 1rem;
+ }
+
+ .section-subtitle {
+ font-size: 0.85rem;
+ color: var(--text2);
+ margin-top: -0.6rem;
+ margin-bottom: 1rem;
+ }
+
+ /* --- Grid --- */
+ .grid {
+ display: grid;
+ gap: 0.6rem;
+ }
+
+ .grid-brands {
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+ }
+
+ .grid-models {
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
+ }
+
+ .grid-vehicles {
+ grid-template-columns: 1fr;
+ }
+
+ .grid-categories {
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
+ }
+
+ .grid-parts {
+ grid-template-columns: 1fr;
+ }
+
+ /* --- Card --- */
+ .card {
+ background: var(--card);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ padding: 0.8rem 1rem;
+ cursor: pointer;
+ transition: border-color 0.2s, transform 0.15s, background 0.2s;
+ }
+
+ .card:hover {
+ border-color: var(--accent);
+ background: var(--hover);
+ }
+
+ .card:active {
+ transform: scale(0.98);
+ }
+
+ /* Brand card */
+ .card-brand {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+
+ .card-brand .cb-name {
+ font-weight: 700;
+ font-size: 0.95rem;
+ }
+
+ .card-brand .cb-count {
+ font-size: 0.7rem;
+ color: var(--text2);
+ font-family: 'JetBrains Mono', monospace;
+ }
+
+ /* Model card */
+ .card-model {
+ display: flex;
+ flex-direction: column;
+ gap: 0.3rem;
+ }
+
+ .card-model .cm-name {
+ font-weight: 700;
+ font-size: 1rem;
+ }
+
+ .card-model .cm-years {
+ font-size: 0.75rem;
+ color: var(--text2);
+ }
+
+ .card-model .cm-count {
+ font-size: 0.7rem;
+ color: var(--text2);
+ font-family: 'JetBrains Mono', monospace;
+ }
+
+ /* Vehicle row */
+ .card-vehicle {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 1rem;
+ }
+
+ .cv-main {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ }
+
+ .cv-year {
+ font-family: 'Outfit', sans-serif;
+ font-weight: 700;
+ font-size: 1.1rem;
+ color: var(--accent);
+ min-width: 50px;
+ }
+
+ .cv-engine {
+ font-weight: 600;
+ font-size: 0.9rem;
+ }
+
+ .cv-details {
+ font-size: 0.75rem;
+ color: var(--text2);
+ }
+
+ .cv-trim {
+ font-size: 0.7rem;
+ color: var(--info);
+ background: rgba(59, 130, 246, 0.1);
+ padding: 0.15rem 0.5rem;
+ border-radius: 4px;
+ }
+
+ /* Category card */
+ .card-category {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+
+ .cc-name {
+ font-weight: 600;
+ font-size: 0.9rem;
+ }
+
+ .cc-count {
+ font-size: 0.7rem;
+ color: var(--text2);
+ font-family: 'JetBrains Mono', monospace;
+ }
+
+ /* Group header */
+ .group-header {
+ padding: 0.6rem 0;
+ margin-top: 0.5rem;
+ border-bottom: 1px solid var(--border);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ .group-header .gh-name {
+ font-weight: 700;
+ font-size: 0.9rem;
+ color: var(--accent);
+ }
+
+ .group-header .gh-count {
+ font-size: 0.7rem;
+ color: var(--text2);
+ }
+
+ /* Part row */
+ .part-row {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ padding: 0.5rem 0.6rem;
+ border-bottom: 1px solid rgba(42, 42, 58, 0.4);
+ transition: background 0.15s;
+ }
+
+ .part-row:hover {
+ background: var(--hover);
+ border-radius: 6px;
+ }
+
+ .part-oem {
+ font-family: 'JetBrains Mono', monospace;
+ font-weight: 700;
+ font-size: 0.9rem;
+ color: var(--accent);
+ min-width: 160px;
+ }
+
+ .part-name {
+ font-size: 0.85rem;
+ flex: 1;
+ }
+
+ .part-pos {
+ font-size: 0.7rem;
+ color: var(--text2);
+ }
+
+ .part-qty {
+ font-size: 0.7rem;
+ color: var(--text2);
+ font-family: 'JetBrains Mono', monospace;
+ min-width: 40px;
+ text-align: right;
+ }
+
+ /* --- Loading / Empty --- */
+ .loading, .empty {
+ text-align: center;
+ padding: 3rem 1rem;
+ color: var(--text2);
+ font-size: 0.9rem;
+ }
+
+ /* --- Responsive --- */
+ @media (max-width: 768px) {
+ .header-search { display: none; }
+ .grid-brands { grid-template-columns: repeat(2, 1fr); }
+ .main { padding: 4rem 0.8rem 1.5rem; }
+ .part-oem { min-width: 120px; font-size: 0.8rem; }
+ }
+
+ /* --- Part row clickable --- */
+ .part-row {
+ cursor: pointer;
+ }
+
+ /* --- Modal overlay --- */
+ .modal-bg {
+ position: fixed;
+ top: 0; left: 0; right: 0; bottom: 0;
+ background: rgba(0, 0, 0, 0.7);
+ backdrop-filter: blur(6px);
+ -webkit-backdrop-filter: blur(6px);
+ z-index: 500;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity 0.25s;
+ }
+
+ .modal-bg.open {
+ opacity: 1;
+ pointer-events: auto;
+ }
+
+ .modal {
+ background: var(--card);
+ border: 1px solid var(--border);
+ border-radius: 14px;
+ width: 600px;
+ max-width: 95vw;
+ max-height: 85vh;
+ overflow-y: auto;
+ transform: translateY(12px) scale(0.97);
+ transition: transform 0.25s;
+ }
+
+ .modal-bg.open .modal {
+ transform: translateY(0) scale(1);
+ }
+
+ /* Modal header */
+ .modal-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ padding: 1.2rem 1.2rem 0.8rem;
+ border-bottom: 1px solid var(--border);
+ }
+
+ .modal-head-info {
+ flex: 1;
+ min-width: 0;
+ }
+
+ .modal-oem {
+ font-family: 'JetBrains Mono', monospace;
+ font-weight: 700;
+ font-size: 1.2rem;
+ color: var(--accent);
+ word-break: break-all;
+ }
+
+ .modal-part-name {
+ font-size: 0.95rem;
+ margin-top: 0.2rem;
+ }
+
+ .modal-close {
+ background: none;
+ border: none;
+ color: var(--text2);
+ font-size: 1.4rem;
+ cursor: pointer;
+ padding: 0.2rem 0.4rem;
+ border-radius: 6px;
+ transition: background 0.15s, color 0.15s;
+ flex-shrink: 0;
+ margin-left: 0.5rem;
+ }
+
+ .modal-close:hover {
+ background: var(--hover);
+ color: var(--text);
+ }
+
+ /* Modal detail fields */
+ .modal-fields {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 0.5rem;
+ padding: 0.8rem 1.2rem;
+ }
+
+ .mf {
+ display: flex;
+ flex-direction: column;
+ gap: 0.1rem;
+ }
+
+ .mf-label {
+ font-size: 0.65rem;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ color: var(--text2);
+ font-weight: 600;
+ }
+
+ .mf-value {
+ font-size: 0.85rem;
+ font-weight: 500;
+ }
+
+ /* Modal sections */
+ .modal-section {
+ padding: 0.8rem 1.2rem;
+ border-top: 1px solid var(--border);
+ }
+
+ .modal-section-title {
+ font-family: 'DM Sans', sans-serif;
+ font-size: 0.75rem;
+ font-weight: 700;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ color: var(--accent);
+ margin-bottom: 0.6rem;
+ }
+
+ /* Alternatives table */
+ .alt-table {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 0.8rem;
+ }
+
+ .alt-table th {
+ text-align: left;
+ padding: 0.35rem 0.5rem;
+ border-bottom: 1px solid var(--border);
+ color: var(--text2);
+ font-size: 0.7rem;
+ text-transform: uppercase;
+ font-weight: 600;
+ }
+
+ .alt-table td {
+ padding: 0.4rem 0.5rem;
+ border-bottom: 1px solid rgba(42, 42, 58, 0.4);
+ }
+
+ .alt-table .alt-pn {
+ font-family: 'JetBrains Mono', monospace;
+ font-weight: 600;
+ color: var(--info);
+ }
+
+ .alt-table .alt-mfr {
+ font-weight: 600;
+ }
+
+ .alt-quality {
+ font-size: 0.65rem;
+ font-weight: 600;
+ padding: 0.12rem 0.4rem;
+ border-radius: 4px;
+ text-transform: uppercase;
+ }
+
+ .alt-quality.premium { background: rgba(34, 197, 94, 0.15); color: var(--success); }
+ .alt-quality.economy { background: rgba(245, 158, 11, 0.15); color: #f59e0b; }
+ .alt-quality.oem { background: rgba(59, 130, 246, 0.15); color: var(--info); }
+
+ /* Cross-ref rows */
+ .xref-row {
+ display: flex;
+ align-items: center;
+ gap: 0.8rem;
+ padding: 0.35rem 0;
+ border-bottom: 1px solid rgba(42, 42, 58, 0.3);
+ }
+
+ .xref-row:last-child { border-bottom: none; }
+
+ .xref-number {
+ font-family: 'JetBrains Mono', monospace;
+ font-weight: 600;
+ font-size: 0.85rem;
+ color: var(--text);
+ }
+
+ .xref-type {
+ font-size: 0.65rem;
+ font-weight: 600;
+ padding: 0.1rem 0.35rem;
+ border-radius: 3px;
+ background: rgba(255, 107, 53, 0.12);
+ color: var(--accent);
+ text-transform: uppercase;
+ }
+
+ .xref-source {
+ font-size: 0.75rem;
+ color: var(--text2);
+ }
+
+ .modal-empty {
+ text-align: center;
+ padding: 1rem;
+ color: var(--text2);
+ font-size: 0.8rem;
+ }
+
+ .modal-loading {
+ text-align: center;
+ padding: 0.8rem;
+ color: var(--text2);
+ font-size: 0.8rem;
+ }
+
+ /* --- Region Filter --- */
+ .region-bar {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ margin-bottom: 1rem;
+ flex-wrap: wrap;
+ }
+
+ .region-label {
+ font-size: 0.75rem;
+ color: var(--text2);
+ text-transform: uppercase;
+ letter-spacing: 0.06em;
+ font-weight: 600;
+ margin-right: 0.3rem;
+ }
+
+ .region-chip {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.35rem;
+ padding: 0.35rem 0.75rem;
+ border-radius: 8px;
+ border: 1px solid var(--border);
+ background: var(--card);
+ color: var(--text2);
+ font-size: 0.8rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.2s;
+ user-select: none;
+ }
+
+ .region-chip:hover {
+ border-color: var(--accent);
+ color: var(--text);
+ }
+
+ .region-chip.active {
+ background: rgba(255, 107, 53, 0.15);
+ border-color: var(--accent);
+ color: var(--accent);
+ }
+
+ .region-chip .rc-flag {
+ font-size: 1rem;
+ line-height: 1;
+ }
+
+ /* --- Animations --- */
+ @keyframes fadeUp {
+ from { opacity: 0; transform: translateY(6px); }
+ to { opacity: 1; transform: translateY(0); }
+ }
+
+ .card, .part-row, .group-header {
+ animation: fadeUp 0.3s ease both;
+ }
diff --git a/dashboard/demo.html b/dashboard/demo.html
index c6e7296..35cf1e0 100644
--- a/dashboard/demo.html
+++ b/dashboard/demo.html
@@ -5,715 +5,7 @@
NEXUS AUTOPARTS — Catálogo OEM
-
+