PluginProbe ʕ •ᴥ•ʔ
VK Blocks / trunk
VK Blocks vtrunk
1.123.0 1.122.0 1.121.0 1.120.0 1.119.2 1.119.1 1.119.0 1.118.7 1.82.0.0 1.82.0.1 1.83.0.0 1.83.0.1 1.84.0.0 1.84.0.1 1.85.0.2 1.85.0.3 1.85.1.0 1.85.1.1 1.86.0.0 1.86.0.1 1.86.1.0 1.87.0.0 1.87.0.1 1.88.0.1 1.88.0.2 1.89.0.0 1.9.2 1.90.0.0 1.90.0.1 1.90.1.1 1.91.0.0 1.91.1.1 1.92.0.0 1.92.0.1 1.92.1.0 1.92.1.1 1.93.0.0 trunk 1.93.0.1 0.1.1 1.93.1.0 0.10.3 1.93.1.1 0.11.0 1.94.0.0 0.12.6 1.94.0.1 0.15.1 1.94.1.0 0.16.2 1.94.2.1 0.17.6 1.94.2.2 0.2.2 1.95.0.3 0.22.4 1.95.0.4 0.26.7 1.96.2.0 0.3.2 1.96.2.1 0.31.0 1.97.0.1 0.35.5 1.97.0.2 0.37.5 1.99.0.0 0.38.8 1.99.0.1 0.39.4 0.4.7 0.41.0 0.42.0 0.44.13 0.45.2 0.46.1 0.47.0 0.48.0 0.49.8 0.5.2 0.50.3 0.51.0 0.52.2 0.53.2 0.54.0 0.55.0 0.56.2 0.56.3 0.57.6 0.58.10 0.59.0 0.6.0 0.60.1 0.61.2 0.7.1 0.8.2 1.0.16 1.10.0 1.100.0.0 1.100.0.1 1.102.0.0 1.102.0.1 1.103.0.0 1.104.0.0 1.104.0.1 1.105.1.0 1.105.1.1 1.106.0.0 1.106.0.1 1.107.0.0 1.107.0.1 1.107.0.2 1.108.0.0 1.108.0.1 1.109.0.0 1.109.0.1 1.11.4 1.110.0.0 1.110.0.1 1.111.0.0 1.111.0.1 1.111.0.2 1.112.0.0 1.112.0.1 1.113.0.0 1.113.0.1 1.114.0.0 1.114.0.1 1.114.2.0 1.114.2.1 1.115.0.0 1.115.0.1 1.115.1.0 1.115.1.1 1.115.2.0 1.115.2.1 1.116.0.0 1.116.0.1 1.116.1.0 1.116.1.1 1.116.2.0 1.117.0.0 1.117.0.1 1.117.1.0 1.118.2 1.118.5 1.12.0 1.13.2 1.14.1 1.15.1 1.16.11 1.17.0 1.18.6 1.19.0 1.19.1 1.2.3 1.20.7 1.21.0 1.22.4 1.23.0 1.24.5 1.25.1 1.26.2 1.27.7.2 1.28.0.1 1.29.2.0 1.3.9 1.30.0.1 1.31.0.1 1.32.0.2 1.33.2.1 1.36.1.5 1.37.0.0 1.39.2.1 1.4.6 1.40.0.1 1.40.1.0 1.40.1.1 1.41.0.0 1.41.0.1 1.41.2.2 1.41.2.3 1.43.0.0 1.43.0.1 1.43.0.2 1.44.0.0 1.44.0.1 1.45.0.0 1.45.0.1 1.46.0.0 1.46.0.1 1.47.0.0 1.47.0.1 1.47.1.0 1.48.0.0 1.48.0.1 1.48.0.2 1.48.1.0 1.48.1.1 1.5.0 1.50.0.0 1.50.0.1 1.51.0.0 1.51.0.1 1.52.0.0 1.52.0.1 1.53.0.0 1.53.0.1 1.54.0.0 1.54.0.1 1.55.0.0 1.55.0.1 1.56.0.0 1.56.0.1 1.57.0.0 1.57.0.2 1.57.0.3 1.57.0.4 1.57.0.5 1.57.1.0 1.57.1.1 1.57.1.2 1.58.0.0 1.58.0.1 1.59.0.0 1.59.0.1 1.6.0 1.60.0.0 1.60.0.1 1.63.0.0 1.63.0.1 1.64.0.0 1.64.0.1 1.64.1.0 1.64.1.2 1.67.0.0 1.67.0.1 1.68.0.0 1.68.0.1 1.69.0.0 1.69.0.1 1.69.1.1 1.69.1.2 1.7.1 1.70.0.0 1.70.0.1 1.71.0.0 1.71.0.1 1.72.0.0 1.72.1.0 1.72.1.1 1.73.0.0 1.73.0.1 1.74.0.0 1.74.0.1 1.75.0.0 1.75.1.0 1.75.1.1 1.76.0.0 1.76.0.1 1.76.1.0 1.76.1.1 1.76.2.0 1.76.2.1 1.77.0.0 1.77.0.1 1.78.0.0 1.78.0.1 1.79.0.0 1.79.0.1 1.79.0.2 1.79.0.3 1.79.1.0 1.79.1.1 1.8.2 1.80.1.0 1.80.1.1 1.80.1.2 1.81.0.1 1.81.0.2
vk-blocks / src / blocks / heading / save.js
vk-blocks / src / blocks / heading Last commit date
deprecated 2 months ago block.json 1 day ago edit.js 2 months ago heading-level-dropdown.js 2 months ago heading-level-icon.js 2 months ago icon.svg 2 months ago index.js 2 months ago index.php 2 months ago save.js 2 months ago style.scss 2 months ago transforms.js 2 months ago
save.js
218 lines
1 import { RichText, useBlockProps } from '@wordpress/block-editor';
2
3 import parse from 'html-react-parser';
4 import { isHexColor } from '@vkblocks/utils/is-hex-color';
5 import classnames from 'classnames';
6 import { sanitizeSlug } from '@vkblocks/utils/sanitizeSlug';
7 import { fixBrokenUnicode } from '@vkblocks/utils/fixBrokenUnicode';
8
9 const renderTitle = (level, contents, tStyle, headingStyle) => {
10 switch (level) {
11 case 1:
12 return (
13 <h1 style={tStyle} className={headingStyle}>
14 {contents}
15 </h1>
16 );
17 case 2:
18 return (
19 <h2 style={tStyle} className={headingStyle}>
20 {contents}
21 </h2>
22 );
23 case 3:
24 return (
25 <h3 style={tStyle} className={headingStyle}>
26 {contents}
27 </h3>
28 );
29 case 4:
30 return (
31 <h4 style={tStyle} className={headingStyle}>
32 {contents}
33 </h4>
34 );
35 case 5:
36 return (
37 <h5 style={tStyle} className={headingStyle}>
38 {contents}
39 </h5>
40 );
41 case 6:
42 return (
43 <h6 style={tStyle} className={headingStyle}>
44 {contents}
45 </h6>
46 );
47 }
48 };
49
50 export default function save(props) {
51 const { attributes } = props;
52 const {
53 level,
54 align,
55 title,
56 titleColor,
57 titleSize,
58 subText,
59 subTextFlag,
60 subTextColor,
61 subTextSize,
62 titleStyle,
63 titleMarginBottom,
64 outerMarginBottom,
65 fontAwesomeIconBefore,
66 fontAwesomeIconAfter,
67 fontAwesomeIconColor,
68 } = attributes;
69 const containerClass = `vk_heading vk_heading-style-${titleStyle}`;
70
71 const cStyle = {
72 marginBottom:
73 outerMarginBottom !== null && outerMarginBottom !== undefined
74 ? outerMarginBottom + `rem`
75 : undefined,
76 };
77
78 let headingColorClassName = '';
79 if (titleColor !== undefined) {
80 headingColorClassName += `has-text-color`;
81 if (!isHexColor(titleColor)) {
82 headingColorClassName += ` has-${sanitizeSlug(titleColor)}-color`;
83 }
84 }
85
86 const headingStyle = classnames('vk_heading_title', {
87 [`vk_heading_title-style-${titleStyle}`]: !!titleStyle,
88 [`${headingColorClassName}`]: !!headingColorClassName,
89 });
90
91 const tStyle = {
92 color:
93 titleColor !== null &&
94 titleColor !== undefined &&
95 isHexColor(titleColor)
96 ? titleColor
97 : undefined,
98 fontSize:
99 titleSize !== null && titleSize !== undefined
100 ? titleSize + 'rem'
101 : undefined,
102 marginBottom:
103 titleMarginBottom !== null && titleMarginBottom !== undefined
104 ? titleMarginBottom + 'rem'
105 : undefined,
106 textAlign: align !== null && align !== undefined ? align : undefined,
107 };
108
109 let subTextColorClassName = '';
110 if (subTextColor !== undefined) {
111 subTextColorClassName += `has-text-color`;
112 if (!isHexColor(subTextColor)) {
113 subTextColorClassName += ` has-${sanitizeSlug(subTextColor)}-color`;
114 }
115 }
116
117 const subTextClass = classnames('vk_heading_subtext', {
118 [`vk_heading_subtext-style-${titleStyle}`]: !!titleStyle,
119 [`${subTextColorClassName}`]: !!subTextColorClassName,
120 });
121
122 const subTextStyle = {
123 color:
124 subTextColor !== null &&
125 subTextColor !== undefined &&
126 isHexColor(subTextColor)
127 ? subTextColor
128 : undefined,
129 fontSize:
130 subTextSize !== null && subTextSize !== undefined
131 ? subTextSize + 'rem'
132 : undefined,
133 textAlign: align !== null && align !== undefined ? align : undefined,
134 };
135
136 let iconColorClassName = '';
137 if (fontAwesomeIconColor !== undefined) {
138 iconColorClassName += `has-text-color`;
139 if (!isHexColor(fontAwesomeIconColor)) {
140 iconColorClassName += ` has-${sanitizeSlug(fontAwesomeIconColor)}-color`;
141 }
142 }
143
144 const fontAwesomeIconStyle =
145 fontAwesomeIconColor && isHexColor(fontAwesomeIconColor)
146 ? `style="color:${fontAwesomeIconColor};"`
147 : '';
148
149 let iconBefore = fontAwesomeIconBefore
150 ? fixBrokenUnicode(fontAwesomeIconBefore)
151 : fontAwesomeIconBefore;
152 let iconAfter = fontAwesomeIconAfter
153 ? fixBrokenUnicode(fontAwesomeIconAfter)
154 : fontAwesomeIconAfter;
155 //add class
156 if (iconBefore && iconColorClassName) {
157 const faIconFragmentBefore = iconBefore.split('<i class="');
158 faIconFragmentBefore[0] =
159 faIconFragmentBefore[0] + `<i class="${iconColorClassName} `;
160 iconBefore = faIconFragmentBefore.join('');
161 }
162
163 if (iconAfter && iconColorClassName) {
164 const faIconFragmentAfter = iconAfter.split('<i class="');
165 faIconFragmentAfter[0] =
166 faIconFragmentAfter[0] + `<i class="${iconColorClassName} `;
167 iconAfter = faIconFragmentAfter.join('');
168 }
169
170 //add inline css
171 if (iconBefore && fontAwesomeIconStyle) {
172 const faIconFragmentBefore = iconBefore.split('<i');
173 faIconFragmentBefore[0] =
174 faIconFragmentBefore[0] + `<i ${fontAwesomeIconStyle} `;
175 iconBefore = faIconFragmentBefore.join('');
176 }
177
178 if (iconAfter && fontAwesomeIconStyle) {
179 const faIconFragmentAfter = iconAfter.split('<i');
180 faIconFragmentAfter[0] =
181 faIconFragmentAfter[0] + `<i ${fontAwesomeIconStyle} `;
182 iconAfter = faIconFragmentAfter.join('');
183 }
184
185 const titleContent = (
186 <>
187 {parse(iconBefore)}
188 <RichText.Content tagName={'span'} value={title} />
189 {parse(iconAfter)}
190 </>
191 );
192
193 let subtextContent;
194 if (subTextFlag === 'on') {
195 subtextContent = (
196 <RichText.Content
197 tagName={'p'}
198 value={subText}
199 style={subTextStyle}
200 className={subTextClass}
201 />
202 );
203 }
204
205 const blockProps = useBlockProps.save({
206 className: ``,
207 });
208
209 return (
210 <div {...blockProps}>
211 <div className={containerClass} style={cStyle}>
212 {renderTitle(level, titleContent, tStyle, headingStyle)}
213 {subtextContent}
214 </div>
215 </div>
216 );
217 }
218