본문으로 건너뛰기
    • 연구노트 작성실험 과정과 결과를 바로 기록
    • 전자서명·검토작성자와 검토자 서명을 한 번에
    • 협업·공유과제 팀이 같은 노트로 일하기
    • 보안·감사 기록누가 언제 무엇을 바꿨는지
    연구대장 소개 과제별로 흩어진 실험 기록을 한곳에 모아요 알아보기
  • 요금
  • 도입 사례
  • 자주 묻는 질문
로그인 무료로 시작하기
  • 연구노트 작성
  • 전자서명·검토
  • 협업·공유
  • 보안·감사 기록
요금 도입 사례 자주 묻는 질문
무료로 시작하기 로그인
브랜드 색 글자 간격·면 모션 아이콘 버튼 표시 입력 데이터 탐색 상태 오버레이 레이아웃 섹션 연출 연구노트 모바일

11탐색

길은 한 곳에서, 늘 같은 자리에

머리 내비·서랍·푸터는 메뉴 목록 하나를 함께 읽어요. 이 화면 맨 위와 맨 아래에 있는 것이 실제 부품이에요.

01머리 내비와 서랍

머리 내비 구조

로고·가운데 메뉴·로그인·주 버튼·햄버거 다섯 칸이에요. 폭에 따라 보이는 칸이 바뀌고, 모바일용 마크업은 따로 없어요.

1024px 이상
1 2 34
1023px 이하
1 45

넓은 화면은 로고, 가운데 메뉴, 로그인, 주 버튼이 한 줄에 놓여요. 좁은 화면은 로고, 주 버튼, 햄버거만 남아요.

1로고nav__brand
늘 보여요. 누르면 첫 화면으로 가요.
2가운데 메뉴nav__links
1024px 이상. 묶음은 메가 메뉴로 펼쳐요.
3로그인nav__login
1024px 이상. 좁으면 서랍 바닥으로 가요.
4주 버튼nav__cta
561px 이상. 진한 알약이라 첫 화면의 파랑 버튼과 다투지 않아요.
5햄버거nav__burger
1023px 이하. 오른쪽 서랍을 열어요.

헤더·서랍·푸터는 레이아웃(marketing)이 그려요. 화면마다 다시 부르지 않아요.

ERB
<%# app/views/layouts/marketing.html.erb 가 그린다. 화면에서 따로 부르지 않는다. %>
<%= render "shared/nav" %>      <%# 머리 내비(스크롤하면 유리) %>
<%= render "shared/drawer" %>   <%# 1023px 이하 서랍 %>
<main id="main"><%= yield %></main>
<%= render "shared/footer" %>   <%# 푸터 %>

<%# shared/_nav 의 뼈대. 메뉴는 site_nav_items 가 채운다 %>
<header class="nav nav--site nav--balanced" data-nav>
  <div class="container container--wide nav__inner">
    <%= link_to site_home_path, class: "nav__brand", "aria-label": "#{brand(:name)} 홈" do %>
      <%= render "shared/brand", size: 28 %>
    <% end %>
    <nav class="nav__links" aria-label="주 메뉴">
      <ul class="nav__menu">…</ul>
    </nav>
    <div class="nav__actions">
      <%= link_to "로그인", "/login", class: "btn btn--ghost btn--md nav__login" %>
      <%= link_to "무료로 시작하기", "/signup", class: "btn btn--invert btn--md btn--pill nav__cta" %>
      <button class="btn btn--ghost btn--md btn--square nav__burger" type="button"
              data-drawer-open="site-drawer" aria-expanded="false"
              aria-controls="site-drawer" aria-label="메뉴 열기"><%= icon("menu") %></button>
    </div>
  </div>
</header>

메가 메뉴

넓은 화면에서 '제품' 같은 묶음을 누르면 열리는 큰 판이에요. 누르면 맨 위로 올라가 실제 내비의 묶음을 열어요.

  • 마우스를 올리기만 해도 열려요(80ms 기다림)
  • ↓첫 링크로 들어가요
  • Esc닫고 묶음 버튼으로 돌아와요

닫으면 이 자리로 돌아와요. 1023px 이하에서는 같은 묶음이 서랍의 아코디언으로 열려요.

