import filters for pixiv sidecars, tag filtering, and favicon generation
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 198 B |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 302 B |
|
After Width: | Height: | Size: 427 B |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 220 B |
@@ -0,0 +1,12 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<!-- Outer frame -->
|
||||
<rect x="4" y="4" width="56" height="56" rx="8" fill="#6366f1"/>
|
||||
<!-- Inner image area -->
|
||||
<rect x="10" y="10" width="44" height="44" rx="4" fill="#3c3c46"/>
|
||||
<!-- Sun -->
|
||||
<circle cx="44" cy="20" r="6" fill="#fbbf24"/>
|
||||
<!-- Back mountain -->
|
||||
<polygon points="10,48 32,24 50,48" fill="#5a5f6b"/>
|
||||
<!-- Front mountain -->
|
||||
<polygon points="24,48 44,30 54,48" fill="#50555f"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 479 B |
@@ -1,26 +1,26 @@
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
const url = new URL(window.location.href);
|
||||
const page = url.searchParams.get("page") || "1";
|
||||
const perPage = url.searchParams.get("per_page");
|
||||
|
||||
if (page !== "1" || perPage) return;
|
||||
|
||||
const grid = document.querySelector(".gallery-grid");
|
||||
if (!grid) return;
|
||||
|
||||
const sample = grid.querySelector(".gallery-item");
|
||||
if (!sample) return;
|
||||
|
||||
const gridStyle = window.getComputedStyle(grid);
|
||||
const gridGap = parseFloat(gridStyle.getPropertyValue("gap")) || 0;
|
||||
const sampleWidth = sample.getBoundingClientRect().width + gridGap;
|
||||
const containerWidth = grid.getBoundingClientRect().width;
|
||||
|
||||
const columns = Math.floor(containerWidth / sampleWidth);
|
||||
const calculatedPerPage = columns * 5;
|
||||
|
||||
url.searchParams.set("per_page", calculatedPerPage);
|
||||
url.searchParams.set("page", "1");
|
||||
|
||||
window.location.replace(url.toString());
|
||||
});
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
const url = new URL(window.location.href);
|
||||
const page = url.searchParams.get("page") || "1";
|
||||
const perPage = url.searchParams.get("per_page");
|
||||
|
||||
if (page !== "1" || perPage) return;
|
||||
|
||||
const grid = document.querySelector(".gallery-grid");
|
||||
if (!grid) return;
|
||||
|
||||
const sample = grid.querySelector(".gallery-item");
|
||||
if (!sample) return;
|
||||
|
||||
const gridStyle = window.getComputedStyle(grid);
|
||||
const gridGap = parseFloat(gridStyle.getPropertyValue("gap")) || 0;
|
||||
const sampleWidth = sample.getBoundingClientRect().width + gridGap;
|
||||
const containerWidth = grid.getBoundingClientRect().width;
|
||||
|
||||
const columns = Math.floor(containerWidth / sampleWidth);
|
||||
const calculatedPerPage = columns * 5;
|
||||
|
||||
url.searchParams.set("per_page", calculatedPerPage);
|
||||
url.searchParams.set("page", "1");
|
||||
|
||||
window.location.replace(url.toString());
|
||||
});
|
||||
|
||||
@@ -143,6 +143,58 @@ header {
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
/* Nav dropdown */
|
||||
.nav-dropdown {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.nav-dropdown-trigger {
|
||||
cursor: pointer;
|
||||
border: none;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.nav-dropdown-trigger::after {
|
||||
content: " \25BC";
|
||||
font-size: 0.65em;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.nav-dropdown-menu {
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
min-width: 150px;
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 6px;
|
||||
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
|
||||
z-index: 1001;
|
||||
padding: 0.5rem 0;
|
||||
margin-top: 0.25rem;
|
||||
}
|
||||
|
||||
.nav-dropdown-menu a {
|
||||
display: block;
|
||||
padding: 0.5rem 1rem;
|
||||
color: var(--text);
|
||||
text-decoration: none;
|
||||
font-size: 0.95rem;
|
||||
transition: background 0.15s ease;
|
||||
}
|
||||
|
||||
.nav-dropdown-menu a:hover {
|
||||
background: var(--hover);
|
||||
}
|
||||
|
||||
.nav-dropdown:hover .nav-dropdown-menu,
|
||||
.nav-dropdown:focus-within .nav-dropdown-menu {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Flash messages
|
||||
------------------------------------------------------------------------------*/
|
||||
@@ -1003,6 +1055,42 @@ header {
|
||||
filter: brightness(1.1);
|
||||
}
|
||||
|
||||
/* Tag search bar */
|
||||
.tag-search-bar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
max-width: 500px;
|
||||
margin: 0 auto 1rem;
|
||||
}
|
||||
|
||||
.tag-search-input {
|
||||
flex: 1;
|
||||
padding: 0.6rem 1rem;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 6px;
|
||||
background: var(--surface);
|
||||
color: var(--text);
|
||||
font-size: 1rem;
|
||||
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
||||
}
|
||||
|
||||
.tag-search-input:focus {
|
||||
outline: none;
|
||||
border-color: var(--accent);
|
||||
box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.2);
|
||||
}
|
||||
|
||||
.tag-search-input::placeholder {
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.tag-search-count {
|
||||
color: var(--muted);
|
||||
font-size: 0.9rem;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* Filter pills (top of tags_list) */
|
||||
.filter-bar {
|
||||
display: flex;
|
||||
|
||||