diff --git a/public/global.css b/public/global.css
index 3d26633..fd5ace3 100644
--- a/public/global.css
+++ b/public/global.css
@@ -89,7 +89,7 @@ div.logo-image img {
/* Grid specific */
.logo-grid .logo-item .logo-image {
- height: 160px;
+ /* height: 160px; */
width: 100%;
}
diff --git a/src/components/LogoGrid.svelte b/src/components/LogoGrid.svelte
index f5708c6..d66e172 100644
--- a/src/components/LogoGrid.svelte
+++ b/src/components/LogoGrid.svelte
@@ -16,6 +16,38 @@
function closeModal() {
showModal = false;
}
+
+ function downloadPng(logo) {
+ // Only for SVG
+ if (logo.format !== 'SVG') return;
+ fetch(logo.path)
+ .then(res => res.text())
+ .then(svgText => {
+ const svg = new Blob([svgText], { type: 'image/svg+xml' });
+ const url = URL.createObjectURL(svg);
+ const img = new window.Image();
+ img.onload = function () {
+ const canvas = document.createElement('canvas');
+ canvas.width = img.width;
+ canvas.height = img.height;
+ const ctx = canvas.getContext('2d');
+ ctx.drawImage(img, 0, 0);
+ canvas.toBlob(blob => {
+ const a = document.createElement('a');
+ a.href = URL.createObjectURL(blob);
+ a.download = logo.name.replace(/\s+/g, '_').toLowerCase() + '.png';
+ document.body.appendChild(a);
+ a.click();
+ document.body.removeChild(a);
+ URL.revokeObjectURL(url);
+ }, 'image/png');
+ };
+ img.onerror = function () {
+ alert('Failed to convert SVG to PNG.');
+ };
+ img.src = url;
+ });
+ }
@@ -40,9 +72,16 @@
-
+
+
+ {#if logo.format === 'SVG'}
+
+ {/if}
+
@@ -59,6 +98,7 @@
border-radius: 8px;
overflow: hidden;
transition: background 0.2s, color 0.2s, transform 0.2s, box-shadow 0.2s;
+ min-width: 320px;
}
:global(.logo-card:hover) {
transform: translateY(-5px);
@@ -66,11 +106,11 @@
}
.logo-grid {
display: grid;
- grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 1.5rem;
}
.logo-image {
- height: 160px;
+ height: 260px;
width: 100%;
display: flex;
align-items: center;
@@ -109,6 +149,53 @@
}
.logo-actions {
display: flex;
+ align-items: center;
+ gap: 0.5em;
+ flex-wrap: nowrap;
+ }
+ .download-group {
+ display: inline-flex;
+ border-radius: 6px;
+ overflow: hidden;
+ box-shadow: 0 1px 2px rgba(0,0,0,0.03);
+ }
+ .download-group .download-btn {
+ background: #27ae60;
+ color: #fff;
+ font-weight: 500;
+ letter-spacing: 0.02em;
+ min-width: 4em;
+ border-right: 1px solid var(--color-border);
+ border-radius: 0;
+ margin: 0;
+ padding: 0.4em 1em;
+ font-size: 0.95em;
+ transition: background 0.2s, color 0.2s;
+ }
+ .download-group .download-btn:focus,
+ .download-group .download-btn:hover {
+ background: #219150;
+ color: #fff;
+ outline: none;
+ }
+ .download-group .png-btn {
+ background: #27ae60;
+ color: #fff;
+ font-weight: 500;
+ letter-spacing: 0.02em;
+ min-width: 2.5em;
+ border-radius: 0;
+ margin: 0;
+ padding: 0.4em 1em;
+ font-size: 0.95em;
+ border-right: none;
+ transition: background 0.2s, color 0.2s;
+ }
+ .download-group .png-btn:focus,
+ .download-group .png-btn:hover {
+ background: #219150;
+ color: #fff;
+ outline: none;
}
.no-results {
grid-column: 1 / -1;
diff --git a/src/components/LogoList.svelte b/src/components/LogoList.svelte
index 8e13316..b2316d4 100644
--- a/src/components/LogoList.svelte
+++ b/src/components/LogoList.svelte
@@ -16,6 +16,38 @@
function closeModal() {
showModal = false;
}
+
+ function downloadPng(logo) {
+ // Only for SVG
+ if (logo.format !== 'SVG') return;
+ fetch(logo.path)
+ .then(res => res.text())
+ .then(svgText => {
+ const svg = new Blob([svgText], { type: 'image/svg+xml' });
+ const url = URL.createObjectURL(svg);
+ const img = new window.Image();
+ img.onload = function () {
+ const canvas = document.createElement('canvas');
+ canvas.width = img.width;
+ canvas.height = img.height;
+ const ctx = canvas.getContext('2d');
+ ctx.drawImage(img, 0, 0);
+ canvas.toBlob(blob => {
+ const a = document.createElement('a');
+ a.href = URL.createObjectURL(blob);
+ a.download = logo.name.replace(/\s+/g, '_').toLowerCase() + '.png';
+ document.body.appendChild(a);
+ a.click();
+ document.body.removeChild(a);
+ URL.revokeObjectURL(url);
+ }, 'image/png');
+ };
+ img.onerror = function () {
+ alert('Failed to convert SVG to PNG.');
+ };
+ img.src = url;
+ });
+ }
@@ -41,9 +73,16 @@
-
+
+
+ {#if logo.format === 'SVG'}
+
+ {/if}
+
{:else}
@@ -103,8 +142,40 @@
}
.logo-actions {
display: flex;
+ align-items: center;
+ gap: 0.5em;
+ }
+ .download-group {
+ display: inline-flex;
+ border-radius: 6px;
+ overflow: hidden;
+ box-shadow: 0 1px 2px rgba(0,0,0,0.03);
+ }
+ .download-group button,
+ .download-group .png-btn {
+ background: #27ae60;
+ color: #fff;
+ font-weight: 500;
+ letter-spacing: 0.02em;
+ min-width: 2.5em;
+ border-radius: 0;
+ margin: 0;
+ padding: 0.4em 1em;
+ font-size: 0.95em;
+ border-right: 1px solid var(--color-border);
+ transition: background 0.2s, color 0.2s;
+ }
+ .download-group button:last-child {
+ border-right: none;
+ }
+ .download-group button:focus,
+ .download-group button:hover,
+ .download-group .png-btn:focus,
+ .download-group .png-btn:hover {
+ background: #219150;
+ color: #fff;
+ outline: none;
}
-
.logo-list {
display: flex;
flex-direction: column;