ERB
<%# 묶음(items)이 있는 메뉴는 shared/_nav 가 메가 메뉴로 그린다(ds/sections.js 가 연다) %>
<li class="nav__item" data-mega>
  <button class="nav__link nav__trigger" type="button" aria-expanded="false" aria-controls="mega-0">
    제품<%= icon("chevron-down", size: "sm", class: "nav__chev") %>
  </button>
  <div class="mega" id="mega-0">
    <div class="mega__grid">
      <ul class="mega__items">
        <li>
          <%= link_to "/product/sign", class: "mega__link", "aria-current": nav_aria("/product/sign") do %>
            <span class="mega__icon"><%= icon("shield") %></span>
            <span class="mega__text">
              <span class="mega__title">전자서명·검토</span>
              <span class="mega__desc">작성자와 검토자 서명을 한 번에</span>
            </span>
          <% end %>
        </li>
      </ul>
      <%# 오른쪽 소식 칸: 묶음에 aside: { eyebrow:, title:, href:, tone: "sky" } %>
      <a class="mega__aside panel--sky" href="/product/notes">…</a>
    </div>
  </div>
</li>

모바일 서랍

1023px 이하에서 햄버거가 여는 오른쪽 서랍이에요. 지금 화면이 든 묶음을 펼친 채로 열고, 바닥에 주 버튼을 둬요.

  • 초점이 서랍 안에 갇히고 뒤 화면은 멈춰요
  • Esc덮개를 눌러도 닫혀요
  • 1024px 넘게 넓어지면 저절로 닫혀요

서랍은 햄버거의 data-drawer-open="site-drawer" 가 열어요. 이 버튼은 그 햄버거를 대신 눌러요.

ERB
<%# shared/_drawer: 햄버거(data-drawer-open="site-drawer")가 연다. 1024px 넘게 넓어지면 저절로 닫힌다 %>
<div class="drawer drawer--site" id="site-drawer" data-drawer>
  <div class="drawer__scrim"></div>
  <nav class="drawer__panel" aria-label="모바일 메뉴">
    <div class="drawer__head">
      <%= link_to site_home_path, class: "nav__brand", "aria-label": "#{brand(:name)} 홈", data: { drawer_close: "" } do %>
        <%= render "shared/brand", size: 24 %>
      <% end %>
      <button class="btn btn--ghost btn--md btn--square" type="button" data-drawer-close aria-label="메뉴 닫기"><%= icon("close") %></button>
    </div>
    <%# 묶음은 아코디언. 지금 화면이 든 묶음은 펼친 채로 연다 %>
    <div class="drawer__body" data-accordion data-accordion-single>…</div>
    <div class="drawer__foot">
      <%= link_to "무료로 시작하기", "/signup", class: "btn btn--primary btn--lg btn--block", data: { drawer_close: "" } %>
      <%= link_to "로그인", "/login", class: "btn btn--secondary btn--md btn--block", data: { drawer_close: "" } %>
    </div>
  </nav>
</div>

유리 바탕 · 숨는 헤더 · 밑까지 차오름

내비가 스크롤에 따라 모양을 바꾸는 세 가지예요. 아래 상자 안을 스크롤해 보세요.

시작하기

과제 기록을 한곳에

내리면 바탕이 흐린 유리로 바뀌어요.

  • 세포 배양 3차김지수 연구원 · 9/24(목)
  • 항체 안정성 1차박도윤 책임연구원 · 9/22(화)
  • 시약 보관 기록이서연 연구원 · 9/21(월)
  • 장비 점검 일지정하준 연구원 · 9/18(금)
  • 대조군 비교김지수 연구원 · 9/17(목)
  • 배지 조성 변경박도윤 책임연구원 · 9/15(화)
data-stuck
8px 넘게 내리면 ds.js 가 붙여요. 흐린 유리 바탕이 깔려요. 이 화면 내비가 이렇게 바뀌어요.
data-autohide
120px 넘게 내려간 뒤 아래로 읽으면 숨고, 조금만 올려도 나와요. 초점이 안에 있으면 숨지 않아요. 이 화면 내비에는 달지 않았어요.
nav--float
첫 화면 빛이 내비 밑까지 차올라요. 화면에서 content_for :nav_float, true, 첫 섹션에 under-nav.
ERB
<%# 1) 유리 바탕: 따로 할 일이 없다. ds.js 가 8px 넘게 내리면 [data-nav] 에 data-stuck 을 붙인다 %>
<header class="nav nav--site nav--balanced" data-nav>…</header>

<%# 2) 숨는 헤더: 아래로 읽는 동안 숨고 조금만 올려도 나온다(ds/extras.js) %>
<header class="nav" data-nav data-autohide>…</header>

<%# 3) 첫 화면이 내비 밑까지 차오름: 화면에서 켜고, 첫 섹션에 under-nav %>
<% content_for :nav_float, true %>
<section class="hero under-nav">…</section>

