@roottale/cms-renderer-next 0.41.2 → 0.42.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.
Files changed (60) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/before-after-client.d.ts +15 -0
  3. package/dist/before-after-client.js +8 -0
  4. package/dist/before-after-client.js.map +1 -0
  5. package/dist/chunk-4LQPZDXZ.js +75 -0
  6. package/dist/chunk-4LQPZDXZ.js.map +1 -0
  7. package/dist/chunk-6GQCFFHU.js +540 -0
  8. package/dist/chunk-6GQCFFHU.js.map +1 -0
  9. package/dist/{chunk-YUT4BRJY.js → chunk-F3G6RVIR.js} +68 -15
  10. package/dist/chunk-F3G6RVIR.js.map +1 -0
  11. package/dist/chunk-H46JUIHZ.js +79 -0
  12. package/dist/chunk-H46JUIHZ.js.map +1 -0
  13. package/dist/chunk-K62RR4UQ.js +53 -0
  14. package/dist/chunk-K62RR4UQ.js.map +1 -0
  15. package/dist/chunk-NUUTTSGT.js +916 -0
  16. package/dist/chunk-NUUTTSGT.js.map +1 -0
  17. package/dist/chunk-RSNUZ4BF.js +3378 -0
  18. package/dist/chunk-RSNUZ4BF.js.map +1 -0
  19. package/dist/chunk-U5AKACPN.js +113 -0
  20. package/dist/chunk-U5AKACPN.js.map +1 -0
  21. package/dist/chunk-WWS43XCT.js +206 -0
  22. package/dist/chunk-WWS43XCT.js.map +1 -0
  23. package/dist/cms-public.css +164 -51
  24. package/dist/concerns-client.d.ts +12 -0
  25. package/dist/concerns-client.js +8 -0
  26. package/dist/concerns-client.js.map +1 -0
  27. package/dist/expertise-client.d.ts +10 -0
  28. package/dist/expertise-client.js +8 -0
  29. package/dist/expertise-client.js.map +1 -0
  30. package/dist/hero-carousel-client.d.ts +22 -1
  31. package/dist/hero-carousel-client.js +1 -1
  32. package/dist/routes.d.ts +51 -5
  33. package/dist/routes.js +109 -62
  34. package/dist/routes.js.map +1 -1
  35. package/dist/seo-checks.d.ts +87 -0
  36. package/dist/seo-checks.js +27 -0
  37. package/dist/seo-checks.js.map +1 -0
  38. package/dist/server.d.ts +51 -2
  39. package/dist/server.js +8 -3
  40. package/dist/site-config-DgYGGwu1.d.ts +3910 -0
  41. package/dist/spaces-client.d.ts +10 -0
  42. package/dist/spaces-client.js +8 -0
  43. package/dist/spaces-client.js.map +1 -0
  44. package/dist/templates.css +3200 -344
  45. package/dist/templates.d.ts +19 -1127
  46. package/dist/templates.js +70 -3
  47. package/dist/templates.js.map +1 -1
  48. package/dist/{theme-css-vars-BiyHBsJG.d.ts → theme-css-vars-CD3jcEkp.d.ts} +2 -2
  49. package/dist/ui-react-motion-client.d.ts +73 -0
  50. package/dist/ui-react-motion-client.js +14 -0
  51. package/dist/ui-react-motion-client.js.map +1 -0
  52. package/dist/validate.d.ts +15 -1
  53. package/dist/validate.js +399 -15
  54. package/dist/validate.js.map +1 -1
  55. package/package.json +15 -5
  56. package/dist/chunk-5R6APJZ2.js +0 -1688
  57. package/dist/chunk-5R6APJZ2.js.map +0 -1
  58. package/dist/chunk-QKZ4HRBB.js +0 -300
  59. package/dist/chunk-QKZ4HRBB.js.map +0 -1
  60. package/dist/chunk-YUT4BRJY.js.map +0 -1
@@ -1,1130 +1,14 @@
1
- import { z } from 'zod';
2
- export { R as RootTaleCssVars, t as themeToCssVars } from './theme-css-vars-BiyHBsJG.js';
1
+ import { C as ConcernsSection, E as ExpertiseSection, S as SpacesSection, B as BeforeAfterSection, a as ContactSection, b as CtaBannerSection, F as FaqSection, c as FooterSection, H as HeroSection, d as HoursSection, P as PricingSection, e as ProcessSection, R as RichTextSection, f as ServicesSection, T as TeamSection, g as TestimonialsSection, h as TrustSection, i as SiteConfig, j as SiteConfigInput } from './site-config-DgYGGwu1.js';
2
+ export { k as BUILTIN_SECTION_SCHEMAS, l as BUILTIN_SECTION_TYPES, m as BeforeAfterSectionSchema, n as BlogListSection, o as BlogListSectionSchema, p as ConcernsSectionSchema, q as ContactSectionSchema, r as CtaBannerSectionSchema, s as CustomSection, t as CustomSectionSchema, u as ExpertiseSectionSchema, v as FaqSectionSchema, w as FooterSectionSchema, x as HeroSectionSchema, y as HoursSectionSchema, L as LeadFormSection, z as LeadFormSectionSchema, N as NavItem, A as NavItemSchema, D as PricingSectionSchema, G as ProcessSectionSchema, I as RichTextSectionSchema, J as SECTION_VARIANTS, K as Section, M as SectionCta, O as SectionInput, Q as SectionSchema, U as ServicesSectionSchema, V as SiteConfigSchema, W as SpacesSectionSchema, X as TeamSectionSchema, Y as TestimonialsSectionSchema, Z as TrustSectionSchema, _ as defineSiteConfig, $ as parseSiteConfig } from './site-config-DgYGGwu1.js';
3
+ export { R as RootTaleCssVars, t as themeToCssVars } from './theme-css-vars-CD3jcEkp.js';
3
4
  import { ReactElement, CSSProperties, ReactNode } from 'react';
5
+ import 'zod';
4
6
  import '@roottale/cms-client/server';
7
+ import '@roottale/ui-react/theme';
5
8
 
