@roottale/cms-core 0.60.0 → 0.61.1

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 CHANGED
@@ -1,5 +1,20 @@
1
1
  # @roottale/cms-core
2
2
 
3
+ ## 0.61.1
4
+
5
+ ### Patch Changes
6
+
7
+ - HTML 정화 후에도 이미지와 사진 설명의 좌우 자동 여백과 블록 배치를 유지해
8
+ 에디터의 이미지 정렬이 미리보기와 HTML 기반 사이트에서 동일하게 표시되도록 합니다.
9
+
10
+ ## 0.61.0
11
+
12
+ ### Minor Changes
13
+
14
+ - 공통 에디터의 글씨 크기·서식 초기화·줄간격·문단 간격·이미지 너비·정렬·사진 설명을
15
+ 저장하고 공개 글에 출력합니다. ROOT-ADMIN에서 선택한 내용을 사이트 공통 블록으로
16
+ 저장하고 독립 복사본으로 재사용할 수 있습니다.
17
+
3
18
  ## 0.60.0
4
19
 
5
20
  ## 0.59.0
package/dist/index.cjs CHANGED
@@ -31,6 +31,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
33
  BLOCK_NAME_PATTERN: () => BLOCK_NAME_PATTERN,
34
+ CMS_FONT_SIZES: () => CMS_FONT_SIZES,
35
+ CMS_IMAGE_WIDTHS: () => CMS_IMAGE_WIDTHS,
36
+ CMS_LINE_HEIGHTS: () => CMS_LINE_HEIGHTS,
37
+ CMS_PARAGRAPH_SPACINGS: () => CMS_PARAGRAPH_SPACINGS,
34
38
  DEFAULT_SITE_PATTERN_PRESENTATION: () => DEFAULT_SITE_PATTERN_PRESENTATION,
35
39
  EMPTY_SITE_PATTERN_PLACEMENTS: () => EMPTY_SITE_PATTERN_PLACEMENTS,
36
40
  FIELD_BINDING_SOURCE: () => FIELD_BINDING_SOURCE,
@@ -54,6 +58,12 @@ __export(src_exports, {
54
58
  blockSchema: () => blockSchema,
55
59
  boundFieldValue: () => boundFieldValue,
56
60
  chainResolvers: () => chainResolvers,
61
+ cmsFontSize: () => cmsFontSize,
62
+ cmsImageAlign: () => cmsImageAlign,
63
+ cmsImageStyle: () => cmsImageStyle,
64
+ cmsImageWidth: () => cmsImageWidth,
65
+ cmsLineHeight: () => cmsLineHeight,
66
+ cmsParagraphSpacing: () => cmsParagraphSpacing,
57
67
  createFieldBindingResolver: () => createFieldBindingResolver,
58
68
  emptyPatternSlots: () => emptyPatternSlots,
59
69
  ensureImportedHtmlDocumentRoots: () => ensureImportedHtmlDocumentRoots,
@@ -1437,6 +1447,16 @@ var SANITIZE_OPTIONS = {
1437
1447
  "*": [ROOTTALE_CLASS_RE]
1438
1448
  },
1439
1449
  allowedStyles: {
1450
+ img: {
1451
+ display: [/^block$/i],
1452
+ "margin-left": [CSS_LENGTH_RE, /^auto$/i],
1453
+ "margin-right": [CSS_LENGTH_RE, /^auto$/i]
1454
+ },
1455
+ figure: {
1456
+ display: [/^block$/i],
1457
+ "margin-left": [CSS_LENGTH_RE, /^auto$/i],
1458
+ "margin-right": [CSS_LENGTH_RE, /^auto$/i]
1459
+ },
1440
1460
  "*": {
1441
1461
  "aspect-ratio": [ASPECT_RATIO_RE],
1442
1462
  background: [HEX_COLOR_RE],
@@ -1664,9 +1684,50 @@ function sitePatternPresentationAttributes(presentation) {
1664
1684
  cssVariables
1665
1685
  };
1666
1686
  }
1687
+
1688
+ // src/editor-formatting.ts
1689
+ var CMS_FONT_SIZES = [14, 16, 18, 20, 24, 28, 32];
1690
+ var CMS_LINE_HEIGHTS = [1.2, 1.5, 1.8, 2, 2.4];
1691
+ var CMS_PARAGRAPH_SPACINGS = [0, 8, 16, 24, 32];
1692
+ var CMS_IMAGE_WIDTHS = [25, 50, 75, 100];
1693
+ function cmsFontSize(value) {
1694
+ if (typeof value !== "string") return null;
1695
+ return CMS_FONT_SIZES.some((size) => value === `${size}px`) ? value : null;
1696
+ }
1697
+ function cmsLineHeight(value) {
1698
+ if (typeof value !== "number" && typeof value !== "string") return null;
1699
+ return CMS_LINE_HEIGHTS.find((size) => String(size) === String(value)) ?? null;
1700
+ }
1701
+ function cmsParagraphSpacing(value) {
1702
+ if (typeof value !== "string") return null;
1703
+ return CMS_PARAGRAPH_SPACINGS.some((size) => value === `${size}px`) ? value : null;
1704
+ }
1705
+ function cmsImageWidth(value) {
1706
+ if (typeof value !== "string") return null;
1707
+ return CMS_IMAGE_WIDTHS.some((size) => value === `${size}%`) ? value : null;
1708
+ }
1709
+ function cmsImageAlign(value) {
1710
+ return value === "left" || value === "center" || value === "right" ? value : null;
1711
+ }
1712
+ function cmsImageStyle(attrs) {
1713
+ const width = cmsImageWidth(attrs.displayWidth);
1714
+ const align = cmsImageAlign(attrs.imageAlign);
1715
+ return {
1716
+ ...width ? { width, maxWidth: "100%", height: "auto" } : {},
1717
+ ...align ? {
1718
+ display: "block",
1719
+ marginLeft: align === "left" ? "0" : "auto",
1720
+ marginRight: align === "right" ? "0" : "auto"
1721
+ } : {}
1722
+ };
1723
+ }
1667
1724
  // Annotate the CommonJS export names for ESM import in node:
1668
1725
  0 && (module.exports = {
1669
1726
  BLOCK_NAME_PATTERN,
1727
+ CMS_FONT_SIZES,
1728
+ CMS_IMAGE_WIDTHS,
1729
+ CMS_LINE_HEIGHTS,
1730
+ CMS_PARAGRAPH_SPACINGS,
1670
1731
  DEFAULT_SITE_PATTERN_PRESENTATION,
1671
1732
  EMPTY_SITE_PATTERN_PLACEMENTS,
1672
1733
  FIELD_BINDING_SOURCE,
@@ -1690,6 +1751,12 @@ function sitePatternPresentationAttributes(presentation) {
1690
1751
  blockSchema,
1691
1752
  boundFieldValue,
1692
1753
  chainResolvers,
1754
+ cmsFontSize,
1755
+ cmsImageAlign,
1756
+ cmsImageStyle,
1757
+ cmsImageWidth,
1758
+ cmsLineHeight,
1759
+ cmsParagraphSpacing,
1693
1760
  createFieldBindingResolver,
1694
1761
  emptyPatternSlots,
1695
1762
  ensureImportedHtmlDocumentRoots,