Tailwind를 사용해 Discourse 테마 설정하기

처음에는 HTML에 Tailwind 유틸리티 클래스를 추가하려면 템플릿 전체를 교체해야 한다고 생각했습니다. 하지만 Discourse 템플릿을 통째로 교체하는 것은 좋지 않은 방법이라는 조언을 받았습니다. 다행히도 Tailwind는 임의의 클래스 이름에도 CSS를 적용할 수 있습니다.

다음과 같은 방식으로 작업이 가능합니다…

@layer components {
  .d-header {
    @apply bg-blue-100;
  }

  #main-outlet.wrap {
    @apply bg-yellow-200;
  }
}

…이는 좋은 소식입니다. 그래서 저는 discourse_theme CLI를 사용하여 새로운 테마를 설정했습니다. tailwind-input.css 파일을 생성하고 Tailwind가 이를 소비하여 common/common.scss 파일을 생성하도록 했습니다.

하지만 그 후 Sass가 오류를 보고했습니다. 내용은 다음과 같았습니다.

✘ Error in common scss: Error: Function rgb is missing argument $green.
        on line 477 of common.scss
>>   background-color: rgb(239 246 255 / var(--tw-bg-opacity));

사실상 Tailwind가 생성한 CSS를 Sass 파일에 입력해서는 안 된다고 합니다. 권장되는 해결책은 Rails 앱을 다음과 같이 구성하는 것입니다.

config.assets.css_compressor = nil

저는 Rails나 Discourse 백엔드가 어떻게 구성되는지 알지 못하며, 관리형 호스팅을 사용하고 있으므로 이것이 저에게 실행 가능한 해결책인지도 모르겠습니다.

그래서 저는 다른 해결책을 계속 찾아보다가, Tailwind에게 문제적인 rgb 문법을 사용하지 않도록 지시할 수 있다는 사실을 알게 되었습니다.

그래서 저는 당분간 이 방식을 채택했고, 지금까지는 잘 작동하는 것 같습니다… 하지만 이것은 적절한 해결책이라기보다는 임시 대안처럼 느껴집니다…

좋은 해결책은 Discourse 테마에 common.scss 대신 common.css와 같은 순수한 CSS 파일을 제공하는 것입니다. 저는 이를 시도해 보았지만 Discourse가 제 CSS 파일을 무시했습니다.

Discourse에게 Sass 파일 대신 해당 CSS 파일을 사용하도록 지시할 수 있을까요? 아니면 이 문제에 대한 다른 좋은 해결책이 있을까요?

이 주제를 다시 올립니다. 여러 웹사이트 간 일관성을 위해 Tailwind를 사용하고 있습니다. @mksafi 님의 의견에 동의하며, 이상적인 해결책은 생성된 CSS를 Discourse 테마에 포함하는 것이라고 생각합니다.

전처리 과정을 거치지 않는 순수 CSS를 포함하는 방법은 무엇인가요?

감사합니다,
Andreas

제가 취한 접근법은 이 저장소에서 확인할 수 있습니다: GitHub - neo4j-contrib/discourse-theme-neo4j · GitHub

Tailwind와 관련된 핵심 사항은 다음과 같습니다:

  • 별도의 NPM 타겟이 postcss를 사용하여 tailwind를 빌드합니다: "tailwind:dev": "postcss tailwind/global.scss -o assets/tailwind.css
  • CSS 출력물은 테마에 포함되도록 assets 폴더에 배치됩니다. about.json 파일에 해당 에셋의 위치가 포함되어 있음을 확인하세요.
  • Discourse SCSS는 이 생성된 CSS를 직접 참조하지 않습니다.
  • 대신 javascripts/discourse/initializers/tailwind-init.js.es6에 있는 자바스크립트 초기화 프로그램이 해당 에셋을 discourse-assets-stylesheets 요소의 끝에 새로운 link 요소로 추가합니다.
  • 중요: tailwind.config.js에서 Tailwind의 preflight가 비활성화되어 있습니다. 그렇지 않으면 이전의 모든 CSS가 초기화되어 버리기 때문입니다. 대신 Tailwind 클래스를 추가하고 Discourse 자체의 preflight에 의존하는 방식을 원합니다.

우아하지는 않지만, 우리에게 잘 작동합니다. 참고용으로 활용해 보세요. :slight_smile:

안녕히 계세요,
Andreas

흥미롭네요. Discourse가 이미 scss 파일에서 선언한 것 위에 Tailwind 클래스를 겹쳐서 사용할 때 어떤 시각적 결과가 나오는지 궁금합니다.

인스펙터에서 한 줄씩 확인하면서 코어의 많은 요소를 Tailwind 클래스를 사용하도록 다시 스타일링하고 있나요?

테마 컴포넌트나 플러그인 같은 새로운 추가 기능에만 이렇게 사용하고 있나요?

이 방식이 실제로 어떻게 동작하는지 라이브 예시를 보고 싶습니다.

우리는 조직 전체에서 웹사이트부터 앱까지 Tailwind를 도입하기 시작했습니다. 초기 목표는 공통된 정의에서 브랜드 색상과 폰트를 가져와 Tailwind로 적용하는 것입니다. 이후 헤더, 내비게이션, 히어로 섹션과 같은 커스텀 컴포넌트에 이를 활용할 예정입니다. 이 작업은 제가 이전에 시작했으며, 이제 다시 진행을 재개한 상태입니다.

이 테마는 현재 저희 사이트에서 라이브로 제공 중이며, 샘플 게시글은 Neo4j Discourse 2021 Theme - General - Neo4j Online Community 에서 확인하실 수 있습니다.

관심 있으시다면, 더 야심 찬 작업을 진행하면서 업데이트를 공유하겠습니다.

안녕하세요 @abk,

우리는 확실히 관심이 있습니다. 진행 상황은 어떻게 되셨는지 궁금합니다 :slight_smile:

Discourse의 기본 테마를 Tailwind CSS로 변경하고 싶어서 의견을 구합니다. 저는 개발 경험이 많지 않아, Tailwind를 Discourse 인스턴스에 통합하고 우리 필요에 맞게 커스터마이징하는 데 어떤 과정이 필요한지 이해하려고 노력하고 있습니다. 저희는 필요에 따라 Tailwind CSS를 커스터마이징할 수 있는 개발자가 있지만, 그는 Discourse에 이를 통합하는 방법에 대해 익숙하지 않습니다. 또한, Discourse 기본 테마에 사용된 모든 HTML을 찾지 못했고, 이것이 커스터마이징의 시작점이 될 것이라고 가정하고 있습니다. 이 문제를 어떻게 해결해야 하는지 방향이나 조언을 주시면 매우 감사하겠습니다. 도움과 지원에 감사드립니다.