마케팅 웹사이트 · 새 리소스

Mozilla Protocol 디자인 시스템.

실제 글꼴 스택과 간격 및 컨테이너 크기를 다루는 Protocol 편집 가이드, 반응형 삽화가 포함된 읽기 페이지, 완전한 기본 CSS 폼 예제를 살펴보세요.

OpenDesign 가이드8개 챕터참조 항목 39개독자적 적용 가이드
01

Mozilla Protocol 디자인 시스템 인터페이스 미리보기

구독을 신청하지 않고도 읽기 밀도를 비교하고 설명 세부 정보를 펼쳐 보며 이메일의 잘못된 입력과 올바른 입력 상태를 확인하세요.

일러스트가 포함된 읽기 페이지와 요약 이메일 양식전체 예시 열기
네이티브 Mozilla Protocol 22.0.0 CSS 및 패키지 글꼴, 오리지널 HTML, 일러스트 및 JavaScript. 양식이 네트워크로 제출되지 않습니다. · 구현 레퍼런스
02

Mozilla Protocol 디자인 시스템 디자인 참고 자료

Mozilla Protocol 22.0.0 공개 토큰 JSON 및 네이티브 CSS. 달러 기호로 시작하는 이름은 Sass 토큰입니다. 오리지널 예제는 Mozilla 타이포그래피 테마를 사용합니다. 밀도 조절 기능과 원형 일러스트는 애플리케이션에서 선택한 요소입니다.

서체 스택

출처
이름 / 규칙값 / 구성용도
$font-stack-baseInter, X-LocaleSpecific, sans-serifMozilla 또는 Firefox 브랜드 스택을 명시적으로 선택하세요. 긴 본문에 헤드라인용 서체를 사용하지 마세요.
$font-stack-firefoxMetropolis, X-LocaleSpecific, sans-serifMozilla 또는 Firefox 브랜드 스택을 명시적으로 선택하세요. 긴 본문에 헤드라인용 서체를 사용하지 마세요.
$font-stack-mozilla-headline'Mozilla Headline', 'Helvetica Neue', Arial, X-LocaleSpecific, sans-serifMozilla 또는 Firefox 브랜드 스택을 명시적으로 선택하세요. 긴 본문에 헤드라인용 서체를 사용하지 마세요.
$font-stack-mozilla-text'Mozilla Text', 'Helvetica Neue', Arial, X-LocaleSpecific, sans-serifMozilla 또는 Firefox 브랜드 스택을 명시적으로 선택하세요. 긴 본문에 헤드라인용 서체를 사용하지 마세요.
$font-stack-monoConsolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospaceMozilla 또는 Firefox 브랜드 스택을 명시적으로 선택하세요. 긴 본문에 헤드라인용 서체를 사용하지 마세요.

구성 요소 간격

출처
이름 / 규칙값 / 구성용도
$spacing-xs4px컴포넌트 안이나 서로 밀접하게 관련된 요소 사이의 간격입니다.
$spacing-sm8px컴포넌트 안이나 서로 밀접하게 관련된 요소 사이의 간격입니다.
$spacing-md16px컴포넌트 안이나 서로 밀접하게 관련된 요소 사이의 간격입니다.
$spacing-lg24px컴포넌트 안이나 서로 밀접하게 관련된 요소 사이의 간격입니다.
$spacing-xl32px컴포넌트 안이나 서로 밀접하게 관련된 요소 사이의 간격입니다.
$spacing-2xl48px컴포넌트 안이나 서로 밀접하게 관련된 요소 사이의 간격입니다.

대규모 레이아웃의 리듬

출처
이름 / 규칙값 / 구성용도
$layout-2xs16px편집 콘텐츠 섹션 사이에는 더 넓은 간격을 사용하세요. 컴포넌트 간격과는 구분되는 값입니다.
$layout-xs24px편집 콘텐츠 섹션 사이에는 더 넓은 간격을 사용하세요. 컴포넌트 간격과는 구분되는 값입니다.
$layout-sm32px편집 콘텐츠 섹션 사이에는 더 넓은 간격을 사용하세요. 컴포넌트 간격과는 구분되는 값입니다.
$layout-md48px편집 콘텐츠 섹션 사이에는 더 넓은 간격을 사용하세요. 컴포넌트 간격과는 구분되는 값입니다.
$layout-lg64px편집 콘텐츠 섹션 사이에는 더 넓은 간격을 사용하세요. 컴포넌트 간격과는 구분되는 값입니다.
$layout-xl96px편집 콘텐츠 섹션 사이에는 더 넓은 간격을 사용하세요. 컴포넌트 간격과는 구분되는 값입니다.
$layout-2xl192px편집 콘텐츠 섹션 사이에는 더 넓은 간격을 사용하세요. 컴포넌트 간격과는 구분되는 값입니다.