지금 화면 표시

지금 보는 화면의 링크를 표시해요. 자리마다 모양은 달라도 속성은 하나예요.

머리 내비 · 굵은 진한 글자
제품요금도입 사례
메가 메뉴 · 연한 강조 면 전자서명·검토작성자와 검토자 서명을 한 번에
서랍 · 강조색 글자 요금 도입 사례
목차 띠 · 옅은 면(aria-current="true")
입력탐색상태

예시 그림: 머리 내비는 지금 화면 링크를 굵게, 메가 메뉴는 연한 강조 면, 서랍은 강조색 글자, 목차 띠는 옅은 면으로 표시해요.

속성은 aria-current="page" 하나예요. 값은 nav_aria(href) 가 정해요. 같은 경로이거나 그 아래 경로면 "page", 아니면 속성이 빠져요. 이 화면 푸터의 '디자인 시스템' 링크에 달려 있어요.

ERB
<%# 지금 화면이면 "page", 아니면 nil 이라 속성이 빠진다(NavigationHelper#nav_aria) %>
<%= link_to it[:label], it[:href], class: "nav__link",
      "aria-current": nav_aria(it[:href], exact: it[:exact]) %>

<%# 앱 홈(/app)처럼 다른 경로의 앞머리인 항목은 목록에 exact: true %>
{ key: "home", label: "홈", icon: "home", href: "/app", exact: true }

<%# 묶음 안에 지금 화면이 있나(메가 메뉴 버튼·서랍 아코디언을 펼칠 때) %>
nav_group_current?(item)

메뉴 목록은 한 곳에서

메뉴 이름과 목적지는 NavigationHelper 에만 적어요. 헤더·서랍·푸터가 같은 목록을 읽어서 이름이 어긋나지 않아요. 아래 목록은 지금 값을 그대로 읽어 그렸어요.

제품
/product/notes/product/sign/product/team/product/security메가 메뉴 4칸 · 서랍 아코디언
요금
/pricing머리 내비 · 서랍
도입 사례
/customers머리 내비 · 서랍
자주 묻는 질문
/faq머리 내비 · 서랍
로그인
/login1024px 이상 머리 내비 · 서랍 바닥
무료로 시작하기
/signup머리 내비 주 버튼 · 서랍 바닥
푸터 묶음
제품 5개 · 회사 3개 · 도움말 3개푸터 · 법무 링크 2개는 따로

아직 화면이 없는 경로는 '준비하고 있어요' 화면이 받아요. 없는 주소로 404 가 나지 않아요.

ERB
# app/helpers/navigation_helper.rb (메뉴 이름과 목적지는 여기만 고친다)
def site_nav_items
  [
    { label: "제품", items: [
      { label: "연구노트 작성", desc: "실험 과정과 결과를 바로 기록", icon: "edit", href: "/product/notes" },
      { label: "전자서명·검토", desc: "작성자와 검토자 서명을 한 번에", icon: "shield", href: "/product/sign" }
    ], aside: { eyebrow: "연구대장 소개", title: "과제별로 흩어진 실험 기록을 한곳에 모아요", href: "/product/notes", tone: "sky" } },
    { label: "요금", href: "/pricing" }
  ]
end

def site_primary_action = { label: "무료로 시작하기", href: "/signup" }
def site_secondary_action = { label: "로그인", href: "/login" }
def site_footer_groups = [ [ "ft-product", "제품", [ [ "연구노트 작성", "/product/notes" ] ] ] ]
def site_legal_links = [ [ "이용약관", "/terms" ], [ "개인정보처리방침", "/privacy" ] ]

02화면 안에서 옮겨 다니기

탭

한 화면 안에서 내용 묶음을 바꿀 때 써요. 밑줄이 고른 탭을 따라가고, 좌우 화살표로 옮겨요. 좁으면 목록만 옆으로 밀려요.

배지를 바꾸고 24시간 관찰했어요. 생존율은 92%로 대조군보다 6%p 높았어요.
현미경 사진 2장과 원본 데이터(CSV) 1개가 붙어 있어요.
박도윤 책임연구원이 '대조군 배지 조성을 적어 주세요' 의견을 남겼어요.
9/24(목) 14:20 김지수 연구원이 결과 요약을 고쳤어요. 앞 버전도 함께 남아 있어요.
과제 구성원 6명이 볼 수 있어요. 고칠 수 있는 사람은 작성자와 검토자예요.
ERB
<div data-tabs>
  <div class="tabs__list" role="tablist" aria-label="실험 노트">
    <button class="tabs__tab" type="button" role="tab" aria-selected="true">본문</button>
    <button class="tabs__tab" type="button" role="tab">첨부 파일<span class="tabs__count">3</span></button>
    <button class="tabs__tab" type="button" role="tab" disabled>권한</button>
    <span class="tabs__ink" aria-hidden="true"></span>
  </div>
  <%# 패널은 탭 순서대로. aria-controls·aria-labelledby 는 ds.js 가 잇는다 %>
  <div class="tabs__panel" role="tabpanel">…</div>
  <div class="tabs__panel" role="tabpanel" hidden>…</div>
  <div class="tabs__panel" role="tabpanel" hidden>…</div>
