직접 스타일을 적용해 게시물 내용을 커스터마이즈하기

요구 사항

:information_source: 이 팁과 트릭을 사용하려면 자체 호스팅 Discourse 인스턴스 또는 Basic보다 높은 Discourse 호스팅 플랜의 관리자가여야 합니다.

소개

Discourse는 게시물의 내용을 포맷팅하고 커스터마이징하는 여러 방법을 지원합니다. 목록은 여기서 확인할 수 있습니다:

하지만 때로는 버튼처럼 보이는 링크와 같이 더 구체적인 것이 필요할 수 있습니다.

Green button

이 가이드에서는 이러한 종류의 수정 사항을 배웁니다.

논리 구조

뒤에 있는 논리를 간략히 설명하겠습니다. 다음 단계로 건너뛰어 실용적인 예제를 바로 살펴볼 수도 있습니다. :slight_smile:

Discourse는 게시물 콘텐츠에서 data-로 시작하는 모든 HTML 속성을 허용합니다.
이러한 속성들은 CSS를 통해 콘텐츠를 커스터마이징할 때 대상이 됩니다.

이 튜토리얼에서는 이를 data- 속성이라고 부르겠습니다. :slight_smile:

이러한 속성을 가진 요소를 만드는 방법 중 하나는 BBcode와 유사한 태그인 [wrap]를 사용하는 것입니다. 여기에 원하는 값을 추가합니다. 여기서는 "button"을 선택했습니다(이것은 무엇이든 될 수 있으며, 심지어 당신의 강아지 이름일 수도 있습니다 :dog:):

[wrap=button]some text[/wrap]

이것은 다음 속성을 가진 HTML 요소를 출력합니다: data-wrap="button".

첫 번째 예제: 분홍색 배경

실용적인 예제로 시작해 보겠습니다. 분홍색 배경을 가진 텍스트를 만들어 보겠습니다.

블록 요소로

게시물에서 빈 줄에 다음을 입력하세요:

[wrap=pink]pink text[/wrap]

이것은 data-wrap="pink" 속성을 가진 div 요소를 생성합니다.

그런 다음, 다음 CSS를 테마에 추가하세요.
관리자 패널 → 커스터마이징 → 테마 → 내 테마 → CSS/HTML 편집 → CSS 로 이동합니다.

다음과 같은 CSS 코드를 입력하세요:

[data-wrap="pink"] {
  background: pink;
}

그런 다음 저장 버튼을 클릭하세요.

게시물로 돌아가서 결과를 확인해 보세요:

네, 이미 아름답습니다. :cherry_blossom:

배경이 게시물의 전체 폭을 덮는 것을 알 수 있을 것입니다. 우리의 wrap이 해당 줄의 유일한 요소이기 때문에 블록 요소로 출력됩니다.
블록과 인라인 HTML 요소의 차이에 대해서는 여기서 더 자세히 배울 수 있습니다: HTML Block and Inline Elements.

여러 줄에 걸쳐 분홍색 배경을 원한다면(여전히 블록으로), [wrap] 태그가 같은 줄에 다른 콘텐츠나 텍스트가 없어야 합니다:

[wrap=pink]
pink text
pink text
pink text
pink text
[/wrap]

이것은 다음과 같이 보입니다:

인라인 요소로

이제, [wrap] 앞에, 뒤에, 또는 양쪽에 텍스트를 추가해 보겠습니다. :smile: 예를 들어:

Here is some [wrap=pink]pink text[/wrap] and it's awesome ✨

다음은 결과입니다:

텍스트나 다른 요소가 [wrap] 태그 중 하나와 같은 줄에 있으면, 그것은 인라인 요소로 출력됩니다.

두 번째 예제: 버튼 모양의 링크

[wrap] 태그를 다룰 때 맥락에 따라 블록 또는 인라인 요소가 될 수 있기 때문에, 다양한 이유로 원치 않는 결과가 나올 수 있습니다.
따라서 동일한 결과를 달성하는 두 가지 다른 방법을 설명하겠습니다. 가장 마음에 드는 방법을 선택할 수 있습니다. :v:

[wrap]를 사용한 인라인 버튼 링크

