변수를 활용한 Discourse 스타일링: 공유와 소개

최근 Discourse에 많은 CSS 변수를 추가했습니다. 이 변수들은 테마 설정과 UI 요소 커스터마이징을 훨씬 쉽게 만들어 줍니다. 많은 변경 사항의 경우 더 이상 HTML에서 매우 구체적인 요소를 지정할 필요가 없으며, 대신 변수만 변경하면 됩니다.

변경할 수 있는 변수가 무엇인지 궁금하시다면, 이 정규식을 사용하여 앱을 살펴보는 것을 권장합니다 → --([a-zA-Z0-9\-_]+):

코드 에디터에서 위 정규식의 모든 인스턴스를 검색하면 다음과 같은 내용을 볼 수 있습니다:


최근 저는 shadcn/ui에 개인적으로 많은 영감을 받았으며, 특히 그들이 만든 테마 에디터에 주목했습니다 → https://tweakcn.com/

그들의 스타일을 참고하여, 변수만 사용하여 UI를 얼마나 많이 변경할 수 있는지 시험해 보았습니다. 제가 한 작업의 예시는 다음과 같습니다:

이것은 아직 진행 중인 작업(WIP)이며, 작동하려면 더 구체적인 CSS 타겟팅이 필요한 영역이 몇 군데 있지만, 핵심은 이제 새로운 CSS 변수를 사용하여 이러한 변경 사항을 훨씬 쉽게 할 수 있다는 것입니다.

이 스타일링은 변수만 사용하여 가능했습니다. 두 개의 파일로 나누었습니다.

간소화된 색상 팔레트

primary와 secondary 사이의 몇 가지 단계를 제거할 수 있는지 확인하고 싶었습니다. 또한 전체 팔레트를 단순화하기 위해 사용할 수 있는 tertiary의 양을 제한하고 싶었습니다.

:root {
  --color-1: #e2ece6;
  --base: oklch(from var(--color-1) l c h);
  --step: 0.15;

  /* 파생된 더 어두운 색상 */
  --color-2: oklch(from var(--base) calc(l - var(--step) * 0.25) c h);
  --color-3: oklch(from var(--color-2) calc(l - var(--step) * 0.55) c h);
  --color-4: oklch(from var(--color-3) calc(l - var(--step)) c h);
  --color-5: oklch(from var(--color-4) calc(l - var(--step)) c h);
  /* stylelint-disable-next-line hue-degree-notation */
  --color-6: oklch(from var(--color-5) 0.35 c h);

  /* 액센트 색상 */
  // --accent-color-1: #0867f6;
  --accent-color-1: oklch(from var(--color-1));
  --accent-color-light: oklch(from var(--accent-color-1) calc(l * 1.25) c h);
  --accent-color-lighter: oklch(from var(--accent-color-1) calc(l * 1.5) c h);
  --accent-color-lightest: oklch(from var(--accent-color-1) calc(l * 1.75) c h);
  --accent-color-darker: oklch(from var(--accent-color-1) calc(l * 0.5) c h);

  /* 색상 매핑 재정의 */
  --header_primary: var(--color-6);
  --header_background: var(--color-1);
  --primary-very-low: var(--color-6);
  --primary-low: var(--color-6);
  --header_primary-low: var(--color-6);
  --primary-low-mid: var(--color-6);
  --header_primary-low-mid: var(--color-4);
  --primary-medium: var(--color-6);
  --primary-med-or-secondary-high: var(--color-6);
  --primary-med-or-secondary-med: var(--color-6);
  --header_primary-medium: var(--color-6);
  --hljs-bg: var(--color-2);
  --primary-high-or-secondary-low: var(--color-6);
  --primary-high: var(--color-6);
  --header_primary-high: var(--color-6);
  --primary-very-high: var(--color-6);
  --header_primary-very-high: var(--color-6);
  --blend-primary-secondary-5: var(--color-2);
  --d-hover: var(--color-3);
  --mention-background-color: var(--color-4);
  --link-color: rgb(196, 101, 0);
  --primary-50: var(--color-6);
  --primary-100: var(--color-6);
  --primary-200: var(--color-6);
  --primary-300: var(--color-6);
  --primary-400: var(--color-6);
  --primary-500: var(--color-6);
  --primary-600: var(--color-6);
  --primary-700: var(--color-6);
  --primary-800: var(--color-6);
  --primary-900: var(--color-6);
  --primary: var(--color-6); /* Black */
  --secondary: var(--color-1); /* White */
  --secondary-rgb: var(--color-1);
  --tertiary: var(--accent-color-1); /* Blue */
  --tertiary-hover: var(--accent-color-darker);
  --tertiary-medium: var(--accent-color-light);
  --tertiary-med-or-tertiary: var(--accent-color-light);
  --tertiary-med-or-tertiary-low: var(--accent-color-lighter);
  --tertiary-very-low: var(--accent-color-lighter);
  --tertiary-low: var(--accent-color-lighter);
  --tertiary-25: var(--accent-color-lightest);
}


UX 스타일링

이 스타일에서는 위에서 볼 수 있는 테마를 만들기 위해 코어에서 사용할 수 있는 많은 변수를 활용했습니다.

