korbit-ai[bot] commented on code in PR #33782: URL: https://github.com/apache/superset/pull/33782#discussion_r2150678684
########## superset-frontend/packages/superset-ui-core/src/components/Loading/index.tsx: ########## @@ -38,28 +60,31 @@ const LoaderImg = styled.img` display: block; } &.floating { - padding: 0; + /* padding: 0; */ margin: 0; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); } `; -export function Loading({ - position = 'floating', - image, - className, -}: LoadingProps) { +export function Loading({ position = 'floating', className }: LoadingProps) { + const [svgContent, setSvgContent] = useState(''); + + useEffect(() => { + console.log('Loading SVG'); Review Comment: ### Debug Statement in Production <sub></sub> <details> <summary>Tell me more</summary> ###### What is the issue? Debug console.log statement left in production code. ###### Why this matters Leaving debug statements in production code violates clean code principles and can clutter the console in production environments. ###### Suggested change ∙ *Feature Preview* Remove the console.log statement or replace it with proper logging: ```typescript useEffect(() => { fetch('/static/assets/images/spinner.svg') .then(response => response.text()) .then(setSvgContent); }, []); ``` ###### Provide feedback to improve future suggestions [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/52cc0229-94c4-4c11-9939-16cfa25280e4/upvote) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/52cc0229-94c4-4c11-9939-16cfa25280e4?what_not_true=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/52cc0229-94c4-4c11-9939-16cfa25280e4?what_out_of_scope=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/52cc0229-94c4-4c11-9939-16cfa25280e4?what_not_in_standard=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/52cc0229-94c4-4c11-9939-16cfa25280e4) </details> <sub> 💬 Looking for more details? Reply to this comment to chat with Korbit. </sub> <!--- korbi internal id:f7544d7f-5cc1-4dd2-87f3-674f50646cf3 --> [](f7544d7f-5cc1-4dd2-87f3-674f50646cf3) ########## superset/templates/superset/basic.html: ########## @@ -63,16 +76,66 @@ {% block body %} <div id="app" data-bootstrap="{{ bootstrap_data }}"> - <img - src="{{ assets_prefix }}/static/assets/images/loading.gif" - style=" - width: 50px; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - " - /> + <div class="spinner"> + <svg + viewBox="-36 -25 72 50" + xmlns="http://www.w3.org/2000/svg" + overflow="visible" + > + <defs> + <filter id="shadow1" x="-50%" y="-50%" width="200%" height="200%"> + <feDropShadow + dx="1" + dy="1" + stdDeviation="2" + flood-color="rgba(0,0,0,0.3)" + /> + </filter> + <path + id="morphPath" + d="M 0,0 C 7,16 22,8.7 22,0 22,-8.7 7,-16 0,0 -7,16 -22,8.7 -22,-0 -22,-8.7 -7,-16 0,0 Z" + stroke-width="7" + fill="transparent" + filter="url(#shadow1)" + > + <animate + attributeName="d" + dur="8s" + repeatCount="indefinite" + values="M 0,0 C 7,16 22,8.7 22,0 22,-8.7 7,-16 0,0 -7,16 -22,8.7 -22,-0 -22,-8.7 -7,-16 0,0 Z; Review Comment: ### Inefficient Animation Duration <sub></sub> <details> <summary>Tell me more</summary> ###### What is the issue? The SVG animation duration is set to 8 seconds which is unnecessarily long for a loading spinner animation cycle. ###### Why this matters Long animation cycles can make the loading indicator appear sluggish and unresponsive, potentially giving users the impression that the application is slower than it actually is. ###### Suggested change ∙ *Feature Preview* Reduce the animation duration to 2-3 seconds for a more responsive feel: ```html <animate attributeName="d" dur="2s" repeatCount="indefinite" values="..." ``` ###### Provide feedback to improve future suggestions [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/c3f249c1-6562-4c02-8bed-bb878c2bbf60/upvote) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/c3f249c1-6562-4c02-8bed-bb878c2bbf60?what_not_true=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/c3f249c1-6562-4c02-8bed-bb878c2bbf60?what_out_of_scope=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/c3f249c1-6562-4c02-8bed-bb878c2bbf60?what_not_in_standard=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/c3f249c1-6562-4c02-8bed-bb878c2bbf60) </details> <sub> 💬 Looking for more details? Reply to this comment to chat with Korbit. </sub> <!--- korbi internal id:7637337d-2aa5-4dbe-946d-1d52fef519fd --> [](7637337d-2aa5-4dbe-946d-1d52fef519fd) ########## superset/templates/superset/basic.html: ########## @@ -63,16 +76,66 @@ {% block body %} <div id="app" data-bootstrap="{{ bootstrap_data }}"> - <img - src="{{ assets_prefix }}/static/assets/images/loading.gif" - style=" - width: 50px; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - " - /> + <div class="spinner"> + <svg + viewBox="-36 -25 72 50" + xmlns="http://www.w3.org/2000/svg" + overflow="visible" + > + <defs> + <filter id="shadow1" x="-50%" y="-50%" width="200%" height="200%"> + <feDropShadow + dx="1" + dy="1" + stdDeviation="2" + flood-color="rgba(0,0,0,0.3)" + /> + </filter> + <path + id="morphPath" + d="M 0,0 C 7,16 22,8.7 22,0 22,-8.7 7,-16 0,0 -7,16 -22,8.7 -22,-0 -22,-8.7 -7,-16 0,0 Z" + stroke-width="7" + fill="transparent" + filter="url(#shadow1)" + > + <animate + attributeName="d" + dur="8s" + repeatCount="indefinite" + values="M 0,0 C 7,16 22,8.7 22,0 22,-8.7 7,-16 0,0 -7,16 -22,8.7 -22,-0 -22,-8.7 -7,-16 0,0 Z; Review Comment: ### Redundant Animation Keyframes <sub></sub> <details> <summary>Tell me more</summary> ###### What is the issue? The SVG path animation contains redundant keyframes with identical values, increasing the animation data size unnecessarily. ###### Why this matters Duplicate path data increases the HTML file size and requires more CPU processing during animation rendering. ###### Suggested change ∙ *Feature Preview* Remove duplicate keyframes and optimize the animation sequence to use fewer, more meaningful keyframes: ```html <animate attributeName="d" values="M 0,0 C 7,16 22,8.7 22,0...; M 0,-16 C 8.7,-16 16,-8.7...; M 0,0 C 7,-16 22,-8.7...; M 0,16 C 8.7,16 16,8.7...;" keyTimes="0;0.33;0.66;1" ``` ###### Provide feedback to improve future suggestions [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/9e05bd79-e7f3-45f6-9e71-2b9b34333664/upvote) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/9e05bd79-e7f3-45f6-9e71-2b9b34333664?what_not_true=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/9e05bd79-e7f3-45f6-9e71-2b9b34333664?what_out_of_scope=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/9e05bd79-e7f3-45f6-9e71-2b9b34333664?what_not_in_standard=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/9e05bd79-e7f3-45f6-9e71-2b9b34333664) </details> <sub> 💬 Looking for more details? Reply to this comment to chat with Korbit. </sub> <!--- korbi internal id:48b38078-d535-4e43-910f-a3633152be91 --> [](48b38078-d535-4e43-910f-a3633152be91) ########## superset-frontend/packages/superset-ui-core/src/components/Loading/index.tsx: ########## @@ -38,28 +60,31 @@ display: block; } &.floating { - padding: 0; + /* padding: 0; */ margin: 0; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); } `; -export function Loading({ - position = 'floating', - image, - className, -}: LoadingProps) { +export function Loading({ position = 'floating', className }: LoadingProps) { + const [svgContent, setSvgContent] = useState(''); + + useEffect(() => { + console.log('Loading SVG'); + fetch('/static/assets/images/spinner.svg') + .then(response => response.text()) + .then(htmlString => { + setSvgContent(htmlString); + }); + }, []); + return ( - <LoaderImg + <LoaderWrapper className={cls('loading', position, className)} - alt="Loading..." - src={image || Loader} - role="status" - aria-live="polite" - aria-label="Loading" - data-test="loading-indicator" + // eslint-disable-next-line react/no-danger + dangerouslySetInnerHTML={{ __html: svgContent }} Review Comment: ### Unsanitized SVG Content Injection <sub></sub> <details> <summary>Tell me more</summary> ###### What is the issue? Direct insertion of fetched content into the DOM using dangerouslySetInnerHTML without sanitization ###### Why this matters This creates a potential XSS vulnerability if the SVG endpoint is compromised or returns malicious content. An attacker could inject malicious JavaScript through a compromised SVG file. ###### Suggested change ∙ *Feature Preview* Use a SVG sanitization library like DOMPurify before inserting the content: ```typescript import DOMPurify from 'dompurify'; // ... dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(svgContent) }} ``` ###### Provide feedback to improve future suggestions [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/d91ffce6-a7bf-4012-9dc9-797a1688a469/upvote) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/d91ffce6-a7bf-4012-9dc9-797a1688a469?what_not_true=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/d91ffce6-a7bf-4012-9dc9-797a1688a469?what_out_of_scope=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/d91ffce6-a7bf-4012-9dc9-797a1688a469?what_not_in_standard=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/d91ffce6-a7bf-4012-9dc9-797a1688a469) </details> <sub> 💬 Looking for more details? Reply to this comment to chat with Korbit. </sub> <!--- korbi internal id:36f02ee9-814f-4671-8787-997cad8e472f --> [](36f02ee9-814f-4671-8787-997cad8e472f) ########## superset-frontend/packages/superset-ui-core/src/components/Loading/index.tsx: ########## @@ -38,28 +60,31 @@ display: block; } &.floating { - padding: 0; + /* padding: 0; */ Review Comment: ### Remove commented-out code <sub></sub> <details> <summary>Tell me more</summary> ###### What is the issue? Commented-out CSS code left in the styled component. ###### Why this matters Dead code creates confusion about whether it might be needed later or why it was commented out. ###### Suggested change ∙ *Feature Preview* Remove the commented-out line entirely: ```typescript &.floating { margin: 0; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); } ``` ###### Provide feedback to improve future suggestions [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/138083fc-2255-4741-b372-50b16f23f33f/upvote) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/138083fc-2255-4741-b372-50b16f23f33f?what_not_true=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/138083fc-2255-4741-b372-50b16f23f33f?what_out_of_scope=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/138083fc-2255-4741-b372-50b16f23f33f?what_not_in_standard=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/138083fc-2255-4741-b372-50b16f23f33f) </details> <sub> 💬 Looking for more details? Reply to this comment to chat with Korbit. </sub> <!--- korbi internal id:27d774de-096b-41b9-9d9f-4b63474e26b3 --> [](27d774de-096b-41b9-9d9f-4b63474e26b3) ########## superset/templates/superset/basic.html: ########## @@ -50,7 +50,20 @@ {% endblock %} {{ js_bundle(assets_prefix, 'theme') }} + <style> + .spinner svg { + --primary-color: rgb(72, 72, 72); + --accent-color: rgb(80, 165, 197); Review Comment: ### Undocumented Color Variables <sub></sub> <details> <summary>Tell me more</summary> ###### What is the issue? Hardcoded RGB color values in CSS variables without explanation of their purpose ###### Why this matters Makes it difficult to understand the theming system and color choices when modifying the spinner appearance ###### Suggested change ∙ *Feature Preview* Add comments explaining the color usage: ```html <style> .spinner svg { /* Default gray color for the dashed outline */ --primary-color: rgb(72, 72, 72); /* Highlight blue color for the animated shape */ --accent-color: rgb(80, 165, 197); ``` ###### Provide feedback to improve future suggestions [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/ab356c2a-40f7-4c0e-a582-2c64d88492d3/upvote) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/ab356c2a-40f7-4c0e-a582-2c64d88492d3?what_not_true=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/ab356c2a-40f7-4c0e-a582-2c64d88492d3?what_out_of_scope=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/ab356c2a-40f7-4c0e-a582-2c64d88492d3?what_not_in_standard=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/ab356c2a-40f7-4c0e-a582-2c64d88492d3) </details> <sub> 💬 Looking for more details? Reply to this comment to chat with Korbit. </sub> <!--- korbi internal id:9c952f89-cacd-4bec-bfd6-1ab518d1b2ee --> [](9c952f89-cacd-4bec-bfd6-1ab518d1b2ee) ########## superset/templates/superset/basic.html: ########## @@ -50,7 +50,20 @@ {% endblock %} {{ js_bundle(assets_prefix, 'theme') }} + <style> + .spinner svg { + --primary-color: rgb(72, 72, 72); + --accent-color: rgb(80, 165, 197); + overflow: visible; + } + .spinner { + padding: 10px; + width: 50px; + height: 50px; + overflow: visible; + } + </style> Review Comment: ### Inline styles violate separation of concerns <sub></sub> <details> <summary>Tell me more</summary> ###### What is the issue? Inline styles are embedded directly in the HTML template instead of being maintained in a separate CSS file ###### Why this matters This makes the styles harder to maintain, reuse, and override. It also violates separation of concerns principles by mixing presentation logic with the HTML template. ###### Suggested change ∙ *Feature Preview* Move the styles to a dedicated CSS file and include it using the existing css_bundle mechanism: ```css /* in a separate .css file */ .spinner svg { --primary-color: rgb(72, 72, 72); --accent-color: rgb(80, 165, 197); overflow: visible; } .spinner { padding: 10px; width: 50px; height: 50px; overflow: visible; } ``` ###### Provide feedback to improve future suggestions [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/c7325a0a-333e-4ddb-8d98-511c60cd071f/upvote) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/c7325a0a-333e-4ddb-8d98-511c60cd071f?what_not_true=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/c7325a0a-333e-4ddb-8d98-511c60cd071f?what_out_of_scope=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/c7325a0a-333e-4ddb-8d98-511c60cd071f?what_not_in_standard=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/c7325a0a-333e-4ddb-8d98-511c60cd071f) </details> <sub> 💬 Looking for more details? Reply to this comment to chat with Korbit. </sub> <!--- korbi internal id:dced6775-f1d3-4174-b84d-b7ea37141dd8 --> [](dced6775-f1d3-4174-b84d-b7ea37141dd8) ########## superset/templates/superset/basic.html: ########## @@ -63,16 +76,66 @@ {% block body %} <div id="app" data-bootstrap="{{ bootstrap_data }}"> - <img - src="{{ assets_prefix }}/static/assets/images/loading.gif" - style=" - width: 50px; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - " - /> + <div class="spinner"> + <svg + viewBox="-36 -25 72 50" + xmlns="http://www.w3.org/2000/svg" + overflow="visible" + > Review Comment: ### Missing Accessibility Attributes <sub></sub> <details> <summary>Tell me more</summary> ###### What is the issue? The SVG element is missing a role="img" attribute and aria-label, making it inaccessible to screen readers. ###### Why this matters Users relying on screen readers won't be notified that content is loading, degrading the user experience for visually impaired users. ###### Suggested change ∙ *Feature Preview* Add accessibility attributes to the SVG: ```html <svg viewBox="-36 -25 72 50" xmlns="http://www.w3.org/2000/svg" overflow="visible" role="img" aria-label="Loading content..." > ``` ###### Provide feedback to improve future suggestions [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/e965076e-e37f-414d-a6a9-ebc53840aaf8/upvote) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/e965076e-e37f-414d-a6a9-ebc53840aaf8?what_not_true=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/e965076e-e37f-414d-a6a9-ebc53840aaf8?what_out_of_scope=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/e965076e-e37f-414d-a6a9-ebc53840aaf8?what_not_in_standard=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/e965076e-e37f-414d-a6a9-ebc53840aaf8) </details> <sub> 💬 Looking for more details? Reply to this comment to chat with Korbit. </sub> <!--- korbi internal id:2d7c01e7-9b21-4a04-b6b9-2868909dd7d9 --> [](2d7c01e7-9b21-4a04-b6b9-2868909dd7d9) ########## superset-frontend/packages/superset-ui-core/src/components/Loading/index.tsx: ########## @@ -38,28 +60,31 @@ display: block; } &.floating { - padding: 0; + /* padding: 0; */ margin: 0; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); } `; -export function Loading({ - position = 'floating', - image, - className, -}: LoadingProps) { +export function Loading({ position = 'floating', className }: LoadingProps) { + const [svgContent, setSvgContent] = useState(''); + + useEffect(() => { + console.log('Loading SVG'); + fetch('/static/assets/images/spinner.svg') + .then(response => response.text()) + .then(htmlString => { + setSvgContent(htmlString); + }); Review Comment: ### Asset Loading Coupled to Component <sub></sub> <details> <summary>Tell me more</summary> ###### What is the issue? The Loading component fetches SVG content directly in the component, violating separation of concerns and making the component tightly coupled to a specific asset path. ###### Why this matters This creates maintenance issues, reduces reusability, and makes testing more difficult. The asset loading logic should be handled at a higher level or through a dedicated service. ###### Suggested change ∙ *Feature Preview* Create an asset service or move the SVG content to a separate module: ```typescript // assets.ts export const SpinnerSvg = `<svg>...</svg>`; // Loading.tsx import { SpinnerSvg } from './assets'; export function Loading({ position = 'floating', className }: LoadingProps) { return ( <LoaderWrapper className={cls('loading', position, className)} dangerouslySetInnerHTML={{ __html: SpinnerSvg }} /> ); } ``` ###### Provide feedback to improve future suggestions [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/91fd4cf4-64a4-4038-9740-c8d8aca84af0/upvote) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/91fd4cf4-64a4-4038-9740-c8d8aca84af0?what_not_true=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/91fd4cf4-64a4-4038-9740-c8d8aca84af0?what_out_of_scope=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/91fd4cf4-64a4-4038-9740-c8d8aca84af0?what_not_in_standard=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/91fd4cf4-64a4-4038-9740-c8d8aca84af0) </details> <sub> 💬 Looking for more details? Reply to this comment to chat with Korbit. </sub> <!--- korbi internal id:9cb42202-3595-4bd0-a0a1-37f5618f7e34 --> [](9cb42202-3595-4bd0-a0a1-37f5618f7e34) ########## superset/templates/superset/basic.html: ########## @@ -63,16 +76,66 @@ {% block body %} <div id="app" data-bootstrap="{{ bootstrap_data }}"> - <img - src="{{ assets_prefix }}/static/assets/images/loading.gif" - style=" - width: 50px; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - " - /> + <div class="spinner"> + <svg + viewBox="-36 -25 72 50" + xmlns="http://www.w3.org/2000/svg" + overflow="visible" + > + <defs> + <filter id="shadow1" x="-50%" y="-50%" width="200%" height="200%"> + <feDropShadow + dx="1" + dy="1" + stdDeviation="2" + flood-color="rgba(0,0,0,0.3)" + /> + </filter> + <path + id="morphPath" + d="M 0,0 C 7,16 22,8.7 22,0 22,-8.7 7,-16 0,0 -7,16 -22,8.7 -22,-0 -22,-8.7 -7,-16 0,0 Z" + stroke-width="7" + fill="transparent" + filter="url(#shadow1)" + > + <animate + attributeName="d" + dur="8s" + repeatCount="indefinite" + values="M 0,0 C 7,16 22,8.7 22,0 22,-8.7 7,-16 0,0 -7,16 -22,8.7 -22,-0 -22,-8.7 -7,-16 0,0 Z; + M 0,0 C 7,16 22,8.7 22,0 22,-8.7 7,-16 0,0 -7,16 -22,8.7 -22,-0 -22,-8.7 -7,-16 0,0 Z; + M 0,-16 C 8.7,-16 16,-8.7 16,0 16,8.7 8.7,16 0,16 -8.7,16 -16,8.7 -16,-0 -16,-8.7 -8.7,-16 0,-16 Z; + M 0,-16 C 8.7,-16 16,-8.7 16,0 16,8.7 8.7,16 0,16 -8.7,16 -16,8.7 -16,-0 -16,-8.7 -8.7,-16 0,-16 Z; + M 0,0 C 7,-16 22,-8.7 22,0 22,8.7 7,16 0,0 -7,-16 -22,-8.7 -22,0 -22,8.7 -7,16 0,0 Z; + M 0,0 C 7,-16 22,-8.7 22,0 22,8.7 7,16 0,0 -7,-16 -22,-8.7 -22,0 -22,8.7 -7,16 0,0 Z; + M 0,16 C 8.7,16 16,8.7 16,0 16,-8.7 8.7,-16 0,-16 -8.7,-16 -16,-8.7 -16,0 -16,8.7 -8.7,16 0,16 Z; + M 0,16 C 8.7,16 16,8.7 16,0 16,-8.7 8.7,-16 0,-16 -8.7,-16 -16,-8.7 -16,0 -16,8.7 -8.7,16 0,16 Z; + M 0,0 C 7,16 22,8.7 22,0 22,-8.7 7,-16 0,0 -7,16 -22,8.7 -22,-0 -22,-8.7 -7,-16 0,0 Z" + keyTimes="0;0.1;0.2;0.4;0.5;0.6;0.7;0.9;1" + /> + </path> + </defs> + <!-- First path with morphing animation --> + <use href="#morphPath" stroke="var(--accent-color, currentColor)" /> + + <!-- Second (repeated) path with dash animation --> + <use + href="#morphPath" + stroke="var(--primary-color, inherit)" + stroke-dasharray="108 10" Review Comment: ### Unexplained SVG Dash Values <sub></sub> <details> <summary>Tell me more</summary> ###### What is the issue? Magic numbers used in SVG stroke-dasharray without explanation of their visual effect ###### Why this matters Makes it difficult to maintain or adjust the dashed line pattern without understanding the meaning of these specific values ###### Suggested change ∙ *Feature Preview* Add a comment explaining the dash pattern: ```html <!-- Create dashed effect with 108px dash and 10px gap --> <use href="#morphPath" stroke="var(--primary-color, inherit)" stroke-dasharray="108 10" > ``` ###### Provide feedback to improve future suggestions [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/071cff02-f236-4609-b869-044a4b69bb0f/upvote) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/071cff02-f236-4609-b869-044a4b69bb0f?what_not_true=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/071cff02-f236-4609-b869-044a4b69bb0f?what_out_of_scope=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/071cff02-f236-4609-b869-044a4b69bb0f?what_not_in_standard=true) [](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/071cff02-f236-4609-b869-044a4b69bb0f) </details> <sub> 💬 Looking for more details? Reply to this comment to chat with Korbit. </sub> <!--- korbi internal id:0abc235b-46fd-4356-aa93-e648a6d32c37 --> [](0abc235b-46fd-4356-aa93-e648a6d32c37) -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: notifications-unsubscr...@superset.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@superset.apache.org For additional commands, e-mail: notifications-h...@superset.apache.org