svelte icon indicating copy to clipboard operation
svelte copied to clipboard

Svelte 5: Invalid namespace of elements within SVG

Open mspae opened this issue 1 year ago • 5 comments

Describe the bug

In certain situations* the elements inside SVG elements appear to have an invalid namespace which means they are shown in the inspector (DOM tree) but are not actually visible.

*] ~~Such as using conditions and snippets in an svg element.~~ Correction: When using a <svelte:element> whose this property expression is defined inside a closure (f.x. inside a snippet as a @const)

A similiar issue seems to have popped up several times through the years: https://github.com/sveltejs/svelte/issues?q=is%3Aissue+is%3Aopen+namespace+svg

Reproduction

https://svelte-5-preview.vercel.app/#H4sIAAAAAAAAA-1XXW_bNhT9K4S6hwQQaZGiJVt1sm5ZMwzIiqHF9jINgyMrtgBZEiQmTmD4v-9cUlaaeOm6D9Qvg2Fbury8H-dc8UBb76Yo885Lft161Xyde4n3TdN4vmceGrrp7vLS5Ljv6ts2I8usy9qiMedpxVixburWsHd1u56XH-6W7Kat1yz1xGgwCRch9V6nVWr6Dd89IFeRvS3zdV6ZJxsPlj4OMBsNyXGzCs9dGvbhl-99VtWsaetrbExmI6zB47Gw0bAFvmxTmBVbuEwsd6mGTYfF7Xd35qHM6dIky7K-npcn3d3ylG3Jkpr61pRFlSdMNvesq8tiwdrl9fwk8O1HjE9fO8f1_J5vioVZwTXI19a6s8318QH3ul4UN0W-8BLT3uY7f2BnaOnTHKHq-3VZdWeptzKmSUajzWYjNqGo2-VIBUEwgkvqsbsi33xb38MtYAGbToRkUk5Sz9I7a-ZmRReMYUpKOL26vAzfBkHqOesCph-nUkx8ORbRxSQQUx4I6Y-nQnEtYl-HIvLHQl3JCGalxORiAouKxdgPhfZDrPlSTMlxmnEpQj8WIWLAqhE2hEHBShAxlnFFe0TENdwim0EiO22M_AnCAGVfTqgCLKmx0JmUVFvsh4ryBoinJxQ9ELqkMrjET0YXNpoSMZeUBekVR2rZp0YRHKUhg-JUGkdptB5m8ObUpsY6fikAarqYAgPKKv1p7Hqf-gNUDsDRyyhfPoFYA1iUbDGiNhVyo01UQkUCSFjjDFUQ6tp-p6AipPbGKJGKDiw8Glti_EeAMioDcsC_pIb7Ri3kuI-IFYfUBHDqUmJbWFp-Zeb-4BZYd1SHey1kRkwoQtkyRTyhdxRHKS2tthSkA06BiK-iMSiL1YCytoVSgwreKBJdTLA7pEIpqwVeosfI0s7JVVsKiCBJfVF1kWMKMR6bjksuaUIiEe8HihakDRrRHPKxLV__BczyGcx6DzMFUIQDLWAiIxqm-HHQhjYxJACGRpmmf2z7GGdISv3QCFukfErqU9LQhtX2S6FDGnTKaUF1z90AKsFGRMGFLgjUPbtubGEAvZxGnOjlRC8wJX4JYZnZX8sFeU-pWE7s_m3Er0KaJR0NzxF3Q-P6VIQrNoLiLrB4oHefqH06RmE_RtFLY1QSr-gpfgnaPvs_A5ii0JMlaYXTAWZZ5fYYI1ovNB1WMkAiX6v-WUXxw2P7-LzP6OA9_9QJf6A_n6fGqcnqqjNsy7pVfVsu3ufVIm_Zjp2xr6CLTXfi9KfMDaMTR9JCZ-Ymx8KTFfXxCgnfPrSZL2kt9eyJdSDITiP_A-VJzcx1mvTa7HTTrIrubEtF7JwhNddFtUic3fa0c4fmS3r1v2L9S8Vy5IyesuPIN9tXXVU0zX6Ifu_vTk53rqDtm2GKzvYjxPq1Z3yzgeqeacaeMa3-hOnLZzR_MdU8omZ-WcU8il4eSy2PrJXHVMoj62T_wmW2o_4M2fUnzJvWidrhAeNk1b3jtU5oV_r8HRS1a-ZZ3tHbnYb1J1KJhDm1YF87JRTV3u_n9z-wBALHObtFphu8zy0Y56m3m127sBRA9QFUH0B9ToBDyf9t9weK7zAyfg8AAA==

Logs

No response

System Info

System:
    OS: Linux 5.10 Debian GNU/Linux 11 (bullseye) 11 (bullseye)
    CPU: (4) x64 Intel Core Processor (Skylake, IBRS)
    Memory: 6.80 GB / 7.76 GB
    Container: Yes
    Shell: 5.1.4 - /bin/bash
  Binaries:
    Node: 20.13.1 - /usr/bin/node
    npm: 10.5.2 - /usr/bin/npm
  Browsers:
    Chrome: 125.0.6422.112
  npmPackages:
    @astrojs/svelte: ^5.5.0 => 5.5.0 
    astro: ^4.9.2 => 4.9.2 
    svelte: ^5.0.0-next.151 => 5.0.0-next.151

Severity

