@mytechtoday/augment-extensions 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/augment-extensions/domain-rules/wordpress/README.md +163 -0
- package/augment-extensions/domain-rules/wordpress/module.json +32 -0
- package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -0
- package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -0
- package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -0
- package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -0
- package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -0
- package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -0
- package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -0
- package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -0
- package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -0
- package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -0
- package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -0
- package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -0
- package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -0
- package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -0
- package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -0
- package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -0
- package/augment-extensions/examples/rest-api-plugin/README.md +98 -0
- package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -0
- package/augment-extensions/examples/rest-api-plugin/module.json +40 -0
- package/augment-extensions/examples/woocommerce-extension/README.md +98 -0
- package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -0
- package/augment-extensions/examples/woocommerce-extension/module.json +40 -0
- package/augment-extensions/workflows/wordpress-plugin/README.md +232 -0
- package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -0
- package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -0
- package/augment-extensions/workflows/wordpress-plugin/module.json +49 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -0
- package/cli/dist/cli.js +5 -1
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +41 -0
- package/cli/dist/commands/show.js.map +1 -1
- package/modules.md +52 -0
- package/package.json +1 -1
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
# Gutenberg Block Example
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This example demonstrates a complete custom Gutenberg block with block.json metadata, edit component, save function, block styles, PHP registration, and testing steps.
|
|
6
|
+
|
|
7
|
+
**Use Case**: Custom content blocks for WordPress editor
|
|
8
|
+
**Complexity**: Medium
|
|
9
|
+
**Prerequisites**: Node.js, npm, @wordpress/scripts
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Complete Example: "Call to Action Block"
|
|
14
|
+
|
|
15
|
+
A custom Gutenberg block for displaying call-to-action sections with title, description, button, and customizable colors.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Directory Structure
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
cta-block/
|
|
23
|
+
├── cta-block.php # Main plugin file
|
|
24
|
+
├── package.json # NPM dependencies
|
|
25
|
+
├── src/
|
|
26
|
+
│ ├── block.json # Block metadata
|
|
27
|
+
│ ├── index.js # Block registration
|
|
28
|
+
│ ├── edit.js # Edit component
|
|
29
|
+
│ ├── save.js # Save component
|
|
30
|
+
│ ├── editor.scss # Editor styles
|
|
31
|
+
│ └── style.scss # Frontend styles
|
|
32
|
+
└── build/ # Compiled files (generated)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 1. Main Plugin File
|
|
38
|
+
|
|
39
|
+
### File: `cta-block.php`
|
|
40
|
+
|
|
41
|
+
```php
|
|
42
|
+
<?php
|
|
43
|
+
/**
|
|
44
|
+
* Plugin Name: Call to Action Block
|
|
45
|
+
* Description: Custom Gutenberg block for call-to-action sections
|
|
46
|
+
* Version: 1.0.0
|
|
47
|
+
* Requires at least: 6.0
|
|
48
|
+
* Requires PHP: 7.4
|
|
49
|
+
* Author: Your Name
|
|
50
|
+
* License: GPL-2.0+
|
|
51
|
+
* Text Domain: cta-block
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
if (!defined('ABSPATH')) {
|
|
55
|
+
exit;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Register the block
|
|
60
|
+
*/
|
|
61
|
+
function cta_block_register() {
|
|
62
|
+
register_block_type(__DIR__ . '/build');
|
|
63
|
+
}
|
|
64
|
+
add_action('init', 'cta_block_register');
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 2. Block Metadata
|
|
70
|
+
|
|
71
|
+
### File: `src/block.json`
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"$schema": "https://schemas.wp.org/trunk/block.json",
|
|
76
|
+
"apiVersion": 3,
|
|
77
|
+
"name": "cta-block/call-to-action",
|
|
78
|
+
"version": "1.0.0",
|
|
79
|
+
"title": "Call to Action",
|
|
80
|
+
"category": "widgets",
|
|
81
|
+
"icon": "megaphone",
|
|
82
|
+
"description": "Display a call-to-action section with title, description, and button",
|
|
83
|
+
"keywords": ["cta", "call to action", "button"],
|
|
84
|
+
"textdomain": "cta-block",
|
|
85
|
+
"supports": {
|
|
86
|
+
"html": false,
|
|
87
|
+
"align": ["wide", "full"],
|
|
88
|
+
"color": {
|
|
89
|
+
"background": true,
|
|
90
|
+
"text": true
|
|
91
|
+
},
|
|
92
|
+
"spacing": {
|
|
93
|
+
"padding": true,
|
|
94
|
+
"margin": true
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"attributes": {
|
|
98
|
+
"title": {
|
|
99
|
+
"type": "string",
|
|
100
|
+
"source": "html",
|
|
101
|
+
"selector": ".cta-title"
|
|
102
|
+
},
|
|
103
|
+
"description": {
|
|
104
|
+
"type": "string",
|
|
105
|
+
"source": "html",
|
|
106
|
+
"selector": ".cta-description"
|
|
107
|
+
},
|
|
108
|
+
"buttonText": {
|
|
109
|
+
"type": "string",
|
|
110
|
+
"source": "html",
|
|
111
|
+
"selector": ".cta-button"
|
|
112
|
+
},
|
|
113
|
+
"buttonUrl": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"source": "attribute",
|
|
116
|
+
"selector": ".cta-button",
|
|
117
|
+
"attribute": "href"
|
|
118
|
+
},
|
|
119
|
+
"backgroundColor": {
|
|
120
|
+
"type": "string",
|
|
121
|
+
"default": "#0073aa"
|
|
122
|
+
},
|
|
123
|
+
"textColor": {
|
|
124
|
+
"type": "string",
|
|
125
|
+
"default": "#ffffff"
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
"editorScript": "file:./index.js",
|
|
129
|
+
"editorStyle": "file:./editor.css",
|
|
130
|
+
"style": "file:./style.css"
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 3. Block Registration
|
|
137
|
+
|
|
138
|
+
### File: `src/index.js`
|
|
139
|
+
|
|
140
|
+
```javascript
|
|
141
|
+
import { registerBlockType } from '@wordpress/blocks';
|
|
142
|
+
import Edit from './edit';
|
|
143
|
+
import save from './save';
|
|
144
|
+
import metadata from './block.json';
|
|
145
|
+
import './editor.scss';
|
|
146
|
+
import './style.scss';
|
|
147
|
+
|
|
148
|
+
registerBlockType(metadata.name, {
|
|
149
|
+
edit: Edit,
|
|
150
|
+
save,
|
|
151
|
+
});
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 4. Edit Component
|
|
157
|
+
|
|
158
|
+
### File: `src/edit.js`
|
|
159
|
+
|
|
160
|
+
```javascript
|
|
161
|
+
import { __ } from '@wordpress/i18n';
|
|
162
|
+
import { useBlockProps, RichText, InspectorControls, URLInput } from '@wordpress/block-editor';
|
|
163
|
+
import { PanelBody, ColorPicker } from '@wordpress/components';
|
|
164
|
+
|
|
165
|
+
export default function Edit({ attributes, setAttributes }) {
|
|
166
|
+
const { title, description, buttonText, buttonUrl, backgroundColor, textColor } = attributes;
|
|
167
|
+
|
|
168
|
+
const blockProps = useBlockProps({
|
|
169
|
+
style: {
|
|
170
|
+
backgroundColor,
|
|
171
|
+
color: textColor,
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
return (
|
|
176
|
+
<>
|
|
177
|
+
<InspectorControls>
|
|
178
|
+
<PanelBody title={__('Color Settings', 'cta-block')}>
|
|
179
|
+
<p>{__('Background Color', 'cta-block')}</p>
|
|
180
|
+
<ColorPicker
|
|
181
|
+
color={backgroundColor}
|
|
182
|
+
onChangeComplete={(value) => setAttributes({ backgroundColor: value.hex })}
|
|
183
|
+
/>
|
|
184
|
+
<p>{__('Text Color', 'cta-block')}</p>
|
|
185
|
+
<ColorPicker
|
|
186
|
+
color={textColor}
|
|
187
|
+
onChangeComplete={(value) => setAttributes({ textColor: value.hex })}
|
|
188
|
+
/>
|
|
189
|
+
</PanelBody>
|
|
190
|
+
</InspectorControls>
|
|
191
|
+
|
|
192
|
+
<div {...blockProps} className="cta-block">
|
|
193
|
+
<RichText
|
|
194
|
+
tagName="h2"
|
|
195
|
+
className="cta-title"
|
|
196
|
+
value={title}
|
|
197
|
+
onChange={(value) => setAttributes({ title: value })}
|
|
198
|
+
placeholder={__('Enter title...', 'cta-block')}
|
|
199
|
+
/>
|
|
200
|
+
<RichText
|
|
201
|
+
tagName="p"
|
|
202
|
+
className="cta-description"
|
|
203
|
+
value={description}
|
|
204
|
+
onChange={(value) => setAttributes({ description: value })}
|
|
205
|
+
placeholder={__('Enter description...', 'cta-block')}
|
|
206
|
+
/>
|
|
207
|
+
<div className="cta-button-wrapper">
|
|
208
|
+
<RichText
|
|
209
|
+
tagName="span"
|
|
210
|
+
className="cta-button"
|
|
211
|
+
value={buttonText}
|
|
212
|
+
onChange={(value) => setAttributes({ buttonText: value })}
|
|
213
|
+
placeholder={__('Button text...', 'cta-block')}
|
|
214
|
+
/>
|
|
215
|
+
<URLInput
|
|
216
|
+
value={buttonUrl}
|
|
217
|
+
onChange={(value) => setAttributes({ buttonUrl: value })}
|
|
218
|
+
/>
|
|
219
|
+
</div>
|
|
220
|
+
</div>
|
|
221
|
+
</>
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## 5. Save Function
|
|
229
|
+
|
|
230
|
+
### File: `src/save.js`
|
|
231
|
+
|
|
232
|
+
```javascript
|
|
233
|
+
import { useBlockProps, RichText } from '@wordpress/block-editor';
|
|
234
|
+
|
|
235
|
+
export default function save({ attributes }) {
|
|
236
|
+
const { title, description, buttonText, buttonUrl, backgroundColor, textColor } = attributes;
|
|
237
|
+
|
|
238
|
+
const blockProps = useBlockProps.save({
|
|
239
|
+
style: {
|
|
240
|
+
backgroundColor,
|
|
241
|
+
color: textColor,
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
return (
|
|
246
|
+
<div {...blockProps} className="cta-block">
|
|
247
|
+
<RichText.Content tagName="h2" className="cta-title" value={title} />
|
|
248
|
+
<RichText.Content tagName="p" className="cta-description" value={description} />
|
|
249
|
+
{buttonText && buttonUrl && (
|
|
250
|
+
<a href={buttonUrl} className="cta-button">
|
|
251
|
+
<RichText.Content tagName="span" value={buttonText} />
|
|
252
|
+
</a>
|
|
253
|
+
)}
|
|
254
|
+
</div>
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## 6. Styles
|
|
262
|
+
|
|
263
|
+
### File: `src/style.scss`
|
|
264
|
+
|
|
265
|
+
```scss
|
|
266
|
+
.cta-block {
|
|
267
|
+
padding: 2rem;
|
|
268
|
+
text-align: center;
|
|
269
|
+
border-radius: 8px;
|
|
270
|
+
|
|
271
|
+
.cta-title {
|
|
272
|
+
margin: 0 0 1rem;
|
|
273
|
+
font-size: 2rem;
|
|
274
|
+
font-weight: bold;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
.cta-description {
|
|
278
|
+
margin: 0 0 1.5rem;
|
|
279
|
+
font-size: 1.125rem;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.cta-button {
|
|
283
|
+
display: inline-block;
|
|
284
|
+
padding: 0.75rem 1.5rem;
|
|
285
|
+
background: rgba(255, 255, 255, 0.2);
|
|
286
|
+
border-radius: 4px;
|
|
287
|
+
text-decoration: none;
|
|
288
|
+
font-weight: 600;
|
|
289
|
+
transition: all 0.3s ease;
|
|
290
|
+
|
|
291
|
+
&:hover {
|
|
292
|
+
background: rgba(255, 255, 255, 0.3);
|
|
293
|
+
transform: translateY(-2px);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### File: `src/editor.scss`
|
|
300
|
+
|
|
301
|
+
```scss
|
|
302
|
+
.cta-block {
|
|
303
|
+
.cta-button-wrapper {
|
|
304
|
+
margin-top: 1rem;
|
|
305
|
+
|
|
306
|
+
.components-base-control {
|
|
307
|
+
margin-top: 0.5rem;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## 7. Package Configuration
|
|
316
|
+
|
|
317
|
+
### File: `package.json`
|
|
318
|
+
|
|
319
|
+
```json
|
|
320
|
+
{
|
|
321
|
+
"name": "cta-block",
|
|
322
|
+
"version": "1.0.0",
|
|
323
|
+
"description": "Call to Action Gutenberg Block",
|
|
324
|
+
"scripts": {
|
|
325
|
+
"build": "wp-scripts build",
|
|
326
|
+
"start": "wp-scripts start",
|
|
327
|
+
"lint:js": "wp-scripts lint-js",
|
|
328
|
+
"format": "wp-scripts format"
|
|
329
|
+
},
|
|
330
|
+
"devDependencies": {
|
|
331
|
+
"@wordpress/scripts": "^27.0.0"
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
## 8. Installation & Build
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
# Install dependencies
|
|
342
|
+
npm install
|
|
343
|
+
|
|
344
|
+
# Development mode (watch for changes)
|
|
345
|
+
npm start
|
|
346
|
+
|
|
347
|
+
# Production build
|
|
348
|
+
npm run build
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## 9. Testing Steps
|
|
354
|
+
|
|
355
|
+
### Manual Testing
|
|
356
|
+
|
|
357
|
+
1. **Activate Plugin**
|
|
358
|
+
- Upload plugin to `wp-content/plugins/`
|
|
359
|
+
- Activate in WordPress admin
|
|
360
|
+
|
|
361
|
+
2. **Add Block to Editor**
|
|
362
|
+
- Create/edit a post or page
|
|
363
|
+
- Click "+" to add block
|
|
364
|
+
- Search for "Call to Action"
|
|
365
|
+
- Add block to content
|
|
366
|
+
|
|
367
|
+
3. **Test Block Functionality**
|
|
368
|
+
- Enter title text
|
|
369
|
+
- Enter description text
|
|
370
|
+
- Enter button text
|
|
371
|
+
- Enter button URL
|
|
372
|
+
- Change background color in sidebar
|
|
373
|
+
- Change text color in sidebar
|
|
374
|
+
|
|
375
|
+
4. **Test Frontend Display**
|
|
376
|
+
- Save/publish post
|
|
377
|
+
- View on frontend
|
|
378
|
+
- Verify styles are applied
|
|
379
|
+
- Test button link works
|
|
380
|
+
- Test responsive design
|
|
381
|
+
|
|
382
|
+
5. **Test Block Validation**
|
|
383
|
+
- Save and reload editor
|
|
384
|
+
- Verify no validation errors
|
|
385
|
+
- Verify content persists correctly
|
|
386
|
+
|
|
387
|
+
### Automated Testing
|
|
388
|
+
|
|
389
|
+
```javascript
|
|
390
|
+
// tests/e2e/cta-block.test.js
|
|
391
|
+
describe('CTA Block', () => {
|
|
392
|
+
beforeEach(async () => {
|
|
393
|
+
await createNewPost();
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
it('should insert block', async () => {
|
|
397
|
+
await insertBlock('Call to Action');
|
|
398
|
+
expect(await page.$('.cta-block')).toBeTruthy();
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
it('should allow editing title', async () => {
|
|
402
|
+
await insertBlock('Call to Action');
|
|
403
|
+
await page.type('.cta-title', 'Test Title');
|
|
404
|
+
const title = await page.$eval('.cta-title', el => el.textContent);
|
|
405
|
+
expect(title).toBe('Test Title');
|
|
406
|
+
});
|
|
407
|
+
});
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
|
|
412
|
+
## Best Practices Demonstrated
|
|
413
|
+
|
|
414
|
+
✅ **block.json** - Modern block metadata format
|
|
415
|
+
✅ **@wordpress/scripts** - Official build tools
|
|
416
|
+
✅ **InspectorControls** - Settings sidebar
|
|
417
|
+
✅ **RichText** - Editable content
|
|
418
|
+
✅ **Color customization** - User-controlled colors
|
|
419
|
+
✅ **Proper sanitization** - Secure attribute handling
|
|
420
|
+
✅ **Internationalization** - Translation-ready strings
|
|
421
|
+
✅ **Responsive design** - Mobile-friendly styles
|
|
422
|
+
|