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 / icon / component.js
vk-blocks / src / blocks / icon Last commit date
deprecated 2 weeks ago block.json 1 month ago component.js 2 months ago edit.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 weeks ago
component.js
195 lines
1 import { __ } from '@wordpress/i18n';
2 import { Component } from '@wordpress/element';
3 import parse from 'html-react-parser';
4 import { isHexColor } from '@vkblocks/utils/is-hex-color';
5 import { sanitizeSlug } from '@vkblocks/utils/sanitizeSlug';
6 import { fixBrokenUnicode } from '@vkblocks/utils/fixBrokenUnicode';
7
8 export class VKBIcon extends Component {
9 render() {
10 let fontAwesomeIcon = this.props.lbFontAwesomeIcon;
11 if (fontAwesomeIcon) {
12 fontAwesomeIcon = fixBrokenUnicode(fontAwesomeIcon);
13 }
14 const iconSize = this.props.lbSize;
15 const iconSizeUnit = this.props.lbSizeUnit;
16 const iconMargin = this.props.lbMargin;
17 const iconMarginUnit = this.props.lbMarginUnit;
18 const iconRadius = this.props.lbRadius;
19 const iconAlign = this.props.lbAlign;
20 const iconType = this.props.lbType;
21 const iconColor = this.props.lbColor;
22 const iconFontColor = this.props.lbFontColor;
23 const iconUrl = this.props.lbUrl;
24 const iconTarget = this.props.lbTarget;
25 const relAttribute = this.props.lbRelAttribute;
26 const linkDescription = this.props.lbLinkDescription;
27 const linkToPost = this.props.lbLinkToPost;
28
29 // outer & align
30 let outerClass = 'vk_icon_frame';
31 if (iconAlign === 'center') {
32 outerClass += ' text-center';
33 } else if (iconAlign === 'right') {
34 outerClass += ' text-right';
35 }
36
37 // color style
38 let borderClass = 'vk_icon_border';
39 let borderStyle = {};
40
41 if (iconType === '0') {
42 // Solid color
43 if (
44 iconColor !== 'undefined' &&
45 iconColor !== null &&
46 iconColor !== undefined
47 ) {
48 // Solid color
49 borderClass += ` has-background`;
50
51 if (iconColor === 'inherit') {
52 // inherit color
53 borderStyle = {
54 backgroundColor: 'currentColor',
55 };
56 } else if (isHexColor(iconColor)) {
57 // custom color
58 borderStyle = {
59 backgroundColor: `${iconColor}`,
60 };
61 } else {
62 // palette color
63 borderClass += ` has-${sanitizeSlug(iconColor)}-background-color`;
64 }
65 }
66 } else {
67 if (
68 iconColor !== 'undefined' &&
69 iconColor !== null &&
70 iconColor !== undefined
71 ) {
72 borderClass += ` has-text-color`;
73
74 if (iconColor === 'inherit') {
75 // inherit color
76 borderStyle = {
77 color: 'currentColor',
78 };
79 } else if (isHexColor(iconColor)) {
80 // custom color
81 borderStyle = {
82 color: `${iconColor}`,
83 };
84 } else {
85 // palette color
86 borderClass += ` has-${sanitizeSlug(iconColor)}-color`;
87 }
88 }
89
90 if (iconType === '1') {
91 // Icon & Frame
92 outerClass += ' is-style-outline';
93 } else {
94 // icon only
95 outerClass += ' is-style-noline';
96 }
97 }
98
99 // margin
100 if (
101 !(
102 iconSize === 36 &&
103 iconSizeUnit === 'px' &&
104 iconMargin === 22 &&
105 iconMarginUnit === 'px'
106 )
107 ) {
108 borderStyle.width =
109 'calc(' +
110 (iconSize + iconSizeUnit) +
111 ' + ' +
112 (iconMargin * 2 + iconMarginUnit) +
113 ')';
114 borderStyle.height = borderStyle.width;
115 }
116
117 // border radius
118 if (iconRadius !== 50) {
119 borderStyle.borderRadius = iconRadius + `%`;
120 }
121
122 // icon font
123 let faIconTag = '';
124 if (fontAwesomeIcon) {
125 fontAwesomeIcon = fontAwesomeIcon.replace(/ fas/g, 'fas');
126
127 // font size
128 let fontStyle = ``;
129 let fontClass = ` vk_icon_font `;
130 if (!(iconSize === 36 && iconSizeUnit === 'px')) {
131 fontStyle = ` font-size:${iconSize}${iconSizeUnit};`;
132 }
133
134 // icon color
135 if (
136 iconFontColor !== 'undefined' &&
137 iconFontColor !== null &&
138 iconFontColor !== undefined
139 ) {
140 if (isHexColor(iconFontColor)) {
141 // custom color
142 fontStyle += ` color:${iconFontColor};`;
143 } else {
144 // palette color
145 fontClass += ` has-text-color has-${sanitizeSlug(iconFontColor)}-color `;
146 }
147 }
148
149 // add class and inline css (join with space to preserve fa-rotate-*, fa-flip-* etc.)
150 const faIconFragment = fontAwesomeIcon.split(' ');
151 faIconFragment[0] = faIconFragment[0] + ` style="${fontStyle};"`;
152 faIconFragment[1] = ' ' + faIconFragment[1] + fontClass;
153 faIconTag = faIconFragment.join(' ');
154 }
155
156 const blockContent = (
157 <>
158 <div className={borderClass} style={borderStyle}>
159 {parse(faIconTag)}
160 </div>
161 </>
162 );
163
164 let blockContentWrapper = '';
165 const hasLink = !!iconUrl || !!linkToPost;
166 if (hasLink) {
167 blockContentWrapper = (
168 /* eslint-disable-next-line jsx-a11y/anchor-is-valid -- linkToPost: href replaced server-side with permalink */
169 <a
170 href={linkToPost ? '#' : iconUrl}
171 className="vk_icon_link"
172 {...(linkToPost ? { 'data-vk-link-to-post': '1' } : {})}
173 {...(iconTarget ? { target: '_blank' } : {})}
174 {...(relAttribute ? { rel: relAttribute } : {})}
175 >
176 <span className="screen-reader-text">
177 {linkDescription
178 ? linkDescription
179 : __('Icon link', 'vk-blocks')}
180 </span>
181 {blockContent}
182 </a>
183 );
184 } else {
185 blockContentWrapper = blockContent;
186 }
187
188 return (
189 <>
190 <div className={outerClass}>{blockContentWrapper}</div>
191 </>
192 );
193 }
194 }
195