마크다운을 사용하여 링크를 만드는 문법은 다음과 같습니다: [some text](https://some-link.etc).
텍스트를 커스터마이징하여 버튼처럼 보이게 하려면, 대괄호 안에 wrap을 삽입합니다. 다음은 예제입니다:

This [[wrap=button]nice link[/wrap]](https://discourse.org/) is a blue button 🐳 !

이 코드가 무엇을 출력하는지에 대해 언급하지 않겠습니다. [wrap=button]을 작성했으므로 CSS에서 [data-wrap="button"]을 대상으로 해야 한다는 것을 알고 있기 때문입니다.

자, 가자, 멋있는 CSS를 추가하여 예쁘게 만들어 보겠습니다! :sparkles:

[data-wrap="button"] {
  display: inline-block;
  padding: 0.5em 1em;
  background: DodgerBlue;
  color: White;
}

여기서는 CSS 규칙을 자세히 설명하지 않겠습니다. 인터넷에는 많은 CSS 리소스가 있으므로, 더 구체적인 수정을 하려면 먼저 학습이 필요합니다. :slight_smile:

결과 :magic_wand: :

좋아 보이죠?

일반 HTML 콘텐츠를 사용한 인라인 버튼 링크

Discourse가 HTML 코드를 허용하므로, [wrap] 태그를 사용하지 않고 data- 속성을 가진 HTML을 사용할 수 있습니다. 이 예제에서는 링크에 대한 일반 마크다운 문법을 사용하고 <span> 태그로 감싸겠습니다.
:information_source: <a> 태그는 예외 사항이므로 data- 속성을 허용하지 않아 직접 사용할 수 없습니다.

다음과 같이 입력하세요:

This <span data-button>[link](https://discourse.org/)</span> is a green button 🐸 !

이것은 data-button 속성을 가진 <span> 태그 안쪽에 링크를 출력하므로, CSS가 약간 더 복잡해집니다. data-button과 링크 모두를 대상으로 해야 합니다:

[data-button] {
  display: inline-block;
  padding: 0.5em 1em;
  background: ForestGreen;
  a {
    color: White;
  }
}

그리고 이것이 결과입니다!

더 나아가기

[wrap]를 사용한 커스터마이징된 목록

[wrap] 태그와 data- 속성은 많은 컨텍스트에서 사용할 수 있으며, 더 고급 콘텐츠를 커스터마이징할 수 있습니다. 한계는 주로 CSS 지식(그리고 HTML은 그보다 적은 정도)입니다.

설명 없이 하나의 예제만 제시하겠습니다. 각 요소 앞에 고양이 이모지가 붙는 목록을 커스터마이징하는 것입니다:

텍스트:

[wrap=cat]

- Felix
- Garfield
- Nat's cat
  [/wrap]

CSS:

[data-wrap="cat"] ul {
  list-style: none;
  li:before {
    content: "🐈";
    margin-right: 0.25em;
  }
}

결과:

사용자 정의 테마 색상 변수 사용

사용자가 다른 테마나 색상을 사용할 수 있도록 허용한 경우, 특히 라이트와 다크 컬러 스키마를 선택할 수 있는 경우, 수정 사항이 모든 테마에서 잘 보이지 않을 수 있습니다.

좋은 관행은 red, #FF0000 또는 rgb(255,0,0)와 같이 "하드코딩"된 색상 대신 Discourse의 색상 변수를 사용하는 것입니다.

다음은 버튼의 배경색이 현재 팔레트의 기본 색상을 사용하고, 텍스트가 보조 색상을 사용하는 예제입니다:

텍스트:

This [[wrap=button]nice link[/wrap]](https://discourse.org/) is a button 🌈 !

CSS:

[data-wrap="button"] {
  display: inline-block;
  padding: 0.5em 1em;
  background: var(--primary);
  color: var(--secondary);
}

Solarized Light 컬러 스키마를 사용하는 사용자에게는 다음과 같이 보입니다:

그리고 Solarized Dark 컬러 스키마를 사용하는 경우:

결론

이제 [wrap] 요소와 data- 속성을 사용하여 사용자 정의 요소를 만드는 기본기를 갖추었습니다.

더 고급스러운 커스터마이징을 하려면 CSS 학습이 필수적입니다. 인터넷에서 많은 튜토리얼을 찾을 수 있습니다.

다음과 같은 Discourse 가이드도 도움이 될 수 있습니다: Making custom CSS changes on your site.
인터넷 브라우저의 개발자 도구를 사용하면 Discourse의 색상 변수 목록과 각 변수의 모습을 쉽게 확인할 수 있습니다:


:raised_hand_with_fingers_splayed: 이 가이드에 대한 수정 사항을 제안하는 것을 주저하지 마세요!


이 문서는 버전 관리됩니다 - 변경 사항을 github에서 제안하세요.

23개의 좋아요

감사합니다 @Canapin

이러한 개념 중 일부를 활용한 테마 컴포넌트의 좋은 예시는 다음과 같습니다:

4개의 좋아요

좋은 결과네요!

데이터 속성을 활용하여 사용자가 어떤 창의적인 해결책을 내놓을지 궁금합니다.


BBCode의 [wrap="button"]보다 HTML의 <span data-button>을 사용하는 데 장점이 있나요?

2개의 좋아요

깊이 생각해보지 않았지만, <span>을 사용하면 인라인(inline) 요소를 단일 줄의 유일한 내용으로 넣을 수 있다고 봅니다.

단일 줄에 다른 내용 없이 [wrap]를 사용하면 자동으로 블록(block) 요소가 출력됩니다. 내부 텍스트도 <p> 태그로 감싸집니다.

그 외에는 취향의 문제일 가능성이 높습니다. 대부분의 용도에 대해 [wrap]와 HTML 요소 모두 여러 -data 속성을 가질 수 있다는 점은 언급하지 않았습니다. 대부분의 용도에는 매우 유용하지 않다고 생각하기 때문입니다.

3개의 좋아요

게시물/토픽에 Bootstrap “Cards” 추가하기

…어떤 사람들은 이것이 미쳤다고, 너무 복잡하다고, 또는 과장된다고 할지 모르지만 저는 이걸 좋아합니다 :smiley:

  • BBCode의 중첩 구조를 더 잘 볼 수 있도록 몇 가지 색상을 추가했습니다.

주의! 제 코드를 사용하지 마세요

대신 @Canapin 님이 게시한 개선된 코드를 사용하세요. 여기를 클릭하세요

토픽/게시물에 포함할 BBCode

[wrap="card"]
[wrap="card-header"]**카드 헤더**[/wrap]
[wrap="card-body"]
[wrap="card-title"]**카드 제목**[/wrap]
[wrap="card-text"]카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트[/wrap]
[/wrap]
[/wrap]

테마에 추가할 CSS 코드

// Bootstrap Card Box
[data-wrap="card"] {
    position: relative;
    display: flex;
    flex-direction: column;
    min-width: 0;
    word-wrap: break-word;
    background-color: #fff;
    background-clip: border-box;
    border: 1px solid rgba(0,0,0,.125);
    border-radius: 0.25rem;
}

// Bootstrap Card Header
[data-wrap="card-header"] {
    padding: 0.5rem 1rem;
    margin-bottom: 0;
    border-bottom: 1px solid rgba(0,0,0,.125);
    background: #007bff;
    color: #fff;
    border-radius: 5px 5px 0px 0px;
    
}

// Bootstrap Card Body
[data-wrap="card-body"] {
    flex: 1 1 auto;
    padding: 1rem 1rem;
}

// Bootstrap Card Title
[data-wrap="card-title"] {
    margin-bottom: 0.5rem;
}

// Bootstrap Card Text
[data-wrap="card-text"] {
    margin-top: 0;
    margin-bottom: 1rem;
}
4개의 좋아요

물론 무엇을 넣으려는지에 따라 다르지만, 예시와 완전히 동일한 시각적 효과를 얻으려면 코드를 많이 최적화할 수 있습니다:

[wrap="card-header"]**카드 헤더**[/wrap]
[wrap="card-body"]
**카드 제목**

카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트, 카드 텍스트
[/wrap]
[data-wrap="card-header"] {
    padding: 0.5em 1em;
    border: 1px solid rgba(0,0,0,.125);
    border-bottom: 0;
    background: #007bff;
    color: #fff;
    border-radius: 5px 5px 0 0;
}

[data-wrap="card-body"] {
    padding: 1em;    
    border: 1px solid rgba(0,0,0,.125);
    border-radius: 0 0 5px 5px;
}

5개의 좋아요

아! 훨씬 더 좋아졌네요! 이렇게 개선해 주셔서 정말 감사합니다! <3

좋네요! [wrap]...[/wrap] 요소 안의 마크다운은 언제 처리되나요, 아니면 wrap에 포함되기 전에 렌더링되도록 하는 방법이 있나요?

예를 들어, 요소 안의 텍스트를 굵게나 기울임으로 포맷팅해 봤지만, 그렇게 렌더링되지 않아요. 브라우저에서 저장한 후 _text_나 **text**만 보입니다 :frowning:

1개의 좋아요

실제로 포맷팅(HTML, Markdown 또는 BBcode)은 인라인 요소인 경우(같은 줄에 다른 콘텐츠가 있는 경우) [wrap] 태그 안에서 작동하지 않는 것 같습니다:

이 경우 <span> 태그를 만들어야 합니다.

2개의 좋아요