:root {
  --d-max-width: unset;
  --d-main-content-gap: 0;

  /* 사이드바 편집 */
  --d-sidebar-background: var(--color-1);
  --d-sidebar-admin-background: var(--color-1);
  --d-sidebar-link-color: var(--color-6);
  --d-sidebar-link-icon-color: var(--color-6);
  --d-sidebar-header-color: var(--color-6);
  --d-sidebar-header-icon-color: var(--color-6);
  --d-sidebar-footer-fade: transparent;
  --d-sidebar-active-background: rgb(0, 0, 0, 0.06125);
  --d-sidebar-highlight-background: rgb(0, 0, 0, 0.06125);
  --d-sidebar-highlight-color: var(--color-6);
  --d-sidebar-width: 14rem;
  --d-sidebar-row-height: 1.85rem;
  --d-sidebar-row-horizontal-padding: 0.5rem;
  --sidebar-section-wrapper-padding: 1rem 0.75rem 0.75rem;
  --d-sidebar-border-color: var(--content-border-color);
  --d-sidebar-section-border-color: transparent;
  --d-sidebar-header-font-weight: 400;
  --d-sidebar-active-font-weight: 600;

  /* 토픽 목록 */
  --d-topic-list-header-font-size: var(--font-down-1);
  --d-topic-list-header-text-color: var(--color-6);
  --d-topic-list-header-data-padding-x: var(--space-2);
  --d-topic-list-header-data-padding-y: var(--space-2);
  --d-topic-list-margin-y: var(--space-4);
  --title-color: var(--color-6);
  --title-color--read: var(--color-6);
  --d-table-border-top-height: 1px;
  --topic-list-item-background-color--visited: var(--color-2);
  --d-topic-list-avatar-size: 20px;
  --topic-title-font-weight: 700;
  --topic-title-font-weight--visited: 400;
  --d-topic-list-data-padding-x: var(--space-4);
  --d-topic-list-data-padding-y: var(--space-2);
  --d-topic-list-metadata-top-space: var(--space-1);
  --d-topic-list-data-padding-inline-start: var(--space-4);
  --d-topic-list-data-padding-inline-end: var(--space-4);
  --d-topic-list-likes-views-posts-width: 12%;
  --d-topic-list-data-font-size: var(--font-down-1-rem);

  /* 내비게이션 */
  --d-nav-font-size: var(--font-down-1);
  --d-nav-bg-color--active: var(--color-6);
  --d-nav-bg-color--hover: var(--d-hover);
  --d-nav-color--active: var(--color-1);
  --d-nav-color--hover: var(--color-6);
  --d-nav-underline-height: 0;
  --nav-horizontal-padding: var(--space-4);
  --nav-space: 0;

  /* 카테고리 */
  --category-boxes-title-font-size: var(--font-up-3-rem);
  --category-boxes-text-alignment: left;
  --d-category-border-accent-width: 0px;
  --d-category-border-box-width: 0px;
  --d-category-box-background-color: var(--color-2);
  --category-badge-title-color: var(--color-6);
  --d-category-boxes-margin-top: var(--space-4);
  --d-category-boxes-gap: var(--space-4);
  --category-badge-size: var(--space-2);
  --category-badge-border-radius: 50%;
  --category-boxes-description-text-color: var(--color-6);
  --d-categories-list-title-margin-bottom: var(--space-2);

  /* 태그 */
  --d-tag-horizontal-padding: var(--space-2);
  --d-tag-border-radius: 4px;
  --d-tag-font-weight: 500;
  --d-tag-background-color: rgb(0, 0, 0, 0.1);
  --tag-text-color: var(--color-6);

  /* 기타 */
  --onebox-shadow-color: var(--color-2);
  --onebox-border-color: var(--content-border-color);
  --d-border-radius: 8px;
  --content-border-color: var(--color-3);
  --main-outlet-padding-top: var(--space-4);
  --base-font-size: 15px;
  --topic-timeline-border-color: var(--color-6);
  --d-header-padding-x: var(--space-4);
  --d-input-focused-color: var(--color-6);
  --d-button-default-text-color: var(--color-6);
  --d-button-default-icon-color: var(--color-6);
  --d-button-default-bg-color: transparent;
  --d-button-default-bg-color--hover: var(--d-hover);
  --d-button-default-text-color--hover: var(--color-6);
  --d-button-default-icon-color--hover: var(---color-6);
  --d-post-control-background--hover: var(--d-hover);
  --d-post-control-create-icon-color: var(--color-6);
  --d-button-primary-bg-color: var(--color-6);
  --font-family: "Inter";
  --list-container-padding-x: var(--space-4);
  --list-container-topiclist-padding-x: 0em;
  --badge-card-background-color: var(--color-2);

  /* 채팅 */
  --d-chat-input-border-color: var(--content-border-color);
  --d-chat-input-focused-shadow: 0 0 1px 0 var(--tertiary);
}

.wrap {
  --d-wrap-padding-x: 0;
}

.navigation-container {
  #create-topic {
    --d-button-default-text-color: var(--color-1);
    --d-button-default-icon-color: var(--color-1);
    --d-button-default-bg-color: var(--color-6);
    --d-button-default-bg-color--hover: black;
  }
}

.new-main-title-data .topic-list-data:first-of-type,
.new-main-title-data .topic-list-data:last-of-type {
  --d-topic-list-data-padding-y: 0;
  --d-topic-list-data-padding-x: 0;
  --d-topic-list-data-padding-inline-start: 0;
}

이 토픽을 사용하여 가능한 것들을 보여주기 위해 예시와 CSS 변수 코드를 공유합시다 :smiley:

이 문제로 인해 내 사이트에서 토픽 카드의 배경색을 덮어쓰기 위해 한 CSS 수정이 깨진 것 같습니다.
저는 코딩을 할 줄 모르고, 이 문제를 어떻게 해결해야 하는지 이해하지 못합니다. 여기에서 누가 제발 원래대로 돌려놓는 방법을 도와주실 수 있을까요?

해결되었습니다…hopefully.