콘텐츠 너비

출처
이름 / 규칙값 / 구성용도
$content-xs304px모든 텍스트 블록을 가장 큰 컨테이너에 맞춰 늘리기보다 실제 콘텐츠에 적합한 가독성 높은 최대 너비를 선택하세요.
$content-sm432px모든 텍스트 블록을 가장 큰 컨테이너에 맞춰 늘리기보다 실제 콘텐츠에 적합한 가독성 높은 최대 너비를 선택하세요.
$content-md688px모든 텍스트 블록을 가장 큰 컨테이너에 맞춰 늘리기보다 실제 콘텐츠에 적합한 가독성 높은 최대 너비를 선택하세요.
$content-lg928px모든 텍스트 블록을 가장 큰 컨테이너에 맞춰 늘리기보다 실제 콘텐츠에 적합한 가독성 높은 최대 너비를 선택하세요.
$content-xl1152px모든 텍스트 블록을 가장 큰 컨테이너에 맞춰 늘리기보다 실제 콘텐츠에 적합한 가독성 높은 최대 너비를 선택하세요.
$content-max1440px모든 텍스트 블록을 가장 큰 컨테이너에 맞춰 늘리기보다 실제 콘텐츠에 적합한 가독성 높은 최대 너비를 선택하세요.

화면 중단점

출처
이름 / 규칙값 / 구성용도
$screen-xs320px공개된 뷰포트 단계입니다. 개별 컴포넌트 믹스인은 지정된 단계에서 조정될 수 있습니다.
$screen-sm480px공개된 뷰포트 단계입니다. 개별 컴포넌트 믹스인은 지정된 단계에서 조정될 수 있습니다.
$screen-md768px공개된 뷰포트 단계입니다. 개별 컴포넌트 믹스인은 지정된 단계에서 조정될 수 있습니다.
$screen-lg1024px공개된 뷰포트 단계입니다. 개별 컴포넌트 믹스인은 지정된 단계에서 조정될 수 있습니다.
$screen-xl1312px공개된 뷰포트 단계입니다. 개별 컴포넌트 믹스인은 지정된 단계에서 조정될 수 있습니다.

모서리 반경

출처
이름 / 규칙값 / 구성용도
$border-radius-xs2px컴포넌트에 적합한 모서리 반경을 사용하고, 직접 만든 일러스트는 UI 도형과 분리하세요.
$border-radius-sm4px컴포넌트에 적합한 모서리 반경을 사용하고, 직접 만든 일러스트는 UI 도형과 분리하세요.
$border-radius-md8px컴포넌트에 적합한 모서리 반경을 사용하고, 직접 만든 일러스트는 UI 도형과 분리하세요.
$border-radius-lg16px컴포넌트에 적합한 모서리 반경을 사용하고, 직접 만든 일러스트는 UI 도형과 분리하세요.

타이포그래피 유틸리티 및 테마 선택

출처
이름 / 규칙값 / 구성용도
$brand-theme: mozillaMozilla Headline + Mozilla TextMozilla 테마의 편집 콘텐츠입니다. 미리보기에서는 공식 패키지의 글꼴을 불러옵니다.
$brand-theme: firefoxMetropolis + InterFirefox 테마 타이포그래피는 별도의 브랜드 선택 사항입니다.
mzp-u-title-lgResponsive title utility주요 편집 헤드라인에 사용하세요. 시각적 크기만으로 제목의 시맨틱 수준을 추정하지 마세요.
mzp-u-title-xsSmall title utility두 개의 보조 섹션에서는 시맨틱 h2 요소에 이 클래스를 사용합니다.
mzp-u-title-2xsCompact title utility짧은 글의 h3에는 이 클래스를 사용합니다.
Comfortable / Compact sample16px / 1.6 and 14px / 1.4공식 Protocol 테마가 아니라 독자적으로 만든 읽기 설정입니다.
03

