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 / button / save.js
vk-blocks / src / blocks / button Last commit date
deprecated 2 weeks ago block.json 20 hours ago component.js 2 weeks ago edit.js 20 hours ago icon.svg 2 months ago index.js 2 weeks ago index.php 2 months ago save.js 2 weeks ago style.scss 2 weeks ago transforms.js 2 months ago
save.js
174 lines
1 import { VKBButton } from './component';
2 import { RichText, useBlockProps } from '@wordpress/block-editor';
3 import { isHexColor } from '@vkblocks/utils/is-hex-color';
4 import { toPresetSpacingVar } from '@vkblocks/utils/to-preset-spacing-var';
5
6 export default function save(props) {
7 const { attributes } = props;
8 const {
9 content,
10 subCaption,
11 buttonUrl,
12 buttonTarget,
13 relAttribute,
14 linkToPost,
15 buttonSize,
16 buttonType,
17 buttonEffect,
18 buttonColor,
19 buttonTextColorCustom,
20 buttonColorCustom,
21 buttonHoverBgColorCustom,
22 buttonHoverTextColorCustom,
23 buttonAlign,
24 buttonWidthMobile,
25 buttonWidthTablet,
26 buttonWidth,
27 outerGap,
28 fontAwesomeIconBefore,
29 fontAwesomeIconAfter,
30 iconSizeBefore,
31 iconSizeAfter,
32 inlineStyle,
33 borderRadius,
34 blockId,
35 fontSizeValue,
36 } = attributes;
37
38 const effectiveUrl = linkToPost ? '' : buttonUrl;
39
40 let containerClass = '';
41 // カスタムカラーの場合 またはアウターにギャップが指定されている場合 またはホバー色が指定されている場合
42 if (
43 (buttonColorCustom !== undefined && isHexColor(buttonColorCustom)) ||
44 (buttonTextColorCustom !== undefined &&
45 isHexColor(buttonTextColorCustom)) ||
46 outerGap ||
47 (buttonHoverBgColorCustom !== undefined &&
48 buttonHoverBgColorCustom !== '') ||
49 (buttonHoverTextColorCustom !== undefined &&
50 buttonHoverTextColorCustom !== '')
51 ) {
52 containerClass = `vk_button vk_button-color-custom vk_button-${blockId}`;
53 } else {
54 containerClass = `vk_button vk_button-color-custom`;
55 }
56
57 if (buttonWidthMobile || buttonWidthTablet || buttonWidth) {
58 // 横並びボタンで�
59 が指定されている
60 if (buttonWidthMobile) {
61 containerClass += ` vk_button-width-mobile-${buttonWidthMobile}`;
62 }
63 if (buttonWidthTablet) {
64 containerClass += ` vk_button-width-tablet-${buttonWidthTablet}`;
65 }
66 if (buttonWidth) {
67 containerClass += ` vk_button-width-${buttonWidth}`;
68 }
69 } else {
70 containerClass += ` vk_button-align-${buttonAlign}`;
71 }
72
73 // エフェクト
74 if (buttonEffect !== '') {
75 containerClass += ` is-style-${buttonEffect}`;
76 }
77
78 // コア spacing.padding は useBlockProps.save が wrapper (.vk_button) の
79 // インライン style に自動注�
80 �するが、ボタンの「�
81 側余白」というユーザー期�
82
83 // <a> 自体の padding なので、wrapper 側の padding 系プロパティを取り除き、
84 // 同じ値を <a> 側に転写する。
85 // プリセット値 (var:preset|spacing|XX) は toPresetSpacingVar で var() に変換する。
86 // useBlockProps.save will inject the core spacing.padding as inline style on the
87 // wrapper (.vk_button), but users expect the inner padding of the <a>. So we
88 // strip the padding properties from the wrapper style and forward them onto <a>.
89 const spacingPadding = attributes?.style?.spacing?.padding;
90 const hasSpacingPadding =
91 spacingPadding &&
92 (spacingPadding.top ||
93 spacingPadding.right ||
94 spacingPadding.bottom ||
95 spacingPadding.left);
96
97 const blockProps = useBlockProps.save({
98 className: containerClass,
99 });
100
101 if (hasSpacingPadding && blockProps.style) {
102 // 既存ユーザー(padding 未設定)の出力は完�
103 �不変にするため、
104 // 設定がある時だけ wrapper 側 padding を取り除く。
105 // Strip the wrapper padding only when the user actually set one,
106 // so that the existing output stays byte-identical for legacy blocks.
107 const {
108 paddingTop: _pt,
109 paddingRight: _pr,
110 paddingBottom: _pb,
111 paddingLeft: _pl,
112 ...restWrapperStyle
113 } = blockProps.style;
114 blockProps.style = restWrapperStyle;
115 }
116
117 // inlineStyleからborderRadius・コアpaddingを含む新しいスタイルオブジェクトを構築
118 const btnInlineStyle = { ...inlineStyle };
119 if (borderRadius) {
120 btnInlineStyle.borderRadius = borderRadius;
121 }
122 if (hasSpacingPadding) {
123 if (spacingPadding.top) {
124 btnInlineStyle.paddingTop = toPresetSpacingVar(spacingPadding.top);
125 }
126 if (spacingPadding.right) {
127 btnInlineStyle.paddingRight = toPresetSpacingVar(
128 spacingPadding.right
129 );
130 }
131 if (spacingPadding.bottom) {
132 btnInlineStyle.paddingBottom = toPresetSpacingVar(
133 spacingPadding.bottom
134 );
135 }
136 if (spacingPadding.left) {
137 btnInlineStyle.paddingLeft = toPresetSpacingVar(
138 spacingPadding.left
139 );
140 }
141 }
142
143 return (
144 <div {...blockProps}>
145 <VKBButton
146 lbTextColorCustom={buttonTextColorCustom}
147 lbColorCustom={buttonColorCustom}
148 lbColor={buttonColor}
149 lbType={buttonType}
150 lbAlign={buttonAlign}
151 lbSize={buttonSize}
152 lbUrl={effectiveUrl}
153 lbTarget={buttonTarget}
154 lbLinkToPost={linkToPost}
155 lbRelAttribute={relAttribute}
156 lbFontAwesomeIconBefore={fontAwesomeIconBefore}
157 lbFontAwesomeIconAfter={fontAwesomeIconAfter}
158 lbIconSizeBefore={iconSizeBefore}
159 lbIconSizeAfter={iconSizeAfter}
160 lbsubCaption={subCaption}
161 lbFontSizeValue={fontSizeValue}
162 inlineStyle={btnInlineStyle}
163 lbRichtext={
164 <RichText.Content
165 tagName={'span'}
166 className={'vk_button_link_txt'}
167 value={content}
168 />
169 }
170 />
171 </div>
172 );
173 }
174