Spaces:
Runtime error
Runtime error
<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> |