본문으로 건너뛰기

Anchor

지금 읽고 있는 페이지의 제목 목록이고, 독자가 있는 위치가 표시됩니다. 진짜 fragment 링크라서 추적이 동작하든 말든 해당 제목으로 이동합니다.

tsx
import { Anchor } from 'neba';

<Anchor
  items={[
    { href: '#install', label: 'Install' },
    { href: '#setup', label: 'Setup', depth: 1 }
  ]}
/>;

Props

Prop타입기본값설명
items * readonly AnchorItem[]제목들. 페이지에 나타나는 순서대로
activeHrefstring | null표시할 행의 href. 주면 스크롤 추적을 멈추고 지시받은 대로 표시합니다
onActiveChange(href: string | null) => void독자가 있는 행이 바뀔 때마다 호출됩니다
offsetnumber0scrollport 상단에서 얼마나 내려온 지점을 제목에 도달한 것으로 볼지 (px). sticky header의 높이를 넣으세요
containerRefObject<HTMLElement | null>문서가 아닌 다른 것이 스크롤될 때 그 요소
railbooleantrue앞쪽 가장자리를 따라 선을 그리고 현재 행에 불을 켭니다
size공통'xs' | 'sm' | 'md' | 'lg' | 'xl''md'행의 타입 스케일과 들여쓰기 폭
color공통'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info''primary'현재 행과 레일이 띠는 색 역할
density공통'default' | 'compact''default'행의 세로 여백만 바꿉니다
localestringBCP 47 태그. nav의 이름을 이 언어로 씁니다. 지원하지 않는 태그는 영어로
labelstringnav의 접근성 이름. 기본값은 locale의 표현입니다

<nav>의 모든 속성이 colorchildren을 제외하고 그대로 전달됩니다.

AnchorItem

Prop타입기본값설명
href * string가리키는 fragment, #getting-started. 여기 적힌 id를 목록이 지켜봅니다
label * ReactNode행에 쓰이는 말
depthnumber0제목의 깊이. 들여쓰기에만 쓰이며 목록 자체는 평평합니다

제목은 문서에서 긁어오는 대신 직접 전달합니다. 이 목록을 만들어내는 쪽(MDX 파이프라인, CMS, 라우트의 frontmatter)은 이미 id를 알고 있고, 컴포넌트가 직접 찾아 나선다면 어느 제목이 본문이고 어느 것이 chrome인지 추측해야 합니다.

예시

activeHref와 onActiveChange

그냥 두면 목록이 스크롤을 추적합니다. 표시되는 행은 상단선을 지나간 마지막 제목이며, 이 규칙은 아래로 내려갈 때만큼 위로 올라갈 때도 올바르게 읽힙니다. 스크롤이 맨 아래에 닿으면 마지막 제목이 표시됩니다. activeHref를 주면 추적을 멈추고 지시받은 대로 표시합니다.

첫 제목에 닿기 전, 즉 독자가 아직 그 위에 있는 동안에는 아무것도 표시되지 않습니다.

offset

scrollport 상단에서 얼마나 내려온 지점을 "제목에 도달했다"고 볼지 정합니다. sticky header의 높이를 넣으세요. 그러지 않으면 바에 가려진 제목이 표시되는 일이 없습니다.

container

문서가 아닌 다른 것이 스크롤될 때 그 요소입니다. 예를 들어 scroll="content"PageLayout이 페이지를 담는 요소입니다.

rail

앞쪽 가장자리를 따라 내려가는 선이고, 현재 행에 불이 들어옵니다. 이동하는 마커가 아니라 행의 border입니다. 이미 움직이고 있는 독자 아래에서 무언가가 미끄러지지 않게 하기 위해서입니다.

size

접근성

  • 진짜 <a href="#…">로 이루어진 진짜 <nav>입니다. JavaScript가 꺼져 있어도 동작하고, 스크린 리더가 불러오는 링크 목록에 들어갑니다. 추적은 그 위에 얹힌 것이지 없으면 안 되는 부분이 아닙니다.
  • 표시된 행에는 aria-current="location"이 붙습니다. 링크 묶음 안에서 독자가 있는 위치를 뜻하는 값입니다.
  • <nav>의 이름은 locale이나 label에서 옵니다.
  • id가 없는 제목은 추적할 수 없고, 그 행은 아무 데도 가지 않는 링크가 됩니다.

Released under the MIT License