1. fixed json fetch

2. fixed smaller screen visual bugs
This commit is contained in:
fynks 2025-08-31 10:20:11 +05:00
parent ea8c6c3512
commit c952be061e
2 changed files with 311 additions and 157 deletions

186
dist/css/styles.css vendored
View file

@ -39,10 +39,10 @@
--container-max: 1400px;
--header-height: 5rem;
--content-max: 1200px;
/* Fluid layout spacing additions */
/* Fluid layout spacing additions - Adjusted clamp min value for small screens */
--section-pad-y: clamp(2rem, 6vw, 4.5rem);
--section-pad-y-tight: clamp(1.5rem, 4vw, 3rem);
--container-x: clamp(1rem, 3.2vw, 2.5rem);
--container-x: clamp(0.75rem, 3.2vw, 2.5rem); /* Reduced min padding */
/* Spacing (using CSS custom properties for consistency) */
--space-xs: 0.25rem;
--space-sm: 0.5rem;
@ -124,6 +124,8 @@ html {
font-size: 16px;
line-height: 1.6;
-webkit-text-size-adjust: 100%;
/* Fix 1: Prevent horizontal overflow on html */
overflow-x: hidden;
}
body {
font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
@ -135,6 +137,7 @@ body {
text-rendering: optimizeLegibility;
min-height: 100vh;
margin: 0;
/* Fix 1: Prevent horizontal overflow on body */
overflow-x: hidden;
display: flex;
flex-direction: column;
@ -160,7 +163,10 @@ a:hover {
outline: 2px solid var(--border-focus);
outline-offset: 2px;
}
/* Enhanced focus styles for keyboard users */
/* Enhanced focus styles for keyboard users - Improved logic */
:focus:not(:focus-visible) {
outline: none;
}
:focus-visible {
outline: 2px solid var(--primary);
outline-offset: 2px;
@ -194,16 +200,19 @@ a:hover {
min-height: 100vh;
display: flex;
flex-direction: column;
/* Fix 1: Prevent horizontal overflow on wrapper */
overflow-x: hidden;
}
.container {
max-width: var(--container-max);
margin-inline: auto;
padding-inline: var(--container-x);
width: 100%;
width: 100%; /* Crucial for preventing overflow */
}
.content-container {
max-width: var(--content-max);
margin: 0 auto;
width: 100%; /* Ensure it also respects width */
}
/* ===== 3. HEADER & NAVIGATION ===== */
.site-header {
@ -308,7 +317,6 @@ a:hover {
background: var(--bg-secondary);
font-weight: var(--font-semibold);
}
/* Focus Styles (applied via :focus-visible) */
.nav-link:hover:not(.active) {
background: var(--bg-tertiary);
color: var(--text-primary);
@ -431,9 +439,9 @@ a:hover {
transition: transform 0.4s cubic-bezier(0.65, 0.05, 0.36, 1);
z-index: 120; /* Above overlay */
/* Isolate the animation context */
/* Removed will-change for potential performance issues */
/* Removed will-change for potential performance issues on the nav itself */
}
/* Active state for the menu being open */
/* Active state for the menu being open - Simplified selector */
.nav-open .header-nav {
transform: translate3d(0, 0, 0);
}
@ -941,16 +949,18 @@ a:hover {
border: 1px solid var(--border-primary);
margin: var(--space-3xl) 0;
overflow: hidden;
width: 100%; /* Ensure it doesn't stretch the container */
}
.table-wrapper {
overflow-x: auto;
border-radius: var(--radius-2xl);
overflow-x: auto; /* Allow horizontal scroll for wide tables */
border-radius: var(--radius-2xl); /* Inherit rounding */
width: 100%; /* Add this */
}
table {
width: 100%;
border-collapse: collapse;
font-size: var(--text-sm);
min-width: 600px;
min-width: 600px; /* This is necessary for wide tables but relies on wrapper overflow */
}
/* Table toolbar */
.table-toolbar {
@ -1711,7 +1721,7 @@ text-decoration: underline;
.footer-brand {
text-align: center;
padding-bottom: var(--space-lg);
border-bottom: 1px solid rgba(var(--text-rgb), 0.1);
border-bottom: 1px solid var(--border-primary); /* Use theme variable */
margin-bottom: var(--space-lg);
}
.footer-links {
@ -1724,6 +1734,14 @@ text-decoration: underline;
.footer-bottom {
text-align: center;
}
.footer-bottom-content {
flex-direction: column;
align-items: center;
text-align: center;
}
.footer-right {
text-align: center; /* Ensure right content centers */
}
.hero-meta {
margin-bottom: var(--space-2xl);
}
@ -1731,12 +1749,144 @@ text-decoration: underline;
font-size: 10px;
}
}
/* Additional responsive tuning for large hero & section spacing */
/* Fix 6: Specific adjustments for screens smaller than 420px */
/* Using em units like the original for consistency, 420px / 16px = 26.25em */
@media (max-width: 26.25em) {
/* Further reduce horizontal padding on very small screens */
.container {
padding-inline: var(--space-sm); /* Even smaller padding */
}
/* Adjust hero section for very small screens */
.hero-section {
padding: var(--space-4xl) var(--space-sm); /* Reduce horizontal padding */
}
.hero-title {
font-size: clamp(1.5rem, 8vw, 2.5rem); /* Potentially smaller base */
margin-bottom: var(--space-lg);
}
.hero-description {
font-size: var(--text-base); /* Use fixed size or smaller clamp base */
margin-bottom: var(--space-3xl);
}
.hero-actions {
margin-bottom: var(--space-4xl);
gap: var(--space-md); /* Reduce gap between buttons */
}
.btn {
padding: var(--space-md) var(--space-xl); /* Reduce button padding */
min-width: 120px; /* Reduce minimum width if needed */
font-size: var(--text-sm); /* Smaller font */
}
/* Adjust section titles and descriptions */
.section-header {
margin-bottom: var(--space-lg);
}
.section-title {
font-size: clamp(1.5rem, 6vw, 2rem); /* Smaller base size */
margin-bottom: var(--space-lg);
}
.section-description {
font-size: var(--text-sm); /* Smaller base size */
}
/* Adjust benefit cards */
.benefit-card {
padding: var(--space-lg) var(--space-md); /* Reduce horizontal padding */
min-height: auto;
}
.benefit-card h3 {
font-size: var(--text-base); /* Adjust heading size */
}
/* Adjust notes */
.note-card {
padding: var(--space-lg);
}
/* Adjust stats */
.hero-stats {
gap: var(--space-lg); /* Reduce gap */
}
.stat-number {
font-size: clamp(1.5rem, 10vw, 2rem); /* Smaller base */
}
/* Ensure alerts don't overflow */
.alert {
padding: var(--space-lg);
margin: var(--space-lg) 0;
gap: var(--space-sm); /* Reduce gap */
}
/* Refine comparison controls */
.compare-controls {
gap: var(--space-lg); /* Reduce gap */
}
/* Refine table display if necessary */
.data-table-container {
font-size: 0.8rem; /* Slightly smaller font */
}
th,
td {
padding: var(--space-sm) var(--space-md); /* Reduce padding */
}
/* Refine footer */
.site-footer {
padding: var(--space-5xl) 0 var(--space-3xl); /* Reduce top padding */
}
.footer-content {
gap: var(--space-md); /* Reduce gap */
margin-bottom: var(--space-3xl);
}
.footer-section h4,
.footer-section h5 {
margin-bottom: var(--space-lg);
}
.footer-bottom {
padding-top: var(--space-3xl);
}
.footer-bottom-content {
gap: var(--space-lg); /* Reduce gap */
}
.footer-meta {
gap: var(--space-md); /* Reduce gap */
}
/* Refine other components as needed */
.speed-section {
padding: var(--space-2xl) var(--space-sm); /* Reduce horizontal padding */
}
.resource-category {
padding: var(--space-2xl) var(--space-sm); /* Reduce horizontal padding */
}
.resource-item {
padding: var(--space-md); /* Reduce padding */
}
.referral-section {
padding: var(--space-2xl) var(--space-sm); /* Reduce horizontal padding */
margin: var(--space-4xl) 0; /* Reduce margin */
}
.referral-grid {
gap: var(--space-md); /* Reduce gap */
}
.referral-card {
padding: var(--space-md); /* Reduce padding */
max-width: none; /* Remove max-width restriction */
}
}
/* Additional responsive tuning (existing) */
@media (max-width: 900px) { .hero-section { padding: clamp(3.5rem, 10vw, 5rem) 0 clamp(3rem, 8vw, 4rem); } }
@media (max-width: 700px) { .hero-section { padding: clamp(3rem, 9vw, 4rem) 0 clamp(2.5rem, 7vw, 3.5rem); } }
@media (max-width: 520px) { .hero-section { padding: clamp(2.5rem, 8vw, 3.5rem) 0 clamp(2rem, 6vw, 3rem); } }
@media (max-width: 400px) { .hero-section { padding: clamp(2rem, 7vw, 3rem) 0 clamp(1.5rem, 6vw, 2.5rem); } }
/* Ultra-small devices (<=20em ~ 320px) */
/* Ultra-small devices (<=20em ~ 320px) - Review/Adjust */
@media (max-width: 20em) {
html { font-size: 14px; }
body { line-height: 1.5; }
@ -1746,14 +1896,14 @@ text-decoration: underline;
.site-title { font-size: var(--text-lg); padding: var(--space-xs) var(--space-md); }
.nav-link { padding: var(--space-sm) var(--space-md); font-size: 0.75rem; }
.dark-mode-toggle { width: 38px; height: 38px; }
.hero-title { margin-bottom: var(--space-xl); }
.hero-section { padding: 2.25rem 0 1.75rem; }
/* .hero-title { margin-bottom: var(--space-xl); } */ /* Handled by 26.25em */
/* .hero-section { padding: 2.25rem 0 1.75rem; } */ /* Handled by 26.25em */
.hero-description { font-size: 0.95rem; }
.hero-stats { gap: var(--space-lg); }
.stat-number { font-size: clamp(1.75rem, 10vw, 2.25rem); }
/* .stat-number { font-size: clamp(1.75rem, 10vw, 2.25rem); } */ /* Handled by 26.25em */
.section { padding: 2rem 0; }
.section-header { margin-bottom: var(--space-xl); }
.section-title { font-size: clamp(1.75rem, 9vw, 2.25rem); margin-bottom: var(--space-xl); }
/* .section-title { font-size: clamp(1.75rem, 9vw, 2.25rem); margin-bottom: var(--space-xl); } */ /* Handled by 26.25em */
.section-description { font-size: clamp(0.95rem, 3.2vw, 1.05rem); }
.benefit-card { padding: var(--space-lg); }
.benefit-card h3 { font-size: 0.9rem; }
@ -1762,6 +1912,7 @@ text-decoration: underline;
.compare-controls { gap: var(--space-lg); }
.data-table-container { font-size: 0.85rem; }
}
/* Print Styles */
@media print {
.site-header,
@ -1818,4 +1969,3 @@ text-decoration: underline;
transform: none;
}
}

282
dist/index.html vendored
View file

@ -7,7 +7,7 @@
<title>Debrid Services Comparison - Compare Pricing & Hosts</title>
<meta name="description"
content="Compare pricing and supported hosts across AllDebrid, Real-Debrid, LinkSnappy, Premiumize, Debrid-Link, TorBox, Mega-Debrid & Deepbrid.">
content="Compare pricing and supported hosts across AllDebrid, Real-Debrid, LinkSnappy, Premiumize, Debrid-Link, TorBox, Mega-Debrid & Deepbrid.">
<meta name="robots" content="index, follow">
<meta name="author" content="Fynks">
<meta name="google-site-verification" content="nlH9UKmiZsYOuMXXnRc9pKL-AW5rECWikqcUqzri-yQ">
@ -37,9 +37,9 @@
</noscript>
<!-- Prefetch data for quick subsequent use (non-blocking) -->
<link rel="prefetch" href="/json/file-hosts-optimized.json" crossorigin>
<link rel="prefetch" href="/json/adult-hosts-optimized.json" crossorigin>
<link rel="prefetch" href="/json/pricing.json" crossorigin>
<link rel="prefetch" as="fetch" href="/json/file-hosts-optimized.json" crossorigin>
<link rel="prefetch" as="fetch" href="/json/adult-hosts-optimized.json" crossorigin>
<link rel="prefetch" as="fetch" href="/json/pricing.json" crossorigin>
<link as="style" rel="preload" href="./css/styles-min.css">
<script>
@ -87,8 +87,8 @@
<div class="header-content">
<a href="/" class="site-title">
<svg class="logo-icon" role="img" aria-label="Debrid Comparison Logo">
<use href="#icon-logo" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-logo" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
Debrid Comparison
</a>
<nav id="primary-navigation" class="header-nav" aria-label="Main navigation" aria-hidden="true">
@ -102,13 +102,14 @@
<a href="#resources" class="nav-link">Resources</a>
</nav>
<div class="header-actions">
<button id="darkModeToggle" class="dark-mode-toggle" aria-label="Toggle dark mode" type="button">
<button id="darkModeToggle" class="dark-mode-toggle" aria-label="Toggle dark mode"
type="button">
<svg class="sun-icon" role="img" aria-hidden="true">
<use href="#icon-sun" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<svg class="moon-icon" role="img" aria-hidden="true">
<use href="#icon-moon" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-sun" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<svg class="moon-icon" role="img" aria-hidden="true">
<use href="#icon-moon" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
</button>
<button class="nav-toggle" id="navToggle" aria-label="Open navigation menu"
aria-controls="primary-navigation" aria-expanded="false" type="button">
@ -173,8 +174,8 @@
<div class="features-grid">
<article class="benefit-card" role="article">
<svg class="icon-badge" role="img" aria-hidden="true">
<use href="#icon-logo" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-logo" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<h3>Maximum Speeds</h3>
<p>Bypass host throttling with direct links</p>
</article>
@ -211,9 +212,9 @@
</div>
<div class="alert alert-info" role="alert">
<svg class="alert-icon" role="img" aria-hidden="true">
<use href="#icon-alert" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<svg class="alert-icon" role="img" aria-hidden="true">
<use href="#icon-alert" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<div>Think of a debrid service as a "premium proxy" between you and hosts like Rapidgator,
Mega, or Uptobox.</div>
</div>
@ -242,8 +243,8 @@
<div class="alert alert-info" role="alert">
<svg class="alert-icon" role="img" aria-hidden="true">
<use href="#icon-alert" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-alert" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<div><strong>Important:</strong> Pricing can change frequently. Always verify current
pricing on official websites before purchasing.</div>
</div>
@ -301,17 +302,17 @@
<div class="search-section">
<form class="search-container" role="search" aria-label="Search file hosts"
onsubmit="return false">
<svg class="search-icon" role="img" aria-hidden="true">
<use href="#icon-search" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<svg class="search-icon" role="img" aria-hidden="true">
<use href="#icon-search" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<input type="search" id="host-search-input" class="search-input"
placeholder="Search file hosts (e.g., Mega, Rapidgator...)"
aria-label="Search file hosts" autocomplete="off" />
<button id="clear-host-search" class="clear-icon" aria-label="Clear search"
type="button">
<svg class="clear-icon-svg" role="img" aria-hidden="true">
<use href="#icon-close" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-close" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
</button>
</form>
</div>
@ -465,8 +466,8 @@
<div class="alert alert-info" role="alert">
<svg class="alert-icon" role="img" aria-hidden="true">
<use href="#icon-alert" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-alert" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<div>These tests are bestcase scenarios from the provider's own network.</div>
</div>
@ -554,8 +555,8 @@
<div class="alert alert-info" role="alert">
<svg class="alert-icon" role="img" aria-hidden="true">
<use href="#icon-alert" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-alert" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<div><strong>💡 Tip:</strong> Bookmark these pages to verify if a failed link is due to a
temporary host outage rather than a service limitation.</div>
</div>
@ -579,8 +580,8 @@
<div class="important-notes-grid">
<div class="note-card">
<svg class="note-icon" role="img" aria-hidden="true">
<use href="#icon-note" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-note" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<div class="note-content">
<h3>Services change frequently</h3>
@ -591,8 +592,8 @@
</div>
<div class="note-card">
<svg class="note-icon" role="img" aria-hidden="true">
<use href="#icon-money" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-money" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<div class="note-content">
<h3>Final cost may vary</h3>
<p>Displayed prices are subject to exchange rates, regional taxes, or payment
@ -601,8 +602,8 @@
</div>
<div class="note-card">
<svg class="note-icon" role="img" aria-hidden="true">
<use href="#icon-document" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-document" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<div class="note-content">
<h3>Data accuracy</h3>
<p>While we strive for completeness, this comparison reflects community reports and
@ -612,8 +613,8 @@
</div>
<div class="note-card">
<svg class="note-icon" role="img" aria-hidden="true">
<use href="#icon-user" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-user" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<div class="note-content">
<h3>No affiliation</h3>
<p>This project is independent and <strong>not affiliated</strong> with any listed
@ -622,8 +623,8 @@
</div>
<div class="note-card">
<svg class="note-icon" role="img" aria-hidden="true">
<use href="#icon-check" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-check" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<div class="note-content">
<h3>Use at your own discretion</h3>
<p>Choosing a debrid service involves personal judgment. Test short-term plans first
@ -631,9 +632,9 @@
</div>
</div>
<div class="note-card">
<svg class="note-icon" role="img" aria-hidden="true">
<use href="#icon-lock" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<svg class="note-icon" role="img" aria-hidden="true">
<use href="#icon-lock" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<div class="note-content">
<h3>Legal responsibility</h3>
<p>Debrid services are tools. You are responsible for complying with copyright laws
@ -644,8 +645,8 @@
<div class="alert alert-warning" role="alert">
<svg class="alert-icon" role="img" aria-hidden="true">
<use href="#icon-alert" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-alert" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<div><strong>This is an open-source, community-maintained guide. It does not endorse or
promote unauthorized file sharing.</strong></div>
</div>
@ -667,13 +668,13 @@
<div class="resource-category elevated">
<h3>
<svg class="resource-category-icon" role="img" aria-hidden="true">
<use href="#icon-tools" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-tools" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
Tools and Integrations
</h3>
<div class="resource-list cards-3">
<a href="https://github.com/debridmediamanager/awesome-debrid" class="resource-item accent-hover"
target="_blank" rel="noopener noreferrer">
<a href="https://github.com/debridmediamanager/awesome-debrid"
class="resource-item accent-hover" target="_blank" rel="noopener noreferrer">
<strong>Awesome-Debrid</strong>
<span>Curated list of debrid-compatible apps, browser extensions, and automation
tools</span>
@ -689,13 +690,13 @@
<span>Web interface to manage your torrents on Real-Debrid, AllDebrid,
Premiumize TorBox or DebridLink</span>
</a>
<a href="https://github.com/g0ldyy/comet" class="resource-item accent-hover" target="_blank"
rel="noopener noreferrer">
<a href="https://github.com/g0ldyy/comet" class="resource-item accent-hover"
target="_blank" rel="noopener noreferrer">
<strong>Comet</strong>
<span>Stremio's torrent/debrid search add-on</span>
</a>
<a href="https://github.com/jackett/jackett" class="resource-item accent-hover" target="_blank"
rel="noopener noreferrer">
<a href="https://github.com/jackett/jackett" class="resource-item accent-hover"
target="_blank" rel="noopener noreferrer">
<strong>Jackett + Prowlarr</strong>
<span>Indexer proxies that work seamlessly with debrid services for
automation</span>
@ -705,8 +706,8 @@
<div class="resource-category elevated">
<h3>
<svg class="resource-category-icon" role="img" aria-hidden="true">
<use href="#icon-user" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-user" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
Community and Support
</h3>
<div class="resource-list cards-3">
@ -731,11 +732,12 @@
<div class="alert alert-info" role="alert">
<svg class="alert-icon" role="img" aria-hidden="true">
<use href="#icon-alert" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<use href="#icon-alert" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<div><strong>💡 Pro Tip:</strong> Combine your debrid service with automation tools like
<strong>Debrid Media Manager (DMM)</strong> or <strong>Overseerr</strong> for a seamless
media experience.</div>
media experience.
</div>
</div>
</div>
</div>
@ -1073,103 +1075,105 @@
});
</script>
<!-- Noscript warning for core interactive features -->
<noscript>
<div class="alert alert-warning"
style="margin: 20px; position: fixed; top: 60px; left: 50%; transform: translateX(-50%); z-index: 1000;">
<svg class="alert-icon" role="img" aria-hidden="true">
<use href="#icon-alert" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<div>JavaScript is disabled. Interactive comparison and filtering won't work.</div>
</div>
</noscript>
<!-- SVG Symbol Sprite (Reusable Icons) -->
<svg style="display: none;" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">
<!-- Logo Icon -->
<symbol id="icon-logo" viewBox="0 0 24 24" aria-label="Logo">
<path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" />
</symbol>
<!-- Noscript warning for core interactive features -->
<noscript>
<div class="alert alert-warning"
style="margin: 20px; position: fixed; top: 60px; left: 50%; transform: translateX(-50%); z-index: 1000;">
<svg class="alert-icon" role="img" aria-hidden="true">
<use href="#icon-alert" stroke="currentColor" stroke-width="2" fill="none" />
</svg>
<div>JavaScript is disabled. Interactive comparison and filtering won't work.</div>
</div>
</noscript>
<!-- SVG Symbol Sprite (Reusable Icons) -->
<svg style="display: none;" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">
<!-- Logo Icon -->
<symbol id="icon-logo" viewBox="0 0 24 24" aria-label="Logo">
<path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" />
</symbol>
<!-- Sun Icon (Light Mode) -->
<symbol id="icon-sun" viewBox="0 0 24 24" aria-label="Sun">
<circle cx="12" cy="12" r="5" />
<path d="M12 1v2m0 18v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2m20 0h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42" />
</symbol>
<!-- Sun Icon (Light Mode) -->
<symbol id="icon-sun" viewBox="0 0 24 24" aria-label="Sun">
<circle cx="12" cy="12" r="5" />
<path
d="M12 1v2m0 18v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2m20 0h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42" />
</symbol>
<!-- Moon Icon (Dark Mode) -->
<symbol id="icon-moon" viewBox="0 0 24 24" aria-label="Moon">
<path d="M21 12.79A9 9 0 1 1 11.21 3a7 7 0 0 0 9.79 9.79z" />
</symbol>
<!-- Moon Icon (Dark Mode) -->
<symbol id="icon-moon" viewBox="0 0 24 24" aria-label="Moon">
<path d="M21 12.79A9 9 0 1 1 11.21 3a7 7 0 0 0 9.79 9.79z" />
</symbol>
<!-- Search Icon -->
<symbol id="icon-search" viewBox="0 0 24 24" aria-label="Search">
<circle cx="11" cy="11" r="8" />
<path d="M21 21l-4.35-4.35" />
</symbol>
<!-- Search Icon -->
<symbol id="icon-search" viewBox="0 0 24 24" aria-label="Search">
<circle cx="11" cy="11" r="8" />
<path d="M21 21l-4.35-4.35" />
</symbol>
<!-- Close/Clear Icon -->
<symbol id="icon-close" viewBox="0 0 24 24" aria-label="Close">
<line x1="18" y1="6" x2="6" y2="18" />
<line x1="6" y1="6" x2="18" y2="18" />
</symbol>
<!-- Close/Clear Icon -->
<symbol id="icon-close" viewBox="0 0 24 24" aria-label="Close">
<line x1="18" y1="6" x2="6" y2="18" />
<line x1="6" y1="6" x2="18" y2="18" />
</symbol>
<!-- Alert Info Icon -->
<symbol id="icon-alert" viewBox="0 0 24 24" aria-label="Alert">
<circle cx="12" cy="12" r="10" />
<path d="M12 16v-4M12 8h.01" />
</symbol>
<!-- Alert Info Icon -->
<symbol id="icon-alert" viewBox="0 0 24 24" aria-label="Alert">
<circle cx="12" cy="12" r="10" />
<path d="M12 16v-4M12 8h.01" />
</symbol>
<!-- Warning Icon -->
<symbol id="icon-warning" viewBox="0 0 24 24" aria-label="Warning">
<path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z" />
<line x1="12" y1="9" x2="12" y2="13" />
<line x1="12" y1="17" x2="12.01" y2="17" />
</symbol>
<!-- Warning Icon -->
<symbol id="icon-warning" viewBox="0 0 24 24" aria-label="Warning">
<path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z" />
<line x1="12" y1="9" x2="12" y2="13" />
<line x1="12" y1="17" x2="12.01" y2="17" />
</symbol>
<!-- Check Icon (Used in empty state, notes) -->
<symbol id="icon-check" viewBox="0 0 24 24" aria-label="Check">
<path d="M9 12l2 2 4-4" />
<path d="M21 12V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v7" />
<path d="M3 13v6a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-6" />
</symbol>
<!-- Check Icon (Used in empty state, notes) -->
<symbol id="icon-check" viewBox="0 0 24 24" aria-label="Check">
<path d="M9 12l2 2 4-4" />
<path d="M21 12V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v7" />
<path d="M3 13v6a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-6" />
</symbol>
<!-- Lock Icon -->
<symbol id="icon-lock" viewBox="0 0 24 24" aria-label="Lock">
<rect width="18" height="11" x="3" y="11" rx="2" ry="2" />
<path d="M7 11V7a5 5 0 0 1 10 0v4" />
</symbol>
<!-- Lock Icon -->
<symbol id="icon-lock" viewBox="0 0 24 24" aria-label="Lock">
<rect width="18" height="11" x="3" y="11" rx="2" ry="2" />
<path d="M7 11V7a5 5 0 0 1 10 0v4" />
</symbol>
<!-- Tools/Settings Icon -->
<symbol id="icon-tools" viewBox="0 0 24 24" aria-label="Tools">
<path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z" />
</symbol>
<!-- Tools/Settings Icon -->
<symbol id="icon-tools" viewBox="0 0 24 24" aria-label="Tools">
<path
d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z" />
</symbol>
<!-- User/Community Icon -->
<symbol id="icon-user" viewBox="0 0 24 24" aria-label="User">
<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" />
<circle cx="9" cy="7" r="4" />
<path d="M22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75" />
</symbol>
<!-- User/Community Icon -->
<symbol id="icon-user" viewBox="0 0 24 24" aria-label="User">
<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" />
<circle cx="9" cy="7" r="4" />
<path d="M22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75" />
</symbol>
<!-- Note/Info Icon -->
<symbol id="icon-note" viewBox="0 0 24 24" aria-label="Note">
<path d="M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z" />
</symbol>
<!-- Note/Info Icon -->
<symbol id="icon-note" viewBox="0 0 24 24" aria-label="Note">
<path d="M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z" />
</symbol>
<!-- Money/Finance Icon -->
<symbol id="icon-money" viewBox="0 0 24 24" aria-label="Money">
<path d="M12 2v20M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6" />
</symbol>
<!-- Money/Finance Icon -->
<symbol id="icon-money" viewBox="0 0 24 24" aria-label="Money">
<path d="M12 2v20M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6" />
</symbol>
<!-- Document Icon -->
<symbol id="icon-document" viewBox="0 0 24 24" aria-label="Document">
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" />
<polyline points="14,2 14,8 20,8" />
<line x1="16" y1="13" x2="8" y2="13" />
<line x1="16" y1="17" x2="8" y2="17" />
</symbol>
<!-- Document Icon -->
<symbol id="icon-document" viewBox="0 0 24 24" aria-label="Document">
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" />
<polyline points="14,2 14,8 20,8" />
<line x1="16" y1="13" x2="8" y2="13" />
<line x1="16" y1="17" x2="8" y2="17" />
</symbol>
</svg>
</svg>
</body>