Mozilla Protocol 디자인 시스템 전체 가이드

실제 인터페이스를 위해 이 시스템을 선택하고 적용하고 검토하는 실용 가이드.

DESIGN-mozilla-protocol.md

완전한 안내와 구현 시작점, 소스 링크.

가이드 다운로드

Mozilla Protocol 디자인 시스템 편집 콘텐츠 구성

가독성 높은 편집 계층 구조부터 시작하세요

Protocol은 UI를 지원하는 동시에 편집 콘텐츠와 마케팅 화면도 다룹니다. 이 예제는 큰 헤드라인과 오리지널 원형 일러스트로 시작한 뒤, 기사 미리보기와 요약 이메일 양식으로 이어집니다. 이 구성은 독자가 컨트롤을 조작하기 전에 메시지를 충분히 전달합니다. 정보 밀도가 높은 관리 대시보드와는 다른 구성입니다.

이 OpenDesign 가이드에서

브랜드 테마와 애플리케이션의 콘셉트를 분리하세요

이 예제는 mzp-t-mozilla와 Protocol의 기본 타이포그래피를 사용합니다. 기사, 일러스트레이션, 읽기 밀도 설정은 독창적인 애플리케이션 콘텐츠입니다. 기본 클래스 이름이나 글꼴 파일을 사용한다고 해서 공식 Mozilla 서비스가 되는 것은 아닙니다. 푸터에서 범위를 설명하며, 다이제스트 작업은 확인 화면만 미리 보여 줍니다.

Mozilla Protocol 디자인 시스템 글꼴 및 제목 유틸리티

브랜드에 맞는 글꼴 조합 선택

Protocol 22는 Mozilla용 Mozilla Headline 및 Mozilla Text 스택과 Firefox용 Metropolis 및 Inter를 제공합니다. 이 예제는 패키지에 포함된 글꼴을 불러옵니다. 제목과 본문 역할을 구분하세요. 모든 문단에 디스플레이 서체를 적용하면 편집 구조를 유용하게 만드는 대비가 사라집니다.

시각적 크기와 제목 의미 구조를 분리

히어로는 mzp-u-title-lg를 적용한 h1입니다. 보조 섹션은 mzp-u-title-xs를 적용한 h2이고, 기사 제목은 mzp-u-title-2xs를 적용한 h3입니다. 반응형 유틸리티는 제목 구조를 바꾸지 않고 시각적 크기를 조정할 수 있습니다. 읽기 밀도 컨트롤은 샘플 문단만 변경하며, 페이지 전체나 컨트롤 크기는 바꾸지 않습니다.

  • h1은 페이지의 시작을 나타냅니다.
  • h2는 읽기 미리보기와 양식을 구분합니다.
  • h3은 기사 발췌문의 제목입니다.

Mozilla Protocol 디자인 시스템 색상 및 일러스트레이션

일러스트레이션을 편집 콘텐츠로 활용

원형 그라데이션은 간결한 접근성 설명을 곁들인 독창적인 CSS 아트워크입니다. 따뜻한 색에서 보라색으로 이어지는 이 표현은 새로운 공식 Mozilla 로고나 Protocol에서 내보낸 토큰으로 제시되지 않습니다. 페이지의 나머지 부분에는 절제된 중립색 표면을 사용해 일러스트레이션과 주요 작업이 뚜렷한 역할을 유지하도록 합니다.

양식 상태에 고유한 의미 부여

이메일 오류에는 텍스트 설명과 눈에 보이는 오류 테두리가 표시됩니다. 성공 시에는 별도의 확인 블록이 나타나며, 입력한 예시 주소와 함께 이메일이 전송되지 않았다는 점을 안내합니다. 화려한 히어로가 오류 상태와 경쟁하거나 양식이 성공했는지 모호하게 만들지 않도록 하세요.

Mozilla Protocol 디자인 시스템 컴포넌트 및 레이아웃 간격

두 가지 간격 척도를 의도적으로 사용

