Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>AV Solutions Knowledge Base</title> | |
| <script src="https://cdn.tailwindcss.com"></script> | |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> | |
| <style> | |
| .solution-card:hover { | |
| transform: translateY(-5px); | |
| box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1); | |
| } | |
| .sidebar { | |
| transition: all 0.3s ease; | |
| } | |
| .sidebar.collapsed { | |
| width: 70px; | |
| } | |
| .sidebar.collapsed .sidebar-text { | |
| display: none; | |
| } | |
| .sidebar.collapsed .sidebar-icon { | |
| margin-right: 0; | |
| } | |
| .sidebar-toggle { | |
| transition: transform 0.3s ease; | |
| } | |
| .sidebar.collapsed .sidebar-toggle { | |
| transform: rotate(180deg); | |
| } | |
| .fade-in { | |
| animation: fadeIn 0.3s ease-in-out; | |
| } | |
| @keyframes fadeIn { | |
| from { opacity: 0; } | |
| to { opacity: 1; } | |
| } | |
| .markdown-content h2 { | |
| font-size: 1.5rem; | |
| font-weight: 600; | |
| margin-top: 1.5rem; | |
| margin-bottom: 1rem; | |
| color: #1e40af; | |
| } | |
| .markdown-content h3 { | |
| font-size: 1.25rem; | |
| font-weight: 600; | |
| margin-top: 1.25rem; | |
| margin-bottom: 0.75rem; | |
| color: #1e40af; | |
| } | |
| .markdown-content p { | |
| margin-bottom: 1rem; | |
| line-height: 1.6; | |
| } | |
| .markdown-content ul, .markdown-content ol { | |
| margin-bottom: 1rem; | |
| padding-left: 1.5rem; | |
| } | |
| .markdown-content ul { | |
| list-style-type: disc; | |
| } | |
| .markdown-content ol { | |
| list-style-type: decimal; | |
| } | |
| .markdown-content pre { | |
| background-color: #f3f4f6; | |
| padding: 1rem; | |
| border-radius: 0.5rem; | |
| overflow-x: auto; | |
| margin-bottom: 1rem; | |
| } | |
| .markdown-content code { | |
| background-color: #f3f4f6; | |
| padding: 0.2rem 0.4rem; | |
| border-radius: 0.25rem; | |
| font-family: monospace; | |
| } | |
| .markdown-content blockquote { | |
| border-left: 4px solid #3b82f6; | |
| padding-left: 1rem; | |
| margin-left: 0; | |
| color: #4b5563; | |
| font-style: italic; | |
| } | |
| .editor-toolbar { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 0.5rem; | |
| padding: 0.5rem; | |
| background-color: #f3f4f6; | |
| border-radius: 0.5rem 0.5rem 0 0; | |
| border: 1px solid #e5e7eb; | |
| border-bottom: none; | |
| } | |
| .editor-toolbar button { | |
| background-color: white; | |
| border: 1px solid #d1d5db; | |
| border-radius: 0.25rem; | |
| padding: 0.25rem 0.5rem; | |
| cursor: pointer; | |
| font-size: 0.875rem; | |
| } | |
| .editor-toolbar button:hover { | |
| background-color: #f9fafb; | |
| } | |
| #solutionContent { | |
| min-height: 300px; | |
| border: 1px solid #e5e7eb; | |
| border-radius: 0 0 0.5rem 0.5rem; | |
| padding: 1rem; | |
| background-color: white; | |
| } | |
| .tag-input { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 0.5rem; | |
| align-items: center; | |
| padding: 0.5rem; | |
| border: 1px solid #e5e7eb; | |
| border-radius: 0.5rem; | |
| min-height: 42px; | |
| } | |
| .tag { | |
| background-color: #e0e7ff; | |
| color: #1e40af; | |
| padding: 0.25rem 0.5rem; | |
| border-radius: 9999px; | |
| font-size: 0.75rem; | |
| display: flex; | |
| align-items: center; | |
| } | |
| .tag-remove { | |
| margin-left: 0.25rem; | |
| cursor: pointer; | |
| } | |
| .equipment-item { | |
| display: flex; | |
| align-items: center; | |
| padding: 0.5rem; | |
| border-bottom: 1px solid #e5e7eb; | |
| } | |
| .equipment-item:last-child { | |
| border-bottom: none; | |
| } | |
| .equipment-selector { | |
| max-height: 300px; | |
| overflow-y: auto; | |
| } | |
| .equipment-selector-item { | |
| padding: 0.5rem; | |
| cursor: pointer; | |
| border-bottom: 1px solid #e5e7eb; | |
| } | |
| .equipment-selector-item:hover { | |
| background-color: #f3f4f6; | |
| } | |
| .equipment-selector-item:last-child { | |
| border-bottom: none; | |
| } | |
| .equipment-selector-item.selected { | |
| background-color: #e0e7ff; | |
| } | |
| .markdown-preview { | |
| border: 1px solid #e5e7eb; | |
| border-radius: 0.5rem; | |
| padding: 1rem; | |
| background-color: white; | |
| min-height: 300px; | |
| } | |
| </style> | |
| </head> | |
| <body class="bg-gray-50"> | |
| <div class="flex h-screen overflow-hidden"> | |
| <!-- Sidebar --> | |
| <div class="sidebar bg-blue-900 text-white w-64 flex flex-col"> | |
| <div class="p-4 flex items-center justify-between border-b border-blue-800"> | |
| <div class="flex items-center"> | |
| <i class="fas fa-video sidebar-icon text-xl mr-3"></i> | |
| <span class="sidebar-text font-bold text-xl">AV Solutions KB</span> | |
| </div> | |
| <button id="sidebarToggle" class="sidebar-toggle text-white focus:outline-none"> | |
| <i class="fas fa-chevron-left"></i> | |
| </button> | |
| </div> | |
| <div class="p-4 border-b border-blue-800"> | |
| <div class="relative"> | |
| <input type="text" placeholder="Search solutions..." class="w-full bg-blue-800 text-white placeholder-blue-300 rounded py-2 px-4 pl-10 focus:outline-none focus:ring-2 focus:ring-blue-500"> | |
| <i class="fas fa-search absolute left-3 top-3 text-blue-300"></i> | |
| </div> | |
| </div> | |
| <nav class="flex-1 overflow-y-auto"> | |
| <div class="p-2"> | |
| <div class="sidebar-item group"> | |
| <a href="#" class="flex items-center p-2 text-blue-100 hover:bg-blue-800 rounded transition" data-section="dashboard"> | |
| <i class="fas fa-tachometer-alt sidebar-icon mr-3"></i> | |
| <span class="sidebar-text">Dashboard</span> | |
| </a> | |
| </div> | |
| <div class="sidebar-item group"> | |
| <a href="#" class="flex items-center p-2 text-blue-100 hover:bg-blue-800 rounded transition" data-section="solutions"> | |
| <i class="fas fa-lightbulb sidebar-icon mr-3"></i> | |
| <span class="sidebar-text">All Solutions</span> | |
| </a> | |
| </div> | |
| <div class="sidebar-item group"> | |
| <a href="#" class="flex items-center p-2 text-blue-100 hover:bg-blue-800 rounded transition" data-section="categories"> | |
| <i class="fas fa-folder sidebar-icon mr-3"></i> | |
| <span class="sidebar-text">Categories</span> | |
| </a> | |
| </div> | |
| <div class="sidebar-item group"> | |
| <a href="#" class="flex items-center p-2 text-blue-100 hover:bg-blue-800 rounded transition" data-section="equipment"> | |
| <i class="fas fa-microchip sidebar-icon mr-3"></i> | |
| <span class="sidebar-text">Equipment Database</span> | |
| </a> | |
| </div> | |
| <div class="sidebar-item group"> | |
| <a href="#" class="flex items-center p-2 text-blue-100 hover:bg-blue-800 rounded transition" data-section="vendors"> | |
| <i class="fas fa-building sidebar-icon mr-3"></i> | |
| <span class="sidebar-text">Vendors</span> | |
| </a> | |
| </div> | |
| <div class="sidebar-item group"> | |
| <a href="#" class="flex items-center p-2 text-blue-100 hover:bg-blue-800 rounded transition" data-section="projects"> | |
| <i class="fas fa-project-diagram sidebar-icon mr-3"></i> | |
| <span class="sidebar-text">Project References</span> | |
| </a> | |
| </div> | |
| </div> | |
| <div class="p-4 border-t border-blue-800"> | |
| <h3 class="sidebar-text text-xs uppercase text-blue-400 mb-2">Quick Filters</h3> | |
| <div class="space-y-1"> | |
| <a href="#" class="flex items-center p-2 text-blue-100 hover:bg-blue-800 rounded transition" data-filter="recent"> | |
| <i class="fas fa-clock sidebar-icon mr-3"></i> | |
| <span class="sidebar-text">Recently Added</span> | |
| </a> | |
| <a href="#" class="flex items-center p-2 text-blue-100 hover:bg-blue-800 rounded transition" data-filter="popular"> | |
| <i class="fas fa-fire sidebar-icon mr-3"></i> | |
| <span class="sidebar-text">Most Viewed</span> | |
| </a> | |
| <a href="#" class="flex items-center p-2 text-blue-100 hover:bg-blue-800 rounded transition" data-filter="favorites"> | |
| <i class="fas fa-star sidebar-icon mr-3"></i> | |
| <span class="sidebar-text">Favorites</span> | |
| </a> | |
| </div> | |
| </div> | |
| </nav> | |
| <div class="p-4 border-t border-blue-800"> | |
| <div class="flex items-center"> | |
| <img src="https://ui-avatars.com/api/?name=AV+Tech&background=3b82f6&color=fff" alt="User" class="w-8 h-8 rounded-full"> | |
| <div class="ml-3 sidebar-text"> | |
| <div class="text-sm font-medium">AV Technician</div> | |
| <div class="text-xs text-blue-300">Admin</div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Main Content --> | |
| <div class="flex-1 overflow-auto"> | |
| <!-- Header --> | |
| <header class="bg-white shadow-sm"> | |
| <div class="px-6 py-4 flex justify-between items-center"> | |
| <h1 class="text-2xl font-semibold text-gray-800" id="pageTitle">Dashboard</h1> | |
| <div class="flex items-center space-x-4"> | |
| <button id="newSolutionBtn" class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md flex items-center transition"> | |
| <i class="fas fa-plus mr-2"></i> | |
| <span>New Solution</span> | |
| </button> | |
| <button class="text-gray-600 hover:text-gray-900"> | |
| <i class="fas fa-bell"></i> | |
| </button> | |
| <button class="text-gray-600 hover:text-gray-900"> | |
| <i class="fas fa-cog"></i> | |
| </button> | |
| </div> | |
| </div> | |
| </header> | |
| <!-- Main Content Area --> | |
| <main class="p-6"> | |
| <!-- Dashboard Section --> | |
| <div id="dashboardSection" class="section-content fade-in"> | |
| <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-6"> | |
| <div class="bg-white rounded-lg shadow p-6"> | |
| <div class="flex items-center"> | |
| <div class="p-3 rounded-full bg-blue-100 text-blue-600 mr-4"> | |
| <i class="fas fa-lightbulb text-xl"></i> | |
| </div> | |
| <div> | |
| <p class="text-gray-500">Total Solutions</p> | |
| <h3 class="text-2xl font-bold">248</h3> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="bg-white rounded-lg shadow p-6"> | |
| <div class="flex items-center"> | |
| <div class="p-3 rounded-full bg-green-100 text-green-600 mr-4"> | |
| <i class="fas fa-check-circle text-xl"></i> | |
| </div> | |
| <div> | |
| <p class="text-gray-500">Verified Solutions</p> | |
| <h3 class="text-2xl font-bold">187</h3> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="bg-white rounded-lg shadow p-6"> | |
| <div class="flex items-center"> | |
| <div class="p-3 rounded-full bg-yellow-100 text-yellow-600 mr-4"> | |
| <i class="fas fa-exclamation-triangle text-xl"></i> | |
| </div> | |
| <div> | |
| <p class="text-gray-500">Needs Review</p> | |
| <h3 class="text-2xl font-bold">12</h3> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="bg-white rounded-lg shadow p-6"> | |
| <div class="flex items-center"> | |
| <div class="p-3 rounded-full bg-purple-100 text-purple-600 mr-4"> | |
| <i class="fas fa-users text-xl"></i> | |
| </div> | |
| <div> | |
| <p class="text-gray-500">Active Users</p> | |
| <h3 class="text-2xl font-bold">24</h3> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-6"> | |
| <div class="bg-white rounded-lg shadow p-6 lg:col-span-2"> | |
| <div class="flex justify-between items-center mb-4"> | |
| <h2 class="text-lg font-semibold">Recent Solutions</h2> | |
| <a href="#" class="text-blue-600 hover:text-blue-800 text-sm">View All</a> | |
| </div> | |
| <div class="space-y-4"> | |
| <div class="border-b pb-4"> | |
| <div class="flex justify-between items-start"> | |
| <div> | |
| <h3 class="font-medium">Conference Room DSP Configuration</h3> | |
| <p class="text-sm text-gray-500">Added 2 days ago by John D.</p> | |
| </div> | |
| <span class="bg-green-100 text-green-800 text-xs px-2 py-1 rounded">Verified</span> | |
| </div> | |
| </div> | |
| <div class="border-b pb-4"> | |
| <div class="flex justify-between items-start"> | |
| <div> | |
| <h3 class="font-medium">Digital Signage Network Setup</h3> | |
| <p class="text-sm text-gray-500">Added 4 days ago by Sarah M.</p> | |
| </div> | |
| <span class="bg-yellow-100 text-yellow-800 text-xs px-2 py-1 rounded">Needs Review</span> | |
| </div> | |
| </div> | |
| <div class="border-b pb-4"> | |
| <div class="flex justify-between items-start"> | |
| <div> | |
| <h3 class="font-medium">HDMI over IP for Large Venues</h3> | |
| <p class="text-sm text-gray-500">Added 1 week ago by Mike T.</p> | |
| </div> | |
| <span class="bg-green-100 text-green-800 text-xs px-2 py-1 rounded">Verified</span> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="bg-white rounded-lg shadow p-6"> | |
| <div class="flex justify-between items-center mb-4"> | |
| <h2 class="text-lg font-semibold">Top Categories</h2> | |
| <a href="#" class="text-blue-600 hover:text-blue-800 text-sm">View All</a> | |
| </div> | |
| <div class="space-y-3"> | |
| <div> | |
| <div class="flex justify-between text-sm mb-1"> | |
| <span>Conference Systems</span> | |
| <span>42 solutions</span> | |
| </div> | |
| <div class="w-full bg-gray-200 rounded-full h-2"> | |
| <div class="bg-blue-600 h-2 rounded-full" style="width: 45%"></div> | |
| </div> | |
| </div> | |
| <div> | |
| <div class="flex justify-between text-sm mb-1"> | |
| <span>Digital Signage</span> | |
| <span>38 solutions</span> | |
| </div> | |
| <div class="w-full bg-gray-200 rounded-full h-2"> | |
| <div class="bg-blue-600 h-2 rounded-full" style="width: 40%"></div> | |
| </div> | |
| </div> | |
| <div> | |
| <div class="flex justify-between text-sm mb-1"> | |
| <span>Control Systems</span> | |
| <span>35 solutions</span> | |
| </div> | |
| <div class="w-full bg-gray-200 rounded-full h-2"> | |
| <div class="bg-blue-600 h-2 rounded-full" style="width: 38%"></div> | |
| </div> | |
| </div> | |
| <div> | |
| <div class="flex justify-between text-sm mb-1"> | |
| <span>Video Distribution</span> | |
| <span>28 solutions</span> | |
| </div> | |
| <div class="w-full bg-gray-200 rounded-full h-2"> | |
| <div class="bg-blue-600 h-2 rounded-full" style="width: 30%"></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="bg-white rounded-lg shadow p-6 mb-6"> | |
| <div class="flex justify-between items-center mb-4"> | |
| <h2 class="text-lg font-semibold">Activity Feed</h2> | |
| <a href="#" class="text-blue-600 hover:text-blue-800 text-sm">View All</a> | |
| </div> | |
| <div class="space-y-4"> | |
| <div class="flex items-start"> | |
| <img src="https://ui-avatars.com/api/?name=John+Doe&background=3b82f6&color=fff" alt="User" class="w-10 h-10 rounded-full mr-3"> | |
| <div class="flex-1"> | |
| <div class="flex items-center"> | |
| <span class="font-medium">John Doe</span> | |
| <span class="text-gray-500 text-sm ml-2">2 hours ago</span> | |
| </div> | |
| <p class="text-gray-700">Updated the <a href="#" class="text-blue-600">"Boardroom AV Control"</a> solution with new Crestron programming details</p> | |
| </div> | |
| </div> | |
| <div class="flex items-start"> | |
| <img src="https://ui-avatars.com/api/?name=Sarah+M&background=3b82f6&color=fff" alt="User" class="w-10 h-10 rounded-full mr-3"> | |
| <div class="flex-1"> | |
| <div class="flex items-center"> | |
| <span class="font-medium">Sarah M.</span> | |
| <span class="text-gray-500 text-sm ml-2">5 hours ago</span> | |
| </div> | |
| <p class="text-gray-700">Added a new solution: <a href="#" class="text-blue-600">"Digital Signage Network Setup for Retail"</a></p> | |
| </div> | |
| </div> | |
| <div class="flex items-start"> | |
| <img src="https://ui-avatars.com/api/?name=Mike+T&background=3b82f6&color=fff" alt="User" class="w-10 h-10 rounded-full mr-3"> | |
| <div class="flex-1"> | |
| <div class="flex items-center"> | |
| <span class="font-medium">Mike T.</span> | |
| <span class="text-gray-500 text-sm ml-2">1 day ago</span> | |
| </div> | |
| <p class="text-gray-700">Verified the <a href="#" class="text-blue-600">"HDMI over IP for Large Venues"</a> solution after successful deployment</p> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Solutions Section --> | |
| <div id="solutionsSection" class="section-content hidden fade-in"> | |
| <div class="flex justify-between items-center mb-6"> | |
| <h2 class="text-2xl font-semibold">All Solutions</h2> | |
| <div class="flex space-x-3"> | |
| <div class="relative"> | |
| <select class="appearance-none bg-white border border-gray-300 rounded-md py-2 pl-3 pr-8 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"> | |
| <option>Filter by Category</option> | |
| <option>Conference Systems</option> | |
| <option>Digital Signage</option> | |
| <option>Control Systems</option> | |
| <option>Video Distribution</option> | |
| </select> | |
| <div class="pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-gray-700"> | |
| <i class="fas fa-chevron-down text-xs"></i> | |
| </div> | |
| </div> | |
| <div class="relative"> | |
| <select class="appearance-none bg-white border border-gray-300 rounded-md py-2 pl-3 pr-8 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"> | |
| <option>Sort by</option> | |
| <option>Recently Added</option> | |
| <option>Most Viewed</option> | |
| <option>Alphabetical</option> | |
| </select> | |
| <div class="pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-gray-700"> | |
| <i class="fas fa-chevron-down text-xs"></i> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"> | |
| <!-- Solution Card 1 --> | |
| <div class="solution-card bg-white rounded-lg shadow overflow-hidden transition duration-300"> | |
| <div class="p-5"> | |
| <div class="flex justify-between items-start mb-3"> | |
| <span class="bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded">Conference Systems</span> | |
| <button class="text-gray-400 hover:text-yellow-500"> | |
| <i class="far fa-star"></i> | |
| </button> | |
| </div> | |
| <h3 class="text-lg font-semibold mb-2">Boardroom AV Control</h3> | |
| <p class="text-gray-600 text-sm mb-4">Complete control system configuration for executive boardrooms using Crestron and Biamp.</p> | |
| <div class="flex items-center text-sm text-gray-500"> | |
| <i class="fas fa-user mr-1"></i> | |
| <span class="mr-3">John D.</span> | |
| <i class="fas fa-calendar-alt mr-1"></i> | |
| <span>2 weeks ago</span> | |
| </div> | |
| </div> | |
| <div class="bg-gray-50 px-5 py-3 flex justify-between items-center border-t"> | |
| <div class="flex space-x-2"> | |
| <span class="bg-green-100 text-green-800 text-xs px-2 py-1 rounded flex items-center"> | |
| <i class="fas fa-check-circle mr-1"></i> | |
| Verified | |
| </span> | |
| <span class="bg-gray-100 text-gray-800 text-xs px-2 py-1 rounded flex items-center"> | |
| <i class="fas fa-eye mr-1"></i> | |
| 24 | |
| </span> | |
| </div> | |
| <a href="#" class="text-blue-600 hover:text-blue-800 text-sm font-medium">View Details</a> | |
| </div> | |
| </div> | |
| <!-- Solution Card 2 --> | |
| <div class="solution-card bg-white rounded-lg shadow overflow-hidden transition duration-300"> | |
| <div class="p-5"> | |
| <div class="flex justify-between items-start mb-3"> | |
| <span class="bg-purple-100 text-purple-800 text-xs px-2 py-1 rounded">Digital Signage</span> | |
| <button class="text-yellow-400 hover:text-yellow-500"> | |
| <i class="fas fa-star"></i> | |
| </button> | |
| </div> | |
| <h3 class="text-lg font-semibold mb-2">Retail Digital Signage Network</h3> | |
| <p class="text-gray-600 text-sm mb-4">Scalable digital signage solution for retail environments using BrightSign players and cloud management.</p> | |
| <div class="flex items-center text-sm text-gray-500"> | |
| <i class="fas fa-user mr-1"></i> | |
| <span class="mr-3">Sarah M.</span> | |
| <i class="fas fa-calendar-alt mr-1"></i> | |
| <span>1 month ago</span> | |
| </div> | |
| </div> | |
| <div class="bg-gray-50 px-5 py-3 flex justify-between items-center border-t"> | |
| <div class="flex space-x-2"> | |
| <span class="bg-green-100 text-green-800 text-xs px-2 py-1 rounded flex items-center"> | |
| <i class="fas fa-check-circle mr-1"></i> | |
| Verified | |
| </span> | |
| <span class="bg-gray-100 text-gray-800 text-xs px-2 py-1 rounded flex items-center"> | |
| <i class="fas fa-eye mr-1"></i> | |
| 42 | |
| </span> | |
| </div> | |
| <a href="#" class="text-blue-600 hover:text-blue-800 text-sm font-medium">View Details</a> | |
| </div> | |
| </div> | |
| <!-- Solution Card 3 --> | |
| <div class="solution-card bg-white rounded-lg shadow overflow-hidden transition duration-300"> | |
| <div class="p-5"> | |
| <div class="flex justify-between items-start mb-3"> | |
| <span class="bg-yellow-100 text-yellow-800 text-xs px-2 py-1 rounded">Video Distribution</span> | |
| <button class="text-gray-400 hover:text-yellow-500"> | |
| <i class="far fa-star"></i> | |
| </button> | |
| </div> | |
| <h3 class="text-lg font-semibold mb-2">HDMI over IP for Large Venues</h3> | |
| <p class="text-gray-600 text-sm mb-4">Reliable video distribution solution for stadiums and large venues using AV over IP technology.</p> | |
| <div class="flex items-center text-sm text-gray-500"> | |
| <i class="fas fa-user mr-1"></i> | |
| <span class="mr-3">Mike T.</span> | |
| <i class="fas fa-calendar-alt mr-1"></i> | |
| <span>3 weeks ago</span> | |
| </div> | |
| </div> | |
| <div class="bg-gray-50 px-5 py-3 flex justify-between items-center border-t"> | |
| <div class="flex space-x-2"> | |
| <span class="bg-green-100 text-green-800 text-xs px-2 py-1 rounded flex items-center"> | |
| <i class="fas fa-check-circle mr-1"></i> | |
| Verified | |
| </span> | |
| <span class="bg-gray-100 text-gray-800 text-xs px-2 py-1 rounded flex items-center"> | |
| <i class="fas fa-eye mr-1"></i> | |
| 18 | |
| </span> | |
| </div> | |
| <a href="#" class="text-blue-600 hover:text-blue-800 text-sm font-medium">View Details</a> | |
| </div> | |
| </div> | |
| <!-- Solution Card 4 --> | |
| <div class="solution-card bg-white rounded-lg shadow overflow-hidden transition duration-300"> | |
| <div class="p-5"> | |
| <div class="flex justify-between items-start mb-3"> | |
| <span class="bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded">Conference Systems</span> | |
| <button class="text-gray-400 hover:text-yellow-500"> | |
| <i class="far fa-star"></i> | |
| </button> | |
| </div> | |
| <h3 class="text-lg font-semibold mb-2">Zoom Room Standard Configuration</h3> | |
| <p class="text-gray-600 text-sm mb-4">Optimal setup for Zoom Rooms with Logitech Tap and DSP integration for medium-sized meeting rooms.</p> | |
| <div class="flex items-center text-sm text-gray-500"> | |
| <i class="fas fa-user mr-1"></i> | |
| <span class="mr-3">Alex K.</span> | |
| <i class="fas fa-calendar-alt mr-1"></i> | |
| <span>5 days ago</span> | |
| </div> | |
| </div> | |
| <div class="bg-gray-50 px-5 py-3 flex justify-between items-center border-t"> | |
| <div class="flex space-x-2"> | |
| <span class="bg-yellow-100 text-yellow-800 text-xs px-2 py-1 rounded flex items-center"> | |
| <i class="fas fa-exclamation-circle mr-1"></i> | |
| Needs Review | |
| </span> | |
| <span class="bg-gray-100 text-gray-800 text-xs px-2 py-1 rounded flex items-center"> | |
| <i class="fas fa-eye mr-1"></i> | |
| 8 | |
| </span> | |
| </div> | |
| <a href="#" class="text-blue-600 hover:text-blue-800 text-sm font-medium">View Details</a> | |
| </div> | |
| </div> | |
| <!-- Solution Card 5 --> | |
| <div class="solution-card bg-white rounded-lg shadow overflow-hidden transition duration-300"> | |
| <div class="p-5"> | |
| <div class="flex justify-between items-start mb-3"> | |
| <span class="bg-red-100 text-red-800 text-xs px-2 py-1 rounded">Control Systems</span> | |
| <button class="text-yellow-400 hover:text-yellow-500"> | |
| <i class="fas fa-star"></i> | |
| </button> | |
| </div> | |
| <h3 class="text-lg font-semibold mb-2">Crestron Home Automation</h3> | |
| <p class="text-gray-600 text-sm mb-4">Residential automation solution integrating lighting, shades, AV and climate control with Crestron.</p> | |
| <div class="flex items-center text-sm text-gray-500"> | |
| <i class="fas fa-user mr-1"></i> | |
| <span class="mr-3">Lisa P.</span> | |
| <i class="fas fa-calendar-alt mr-1"></i> | |
| <span>2 months ago</span> | |
| </div> | |
| </div> | |
| <div class="bg-gray-50 px-5 py-3 flex justify-between items-center border-t"> | |
| <div class="flex space-x-2"> | |
| <span class="bg-green-100 text-green-800 text-xs px-2 py-1 rounded flex items-center"> | |
| <i class="fas fa-check-circle mr-1"></i> | |
| Verified | |
| </span> | |
| <span class="bg-gray-100 text-gray-800 text-xs px-2 py-1 rounded flex items-center"> | |
| <i class="fas fa-eye mr-1"></i> | |
| 36 | |
| </span> | |
| </div> | |
| <a href="#" class="text-blue-600 hover:text-blue-800 text-sm font-medium">View Details</a> | |
| </div> | |
| </div> | |
| <!-- Solution Card 6 --> | |
| <div class="solution-card bg-white rounded-lg shadow overflow-hidden transition duration-300"> | |
| <div class="p-5"> | |
| <div class="flex justify-between items-start mb-3"> | |
| <span class="bg-green-100 text-green-800 text-xs px-2 py-1 rounded">Audio Systems</span> | |
| <button class="text-gray-400 hover:text-yellow-500"> | |
| <i class="far fa-star"></i> | |
| </button> | |
| </div> | |
| <h3 class="text-lg font-semibold mb-2">Dante Audio Network Setup</h3> | |
| <p class="text-gray-600 text-sm mb-4">Best practices for configuring Dante networks in corporate environments with Yamaha and Shure equipment.</p> | |
| <div class="flex items-center text-sm text-gray-500"> | |
| <i class="fas fa-user mr-1"></i> | |
| <span class="mr-3">Tom R.</span> | |
| <i class="fas fa-calendar-alt mr-1"></i> | |
| <span>3 months ago</span> | |
| </div> | |
| </div> | |
| <div class="bg-gray-50 px-5 py-3 flex justify-between items-center border-t"> | |
| <div class="flex space-x-2"> | |
| <span class="bg-green-100 text-green-800 text-xs px-2 py-1 rounded flex items-center"> | |
| <i class="fas fa-check-circle mr-1"></i> | |
| Verified | |
| </span> | |
| <span class="bg-gray-100 text-gray-800 text-xs px-2 py-1 rounded flex items-center"> | |
| <i class="fas fa-eye mr-1"></i> | |
| 29 | |
| </span> | |
| </div> | |
| <a href="#" class="text-blue-600 hover:text-blue-800 text-sm font-medium">View Details</a> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="mt-6 flex justify-center"> | |
| <nav class="inline-flex rounded-md shadow"> | |
| <a href="#" class="px-3 py-2 rounded-l-md border border-gray-300 bg-white text-gray-500 hover:bg-gray-50"> | |
| <i class="fas fa-chevron-left"></i> | |
| </a> | |
| <a href="#" class="px-3 py-2 border-t border-b border-gray-300 bg-white text-blue-600 font-medium">1</a> | |
| <a href="#" class="px-3 py-2 border-t border-b border-gray-300 bg-white text-gray-500 hover:bg-gray-50">2</a> | |
| <a href="#" class="px-3 py-2 border-t border-b border-gray-300 bg-white text-gray-500 hover:bg-gray-50">3</a> | |
| <a href="#" class="px-3 py-2 rounded-r-md border border-gray-300 bg-white text-gray-500 hover:bg-gray-50"> | |
| <i class="fas fa-chevron-right"></i> | |
| </a> | |
| </nav> | |
| </div> | |
| </div> | |
| <!-- Solution Detail Section (Hidden by default) --> | |
| <div id="solutionDetailSection" class="hidden"> | |
| <div class="bg-white rounded-lg shadow overflow-hidden"> | |
| <div class="p-6 border-b"> | |
| <div class="flex justify-between items-start"> | |
| <div> | |
| <div class="flex items-center mb-2"> | |
| <span class="bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded mr-2">Conference Systems</span> | |
| <span class="bg-green-100 text-green-800 text-xs px-2 py-1 rounded flex items-center"> | |
| <i class="fas fa-check-circle mr-1"></i> | |
| Verified | |
| </span> | |
| </div> | |
| <h2 class="text-2xl font-bold mb-2">Boardroom AV Control</h2> | |
| <p class="text-gray-600">Complete control system configuration for executive boardrooms using Crestron and Biamp.</p> | |
| </div> | |
| <div class="flex space-x-2"> | |
| <button class="p-2 text-gray-400 hover:text-yellow-500"> | |
| <i class="far fa-star text-xl"></i> | |
| </button> | |
| <button class="p-2 text-gray-400 hover:text-blue-600"> | |
| <i class="fas fa-share-alt text-xl"></i> | |
| </button> | |
| <button class="p-2 text-gray-400 hover:text-red-600"> | |
| <i class="fas fa-ellipsis-v text-xl"></i> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="p-6"> | |
| <div class="flex mb-6"> | |
| <div class="w-1/4 pr-6"> | |
| <div class="sticky top-6"> | |
| <div class="mb-6"> | |
| <h3 class="text-sm font-semibold text-gray-500 uppercase mb-3">Details</h3> | |
| <div class="space-y-3"> | |
| <div> | |
| <p class="text-xs text-gray-500">Created by</p> | |
| <div class="flex items-center mt-1"> | |
| <img src="https://ui-avatars.com/api/?name=John+Doe&background=3b82f6&color=fff" alt="User" class="w-6 h-6 rounded-full mr-2"> | |
| <span class="text-sm">John Doe</span> | |
| </div> | |
| </div> | |
| <div> | |
| <p class="text-xs text-gray-500">Created on</p> | |
| <p class="text-sm">May 15, 2023</p> | |
| </div> | |
| <div> | |
| <p class="text-xs text-gray-500">Last updated</p> | |
| <p class="text-sm">June 2, 2023</p> | |
| </div> | |
| <div> | |
| <p class="text-xs text-gray-500">Views</p> | |
| <p class="text-sm">24</p> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="mb-6"> | |
| <h3 class="text-sm font-semibold text-gray-500 uppercase mb-3">Equipment</h3> | |
| <div class="space-y-2"> | |
| <div class="flex items-center"> | |
| <i class="fas fa-tv text-gray-400 mr-2"></i> | |
| <span class="text-sm">Crestron TSW-760</span> | |
| </div> | |
| <div class="flex items-center"> | |
| <i class="fas fa-microchip text-gray-400 mr-2"></i> | |
| <span class="text-sm">Biamp TesiraFORTE</span> | |
| </div> | |
| <div class="flex items-center"> | |
| <i class="fas fa-project-diagram text-gray-400 mr-2"></i> | |
| <span class="text-sm">Crestron CP3</span> | |
| </div> | |
| <div class="flex items-center"> | |
| <i class="fas fa-video text-gray-400 mr-2"></i> | |
| <span class="text-sm">Logitech Rally Plus</span> | |
| </div> | |
| </div> | |
| </div> | |
| <div> | |
| <h3 class="text-sm font-semibold text-gray-500 uppercase mb-3">Tags</h3> | |
| <div class="flex flex-wrap gap-2"> | |
| <span class="bg-gray-100 text-gray-800 text-xs px-2 py-1 rounded">crestron</span> | |
| <span class="bg-gray-100 text-gray-800 text-xs px-2 py-1 rounded">biamp</span> | |
| <span class="bg-gray-100 text-gray-800 text-xs px-2 py-1 rounded">control-system</span> | |
| <span class="bg-gray-100 text-gray-800 text-xs px-2 py-1 rounded">boardroom</span> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="w-3/4 pl-6 border-l"> | |
| <div class="markdown-content"> | |
| <h2>Overview</h2> | |
| <p>This solution provides a comprehensive configuration for executive boardroom AV control systems using Crestron for control and Biamp for audio processing. It has been successfully deployed in 12 corporate environments with positive feedback.</p> | |
| <h2>System Components</h2> | |
| <ul> | |
| <li>Crestron CP3 control processor</li> | |
| <li>Biamp TesiraFORTE DAN VT audio processor</li> | |
| <li>Crestron TSW-760 touch panel</li> | |
| <li>Logitech Rally Plus video conferencing system</li> | |
| <li>Shure MXA910 ceiling array microphone</li> | |
| <li>Extron DTP HDMI 4K 330 transmitter/receiver</li> | |
| </ul> | |
| <h2>Configuration Details</h2> | |
| <h3>Control System Programming</h3> | |
| <p>The Crestron system is programmed with the following features:</p> | |
| <pre><code>// Sample Crestron SIMPL+ code | |
| DigitalJoin[1] = SystemPower; | |
| DigitalJoin[2] = DisplayPower; | |
| AnalogJoin[1] = VolumeLevel; | |
| SerialJoin[1] = "Source Selection";</code></pre> | |
| <h3>Audio Configuration</h3> | |
| <p>The Biamp Tesira is configured with these settings:</p> | |
| <blockquote> | |
| Note: Always verify the Dante network settings before applying audio configurations. Use 48kHz sample rate for best compatibility. | |
| </blockquote> | |
| <p>Key audio processing blocks:</p> | |
| <ol> | |
| <li>Automatic microphone mixer</li> | |
| <li>Feedback suppressor</li> | |
| <li>AGC for consistent levels</li> | |
| <li>Ducker for program audio</li> | |
| </ol> | |
| <h2>Deployment Notes</h2> | |
| <p>This configuration typically requires:</p> | |
| <ul> | |
| <li>2 hours for rack installation</li> | |
| <li>4 hours for control system programming</li> | |
| <li>2 hours for audio tuning</li> | |
| <li>1 hour for client training</li> | |
| </ul> | |
| <h2>Known Issues</h2> | |
| <p>When using with Teams Rooms:</p> | |
| <ul> | |
| <li>Ensure USB audio device class is set to 2.0 in the Crestron program</li> | |
| <li>Add 500ms delay after system power on before activating video sources</li> | |
| </ul> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- New Solution Section --> | |
| <div id="newSolutionSection" class="hidden"> | |
| <div class="bg-white rounded-lg shadow overflow-hidden"> | |
| <div class="p-6 border-b"> | |
| <div class="flex justify-between items-center"> | |
| <h2 class="text-2xl font-bold">Create New Solution</h2> | |
| <button id="cancelNewSolution" class="text-gray-500 hover:text-gray-700"> | |
| Cancel | |
| </button> | |
| </div> | |
| </div> | |
| <div class="p-6"> | |
| <form id="newSolutionForm"> | |
| <div class="mb-6"> | |
| <label for="solutionTitle" class="block text-sm font-medium text-gray-700 mb-1">Solution Title</label> | |
| <input type="text" id="solutionTitle" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" placeholder="Enter a descriptive title for your solution" required> | |
| </div> | |
| <div class="mb-6"> | |
| <label for="solutionCategory" class="block text-sm font-medium text-gray-700 mb-1">Category</label> | |
| <select id="solutionCategory" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" required> | |
| <option value="">Select a category</option> | |
| <option value="conference">Conference Systems</option> | |
| <option value="signage">Digital Signage</option> | |
| <option value="control">Control Systems</option> | |
| <option value="video">Video Distribution</option> | |
| <option value="audio">Audio Systems</option> | |
| <option value="lighting">Lighting Control</option> | |
| </select> | |
| </div> | |
| <div class="mb-6"> | |
| <label class="block text-sm font-medium text-gray-700 mb-1">Status</label> | |
| <div class="flex space-x-4"> | |
| <label class="inline-flex items-center"> | |
| <input type="radio" name="solutionStatus" value="draft" class="h-4 w-4 text-blue-600 focus:ring-blue-500" checked> | |
| <span class="ml-2 text-gray-700">Draft</span> | |
| </label> | |
| <label class="inline-flex items-center"> | |
| <input type="radio" name="solutionStatus" value="review" class="h-4 w-4 text-blue-600 focus:ring-blue-500"> | |
| <span class="ml-2 text-gray-700">Needs Review</span> | |
| </label> | |
| <label class="inline-flex items-center"> | |
| <input type="radio" name="solutionStatus" value="verified" class="h-4 w-4 text-blue-600 focus:ring-blue-500"> | |
| <span class="ml-2 text-gray-700">Verified</span> | |
| </label> | |
| </div> | |
| </div> | |
| <div class="mb-6"> | |
| <label class="block text-sm font-medium text-gray-700 mb-1">Content Editor</label> | |
| <div class="editor-toolbar"> | |
| <button type="button" class="format-btn" data-format="h2"><i class="fas fa-heading"></i> H2</button> | |
| <button type="button" class="format-btn" data-format="h3"><i class="fas fa-heading"></i> H3</button> | |
| <button type="button" class="format-btn" data-format="bold"><i class="fas fa-bold"></i></button> | |
| <button type="button" class="format-btn" data-format="italic"><i class="fas fa-italic"></i></button> | |
| <button type="button" class="format-btn" data-format="ul"><i class="fas fa-list-ul"></i></button> | |
| <button type="button" class="format-btn" data-format="ol"><i class="fas fa-list-ol"></i></button> | |
| <button type="button" class="format-btn" data-format="code"><i class="fas fa-code"></i></button> | |
| <button type="button" class="format-btn" data-format="quote"><i class="fas fa-quote-right"></i></button> | |
| <button type="button" id="previewBtn" class="ml-auto"><i class="fas fa-eye"></i> Preview</button> | |
| </div> | |
| <div id="solutionContent" contenteditable="true" class="prose max-w-none"></div> | |
| <div id="markdownPreview" class="markdown-preview hidden"></div> | |
| </div> | |
| <div class="mb-6"> | |
| <label class="block text-sm font-medium text-gray-700 mb-1">Equipment</label> | |
| <div class="relative"> | |
| <input type="text" id="equipmentSearch" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" placeholder="Search equipment..."> | |
| <div id="equipmentSelector" class="equipment-selector hidden absolute z-10 w-full mt-1 bg-white border border-gray-300 rounded-md shadow-lg"> | |
| <!-- Equipment items will be populated here --> | |
| </div> | |
| </div> | |
| <div id="selectedEquipment" class="mt-2 space-y-2"> | |
| <!-- Selected equipment will appear here --> | |
| </div> | |
| </div> | |
| <div class="mb-6"> | |
| <label class="block text-sm font-medium text-gray-700 mb-1">Tags</label> | |
| <div class="tag-input" id="tagContainer"> | |
| <input type="text" id="tagInput" class="flex-1 border-0 focus:ring-0 focus:outline-none" placeholder="Add tags..."> | |
| </div> | |
| </div> | |
| <div class="flex justify-end space-x-3"> | |
| <button type="button" id="saveDraftBtn" class="px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"> | |
| Save Draft | |
| </button> | |
| <button type="submit" class="px-4 py-2 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"> | |
| Publish Solution | |
| </button> | |
| </div> | |
| </form> | |
| </div> | |
| </div> | |
| </div> | |
| </main> | |
| </div> | |
| </div> | |
| <script> | |
| // Sidebar toggle functionality | |
| document.getElementById('sidebarToggle').addEventListener('click', function() { | |
| document.querySelector('.sidebar').classList.toggle('collapsed'); | |
| }); | |
| // Section navigation | |
| document.querySelectorAll('[data-section]').forEach(link => { | |
| link.addEventListener('click', function(e) { | |
| e.preventDefault(); | |
| const sectionId = this.getAttribute('data-section') + 'Section'; | |
| document.querySelectorAll('.section-content').forEach(section => { | |
| section.classList.add('hidden'); | |
| }); | |
| document.getElementById(sectionId).classList.remove('hidden'); | |
| document.getElementById('pageTitle').textContent = this.querySelector('.sidebar-text').textContent; | |
| }); | |
| }); | |
| // New solution button | |
| document.getElementById('newSolutionBtn').addEventListener('click', function() { | |
| document.querySelectorAll('.section-content').forEach(section => { | |
| section.classList.add('hidden'); | |
| }); | |
| document.getElementById('newSolutionSection').classList.remove('hidden'); | |
| document.getElementById('pageTitle').textContent = 'New Solution'; | |
| }); | |
| // Cancel new solution | |
| document.getElementById('cancelNewSolution').addEventListener('click', function() { | |
| document.getElementById('newSolutionSection').classList.add('hidden'); | |
| document.getElementById('dashboardSection').classList.remove('hidden'); | |
| document.getElementById('pageTitle').textContent = 'Dashboard'; | |
| }); | |
| // Equipment search functionality | |
| const equipmentList = [ | |
| { id: 1, name: 'Crestron TSW-760', type: 'Touch Panel' }, | |
| { id: 2, name: 'Biamp TesiraFORTE', type: 'Audio Processor' }, | |
| { id: 3, name: 'Crestron CP3', type: 'Control Processor' }, | |
| { id: 4, name: 'Logitech Rally Plus', type: 'Video Conferencing' }, | |
| { id: 5, name: 'Shure MXA910', type: 'Ceiling Microphone' }, | |
| { id: 6, name: 'Extron DTP HDMI 4K 330', type: 'Video Transmitter' }, | |
| { id: 7, name: 'QSC Core 110f', type: 'DSP Processor' }, | |
| { id: 8, name: 'BrightSign XD1234', type: 'Digital Signage Player' }, | |
| { id: 9, name: 'Cisco Webex Codec Pro', type: 'Video Conferencing' }, | |
| { id: 10, name: 'AMX NX-2200', type: 'Controller' } | |
| ]; | |
| document.getElementById('equipmentSearch').addEventListener('input', function() { | |
| const searchTerm = this.value.toLowerCase(); | |
| const equipmentSelector = document.getElementById('equipmentSelector'); | |
| if (searchTerm.length > 0) { | |
| equipmentSelector.innerHTML = ''; | |
| const filteredEquipment = equipmentList.filter(item => | |
| item.name.toLowerCase().includes(searchTerm) || | |
| item.type.toLowerCase().includes(searchTerm) | |
| ); | |
| if (filteredEquipment.length > 0) { | |
| filteredEquipment.forEach(item => { | |
| const div = document.createElement('div'); | |
| div.className = 'equipment-selector-item'; | |
| div.innerHTML = ` | |
| <div class="font-medium">${item.name}</div> | |
| <div class="text-xs text-gray-500">${item.type}</div> | |
| `; | |
| div.addEventListener('click', function() { | |
| addSelectedEquipment(item); | |
| equipmentSelector.classList.add('hidden'); | |
| document.getElementById('equipmentSearch').value = ''; | |
| }); | |
| equipmentSelector.appendChild(div); | |
| }); | |
| equipmentSelector.classList.remove('hidden'); | |
| } else { | |
| const div = document.createElement('div'); | |
| div.className = 'equipment-selector-item'; | |
| div.textContent = 'No equipment found'; | |
| equipmentSelector.appendChild(div); | |
| equipmentSelector.classList.remove('hidden'); | |
| } | |
| } else { | |
| equipmentSelector.classList.add('hidden'); | |
| } | |
| }); | |
| function addSelectedEquipment(item) { | |
| const selectedEquipment = document.getElementById('selectedEquipment'); | |
| const div = document.createElement('div'); | |
| div.className = 'equipment-item bg-gray-50 rounded p-3 flex justify-between items-center'; | |
| div.innerHTML = ` | |
| <div> | |
| <div class="font-medium">${item.name}</div> | |
| <div class="text-xs text-gray-500">${item.type}</div> | |
| </div> | |
| <button class="text-red-500 hover:text-red-700 remove-equipment" data-id="${item.id}"> | |
| <i class="fas fa-times"></i> | |
| </button> | |
| `; | |
| selectedEquipment.appendChild(div); | |
| // Add event listener to remove button | |
| div.querySelector('.remove-equipment').addEventListener('click', function() { | |
| div.remove(); | |
| }); | |
| } | |
| // Tag input functionality | |
| const tagInput = document.getElementById('tagInput'); | |
| const tagContainer = document.getElementById('tagContainer'); | |
| let tags = []; | |
| tagInput.addEventListener('keydown', function(e) { | |
| if (e.key === 'Enter' && this.value.trim() !== '') { | |
| e.preventDefault(); | |
| const tagText = this.value.trim(); | |
| if (!tags.includes(tagText)) { | |
| tags.push(tagText); | |
| renderTags(); | |
| } | |
| this.value = ''; | |
| } | |
| }); | |
| function renderTags() { | |
| const tagElements = tags.map(tag => ` | |
| <div class="tag"> | |
| ${tag} | |
| <span class="tag-remove" data-tag="${tag}"> | |
| <i class="fas fa-times"></i> | |
| </span> | |
| </div> | |
| `).join(''); | |
| tagContainer.innerHTML = tagElements + '<input type="text" id="tagInput" class="flex-1 border-0 focus:ring-0 focus:outline-none" placeholder="Add tags...">'; | |
| // Re-attach event listeners to remove buttons | |
| document.querySelectorAll('.tag-remove').forEach(btn => { | |
| btn.addEventListener('click', function() { | |
| const tagToRemove = this.getAttribute('data-tag'); | |
| tags = tags.filter(t => t !== tagToRemove); | |
| renderTags(); | |
| }); | |
| }); | |
| // Focus the new input | |
| document.getElementById('tagInput').focus(); | |
| } | |
| // Editor formatting buttons | |
| document.querySelectorAll('.format-btn').forEach(btn => { | |
| btn.addEventListener('click', function() { | |
| const format = this.getAttribute('data-format'); | |
| formatText(format); | |
| }); | |
| }); | |
| function formatText(format) { | |
| const selection = window.getSelection(); | |
| if (selection.rangeCount === 0) return; | |
| const range = selection.getRangeAt(0); | |
| const selectedText = range.toString(); | |
| if (!selectedText) return; | |
| let formattedText = selectedText; | |
| switch (format) { | |
| case 'h2': | |
| formattedText = `## ${selectedText}\n\n`; | |
| break; | |
| case 'h3': | |
| formattedText = `### ${selectedText}\n\n`; | |
| break; | |
| case 'bold': | |
| formattedText = `**${selectedText}**`; | |
| break; | |
| case 'italic': | |
| formattedText = `*${selectedText}*`; | |
| break; | |
| case 'ul': | |
| formattedText = `- ${selectedText}`; | |
| break; | |
| case 'ol': | |
| formattedText = `1. ${selectedText}`; | |
| break; | |
| case 'code': | |
| formattedText = `\`${selectedText}\``; | |
| break; | |
| case 'quote': | |
| formattedText = `> ${selectedText}`; | |
| break; | |
| } | |
| // Replace the selected text with formatted text | |
| range.deleteContents(); | |
| range.insertNode(document.createTextNode(formattedText)); | |
| // Update the content editable div | |
| document.getElementById('solutionContent').focus(); | |
| } | |
| // Preview functionality | |
| document.getElementById('previewBtn').addEventListener('click', function() { | |
| const content = document.getElementById('solutionContent').textContent; | |
| const preview = document.getElementById('markdownPreview'); | |
| // Simple markdown to HTML conversion (for demo purposes) | |
| let html = content | |
| .replace(/##\s(.+?)\n/g, '<h2>$1</h2>') | |
| .replace(/###\s(.+?)\n/g, '<h3>$1</h3>') | |
| .replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>') | |
| .replace(/\*(.+?)\*/g, '<em>$1</em>') | |
| .replace(/-\s(.+?)\n/g, '<li>$1</li>') | |
| .replace(/1\.\s(.+?)\n/g, '<li>$1</li>') | |
| .replace(/`(.+?)`/g, '<code>$1</code>') | |
| .replace(/>\s(.+?)\n/g, '<blockquote>$1</blockquote>') | |
| .replace(/\n/g, '<br>'); | |
| preview.innerHTML = html; | |
| // Toggle between editor and preview | |
| document.getElementById('solutionContent').classList.toggle('hidden'); | |
| preview.classList.toggle('hidden'); | |
| // Change button text | |
| if (preview.classList.contains('hidden')) { | |
| this.innerHTML = '<i class="fas fa-eye"></i> Preview'; | |
| } else { | |
| this.innerHTML = '<i class="fas fa-edit"></i> Edit'; | |
| } | |
| }); | |
| // Form submission | |
| document.getElementById('newSolutionForm').addEventListener('submit', function(e) { | |
| e.preventDefault(); | |
| // Get form values | |
| const title = document.getElementById('solutionTitle').value; | |
| const category = document.getElementById('solutionCategory').value; | |
| const status = document.querySelector('input[name="solutionStatus"]:checked').value; | |
| const content = document.getElementById('solutionContent').textContent; | |
| // In a real app, you would send this data to a server | |
| console.log('New solution submitted:', { | |
| title, | |
| category, | |
| status, | |
| content, | |
| equipment: Array.from(document.querySelectorAll('.equipment-item')).map(item => ({ | |
| name: item.querySelector('.font-medium').textContent, | |
| type: item.querySelector('.text-xs').textContent | |
| })), | |
| tags | |
| }); | |
| // Show success message | |
| alert('Solution created successfully!'); | |
| // Reset form | |
| this.reset(); | |
| document.getElementById('solutionContent').textContent = ''; | |
| document.getElementById('selectedEquipment').innerHTML = ''; | |
| tags = []; | |
| renderTags(); | |
| // Go back to dashboard | |
| document.getElementById('newSolutionSection').classList.add('hidden'); | |
| document.getElementById('dashboardSection').classList.remove('hidden'); | |
| document.getElementById('pageTitle').textContent = 'Dashboard'; | |
| }); | |
| // Save draft functionality | |
| document.getElementById('saveDraftBtn').addEventListener('click', function() { | |
| // Get form values | |
| const title = document.getElementById('solutionTitle').value; | |
| const category = document.getElementById('solutionCategory').value; | |
| const content = document.getElementById('solutionContent').textContent; | |
| if (!title) { | |
| alert('Please enter a title for your draft'); | |
| return; | |
| } | |
| // In a real app, you would save this to local storage or send to a server | |
| console.log('Draft saved:', { | |
| title, | |
| category, | |
| content, | |
| equipment: Array.from(document.querySelectorAll('.equipment-item')).map(item => ({ | |
| name: item.querySelector('.font-medium').textContent, | |
| type: item.querySelector('.text-xs').textContent | |
| })), | |
| tags | |
| }); | |
| alert('Draft saved successfully!'); | |
| }); | |
| </script> | |
| <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=awood2817/av-knowledge" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> | |
| </html> |