모더터 아이콘 변경하는 방법

여러분, 이 글을 읽었습니다: Replace Discourse's default SVG icons with custom icons in a theme

스프라이트 시트를 생성했습니다(제대로 한 것 같습니다):

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
    <symbol id="mod-crown" width="13" height="11" viewBox="0 0 13 11">
        <metadata><?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
            <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c142 79.160924, 2017/07/13-01:06:39        ">
                <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
                    <rdf:Description rdf:about=""/>
                </rdf:RDF>
            </x:xmpmeta>
            <?xpacket end="w"?></metadata>
        <defs>
            <style>
                .cls-1 {
                fill: #04b214;
                }

                .cls-1, .cls-2, .cls-3, .cls-4 {
                fill-rule: evenodd;
                }

                .cls-3 {
                fill: #29ec3a;
                }

                .cls-4 {
                fill: #1f8111;
                }
            </style>
        </defs>
        <path class="cls-1" d="M11,5V3h1V5H11ZM10,7v3H9V7H7V8H6V7H4v3H3V7H2V5H5V3H6V1H7V3H8V5h3V7H10ZM8,10H7V8H8v2ZM5,10V8H6v2H5ZM1,3H2V5H1V3Z"/>
        <path class="cls-2" d="M8,10V8H7V7H9v3H8ZM6,10V8H7v2H6ZM5,10H4V7H6V8H5v2Z"/>
        <path class="cls-3" d="M11,3V1h1V3H11ZM10,5V3h1V5H10ZM4,5V3H5V5H4ZM5,1H6V3H5V1ZM2,7H3v3H2V7ZM1,5H2V7H1V5ZM0,1H1V5H0V1Z"/>
        <path class="cls-4" d="M12,5V0h1V5H12ZM11,7V5h1V7H11Zm0,4H2V10h8V7h1v4ZM8,3H9V5H8V3ZM7,1H8V3H7V1ZM6,0H7V1H6V0ZM2,3H3V5H2V3ZM1,1H2V3H1V1ZM0,0H1V1H0V0Z"/>
    </symbol>
</svg>

about.json에 에셋을 추가했습니다:

    "assets": {
        "mod-crown": "assets/mod-crown.svg"
    }

그리고 header.html에 이것을 추가했습니다:

<script type="text/discourse-plugin" version="0.8">
    api.replaceIcon('d-icon-shield-halved', 'mod-crown');
</script>

하지만 아이콘이 변경되지 않고 방패 아이콘이 그대로 남아 있습니다. 제가 어디를 잘못하고 있는 걸까요?

안녕하세요, 환영합니다!

mod-crown 변수명은 icons-sprite로 대체되어야 합니다.

저도 이전에 같은 문제를 겪었는데요, 이 부분의 문서가 개선될 수 있을 것 같습니다.


또한,

다음과 같이 해야 합니다: api.replaceIcon('shield-halved', 'mod-crown');

이 부분을 수정했지만 아무런 변화가 없습니다.

    "assets": {
        "icons-sprite": "assets/mod-crown.svg"
    }

제 스프라이트시트가 유효한가요? 다른 스프라이트시트(예: assets/spritesheet.svg · main · Manuel Kostka / Discourse / Themes / Heroes · GitLab)와 다르게 보입니다.

스프라이트시트의 svg 태그에서 style="display: none;"를 제거해 보았지만, 이것도 도움이 되지 않았습니다.

혹시 모르니 메타데이터를 제거해 보셨나요?

저도 직접 시도해 보겠습니다.

메타데이터를 제거해도 변경 사항이 없습니다.

하지만:

<script type="text/discourse-plugin" version="0.8">
    api.replaceIcon('shield-alt', 'mod-crown');
</script>

이렇게 하면 아이콘이 표시되지만, 호환성에 대한 무서운 경고도 함께 표시됩니다:

인스펙터에서는 다음과 같은 경고를 받습니다: Deprecation notice: The icon name "shield-alt" has been updated to "shield-halved".

그리고 d-icon-shield-halved 대신 shield-halved를 사용하면 정상적으로 작동합니다!

도와주셔서 감사합니다 :grin:

말하려던 게 딱 그거였는데, 나도 방금 알아챘어요!

잘 작동해서 다행이에요. :grinning_face_with_smiling_eyes: