This repository has been archived on 2026-05-31. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
imagerepo/app/static/style.css
T

544 lines
13 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.
/* /app/static/style.css
==============================================================================
ImageRepo Global Styles
- Theme tokens
- Base & layout
- Header / Navbar
- Flash messages
- Pagination
- Gallery
- Modal viewer
- Tag overlays & editor
- Tag/Artist cards (tags_list.html)
- Settings
- Index / Landing
- Forms
==============================================================================*/
/*------------------------------------------------------------------------------
Theme tokens
------------------------------------------------------------------------------*/
:root {
/* surfaces */
--bg: #5d6668;
--panel: #1c1c1c;
--panel-alt: rgba(0, 0, 0, .4);
/* nav */
--nav-bg: rgba(30, 30, 30, 0.92);
--nav-border: rgba(255, 255, 255, 0.10);
/* text */
--text: #ffffff;
--text-dim: #e2e2e2;
/* accents */
--link: #d4aeff;
--link-hover: #d4d4d4;
/* shadows */
--shadow-1: 0 2px 6px rgba(0, 0, 0, 0.1);
--shadow-2: 0 3px 4px rgba(0, 0, 0, 0.7);
--shadow-3: 0 4px 10px rgba(0, 0, 0, 0.4);
/* buttons */
--btn-primary: #0066cc;
--btn-primary-hover: #004d99;
--btn-danger: #cc0033;
--btn-danger-hover: #990024;
/* flash */
--flash-info: #3182ce;
--flash-success: #38a169;
--flash-warning: #dd6b20;
--flash-danger: #e53e3e;
/* filter pills (tags_list) */
--filter-bg: #f8fafc; /* slate-50 */
--filter-fg: #0f172a; /* slate-900 */
--filter-border: #e2e8f0; /* slate-200 */
--filter-active-bg: #4f46e5; /* indigo-600 */
--filter-active-fg: #ffffff;
--filter-active-border: #4338ca; /* indigo-700 */
}
/* Optional dark-scheme tuning for filter pills */
@media (prefers-color-scheme: dark) {
:root {
--filter-bg: rgba(255, 255, 255, 0.06);
--filter-fg: #e2e8f0; /* slate-200 */
--filter-border: rgba(255, 255, 255, 0.12);
--filter-active-bg: #6366f1; /* indigo-500 */
--filter-active-fg: #0b1020; /* deeper contrast if desired */
--filter-active-border: #818cf8;
}
}
/*------------------------------------------------------------------------------
Base & layout
------------------------------------------------------------------------------*/
* { box-sizing: border-box; }
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0 1rem;
color: var(--text);
background-color: var(--bg);
}
.content { padding: 8px; }
.mainview {
max-width: 1600px;
margin: 0 auto;
background-color: var(--panel-alt);
}
/*------------------------------------------------------------------------------
Header / Navbar (sticky)
------------------------------------------------------------------------------*/
header {
position: sticky;
top: 0;
z-index: 1000;
}
.navbar {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: .25rem .5rem;
background-color: var(--nav-bg);
border-bottom: 1px solid var(--nav-border);
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
}
.nav-button {
display: inline-block;
padding: 0.5rem 1rem;
color: var(--text);
text-decoration: none;
border-radius: 5px;
font-weight: bold;
font-size: 1.5rem;
transition: background-color 0.2s ease, transform 0.1s ease;
}
.nav-button:hover { background-color: #444; transform: translateY(-1px); }
.nav-button:active { background-color: #1a1a1a; transform: translateY(1px); }
/*------------------------------------------------------------------------------
Flash messages
------------------------------------------------------------------------------*/
.flash-container {
max-width: 800px;
margin: 1rem auto;
padding: 0 1rem;
}
.flash {
padding: 1rem;
margin-bottom: 1rem;
border-radius: 6px;
font-weight: 500;
color: #fff;
box-shadow: var(--shadow-1);
}
.flash-info { background-color: var(--flash-info); }
.flash-message,
.flash-success { background-color: var(--flash-success); }
.flash-warning { background-color: var(--flash-warning); }
.flash-danger,
.flash-error { background-color: var(--flash-danger); }
/*------------------------------------------------------------------------------
Pagination
------------------------------------------------------------------------------*/
.pagination-container {
text-align: center;
margin: 2rem 0;
}
.pagination-link {
display: inline-block;
margin: 0 0.3rem;
padding: 0.5rem 1rem;
border: 1px solid #aaa;
border-radius: 4px;
color: #ffffff;
text-decoration: none;
}
.pagination-link.active,
.pagination-link:hover {
background-color: #007BFF;
color: white;
border-color: #007BFF;
}
.pagination-ellipsis { padding: 0 0.5rem; color: #999; }
/*------------------------------------------------------------------------------
Gallery
------------------------------------------------------------------------------*/
.image-date {
display: block;
font-size: 0.8rem;
color: var(--text-dim);
margin-top: 0.25rem;
}
.gallery-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 1rem;
padding: 1rem;
}
.gallery-item {
display: flex;
flex-direction: column;
align-items: center;
height: 450px;
background-color: var(--panel);
box-shadow: var(--shadow-2);
padding: 8px;
border-radius: 8px;
transition: transform 0.2s ease;
}
.gallery-item:hover { transform: scale(1.03); }
.gallery-thumb {
position: relative;
width: 100%;
height: 100%;
background-size: cover;
background-position: center;
box-shadow: 0 4px 4px rgba(0,0,0,0.4);
border-radius: 12px;
cursor: pointer;
}
.gallery-item a {
color: var(--link);
font-weight: bold;
text-decoration: none;
font-size: 0.95rem;
}
.gallery-item a:hover { text-decoration: underline; color: var(--link-hover); }
/* video play glyph sits under tags, above image */
.play-overlay {
position: absolute;
inset: 0;
display: grid;
place-items: center;
color: white;
font-size: 2rem;
text-shadow: 0 1px 4px rgba(0,0,0,.6);
z-index: 1;
pointer-events: none;
}
/*------------------------------------------------------------------------------
Modal viewer
------------------------------------------------------------------------------*/
.modal {
display: none;
position: fixed;
inset: 0;
z-index: 1000;
background: rgba(0, 0, 0, 0.85);
justify-content: center;
align-items: center;
}
.modal.active { display: flex; }
.modal-content {
position: relative;
width: 100%;
max-width: 1600px;
max-height: 95vh;
display: flex;
flex-direction: column;
align-items: center;
}
/* Modal body */
.modal-body {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.75rem;
width: 100%;
}
/* Image wrapper & zoom */
.modal-image-wrapper {
max-width: 100%;
max-height: 80vh;
overflow: hidden;
cursor: default;
}
.modal-image-wrapper.zoomed { overflow: auto; cursor: grab; }
.modal-image-wrapper.zoomed img {
width: auto; height: auto; max-width: none; max-height: none;
}
.modal-image-wrapper img {
max-width: 100%;
max-height: 80vh;
object-fit: contain;
border-radius: 6px;
box-shadow: 0 0 10px rgba(0,0,0,0.6);
}
/* Tall images */
.modal-image-wrapper.too-tall { overflow-y: auto; }
.modal-image-wrapper.too-tall img {
width: 90vw; height: auto; max-height: none;
}
/* Modal navigation buttons */
.modal-button {
position: absolute;
top: 10%;
bottom: 10%;
width: 60px;
background: rgba(0, 0, 0, 0.3);
border: none;
color: white;
font-size: 2.5rem;
cursor: pointer;
z-index: 1001;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.2s;
border-radius: 4px;
}
.modal-content:hover .modal-button { opacity: 1; }
.modal-prev { left: 0; }
.modal-next { right: 0; }
/*------------------------------------------------------------------------------
Tag overlays & editor
------------------------------------------------------------------------------*/
/* Pills used inside overlays and editors */
.tags {
margin-top: .4rem;
display: flex;
flex-wrap: wrap;
gap: .25rem;
}
.tag-chip {
font: 12px/1.6 system-ui, sans-serif;
padding: 2px 8px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.92);
color: #334155;
text-decoration: none;
border: 1px solid rgba(199, 210, 254, 0.9);
white-space: nowrap;
}
.tag-chip:hover { background: rgba(255, 255, 255, 1); }
.tag-editor { margin-top: .5rem; }
.tag-form { margin-top: .4rem; display: flex; gap: .5rem; }
.tag-form input { flex: 1; }
/* Tag overlay bar at the top of the image */
.tag-overlay {
position: absolute;
top: 0; left: 0; right: 0;
display: flex;
flex-wrap: wrap;
gap: 4px;
padding: 6px;
z-index: 2;
background: linear-gradient(to bottom, rgba(0,0,0,0.45), rgba(0,0,0,0));
}
/*------------------------------------------------------------------------------
Tag/Artist cards (tags_list.html)
------------------------------------------------------------------------------*/
.artist-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 1.5rem;
padding: 1rem;
}
.artist-card-link {
text-decoration: none;
color: inherit;
display: block;
transition: transform 0.2s ease;
}
.artist-card-link:hover .artist-card {
transform: scale(1.02);
box-shadow: var(--shadow-3);
}
.artist-card {
background-color: var(--panel);
padding: 1rem;
border-radius: 8px;
box-shadow: 0 2px 6px rgba(0,0,0,0.2);
transition: transform 0.2s ease;
}
.artist-card h3 {
margin-bottom: 0.5rem;
text-align: center;
color: var(--text);
}
.artist-preview {
display: flex;
gap: 0;
justify-content: center;
overflow: hidden;
border-radius: 6px;
}
.artist-thumb {
flex: 1;
height: 300px;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
transition: transform 0.3s ease;
}
.artist-thumb:hover { transform: scale(1.05); }
/* Filter pills (top of tags_list) */
.filter-bar {
display: flex;
flex-wrap: wrap;
gap: .5rem;
margin: .75rem 0 1rem;
}
.filter-btn {
display: inline-flex;
align-items: center;
gap: .4rem;
padding: .4rem .8rem;
border-radius: 999px;
border: 1px solid var(--filter-border);
background: var(--filter-bg);
color: var(--filter-fg);
text-decoration: none;
font: 14px/1.2 system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
transition: transform .15s ease, box-shadow .15s ease, background .15s ease;
}
.filter-btn:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0,0,0,.08);
}
.filter-btn.is-active {
background: var(--filter-active-bg);
color: var(--filter-active-fg);
border-color: var(--filter-active-border);
}
.filter-btn:focus-visible {
outline: 2px solid #6366f1;
outline-offset: 2px;
}
/*------------------------------------------------------------------------------
Settings
------------------------------------------------------------------------------*/
.settings-container {
max-width: 600px;
margin: 2rem auto;
padding: 1.5rem;
background: #f8f8f8;
border-radius: 12px;
box-shadow: var(--shadow-1);
}
.settings-section h2 { margin-bottom: 1rem; text-align: center; }
.settings-actions {
display: flex;
flex-direction: column;
gap: 1rem;
align-items: center;
}
.btn {
padding: 0.75rem 1.5rem;
font-size: 1rem;
border: none;
border-radius: 8px;
cursor: pointer;
transition: background 0.3s ease;
}
.primary-btn { background-color: var(--btn-primary); color: #fff; }
.primary-btn:hover { background-color: var(--btn-primary-hover); }
.danger-btn { background-color: var(--btn-danger); color: #fff; }
.danger-btn:hover { background-color: var(--btn-danger-hover); }
.settings-info {
margin-top: 2rem;
font-size: 0.95rem;
color: #444;
text-align: center;
}
/*------------------------------------------------------------------------------
Index / Landing
------------------------------------------------------------------------------*/
.index-hero {
position: relative;
height: 100vh;
background-size: cover;
background-position: center;
filter: blur(0px); /* initialize */
overflow: hidden;
}
.index-overlay {
position: absolute;
inset: 0;
background-color: rgba(20, 20, 20, 0.5);
backdrop-filter: blur(16px);
display: flex;
align-items: center;
justify-content: center;
z-index: 1;
}
.index-message {
text-align: center;
color: #fff;
padding: 2rem;
max-width: 600px;
}
.index-message h1 { font-size: 2.5rem; margin-bottom: 1rem; }
.index-message p { font-size: 1.2rem; margin-bottom: 2rem; }
.index-message .btn { font-size: 1.1rem; }
/*------------------------------------------------------------------------------
Forms
------------------------------------------------------------------------------*/
.form-container {
max-width: 400px;
margin: 2rem auto;
padding: 2rem;
background-color: #ffffffdd;
border-radius: 10px;
box-shadow: var(--shadow-1);
}
.form-card { display: flex; flex-direction: column; gap: 1rem; }
.form-group { display: flex; flex-direction: column; }
.form-label { margin-bottom: 0.5rem; font-weight: 600; }
.form-input {
padding: 0.6rem;
border: 1px solid #ccc;
border-radius: 5px;
}
.form-button {
padding: 0.75rem;
background-color: #5a67d8;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
.form-button:hover { background-color: #434190; }
.form-footer-text { margin-top: 1rem; text-align: center; }