@roottale/cms-renderer-next 0.51.1 → 0.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +96 -0
- package/README.md +54 -4
- package/dist/{chunk-U2IM6OCQ.js → chunk-HM5VP7SR.js} +1 -1
- package/dist/{chunk-U2IM6OCQ.js.map → chunk-HM5VP7SR.js.map} +1 -1
- package/dist/chunk-KSPPYX22.js +14 -0
- package/dist/chunk-KSPPYX22.js.map +1 -0
- package/dist/cms-public.css +46 -0
- package/dist/routes.d.ts +25 -1
- package/dist/routes.js +72 -14
- package/dist/routes.js.map +1 -1
- package/dist/section-runtime.d.ts +46 -0
- package/dist/section-runtime.js +9 -0
- package/dist/server.d.ts +5 -3
- package/dist/server.js +1679 -34
- package/dist/server.js.map +1 -1
- package/package.json +7 -23
- package/dist/before-after-client.d.ts +0 -15
- package/dist/before-after-client.js +0 -8
- package/dist/chunk-27RT6B3O.js +0 -93
- package/dist/chunk-27RT6B3O.js.map +0 -1
- package/dist/chunk-2QU4JU46.js +0 -3927
- package/dist/chunk-2QU4JU46.js.map +0 -1
- package/dist/chunk-4RQ3SEDL.js +0 -106
- package/dist/chunk-4RQ3SEDL.js.map +0 -1
- package/dist/chunk-6GQCFFHU.js +0 -540
- package/dist/chunk-6GQCFFHU.js.map +0 -1
- package/dist/chunk-H46JUIHZ.js +0 -79
- package/dist/chunk-H46JUIHZ.js.map +0 -1
- package/dist/chunk-K62RR4UQ.js +0 -53
- package/dist/chunk-K62RR4UQ.js.map +0 -1
- package/dist/chunk-LEHHSI6G.js +0 -64
- package/dist/chunk-LEHHSI6G.js.map +0 -1
- package/dist/chunk-QYNEOFL7.js +0 -418
- package/dist/chunk-QYNEOFL7.js.map +0 -1
- package/dist/chunk-U5AKACPN.js +0 -113
- package/dist/chunk-U5AKACPN.js.map +0 -1
- package/dist/chunk-UM37DOIK.js +0 -961
- package/dist/chunk-UM37DOIK.js.map +0 -1
- package/dist/chunk-YLSQAT6B.js +0 -59
- package/dist/chunk-YLSQAT6B.js.map +0 -1
- package/dist/chunk-ZL2NA3QT.js +0 -313
- package/dist/chunk-ZL2NA3QT.js.map +0 -1
- package/dist/concerns-client.d.ts +0 -12
- package/dist/concerns-client.js +0 -8
- package/dist/concerns-client.js.map +0 -1
- package/dist/contact-map-client.d.ts +0 -27
- package/dist/contact-map-client.js +0 -8
- package/dist/contact-map-client.js.map +0 -1
- package/dist/expertise-client.d.ts +0 -16
- package/dist/expertise-client.js +0 -9
- package/dist/expertise-client.js.map +0 -1
- package/dist/hero-carousel-client.d.ts +0 -52
- package/dist/hero-carousel-client.js +0 -9
- package/dist/hero-carousel-client.js.map +0 -1
- package/dist/seo-checks.d.ts +0 -87
- package/dist/seo-checks.js +0 -27
- package/dist/seo-checks.js.map +0 -1
- package/dist/site-config-BvUyDx_f.d.ts +0 -3961
- package/dist/spaces-client.d.ts +0 -10
- package/dist/spaces-client.js +0 -8
- package/dist/spaces-client.js.map +0 -1
- package/dist/team-expanding-stage-client.d.ts +0 -35
- package/dist/team-expanding-stage-client.js +0 -8
- package/dist/team-expanding-stage-client.js.map +0 -1
- package/dist/templates.css +0 -4145
- package/dist/templates.d.ts +0 -171
- package/dist/templates.js +0 -291
- package/dist/templates.js.map +0 -1
- package/dist/theme-css-vars-CD3jcEkp.d.ts +0 -7
- package/dist/ui-react-motion-client.d.ts +0 -76
- package/dist/ui-react-motion-client.js +0 -16
- package/dist/ui-react-motion-client.js.map +0 -1
- package/dist/validate.d.ts +0 -104
- package/dist/validate.js +0 -1204
- package/dist/validate.js.map +0 -1
- /package/dist/{before-after-client.js.map → section-runtime.js.map} +0 -0
package/dist/concerns-client.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { ReactElement } from 'react';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* `contact` 지도 블록의 "클릭-투-로드" 모드(ADR-0086 P2 D3) — chambarun
|
|
5
|
-
* mockup `.map-facade`/`site.js` "지도: 클릭-투-로드" 이식
|
|
6
|
-
* (`clients/chambarun/mockup/assets/site.js` "지도: 클릭-투-로드" 블록).
|
|
7
|
-
*
|
|
8
|
-
* 원본은 DOM 을 직접 갈아끼우는 vanilla 스크립트(`replaceWith`)였다 — 여기서는
|
|
9
|
-
* React state 로 같은 효과(정적 프리뷰 → 클릭 시 1회 iframe 마운트)를 낸다.
|
|
10
|
-
* `ContactMapBlock`(sections.tsx, RSC)이 embedUrl 이 allowlist 를 통과했을
|
|
11
|
-
* 때만 이 컴포넌트를 렌더하므로, 이 컴포넌트 자신은 allowlist 재검증을 하지
|
|
12
|
-
* 않는다(호출자 계약).
|
|
13
|
-
*
|
|
14
|
-
* 빌드: tsup 독립 entry(`contact-map-client`, tsup.config.ts) — "use client"
|
|
15
|
-
* 경계가 `templates.js`(서버 전용)로 새지 않게 격리(hero-carousel-client 류와
|
|
16
|
-
* 동일 계약).
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
interface ContactMapClickToLoadProps {
|
|
20
|
-
readonly embedUrl: string;
|
|
21
|
-
readonly externalUrl: string | undefined;
|
|
22
|
-
readonly facadeImageSrc: string | undefined;
|
|
23
|
-
readonly facadeImageAlt: string | undefined;
|
|
24
|
-
}
|
|
25
|
-
declare function ContactMapClickToLoad({ embedUrl, externalUrl, facadeImageSrc, facadeImageAlt, }: ContactMapClickToLoadProps): ReactElement;
|
|
26
|
-
|
|
27
|
-
export { ContactMapClickToLoad, type ContactMapClickToLoadProps };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { E as ExpertiseSection } from './site-config-BvUyDx_f.js';
|
|
3
|
-
import 'zod';
|
|
4
|
-
|
|
5
|
-
type ExpertiseItem = ExpertiseSection["props"]["items"][number];
|
|
6
|
-
/**
|
|
7
|
-
* `expertise` `tab-stage` variant — 좌측 탭 목록(항상 세로 1열, templates.css
|
|
8
|
-
* `.rt-tpl-expertise-tabs`) + 우측 상세 패널. 키보드 계약은 WAI-ARIA APG
|
|
9
|
-
* tablist 패턴(roving tabindex, 단일 tab stop) — `use-roving-tablist.ts` 공용
|
|
10
|
-
* hook 사용(D4, 적대 리뷰 R1 실측 지적 대응).
|
|
11
|
-
*/
|
|
12
|
-
declare function ExpertiseTabStage({ items, }: {
|
|
13
|
-
readonly items: readonly ExpertiseItem[];
|
|
14
|
-
}): react_jsx_runtime.JSX.Element | null;
|
|
15
|
-
|
|
16
|
-
export { ExpertiseTabStage };
|
package/dist/expertise-client.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* `hero` `carousel` variant 공유 타입 — client 아일랜드 서브모듈들이 순환
|
|
5
|
-
* import 없이 참조하는 단일 소스 (hero-carousel-client.tsx 400줄 상한 분할,
|
|
6
|
-
* 2026-06-24 지시 — `feedback_max_400_lines`).
|
|
7
|
-
*/
|
|
8
|
-
interface HeroCarouselSlideInput {
|
|
9
|
-
readonly image: string;
|
|
10
|
-
readonly alt: string;
|
|
11
|
-
readonly caption?: string;
|
|
12
|
-
readonly eyebrow?: string;
|
|
13
|
-
readonly title?: string;
|
|
14
|
-
readonly subtitle?: string;
|
|
15
|
-
readonly description?: string;
|
|
16
|
-
readonly primaryCta?: {
|
|
17
|
-
readonly label: string;
|
|
18
|
-
readonly href: string;
|
|
19
|
-
};
|
|
20
|
-
readonly secondaryCta?: {
|
|
21
|
-
readonly label: string;
|
|
22
|
-
readonly href: string;
|
|
23
|
-
};
|
|
24
|
-
readonly tabLabel?: string;
|
|
25
|
-
readonly tabMeta?: string;
|
|
26
|
-
readonly metrics?: readonly {
|
|
27
|
-
readonly value: string;
|
|
28
|
-
readonly unit?: string;
|
|
29
|
-
readonly label: string;
|
|
30
|
-
readonly source?: string;
|
|
31
|
-
}[];
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* 배경 전환 모션 — "variant=구조, motion=인상" 규칙(ADR-0086 P2): `carousel`
|
|
35
|
-
* variant 구조는 그대로, 인상만 갈아끼운다.
|
|
36
|
-
* - `slide`(기본): 기존 embla 가로 스크롤 전환.
|
|
37
|
-
* - `curtain`: clip-path 와이프 + 신 스윕 + 카피 스태거(chambarun 이식,
|
|
38
|
-
* `hero-carousel-curtain.tsx`).
|
|
39
|
-
*/
|
|
40
|
-
type HeroCarouselTransition = "slide" | "curtain";
|
|
41
|
-
interface HeroCarouselViewportProps {
|
|
42
|
-
readonly slides: readonly HeroCarouselSlideInput[];
|
|
43
|
-
readonly autoplay: boolean;
|
|
44
|
-
readonly intervalMs: number;
|
|
45
|
-
readonly scrim?: "none" | "soft" | "strong";
|
|
46
|
-
/** 기본 "slide" — 하위 호환(기존 고객 config 에 필드 없음). */
|
|
47
|
-
readonly transition?: HeroCarouselTransition;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
declare function HeroCarouselViewport({ slides, autoplay, intervalMs, scrim, transition, }: HeroCarouselViewportProps): react_jsx_runtime.JSX.Element;
|
|
51
|
-
|
|
52
|
-
export { type HeroCarouselSlideInput, type HeroCarouselTransition, HeroCarouselViewport, type HeroCarouselViewportProps };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/seo-checks.d.ts
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
type SeoCheckLevel = "good" | "warn" | "bad";
|
|
2
|
-
interface SeoCheckResult {
|
|
3
|
-
id: string;
|
|
4
|
-
level: SeoCheckLevel;
|
|
5
|
-
label: string;
|
|
6
|
-
hint: string;
|
|
7
|
-
}
|
|
8
|
-
interface SeoCheckInput {
|
|
9
|
-
title: string;
|
|
10
|
-
seoTitle: string;
|
|
11
|
-
seoDescription: string;
|
|
12
|
-
excerpt: string;
|
|
13
|
-
slug: string;
|
|
14
|
-
/** Tiptap doc JSON (PostsEditor 의 editor.getJSON() 형태). */
|
|
15
|
-
bodyJson: TiptapNode | null | undefined;
|
|
16
|
-
hasFeaturedImage: boolean;
|
|
17
|
-
/** SEO 패널의 canonical URL — noindex 와 겸용 충돌 점검용 (선택). */
|
|
18
|
-
canonical?: string;
|
|
19
|
-
/** SEO 패널의 noindex 설정 (선택). */
|
|
20
|
-
noindex?: boolean;
|
|
21
|
-
}
|
|
22
|
-
interface TiptapMark {
|
|
23
|
-
type?: string;
|
|
24
|
-
attrs?: Record<string, unknown>;
|
|
25
|
-
}
|
|
26
|
-
interface TiptapNode {
|
|
27
|
-
type?: string;
|
|
28
|
-
text?: string;
|
|
29
|
-
attrs?: Record<string, unknown>;
|
|
30
|
-
content?: TiptapNode[];
|
|
31
|
-
marks?: TiptapMark[];
|
|
32
|
-
}
|
|
33
|
-
/** depth-first 로 모든 노드를 방문한다 (루트 포함). */
|
|
34
|
-
declare function walkNodes(node: TiptapNode | null | undefined, visit: (node: TiptapNode) => void): void;
|
|
35
|
-
/** 조건에 맞는 노드를 문서 순서대로 수집한다. */
|
|
36
|
-
declare function collectNodes(node: TiptapNode | null | undefined, predicate: (node: TiptapNode) => boolean): TiptapNode[];
|
|
37
|
-
/** 본문 텍스트 추출 — 블록 경계는 개행으로 구분. */
|
|
38
|
-
declare function extractText(node: TiptapNode | null | undefined): string;
|
|
39
|
-
/** 공백 제외 글자 수 — "본문 분량" 측정 기준. */
|
|
40
|
-
declare function countBodyChars(node: TiptapNode | null | undefined): number;
|
|
41
|
-
/**
|
|
42
|
-
* 사이트별 bounded 임계값 (ADR-0061 §5 content kind). seo-checks 는 KnowledgeKind 를
|
|
43
|
-
* 모르고(§4②) 평범한 숫자만 받는다 — content→thresholds 해석은 호출자(페이지)가.
|
|
44
|
-
* 필드명은 site-knowledge ContentPolicy 와 동일(구조적으로 그대로 전달 가능).
|
|
45
|
-
*/
|
|
46
|
-
interface SeoThresholds {
|
|
47
|
-
titleMaxLen: number;
|
|
48
|
-
descMaxLen: number;
|
|
49
|
-
bodyMinLen: number;
|
|
50
|
-
}
|
|
51
|
-
/** 기본값 = 한국어 SERP 기준 현행 상수. 미전달 시 동작 불변(하위호환). */
|
|
52
|
-
declare const DEFAULT_SEO_THRESHOLDS: SeoThresholds;
|
|
53
|
-
interface BusinessProfileCompleteness {
|
|
54
|
-
hasAddress: boolean;
|
|
55
|
-
hasTelephone: boolean;
|
|
56
|
-
hasOpeningHours: boolean;
|
|
57
|
-
hasGeo: boolean;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* 비즈니스 프로필 완성도 체크 — `profile` 미전달(사이트 없음 등)이면 결과 자체를
|
|
61
|
-
* 내지 않는다(체크리스트 노이즈 방지, `checkNoindexCanonicalConflict` 와 동일 패턴).
|
|
62
|
-
*/
|
|
63
|
-
declare function checkBusinessProfile(profile: BusinessProfileCompleteness | undefined): SeoCheckResult | null;
|
|
64
|
-
declare function runSeoChecks(input: SeoCheckInput, thresholds?: SeoThresholds): SeoCheckResult[];
|
|
65
|
-
declare const SEO_SCORE_WEIGHTS: Readonly<Record<string, number>>;
|
|
66
|
-
/**
|
|
67
|
-
* 가중합 0~100 점. 가중치가 정의된 id 만 합산(lexicon 등 확장 항목은 자동 제외).
|
|
68
|
-
* 결과 배열에 가중치 있는 항목이 하나도 없으면 0(평가 불가 상태를 0으로 fail-closed).
|
|
69
|
-
*/
|
|
70
|
-
declare function computeSeoScore(results: readonly SeoCheckResult[], weights?: Readonly<Record<string, number>>): number;
|
|
71
|
-
interface ReadabilityThresholds {
|
|
72
|
-
/** 문장 평균 길이(공백 제외 글자 수) 상한. */
|
|
73
|
-
sentenceAvgMax: number;
|
|
74
|
-
/** 문장 최장 길이 상한. */
|
|
75
|
-
sentenceLongMax: number;
|
|
76
|
-
/** 문단 평균 길이 상한. */
|
|
77
|
-
paragraphAvgMax: number;
|
|
78
|
-
/** 소제목 사이(또는 첫 소제목 이전) 최대 글자 수 상한. */
|
|
79
|
-
headingDensityMax: number;
|
|
80
|
-
/** 이 글자 수 이상인데 목록이 없으면 권고. */
|
|
81
|
-
listRecommendBodyMin: number;
|
|
82
|
-
}
|
|
83
|
-
declare const DEFAULT_READABILITY_THRESHOLDS: ReadabilityThresholds;
|
|
84
|
-
/** readability 4종 진입점 — 항목 순서 고정(문장→문단→밀도→목록). */
|
|
85
|
-
declare function runReadabilityChecks(bodyJson: TiptapNode | null | undefined, thresholds?: ReadabilityThresholds): SeoCheckResult[];
|
|
86
|
-
|
|
87
|
-
export { type BusinessProfileCompleteness, DEFAULT_READABILITY_THRESHOLDS, DEFAULT_SEO_THRESHOLDS, type ReadabilityThresholds, SEO_SCORE_WEIGHTS, type SeoCheckInput, type SeoCheckLevel, type SeoCheckResult, type SeoThresholds, type TiptapMark, type TiptapNode, checkBusinessProfile, collectNodes, computeSeoScore, countBodyChars, extractText, runReadabilityChecks, runSeoChecks, walkNodes };
|
package/dist/seo-checks.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DEFAULT_READABILITY_THRESHOLDS,
|
|
3
|
-
DEFAULT_SEO_THRESHOLDS,
|
|
4
|
-
SEO_SCORE_WEIGHTS,
|
|
5
|
-
checkBusinessProfile,
|
|
6
|
-
collectNodes,
|
|
7
|
-
computeSeoScore,
|
|
8
|
-
countBodyChars,
|
|
9
|
-
extractText,
|
|
10
|
-
runReadabilityChecks,
|
|
11
|
-
runSeoChecks,
|
|
12
|
-
walkNodes
|
|
13
|
-
} from "./chunk-6GQCFFHU.js";
|
|
14
|
-
export {
|
|
15
|
-
DEFAULT_READABILITY_THRESHOLDS,
|
|
16
|
-
DEFAULT_SEO_THRESHOLDS,
|
|
17
|
-
SEO_SCORE_WEIGHTS,
|
|
18
|
-
checkBusinessProfile,
|
|
19
|
-
collectNodes,
|
|
20
|
-
computeSeoScore,
|
|
21
|
-
countBodyChars,
|
|
22
|
-
extractText,
|
|
23
|
-
runReadabilityChecks,
|
|
24
|
-
runSeoChecks,
|
|
25
|
-
walkNodes
|
|
26
|
-
};
|
|
27
|
-
//# sourceMappingURL=seo-checks.js.map
|
package/dist/seo-checks.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|