import { ReactWebComponent } from '@lit/react'; /** 렌더링 옵션 */ declare interface RenderOption { /** 교차 렌더링 방지 ID — 어느 라우트의 콘텐츠인가 */ id?: string; /** * 라우트의 식별 키(`RouteConfig.key` 의 결과). 같은 라우트 + 같은 키면 기존 콘텐츠를 * 유지한 채 제자리 갱신하고, 바뀌면 내리고 새로 마운트한다. */ key?: string; } /** * 이름 있는 선택 채널 — 여러 뷰(목록 · 곁 패널 · 열린 탭)가 «지금 고른 것» 하나를 함께 따라간다. * * 이동이 «어느 화면인가» 라면 선택은 «그 화면 안에서 지금 무엇을 보는가» 다. 같은 이름의 채널은 문서에 하나뿐이라, * 서로 모르는 모듈이 이름으로 같은 선택을 공유한다. */ declare interface SelectionChannel { readonly name: string; /** 지금 값(선택 없음이면 `undefined`). */ readonly value: T | undefined; /** 지금 값이 유효한 동안의 신호 — 이 값으로 시작한 비동기 작업에 넘긴다. */ readonly signal: AbortSignal; /** 선택을 바꾼다. `query` 가 있으면 주소에도 남긴다(`history`). */ set(value: T | undefined): void; /** 바뀔 때마다 부른다. `immediate` 면 지금 값으로 한 번 먼저. 해지 함수를 돌려준다. */ subscribe(listener: SelectionListener, options?: { immediate?: boolean; }): () => void; /** 고정할 수 있는 구독 — 뷰마다 «따라가기 / 고정». 지금 값으로 한 번 먼저 부른다. */ follow(listener: SelectionListener): SelectionFollower; } /** 한 뷰의 따라가기 — 고정하면 채널이 바뀌어도 그 뷰는 멈춰 있고, 풀면 지금 값으로 다시 맞춘다. */ declare interface SelectionFollower { readonly pinned: boolean; pin(): void; unpin(): void; dispose(): void; } /** 구독자 — 값과, 그 값이 유효한 동안만 살아 있는 신호(다음 선택이 오면 중단된다 — 늦은 응답 버리기). */ declare type SelectionListener = (value: T | undefined, signal: AbortSignal) => void; /** * `u-link` 웹 컴포넌트를 React에서 사용할 수 있도록 래핑한 컴포넌트입니다. */ export declare const ULink: ReactWebComponent; /** * - 클라이언트 라우팅을 지원하는 링크 엘리먼트입니다. * - 내부 링크는 클라이언트 라우팅을 수행하고, 외부 링크는 브라우저 기본 네비게이션을 사용합니다. * - Ctrl/Meta/Shift/Alt, 중클릭/우클릭 등은 브라우저 기본 동작(새 탭, 컨텍스트 메뉴 등)을 그대로 유지합니다. * * Lit 없이 쓰는 표준 커스텀 엘리먼트다 — 라우터가 Lit 을 필수 의존으로 끌고 오지 않도록(React·요소만 쓰는 앱). * 값이 바뀌면 그 자리에서 내부 `` 를 다시 맞춘다(비동기 갱신 주기가 없다). */ declare class ULink_2 extends HTMLElement { static readonly observedAttributes: string[]; /** 외부 링크 여부 */ private isExternal; private _href?; private _target?; private _rel?; private _navigate?; private readonly anchor; constructor(); /** * 링크 대상 target 속성 * * - `_self`: 현재 창에서 링크 열기 (기본값) * - `_blank`: 새 탭/창에서 링크 열기 * - `_parent`: 부모 프레임에서 링크 열기 * - `_top`: 최상위 프레임에서 링크 열기 */ get target(): string | undefined; set target(value: string | undefined); /** * 링크 관계 rel 속성 * * - `noopener`: target이 _blank인 경우 보안 강화 (window.opener 차단) * - `noreferrer`: target이 _blank인 경우 보안 강화 + Referer 헤더 제거 * - `external`: 외부 링크임을 명시 (SEO/접근성에 도움) * - `nofollow`: 검색 엔진이 링크를 따라가지 않도록 지시 (SEO에 영향) * - 그 외 rel 값도 그대로 전달됩니다. */ get rel(): string | undefined; set rel(value: string | undefined); /** * 링크 대상 URL, 다음 사항에 따라 SPA 라우팅 또는 브라우저 네비게이션이 결정됩니다. * * - 속성을 정의하지 않으면 설정에서 지정한 `basepath`로 SPA 라우팅합니다. * - http(s)로 시작하면 외부 링크로 간주하고 브라우저 네비게이션을 사용합니다. * - 절대경로(/...)의 경우 `basepath`로 시작하면 SPA 라우팅합니다, 이외 브라우저 네비게이션을 사용합니다. * - 상대경로는 (basepath + 상대경로)로 결합하여 SPA 라우팅합니다. * - ?로 시작하면 현재 경로에 쿼리스트링을 추가하여 SPA 라우팅합니다. * - #으로 시작하면 브라우저 기본 동작을 사용합니다. */ get href(): string | undefined; set href(value: string | undefined); /** * 이 링크를 라우터가 처리할지, 브라우저의 문서 이동에 맡길지. * * - `router`(기본): 종전 동작 그대로 — 같은 오리진이면 SPA 이동, 아니면 브라우저에 맡긴다. * - `document`: 라우터가 **가로채지 않는다.** 같은 오리진이지만 SPA 라우트가 아닌 경로 * (정적 문서 사이트, 서버 렌더 페이지, 파일 다운로드 엔드포인트, 인증 리다이렉트)를 가리킬 때 쓴다. * * ⚠**「외부 오리진」이 아니라 「다른 문서」다.** 종전에는 이 구분이 **오리진 비교 하나**로만 * 결정돼서, 같은 오리진의 비-SPA 경로를 가리킬 수단이 없었다 — 라우터가 클릭을 가로채고 * 등록되지 않은 라우트이므로 화면이 not-found 로 떨어졌다. 빠져나갈 길이 셋뿐이었고 * (다른 오리진 · `target="_blank"` · `#` 프래그먼트) 셋 다 요구와 다르다: * 같은 오리진이어야 하고(쿠키·세션·역방향 프록시), **같은 탭**이어야 하며, 다른 문서다. * * ```html * Help * ``` * * ⚠**자동 판정을 넓히지 않는다.** 「등록된 라우트와 대조해 미등록이면 문서 이동」도 가능하지만 * 라우트가 늦게 등록되면 판정이 **시점에 의존**하게 된다. 명시 선언이 예측 가능하다. */ get navigate(): "router" | "document" | undefined; set navigate(value: "router" | "document" | undefined); connectedCallback(): void; disconnectedCallback(): void; private handleRouterState; /** * 호스트에 세팅된 `aria-current`/`aria-label`은 실제 접근 가능한(포커스 대상) * 엘리먼트가 아니라 — 그 안쪽 shadow DOM 의 네이티브 ``다. 섀도우 경계를 * 넘지 않으므로 접근성 트리에 자동 반영되지 않는다(실측 — 속성은 * 붙어 있는데 접근성 트리의 `aria-current`는 계속 비어 있음). 그래서 `sync()`가 이 * 값을 읽어 내부 ``에 직접 옮기고, 두 속성을 `observedAttributes`에 둬 연결 후의 * 변경도 반영한다(목록에 없는 속성은 `attributeChangedCallback` 자체가 호출되지 않는다). */ attributeChangedCallback(name: string, _old: string | null, value: string | null): void; /** 내부 `` 를 지금 값으로 맞춘다. */ private sync; private compute; /** * 클릭 가로채기 핸들러 * - 좌클릭(0) + 보조키 없음(ctrl/meta/shift/alt 없음) + target이 _self일 때만 SPA 라우팅 고려 * - 그 외(중클릭/우클릭/보조키/target=_blank 등)는 브라우저 기본 동작 유지 */ private handleClick; /** basepath를 state에서 꺼내는 헬퍼 */ private getBasepath; } /** * `u-outlet` 웹 컴포넌트를 React에서 사용할 수 있도록 래핑한 컴포넌트입니다. */ export declare const UOutlet: ReactWebComponent; /** * LitElement 또는 React 컴포넌트를 렌더링해주는 웹컴포넌트 입니다. */ declare class UOutlet_2 extends HTMLElement { /** 교차 렌더링 방지 id */ private routeId?; /** 마지막으로 렌더한 라우트의 식별 키 */ private routeKey?; /** 마운트된 콘텐츠의 종류 */ private kind?; /** 실제 렌더링 컨텐츠 */ private root?; /** 진행 중인 render — 다음 render 는 이것이 끝난 뒤 판정한다 */ private pending?; connectedCallback(): void; /** * 주어진 렌더링 옵션에 따라 컨텐츠를 렌더링합니다. * * 같은 라우트(`id`)에 같은 키(`key`)로 다시 불리면 **제자리 갱신**한다 — Lit 템플릿은 * 같은 파트에 다시 렌더(요소·상태 유지, 바인딩만 갱신), React 엘리먼트는 같은 root 에 다시 * 렌더(컴포넌트 상태 유지), `HTMLElement` 는 기존 인스턴스를 그대로 둔다. 매번 `reset()` * 을 먼저 부르던 종전 동작이 «쿼리스트링만 바뀌어도 페이지가 재마운트되는» 원인이었다 * (Lit 의 `render` 도 React 의 `root.render` 도 같은 컨테이너에 다시 부르면 조정한다). */ render(value: unknown, options?: RenderOption): Promise; private mount; /** * 방금 그린 최상위 요소들의 첫 렌더를 기다린다 — `render()` 가 끝났다는 것은 «내용이 그려졌다» 여야 * `route-done` 을 듣는 쪽(포커스 배치 등)이 화면을 읽을 수 있다. Lit 요소는 연결된 뒤 자기 템플릿을 비동기로 그린다. */ private childrenRendered; /** * 기존 DOM을 삭제하여, 초기 상태로 되돌립니다. */ reset(): void; } /** * 선택 채널(`selection()`)을 React 상태로 — 값이 바뀌면 다시 그린다. 이 값으로 시작한 비동기 작업은 `channel.signal` 을 * 넘겨 늦은 응답을 버린다. * * ```tsx * const order = selection('order', { query: 'order' }); * const [id, setId] = useSelection(order); * ``` */ export declare function useSelection(channel: SelectionChannel): [T | undefined, (value: T | undefined) => void]; export { } declare global { interface HTMLElementTagNameMap { 'u-outlet': import('@iyulab/router').UOutlet; } } declare global { interface WindowEventMap { 'u-router-navigate': CustomEvent; } } /** * 전역 WindowEventMap에 라우터 이벤트 타입 */ declare global { interface WindowEventMap { 'route-begin': import('@iyulab/router').RouteBeginEvent; 'route-progress': import('@iyulab/router').RouteProgressEvent; 'route-done': import('@iyulab/router').RouteDoneEvent; 'route-error': import('@iyulab/router').RouteErrorEvent; } }