PluginProbe
Gutenberg / 24.1.0
Gutenberg v24.1.0
24.1.0 24.0.0 23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 All 404 releases
gutenberg / build / scripts / patterns / index.js

index.js in Gutenberg 24.1.0, at build/scripts/patterns/index.js

2,244 lines 89.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function() {
2 var wp;
3 (wp ||= {}).patterns = (() => {
4 var __create = Object.create;
5 var __defProp = Object.defineProperty;
6 var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7 var __getOwnPropNames = Object.getOwnPropertyNames;
8 var __getProtoOf = Object.getPrototypeOf;
9 var __hasOwnProp = Object.prototype.hasOwnProperty;
10 var __commonJS = (cb, mod) => function __require() {
11 return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
12 };
13 var __export = (target, all) => {
14 for (var name in all)
15 __defProp(target, name, { get: all[name], enumerable: true });
16 };
17 var __copyProps = (to, from, except, desc) => {
18 if (from && typeof from === "object" || typeof from === "function") {
19 for (let key of __getOwnPropNames(from))
20 if (!__hasOwnProp.call(to, key) && key !== except)
21 __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
22 }
23 return to;
24 };
25 var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
26 // If the importer is in node compatibility mode or this is not an ESM
27 // file that has been converted to a CommonJS file using a Babel-
28 // compatible transform (i.e. "__esModule" has not been set), then set
29 // "default" to the CommonJS "module.exports" for node compatibility.
30 isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
31 mod
32 ));
33 var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
35 // package-external:@wordpress/data
36 var require_data = __commonJS({
37 "package-external:@wordpress/data"(exports, module) {
38 module.exports = window.wp.data;
39 }
40 });
41
42 // package-external:@wordpress/blocks
43 var require_blocks = __commonJS({
44 "package-external:@wordpress/blocks"(exports, module) {
45 module.exports = window.wp.blocks;
46 }
47 });
48
49 // package-external:@wordpress/core-data
50 var require_core_data = __commonJS({
51 "package-external:@wordpress/core-data"(exports, module) {
52 module.exports = window.wp.coreData;
53 }
54 });
55
56 // package-external:@wordpress/block-editor
57 var require_block_editor = __commonJS({
58 "package-external:@wordpress/block-editor"(exports, module) {
59 module.exports = window.wp.blockEditor;
60 }
61 });
62
63 // package-external:@wordpress/private-apis
64 var require_private_apis = __commonJS({
65 "package-external:@wordpress/private-apis"(exports, module) {
66 module.exports = window.wp.privateApis;
67 }
68 });
69
70 // package-external:@wordpress/components
71 var require_components = __commonJS({
72 "package-external:@wordpress/components"(exports, module) {
73 module.exports = window.wp.components;
74 }
75 });
76
77 // package-external:@wordpress/element
78 var require_element = __commonJS({
79 "package-external:@wordpress/element"(exports, module) {
80 module.exports = window.wp.element;
81 }
82 });
83
84 // package-external:@wordpress/i18n
85 var require_i18n = __commonJS({
86 "package-external:@wordpress/i18n"(exports, module) {
87 module.exports = window.wp.i18n;
88 }
89 });
90
91 // vendor-external:react/jsx-runtime
92 var require_jsx_runtime = __commonJS({
93 "vendor-external:react/jsx-runtime"(exports, module) {
94 module.exports = window.ReactJSXRuntime;
95 }
96 });
97
98 // vendor-external:react
99 var require_react = __commonJS({
100 "vendor-external:react"(exports, module) {
101 module.exports = window.React;
102 }
103 });
104
105 // package-external:@wordpress/compose
106 var require_compose = __commonJS({
107 "package-external:@wordpress/compose"(exports, module) {
108 module.exports = window.wp.compose;
109 }
110 });
111
112 // package-external:@wordpress/primitives
113 var require_primitives = __commonJS({
114 "package-external:@wordpress/primitives"(exports, module) {
115 module.exports = window.wp.primitives;
116 }
117 });
118
119 // package-external:@wordpress/a11y
120 var require_a11y = __commonJS({
121 "package-external:@wordpress/a11y"(exports, module) {
122 module.exports = window.wp.a11y;
123 }
124 });
125
126 // package-external:@wordpress/notices
127 var require_notices = __commonJS({
128 "package-external:@wordpress/notices"(exports, module) {
129 module.exports = window.wp.notices;
130 }
131 });
132
133 // package-external:@wordpress/html-entities
134 var require_html_entities = __commonJS({
135 "package-external:@wordpress/html-entities"(exports, module) {
136 module.exports = window.wp.htmlEntities;
137 }
138 });
139
140 // package-external:@wordpress/url
141 var require_url = __commonJS({
142 "package-external:@wordpress/url"(exports, module) {
143 module.exports = window.wp.url;
144 }
145 });
146
147 // packages/patterns/build-module/index.mjs
148 var index_exports = {};
149 __export(index_exports, {
150 privateApis: () => privateApis,
151 store: () => store
152 });
153
154 // packages/patterns/build-module/store/index.mjs
155 var import_data2 = __toESM(require_data(), 1);
156
157 // packages/patterns/build-module/store/reducer.mjs
158 var import_data = __toESM(require_data(), 1);
159 function isEditingPattern(state = {}, action) {
160 if (action?.type === "SET_EDITING_PATTERN") {
161 return {
162 ...state,
163 [action.clientId]: action.isEditing
164 };
165 }
166 return state;
167 }
168 var reducer_default = (0, import_data.combineReducers)({
169 isEditingPattern
170 });
171
172 // packages/patterns/build-module/store/actions.mjs
173 var actions_exports = {};
174 __export(actions_exports, {
175 convertSyncedPatternToStatic: () => convertSyncedPatternToStatic,
176 createPattern: () => createPattern,
177 createPatternFromFile: () => createPatternFromFile,
178 setEditingPattern: () => setEditingPattern
179 });
180 var import_blocks = __toESM(require_blocks(), 1);
181 var import_core_data = __toESM(require_core_data(), 1);
182 var import_block_editor = __toESM(require_block_editor(), 1);
183
184 // packages/patterns/build-module/constants.mjs
185 var PATTERN_TYPES = {
186 theme: "pattern",
187 user: "wp_block"
188 };
189 var PATTERN_DEFAULT_CATEGORY = "all-patterns";
190 var PATTERN_USER_CATEGORY = "my-patterns";
191 var EXCLUDED_PATTERN_SOURCES = [
192 "core",
193 "pattern-directory/core",
194 "pattern-directory/featured"
195 ];
196 var PATTERN_SYNC_TYPES = {
197 full: "fully",
198 unsynced: "unsynced"
199 };
200 var PATTERN_OVERRIDES_BINDING_SOURCE = "core/pattern-overrides";
201
202 // packages/patterns/build-module/store/actions.mjs
203 var createPattern = (title, syncType, content, categories) => async ({ registry }) => {
204 const meta = syncType === PATTERN_SYNC_TYPES.unsynced ? {
205 wp_pattern_sync_status: syncType
206 } : void 0;
207 const reusableBlock = {
208 title,
209 content,
210 status: "publish",
211 meta,
212 wp_pattern_category: categories
213 };
214 const updatedRecord = await registry.dispatch(import_core_data.store).saveEntityRecord("postType", "wp_block", reusableBlock);
215 return updatedRecord;
216 };
217 var createPatternFromFile = (file, categories) => async ({ dispatch }) => {
218 const fileContent = await file.text();
219 let parsedContent;
220 try {
221 parsedContent = JSON.parse(fileContent);
222 } catch {
223 throw new Error("Invalid JSON file");
224 }
225 if (parsedContent.__file !== "wp_block" || !parsedContent.title || !parsedContent.content || typeof parsedContent.title !== "string" || typeof parsedContent.content !== "string" || parsedContent.syncStatus && typeof parsedContent.syncStatus !== "string") {
226 throw new Error("Invalid pattern JSON file");
227 }
228 const pattern = await dispatch.createPattern(
229 parsedContent.title,
230 parsedContent.syncStatus,
231 parsedContent.content,
232 categories
233 );
234 return pattern;
235 };
236 var convertSyncedPatternToStatic = (clientId) => ({ registry }) => {
237 const patternBlock = registry.select(import_block_editor.store).getBlock(clientId);
238 const existingOverrides = patternBlock.attributes?.content;
239 function cloneBlocksAndRemoveBindings(blocks) {
240 return blocks.map((block) => {
241 let metadata = block.attributes.metadata;
242 if (metadata) {
243 metadata = { ...metadata };
244 delete metadata.id;
245 delete metadata.bindings;
246 if (existingOverrides?.[metadata.name]) {
247 for (const [attributeName, value] of Object.entries(
248 existingOverrides[metadata.name]
249 )) {
250 if (!(0, import_blocks.getBlockType)(block.name)?.attributes[attributeName]) {
251 continue;
252 }
253 block.attributes[attributeName] = value;
254 }
255 }
256 }
257 return (0, import_blocks.cloneBlock)(
258 block,
259 {
260 metadata: metadata && Object.keys(metadata).length > 0 ? metadata : void 0
261 },
262 cloneBlocksAndRemoveBindings(block.innerBlocks)
263 );
264 });
265 }
266 const patternInnerBlocks = registry.select(import_block_editor.store).getBlocks(patternBlock.clientId);
267 registry.dispatch(import_block_editor.store).replaceBlocks(
268 patternBlock.clientId,
269 cloneBlocksAndRemoveBindings(patternInnerBlocks)
270 );
271 };
272 function setEditingPattern(clientId, isEditing) {
273 return {
274 type: "SET_EDITING_PATTERN",
275 clientId,
276 isEditing
277 };
278 }
279
280 // packages/patterns/build-module/store/constants.mjs
281 var STORE_NAME = "core/patterns";
282
283 // packages/patterns/build-module/store/selectors.mjs
284 var selectors_exports = {};
285 __export(selectors_exports, {
286 isEditingPattern: () => isEditingPattern2
287 });
288 function isEditingPattern2(state, clientId) {
289 return state.isEditingPattern[clientId];
290 }
291
292 // packages/patterns/build-module/lock-unlock.mjs
293 var import_private_apis = __toESM(require_private_apis(), 1);
294 var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
295 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
296 "@wordpress/patterns"
297 );
298
299 // packages/patterns/build-module/store/index.mjs
300 var storeConfig = {
301 reducer: reducer_default
302 };
303 var store = (0, import_data2.createReduxStore)(STORE_NAME, {
304 ...storeConfig
305 });
306 (0, import_data2.register)(store);
307 unlock(store).registerPrivateActions(actions_exports);
308 unlock(store).registerPrivateSelectors(selectors_exports);
309
310 // packages/patterns/build-module/components/overrides-panel.mjs
311 var import_block_editor2 = __toESM(require_block_editor(), 1);
312 var import_components = __toESM(require_components(), 1);
313 var import_data3 = __toESM(require_data(), 1);
314 var import_element = __toESM(require_element(), 1);
315 var import_i18n = __toESM(require_i18n(), 1);
316
317 // packages/patterns/build-module/api/index.mjs
318 function isOverridableBlock(block) {
319 return !!block.attributes.metadata?.name && !!block.attributes.metadata?.bindings && Object.values(block.attributes.metadata.bindings).some(
320 (binding) => binding.source === "core/pattern-overrides"
321 );
322 }
323
324 // packages/patterns/build-module/components/overrides-panel.mjs
325 var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
326 var { BlockQuickNavigation } = unlock(import_block_editor2.privateApis);
327 function OverridesPanel() {
328 const { allClientIds, supportedBlockTypesRaw } = (0, import_data3.useSelect)(
329 (select) => ({
330 allClientIds: select(import_block_editor2.store).getClientIdsWithDescendants(),
331 supportedBlockTypesRaw: select(import_block_editor2.store).getSettings()?.__experimentalBlockBindingsSupportedAttributes
332 }),
333 []
334 );
335 const { getBlock } = (0, import_data3.useSelect)(import_block_editor2.store);
336 const clientIdsWithOverrides = (0, import_element.useMemo)(() => {
337 const supportedBlockTypes = Object.keys(supportedBlockTypesRaw ?? {});
338 return allClientIds.filter((clientId) => {
339 const block = getBlock(clientId);
340 return supportedBlockTypes.includes(block.name) && isOverridableBlock(block);
341 });
342 }, [allClientIds, getBlock, supportedBlockTypesRaw]);
343 if (!clientIdsWithOverrides?.length) {
344 return null;
345 }
346 return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.PanelBody, { title: (0, import_i18n.__)("Overrides"), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BlockQuickNavigation, { clientIds: clientIdsWithOverrides }) });
347 }
348
349 // packages/patterns/build-module/components/create-pattern-modal.mjs
350 var import_components3 = __toESM(require_components(), 1);
351
352 // node_modules/clsx/dist/clsx.mjs
353 function r(e) {
354 var t, f, n = "";
355 if ("string" == typeof e || "number" == typeof e) n += e;
356 else if ("object" == typeof e) if (Array.isArray(e)) {
357 var o = e.length;
358 for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
359 } else for (f in e) e[f] && (n && (n += " "), n += f);
360 return n;
361 }
362 function clsx() {
363 for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
364 return n;
365 }
366 var clsx_default = clsx;
367
368 // node_modules/@base-ui/utils/createLogOnce.mjs
369 var loggedMessages;
370 if (true) {
371 loggedMessages = /* @__PURE__ */ new Set();
372 }
373 function createLogOnce(severity, prefix) {
374 return function logOnce(...messages) {
375 if (true) {
376 const message = messages.join(" ");
377 const output = prefix ? `${prefix}: ${message}` : message;
378 const key = `${severity}:${output}`;
379 if (!loggedMessages.has(key)) {
380 loggedMessages.add(key);
381 if (severity === "warn") {
382 console.warn(output);
383 } else {
384 console.error(output);
385 }
386 }
387 }
388 };
389 }
390
391 // node_modules/@base-ui/utils/useRefWithInit.mjs
392 var React = __toESM(require_react(), 1);
393 var UNINITIALIZED = {};
394 function useRefWithInit(init, initArg) {
395 const ref = React.useRef(UNINITIALIZED);
396 if (ref.current === UNINITIALIZED) {
397 ref.current = init(initArg);
398 }
399 return ref;
400 }
401
402 // node_modules/@base-ui/utils/warn.mjs
403 var warn = createLogOnce("warn", "Base UI");
404
405 // node_modules/@base-ui/utils/empty.mjs
406 var EMPTY_ARRAY = Object.freeze([]);
407 var EMPTY_OBJECT = Object.freeze({});
408
409 // node_modules/@base-ui/react/internals/useRenderElement.mjs
410 var React4 = __toESM(require_react(), 1);
411
412 // node_modules/@base-ui/utils/useMergedRefs.mjs
413 function useMergedRefs(a, b, c, d) {
414 const forkRef = useRefWithInit(createForkRef).current;
415 if (didChange(forkRef, a, b, c, d)) {
416 update(forkRef, [a, b, c, d]);
417 }
418 return forkRef.callback;
419 }
420 function useMergedRefsN(refs) {
421 const forkRef = useRefWithInit(createForkRef).current;
422 if (didChangeN(forkRef, refs)) {
423 update(forkRef, refs);
424 }
425 return forkRef.callback;
426 }
427 function createForkRef() {
428 return {
429 callback: null,
430 cleanup: null,
431 refs: []
432 };
433 }
434 function didChange(forkRef, a, b, c, d) {
435 return forkRef.refs[0] !== a || forkRef.refs[1] !== b || forkRef.refs[2] !== c || forkRef.refs[3] !== d;
436 }
437 function didChangeN(forkRef, newRefs) {
438 return forkRef.refs.length !== newRefs.length || forkRef.refs.some((ref, index) => ref !== newRefs[index]);
439 }
440 function update(forkRef, refs) {
441 forkRef.refs = refs;
442 if (refs.every((ref) => ref == null)) {
443 forkRef.callback = null;
444 return;
445 }
446 forkRef.callback = (instance) => {
447 if (forkRef.cleanup) {
448 forkRef.cleanup();
449 forkRef.cleanup = null;
450 }
451 if (instance != null) {
452 const cleanupCallbacks = Array(refs.length).fill(null);
453 for (let i = 0; i < refs.length; i += 1) {
454 const ref = refs[i];
455 if (ref == null) {
456 continue;
457 }
458 switch (typeof ref) {
459 case "function": {
460 const refCleanup = ref(instance);
461 if (typeof refCleanup === "function") {
462 cleanupCallbacks[i] = refCleanup;
463 }
464 break;
465 }
466 case "object": {
467 ref.current = instance;
468 break;
469 }
470 default:
471 }
472 }
473 forkRef.cleanup = () => {
474 for (let i = 0; i < refs.length; i += 1) {
475 const ref = refs[i];
476 if (ref == null) {
477 continue;
478 }
479 switch (typeof ref) {
480 case "function": {
481 const cleanupCallback = cleanupCallbacks[i];
482 if (typeof cleanupCallback === "function") {
483 cleanupCallback();
484 } else {
485 void ref(null);
486 }
487 break;
488 }
489 case "object": {
490 ref.current = null;
491 break;
492 }
493 default:
494 }
495 }
496 };
497 }
498 };
499 }
500
501 // node_modules/@base-ui/utils/getReactElementRef.mjs
502 var React3 = __toESM(require_react(), 1);
503
504 // node_modules/@base-ui/utils/reactVersion.mjs
505 var React2 = __toESM(require_react(), 1);
506 var majorVersion = parseInt(React2.version, 10);
507 function isReactVersionAtLeast(reactVersionToCheck) {
508 return majorVersion >= reactVersionToCheck;
509 }
510
511 // node_modules/@base-ui/utils/getReactElementRef.mjs
512 function getReactElementRef(element) {
513 if (!/* @__PURE__ */ React3.isValidElement(element)) {
514 return null;
515 }
516 const reactElement = element;
517 const propsWithRef = reactElement.props;
518 return (isReactVersionAtLeast(19) ? propsWithRef?.ref : reactElement.ref) ?? null;
519 }
520
521 // node_modules/@base-ui/utils/mergeObjects.mjs
522 function mergeObjects(a, b) {
523 if (a && !b) {
524 return a;
525 }
526 if (!a && b) {
527 return b;
528 }
529 if (a || b) {
530 return {
531 ...a,
532 ...b
533 };
534 }
535 return void 0;
536 }
537
538 // node_modules/@base-ui/react/internals/getStateAttributesProps.mjs
539 function getStateAttributesProps(state, customMapping) {
540 const props = {};
541 for (const key in state) {
542 const value = state[key];
543 if (customMapping?.hasOwnProperty(key)) {
544 const customProps = customMapping[key](value);
545 if (customProps != null) {
546 Object.assign(props, customProps);
547 }
548 continue;
549 }
550 if (value === true) {
551 props[`data-${key.toLowerCase()}`] = "";
552 } else if (value) {
553 props[`data-${key.toLowerCase()}`] = value.toString();
554 }
555 }
556 return props;
557 }
558
559 // node_modules/@base-ui/react/utils/resolveClassName.mjs
560 function resolveClassName(className, state) {
561 return typeof className === "function" ? className(state) : className;
562 }
563
564 // node_modules/@base-ui/react/utils/resolveStyle.mjs
565 function resolveStyle(style, state) {
566 return typeof style === "function" ? style(state) : style;
567 }
568
569 // node_modules/@base-ui/react/merge-props/mergeProps.mjs
570 var EMPTY_PROPS = {};
571 function mergeProps(a, b, c, d, e) {
572 if (!c && !d && !e && !a) {
573 return createInitialMergedProps(b);
574 }
575 let merged = createInitialMergedProps(a);
576 if (b) {
577 merged = mergeInto(merged, b);
578 }
579 if (c) {
580 merged = mergeInto(merged, c);
581 }
582 if (d) {
583 merged = mergeInto(merged, d);
584 }
585 if (e) {
586 merged = mergeInto(merged, e);
587 }
588 return merged;
589 }
590 function mergePropsN(props) {
591 if (props.length === 0) {
592 return EMPTY_PROPS;
593 }
594 if (props.length === 1) {
595 return createInitialMergedProps(props[0]);
596 }
597 let merged = createInitialMergedProps(props[0]);
598 for (let i = 1; i < props.length; i += 1) {
599 merged = mergeInto(merged, props[i]);
600 }
601 return merged;
602 }
603 function createInitialMergedProps(inputProps) {
604 if (isPropsGetter(inputProps)) {
605 return {
606 ...resolvePropsGetter(inputProps, EMPTY_PROPS)
607 };
608 }
609 return copyInitialProps(inputProps);
610 }
611 function mergeInto(merged, inputProps) {
612 if (isPropsGetter(inputProps)) {
613 return resolvePropsGetter(inputProps, merged);
614 }
615 return mutablyMergeInto(merged, inputProps);
616 }
617 function copyInitialProps(inputProps) {
618 const copiedProps = {
619 ...inputProps
620 };
621 for (const propName in copiedProps) {
622 const propValue = copiedProps[propName];
623 if (isEventHandler(propName, propValue)) {
624 copiedProps[propName] = wrapEventHandler(propValue);
625 }
626 }
627 return copiedProps;
628 }
629 function mutablyMergeInto(mergedProps, externalProps) {
630 if (!externalProps) {
631 return mergedProps;
632 }
633 for (const propName in externalProps) {
634 const externalPropValue = externalProps[propName];
635 switch (propName) {
636 case "style": {
637 mergedProps[propName] = mergeObjects(mergedProps.style, externalPropValue);
638 break;
639 }
640 case "className": {
641 mergedProps[propName] = mergeClassNames(mergedProps.className, externalPropValue);
642 break;
643 }
644 default: {
645 if (isEventHandler(propName, externalPropValue)) {
646 mergedProps[propName] = mergeEventHandlers(mergedProps[propName], externalPropValue);
647 } else {
648 mergedProps[propName] = externalPropValue;
649 }
650 }
651 }
652 }
653 return mergedProps;
654 }
655 function isEventHandler(key, value) {
656 const code0 = key.charCodeAt(0);
657 const code1 = key.charCodeAt(1);
658 const code2 = key.charCodeAt(2);
659 return code0 === 111 && code1 === 110 && code2 >= 65 && code2 <= 90 && (typeof value === "function" || typeof value === "undefined");
660 }
661 function isPropsGetter(inputProps) {
662 return typeof inputProps === "function";
663 }
664 function resolvePropsGetter(inputProps, previousProps) {
665 if (isPropsGetter(inputProps)) {
666 return inputProps(previousProps);
667 }
668 return inputProps ?? EMPTY_PROPS;
669 }
670 function mergeEventHandlers(ourHandler, theirHandler) {
671 if (!theirHandler) {
672 return ourHandler;
673 }
674 if (!ourHandler) {
675 return wrapEventHandler(theirHandler);
676 }
677 return (...args) => {
678 const event = args[0];
679 if (isSyntheticEvent(event)) {
680 const baseUIEvent = event;
681 makeEventPreventable(baseUIEvent);
682 const result2 = theirHandler(...args);
683 if (!baseUIEvent.baseUIHandlerPrevented) {
684 ourHandler?.(...args);
685 }
686 return result2;
687 }
688 const result = theirHandler(...args);
689 ourHandler?.(...args);
690 return result;
691 };
692 }
693 function wrapEventHandler(handler) {
694 if (!handler) {
695 return handler;
696 }
697 return (...args) => {
698 const event = args[0];
699 if (isSyntheticEvent(event)) {
700 makeEventPreventable(event);
701 }
702 return handler(...args);
703 };
704 }
705 function makeEventPreventable(event) {
706 event.preventBaseUIHandler = () => {
707 event.baseUIHandlerPrevented = true;
708 };
709 return event;
710 }
711 function mergeClassNames(ourClassName, theirClassName) {
712 if (theirClassName) {
713 if (ourClassName) {
714 return theirClassName + " " + ourClassName;
715 }
716 return theirClassName;
717 }
718 return ourClassName;
719 }
720 function isSyntheticEvent(event) {
721 return event != null && typeof event === "object" && "nativeEvent" in event;
722 }
723
724 // node_modules/@base-ui/react/internals/useRenderElement.mjs
725 var import_react = __toESM(require_react(), 1);
726 function useRenderElement(element, componentProps, params = {}) {
727 let renderProp = componentProps.render;
728 if (params.enabled !== false) {
729 renderProp = unwrapLazyRenderProp(renderProp);
730 }
731 const outProps = useRenderElementProps(componentProps, params, renderProp);
732 if (params.enabled === false) {
733 return null;
734 }
735 const state = params.state ?? EMPTY_OBJECT;
736 return evaluateRenderProp(element, renderProp, outProps, state);
737 }
738 function useRenderElementProps(componentProps, params, renderProp) {
739 const {
740 className: classNameProp,
741 style: styleProp
742 } = componentProps;
743 const {
744 state = EMPTY_OBJECT,
745 ref,
746 props,
747 stateAttributesMapping,
748 enabled = true
749 } = params;
750 const className = enabled ? resolveClassName(classNameProp, state) : void 0;
751 const style = enabled ? resolveStyle(styleProp, state) : void 0;
752 const stateProps = enabled ? getStateAttributesProps(state, stateAttributesMapping) : EMPTY_OBJECT;
753 const resolvedProps = enabled && props ? resolveRenderFunctionProps(props) : void 0;
754 const outProps = enabled ? mergeObjects(stateProps, resolvedProps) ?? {} : EMPTY_OBJECT;
755 if (typeof document !== "undefined") {
756 if (!enabled) {
757 void useMergedRefs(null, null);
758 } else if (Array.isArray(ref)) {
759 outProps.ref = useMergedRefsN([outProps.ref, getReactElementRef(renderProp), ...ref]);
760 } else {
761 outProps.ref = useMergedRefs(outProps.ref, getReactElementRef(renderProp), ref);
762 }
763 }
764 if (!enabled) {
765 return EMPTY_OBJECT;
766 }
767 if (className !== void 0) {
768 outProps.className = mergeClassNames(outProps.className, className);
769 }
770 if (style !== void 0) {
771 outProps.style = mergeObjects(outProps.style, style);
772 }
773 return outProps;
774 }
775 function resolveRenderFunctionProps(props) {
776 if (Array.isArray(props)) {
777 return mergePropsN(props);
778 }
779 return mergeProps(void 0, props);
780 }
781 var REACT_LAZY_TYPE = /* @__PURE__ */ Symbol.for("react.lazy");
782 var COMPONENT_IDENTIFIER_PATTERN = /^[A-Z][A-Za-z0-9$]*$/;
783 var LOWERCASE_CHARACTER_PATTERN = /[a-z]/;
784 function unwrapLazyRenderProp(render) {
785 if (render?.$$typeof !== REACT_LAZY_TYPE) {
786 return render;
787 }
788 const unwrapped = React4.Children.toArray(render)[0];
789 return /* @__PURE__ */ React4.isValidElement(unwrapped) ? unwrapped : render;
790 }
791 function evaluateRenderProp(element, render, props, state) {
792 if (render) {
793 if (typeof render === "function") {
794 if (true) {
795 warnIfRenderPropLooksLikeComponent(render);
796 }
797 return render(props, state);
798 }
799 const mergedProps = mergeProps(props, render.props);
800 mergedProps.ref = props.ref;
801 if (true) {
802 if (!/* @__PURE__ */ React4.isValidElement(render)) {
803 throw new Error(["Base UI: The `render` prop was provided an invalid React element as `React.isValidElement(render)` is `false`.", "A valid React element must be provided to the `render` prop because it is cloned with props to replace the default element.", "https://base-ui.com/r/invalid-render-prop"].join("\n"));
804 }
805 }
806 return /* @__PURE__ */ React4.cloneElement(render, mergedProps);
807 }
808 if (element) {
809 if (typeof element === "string") {
810 return renderTag(element, props);
811 }
812 }
813 throw new Error(true ? "Base UI: Render element or function are not defined." : formatErrorMessage_default(8));
814 }
815 function warnIfRenderPropLooksLikeComponent(renderFn) {
816 const functionName = renderFn.name;
817 if (functionName.length === 0) {
818 return;
819 }
820 if (!COMPONENT_IDENTIFIER_PATTERN.test(functionName)) {
821 return;
822 }
823 if (!LOWERCASE_CHARACTER_PATTERN.test(functionName)) {
824 return;
825 }
826 warn(`The \`render\` prop received a function named \`${functionName}\` that starts with an uppercase letter.`, "This usually means a React component was passed directly as `render={Component}`.", "Base UI calls `render` as a plain function, which can break the Rules of Hooks during reconciliation.", "If this is an intentional render callback, rename it to start with a lowercase letter.", "Use `render={<Component />}` or `render={(props) => <Component {...props} />}` instead.", "https://base-ui.com/r/invalid-render-prop");
827 }
828 function renderTag(Tag, props) {
829 if (Tag === "button") {
830 return /* @__PURE__ */ (0, import_react.createElement)("button", {
831 type: "button",
832 ...props,
833 key: props.key
834 });
835 }
836 if (Tag === "img") {
837 return /* @__PURE__ */ (0, import_react.createElement)("img", {
838 alt: "",
839 ...props,
840 key: props.key
841 });
842 }
843 return /* @__PURE__ */ React4.createElement(Tag, props);
844 }
845
846 // node_modules/@base-ui/react/use-render/useRender.mjs
847 function useRender(params) {
848 return useRenderElement(params.defaultTagName ?? "div", params, params);
849 }
850
851 // packages/ui/build-module/text/text.mjs
852 var import_element2 = __toESM(require_element(), 1);
853 var STYLE_HASH_ATTRIBUTE = "data-wp-hash";
854 function getRuntime() {
855 const globalScope = globalThis;
856 if (globalScope.__wpStyleRuntime) {
857 return globalScope.__wpStyleRuntime;
858 }
859 globalScope.__wpStyleRuntime = {
860 documents: /* @__PURE__ */ new Map(),
861 styles: /* @__PURE__ */ new Map(),
862 injectedStyles: /* @__PURE__ */ new WeakMap()
863 };
864 if (typeof document !== "undefined") {
865 registerDocument(document);
866 }
867 return globalScope.__wpStyleRuntime;
868 }
869 function documentContainsStyleHash(targetDocument, hash) {
870 if (!targetDocument.head) {
871 return false;
872 }
873 for (const style of targetDocument.head.querySelectorAll(
874 `style[${STYLE_HASH_ATTRIBUTE}]`
875 )) {
876 if (style.getAttribute(STYLE_HASH_ATTRIBUTE) === hash) {
877 return true;
878 }
879 }
880 return false;
881 }
882 function injectStyle(targetDocument, hash, css) {
883 if (!targetDocument.head) {
884 return;
885 }
886 const runtime = getRuntime();
887 let injectedStyles = runtime.injectedStyles.get(targetDocument);
888 if (!injectedStyles) {
889 injectedStyles = /* @__PURE__ */ new Set();
890 runtime.injectedStyles.set(targetDocument, injectedStyles);
891 }
892 if (injectedStyles.has(hash)) {
893 return;
894 }
895 if (documentContainsStyleHash(targetDocument, hash)) {
896 injectedStyles.add(hash);
897 return;
898 }
899 const style = targetDocument.createElement("style");
900 style.setAttribute(STYLE_HASH_ATTRIBUTE, hash);
901 style.appendChild(targetDocument.createTextNode(css));
902 targetDocument.head.appendChild(style);
903 injectedStyles.add(hash);
904 }
905 function registerDocument(targetDocument) {
906 const runtime = getRuntime();
907 runtime.documents.set(
908 targetDocument,
909 (runtime.documents.get(targetDocument) ?? 0) + 1
910 );
911 for (const [hash, css] of runtime.styles) {
912 injectStyle(targetDocument, hash, css);
913 }
914 return () => {
915 const count = runtime.documents.get(targetDocument);
916 if (count === void 0) {
917 return;
918 }
919 if (count <= 1) {
920 runtime.documents.delete(targetDocument);
921 return;
922 }
923 runtime.documents.set(targetDocument, count - 1);
924 };
925 }
926 function registerStyle(hash, css) {
927 const runtime = getRuntime();
928 runtime.styles.set(hash, css);
929 for (const targetDocument of runtime.documents.keys()) {
930 injectStyle(targetDocument, hash, css);
931 }
932 }
933 if (typeof process === "undefined" || true) {
934 registerStyle("3167e7d116", '@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{._83ed8a8da5dd50ea__text{text-wrap:pretty;margin:0}._14437cfb77831647__heading-2xl{--_gcd-heading-font-size:var(--wpds-typography-font-size-2xl,32px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-emphasis,600);--_gcd-p-font-size:var(--wpds-typography-font-size-2xl,32px);--_gcd-p-line-height:var(--wpds-typography-line-height-2xl,40px);font-size:var(--wpds-typography-font-size-2xl,32px);line-height:var(--wpds-typography-line-height-2xl,40px)}._14437cfb77831647__heading-2xl,._3c78b7fa9b4072dd__heading-xl{font-family:var(--wpds-typography-font-family-heading,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);font-weight:var(--wpds-typography-font-weight-emphasis,600)}._3c78b7fa9b4072dd__heading-xl{--_gcd-heading-font-size:var(--wpds-typography-font-size-xl,20px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-emphasis,600);--_gcd-p-font-size:var(--wpds-typography-font-size-xl,20px);--_gcd-p-line-height:var(--wpds-typography-line-height-md,24px);font-size:var(--wpds-typography-font-size-xl,20px);line-height:var(--wpds-typography-line-height-md,24px)}.aa58f227716bcde2__heading-lg{--_gcd-heading-font-size:var(--wpds-typography-font-size-lg,15px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-emphasis,600);--_gcd-p-font-size:var(--wpds-typography-font-size-lg,15px);--_gcd-p-line-height:var(--wpds-typography-line-height-sm,20px);font-size:var(--wpds-typography-font-size-lg,15px)}.aa58f227716bcde2__heading-lg,.fc4da56d8dfe52c4__heading-md{font-family:var(--wpds-typography-font-family-heading,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);font-weight:var(--wpds-typography-font-weight-emphasis,600);line-height:var(--wpds-typography-line-height-sm,20px)}.fc4da56d8dfe52c4__heading-md{--_gcd-heading-font-size:var(--wpds-typography-font-size-md,13px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-emphasis,600);--_gcd-p-font-size:var(--wpds-typography-font-size-md,13px);--_gcd-p-line-height:var(--wpds-typography-line-height-sm,20px);font-size:var(--wpds-typography-font-size-md,13px)}.a9b78c7c82e8dff7__heading-sm{--_gcd-heading-font-size:var(--wpds-typography-font-size-xs,11px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-emphasis,600);--_gcd-p-font-size:var(--wpds-typography-font-size-xs,11px);--_gcd-p-line-height:var(--wpds-typography-line-height-xs,16px);font-family:var(--wpds-typography-font-family-heading,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);font-size:var(--wpds-typography-font-size-xs,11px);font-weight:var(--wpds-typography-font-weight-emphasis,600);line-height:var(--wpds-typography-line-height-xs,16px);text-transform:uppercase}._305ff559e52180d5__body-xl{--_gcd-heading-font-size:var(--wpds-typography-font-size-xl,20px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-default,400);--_gcd-p-font-size:var(--wpds-typography-font-size-xl,20px);--_gcd-p-line-height:var(--wpds-typography-line-height-xl,32px);font-size:var(--wpds-typography-font-size-xl,20px);line-height:var(--wpds-typography-line-height-xl,32px)}._305ff559e52180d5__body-xl,.ca1aa3fc2029e958__body-lg{font-family:var(--wpds-typography-font-family-body,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);font-weight:var(--wpds-typography-font-weight-default,400)}.ca1aa3fc2029e958__body-lg{--_gcd-heading-font-size:var(--wpds-typography-font-size-lg,15px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-default,400);--_gcd-p-font-size:var(--wpds-typography-font-size-lg,15px);--_gcd-p-line-height:var(--wpds-typography-line-height-md,24px);font-size:var(--wpds-typography-font-size-lg,15px);line-height:var(--wpds-typography-line-height-md,24px)}._131101940be12424__body-md{--_gcd-heading-font-size:var(--wpds-typography-font-size-md,13px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-default,400);--_gcd-p-font-size:var(--wpds-typography-font-size-md,13px);--_gcd-p-line-height:var(--wpds-typography-line-height-sm,20px);font-size:var(--wpds-typography-font-size-md,13px);line-height:var(--wpds-typography-line-height-sm,20px)}._0e8d87a42c1f75fa__body-sm,._131101940be12424__body-md{font-family:var(--wpds-typography-font-family-body,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);font-weight:var(--wpds-typography-font-weight-default,400)}._0e8d87a42c1f75fa__body-sm{--_gcd-heading-font-size:var(--wpds-typography-font-size-sm,12px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-default,400);--_gcd-p-font-size:var(--wpds-typography-font-size-sm,12px);--_gcd-p-line-height:var(--wpds-typography-line-height-xs,16px);font-size:var(--wpds-typography-font-size-sm,12px);line-height:var(--wpds-typography-line-height-xs,16px)}}}');
935 }
936 var style_default = { "text": "_83ed8a8da5dd50ea__text", "heading-2xl": "_14437cfb77831647__heading-2xl", "heading-xl": "_3c78b7fa9b4072dd__heading-xl", "heading-lg": "aa58f227716bcde2__heading-lg", "heading-md": "fc4da56d8dfe52c4__heading-md", "heading-sm": "a9b78c7c82e8dff7__heading-sm", "body-xl": "_305ff559e52180d5__body-xl", "body-lg": "ca1aa3fc2029e958__body-lg", "body-md": "_131101940be12424__body-md", "body-sm": "_0e8d87a42c1f75fa__body-sm" };
937 if (typeof process === "undefined" || true) {
938 registerStyle("e8e31009f5", "._6defc79820e382c6__button{box-sizing:var(--_gcd-button-box-sizing,border-box);font-family:var(--_gcd-button-font-family,inherit);font-size:var(--_gcd-button-font-size,inherit);font-weight:var(--_gcd-button-font-weight,inherit)}.d2cff2e5dea83bd1__input{box-sizing:var(--_gcd-input-box-sizing,border-box);font-family:var(--_gcd-input-font-family,inherit);font-size:var(--_gcd-input-font-size,inherit);font-weight:var(--_gcd-input-font-weight,inherit);margin:var(--_gcd-input-margin,0);&::placeholder{color:var(--_gcd-input-placeholder-color,var(--wpds-color-foreground-interactive-neutral-weak,#707070))}&:is(textarea,[type=text],[type=password],[type=color],[type=date],[type=datetime],[type=datetime-local],[type=email],[type=month],[type=number],[type=search],[type=tel],[type=time],[type=url],[type=week]){background-color:var(--_gcd-input-background-color,transparent);border:var(--_gcd-input-border,none);border-radius:var(--_gcd-input-border-radius,0);box-shadow:var(--_gcd-input-box-shadow,0 0 0 transparent);color:var(--_gcd-input-color,var(--wpds-color-foreground-interactive-neutral,#1e1e1e));&:focus{border-color:var(--_gcd-input-border-color-focus,var(--wp-admin-theme-color));box-shadow:var(--_gcd-input-box-shadow-focus,none);outline:var(--_gcd-input-outline-focus,none)}&:disabled{background:var(--_gcd-input-background-disabled,transparent);border-color:var(--_gcd-input-border-color-disabled,transparent);box-shadow:var(--_gcd-input-box-shadow-disabled,none);color:var(--_gcd-input-color-disabled,var(--wpds-color-foreground-interactive-neutral-disabled,#8d8d8d))}}&:is(textarea,[type=text],[type=password],[type=date],[type=datetime],[type=datetime-local],[type=email],[type=month],[type=number],[type=search],[type=tel],[type=time],[type=url],[type=week]){line-height:var(--_gcd-input-line-height,inherit);min-height:var(--_gcd-input-min-height,auto);padding:var(--_gcd-input-padding,0)}}._547d86373d02e108__textarea{box-sizing:var(--_gcd-textarea-box-sizing,border-box);overflow:var(--_gcd-textarea-overflow,auto);resize:var(--_gcd-textarea-resize,block)}._8c15fd0ed9f28ba4__div{outline:var(--_gcd-div-outline,0 solid transparent)}p._43cec3e1eec1066d__p{font-size:var(--_gcd-p-font-size,13px);line-height:var(--_gcd-p-line-height,1.5);margin:var(--_gcd-p-margin,0)}:is(h1,h2,h3,h4,h5,h6).e97669c6d9a38497__heading{color:var(--_gcd-heading-color,var(--wpds-color-foreground-content-neutral,#1e1e1e));font-size:var(--_gcd-heading-font-size,inherit);font-weight:var(--_gcd-heading-font-weight,var(--wpds-typography-font-weight-emphasis,600));margin:var(--_gcd-heading-margin,0)}._2c0831b0499dbd6e__a,._2c0831b0499dbd6e__a:is(:hover,:focus,:active){border-radius:var(--_gcd-a-border-radius,0);box-shadow:var(--_gcd-a-box-shadow,none);color:var(--_gcd-a-color,inherit);outline:var(--_gcd-a-outline,0 solid transparent);transition:var(--_gcd-a-transition,none)}.c59a0ebebd71fa4a__ol{list-style:var(--_gcd-ol-list-style,none);margin:var(--_gcd-ol-margin,0);padding-block:var(--_gcd-ol-padding-block,0);padding-inline:var(--_gcd-ol-padding-inline,0)}._46b5cb0c8e24e8c9__li{margin:var(--_gcd-li-margin,0)}");
939 }
940 var global_css_defense_default = { "button": "_6defc79820e382c6__button", "input": "d2cff2e5dea83bd1__input", "textarea": "_547d86373d02e108__textarea", "div": "_8c15fd0ed9f28ba4__div", "p": "_43cec3e1eec1066d__p", "heading": "e97669c6d9a38497__heading", "a": "_2c0831b0499dbd6e__a", "ol": "c59a0ebebd71fa4a__ol", "li": "_46b5cb0c8e24e8c9__li" };
941 var Text = (0, import_element2.forwardRef)(function Text2({ variant = "body-md", render, className, ...props }, ref) {
942 const element = useRender({
943 render,
944 defaultTagName: "span",
945 ref,
946 props: mergeProps(props, {
947 className: clsx_default(
948 style_default.text,
949 global_css_defense_default.heading,
950 global_css_defense_default.p,
951 style_default[variant],
952 className
953 )
954 })
955 });
956 return element;
957 });
958
959 // packages/icons/build-module/library/symbol.mjs
960 var import_primitives = __toESM(require_primitives(), 1);
961 var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
962 var symbol_default = /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_primitives.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", style: { fill: "none" }, stroke: "currentColor", strokeWidth: "1.5", children: [
963 /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_primitives.Path, { d: "M15.2071 6.20711L20.2929 11.2929C20.6834 11.6834 20.6834 12.3166 20.2929 12.7071L15.2071 17.7929C14.8166 18.1834 14.1834 18.1834 13.7929 17.7929L8.70711 12.7071C8.31658 12.3166 8.31658 11.6834 8.70711 11.2929L13.7929 6.20711C14.1834 5.81658 14.8166 5.81658 15.2071 6.20711Z", vectorEffect: "non-scaling-stroke" }),
964 /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_primitives.Path, { d: "M9.5 5.5L3.70711 11.2929C3.31658 11.6834 3.31658 12.3166 3.70711 12.7071L9.5 18.5", vectorEffect: "non-scaling-stroke" })
965 ] });
966
967 // packages/ui/build-module/stack/stack.mjs
968 var import_element3 = __toESM(require_element(), 1);
969 var STYLE_HASH_ATTRIBUTE2 = "data-wp-hash";
970 function getRuntime2() {
971 const globalScope = globalThis;
972 if (globalScope.__wpStyleRuntime) {
973 return globalScope.__wpStyleRuntime;
974 }
975 globalScope.__wpStyleRuntime = {
976 documents: /* @__PURE__ */ new Map(),
977 styles: /* @__PURE__ */ new Map(),
978 injectedStyles: /* @__PURE__ */ new WeakMap()
979 };
980 if (typeof document !== "undefined") {
981 registerDocument2(document);
982 }
983 return globalScope.__wpStyleRuntime;
984 }
985 function documentContainsStyleHash2(targetDocument, hash) {
986 if (!targetDocument.head) {
987 return false;
988 }
989 for (const style of targetDocument.head.querySelectorAll(
990 `style[${STYLE_HASH_ATTRIBUTE2}]`
991 )) {
992 if (style.getAttribute(STYLE_HASH_ATTRIBUTE2) === hash) {
993 return true;
994 }
995 }
996 return false;
997 }
998 function injectStyle2(targetDocument, hash, css) {
999 if (!targetDocument.head) {
1000 return;
1001 }
1002 const runtime = getRuntime2();
1003 let injectedStyles = runtime.injectedStyles.get(targetDocument);
1004 if (!injectedStyles) {
1005 injectedStyles = /* @__PURE__ */ new Set();
1006 runtime.injectedStyles.set(targetDocument, injectedStyles);
1007 }
1008 if (injectedStyles.has(hash)) {
1009 return;
1010 }
1011 if (documentContainsStyleHash2(targetDocument, hash)) {
1012 injectedStyles.add(hash);
1013 return;
1014 }
1015 const style = targetDocument.createElement("style");
1016 style.setAttribute(STYLE_HASH_ATTRIBUTE2, hash);
1017 style.appendChild(targetDocument.createTextNode(css));
1018 targetDocument.head.appendChild(style);
1019 injectedStyles.add(hash);
1020 }
1021 function registerDocument2(targetDocument) {
1022 const runtime = getRuntime2();
1023 runtime.documents.set(
1024 targetDocument,
1025 (runtime.documents.get(targetDocument) ?? 0) + 1
1026 );
1027 for (const [hash, css] of runtime.styles) {
1028 injectStyle2(targetDocument, hash, css);
1029 }
1030 return () => {
1031 const count = runtime.documents.get(targetDocument);
1032 if (count === void 0) {
1033 return;
1034 }
1035 if (count <= 1) {
1036 runtime.documents.delete(targetDocument);
1037 return;
1038 }
1039 runtime.documents.set(targetDocument, count - 1);
1040 };
1041 }
1042 function registerStyle2(hash, css) {
1043 const runtime = getRuntime2();
1044 runtime.styles.set(hash, css);
1045 for (const targetDocument of runtime.documents.keys()) {
1046 injectStyle2(targetDocument, hash, css);
1047 }
1048 }
1049 if (typeof process === "undefined" || true) {
1050 registerStyle2("32aba35fe1", "@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{._19ce0419607e1896__stack{display:flex}}}");
1051 }
1052 var style_default2 = { "stack": "_19ce0419607e1896__stack" };
1053 var gapTokens = {
1054 xs: "var(--wpds-dimension-gap-xs, 4px)",
1055 sm: "var(--wpds-dimension-gap-sm, 8px)",
1056 md: "var(--wpds-dimension-gap-md, 12px)",
1057 lg: "var(--wpds-dimension-gap-lg, 16px)",
1058 xl: "var(--wpds-dimension-gap-xl, 24px)",
1059 "2xl": "var(--wpds-dimension-gap-2xl, 32px)",
1060 "3xl": "var(--wpds-dimension-gap-3xl, 40px)"
1061 };
1062 var Stack = (0, import_element3.forwardRef)(function Stack2({ direction, gap, align, justify, wrap, render, ...props }, ref) {
1063 const style = {
1064 gap: gap && gapTokens[gap],
1065 alignItems: align,
1066 justifyContent: justify,
1067 flexDirection: direction,
1068 flexWrap: wrap
1069 };
1070 const element = useRender({
1071 render,
1072 ref,
1073 props: mergeProps(props, { style, className: style_default2.stack })
1074 });
1075 return element;
1076 });
1077
1078 // packages/patterns/build-module/components/create-pattern-modal.mjs
1079 var import_i18n3 = __toESM(require_i18n(), 1);
1080 var import_element6 = __toESM(require_element(), 1);
1081 var import_data5 = __toESM(require_data(), 1);
1082 var import_notices = __toESM(require_notices(), 1);
1083 var import_core_data3 = __toESM(require_core_data(), 1);
1084
1085 // packages/patterns/build-module/components/category-selector.mjs
1086 var import_i18n2 = __toESM(require_i18n(), 1);
1087 var import_element4 = __toESM(require_element(), 1);
1088 var import_components2 = __toESM(require_components(), 1);
1089 var import_compose = __toESM(require_compose(), 1);
1090 var import_html_entities = __toESM(require_html_entities(), 1);
1091 var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
1092 var unescapeString = (arg) => {
1093 return (0, import_html_entities.decodeEntities)(arg);
1094 };
1095 var CATEGORY_SLUG = "wp_pattern_category";
1096 function CategorySelector({
1097 categoryTerms,
1098 onChange,
1099 categoryMap
1100 }) {
1101 const [search, setSearch] = (0, import_element4.useState)("");
1102 const debouncedSearch = (0, import_compose.useDebounce)(setSearch, 500);
1103 const suggestions = (0, import_element4.useMemo)(() => {
1104 return Array.from(categoryMap.values()).map((category) => unescapeString(category.label)).filter((category) => {
1105 if (search !== "") {
1106 return category.toLowerCase().includes(search.toLowerCase());
1107 }
1108 return true;
1109 }).sort((a, b) => a.localeCompare(b));
1110 }, [search, categoryMap]);
1111 function handleChange(termNames) {
1112 const uniqueTerms = termNames.reduce((terms, newTerm) => {
1113 if (!terms.some(
1114 (term) => term.toLowerCase() === newTerm.toLowerCase()
1115 )) {
1116 terms.push(newTerm);
1117 }
1118 return terms;
1119 }, []);
1120 onChange(uniqueTerms);
1121 }
1122 return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1123 import_components2.FormTokenField,
1124 {
1125 className: "patterns-menu-items__convert-modal-categories",
1126 value: categoryTerms,
1127 suggestions,
1128 onChange: handleChange,
1129 onInputChange: debouncedSearch,
1130 label: (0, import_i18n2.__)("Categories"),
1131 tokenizeOnBlur: true,
1132 __experimentalExpandOnFocus: true
1133 }
1134 );
1135 }
1136
1137 // packages/patterns/build-module/private-hooks.mjs
1138 var import_data4 = __toESM(require_data(), 1);
1139 var import_core_data2 = __toESM(require_core_data(), 1);
1140 var import_element5 = __toESM(require_element(), 1);
1141 function useAddPatternCategory() {
1142 const { saveEntityRecord, invalidateResolution } = (0, import_data4.useDispatch)(import_core_data2.store);
1143 const { corePatternCategories, userPatternCategories } = (0, import_data4.useSelect)(
1144 (select) => {
1145 const { getUserPatternCategories, getBlockPatternCategories } = select(import_core_data2.store);
1146 return {
1147 corePatternCategories: getBlockPatternCategories(),
1148 userPatternCategories: getUserPatternCategories()
1149 };
1150 },
1151 []
1152 );
1153 const categoryMap = (0, import_element5.useMemo)(() => {
1154 const uniqueCategories = /* @__PURE__ */ new Map();
1155 userPatternCategories.forEach((category) => {
1156 uniqueCategories.set(category.label.toLowerCase(), {
1157 label: category.label,
1158 name: category.name,
1159 id: category.id
1160 });
1161 });
1162 corePatternCategories.forEach((category) => {
1163 if (!uniqueCategories.has(category.label.toLowerCase()) && // There are two core categories with `Post` label so explicitly remove the one with
1164 // the `query` slug to avoid any confusion.
1165 category.name !== "query") {
1166 uniqueCategories.set(category.label.toLowerCase(), {
1167 label: category.label,
1168 name: category.name
1169 });
1170 }
1171 });
1172 return uniqueCategories;
1173 }, [userPatternCategories, corePatternCategories]);
1174 async function findOrCreateTerm(term) {
1175 try {
1176 const existingTerm = categoryMap.get(term.toLowerCase());
1177 if (existingTerm?.id) {
1178 return existingTerm.id;
1179 }
1180 const termData = existingTerm ? { name: existingTerm.label, slug: existingTerm.name } : { name: term };
1181 const newTerm = await saveEntityRecord(
1182 "taxonomy",
1183 CATEGORY_SLUG,
1184 termData,
1185 { throwOnError: true }
1186 );
1187 invalidateResolution("getUserPatternCategories");
1188 return newTerm.id;
1189 } catch (error) {
1190 if (error.code !== "term_exists") {
1191 throw error;
1192 }
1193 return error.data.term_id;
1194 }
1195 }
1196 return { categoryMap, findOrCreateTerm };
1197 }
1198
1199 // packages/patterns/build-module/components/create-pattern-modal.mjs
1200 var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1);
1201 function CreatePatternModal({
1202 className = "patterns-menu-items__convert-modal",
1203 modalTitle,
1204 ...restProps
1205 }) {
1206 const defaultModalTitle = (0, import_data5.useSelect)(
1207 (select) => select(import_core_data3.store).getPostType(PATTERN_TYPES.user)?.labels?.add_new_item,
1208 []
1209 );
1210 return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1211 import_components3.Modal,
1212 {
1213 title: modalTitle || defaultModalTitle,
1214 onRequestClose: restProps.onClose,
1215 overlayClassName: className,
1216 focusOnMount: "firstContentElement",
1217 size: "small",
1218 children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(CreatePatternModalContents, { ...restProps })
1219 }
1220 );
1221 }
1222 function CreatePatternModalContents({
1223 confirmLabel = (0, import_i18n3.__)("Add"),
1224 defaultCategories = [],
1225 content,
1226 onClose,
1227 onError,
1228 onSuccess,
1229 defaultSyncType = PATTERN_SYNC_TYPES.full,
1230 defaultTitle = ""
1231 }) {
1232 const [syncType, setSyncType] = (0, import_element6.useState)(defaultSyncType);
1233 const [categoryTerms, setCategoryTerms] = (0, import_element6.useState)(defaultCategories);
1234 const [title, setTitle] = (0, import_element6.useState)(defaultTitle);
1235 const [isSaving, setIsSaving] = (0, import_element6.useState)(false);
1236 const { createPattern: createPattern2 } = unlock((0, import_data5.useDispatch)(store));
1237 const { createErrorNotice } = (0, import_data5.useDispatch)(import_notices.store);
1238 const { categoryMap, findOrCreateTerm } = useAddPatternCategory();
1239 async function onCreate(patternTitle, sync) {
1240 if (!title || isSaving) {
1241 return;
1242 }
1243 try {
1244 setIsSaving(true);
1245 const categories = await Promise.all(
1246 categoryTerms.map(
1247 (termName) => findOrCreateTerm(termName)
1248 )
1249 );
1250 const newPattern = await createPattern2(
1251 patternTitle,
1252 sync,
1253 typeof content === "function" ? content() : content,
1254 categories
1255 );
1256 onSuccess({
1257 pattern: newPattern,
1258 categoryId: PATTERN_DEFAULT_CATEGORY
1259 });
1260 } catch (error) {
1261 createErrorNotice(error.message, {
1262 type: "snackbar",
1263 id: "pattern-create"
1264 });
1265 onError?.();
1266 } finally {
1267 setIsSaving(false);
1268 setCategoryTerms([]);
1269 setTitle("");
1270 }
1271 }
1272 return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1273 "form",
1274 {
1275 onSubmit: (event) => {
1276 event.preventDefault();
1277 onCreate(title, syncType);
1278 },
1279 children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Stack, { direction: "column", gap: "lg", children: [
1280 /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1281 import_components3.TextControl,
1282 {
1283 label: (0, import_i18n3.__)("Name"),
1284 value: title,
1285 onChange: setTitle,
1286 placeholder: (0, import_i18n3.__)("My pattern"),
1287 className: "patterns-create-modal__name-input"
1288 }
1289 ),
1290 /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1291 CategorySelector,
1292 {
1293 categoryTerms,
1294 onChange: setCategoryTerms,
1295 categoryMap
1296 }
1297 ),
1298 /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1299 import_components3.ToggleControl,
1300 {
1301 label: (0, import_i18n3._x)("Synced", "pattern (singular)"),
1302 help: (0, import_i18n3.__)(
1303 "Sync this pattern across multiple locations."
1304 ),
1305 checked: syncType === PATTERN_SYNC_TYPES.full,
1306 onChange: () => {
1307 setSyncType(
1308 syncType === PATTERN_SYNC_TYPES.full ? PATTERN_SYNC_TYPES.unsynced : PATTERN_SYNC_TYPES.full
1309 );
1310 }
1311 }
1312 ),
1313 /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Stack, { gap: "sm", justify: "end", children: [
1314 /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1315 import_components3.Button,
1316 {
1317 __next40pxDefaultSize: true,
1318 variant: "tertiary",
1319 onClick: () => {
1320 onClose();
1321 setTitle("");
1322 },
1323 children: (0, import_i18n3.__)("Cancel")
1324 }
1325 ),
1326 /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1327 import_components3.Button,
1328 {
1329 __next40pxDefaultSize: true,
1330 variant: "primary",
1331 type: "submit",
1332 "aria-disabled": !title || isSaving,
1333 isBusy: isSaving,
1334 children: confirmLabel
1335 }
1336 )
1337 ] })
1338 ] })
1339 }
1340 );
1341 }
1342
1343 // packages/patterns/build-module/components/duplicate-pattern-modal.mjs
1344 var import_core_data4 = __toESM(require_core_data(), 1);
1345 var import_data6 = __toESM(require_data(), 1);
1346 var import_i18n4 = __toESM(require_i18n(), 1);
1347 var import_notices2 = __toESM(require_notices(), 1);
1348 var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1);
1349 function getTermLabels(pattern, categories) {
1350 if (pattern.type !== PATTERN_TYPES.user) {
1351 return categories.core?.filter(
1352 (category) => pattern.categories?.includes(category.name)
1353 ).map((category) => category.label);
1354 }
1355 return categories.user?.filter(
1356 (category) => pattern.wp_pattern_category?.includes(category.id)
1357 ).map((category) => category.label);
1358 }
1359 function useDuplicatePatternProps({ pattern, onSuccess }) {
1360 const { createSuccessNotice } = (0, import_data6.useDispatch)(import_notices2.store);
1361 const categories = (0, import_data6.useSelect)((select) => {
1362 const { getUserPatternCategories, getBlockPatternCategories } = select(import_core_data4.store);
1363 return {
1364 core: getBlockPatternCategories(),
1365 user: getUserPatternCategories()
1366 };
1367 });
1368 if (!pattern) {
1369 return null;
1370 }
1371 return {
1372 content: pattern.content,
1373 defaultCategories: getTermLabels(pattern, categories),
1374 defaultSyncType: pattern.type !== PATTERN_TYPES.user ? PATTERN_SYNC_TYPES.unsynced : pattern.wp_pattern_sync_status || PATTERN_SYNC_TYPES.full,
1375 defaultTitle: (0, import_i18n4.sprintf)(
1376 /* translators: %s: Existing pattern title */
1377 (0, import_i18n4._x)("%s (Copy)", "pattern"),
1378 typeof pattern.title === "string" ? pattern.title : pattern.title.raw
1379 ),
1380 onSuccess: ({ pattern: newPattern }) => {
1381 createSuccessNotice(
1382 (0, import_i18n4.sprintf)(
1383 // translators: %s: The new pattern's title e.g. 'Call to action (copy)'.
1384 (0, import_i18n4._x)('"%s" duplicated.', "pattern"),
1385 newPattern.title.raw
1386 ),
1387 {
1388 type: "snackbar",
1389 id: "patterns-create"
1390 }
1391 );
1392 onSuccess?.({ pattern: newPattern });
1393 }
1394 };
1395 }
1396 function DuplicatePatternModal({
1397 pattern,
1398 onClose,
1399 onSuccess
1400 }) {
1401 const duplicatedProps = useDuplicatePatternProps({ pattern, onSuccess });
1402 if (!pattern) {
1403 return null;
1404 }
1405 return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1406 CreatePatternModal,
1407 {
1408 modalTitle: (0, import_i18n4.__)("Duplicate pattern"),
1409 confirmLabel: (0, import_i18n4.__)("Duplicate"),
1410 onClose,
1411 onError: onClose,
1412 ...duplicatedProps
1413 }
1414 );
1415 }
1416
1417 // packages/patterns/build-module/components/rename-pattern-modal.mjs
1418 var import_components4 = __toESM(require_components(), 1);
1419 var import_core_data5 = __toESM(require_core_data(), 1);
1420 var import_data7 = __toESM(require_data(), 1);
1421 var import_element7 = __toESM(require_element(), 1);
1422 var import_html_entities2 = __toESM(require_html_entities(), 1);
1423 var import_i18n5 = __toESM(require_i18n(), 1);
1424 var import_notices3 = __toESM(require_notices(), 1);
1425 var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1);
1426 function RenamePatternModal({
1427 onClose,
1428 onError,
1429 onSuccess,
1430 pattern,
1431 ...props
1432 }) {
1433 const originalName = (0, import_html_entities2.decodeEntities)(pattern.title);
1434 const [name, setName] = (0, import_element7.useState)(originalName);
1435 const [isSaving, setIsSaving] = (0, import_element7.useState)(false);
1436 const {
1437 editEntityRecord,
1438 __experimentalSaveSpecifiedEntityEdits: saveSpecifiedEntityEdits
1439 } = (0, import_data7.useDispatch)(import_core_data5.store);
1440 const { createSuccessNotice, createErrorNotice } = (0, import_data7.useDispatch)(import_notices3.store);
1441 const onRename = async (event) => {
1442 event.preventDefault();
1443 if (!name || name === pattern.title || isSaving) {
1444 return;
1445 }
1446 try {
1447 await editEntityRecord("postType", pattern.type, pattern.id, {
1448 title: name
1449 });
1450 setIsSaving(true);
1451 setName("");
1452 onClose?.();
1453 const savedRecord = await saveSpecifiedEntityEdits(
1454 "postType",
1455 pattern.type,
1456 pattern.id,
1457 ["title"],
1458 { throwOnError: true }
1459 );
1460 onSuccess?.(savedRecord);
1461 createSuccessNotice((0, import_i18n5.__)("Pattern renamed"), {
1462 type: "snackbar",
1463 id: "pattern-update"
1464 });
1465 } catch (error) {
1466 onError?.();
1467 const errorMessage = error.message && error.code !== "unknown_error" ? error.message : (0, import_i18n5.__)("An error occurred while renaming the pattern.");
1468 createErrorNotice(errorMessage, {
1469 type: "snackbar",
1470 id: "pattern-update"
1471 });
1472 } finally {
1473 setIsSaving(false);
1474 setName("");
1475 }
1476 };
1477 const onRequestClose = () => {
1478 onClose?.();
1479 setName("");
1480 };
1481 return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1482 import_components4.Modal,
1483 {
1484 title: (0, import_i18n5.__)("Rename"),
1485 ...props,
1486 onRequestClose: onClose,
1487 focusOnMount: "firstContentElement",
1488 size: "small",
1489 children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("form", { onSubmit: onRename, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(Stack, { direction: "column", gap: "lg", children: [
1490 /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1491 import_components4.TextControl,
1492 {
1493 label: (0, import_i18n5.__)("Name"),
1494 value: name,
1495 onChange: setName,
1496 required: true
1497 }
1498 ),
1499 /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(Stack, { gap: "sm", justify: "end", children: [
1500 /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1501 import_components4.Button,
1502 {
1503 __next40pxDefaultSize: true,
1504 variant: "tertiary",
1505 onClick: onRequestClose,
1506 children: (0, import_i18n5.__)("Cancel")
1507 }
1508 ),
1509 /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1510 import_components4.Button,
1511 {
1512 __next40pxDefaultSize: true,
1513 variant: "primary",
1514 type: "submit",
1515 children: (0, import_i18n5.__)("Save")
1516 }
1517 )
1518 ] })
1519 ] }) })
1520 }
1521 );
1522 }
1523
1524 // packages/patterns/build-module/components/index.mjs
1525 var import_block_editor5 = __toESM(require_block_editor(), 1);
1526
1527 // packages/patterns/build-module/components/pattern-convert-button.mjs
1528 var import_blocks2 = __toESM(require_blocks(), 1);
1529 var import_block_editor3 = __toESM(require_block_editor(), 1);
1530 var import_element8 = __toESM(require_element(), 1);
1531 var import_components5 = __toESM(require_components(), 1);
1532 var import_data8 = __toESM(require_data(), 1);
1533 var import_core_data6 = __toESM(require_core_data(), 1);
1534 var import_i18n6 = __toESM(require_i18n(), 1);
1535 var import_notices4 = __toESM(require_notices(), 1);
1536 var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1);
1537 function PatternConvertButton({
1538 clientIds,
1539 rootClientId,
1540 closeBlockSettingsMenu
1541 }) {
1542 const { createSuccessNotice } = (0, import_data8.useDispatch)(import_notices4.store);
1543 const { replaceBlocks, updateBlockAttributes } = (0, import_data8.useDispatch)(import_block_editor3.store);
1544 const { setEditingPattern: setEditingPattern2 } = unlock((0, import_data8.useDispatch)(store));
1545 const [isModalOpen, setIsModalOpen] = (0, import_element8.useState)(false);
1546 const { getBlockAttributes } = (0, import_data8.useSelect)(import_block_editor3.store);
1547 const canConvert = (0, import_data8.useSelect)(
1548 (select) => {
1549 const { canUser } = select(import_core_data6.store);
1550 const {
1551 getBlocksByClientId: getBlocksByClientId2,
1552 canInsertBlockType,
1553 getBlockRootClientId
1554 } = select(import_block_editor3.store);
1555 const rootId = rootClientId || (clientIds.length > 0 ? getBlockRootClientId(clientIds[0]) : void 0);
1556 const blocks = getBlocksByClientId2(clientIds) ?? [];
1557 const hasReusableBlockSupport = (blockName) => {
1558 const blockType = (0, import_blocks2.getBlockType)(blockName);
1559 const hasParent = blockType && "parent" in blockType;
1560 return (0, import_blocks2.hasBlockSupport)(blockName, "reusable", !hasParent);
1561 };
1562 const isSyncedPattern = blocks.length === 1 && blocks[0] && (0, import_blocks2.isReusableBlock)(blocks[0]) && !!select(import_core_data6.store).getEntityRecord(
1563 "postType",
1564 "wp_block",
1565 blocks[0].attributes.ref
1566 );
1567 const isUnsyncedPattern = blocks.length === 1 && blocks?.[0]?.attributes?.metadata?.patternName;
1568 const _canConvert = (
1569 // Hide when this is already a pattern.
1570 !isUnsyncedPattern && !isSyncedPattern && // Hide when patterns are disabled.
1571 canInsertBlockType("core/block", rootId) && blocks.every(
1572 (block) => (
1573 // Guard against the case where a regular block has *just* been converted.
1574 !!block && // Hide on invalid blocks.
1575 block.isValid && // Hide when block doesn't support being made into a pattern.
1576 hasReusableBlockSupport(block.name)
1577 )
1578 ) && // Hide when current doesn't have permission to do that.
1579 // Blocks refers to the wp_block post type, this checks the ability to create a post of that type.
1580 !!canUser("create", {
1581 kind: "postType",
1582 name: "wp_block"
1583 })
1584 );
1585 return _canConvert;
1586 },
1587 [clientIds, rootClientId]
1588 );
1589 const { getBlocksByClientId } = (0, import_data8.useSelect)(import_block_editor3.store);
1590 const getContent = (0, import_element8.useCallback)(
1591 () => (0, import_blocks2.serialize)(getBlocksByClientId(clientIds)),
1592 [getBlocksByClientId, clientIds]
1593 );
1594 if (!canConvert) {
1595 return null;
1596 }
1597 const handleSuccess = ({ pattern }) => {
1598 if (pattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced) {
1599 if (clientIds?.length === 1) {
1600 const existingAttributes = getBlockAttributes(clientIds[0]);
1601 updateBlockAttributes(clientIds[0], {
1602 metadata: {
1603 ...existingAttributes?.metadata ? existingAttributes.metadata : {},
1604 patternName: `core/block/${pattern.id}`,
1605 name: pattern.title.raw
1606 }
1607 });
1608 }
1609 } else {
1610 const newBlock = (0, import_blocks2.createBlock)("core/block", {
1611 ref: pattern.id
1612 });
1613 replaceBlocks(clientIds, newBlock);
1614 setEditingPattern2(newBlock.clientId, true);
1615 }
1616 createSuccessNotice(
1617 pattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced ? (0, import_i18n6.sprintf)(
1618 // translators: %s: the name the user has given to the pattern.
1619 (0, import_i18n6.__)("Unsynced pattern created: %s"),
1620 pattern.title.raw
1621 ) : (0, import_i18n6.sprintf)(
1622 // translators: %s: the name the user has given to the pattern.
1623 (0, import_i18n6.__)("Synced pattern created: %s"),
1624 pattern.title.raw
1625 ),
1626 {
1627 type: "snackbar",
1628 id: "convert-to-pattern-success"
1629 }
1630 );
1631 setIsModalOpen(false);
1632 closeBlockSettingsMenu();
1633 };
1634 return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
1635 /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1636 import_components5.MenuItem,
1637 {
1638 icon: symbol_default,
1639 onClick: () => setIsModalOpen(true),
1640 "aria-expanded": isModalOpen,
1641 "aria-haspopup": "dialog",
1642 children: (0, import_i18n6.__)("Create pattern")
1643 }
1644 ),
1645 isModalOpen && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1646 CreatePatternModal,
1647 {
1648 content: getContent,
1649 onSuccess: (pattern) => {
1650 handleSuccess(pattern);
1651 },
1652 onError: () => {
1653 setIsModalOpen(false);
1654 },
1655 onClose: () => {
1656 setIsModalOpen(false);
1657 }
1658 }
1659 )
1660 ] });
1661 }
1662
1663 // packages/patterns/build-module/components/patterns-manage-button.mjs
1664 var import_components6 = __toESM(require_components(), 1);
1665 var import_i18n7 = __toESM(require_i18n(), 1);
1666 var import_blocks3 = __toESM(require_blocks(), 1);
1667 var import_data9 = __toESM(require_data(), 1);
1668 var import_element9 = __toESM(require_element(), 1);
1669 var import_block_editor4 = __toESM(require_block_editor(), 1);
1670 var import_url = __toESM(require_url(), 1);
1671 var import_core_data7 = __toESM(require_core_data(), 1);
1672 var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1);
1673 function PatternsManageButton({ clientId, onClose }) {
1674 const [showConfirmDialog, setShowConfirmDialog] = (0, import_element9.useState)(false);
1675 const {
1676 attributes,
1677 canDetach,
1678 isVisible,
1679 managePatternsUrl,
1680 isSyncedPattern,
1681 isUnsyncedPattern,
1682 canEdit
1683 } = (0, import_data9.useSelect)(
1684 (select) => {
1685 const { canRemoveBlock, getBlock, canEditBlock } = select(import_block_editor4.store);
1686 const { canUser } = select(import_core_data7.store);
1687 const block = getBlock(clientId);
1688 const _isUnsyncedPattern = !!block?.attributes?.metadata?.patternName;
1689 const _isSyncedPattern = !!block && (0, import_blocks3.isReusableBlock)(block) && !!canUser("update", {
1690 kind: "postType",
1691 name: "wp_block",
1692 id: block.attributes.ref
1693 });
1694 return {
1695 attributes: block.attributes,
1696 canEdit: canEditBlock(clientId),
1697 // For unsynced patterns, detaching is simply removing the `patternName` attribute.
1698 // For synced patterns, the `core:block` block is replaced with its inner blocks,
1699 // so checking whether `canRemoveBlock` is possible is required.
1700 canDetach: _isUnsyncedPattern || _isSyncedPattern && canRemoveBlock(clientId),
1701 isUnsyncedPattern: _isUnsyncedPattern,
1702 isSyncedPattern: _isSyncedPattern,
1703 isVisible: _isUnsyncedPattern || _isSyncedPattern,
1704 // The site editor and templates both check whether the user
1705 // has edit_theme_options capabilities. We can leverage that here
1706 // and omit the manage patterns link if the user can't access it.
1707 managePatternsUrl: canUser("create", {
1708 kind: "postType",
1709 name: "wp_template"
1710 }) ? (0, import_url.addQueryArgs)("site-editor.php", {
1711 p: "/pattern"
1712 }) : (0, import_url.addQueryArgs)("edit.php", {
1713 post_type: "wp_block"
1714 })
1715 };
1716 },
1717 [clientId]
1718 );
1719 const { updateBlockAttributes } = (0, import_data9.useDispatch)(import_block_editor4.store);
1720 const { convertSyncedPatternToStatic: convertSyncedPatternToStatic2 } = unlock(
1721 (0, import_data9.useDispatch)(store)
1722 );
1723 if (!isVisible || !canEdit) {
1724 return null;
1725 }
1726 const handleDetach = () => {
1727 if (isSyncedPattern) {
1728 convertSyncedPatternToStatic2(clientId);
1729 }
1730 if (isUnsyncedPattern) {
1731 const { patternName, ...attributesWithoutPatternName } = attributes?.metadata ?? {};
1732 updateBlockAttributes(clientId, {
1733 metadata: attributesWithoutPatternName
1734 });
1735 }
1736 onClose?.();
1737 setShowConfirmDialog(false);
1738 };
1739 return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
1740 canDetach && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
1741 /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_components6.MenuItem, { onClick: () => setShowConfirmDialog(true), children: (0, import_i18n7.__)("Detach") }),
1742 /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1743 import_components6.__experimentalConfirmDialog,
1744 {
1745 isOpen: showConfirmDialog,
1746 onConfirm: handleDetach,
1747 onCancel: () => setShowConfirmDialog(false),
1748 confirmButtonText: (0, import_i18n7.__)("Detach"),
1749 size: "medium",
1750 title: (0, import_i18n7.__)("Detach pattern?"),
1751 __experimentalHideHeader: false,
1752 children: isSyncedPattern ? (0, import_i18n7.__)(
1753 "The blocks will be separated from the original pattern and will be fully editable. Future changes to the pattern will not apply here."
1754 ) : (0, import_i18n7.__)(
1755 "Blocks will no longer be associated with this pattern and will be fully editable."
1756 )
1757 }
1758 )
1759 ] }),
1760 /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_components6.MenuItem, { href: managePatternsUrl, children: (0, import_i18n7.__)("Manage patterns") })
1761 ] });
1762 }
1763 var patterns_manage_button_default = PatternsManageButton;
1764
1765 // packages/patterns/build-module/components/index.mjs
1766 var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1);
1767 function PatternsMenuItems({ rootClientId }) {
1768 return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_block_editor5.BlockSettingsMenuControls, { children: ({ selectedClientIds, onClose }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
1769 /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1770 PatternConvertButton,
1771 {
1772 clientIds: selectedClientIds,
1773 rootClientId,
1774 closeBlockSettingsMenu: onClose
1775 }
1776 ),
1777 selectedClientIds.length === 1 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1778 patterns_manage_button_default,
1779 {
1780 clientId: selectedClientIds[0],
1781 onClose
1782 }
1783 )
1784 ] }) });
1785 }
1786
1787 // packages/patterns/build-module/components/rename-pattern-category-modal.mjs
1788 var import_components7 = __toESM(require_components(), 1);
1789 var import_core_data8 = __toESM(require_core_data(), 1);
1790 var import_data10 = __toESM(require_data(), 1);
1791 var import_element10 = __toESM(require_element(), 1);
1792 var import_html_entities3 = __toESM(require_html_entities(), 1);
1793 var import_i18n8 = __toESM(require_i18n(), 1);
1794 var import_notices5 = __toESM(require_notices(), 1);
1795 var import_a11y = __toESM(require_a11y(), 1);
1796 var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1);
1797 function RenamePatternCategoryModal({
1798 category,
1799 existingCategories,
1800 onClose,
1801 onError,
1802 onSuccess,
1803 ...props
1804 }) {
1805 const id = (0, import_element10.useId)();
1806 const textControlRef = (0, import_element10.useRef)();
1807 const [name, setName] = (0, import_element10.useState)((0, import_html_entities3.decodeEntities)(category.name));
1808 const [isSaving, setIsSaving] = (0, import_element10.useState)(false);
1809 const [validationMessage, setValidationMessage] = (0, import_element10.useState)(false);
1810 const validationMessageId = validationMessage ? `patterns-rename-pattern-category-modal__validation-message-${id}` : void 0;
1811 const { saveEntityRecord, invalidateResolution } = (0, import_data10.useDispatch)(import_core_data8.store);
1812 const { createErrorNotice, createSuccessNotice } = (0, import_data10.useDispatch)(import_notices5.store);
1813 const onChange = (newName) => {
1814 if (validationMessage) {
1815 setValidationMessage(void 0);
1816 }
1817 setName(newName);
1818 };
1819 const onSave = async (event) => {
1820 event.preventDefault();
1821 if (isSaving) {
1822 return;
1823 }
1824 if (!name || name === category.name) {
1825 const message = (0, import_i18n8.__)("Please enter a new name for this category.");
1826 (0, import_a11y.speak)(message, "assertive");
1827 setValidationMessage(message);
1828 textControlRef.current?.focus();
1829 return;
1830 }
1831 if (existingCategories.patternCategories.find((existingCategory) => {
1832 return existingCategory.id !== category.id && existingCategory.label.toLowerCase() === name.toLowerCase();
1833 })) {
1834 const message = (0, import_i18n8.__)(
1835 "This category already exists. Please use a different name."
1836 );
1837 (0, import_a11y.speak)(message, "assertive");
1838 setValidationMessage(message);
1839 textControlRef.current?.focus();
1840 return;
1841 }
1842 try {
1843 setIsSaving(true);
1844 const savedRecord = await saveEntityRecord(
1845 "taxonomy",
1846 CATEGORY_SLUG,
1847 {
1848 id: category.id,
1849 slug: category.slug,
1850 name
1851 }
1852 );
1853 invalidateResolution("getUserPatternCategories");
1854 onSuccess?.(savedRecord);
1855 onClose();
1856 createSuccessNotice((0, import_i18n8.__)("Pattern category renamed."), {
1857 type: "snackbar",
1858 id: "pattern-category-update"
1859 });
1860 } catch (error) {
1861 onError?.();
1862 createErrorNotice(error.message, {
1863 type: "snackbar",
1864 id: "pattern-category-update"
1865 });
1866 } finally {
1867 setIsSaving(false);
1868 setName("");
1869 }
1870 };
1871 const onRequestClose = () => {
1872 onClose();
1873 setName("");
1874 };
1875 return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1876 import_components7.Modal,
1877 {
1878 title: (0, import_i18n8.__)("Rename"),
1879 onRequestClose,
1880 ...props,
1881 children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("form", { onSubmit: onSave, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Stack, { direction: "column", gap: "lg", children: [
1882 /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Stack, { direction: "column", gap: "sm", children: [
1883 /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1884 import_components7.TextControl,
1885 {
1886 ref: textControlRef,
1887 label: (0, import_i18n8.__)("Name"),
1888 value: name,
1889 onChange,
1890 "aria-describedby": validationMessageId,
1891 required: true
1892 }
1893 ),
1894 validationMessage && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1895 "span",
1896 {
1897 className: "patterns-rename-pattern-category-modal__validation-message",
1898 id: validationMessageId,
1899 children: validationMessage
1900 }
1901 )
1902 ] }),
1903 /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Stack, { gap: "sm", justify: "end", children: [
1904 /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1905 import_components7.Button,
1906 {
1907 __next40pxDefaultSize: true,
1908 variant: "tertiary",
1909 onClick: onRequestClose,
1910 children: (0, import_i18n8.__)("Cancel")
1911 }
1912 ),
1913 /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1914 import_components7.Button,
1915 {
1916 __next40pxDefaultSize: true,
1917 variant: "primary",
1918 type: "submit",
1919 "aria-disabled": !name || name === category.name || isSaving,
1920 isBusy: isSaving,
1921 children: (0, import_i18n8.__)("Save")
1922 }
1923 )
1924 ] })
1925 ] }) })
1926 }
1927 );
1928 }
1929
1930 // packages/patterns/build-module/components/pattern-overrides-controls.mjs
1931 var import_element12 = __toESM(require_element(), 1);
1932 var import_block_editor6 = __toESM(require_block_editor(), 1);
1933 var import_components9 = __toESM(require_components(), 1);
1934 var import_i18n10 = __toESM(require_i18n(), 1);
1935
1936 // packages/patterns/build-module/components/allow-overrides-modal.mjs
1937 var import_components8 = __toESM(require_components(), 1);
1938 var import_i18n9 = __toESM(require_i18n(), 1);
1939 var import_element11 = __toESM(require_element(), 1);
1940 var import_a11y2 = __toESM(require_a11y(), 1);
1941 var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1);
1942 function AllowOverridesModal({
1943 placeholder,
1944 initialName = "",
1945 onClose,
1946 onSave
1947 }) {
1948 const [editedBlockName, setEditedBlockName] = (0, import_element11.useState)(initialName);
1949 const descriptionId = (0, import_element11.useId)();
1950 const isNameValid = !!editedBlockName.trim();
1951 const handleSubmit = () => {
1952 if (editedBlockName !== initialName) {
1953 const message = (0, import_i18n9.sprintf)(
1954 /* translators: %s: new name/label for the block */
1955 (0, import_i18n9.__)('Block name changed to: "%s".'),
1956 editedBlockName
1957 );
1958 (0, import_a11y2.speak)(message, "assertive");
1959 }
1960 onSave(editedBlockName);
1961 onClose();
1962 };
1963 return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1964 import_components8.Modal,
1965 {
1966 title: (0, import_i18n9.__)("Enable overrides"),
1967 onRequestClose: onClose,
1968 focusOnMount: "firstContentElement",
1969 aria: { describedby: descriptionId },
1970 size: "small",
1971 children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1972 "form",
1973 {
1974 onSubmit: (event) => {
1975 event.preventDefault();
1976 if (!isNameValid) {
1977 return;
1978 }
1979 handleSubmit();
1980 },
1981 children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(Stack, { direction: "column", gap: "xl", children: [
1982 /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Text, { id: descriptionId, children: (0, import_i18n9.__)(
1983 "Overrides are changes you make to a block within a synced pattern instance. Use overrides to customize a synced pattern instance to suit its new context. Name this block to specify an override."
1984 ) }),
1985 /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1986 import_components8.TextControl,
1987 {
1988 value: editedBlockName,
1989 label: (0, import_i18n9.__)("Name"),
1990 help: (0, import_i18n9.__)(
1991 'For example, if you are creating a recipe pattern, you use "Recipe Title", "Recipe Description", etc.'
1992 ),
1993 placeholder,
1994 onChange: setEditedBlockName
1995 }
1996 ),
1997 /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(Stack, { gap: "sm", justify: "end", children: [
1998 /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1999 import_components8.Button,
2000 {
2001 __next40pxDefaultSize: true,
2002 variant: "tertiary",
2003 onClick: onClose,
2004 children: (0, import_i18n9.__)("Cancel")
2005 }
2006 ),
2007 /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2008 import_components8.Button,
2009 {
2010 __next40pxDefaultSize: true,
2011 "aria-disabled": !isNameValid,
2012 variant: "primary",
2013 type: "submit",
2014 children: (0, import_i18n9.__)("Enable")
2015 }
2016 )
2017 ] })
2018 ] })
2019 }
2020 )
2021 }
2022 );
2023 }
2024 function DisallowOverridesModal({ onClose, onSave }) {
2025 const descriptionId = (0, import_element11.useId)();
2026 return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2027 import_components8.Modal,
2028 {
2029 title: (0, import_i18n9.__)("Disable overrides"),
2030 onRequestClose: onClose,
2031 aria: { describedby: descriptionId },
2032 size: "small",
2033 children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2034 "form",
2035 {
2036 onSubmit: (event) => {
2037 event.preventDefault();
2038 onSave();
2039 onClose();
2040 },
2041 children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(Stack, { direction: "column", gap: "xl", children: [
2042 /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Text, { id: descriptionId, children: (0, import_i18n9.__)(
2043 "Are you sure you want to disable overrides? Disabling overrides will revert all applied overrides for this block throughout instances of this pattern."
2044 ) }),
2045 /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(Stack, { gap: "sm", justify: "end", children: [
2046 /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2047 import_components8.Button,
2048 {
2049 __next40pxDefaultSize: true,
2050 variant: "tertiary",
2051 onClick: onClose,
2052 children: (0, import_i18n9.__)("Cancel")
2053 }
2054 ),
2055 /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2056 import_components8.Button,
2057 {
2058 __next40pxDefaultSize: true,
2059 variant: "primary",
2060 type: "submit",
2061 children: (0, import_i18n9.__)("Disable")
2062 }
2063 )
2064 ] })
2065 ] })
2066 }
2067 )
2068 }
2069 );
2070 }
2071
2072 // packages/patterns/build-module/components/pattern-overrides-controls.mjs
2073 var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1);
2074 function PatternOverridesControls({
2075 attributes,
2076 setAttributes,
2077 name: blockName
2078 }) {
2079 const controlId = (0, import_element12.useId)();
2080 const [showAllowOverridesModal, setShowAllowOverridesModal] = (0, import_element12.useState)(false);
2081 const [showDisallowOverridesModal, setShowDisallowOverridesModal] = (0, import_element12.useState)(false);
2082 const hasName = !!attributes.metadata?.name;
2083 const defaultBindings = attributes.metadata?.bindings?.__default;
2084 const hasOverrides = hasName && defaultBindings?.source === PATTERN_OVERRIDES_BINDING_SOURCE;
2085 const isConnectedToOtherSources = defaultBindings?.source && defaultBindings.source !== PATTERN_OVERRIDES_BINDING_SOURCE;
2086 const { updateBlockBindings } = (0, import_block_editor6.useBlockBindingsUtils)();
2087 function updateBindings(isChecked, customName) {
2088 if (customName) {
2089 setAttributes({
2090 metadata: {
2091 ...attributes.metadata,
2092 name: customName
2093 }
2094 });
2095 }
2096 updateBlockBindings({
2097 __default: isChecked ? { source: PATTERN_OVERRIDES_BINDING_SOURCE } : void 0
2098 });
2099 }
2100 if (isConnectedToOtherSources) {
2101 return null;
2102 }
2103 const hasUnsupportedImageAttributes = blockName === "core/image" && !!attributes.href?.length;
2104 const helpText = !hasOverrides && hasUnsupportedImageAttributes ? (0, import_i18n10.__)(
2105 `Overrides currently don't support image links. Remove the link first before enabling overrides.`
2106 ) : (0, import_i18n10.__)(
2107 "Allow changes to this block throughout instances of this pattern."
2108 );
2109 return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
2110 /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_block_editor6.InspectorControls, { group: "advanced", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2111 import_components9.BaseControl,
2112 {
2113 id: controlId,
2114 label: (0, import_i18n10.__)("Overrides"),
2115 help: helpText,
2116 children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2117 import_components9.Button,
2118 {
2119 __next40pxDefaultSize: true,
2120 className: "pattern-overrides-control__allow-overrides-button",
2121 variant: "secondary",
2122 "aria-haspopup": "dialog",
2123 onClick: () => {
2124 if (hasOverrides) {
2125 setShowDisallowOverridesModal(true);
2126 } else {
2127 setShowAllowOverridesModal(true);
2128 }
2129 },
2130 disabled: !hasOverrides && hasUnsupportedImageAttributes,
2131 accessibleWhenDisabled: true,
2132 children: hasOverrides ? (0, import_i18n10.__)("Disable overrides") : (0, import_i18n10.__)("Enable overrides")
2133 }
2134 )
2135 }
2136 ) }),
2137 showAllowOverridesModal && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2138 AllowOverridesModal,
2139 {
2140 initialName: attributes.metadata?.name,
2141 onClose: () => setShowAllowOverridesModal(false),
2142 onSave: (newName) => {
2143 updateBindings(true, newName);
2144 }
2145 }
2146 ),
2147 showDisallowOverridesModal && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2148 DisallowOverridesModal,
2149 {
2150 onClose: () => setShowDisallowOverridesModal(false),
2151 onSave: () => updateBindings(false)
2152 }
2153 )
2154 ] });
2155 }
2156 var pattern_overrides_controls_default = PatternOverridesControls;
2157
2158 // packages/patterns/build-module/components/reset-overrides-control.mjs
2159 var import_block_editor7 = __toESM(require_block_editor(), 1);
2160 var import_components10 = __toESM(require_components(), 1);
2161 var import_data11 = __toESM(require_data(), 1);
2162 var import_i18n11 = __toESM(require_i18n(), 1);
2163 var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1);
2164 var CONTENT = "content";
2165 function ResetOverridesControl(props) {
2166 const name = props.attributes.metadata?.name;
2167 const registry = (0, import_data11.useRegistry)();
2168 const isOverridden = (0, import_data11.useSelect)(
2169 (select) => {
2170 if (!name) {
2171 return;
2172 }
2173 const { getBlockAttributes, getBlockParentsByBlockName } = select(import_block_editor7.store);
2174 const [patternClientId] = getBlockParentsByBlockName(
2175 props.clientId,
2176 "core/block",
2177 true
2178 );
2179 if (!patternClientId) {
2180 return;
2181 }
2182 const overrides = getBlockAttributes(patternClientId)[CONTENT];
2183 if (!overrides) {
2184 return;
2185 }
2186 return overrides.hasOwnProperty(name);
2187 },
2188 [props.clientId, name]
2189 );
2190 function onClick() {
2191 const { getBlockAttributes, getBlockParentsByBlockName } = registry.select(import_block_editor7.store);
2192 const [patternClientId] = getBlockParentsByBlockName(
2193 props.clientId,
2194 "core/block",
2195 true
2196 );
2197 if (!patternClientId) {
2198 return;
2199 }
2200 const overrides = getBlockAttributes(patternClientId)[CONTENT];
2201 if (!overrides.hasOwnProperty(name)) {
2202 return;
2203 }
2204 const { updateBlockAttributes, __unstableMarkLastChangeAsPersistent } = registry.dispatch(import_block_editor7.store);
2205 __unstableMarkLastChangeAsPersistent();
2206 let newOverrides = { ...overrides };
2207 delete newOverrides[name];
2208 if (!Object.keys(newOverrides).length) {
2209 newOverrides = void 0;
2210 }
2211 updateBlockAttributes(patternClientId, {
2212 [CONTENT]: newOverrides
2213 });
2214 }
2215 return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_block_editor7.__unstableBlockToolbarLastItem, { children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_components10.ToolbarGroup, { children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_components10.ToolbarButton, { onClick, disabled: !isOverridden, children: (0, import_i18n11.__)("Reset") }) }) });
2216 }
2217
2218 // packages/patterns/build-module/private-apis.mjs
2219 var privateApis = {};
2220 lock(privateApis, {
2221 OverridesPanel,
2222 CreatePatternModal,
2223 CreatePatternModalContents,
2224 DuplicatePatternModal,
2225 isOverridableBlock,
2226 useDuplicatePatternProps,
2227 RenamePatternModal,
2228 PatternsMenuItems,
2229 RenamePatternCategoryModal,
2230 PatternOverridesControls: pattern_overrides_controls_default,
2231 ResetOverridesControl,
2232 useAddPatternCategory,
2233 PATTERN_TYPES,
2234 PATTERN_DEFAULT_CATEGORY,
2235 PATTERN_USER_CATEGORY,
2236 EXCLUDED_PATTERN_SOURCES,
2237 PATTERN_SYNC_TYPES
2238 });
2239 return __toCommonJS(index_exports);
2240 })();
2241 (window.wp ||= {}).patterns = wp.patterns;
2242 })();
2243 //# sourceMappingURL=index.js.map
2244