</div>

링크 분절

주소가 바뀌는 보기 전환에 써요. 누르면 이 칸만 서버에서 다시 받아 바꿔요.

전체 검토 대기 서명 완료

노트 3개 · 예시

시약 보관 기록이서연 연구원 · 9/21(월)서명 완료
장비 점검 일지정하준 연구원 · 9/18(금)서명 완료
대조군 비교김지수 연구원 · 9/17(목)서명 완료

항목이 링크(a)라 지금 보기에 aria-current="page" 를 달아요. 누름 상태와 화살표 이동은 버튼 분절에만 있어요.

ERB
<%# 항목이 링크(a)면 화면 이동이다. 지금 화면에 aria-current="page"(누름 상태·화살표 이동은 버튼 분절에만) %>
<nav class="segment segment--block" aria-label="노트 상태">
  <% [ [ "all", "전체" ], [ "review", "검토 대기" ], [ "signed", "서명 완료" ] ].each do |key, label| %>
    <%= link_to label, notes_path(view: key), class: "segment__item",
          "aria-current": (key == @view ? "page" : nil) %>
  <% end %>
</nav>

<%# 목록 칸만 바꾸려면 turbo-frame 으로 감싼다(응답에 같은 id 의 frame 이 있어야 한다) %>
<turbo-frame id="notes-list">…</turbo-frame>

아코디언 · 여러 개 펼치기

노트 한 편의 긴 항목을 접어 둘 때 써요. 여러 칸을 함께 펼칠 수 있고, 다른 자리의 링크로도 펼쳐요.

생존율이 대조군보다 6%p 높았어요. 결과 요약 펼치기

37°C, CO₂ 5%, DMEM 배지에서 48시간 배양했어요.
시약 3종(로트 번호 포함), 인큐베이터 2호기, 도립 현미경을 썼어요.
처리군 생존율 92%, 대조군 86%예요. 3회 반복해 같은 경향을 확인했어요.

data-accordion 으로 묶고, 링크에 data-expand="항목 id" 를 달면 펼친 뒤 그 자리로 옮겨요.

ERB
<%# 여러 칸을 함께 펼친다. 처음부터 펼칠 칸은 aria-expanded="true" %>
<div data-accordion>
  <div class="accordion__item" id="note-result">
    <button class="accordion__trigger" type="button" aria-expanded="true">
      <span>결과 요약</span><%= icon("chevron-down", class: "accordion__chev") %>
    </button>
    <div class="accordion__panel"><div class="accordion__body">…</div></div>
  </div>
</div>

<%# 다른 자리의 링크로 펼치기: 접혀 있으면 펼치고 그 자리로 옮겨 트리거에 초점 %>
<a class="link" href="#note-result" data-expand="note-result">결과 요약 펼치기</a>

아코디언 · 하나만 펼치기

자주 묻는 질문처럼 하나씩 읽는 목록에 써요. 새 칸을 펼치면 앞 칸이 접혀요. 문구는 예시예요.

고칠 수 없어요. 새 버전으로 기록하면 앞 버전과 함께 남아요.
과제 책임자가 정한 검토자가 해요. 노트마다 검토자를 바꿀 수 있어요.
30일 동안 휴지통에 남아요. 그 뒤에도 감사 기록은 남아요.

data-accordion-single 을 더해요. 높이를 실제로 재서 펼치고, 접힌 칸은 Tab 으로 들어가지 않아요.

ERB
<%# 하나만 펼친다: 새 칸을 펼치면 앞 칸이 접힌다 %>
<div data-accordion data-accordion-single>
  <div class="accordion__item">
    <button class="accordion__trigger" type="button" aria-expanded="true">
      <span>서명한 노트를 고칠 수 있나요?</span><%= icon("chevron-down", class: "accordion__chev") %>
    </button>
    <div class="accordion__panel"><div class="accordion__body">…</div></div>
  </div>
  <div class="accordion__item">…</div>
