@roottale/cms-renderer-next 0.43.0 → 0.45.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 (48) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +4 -0
  3. package/dist/{chunk-FKDCPFYV.js → chunk-45KYMMDY.js} +156 -21
  4. package/dist/chunk-45KYMMDY.js.map +1 -0
  5. package/dist/{chunk-4LQPZDXZ.js → chunk-6MFHA555.js} +24 -6
  6. package/dist/chunk-6MFHA555.js.map +1 -0
  7. package/dist/chunk-FZK3EXYZ.js +103 -0
  8. package/dist/chunk-FZK3EXYZ.js.map +1 -0
  9. package/dist/{chunk-NUUTTSGT.js → chunk-GUV5WHD5.js} +37 -3
  10. package/dist/chunk-GUV5WHD5.js.map +1 -0
  11. package/dist/chunk-LEHHSI6G.js +64 -0
  12. package/dist/chunk-LEHHSI6G.js.map +1 -0
  13. package/dist/chunk-OMXEU4LS.js +414 -0
  14. package/dist/chunk-OMXEU4LS.js.map +1 -0
  15. package/dist/chunk-YLSQAT6B.js +59 -0
  16. package/dist/chunk-YLSQAT6B.js.map +1 -0
  17. package/dist/{chunk-WWS43XCT.js → chunk-Z3ZSCPG4.js} +82 -20
  18. package/dist/chunk-Z3ZSCPG4.js.map +1 -0
  19. package/dist/concerns-client.d.ts +1 -1
  20. package/dist/contact-map-client.d.ts +27 -0
  21. package/dist/contact-map-client.js +8 -0
  22. package/dist/contact-map-client.js.map +1 -0
  23. package/dist/expertise-client.d.ts +7 -1
  24. package/dist/expertise-client.js +2 -1
  25. package/dist/hero-carousel-client.d.ts +18 -2
  26. package/dist/hero-carousel-client.js +2 -1
  27. package/dist/routes.js +1 -1
  28. package/dist/server.d.ts +5 -0
  29. package/dist/server.js +8 -5
  30. package/dist/{site-config-DgYGGwu1.d.ts → site-config-kqurIH-k.d.ts} +42 -4
  31. package/dist/spaces-client.d.ts +1 -1
  32. package/dist/team-expanding-stage-client.d.ts +35 -0
  33. package/dist/team-expanding-stage-client.js +8 -0
  34. package/dist/team-expanding-stage-client.js.map +1 -0
  35. package/dist/templates.css +607 -5
  36. package/dist/templates.d.ts +30 -4
  37. package/dist/templates.js +13 -6
  38. package/dist/templates.js.map +1 -1
  39. package/dist/ui-react-motion-client.d.ts +1 -0
  40. package/dist/ui-react-motion-client.js +3 -1
  41. package/dist/validate.js +1 -1
  42. package/package.json +4 -4
  43. package/dist/chunk-4LQPZDXZ.js.map +0 -1
  44. package/dist/chunk-F3G6RVIR.js +0 -220
  45. package/dist/chunk-F3G6RVIR.js.map +0 -1
  46. package/dist/chunk-FKDCPFYV.js.map +0 -1
  47. package/dist/chunk-NUUTTSGT.js.map +0 -1
  48. package/dist/chunk-WWS43XCT.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # @roottale/cms-renderer-next
2
2
 
