From 3d90d9b0dac4da5eee0f5e5dbe3fc3c492fc1b34 Mon Sep 17 00:00:00 2001 From: sHa Date: Tue, 29 Apr 2025 12:16:41 +0300 Subject: [PATCH] Implemented InlineSvg component to fetch and color SVG logos dynamically. --- public/data/logos.json | 47 ++++--- public/logos/{apple_silver.svg => apple.svg} | 0 public/logos/apple_black.svg | 1 - public/logos/sendpulse-small.svg | 7 ++ public/logos/sendpulse.svg | 36 ++++++ src/components/InlineSvg.svelte | 25 ++++ src/components/LogoGrid.svelte | 124 +++++++++++++++++-- src/components/LogoList.svelte | 76 ++++++++++-- src/components/LogoModal.svelte | 98 ++++++++++++++- 9 files changed, 380 insertions(+), 34 deletions(-) rename public/logos/{apple_silver.svg => apple.svg} (100%) delete mode 100644 public/logos/apple_black.svg create mode 100644 public/logos/sendpulse-small.svg create mode 100644 public/logos/sendpulse.svg create mode 100644 src/components/InlineSvg.svelte diff --git a/public/data/logos.json b/public/data/logos.json index d88b579..88fea55 100644 --- a/public/data/logos.json +++ b/public/data/logos.json @@ -20,8 +20,8 @@ ] }, { - "name": "Apple (black)", - "path": "logos/apple_black.svg", + "name": "Apple", + "path": "logos/apple.svg", "format": "SVG", "disable": false, "tags": [ @@ -29,19 +29,16 @@ "text": "tech", "color": "silver" } - ] - }, - { - "name": "Apple (silver)", - "path": "logos/apple_silver.svg", - "format": "SVG", - "disable": false, - "tags": [ - { - "text": "tech", - "color": "silver" - } - ] + ], + "colors": [ + { "label": "Silver", "value": "#999" }, + { "label": "White", "value": "#fff" }, + { "label": "Black", "value": "#000" } + ], + "colorConfig": { + "target": "path", + "attribute": "fill" + } }, { "name": "ATB", @@ -315,6 +312,26 @@ "furniture" ] }, + { + "name": "Sendpulse Small", + "path": "logos/sendpulse-small.svg", + "format": "SVG", + "disable": false, + "tags": [ + "marketing", + "email" + ] + }, + { + "name": "Sendpulse", + "path": "logos/sendpulse.svg", + "format": "SVG", + "disable": false, + "tags": [ + "marketing", + "email" + ] + }, { "name": "Shkafnik", "path": "logos/shkafnik.svg", diff --git a/public/logos/apple_silver.svg b/public/logos/apple.svg similarity index 100% rename from public/logos/apple_silver.svg rename to public/logos/apple.svg diff --git a/public/logos/apple_black.svg b/public/logos/apple_black.svg deleted file mode 100644 index 7f7f73e..0000000 --- a/public/logos/apple_black.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/public/logos/sendpulse-small.svg b/public/logos/sendpulse-small.svg new file mode 100644 index 0000000..ead5843 --- /dev/null +++ b/public/logos/sendpulse-small.svg @@ -0,0 +1,7 @@ + + + + diff --git a/public/logos/sendpulse.svg b/public/logos/sendpulse.svg new file mode 100644 index 0000000..a99a962 --- /dev/null +++ b/public/logos/sendpulse.svg @@ -0,0 +1,36 @@ + + + diff --git a/src/components/InlineSvg.svelte b/src/components/InlineSvg.svelte new file mode 100644 index 0000000..f698d20 --- /dev/null +++ b/src/components/InlineSvg.svelte @@ -0,0 +1,25 @@ + + +{@html svgHtml} diff --git a/src/components/LogoGrid.svelte b/src/components/LogoGrid.svelte index 51bf177..c0a30af 100644 --- a/src/components/LogoGrid.svelte +++ b/src/components/LogoGrid.svelte @@ -1,6 +1,8 @@ @@ -32,11 +49,38 @@ on:keydown={(e) => (e.key === 'Enter' || e.key === ' ') && openPreview(logo)} style="cursor:pointer;" > - {logo.name} + {#if isSvgLogo(logo) && logo.colors} + + {:else} + {logo.name} + {/if}

{logo.name}

-

Format: {logo.format}

+
+ Format: {logo.format} + {#if isSvgLogo(logo) && logo.colors} + + {#each logo.colors as colorObj} + logo._activeColor = colorObj.value} + on:keydown|stopPropagation={(e) => { + if (e.key === 'Enter' || e.key === ' ') { + logo._activeColor = colorObj.value; + e.preventDefault(); + } + }} + > + {/each} + + {/if} +
@@ -77,13 +121,27 @@ cursor: pointer; transition: background 0.2s, color 0.2s; } - .logo-image img { + .logo-image img, +.logo-image :global(svg) { + width: 100%; + height: 100%; + max-width: 100%; + max-height: 100%; + object-fit: contain; + object-position: center; + display: block; + margin: 0 auto; +} + /* Make inline SVGs scale and fit like */ + .logo-image svg { max-width: 80%; max-height: 80%; width: auto !important; height: auto !important; object-fit: contain; object-position: center; + display: block; + margin: 0 auto; } .logo-info { padding: 1rem; @@ -96,21 +154,71 @@ margin-bottom: 0.5rem; color: var(--color-accent, #4f8cff); } - .logo-info p { - font-size: 0.9rem; - color: var(--color-text); - margin-bottom: 1rem; - } + /* .logo-info p { font-size: 0.9rem; color: var(--color-text); margin-bottom: 1rem; } */ .logo-actions { display: flex; align-items: center; gap: 0.5em; flex-wrap: nowrap; } + .format-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1em; + margin-bottom: 0.5em; + } + .color-switcher-inline { + display: flex; + gap: 0.4em; + align-items: center; + margin-left: auto; + } + .color-switcher { + display: flex; + gap: 0.4em; + margin: 0.5em 0 0.5em 0; + align-items: center; + } + .color-circle { + width: 20px; + height: 20px; + border-radius: 50%; + border: 2px solid #eee; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); + cursor: pointer; + display: inline-block; + transition: border 0.2s, box-shadow 0.2s; + } + .color-circle:hover { + border: 2px solid #888; + box-shadow: 0 2px 8px rgba(0,0,0,0.12); + } .no-results { grid-column: 1 / -1; text-align: center; padding: 2rem; color: #666; } + + .color-switcher { + display: flex; + gap: 0.4em; + margin: 0.5em 0 0.5em 0; + align-items: center; + } + .color-circle { + width: 20px; + height: 20px; + border-radius: 50%; + border: 2px solid #eee; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); + cursor: pointer; + display: inline-block; + transition: border 0.2s, box-shadow 0.2s; + } + .color-circle:hover { + border: 2px solid #888; + box-shadow: 0 2px 8px rgba(0,0,0,0.12); + } diff --git a/src/components/LogoList.svelte b/src/components/LogoList.svelte index ef0ab32..f47ede9 100644 --- a/src/components/LogoList.svelte +++ b/src/components/LogoList.svelte @@ -1,6 +1,7 @@ @@ -33,11 +38,39 @@ on:keydown={(e) => (e.key === 'Enter' || e.key === ' ') && openPreview(logo)} style="cursor:pointer;" > - {logo.name} + > + {#if isSvgLogo(logo) && logo.colors} + + {:else} + {logo.name} + {/if}

{logo.name}

-

Format: {logo.format}

+
+ Format: {logo.format} +
+ {#if isSvgLogo(logo) && logo.colors} +
+ {#each logo.colors as colorObj} + logo._activeColor = colorObj.value} + on:keydown|stopPropagation={(e) => { + if (e.key === 'Enter' || e.key === ' ') { + logo._activeColor = colorObj.value; + e.preventDefault(); + } + }} + > + {/each} +
+ {/if}
@@ -82,6 +115,26 @@ object-fit: contain; object-position: center; } + .color-switcher { + display: flex; + gap: 0.4em; + margin: 0.5em 0 0.5em 0; + align-items: center; + } + .color-circle { + width: 20px; + height: 20px; + border-radius: 50%; + border: 2px solid #eee; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); + cursor: pointer; + display: inline-block; + transition: border 0.2s, box-shadow 0.2s; + } + .color-circle:hover { + border: 2px solid #888; + box-shadow: 0 2px 8px rgba(0,0,0,0.12); + } .logo-info { background: var(--color-card); color: var(--color-text); @@ -93,11 +146,7 @@ margin-bottom: 0.5rem; color: var(--color-accent, #4f8cff); } - .logo-info p { - font-size: 0.9rem; - color: var(--color-text); - margin-bottom: 1rem; - } + /* .logo-info p { font-size: 0.9rem; color: var(--color-text); margin-bottom: 1rem; } */ .logo-actions { display: flex; align-items: center; @@ -114,4 +163,17 @@ padding: 2rem; color: #666; } + + .format-row { + display: flex; + align-items: center; + gap: 1em; + } + /* .color-switcher-inline { display: flex; gap: 0.4em; align-items: center; margin-left: auto; } */ + .color-switcher-under { + display: flex; + gap: 0.4em; + align-items: center; + margin: 0.5em 0 0 0; + } diff --git a/src/components/LogoModal.svelte b/src/components/LogoModal.svelte index 6d93e66..7aae80a 100644 --- a/src/components/LogoModal.svelte +++ b/src/components/LogoModal.svelte @@ -1,5 +1,6 @@