</div>

드롭다운 메뉴

동작 여러 개를 버튼 하나에 모을 때 써요. 639px 이하에서는 아래에서 올라오는 시트로 바뀌고 맨 위에 제목이 보여요.

정렬 기준

목록에 보이기

세포 배양 3차김지수 연구원 · 9/24(목)
  • ↓↑열고 옮기기
  • HomeEnd처음·끝
  • Esc닫기
하나 고르기(정렬)
menuitemradio
여러 개 고르기(열어 둔 채)
menuitemcheckbox
앞 아이콘
menu__icon
단축키 덧말
menu__meta
위험 항목(구분선 뒤 맨 아래)
menu__item--danger
권한 없음
disabled
시트 맨 위 제목
data-menu-title
고르면 올라오는 이벤트
ds:select

메뉴는 화면에 떠서 그려져 카드 밖으로 잘리지 않아요. 아래가 모자라면 위로, 오른쪽이 모자라면 오른쪽 끝에 맞춰 붙어요.

ERB
<%# data-menu-title: 639px 이하 시트 맨 위 제목(넓은 화면에서는 보이지 않는다) %>
<div data-menu data-menu-title="세포 배양 3차">
  <button class="btn btn--ghost btn--sm btn--square" type="button" data-menu-trigger aria-label="노트 동작 더 보기"><%= icon("more") %></button>
  <div class="menu" role="menu" hidden>
    <button class="menu__item" type="button" role="menuitem" data-value="edit">
      <%= icon("edit", class: "menu__icon") %>고치기<span class="menu__meta">E</span>
    </button>
    <button class="menu__item" type="button" role="menuitem" disabled>
      <%= icon("share", class: "menu__icon") %>외부 공유(권한 없음)
    </button>
    <div class="menu__sep" role="separator"></div>
    <button class="menu__item menu__item--danger" type="button" role="menuitem" data-value="delete">
      <%= icon("trash", class: "menu__icon") %>노트 지우기
    </button>
  </div>
</div>

<%# 정렬: 하나만 고른다(menuitemradio). 보기 옵션은 role="menuitemcheckbox"(열어 둔 채 여러 개) %>
<p class="menu__label">정렬 기준</p>
<button class="menu__item" type="button" role="menuitemradio" aria-checked="true" data-value="new">
  최신순<%= icon("check", class: "menu__mark") %>
</button>

<%# 고르면 뿌리([data-menu])에서 ds:select 이벤트가 올라온다: detail.value · detail.label · detail.checked %>

경로

깊은 화면에서 지금 어디쯤인지 보여 줘요. 넘치면 옆으로 밀리고 끝(지금 화면)이 보이게 둬요.

  1. 홈
  2. 한빛바이오 연구소
  3. 항체 안정성 과제
  4. 실험 노트
  5. 세포 배양 3차

링크 높이는 44px 예요. 마지막 칸은 링크가 아니라 글자예요.

ERB
<nav class="crumbs" aria-label="경로">
  <ol>
    <li><%= link_to "홈", root_path %></li>
    <li><%= link_to "항체 안정성 과제", project_path(project) %></li>
    <li><%= link_to "실험 노트", project_notes_path(project) %></li>
    <li><span aria-current="page"><%= note.title %></span></li>
  </ol>
</nav>

단계 표시

여러 단계 입력에서 지금 몇 번째인지 알려요. 화면 읽기는 '4단계 중 2단계' 로 읽어요.

2 / 4

실험 조건 적기

헬퍼 한 줄이에요. ui_steps(2, 4) 처럼 현재와 전체를 넘겨요.

ERB
<%# ui_steps(현재, 전체, label:) · 화면 읽기는 '4단계 중 2단계' %>
<%= ui_steps(2, 4, label: "노트 작성 단계") %>

<%# 스크립트로 바꿀 때는 막대(.steps__bar)의 폭과 aria 값을 함께 %>
<%# 끝을 모르는 진행은 .steps__bar[data-indeterminate] %>

페이지 이동

긴 목록을 쪽으로 나눌 때 써요. 번호 칸은 44px, 첫·끝 쪽 화살표는 눌리지 않고, 639px 이하에서는 '5 / 12' 로 줄어요.