3
+ ## 0.45.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 21639a9: `kinetic/CountUpStat`(뷰포트 진입 시 목표값까지 rAF 카운트업, `prefers-reduced-motion` 즉시-표시)을 `./count-up-stat` 서브패스로 공개합니다(ADR-0086 P2 D3 — 구 룰 `docs/design/b2b-component-library.md` §2.2 "카운트업 모션 금지(정직성)"를 supersede). `cms-renderer-next` 의 trust 섹션(`stat-band`/`dashboard` variant)이 이 컴포넌트를 소비해 지표 숫자를 카운트업으로 렌더합니다 — 선행 숫자를 못 찾는 값(전화번호 등 자유 텍스트)은 기존 정적 렌더로 그대로 폴백합니다.
8
+ - 21639a9: hero `carousel` 배경 전환에 `transition: "slide" | "curtain"` prop을 추가합니다(clip-path 와이프 + 신 스윕, chambarun 이식 — ADR-0086 P2 D3). autoplay는 hover·focus-within·재생/일시정지 버튼·Page Visibility 4가지 사유로 정지합니다.
9
+
10
+ `team` `expanding-stage` variant를 실모션 client island(`TeamExpandingStageClient`)로 배선합니다 — hover/focus로 인물 패널이 확장되고, 접힌 상태에서도 자격·경력·CTA가 DOM에 그대로 남아 스크린리더가 읽을 수 있습니다.
11
+
12
+ contact 지도 블록에 `map.mapLoad: "lazy" | "click"`(기본 "lazy", additive)을 추가합니다 — `"click"`이면 실지도 iframe을 즉시 그리지 않고 정적 프리뷰(주소·지도 열기 버튼)만 먼저 렌더한 뒤 클릭 시에만 마운트합니다.
13
+
14
+ `expertise` `tab-stage`·hero carousel 탭 목록에 공용 `use-roving-tablist` 훅(WAI-ARIA APG tablist 키보드 계약 — Arrow/Home/End, 단일 tab stop)을 적용합니다.
15
+
16
+ - d9f671b: `SiteConfig`에 optional `schemaVersion` 필드와 `SITE_CONFIG_SCHEMA_VERSION` 상수·`resolveSiteConfigSchemaVersion` 헬퍼를 추가해 업종 템플릿 팩과 renderer 사이의 버전 계약을 표현합니다(ADR-0086 D2). 필드 미지정 시 버전 1로 해석해 기존 고객 `site.config.ts`는 그대로 동작합니다.
17
+
18
+ ### Patch Changes
19
+
20
+ - Updated dependencies [23aa6ae]
21
+ - @roottale/cms-client@0.45.0
22
+ - @roottale/cms-core@0.45.0
23
+
24
+ ## 0.44.0
25
+
26
+ ### Minor Changes
27
+
28
+ - 353d437: `RootTaleBlogPost`에 `showTitle` 옵션을 추가했습니다. 페이지가 글 제목을 직접
29
+ 출력할 때 `showTitle={false}`를 넘기면 CMS의 중복 `<h1>`만 생략하고 나머지
30
+ 헤더 정보와 본문은 그대로 렌더합니다.
31
+
3
32
  ## 0.43.0
4
33
 
5
34
  ### Minor Changes
package/README.md CHANGED
@@ -138,6 +138,10 @@ export default async function PostPage({
138
138
  }
139
139
  ```
140
140
 
141
+ `RootTaleBlogPost` renders the post title as `<h1>` by default. If the page
142
+ already renders that title, pass `showTitle={false}` to avoid a duplicate
143
+ heading. The excerpt, post metadata, and body remain visible.
144
+
141
145
  ## Lead form — `app/contact/page.tsx`
142
146
 
143
147
  ```tsx
@@ -1,9 +1,15 @@
1
1
  import {
2
2
  BeforeAfterSlider
3
3
  } from "./chunk-U5AKACPN.js";
4
+ import {
5
+ ContactMapClickToLoad
6
+ } from "./chunk-LEHHSI6G.js";
4
7
  import {
5
8
  ExpertiseTabStage
6
- } from "./chunk-4LQPZDXZ.js";
9
+ } from "./chunk-6MFHA555.js";
10
+ import {
11
+ TeamExpandingStageClient
12
+ } from "./chunk-FZK3EXYZ.js";
7
13
  import {
8
14
  SpacesStage
9
15
  } from "./chunk-K62RR4UQ.js";
@@ -12,10 +18,11 @@ import {
12
18
  } from "./chunk-H46JUIHZ.js";
13
19
  import {
14
20
  AnimateOnScroll,
21
+ CountUpStat,
15
22
  Marquee,
16
23
  StaggerGroup,
17
24
  StaggerItem
18
- } from "./chunk-WWS43XCT.js";
25
+ } from "./chunk-Z3ZSCPG4.js";
19
26
  import {
20
27
  collectCategories,
21
28
  collectCategoriesWithCounts,
@@ -25,10 +32,10 @@ import {
25
32
  } from "./chunk-FUA5H6JE.js";
26
33
  import {
27
34
  SectionSchema
28
- } from "./chunk-NUUTTSGT.js";
35
+ } from "./chunk-GUV5WHD5.js";
29
36
  import {
30
37
  HeroCarouselViewport
31
- } from "./chunk-F3G6RVIR.js";
38
+ } from "./chunk-OMXEU4LS.js";
32
39
 
33
40
  // src/server.tsx