blocking an upgrade

Update

Fixed wrong error description and update reproduction REPL link

mspae avatar Jun 11 '24 09:06 mspae

I forgot to mention: Using <svelte:options namespace="svg" /> does not have any effect.

I was able to get the element to show using a use: directive like this to dynamically change the elements namespace: https://github.com/sveltejs/svelte/issues/7807#issuecomment-1362454410

mspae avatar Jun 11 '24 09:06 mspae

I can't reproduce this. The REPL works as expected: If I add shouldRender to the <SvgWithCondition /> component it shows the path (it's invisible because it has white fill, changing the color reveals it).

Please state the steps to reproduce this.

dummdidumm avatar Jun 11 '24 11:06 dummdidumm

Oops. Sorry, you're totally right. I seem to have been confused :see_no_evil:

The issue happens when using a dynamic element (<svelte:element>) within an svg but only when defining the tag expression inside the close (f.x. the snippet)

Here is an updared reproduction:

https://svelte-5-preview.vercel.app/#H4sIAAAAAAAAA-1XXW_bNhT9K4S6hwQQaZGiJVt1sm5ZMwzIiqHF9jINgyMrtgBZEiQmTmD4v-9cUlaaeOm6D9Qvg2Fbury8H-dc8UBb76Yo885Lft161Xyde4n3TdN4vmceGrrp7vLS5Ljv6ts2I8usy9qiMedpxVixburWsHd1u56XH-6W7Kat1yz1xGgwCRch9V6nVWr6Dd89IFeRvS3zdV6ZJxsPlj4OMBsNyXGzCs9dGvbhl-99VtWsaetrbExmI6zB47Gw0bAFvmxTmBVbuEwsd6mGTYfF7Xd35qHM6dIky7K-npcn3d3ylG3Jkpr61pRFlSdMNvesq8tiwdrl9fwk8O1HjE9fO8f1_J5vioVZwTXI19a6s8318QH3ul4UN0W-8BLT3uY7f2BnaOnTHKHq-3VZdWeptzKmSUajzWYjNqGo2-VIBUEwgkvqsbsi33xb38MtYAGbToRkUk5Sz9I7a-ZmRReMYUpKOL26vAzfBkHqOesCph-nUkx8ORbRxSQQUx4I6Y-nQnEtYl-HIvLHQl3JCGalxORiAouKxdgPhfZDrPlSTMlxmnEpQj8WIWLAqhE2hEHBShAxlnFFe0TENdwim0EiO22M_AnCAGVfTqgCLKmx0JmUVFvsh4ryBoinJxQ9ELqkMrjET0YXNpoSMZeUBekVR2rZp0YRHKUhg-JUGkdptB5m8ObUpsY6fikAarqYAgPKKv1p7Hqf-gNUDsDRyyhfPoFYA1iUbDGiNhVyo01UQkUCSFjjDFUQ6tp-p6AipPbGKJGKDiw8Glti_EeAMioDcsC_pIb7Ri3kuI-IFYfUBHDqUmJbWFp-Zeb-4BZYd1SHey1kRkwoQtkyRTyhdxRHKS2tthSkA06BiK-iMSiL1YCytoVSgwreKBJdTLA7pEIpqwVeosfI0s7JVVsKiCBJfVF1kWMKMR6bjksuaUIiEe8HihakDRrRHPKxLV__BczyGcx6DzMFUIQDLWAiIxqm-HHQhjYxJACGRpmmf2z7GGdISv3QCFukfErqU9LQhtX2S6FDGnTKaUF1z90AKsFGRMGFLgjUPbtubGEAvZxGnOjlRC8wJX4JYZnZX8sFeU-pWE7s_m3Er0KaJR0NzxF3Q-P6VIQrNoLiLrB4oHefqH06RmE_RtFLY1QSr-gpfgnaPvs_A5ii0JMlaYXTAWZZ5fYYI1ovNB1WMkAiX6v-WUXxw2P7-LzP6OA9_9QJf6A_n6fGqcnqqjNsy7pVfVsu3ufVIm_Zjp2xr6CLTXfi9KfMDaMTR9JCZ-Ymx8KTFfXxCgnfPrSZL2kt9eyJdSDITiP_A-VJzcx1mvTa7HTTrIrubEtF7JwhNddFtUic3fa0c4fmS3r1v2L9S8Vy5IyesuPIN9tXXVU0zX6Ifu_vTk53rqDtm2GKzvYjxPq1Z3yzgeqeacaeMa3-hOnLZzR_MdU8omZ-WcU8il4eSy2PrJXHVMoj62T_wmW2o_4M2fUnzJvWidrhAeNk1b3jtU5oV_r8HRS1a-ZZ3tHbnYb1J1KJhDm1YF87JRTV3u_n9z-wBALHObtFphu8zy0Y56m3m127sBRA9QFUH0B9ToBDyf9t9weK7zAyfg8AAA==

mspae avatar Jun 11 '24 13:06 mspae

It's not possible for Svelte to know what namespace to assign to the dynamic element because it's inside a snippet and therefore could be rendered from anywhere. What you can do in these situations is add xmlns="http://www.w3.org/2000/svg" to the <svelte:element> tag. Giving this the documentation label, we should add this info to the docs.

dummdidumm avatar Jun 11 '24 14:06 dummdidumm

Great, thanks for the info!

mspae avatar Jun 11 '24 15:06 mspae