이전 1 … 4 5 6 … 12 5 / 12 다음
이전 1 2 3 1 / 3 다음
ERB
<nav class="pager" aria-label="노트 목록 페이지">
  <%= link_to notes_path(page: 4), class: "pager__btn", "aria-label": "이전 페이지" do %>
    <%= icon("chevron-left", size: "sm") %><span class="pager__label">이전</span>
  <% end %>
  <%= link_to "1", notes_path(page: 1), class: "pager__num" %>
  <span class="pager__gap" aria-hidden="true">…</span>
  <%= link_to "5", notes_path(page: 5), class: "pager__num", "aria-current": "page" %>
  <span class="pager__status" aria-hidden="true"><b>5</b>&nbsp;/ 12</span>
  <%= link_to notes_path(page: 6), class: "pager__btn", "aria-label": "다음 페이지" do %>
    <span class="pager__label">다음</span><%= icon("chevron-right", size: "sm") %>
  <% end %>
</nav>

<%# 첫 쪽의 '이전'은 링크가 아니라 span + aria-disabled="true" %>
<span class="pager__btn" aria-disabled="true" aria-label="이전 페이지 없음">…</span>

더 보기

무한 스크롤 대신 누를 때마다 더 불러와요. 불러오는 동안 버튼이 돌고 다시 눌리지 않아요.

48개 중 20개
ERB
<div class="pager pager--more">
  <%= ui_button "노트 더 보기", size: "lg" %>
  <span class="pager__hint" aria-live="polite">48개 중 20개</span>
</div>

<%# 불러오는 동안: 버튼에 data-busy(스피너, 다시 눌리지 않음). 다 불렀으면 disabled + '모두 봤어요' %>

03보조 길잡이와 발

목차 띠

긴 소개 화면에서 구역 사이를 건너뛰는 띠예요. 이 화면 내비 바로 밑에 붙어 따라오는 그것이에요.

붙는 자리
내비 바로 밑(top: var(--nav-h))에 붙어요. 숨는 헤더가 숨으면 맨 위로 올라가요.
지금 구역
data-subnav 를 달면 ds.js 가 보고 있는 구역의 항목에 aria-current="true" 를 달아요.
좁은 화면
띠만 옆으로 밀리고 지금 항목이 띠 가운데로 와요. 넘친 쪽 끝은 흐려져요.
앵커 여백
scroll-padding-top 으로 제목이 내비와 띠 밑에 가리지 않아요.
ERB
<%# 내비 바로 밑에 붙는 목차 띠. data-subnav 를 달면 ds.js 가 보고 있는 구역에 aria-current="true" %>
<nav class="subnav" data-subnav aria-label="소개 목차">
  <div class="container container--wide">
    <div class="subnav__list">
      <a class="subnav__item" href="#features" aria-current="false">기능</a>
      <a class="subnav__item" href="#pricing" aria-current="false">요금</a>
    </div>
  </div>
</nav>

본문 바로가기

키보드로 들어오면 첫 Tab 에 왼쪽 위에 나타나 긴 내비를 건너뛰게 해요. 평소에는 보이지 않아요.

왼쪽 위에 '본문으로 건너뛰기' 가 떠요. Enter 를 누르면 본문 맨 위로 가고, 다른 곳을 누르면 다시 숨어요.

ERB
<%# 레이아웃 body 맨 앞(marketing·app·admin 레이아웃에 이미 있다) %>
<a class="skip-link" href="#main">본문으로 건너뛰기</a>
…
<main id="main"><%= yield %></main>

맨 위 알림 띠

점검·새 기능처럼 서비스 전체에 알릴 한 줄이에요. 머리 내비보다 위에 두고, 닫으면 높이가 접히며 사라져요. 문구는 예시예요.

새 기능검토 요청에 마감일을 정할 수 있어요.알아보기

연구실 전체 도입 상담을 받고 있어요.상담 신청

전자서명 새 화면을 시험하고 있어요. 의견을 남겨 주세요.

10월 3일 토요일 새벽 2시부터 30분 동안 점검해요. 그동안 노트를 저장할 수 없어요.

색은 기본(반전면)·강조·연한 강조·주의 네 가지예요. data-announce="키" 를 주면 닫은 것을 기억해요. 여기 띠는 키가 없어 새로 열면 다시 보여요.

ERB
<%# 머리 내비보다 위에 둔다. data-announce="키" 면 닫은 것을 기억한다(data-announce-days 일 동안, 기본 영원히) %>
<div class="announce" data-announce="review-due-10" role="region" aria-label="새 기능 알림">
  <div class="container announce__inner">
    <p class="announce__text">
      <span class="announce__badge">새 기능</span>검토 요청에 마감일을 정할 수 있어요.
      <%= link_to "알아보기", "/product/sign", class: "announce__link" %>
    </p>
    <button class="announce__close" type="button" aria-label="알림 닫기"><%= icon("close") %></button>
  </div>