공개된 컴포넌트 간격 단계는 4, 8, 16, 24, 32, 48px입니다. 별도의 레이아웃 척도는 64, 96, 192px까지 확장됩니다. 양식과 카드 안에는 더 작은 척도를 사용하고, 편집 섹션 사이에는 더 큰 간격의 흐름을 적용하세요. 작은 간격을 모두 레이아웃 간격으로 늘리면 레이블과 입력 필드 사이의 관계가 흐려집니다.

열을 더 추가하기 전에 행 길이 제한

Mozilla Protocol 디자인 시스템 버튼, 세부 설명 및 양식

실제 양식 구조 유지

다이제스트 예제는 눈에 보이는 레이블, 이메일 입력 필드, 안내 문구, 오류 메시지, 제출 버튼으로 구성된 기본 양식입니다. Protocol은 컴포넌트의 스타일을 지정하고, 애플리케이션은 입력값을 검증해 로컬 결과를 표시합니다. 히어로 작업은 페이지 내 섹션으로 이동하므로 링크를 사용하고, 제출에는 버튼을 사용합니다.

보충 설명에는 간단한 펼침 요소 사용

‘변경 사항’ 펼침 요소는 기본 details/summary 쌍입니다. 본문을 방해하지 않으면서 사용자 지정 편안함 및 컴팩트 문단 설정을 설명합니다. 가짜 탐색 탭이나 숨겨진 필수 단계가 아니므로, 펼침 요소를 열거나 닫은 상태 모두에서 양식과 밀도 컨트롤을 사용할 수 있습니다.

Mozilla Protocol 디자인 시스템 읽기 및 유효성 검사 상태

읽기 설정은 한 번에 하나씩 변경

두 밀도 버튼은 레이블이 지정된 그룹을 이루며 aria-pressed 속성을 노출합니다. 컴팩트 설정으로 바꾸면 기사 안의 문단 글꼴 크기, 줄 높이, 아래쪽 간격만 변경됩니다. 텍스트, 제목, 양식 입력 필드는 그대로 유지됩니다. 이 예제는 이 설정과 Mozilla 및 Firefox 브랜드 테마 간 전환을 의도적으로 구분합니다.

양식 오류에서 예측 가능한 복구 제공

잘못된 주소를 입력하면 오류가 표시되고 입력 필드에 포커스가 이동합니다. 입력을 수정하면 이전 오류가 지워지고, 기존 확인 메시지가 숨겨집니다. 올바른 주소를 입력하면 로컬에서 생성된 결과가 표시되고 해당 결과에 포커스가 이동합니다. ‘다른 주소 입력’을 선택하면 양식이 초기화되고 잘못된 상태가 해제되며 입력 필드로 포커스가 돌아갑니다. 비동기 구독 처리는 제공되지 않습니다.

  1. 비어 있거나 형식이 잘못된 주소를 제출하고 필드 오류를 확인하세요.
  2. 예시 주소를 입력하고 로컬 확인 화면을 미리 보세요.
  3. ‘다른 주소 입력’을 사용해 양식을 초기화하고 입력 필드로 포커스를 되돌리세요.

Mozilla Protocol 디자인 시스템 접근성 있는 편집 컨트롤

아트워크와 컨트롤에 서로 다른 역할 부여

일러스트레이션은 간결한 대체 텍스트를 제공하는 이미지 역할 요소입니다. 밀도 버튼, 펼침 요소, 제출 작업은 실제 컨트롤입니다. 이메일 필드는 aria-describedby를 통해 안내 문구와 오류 메시지를 모두 참조합니다. 키보드 사용을 위해 기본 스타일에 더해 눈에 보이는 포커스 윤곽선을 제공합니다.

레이아웃이 세로로 쌓여도 의미 있는 순서 유지

문서 순서는 제목, 읽기 미리보기, 설명, 양식입니다. 모바일에서도 같은 순서를 유지하며, CSS는 양식을 맥락보다 앞에 배치하지 않습니다. 모바일에서 사용하는 180px 일러스트레이션은 가로 스크롤을 유발하는 고정 너비의 장애물이 아니라 편집 콘텐츠를 보조하는 요소입니다.

Mozilla Protocol 디자인 시스템 CSS 통합

공개된 에셋을 예제와 함께 번들링

