@roottale/cms-renderer-next 0.44.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 (46) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/{chunk-75LHSTKC.js → chunk-45KYMMDY.js} +68 -17
  3. package/dist/chunk-45KYMMDY.js.map +1 -0
  4. package/dist/{chunk-4LQPZDXZ.js → chunk-6MFHA555.js} +24 -6
  5. package/dist/chunk-6MFHA555.js.map +1 -0
  6. package/dist/chunk-FZK3EXYZ.js +103 -0
  7. package/dist/chunk-FZK3EXYZ.js.map +1 -0
  8. package/dist/{chunk-6PDZSFVZ.js → chunk-GUV5WHD5.js} +33 -2
  9. package/dist/chunk-GUV5WHD5.js.map +1 -0
  10. package/dist/chunk-LEHHSI6G.js +64 -0
  11. package/dist/chunk-LEHHSI6G.js.map +1 -0
  12. package/dist/chunk-OMXEU4LS.js +414 -0
  13. package/dist/chunk-OMXEU4LS.js.map +1 -0
  14. package/dist/chunk-YLSQAT6B.js +59 -0
  15. package/dist/chunk-YLSQAT6B.js.map +1 -0
  16. package/dist/{chunk-WWS43XCT.js → chunk-Z3ZSCPG4.js} +82 -20
  17. package/dist/chunk-Z3ZSCPG4.js.map +1 -0
  18. package/dist/concerns-client.d.ts +1 -1
  19. package/dist/contact-map-client.d.ts +27 -0
  20. package/dist/contact-map-client.js +8 -0
  21. package/dist/contact-map-client.js.map +1 -0
  22. package/dist/expertise-client.d.ts +7 -1
  23. package/dist/expertise-client.js +2 -1
  24. package/dist/hero-carousel-client.d.ts +18 -2
  25. package/dist/hero-carousel-client.js +2 -1
  26. package/dist/routes.js +1 -1
  27. package/dist/server.js +8 -5
  28. package/dist/{site-config-BHcVF993.d.ts → site-config-kqurIH-k.d.ts} +38 -0
  29. package/dist/spaces-client.d.ts +1 -1
  30. package/dist/team-expanding-stage-client.d.ts +35 -0
  31. package/dist/team-expanding-stage-client.js +8 -0
  32. package/dist/team-expanding-stage-client.js.map +1 -0
  33. package/dist/templates.css +457 -5
  34. package/dist/templates.d.ts +26 -3
  35. package/dist/templates.js +13 -6
  36. package/dist/templates.js.map +1 -1
  37. package/dist/ui-react-motion-client.d.ts +1 -0
  38. package/dist/ui-react-motion-client.js +3 -1
  39. package/dist/validate.js +1 -1
  40. package/package.json +4 -4
  41. package/dist/chunk-4LQPZDXZ.js.map +0 -1
  42. package/dist/chunk-6PDZSFVZ.js.map +0 -1
  43. package/dist/chunk-75LHSTKC.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-WWS43XCT.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
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
+
3
24
  ## 0.44.0
4
25
 
5
26
  ### Minor Changes
@@ -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-6PDZSFVZ.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 {
@@ -307,6 +314,29 @@ function RootTaleLeadForm(props) {
307
314
 
308
315
  // src/templates/sections.tsx
309
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 }),
@@ -1497,11 +1543,7 @@ function TemplateTeamExpandingStage(section) {
1497
1543
  children: /* @__PURE__ */ jsxs2("div", { className: "rt-tpl-container", children: [
1498
1544
  heading ? /* @__PURE__ */ jsx2("h2", { className: "rt-tpl-heading", children: heading }) : null,
1499
1545
  description ? /* @__PURE__ */ jsx2("p", { className: "rt-tpl-section-desc", children: description }) : null,
1500
- /* @__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: [
1501
- /* @__PURE__ */ jsx2("span", { className: "rt-tpl-team-expanding-index", "aria-hidden": "true", children: String(index + 1).padStart(2, "0") }),
1502
- /* @__PURE__ */ jsx2(TeamMemberPhoto, { member }),
1503
- /* @__PURE__ */ jsx2(TeamMemberBody, { member })
1504
- ] }) }, member.name)) })
1546
+ /* @__PURE__ */ jsx2(TeamExpandingStageClient, { members })
1505
1547
  ] })
1506
1548
  }
1507
1549
  );
@@ -1561,6 +1603,7 @@ function ContactMapBlock({
1561
1603
  const liveMap = Boolean(
1562
1604
  embedUrl && (isAllowedMapEmbedSrc(embedUrl) || isAllowedEmbedSrc(embedUrl))
1563
1605
  );
1606
+ const clickToLoad = liveMap && embedUrl && (map?.mapLoad ?? "lazy") === "click";
1564
1607
  return /* @__PURE__ */ jsxs2("div", { className: "rt-tpl-contact-map-block", "data-provider": map?.provider, children: [
1565
1608
  map?.facadeImageSrc && !liveMap ? /* @__PURE__ */ jsxs2("figure", { className: "rt-tpl-contact-map-facade", children: [
1566
1609
  /* @__PURE__ */ jsx2(
@@ -1573,7 +1616,15 @@ function ContactMapBlock({
1573
1616
  ),
1574
1617
  externalUrl ? /* @__PURE__ */ jsx2("figcaption", { children: /* @__PURE__ */ jsx2("a", { href: externalUrl, target: "_blank", rel: "noopener noreferrer", children: "\uC9C0\uB3C4 \uD06C\uAC8C \uBCF4\uAE30" }) }) : null
1575
1618
  ] }) : null,
1576
- 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
1577
1628
  ] });
1578
1629
  }
1579
1630
  function ContactActions({
@@ -3473,4 +3524,4 @@ export {
3473
3524
  RootTalePage,
3474
3525
  RenderTiptap
3475
3526
  };
3476
- //# sourceMappingURL=chunk-75LHSTKC.js.map
3527
+ //# sourceMappingURL=chunk-45KYMMDY.js.map