import { PropertyValues } from 'lit'; import { StyledElement } from '../internals/StyledElement.js'; import { default as React } from 'react'; type ElementParts = 'host' | 'master' | 'divider' | 'detail' | 'detail-close'; /** * master›detail 반응형 split-pane 셸. * * ★**Vaadin `MasterDetailLayout` 을 선례로 삼되 범위를 의도적으로 줄였다.** 드래그 가능한 * 스플리터는 v1 스코프 아웃(`masterSize` 는 고정 prop) — "얇은 구조" 원칙상 과하다. * * 기본 슬롯 = master 영역, `slot="detail"` = detail 영역. **detail 은 채워지면 나타나고 * 비우면 사라진다** — Vaadin 과 동일 계약. 선택 상태 관리(무엇을 detail 에 보여줄지)는 * 이 컴포넌트가 하지 않는다 — "그릇이지 디자인이 아니다"(`lob-layers.md` §3). 소비자가 * `u-rich-table` 의 `selection-change` 등으로 `slot="detail"` 자식을 직접 갈아끼운다. * * ```html * * *
…선택된 레코드 상세…
*
* ``` * * 좁은 화면(자기 폭 기준, `overlayBreakpoint` 미만)에서 detail 이 master 위 전체 오버레이로 * 전환된다 — 오버레이 모드에서만 보이는 작은 닫기 버튼이 `detail-close` 이벤트를 낸다. * 이건 구조적 기능(레이아웃 역학)이라 도메인 로직이 아니므로 컴포넌트가 가져도 된다. * * ★**왜 `@container` 미디어 질의가 아니라 `ResizeObserver` 인가**: `overlayBreakpoint` 는 * prop 이라 인스턴스마다 다른 값을 가질 수 있는데, CSS `@container` 조건은 빌드 시점에 * 고정된 값만 받는다(런타임 커스텀 프로퍼티를 조건절에 못 쓴다) — 그래서 자기 폭을 직접 * 재서 `overlay` 속성을 반영한다. `masterSize`/`overlayBreakpoint` 가 고정 디자인값이 * 아니라 소비자가 화면마다 바꿀 구조 파라미터이기 때문에 생기는 필연적 차이이지, * `PageHeader`/`GroupBox`/`ActionBar` 의 고정 중단점 관행을 벗어나려는 것이 아니다. * * 오버라이드: `part`(host·master·divider·detail·detail-close) + slot 치환. */ export declare class MasterDetailLayout extends StyledElement { static styles: import('lit').CSSResultGroup[]; /** master 영역의 고정 폭(CSS 길이). detail 은 나머지 공간을 채운다. */ masterSize: string; /** * 이 값(px, 자기 폭 기준) 미만이면 detail 이 전체 오버레이로 전환된다. * `masterSize` + 최소한의 읽기 가능한 detail 폭을 더한 값보다 커야 두 패널이 * 동시에 설 자리가 있다. */ overlayBreakpoint: number; /** * 언어 태그. 비우면 `setDefaultLocale()` 값, 그것도 없으면 영어. * 닫기 버튼의 접근성 라벨에만 쓰인다. */ locale: string; /** detail 슬롯 배정 상태 — CSS `:has()` 로는 알 수 없다(`internals/slotted.ts` 참조). */ private hasDetail; private resizeObserver?; connectedCallback(): void; disconnectedCallback(): void; protected updated(changed: PropertyValues): void; /** * 오버레이 모드의 닫기 버튼이 눌렸을 때. detail 내용을 지우는 것은 소비자 몫이라 * 컴포넌트 내부에 취소로 막을 동작이 없다 — 그래서 취소 불가 이벤트다(`fire()` 기본값인 * `cancelable: true` 를 명시적으로 끈다). */ private handleDetailClose; private handleDetailSlotChange; render(): import('lit-html').TemplateResult<1>; } declare global { interface HTMLElementTagNameMap { 'u-master-detail-layout': MasterDetailLayout; } } declare module 'react' { namespace JSX { interface IntrinsicElements { 'u-master-detail-layout': React.DetailedHTMLProps, HTMLElement> & { 'master-size'?: string; 'overlay-breakpoint'?: number | string; locale?: string; }; } } } export {};