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
2025-08-16 10:25:16 -04:00

576 lines
14 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 chips (truncate long names nicely) */
.tag-chip {
display: inline-block; /* required for ellipsis */
max-width: clamp(8rem, 22vw, 14rem); /* responsive cap */
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; /* single line */
overflow: hidden; /* hide overflow */
text-overflow: ellipsis; /* … */
vertical-align: middle;
font: 12px/1.6 system-ui, sans-serif;
}
.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; }
/* Fixed-height, 2-line title area so all cards match height */
.card-title {
/* reserve exactly two lines of space for the title */
line-height: 1.3;
min-height: calc(1.3em * 2);
max-height: calc(1.3em * 2);
overflow: hidden;
margin-bottom: 0.5rem;
}
/* Multi-line clamp with ellipsis (where supported) */
.card-title-text {
margin: 0;
font-size: 1.1rem;
line-height: 1.3;
display: -webkit-box;
-webkit-line-clamp: 2; /* clamp to 2 lines */
-webkit-box-orient: vertical;
overflow: hidden;
/* good fallbacks for very long single words / no spaces */
overflow-wrap: anywhere; /* allows breaking long tokens */
word-break: break-word;
}