Discourse의 기본 SVG 아이콘을 개별적으로 또는 전체를 하나의 세트로 자체 제작한 SVG로 교체하고, 테마 또는 테마 컴포넌트 내에서 오버라이드할 수 있습니다.
1단계 - SVG 스프라이트시트 생성
시작하려면 SVG 스프라이트시트를 생성해야 합니다. 이 시트에는 추가적인 커스텀 SVG 아이콘 1개부터 수백 개에 이르는 전체 교체 세트까지 무엇이든 포함될 수 있습니다.
스프라이트시트는 SVG 파일로 저장되어야 합니다. 원칙적으로, 원래 SVG 아이콘 파일의 <svg> 태그 내부 내용을 <symbol> 태그 안에 중첩시키고, 각기 고유한 식별자를 부여하는 방식입니다.
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="my-theme-icon-1">
<!--
소스 SVG 아이콘 파일의 <svg> 태그 내부 코드
이는 일반적으로 <svg> 태그 사이의 모든 내용입니다
(단, <svg> 태그 자체는 제외하며, 위 <symbol> 태그로 대체됩니다)
속성(예: ViewBox="0 0 0 0")은 <symbol> 태그로 전달할 수 있습니다
-->
</symbol>
<symbol id="my-theme-icon-2">
<!-- 여기에 SVG 코드를 넣습니다. 필요에 따라 <symbol> 블록을 더 추가하세요.
-->
</symbol>
</svg>
-
스프라이트시트의 각 심볼에 고유한 ID를 추가하는 것을 잊지 마세요. 정신 건강을 위해 ID 앞에 테마 이름(예:
my-theme-icon)을 접두사로 붙이는 것이 도움이 될 수 있습니다. -
기존 아이콘처럼 아이콘 색상이 동적으로 변경되도록 하려면, 하드코딩된 색상(예: #333) 대신
fill을currentColor로 설정하세요. -
아이콘을 올바르게 확장하거나 중앙 정렬하려면
<symbol>태그에viewBox속성을 사용하세요. 자세한 내용은 How to Scale SVG | CSS-Tricks 를 참조하세요. -
SVG 내부의 스타일 충돌에 주의하세요. 예를 들어, SVG에는
.st0{fill:#FF0000;}와 같은 인라인 스타일이 정의되어 있는 경우가 많습니다. 여러 SVG가 동일한 클래스를 사용하면 문제가 발생할 수 있습니다(이러한 문제를 해결하려면 각 아이콘마다 클래스를 고유하게 수정하세요). -
아이콘이 많다면 자동화 방법이 있습니다. https://www.npmjs.com/package/svg-sprite-generator 는 SVG를 스프라이트시트로 결합하는 간단한 명령줄 도구입니다.
예시 - 단일 커스텀 아이콘 스프라이트시트
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="bat-icon" viewBox="6 6 36 36">
<path
fill="currentColor"
d="M24,18.2c0.7,0,0.9,0.2,0.9,0.2l0.4-1.7c0,0,0.4,1.5,0.4,2.8c0.2,1.1,2.2,0.4,3.9,0C31.4,19.1,32,16,32,16h16c0,0-9.4,3.5-7,10c0,0-14.8-2-17,7l0,0c-2.2-9-17-7-17-7c2.4-6.5-7-10-7-10h16c0,0,0.6,3.1,2.3,3.5c1.7,0.4,3.9,1.1,3.9,0c0.2-1.1,0.4-2.8,0.4-2.8l0.4,1.7C23.1,18.4,23.4,18.2,24,18.2L24,18.2L24,18.2z"
/>
</symbol>
</svg>
2단계 - 테마에 스프라이트시트 추가
스프라이트시트가 생성되면, 해당 SVG 파일을 컴포넌트/테마에 추가해야 합니다. UI를 통해 쉽게 수행할 수 있으며, 컴포넌트/테마에 하드코딩하는 것도 가능합니다.
설치된 컴포넌트/테마 중 어디에든 업로드되면,
<symbol>태그의 ID를 사용하여 인스턴스 전체에서 사용할 수 있게 됩니다.
UI를 통한 방법
테마/컴포넌트 설정의 업로드(Uploads) 섹션으로 이동하여 icons-sprite라는 SCSS 변수 이름을 가진 스프라이트 파일을 추가하세요:
테마/컴포넌트에 하드코딩
스프라이트시트 파일을 테마의 /assets 폴더에 추가합니다. 그런 다음 루트 폴더의 assets.json 파일을 업데이트하세요.
my-icons.svg라는 이름의 SVG 스프라이트의 경우, about.json 파일에는 다음 내용이 포함되어야 합니다:
"assets": {
"icons-sprite": "/assets/my-icons.svg"
}
3단계 (선택 사항) - 기본 아이콘 오버라이드
이제 스프라이트시트가 설정되었으므로, Discourse에 아이콘을 교체하도록 지시할 수 있습니다. api-initializer를 통해 수행하는 방법은 다음과 같습니다:
// {theme}/javascripts/discourse/api-initializers/init-theme.gjs
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer((api) => {
api.replaceIcon("bars", "my-theme-icon-bars");
api.replaceIcon("link", "my-theme-icon-link");
// etc.
});
첫 번째 ID인 bars는 Discourse의 기본 아이콘 ID이고, 두 번째는 대체 아이콘의 ID입니다. 아이콘 ID를 찾는 가장 쉬운 방법은 브라우저에서 아이콘을 검사하는 것입니다.
여기서 아이콘 이름은 d-icon- 접두사를 따릅니다. 따라서 이 예시에서는 d-unliked가 됩니다.
대부분의 아이콘은 https://fontawesome.com/ 의 아이콘 이름을 따르지만, 예외도 있습니다(이것이 인스펙터에서 ID를 확인하는 것이 가장 신뢰할 수 있는 방법인 이유입니다). 모든 예외는 github에서의 const REPLACEMENTS 블록에서 확인할 수 있습니다.
이것으로 끝입니다. 이제 자체 제작한 커스텀 아이콘으로 Discourse를 스타일링할 수 있습니다!
이 문서는 버전 관리됩니다 - github에서 변경 사항을 제안하세요.








