<!DOCTYPE html> <html> <head> {%if is_space %} <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> {% endif %} <style> /* Reset some default styles */ body, h1, h2, h3, p, ul { margin: 0; padding: 0; } body { font-family: 'Arial', sans-serif; overflow-y: hidden; } /* Sidebar styling */ .sidebar { position: fixed; top: 0; left: 0; width: 300px; height: 100vh; max-height: calc(100vh - 50px); overflow-y: scroll; overflow-x: hidden; font-size: 0.875rem; line-height: 1.25rem; transition: all 0.3s ease; background: #f8f9fa; box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1); padding-top: 50px; /* Add padding for the button */ } /* Customize scrollbar */ .sidebar::-webkit-scrollbar { width: 6px; } .sidebar::-webkit-scrollbar-track { background: #f1f1f1; } .sidebar::-webkit-scrollbar-thumb { background: #888; border-radius: 3px; } .sidebar.collapsed { width: 0; box-shadow: none; } .sidebar a { display: block; margin: 8px 12px; padding: 12px 16px; text-decoration: none; color: #424242; background: white; border-radius: 8px; transition: all 0.2s ease; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); } .sidebar a:hover { color: #1a73e8; transform: translateY(-1px); box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } .sidebar a.active { background: #1a73e8; color: white; font-weight: 500; box-shadow: 0 4px 8px rgba(26, 115, 232, 0.2); } /* Error state for demos that don't work */ .sidebar a:has(span) { border-left: 3px solid #dc3545; } /* Content area styling */ .content { margin-left: 300px; padding: 20px; height: 100vh; transition: margin-left 0.3s ease; overflow-y: auto; } .content.collapsed { margin-left: 0; } .content iframe { width: 100%; height: 80%; border: 0; } /* Toggle button styling */ .close-btn { position: fixed; top: 0; left: 0; z-index: 101; cursor: pointer; border: none; background: #f8f9fa; width: 300px; height: 50px; border-radius: 0; display: flex; align-items: center; padding: 0 20px; justify-content: flex-end; transition: all 0.3s ease; } .close-btn.collapsed { width: 50px; justify-content: center; } @media only screen and (max-width: 600px) { .close-btn { top: 20px; left: 20px; background: white; z-index: 102; /* Ensure it's above the sidebar */ } .sidebar { width: 100%; z-index: 100; } .content { margin-left: 0; padding: 10px; height: calc(100vh - 70px); margin-top: 70px; } .sidebar.collapsed { transform: translateX(-100%); } .content.collapsed { margin-top: 70px; } } </style> <script src="//unpkg.com/alpinejs" defer></script> </head> <body x-data="{ current_demo: '{{ initial_demo }}', is_collapsed: false }"> <div style="display: flex; flex-direction: column;"> <button @click="is_collapsed = !is_collapsed" class="close-btn" :class="{ 'collapsed': is_collapsed }"> <span x-text="is_collapsed ? '➡️' : '⬅️'"></span> </button> <div :class="{ 'sidebar': true, 'collapsed': is_collapsed }"> {% for name in names %} <a @click="current_demo = '{{ name[0] }}'" :class="current_demo == '{{ name[0] }}' ? 'active' : ''">{{ name[0] }} {% if name[1] %}❌{% endif %}</a> {% endfor %} </div> </div> <div :class="{ 'content': true, 'collapsed': is_collapsed }"> <iframe :src="`/demo/${current_demo}${document.location.search}`"></iframe> </div> </body> </html>