From 9c99fd809c9b83ee9f2bddfe7f49aadf12b53f33 Mon Sep 17 00:00:00 2001 From: Jakob Guddas Date: Sun, 1 Sep 2024 21:04:36 +0200 Subject: [PATCH] feat(pr-comment): moved diff into separate section (#2421) * feat(pr-comment): moved diff into separate section * Update docs/.vitepress/lib/SvgPreview/Diff.tsx --- docs/.vitepress/api/gh-icon/[...data].get.ts | 13 +--- .../api/gh-icon/diff/[...data].get.ts | 37 ++++++++++ docs/.vitepress/lib/SvgPreview/Backdrop.tsx | 24 ++++--- docs/.vitepress/lib/SvgPreview/Diff.tsx | 71 +++++++++++++++++++ docs/.vitepress/lib/SvgPreview/index.tsx | 31 ++++---- scripts/generateChangedIconsCommentMarkup.mjs | 13 ++++ 6 files changed, 156 insertions(+), 33 deletions(-) create mode 100644 docs/.vitepress/api/gh-icon/diff/[...data].get.ts create mode 100644 docs/.vitepress/lib/SvgPreview/Diff.tsx diff --git a/docs/.vitepress/api/gh-icon/[...data].get.ts b/docs/.vitepress/api/gh-icon/[...data].get.ts index 346901712..def248303 100644 --- a/docs/.vitepress/api/gh-icon/[...data].get.ts +++ b/docs/.vitepress/api/gh-icon/[...data].get.ts @@ -28,7 +28,7 @@ export default eventHandler((event) => { .map((_, idx, arr) => arr.slice(0, idx + 1).join('-')) .reverse() .find((groupName) => groupName in iconNodes); - if (backdropName) { + if (!(name in iconNodes) && backdropName) { const iconNode = iconNodes[backdropName]; const LucideIcon = createLucideIcon(backdropName, iconNode); @@ -39,18 +39,9 @@ export default eventHandler((event) => { createElement(Backdrop, { backdropString, src, - color: name in iconNodes ? 'red' : '#777', + color: '#777', }), ); - if (name in iconNodes) { - children.push( - createElement(Backdrop, { - backdropString: src, - src: backdropString, - color: 'lime', - }), - ); - } } const svg = Buffer.from( diff --git a/docs/.vitepress/api/gh-icon/diff/[...data].get.ts b/docs/.vitepress/api/gh-icon/diff/[...data].get.ts new file mode 100644 index 000000000..b1b0f09c6 --- /dev/null +++ b/docs/.vitepress/api/gh-icon/diff/[...data].get.ts @@ -0,0 +1,37 @@ +import { eventHandler, setResponseHeader, defaultContentType } from 'h3'; +import { renderToString, renderToStaticMarkup } from 'react-dom/server'; +import { createElement } from 'react'; +import Diff from '../../../lib/SvgPreview/Diff.tsx'; +import iconNodes from '../../../data/iconNodes'; +import createLucideIcon from 'lucide-react/src/createLucideIcon'; + +export default eventHandler((event) => { + const { params } = event.context; + + const pathData = params.data.split('/'); + const data = pathData.at(-1).slice(0, -4); + const [name] = pathData; + + const newSrc = Buffer.from(data, 'base64') + .toString('utf8') + .replaceAll('\n', '') + .replace(/]*>|<\/svg>/g, ''); + + const children = []; + + const oldSrc = iconNodes[name] + ? renderToStaticMarkup(createElement(createLucideIcon(name, iconNodes[name]))) + .replaceAll('\n', '') + .replace(/]*>|<\/svg>/g, '') + : ''; + + const svg = Buffer.from( + // We can't use jsx here, is not supported here by nitro. + renderToString(createElement(Diff, { oldSrc, newSrc, showGrid: true }, children)), + ).toString('utf8'); + + defaultContentType(event, 'image/svg+xml'); + setResponseHeader(event, 'Cache-Control', 'public,max-age=31536000'); + + return svg; +}); diff --git a/docs/.vitepress/lib/SvgPreview/Backdrop.tsx b/docs/.vitepress/lib/SvgPreview/Backdrop.tsx index 088dcf7e9..2999f0acf 100644 --- a/docs/.vitepress/lib/SvgPreview/Backdrop.tsx +++ b/docs/.vitepress/lib/SvgPreview/Backdrop.tsx @@ -3,10 +3,16 @@ import React from 'react'; interface BackdropProps { src: string; color?: string; + outline?: boolean; backdropString: string; } -const Backdrop = ({ src, color = 'red', backdropString }: BackdropProps): JSX.Element => { +const Backdrop = ({ + src, + color = 'red', + outline = true, + backdropString, +}: BackdropProps): JSX.Element => { const id = React.useId(); return ( <> @@ -73,13 +79,15 @@ const Backdrop = ({ src, color = 'red', backdropString }: BackdropProps): JSX.El opacity={0.75} dangerouslySetInnerHTML={{ __html: src }} /> - + {outline && ( + + )} ); diff --git a/docs/.vitepress/lib/SvgPreview/Diff.tsx b/docs/.vitepress/lib/SvgPreview/Diff.tsx new file mode 100644 index 000000000..3fa6840a5 --- /dev/null +++ b/docs/.vitepress/lib/SvgPreview/Diff.tsx @@ -0,0 +1,71 @@ +import React from 'react'; +import Backdrop from './Backdrop.tsx'; +import { darkModeCss, Grid } from './index.tsx'; + +const SvgPreview = React.forwardRef< + SVGSVGElement, + { + oldSrc: string; + newSrc: string; + } & React.SVGProps +>(({ oldSrc, newSrc, children, ...props }, ref) => { + return ( + + + + + + + + ${newSrc}`} + color="#777" + /> + + + {children} + + ); +}); + +export default SvgPreview; diff --git a/docs/.vitepress/lib/SvgPreview/index.tsx b/docs/.vitepress/lib/SvgPreview/index.tsx index 5d6b5d386..562020a8e 100644 --- a/docs/.vitepress/lib/SvgPreview/index.tsx +++ b/docs/.vitepress/lib/SvgPreview/index.tsx @@ -2,7 +2,23 @@ import React from 'react'; import { PathProps, Path } from './types'; import { getPaths, assert } from './utils'; -const Grid = ({ +export const darkModeCss = ` + @media screen and (prefers-color-scheme: light) { + .svg-preview-grid-rect { fill: none } + } + @media screen and (prefers-color-scheme: dark) { + .svg-preview-grid-rect { fill: none } + .svg + .svg-preview-grid-group, + .svg-preview-radii-group, + .svg-preview-shadow-mask-group, + .svg-preview-shadow-group { + stroke: #fff; + } + } +`; + +export const Grid = ({ radius, fill = '#fff', ...props @@ -339,19 +355,6 @@ const SvgPreview = React.forwardRef< >(({ src, children, showGrid = false, ...props }, ref) => { const paths = typeof src === 'string' ? getPaths(src) : src; - const darkModeCss = `@media screen and (prefers-color-scheme: light) { - .svg-preview-grid-rect { fill: none } -} -@media screen and (prefers-color-scheme: dark) { - .svg-preview-grid-rect { fill: none } - .svg - .svg-preview-grid-group, - .svg-preview-radii-group, - .svg-preview-shadow-mask-group, - .svg-preview-shadow-group { - stroke: #fff; - } -}`; return ( { + const iconName = path.basename(file, '.svg'); + + return `${BASE_URL}/${iconName}`; + }, + 400, +).join(' '); + const readyToUseCode = changedFiles .map((changedFile) => { const svgContent = fs.readFileSync(path.join(process.cwd(), changedFile), 'utf-8'); @@ -112,6 +122,9 @@ ${changeFilesLowDPIImageTags}
Icon X-rays ${changeFilesXRayImageTags} +Icon Diffs +${changeFilesDiffImageTags} +
Icons as code