adding generic tag cards
This commit is contained in:
@@ -3012,3 +3012,70 @@ input#s_avatar {
|
|||||||
.upload {
|
.upload {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Modern Tags Layout */
|
||||||
|
.tags-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
|
||||||
|
gap: 20px;
|
||||||
|
padding: 20px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag-card {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
background: var(--badge-bg, #171717);
|
||||||
|
border-radius: 12px;
|
||||||
|
overflow: hidden;
|
||||||
|
text-decoration: none !important;
|
||||||
|
transition: transform 0.2s, box-shadow 0.2s;
|
||||||
|
border: 1px solid var(--nav-border-color, rgba(255,255,255,0.1));
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag-card:hover {
|
||||||
|
transform: translateY(-5px);
|
||||||
|
box-shadow: 0 10px 20px rgba(0,0,0,0.4);
|
||||||
|
background: var(--dropdown-bg, #232323);
|
||||||
|
border-color: var(--accent, #9f0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag-card-image {
|
||||||
|
width: 100%;
|
||||||
|
height: 100px;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
background: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag-card-image img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
transition: transform 0.5s;
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag-card:hover .tag-card-image img {
|
||||||
|
transform: scale(1.1);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag-card-content {
|
||||||
|
padding: 15px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag-name {
|
||||||
|
color: var(--white, #fff);
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1.1em;
|
||||||
|
font-family: var(--font, monospace);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag-count {
|
||||||
|
color: #888;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
41
src/inc/routes/tag_image.mjs
Normal file
41
src/inc/routes/tag_image.mjs
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import crypto from 'crypto';
|
||||||
|
|
||||||
|
export default (router, tpl) => {
|
||||||
|
router.get(/^\/tag_image\/(?<tag>.+)$/, async (req, res) => {
|
||||||
|
const tag = req.params.tag;
|
||||||
|
|
||||||
|
// Create a deterministic hash from the tag
|
||||||
|
const hash = crypto.createHash('md5').update(tag).digest('hex');
|
||||||
|
|
||||||
|
// Generate colors from hash
|
||||||
|
const c1 = '#' + hash.substring(0, 6);
|
||||||
|
const c2 = '#' + hash.substring(6, 12);
|
||||||
|
const c3 = '#' + hash.substring(12, 18);
|
||||||
|
|
||||||
|
// Generate some deterministic numbers for shapes
|
||||||
|
const n1 = parseInt(hash.substring(18, 20), 16);
|
||||||
|
const n2 = parseInt(hash.substring(20, 22), 16);
|
||||||
|
|
||||||
|
const svg = `
|
||||||
|
<svg width="300" height="150" viewBox="0 0 300 150" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" style="stop-color:${c1};stop-opacity:1" />
|
||||||
|
<stop offset="100%" style="stop-color:${c2};stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<rect width="300" height="150" fill="url(#grad)" />
|
||||||
|
<circle cx="${n1}%" cy="${n2}%" r="${(n1 + n2) / 4}" fill="${c3}" fill-opacity="0.3" />
|
||||||
|
<circle cx="${100 - n1}%" cy="${100 - n2}%" r="${(n1 + n2) / 3}" fill="${c3}" fill-opacity="0.2" />
|
||||||
|
<text x="50%" y="50%" dominant-baseline="middle" text-anchor="middle" font-family="sans-serif" font-size="24" fill="#fff" fill-opacity="0.9" font-weight="bold">${tag}</text>
|
||||||
|
</svg>
|
||||||
|
`.trim();
|
||||||
|
|
||||||
|
res.writeHead(200, {
|
||||||
|
'Content-Type': 'image/svg+xml',
|
||||||
|
'Cache-Control': 'public, max-age=86400'
|
||||||
|
});
|
||||||
|
res.end(svg);
|
||||||
|
});
|
||||||
|
return router;
|
||||||
|
};
|
||||||
@@ -2,7 +2,6 @@
|
|||||||
<!-- logged in -->
|
<!-- logged in -->
|
||||||
<nav class="navbar navbar-expand-lg">
|
<nav class="navbar navbar-expand-lg">
|
||||||
<a class="navbar-brand" href="/"><span class="f0ck" width="" height="">w0bm.com</span></a>
|
<a class="navbar-brand" href="/"><span class="f0ck" width="" height="">w0bm.com</span></a>
|
||||||
|
|
||||||
<div class="navigation-links-guest">
|
<div class="navigation-links-guest">
|
||||||
<ol>
|
<ol>
|
||||||
<a href="/tags">tags</a>
|
<a href="/tags">tags</a>
|
||||||
@@ -13,7 +12,7 @@
|
|||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
<!-- show pagination only for tags and main page -->
|
<!-- show pagination only for tags and main page -->
|
||||||
@if(!/^\/\d$/.test(url.pathname))
|
@if(!/^\/\d+$/.test(url.pathname))
|
||||||
<div class="collapse navbar-collapse show" id="navbarSupportedContent">
|
<div class="collapse navbar-collapse show" id="navbarSupportedContent">
|
||||||
<div class="pagination-container-fluid">
|
<div class="pagination-container-fluid">
|
||||||
<div class="pagination-wrapper">
|
<div class="pagination-wrapper">
|
||||||
@@ -27,7 +26,6 @@
|
|||||||
<!-- not logged in -->
|
<!-- not logged in -->
|
||||||
<nav class="navbar navbar-expand-lg">
|
<nav class="navbar navbar-expand-lg">
|
||||||
<a class="navbar-brand" href="/"><span class="f0ck" width="" height="">w0bm.com</span></a>
|
<a class="navbar-brand" href="/"><span class="f0ck" width="" height="">w0bm.com</span></a>
|
||||||
|
|
||||||
<div class="navigation-links-guest">
|
<div class="navigation-links-guest">
|
||||||
<ol>
|
<ol>
|
||||||
<a href="/tags">tags</a>
|
<a href="/tags">tags</a>
|
||||||
@@ -38,7 +36,7 @@
|
|||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
<!-- show pagination only for tags and main page -->
|
<!-- show pagination only for tags and main page -->
|
||||||
@if(!/^\/\d$/.test(url.pathname))
|
@if(!/^\/\d+$/.test(url.pathname))
|
||||||
<div class="collapse navbar-collapse show" id="navbarSupportedContent">
|
<div class="collapse navbar-collapse show" id="navbarSupportedContent">
|
||||||
<div class="pagination-container-fluid">
|
<div class="pagination-container-fluid">
|
||||||
<div class="pagination-wrapper">
|
<div class="pagination-wrapper">
|
||||||
|
|||||||
@@ -2,24 +2,30 @@
|
|||||||
<div id="main">
|
<div id="main">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h3 style="text-align: center;">☯</h3>
|
<h3 style="text-align: center;">☯</h3>
|
||||||
<div class="tags">
|
<div class="tags-grid">
|
||||||
@if(session)
|
@if(session)
|
||||||
@each(toptags_regged as toptag)
|
@each(toptags_regged as toptag)
|
||||||
<div class="tag badge badge-light mr-2">
|
<a href="/tag/{!! toptag.tag !!}" class="tag-card">
|
||||||
<div class="tagbox-body">
|
<div class="tag-card-image">
|
||||||
<span class="toptag_id">{!! toptag.tag !!}</span>
|
<img src="/tag_image/{!! toptag.tag !!}" loading="lazy" alt="{!! toptag.tag !!}">
|
||||||
<span class="toptag_tag"><a href="/tag/{!! toptag.tag !!}">{{ toptag.total_items }}</a></span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="tag-card-content">
|
||||||
|
<span class="tag-name">#{!! toptag.tag !!}</span>
|
||||||
|
<span class="tag-count">{{ toptag.total_items }} posts</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
@endeach
|
@endeach
|
||||||
@else
|
@else
|
||||||
@each(toptags as toptag)
|
@each(toptags as toptag)
|
||||||
<div class="tag badge badge-light mr-2">
|
<a href="/tag/{!! toptag.tag !!}" class="tag-card">
|
||||||
<div class="tagbox-body">
|
<div class="tag-card-image">
|
||||||
<span class="toptag_id">{!! toptag.tag !!}</span>
|
<img src="/tag_image/{!! toptag.tag !!}" loading="lazy" alt="{!! toptag.tag !!}">
|
||||||
<span class="toptag_tag"><a href="/tag/{!! toptag.tag !!}">{{ toptag.total_items }}</a></span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="tag-card-content">
|
||||||
|
<span class="tag-name">#{!! toptag.tag !!}</span>
|
||||||
|
<span class="tag-count">{{ toptag.total_items }} posts</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
@endeach
|
@endeach
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user