</div>

<%# 색: 기본 반전면 · announce--accent · announce--soft · announce--warn. 닫으면 ds:announce-close %>

뒤로 링크

앞 화면으로 돌아가는 링크에 써요. 화면 전환이 '뒤로' 방향으로 움직여요. 여기서는 앞 화면이 없어 제자리에 있어요.

과제 목록 세포 배양 3차
data-nav-back
뒤로. 화면이 오른쪽으로 밀려 나가요.
data-nav-tab
탭 전환. 탭바 안의 링크도 같아요.
data-nav-none
움직이지 않아요.
그 밖의 링크
앞으로 들어가요.

앱바의 뒤로 버튼은 nav-back 컨트롤러가 휴대폰 뒤로 가기처럼 한 칸 돌아가요. 알림으로 바로 열었으면 링크 주소로 가요.

ERB
<%# 화면 전환 방향: data-nav-back(뒤로) · data-nav-tab(탭) · data-nav-none(없음) · 그 밖(앞으로) %>
<%= link_to project_notes_path(project), class: "btn btn--ghost btn--sm", data: { nav_back: "" } do %>
  <%= icon("chevron-left", size: "sm") %><span class="btn__label">과제 목록</span>
<% end %>

<%# 앱바 뒤로 버튼은 app_bar 헬퍼가 그린다. 앞 화면이 앱 안이면 한 칸 돌아가고, 아니면 back 경로로 간다 %>
<%= app_bar "세포 배양 3차", back: back_path(project_notes_path(project)) %>

단축키

찾기 칸처럼 자주 가는 곳에 키 하나로 가게 해요. 글자를 적는 중에는 먹지 않아요.

칸 밖을 한 번 누른 뒤 / 를 눌러 보세요. 칸에 data-hotkey="/" 를 달았고, 이 칸이 화면에 보일 때만 켜 두었어요. 조합키는 mod+k 처럼 적어요.

ERB
<%# ds/dashboard.js: data-hotkey 를 단 칸은 그 키로 초점을 받는다(버튼이면 눌린다) %>
<label class="searchbar">
  <%= icon("search") %>
  <input class="searchbar__input" type="search" placeholder="예: 세포 배양"
         aria-label="연구노트 찾기" aria-keyshortcuts="/" autocomplete="off" data-hotkey="mod+k /">
  <kbd class="kbd" data-hotkey-label="⌘K" aria-hidden="true">⌘K</kbd>
</label>

발(푸터)

이 화면 맨 아래에 있는 것이 실제 푸터예요. 면(surface-alt)으로 본문과 나누고, 묶음·법무 링크·테마 바꾸기·바닥의 큰 이름으로 마무리해요.

로고 · 소개 한 줄brand(:description)
좁으면 한 줄 전체, 768px 부터 왼쪽 넓은 칸이에요.
링크 묶음 3개site_footer_groups
좁으면 2열, 768px 부터 3열이에요.
법무 링크site_legal_links
저작권 줄 오른쪽에 놓여요.
테마 바꾸기data-theme-toggle
밝은·어두운 테마를 바꾸고 토스트로 알려요.
바닥 큰 이름.ghosttype
옅은 브랜드 글자가 아래로 잘리며 끝나요.
운영 주체·문의 메일은 확정된 값이 있을 때만 적어요.
ERB
<%# 레이아웃이 그린다. 묶음·법무 링크는 NavigationHelper(site_footer_groups·site_legal_links) %>
<%= render "shared/footer" %>

<footer class="footer footer--site surface-alt on-alt" data-dock-hide>
  <div class="container container--wide">
    <div class="footer__grid">
      <div class="footer__brand">…로고 · brand(:description)…</div>
      <nav aria-labelledby="ft-product">
        <p class="footer__title" id="ft-product">제품</p>
        <ul><li><%= link_to "연구노트 작성", "/product/notes", class: "footer__link", "aria-current": nav_aria("/product/notes") %></li></ul>
      </nav>
    </div>
    <div class="footer__legal">
      <p>© 2026 연구대장</p>
      <div class="footer__legal-links">
        <%= link_to "이용약관", "/terms" %>
        <button class="btn btn--ghost btn--sm" type="button" data-theme-toggle>
          <%= icon("moon", size: "sm") %><span class="btn__label">테마 바꾸기</span>
        </button>
      </div>
    </div>
    <div class="ghosttype" aria-hidden="true">연구대장</div>
  </div>
</footer>

무엇을 고를까

비슷해 보여도 하는 일이 달라요. 주소가 바뀌는지, 한 번에 몇 개를 보는지로 고르세요.

