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