제공된 진입점은 컴파일된 테마, protocol.css, protocol-components.css를 불러온 다음 애플리케이션 스타일시트를 불러옵니다. Protocol 22에서는 :root에 테마 사용자 지정 속성을 지정해야 합니다. 기존 브랜드 클래스만 추가하면 타이포그래피가 제대로 적용되지 않습니다. Vite를 시작하기 전에 protocol-theme.scss를 컴파일하세요. 모듈을 인식하는 번들러는 글꼴과 이미지 URL을 처리합니다. 아래의 HTML, JavaScript, CSS 블록에는 예제의 전체 소스가 포함되어 있습니다. 숨겨진 뉴스레터 백엔드나 패키지 전용 상태 제공자는 없습니다.

실제 구독 서비스가 있을 때만 양식을 확장

Mozilla Protocol 디자인 시스템 구성 요소 예시

index.html — 편집 페이지 전체

시맨틱 article, 밀도 조절, disclosure, 독창적인 CSS 일러스트가 포함된 로컬 다이제스트 양식입니다.

html
<!doctype html>
<html lang="en">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Reading specimen</title></head>
<body>
<main class="reading-example mzp-t-mozilla">
  <header class="reading-top">
    <strong>MOZILLA PROTOCOL · EDITORIAL SPECIMEN</strong
    ><span>Original example by OpenDesign</span>
  </header>
  <section class="reading-hero">
    <div>
      <h1 class="mzp-u-title-lg">A little more room to read.</h1>
      <p>
        Make space for useful ideas, quieter pages, and a reading rhythm that
        feels like yours.
      </p>
      <a class="mzp-c-button" href="#reading-controls"
        >Explore the reading preview</a
      >
    </div>
    <div
      class="orb"
      role="img"
      aria-label="Original warm-to-purple circular illustration"
    ></div>
  </section>
  <div class="reading-main">
    <section id="reading-controls">
      <h2 class="mzp-u-title-xs">Choose your reading rhythm</h2>
      <p>
        Compare two application-defined densities using the same short article.
      </p>
      <div class="density-options" role="group" aria-label="Reading density">
        <button
          class="mzp-c-button mzp-t-secondary"
          data-density="comfortable"
          aria-pressed="true"
        >
          Comfortable</button
        ><button
          class="mzp-c-button mzp-t-secondary"
          data-density="compact"
          aria-pressed="false"
        >
          Compact
        </button>
      </div>
      <article id="article-sample">
        <h3 class="mzp-u-title-2xs">The open page</h3>
        <p>
          A useful page gives an idea enough room to breathe. Its headings show
          the path, its paragraphs keep a readable measure, and its controls
          remain easy to find.
        </p>
        <p>
          Changing density should preserve the story. This preview adjusts
          paragraph size and spacing without replacing the article or changing
          your place in the task.
        </p>
      </article>
      <details>
        <summary>What changes in this example?</summary>
        <p>
          Comfortable uses 16px text with 1.6 line height. Compact uses 14px
          with 1.4. These are example reading preferences, not separate official
          Protocol themes.
        </p>
      </details>
    </section>
    <aside class="signup">
      <h2 class="mzp-u-title-xs">Preview a reading digest</h2>
      <p>
        Try the form styling and local validation. No subscription is created.
      </p>
      <form id="reading-form" novalidate>
        <label for="email">Email address</label
        ><input
          id="email"
          type="email"
          autocomplete="email"
          aria-describedby="email-note email-error"
        />
        <p class="note" id="email-note">
          Use an example address. Nothing will be sent.
        </p>
        <p id="email-error" class="error" role="alert" hidden>
          Enter an email address, such as [email protected].
        </p>
        <button class="mzp-c-button" type="submit">Preview confirmation</button>
      </form>
      <div id="confirmation" tabindex="-1" role="status" hidden>
        Local preview confirmed for <strong></strong>. No email was sent.<button
          id="reset"
          class="mzp-c-button mzp-t-secondary"
          type="button"
        >
          Try another address
        </button>
      </div>
    </aside>
  </div>
  <footer class="reading-footer">
    Native Mozilla Protocol 22.0.0 CSS and fonts. Original illustration, copy
    and JavaScript; not an official Mozilla service.
  </footer>
</main>
<script type="module" src="/src/main.js"></script>
</body></html>