탭data-tabs
한 화면 안에서 내용 묶음을 바꿔요. 주소는 그대로예요.
링크 분절a.segment__item
같은 목록을 다른 주소로 걸러 봐요.
아코디언data-accordion
가끔 보는 설명을 접어 둬요.
드롭다운 메뉴data-menu
동작 여러 개를 버튼 하나에 모아요.
경로.crumbs
깊은 화면에서 지금 위치를 알려요.
단계 표시ui_steps
여러 단계 입력의 어디쯤인지 알려요.
페이지 이동.pager
쪽 번호로 긴 목록을 나눠 봐요.
더 보기pager--more
끝까지 내려 읽는 목록을 조금씩 더 불러와요.

실험 과정과 결과를 기록하고, 서명과 검토까지 한곳에서 끝내요.

제품

  • 연구노트 작성
  • 전자서명·검토
  • 협업·공유
  • 보안·감사 기록
  • 요금

회사

  • 서비스 소개
  • 도입 사례
  • 공지사항

도움말

  • 자주 묻는 질문
  • 문의하기
  • 디자인 시스템

© 2026 연구대장

이용약관개인정보처리방침
연구대장
검토 대기NB-2409-031

PCR 증폭 조건 최적화 3차

과제
항체 개발
작성자
김지수 연구원항체팀
수정
9/28(월) 14:20
첨부
4개

메모

어닐링 온도 58℃에서 밴드가 가장 선명했어요

기록

    박도윤 책임연구원에게 검토를 요청해요

    요청하면 검토가 끝날 때까지 이 노트를 고칠 수 없어요.

    노트
    PCR 조건 최적화 3차
    버전
    v39/28(월) 09:12 저장
    첨부
    파일 3개 · 13.5MB
    기한
    9/30(수) 18:00

    공유 링크를 만들었어요

    링크를 받은 한빛바이오 연구소 구성원만 읽을 수 있어요. 7일 뒤에 닫혀요.

    이 노트를 연구실 전체에 공개할까요?

    한빛바이오 연구소 구성원 18명이 읽을 수 있어요. 고치는 건 작성자와 검토자만 할 수 있어요.

    공개하면 감사 기록에 공개한 사람과 시각이 남아요.
    검토 중EN-2609-0142

    PCR 조건 최적화 3차

    한빛바이오 연구소 · 유전체 분석 과제

    작성
    김지수 연구원9/28(월) 09:12
    검토자
    박도윤 책임연구원
    버전
    v3 · 바뀐 곳 4곳
    첨부
    파일 3개 · 13.5MB

    메모

    어닐링 온도를 58·60·62℃ 세 가지로 나눠 비교했어요. 60℃ 에서 띠가 가장 선명해요.

    기록

    1. 노트를 썼어요

      09:12

      김지수 연구원

    2. 검토를 요청했어요

      09:40
    3. 검토를 기다리고 있어요

      지금

      박도윤 책임연구원

    실험 조건 바꾸기

    바꾼 조건은 저장할 때 v4 로 새로 기록돼요.

    장비
    중합효소 로트
    조건 3개 · 어닐링 58·60·62℃

    노트 고치기

    고친 내용은 저장할 때 v4 로 기록돼요.

    검토 결과를 바로 알려 드릴까요?

    이 브라우저로 아래 세 가지만 알려 드려요. 알림은 내 정보에서 언제든 끌 수 있어요.

    검토가 끝났을 때바로 서명할 수 있게
    반려돼 고칠 곳이 생겼을 때검토자가 남긴 말과 함께
    서명 요청이 왔을 때기한 하루 전에 한 번 더

    이 브라우저에서 알림이 막혀 있어요

    한 번 막은 알림은 서비스가 다시 물어볼 수 없어요. 브라우저 설정에서 직접 허용해 주세요.

    1. 주소창 왼쪽의 자물쇠 아이콘을 눌러요
    2. '알림'을 '허용'으로 바꿔요
    3. 이 화면을 새로 고쳐요

    누구에게 검토를 맡길까요?

    보내면 검토자가 답할 때까지 본문을 고칠 수 없어요.

    검토자

    항체 단편 발현 최적화

    다른 과제

    검토자를 골라 주세요. 서명 권한이 있는 사람만 고를 수 있어요.

    검토자가 서명하면 이 버전이 잠겨요.

    파일 미리 보기

    예시 파일이라 그림 대신 모양만 보여요.

    파일
    gel_0927_western.tif
    종류
    이미지
    크기
    4.8MB
    올린 사람
    김지수