34
41
  import {
@@ -306,7 +313,30 @@ function RootTaleLeadForm(props) {
306
313
  }
307
314
 
308
315
  // src/templates/sections.tsx
309
- import { isAllowedEmbedSrc } from "@roottale/cms-core";
316
+ import { isAllowedEmbedSrc, isAllowedMapEmbedSrc } from "@roottale/cms-core";
317
+
318
+ // src/templates/metric-value.ts
319
+ var LEADING_NUMBER_PATTERN = /^(\d[\d,]*)(\.(\d+))?/;
320
+ function parseMetricValue(raw) {
321
+ const match = LEADING_NUMBER_PATTERN.exec(raw);
322
+ if (!match) {
323
+ return null;
324
+ }
325
+ const [matched, integerPart, , fractionPart] = match;
326
+ const integerLiteral = (integerPart ?? "").replace(/,/g, "");
327
+ const numericLiteral = fractionPart ? `${integerLiteral}.${fractionPart}` : integerLiteral;
328
+ const value = Number(numericLiteral);
329
+ if (!Number.isFinite(value)) {
330
+ return null;
331
+ }
332
+ return {
333
+ value,
334
+ decimals: fractionPart?.length ?? 0,
335
+ suffix: raw.slice(matched.length)
336
+ };
337
+ }
338
+
339
+ // src/templates/sections.tsx
310
340
  import { Fragment as Fragment2, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
311
341
  function sectionThemeStyle(theme) {
312
342
  if (!theme) return void 0;
@@ -373,6 +403,7 @@ function TemplateHeroCarousel(section) {
373
403
  slides,
374
404
  autoplay,
375
405
  intervalMs,
406
+ transition,
376
407
  proofMetrics,
377
408
  scrim
378
409
  } = section.props;
@@ -392,7 +423,8 @@ function TemplateHeroCarousel(section) {
392
423
  slides: safeSlides,
393
424
  autoplay: autoplay ?? true,
394
425
  intervalMs: intervalMs ?? 6e3,
395
- scrim
426
+ scrim,
427
+ transition
396
428
  }
397
429
  ) : null,
398
430
  /* @__PURE__ */ jsxs2("div", { className: "rt-tpl-container rt-tpl-hero-carousel-overlay", children: [
@@ -1027,6 +1059,20 @@ function TemplateCtaBanner(section) {
1027
1059
  }
1028
1060
  );
1029
1061
  }
1062
+ function TrustMetricValue({ value }) {
1063
+ const parsed = parseMetricValue(value);
1064
+ if (!parsed) {
1065
+ return /* @__PURE__ */ jsx2(Fragment2, { children: value });
1066
+ }
1067
+ return /* @__PURE__ */ jsx2(
1068
+ CountUpStat,
1069
+ {
1070
+ value: parsed.value,
1071
+ decimals: parsed.decimals,
1072
+ suffix: parsed.suffix
1073
+ }
1074
+ );
1075
+ }
1030
1076
  function TrustCredentialIcon() {
1031
1077
  return /* @__PURE__ */ jsxs2(
1032
1078
  "svg",
@@ -1056,9 +1102,9 @@ function TemplateTrust(section) {
1056
1102
  children: /* @__PURE__ */ jsxs2("div", { className: "rt-tpl-container rt-tpl-trust-inner", children: [
1057
1103
  heading ? /* @__PURE__ */ jsx2("h2", { className: "rt-tpl-heading", children: heading }) : null,
1058
1104
  section.variant === "stat-band" ? (
1059
- // 수치 밴드 진입 시 fade-up(C8). 카운트업은 미채택 — 이 seed 의
1060
- // disclaimer 계약("과장된 카운트업 모션 미사용")과 tabular-nums 결정성
1061
- // 유지를 위해 즉시-표시. reduce·SSR 시 <div> 그대로(마크업 불변).
1105
+ // 수치 밴드 진입 시 fade-up(C8) + 지표 숫자 카운트업(ADR-0086 D3로
1106
+ // 채택(구 룰 supersede, 2026-07-17)). reduce·SSR 시 <div> 그대로
1107
+ // (마크업 불변) + CountUpStat 자체도 mount 전엔 최종값 정적 표시.
1062
1108
  /* @__PURE__ */ jsx2(AnimateOnScroll, { as: "div", variant: "fade-up", className: "rt-tpl-trust-stat-band", children: (metrics ?? []).map((metric) => /* @__PURE__ */ jsxs2(
1063
1109
  "div",
1064
1110
  {
@@ -1066,7 +1112,7 @@ function TemplateTrust(section) {
1066
1112
  "data-variant": "band-item",
1067
1113
  children: [
1068
1114
  /* @__PURE__ */ jsxs2("span", { className: "rt-stat__value", children: [
1069
- metric.value,
1115
+ /* @__PURE__ */ jsx2(TrustMetricValue, { value: metric.value }),
1070
1116
  metric.unit ? /* @__PURE__ */ jsx2("span", { className: "rt-stat__unit", children: metric.unit }) : null
1071
1117
  ] }),
1072
1118
  /* @__PURE__ */ jsx2("span", { className: "rt-stat__label", children: metric.label }),
@@ -1192,7 +1238,7 @@ function TemplateTrust(section) {
1192
1238
  }
1193
1239
  ) : null,
1194
1240
  /* @__PURE__ */ jsxs2("span", { className: "rt-stat__value", children: [
1195
- metric.value,
1241
+ /* @__PURE__ */ jsx2(TrustMetricValue, { value: metric.value }),
1196
1242
  metric.unit ? /* @__PURE__ */ jsx2("span", { className: "rt-stat__unit", children: metric.unit }) : null
1197
1243
  ] }),
1198
1244
  /* @__PURE__ */ jsx2("span", { className: "rt-stat__label", children: metric.label }),
@@ -1308,9 +1354,89 @@ function TemplateTestimonialsQuoteRail(section) {
1308
1354
  }
1309
1355
  );
1310
1356
  }
1357
+ function StarRating({ rating }) {
1358
+ const clamped = Math.min(5, Math.max(0, rating));
1359
+ const fill = `${(clamped / 5 * 100).toFixed(0)}%`;
1360
+ return /* @__PURE__ */ jsxs2(
1361
+ "span",
1362
+ {
1363
+ className: "rt-tpl-testimonials-stars",
1364
+ role: "img",
1365
+ "aria-label": `\uD3C9\uC810 5\uC810 \uB9CC\uC810\uC5D0 ${clamped.toFixed(1)}\uC810`,
1366
+ style: { "--rt-testimonials-star-fill": fill },
1367
+ children: [
1368
+ /* @__PURE__ */ jsx2("span", { "aria-hidden": "true", className: "rt-tpl-testimonials-stars-base", children: "\u2605\u2605\u2605\u2605\u2605" }),
1369
+ /* @__PURE__ */ jsx2("span", { "aria-hidden": "true", className: "rt-tpl-testimonials-stars-fill", children: "\u2605\u2605\u2605\u2605\u2605" })
1370
+ ]
1371
+ }
1372
+ );
1373
+ }
1374
+ function TemplateTestimonialsStarCompact(section) {
1375
+ const { heading, description, items, disclaimer } = section.props;
1376
+ const rated = items.filter(
1377
+ (item) => typeof item.rating === "number"
1378
+ );
1379
+ const average = rated.length > 0 ? rated.reduce((sum, item) => sum + item.rating, 0) / rated.length : void 0;
1380
+ return /* @__PURE__ */ jsx2(
1381
+ "section",
1382
+ {
1383
+ "data-roottale-tpl": "testimonials",
1384
+ "data-variant": "star-compact",
1385
+ id: section.id,
1386
+ className: "rt-tpl-section rt-tpl-testimonials",
1387
+ style: sectionThemeStyle(section.theme),
1388
+ children: /* @__PURE__ */ jsxs2("div", { className: "rt-tpl-container", children: [
1389
+ /* @__PURE__ */ jsx2("h2", { className: "rt-tpl-heading", children: heading }),
1390
+ description ? /* @__PURE__ */ jsx2("p", { className: "rt-tpl-section-desc", children: description }) : null,
1391
+ average !== void 0 ? /* @__PURE__ */ jsxs2("div", { className: "rt-tpl-testimonials-star-summary", children: [
1392
+ /* @__PURE__ */ jsx2("span", { className: "rt-tpl-testimonials-star-average", children: average.toFixed(1) }),
1393
+ /* @__PURE__ */ jsx2(StarRating, { rating: average }),
1394
+ /* @__PURE__ */ jsxs2("span", { className: "rt-tpl-testimonials-star-count", children: [
1395
+ "\uD6C4\uAE30 ",
1396
+ items.length,
1397
+ "\uAC74"
1398
+ ] })
1399
+ ] }) : null,
1400
+ /* @__PURE__ */ jsx2(StaggerGroup, { as: "ul", className: "rt-tpl-testimonials-star-list", children: items.map((item, i) => /* @__PURE__ */ jsx2(
1401
+ StaggerItem,
1402
+ {
1403
+ as: "li",
1404
+ className: "rt-tpl-testimonials-star-item",
1405
+ children: /* @__PURE__ */ jsxs2("blockquote", { className: "rt-tpl-testimonials-star-quote", children: [
1406
+ typeof item.rating === "number" ? /* @__PURE__ */ jsxs2("div", { className: "rt-tpl-testimonials-star-head", children: [
1407
+ /* @__PURE__ */ jsx2(StarRating, { rating: item.rating }),
1408
+ /* @__PURE__ */ jsx2("span", { className: "rt-tpl-testimonials-star-value", children: item.rating.toFixed(1) })
1409
+ ] }) : null,
1410
+ /* @__PURE__ */ jsx2("p", { className: "rt-tpl-testimonials-star-text", children: item.quote }),
1411
+ /* @__PURE__ */ jsxs2("footer", { className: "rt-tpl-testimonials-star-footer", children: [
1412
+ /* @__PURE__ */ jsx2("cite", { className: "rt-tpl-testimonials-star-author", children: item.author }),
1413
+ item.context ? /* @__PURE__ */ jsx2("span", { className: "rt-tpl-testimonials-star-context", children: item.context }) : null,
1414
+ /* @__PURE__ */ jsx2(StarCompactMeta, { item })
1415
+ ] }),
1416
+ item.reply ? /* @__PURE__ */ jsx2("p", { className: "rt-tpl-testimonials-reply", children: item.reply }) : null
1417
+ ] })
1418
+ },
1419
+ `${item.author}-${i}`
1420
+ )) }),
1421
+ disclaimer ? /* @__PURE__ */ jsx2("p", { className: "rt-tpl-testimonials-disclaimer", children: disclaimer }) : null
1422
+ ] })
1423
+ }
1424
+ );
1425
+ }
1426
+ function StarCompactMeta({
1427
+ item
1428
+ }) {
1429
+ const values = [item.source, item.visitedAt, item.item].filter(
1430
+ (value) => Boolean(value)
1431
+ );
1432
+ if (values.length === 0) return null;
1433
+ return /* @__PURE__ */ jsx2("span", { className: "rt-tpl-testimonials-star-meta", children: values.map((value) => /* @__PURE__ */ jsx2("span", { children: value }, value)) });
1434
+ }
1311
1435
  function TemplateTestimonials(section) {
1312
1436
  if (section.variant === "quote-rail")
1313
1437
  return TemplateTestimonialsQuoteRail(section);
1438
+ if (section.variant === "star-compact")
1439
+ return TemplateTestimonialsStarCompact(section);
1314
1440
  return TemplateTestimonialsEditorialQuote(section);
1315
1441
  }
1316
1442
  function memberInitials(name) {
@@ -1417,11 +1543,7 @@ function TemplateTeamExpandingStage(section) {
1417
1543
  children: /* @__PURE__ */ jsxs2("div", { className: "rt-tpl-container", children: [
1418
1544
  heading ? /* @__PURE__ */ jsx2("h2", { className: "rt-tpl-heading", children: heading }) : null,
1419
1545
  description ? /* @__PURE__ */ jsx2("p", { className: "rt-tpl-section-desc", children: description }) : null,
1420
- /* @__PURE__ */ jsx2("ul", { className: "rt-tpl-team-expanding-stage", children: members.map((member, index) => /* @__PURE__ */ jsx2("li", { className: "rt-tpl-team-expanding-item", children: /* @__PURE__ */ jsxs2("article", { className: "rt-tpl-team-card", children: [
1421
- /* @__PURE__ */ jsx2("span", { className: "rt-tpl-team-expanding-index", "aria-hidden": "true", children: String(index + 1).padStart(2, "0") }),
1422
- /* @__PURE__ */ jsx2(TeamMemberPhoto, { member }),
1423
- /* @__PURE__ */ jsx2(TeamMemberBody, { member })
1424
- ] }) }, member.name)) })
1546
+ /* @__PURE__ */ jsx2(TeamExpandingStageClient, { members })
1425
1547
  ] })
1426
1548
  }
1427
1549
  );
@@ -1458,7 +1580,7 @@ function telHref(phone) {
1458
1580
  return `tel:${phone.replace(/[^\d+]/g, "")}`;
1459
1581
  }
1460
1582
  function ContactMap({ url }) {
1461
- if (isAllowedEmbedSrc(url)) {
1583
+ if (isAllowedMapEmbedSrc(url) || isAllowedEmbedSrc(url)) {
1462
1584
  return /* @__PURE__ */ jsx2("div", { className: "rt-tpl-contact-map", children: /* @__PURE__ */ jsx2(
1463
1585
  "iframe",
1464
1586
  {
@@ -1478,8 +1600,12 @@ function ContactMapBlock({
1478
1600
  const embedUrl = map?.embedUrl ?? mapEmbedUrl;
1479
1601
  const externalUrl = map?.externalUrl ?? embedUrl;
1480
1602
  if (!embedUrl && !map?.facadeImageSrc && !externalUrl) return null;
1603
+ const liveMap = Boolean(
1604
+ embedUrl && (isAllowedMapEmbedSrc(embedUrl) || isAllowedEmbedSrc(embedUrl))
1605
+ );
1606
+ const clickToLoad = liveMap && embedUrl && (map?.mapLoad ?? "lazy") === "click";
1481
1607
  return /* @__PURE__ */ jsxs2("div", { className: "rt-tpl-contact-map-block", "data-provider": map?.provider, children: [
1482
- map?.facadeImageSrc ? /* @__PURE__ */ jsxs2("figure", { className: "rt-tpl-contact-map-facade", children: [
1608
+ map?.facadeImageSrc && !liveMap ? /* @__PURE__ */ jsxs2("figure", { className: "rt-tpl-contact-map-facade", children: [
1483
1609
  /* @__PURE__ */ jsx2(
1484
1610
  "img",
1485
1611
  {
@@ -1490,7 +1616,15 @@ function ContactMapBlock({
1490
1616
  ),
1491
1617
  externalUrl ? /* @__PURE__ */ jsx2("figcaption", { children: /* @__PURE__ */ jsx2("a", { href: externalUrl, target: "_blank", rel: "noopener noreferrer", children: "\uC9C0\uB3C4 \uD06C\uAC8C \uBCF4\uAE30" }) }) : null
1492
1618
  ] }) : null,
1493
- embedUrl ? /* @__PURE__ */ jsx2(ContactMap, { url: embedUrl }) : null
1619
+ clickToLoad ? /* @__PURE__ */ jsx2(
1620
+ ContactMapClickToLoad,
1621
+ {
1622
+ embedUrl,
1623
+ externalUrl,
1624
+ facadeImageSrc: map?.facadeImageSrc,
1625
+ facadeImageAlt: map?.facadeImageAlt
1626
+ }
1627
+ ) : embedUrl ? /* @__PURE__ */ jsx2(ContactMap, { url: embedUrl }) : null
1494
1628
  ] });
1495
1629
  }
1496
1630
  function ContactActions({
@@ -2769,6 +2903,7 @@ async function RootTaleBlogPost(props) {
2769
2903
  slugOrId,
2770
2904
  baseUrl,
2771
2905
  notFoundElement,
2906
+ showTitle = true,
2772
2907
  showTableOfContents,
2773
2908
  tableOfContentsTitle,
2774
2909
  relatedPostsCount = 0,
@@ -2833,7 +2968,7 @@ async function RootTaleBlogPost(props) {
2833
2968
  style: themeStyle ?? void 0,
2834
2969
  children: [
2835
2970
  /* @__PURE__ */ jsxs9("header", { className: "rt-cms-post-header", children: [
2836
- /* @__PURE__ */ jsx9("h1", { className: "rt-cms-title", children: post.title }),
2971
+ showTitle ? /* @__PURE__ */ jsx9("h1", { className: "rt-cms-title", children: post.title }) : null,
2837
2972
  post.excerpt ? /* @__PURE__ */ jsx9("p", { className: "rt-cms-excerpt", children: post.excerpt }) : null,
2838
2973
  publishedDate || showTopAuthor || views !== null ? /* @__PURE__ */ jsxs9("p", { className: "rt-cms-meta", children: [
2839
2974
  publishedDate ? /* @__PURE__ */ jsx9("span", { className: "rt-cms-meta-item", "data-rt-cms-meta": "date", children: publishedDate }) : null,
@@ -3389,4 +3524,4 @@ export {
3389
3524
  RootTalePage,
3390
3525
  RenderTiptap
3391
3526
  };
3392
- //# sourceMappingURL=chunk-FKDCPFYV.js.map
3527
+ //# sourceMappingURL=chunk-45KYMMDY.js.map