PluginProbe ʕ •ᴥ•ʔ
VK Blocks / 1.123.0
VK Blocks v1.123.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 / extensions / common / content-width-half / index.js
vk-blocks / src / extensions / common / content-width-half Last commit date
index.js 2 months ago
index.js
170 lines
1 /**
2 * Content width half extension
3 */
4 import { useEffect } from 'react';
5 import { __ } from '@wordpress/i18n';
6 import { addFilter } from '@wordpress/hooks';
7 import { PanelBody, ToggleControl } from '@wordpress/components';
8 import { InspectorControls } from '@wordpress/block-editor';
9 import { useSelect } from '@wordpress/data';
10 import { createHigherOrderComponent } from '@wordpress/compose';
11 import classnames from 'classnames';
12
13 /**
14 * Internal dependencies
15 */
16 import { VkPanelIcon } from '@vkblocks/components/vk-icon';
17
18 const TARGET_BLOCKS = ['core/column'];
19 const HALF_CLASS = 'is-vk-content-width-half';
20
21 const addAttribute = (settings) => {
22 if (!TARGET_BLOCKS.includes(settings.name)) {
23 return settings;
24 }
25
26 return {
27 ...settings,
28 attributes: {
29 ...settings.attributes,
30 contentWidthHalf: {
31 type: 'boolean',
32 default: false,
33 },
34 },
35 };
36 };
37
38 addFilter(
39 'blocks.registerBlockType',
40 'vk-blocks/content-width-half/add-attribute',
41 addAttribute
42 );
43
44 const withContentWidthHalfControls = createHigherOrderComponent((BlockEdit) => {
45 return (props) => {
46 const { name, attributes, setAttributes, isSelected, clientId } = props;
47
48 if (!TARGET_BLOCKS.includes(name)) {
49 return <BlockEdit {...props} />;
50 }
51
52 const { className, contentWidthHalf } = attributes;
53 // PHP から渡された vk_blocks_params.has_theme_json(テーマに theme.json があるかどうか)を、安�
54 �に参�
55 �したうえで、結果を�
56 ず真偽値として変数 hasThemeJson に�
57 �れる
58 const hasThemeJson = !!window?.vk_blocks_params?.has_theme_json;
59 const isTwoColumnLayout = useSelect(
60 (select) => {
61 const { getBlockRootClientId, getBlock } =
62 select('core/block-editor');
63 const parentClientId = getBlockRootClientId(clientId);
64
65 if (!parentClientId) {
66 return false;
67 }
68
69 const parentBlock = getBlock(parentClientId);
70
71 if (!parentBlock || parentBlock.name !== 'core/columns') {
72 return false;
73 }
74
75 const columnBlocks =
76 parentBlock.innerBlocks?.filter(
77 (block) => block.name === 'core/column'
78 ) ?? [];
79
80 return columnBlocks.length === 2;
81 },
82 [clientId]
83 );
84
85 useEffect(() => {
86 const classList =
87 typeof className === 'string'
88 ? className.split(' ').filter((item) => item)
89 : [];
90 const hasHalfClass = classList.includes(HALF_CLASS);
91
92 if (hasHalfClass !== !!contentWidthHalf) {
93 setAttributes({ contentWidthHalf: hasHalfClass });
94 }
95 }, [className, contentWidthHalf, setAttributes]);
96
97 useEffect(() => {
98 const classList =
99 typeof className === 'string'
100 ? className.split(' ').filter((item) => item)
101 : [];
102 const hasHalfClass = classList.includes(HALF_CLASS);
103
104 if (!isTwoColumnLayout && (contentWidthHalf || hasHalfClass)) {
105 const updatedClassName =
106 classnames(
107 classList.filter((item) => item !== HALF_CLASS)
108 ) || undefined;
109
110 setAttributes({
111 className: updatedClassName,
112 contentWidthHalf: false,
113 });
114 }
115 }, [className, contentWidthHalf, isTwoColumnLayout, setAttributes]);
116
117 const toggleContentWidthHalf = (checked) => {
118 const baseClassList =
119 typeof className === 'string'
120 ? className.split(' ').filter((item) => item)
121 : [];
122 const trimmedClassList = baseClassList.filter(
123 (item) => item !== HALF_CLASS
124 );
125 const updatedClassName =
126 classnames(trimmedClassList, {
127 [HALF_CLASS]: checked,
128 }) || undefined;
129
130 setAttributes({
131 className: updatedClassName,
132 contentWidthHalf: checked,
133 });
134 };
135
136 const shouldShowPanel = isSelected && hasThemeJson && isTwoColumnLayout;
137
138 return (
139 <>
140 <BlockEdit {...props} />
141 {shouldShowPanel && (
142 <InspectorControls>
143 <PanelBody
144 title={__('Layout Extension', 'vk-blocks')}
145 icon={<VkPanelIcon isActive={!!contentWidthHalf} />}
146 initialOpen={false}
147 >
148 <ToggleControl
149 label={__('Half Content Width', 'vk-blocks')}
150 help={__(
151 'When the screen size is 782px or more, the maximum width of the inner block is half of the content width. Below 782px, the horizontal padding is removed.',
152 'vk-blocks'
153 )}
154 checked={!!contentWidthHalf}
155 onChange={toggleContentWidthHalf}
156 />
157 </PanelBody>
158 </InspectorControls>
159 )}
160 </>
161 );
162 };
163 }, 'withContentWidthHalfControls');
164
165 addFilter(
166 'editor.BlockEdit',
167 'vk-blocks/content-width-half/with-controls',
168 withContentWidthHalfControls
169 );
170