코드 참조

  • 프로젝트 루트에 index.html로 저장하세요. 다음 두 블록은 src/main.js와 src/protocol.css입니다.

main.js — 기본 에셋 및 로컬 동작

공식 스타일을 불러오고 데이터를 전송하지 않은 채 밀도 선택, 유효성 검사, 포커스, 초기화 기능을 구현합니다.

js
import "./protocol-theme.css";
import "@mozilla-protocol/core/protocol/css/protocol.css";
import "@mozilla-protocol/core/protocol/css/protocol-components.css";
import "./protocol.css";
const form = document.querySelector("#reading-form"),
  error = document.querySelector("#email-error"),
  input = document.querySelector("#email"),
  result = document.querySelector("#confirmation");
form.addEventListener("submit", (event) => {
  event.preventDefault();
  const value = input.value.trim();
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
    error.hidden = false;
    input.setAttribute("aria-invalid", "true");
    input.focus();
    return;
  }
  error.hidden = true;
  input.removeAttribute("aria-invalid");
  result.hidden = false;
  result.querySelector("strong").textContent = value;
  result.focus();
});
input.addEventListener("input", () => {
  error.hidden = true;
  input.removeAttribute("aria-invalid");
  result.hidden = true;
});
document.querySelector("#reset").addEventListener("click", () => {
  form.reset();
  result.hidden = true;
  error.hidden = true;
  input.removeAttribute("aria-invalid");
  input.focus();
});
document.querySelectorAll("[data-density]").forEach((button) =>
  button.addEventListener("click", () => {
    document
      .querySelectorAll("[data-density]")
      .forEach((b) => b.setAttribute("aria-pressed", String(b === button)));
    document
      .querySelector("#article-sample")
      .classList.toggle("compact", button.dataset.density === "compact");
  }),
);

코드 참조

  • 이 동작은 애플리케이션 JavaScript에 해당하며, Protocol 뉴스레터 서비스가 아닙니다.

protocol.css — 독창적인 구성

반응형 페이지 레이아웃, 읽기 설정, 독창적인 원형 일러스트입니다.

CSS
[hidden] { display: none !important; }
body {
  margin: 0;
}
.reading-example {
  background: #fff;
  color: #000;
}
.reading-top {
  padding: 24px;
  border-bottom: 1px solid #cdcdd4;
  display: flex;
  justify-content: space-between;
  gap: 16px;
  font-size: 12px;
}
.reading-hero {
  display: grid;
  grid-template-columns: minmax(0, 1.3fr) minmax(200px, 0.7fr);
  gap: 48px;
  align-items: center;
  padding: 48px;
  max-width: 1152px;
  margin: auto;
}
.reading-hero h1 {
  max-width: 680px;
}
.reading-hero p {
  max-width: 580px;
}
.orb {
  aspect-ratio: 1;
  background: radial-gradient(
    circle at 33% 32%,
    #ffea80 0 10%,
    #ff8a50 30%,
    #ff298a 55%,
    #7542e5 82%
  );
  border-radius: 50%;
  position: relative;
  box-shadow: 16px 24px 0 #f0f0f4;
}
.orb:after {
  content: "";
  position: absolute;
  inset: 23%;
  border-radius: 50%;
  background: white;
}
.reading-main {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(280px, 0.8fr);
  gap: 48px;
  max-width: 1152px;
  margin: auto;
  padding: 0 48px 48px;
}
.density-options {
  display: flex;
  gap: 8px;
  margin: 16px 0;
}
.density-options button {
  font-size: 12px;
  padding: 8px 12px;
}
.density-options button[aria-pressed="true"] {
  box-shadow: 0 0 0 2px #0060df;
}
#article-sample {
  padding: 24px;
  border: 1px solid #cdcdd4;
  border-radius: 8px;
  background: #f9f9fb;
}
#article-sample p {
  font-size: 16px;
  line-height: 1.6;
  margin: 0 0 16px;
}
#article-sample.compact p {
  font-size: 14px;
  line-height: 1.4;
  margin-bottom: 8px;
}
.signup {
  padding: 24px;
  background: #e7dfff;
  border-radius: 8px;
}
.signup input {
  width: 100%;
  margin-bottom: 8px;
}
.signup label {
  display: block;
  font-weight: 700;
  margin-bottom: 8px;
}
.signup .note {
  font-size: 12px;
  line-height: 1.5;
}
.signup .error {
  color: #a4000f;
  font-size: 14px;
  font-weight: 700;
}
.signup input[aria-invalid="true"] {
  border-color: #a4000f;
  box-shadow: 0 0 0 2px #a4000f;
}
.signup .mzp-c-button {
  width: 100%;
  margin: 8px 0;
}
#confirmation {
  padding: 16px;
  background: #e3fff3;
  margin-top: 16px;
  border-left: 4px solid #008a46;
  overflow-wrap: anywhere;
}
.reading-footer {
  padding: 24px;
  border-top: 1px solid #cdcdd4;
  font-size: 12px;
}
.reading-example details {
  margin-top: 24px;
}
.reading-example summary {
  cursor: pointer;
  font-weight: 700;
}
.reading-example details p {
  font-size: 14px;
  margin-top: 12px;
}
button:focus-visible,
input:focus-visible,
summary:focus-visible {
  outline: 3px solid #0060df;
  outline-offset: 4px;
}
@media (max-width: 760px) {
  .reading-hero {
    grid-template-columns: 1fr;
    padding: 32px 24px;
    gap: 24px;
  }
  .orb {
    width: 180px;
    justify-self: center;
    box-shadow: 8px 12px 0 #f0f0f4;
  }
  .reading-main {
    grid-template-columns: 1fr;
    padding: 0 24px 32px;
    gap: 32px;
  }
  .reading-top {
    flex-wrap: wrap;
  }
  .reading-hero h1 {
    font-size: 36px;
  }
  .density-options {
    flex-wrap: wrap;
  }
}