6
- /**
7
- * `@roottale/cms-renderer-next/templates` — canonical `SiteConfig` 스키마.
8
- *
9
- * ADR-0040 P2 + P0.5 RFC §① (`roottale-docs/docs/services/external-site-blockification.md`).
10
- *
11
- * 설계 원칙 (codex consult #1 반영):
12
- * - **계약 = `section type + variant + renderer registry`.** tier 는 스키마 필드가
13
- * 아니라 문서/거버넌스용 성숙도 메타데이터.
14
- * - **100% serializable** — 함수/JSX 금지 (Astro parity + admin preview 동일 경로).
15
- * escape hatch 는 config 안 함수가 아니라 `customSections` registry
16
- * (`SiteRenderer` 에 빌드 시 type→컴포넌트 주입).
17
- * - CMS-bound 섹션(`blog-list`/`lead-form`)은 `RootTaleBlogList`/`RootTaleLeadForm`
18
- * 으로 위임 — templates 는 cms-renderer 코어를 단방향 의존 (RFC §②).
19
- *
20
- * RFC §① 대비 구현 정정:
21
- * - `site.url` 은 optional — 스타터/외부 사이트가 `SITE_URL` env 로 런타임 해석하는
22
- * 기존 패턴(P4 스타터)과 충돌하므로 config 강제 대신 env fallback 허용.
23
- * - 빌트인에 `rich-text` 추가 (P4 스타터 기 운영 섹션 — "동일 패턴" 군).
24
- * allow: SIZE_OK — canonical SectionSchema registry이며 W1-2 계약이 이 파일 수정을 요구한다.
25
- */
26
-
27
- declare const NavItemSchema: z.ZodObject<{
28
- label: z.ZodString;
29
- href: z.ZodString;
30
- children: z.ZodOptional<z.ZodArray<z.ZodObject<{
31
- label: z.ZodString;
32
- href: z.ZodString;
33
- }, "strip", z.ZodTypeAny, {
34
- href: string;
35
- label: string;
36
- }, {
37
- href: string;
38
- label: string;
39
- }>, "many">>;
40
- }, "strip", z.ZodTypeAny, {
41
- href: string;
42
- label: string;
43
- children?: {
44
- href: string;
45
- label: string;
46
- }[] | undefined;
47
- }, {
48
- href: string;
49
- label: string;
50
- children?: {
51
- href: string;
52
- label: string;
53
- }[] | undefined;
54
- }>;
55
- type NavItem = z.infer<typeof NavItemSchema>;
56
- declare const CtaSchema: z.ZodObject<{
57
- label: z.ZodString;
58
- href: z.ZodString;
59
- }, "strip", z.ZodTypeAny, {
60
- href: string;
61
- label: string;
62
- }, {
63
- href: string;
64
- label: string;
65
- }>;
66
- type SectionCta = z.infer<typeof CtaSchema>;
67
- declare const HeroSectionSchema: z.ZodEffects<z.ZodObject<{
68
- id: z.ZodOptional<z.ZodString>;
69
- theme: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
70
- } & {
71
- type: z.ZodLiteral<"hero">;
72
- variant: z.ZodDefault<z.ZodEnum<["split", "image", "minimal", "carousel"]>>;
73
- props: z.ZodObject<{
74
- eyebrow: z.ZodOptional<z.ZodString>;
75
- /** `\n` 으로 줄바꿈. */
76
- title: z.ZodString;
77
- description: z.ZodOptional<z.ZodString>;
78
- imageSrc: z.ZodOptional<z.ZodString>;
79
- imageAlt: z.ZodOptional<z.ZodString>;
80
- cta: z.ZodOptional<z.ZodObject<{
81
- label: z.ZodString;
82
- href: z.ZodString;
83
- }, "strip", z.ZodTypeAny, {
84
- href: string;
85
- label: string;
86
- }, {
87
- href: string;
88
- label: string;
89
- }>>;
90
- /** `carousel` 전용 — 고정 카피 아래 배경만 전환되는 슬라이드. 2-6개. */
91
- slides: z.ZodOptional<z.ZodArray<z.ZodObject<{
92
- image: z.ZodString;
93
- alt: z.ZodString;
94
- caption: z.ZodOptional<z.ZodString>;
95
- }, "strip", z.ZodTypeAny, {
96
- image: string;
97
- alt: string;
98
- caption?: string | undefined;
99
- }, {
100
- image: string;
101
- alt: string;
102
- caption?: string | undefined;
103
- }>, "many">>;
104
- /** `carousel` 전용 — 부제(슬라이드와 무관한 고정 카피). */
105
- subtitle: z.ZodOptional<z.ZodString>;
106
- /** `carousel` 전용. 기본 true — `useReducedMotion` 시 렌더러가 강제 off. */
107
- autoplay: z.ZodOptional<z.ZodBoolean>;
108
- /** `carousel` 전용, ms. 기본 6000. */
109
- intervalMs: z.ZodOptional<z.ZodNumber>;
110
- }, "strip", z.ZodTypeAny, {
111
- title: string;
112
- description?: string | undefined;
113
- eyebrow?: string | undefined;
114
- imageSrc?: string | undefined;
115
- imageAlt?: string | undefined;
116
- cta?: {
117
- href: string;
118
- label: string;
119
- } | undefined;
120
- slides?: {
121
- image: string;
122
- alt: string;
123
- caption?: string | undefined;
124
- }[] | undefined;
125
- subtitle?: string | undefined;
126
- autoplay?: boolean | undefined;
127
- intervalMs?: number | undefined;
128
- }, {
129
- title: string;
130
- description?: string | undefined;
131
- eyebrow?: string | undefined;
132
- imageSrc?: string | undefined;
133
- imageAlt?: string | undefined;
134
- cta?: {
135
- href: string;
136
- label: string;
137
- } | undefined;
138
- slides?: {
139
- image: string;
140
- alt: string;
141
- caption?: string | undefined;
142
- }[] | undefined;
143
- subtitle?: string | undefined;
144
- autoplay?: boolean | undefined;
145
- intervalMs?: number | undefined;
146
- }>;
147
- }, "strip", z.ZodTypeAny, {
148
- type: "hero";
149
- variant: "image" | "split" | "minimal" | "carousel";
150
- props: {
151
- title: string;
152
- description?: string | undefined;
153
- eyebrow?: string | undefined;
154
- imageSrc?: string | undefined;
155
- imageAlt?: string | undefined;
156
- cta?: {
157
- href: string;
158
- label: string;
159
- } | undefined;
160
- slides?: {
161
- image: string;
162
- alt: string;
163
- caption?: string | undefined;
164
- }[] | undefined;
165
- subtitle?: string | undefined;
166
- autoplay?: boolean | undefined;
167
- intervalMs?: number | undefined;
168
- };
169
- theme?: Record<string, string> | undefined;
170
- id?: string | undefined;
171
- }, {
172
- type: "hero";
173
- props: {
174
- title: string;
175
- description?: string | undefined;
176
- eyebrow?: string | undefined;
177
- imageSrc?: string | undefined;
178
- imageAlt?: string | undefined;
179
- cta?: {
180
- href: string;
181
- label: string;
182
- } | undefined;
183
- slides?: {
184
- image: string;
185
- alt: string;
186
- caption?: string | undefined;
187
- }[] | undefined;
188
- subtitle?: string | undefined;
189
- autoplay?: boolean | undefined;
190
- intervalMs?: number | undefined;
191
- };
192
- theme?: Record<string, string> | undefined;
193
- id?: string | undefined;
194
- variant?: "image" | "split" | "minimal" | "carousel" | undefined;
195
- }>, {
196
- type: "hero";
197
- variant: "image" | "split" | "minimal" | "carousel";
198
- props: {
199
- title: string;
200
- description?: string | undefined;
201
- eyebrow?: string | undefined;
202
- imageSrc?: string | undefined;
203
- imageAlt?: string | undefined;
204
- cta?: {
205
- href: string;
206
- label: string;
207
- } | undefined;
208
- slides?: {
209
- image: string;
210
- alt: string;
211
- caption?: string | undefined;
212
- }[] | undefined;
213
- subtitle?: string | undefined;
214
- autoplay?: boolean | undefined;
215
- intervalMs?: number | undefined;
216
- };
217
- theme?: Record<string, string> | undefined;
218
- id?: string | undefined;
219
- }, {
220
- type: "hero";
221
- props: {
222
- title: string;
223
- description?: string | undefined;
224
- eyebrow?: string | undefined;
225
- imageSrc?: string | undefined;
226
- imageAlt?: string | undefined;
227
- cta?: {
228
- href: string;
229
- label: string;
230
- } | undefined;
231
- slides?: {
232
- image: string;
233
- alt: string;
234
- caption?: string | undefined;
235
- }[] | undefined;
236
- subtitle?: string | undefined;
237
- autoplay?: boolean | undefined;
238
- intervalMs?: number | undefined;
239
- };
240
- theme?: Record<string, string> | undefined;
241
- id?: string | undefined;
242
- variant?: "image" | "split" | "minimal" | "carousel" | undefined;
243
- }>;
244
- declare const RichTextSectionSchema: z.ZodObject<{
245
- id: z.ZodOptional<z.ZodString>;
246
- variant: z.ZodOptional<z.ZodString>;
247
- theme: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
248
- } & {
249
- type: z.ZodLiteral<"rich-text">;
250
- props: z.ZodObject<{
251
- heading: z.ZodOptional<z.ZodString>;
252
- /** `\n\n` 으로 문단 분리. */
253
- body: z.ZodString;
254
- }, "strip", z.ZodTypeAny, {
255
- body: string;
256
- heading?: string | undefined;
257
- }, {
258
- body: string;
259
- heading?: string | undefined;
260
- }>;
261
- }, "strip", z.ZodTypeAny, {
262
- type: "rich-text";
263
- props: {
264
- body: string;
265
- heading?: string | undefined;
266
- };
267
- theme?: Record<string, string> | undefined;
268
- id?: string | undefined;
269
- variant?: string | undefined;
270
- }, {
271
- type: "rich-text";
272
- props: {
273
- body: string;
274
- heading?: string | undefined;
275
- };
276
- theme?: Record<string, string> | undefined;
277
- id?: string | undefined;
278
- variant?: string | undefined;
279
- }>;
280
- declare const ServicesSectionSchema: z.ZodObject<{
281
- id: z.ZodOptional<z.ZodString>;
282
- theme: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
283
- } & {
284
- type: z.ZodLiteral<"services">;
285
- variant: z.ZodDefault<z.ZodEnum<["grid", "list"]>>;
286
- props: z.ZodObject<{
287
- heading: z.ZodOptional<z.ZodString>;
288
- description: z.ZodOptional<z.ZodString>;
289
- items: z.ZodArray<z.ZodObject<{
290
- title: z.ZodString;
291
- description: z.ZodOptional<z.ZodString>;
292
- href: z.ZodOptional<z.ZodString>;
293
- }, "strip", z.ZodTypeAny, {
294
- title: string;
295
- href?: string | undefined;
296
- description?: string | undefined;
297
- }, {
298
- title: string;
299
- href?: string | undefined;
300
- description?: string | undefined;
301
- }>, "many">;
302
- }, "strip", z.ZodTypeAny, {
303
- items: {
304
- title: string;
305
- href?: string | undefined;
306
- description?: string | undefined;
307
- }[];
308
- heading?: string | undefined;
309
- description?: string | undefined;
310
- }, {
311
- items: {
312
- title: string;
313
- href?: string | undefined;
314
- description?: string | undefined;
315
- }[];
316
- heading?: string | undefined;
317
- description?: string | undefined;
318
- }>;
319
- }, "strip", z.ZodTypeAny, {
320
- type: "services";
321
- variant: "grid" | "list";
322
- props: {
323
- items: {
324
- title: string;
325
- href?: string | undefined;
326
- description?: string | undefined;
327
- }[];
328
- heading?: string | undefined;
329
- description?: string | undefined;
330
- };
331
- theme?: Record<string, string> | undefined;
332
- id?: string | undefined;
333
- }, {
334
- type: "services";
335
- props: {
336
- items: {
337
- title: string;
338
- href?: string | undefined;
339
- description?: string | undefined;
340
- }[];
341
- heading?: string | undefined;
342
- description?: string | undefined;
343
- };
344
- theme?: Record<string, string> | undefined;
345
- id?: string | undefined;
346
- variant?: "grid" | "list" | undefined;
347
- }>;
348
- declare const FaqSectionSchema: z.ZodObject<{
349
- id: z.ZodOptional<z.ZodString>;
350
- variant: z.ZodOptional<z.ZodString>;
351
- theme: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
352
- } & {
353
- type: z.ZodLiteral<"faq">;
354
- props: z.ZodObject<{
355
- heading: z.ZodOptional<z.ZodString>;
356
- items: z.ZodArray<z.ZodObject<{
357
- question: z.ZodString;
358
- answer: z.ZodString;
359
- }, "strip", z.ZodTypeAny, {
360
- question: string;
361
- answer: string;
362
- }, {
363
- question: string;
364
- answer: string;
365
- }>, "many">;
366
- /** FAQPage JSON-LD 주입 (기본 true — SEO 3 pillars). 페이지에 FAQ 섹션이 여럿이면 하나만 true 로. */
367
- jsonLd: z.ZodDefault<z.ZodBoolean>;
368
- }, "strip", z.ZodTypeAny, {
369
- items: {
370
- question: string;
371
- answer: string;
372
- }[];
373
- jsonLd: boolean;
374
- heading?: string | undefined;
375
- }, {
376
- items: {
377
- question: string;
378
- answer: string;
379
- }[];
380
- heading?: string | undefined;
381
- jsonLd?: boolean | undefined;
382
- }>;
383
- }, "strip", z.ZodTypeAny, {
384
- type: "faq";
385
- props: {
386
- items: {
387
- question: string;
388
- answer: string;
389
- }[];
390
- jsonLd: boolean;
391
- heading?: string | undefined;
392
- };
393
- theme?: Record<string, string> | undefined;
394
- id?: string | undefined;
395
- variant?: string | undefined;
396
- }, {
397
- type: "faq";
398
- props: {
399
- items: {
400
- question: string;
401
- answer: string;
402
- }[];
403
- heading?: string | undefined;
404
- jsonLd?: boolean | undefined;
405
- };
406
- theme?: Record<string, string> | undefined;
407
- id?: string | undefined;
408
- variant?: string | undefined;
409
- }>;
410
- declare const CtaBannerSectionSchema: z.ZodObject<{
411
- id: z.ZodOptional<z.ZodString>;
412
- variant: z.ZodOptional<z.ZodString>;
413
- theme: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
414
- } & {
415
- type: z.ZodLiteral<"cta-banner">;
416
- props: z.ZodObject<{
417
- title: z.ZodString;
418
- description: z.ZodOptional<z.ZodString>;
419
- cta: z.ZodOptional<z.ZodObject<{
420
- label: z.ZodString;
421
- href: z.ZodString;
422
- }, "strip", z.ZodTypeAny, {
423
- href: string;
424
- label: string;
425
- }, {
426
- href: string;
427
- label: string;
428
- }>>;
429
- }, "strip", z.ZodTypeAny, {
430
- title: string;
431
- description?: string | undefined;
432
- cta?: {
433
- href: string;
434
- label: string;
435
- } | undefined;
436
- }, {
437
- title: string;
438
- description?: string | undefined;
439
- cta?: {
440
- href: string;
441
- label: string;
442
- } | undefined;
443
- }>;
444
- }, "strip", z.ZodTypeAny, {
445
- type: "cta-banner";
446
- props: {
447
- title: string;
448
- description?: string | undefined;
449
- cta?: {
450
- href: string;
451
- label: string;
452
- } | undefined;
453
- };
454
- theme?: Record<string, string> | undefined;
455
- id?: string | undefined;
456
- variant?: string | undefined;
457
- }, {
458
- type: "cta-banner";
459
- props: {
460
- title: string;
461
- description?: string | undefined;
462
- cta?: {
463
- href: string;
464
- label: string;
465
- } | undefined;
466
- };
467
- theme?: Record<string, string> | undefined;
468
- id?: string | undefined;
469
- variant?: string | undefined;
470
- }>;
471
- /** → `RootTaleBlogList` 위임 (cms-bound). */
472
- declare const BlogListSectionSchema: z.ZodObject<{
473
- id: z.ZodOptional<z.ZodString>;
474
- variant: z.ZodOptional<z.ZodString>;
475
- theme: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
476
- } & {
477
- type: z.ZodLiteral<"blog-list">;
478
- props: z.ZodObject<{
479
- heading: z.ZodOptional<z.ZodString>;
480
- limit: z.ZodOptional<z.ZodNumber>;
481
- /** 포스트 링크 베이스. 기본 `/blog`. */
482
- blogBasePath: z.ZodOptional<z.ZodString>;
483
- emptyMessage: z.ZodOptional<z.ZodString>;
484
- }, "strip", z.ZodTypeAny, {
485
- limit?: number | undefined;
486
- emptyMessage?: string | undefined;
487
- heading?: string | undefined;
488
- blogBasePath?: string | undefined;
489
- }, {
490
- limit?: number | undefined;
491
- emptyMessage?: string | undefined;
492
- heading?: string | undefined;
493
- blogBasePath?: string | undefined;
494
- }>;
495
- }, "strip", z.ZodTypeAny, {
496
- type: "blog-list";
497
- props: {
498
- limit?: number | undefined;
499
- emptyMessage?: string | undefined;
500
- heading?: string | undefined;
501
- blogBasePath?: string | undefined;
502
- };
503
- theme?: Record<string, string> | undefined;
504
- id?: string | undefined;
505
- variant?: string | undefined;
506
- }, {
507
- type: "blog-list";
508
- props: {
509
- limit?: number | undefined;
510
- emptyMessage?: string | undefined;
511
- heading?: string | undefined;
512
- blogBasePath?: string | undefined;
513
- };
514
- theme?: Record<string, string> | undefined;
515
- id?: string | undefined;
516
- variant?: string | undefined;
517
- }>;
518
- /** → `RootTaleLeadForm` 위임 (cms-bound). */
519
- declare const LeadFormSectionSchema: z.ZodObject<{
520
- id: z.ZodOptional<z.ZodString>;
521
- variant: z.ZodOptional<z.ZodString>;
522
- theme: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
523
- } & {
524
- type: z.ZodLiteral<"lead-form">;
525
- props: z.ZodObject<{
526
- /** 사이트 자체 server 엔드포인트 (예: `/api/inquiry`). intake API 직접 지정 금지. */
527
- action: z.ZodString;
528
- vertical: z.ZodOptional<z.ZodEnum<["consulting", "medical", "tax", "legal"]>>;
529
- heading: z.ZodOptional<z.ZodString>;
530
- description: z.ZodOptional<z.ZodString>;
531
- submitLabel: z.ZodOptional<z.ZodString>;
532
- }, "strip", z.ZodTypeAny, {
533
- action: string;
534
- vertical?: "consulting" | "medical" | "tax" | "legal" | undefined;
535
- heading?: string | undefined;
536
- description?: string | undefined;
537
- submitLabel?: string | undefined;
538
- }, {
539
- action: string;
540
- vertical?: "consulting" | "medical" | "tax" | "legal" | undefined;
541
- heading?: string | undefined;
542
- description?: string | undefined;
543
- submitLabel?: string | undefined;
544
- }>;
545
- }, "strip", z.ZodTypeAny, {
546
- type: "lead-form";
547
- props: {
548
- action: string;
549
- vertical?: "consulting" | "medical" | "tax" | "legal" | undefined;
550
- heading?: string | undefined;
551
- description?: string | undefined;
552
- submitLabel?: string | undefined;
553
- };
554
- theme?: Record<string, string> | undefined;
555
- id?: string | undefined;
556
- variant?: string | undefined;
557
- }, {
558
- type: "lead-form";
559
- props: {
560
- action: string;
561
- vertical?: "consulting" | "medical" | "tax" | "legal" | undefined;
562
- heading?: string | undefined;
563
- description?: string | undefined;
564
- submitLabel?: string | undefined;
565
- };
566
- theme?: Record<string, string> | undefined;
567
- id?: string | undefined;
568
- variant?: string | undefined;
569
- }>;
570
- declare const TrustSectionSchema: z.ZodEffects<z.ZodObject<{
571
- id: z.ZodOptional<z.ZodString>;
572
- theme: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
573
- } & {
574
- type: z.ZodLiteral<"trust">;
575
- variant: z.ZodDefault<z.ZodEnum<["stat-band", "logo-cloud", "feature-grid"]>>;
576
- props: z.ZodObject<{
577
- heading: z.ZodOptional<z.ZodString>;
578
- metrics: z.ZodOptional<z.ZodArray<z.ZodObject<{
579
- value: z.ZodString;
580
- unit: z.ZodOptional<z.ZodString>;
581
- label: z.ZodString;
582
- source: z.ZodOptional<z.ZodString>;
583
- }, "strip", z.ZodTypeAny, {
584
- value: string;
585
- label: string;
586
- unit?: string | undefined;
587
- source?: string | undefined;
588
- }, {
589
- value: string;
590
- label: string;
591
- unit?: string | undefined;
592
- source?: string | undefined;
593
- }>, "many">>;
594
- credentials: z.ZodOptional<z.ZodArray<z.ZodObject<{
595
- name: z.ZodString;
596
- issuer: z.ZodOptional<z.ZodString>;
597
- kind: z.ZodOptional<z.ZodEnum<["license", "education", "association"]>>;
598
- image: z.ZodOptional<z.ZodString>;
599
- }, "strip", z.ZodTypeAny, {
600
- name: string;
601
- image?: string | undefined;
602
- issuer?: string | undefined;
603
- kind?: "license" | "education" | "association" | undefined;
604
- }, {
605
- name: string;
606
- image?: string | undefined;
607
- issuer?: string | undefined;
608
- kind?: "license" | "education" | "association" | undefined;
609
- }>, "many">>;
610
- logos: z.ZodOptional<z.ZodArray<z.ZodObject<{
611
- src: z.ZodString;
612
- alt: z.ZodString;
613
- href: z.ZodOptional<z.ZodString>;
614
- }, "strip", z.ZodTypeAny, {
615
- src: string;
616
- alt: string;
617
- href?: string | undefined;
618
- }, {
619
- src: string;
620
- alt: string;
621
- href?: string | undefined;
622
- }>, "many">>;
623
- disclaimer: z.ZodOptional<z.ZodString>;
624
- }, "strip", z.ZodTypeAny, {
625
- heading?: string | undefined;
626
- metrics?: {
627
- value: string;
628
- label: string;
629
- unit?: string | undefined;
630
- source?: string | undefined;
631
- }[] | undefined;
632
- credentials?: {
633
- name: string;
634
- image?: string | undefined;
635
- issuer?: string | undefined;
636
- kind?: "license" | "education" | "association" | undefined;
637
- }[] | undefined;
638
- logos?: {
639
- src: string;
640
- alt: string;
641
- href?: string | undefined;
642
- }[] | undefined;
643
- disclaimer?: string | undefined;
644
- }, {
645
- heading?: string | undefined;
646
- metrics?: {
647
- value: string;
648
- label: string;
649
- unit?: string | undefined;
650
- source?: string | undefined;
651
- }[] | undefined;
652
- credentials?: {
653
- name: string;
654
- image?: string | undefined;
655
- issuer?: string | undefined;
656
- kind?: "license" | "education" | "association" | undefined;
657
- }[] | undefined;
658
- logos?: {
659
- src: string;
660
- alt: string;
661
- href?: string | undefined;
662
- }[] | undefined;
663
- disclaimer?: string | undefined;
664
- }>;
665
- }, "strip", z.ZodTypeAny, {
666
- type: "trust";
667
- variant: "stat-band" | "logo-cloud" | "feature-grid";
668
- props: {
669
- heading?: string | undefined;
670
- metrics?: {
671
- value: string;
672
- label: string;
673
- unit?: string | undefined;
674
- source?: string | undefined;
675
- }[] | undefined;
676
- credentials?: {
677
- name: string;
678
- image?: string | undefined;
679
- issuer?: string | undefined;
680
- kind?: "license" | "education" | "association" | undefined;
681
- }[] | undefined;
682
- logos?: {
683
- src: string;
684
- alt: string;
685
- href?: string | undefined;
686
- }[] | undefined;
687
- disclaimer?: string | undefined;
688
- };
689
- theme?: Record<string, string> | undefined;
690
- id?: string | undefined;
691
- }, {
692
- type: "trust";
693
- props: {
694
- heading?: string | undefined;
695
- metrics?: {
696
- value: string;
697
- label: string;
698
- unit?: string | undefined;
699
- source?: string | undefined;
700
- }[] | undefined;
701
- credentials?: {
702
- name: string;
703
- image?: string | undefined;
704
- issuer?: string | undefined;
705
- kind?: "license" | "education" | "association" | undefined;
706
- }[] | undefined;
707
- logos?: {
708
- src: string;
709
- alt: string;
710
- href?: string | undefined;
711
- }[] | undefined;
712
- disclaimer?: string | undefined;
713
- };
714
- theme?: Record<string, string> | undefined;
715
- id?: string | undefined;
716
- variant?: "stat-band" | "logo-cloud" | "feature-grid" | undefined;
717
- }>, {
718
- type: "trust";
719
- variant: "stat-band" | "logo-cloud" | "feature-grid";
720
- props: {
721
- heading?: string | undefined;
722
- metrics?: {
723
- value: string;
724
- label: string;
725
- unit?: string | undefined;
726
- source?: string | undefined;
727
- }[] | undefined;
728
- credentials?: {
729
- name: string;
730
- image?: string | undefined;
731
- issuer?: string | undefined;
732
- kind?: "license" | "education" | "association" | undefined;
733
- }[] | undefined;
734
- logos?: {
735
- src: string;
736
- alt: string;
737
- href?: string | undefined;
738
- }[] | undefined;
739
- disclaimer?: string | undefined;
740
- };
741
- theme?: Record<string, string> | undefined;
742
- id?: string | undefined;
743
- }, {
744
- type: "trust";
745
- props: {
746
- heading?: string | undefined;
747
- metrics?: {
748
- value: string;
749
- label: string;
750
- unit?: string | undefined;
751
- source?: string | undefined;
752
- }[] | undefined;
753
- credentials?: {
754
- name: string;
755
- image?: string | undefined;
756
- issuer?: string | undefined;
757
- kind?: "license" | "education" | "association" | undefined;
758
- }[] | undefined;
759
- logos?: {
760
- src: string;
761
- alt: string;
762
- href?: string | undefined;
763
- }[] | undefined;
764
- disclaimer?: string | undefined;
765
- };
766
- theme?: Record<string, string> | undefined;
767
- id?: string | undefined;
768
- variant?: "stat-band" | "logo-cloud" | "feature-grid" | undefined;
769
- }>;
770
- declare const ContactSectionSchema: z.ZodObject<{
771
- id: z.ZodOptional<z.ZodString>;
772
- theme: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
773
- } & {
774
- type: z.ZodLiteral<"contact">;
775
- variant: z.ZodDefault<z.ZodEnum<["form-map-5050", "split"]>>;
776
- props: z.ZodObject<{
777
- heading: z.ZodOptional<z.ZodString>;
778
- form: z.ZodObject<{
779
- enabled: z.ZodBoolean;
780
- vertical: z.ZodOptional<z.ZodEnum<["medical", "tax", "legal", "consulting"]>>;
781
- }, "strip", z.ZodTypeAny, {
782
- enabled: boolean;
783
- vertical?: "consulting" | "medical" | "tax" | "legal" | undefined;
784
- }, {
785
- enabled: boolean;
786
- vertical?: "consulting" | "medical" | "tax" | "legal" | undefined;
787
- }>;
788
- phone: z.ZodOptional<z.ZodString>;
789
- address: z.ZodOptional<z.ZodString>;
790
- hours: z.ZodOptional<z.ZodArray<z.ZodObject<{
791
- day: z.ZodString;
792
- open: z.ZodString;
793
- close: z.ZodString;
794
- note: z.ZodOptional<z.ZodString>;
795
- }, "strip", z.ZodTypeAny, {
796
- open: string;
797
- day: string;
798
- close: string;
799
- note?: string | undefined;
800
- }, {
801
- open: string;
802
- day: string;
803
- close: string;
804
- note?: string | undefined;
805
- }>, "many">>;
806
- mapEmbedUrl: z.ZodOptional<z.ZodString>;
807
- }, "strip", z.ZodTypeAny, {
808
- form: {
809
- enabled: boolean;
810
- vertical?: "consulting" | "medical" | "tax" | "legal" | undefined;
811
- };
812
- heading?: string | undefined;
813
- phone?: string | undefined;
814
- address?: string | undefined;
815
- hours?: {
816
- open: string;
817
- day: string;
818
- close: string;
819
- note?: string | undefined;
820
- }[] | undefined;
821
- mapEmbedUrl?: string | undefined;
822
- }, {
823
- form: {
824
- enabled: boolean;
825
- vertical?: "consulting" | "medical" | "tax" | "legal" | undefined;
826
- };
827
- heading?: string | undefined;
828
- phone?: string | undefined;
829
- address?: string | undefined;
830
- hours?: {
831
- open: string;
832
- day: string;
833
- close: string;
834
- note?: string | undefined;
835
- }[] | undefined;
836
- mapEmbedUrl?: string | undefined;
837
- }>;
838
- }, "strip", z.ZodTypeAny, {
839
- type: "contact";
840
- variant: "split" | "form-map-5050";
841
- props: {
842
- form: {
843
- enabled: boolean;
844
- vertical?: "consulting" | "medical" | "tax" | "legal" | undefined;
845
- };
846
- heading?: string | undefined;
847
- phone?: string | undefined;
848
- address?: string | undefined;
849
- hours?: {
850
- open: string;
851
- day: string;
852
- close: string;
853
- note?: string | undefined;
854
- }[] | undefined;
855
- mapEmbedUrl?: string | undefined;
856
- };
857
- theme?: Record<string, string> | undefined;
858
- id?: string | undefined;
859
- }, {
860
- type: "contact";
861
- props: {
862
- form: {
863
- enabled: boolean;
864
- vertical?: "consulting" | "medical" | "tax" | "legal" | undefined;
865
- };
866
- heading?: string | undefined;
867
- phone?: string | undefined;
868
- address?: string | undefined;
869
- hours?: {
870
- open: string;
871
- day: string;
872
- close: string;
873
- note?: string | undefined;
874
- }[] | undefined;
875
- mapEmbedUrl?: string | undefined;
876
- };
877
- theme?: Record<string, string> | undefined;
878
- id?: string | undefined;
879
- variant?: "split" | "form-map-5050" | undefined;
880
- }>;
881
- /** customSections 용 fallback — `type` 자유, props 는 직렬화만 강제. */
882
- declare const CustomSectionSchema: z.ZodObject<{
883
- /** 안정적 anchor·dedup·preview 매핑용. 페이지 내 유일. */
884
- id: z.ZodOptional<z.ZodString>;
885
- /** 빌트인 또는 customSections registry 키. kebab-case. */
886
- type: z.ZodString;
887
- /** 같은 type 의 비주얼 변형. 빌트인 type 은 enum 으로 좁힘. */
888
- variant: z.ZodOptional<z.ZodString>;
889
- /** 섹션 스코프 토큰 override (`--rt-*` CSS 변수 → 값). */
890
- theme: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
891
- /** 섹션별 직렬화 props. */
892
- props: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodType<unknown, z.ZodTypeDef, unknown>>>;
893
- }, "strip", z.ZodTypeAny, {
894
- type: string;
895
- props: Record<string, unknown>;
896
- theme?: Record<string, string> | undefined;
897
- id?: string | undefined;
898
- variant?: string | undefined;
899
- }, {
900
- type: string;
901
- theme?: Record<string, string> | undefined;
902
- id?: string | undefined;
903
- variant?: string | undefined;
904
- props?: Record<string, unknown> | undefined;
905
- }>;
906
- declare const BUILTIN_SECTION_SCHEMAS: Record<string, z.ZodTypeAny>;
907
- /** 빌트인 type 목록 (renderer registry 와 1:1). */
908
- declare const BUILTIN_SECTION_TYPES: readonly string[];
909
- type HeroSection = z.output<typeof HeroSectionSchema>;
910
- type RichTextSection = z.output<typeof RichTextSectionSchema>;
911
- type ServicesSection = z.output<typeof ServicesSectionSchema>;
912
- type FaqSection = z.output<typeof FaqSectionSchema>;
913
- type CtaBannerSection = z.output<typeof CtaBannerSectionSchema>;
914
- type BlogListSection = z.output<typeof BlogListSectionSchema>;
915
- type LeadFormSection = z.output<typeof LeadFormSectionSchema>;
916
- type TrustSection = z.output<typeof TrustSectionSchema>;
917
- type ContactSection = z.output<typeof ContactSectionSchema>;
918
- type CustomSection = z.output<typeof CustomSectionSchema>;
919
- /** 파싱 결과 섹션 (defaults 적용 후). */
920
- type Section = HeroSection | RichTextSection | ServicesSection | FaqSection | CtaBannerSection | BlogListSection | LeadFormSection | TrustSection | ContactSection | CustomSection;
921
- /** config 작성용 섹션 (defaults 생략 가능). `site.config.ts` 에서 이 타입 사용. */
922
- type SectionInput = z.input<typeof HeroSectionSchema> | z.input<typeof RichTextSectionSchema> | z.input<typeof ServicesSectionSchema> | z.input<typeof FaqSectionSchema> | z.input<typeof CtaBannerSectionSchema> | z.input<typeof BlogListSectionSchema> | z.input<typeof LeadFormSectionSchema> | z.input<typeof TrustSectionSchema> | z.input<typeof ContactSectionSchema> | z.input<typeof CustomSectionSchema>;
923
- /**
924
- * 섹션 스키마 — 빌트인 type 이면 해당 스키마로 *강제* 검증 (union fallthrough 로
925
- * 빌트인 오타이핑이 CustomSection 으로 조용히 통과하는 것을 차단), 미지 type 은
926
- * CustomSection 으로 통과 (렌더러가 customSections registry 로 해석).
927
- */
928
- declare const SectionSchema: z.ZodType<Section, z.ZodTypeDef, SectionInput>;
929
- declare const SiteConfigSchema: z.ZodObject<{
930
- site: z.ZodObject<{
931
- /** canonical origin. 생략 시 소비측이 `SITE_URL` env 등으로 해석. */
932
- url: z.ZodOptional<z.ZodString>;
933
- title: z.ZodString;
934
- description: z.ZodOptional<z.ZodString>;
935
- locale: z.ZodDefault<z.ZodString>;
936
- og: z.ZodOptional<z.ZodObject<{
937
- image: z.ZodOptional<z.ZodString>;
938
- }, "strip", z.ZodTypeAny, {
939
- image?: string | undefined;
940
- }, {
941
- image?: string | undefined;
942
- }>>;
943
- }, "strip", z.ZodTypeAny, {
944
- title: string;
945
- locale: string;
946
- description?: string | undefined;
947
- url?: string | undefined;
948
- og?: {
949
- image?: string | undefined;
950
- } | undefined;
951
- }, {
952
- title: string;
953
- description?: string | undefined;
954
- url?: string | undefined;
955
- og?: {
956
- image?: string | undefined;
957
- } | undefined;
958
- locale?: string | undefined;
959
- }>;
960
- /**
961
- * 콘텐츠 스트림 분리 (ADR-0060). 비우면 단일 /blog(레거시 동작). 선언 순서 =
962
- * 라우팅 우선순위. `routes.ts` 팩토리에 `collections` 로 전달해 sitemap/feed/
963
- * 아카이브를 스트림별로 파생.
964
- */
965
- collections: z.ZodDefault<z.ZodArray<z.ZodObject<{
966
- /** 안정 식별자 (라우트/가드/파생 키). */
967
- key: z.ZodString;
968
- /** 작성자 카드·nav 라벨. */
969
- label: z.ZodString;
970
- /** 라우트 base path (예: "/notice" | "/blog"). 앞 슬래시 포함. */
971
- basePath: z.ZodString;
972
- /** 레이아웃 레지스트리 키 (board=게시판, grid=카드 그리드, …). 미지 키는 렌더러 fallback. */
973
- layout: z.ZodDefault<z.ZodString>;
974
- /** 이 스트림에 속하는 category slug 들. */
975
- categories: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
976
- /** RSS 피드 포함. */
977
- feed: z.ZodDefault<z.ZodBoolean>;
978
- /** `${basePath}/categories/{slug}` 아카이브 생성. */
979
- archives: z.ZodDefault<z.ZodBoolean>;
980
- /** 글별 동적 OG. */
981
- og: z.ZodDefault<z.ZodBoolean>;
982
- /** 작성 UX: 하위 카테고리 1개 필수(미선택 발행 차단). */
983
- requireSubcategory: z.ZodDefault<z.ZodBoolean>;
984
- /** 작성 UX: 상단고정 토글 노출. */
985
- pinning: z.ZodDefault<z.ZodBoolean>;
986
- /** nav/카드 아이콘 키 (선택). */
987
- icon: z.ZodOptional<z.ZodString>;
988
- }, "strip", z.ZodTypeAny, {
989
- layout: string;
990
- categories: string[];
991
- label: string;
992
- key: string;
993
- basePath: string;
994
- feed: boolean;
995
- archives: boolean;
996
- og: boolean;
997
- requireSubcategory: boolean;
998
- pinning: boolean;
999
- icon?: string | undefined;
1000
- }, {
1001
- label: string;
1002
- key: string;
1003
- basePath: string;
1004
- layout?: string | undefined;
1005
- icon?: string | undefined;
1006
- categories?: string[] | undefined;
1007
- feed?: boolean | undefined;
1008
- archives?: boolean | undefined;
1009
- og?: boolean | undefined;
1010
- requireSubcategory?: boolean | undefined;
1011
- pinning?: boolean | undefined;
1012
- }>, "many">>;
1013
- /** 사이트 전역 토큰 override (`--rt-*` CSS 변수 → 값). 비우면 admin /design SSoT. */
1014
- theme: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1015
- nav: z.ZodDefault<z.ZodArray<z.ZodObject<{
1016
- label: z.ZodString;
1017
- href: z.ZodString;
1018
- children: z.ZodOptional<z.ZodArray<z.ZodObject<{
1019
- label: z.ZodString;
1020
- href: z.ZodString;
1021
- }, "strip", z.ZodTypeAny, {
1022
- href: string;
1023
- label: string;
1024
- }, {
1025
- href: string;
1026
- label: string;
1027
- }>, "many">>;
1028
- }, "strip", z.ZodTypeAny, {
1029
- href: string;
1030
- label: string;
1031
- children?: {
1032
- href: string;
1033
- label: string;
1034
- }[] | undefined;
1035
- }, {
1036
- href: string;
1037
- label: string;
1038
- children?: {
1039
- href: string;
1040
- label: string;
1041
- }[] | undefined;
1042
- }>, "many">>;
1043
- /** path("/", "/services", …) → 섹션 배열. */
1044
- pages: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodType<Section, z.ZodTypeDef, SectionInput>, "many">>;
1045
- }, "strip", z.ZodTypeAny, {
1046
- collections: {
1047
- layout: string;
1048
- categories: string[];
1049
- label: string;
1050
- key: string;
1051
- basePath: string;
1052
- feed: boolean;
1053
- archives: boolean;
1054
- og: boolean;
1055
- requireSubcategory: boolean;
1056
- pinning: boolean;
1057
- icon?: string | undefined;
1058
- }[];
1059
- theme: Record<string, string>;
1060
- nav: {
1061
- href: string;
1062
- label: string;
1063
- children?: {
1064
- href: string;
1065
- label: string;
1066
- }[] | undefined;
1067
- }[];
1068
- site: {
1069
- title: string;
1070
- locale: string;
1071
- description?: string | undefined;
1072
- url?: string | undefined;
1073
- og?: {
1074
- image?: string | undefined;
1075
- } | undefined;
1076
- };
1077
- pages: Record<string, Section[]>;
1078
- }, {
1079
- site: {
1080
- title: string;
1081
- description?: string | undefined;
1082
- url?: string | undefined;
1083
- og?: {
1084
- image?: string | undefined;
1085
- } | undefined;
1086
- locale?: string | undefined;
1087
- };
1088
- pages: Record<string, SectionInput[]>;
1089
- collections?: {
1090
- label: string;
1091
- key: string;
1092
- basePath: string;
1093
- layout?: string | undefined;
1094
- icon?: string | undefined;
1095
- categories?: string[] | undefined;
1096
- feed?: boolean | undefined;
1097
- archives?: boolean | undefined;
1098
- og?: boolean | undefined;
1099
- requireSubcategory?: boolean | undefined;
1100
- pinning?: boolean | undefined;
1101
- }[] | undefined;
1102
- theme?: Record<string, string> | undefined;
1103
- nav?: {
1104
- href: string;
1105
- label: string;
1106
- children?: {
1107
- href: string;
1108
- label: string;
1109
- }[] | undefined;
1110
- }[] | undefined;
1111
- }>;
1112
- type SiteConfig = z.output<typeof SiteConfigSchema>;
1113
- /** config 작성용 (defaults 생략 가능). */
1114
- type SiteConfigInput = Omit<z.input<typeof SiteConfigSchema>, "pages"> & {
1115
- pages: Record<string, SectionInput[]>;
1116
- };
1117
- /** config 검증 + defaults 적용. 실패 시 ZodError throw (빌드 타임 fail-fast 용). */
1118
- declare function parseSiteConfig(input: unknown): SiteConfig;
1119
- /**
1120
- * `site.config.ts` 작성 헬퍼 — 타입 추론 + 즉시 검증.
1121
- *
1122
- * ```ts
1123
- * import { defineSiteConfig } from "@roottale/cms-renderer-next/templates";
1124
- * export default defineSiteConfig({ site: { title: "…" }, pages: { "/": [ … ] } });
1125
- * ```
1126
- */
1127
- declare function defineSiteConfig(input: SiteConfigInput): SiteConfig;
9
+ declare function TemplateExpertise(section: ExpertiseSection): ReactElement;
10
+ declare function TemplateSpaces(section: SpacesSection): ReactElement;
11
+ declare function TemplateConcerns(section: ConcernsSection): ReactElement;
1128
12
 
