/** * 붙여넣기 아이템의 발행본 공통 조각. * * ★ 색과 서체를 박지 않는다. 전부 템플릿 토큰(`--tpl-*`, `seo/head.ts` 가 심는다)을 읽는다 — * 한때 이 파일이 갱지색·주(朱)잉크·간판체를 hex 와 폰트명으로 들고 있었고, 그 바람에 * 사장님이 템플릿을 바꿔도 아이템 섹션만 레트로로 남았다. 아이템은 레트로 전용 부품이 아니다. * ★ 인상은 빌더 캔버스와 같게 그린다. 다만 **인터랙션은 옮기지 않는다** — * 캔버스의 턴테이블은 '지금 한 곡'만 펴는데 그러면 나머지 곡의 문장이 HTML 에 없다. * 이 사이트의 존재 이유가 AI·검색의 인용이라, 발행본은 전 항목을 펴고 가로로만 민다. */ import {createContext, useContext} from 'react'; import type {ReactNode} from 'react'; import type {DataSource, DataVerified} from '@o2o/shared'; import {Carousel} from '@site/lib/ui'; import {useLayout} from '@site/lib/layout'; export const TabPanelContext = createContext(false); // 안별 제목은 `lib/ui/Section` 과 **같은 파일**을 직접 가리킨다. // `@/sections` 배럴로 돌아가면 이 파일이 그 배럴 안에 있어 순환이다. import {SectionHead as ReservationHead} from '@site/layouts/reservation/SectionHead'; import {SectionHead as OasiHead} from '@site/layouts/oasi/SectionHead'; import {SectionHead as StudioHead} from '@site/layouts/studio/SectionHead'; import {SectionHead as PastelHead} from '@site/layouts/pastel/SectionHead'; import {SectionHead as EditorialHead} from '@site/layouts/editorial/SectionHead'; import './items.css'; /** 카드·종이 면. 섹션 바탕보다 한 단계 앞이다. */ export const ITEM_CARD = 'var(--tpl-card, #fafafa)'; /** 선·테두리. */ export const ITEM_BORDER = 'var(--tpl-border, #d6d3d1)'; /** * 강조 — 연표의 전환점, 일력의 날짜, 소인 도장. * * ★ 강조색을 그대로 쓰지 않고 둘레 글자색을 섞는다(빌더 캔버스와 같은 규칙). 팔레트에 따라 * accent 가 바탕과 같은 밝기면 큰 숫자와 배지가 화면에서 사라진다. */ export const ITEM_ACCENT = 'color-mix(in oklab, var(--tpl-accent, #2563eb) 55%, currentColor)'; /** 어두운 면(필름·플립보드). */ export const ITEM_INVERSE = 'var(--tpl-inverse, #1c1917)'; /** 어두운 면 위의 글자색 — 흰색을 박지 않고 템플릿의 밝은 면 색을 쓴다. */ export const ITEM_INVERSE_INK = 'var(--tpl-bg, #ffffff)'; /** 글자색. */ export const ITEM_INK = 'var(--tpl-text, #09090b)'; /** * 시간표 칸 번호 — 승차권 카드(추천 일정 · 계절별 추천 하루)가 함께 쓴다. * **지도 핀과 같은 번호**다. 둘을 잇는 끈이 이 숫자뿐이라 두 화면이 어긋나면 안 된다. */ export function StopNo({n}: {n: number}) { return ( {n} ); } /** * 아이템 섹션 껍데기. * * 바탕은 `--tpl-surface`(섹션 바탕) 또는 `--tpl-inverse`(어두운 아이템)다. * 다른 섹션들과 **같은 여백·같은 제목**을 쓴다(index.css 의 --section-space) — * 아이템만 다른 리듬으로 들어가면 페이지가 두 사이트를 이어 붙인 것처럼 보인다. * * ★ 제목은 안(layout)에 맡긴다 (2026-09-04, 사장님이 3안 화면을 보고 지적) * 여기서 `.h2` 를 직접 그렸더니, 소제목이 대괄호 안 작은 활자인 3안(oasi)에서 * '영상으로 보기'·'추천 일정' 만 큰 명조로 튀었다. 공용 `lib/ui/Section` 과 **같은 방식**으로 * 안별 `SectionHead` 에 넘긴다 — subtitle 은 lead 로, 바깥 링크는 aside 로 간다 * (다섯 안 모두 `{id, title, lead, aside}` 를 받고 `
{subtitle}
)}{count}
}{source?.name && ( 출처 ·{' '} {source.url ? ( {source.name} ) : ( source.name )} )} {imageCredit && 사진 · {imageCredit}}
); } /** * "총 N개" 각주. 단위(곡·장·명)는 아이템마다 다르다. * * ★ 뒤에 "· 확인 필요 M" 을 붙였었다 — 손님에게 우리 검수 진도를 알릴 이유가 없다. * 인자는 그대로 받는다(부르는 쪽 열 곳을 한꺼번에 고치지 않으려고). */ export function tally(total: number, unverified: number, unit: string): string { void unverified; return `총 ${total}${unit}`; }