코드 참조

  • 애플리케이션의 밀도 및 레이아웃 선택은 공개된 Sass 토큰과 별도로 표시합니다.

protocol-theme.scss — 필수 Mozilla 루트 테마

앱을 시작하기 전에 이를 src/protocol-theme.css로 컴파일하세요.

scss
@use '@mozilla-protocol/core/protocol/css/includes/config' with ($brand-theme: 'mozilla');
@use '@mozilla-protocol/core/protocol/css/includes/themes';

코드 참조

  • Sass 설정에서 브랜드를 선택합니다. 런타임 클래스 전환이 아닙니다.
04

Mozilla Protocol 디자인 시스템 에이전트 설정

구현 시작점

기본 CSS/fonts와 독창적인 스크립트를 로컬 미리보기용으로 묶었습니다. Vite 릴리스에서 지원하는 Node.js 버전을 사용하세요. 빌드를 재배포할 때 패키지 라이선스와 에셋 출처를 함께 포함하세요.

sh
npm create vite@latest protocol-reading -- --template vanilla
cd protocol-reading
npm install
npm install @mozilla-protocol/[email protected]
npm install --save-dev sass
npx sass --load-path=node_modules src/protocol-theme.scss src/protocol-theme.css
# Replace index.html; add src/main.js and src/protocol.css from the full examples.
npm run dev

프로젝트를 위한 프롬프트

에이전트 프롬프트
Mozilla Protocol 22.0.0을 사용해 편집 페이지를 만드세요. 실제 글꼴, 간격, 컨테이너 참조를 확인하세요. 제공된 HTML/CSS/JS 구성 전체를 시작점으로 삼고, 시맨틱 제목과 항상 표시되는 양식 레이블을 유지하세요. 독창적인 일러스트 및 밀도 선택은 공식 토큰과 구분하세요. 로컬 유효성 검사를 실제와 다르게 표현하지 마세요. 실제 구독 기능은 서비스 및 동의 요건을 정의한 뒤에만 통합하세요.
05

Mozilla Protocol 디자인 시스템 출처 및 범위

Mozilla Protocol 22.0.0을 위한 OpenDesign 애플리케이션 가이드입니다. 이 예제는 공개된 CSS와 번들로 제공된 글꼴을 독창적인 문구, 일러스트, 로컬 양식 동작과 함께 실행합니다. Mozilla 제품, 뉴스레터 또는 구독 서비스가 아닙니다. 브랜드와 에셋의 권리는 각 소유자에게 있습니다.