PluginProbe ʕ •ᴥ•ʔ
VK Blocks / 1.126.3
VK Blocks v1.126.3
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 / slider / index.js
vk-blocks / src / blocks / slider Last commit date
deprecated 2 weeks ago block.json 2 months ago edit-multiItem.js 2 months ago edit-slider.js 2 months ago edit.js 1 month ago icon.svg 3 months ago index.js 2 weeks ago index.php 3 months ago loop-min-slides.js 3 months ago pause-button.js 1 month ago save.js 2 weeks ago style.scss 3 months ago view.js 2 weeks ago
index.js
191 lines
1 /**
2 * Slider block type
3 *
4 */
5 import { ReactComponent as Icon } from './icon.svg';
6 import { createHigherOrderComponent } from '@wordpress/compose';
7 import { addFilter } from '@wordpress/hooks';
8
9 import deprecatedHooks from './deprecated/hooks';
10 import deprecated from './deprecated/save';
11 import edit from './edit';
12 import metadata from './block.json';
13 import save from './save';
14
15 const { name } = metadata;
16
17 export { metadata, name };
18
19 export const settings = {
20 icon: <Icon />,
21 edit,
22 save,
23 deprecated,
24 };
25
26 const generateHeightCss = (attributes, cssSelector = '') => {
27 const { blockId, mobile, tablet, pc, unit } = attributes;
28 let css = '';
29 if (unit !== undefined && unit !== null) {
30 if (mobile !== undefined && mobile !== null && !isNaN(mobile)) {
31 css += `@media (max-width: 575.98px) {
32 ${cssSelector}
33 .vk_slider_${blockId} .vk_slider_item{
34 height:${mobile}${unit}!important;
35 }
36 }`;
37 }
38 if (tablet !== undefined && tablet !== null && !isNaN(tablet)) {
39 css += `@media (min-width: 576px) and (max-width: 991.98px) {
40 ${cssSelector}
41 .vk_slider_${blockId} .vk_slider_item{
42 height:${tablet}${unit}!important;
43 }
44 }`;
45 }
46 if (pc !== undefined && pc !== null && !isNaN(pc)) {
47 css += `@media (min-width: 992px) {
48 ${cssSelector}
49 .vk_slider_${blockId} .vk_slider_item{
50 height:${pc}${unit}!important;
51 }
52 }`;
53 }
54 }
55
56 return css;
57 };
58
59 // ズーム用の CSS は generateHeightCss と違い cssSelector を取らない。ズームは
60 // `.vk_slider_${blockId}` を起点にした固定のセレクタで完結するため、呼び出し側から
61 // 起点を渡す余地が無い(渡しても使われない)。
62 // attributes に既定値を置かないのは、未指定で呼ばれた時に黙って空の CSS を返すより、
63 // その場で落ちて呼び出し側の誤りが分かるほうがよいため(generateHeightCss と同じ形)。
64 //The zoom CSS, unlike generateHeightCss, takes no cssSelector: it is always anchored on
65 //`.vk_slider_${blockId}`, so there is nothing for the caller to pass in.
66 //`attributes` has no default on purpose — being called without it should fail here rather
67 //than silently return empty CSS (same shape as generateHeightCss).
68 const generateZoomAnimationCss = (attributes) => {
69 const {
70 blockId,
71 zoomAnimation,
72 zoomInitialScale,
73 zoomFinalScale,
74 autoPlayDelay,
75 speed,
76 } = attributes;
77
78 let css = '';
79
80 if (zoomAnimation) {
81 // ズーム用のセレクターは ::before 専用にして、親要素への副作用を防ぐ
82 const zoomSelector = `.vk_slider_${blockId}`;
83
84 css += `
85 ${zoomSelector} .vk_slider_item {
86 position: relative;
87 overflow: hidden;
88 }
89
90 ${zoomSelector} .vk_slider_item::before {
91 content: "";
92 position: absolute;
93 top: 0;
94 left: 0;
95 width: 100%;
96 height: 100%;
97 background-size: cover;
98 background-position: center;
99 background-image: var(--vk-slider-item-bg-image, inherit);
100 will-change: transform;
101 transform: scale(${zoomInitialScale !== undefined ? zoomInitialScale : 1});
102 transition: transform ${(autoPlayDelay + speed + autoPlayDelay * 0.5) / 1000 || 6}s linear;
103 }
104
105 ${zoomSelector} .vk_slider_item.swiper-slide-active::before {
106 transform: scale(${zoomFinalScale !== undefined ? zoomFinalScale : 1.25});
107 }
108
109 ${zoomSelector} .vk_slider_item.swiper-slide-prev::before,
110 ${zoomSelector} .vk_slider_item.swiper-slide-next::before {
111 transform: scale(${zoomInitialScale !== undefined ? zoomInitialScale : 1});
112 }
113 `;
114 }
115
116 return css;
117 };
118
119 // Add column css for editor.
120 const vkbwithClientIdClassName = createHigherOrderComponent(
121 (BlockListBlock) => {
122 return (props) => {
123 if ('vk-blocks/slider' === props.name) {
124 const heightCss = generateHeightCss(props.attributes, '');
125 const zoomCss = generateZoomAnimationCss(props.attributes);
126 const cssTag = heightCss + zoomCss;
127 return (
128 <>
129 <BlockListBlock {...props} />
130 {(() => {
131 if (cssTag) {
132 return <style type="text/css">{cssTag}</style>;
133 }
134 })()}
135 </>
136 );
137 }
138 return <BlockListBlock {...props} />;
139 };
140 },
141 'vkbwithClientIdClassName'
142 );
143 addFilter(
144 'editor.BlockListBlock',
145 'vk-blocks/slider',
146 vkbwithClientIdClassName
147 );
148
149 /**
150 * Swiperの設定をフロント側に出力するフィルター。
151 * 0.49.8で、jSをfooterに出力するよう構造変更。CSSは継続して出力。
152 *
153 * @param {*} el
154 * @param {*} type
155 * @param {*} attributes
156 */
157 const addSwiperConfig = (el, type, attributes) => {
158 if ('vk-blocks/slider' === type.name) {
159 //現在実行されている deprecated�
160 save関数のindexを取得
161 const deprecatedFuncIndex = deprecated.findIndex(
162 (item) => item.save === type.save
163 );
164
165 // 最新版
166 if (-1 === deprecatedFuncIndex) {
167 const cssSelector = `.vk_slider_${attributes.blockId},`;
168 const heightCss = generateHeightCss(attributes, cssSelector);
169 const zoomCss = generateZoomAnimationCss(attributes);
170 const cssTag = heightCss + zoomCss;
171 return (
172 <>
173 {el}
174 {(() => {
175 if (cssTag) {
176 return <style type="text/css">{cssTag}</style>;
177 }
178 })()}
179 </>
180 );
181
182 //後方互換
183 }
184 const DeprecatedHook = deprecatedHooks[deprecatedFuncIndex];
185 return <DeprecatedHook el={el} attributes={attributes} />;
186 }
187 // Slider以外のブロック
188 return el;
189 };
190 addFilter('blocks.getSaveElement', 'vk-blocks/slider', addSwiperConfig, 11);
191