1129
13
  /**
1130
14
  * 빌트인 섹션 템플릿 — MUI-free, 0 JS RSC (ADR-0040 P2).
@@ -1145,14 +29,22 @@ declare function sectionThemeStyle(theme: Record<string, string> | undefined): C
1145
29
  declare function TemplateHero(section: HeroSection): ReactElement;
1146
30
  /** 빌트인 `rich-text`. 문단은 `\n\n` 분리. */
1147
31
  declare function TemplateRichText(section: RichTextSection): ReactElement;
1148
- /** 빌트인 `services`. variant: grid(기본) / list. */
32
+ /** 빌트인 `services`. variant: grid(기본) / list / index-rows / split-featured. */
1149
33
  declare function TemplateServices(section: ServicesSection): ReactElement;
34
+ declare function TemplateFooter(section: FooterSection): ReactElement;
1150
35
  /** 빌트인 `faq`. `<details>` 0 JS + FAQPage JSON-LD (기본 on). */
1151
36
  declare function TemplateFaq(section: FaqSection): ReactElement;
1152
- /** 빌트인 `cta-banner`. */
37
+ /** 빌트인 `cta-banner`. variant: default(기본) / photo-overlay. */
1153
38
  declare function TemplateCtaBanner(section: CtaBannerSection): ReactElement;
