2026-01-17 19:41:50 +00:00

1066 lines
19 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Ensure html and body take full height */
html, body {
background: var(--light-background);
color: var(--main-text-color);
height: 100%;
margin: 0;
}
/* Global Styles */
body {
font-family: 'Manrope', 'Segoe UI', sans-serif;
padding-top: 0;
overflow-x: hidden;
letter-spacing: 0.01em;
line-height: 1.6;
background:
radial-gradient(1200px 900px at -10% 10%, rgba(34, 211, 238, 0.12), transparent 40%),
radial-gradient(1100px 800px at 110% -20%, rgba(59, 130, 246, 0.14), transparent 45%),
var(--light-background);
}
/* Header styles */
.site-header {
background: linear-gradient(120deg, var(--dark-background), #13253f);
color: var(--header-text-color);
position: sticky;
top: 0;
width: 100%;
z-index: 2000;
display: flex;
align-items: center;
gap: 16px;
padding: 10px 20px;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
}
.site-header img.logo {
height: 54px;
margin-right: 6px;
filter: drop-shadow(0 8px 10px rgba(0, 0, 0, 0.25));
}
.site-header h1 {
font-size: 1.4rem;
margin: 0;
letter-spacing: 0.08em;
text-transform: uppercase;
font-weight: 800;
}
.wrapper {
display: flex;
flex-direction: column;
min-height: 100%;
padding-bottom: 220px;
}
.wrapper > .admin-nav,
.wrapper > .main-tabs {
flex: 0 0 auto;
}
.wrapper > main,
.wrapper > section {
flex: 1 1 auto;
padding-top: 6px;
}
.wrapper > footer {
flex: 0 0 auto;
}
.container {
max-width: 1200px;
width: 95%;
}
.container a {
font-size: 17px;
}
.container-fluid {
padding: 24px;
}
/* Carded content shell */
main.tab-content,
section.tab-content {
background: rgba(255, 255, 255, 0.92);
border: 1px solid var(--border-color);
box-shadow: none;
padding: 20px;
margin-top: -1px;
}
/* Search view container (custom element) */
search {
display: block;
background: rgba(255, 255, 255, 0.92);
border: 1px solid var(--border-color);
border-radius: 0 0 16px 16px;
box-shadow: none;
margin-top: -1px;
padding: 16px 0 10px;
}
/* Breadcrumb Styles */
.breadcrumb {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
padding: 10px 16px;
margin: 0 0 14px;
}
.breadcrumb a {
font-size: 17px;
text-decoration: none;
color: var(--brand-navy);
font-weight: 700;
}
.breadcrumb span {
font-size: 17px;
color: var(--muted-text);
margin: 0;
}
/* Admin Nav Styles */
.admin-nav {
color: var(--brand-ink);
border: 1px solid var(--border-color);
background: rgba(255, 255, 255, 0.9);
margin-bottom: 12px;
width: 100vw;
margin-left: calc(50% - 50vw);
margin-right: calc(50% - 50vw);
box-sizing: border-box;
position: relative;
z-index: 1000;
overflow: visible;
}
.admin-nav-rail {
position: relative;
overflow: visible;
}
.admin-nav-track {
display: flex;
align-items: center;
flex-wrap: nowrap;
justify-content: flex-start;
overflow-x: auto;
overflow-y: visible;
-webkit-overflow-scrolling: touch;
white-space: nowrap;
}
.admin-nav a {
color: var(--brand-ink);
text-decoration: none;
padding: 8px 12px;
font-weight: 600;
font-size: 13px;
border: 1px solid transparent;
background: linear-gradient(135deg, #fff, #f4f7fb);
transition: all 0.2s ease;
box-shadow: 0 6px 16px rgba(15, 23, 42, 0.05);
flex-shrink: 0;
}
.admin-nav a:hover {
color: var(--brand-sky);
border-color: var(--border-color);
transform: translateY(-1px);
}
.admin-nav span {
color: var(--border-color);
display: none;
}
.admin-nav .dropdown-toggle {
color: var(--brand-ink);
padding: 8px 12px;
}
.admin-nav .dropdown-toggle::after {
display: none; /* hide default Bootstrap caret */
}
.admin-nav .dropdown-menu {
background-color: #fff;
border-color: var(--border-color);
border-radius: 10px;
box-shadow: var(--card-shadow);
z-index: 4000;
position: absolute;
top: 0;
left: 100%;
margin-top: 0;
margin-left: 8px;
transform: none;
}
.admin-nav .dropdown-item {
color: var(--brand-ink);
padding-left: 14px;
padding-right: 14px;
}
.admin-nav .dropdown-item:hover,
.admin-nav .dropdown-item:focus {
background-color: #eef4ff;
color: var(--brand-navy);
}
/* List Styles */
ul {
list-style-type: none;
padding: 0;
}
/* mouse symbol for links */
div.directory-item, li.directory-item, li.file-item, li.link-item,
div.directory-item a, li.directory-item a, li.file-item a, li.link-item a {
cursor: pointer;
}
/* Directory Items (in a list) */
.directory-item, .link-item, .directory-item, .file-item {
margin-bottom: 12px;
background-color: #fff;
border-radius: 12px;
box-shadow: var(--card-shadow);
padding: 12px 18px;
border: 1px solid var(--border-color);
transition: all 0.2s ease;
}
.directory-item:hover,
.link-item:hover,
.file-item:hover {
border-color: var(--brand-sky);
box-shadow: 0 14px 26px rgba(59, 130, 246, 0.14);
transform: translateY(-1px);
}
/* Grid Layout for Directories */
.directories-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
column-gap: 14px;
row-gap: 0;
text-align: center;
}
/* File Item Styles (for both music and image files) */
.file-item, .directory-item{
display: grid;
grid-template-columns: 1fr auto;
align-items: center;
background-color: #fff;
border-radius: 12px;
box-shadow: var(--card-shadow);
}
/* Link Styles */
.directory-link,
.link-link,
a.play-file {
color: var(--brand-ink);
text-decoration: none;
word-break: break-all;
font-weight: 600;
}
a.show-transcript {
text-decoration: none;
color: var(--brand-navy);
font-size: 18px;
margin-left: 10px;
font-weight: 600;
}
a.show-transcript:hover {
color: var(--brand-sky);
}
.highlight {
background-color: #fffbcc;
padding: 2px 4px;
border-radius: 4px;
}
#transcriptContent code.timecode-link {
cursor: pointer;
font-size: small;
}
a.create-share {
text-decoration: none;
color: var(--brand-navy);
font-size: 18px;
margin-left: 10px;
font-weight: 600;
}
a.create-share:hover {
color: var(--brand-sky);
}
.currently-playing {
background-color: var(--selected-background);
border: 1px solid var(--brand-sky);
}
/* Footer Player Styles */
footer {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: linear-gradient(120deg, #0b1220, #0f172a);
color: #fff;
padding: 10px 14px;
text-align: center;
z-index: 1000; /* Make sure it sits on top */
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 -10px 30px rgba(0, 0, 0, 0.25);
}
/* Modal Styles */
#transcriptModal {
display: none;
position: fixed;
z-index: 2000;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
background-color: rgba(0, 0, 0, 0.7);
}
#transcriptModal .modal-content {
background-color: #fff;
margin: 5% auto;
padding: 20px;
border-radius: 5px;
width: 90%;
max-width: 800px;
position: relative;
max-height: 80vh;
overflow-y: auto;
display: flex;
flex-direction: column;
}
#transcriptModal .close {
position: sticky;
top: 0;
right: 0;
font-size: 28px;
font-weight: bold;
cursor: pointer;
margin-left: auto;
z-index: 5;
}
/* Basic Markdown Styles */
#transcriptContent h1,
#transcriptContent h2,
#transcriptContent h3 {
border-bottom: 1px solid #eee;
padding-bottom: 5px;
}
#transcriptContent p {
line-height: 1.6;
}
#transcriptContent pre {
background-color: #f6f8fa;
padding: 10px;
overflow-x: auto;
}
/* Center the reload control */
#directory-controls {
text-align: center;
margin-top: 20px;
}
/* Style the button (remove border, background, etc.) */
#reload-button {
background: none;
border: none;
cursor: pointer;
padding: 0;
}
/* Add a rotation animation */
@keyframes rotate-icon {
0% { transform: rotate(0deg); }
100% { transform: rotate(180deg); }
}
#reload-button svg {
animation: none;
}
#reload-button svg.rotate {
animation: rotate-icon 0.5s linear;
transition: opacity 1s ease;
opacity: 0;
cursor: auto;
}
/* IMAGE GRID */
.images-grid {
display: grid;
grid-template-columns: repeat(auto-fill, 150px);
grid-auto-rows: 150px;
gap: 14px;
}
.image-item {
position: relative;
overflow: hidden;
border: 1px solid var(--border-color);
border-radius: 12px;
background: linear-gradient(145deg, #ffffff, #f6f8fc);
box-shadow: var(--card-shadow);
}
/* the filename overlay, centered at bottom */
.image-item .file-name {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
padding: 4px 0;
text-align: center;
font-size: 12px;
background: rgba(0, 0, 0, 0.6);
color: #fff;
box-sizing: border-box;
transition: opacity 0.3s;
opacity: 1;
pointer-events: none;
}
/* once loaded, hide the filename overlay */
.image-item.loaded .file-name {
opacity: 0.5;
}
/* thumbnail styling unchanged */
.thumbnail {
width: 100%;
height: 100%;
object-fit: cover;
}
.thumbnail-fallback {
object-fit: contain;
background: #e5e5e5;
}
/* pop when loaded */
.image-item.loaded .thumbnail {
transform: scale(1.05);
}
.qr-code {
max-width: 300px;
display: block;
margin: auto;
}
.card {
margin-bottom: 20px;
}
.locked { background-color:#eee; }
.unlocked { background-color: #fff3cd; }
/* full-screen semi-transparent backdrop */
#fullscreen-loader {
position: fixed;
top: 0; left: 0;
width: 100vw; height: 100vh;
background: rgba(0,0,0,0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 9999; /* ensure its on top */
}
/* your spinner graphic */
.loader {
border: 4px solid rgba(255,255,255,0.3);
border-top-color: #fff;
border-radius: 50%;
width: 40px;
height: 40px;
animation: spin 1s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
.card-body.collapsable {
display: none;
transition: max-height 0.3s ease;
overflow: hidden;
}
.card-body.collapsable.show {
display: block;
max-height: 1000px;
}
.toggle-icon {
font-size: 1.5rem;
user-select: none;
}
.toggle-icon:hover {
color: #007bff;
}
/* Tab Navigation Styles */
.main-tabs {
display: flex;
justify-content: flex-start;
padding: 6px 18px 0;
gap: 0;
border-bottom: 1px solid var(--border-color);
flex-wrap: nowrap;
border-radius: 0;
width: 100vw;
margin-left: calc(50% - 50vw);
margin-right: calc(50% - 50vw);
box-sizing: border-box;
overflow-x: auto;
overflow-y: hidden;
-webkit-overflow-scrolling: touch;
scrollbar-width: thin;
}
.tab-button {
background: rgba(217, 217, 217, 0.5);
border: 1px solid var(--border-color);
border-bottom: none;
color: var(--muted-text);
padding: 10px 16px;
font-size: 13px;
cursor: pointer;
transition: all 0.2s ease;
border-radius: 10px 10px 0 0;
margin: 0 6px 0 0;
position: relative;
font-weight: 700;
letter-spacing: 0.04em;
text-transform: none;
box-shadow:
0 -10px 18px -12px rgba(15, 23, 42, 0.18),
10px 0 18px -12px rgba(15, 23, 42, 0.12),
-10px 0 18px -12px rgba(15, 23, 42, 0.12);
flex: 0 0 auto;
}
.tab-button:hover {
color: var(--brand-ink);
background: rgba(255, 255, 255, 0.92);
}
.tab-button.active {
color: var(--brand-ink);
background: rgba(255, 255, 255, 0.92);
border-color: var(--border-color);
z-index: 2;
box-shadow:
0 -12px 22px -12px rgba(15, 23, 42, 0.22),
12px 0 20px -14px rgba(15, 23, 42, 0.14),
-12px 0 20px -14px rgba(15, 23, 42, 0.14);
margin-bottom: -1px;
}
.tab-content {
display: none;
}
.tab-content.active {
display: block;
}
/* Messages Section Styles */
.messages-section-header {
max-width: 900px;
margin: 0 auto;
padding: 0 0 10px;
}
.messages-container {
max-width: 900px;
margin: 0 auto;
padding: 10px 0 24px;
}
.message-card {
background: linear-gradient(145deg, #ffffff, #f7f9ff);
border: 1px solid var(--border-color);
border-radius: 14px;
padding: 20px 22px;
margin-bottom: 20px;
box-shadow: var(--card-shadow);
transition: box-shadow 0.3s ease, transform 0.2s ease;
}
.message-card:hover {
box-shadow: 0 20px 38px rgba(15, 23, 42, 0.16);
transform: translateY(-2px);
}
.message-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
padding-bottom: 10px;
border-bottom: 1px dashed var(--border-color);
}
.message-title {
font-size: 1.5em;
font-weight: bold;
color: var(--brand-ink);
margin: 0;
}
.message-datetime {
color: var(--muted-text);
font-size: 0.9em;
font-style: italic;
}
.message-content {
line-height: 1.6;
color: var(--main-text-color);
}
.message-content .folder-link-btn {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 8px 16px;
margin: 4px 0;
background: #ecf6ff;
color: #0f172a;
border: 1px solid #bed8ff;
border-radius: 6px;
font-size: 0.95em;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.message-content .folder-link-btn:hover {
background: #dff0ff;
border-color: #93c5fd;
box-shadow: 0 6px 18px rgba(14, 165, 233, 0.24);
}
.message-content .folder-link-btn:active {
transform: translateY(0);
box-shadow: 0 2px 4px rgba(102, 126, 234, 0.3);
}
.message-content .folder-link-btn i {
font-size: 1.1em;
}
.message-content a {
color: var(--brand-sky);
text-decoration: underline;
cursor: pointer;
}
.message-content a:hover {
color: #0ea5e9;
text-decoration: underline;
}
.message-content h1,
.message-content h2,
.message-content h3 {
margin-top: 20px;
margin-bottom: 10px;
}
.message-content h1 {
font-size: 1.5rem;
}
.message-content h2 {
font-size: 1.3rem;
}
.message-content h3 {
font-size: 1.1rem;
}
.message-content h4 {
font-size: 1rem;
}
.message-content h5 {
font-size: 0.9rem;
}
.message-content h6 {
font-size: 0.85rem;
}
.message-content p {
margin-bottom: 10px;
}
.message-content ul,
.message-content ol {
margin-left: 20px;
margin-bottom: 10px;
}
.message-content code {
background-color: #f4f4f4;
padding: 2px 6px;
border-radius: 3px;
font-family: 'Courier New', monospace;
}
.message-content pre {
background-color: #f4f4f4;
padding: 10px;
border-radius: 5px;
overflow-x: auto;
}
.message-content blockquote {
border-left: 4px solid var(--border-color);
padding-left: 15px;
color: var(--muted-text);
font-style: italic;
background: #f8fbff;
border-radius: 6px;
}
.message-image {
width: 100%;
max-width: 100%;
height: auto;
border-radius: 8px;
margin: 15px 0;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
.message-actions {
margin-top: 15px;
padding-top: 10px;
border-top: 1px solid var(--border-color);
display: flex;
gap: 10px;
}
.btn-edit,
.btn-delete {
padding: 5px 15px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 14px;
transition: all 0.3s ease;
}
.btn-edit {
background: linear-gradient(135deg, #2563eb, #22d3ee);
color: white;
}
.btn-edit:hover {
background: linear-gradient(135deg, #1d4ed8, #0ea5e9);
}
.btn-delete {
background-color: #dc3545;
color: white;
}
.btn-delete:hover {
background-color: #c82333;
}
.no-messages {
text-align: center;
padding: 40px;
color: var(--muted-text);
font-size: 1.2em;
}
/* Calendar Section */
#calendar-section .container {
max-width: none;
width: 100%;
padding-left: 20px;
padding-right: 20px;
}
.calendar-grid {
display: grid;
grid-template-columns: repeat(1, minmax(0, 1fr));
gap: 0;
border: 1px solid var(--border-color);
border-top: 0;
border-radius: 0 0 10px 10px;
overflow: visible;
}
.calendar-weekday-header {
display: none;
}
.calendar-day {
background: #ffffff;
border-bottom: 1px solid var(--border-color);
padding: 12px 12px 6px;
display: flex;
flex-direction: column;
min-width: 0;
min-height: 0;
box-sizing: border-box;
overflow: hidden;
}
.calendar-day-today {
background: linear-gradient(135deg, #f6fbff, #ecf4ff);
box-shadow: inset 0 0 0 2px #3b82f6;
border-color: #3b82f6;
}
.calendar-day-sunday,
.calendar-day-holiday {
background: #fff8f5;
}
.calendar-day-today.calendar-day-sunday,
.calendar-day-today.calendar-day-holiday {
background: linear-gradient(135deg, #f6fbff 0%, #f6fbff 60%, #fff1ed 100%);
}
.calendar-day-sunday .calendar-day-header,
.calendar-day-holiday .calendar-day-header {
color: #b93838;
}
.calendar-holiday-badge {
display: inline-block;
margin-left: 6px;
padding: 2px 8px;
border-radius: 999px;
background: #ffe3e3;
color: #b93838;
font-size: 0.75rem;
font-weight: 700;
white-space: nowrap;
}
.calendar-day:last-child {
border-bottom: none;
}
.calendar-day-hidden {
visibility: hidden;
pointer-events: none;
}
@media (min-width: 992px) {
.calendar-grid {
grid-template-columns: repeat(7, minmax(0, 1fr));
border-radius: 0 0 12px 12px;
}
.calendar-weekday-header {
display: grid;
grid-template-columns: repeat(7, minmax(0, 1fr));
text-align: center;
font-weight: 600;
color: var(--muted-text);
border: 1px solid var(--border-color);
border-bottom: 0;
border-radius: 12px 12px 0 0;
overflow: visible;
position: sticky;
top: 70px;
z-index: 900;
background: var(--card-background, #fff);
box-shadow: 0 10px 28px rgba(0, 0, 0, 0.05);
}
.calendar-day {
border-bottom: 1px solid var(--border-color);
border-right: 1px solid var(--border-color);
}
.calendar-day:nth-child(7n) {
border-right: none;
}
.calendar-day-name {
display: none;
}
}
.calendar-day-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
gap: 8px;
}
.calendar-day-name {
font-weight: 700;
text-transform: capitalize;
}
.calendar-day-date {
color: var(--muted-text);
font-size: 0.95rem;
white-space: nowrap;
}
.calendar-day table {
margin-bottom: 0;
table-layout: auto;
width: 100%;
}
.calendar-day thead th {
background: #f6f8fb;
color: var(--muted-text);
border-color: var(--border-color);
}
.calendar-day.empty thead {
display: none;
}
.calendar-entries-list td {
vertical-align: middle;
}
.calendar-table-wrapper {
width: 100%;
}
@media (min-width: 992px) {
.calendar-table-wrapper {
box-sizing: border-box;
margin: 0;
max-height: 400px;
overflow-y: auto;
overflow-x: auto;
padding: 0;
}
}
.calendar-day .btn-group .btn {
padding: 2px 8px;
}
.details-indicator {
font-weight: 700;
color: var(--brand-sky);
margin-left: 6px;
cursor: pointer;
position: relative;
top: -1px;
}
.calendar-actions-col {
width: 1%;
white-space: nowrap;
}
.calendar-details-text {
white-space: pre-wrap;
margin: 0;
}
.calendar-details-row td {
background: #f8fbff;
}
.calendar-inline-actions {
margin-top: 8px;
display: flex;
gap: 8px;
}
/* File Browser Styles */
.file-browser-content {
max-height: 400px;
overflow-y: auto;
border: 1px solid var(--border-color);
border-radius: 10px;
background: #fff;
box-shadow: var(--card-shadow);
}
.file-browser-content .list-group-item {
border-left: none;
border-right: none;
border-radius: 0;
}
.file-browser-content .list-group-item:first-child {
border-top: none;
}
.file-browser-content .list-group-item:last-child {
border-bottom: none;
}
#fileBrowserCollapse {
margin-top: 0;
margin-bottom: 15px;
}
.file-browser-panel {
background-color: #f8fbff;
border: 1px solid var(--border-color);
border-radius: 12px;
padding: 16px;
margin-bottom: 10px;
}
.file-browser-panel h6 {
margin-top: 0;
margin-bottom: 10px;
color: var(--brand-ink);
}