From 15cc82a8a24b5aff6802ea710ccfa771544c5f79 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 7 Jan 2026 22:38:10 +0000 Subject: [PATCH 1/6] Initial plan From 262c6854a4700e3420fd8933fd8610ed9d1f907a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 7 Jan 2026 22:48:06 +0000 Subject: [PATCH 2/6] Add copy SVG feature to icon preview website Co-authored-by: hawkticehurst <39639992+hawkticehurst@users.noreply.github.com> --- package.json | 3 +- scripts/embed-svg-data.js | 31 ++++++++ src/template/preview.hbs | 156 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 181 insertions(+), 9 deletions(-) create mode 100644 scripts/embed-svg-data.js diff --git a/package.json b/package.json index 237ae2d..8a2029f 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,11 @@ "export-to-csv": "node ./scripts/export-to-csv.js -f ./dist/codicon.ttf > ./dist/codicon.csv", "copy-metadata": "cp ./src/template/metadata.json ./dist/metadata.json", "embed-metadata": "node ./scripts/embed-metadata.js", + "embed-svg-data": "node ./scripts/embed-svg-data.js", "check-metadata": "node ./scripts/check-metadata.js", "fonts": "fantasticon", "dev": "npm run build && npm run replace-in-vscode", - "build": "npm run clean && npm run svgo && npm run fonts && npm run export-to-ts && npm run export-to-csv && npm run copy-metadata && npm run embed-metadata && npm run sprite", + "build": "npm run clean && npm run svgo && npm run fonts && npm run export-to-ts && npm run export-to-csv && npm run copy-metadata && npm run embed-metadata && npm run embed-svg-data && npm run sprite", "version:bump": "node ./scripts/version-bump.js", "version:patch": "node ./scripts/version-bump.js patch minor", "version:minor": "node ./scripts/version-bump.js minor minor", diff --git a/scripts/embed-svg-data.js b/scripts/embed-svg-data.js new file mode 100644 index 0000000..dcf2458 --- /dev/null +++ b/scripts/embed-svg-data.js @@ -0,0 +1,31 @@ +const fs = require('fs'); +const path = require('path'); + +const iconsDir = path.join(__dirname, '../src/icons'); +const htmlPath = path.join(__dirname, '../dist/codicon.html'); + +if (!fs.existsSync(htmlPath)) { + console.error('HTML file not found:', htmlPath); + process.exit(1); +} + +// Read all SVG files and build a data object +const svgData = {}; +const svgFiles = fs.readdirSync(iconsDir).filter(file => file.endsWith('.svg')); + +for (const file of svgFiles) { + const name = path.basename(file, '.svg'); + const content = fs.readFileSync(path.join(iconsDir, file), 'utf8'); + svgData[name] = content; +} + +let html = fs.readFileSync(htmlPath, 'utf8'); + +if (html.includes('// SVG_DATA_PLACEHOLDER')) { + // Use regex to replace the initialization + html = html.replace(/let svgData = .* \/\/ SVG_DATA_PLACEHOLDER/, `let svgData = ${JSON.stringify(svgData)}; // SVG_DATA_PLACEHOLDER`); + fs.writeFileSync(htmlPath, html); + console.log(`SVG data embedded into HTML (${Object.keys(svgData).length} icons).`); +} else { + console.warn('SVG data placeholder not found in HTML.'); +} diff --git a/src/template/preview.hbs b/src/template/preview.hbs index 690e159..09d57f9 100644 --- a/src/template/preview.hbs +++ b/src/template/preview.hbs @@ -210,6 +210,50 @@ opacity: .9; } + #copy-modal { + position: fixed; + background-color: var(--card-bg); + border-radius: 8px; + box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.2); + padding: 8px 0; + z-index: 1000; + display: none; + min-width: 160px; + } + + #copy-modal.show { + display: block; + } + + .copy-option { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 16px; + cursor: pointer; + color: var(--text-color); + font-size: 14px; + transition: background-color 0.2s ease; + } + + .copy-option:hover { + background-color: var(--input-border); + } + + #modal-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 999; + display: none; + } + + #modal-overlay.show { + display: block; + } + @@ -238,6 +282,18 @@
📋 Copied:
+ +
+
+ + Copy icon name +
+
+ + Copy SVG +
+
+