1154
39
  declare function TemplateTrust(section: TrustSection): ReactElement;
40
+ /** 빌트인 `testimonials`(C11). variant: editorial-quote(기본) / quote-rail. */
41
+ declare function TemplateTestimonials(section: TestimonialsSection): ReactElement;
42
+ declare function TemplateTeam(section: TeamSection): ReactElement;
1155
43
  declare function TemplateContact(section: ContactSection): ReactElement;
44
+ declare function TemplateHours(section: HoursSection): ReactElement;
45
+ declare function TemplatePricing(section: PricingSection): ReactElement;
46
+ declare function TemplateProcess(section: ProcessSection): ReactElement;
47
+ declare function TemplateBeforeAfter(section: BeforeAfterSection): ReactElement;
1156
48
 
1157
49
  /**
1158
50
  * `SiteRenderer` — `SiteConfig.pages[path]` 섹션 배열을 registry 로 렌더.
@@ -1211,4 +103,4 @@ interface SiteRendererProps {
1211
103
  */
1212
104
  declare function SiteRenderer(props: SiteRendererProps): ReactElement;
1213
105
 
1214
- export { BUILTIN_SECTION_SCHEMAS, BUILTIN_SECTION_TYPES, type BlogListSection, BlogListSectionSchema, type ContactSection, ContactSectionSchema, type CtaBannerSection, CtaBannerSectionSchema, type CustomSection, CustomSectionSchema, type FaqSection, FaqSectionSchema, type HeroSection, HeroSectionSchema, type LeadFormSection, LeadFormSectionSchema, type NavItem, NavItemSchema, type RichTextSection, RichTextSectionSchema, type Section, type SectionComponent, type SectionCta, type SectionInput, SectionSchema, type ServicesSection, ServicesSectionSchema, type SiteConfig, type SiteConfigInput, SiteConfigSchema, SiteRenderer, type SiteRendererProps, TemplateContact, TemplateCtaBanner, TemplateFaq, TemplateHero, TemplateRichText, TemplateServices, TemplateTrust, type TrustSection, TrustSectionSchema, defineSiteConfig, parseSiteConfig, sectionThemeStyle };
106
+ export { BeforeAfterSection, ConcernsSection, ContactSection, CtaBannerSection, ExpertiseSection, FaqSection, FooterSection, HeroSection, HoursSection, PricingSection, ProcessSection, RichTextSection, type SectionComponent, ServicesSection, SiteConfig, SiteConfigInput, SiteRenderer, type SiteRendererProps, SpacesSection, TeamSection, TemplateBeforeAfter, TemplateConcerns, TemplateContact, TemplateCtaBanner, TemplateExpertise, TemplateFaq, TemplateFooter, TemplateHero, TemplateHours, TemplatePricing, TemplateProcess, TemplateRichText, TemplateServices, TemplateSpaces, TemplateTeam, TemplateTestimonials, TemplateTrust, TestimonialsSection, TrustSection, sectionThemeStyle };