소재지 ₍₍◝(・'ω'・)◟⁾⁾ 🐟️?看XM(^_−)☆哈先看看刚看过卡卡国看过了回来冷藏柜好极过估计 PNG %k25u25%fgd5n!annotations.min.js000064400000013126152214270310010221 0ustar00var wp;(wp||={}).annotations=(()=>{var X=Object.create;var l=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var J=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var m=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),_=(t,e)=>{for(var n in e)l(t,n,{get:e[n],enumerable:!0})},S=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of z(e))!K.call(t,o)&&o!==n&&l(t,o,{get:()=>e[o],enumerable:!(r=q(e,o))||r.enumerable});return t};var s=(t,e,n)=>(n=t!=null?X(J(t)):{},S(e||!t||!t.__esModule?l(n,"default",{value:t,enumerable:!0}):n,t)),Q=t=>S(l({},"__esModule",{value:!0}),t);var g=m((Nt,D)=>{D.exports=window.wp.richText});var M=m((Tt,C)=>{C.exports=window.wp.i18n});var F=m((Ot,G)=>{G.exports=window.wp.hooks});var d=m((ht,B)=>{B.exports=window.wp.data});var _t={};_(_t,{store:()=>b});var k=s(g(),1);var P=s(M(),1),T=s(g(),1);var p="core/annotations";var E="core/annotation",N="annotation-text-";function Z(t,e=[]){return e.forEach(n=>{let{start:r,end:o}=n;r>t.text.length&&(r=t.text.length),o>t.text.length&&(o=t.text.length);let i=N+n.source,u=N+n.id;t=(0,T.applyFormat)(t,{type:E,attributes:{className:i,id:u}},r,o)}),t}function $(t){let e={};return t.forEach((n,r)=>{n=n||[],n=n.filter(o=>o.type===E),n.forEach(o=>{let{id:i}=o.attributes;i=i.replace(N,""),e.hasOwnProperty(i)||(e[i]={start:r}),e[i].end=r+1})}),e}function tt(t,e,{removeAnnotation:n,updateAnnotationRange:r}){t.forEach(o=>{let i=e[o.id];if(!i){n(o.id);return}let{start:u,end:x}=o;(u!==i.start||x!==i.end)&&r(o.id,i.start,i.end)})}var V={name:E,title:(0,P.__)("Annotation"),tagName:"mark",className:"annotation-text",attributes:{className:"class",id:"id"},edit(){return null},__experimentalGetPropsForEditableTreePreparation(t,{richTextIdentifier:e,blockClientId:n}){return{annotations:t(p).__experimentalGetAnnotationsForRichText(n,e)}},__experimentalCreatePrepareEditableTree({annotations:t}){return(e,n)=>{if(t.length===0)return e;let r={formats:e,text:n};return r=Z(r,t),r.formats}},__experimentalGetPropsForEditableTreeChangeHandler(t){return{removeAnnotation:t(p).__experimentalRemoveAnnotation,updateAnnotationRange:t(p).__experimentalUpdateAnnotationRange}},__experimentalCreateOnChangeEditableValue(t){return e=>{let n=$(e),{removeAnnotation:r,updateAnnotationRange:o,annotations:i}=t;tt(i,n,{removeAnnotation:r,updateAnnotationRange:o})}}};var{name:et,...nt}=V;(0,k.registerFormatType)(et,nt);var j=s(F(),1),H=s(d(),1);var rt=t=>(0,H.withSelect)((e,{clientId:n,className:r})=>({className:e(p).__experimentalGetAnnotationsForBlock(n).map(i=>"is-annotated-by-"+i.source).concat(r).filter(Boolean).join(" ")}))(t);(0,j.addFilter)("editor.BlockListBlock","core/annotations",rt);var f=s(d(),1);function L(t,e){let n=t.filter(e);return t.length===n.length?t:n}var v=(t,e)=>Object.entries(t).reduce((n,[r,o])=>({...n,[r]:e(o)}),{});function ot(t){return typeof t.start=="number"&&typeof t.end=="number"&&t.start<=t.end}function it(t={},e){switch(e.type){case"ANNOTATION_ADD":let n=e.blockClientId,r={id:e.id,blockClientId:n,richTextIdentifier:e.richTextIdentifier,source:e.source,selector:e.selector,range:e.range};if(r.selector==="range"&&!ot(r.range))return t;let o=t?.[n]??[];return{...t,[n]:[...o,r]};case"ANNOTATION_REMOVE":return v(t,i=>L(i,u=>u.id!==e.annotationId));case"ANNOTATION_UPDATE_RANGE":return v(t,i=>{let u=!1,x=i.map(A=>A.id===e.annotationId?(u=!0,{...A,range:{start:e.start,end:e.end}}):A);return u?x:i});case"ANNOTATION_REMOVE_SOURCE":return v(t,i=>L(i,u=>u.source!==e.source))}return t}var W=it;var O={};_(O,{__experimentalGetAllAnnotationsForBlock:()=>ut,__experimentalGetAnnotations:()=>st,__experimentalGetAnnotationsForBlock:()=>at,__experimentalGetAnnotationsForRichText:()=>pt});var R=s(d(),1),y=[],at=(0,R.createSelector)((t,e)=>(t?.[e]??[]).filter(n=>n.selector==="block"),(t,e)=>[t?.[e]??y]);function ut(t,e){return t?.[e]??y}var pt=(0,R.createSelector)((t,e,n)=>(t?.[e]??[]).filter(r=>r.selector==="range"&&n===r.richTextIdentifier).map(r=>{let{range:o,...i}=r;return{...o,...i}}),(t,e)=>[t?.[e]??y]);function st(t){return Object.values(t).flat()}var U={};_(U,{__experimentalAddAnnotation:()=>ct,__experimentalRemoveAnnotation:()=>ft,__experimentalRemoveAnnotationsBySource:()=>At,__experimentalUpdateAnnotationRange:()=>xt});var c,lt=new Uint8Array(16);function h(){if(!c&&(c=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!c))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return c(lt)}var a=[];for(let t=0;t<256;++t)a.push((t+256).toString(16).slice(1));function Y(t,e=0){return a[t[e+0]]+a[t[e+1]]+a[t[e+2]]+a[t[e+3]]+"-"+a[t[e+4]]+a[t[e+5]]+"-"+a[t[e+6]]+a[t[e+7]]+"-"+a[t[e+8]]+a[t[e+9]]+"-"+a[t[e+10]]+a[t[e+11]]+a[t[e+12]]+a[t[e+13]]+a[t[e+14]]+a[t[e+15]]}var mt=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),I={randomUUID:mt};function dt(t,e,n){if(I.randomUUID&&!e&&!t)return I.randomUUID();t=t||{};let r=t.random||(t.rng||h)();if(r[6]=r[6]&15|64,r[8]=r[8]&63|128,e){n=n||0;for(let o=0;o<16;++o)e[n+o]=r[o];return e}return Y(r)}var w=dt;function ct({blockClientId:t,richTextIdentifier:e=null,range:n=null,selector:r="range",source:o="default",id:i=w()}){let u={type:"ANNOTATION_ADD",id:i,blockClientId:t,richTextIdentifier:e,source:o,selector:r};return r==="range"&&(u.range=n),u}function ft(t){return{type:"ANNOTATION_REMOVE",annotationId:t}}function xt(t,e,n){return{type:"ANNOTATION_UPDATE_RANGE",annotationId:t,start:e,end:n}}function At(t){return{type:"ANNOTATION_REMOVE_SOURCE",source:t}}var b=(0,f.createReduxStore)(p,{reducer:W,selectors:O,actions:U});(0,f.register)(b);return Q(_t);})(); core-data.js000064400002310036152214270310006743 0ustar00"use strict"; var wp; (wp ||= {}).coreData = (() => { var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all2) => { for (var name in all2) __defProp(target, name, { get: all2[name], enumerable: true }); }; var __copyProps = (to, from2, except, desc) => { if (from2 && typeof from2 === "object" || typeof from2 === "function") { for (let key of __getOwnPropNames(from2)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // package-external:@wordpress/data var require_data = __commonJS({ "package-external:@wordpress/data"(exports, module) { module.exports = window.wp.data; } }); // node_modules/fast-deep-equal/es6/index.js var require_es6 = __commonJS({ "node_modules/fast-deep-equal/es6/index.js"(exports, module) { "use strict"; module.exports = function equal(a, b) { if (a === b) return true; if (a && b && typeof a == "object" && typeof b == "object") { if (a.constructor !== b.constructor) return false; var length3, i, keys2; if (Array.isArray(a)) { length3 = a.length; if (length3 != b.length) return false; for (i = length3; i-- !== 0; ) if (!equal(a[i], b[i])) return false; return true; } if (a instanceof Map && b instanceof Map) { if (a.size !== b.size) return false; for (i of a.entries()) if (!b.has(i[0])) return false; for (i of a.entries()) if (!equal(i[1], b.get(i[0]))) return false; return true; } if (a instanceof Set && b instanceof Set) { if (a.size !== b.size) return false; for (i of a.entries()) if (!b.has(i[0])) return false; return true; } if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) { length3 = a.length; if (length3 != b.length) return false; for (i = length3; i-- !== 0; ) if (a[i] !== b[i]) return false; return true; } if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags; if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf(); if (a.toString !== Object.prototype.toString) return a.toString() === b.toString(); keys2 = Object.keys(a); length3 = keys2.length; if (length3 !== Object.keys(b).length) return false; for (i = length3; i-- !== 0; ) if (!Object.prototype.hasOwnProperty.call(b, keys2[i])) return false; for (i = length3; i-- !== 0; ) { var key = keys2[i]; if (!equal(a[key], b[key])) return false; } return true; } return a !== a && b !== b; }; } }); // package-external:@wordpress/compose var require_compose = __commonJS({ "package-external:@wordpress/compose"(exports, module) { module.exports = window.wp.compose; } }); // package-external:@wordpress/undo-manager var require_undo_manager = __commonJS({ "package-external:@wordpress/undo-manager"(exports, module) { module.exports = window.wp.undoManager; } }); // node_modules/equivalent-key-map/equivalent-key-map.js var require_equivalent_key_map = __commonJS({ "node_modules/equivalent-key-map/equivalent-key-map.js"(exports, module) { "use strict"; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function(obj2) { return typeof obj2; }; } else { _typeof = function(obj2) { return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function getValuePair(instance, key) { var _map = instance._map, _arrayTreeMap = instance._arrayTreeMap, _objectTreeMap = instance._objectTreeMap; if (_map.has(key)) { return _map.get(key); } var properties = Object.keys(key).sort(); var map2 = Array.isArray(key) ? _arrayTreeMap : _objectTreeMap; for (var i = 0; i < properties.length; i++) { var property = properties[i]; map2 = map2.get(property); if (map2 === void 0) { return; } var propertyValue = key[property]; map2 = map2.get(propertyValue); if (map2 === void 0) { return; } } var valuePair = map2.get("_ekm_value"); if (!valuePair) { return; } _map.delete(valuePair[0]); valuePair[0] = key; map2.set("_ekm_value", valuePair); _map.set(key, valuePair); return valuePair; } var EquivalentKeyMap2 = /* @__PURE__ */ (function() { function EquivalentKeyMap3(iterable) { _classCallCheck(this, EquivalentKeyMap3); this.clear(); if (iterable instanceof EquivalentKeyMap3) { var iterablePairs = []; iterable.forEach(function(value, key) { iterablePairs.push([key, value]); }); iterable = iterablePairs; } if (iterable != null) { for (var i = 0; i < iterable.length; i++) { this.set(iterable[i][0], iterable[i][1]); } } } _createClass(EquivalentKeyMap3, [{ key: "set", /** * Add or update an element with a specified key and value. * * @param {*} key The key of the element to add. * @param {*} value The value of the element to add. * * @return {EquivalentKeyMap} Map instance. */ value: function set(key, value) { if (key === null || _typeof(key) !== "object") { this._map.set(key, value); return this; } var properties = Object.keys(key).sort(); var valuePair = [key, value]; var map2 = Array.isArray(key) ? this._arrayTreeMap : this._objectTreeMap; for (var i = 0; i < properties.length; i++) { var property = properties[i]; if (!map2.has(property)) { map2.set(property, new EquivalentKeyMap3()); } map2 = map2.get(property); var propertyValue = key[property]; if (!map2.has(propertyValue)) { map2.set(propertyValue, new EquivalentKeyMap3()); } map2 = map2.get(propertyValue); } var previousValuePair = map2.get("_ekm_value"); if (previousValuePair) { this._map.delete(previousValuePair[0]); } map2.set("_ekm_value", valuePair); this._map.set(key, valuePair); return this; } /** * Returns a specified element. * * @param {*} key The key of the element to return. * * @return {?*} The element associated with the specified key or undefined * if the key can't be found. */ }, { key: "get", value: function get(key) { if (key === null || _typeof(key) !== "object") { return this._map.get(key); } var valuePair = getValuePair(this, key); if (valuePair) { return valuePair[1]; } } /** * Returns a boolean indicating whether an element with the specified key * exists or not. * * @param {*} key The key of the element to test for presence. * * @return {boolean} Whether an element with the specified key exists. */ }, { key: "has", value: function has(key) { if (key === null || _typeof(key) !== "object") { return this._map.has(key); } return getValuePair(this, key) !== void 0; } /** * Removes the specified element. * * @param {*} key The key of the element to remove. * * @return {boolean} Returns true if an element existed and has been * removed, or false if the element does not exist. */ }, { key: "delete", value: function _delete(key) { if (!this.has(key)) { return false; } this.set(key, void 0); return true; } /** * Executes a provided function once per each key/value pair, in insertion * order. * * @param {Function} callback Function to execute for each element. * @param {*} thisArg Value to use as `this` when executing * `callback`. */ }, { key: "forEach", value: function forEach2(callback) { var _this = this; var thisArg = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this; this._map.forEach(function(value, key) { if (key !== null && _typeof(key) === "object") { value = value[1]; } callback.call(thisArg, value, key, _this); }); } /** * Removes all elements. */ }, { key: "clear", value: function clear() { this._map = /* @__PURE__ */ new Map(); this._arrayTreeMap = /* @__PURE__ */ new Map(); this._objectTreeMap = /* @__PURE__ */ new Map(); } }, { key: "size", get: function get() { return this._map.size; } }]); return EquivalentKeyMap3; })(); module.exports = EquivalentKeyMap2; } }); // package-external:@wordpress/url var require_url = __commonJS({ "package-external:@wordpress/url"(exports, module) { module.exports = window.wp.url; } }); // package-external:@wordpress/api-fetch var require_api_fetch = __commonJS({ "package-external:@wordpress/api-fetch"(exports, module) { module.exports = window.wp.apiFetch; } }); // package-external:@wordpress/blocks var require_blocks = __commonJS({ "package-external:@wordpress/blocks"(exports, module) { module.exports = window.wp.blocks; } }); // package-external:@wordpress/i18n var require_i18n = __commonJS({ "package-external:@wordpress/i18n"(exports, module) { module.exports = window.wp.i18n; } }); // package-external:@wordpress/private-apis var require_private_apis = __commonJS({ "package-external:@wordpress/private-apis"(exports, module) { module.exports = window.wp.privateApis; } }); // package-external:@wordpress/hooks var require_hooks = __commonJS({ "package-external:@wordpress/hooks"(exports, module) { module.exports = window.wp.hooks; } }); // package-external:@wordpress/block-editor var require_block_editor = __commonJS({ "package-external:@wordpress/block-editor"(exports, module) { module.exports = window.wp.blockEditor; } }); // package-external:@wordpress/rich-text var require_rich_text = __commonJS({ "package-external:@wordpress/rich-text"(exports, module) { module.exports = window.wp.richText; } }); // package-external:@wordpress/deprecated var require_deprecated = __commonJS({ "package-external:@wordpress/deprecated"(exports, module) { module.exports = window.wp.deprecated; } }); // package-external:@wordpress/html-entities var require_html_entities = __commonJS({ "package-external:@wordpress/html-entities"(exports, module) { module.exports = window.wp.htmlEntities; } }); // package-external:@wordpress/element var require_element = __commonJS({ "package-external:@wordpress/element"(exports, module) { module.exports = window.wp.element; } }); // vendor-external:react/jsx-runtime var require_jsx_runtime = __commonJS({ "vendor-external:react/jsx-runtime"(exports, module) { module.exports = window.ReactJSXRuntime; } }); // package-external:@wordpress/warning var require_warning = __commonJS({ "package-external:@wordpress/warning"(exports, module) { module.exports = window.wp.warning; } }); // packages/core-data/build-module/index.mjs var index_exports = {}; __export(index_exports, { EntityProvider: () => EntityProvider, __experimentalFetchLinkSuggestions: () => fetchLinkSuggestions, __experimentalFetchUrlData: () => experimental_fetch_url_data_default, __experimentalUseEntityRecord: () => __experimentalUseEntityRecord, __experimentalUseEntityRecords: () => __experimentalUseEntityRecords, __experimentalUseResourcePermissions: () => __experimentalUseResourcePermissions, fetchBlockPatterns: () => fetchBlockPatterns, privateApis: () => privateApis2, store: () => store, useEntityBlockEditor: () => useEntityBlockEditor, useEntityId: () => useEntityId, useEntityProp: () => useEntityProp, useEntityRecord: () => useEntityRecord, useEntityRecords: () => useEntityRecords, useResourcePermissions: () => use_resource_permissions_default }); var import_data16 = __toESM(require_data(), 1); // packages/core-data/build-module/reducer.mjs var import_es66 = __toESM(require_es6(), 1); var import_compose2 = __toESM(require_compose(), 1); var import_data8 = __toESM(require_data(), 1); var import_undo_manager2 = __toESM(require_undo_manager(), 1); // packages/core-data/build-module/utils/conservative-map-item.mjs var import_es6 = __toESM(require_es6(), 1); function conservativeMapItem(item, nextItem) { if (!item) { return nextItem; } let hasChanges = false; const result = {}; for (const key in nextItem) { if ((0, import_es6.default)(item[key], nextItem[key])) { result[key] = item[key]; } else { hasChanges = true; result[key] = nextItem[key]; } } if (!hasChanges) { return item; } for (const key in item) { if (!result.hasOwnProperty(key)) { result[key] = item[key]; } } return result; } // packages/core-data/build-module/utils/get-normalized-comma-separable.mjs function getNormalizedCommaSeparable(value) { if (typeof value === "string") { return value.split(","); } else if (Array.isArray(value)) { return value; } return null; } var get_normalized_comma_separable_default = getNormalizedCommaSeparable; // packages/core-data/build-module/utils/if-matching-action.mjs var ifMatchingAction = (isMatch) => (reducer) => (state, action) => { if (state === void 0 || isMatch(action)) { return reducer(state, action); } return state; }; var if_matching_action_default = ifMatchingAction; // packages/core-data/build-module/utils/forward-resolver.mjs var forwardResolver = (resolverName) => (...args2) => async ({ resolveSelect: resolveSelect2 }) => { await resolveSelect2[resolverName](...args2); }; var forward_resolver_default = forwardResolver; // packages/core-data/build-module/utils/on-sub-key.mjs var onSubKey = (actionProperty) => (reducer) => (state = {}, action) => { const key = action[actionProperty]; if (key === void 0) { return state; } const nextKeyState = reducer(state[key], action); if (nextKeyState === state[key]) { return state; } return { ...state, [key]: nextKeyState }; }; var on_sub_key_default = onSubKey; // packages/core-data/build-module/utils/replace-action.mjs var replaceAction = (replacer) => (reducer) => (state, action) => { return reducer(state, replacer(action)); }; var replace_action_default = replaceAction; // packages/core-data/build-module/utils/with-weak-map-cache.mjs function withWeakMapCache(fn) { const cache3 = /* @__PURE__ */ new WeakMap(); return (key) => { let value; if (cache3.has(key)) { value = cache3.get(key); } else { value = fn(key); if (key !== null && typeof key === "object") { cache3.set(key, value); } } return value; }; } var with_weak_map_cache_default = withWeakMapCache; // packages/core-data/build-module/utils/is-raw-attribute.mjs function isRawAttribute(entity2, attribute) { return (entity2.rawAttributes || []).includes(attribute); } // packages/core-data/build-module/utils/set-nested-value.mjs function setNestedValue(object, path, value) { if (!object || typeof object !== "object") { return object; } const normalizedPath = Array.isArray(path) ? path : path.split("."); normalizedPath.reduce((acc, key, idx) => { if (acc[key] === void 0) { if (Number.isInteger(normalizedPath[idx + 1])) { acc[key] = []; } else { acc[key] = {}; } } if (idx === normalizedPath.length - 1) { acc[key] = value; } return acc[key]; }, object); return object; } // packages/core-data/build-module/utils/get-nested-value.mjs function getNestedValue(object, path, defaultValue) { if (!object || typeof object !== "object" || typeof path !== "string" && !Array.isArray(path)) { return object; } const normalizedPath = Array.isArray(path) ? path : path.split("."); let value = object; normalizedPath.forEach((fieldName) => { value = value?.[fieldName]; }); return value !== void 0 ? value : defaultValue; } // packages/core-data/build-module/utils/is-numeric-id.mjs function isNumericID(id2) { return /^\s*\d+\s*$/.test(id2); } // packages/core-data/build-module/utils/user-permissions.mjs var ALLOWED_RESOURCE_ACTIONS = [ "create", "read", "update", "delete" ]; function getUserPermissionsFromAllowHeader(allowedMethods) { const permissions = {}; if (!allowedMethods) { return permissions; } const methods = { create: "POST", read: "GET", update: "PUT", delete: "DELETE" }; for (const [actionName, methodName] of Object.entries(methods)) { permissions[actionName] = allowedMethods.includes(methodName); } return permissions; } function getUserPermissionCacheKey(action, resource, id2) { const key = (typeof resource === "object" ? [action, resource.kind, resource.name, resource.id] : [action, resource, id2]).filter(Boolean).join("/"); return key; } // packages/core-data/build-module/utils/receive-intermediate-results.mjs var RECEIVE_INTERMEDIATE_RESULTS = /* @__PURE__ */ Symbol( "RECEIVE_INTERMEDIATE_RESULTS" ); // packages/core-data/build-module/queried-data/actions.mjs function receiveItems(items2, edits, meta) { return { type: "RECEIVE_ITEMS", items: items2, persistedEdits: edits, meta }; } function removeItems(kind, name, records, invalidateCache = false) { return { type: "REMOVE_ITEMS", itemIds: Array.isArray(records) ? records : [records], kind, name, invalidateCache }; } function receiveQueriedItems(items2, query = {}, edits, meta) { return { ...receiveItems(items2, edits, meta), query }; } // packages/core-data/build-module/queried-data/selectors.mjs var import_equivalent_key_map = __toESM(require_equivalent_key_map(), 1); var import_data = __toESM(require_data(), 1); // packages/core-data/build-module/queried-data/get-query-parts.mjs var import_url = __toESM(require_url(), 1); function getQueryParts(query) { const parts = { stableKey: "", page: 1, perPage: 10, fields: null, include: null, context: "default" }; const keys2 = Object.keys(query).sort(); for (let i = 0; i < keys2.length; i++) { const key = keys2[i]; let value = query[key]; switch (key) { case "page": parts[key] = Number(value); break; case "per_page": parts.perPage = Number(value); break; case "context": parts.context = value; break; default: if (key === "_fields") { parts.fields = get_normalized_comma_separable_default(value) ?? []; value = parts.fields.join(); } if (key === "include") { if (typeof value === "number") { value = value.toString(); } parts.include = (get_normalized_comma_separable_default(value) ?? []).map(Number); value = parts.include.join(); } parts.stableKey += (parts.stableKey ? "&" : "") + (0, import_url.addQueryArgs)("", { [key]: value }).slice(1); } } return parts; } var get_query_parts_default = with_weak_map_cache_default(getQueryParts); // packages/core-data/build-module/queried-data/selectors.mjs var queriedItemsCacheByState = /* @__PURE__ */ new WeakMap(); function getQueriedItemsUncached(state, query) { const { stableKey, page, perPage, include, fields, context } = get_query_parts_default(query); let itemIds; if (state.queries?.[context]?.[stableKey]) { itemIds = state.queries[context][stableKey].itemIds; } if (!itemIds) { return null; } const startOffset = perPage === -1 ? 0 : (page - 1) * perPage; const endOffset = perPage === -1 ? itemIds.length : Math.min(startOffset + perPage, itemIds.length); const items2 = []; for (let i = startOffset; i < endOffset; i++) { const itemId = itemIds[i]; if (Array.isArray(include) && !include.includes(itemId)) { continue; } if (itemId === void 0) { continue; } if (!state.items[context]?.hasOwnProperty(itemId)) { return null; } const item = state.items[context][itemId]; let filteredItem; if (Array.isArray(fields)) { filteredItem = {}; for (let f = 0; f < fields.length; f++) { const field = fields[f].split("."); let value = item; field.forEach((fieldName) => { value = value?.[fieldName]; }); setNestedValue(filteredItem, field, value); } } else { if (!state.itemIsComplete[context]?.[itemId]) { return null; } filteredItem = item; } items2.push(filteredItem); } return items2; } var getQueriedItems = (0, import_data.createSelector)((state, query = {}) => { let queriedItemsCache = queriedItemsCacheByState.get(state); if (queriedItemsCache) { const queriedItems = queriedItemsCache.get(query); if (queriedItems !== void 0) { return queriedItems; } } else { queriedItemsCache = new import_equivalent_key_map.default(); queriedItemsCacheByState.set(state, queriedItemsCache); } const items2 = getQueriedItemsUncached(state, query); queriedItemsCache.set(query, items2); return items2; }); function getQueriedTotalItems(state, query = {}) { const { stableKey, context } = get_query_parts_default(query); return state.queries?.[context]?.[stableKey]?.meta?.totalItems ?? null; } function getQueriedTotalPages(state, query = {}) { const { stableKey, context } = get_query_parts_default(query); return state.queries?.[context]?.[stableKey]?.meta?.totalPages ?? null; } // packages/core-data/build-module/queried-data/reducer.mjs var import_data7 = __toESM(require_data(), 1); var import_compose = __toESM(require_compose(), 1); // node_modules/tslib/tslib.es6.mjs var __assign = function() { __assign = Object.assign || function __assign2(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; // node_modules/lower-case/dist.es2015/index.js function lowerCase(str) { return str.toLowerCase(); } // node_modules/no-case/dist.es2015/index.js var DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g]; var DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi; function noCase(input, options) { if (options === void 0) { options = {}; } var _a = options.splitRegexp, splitRegexp = _a === void 0 ? DEFAULT_SPLIT_REGEXP : _a, _b = options.stripRegexp, stripRegexp = _b === void 0 ? DEFAULT_STRIP_REGEXP : _b, _c = options.transform, transform = _c === void 0 ? lowerCase : _c, _d = options.delimiter, delimiter = _d === void 0 ? " " : _d; var result = replace(replace(input, splitRegexp, "$1\0$2"), stripRegexp, "\0"); var start = 0; var end = result.length; while (result.charAt(start) === "\0") start++; while (result.charAt(end - 1) === "\0") end--; return result.slice(start, end).split("\0").map(transform).join(delimiter); } function replace(input, re, value) { if (re instanceof RegExp) return input.replace(re, value); return re.reduce(function(input2, re2) { return input2.replace(re2, value); }, input); } // node_modules/pascal-case/dist.es2015/index.js function pascalCaseTransform(input, index) { var firstChar = input.charAt(0); var lowerChars = input.substr(1).toLowerCase(); if (index > 0 && firstChar >= "0" && firstChar <= "9") { return "_" + firstChar + lowerChars; } return "" + firstChar.toUpperCase() + lowerChars; } function pascalCase(input, options) { if (options === void 0) { options = {}; } return noCase(input, __assign({ delimiter: "", transform: pascalCaseTransform }, options)); } // node_modules/camel-case/dist.es2015/index.js function camelCaseTransform(input, index) { if (index === 0) return input.toLowerCase(); return pascalCaseTransform(input, index); } function camelCase(input, options) { if (options === void 0) { options = {}; } return pascalCase(input, __assign({ transform: camelCaseTransform }, options)); } // node_modules/upper-case-first/dist.es2015/index.js function upperCaseFirst(input) { return input.charAt(0).toUpperCase() + input.substr(1); } // node_modules/capital-case/dist.es2015/index.js function capitalCaseTransform(input) { return upperCaseFirst(input.toLowerCase()); } function capitalCase(input, options) { if (options === void 0) { options = {}; } return noCase(input, __assign({ delimiter: " ", transform: capitalCaseTransform }, options)); } // packages/core-data/build-module/entities.mjs var import_api_fetch2 = __toESM(require_api_fetch(), 1); var import_blocks4 = __toESM(require_blocks(), 1); var import_i18n = __toESM(require_i18n(), 1); // packages/core-data/build-module/awareness/post-editor-awareness.mjs var import_data5 = __toESM(require_data(), 1); // node_modules/yjs/dist/yjs.mjs var yjs_exports = {}; __export(yjs_exports, { AbsolutePosition: () => AbsolutePosition, AbstractConnector: () => AbstractConnector, AbstractStruct: () => AbstractStruct, AbstractType: () => AbstractType, Array: () => YArray, ContentAny: () => ContentAny, ContentBinary: () => ContentBinary, ContentDeleted: () => ContentDeleted, ContentDoc: () => ContentDoc, ContentEmbed: () => ContentEmbed, ContentFormat: () => ContentFormat, ContentJSON: () => ContentJSON, ContentString: () => ContentString, ContentType: () => ContentType, Doc: () => Doc, GC: () => GC, ID: () => ID, Item: () => Item, Map: () => YMap, PermanentUserData: () => PermanentUserData, RelativePosition: () => RelativePosition, Skip: () => Skip, Snapshot: () => Snapshot, Text: () => YText, Transaction: () => Transaction, UndoManager: () => UndoManager, UpdateDecoderV1: () => UpdateDecoderV1, UpdateDecoderV2: () => UpdateDecoderV2, UpdateEncoderV1: () => UpdateEncoderV1, UpdateEncoderV2: () => UpdateEncoderV2, XmlElement: () => YXmlElement, XmlFragment: () => YXmlFragment, XmlHook: () => YXmlHook, XmlText: () => YXmlText, YArrayEvent: () => YArrayEvent, YEvent: () => YEvent, YMapEvent: () => YMapEvent, YTextEvent: () => YTextEvent, YXmlEvent: () => YXmlEvent, applyUpdate: () => applyUpdate, applyUpdateV2: () => applyUpdateV2, cleanupYTextFormatting: () => cleanupYTextFormatting, compareIDs: () => compareIDs, compareRelativePositions: () => compareRelativePositions, convertUpdateFormatV1ToV2: () => convertUpdateFormatV1ToV2, convertUpdateFormatV2ToV1: () => convertUpdateFormatV2ToV1, createAbsolutePositionFromRelativePosition: () => createAbsolutePositionFromRelativePosition, createDeleteSet: () => createDeleteSet, createDeleteSetFromStructStore: () => createDeleteSetFromStructStore, createDocFromSnapshot: () => createDocFromSnapshot, createID: () => createID, createRelativePositionFromJSON: () => createRelativePositionFromJSON, createRelativePositionFromTypeIndex: () => createRelativePositionFromTypeIndex, createSnapshot: () => createSnapshot, decodeRelativePosition: () => decodeRelativePosition, decodeSnapshot: () => decodeSnapshot, decodeSnapshotV2: () => decodeSnapshotV2, decodeStateVector: () => decodeStateVector, decodeUpdate: () => decodeUpdate, decodeUpdateV2: () => decodeUpdateV2, diffUpdate: () => diffUpdate, diffUpdateV2: () => diffUpdateV2, emptySnapshot: () => emptySnapshot, encodeRelativePosition: () => encodeRelativePosition, encodeSnapshot: () => encodeSnapshot, encodeSnapshotV2: () => encodeSnapshotV2, encodeStateAsUpdate: () => encodeStateAsUpdate, encodeStateAsUpdateV2: () => encodeStateAsUpdateV2, encodeStateVector: () => encodeStateVector, encodeStateVectorFromUpdate: () => encodeStateVectorFromUpdate, encodeStateVectorFromUpdateV2: () => encodeStateVectorFromUpdateV2, equalDeleteSets: () => equalDeleteSets, equalSnapshots: () => equalSnapshots, findIndexSS: () => findIndexSS, findRootTypeKey: () => findRootTypeKey, getItem: () => getItem, getItemCleanEnd: () => getItemCleanEnd, getItemCleanStart: () => getItemCleanStart, getState: () => getState, getTypeChildren: () => getTypeChildren, isDeleted: () => isDeleted, isParentOf: () => isParentOf, iterateDeletedStructs: () => iterateDeletedStructs, logType: () => logType, logUpdate: () => logUpdate, logUpdateV2: () => logUpdateV2, mergeDeleteSets: () => mergeDeleteSets, mergeUpdates: () => mergeUpdates, mergeUpdatesV2: () => mergeUpdatesV2, obfuscateUpdate: () => obfuscateUpdate, obfuscateUpdateV2: () => obfuscateUpdateV2, parseUpdateMeta: () => parseUpdateMeta, parseUpdateMetaV2: () => parseUpdateMetaV2, readUpdate: () => readUpdate, readUpdateV2: () => readUpdateV2, relativePositionToJSON: () => relativePositionToJSON, snapshot: () => snapshot, snapshotContainsUpdate: () => snapshotContainsUpdate, transact: () => transact, tryGc: () => tryGc, typeListToArraySnapshot: () => typeListToArraySnapshot, typeMapGetAllSnapshot: () => typeMapGetAllSnapshot, typeMapGetSnapshot: () => typeMapGetSnapshot }); // node_modules/lib0/map.js var create = () => /* @__PURE__ */ new Map(); var copy = (m) => { const r = create(); m.forEach((v, k) => { r.set(k, v); }); return r; }; var setIfUndefined = (map2, key, createT) => { let set = map2.get(key); if (set === void 0) { map2.set(key, set = createT()); } return set; }; var map = (m, f) => { const res = []; for (const [key, value] of m) { res.push(f(value, key)); } return res; }; var any = (m, f) => { for (const [key, value] of m) { if (f(value, key)) { return true; } } return false; }; // node_modules/lib0/set.js var create2 = () => /* @__PURE__ */ new Set(); // node_modules/lib0/array.js var last = (arr) => arr[arr.length - 1]; var appendTo = (dest, src) => { for (let i = 0; i < src.length; i++) { dest.push(src[i]); } }; var from = Array.from; var some = (arr, f) => { for (let i = 0; i < arr.length; i++) { if (f(arr[i], i, arr)) { return true; } } return false; }; var unfold = (len, f) => { const array = new Array(len); for (let i = 0; i < len; i++) { array[i] = f(i, array); } return array; }; var isArray = Array.isArray; // node_modules/lib0/observable.js var ObservableV2 = class { constructor() { this._observers = create(); } /** * @template {keyof EVENTS & string} NAME * @param {NAME} name * @param {EVENTS[NAME]} f */ on(name, f) { setIfUndefined( this._observers, /** @type {string} */ name, create2 ).add(f); return f; } /** * @template {keyof EVENTS & string} NAME * @param {NAME} name * @param {EVENTS[NAME]} f */ once(name, f) { const _f = (...args2) => { this.off( name, /** @type {any} */ _f ); f(...args2); }; this.on( name, /** @type {any} */ _f ); } /** * @template {keyof EVENTS & string} NAME * @param {NAME} name * @param {EVENTS[NAME]} f */ off(name, f) { const observers = this._observers.get(name); if (observers !== void 0) { observers.delete(f); if (observers.size === 0) { this._observers.delete(name); } } } /** * Emit a named event. All registered event listeners that listen to the * specified name will receive the event. * * @todo This should catch exceptions * * @template {keyof EVENTS & string} NAME * @param {NAME} name The event name. * @param {Parameters} args The arguments that are applied to the event listener. */ emit(name, args2) { return from((this._observers.get(name) || create()).values()).forEach((f) => f(...args2)); } destroy() { this._observers = create(); } }; var Observable = class { constructor() { this._observers = create(); } /** * @param {N} name * @param {function} f */ on(name, f) { setIfUndefined(this._observers, name, create2).add(f); } /** * @param {N} name * @param {function} f */ once(name, f) { const _f = (...args2) => { this.off(name, _f); f(...args2); }; this.on(name, _f); } /** * @param {N} name * @param {function} f */ off(name, f) { const observers = this._observers.get(name); if (observers !== void 0) { observers.delete(f); if (observers.size === 0) { this._observers.delete(name); } } } /** * Emit a named event. All registered event listeners that listen to the * specified name will receive the event. * * @todo This should catch exceptions * * @param {N} name The event name. * @param {Array} args The arguments that are applied to the event listener. */ emit(name, args2) { return from((this._observers.get(name) || create()).values()).forEach((f) => f(...args2)); } destroy() { this._observers = create(); } }; // node_modules/lib0/math.js var floor = Math.floor; var abs = Math.abs; var min = (a, b) => a < b ? a : b; var max = (a, b) => a > b ? a : b; var isNaN2 = Number.isNaN; var isNegativeZero = (n) => n !== 0 ? n < 0 : 1 / n < 0; // node_modules/lib0/binary.js var BIT1 = 1; var BIT2 = 2; var BIT3 = 4; var BIT4 = 8; var BIT6 = 32; var BIT7 = 64; var BIT8 = 128; var BIT18 = 1 << 17; var BIT19 = 1 << 18; var BIT20 = 1 << 19; var BIT21 = 1 << 20; var BIT22 = 1 << 21; var BIT23 = 1 << 22; var BIT24 = 1 << 23; var BIT25 = 1 << 24; var BIT26 = 1 << 25; var BIT27 = 1 << 26; var BIT28 = 1 << 27; var BIT29 = 1 << 28; var BIT30 = 1 << 29; var BIT31 = 1 << 30; var BIT32 = 1 << 31; var BITS5 = 31; var BITS6 = 63; var BITS7 = 127; var BITS17 = BIT18 - 1; var BITS18 = BIT19 - 1; var BITS19 = BIT20 - 1; var BITS20 = BIT21 - 1; var BITS21 = BIT22 - 1; var BITS22 = BIT23 - 1; var BITS23 = BIT24 - 1; var BITS24 = BIT25 - 1; var BITS25 = BIT26 - 1; var BITS26 = BIT27 - 1; var BITS27 = BIT28 - 1; var BITS28 = BIT29 - 1; var BITS29 = BIT30 - 1; var BITS30 = BIT31 - 1; var BITS31 = 2147483647; // node_modules/lib0/number.js var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER; var MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER; var LOWEST_INT32 = 1 << 31; var isInteger = Number.isInteger || ((num) => typeof num === "number" && isFinite(num) && floor(num) === num); var isNaN3 = Number.isNaN; var parseInt2 = Number.parseInt; // node_modules/lib0/string.js var fromCharCode = String.fromCharCode; var fromCodePoint = String.fromCodePoint; var MAX_UTF16_CHARACTER = fromCharCode(65535); var toLowerCase = (s) => s.toLowerCase(); var trimLeftRegex = /^\s*/g; var trimLeft = (s) => s.replace(trimLeftRegex, ""); var fromCamelCaseRegex = /([A-Z])/g; var fromCamelCase = (s, separator) => trimLeft(s.replace(fromCamelCaseRegex, (match) => `${separator}${toLowerCase(match)}`)); var _encodeUtf8Polyfill = (str) => { const encodedString = unescape(encodeURIComponent(str)); const len = encodedString.length; const buf = new Uint8Array(len); for (let i = 0; i < len; i++) { buf[i] = /** @type {number} */ encodedString.codePointAt(i); } return buf; }; var utf8TextEncoder = ( /** @type {TextEncoder} */ typeof TextEncoder !== "undefined" ? new TextEncoder() : null ); var _encodeUtf8Native = (str) => utf8TextEncoder.encode(str); var encodeUtf8 = utf8TextEncoder ? _encodeUtf8Native : _encodeUtf8Polyfill; var utf8TextDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }); if (utf8TextDecoder && utf8TextDecoder.decode(new Uint8Array()).length === 1) { utf8TextDecoder = null; } var repeat = (source, n) => unfold(n, () => source).join(""); // node_modules/lib0/encoding.js var Encoder = class { constructor() { this.cpos = 0; this.cbuf = new Uint8Array(100); this.bufs = []; } }; var createEncoder = () => new Encoder(); var length = (encoder) => { let len = encoder.cpos; for (let i = 0; i < encoder.bufs.length; i++) { len += encoder.bufs[i].length; } return len; }; var toUint8Array = (encoder) => { const uint8arr = new Uint8Array(length(encoder)); let curPos = 0; for (let i = 0; i < encoder.bufs.length; i++) { const d = encoder.bufs[i]; uint8arr.set(d, curPos); curPos += d.length; } uint8arr.set(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos), curPos); return uint8arr; }; var verifyLen = (encoder, len) => { const bufferLen = encoder.cbuf.length; if (bufferLen - encoder.cpos < len) { encoder.bufs.push(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos)); encoder.cbuf = new Uint8Array(max(bufferLen, len) * 2); encoder.cpos = 0; } }; var write = (encoder, num) => { const bufferLen = encoder.cbuf.length; if (encoder.cpos === bufferLen) { encoder.bufs.push(encoder.cbuf); encoder.cbuf = new Uint8Array(bufferLen * 2); encoder.cpos = 0; } encoder.cbuf[encoder.cpos++] = num; }; var writeUint8 = write; var writeVarUint = (encoder, num) => { while (num > BITS7) { write(encoder, BIT8 | BITS7 & num); num = floor(num / 128); } write(encoder, BITS7 & num); }; var writeVarInt = (encoder, num) => { const isNegative = isNegativeZero(num); if (isNegative) { num = -num; } write(encoder, (num > BITS6 ? BIT8 : 0) | (isNegative ? BIT7 : 0) | BITS6 & num); num = floor(num / 64); while (num > 0) { write(encoder, (num > BITS7 ? BIT8 : 0) | BITS7 & num); num = floor(num / 128); } }; var _strBuffer = new Uint8Array(3e4); var _maxStrBSize = _strBuffer.length / 3; var _writeVarStringNative = (encoder, str) => { if (str.length < _maxStrBSize) { const written = utf8TextEncoder.encodeInto(str, _strBuffer).written || 0; writeVarUint(encoder, written); for (let i = 0; i < written; i++) { write(encoder, _strBuffer[i]); } } else { writeVarUint8Array(encoder, encodeUtf8(str)); } }; var _writeVarStringPolyfill = (encoder, str) => { const encodedString = unescape(encodeURIComponent(str)); const len = encodedString.length; writeVarUint(encoder, len); for (let i = 0; i < len; i++) { write( encoder, /** @type {number} */ encodedString.codePointAt(i) ); } }; var writeVarString = utf8TextEncoder && /** @type {any} */ utf8TextEncoder.encodeInto ? _writeVarStringNative : _writeVarStringPolyfill; var writeBinaryEncoder = (encoder, append2) => writeUint8Array(encoder, toUint8Array(append2)); var writeUint8Array = (encoder, uint8Array) => { const bufferLen = encoder.cbuf.length; const cpos = encoder.cpos; const leftCopyLen = min(bufferLen - cpos, uint8Array.length); const rightCopyLen = uint8Array.length - leftCopyLen; encoder.cbuf.set(uint8Array.subarray(0, leftCopyLen), cpos); encoder.cpos += leftCopyLen; if (rightCopyLen > 0) { encoder.bufs.push(encoder.cbuf); encoder.cbuf = new Uint8Array(max(bufferLen * 2, rightCopyLen)); encoder.cbuf.set(uint8Array.subarray(leftCopyLen)); encoder.cpos = rightCopyLen; } }; var writeVarUint8Array = (encoder, uint8Array) => { writeVarUint(encoder, uint8Array.byteLength); writeUint8Array(encoder, uint8Array); }; var writeOnDataView = (encoder, len) => { verifyLen(encoder, len); const dview = new DataView(encoder.cbuf.buffer, encoder.cpos, len); encoder.cpos += len; return dview; }; var writeFloat32 = (encoder, num) => writeOnDataView(encoder, 4).setFloat32(0, num, false); var writeFloat64 = (encoder, num) => writeOnDataView(encoder, 8).setFloat64(0, num, false); var writeBigInt64 = (encoder, num) => ( /** @type {any} */ writeOnDataView(encoder, 8).setBigInt64(0, num, false) ); var floatTestBed = new DataView(new ArrayBuffer(4)); var isFloat32 = (num) => { floatTestBed.setFloat32(0, num); return floatTestBed.getFloat32(0) === num; }; var writeAny = (encoder, data) => { switch (typeof data) { case "string": write(encoder, 119); writeVarString(encoder, data); break; case "number": if (isInteger(data) && abs(data) <= BITS31) { write(encoder, 125); writeVarInt(encoder, data); } else if (isFloat32(data)) { write(encoder, 124); writeFloat32(encoder, data); } else { write(encoder, 123); writeFloat64(encoder, data); } break; case "bigint": write(encoder, 122); writeBigInt64(encoder, data); break; case "object": if (data === null) { write(encoder, 126); } else if (isArray(data)) { write(encoder, 117); writeVarUint(encoder, data.length); for (let i = 0; i < data.length; i++) { writeAny(encoder, data[i]); } } else if (data instanceof Uint8Array) { write(encoder, 116); writeVarUint8Array(encoder, data); } else { write(encoder, 118); const keys2 = Object.keys(data); writeVarUint(encoder, keys2.length); for (let i = 0; i < keys2.length; i++) { const key = keys2[i]; writeVarString(encoder, key); writeAny(encoder, data[key]); } } break; case "boolean": write(encoder, data ? 120 : 121); break; default: write(encoder, 127); } }; var RleEncoder = class extends Encoder { /** * @param {function(Encoder, T):void} writer */ constructor(writer) { super(); this.w = writer; this.s = null; this.count = 0; } /** * @param {T} v */ write(v) { if (this.s === v) { this.count++; } else { if (this.count > 0) { writeVarUint(this, this.count - 1); } this.count = 1; this.w(this, v); this.s = v; } } }; var flushUintOptRleEncoder = (encoder) => { if (encoder.count > 0) { writeVarInt(encoder.encoder, encoder.count === 1 ? encoder.s : -encoder.s); if (encoder.count > 1) { writeVarUint(encoder.encoder, encoder.count - 2); } } }; var UintOptRleEncoder = class { constructor() { this.encoder = new Encoder(); this.s = 0; this.count = 0; } /** * @param {number} v */ write(v) { if (this.s === v) { this.count++; } else { flushUintOptRleEncoder(this); this.count = 1; this.s = v; } } /** * Flush the encoded state and transform this to a Uint8Array. * * Note that this should only be called once. */ toUint8Array() { flushUintOptRleEncoder(this); return toUint8Array(this.encoder); } }; var flushIntDiffOptRleEncoder = (encoder) => { if (encoder.count > 0) { const encodedDiff = encoder.diff * 2 + (encoder.count === 1 ? 0 : 1); writeVarInt(encoder.encoder, encodedDiff); if (encoder.count > 1) { writeVarUint(encoder.encoder, encoder.count - 2); } } }; var IntDiffOptRleEncoder = class { constructor() { this.encoder = new Encoder(); this.s = 0; this.count = 0; this.diff = 0; } /** * @param {number} v */ write(v) { if (this.diff === v - this.s) { this.s = v; this.count++; } else { flushIntDiffOptRleEncoder(this); this.count = 1; this.diff = v - this.s; this.s = v; } } /** * Flush the encoded state and transform this to a Uint8Array. * * Note that this should only be called once. */ toUint8Array() { flushIntDiffOptRleEncoder(this); return toUint8Array(this.encoder); } }; var StringEncoder = class { constructor() { this.sarr = []; this.s = ""; this.lensE = new UintOptRleEncoder(); } /** * @param {string} string */ write(string) { this.s += string; if (this.s.length > 19) { this.sarr.push(this.s); this.s = ""; } this.lensE.write(string.length); } toUint8Array() { const encoder = new Encoder(); this.sarr.push(this.s); this.s = ""; writeVarString(encoder, this.sarr.join("")); writeUint8Array(encoder, this.lensE.toUint8Array()); return toUint8Array(encoder); } }; // node_modules/lib0/error.js var create3 = (s) => new Error(s); var methodUnimplemented = () => { throw create3("Method unimplemented"); }; var unexpectedCase = () => { throw create3("Unexpected case"); }; // node_modules/lib0/decoding.js var errorUnexpectedEndOfArray = create3("Unexpected end of array"); var errorIntegerOutOfRange = create3("Integer out of Range"); var Decoder = class { /** * @param {Uint8Array} uint8Array Binary data to decode */ constructor(uint8Array) { this.arr = uint8Array; this.pos = 0; } }; var createDecoder = (uint8Array) => new Decoder(uint8Array); var hasContent = (decoder) => decoder.pos !== decoder.arr.length; var readUint8Array = (decoder, len) => { const view = new Uint8Array(decoder.arr.buffer, decoder.pos + decoder.arr.byteOffset, len); decoder.pos += len; return view; }; var readVarUint8Array = (decoder) => readUint8Array(decoder, readVarUint(decoder)); var readUint8 = (decoder) => decoder.arr[decoder.pos++]; var readVarUint = (decoder) => { let num = 0; let mult = 1; const len = decoder.arr.length; while (decoder.pos < len) { const r = decoder.arr[decoder.pos++]; num = num + (r & BITS7) * mult; mult *= 128; if (r < BIT8) { return num; } if (num > MAX_SAFE_INTEGER) { throw errorIntegerOutOfRange; } } throw errorUnexpectedEndOfArray; }; var readVarInt = (decoder) => { let r = decoder.arr[decoder.pos++]; let num = r & BITS6; let mult = 64; const sign = (r & BIT7) > 0 ? -1 : 1; if ((r & BIT8) === 0) { return sign * num; } const len = decoder.arr.length; while (decoder.pos < len) { r = decoder.arr[decoder.pos++]; num = num + (r & BITS7) * mult; mult *= 128; if (r < BIT8) { return sign * num; } if (num > MAX_SAFE_INTEGER) { throw errorIntegerOutOfRange; } } throw errorUnexpectedEndOfArray; }; var _readVarStringPolyfill = (decoder) => { let remainingLen = readVarUint(decoder); if (remainingLen === 0) { return ""; } else { let encodedString = String.fromCodePoint(readUint8(decoder)); if (--remainingLen < 100) { while (remainingLen--) { encodedString += String.fromCodePoint(readUint8(decoder)); } } else { while (remainingLen > 0) { const nextLen = remainingLen < 1e4 ? remainingLen : 1e4; const bytes = decoder.arr.subarray(decoder.pos, decoder.pos + nextLen); decoder.pos += nextLen; encodedString += String.fromCodePoint.apply( null, /** @type {any} */ bytes ); remainingLen -= nextLen; } } return decodeURIComponent(escape(encodedString)); } }; var _readVarStringNative = (decoder) => ( /** @type any */ utf8TextDecoder.decode(readVarUint8Array(decoder)) ); var readVarString = utf8TextDecoder ? _readVarStringNative : _readVarStringPolyfill; var readFromDataView = (decoder, len) => { const dv = new DataView(decoder.arr.buffer, decoder.arr.byteOffset + decoder.pos, len); decoder.pos += len; return dv; }; var readFloat32 = (decoder) => readFromDataView(decoder, 4).getFloat32(0, false); var readFloat64 = (decoder) => readFromDataView(decoder, 8).getFloat64(0, false); var readBigInt64 = (decoder) => ( /** @type {any} */ readFromDataView(decoder, 8).getBigInt64(0, false) ); var readAnyLookupTable = [ (decoder) => void 0, // CASE 127: undefined (decoder) => null, // CASE 126: null readVarInt, // CASE 125: integer readFloat32, // CASE 124: float32 readFloat64, // CASE 123: float64 readBigInt64, // CASE 122: bigint (decoder) => false, // CASE 121: boolean (false) (decoder) => true, // CASE 120: boolean (true) readVarString, // CASE 119: string (decoder) => { const len = readVarUint(decoder); const obj = {}; for (let i = 0; i < len; i++) { const key = readVarString(decoder); obj[key] = readAny(decoder); } return obj; }, (decoder) => { const len = readVarUint(decoder); const arr = []; for (let i = 0; i < len; i++) { arr.push(readAny(decoder)); } return arr; }, readVarUint8Array // CASE 116: Uint8Array ]; var readAny = (decoder) => readAnyLookupTable[127 - readUint8(decoder)](decoder); var RleDecoder = class extends Decoder { /** * @param {Uint8Array} uint8Array * @param {function(Decoder):T} reader */ constructor(uint8Array, reader) { super(uint8Array); this.reader = reader; this.s = null; this.count = 0; } read() { if (this.count === 0) { this.s = this.reader(this); if (hasContent(this)) { this.count = readVarUint(this) + 1; } else { this.count = -1; } } this.count--; return ( /** @type {T} */ this.s ); } }; var UintOptRleDecoder = class extends Decoder { /** * @param {Uint8Array} uint8Array */ constructor(uint8Array) { super(uint8Array); this.s = 0; this.count = 0; } read() { if (this.count === 0) { this.s = readVarInt(this); const isNegative = isNegativeZero(this.s); this.count = 1; if (isNegative) { this.s = -this.s; this.count = readVarUint(this) + 2; } } this.count--; return ( /** @type {number} */ this.s ); } }; var IntDiffOptRleDecoder = class extends Decoder { /** * @param {Uint8Array} uint8Array */ constructor(uint8Array) { super(uint8Array); this.s = 0; this.count = 0; this.diff = 0; } /** * @return {number} */ read() { if (this.count === 0) { const diff = readVarInt(this); const hasCount = diff & 1; this.diff = floor(diff / 2); this.count = 1; if (hasCount) { this.count = readVarUint(this) + 2; } } this.s += this.diff; this.count--; return this.s; } }; var StringDecoder = class { /** * @param {Uint8Array} uint8Array */ constructor(uint8Array) { this.decoder = new UintOptRleDecoder(uint8Array); this.str = readVarString(this.decoder); this.spos = 0; } /** * @return {string} */ read() { const end = this.spos + this.decoder.read(); const res = this.str.slice(this.spos, end); this.spos = end; return res; } }; // node_modules/lib0/webcrypto.js var subtle = crypto.subtle; var getRandomValues = crypto.getRandomValues.bind(crypto); // node_modules/lib0/random.js var uint32 = () => getRandomValues(new Uint32Array(1))[0]; var uuidv4Template = "10000000-1000-4000-8000" + -1e11; var uuidv4 = () => uuidv4Template.replace( /[018]/g, /** @param {number} c */ (c) => (c ^ uint32() & 15 >> c / 4).toString(16) ); // node_modules/lib0/time.js var getUnixTime = Date.now; // node_modules/lib0/promise.js var create4 = (f) => ( /** @type {Promise} */ new Promise(f) ); var all = Promise.all.bind(Promise); // node_modules/lib0/conditions.js var undefinedToNull = (v) => v === void 0 ? null : v; // node_modules/lib0/storage.js var VarStoragePolyfill = class { constructor() { this.map = /* @__PURE__ */ new Map(); } /** * @param {string} key * @param {any} newValue */ setItem(key, newValue) { this.map.set(key, newValue); } /** * @param {string} key */ getItem(key) { return this.map.get(key); } }; var _localStorage = new VarStoragePolyfill(); var usePolyfill = true; try { if (typeof localStorage !== "undefined" && localStorage) { _localStorage = localStorage; usePolyfill = false; } } catch (e) { } var varStorage = _localStorage; // node_modules/lib0/object.js var assign = Object.assign; var keys = Object.keys; var forEach = (obj, f) => { for (const key in obj) { f(obj[key], key); } }; var length2 = (obj) => keys(obj).length; var size = (obj) => keys(obj).length; var isEmpty = (obj) => { for (const _k in obj) { return false; } return true; }; var every = (obj, f) => { for (const key in obj) { if (!f(obj[key], key)) { return false; } } return true; }; var hasProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key); var equalFlat = (a, b) => a === b || size(a) === size(b) && every(a, (val, key) => (val !== void 0 || hasProperty(b, key)) && b[key] === val); var freeze = Object.freeze; var deepFreeze = (o) => { for (const key in o) { const c = o[key]; if (typeof c === "object" || typeof c === "function") { deepFreeze(o[key]); } } return freeze(o); }; // node_modules/lib0/function.js var callAll = (fs, args2, i = 0) => { try { for (; i < fs.length; i++) { fs[i](...args2); } } finally { if (i < fs.length) { callAll(fs, args2, i + 1); } } }; var id = (a) => a; var equalityStrict = (a, b) => a === b; var equalityDeep = (a, b) => { if (a == null || b == null) { return equalityStrict(a, b); } if (a.constructor !== b.constructor) { return false; } if (a === b) { return true; } switch (a.constructor) { case ArrayBuffer: a = new Uint8Array(a); b = new Uint8Array(b); // eslint-disable-next-line no-fallthrough case Uint8Array: { if (a.byteLength !== b.byteLength) { return false; } for (let i = 0; i < a.length; i++) { if (a[i] !== b[i]) { return false; } } break; } case Set: { if (a.size !== b.size) { return false; } for (const value of a) { if (!b.has(value)) { return false; } } break; } case Map: { if (a.size !== b.size) { return false; } for (const key of a.keys()) { if (!b.has(key) || !equalityDeep(a.get(key), b.get(key))) { return false; } } break; } case Object: if (length2(a) !== length2(b)) { return false; } for (const key in a) { if (!hasProperty(a, key) || !equalityDeep(a[key], b[key])) { return false; } } break; case Array: if (a.length !== b.length) { return false; } for (let i = 0; i < a.length; i++) { if (!equalityDeep(a[i], b[i])) { return false; } } break; default: return false; } return true; }; var isOneOf = (value, options) => options.includes(value); // node_modules/lib0/environment.js var isNode = typeof process !== "undefined" && process.release && /node|io\.js/.test(process.release.name) && Object.prototype.toString.call(typeof process !== "undefined" ? process : 0) === "[object process]"; var isBrowser = typeof window !== "undefined" && typeof document !== "undefined" && !isNode; var isMac = typeof navigator !== "undefined" ? /Mac/.test(navigator.platform) : false; var params; var args = []; var computeParams = () => { if (params === void 0) { if (isNode) { params = create(); const pargs = process.argv; let currParamName = null; for (let i = 0; i < pargs.length; i++) { const parg = pargs[i]; if (parg[0] === "-") { if (currParamName !== null) { params.set(currParamName, ""); } currParamName = parg; } else { if (currParamName !== null) { params.set(currParamName, parg); currParamName = null; } else { args.push(parg); } } } if (currParamName !== null) { params.set(currParamName, ""); } } else if (typeof location === "object") { params = create(); (location.search || "?").slice(1).split("&").forEach((kv) => { if (kv.length !== 0) { const [key, value] = kv.split("="); params.set(`--${fromCamelCase(key, "-")}`, value); params.set(`-${fromCamelCase(key, "-")}`, value); } }); } else { params = create(); } } return params; }; var hasParam = (name) => computeParams().has(name); var getVariable = (name) => isNode ? undefinedToNull(process.env[name.toUpperCase().replaceAll("-", "_")]) : undefinedToNull(varStorage.getItem(name)); var hasConf = (name) => hasParam("--" + name) || getVariable(name) !== null; var production = hasConf("production"); var forceColor = isNode && isOneOf(process.env.FORCE_COLOR, ["true", "1", "2"]); var supportsColor = forceColor || !hasParam("--no-colors") && // @todo deprecate --no-colors !hasConf("no-color") && (!isNode || process.stdout.isTTY) && (!isNode || hasParam("--color") || getVariable("COLORTERM") !== null || (getVariable("TERM") || "").includes("color")); // node_modules/lib0/buffer.js var createUint8ArrayFromLen = (len) => new Uint8Array(len); var createUint8ArrayViewFromArrayBuffer = (buffer, byteOffset, length3) => new Uint8Array(buffer, byteOffset, length3); var toBase64Browser = (bytes) => { let s = ""; for (let i = 0; i < bytes.byteLength; i++) { s += fromCharCode(bytes[i]); } return btoa(s); }; var toBase64Node = (bytes) => Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString("base64"); var fromBase64Browser = (s) => { const a = atob(s); const bytes = createUint8ArrayFromLen(a.length); for (let i = 0; i < a.length; i++) { bytes[i] = a.charCodeAt(i); } return bytes; }; var fromBase64Node = (s) => { const buf = Buffer.from(s, "base64"); return createUint8ArrayViewFromArrayBuffer(buf.buffer, buf.byteOffset, buf.byteLength); }; var toBase64 = isBrowser ? toBase64Browser : toBase64Node; var fromBase64 = isBrowser ? fromBase64Browser : fromBase64Node; var copyUint8Array = (uint8Array) => { const newBuf = createUint8ArrayFromLen(uint8Array.byteLength); newBuf.set(uint8Array); return newBuf; }; // node_modules/lib0/pair.js var Pair = class { /** * @param {L} left * @param {R} right */ constructor(left, right) { this.left = left; this.right = right; } }; var create5 = (left, right) => new Pair(left, right); // node_modules/lib0/dom.js var doc = ( /** @type {Document} */ typeof document !== "undefined" ? document : {} ); var domParser = ( /** @type {DOMParser} */ typeof DOMParser !== "undefined" ? new DOMParser() : null ); var mapToStyleString = (m) => map(m, (value, key) => `${key}:${value};`).join(""); var ELEMENT_NODE = doc.ELEMENT_NODE; var TEXT_NODE = doc.TEXT_NODE; var CDATA_SECTION_NODE = doc.CDATA_SECTION_NODE; var COMMENT_NODE = doc.COMMENT_NODE; var DOCUMENT_NODE = doc.DOCUMENT_NODE; var DOCUMENT_TYPE_NODE = doc.DOCUMENT_TYPE_NODE; var DOCUMENT_FRAGMENT_NODE = doc.DOCUMENT_FRAGMENT_NODE; // node_modules/lib0/symbol.js var create6 = Symbol; // node_modules/lib0/logging.common.js var BOLD = create6(); var UNBOLD = create6(); var BLUE = create6(); var GREY = create6(); var GREEN = create6(); var RED = create6(); var PURPLE = create6(); var ORANGE = create6(); var UNCOLOR = create6(); var computeNoColorLoggingArgs = (args2) => { if (args2.length === 1 && args2[0]?.constructor === Function) { args2 = /** @type {Array} */ /** @type {[function]} */ args2[0](); } const strBuilder = []; const logArgs = []; let i = 0; for (; i < args2.length; i++) { const arg = args2[i]; if (arg === void 0) { break; } else if (arg.constructor === String || arg.constructor === Number) { strBuilder.push(arg); } else if (arg.constructor === Object) { break; } } if (i > 0) { logArgs.push(strBuilder.join("")); } for (; i < args2.length; i++) { const arg = args2[i]; if (!(arg instanceof Symbol)) { logArgs.push(arg); } } return logArgs; }; var lastLoggingTime = getUnixTime(); // node_modules/lib0/logging.js var _browserStyleMap = { [BOLD]: create5("font-weight", "bold"), [UNBOLD]: create5("font-weight", "normal"), [BLUE]: create5("color", "blue"), [GREEN]: create5("color", "green"), [GREY]: create5("color", "grey"), [RED]: create5("color", "red"), [PURPLE]: create5("color", "purple"), [ORANGE]: create5("color", "orange"), // not well supported in chrome when debugging node with inspector - TODO: deprecate [UNCOLOR]: create5("color", "black") }; var computeBrowserLoggingArgs = (args2) => { if (args2.length === 1 && args2[0]?.constructor === Function) { args2 = /** @type {Array} */ /** @type {[function]} */ args2[0](); } const strBuilder = []; const styles = []; const currentStyle = create(); let logArgs = []; let i = 0; for (; i < args2.length; i++) { const arg = args2[i]; const style = _browserStyleMap[arg]; if (style !== void 0) { currentStyle.set(style.left, style.right); } else { if (arg === void 0) { break; } if (arg.constructor === String || arg.constructor === Number) { const style2 = mapToStyleString(currentStyle); if (i > 0 || style2.length > 0) { strBuilder.push("%c" + arg); styles.push(style2); } else { strBuilder.push(arg); } } else { break; } } } if (i > 0) { logArgs = styles; logArgs.unshift(strBuilder.join("")); } for (; i < args2.length; i++) { const arg = args2[i]; if (!(arg instanceof Symbol)) { logArgs.push(arg); } } return logArgs; }; var computeLoggingArgs = supportsColor ? computeBrowserLoggingArgs : computeNoColorLoggingArgs; var print = (...args2) => { console.log(...computeLoggingArgs(args2)); vconsoles.forEach((vc) => vc.print(args2)); }; var warn = (...args2) => { console.warn(...computeLoggingArgs(args2)); args2.unshift(ORANGE); vconsoles.forEach((vc) => vc.print(args2)); }; var vconsoles = create2(); // node_modules/lib0/iterator.js var createIterator = (next) => ({ /** * @return {IterableIterator} */ [Symbol.iterator]() { return this; }, // @ts-ignore next }); var iteratorFilter = (iterator, filter) => createIterator(() => { let res; do { res = iterator.next(); } while (!res.done && !filter(res.value)); return res; }); var iteratorMap = (iterator, fmap) => createIterator(() => { const { done, value } = iterator.next(); return { done, value: done ? void 0 : fmap(value) }; }); // node_modules/yjs/dist/yjs.mjs var AbstractConnector = class extends ObservableV2 { /** * @param {Doc} ydoc * @param {any} awareness */ constructor(ydoc, awareness) { super(); this.doc = ydoc; this.awareness = awareness; } }; var DeleteItem = class { /** * @param {number} clock * @param {number} len */ constructor(clock, len) { this.clock = clock; this.len = len; } }; var DeleteSet = class { constructor() { this.clients = /* @__PURE__ */ new Map(); } }; var iterateDeletedStructs = (transaction, ds, f) => ds.clients.forEach((deletes, clientid) => { const structs = ( /** @type {Array} */ transaction.doc.store.clients.get(clientid) ); if (structs != null) { const lastStruct = structs[structs.length - 1]; const clockState = lastStruct.id.clock + lastStruct.length; for (let i = 0, del = deletes[i]; i < deletes.length && del.clock < clockState; del = deletes[++i]) { iterateStructs(transaction, structs, del.clock, del.len, f); } } }); var findIndexDS = (dis, clock) => { let left = 0; let right = dis.length - 1; while (left <= right) { const midindex = floor((left + right) / 2); const mid = dis[midindex]; const midclock = mid.clock; if (midclock <= clock) { if (clock < midclock + mid.len) { return midindex; } left = midindex + 1; } else { right = midindex - 1; } } return null; }; var isDeleted = (ds, id2) => { const dis = ds.clients.get(id2.client); return dis !== void 0 && findIndexDS(dis, id2.clock) !== null; }; var sortAndMergeDeleteSet = (ds) => { ds.clients.forEach((dels) => { dels.sort((a, b) => a.clock - b.clock); let i, j; for (i = 1, j = 1; i < dels.length; i++) { const left = dels[j - 1]; const right = dels[i]; if (left.clock + left.len >= right.clock) { left.len = max(left.len, right.clock + right.len - left.clock); } else { if (j < i) { dels[j] = right; } j++; } } dels.length = j; }); }; var mergeDeleteSets = (dss) => { const merged = new DeleteSet(); for (let dssI = 0; dssI < dss.length; dssI++) { dss[dssI].clients.forEach((delsLeft, client) => { if (!merged.clients.has(client)) { const dels = delsLeft.slice(); for (let i = dssI + 1; i < dss.length; i++) { appendTo(dels, dss[i].clients.get(client) || []); } merged.clients.set(client, dels); } }); } sortAndMergeDeleteSet(merged); return merged; }; var addToDeleteSet = (ds, client, clock, length3) => { setIfUndefined(ds.clients, client, () => ( /** @type {Array} */ [] )).push(new DeleteItem(clock, length3)); }; var createDeleteSet = () => new DeleteSet(); var createDeleteSetFromStructStore = (ss) => { const ds = createDeleteSet(); ss.clients.forEach((structs, client) => { const dsitems = []; for (let i = 0; i < structs.length; i++) { const struct = structs[i]; if (struct.deleted) { const clock = struct.id.clock; let len = struct.length; if (i + 1 < structs.length) { for (let next = structs[i + 1]; i + 1 < structs.length && next.deleted; next = structs[++i + 1]) { len += next.length; } } dsitems.push(new DeleteItem(clock, len)); } } if (dsitems.length > 0) { ds.clients.set(client, dsitems); } }); return ds; }; var writeDeleteSet = (encoder, ds) => { writeVarUint(encoder.restEncoder, ds.clients.size); from(ds.clients.entries()).sort((a, b) => b[0] - a[0]).forEach(([client, dsitems]) => { encoder.resetDsCurVal(); writeVarUint(encoder.restEncoder, client); const len = dsitems.length; writeVarUint(encoder.restEncoder, len); for (let i = 0; i < len; i++) { const item = dsitems[i]; encoder.writeDsClock(item.clock); encoder.writeDsLen(item.len); } }); }; var readDeleteSet = (decoder) => { const ds = new DeleteSet(); const numClients = readVarUint(decoder.restDecoder); for (let i = 0; i < numClients; i++) { decoder.resetDsCurVal(); const client = readVarUint(decoder.restDecoder); const numberOfDeletes = readVarUint(decoder.restDecoder); if (numberOfDeletes > 0) { const dsField = setIfUndefined(ds.clients, client, () => ( /** @type {Array} */ [] )); for (let i2 = 0; i2 < numberOfDeletes; i2++) { dsField.push(new DeleteItem(decoder.readDsClock(), decoder.readDsLen())); } } } return ds; }; var readAndApplyDeleteSet = (decoder, transaction, store2) => { const unappliedDS = new DeleteSet(); const numClients = readVarUint(decoder.restDecoder); for (let i = 0; i < numClients; i++) { decoder.resetDsCurVal(); const client = readVarUint(decoder.restDecoder); const numberOfDeletes = readVarUint(decoder.restDecoder); const structs = store2.clients.get(client) || []; const state = getState(store2, client); for (let i2 = 0; i2 < numberOfDeletes; i2++) { const clock = decoder.readDsClock(); const clockEnd = clock + decoder.readDsLen(); if (clock < state) { if (state < clockEnd) { addToDeleteSet(unappliedDS, client, state, clockEnd - state); } let index = findIndexSS(structs, clock); let struct = structs[index]; if (!struct.deleted && struct.id.clock < clock) { structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock)); index++; } while (index < structs.length) { struct = structs[index++]; if (struct.id.clock < clockEnd) { if (!struct.deleted) { if (clockEnd < struct.id.clock + struct.length) { structs.splice(index, 0, splitItem(transaction, struct, clockEnd - struct.id.clock)); } struct.delete(transaction); } } else { break; } } } else { addToDeleteSet(unappliedDS, client, clock, clockEnd - clock); } } } if (unappliedDS.clients.size > 0) { const ds = new UpdateEncoderV2(); writeVarUint(ds.restEncoder, 0); writeDeleteSet(ds, unappliedDS); return ds.toUint8Array(); } return null; }; var equalDeleteSets = (ds1, ds2) => { if (ds1.clients.size !== ds2.clients.size) return false; for (const [client, deleteItems1] of ds1.clients.entries()) { const deleteItems2 = ( /** @type {Array} */ ds2.clients.get(client) ); if (deleteItems2 === void 0 || deleteItems1.length !== deleteItems2.length) return false; for (let i = 0; i < deleteItems1.length; i++) { const di1 = deleteItems1[i]; const di2 = deleteItems2[i]; if (di1.clock !== di2.clock || di1.len !== di2.len) { return false; } } } return true; }; var generateNewClientId = uint32; var Doc = class _Doc extends ObservableV2 { /** * @param {DocOpts} opts configuration */ constructor({ guid = uuidv4(), collectionid = null, gc = true, gcFilter = () => true, meta = null, autoLoad = false, shouldLoad = true } = {}) { super(); this.gc = gc; this.gcFilter = gcFilter; this.clientID = generateNewClientId(); this.guid = guid; this.collectionid = collectionid; this.share = /* @__PURE__ */ new Map(); this.store = new StructStore(); this._transaction = null; this._transactionCleanups = []; this.subdocs = /* @__PURE__ */ new Set(); this._item = null; this.shouldLoad = shouldLoad; this.autoLoad = autoLoad; this.meta = meta; this.isLoaded = false; this.isSynced = false; this.isDestroyed = false; this.whenLoaded = create4((resolve) => { this.on("load", () => { this.isLoaded = true; resolve(this); }); }); const provideSyncedPromise = () => create4((resolve) => { const eventHandler = (isSynced) => { if (isSynced === void 0 || isSynced === true) { this.off("sync", eventHandler); resolve(); } }; this.on("sync", eventHandler); }); this.on("sync", (isSynced) => { if (isSynced === false && this.isSynced) { this.whenSynced = provideSyncedPromise(); } this.isSynced = isSynced === void 0 || isSynced === true; if (this.isSynced && !this.isLoaded) { this.emit("load", [this]); } }); this.whenSynced = provideSyncedPromise(); } /** * Notify the parent document that you request to load data into this subdocument (if it is a subdocument). * * `load()` might be used in the future to request any provider to load the most current data. * * It is safe to call `load()` multiple times. */ load() { const item = this._item; if (item !== null && !this.shouldLoad) { transact( /** @type {any} */ item.parent.doc, (transaction) => { transaction.subdocsLoaded.add(this); }, null, true ); } this.shouldLoad = true; } getSubdocs() { return this.subdocs; } getSubdocGuids() { return new Set(from(this.subdocs).map((doc2) => doc2.guid)); } /** * Changes that happen inside of a transaction are bundled. This means that * the observer fires _after_ the transaction is finished and that all changes * that happened inside of the transaction are sent as one message to the * other peers. * * @template T * @param {function(Transaction):T} f The function that should be executed as a transaction * @param {any} [origin] Origin of who started the transaction. Will be stored on transaction.origin * @return T * * @public */ transact(f, origin2 = null) { return transact(this, f, origin2); } /** * Define a shared data type. * * Multiple calls of `ydoc.get(name, TypeConstructor)` yield the same result * and do not overwrite each other. I.e. * `ydoc.get(name, Y.Array) === ydoc.get(name, Y.Array)` * * After this method is called, the type is also available on `ydoc.share.get(name)`. * * *Best Practices:* * Define all types right after the Y.Doc instance is created and store them in a separate object. * Also use the typed methods `getText(name)`, `getArray(name)`, .. * * @template {typeof AbstractType} Type * @example * const ydoc = new Y.Doc(..) * const appState = { * document: ydoc.getText('document') * comments: ydoc.getArray('comments') * } * * @param {string} name * @param {Type} TypeConstructor The constructor of the type definition. E.g. Y.Text, Y.Array, Y.Map, ... * @return {InstanceType} The created type. Constructed with TypeConstructor * * @public */ get(name, TypeConstructor = ( /** @type {any} */ AbstractType )) { const type = setIfUndefined(this.share, name, () => { const t = new TypeConstructor(); t._integrate(this, null); return t; }); const Constr = type.constructor; if (TypeConstructor !== AbstractType && Constr !== TypeConstructor) { if (Constr === AbstractType) { const t = new TypeConstructor(); t._map = type._map; type._map.forEach( /** @param {Item?} n */ (n) => { for (; n !== null; n = n.left) { n.parent = t; } } ); t._start = type._start; for (let n = t._start; n !== null; n = n.right) { n.parent = t; } t._length = type._length; this.share.set(name, t); t._integrate(this, null); return ( /** @type {InstanceType} */ t ); } else { throw new Error(`Type with the name ${name} has already been defined with a different constructor`); } } return ( /** @type {InstanceType} */ type ); } /** * @template T * @param {string} [name] * @return {YArray} * * @public */ getArray(name = "") { return ( /** @type {YArray} */ this.get(name, YArray) ); } /** * @param {string} [name] * @return {YText} * * @public */ getText(name = "") { return this.get(name, YText); } /** * @template T * @param {string} [name] * @return {YMap} * * @public */ getMap(name = "") { return ( /** @type {YMap} */ this.get(name, YMap) ); } /** * @param {string} [name] * @return {YXmlElement} * * @public */ getXmlElement(name = "") { return ( /** @type {YXmlElement<{[key:string]:string}>} */ this.get(name, YXmlElement) ); } /** * @param {string} [name] * @return {YXmlFragment} * * @public */ getXmlFragment(name = "") { return this.get(name, YXmlFragment); } /** * Converts the entire document into a js object, recursively traversing each yjs type * Doesn't log types that have not been defined (using ydoc.getType(..)). * * @deprecated Do not use this method and rather call toJSON directly on the shared types. * * @return {Object} */ toJSON() { const doc2 = {}; this.share.forEach((value, key) => { doc2[key] = value.toJSON(); }); return doc2; } /** * Emit `destroy` event and unregister all event handlers. */ destroy() { this.isDestroyed = true; from(this.subdocs).forEach((subdoc) => subdoc.destroy()); const item = this._item; if (item !== null) { this._item = null; const content = ( /** @type {ContentDoc} */ item.content ); content.doc = new _Doc({ guid: this.guid, ...content.opts, shouldLoad: false }); content.doc._item = item; transact( /** @type {any} */ item.parent.doc, (transaction) => { const doc2 = content.doc; if (!item.deleted) { transaction.subdocsAdded.add(doc2); } transaction.subdocsRemoved.add(this); }, null, true ); } this.emit("destroyed", [true]); this.emit("destroy", [this]); super.destroy(); } }; var DSDecoderV1 = class { /** * @param {decoding.Decoder} decoder */ constructor(decoder) { this.restDecoder = decoder; } resetDsCurVal() { } /** * @return {number} */ readDsClock() { return readVarUint(this.restDecoder); } /** * @return {number} */ readDsLen() { return readVarUint(this.restDecoder); } }; var UpdateDecoderV1 = class extends DSDecoderV1 { /** * @return {ID} */ readLeftID() { return createID(readVarUint(this.restDecoder), readVarUint(this.restDecoder)); } /** * @return {ID} */ readRightID() { return createID(readVarUint(this.restDecoder), readVarUint(this.restDecoder)); } /** * Read the next client id. * Use this in favor of readID whenever possible to reduce the number of objects created. */ readClient() { return readVarUint(this.restDecoder); } /** * @return {number} info An unsigned 8-bit integer */ readInfo() { return readUint8(this.restDecoder); } /** * @return {string} */ readString() { return readVarString(this.restDecoder); } /** * @return {boolean} isKey */ readParentInfo() { return readVarUint(this.restDecoder) === 1; } /** * @return {number} info An unsigned 8-bit integer */ readTypeRef() { return readVarUint(this.restDecoder); } /** * Write len of a struct - well suited for Opt RLE encoder. * * @return {number} len */ readLen() { return readVarUint(this.restDecoder); } /** * @return {any} */ readAny() { return readAny(this.restDecoder); } /** * @return {Uint8Array} */ readBuf() { return copyUint8Array(readVarUint8Array(this.restDecoder)); } /** * Legacy implementation uses JSON parse. We use any-decoding in v2. * * @return {any} */ readJSON() { return JSON.parse(readVarString(this.restDecoder)); } /** * @return {string} */ readKey() { return readVarString(this.restDecoder); } }; var DSDecoderV2 = class { /** * @param {decoding.Decoder} decoder */ constructor(decoder) { this.dsCurrVal = 0; this.restDecoder = decoder; } resetDsCurVal() { this.dsCurrVal = 0; } /** * @return {number} */ readDsClock() { this.dsCurrVal += readVarUint(this.restDecoder); return this.dsCurrVal; } /** * @return {number} */ readDsLen() { const diff = readVarUint(this.restDecoder) + 1; this.dsCurrVal += diff; return diff; } }; var UpdateDecoderV2 = class extends DSDecoderV2 { /** * @param {decoding.Decoder} decoder */ constructor(decoder) { super(decoder); this.keys = []; readVarUint(decoder); this.keyClockDecoder = new IntDiffOptRleDecoder(readVarUint8Array(decoder)); this.clientDecoder = new UintOptRleDecoder(readVarUint8Array(decoder)); this.leftClockDecoder = new IntDiffOptRleDecoder(readVarUint8Array(decoder)); this.rightClockDecoder = new IntDiffOptRleDecoder(readVarUint8Array(decoder)); this.infoDecoder = new RleDecoder(readVarUint8Array(decoder), readUint8); this.stringDecoder = new StringDecoder(readVarUint8Array(decoder)); this.parentInfoDecoder = new RleDecoder(readVarUint8Array(decoder), readUint8); this.typeRefDecoder = new UintOptRleDecoder(readVarUint8Array(decoder)); this.lenDecoder = new UintOptRleDecoder(readVarUint8Array(decoder)); } /** * @return {ID} */ readLeftID() { return new ID(this.clientDecoder.read(), this.leftClockDecoder.read()); } /** * @return {ID} */ readRightID() { return new ID(this.clientDecoder.read(), this.rightClockDecoder.read()); } /** * Read the next client id. * Use this in favor of readID whenever possible to reduce the number of objects created. */ readClient() { return this.clientDecoder.read(); } /** * @return {number} info An unsigned 8-bit integer */ readInfo() { return ( /** @type {number} */ this.infoDecoder.read() ); } /** * @return {string} */ readString() { return this.stringDecoder.read(); } /** * @return {boolean} */ readParentInfo() { return this.parentInfoDecoder.read() === 1; } /** * @return {number} An unsigned 8-bit integer */ readTypeRef() { return this.typeRefDecoder.read(); } /** * Write len of a struct - well suited for Opt RLE encoder. * * @return {number} */ readLen() { return this.lenDecoder.read(); } /** * @return {any} */ readAny() { return readAny(this.restDecoder); } /** * @return {Uint8Array} */ readBuf() { return readVarUint8Array(this.restDecoder); } /** * This is mainly here for legacy purposes. * * Initial we incoded objects using JSON. Now we use the much faster lib0/any-encoder. This method mainly exists for legacy purposes for the v1 encoder. * * @return {any} */ readJSON() { return readAny(this.restDecoder); } /** * @return {string} */ readKey() { const keyClock = this.keyClockDecoder.read(); if (keyClock < this.keys.length) { return this.keys[keyClock]; } else { const key = this.stringDecoder.read(); this.keys.push(key); return key; } } }; var DSEncoderV1 = class { constructor() { this.restEncoder = createEncoder(); } toUint8Array() { return toUint8Array(this.restEncoder); } resetDsCurVal() { } /** * @param {number} clock */ writeDsClock(clock) { writeVarUint(this.restEncoder, clock); } /** * @param {number} len */ writeDsLen(len) { writeVarUint(this.restEncoder, len); } }; var UpdateEncoderV1 = class extends DSEncoderV1 { /** * @param {ID} id */ writeLeftID(id2) { writeVarUint(this.restEncoder, id2.client); writeVarUint(this.restEncoder, id2.clock); } /** * @param {ID} id */ writeRightID(id2) { writeVarUint(this.restEncoder, id2.client); writeVarUint(this.restEncoder, id2.clock); } /** * Use writeClient and writeClock instead of writeID if possible. * @param {number} client */ writeClient(client) { writeVarUint(this.restEncoder, client); } /** * @param {number} info An unsigned 8-bit integer */ writeInfo(info) { writeUint8(this.restEncoder, info); } /** * @param {string} s */ writeString(s) { writeVarString(this.restEncoder, s); } /** * @param {boolean} isYKey */ writeParentInfo(isYKey) { writeVarUint(this.restEncoder, isYKey ? 1 : 0); } /** * @param {number} info An unsigned 8-bit integer */ writeTypeRef(info) { writeVarUint(this.restEncoder, info); } /** * Write len of a struct - well suited for Opt RLE encoder. * * @param {number} len */ writeLen(len) { writeVarUint(this.restEncoder, len); } /** * @param {any} any */ writeAny(any2) { writeAny(this.restEncoder, any2); } /** * @param {Uint8Array} buf */ writeBuf(buf) { writeVarUint8Array(this.restEncoder, buf); } /** * @param {any} embed */ writeJSON(embed) { writeVarString(this.restEncoder, JSON.stringify(embed)); } /** * @param {string} key */ writeKey(key) { writeVarString(this.restEncoder, key); } }; var DSEncoderV2 = class { constructor() { this.restEncoder = createEncoder(); this.dsCurrVal = 0; } toUint8Array() { return toUint8Array(this.restEncoder); } resetDsCurVal() { this.dsCurrVal = 0; } /** * @param {number} clock */ writeDsClock(clock) { const diff = clock - this.dsCurrVal; this.dsCurrVal = clock; writeVarUint(this.restEncoder, diff); } /** * @param {number} len */ writeDsLen(len) { if (len === 0) { unexpectedCase(); } writeVarUint(this.restEncoder, len - 1); this.dsCurrVal += len; } }; var UpdateEncoderV2 = class extends DSEncoderV2 { constructor() { super(); this.keyMap = /* @__PURE__ */ new Map(); this.keyClock = 0; this.keyClockEncoder = new IntDiffOptRleEncoder(); this.clientEncoder = new UintOptRleEncoder(); this.leftClockEncoder = new IntDiffOptRleEncoder(); this.rightClockEncoder = new IntDiffOptRleEncoder(); this.infoEncoder = new RleEncoder(writeUint8); this.stringEncoder = new StringEncoder(); this.parentInfoEncoder = new RleEncoder(writeUint8); this.typeRefEncoder = new UintOptRleEncoder(); this.lenEncoder = new UintOptRleEncoder(); } toUint8Array() { const encoder = createEncoder(); writeVarUint(encoder, 0); writeVarUint8Array(encoder, this.keyClockEncoder.toUint8Array()); writeVarUint8Array(encoder, this.clientEncoder.toUint8Array()); writeVarUint8Array(encoder, this.leftClockEncoder.toUint8Array()); writeVarUint8Array(encoder, this.rightClockEncoder.toUint8Array()); writeVarUint8Array(encoder, toUint8Array(this.infoEncoder)); writeVarUint8Array(encoder, this.stringEncoder.toUint8Array()); writeVarUint8Array(encoder, toUint8Array(this.parentInfoEncoder)); writeVarUint8Array(encoder, this.typeRefEncoder.toUint8Array()); writeVarUint8Array(encoder, this.lenEncoder.toUint8Array()); writeUint8Array(encoder, toUint8Array(this.restEncoder)); return toUint8Array(encoder); } /** * @param {ID} id */ writeLeftID(id2) { this.clientEncoder.write(id2.client); this.leftClockEncoder.write(id2.clock); } /** * @param {ID} id */ writeRightID(id2) { this.clientEncoder.write(id2.client); this.rightClockEncoder.write(id2.clock); } /** * @param {number} client */ writeClient(client) { this.clientEncoder.write(client); } /** * @param {number} info An unsigned 8-bit integer */ writeInfo(info) { this.infoEncoder.write(info); } /** * @param {string} s */ writeString(s) { this.stringEncoder.write(s); } /** * @param {boolean} isYKey */ writeParentInfo(isYKey) { this.parentInfoEncoder.write(isYKey ? 1 : 0); } /** * @param {number} info An unsigned 8-bit integer */ writeTypeRef(info) { this.typeRefEncoder.write(info); } /** * Write len of a struct - well suited for Opt RLE encoder. * * @param {number} len */ writeLen(len) { this.lenEncoder.write(len); } /** * @param {any} any */ writeAny(any2) { writeAny(this.restEncoder, any2); } /** * @param {Uint8Array} buf */ writeBuf(buf) { writeVarUint8Array(this.restEncoder, buf); } /** * This is mainly here for legacy purposes. * * Initial we incoded objects using JSON. Now we use the much faster lib0/any-encoder. This method mainly exists for legacy purposes for the v1 encoder. * * @param {any} embed */ writeJSON(embed) { writeAny(this.restEncoder, embed); } /** * Property keys are often reused. For example, in y-prosemirror the key `bold` might * occur very often. For a 3d application, the key `position` might occur very often. * * We cache these keys in a Map and refer to them via a unique number. * * @param {string} key */ writeKey(key) { const clock = this.keyMap.get(key); if (clock === void 0) { this.keyClockEncoder.write(this.keyClock++); this.stringEncoder.write(key); } else { this.keyClockEncoder.write(clock); } } }; var writeStructs = (encoder, structs, client, clock) => { clock = max(clock, structs[0].id.clock); const startNewStructs = findIndexSS(structs, clock); writeVarUint(encoder.restEncoder, structs.length - startNewStructs); encoder.writeClient(client); writeVarUint(encoder.restEncoder, clock); const firstStruct = structs[startNewStructs]; firstStruct.write(encoder, clock - firstStruct.id.clock); for (let i = startNewStructs + 1; i < structs.length; i++) { structs[i].write(encoder, 0); } }; var writeClientsStructs = (encoder, store2, _sm) => { const sm = /* @__PURE__ */ new Map(); _sm.forEach((clock, client) => { if (getState(store2, client) > clock) { sm.set(client, clock); } }); getStateVector(store2).forEach((_clock, client) => { if (!_sm.has(client)) { sm.set(client, 0); } }); writeVarUint(encoder.restEncoder, sm.size); from(sm.entries()).sort((a, b) => b[0] - a[0]).forEach(([client, clock]) => { writeStructs( encoder, /** @type {Array} */ store2.clients.get(client), client, clock ); }); }; var readClientsStructRefs = (decoder, doc2) => { const clientRefs = create(); const numOfStateUpdates = readVarUint(decoder.restDecoder); for (let i = 0; i < numOfStateUpdates; i++) { const numberOfStructs = readVarUint(decoder.restDecoder); const refs = new Array(numberOfStructs); const client = decoder.readClient(); let clock = readVarUint(decoder.restDecoder); clientRefs.set(client, { i: 0, refs }); for (let i2 = 0; i2 < numberOfStructs; i2++) { const info = decoder.readInfo(); switch (BITS5 & info) { case 0: { const len = decoder.readLen(); refs[i2] = new GC(createID(client, clock), len); clock += len; break; } case 10: { const len = readVarUint(decoder.restDecoder); refs[i2] = new Skip(createID(client, clock), len); clock += len; break; } default: { const cantCopyParentInfo = (info & (BIT7 | BIT8)) === 0; const struct = new Item( createID(client, clock), null, // left (info & BIT8) === BIT8 ? decoder.readLeftID() : null, // origin null, // right (info & BIT7) === BIT7 ? decoder.readRightID() : null, // right origin cantCopyParentInfo ? decoder.readParentInfo() ? doc2.get(decoder.readString()) : decoder.readLeftID() : null, // parent cantCopyParentInfo && (info & BIT6) === BIT6 ? decoder.readString() : null, // parentSub readItemContent(decoder, info) // item content ); refs[i2] = struct; clock += struct.length; } } } } return clientRefs; }; var integrateStructs = (transaction, store2, clientsStructRefs) => { const stack = []; let clientsStructRefsIds = from(clientsStructRefs.keys()).sort((a, b) => a - b); if (clientsStructRefsIds.length === 0) { return null; } const getNextStructTarget = () => { if (clientsStructRefsIds.length === 0) { return null; } let nextStructsTarget = ( /** @type {{i:number,refs:Array}} */ clientsStructRefs.get(clientsStructRefsIds[clientsStructRefsIds.length - 1]) ); while (nextStructsTarget.refs.length === nextStructsTarget.i) { clientsStructRefsIds.pop(); if (clientsStructRefsIds.length > 0) { nextStructsTarget = /** @type {{i:number,refs:Array}} */ clientsStructRefs.get(clientsStructRefsIds[clientsStructRefsIds.length - 1]); } else { return null; } } return nextStructsTarget; }; let curStructsTarget = getNextStructTarget(); if (curStructsTarget === null) { return null; } const restStructs = new StructStore(); const missingSV = /* @__PURE__ */ new Map(); const updateMissingSv = (client, clock) => { const mclock = missingSV.get(client); if (mclock == null || mclock > clock) { missingSV.set(client, clock); } }; let stackHead = ( /** @type {any} */ curStructsTarget.refs[ /** @type {any} */ curStructsTarget.i++ ] ); const state = /* @__PURE__ */ new Map(); const addStackToRestSS = () => { for (const item of stack) { const client = item.id.client; const inapplicableItems = clientsStructRefs.get(client); if (inapplicableItems) { inapplicableItems.i--; restStructs.clients.set(client, inapplicableItems.refs.slice(inapplicableItems.i)); clientsStructRefs.delete(client); inapplicableItems.i = 0; inapplicableItems.refs = []; } else { restStructs.clients.set(client, [item]); } clientsStructRefsIds = clientsStructRefsIds.filter((c) => c !== client); } stack.length = 0; }; while (true) { if (stackHead.constructor !== Skip) { const localClock = setIfUndefined(state, stackHead.id.client, () => getState(store2, stackHead.id.client)); const offset = localClock - stackHead.id.clock; if (offset < 0) { stack.push(stackHead); updateMissingSv(stackHead.id.client, stackHead.id.clock - 1); addStackToRestSS(); } else { const missing = stackHead.getMissing(transaction, store2); if (missing !== null) { stack.push(stackHead); const structRefs = clientsStructRefs.get( /** @type {number} */ missing ) || { refs: [], i: 0 }; if (structRefs.refs.length === structRefs.i) { updateMissingSv( /** @type {number} */ missing, getState(store2, missing) ); addStackToRestSS(); } else { stackHead = structRefs.refs[structRefs.i++]; continue; } } else if (offset === 0 || offset < stackHead.length) { stackHead.integrate(transaction, offset); state.set(stackHead.id.client, stackHead.id.clock + stackHead.length); } } } if (stack.length > 0) { stackHead = /** @type {GC|Item} */ stack.pop(); } else if (curStructsTarget !== null && curStructsTarget.i < curStructsTarget.refs.length) { stackHead = /** @type {GC|Item} */ curStructsTarget.refs[curStructsTarget.i++]; } else { curStructsTarget = getNextStructTarget(); if (curStructsTarget === null) { break; } else { stackHead = /** @type {GC|Item} */ curStructsTarget.refs[curStructsTarget.i++]; } } } if (restStructs.clients.size > 0) { const encoder = new UpdateEncoderV2(); writeClientsStructs(encoder, restStructs, /* @__PURE__ */ new Map()); writeVarUint(encoder.restEncoder, 0); return { missing: missingSV, update: encoder.toUint8Array() }; } return null; }; var writeStructsFromTransaction = (encoder, transaction) => writeClientsStructs(encoder, transaction.doc.store, transaction.beforeState); var readUpdateV2 = (decoder, ydoc, transactionOrigin, structDecoder = new UpdateDecoderV2(decoder)) => transact(ydoc, (transaction) => { transaction.local = false; let retry = false; const doc2 = transaction.doc; const store2 = doc2.store; const ss = readClientsStructRefs(structDecoder, doc2); const restStructs = integrateStructs(transaction, store2, ss); const pending = store2.pendingStructs; if (pending) { for (const [client, clock] of pending.missing) { if (clock < getState(store2, client)) { retry = true; break; } } if (restStructs) { for (const [client, clock] of restStructs.missing) { const mclock = pending.missing.get(client); if (mclock == null || mclock > clock) { pending.missing.set(client, clock); } } pending.update = mergeUpdatesV2([pending.update, restStructs.update]); } } else { store2.pendingStructs = restStructs; } const dsRest = readAndApplyDeleteSet(structDecoder, transaction, store2); if (store2.pendingDs) { const pendingDSUpdate = new UpdateDecoderV2(createDecoder(store2.pendingDs)); readVarUint(pendingDSUpdate.restDecoder); const dsRest2 = readAndApplyDeleteSet(pendingDSUpdate, transaction, store2); if (dsRest && dsRest2) { store2.pendingDs = mergeUpdatesV2([dsRest, dsRest2]); } else { store2.pendingDs = dsRest || dsRest2; } } else { store2.pendingDs = dsRest; } if (retry) { const update = ( /** @type {{update: Uint8Array}} */ store2.pendingStructs.update ); store2.pendingStructs = null; applyUpdateV2(transaction.doc, update); } }, transactionOrigin, false); var readUpdate = (decoder, ydoc, transactionOrigin) => readUpdateV2(decoder, ydoc, transactionOrigin, new UpdateDecoderV1(decoder)); var applyUpdateV2 = (ydoc, update, transactionOrigin, YDecoder = UpdateDecoderV2) => { const decoder = createDecoder(update); readUpdateV2(decoder, ydoc, transactionOrigin, new YDecoder(decoder)); }; var applyUpdate = (ydoc, update, transactionOrigin) => applyUpdateV2(ydoc, update, transactionOrigin, UpdateDecoderV1); var writeStateAsUpdate = (encoder, doc2, targetStateVector = /* @__PURE__ */ new Map()) => { writeClientsStructs(encoder, doc2.store, targetStateVector); writeDeleteSet(encoder, createDeleteSetFromStructStore(doc2.store)); }; var encodeStateAsUpdateV2 = (doc2, encodedTargetStateVector = new Uint8Array([0]), encoder = new UpdateEncoderV2()) => { const targetStateVector = decodeStateVector(encodedTargetStateVector); writeStateAsUpdate(encoder, doc2, targetStateVector); const updates = [encoder.toUint8Array()]; if (doc2.store.pendingDs) { updates.push(doc2.store.pendingDs); } if (doc2.store.pendingStructs) { updates.push(diffUpdateV2(doc2.store.pendingStructs.update, encodedTargetStateVector)); } if (updates.length > 1) { if (encoder.constructor === UpdateEncoderV1) { return mergeUpdates(updates.map((update, i) => i === 0 ? update : convertUpdateFormatV2ToV1(update))); } else if (encoder.constructor === UpdateEncoderV2) { return mergeUpdatesV2(updates); } } return updates[0]; }; var encodeStateAsUpdate = (doc2, encodedTargetStateVector) => encodeStateAsUpdateV2(doc2, encodedTargetStateVector, new UpdateEncoderV1()); var readStateVector = (decoder) => { const ss = /* @__PURE__ */ new Map(); const ssLength = readVarUint(decoder.restDecoder); for (let i = 0; i < ssLength; i++) { const client = readVarUint(decoder.restDecoder); const clock = readVarUint(decoder.restDecoder); ss.set(client, clock); } return ss; }; var decodeStateVector = (decodedState) => readStateVector(new DSDecoderV1(createDecoder(decodedState))); var writeStateVector = (encoder, sv) => { writeVarUint(encoder.restEncoder, sv.size); from(sv.entries()).sort((a, b) => b[0] - a[0]).forEach(([client, clock]) => { writeVarUint(encoder.restEncoder, client); writeVarUint(encoder.restEncoder, clock); }); return encoder; }; var writeDocumentStateVector = (encoder, doc2) => writeStateVector(encoder, getStateVector(doc2.store)); var encodeStateVectorV2 = (doc2, encoder = new DSEncoderV2()) => { if (doc2 instanceof Map) { writeStateVector(encoder, doc2); } else { writeDocumentStateVector(encoder, doc2); } return encoder.toUint8Array(); }; var encodeStateVector = (doc2) => encodeStateVectorV2(doc2, new DSEncoderV1()); var EventHandler = class { constructor() { this.l = []; } }; var createEventHandler = () => new EventHandler(); var addEventHandlerListener = (eventHandler, f) => eventHandler.l.push(f); var removeEventHandlerListener = (eventHandler, f) => { const l = eventHandler.l; const len = l.length; eventHandler.l = l.filter((g) => f !== g); if (len === eventHandler.l.length) { console.error("[yjs] Tried to remove event handler that doesn't exist."); } }; var callEventHandlerListeners = (eventHandler, arg0, arg1) => callAll(eventHandler.l, [arg0, arg1]); var ID = class { /** * @param {number} client client id * @param {number} clock unique per client id, continuous number */ constructor(client, clock) { this.client = client; this.clock = clock; } }; var compareIDs = (a, b) => a === b || a !== null && b !== null && a.client === b.client && a.clock === b.clock; var createID = (client, clock) => new ID(client, clock); var writeID = (encoder, id2) => { writeVarUint(encoder, id2.client); writeVarUint(encoder, id2.clock); }; var readID = (decoder) => createID(readVarUint(decoder), readVarUint(decoder)); var findRootTypeKey = (type) => { for (const [key, value] of type.doc.share.entries()) { if (value === type) { return key; } } throw unexpectedCase(); }; var isParentOf = (parent, child) => { while (child !== null) { if (child.parent === parent) { return true; } child = /** @type {AbstractType} */ child.parent._item; } return false; }; var logType = (type) => { const res = []; let n = type._start; while (n) { res.push(n); n = n.right; } console.log("Children: ", res); console.log("Children content: ", res.filter((m) => !m.deleted).map((m) => m.content)); }; var PermanentUserData = class { /** * @param {Doc} doc * @param {YMap} [storeType] */ constructor(doc2, storeType = doc2.getMap("users")) { const dss = /* @__PURE__ */ new Map(); this.yusers = storeType; this.doc = doc2; this.clients = /* @__PURE__ */ new Map(); this.dss = dss; const initUser = (user, userDescription) => { const ds = user.get("ds"); const ids = user.get("ids"); const addClientId = ( /** @param {number} clientid */ (clientid) => this.clients.set(clientid, userDescription) ); ds.observe( /** @param {YArrayEvent} event */ (event) => { event.changes.added.forEach((item) => { item.content.getContent().forEach((encodedDs) => { if (encodedDs instanceof Uint8Array) { this.dss.set(userDescription, mergeDeleteSets([this.dss.get(userDescription) || createDeleteSet(), readDeleteSet(new DSDecoderV1(createDecoder(encodedDs)))])); } }); }); } ); this.dss.set(userDescription, mergeDeleteSets(ds.map((encodedDs) => readDeleteSet(new DSDecoderV1(createDecoder(encodedDs)))))); ids.observe( /** @param {YArrayEvent} event */ (event) => event.changes.added.forEach((item) => item.content.getContent().forEach(addClientId)) ); ids.forEach(addClientId); }; storeType.observe((event) => { event.keysChanged.forEach( (userDescription) => initUser(storeType.get(userDescription), userDescription) ); }); storeType.forEach(initUser); } /** * @param {Doc} doc * @param {number} clientid * @param {string} userDescription * @param {Object} conf * @param {function(Transaction, DeleteSet):boolean} [conf.filter] */ setUserMapping(doc2, clientid, userDescription, { filter = () => true } = {}) { const users2 = this.yusers; let user = users2.get(userDescription); if (!user) { user = new YMap(); user.set("ids", new YArray()); user.set("ds", new YArray()); users2.set(userDescription, user); } user.get("ids").push([clientid]); users2.observe((_event) => { setTimeout(() => { const userOverwrite = users2.get(userDescription); if (userOverwrite !== user) { user = userOverwrite; this.clients.forEach((_userDescription, clientid2) => { if (userDescription === _userDescription) { user.get("ids").push([clientid2]); } }); const encoder = new DSEncoderV1(); const ds = this.dss.get(userDescription); if (ds) { writeDeleteSet(encoder, ds); user.get("ds").push([encoder.toUint8Array()]); } } }, 0); }); doc2.on( "afterTransaction", /** @param {Transaction} transaction */ (transaction) => { setTimeout(() => { const yds = user.get("ds"); const ds = transaction.deleteSet; if (transaction.local && ds.clients.size > 0 && filter(transaction, ds)) { const encoder = new DSEncoderV1(); writeDeleteSet(encoder, ds); yds.push([encoder.toUint8Array()]); } }); } ); } /** * @param {number} clientid * @return {any} */ getUserByClientId(clientid) { return this.clients.get(clientid) || null; } /** * @param {ID} id * @return {string | null} */ getUserByDeletedId(id2) { for (const [userDescription, ds] of this.dss.entries()) { if (isDeleted(ds, id2)) { return userDescription; } } return null; } }; var RelativePosition = class { /** * @param {ID|null} type * @param {string|null} tname * @param {ID|null} item * @param {number} assoc */ constructor(type, tname, item, assoc = 0) { this.type = type; this.tname = tname; this.item = item; this.assoc = assoc; } }; var relativePositionToJSON = (rpos) => { const json = {}; if (rpos.type) { json.type = rpos.type; } if (rpos.tname) { json.tname = rpos.tname; } if (rpos.item) { json.item = rpos.item; } if (rpos.assoc != null) { json.assoc = rpos.assoc; } return json; }; var createRelativePositionFromJSON = (json) => new RelativePosition(json.type == null ? null : createID(json.type.client, json.type.clock), json.tname ?? null, json.item == null ? null : createID(json.item.client, json.item.clock), json.assoc == null ? 0 : json.assoc); var AbsolutePosition = class { /** * @param {AbstractType} type * @param {number} index * @param {number} [assoc] */ constructor(type, index, assoc = 0) { this.type = type; this.index = index; this.assoc = assoc; } }; var createAbsolutePosition = (type, index, assoc = 0) => new AbsolutePosition(type, index, assoc); var createRelativePosition = (type, item, assoc) => { let typeid = null; let tname = null; if (type._item === null) { tname = findRootTypeKey(type); } else { typeid = createID(type._item.id.client, type._item.id.clock); } return new RelativePosition(typeid, tname, item, assoc); }; var createRelativePositionFromTypeIndex = (type, index, assoc = 0) => { let t = type._start; if (assoc < 0) { if (index === 0) { return createRelativePosition(type, null, assoc); } index--; } while (t !== null) { if (!t.deleted && t.countable) { if (t.length > index) { return createRelativePosition(type, createID(t.id.client, t.id.clock + index), assoc); } index -= t.length; } if (t.right === null && assoc < 0) { return createRelativePosition(type, t.lastId, assoc); } t = t.right; } return createRelativePosition(type, null, assoc); }; var writeRelativePosition = (encoder, rpos) => { const { type, tname, item, assoc } = rpos; if (item !== null) { writeVarUint(encoder, 0); writeID(encoder, item); } else if (tname !== null) { writeUint8(encoder, 1); writeVarString(encoder, tname); } else if (type !== null) { writeUint8(encoder, 2); writeID(encoder, type); } else { throw unexpectedCase(); } writeVarInt(encoder, assoc); return encoder; }; var encodeRelativePosition = (rpos) => { const encoder = createEncoder(); writeRelativePosition(encoder, rpos); return toUint8Array(encoder); }; var readRelativePosition = (decoder) => { let type = null; let tname = null; let itemID = null; switch (readVarUint(decoder)) { case 0: itemID = readID(decoder); break; case 1: tname = readVarString(decoder); break; case 2: { type = readID(decoder); } } const assoc = hasContent(decoder) ? readVarInt(decoder) : 0; return new RelativePosition(type, tname, itemID, assoc); }; var decodeRelativePosition = (uint8Array) => readRelativePosition(createDecoder(uint8Array)); var getItemWithOffset = (store2, id2) => { const item = getItem(store2, id2); const diff = id2.clock - item.id.clock; return { item, diff }; }; var createAbsolutePositionFromRelativePosition = (rpos, doc2, followUndoneDeletions = true) => { const store2 = doc2.store; const rightID = rpos.item; const typeID = rpos.type; const tname = rpos.tname; const assoc = rpos.assoc; let type = null; let index = 0; if (rightID !== null) { if (getState(store2, rightID.client) <= rightID.clock) { return null; } const res = followUndoneDeletions ? followRedone(store2, rightID) : getItemWithOffset(store2, rightID); const right = res.item; if (!(right instanceof Item)) { return null; } type = /** @type {AbstractType} */ right.parent; if (type._item === null || !type._item.deleted) { index = right.deleted || !right.countable ? 0 : res.diff + (assoc >= 0 ? 0 : 1); let n = right.left; while (n !== null) { if (!n.deleted && n.countable) { index += n.length; } n = n.left; } } } else { if (tname !== null) { type = doc2.get(tname); } else if (typeID !== null) { if (getState(store2, typeID.client) <= typeID.clock) { return null; } const { item } = followUndoneDeletions ? followRedone(store2, typeID) : { item: getItem(store2, typeID) }; if (item instanceof Item && item.content instanceof ContentType) { type = item.content.type; } else { return null; } } else { throw unexpectedCase(); } if (assoc >= 0) { index = type._length; } else { index = 0; } } return createAbsolutePosition(type, index, rpos.assoc); }; var compareRelativePositions = (a, b) => a === b || a !== null && b !== null && a.tname === b.tname && compareIDs(a.item, b.item) && compareIDs(a.type, b.type) && a.assoc === b.assoc; var Snapshot = class { /** * @param {DeleteSet} ds * @param {Map} sv state map */ constructor(ds, sv) { this.ds = ds; this.sv = sv; } }; var equalSnapshots = (snap1, snap2) => { const ds1 = snap1.ds.clients; const ds2 = snap2.ds.clients; const sv1 = snap1.sv; const sv2 = snap2.sv; if (sv1.size !== sv2.size || ds1.size !== ds2.size) { return false; } for (const [key, value] of sv1.entries()) { if (sv2.get(key) !== value) { return false; } } for (const [client, dsitems1] of ds1.entries()) { const dsitems2 = ds2.get(client) || []; if (dsitems1.length !== dsitems2.length) { return false; } for (let i = 0; i < dsitems1.length; i++) { const dsitem1 = dsitems1[i]; const dsitem2 = dsitems2[i]; if (dsitem1.clock !== dsitem2.clock || dsitem1.len !== dsitem2.len) { return false; } } } return true; }; var encodeSnapshotV2 = (snapshot2, encoder = new DSEncoderV2()) => { writeDeleteSet(encoder, snapshot2.ds); writeStateVector(encoder, snapshot2.sv); return encoder.toUint8Array(); }; var encodeSnapshot = (snapshot2) => encodeSnapshotV2(snapshot2, new DSEncoderV1()); var decodeSnapshotV2 = (buf, decoder = new DSDecoderV2(createDecoder(buf))) => { return new Snapshot(readDeleteSet(decoder), readStateVector(decoder)); }; var decodeSnapshot = (buf) => decodeSnapshotV2(buf, new DSDecoderV1(createDecoder(buf))); var createSnapshot = (ds, sm) => new Snapshot(ds, sm); var emptySnapshot = createSnapshot(createDeleteSet(), /* @__PURE__ */ new Map()); var snapshot = (doc2) => createSnapshot(createDeleteSetFromStructStore(doc2.store), getStateVector(doc2.store)); var isVisible = (item, snapshot2) => snapshot2 === void 0 ? !item.deleted : snapshot2.sv.has(item.id.client) && (snapshot2.sv.get(item.id.client) || 0) > item.id.clock && !isDeleted(snapshot2.ds, item.id); var splitSnapshotAffectedStructs = (transaction, snapshot2) => { const meta = setIfUndefined(transaction.meta, splitSnapshotAffectedStructs, create2); const store2 = transaction.doc.store; if (!meta.has(snapshot2)) { snapshot2.sv.forEach((clock, client) => { if (clock < getState(store2, client)) { getItemCleanStart(transaction, createID(client, clock)); } }); iterateDeletedStructs(transaction, snapshot2.ds, (_item) => { }); meta.add(snapshot2); } }; var createDocFromSnapshot = (originDoc, snapshot2, newDoc = new Doc()) => { if (originDoc.gc) { throw new Error("Garbage-collection must be disabled in `originDoc`!"); } const { sv, ds } = snapshot2; const encoder = new UpdateEncoderV2(); originDoc.transact((transaction) => { let size2 = 0; sv.forEach((clock) => { if (clock > 0) { size2++; } }); writeVarUint(encoder.restEncoder, size2); for (const [client, clock] of sv) { if (clock === 0) { continue; } if (clock < getState(originDoc.store, client)) { getItemCleanStart(transaction, createID(client, clock)); } const structs = originDoc.store.clients.get(client) || []; const lastStructIndex = findIndexSS(structs, clock - 1); writeVarUint(encoder.restEncoder, lastStructIndex + 1); encoder.writeClient(client); writeVarUint(encoder.restEncoder, 0); for (let i = 0; i <= lastStructIndex; i++) { structs[i].write(encoder, 0); } } writeDeleteSet(encoder, ds); }); applyUpdateV2(newDoc, encoder.toUint8Array(), "snapshot"); return newDoc; }; var snapshotContainsUpdateV2 = (snapshot2, update, YDecoder = UpdateDecoderV2) => { const updateDecoder = new YDecoder(createDecoder(update)); const lazyDecoder = new LazyStructReader(updateDecoder, false); for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) { if ((snapshot2.sv.get(curr.id.client) || 0) < curr.id.clock + curr.length) { return false; } } const mergedDS = mergeDeleteSets([snapshot2.ds, readDeleteSet(updateDecoder)]); return equalDeleteSets(snapshot2.ds, mergedDS); }; var snapshotContainsUpdate = (snapshot2, update) => snapshotContainsUpdateV2(snapshot2, update, UpdateDecoderV1); var StructStore = class { constructor() { this.clients = /* @__PURE__ */ new Map(); this.pendingStructs = null; this.pendingDs = null; } }; var getStateVector = (store2) => { const sm = /* @__PURE__ */ new Map(); store2.clients.forEach((structs, client) => { const struct = structs[structs.length - 1]; sm.set(client, struct.id.clock + struct.length); }); return sm; }; var getState = (store2, client) => { const structs = store2.clients.get(client); if (structs === void 0) { return 0; } const lastStruct = structs[structs.length - 1]; return lastStruct.id.clock + lastStruct.length; }; var addStruct = (store2, struct) => { let structs = store2.clients.get(struct.id.client); if (structs === void 0) { structs = []; store2.clients.set(struct.id.client, structs); } else { const lastStruct = structs[structs.length - 1]; if (lastStruct.id.clock + lastStruct.length !== struct.id.clock) { throw unexpectedCase(); } } structs.push(struct); }; var findIndexSS = (structs, clock) => { let left = 0; let right = structs.length - 1; let mid = structs[right]; let midclock = mid.id.clock; if (midclock === clock) { return right; } let midindex = floor(clock / (midclock + mid.length - 1) * right); while (left <= right) { mid = structs[midindex]; midclock = mid.id.clock; if (midclock <= clock) { if (clock < midclock + mid.length) { return midindex; } left = midindex + 1; } else { right = midindex - 1; } midindex = floor((left + right) / 2); } throw unexpectedCase(); }; var find = (store2, id2) => { const structs = store2.clients.get(id2.client); return structs[findIndexSS(structs, id2.clock)]; }; var getItem = ( /** @type {function(StructStore,ID):Item} */ find ); var findIndexCleanStart = (transaction, structs, clock) => { const index = findIndexSS(structs, clock); const struct = structs[index]; if (struct.id.clock < clock && struct instanceof Item) { structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock)); return index + 1; } return index; }; var getItemCleanStart = (transaction, id2) => { const structs = ( /** @type {Array} */ transaction.doc.store.clients.get(id2.client) ); return structs[findIndexCleanStart(transaction, structs, id2.clock)]; }; var getItemCleanEnd = (transaction, store2, id2) => { const structs = store2.clients.get(id2.client); const index = findIndexSS(structs, id2.clock); const struct = structs[index]; if (id2.clock !== struct.id.clock + struct.length - 1 && struct.constructor !== GC) { structs.splice(index + 1, 0, splitItem(transaction, struct, id2.clock - struct.id.clock + 1)); } return struct; }; var replaceStruct = (store2, struct, newStruct) => { const structs = ( /** @type {Array} */ store2.clients.get(struct.id.client) ); structs[findIndexSS(structs, struct.id.clock)] = newStruct; }; var iterateStructs = (transaction, structs, clockStart, len, f) => { if (len === 0) { return; } const clockEnd = clockStart + len; let index = findIndexCleanStart(transaction, structs, clockStart); let struct; do { struct = structs[index++]; if (clockEnd < struct.id.clock + struct.length) { findIndexCleanStart(transaction, structs, clockEnd); } f(struct); } while (index < structs.length && structs[index].id.clock < clockEnd); }; var Transaction = class { /** * @param {Doc} doc * @param {any} origin * @param {boolean} local */ constructor(doc2, origin2, local) { this.doc = doc2; this.deleteSet = new DeleteSet(); this.beforeState = getStateVector(doc2.store); this.afterState = /* @__PURE__ */ new Map(); this.changed = /* @__PURE__ */ new Map(); this.changedParentTypes = /* @__PURE__ */ new Map(); this._mergeStructs = []; this.origin = origin2; this.meta = /* @__PURE__ */ new Map(); this.local = local; this.subdocsAdded = /* @__PURE__ */ new Set(); this.subdocsRemoved = /* @__PURE__ */ new Set(); this.subdocsLoaded = /* @__PURE__ */ new Set(); this._needFormattingCleanup = false; } }; var writeUpdateMessageFromTransaction = (encoder, transaction) => { if (transaction.deleteSet.clients.size === 0 && !any(transaction.afterState, (clock, client) => transaction.beforeState.get(client) !== clock)) { return false; } sortAndMergeDeleteSet(transaction.deleteSet); writeStructsFromTransaction(encoder, transaction); writeDeleteSet(encoder, transaction.deleteSet); return true; }; var addChangedTypeToTransaction = (transaction, type, parentSub) => { const item = type._item; if (item === null || item.id.clock < (transaction.beforeState.get(item.id.client) || 0) && !item.deleted) { setIfUndefined(transaction.changed, type, create2).add(parentSub); } }; var tryToMergeWithLefts = (structs, pos) => { let right = structs[pos]; let left = structs[pos - 1]; let i = pos; for (; i > 0; right = left, left = structs[--i - 1]) { if (left.deleted === right.deleted && left.constructor === right.constructor) { if (left.mergeWith(right)) { if (right instanceof Item && right.parentSub !== null && /** @type {AbstractType} */ right.parent._map.get(right.parentSub) === right) { right.parent._map.set( right.parentSub, /** @type {Item} */ left ); } continue; } } break; } const merged = pos - i; if (merged) { structs.splice(pos + 1 - merged, merged); } return merged; }; var tryGcDeleteSet = (ds, store2, gcFilter) => { for (const [client, deleteItems] of ds.clients.entries()) { const structs = ( /** @type {Array} */ store2.clients.get(client) ); for (let di = deleteItems.length - 1; di >= 0; di--) { const deleteItem = deleteItems[di]; const endDeleteItemClock = deleteItem.clock + deleteItem.len; for (let si = findIndexSS(structs, deleteItem.clock), struct = structs[si]; si < structs.length && struct.id.clock < endDeleteItemClock; struct = structs[++si]) { const struct2 = structs[si]; if (deleteItem.clock + deleteItem.len <= struct2.id.clock) { break; } if (struct2 instanceof Item && struct2.deleted && !struct2.keep && gcFilter(struct2)) { struct2.gc(store2, false); } } } } }; var tryMergeDeleteSet = (ds, store2) => { ds.clients.forEach((deleteItems, client) => { const structs = ( /** @type {Array} */ store2.clients.get(client) ); for (let di = deleteItems.length - 1; di >= 0; di--) { const deleteItem = deleteItems[di]; const mostRightIndexToCheck = min(structs.length - 1, 1 + findIndexSS(structs, deleteItem.clock + deleteItem.len - 1)); for (let si = mostRightIndexToCheck, struct = structs[si]; si > 0 && struct.id.clock >= deleteItem.clock; struct = structs[si]) { si -= 1 + tryToMergeWithLefts(structs, si); } } }); }; var tryGc = (ds, store2, gcFilter) => { tryGcDeleteSet(ds, store2, gcFilter); tryMergeDeleteSet(ds, store2); }; var cleanupTransactions = (transactionCleanups, i) => { if (i < transactionCleanups.length) { const transaction = transactionCleanups[i]; const doc2 = transaction.doc; const store2 = doc2.store; const ds = transaction.deleteSet; const mergeStructs = transaction._mergeStructs; try { sortAndMergeDeleteSet(ds); transaction.afterState = getStateVector(transaction.doc.store); doc2.emit("beforeObserverCalls", [transaction, doc2]); const fs = []; transaction.changed.forEach( (subs, itemtype) => fs.push(() => { if (itemtype._item === null || !itemtype._item.deleted) { itemtype._callObserver(transaction, subs); } }) ); fs.push(() => { transaction.changedParentTypes.forEach((events, type) => { if (type._dEH.l.length > 0 && (type._item === null || !type._item.deleted)) { events = events.filter( (event) => event.target._item === null || !event.target._item.deleted ); events.forEach((event) => { event.currentTarget = type; event._path = null; }); events.sort((event1, event2) => event1.path.length - event2.path.length); fs.push(() => { callEventHandlerListeners(type._dEH, events, transaction); }); } }); fs.push(() => doc2.emit("afterTransaction", [transaction, doc2])); fs.push(() => { if (transaction._needFormattingCleanup) { cleanupYTextAfterTransaction(transaction); } }); }); callAll(fs, []); } finally { if (doc2.gc) { tryGcDeleteSet(ds, store2, doc2.gcFilter); } tryMergeDeleteSet(ds, store2); transaction.afterState.forEach((clock, client) => { const beforeClock = transaction.beforeState.get(client) || 0; if (beforeClock !== clock) { const structs = ( /** @type {Array} */ store2.clients.get(client) ); const firstChangePos = max(findIndexSS(structs, beforeClock), 1); for (let i2 = structs.length - 1; i2 >= firstChangePos; ) { i2 -= 1 + tryToMergeWithLefts(structs, i2); } } }); for (let i2 = mergeStructs.length - 1; i2 >= 0; i2--) { const { client, clock } = mergeStructs[i2].id; const structs = ( /** @type {Array} */ store2.clients.get(client) ); const replacedStructPos = findIndexSS(structs, clock); if (replacedStructPos + 1 < structs.length) { if (tryToMergeWithLefts(structs, replacedStructPos + 1) > 1) { continue; } } if (replacedStructPos > 0) { tryToMergeWithLefts(structs, replacedStructPos); } } if (!transaction.local && transaction.afterState.get(doc2.clientID) !== transaction.beforeState.get(doc2.clientID)) { print(ORANGE, BOLD, "[yjs] ", UNBOLD, RED, "Changed the client-id because another client seems to be using it."); doc2.clientID = generateNewClientId(); } doc2.emit("afterTransactionCleanup", [transaction, doc2]); if (doc2._observers.has("update")) { const encoder = new UpdateEncoderV1(); const hasContent2 = writeUpdateMessageFromTransaction(encoder, transaction); if (hasContent2) { doc2.emit("update", [encoder.toUint8Array(), transaction.origin, doc2, transaction]); } } if (doc2._observers.has("updateV2")) { const encoder = new UpdateEncoderV2(); const hasContent2 = writeUpdateMessageFromTransaction(encoder, transaction); if (hasContent2) { doc2.emit("updateV2", [encoder.toUint8Array(), transaction.origin, doc2, transaction]); } } const { subdocsAdded, subdocsLoaded, subdocsRemoved } = transaction; if (subdocsAdded.size > 0 || subdocsRemoved.size > 0 || subdocsLoaded.size > 0) { subdocsAdded.forEach((subdoc) => { subdoc.clientID = doc2.clientID; if (subdoc.collectionid == null) { subdoc.collectionid = doc2.collectionid; } doc2.subdocs.add(subdoc); }); subdocsRemoved.forEach((subdoc) => doc2.subdocs.delete(subdoc)); doc2.emit("subdocs", [{ loaded: subdocsLoaded, added: subdocsAdded, removed: subdocsRemoved }, doc2, transaction]); subdocsRemoved.forEach((subdoc) => subdoc.destroy()); } if (transactionCleanups.length <= i + 1) { doc2._transactionCleanups = []; doc2.emit("afterAllTransactions", [doc2, transactionCleanups]); } else { cleanupTransactions(transactionCleanups, i + 1); } } } }; var transact = (doc2, f, origin2 = null, local = true) => { const transactionCleanups = doc2._transactionCleanups; let initialCall = false; let result = null; if (doc2._transaction === null) { initialCall = true; doc2._transaction = new Transaction(doc2, origin2, local); transactionCleanups.push(doc2._transaction); if (transactionCleanups.length === 1) { doc2.emit("beforeAllTransactions", [doc2]); } doc2.emit("beforeTransaction", [doc2._transaction, doc2]); } try { result = f(doc2._transaction); } finally { if (initialCall) { const finishCleanup = doc2._transaction === transactionCleanups[0]; doc2._transaction = null; if (finishCleanup) { cleanupTransactions(transactionCleanups, 0); } } } return result; }; var StackItem = class { /** * @param {DeleteSet} deletions * @param {DeleteSet} insertions */ constructor(deletions, insertions) { this.insertions = insertions; this.deletions = deletions; this.meta = /* @__PURE__ */ new Map(); } }; var clearUndoManagerStackItem = (tr, um, stackItem) => { iterateDeletedStructs(tr, stackItem.deletions, (item) => { if (item instanceof Item && um.scope.some((type) => type === tr.doc || isParentOf( /** @type {AbstractType} */ type, item ))) { keepItem(item, false); } }); }; var popStackItem = (undoManager2, stack, eventType) => { let _tr = null; const doc2 = undoManager2.doc; const scope = undoManager2.scope; transact(doc2, (transaction) => { while (stack.length > 0 && undoManager2.currStackItem === null) { const store2 = doc2.store; const stackItem = ( /** @type {StackItem} */ stack.pop() ); const itemsToRedo = /* @__PURE__ */ new Set(); const itemsToDelete = []; let performedChange = false; iterateDeletedStructs(transaction, stackItem.insertions, (struct) => { if (struct instanceof Item) { if (struct.redone !== null) { let { item, diff } = followRedone(store2, struct.id); if (diff > 0) { item = getItemCleanStart(transaction, createID(item.id.client, item.id.clock + diff)); } struct = item; } if (!struct.deleted && scope.some((type) => type === transaction.doc || isParentOf( /** @type {AbstractType} */ type, /** @type {Item} */ struct ))) { itemsToDelete.push(struct); } } }); iterateDeletedStructs(transaction, stackItem.deletions, (struct) => { if (struct instanceof Item && scope.some((type) => type === transaction.doc || isParentOf( /** @type {AbstractType} */ type, struct )) && // Never redo structs in stackItem.insertions because they were created and deleted in the same capture interval. !isDeleted(stackItem.insertions, struct.id)) { itemsToRedo.add(struct); } }); itemsToRedo.forEach((struct) => { performedChange = redoItem(transaction, struct, itemsToRedo, stackItem.insertions, undoManager2.ignoreRemoteMapChanges, undoManager2) !== null || performedChange; }); for (let i = itemsToDelete.length - 1; i >= 0; i--) { const item = itemsToDelete[i]; if (undoManager2.deleteFilter(item)) { item.delete(transaction); performedChange = true; } } undoManager2.currStackItem = performedChange ? stackItem : null; } transaction.changed.forEach((subProps, type) => { if (subProps.has(null) && type._searchMarker) { type._searchMarker.length = 0; } }); _tr = transaction; }, undoManager2); const res = undoManager2.currStackItem; if (res != null) { const changedParentTypes = _tr.changedParentTypes; undoManager2.emit("stack-item-popped", [{ stackItem: res, type: eventType, changedParentTypes, origin: undoManager2 }, undoManager2]); undoManager2.currStackItem = null; } return res; }; var UndoManager = class extends ObservableV2 { /** * @param {Doc|AbstractType|Array>} typeScope Limits the scope of the UndoManager. If this is set to a ydoc instance, all changes on that ydoc will be undone. If set to a specific type, only changes on that type or its children will be undone. Also accepts an array of types. * @param {UndoManagerOptions} options */ constructor(typeScope, { captureTimeout = 500, captureTransaction = (_tr) => true, deleteFilter = () => true, trackedOrigins = /* @__PURE__ */ new Set([null]), ignoreRemoteMapChanges = false, doc: doc2 = ( /** @type {Doc} */ isArray(typeScope) ? typeScope[0].doc : typeScope instanceof Doc ? typeScope : typeScope.doc ) } = {}) { super(); this.scope = []; this.doc = doc2; this.addToScope(typeScope); this.deleteFilter = deleteFilter; trackedOrigins.add(this); this.trackedOrigins = trackedOrigins; this.captureTransaction = captureTransaction; this.undoStack = []; this.redoStack = []; this.undoing = false; this.redoing = false; this.currStackItem = null; this.lastChange = 0; this.ignoreRemoteMapChanges = ignoreRemoteMapChanges; this.captureTimeout = captureTimeout; this.afterTransactionHandler = (transaction) => { if (!this.captureTransaction(transaction) || !this.scope.some((type) => transaction.changedParentTypes.has( /** @type {AbstractType} */ type ) || type === this.doc) || !this.trackedOrigins.has(transaction.origin) && (!transaction.origin || !this.trackedOrigins.has(transaction.origin.constructor))) { return; } const undoing = this.undoing; const redoing = this.redoing; const stack = undoing ? this.redoStack : this.undoStack; if (undoing) { this.stopCapturing(); } else if (!redoing) { this.clear(false, true); } const insertions = new DeleteSet(); transaction.afterState.forEach((endClock, client) => { const startClock = transaction.beforeState.get(client) || 0; const len = endClock - startClock; if (len > 0) { addToDeleteSet(insertions, client, startClock, len); } }); const now = getUnixTime(); let didAdd = false; if (this.lastChange > 0 && now - this.lastChange < this.captureTimeout && stack.length > 0 && !undoing && !redoing) { const lastOp = stack[stack.length - 1]; lastOp.deletions = mergeDeleteSets([lastOp.deletions, transaction.deleteSet]); lastOp.insertions = mergeDeleteSets([lastOp.insertions, insertions]); } else { stack.push(new StackItem(transaction.deleteSet, insertions)); didAdd = true; } if (!undoing && !redoing) { this.lastChange = now; } iterateDeletedStructs( transaction, transaction.deleteSet, /** @param {Item|GC} item */ (item) => { if (item instanceof Item && this.scope.some((type) => type === transaction.doc || isParentOf( /** @type {AbstractType} */ type, item ))) { keepItem(item, true); } } ); const changeEvent = [{ stackItem: stack[stack.length - 1], origin: transaction.origin, type: undoing ? "redo" : "undo", changedParentTypes: transaction.changedParentTypes }, this]; if (didAdd) { this.emit("stack-item-added", changeEvent); } else { this.emit("stack-item-updated", changeEvent); } }; this.doc.on("afterTransaction", this.afterTransactionHandler); this.doc.on("destroy", () => { this.destroy(); }); } /** * Extend the scope. * * @param {Array | Doc> | AbstractType | Doc} ytypes */ addToScope(ytypes) { const tmpSet = new Set(this.scope); ytypes = isArray(ytypes) ? ytypes : [ytypes]; ytypes.forEach((ytype) => { if (!tmpSet.has(ytype)) { tmpSet.add(ytype); if (ytype instanceof AbstractType ? ytype.doc !== this.doc : ytype !== this.doc) warn("[yjs#509] Not same Y.Doc"); this.scope.push(ytype); } }); } /** * @param {any} origin */ addTrackedOrigin(origin2) { this.trackedOrigins.add(origin2); } /** * @param {any} origin */ removeTrackedOrigin(origin2) { this.trackedOrigins.delete(origin2); } clear(clearUndoStack = true, clearRedoStack = true) { if (clearUndoStack && this.canUndo() || clearRedoStack && this.canRedo()) { this.doc.transact((tr) => { if (clearUndoStack) { this.undoStack.forEach((item) => clearUndoManagerStackItem(tr, this, item)); this.undoStack = []; } if (clearRedoStack) { this.redoStack.forEach((item) => clearUndoManagerStackItem(tr, this, item)); this.redoStack = []; } this.emit("stack-cleared", [{ undoStackCleared: clearUndoStack, redoStackCleared: clearRedoStack }]); }); } } /** * UndoManager merges Undo-StackItem if they are created within time-gap * smaller than `options.captureTimeout`. Call `um.stopCapturing()` so that the next * StackItem won't be merged. * * * @example * // without stopCapturing * ytext.insert(0, 'a') * ytext.insert(1, 'b') * um.undo() * ytext.toString() // => '' (note that 'ab' was removed) * // with stopCapturing * ytext.insert(0, 'a') * um.stopCapturing() * ytext.insert(0, 'b') * um.undo() * ytext.toString() // => 'a' (note that only 'b' was removed) * */ stopCapturing() { this.lastChange = 0; } /** * Undo last changes on type. * * @return {StackItem?} Returns StackItem if a change was applied */ undo() { this.undoing = true; let res; try { res = popStackItem(this, this.undoStack, "undo"); } finally { this.undoing = false; } return res; } /** * Redo last undo operation. * * @return {StackItem?} Returns StackItem if a change was applied */ redo() { this.redoing = true; let res; try { res = popStackItem(this, this.redoStack, "redo"); } finally { this.redoing = false; } return res; } /** * Are undo steps available? * * @return {boolean} `true` if undo is possible */ canUndo() { return this.undoStack.length > 0; } /** * Are redo steps available? * * @return {boolean} `true` if redo is possible */ canRedo() { return this.redoStack.length > 0; } destroy() { this.trackedOrigins.delete(this); this.doc.off("afterTransaction", this.afterTransactionHandler); super.destroy(); } }; function* lazyStructReaderGenerator(decoder) { const numOfStateUpdates = readVarUint(decoder.restDecoder); for (let i = 0; i < numOfStateUpdates; i++) { const numberOfStructs = readVarUint(decoder.restDecoder); const client = decoder.readClient(); let clock = readVarUint(decoder.restDecoder); for (let i2 = 0; i2 < numberOfStructs; i2++) { const info = decoder.readInfo(); if (info === 10) { const len = readVarUint(decoder.restDecoder); yield new Skip(createID(client, clock), len); clock += len; } else if ((BITS5 & info) !== 0) { const cantCopyParentInfo = (info & (BIT7 | BIT8)) === 0; const struct = new Item( createID(client, clock), null, // left (info & BIT8) === BIT8 ? decoder.readLeftID() : null, // origin null, // right (info & BIT7) === BIT7 ? decoder.readRightID() : null, // right origin // @ts-ignore Force writing a string here. cantCopyParentInfo ? decoder.readParentInfo() ? decoder.readString() : decoder.readLeftID() : null, // parent cantCopyParentInfo && (info & BIT6) === BIT6 ? decoder.readString() : null, // parentSub readItemContent(decoder, info) // item content ); yield struct; clock += struct.length; } else { const len = decoder.readLen(); yield new GC(createID(client, clock), len); clock += len; } } } } var LazyStructReader = class { /** * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder * @param {boolean} filterSkips */ constructor(decoder, filterSkips) { this.gen = lazyStructReaderGenerator(decoder); this.curr = null; this.done = false; this.filterSkips = filterSkips; this.next(); } /** * @return {Item | GC | Skip |null} */ next() { do { this.curr = this.gen.next().value || null; } while (this.filterSkips && this.curr !== null && this.curr.constructor === Skip); return this.curr; } }; var logUpdate = (update) => logUpdateV2(update, UpdateDecoderV1); var logUpdateV2 = (update, YDecoder = UpdateDecoderV2) => { const structs = []; const updateDecoder = new YDecoder(createDecoder(update)); const lazyDecoder = new LazyStructReader(updateDecoder, false); for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) { structs.push(curr); } print("Structs: ", structs); const ds = readDeleteSet(updateDecoder); print("DeleteSet: ", ds); }; var decodeUpdate = (update) => decodeUpdateV2(update, UpdateDecoderV1); var decodeUpdateV2 = (update, YDecoder = UpdateDecoderV2) => { const structs = []; const updateDecoder = new YDecoder(createDecoder(update)); const lazyDecoder = new LazyStructReader(updateDecoder, false); for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) { structs.push(curr); } return { structs, ds: readDeleteSet(updateDecoder) }; }; var LazyStructWriter = class { /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder */ constructor(encoder) { this.currClient = 0; this.startClock = 0; this.written = 0; this.encoder = encoder; this.clientStructs = []; } }; var mergeUpdates = (updates) => mergeUpdatesV2(updates, UpdateDecoderV1, UpdateEncoderV1); var encodeStateVectorFromUpdateV2 = (update, YEncoder = DSEncoderV2, YDecoder = UpdateDecoderV2) => { const encoder = new YEncoder(); const updateDecoder = new LazyStructReader(new YDecoder(createDecoder(update)), false); let curr = updateDecoder.curr; if (curr !== null) { let size2 = 0; let currClient = curr.id.client; let stopCounting = curr.id.clock !== 0; let currClock = stopCounting ? 0 : curr.id.clock + curr.length; for (; curr !== null; curr = updateDecoder.next()) { if (currClient !== curr.id.client) { if (currClock !== 0) { size2++; writeVarUint(encoder.restEncoder, currClient); writeVarUint(encoder.restEncoder, currClock); } currClient = curr.id.client; currClock = 0; stopCounting = curr.id.clock !== 0; } if (curr.constructor === Skip) { stopCounting = true; } if (!stopCounting) { currClock = curr.id.clock + curr.length; } } if (currClock !== 0) { size2++; writeVarUint(encoder.restEncoder, currClient); writeVarUint(encoder.restEncoder, currClock); } const enc = createEncoder(); writeVarUint(enc, size2); writeBinaryEncoder(enc, encoder.restEncoder); encoder.restEncoder = enc; return encoder.toUint8Array(); } else { writeVarUint(encoder.restEncoder, 0); return encoder.toUint8Array(); } }; var encodeStateVectorFromUpdate = (update) => encodeStateVectorFromUpdateV2(update, DSEncoderV1, UpdateDecoderV1); var parseUpdateMetaV2 = (update, YDecoder = UpdateDecoderV2) => { const from2 = /* @__PURE__ */ new Map(); const to = /* @__PURE__ */ new Map(); const updateDecoder = new LazyStructReader(new YDecoder(createDecoder(update)), false); let curr = updateDecoder.curr; if (curr !== null) { let currClient = curr.id.client; let currClock = curr.id.clock; from2.set(currClient, currClock); for (; curr !== null; curr = updateDecoder.next()) { if (currClient !== curr.id.client) { to.set(currClient, currClock); from2.set(curr.id.client, curr.id.clock); currClient = curr.id.client; } currClock = curr.id.clock + curr.length; } to.set(currClient, currClock); } return { from: from2, to }; }; var parseUpdateMeta = (update) => parseUpdateMetaV2(update, UpdateDecoderV1); var sliceStruct = (left, diff) => { if (left.constructor === GC) { const { client, clock } = left.id; return new GC(createID(client, clock + diff), left.length - diff); } else if (left.constructor === Skip) { const { client, clock } = left.id; return new Skip(createID(client, clock + diff), left.length - diff); } else { const leftItem = ( /** @type {Item} */ left ); const { client, clock } = leftItem.id; return new Item( createID(client, clock + diff), null, createID(client, clock + diff - 1), null, leftItem.rightOrigin, leftItem.parent, leftItem.parentSub, leftItem.content.splice(diff) ); } }; var mergeUpdatesV2 = (updates, YDecoder = UpdateDecoderV2, YEncoder = UpdateEncoderV2) => { if (updates.length === 1) { return updates[0]; } const updateDecoders = updates.map((update) => new YDecoder(createDecoder(update))); let lazyStructDecoders = updateDecoders.map((decoder) => new LazyStructReader(decoder, true)); let currWrite = null; const updateEncoder = new YEncoder(); const lazyStructEncoder = new LazyStructWriter(updateEncoder); while (true) { lazyStructDecoders = lazyStructDecoders.filter((dec) => dec.curr !== null); lazyStructDecoders.sort( /** @type {function(any,any):number} */ (dec1, dec2) => { if (dec1.curr.id.client === dec2.curr.id.client) { const clockDiff = dec1.curr.id.clock - dec2.curr.id.clock; if (clockDiff === 0) { return dec1.curr.constructor === dec2.curr.constructor ? 0 : dec1.curr.constructor === Skip ? 1 : -1; } else { return clockDiff; } } else { return dec2.curr.id.client - dec1.curr.id.client; } } ); if (lazyStructDecoders.length === 0) { break; } const currDecoder = lazyStructDecoders[0]; const firstClient = ( /** @type {Item | GC} */ currDecoder.curr.id.client ); if (currWrite !== null) { let curr = ( /** @type {Item | GC | null} */ currDecoder.curr ); let iterated = false; while (curr !== null && curr.id.clock + curr.length <= currWrite.struct.id.clock + currWrite.struct.length && curr.id.client >= currWrite.struct.id.client) { curr = currDecoder.next(); iterated = true; } if (curr === null || // current decoder is empty curr.id.client !== firstClient || // check whether there is another decoder that has has updates from `firstClient` iterated && curr.id.clock > currWrite.struct.id.clock + currWrite.struct.length) { continue; } if (firstClient !== currWrite.struct.id.client) { writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset); currWrite = { struct: curr, offset: 0 }; currDecoder.next(); } else { if (currWrite.struct.id.clock + currWrite.struct.length < curr.id.clock) { if (currWrite.struct.constructor === Skip) { currWrite.struct.length = curr.id.clock + curr.length - currWrite.struct.id.clock; } else { writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset); const diff = curr.id.clock - currWrite.struct.id.clock - currWrite.struct.length; const struct = new Skip(createID(firstClient, currWrite.struct.id.clock + currWrite.struct.length), diff); currWrite = { struct, offset: 0 }; } } else { const diff = currWrite.struct.id.clock + currWrite.struct.length - curr.id.clock; if (diff > 0) { if (currWrite.struct.constructor === Skip) { currWrite.struct.length -= diff; } else { curr = sliceStruct(curr, diff); } } if (!currWrite.struct.mergeWith( /** @type {any} */ curr )) { writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset); currWrite = { struct: curr, offset: 0 }; currDecoder.next(); } } } } else { currWrite = { struct: ( /** @type {Item | GC} */ currDecoder.curr ), offset: 0 }; currDecoder.next(); } for (let next = currDecoder.curr; next !== null && next.id.client === firstClient && next.id.clock === currWrite.struct.id.clock + currWrite.struct.length && next.constructor !== Skip; next = currDecoder.next()) { writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset); currWrite = { struct: next, offset: 0 }; } } if (currWrite !== null) { writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset); currWrite = null; } finishLazyStructWriting(lazyStructEncoder); const dss = updateDecoders.map((decoder) => readDeleteSet(decoder)); const ds = mergeDeleteSets(dss); writeDeleteSet(updateEncoder, ds); return updateEncoder.toUint8Array(); }; var diffUpdateV2 = (update, sv, YDecoder = UpdateDecoderV2, YEncoder = UpdateEncoderV2) => { const state = decodeStateVector(sv); const encoder = new YEncoder(); const lazyStructWriter = new LazyStructWriter(encoder); const decoder = new YDecoder(createDecoder(update)); const reader = new LazyStructReader(decoder, false); while (reader.curr) { const curr = reader.curr; const currClient = curr.id.client; const svClock = state.get(currClient) || 0; if (reader.curr.constructor === Skip) { reader.next(); continue; } if (curr.id.clock + curr.length > svClock) { writeStructToLazyStructWriter(lazyStructWriter, curr, max(svClock - curr.id.clock, 0)); reader.next(); while (reader.curr && reader.curr.id.client === currClient) { writeStructToLazyStructWriter(lazyStructWriter, reader.curr, 0); reader.next(); } } else { while (reader.curr && reader.curr.id.client === currClient && reader.curr.id.clock + reader.curr.length <= svClock) { reader.next(); } } } finishLazyStructWriting(lazyStructWriter); const ds = readDeleteSet(decoder); writeDeleteSet(encoder, ds); return encoder.toUint8Array(); }; var diffUpdate = (update, sv) => diffUpdateV2(update, sv, UpdateDecoderV1, UpdateEncoderV1); var flushLazyStructWriter = (lazyWriter) => { if (lazyWriter.written > 0) { lazyWriter.clientStructs.push({ written: lazyWriter.written, restEncoder: toUint8Array(lazyWriter.encoder.restEncoder) }); lazyWriter.encoder.restEncoder = createEncoder(); lazyWriter.written = 0; } }; var writeStructToLazyStructWriter = (lazyWriter, struct, offset) => { if (lazyWriter.written > 0 && lazyWriter.currClient !== struct.id.client) { flushLazyStructWriter(lazyWriter); } if (lazyWriter.written === 0) { lazyWriter.currClient = struct.id.client; lazyWriter.encoder.writeClient(struct.id.client); writeVarUint(lazyWriter.encoder.restEncoder, struct.id.clock + offset); } struct.write(lazyWriter.encoder, offset); lazyWriter.written++; }; var finishLazyStructWriting = (lazyWriter) => { flushLazyStructWriter(lazyWriter); const restEncoder = lazyWriter.encoder.restEncoder; writeVarUint(restEncoder, lazyWriter.clientStructs.length); for (let i = 0; i < lazyWriter.clientStructs.length; i++) { const partStructs = lazyWriter.clientStructs[i]; writeVarUint(restEncoder, partStructs.written); writeUint8Array(restEncoder, partStructs.restEncoder); } }; var convertUpdateFormat = (update, blockTransformer, YDecoder, YEncoder) => { const updateDecoder = new YDecoder(createDecoder(update)); const lazyDecoder = new LazyStructReader(updateDecoder, false); const updateEncoder = new YEncoder(); const lazyWriter = new LazyStructWriter(updateEncoder); for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) { writeStructToLazyStructWriter(lazyWriter, blockTransformer(curr), 0); } finishLazyStructWriting(lazyWriter); const ds = readDeleteSet(updateDecoder); writeDeleteSet(updateEncoder, ds); return updateEncoder.toUint8Array(); }; var createObfuscator = ({ formatting = true, subdocs = true, yxml = true } = {}) => { let i = 0; const mapKeyCache = create(); const nodeNameCache = create(); const formattingKeyCache = create(); const formattingValueCache = create(); formattingValueCache.set(null, null); return (block) => { switch (block.constructor) { case GC: case Skip: return block; case Item: { const item = ( /** @type {Item} */ block ); const content = item.content; switch (content.constructor) { case ContentDeleted: break; case ContentType: { if (yxml) { const type = ( /** @type {ContentType} */ content.type ); if (type instanceof YXmlElement) { type.nodeName = setIfUndefined(nodeNameCache, type.nodeName, () => "node-" + i); } if (type instanceof YXmlHook) { type.hookName = setIfUndefined(nodeNameCache, type.hookName, () => "hook-" + i); } } break; } case ContentAny: { const c = ( /** @type {ContentAny} */ content ); c.arr = c.arr.map(() => i); break; } case ContentBinary: { const c = ( /** @type {ContentBinary} */ content ); c.content = new Uint8Array([i]); break; } case ContentDoc: { const c = ( /** @type {ContentDoc} */ content ); if (subdocs) { c.opts = {}; c.doc.guid = i + ""; } break; } case ContentEmbed: { const c = ( /** @type {ContentEmbed} */ content ); c.embed = {}; break; } case ContentFormat: { const c = ( /** @type {ContentFormat} */ content ); if (formatting) { c.key = setIfUndefined(formattingKeyCache, c.key, () => i + ""); c.value = setIfUndefined(formattingValueCache, c.value, () => ({ i })); } break; } case ContentJSON: { const c = ( /** @type {ContentJSON} */ content ); c.arr = c.arr.map(() => i); break; } case ContentString: { const c = ( /** @type {ContentString} */ content ); c.str = repeat(i % 10 + "", c.str.length); break; } default: unexpectedCase(); } if (item.parentSub) { item.parentSub = setIfUndefined(mapKeyCache, item.parentSub, () => i + ""); } i++; return block; } default: unexpectedCase(); } }; }; var obfuscateUpdate = (update, opts) => convertUpdateFormat(update, createObfuscator(opts), UpdateDecoderV1, UpdateEncoderV1); var obfuscateUpdateV2 = (update, opts) => convertUpdateFormat(update, createObfuscator(opts), UpdateDecoderV2, UpdateEncoderV2); var convertUpdateFormatV1ToV2 = (update) => convertUpdateFormat(update, id, UpdateDecoderV1, UpdateEncoderV2); var convertUpdateFormatV2ToV1 = (update) => convertUpdateFormat(update, id, UpdateDecoderV2, UpdateEncoderV1); var errorComputeChanges = "You must not compute changes after the event-handler fired."; var YEvent = class { /** * @param {T} target The changed type. * @param {Transaction} transaction */ constructor(target, transaction) { this.target = target; this.currentTarget = target; this.transaction = transaction; this._changes = null; this._keys = null; this._delta = null; this._path = null; } /** * Computes the path from `y` to the changed type. * * @todo v14 should standardize on path: Array<{parent, index}> because that is easier to work with. * * The following property holds: * @example * let type = y * event.path.forEach(dir => { * type = type.get(dir) * }) * type === event.target // => true */ get path() { return this._path || (this._path = getPathTo(this.currentTarget, this.target)); } /** * Check if a struct is deleted by this event. * * In contrast to change.deleted, this method also returns true if the struct was added and then deleted. * * @param {AbstractStruct} struct * @return {boolean} */ deletes(struct) { return isDeleted(this.transaction.deleteSet, struct.id); } /** * @type {Map} */ get keys() { if (this._keys === null) { if (this.transaction.doc._transactionCleanups.length === 0) { throw create3(errorComputeChanges); } const keys2 = /* @__PURE__ */ new Map(); const target = this.target; const changed = ( /** @type Set */ this.transaction.changed.get(target) ); changed.forEach((key) => { if (key !== null) { const item = ( /** @type {Item} */ target._map.get(key) ); let action; let oldValue; if (this.adds(item)) { let prev = item.left; while (prev !== null && this.adds(prev)) { prev = prev.left; } if (this.deletes(item)) { if (prev !== null && this.deletes(prev)) { action = "delete"; oldValue = last(prev.content.getContent()); } else { return; } } else { if (prev !== null && this.deletes(prev)) { action = "update"; oldValue = last(prev.content.getContent()); } else { action = "add"; oldValue = void 0; } } } else { if (this.deletes(item)) { action = "delete"; oldValue = last( /** @type {Item} */ item.content.getContent() ); } else { return; } } keys2.set(key, { action, oldValue }); } }); this._keys = keys2; } return this._keys; } /** * This is a computed property. Note that this can only be safely computed during the * event call. Computing this property after other changes happened might result in * unexpected behavior (incorrect computation of deltas). A safe way to collect changes * is to store the `changes` or the `delta` object. Avoid storing the `transaction` object. * * @type {Array<{insert?: string | Array | object | AbstractType, retain?: number, delete?: number, attributes?: Object}>} */ get delta() { return this.changes.delta; } /** * Check if a struct is added by this event. * * In contrast to change.deleted, this method also returns true if the struct was added and then deleted. * * @param {AbstractStruct} struct * @return {boolean} */ adds(struct) { return struct.id.clock >= (this.transaction.beforeState.get(struct.id.client) || 0); } /** * This is a computed property. Note that this can only be safely computed during the * event call. Computing this property after other changes happened might result in * unexpected behavior (incorrect computation of deltas). A safe way to collect changes * is to store the `changes` or the `delta` object. Avoid storing the `transaction` object. * * @type {{added:Set,deleted:Set,keys:Map,delta:Array<{insert?:Array|string, delete?:number, retain?:number}>}} */ get changes() { let changes = this._changes; if (changes === null) { if (this.transaction.doc._transactionCleanups.length === 0) { throw create3(errorComputeChanges); } const target = this.target; const added = create2(); const deleted = create2(); const delta = []; changes = { added, deleted, delta, keys: this.keys }; const changed = ( /** @type Set */ this.transaction.changed.get(target) ); if (changed.has(null)) { let lastOp = null; const packOp = () => { if (lastOp) { delta.push(lastOp); } }; for (let item = target._start; item !== null; item = item.right) { if (item.deleted) { if (this.deletes(item) && !this.adds(item)) { if (lastOp === null || lastOp.delete === void 0) { packOp(); lastOp = { delete: 0 }; } lastOp.delete += item.length; deleted.add(item); } } else { if (this.adds(item)) { if (lastOp === null || lastOp.insert === void 0) { packOp(); lastOp = { insert: [] }; } lastOp.insert = lastOp.insert.concat(item.content.getContent()); added.add(item); } else { if (lastOp === null || lastOp.retain === void 0) { packOp(); lastOp = { retain: 0 }; } lastOp.retain += item.length; } } } if (lastOp !== null && lastOp.retain === void 0) { packOp(); } } this._changes = changes; } return ( /** @type {any} */ changes ); } }; var getPathTo = (parent, child) => { const path = []; while (child._item !== null && child !== parent) { if (child._item.parentSub !== null) { path.unshift(child._item.parentSub); } else { let i = 0; let c = ( /** @type {AbstractType} */ child._item.parent._start ); while (c !== child._item && c !== null) { if (!c.deleted && c.countable) { i += c.length; } c = c.right; } path.unshift(i); } child = /** @type {AbstractType} */ child._item.parent; } return path; }; var warnPrematureAccess = () => { warn("Invalid access: Add Yjs type to a document before reading data."); }; var maxSearchMarker = 80; var globalSearchMarkerTimestamp = 0; var ArraySearchMarker = class { /** * @param {Item} p * @param {number} index */ constructor(p, index) { p.marker = true; this.p = p; this.index = index; this.timestamp = globalSearchMarkerTimestamp++; } }; var refreshMarkerTimestamp = (marker) => { marker.timestamp = globalSearchMarkerTimestamp++; }; var overwriteMarker = (marker, p, index) => { marker.p.marker = false; marker.p = p; p.marker = true; marker.index = index; marker.timestamp = globalSearchMarkerTimestamp++; }; var markPosition = (searchMarker, p, index) => { if (searchMarker.length >= maxSearchMarker) { const marker = searchMarker.reduce((a, b) => a.timestamp < b.timestamp ? a : b); overwriteMarker(marker, p, index); return marker; } else { const pm = new ArraySearchMarker(p, index); searchMarker.push(pm); return pm; } }; var findMarker = (yarray, index) => { if (yarray._start === null || index === 0 || yarray._searchMarker === null) { return null; } const marker = yarray._searchMarker.length === 0 ? null : yarray._searchMarker.reduce((a, b) => abs(index - a.index) < abs(index - b.index) ? a : b); let p = yarray._start; let pindex = 0; if (marker !== null) { p = marker.p; pindex = marker.index; refreshMarkerTimestamp(marker); } while (p.right !== null && pindex < index) { if (!p.deleted && p.countable) { if (index < pindex + p.length) { break; } pindex += p.length; } p = p.right; } while (p.left !== null && pindex > index) { p = p.left; if (!p.deleted && p.countable) { pindex -= p.length; } } while (p.left !== null && p.left.id.client === p.id.client && p.left.id.clock + p.left.length === p.id.clock) { p = p.left; if (!p.deleted && p.countable) { pindex -= p.length; } } if (marker !== null && abs(marker.index - pindex) < /** @type {YText|YArray} */ p.parent.length / maxSearchMarker) { overwriteMarker(marker, p, pindex); return marker; } else { return markPosition(yarray._searchMarker, p, pindex); } }; var updateMarkerChanges = (searchMarker, index, len) => { for (let i = searchMarker.length - 1; i >= 0; i--) { const m = searchMarker[i]; if (len > 0) { let p = m.p; p.marker = false; while (p && (p.deleted || !p.countable)) { p = p.left; if (p && !p.deleted && p.countable) { m.index -= p.length; } } if (p === null || p.marker === true) { searchMarker.splice(i, 1); continue; } m.p = p; p.marker = true; } if (index < m.index || len > 0 && index === m.index) { m.index = max(index, m.index + len); } } }; var getTypeChildren = (t) => { t.doc ?? warnPrematureAccess(); let s = t._start; const arr = []; while (s) { arr.push(s); s = s.right; } return arr; }; var callTypeObservers = (type, transaction, event) => { const changedType = type; const changedParentTypes = transaction.changedParentTypes; while (true) { setIfUndefined(changedParentTypes, type, () => []).push(event); if (type._item === null) { break; } type = /** @type {AbstractType} */ type._item.parent; } callEventHandlerListeners(changedType._eH, event, transaction); }; var AbstractType = class { constructor() { this._item = null; this._map = /* @__PURE__ */ new Map(); this._start = null; this.doc = null; this._length = 0; this._eH = createEventHandler(); this._dEH = createEventHandler(); this._searchMarker = null; } /** * @return {AbstractType|null} */ get parent() { return this._item ? ( /** @type {AbstractType} */ this._item.parent ) : null; } /** * Integrate this type into the Yjs instance. * * * Save this struct in the os * * This type is sent to other client * * Observer functions are fired * * @param {Doc} y The Yjs instance * @param {Item|null} item */ _integrate(y, item) { this.doc = y; this._item = item; } /** * @return {AbstractType} */ _copy() { throw methodUnimplemented(); } /** * Makes a copy of this data type that can be included somewhere else. * * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. * * @return {AbstractType} */ clone() { throw methodUnimplemented(); } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} _encoder */ _write(_encoder) { } /** * The first non-deleted item */ get _first() { let n = this._start; while (n !== null && n.deleted) { n = n.right; } return n; } /** * Creates YEvent and calls all type observers. * Must be implemented by each type. * * @param {Transaction} transaction * @param {Set} _parentSubs Keys changed on this type. `null` if list was modified. */ _callObserver(transaction, _parentSubs) { if (!transaction.local && this._searchMarker) { this._searchMarker.length = 0; } } /** * Observe all events that are created on this type. * * @param {function(EventType, Transaction):void} f Observer function */ observe(f) { addEventHandlerListener(this._eH, f); } /** * Observe all events that are created by this type and its children. * * @param {function(Array>,Transaction):void} f Observer function */ observeDeep(f) { addEventHandlerListener(this._dEH, f); } /** * Unregister an observer function. * * @param {function(EventType,Transaction):void} f Observer function */ unobserve(f) { removeEventHandlerListener(this._eH, f); } /** * Unregister an observer function. * * @param {function(Array>,Transaction):void} f Observer function */ unobserveDeep(f) { removeEventHandlerListener(this._dEH, f); } /** * @abstract * @return {any} */ toJSON() { } }; var typeListSlice = (type, start, end) => { type.doc ?? warnPrematureAccess(); if (start < 0) { start = type._length + start; } if (end < 0) { end = type._length + end; } let len = end - start; const cs = []; let n = type._start; while (n !== null && len > 0) { if (n.countable && !n.deleted) { const c = n.content.getContent(); if (c.length <= start) { start -= c.length; } else { for (let i = start; i < c.length && len > 0; i++) { cs.push(c[i]); len--; } start = 0; } } n = n.right; } return cs; }; var typeListToArray = (type) => { type.doc ?? warnPrematureAccess(); const cs = []; let n = type._start; while (n !== null) { if (n.countable && !n.deleted) { const c = n.content.getContent(); for (let i = 0; i < c.length; i++) { cs.push(c[i]); } } n = n.right; } return cs; }; var typeListToArraySnapshot = (type, snapshot2) => { const cs = []; let n = type._start; while (n !== null) { if (n.countable && isVisible(n, snapshot2)) { const c = n.content.getContent(); for (let i = 0; i < c.length; i++) { cs.push(c[i]); } } n = n.right; } return cs; }; var typeListForEach = (type, f) => { let index = 0; let n = type._start; type.doc ?? warnPrematureAccess(); while (n !== null) { if (n.countable && !n.deleted) { const c = n.content.getContent(); for (let i = 0; i < c.length; i++) { f(c[i], index++, type); } } n = n.right; } }; var typeListMap = (type, f) => { const result = []; typeListForEach(type, (c, i) => { result.push(f(c, i, type)); }); return result; }; var typeListCreateIterator = (type) => { let n = type._start; let currentContent = null; let currentContentIndex = 0; return { [Symbol.iterator]() { return this; }, next: () => { if (currentContent === null) { while (n !== null && n.deleted) { n = n.right; } if (n === null) { return { done: true, value: void 0 }; } currentContent = n.content.getContent(); currentContentIndex = 0; n = n.right; } const value = currentContent[currentContentIndex++]; if (currentContent.length <= currentContentIndex) { currentContent = null; } return { done: false, value }; } }; }; var typeListGet = (type, index) => { type.doc ?? warnPrematureAccess(); const marker = findMarker(type, index); let n = type._start; if (marker !== null) { n = marker.p; index -= marker.index; } for (; n !== null; n = n.right) { if (!n.deleted && n.countable) { if (index < n.length) { return n.content.getContent()[index]; } index -= n.length; } } }; var typeListInsertGenericsAfter = (transaction, parent, referenceItem, content) => { let left = referenceItem; const doc2 = transaction.doc; const ownClientId = doc2.clientID; const store2 = doc2.store; const right = referenceItem === null ? parent._start : referenceItem.right; let jsonContent = []; const packJsonContent = () => { if (jsonContent.length > 0) { left = new Item(createID(ownClientId, getState(store2, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentAny(jsonContent)); left.integrate(transaction, 0); jsonContent = []; } }; content.forEach((c) => { if (c === null) { jsonContent.push(c); } else { switch (c.constructor) { case Number: case Object: case Boolean: case Array: case String: jsonContent.push(c); break; default: packJsonContent(); switch (c.constructor) { case Uint8Array: case ArrayBuffer: left = new Item(createID(ownClientId, getState(store2, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentBinary(new Uint8Array( /** @type {Uint8Array} */ c ))); left.integrate(transaction, 0); break; case Doc: left = new Item(createID(ownClientId, getState(store2, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentDoc( /** @type {Doc} */ c )); left.integrate(transaction, 0); break; default: if (c instanceof AbstractType) { left = new Item(createID(ownClientId, getState(store2, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentType(c)); left.integrate(transaction, 0); } else { throw new Error("Unexpected content type in insert operation"); } } } } }); packJsonContent(); }; var lengthExceeded = () => create3("Length exceeded!"); var typeListInsertGenerics = (transaction, parent, index, content) => { if (index > parent._length) { throw lengthExceeded(); } if (index === 0) { if (parent._searchMarker) { updateMarkerChanges(parent._searchMarker, index, content.length); } return typeListInsertGenericsAfter(transaction, parent, null, content); } const startIndex = index; const marker = findMarker(parent, index); let n = parent._start; if (marker !== null) { n = marker.p; index -= marker.index; if (index === 0) { n = n.prev; index += n && n.countable && !n.deleted ? n.length : 0; } } for (; n !== null; n = n.right) { if (!n.deleted && n.countable) { if (index <= n.length) { if (index < n.length) { getItemCleanStart(transaction, createID(n.id.client, n.id.clock + index)); } break; } index -= n.length; } } if (parent._searchMarker) { updateMarkerChanges(parent._searchMarker, startIndex, content.length); } return typeListInsertGenericsAfter(transaction, parent, n, content); }; var typeListPushGenerics = (transaction, parent, content) => { const marker = (parent._searchMarker || []).reduce((maxMarker, currMarker) => currMarker.index > maxMarker.index ? currMarker : maxMarker, { index: 0, p: parent._start }); let n = marker.p; if (n) { while (n.right) { n = n.right; } } return typeListInsertGenericsAfter(transaction, parent, n, content); }; var typeListDelete = (transaction, parent, index, length3) => { if (length3 === 0) { return; } const startIndex = index; const startLength = length3; const marker = findMarker(parent, index); let n = parent._start; if (marker !== null) { n = marker.p; index -= marker.index; } for (; n !== null && index > 0; n = n.right) { if (!n.deleted && n.countable) { if (index < n.length) { getItemCleanStart(transaction, createID(n.id.client, n.id.clock + index)); } index -= n.length; } } while (length3 > 0 && n !== null) { if (!n.deleted) { if (length3 < n.length) { getItemCleanStart(transaction, createID(n.id.client, n.id.clock + length3)); } n.delete(transaction); length3 -= n.length; } n = n.right; } if (length3 > 0) { throw lengthExceeded(); } if (parent._searchMarker) { updateMarkerChanges( parent._searchMarker, startIndex, -startLength + length3 /* in case we remove the above exception */ ); } }; var typeMapDelete = (transaction, parent, key) => { const c = parent._map.get(key); if (c !== void 0) { c.delete(transaction); } }; var typeMapSet = (transaction, parent, key, value) => { const left = parent._map.get(key) || null; const doc2 = transaction.doc; const ownClientId = doc2.clientID; let content; if (value == null) { content = new ContentAny([value]); } else { switch (value.constructor) { case Number: case Object: case Boolean: case Array: case String: case Date: case BigInt: content = new ContentAny([value]); break; case Uint8Array: content = new ContentBinary( /** @type {Uint8Array} */ value ); break; case Doc: content = new ContentDoc( /** @type {Doc} */ value ); break; default: if (value instanceof AbstractType) { content = new ContentType(value); } else { throw new Error("Unexpected content type"); } } } new Item(createID(ownClientId, getState(doc2.store, ownClientId)), left, left && left.lastId, null, null, parent, key, content).integrate(transaction, 0); }; var typeMapGet = (parent, key) => { parent.doc ?? warnPrematureAccess(); const val = parent._map.get(key); return val !== void 0 && !val.deleted ? val.content.getContent()[val.length - 1] : void 0; }; var typeMapGetAll = (parent) => { const res = {}; parent.doc ?? warnPrematureAccess(); parent._map.forEach((value, key) => { if (!value.deleted) { res[key] = value.content.getContent()[value.length - 1]; } }); return res; }; var typeMapHas = (parent, key) => { parent.doc ?? warnPrematureAccess(); const val = parent._map.get(key); return val !== void 0 && !val.deleted; }; var typeMapGetSnapshot = (parent, key, snapshot2) => { let v = parent._map.get(key) || null; while (v !== null && (!snapshot2.sv.has(v.id.client) || v.id.clock >= (snapshot2.sv.get(v.id.client) || 0))) { v = v.left; } return v !== null && isVisible(v, snapshot2) ? v.content.getContent()[v.length - 1] : void 0; }; var typeMapGetAllSnapshot = (parent, snapshot2) => { const res = {}; parent._map.forEach((value, key) => { let v = value; while (v !== null && (!snapshot2.sv.has(v.id.client) || v.id.clock >= (snapshot2.sv.get(v.id.client) || 0))) { v = v.left; } if (v !== null && isVisible(v, snapshot2)) { res[key] = v.content.getContent()[v.length - 1]; } }); return res; }; var createMapIterator = (type) => { type.doc ?? warnPrematureAccess(); return iteratorFilter( type._map.entries(), /** @param {any} entry */ (entry) => !entry[1].deleted ); }; var YArrayEvent = class extends YEvent { }; var YArray = class _YArray extends AbstractType { constructor() { super(); this._prelimContent = []; this._searchMarker = []; } /** * Construct a new YArray containing the specified items. * @template {Object|Array|number|null|string|Uint8Array} T * @param {Array} items * @return {YArray} */ static from(items2) { const a = new _YArray(); a.push(items2); return a; } /** * Integrate this type into the Yjs instance. * * * Save this struct in the os * * This type is sent to other client * * Observer functions are fired * * @param {Doc} y The Yjs instance * @param {Item} item */ _integrate(y, item) { super._integrate(y, item); this.insert( 0, /** @type {Array} */ this._prelimContent ); this._prelimContent = null; } /** * @return {YArray} */ _copy() { return new _YArray(); } /** * Makes a copy of this data type that can be included somewhere else. * * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. * * @return {YArray} */ clone() { const arr = new _YArray(); arr.insert(0, this.toArray().map( (el) => el instanceof AbstractType ? ( /** @type {typeof el} */ el.clone() ) : el )); return arr; } get length() { this.doc ?? warnPrematureAccess(); return this._length; } /** * Creates YArrayEvent and calls observers. * * @param {Transaction} transaction * @param {Set} parentSubs Keys changed on this type. `null` if list was modified. */ _callObserver(transaction, parentSubs) { super._callObserver(transaction, parentSubs); callTypeObservers(this, transaction, new YArrayEvent(this, transaction)); } /** * Inserts new content at an index. * * Important: This function expects an array of content. Not just a content * object. The reason for this "weirdness" is that inserting several elements * is very efficient when it is done as a single operation. * * @example * // Insert character 'a' at position 0 * yarray.insert(0, ['a']) * // Insert numbers 1, 2 at position 1 * yarray.insert(1, [1, 2]) * * @param {number} index The index to insert content at. * @param {Array} content The array of content */ insert(index, content) { if (this.doc !== null) { transact(this.doc, (transaction) => { typeListInsertGenerics( transaction, this, index, /** @type {any} */ content ); }); } else { this._prelimContent.splice(index, 0, ...content); } } /** * Appends content to this YArray. * * @param {Array} content Array of content to append. * * @todo Use the following implementation in all types. */ push(content) { if (this.doc !== null) { transact(this.doc, (transaction) => { typeListPushGenerics( transaction, this, /** @type {any} */ content ); }); } else { this._prelimContent.push(...content); } } /** * Prepends content to this YArray. * * @param {Array} content Array of content to prepend. */ unshift(content) { this.insert(0, content); } /** * Deletes elements starting from an index. * * @param {number} index Index at which to start deleting elements * @param {number} length The number of elements to remove. Defaults to 1. */ delete(index, length3 = 1) { if (this.doc !== null) { transact(this.doc, (transaction) => { typeListDelete(transaction, this, index, length3); }); } else { this._prelimContent.splice(index, length3); } } /** * Returns the i-th element from a YArray. * * @param {number} index The index of the element to return from the YArray * @return {T} */ get(index) { return typeListGet(this, index); } /** * Transforms this YArray to a JavaScript Array. * * @return {Array} */ toArray() { return typeListToArray(this); } /** * Returns a portion of this YArray into a JavaScript Array selected * from start to end (end not included). * * @param {number} [start] * @param {number} [end] * @return {Array} */ slice(start = 0, end = this.length) { return typeListSlice(this, start, end); } /** * Transforms this Shared Type to a JSON object. * * @return {Array} */ toJSON() { return this.map((c) => c instanceof AbstractType ? c.toJSON() : c); } /** * Returns an Array with the result of calling a provided function on every * element of this YArray. * * @template M * @param {function(T,number,YArray):M} f Function that produces an element of the new Array * @return {Array} A new array with each element being the result of the * callback function */ map(f) { return typeListMap( this, /** @type {any} */ f ); } /** * Executes a provided function once on every element of this YArray. * * @param {function(T,number,YArray):void} f A function to execute on every element of this YArray. */ forEach(f) { typeListForEach(this, f); } /** * @return {IterableIterator} */ [Symbol.iterator]() { return typeListCreateIterator(this); } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder */ _write(encoder) { encoder.writeTypeRef(YArrayRefID); } }; var readYArray = (_decoder) => new YArray(); var YMapEvent = class extends YEvent { /** * @param {YMap} ymap The YArray that changed. * @param {Transaction} transaction * @param {Set} subs The keys that changed. */ constructor(ymap, transaction, subs) { super(ymap, transaction); this.keysChanged = subs; } }; var YMap = class _YMap extends AbstractType { /** * * @param {Iterable=} entries - an optional iterable to initialize the YMap */ constructor(entries) { super(); this._prelimContent = null; if (entries === void 0) { this._prelimContent = /* @__PURE__ */ new Map(); } else { this._prelimContent = new Map(entries); } } /** * Integrate this type into the Yjs instance. * * * Save this struct in the os * * This type is sent to other client * * Observer functions are fired * * @param {Doc} y The Yjs instance * @param {Item} item */ _integrate(y, item) { super._integrate(y, item); this._prelimContent.forEach((value, key) => { this.set(key, value); }); this._prelimContent = null; } /** * @return {YMap} */ _copy() { return new _YMap(); } /** * Makes a copy of this data type that can be included somewhere else. * * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. * * @return {YMap} */ clone() { const map2 = new _YMap(); this.forEach((value, key) => { map2.set(key, value instanceof AbstractType ? ( /** @type {typeof value} */ value.clone() ) : value); }); return map2; } /** * Creates YMapEvent and calls observers. * * @param {Transaction} transaction * @param {Set} parentSubs Keys changed on this type. `null` if list was modified. */ _callObserver(transaction, parentSubs) { callTypeObservers(this, transaction, new YMapEvent(this, transaction, parentSubs)); } /** * Transforms this Shared Type to a JSON object. * * @return {Object} */ toJSON() { this.doc ?? warnPrematureAccess(); const map2 = {}; this._map.forEach((item, key) => { if (!item.deleted) { const v = item.content.getContent()[item.length - 1]; map2[key] = v instanceof AbstractType ? v.toJSON() : v; } }); return map2; } /** * Returns the size of the YMap (count of key/value pairs) * * @return {number} */ get size() { return [...createMapIterator(this)].length; } /** * Returns the keys for each element in the YMap Type. * * @return {IterableIterator} */ keys() { return iteratorMap( createMapIterator(this), /** @param {any} v */ (v) => v[0] ); } /** * Returns the values for each element in the YMap Type. * * @return {IterableIterator} */ values() { return iteratorMap( createMapIterator(this), /** @param {any} v */ (v) => v[1].content.getContent()[v[1].length - 1] ); } /** * Returns an Iterator of [key, value] pairs * * @return {IterableIterator<[string, MapType]>} */ entries() { return iteratorMap( createMapIterator(this), /** @param {any} v */ (v) => ( /** @type {any} */ [v[0], v[1].content.getContent()[v[1].length - 1]] ) ); } /** * Executes a provided function on once on every key-value pair. * * @param {function(MapType,string,YMap):void} f A function to execute on every element of this YArray. */ forEach(f) { this.doc ?? warnPrematureAccess(); this._map.forEach((item, key) => { if (!item.deleted) { f(item.content.getContent()[item.length - 1], key, this); } }); } /** * Returns an Iterator of [key, value] pairs * * @return {IterableIterator<[string, MapType]>} */ [Symbol.iterator]() { return this.entries(); } /** * Remove a specified element from this YMap. * * @param {string} key The key of the element to remove. */ delete(key) { if (this.doc !== null) { transact(this.doc, (transaction) => { typeMapDelete(transaction, this, key); }); } else { this._prelimContent.delete(key); } } /** * Adds or updates an element with a specified key and value. * @template {MapType} VAL * * @param {string} key The key of the element to add to this YMap * @param {VAL} value The value of the element to add * @return {VAL} */ set(key, value) { if (this.doc !== null) { transact(this.doc, (transaction) => { typeMapSet( transaction, this, key, /** @type {any} */ value ); }); } else { this._prelimContent.set(key, value); } return value; } /** * Returns a specified element from this YMap. * * @param {string} key * @return {MapType|undefined} */ get(key) { return ( /** @type {any} */ typeMapGet(this, key) ); } /** * Returns a boolean indicating whether the specified key exists or not. * * @param {string} key The key to test. * @return {boolean} */ has(key) { return typeMapHas(this, key); } /** * Removes all elements from this YMap. */ clear() { if (this.doc !== null) { transact(this.doc, (transaction) => { this.forEach(function(_value, key, map2) { typeMapDelete(transaction, map2, key); }); }); } else { this._prelimContent.clear(); } } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder */ _write(encoder) { encoder.writeTypeRef(YMapRefID); } }; var readYMap = (_decoder) => new YMap(); var equalAttrs = (a, b) => a === b || typeof a === "object" && typeof b === "object" && a && b && equalFlat(a, b); var ItemTextListPosition = class { /** * @param {Item|null} left * @param {Item|null} right * @param {number} index * @param {Map} currentAttributes */ constructor(left, right, index, currentAttributes) { this.left = left; this.right = right; this.index = index; this.currentAttributes = currentAttributes; } /** * Only call this if you know that this.right is defined */ forward() { if (this.right === null) { unexpectedCase(); } switch (this.right.content.constructor) { case ContentFormat: if (!this.right.deleted) { updateCurrentAttributes( this.currentAttributes, /** @type {ContentFormat} */ this.right.content ); } break; default: if (!this.right.deleted) { this.index += this.right.length; } break; } this.left = this.right; this.right = this.right.right; } }; var findNextPosition = (transaction, pos, count) => { while (pos.right !== null && count > 0) { switch (pos.right.content.constructor) { case ContentFormat: if (!pos.right.deleted) { updateCurrentAttributes( pos.currentAttributes, /** @type {ContentFormat} */ pos.right.content ); } break; default: if (!pos.right.deleted) { if (count < pos.right.length) { getItemCleanStart(transaction, createID(pos.right.id.client, pos.right.id.clock + count)); } pos.index += pos.right.length; count -= pos.right.length; } break; } pos.left = pos.right; pos.right = pos.right.right; } return pos; }; var findPosition = (transaction, parent, index, useSearchMarker) => { const currentAttributes = /* @__PURE__ */ new Map(); const marker = useSearchMarker ? findMarker(parent, index) : null; if (marker) { const pos = new ItemTextListPosition(marker.p.left, marker.p, marker.index, currentAttributes); return findNextPosition(transaction, pos, index - marker.index); } else { const pos = new ItemTextListPosition(null, parent._start, 0, currentAttributes); return findNextPosition(transaction, pos, index); } }; var insertNegatedAttributes = (transaction, parent, currPos, negatedAttributes) => { while (currPos.right !== null && (currPos.right.deleted === true || currPos.right.content.constructor === ContentFormat && equalAttrs( negatedAttributes.get( /** @type {ContentFormat} */ currPos.right.content.key ), /** @type {ContentFormat} */ currPos.right.content.value ))) { if (!currPos.right.deleted) { negatedAttributes.delete( /** @type {ContentFormat} */ currPos.right.content.key ); } currPos.forward(); } const doc2 = transaction.doc; const ownClientId = doc2.clientID; negatedAttributes.forEach((val, key) => { const left = currPos.left; const right = currPos.right; const nextFormat = new Item(createID(ownClientId, getState(doc2.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentFormat(key, val)); nextFormat.integrate(transaction, 0); currPos.right = nextFormat; currPos.forward(); }); }; var updateCurrentAttributes = (currentAttributes, format) => { const { key, value } = format; if (value === null) { currentAttributes.delete(key); } else { currentAttributes.set(key, value); } }; var minimizeAttributeChanges = (currPos, attributes) => { while (true) { if (currPos.right === null) { break; } else if (currPos.right.deleted || currPos.right.content.constructor === ContentFormat && equalAttrs( attributes[ /** @type {ContentFormat} */ currPos.right.content.key ] ?? null, /** @type {ContentFormat} */ currPos.right.content.value )) ; else { break; } currPos.forward(); } }; var insertAttributes = (transaction, parent, currPos, attributes) => { const doc2 = transaction.doc; const ownClientId = doc2.clientID; const negatedAttributes = /* @__PURE__ */ new Map(); for (const key in attributes) { const val = attributes[key]; const currentVal = currPos.currentAttributes.get(key) ?? null; if (!equalAttrs(currentVal, val)) { negatedAttributes.set(key, currentVal); const { left, right } = currPos; currPos.right = new Item(createID(ownClientId, getState(doc2.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentFormat(key, val)); currPos.right.integrate(transaction, 0); currPos.forward(); } } return negatedAttributes; }; var insertText = (transaction, parent, currPos, text2, attributes) => { currPos.currentAttributes.forEach((_val, key) => { if (attributes[key] === void 0) { attributes[key] = null; } }); const doc2 = transaction.doc; const ownClientId = doc2.clientID; minimizeAttributeChanges(currPos, attributes); const negatedAttributes = insertAttributes(transaction, parent, currPos, attributes); const content = text2.constructor === String ? new ContentString( /** @type {string} */ text2 ) : text2 instanceof AbstractType ? new ContentType(text2) : new ContentEmbed(text2); let { left, right, index } = currPos; if (parent._searchMarker) { updateMarkerChanges(parent._searchMarker, currPos.index, content.getLength()); } right = new Item(createID(ownClientId, getState(doc2.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, content); right.integrate(transaction, 0); currPos.right = right; currPos.index = index; currPos.forward(); insertNegatedAttributes(transaction, parent, currPos, negatedAttributes); }; var formatText = (transaction, parent, currPos, length3, attributes) => { const doc2 = transaction.doc; const ownClientId = doc2.clientID; minimizeAttributeChanges(currPos, attributes); const negatedAttributes = insertAttributes(transaction, parent, currPos, attributes); iterationLoop: while (currPos.right !== null && (length3 > 0 || negatedAttributes.size > 0 && (currPos.right.deleted || currPos.right.content.constructor === ContentFormat))) { if (!currPos.right.deleted) { switch (currPos.right.content.constructor) { case ContentFormat: { const { key, value } = ( /** @type {ContentFormat} */ currPos.right.content ); const attr = attributes[key]; if (attr !== void 0) { if (equalAttrs(attr, value)) { negatedAttributes.delete(key); } else { if (length3 === 0) { break iterationLoop; } negatedAttributes.set(key, value); } currPos.right.delete(transaction); } else { currPos.currentAttributes.set(key, value); } break; } default: if (length3 < currPos.right.length) { getItemCleanStart(transaction, createID(currPos.right.id.client, currPos.right.id.clock + length3)); } length3 -= currPos.right.length; break; } } currPos.forward(); } if (length3 > 0) { let newlines = ""; for (; length3 > 0; length3--) { newlines += "\n"; } currPos.right = new Item(createID(ownClientId, getState(doc2.store, ownClientId)), currPos.left, currPos.left && currPos.left.lastId, currPos.right, currPos.right && currPos.right.id, parent, null, new ContentString(newlines)); currPos.right.integrate(transaction, 0); currPos.forward(); } insertNegatedAttributes(transaction, parent, currPos, negatedAttributes); }; var cleanupFormattingGap = (transaction, start, curr, startAttributes, currAttributes) => { let end = start; const endFormats = create(); while (end && (!end.countable || end.deleted)) { if (!end.deleted && end.content.constructor === ContentFormat) { const cf = ( /** @type {ContentFormat} */ end.content ); endFormats.set(cf.key, cf); } end = end.right; } let cleanups = 0; let reachedCurr = false; while (start !== end) { if (curr === start) { reachedCurr = true; } if (!start.deleted) { const content = start.content; switch (content.constructor) { case ContentFormat: { const { key, value } = ( /** @type {ContentFormat} */ content ); const startAttrValue = startAttributes.get(key) ?? null; if (endFormats.get(key) !== content || startAttrValue === value) { start.delete(transaction); cleanups++; if (!reachedCurr && (currAttributes.get(key) ?? null) === value && startAttrValue !== value) { if (startAttrValue === null) { currAttributes.delete(key); } else { currAttributes.set(key, startAttrValue); } } } if (!reachedCurr && !start.deleted) { updateCurrentAttributes( currAttributes, /** @type {ContentFormat} */ content ); } break; } } } start = /** @type {Item} */ start.right; } return cleanups; }; var cleanupContextlessFormattingGap = (transaction, item) => { while (item && item.right && (item.right.deleted || !item.right.countable)) { item = item.right; } const attrs = /* @__PURE__ */ new Set(); while (item && (item.deleted || !item.countable)) { if (!item.deleted && item.content.constructor === ContentFormat) { const key = ( /** @type {ContentFormat} */ item.content.key ); if (attrs.has(key)) { item.delete(transaction); } else { attrs.add(key); } } item = item.left; } }; var cleanupYTextFormatting = (type) => { let res = 0; transact( /** @type {Doc} */ type.doc, (transaction) => { let start = ( /** @type {Item} */ type._start ); let end = type._start; let startAttributes = create(); const currentAttributes = copy(startAttributes); while (end) { if (end.deleted === false) { switch (end.content.constructor) { case ContentFormat: updateCurrentAttributes( currentAttributes, /** @type {ContentFormat} */ end.content ); break; default: res += cleanupFormattingGap(transaction, start, end, startAttributes, currentAttributes); startAttributes = copy(currentAttributes); start = end; break; } } end = end.right; } } ); return res; }; var cleanupYTextAfterTransaction = (transaction) => { const needFullCleanup = /* @__PURE__ */ new Set(); const doc2 = transaction.doc; for (const [client, afterClock] of transaction.afterState.entries()) { const clock = transaction.beforeState.get(client) || 0; if (afterClock === clock) { continue; } iterateStructs( transaction, /** @type {Array} */ doc2.store.clients.get(client), clock, afterClock, (item) => { if (!item.deleted && /** @type {Item} */ item.content.constructor === ContentFormat && item.constructor !== GC) { needFullCleanup.add( /** @type {any} */ item.parent ); } } ); } transact(doc2, (t) => { iterateDeletedStructs(transaction, transaction.deleteSet, (item) => { if (item instanceof GC || !/** @type {YText} */ item.parent._hasFormatting || needFullCleanup.has( /** @type {YText} */ item.parent )) { return; } const parent = ( /** @type {YText} */ item.parent ); if (item.content.constructor === ContentFormat) { needFullCleanup.add(parent); } else { cleanupContextlessFormattingGap(t, item); } }); for (const yText of needFullCleanup) { cleanupYTextFormatting(yText); } }); }; var deleteText = (transaction, currPos, length3) => { const startLength = length3; const startAttrs = copy(currPos.currentAttributes); const start = currPos.right; while (length3 > 0 && currPos.right !== null) { if (currPos.right.deleted === false) { switch (currPos.right.content.constructor) { case ContentType: case ContentEmbed: case ContentString: if (length3 < currPos.right.length) { getItemCleanStart(transaction, createID(currPos.right.id.client, currPos.right.id.clock + length3)); } length3 -= currPos.right.length; currPos.right.delete(transaction); break; } } currPos.forward(); } if (start) { cleanupFormattingGap(transaction, start, currPos.right, startAttrs, currPos.currentAttributes); } const parent = ( /** @type {AbstractType} */ /** @type {Item} */ (currPos.left || currPos.right).parent ); if (parent._searchMarker) { updateMarkerChanges(parent._searchMarker, currPos.index, -startLength + length3); } return currPos; }; var YTextEvent = class extends YEvent { /** * @param {YText} ytext * @param {Transaction} transaction * @param {Set} subs The keys that changed */ constructor(ytext, transaction, subs) { super(ytext, transaction); this.childListChanged = false; this.keysChanged = /* @__PURE__ */ new Set(); subs.forEach((sub) => { if (sub === null) { this.childListChanged = true; } else { this.keysChanged.add(sub); } }); } /** * @type {{added:Set,deleted:Set,keys:Map,delta:Array<{insert?:Array|string, delete?:number, retain?:number}>}} */ get changes() { if (this._changes === null) { const changes = { keys: this.keys, delta: this.delta, added: /* @__PURE__ */ new Set(), deleted: /* @__PURE__ */ new Set() }; this._changes = changes; } return ( /** @type {any} */ this._changes ); } /** * Compute the changes in the delta format. * A {@link https://quilljs.com/docs/delta/|Quill Delta}) that represents the changes on the document. * * @type {Array<{insert?:string|object|AbstractType, delete?:number, retain?:number, attributes?: Object}>} * * @public */ get delta() { if (this._delta === null) { const y = ( /** @type {Doc} */ this.target.doc ); const delta = []; transact(y, (transaction) => { const currentAttributes = /* @__PURE__ */ new Map(); const oldAttributes = /* @__PURE__ */ new Map(); let item = this.target._start; let action = null; const attributes = {}; let insert2 = ""; let retain = 0; let deleteLen = 0; const addOp = () => { if (action !== null) { let op = null; switch (action) { case "delete": if (deleteLen > 0) { op = { delete: deleteLen }; } deleteLen = 0; break; case "insert": if (typeof insert2 === "object" || insert2.length > 0) { op = { insert: insert2 }; if (currentAttributes.size > 0) { op.attributes = {}; currentAttributes.forEach((value, key) => { if (value !== null) { op.attributes[key] = value; } }); } } insert2 = ""; break; case "retain": if (retain > 0) { op = { retain }; if (!isEmpty(attributes)) { op.attributes = assign({}, attributes); } } retain = 0; break; } if (op) delta.push(op); action = null; } }; while (item !== null) { switch (item.content.constructor) { case ContentType: case ContentEmbed: if (this.adds(item)) { if (!this.deletes(item)) { addOp(); action = "insert"; insert2 = item.content.getContent()[0]; addOp(); } } else if (this.deletes(item)) { if (action !== "delete") { addOp(); action = "delete"; } deleteLen += 1; } else if (!item.deleted) { if (action !== "retain") { addOp(); action = "retain"; } retain += 1; } break; case ContentString: if (this.adds(item)) { if (!this.deletes(item)) { if (action !== "insert") { addOp(); action = "insert"; } insert2 += /** @type {ContentString} */ item.content.str; } } else if (this.deletes(item)) { if (action !== "delete") { addOp(); action = "delete"; } deleteLen += item.length; } else if (!item.deleted) { if (action !== "retain") { addOp(); action = "retain"; } retain += item.length; } break; case ContentFormat: { const { key, value } = ( /** @type {ContentFormat} */ item.content ); if (this.adds(item)) { if (!this.deletes(item)) { const curVal = currentAttributes.get(key) ?? null; if (!equalAttrs(curVal, value)) { if (action === "retain") { addOp(); } if (equalAttrs(value, oldAttributes.get(key) ?? null)) { delete attributes[key]; } else { attributes[key] = value; } } else if (value !== null) { item.delete(transaction); } } } else if (this.deletes(item)) { oldAttributes.set(key, value); const curVal = currentAttributes.get(key) ?? null; if (!equalAttrs(curVal, value)) { if (action === "retain") { addOp(); } attributes[key] = curVal; } } else if (!item.deleted) { oldAttributes.set(key, value); const attr = attributes[key]; if (attr !== void 0) { if (!equalAttrs(attr, value)) { if (action === "retain") { addOp(); } if (value === null) { delete attributes[key]; } else { attributes[key] = value; } } else if (attr !== null) { item.delete(transaction); } } } if (!item.deleted) { if (action === "insert") { addOp(); } updateCurrentAttributes( currentAttributes, /** @type {ContentFormat} */ item.content ); } break; } } item = item.right; } addOp(); while (delta.length > 0) { const lastOp = delta[delta.length - 1]; if (lastOp.retain !== void 0 && lastOp.attributes === void 0) { delta.pop(); } else { break; } } }); this._delta = delta; } return ( /** @type {any} */ this._delta ); } }; var YText = class _YText extends AbstractType { /** * @param {String} [string] The initial value of the YText. */ constructor(string) { super(); this._pending = string !== void 0 ? [() => this.insert(0, string)] : []; this._searchMarker = []; this._hasFormatting = false; } /** * Number of characters of this text type. * * @type {number} */ get length() { this.doc ?? warnPrematureAccess(); return this._length; } /** * @param {Doc} y * @param {Item} item */ _integrate(y, item) { super._integrate(y, item); try { this._pending.forEach((f) => f()); } catch (e) { console.error(e); } this._pending = null; } _copy() { return new _YText(); } /** * Makes a copy of this data type that can be included somewhere else. * * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. * * @return {YText} */ clone() { const text2 = new _YText(); text2.applyDelta(this.toDelta()); return text2; } /** * Creates YTextEvent and calls observers. * * @param {Transaction} transaction * @param {Set} parentSubs Keys changed on this type. `null` if list was modified. */ _callObserver(transaction, parentSubs) { super._callObserver(transaction, parentSubs); const event = new YTextEvent(this, transaction, parentSubs); callTypeObservers(this, transaction, event); if (!transaction.local && this._hasFormatting) { transaction._needFormattingCleanup = true; } } /** * Returns the unformatted string representation of this YText type. * * @public */ toString() { this.doc ?? warnPrematureAccess(); let str = ""; let n = this._start; while (n !== null) { if (!n.deleted && n.countable && n.content.constructor === ContentString) { str += /** @type {ContentString} */ n.content.str; } n = n.right; } return str; } /** * Returns the unformatted string representation of this YText type. * * @return {string} * @public */ toJSON() { return this.toString(); } /** * Apply a {@link Delta} on this shared YText type. * * @param {Array} delta The changes to apply on this element. * @param {object} opts * @param {boolean} [opts.sanitize] Sanitize input delta. Removes ending newlines if set to true. * * * @public */ applyDelta(delta, { sanitize = true } = {}) { if (this.doc !== null) { transact(this.doc, (transaction) => { const currPos = new ItemTextListPosition(null, this._start, 0, /* @__PURE__ */ new Map()); for (let i = 0; i < delta.length; i++) { const op = delta[i]; if (op.insert !== void 0) { const ins = !sanitize && typeof op.insert === "string" && i === delta.length - 1 && currPos.right === null && op.insert.slice(-1) === "\n" ? op.insert.slice(0, -1) : op.insert; if (typeof ins !== "string" || ins.length > 0) { insertText(transaction, this, currPos, ins, op.attributes || {}); } } else if (op.retain !== void 0) { formatText(transaction, this, currPos, op.retain, op.attributes || {}); } else if (op.delete !== void 0) { deleteText(transaction, currPos, op.delete); } } }); } else { this._pending.push(() => this.applyDelta(delta)); } } /** * Returns the Delta representation of this YText type. * * @param {Snapshot} [snapshot] * @param {Snapshot} [prevSnapshot] * @param {function('removed' | 'added', ID):any} [computeYChange] * @return {any} The Delta representation of this type. * * @public */ toDelta(snapshot2, prevSnapshot, computeYChange) { this.doc ?? warnPrematureAccess(); const ops = []; const currentAttributes = /* @__PURE__ */ new Map(); const doc2 = ( /** @type {Doc} */ this.doc ); let str = ""; let n = this._start; function packStr() { if (str.length > 0) { const attributes = {}; let addAttributes = false; currentAttributes.forEach((value, key) => { addAttributes = true; attributes[key] = value; }); const op = { insert: str }; if (addAttributes) { op.attributes = attributes; } ops.push(op); str = ""; } } const computeDelta = () => { while (n !== null) { if (isVisible(n, snapshot2) || prevSnapshot !== void 0 && isVisible(n, prevSnapshot)) { switch (n.content.constructor) { case ContentString: { const cur = currentAttributes.get("ychange"); if (snapshot2 !== void 0 && !isVisible(n, snapshot2)) { if (cur === void 0 || cur.user !== n.id.client || cur.type !== "removed") { packStr(); currentAttributes.set("ychange", computeYChange ? computeYChange("removed", n.id) : { type: "removed" }); } } else if (prevSnapshot !== void 0 && !isVisible(n, prevSnapshot)) { if (cur === void 0 || cur.user !== n.id.client || cur.type !== "added") { packStr(); currentAttributes.set("ychange", computeYChange ? computeYChange("added", n.id) : { type: "added" }); } } else if (cur !== void 0) { packStr(); currentAttributes.delete("ychange"); } str += /** @type {ContentString} */ n.content.str; break; } case ContentType: case ContentEmbed: { packStr(); const op = { insert: n.content.getContent()[0] }; if (currentAttributes.size > 0) { const attrs = ( /** @type {Object} */ {} ); op.attributes = attrs; currentAttributes.forEach((value, key) => { attrs[key] = value; }); } ops.push(op); break; } case ContentFormat: if (isVisible(n, snapshot2)) { packStr(); updateCurrentAttributes( currentAttributes, /** @type {ContentFormat} */ n.content ); } break; } } n = n.right; } packStr(); }; if (snapshot2 || prevSnapshot) { transact(doc2, (transaction) => { if (snapshot2) { splitSnapshotAffectedStructs(transaction, snapshot2); } if (prevSnapshot) { splitSnapshotAffectedStructs(transaction, prevSnapshot); } computeDelta(); }, "cleanup"); } else { computeDelta(); } return ops; } /** * Insert text at a given index. * * @param {number} index The index at which to start inserting. * @param {String} text The text to insert at the specified position. * @param {TextAttributes} [attributes] Optionally define some formatting * information to apply on the inserted * Text. * @public */ insert(index, text2, attributes) { if (text2.length <= 0) { return; } const y = this.doc; if (y !== null) { transact(y, (transaction) => { const pos = findPosition(transaction, this, index, !attributes); if (!attributes) { attributes = {}; pos.currentAttributes.forEach((v, k) => { attributes[k] = v; }); } insertText(transaction, this, pos, text2, attributes); }); } else { this._pending.push(() => this.insert(index, text2, attributes)); } } /** * Inserts an embed at a index. * * @param {number} index The index to insert the embed at. * @param {Object | AbstractType} embed The Object that represents the embed. * @param {TextAttributes} [attributes] Attribute information to apply on the * embed * * @public */ insertEmbed(index, embed, attributes) { const y = this.doc; if (y !== null) { transact(y, (transaction) => { const pos = findPosition(transaction, this, index, !attributes); insertText(transaction, this, pos, embed, attributes || {}); }); } else { this._pending.push(() => this.insertEmbed(index, embed, attributes || {})); } } /** * Deletes text starting from an index. * * @param {number} index Index at which to start deleting. * @param {number} length The number of characters to remove. Defaults to 1. * * @public */ delete(index, length3) { if (length3 === 0) { return; } const y = this.doc; if (y !== null) { transact(y, (transaction) => { deleteText(transaction, findPosition(transaction, this, index, true), length3); }); } else { this._pending.push(() => this.delete(index, length3)); } } /** * Assigns properties to a range of text. * * @param {number} index The position where to start formatting. * @param {number} length The amount of characters to assign properties to. * @param {TextAttributes} attributes Attribute information to apply on the * text. * * @public */ format(index, length3, attributes) { if (length3 === 0) { return; } const y = this.doc; if (y !== null) { transact(y, (transaction) => { const pos = findPosition(transaction, this, index, false); if (pos.right === null) { return; } formatText(transaction, this, pos, length3, attributes); }); } else { this._pending.push(() => this.format(index, length3, attributes)); } } /** * Removes an attribute. * * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks. * * @param {String} attributeName The attribute name that is to be removed. * * @public */ removeAttribute(attributeName) { if (this.doc !== null) { transact(this.doc, (transaction) => { typeMapDelete(transaction, this, attributeName); }); } else { this._pending.push(() => this.removeAttribute(attributeName)); } } /** * Sets or updates an attribute. * * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks. * * @param {String} attributeName The attribute name that is to be set. * @param {any} attributeValue The attribute value that is to be set. * * @public */ setAttribute(attributeName, attributeValue) { if (this.doc !== null) { transact(this.doc, (transaction) => { typeMapSet(transaction, this, attributeName, attributeValue); }); } else { this._pending.push(() => this.setAttribute(attributeName, attributeValue)); } } /** * Returns an attribute value that belongs to the attribute name. * * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks. * * @param {String} attributeName The attribute name that identifies the * queried value. * @return {any} The queried attribute value. * * @public */ getAttribute(attributeName) { return ( /** @type {any} */ typeMapGet(this, attributeName) ); } /** * Returns all attribute name/value pairs in a JSON Object. * * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks. * * @return {Object} A JSON Object that describes the attributes. * * @public */ getAttributes() { return typeMapGetAll(this); } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder */ _write(encoder) { encoder.writeTypeRef(YTextRefID); } }; var readYText = (_decoder) => new YText(); var YXmlTreeWalker = class { /** * @param {YXmlFragment | YXmlElement} root * @param {function(AbstractType):boolean} [f] */ constructor(root, f = () => true) { this._filter = f; this._root = root; this._currentNode = /** @type {Item} */ root._start; this._firstCall = true; root.doc ?? warnPrematureAccess(); } [Symbol.iterator]() { return this; } /** * Get the next node. * * @return {IteratorResult} The next node. * * @public */ next() { let n = this._currentNode; let type = n && n.content && /** @type {any} */ n.content.type; if (n !== null && (!this._firstCall || n.deleted || !this._filter(type))) { do { type = /** @type {any} */ n.content.type; if (!n.deleted && (type.constructor === YXmlElement || type.constructor === YXmlFragment) && type._start !== null) { n = type._start; } else { while (n !== null) { const nxt = n.next; if (nxt !== null) { n = nxt; break; } else if (n.parent === this._root) { n = null; } else { n = /** @type {AbstractType} */ n.parent._item; } } } } while (n !== null && (n.deleted || !this._filter( /** @type {ContentType} */ n.content.type ))); } this._firstCall = false; if (n === null) { return { value: void 0, done: true }; } this._currentNode = n; return { value: ( /** @type {any} */ n.content.type ), done: false }; } }; var YXmlFragment = class _YXmlFragment extends AbstractType { constructor() { super(); this._prelimContent = []; } /** * @type {YXmlElement|YXmlText|null} */ get firstChild() { const first = this._first; return first ? first.content.getContent()[0] : null; } /** * Integrate this type into the Yjs instance. * * * Save this struct in the os * * This type is sent to other client * * Observer functions are fired * * @param {Doc} y The Yjs instance * @param {Item} item */ _integrate(y, item) { super._integrate(y, item); this.insert( 0, /** @type {Array} */ this._prelimContent ); this._prelimContent = null; } _copy() { return new _YXmlFragment(); } /** * Makes a copy of this data type that can be included somewhere else. * * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. * * @return {YXmlFragment} */ clone() { const el = new _YXmlFragment(); el.insert(0, this.toArray().map((item) => item instanceof AbstractType ? item.clone() : item)); return el; } get length() { this.doc ?? warnPrematureAccess(); return this._prelimContent === null ? this._length : this._prelimContent.length; } /** * Create a subtree of childNodes. * * @example * const walker = elem.createTreeWalker(dom => dom.nodeName === 'div') * for (let node in walker) { * // `node` is a div node * nop(node) * } * * @param {function(AbstractType):boolean} filter Function that is called on each child element and * returns a Boolean indicating whether the child * is to be included in the subtree. * @return {YXmlTreeWalker} A subtree and a position within it. * * @public */ createTreeWalker(filter) { return new YXmlTreeWalker(this, filter); } /** * Returns the first YXmlElement that matches the query. * Similar to DOM's {@link querySelector}. * * Query support: * - tagname * TODO: * - id * - attribute * * @param {CSS_Selector} query The query on the children. * @return {YXmlElement|YXmlText|YXmlHook|null} The first element that matches the query or null. * * @public */ querySelector(query) { query = query.toUpperCase(); const iterator = new YXmlTreeWalker(this, (element2) => element2.nodeName && element2.nodeName.toUpperCase() === query); const next = iterator.next(); if (next.done) { return null; } else { return next.value; } } /** * Returns all YXmlElements that match the query. * Similar to Dom's {@link querySelectorAll}. * * @todo Does not yet support all queries. Currently only query by tagName. * * @param {CSS_Selector} query The query on the children * @return {Array} The elements that match this query. * * @public */ querySelectorAll(query) { query = query.toUpperCase(); return from(new YXmlTreeWalker(this, (element2) => element2.nodeName && element2.nodeName.toUpperCase() === query)); } /** * Creates YXmlEvent and calls observers. * * @param {Transaction} transaction * @param {Set} parentSubs Keys changed on this type. `null` if list was modified. */ _callObserver(transaction, parentSubs) { callTypeObservers(this, transaction, new YXmlEvent(this, parentSubs, transaction)); } /** * Get the string representation of all the children of this YXmlFragment. * * @return {string} The string representation of all children. */ toString() { return typeListMap(this, (xml) => xml.toString()).join(""); } /** * @return {string} */ toJSON() { return this.toString(); } /** * Creates a Dom Element that mirrors this YXmlElement. * * @param {Document} [_document=document] The document object (you must define * this when calling this method in * nodejs) * @param {Object} [hooks={}] Optional property to customize how hooks * are presented in the DOM * @param {any} [binding] You should not set this property. This is * used if DomBinding wants to create a * association to the created DOM type. * @return {Node} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element} * * @public */ toDOM(_document = document, hooks = {}, binding) { const fragment = _document.createDocumentFragment(); if (binding !== void 0) { binding._createAssociation(fragment, this); } typeListForEach(this, (xmlType) => { fragment.insertBefore(xmlType.toDOM(_document, hooks, binding), null); }); return fragment; } /** * Inserts new content at an index. * * @example * // Insert character 'a' at position 0 * xml.insert(0, [new Y.XmlText('text')]) * * @param {number} index The index to insert content at * @param {Array} content The array of content */ insert(index, content) { if (this.doc !== null) { transact(this.doc, (transaction) => { typeListInsertGenerics(transaction, this, index, content); }); } else { this._prelimContent.splice(index, 0, ...content); } } /** * Inserts new content at an index. * * @example * // Insert character 'a' at position 0 * xml.insert(0, [new Y.XmlText('text')]) * * @param {null|Item|YXmlElement|YXmlText} ref The index to insert content at * @param {Array} content The array of content */ insertAfter(ref, content) { if (this.doc !== null) { transact(this.doc, (transaction) => { const refItem = ref && ref instanceof AbstractType ? ref._item : ref; typeListInsertGenericsAfter(transaction, this, refItem, content); }); } else { const pc = ( /** @type {Array} */ this._prelimContent ); const index = ref === null ? 0 : pc.findIndex((el) => el === ref) + 1; if (index === 0 && ref !== null) { throw create3("Reference item not found"); } pc.splice(index, 0, ...content); } } /** * Deletes elements starting from an index. * * @param {number} index Index at which to start deleting elements * @param {number} [length=1] The number of elements to remove. Defaults to 1. */ delete(index, length3 = 1) { if (this.doc !== null) { transact(this.doc, (transaction) => { typeListDelete(transaction, this, index, length3); }); } else { this._prelimContent.splice(index, length3); } } /** * Transforms this YArray to a JavaScript Array. * * @return {Array} */ toArray() { return typeListToArray(this); } /** * Appends content to this YArray. * * @param {Array} content Array of content to append. */ push(content) { this.insert(this.length, content); } /** * Prepends content to this YArray. * * @param {Array} content Array of content to prepend. */ unshift(content) { this.insert(0, content); } /** * Returns the i-th element from a YArray. * * @param {number} index The index of the element to return from the YArray * @return {YXmlElement|YXmlText} */ get(index) { return typeListGet(this, index); } /** * Returns a portion of this YXmlFragment into a JavaScript Array selected * from start to end (end not included). * * @param {number} [start] * @param {number} [end] * @return {Array} */ slice(start = 0, end = this.length) { return typeListSlice(this, start, end); } /** * Executes a provided function on once on every child element. * * @param {function(YXmlElement|YXmlText,number, typeof self):void} f A function to execute on every element of this YArray. */ forEach(f) { typeListForEach(this, f); } /** * Transform the properties of this type to binary and write it to an * BinaryEncoder. * * This is called when this Item is sent to a remote peer. * * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to. */ _write(encoder) { encoder.writeTypeRef(YXmlFragmentRefID); } }; var readYXmlFragment = (_decoder) => new YXmlFragment(); var YXmlElement = class _YXmlElement extends YXmlFragment { constructor(nodeName = "UNDEFINED") { super(); this.nodeName = nodeName; this._prelimAttrs = /* @__PURE__ */ new Map(); } /** * @type {YXmlElement|YXmlText|null} */ get nextSibling() { const n = this._item ? this._item.next : null; return n ? ( /** @type {YXmlElement|YXmlText} */ /** @type {ContentType} */ n.content.type ) : null; } /** * @type {YXmlElement|YXmlText|null} */ get prevSibling() { const n = this._item ? this._item.prev : null; return n ? ( /** @type {YXmlElement|YXmlText} */ /** @type {ContentType} */ n.content.type ) : null; } /** * Integrate this type into the Yjs instance. * * * Save this struct in the os * * This type is sent to other client * * Observer functions are fired * * @param {Doc} y The Yjs instance * @param {Item} item */ _integrate(y, item) { super._integrate(y, item); /** @type {Map} */ this._prelimAttrs.forEach((value, key) => { this.setAttribute(key, value); }); this._prelimAttrs = null; } /** * Creates an Item with the same effect as this Item (without position effect) * * @return {YXmlElement} */ _copy() { return new _YXmlElement(this.nodeName); } /** * Makes a copy of this data type that can be included somewhere else. * * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. * * @return {YXmlElement} */ clone() { const el = new _YXmlElement(this.nodeName); const attrs = this.getAttributes(); forEach(attrs, (value, key) => { el.setAttribute( key, /** @type {any} */ value ); }); el.insert(0, this.toArray().map((v) => v instanceof AbstractType ? v.clone() : v)); return el; } /** * Returns the XML serialization of this YXmlElement. * The attributes are ordered by attribute-name, so you can easily use this * method to compare YXmlElements * * @return {string} The string representation of this type. * * @public */ toString() { const attrs = this.getAttributes(); const stringBuilder = []; const keys2 = []; for (const key in attrs) { keys2.push(key); } keys2.sort(); const keysLen = keys2.length; for (let i = 0; i < keysLen; i++) { const key = keys2[i]; stringBuilder.push(key + '="' + attrs[key] + '"'); } const nodeName = this.nodeName.toLocaleLowerCase(); const attrsString = stringBuilder.length > 0 ? " " + stringBuilder.join(" ") : ""; return `<${nodeName}${attrsString}>${super.toString()}`; } /** * Removes an attribute from this YXmlElement. * * @param {string} attributeName The attribute name that is to be removed. * * @public */ removeAttribute(attributeName) { if (this.doc !== null) { transact(this.doc, (transaction) => { typeMapDelete(transaction, this, attributeName); }); } else { this._prelimAttrs.delete(attributeName); } } /** * Sets or updates an attribute. * * @template {keyof KV & string} KEY * * @param {KEY} attributeName The attribute name that is to be set. * @param {KV[KEY]} attributeValue The attribute value that is to be set. * * @public */ setAttribute(attributeName, attributeValue) { if (this.doc !== null) { transact(this.doc, (transaction) => { typeMapSet(transaction, this, attributeName, attributeValue); }); } else { this._prelimAttrs.set(attributeName, attributeValue); } } /** * Returns an attribute value that belongs to the attribute name. * * @template {keyof KV & string} KEY * * @param {KEY} attributeName The attribute name that identifies the * queried value. * @return {KV[KEY]|undefined} The queried attribute value. * * @public */ getAttribute(attributeName) { return ( /** @type {any} */ typeMapGet(this, attributeName) ); } /** * Returns whether an attribute exists * * @param {string} attributeName The attribute name to check for existence. * @return {boolean} whether the attribute exists. * * @public */ hasAttribute(attributeName) { return ( /** @type {any} */ typeMapHas(this, attributeName) ); } /** * Returns all attribute name/value pairs in a JSON Object. * * @param {Snapshot} [snapshot] * @return {{ [Key in Extract]?: KV[Key]}} A JSON Object that describes the attributes. * * @public */ getAttributes(snapshot2) { return ( /** @type {any} */ snapshot2 ? typeMapGetAllSnapshot(this, snapshot2) : typeMapGetAll(this) ); } /** * Creates a Dom Element that mirrors this YXmlElement. * * @param {Document} [_document=document] The document object (you must define * this when calling this method in * nodejs) * @param {Object} [hooks={}] Optional property to customize how hooks * are presented in the DOM * @param {any} [binding] You should not set this property. This is * used if DomBinding wants to create a * association to the created DOM type. * @return {Node} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element} * * @public */ toDOM(_document = document, hooks = {}, binding) { const dom = _document.createElement(this.nodeName); const attrs = this.getAttributes(); for (const key in attrs) { const value = attrs[key]; if (typeof value === "string") { dom.setAttribute(key, value); } } typeListForEach(this, (yxml) => { dom.appendChild(yxml.toDOM(_document, hooks, binding)); }); if (binding !== void 0) { binding._createAssociation(dom, this); } return dom; } /** * Transform the properties of this type to binary and write it to an * BinaryEncoder. * * This is called when this Item is sent to a remote peer. * * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to. */ _write(encoder) { encoder.writeTypeRef(YXmlElementRefID); encoder.writeKey(this.nodeName); } }; var readYXmlElement = (decoder) => new YXmlElement(decoder.readKey()); var YXmlEvent = class extends YEvent { /** * @param {YXmlElement|YXmlText|YXmlFragment} target The target on which the event is created. * @param {Set} subs The set of changed attributes. `null` is included if the * child list changed. * @param {Transaction} transaction The transaction instance with which the * change was created. */ constructor(target, subs, transaction) { super(target, transaction); this.childListChanged = false; this.attributesChanged = /* @__PURE__ */ new Set(); subs.forEach((sub) => { if (sub === null) { this.childListChanged = true; } else { this.attributesChanged.add(sub); } }); } }; var YXmlHook = class _YXmlHook extends YMap { /** * @param {string} hookName nodeName of the Dom Node. */ constructor(hookName) { super(); this.hookName = hookName; } /** * Creates an Item with the same effect as this Item (without position effect) */ _copy() { return new _YXmlHook(this.hookName); } /** * Makes a copy of this data type that can be included somewhere else. * * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. * * @return {YXmlHook} */ clone() { const el = new _YXmlHook(this.hookName); this.forEach((value, key) => { el.set(key, value); }); return el; } /** * Creates a Dom Element that mirrors this YXmlElement. * * @param {Document} [_document=document] The document object (you must define * this when calling this method in * nodejs) * @param {Object.} [hooks] Optional property to customize how hooks * are presented in the DOM * @param {any} [binding] You should not set this property. This is * used if DomBinding wants to create a * association to the created DOM type * @return {Element} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element} * * @public */ toDOM(_document = document, hooks = {}, binding) { const hook = hooks[this.hookName]; let dom; if (hook !== void 0) { dom = hook.createDom(this); } else { dom = document.createElement(this.hookName); } dom.setAttribute("data-yjs-hook", this.hookName); if (binding !== void 0) { binding._createAssociation(dom, this); } return dom; } /** * Transform the properties of this type to binary and write it to an * BinaryEncoder. * * This is called when this Item is sent to a remote peer. * * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to. */ _write(encoder) { encoder.writeTypeRef(YXmlHookRefID); encoder.writeKey(this.hookName); } }; var readYXmlHook = (decoder) => new YXmlHook(decoder.readKey()); var YXmlText = class _YXmlText extends YText { /** * @type {YXmlElement|YXmlText|null} */ get nextSibling() { const n = this._item ? this._item.next : null; return n ? ( /** @type {YXmlElement|YXmlText} */ /** @type {ContentType} */ n.content.type ) : null; } /** * @type {YXmlElement|YXmlText|null} */ get prevSibling() { const n = this._item ? this._item.prev : null; return n ? ( /** @type {YXmlElement|YXmlText} */ /** @type {ContentType} */ n.content.type ) : null; } _copy() { return new _YXmlText(); } /** * Makes a copy of this data type that can be included somewhere else. * * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. * * @return {YXmlText} */ clone() { const text2 = new _YXmlText(); text2.applyDelta(this.toDelta()); return text2; } /** * Creates a Dom Element that mirrors this YXmlText. * * @param {Document} [_document=document] The document object (you must define * this when calling this method in * nodejs) * @param {Object} [hooks] Optional property to customize how hooks * are presented in the DOM * @param {any} [binding] You should not set this property. This is * used if DomBinding wants to create a * association to the created DOM type. * @return {Text} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element} * * @public */ toDOM(_document = document, hooks, binding) { const dom = _document.createTextNode(this.toString()); if (binding !== void 0) { binding._createAssociation(dom, this); } return dom; } toString() { return this.toDelta().map((delta) => { const nestedNodes = []; for (const nodeName in delta.attributes) { const attrs = []; for (const key in delta.attributes[nodeName]) { attrs.push({ key, value: delta.attributes[nodeName][key] }); } attrs.sort((a, b) => a.key < b.key ? -1 : 1); nestedNodes.push({ nodeName, attrs }); } nestedNodes.sort((a, b) => a.nodeName < b.nodeName ? -1 : 1); let str = ""; for (let i = 0; i < nestedNodes.length; i++) { const node = nestedNodes[i]; str += `<${node.nodeName}`; for (let j = 0; j < node.attrs.length; j++) { const attr = node.attrs[j]; str += ` ${attr.key}="${attr.value}"`; } str += ">"; } str += delta.insert; for (let i = nestedNodes.length - 1; i >= 0; i--) { str += ``; } return str; }).join(""); } /** * @return {string} */ toJSON() { return this.toString(); } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder */ _write(encoder) { encoder.writeTypeRef(YXmlTextRefID); } }; var readYXmlText = (decoder) => new YXmlText(); var AbstractStruct = class { /** * @param {ID} id * @param {number} length */ constructor(id2, length3) { this.id = id2; this.length = length3; } /** * @type {boolean} */ get deleted() { throw methodUnimplemented(); } /** * Merge this struct with the item to the right. * This method is already assuming that `this.id.clock + this.length === this.id.clock`. * Also this method does *not* remove right from StructStore! * @param {AbstractStruct} right * @return {boolean} whether this merged with right */ mergeWith(right) { return false; } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to. * @param {number} offset * @param {number} encodingRef */ write(encoder, offset, encodingRef) { throw methodUnimplemented(); } /** * @param {Transaction} transaction * @param {number} offset */ integrate(transaction, offset) { throw methodUnimplemented(); } }; var structGCRefNumber = 0; var GC = class extends AbstractStruct { get deleted() { return true; } delete() { } /** * @param {GC} right * @return {boolean} */ mergeWith(right) { if (this.constructor !== right.constructor) { return false; } this.length += right.length; return true; } /** * @param {Transaction} transaction * @param {number} offset */ integrate(transaction, offset) { if (offset > 0) { this.id.clock += offset; this.length -= offset; } addStruct(transaction.doc.store, this); } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder * @param {number} offset */ write(encoder, offset) { encoder.writeInfo(structGCRefNumber); encoder.writeLen(this.length - offset); } /** * @param {Transaction} transaction * @param {StructStore} store * @return {null | number} */ getMissing(transaction, store2) { return null; } }; var ContentBinary = class _ContentBinary { /** * @param {Uint8Array} content */ constructor(content) { this.content = content; } /** * @return {number} */ getLength() { return 1; } /** * @return {Array} */ getContent() { return [this.content]; } /** * @return {boolean} */ isCountable() { return true; } /** * @return {ContentBinary} */ copy() { return new _ContentBinary(this.content); } /** * @param {number} offset * @return {ContentBinary} */ splice(offset) { throw methodUnimplemented(); } /** * @param {ContentBinary} right * @return {boolean} */ mergeWith(right) { return false; } /** * @param {Transaction} transaction * @param {Item} item */ integrate(transaction, item) { } /** * @param {Transaction} transaction */ delete(transaction) { } /** * @param {StructStore} store */ gc(store2) { } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder * @param {number} offset */ write(encoder, offset) { encoder.writeBuf(this.content); } /** * @return {number} */ getRef() { return 3; } }; var readContentBinary = (decoder) => new ContentBinary(decoder.readBuf()); var ContentDeleted = class _ContentDeleted { /** * @param {number} len */ constructor(len) { this.len = len; } /** * @return {number} */ getLength() { return this.len; } /** * @return {Array} */ getContent() { return []; } /** * @return {boolean} */ isCountable() { return false; } /** * @return {ContentDeleted} */ copy() { return new _ContentDeleted(this.len); } /** * @param {number} offset * @return {ContentDeleted} */ splice(offset) { const right = new _ContentDeleted(this.len - offset); this.len = offset; return right; } /** * @param {ContentDeleted} right * @return {boolean} */ mergeWith(right) { this.len += right.len; return true; } /** * @param {Transaction} transaction * @param {Item} item */ integrate(transaction, item) { addToDeleteSet(transaction.deleteSet, item.id.client, item.id.clock, this.len); item.markDeleted(); } /** * @param {Transaction} transaction */ delete(transaction) { } /** * @param {StructStore} store */ gc(store2) { } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder * @param {number} offset */ write(encoder, offset) { encoder.writeLen(this.len - offset); } /** * @return {number} */ getRef() { return 1; } }; var readContentDeleted = (decoder) => new ContentDeleted(decoder.readLen()); var createDocFromOpts = (guid, opts) => new Doc({ guid, ...opts, shouldLoad: opts.shouldLoad || opts.autoLoad || false }); var ContentDoc = class _ContentDoc { /** * @param {Doc} doc */ constructor(doc2) { if (doc2._item) { console.error("This document was already integrated as a sub-document. You should create a second instance instead with the same guid."); } this.doc = doc2; const opts = {}; this.opts = opts; if (!doc2.gc) { opts.gc = false; } if (doc2.autoLoad) { opts.autoLoad = true; } if (doc2.meta !== null) { opts.meta = doc2.meta; } } /** * @return {number} */ getLength() { return 1; } /** * @return {Array} */ getContent() { return [this.doc]; } /** * @return {boolean} */ isCountable() { return true; } /** * @return {ContentDoc} */ copy() { return new _ContentDoc(createDocFromOpts(this.doc.guid, this.opts)); } /** * @param {number} offset * @return {ContentDoc} */ splice(offset) { throw methodUnimplemented(); } /** * @param {ContentDoc} right * @return {boolean} */ mergeWith(right) { return false; } /** * @param {Transaction} transaction * @param {Item} item */ integrate(transaction, item) { this.doc._item = item; transaction.subdocsAdded.add(this.doc); if (this.doc.shouldLoad) { transaction.subdocsLoaded.add(this.doc); } } /** * @param {Transaction} transaction */ delete(transaction) { if (transaction.subdocsAdded.has(this.doc)) { transaction.subdocsAdded.delete(this.doc); } else { transaction.subdocsRemoved.add(this.doc); } } /** * @param {StructStore} store */ gc(store2) { } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder * @param {number} offset */ write(encoder, offset) { encoder.writeString(this.doc.guid); encoder.writeAny(this.opts); } /** * @return {number} */ getRef() { return 9; } }; var readContentDoc = (decoder) => new ContentDoc(createDocFromOpts(decoder.readString(), decoder.readAny())); var ContentEmbed = class _ContentEmbed { /** * @param {Object} embed */ constructor(embed) { this.embed = embed; } /** * @return {number} */ getLength() { return 1; } /** * @return {Array} */ getContent() { return [this.embed]; } /** * @return {boolean} */ isCountable() { return true; } /** * @return {ContentEmbed} */ copy() { return new _ContentEmbed(this.embed); } /** * @param {number} offset * @return {ContentEmbed} */ splice(offset) { throw methodUnimplemented(); } /** * @param {ContentEmbed} right * @return {boolean} */ mergeWith(right) { return false; } /** * @param {Transaction} transaction * @param {Item} item */ integrate(transaction, item) { } /** * @param {Transaction} transaction */ delete(transaction) { } /** * @param {StructStore} store */ gc(store2) { } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder * @param {number} offset */ write(encoder, offset) { encoder.writeJSON(this.embed); } /** * @return {number} */ getRef() { return 5; } }; var readContentEmbed = (decoder) => new ContentEmbed(decoder.readJSON()); var ContentFormat = class _ContentFormat { /** * @param {string} key * @param {Object} value */ constructor(key, value) { this.key = key; this.value = value; } /** * @return {number} */ getLength() { return 1; } /** * @return {Array} */ getContent() { return []; } /** * @return {boolean} */ isCountable() { return false; } /** * @return {ContentFormat} */ copy() { return new _ContentFormat(this.key, this.value); } /** * @param {number} _offset * @return {ContentFormat} */ splice(_offset) { throw methodUnimplemented(); } /** * @param {ContentFormat} _right * @return {boolean} */ mergeWith(_right) { return false; } /** * @param {Transaction} _transaction * @param {Item} item */ integrate(_transaction, item) { const p = ( /** @type {YText} */ item.parent ); p._searchMarker = null; p._hasFormatting = true; } /** * @param {Transaction} transaction */ delete(transaction) { } /** * @param {StructStore} store */ gc(store2) { } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder * @param {number} offset */ write(encoder, offset) { encoder.writeKey(this.key); encoder.writeJSON(this.value); } /** * @return {number} */ getRef() { return 6; } }; var readContentFormat = (decoder) => new ContentFormat(decoder.readKey(), decoder.readJSON()); var ContentJSON = class _ContentJSON { /** * @param {Array} arr */ constructor(arr) { this.arr = arr; } /** * @return {number} */ getLength() { return this.arr.length; } /** * @return {Array} */ getContent() { return this.arr; } /** * @return {boolean} */ isCountable() { return true; } /** * @return {ContentJSON} */ copy() { return new _ContentJSON(this.arr); } /** * @param {number} offset * @return {ContentJSON} */ splice(offset) { const right = new _ContentJSON(this.arr.slice(offset)); this.arr = this.arr.slice(0, offset); return right; } /** * @param {ContentJSON} right * @return {boolean} */ mergeWith(right) { this.arr = this.arr.concat(right.arr); return true; } /** * @param {Transaction} transaction * @param {Item} item */ integrate(transaction, item) { } /** * @param {Transaction} transaction */ delete(transaction) { } /** * @param {StructStore} store */ gc(store2) { } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder * @param {number} offset */ write(encoder, offset) { const len = this.arr.length; encoder.writeLen(len - offset); for (let i = offset; i < len; i++) { const c = this.arr[i]; encoder.writeString(c === void 0 ? "undefined" : JSON.stringify(c)); } } /** * @return {number} */ getRef() { return 2; } }; var readContentJSON = (decoder) => { const len = decoder.readLen(); const cs = []; for (let i = 0; i < len; i++) { const c = decoder.readString(); if (c === "undefined") { cs.push(void 0); } else { cs.push(JSON.parse(c)); } } return new ContentJSON(cs); }; var isDevMode = getVariable("node_env") === "development"; var ContentAny = class _ContentAny { /** * @param {Array} arr */ constructor(arr) { this.arr = arr; isDevMode && deepFreeze(arr); } /** * @return {number} */ getLength() { return this.arr.length; } /** * @return {Array} */ getContent() { return this.arr; } /** * @return {boolean} */ isCountable() { return true; } /** * @return {ContentAny} */ copy() { return new _ContentAny(this.arr); } /** * @param {number} offset * @return {ContentAny} */ splice(offset) { const right = new _ContentAny(this.arr.slice(offset)); this.arr = this.arr.slice(0, offset); return right; } /** * @param {ContentAny} right * @return {boolean} */ mergeWith(right) { this.arr = this.arr.concat(right.arr); return true; } /** * @param {Transaction} transaction * @param {Item} item */ integrate(transaction, item) { } /** * @param {Transaction} transaction */ delete(transaction) { } /** * @param {StructStore} store */ gc(store2) { } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder * @param {number} offset */ write(encoder, offset) { const len = this.arr.length; encoder.writeLen(len - offset); for (let i = offset; i < len; i++) { const c = this.arr[i]; encoder.writeAny(c); } } /** * @return {number} */ getRef() { return 8; } }; var readContentAny = (decoder) => { const len = decoder.readLen(); const cs = []; for (let i = 0; i < len; i++) { cs.push(decoder.readAny()); } return new ContentAny(cs); }; var ContentString = class _ContentString { /** * @param {string} str */ constructor(str) { this.str = str; } /** * @return {number} */ getLength() { return this.str.length; } /** * @return {Array} */ getContent() { return this.str.split(""); } /** * @return {boolean} */ isCountable() { return true; } /** * @return {ContentString} */ copy() { return new _ContentString(this.str); } /** * @param {number} offset * @return {ContentString} */ splice(offset) { const right = new _ContentString(this.str.slice(offset)); this.str = this.str.slice(0, offset); const firstCharCode = this.str.charCodeAt(offset - 1); if (firstCharCode >= 55296 && firstCharCode <= 56319) { this.str = this.str.slice(0, offset - 1) + "\uFFFD"; right.str = "\uFFFD" + right.str.slice(1); } return right; } /** * @param {ContentString} right * @return {boolean} */ mergeWith(right) { this.str += right.str; return true; } /** * @param {Transaction} transaction * @param {Item} item */ integrate(transaction, item) { } /** * @param {Transaction} transaction */ delete(transaction) { } /** * @param {StructStore} store */ gc(store2) { } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder * @param {number} offset */ write(encoder, offset) { encoder.writeString(offset === 0 ? this.str : this.str.slice(offset)); } /** * @return {number} */ getRef() { return 4; } }; var readContentString = (decoder) => new ContentString(decoder.readString()); var typeRefs = [ readYArray, readYMap, readYText, readYXmlElement, readYXmlFragment, readYXmlHook, readYXmlText ]; var YArrayRefID = 0; var YMapRefID = 1; var YTextRefID = 2; var YXmlElementRefID = 3; var YXmlFragmentRefID = 4; var YXmlHookRefID = 5; var YXmlTextRefID = 6; var ContentType = class _ContentType { /** * @param {AbstractType} type */ constructor(type) { this.type = type; } /** * @return {number} */ getLength() { return 1; } /** * @return {Array} */ getContent() { return [this.type]; } /** * @return {boolean} */ isCountable() { return true; } /** * @return {ContentType} */ copy() { return new _ContentType(this.type._copy()); } /** * @param {number} offset * @return {ContentType} */ splice(offset) { throw methodUnimplemented(); } /** * @param {ContentType} right * @return {boolean} */ mergeWith(right) { return false; } /** * @param {Transaction} transaction * @param {Item} item */ integrate(transaction, item) { this.type._integrate(transaction.doc, item); } /** * @param {Transaction} transaction */ delete(transaction) { let item = this.type._start; while (item !== null) { if (!item.deleted) { item.delete(transaction); } else if (item.id.clock < (transaction.beforeState.get(item.id.client) || 0)) { transaction._mergeStructs.push(item); } item = item.right; } this.type._map.forEach((item2) => { if (!item2.deleted) { item2.delete(transaction); } else if (item2.id.clock < (transaction.beforeState.get(item2.id.client) || 0)) { transaction._mergeStructs.push(item2); } }); transaction.changed.delete(this.type); } /** * @param {StructStore} store */ gc(store2) { let item = this.type._start; while (item !== null) { item.gc(store2, true); item = item.right; } this.type._start = null; this.type._map.forEach( /** @param {Item | null} item */ (item2) => { while (item2 !== null) { item2.gc(store2, true); item2 = item2.left; } } ); this.type._map = /* @__PURE__ */ new Map(); } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder * @param {number} offset */ write(encoder, offset) { this.type._write(encoder); } /** * @return {number} */ getRef() { return 7; } }; var readContentType = (decoder) => new ContentType(typeRefs[decoder.readTypeRef()](decoder)); var followRedone = (store2, id2) => { let nextID = id2; let diff = 0; let item; do { if (diff > 0) { nextID = createID(nextID.client, nextID.clock + diff); } item = getItem(store2, nextID); diff = nextID.clock - item.id.clock; nextID = item.redone; } while (nextID !== null && item instanceof Item); return { item, diff }; }; var keepItem = (item, keep) => { while (item !== null && item.keep !== keep) { item.keep = keep; item = /** @type {AbstractType} */ item.parent._item; } }; var splitItem = (transaction, leftItem, diff) => { const { client, clock } = leftItem.id; const rightItem = new Item( createID(client, clock + diff), leftItem, createID(client, clock + diff - 1), leftItem.right, leftItem.rightOrigin, leftItem.parent, leftItem.parentSub, leftItem.content.splice(diff) ); if (leftItem.deleted) { rightItem.markDeleted(); } if (leftItem.keep) { rightItem.keep = true; } if (leftItem.redone !== null) { rightItem.redone = createID(leftItem.redone.client, leftItem.redone.clock + diff); } leftItem.right = rightItem; if (rightItem.right !== null) { rightItem.right.left = rightItem; } transaction._mergeStructs.push(rightItem); if (rightItem.parentSub !== null && rightItem.right === null) { rightItem.parent._map.set(rightItem.parentSub, rightItem); } leftItem.length = diff; return rightItem; }; var isDeletedByUndoStack = (stack, id2) => some( stack, /** @param {StackItem} s */ (s) => isDeleted(s.deletions, id2) ); var redoItem = (transaction, item, redoitems, itemsToDelete, ignoreRemoteMapChanges, um) => { const doc2 = transaction.doc; const store2 = doc2.store; const ownClientID = doc2.clientID; const redone = item.redone; if (redone !== null) { return getItemCleanStart(transaction, redone); } let parentItem = ( /** @type {AbstractType} */ item.parent._item ); let left = null; let right; if (parentItem !== null && parentItem.deleted === true) { if (parentItem.redone === null && (!redoitems.has(parentItem) || redoItem(transaction, parentItem, redoitems, itemsToDelete, ignoreRemoteMapChanges, um) === null)) { return null; } while (parentItem.redone !== null) { parentItem = getItemCleanStart(transaction, parentItem.redone); } } const parentType = parentItem === null ? ( /** @type {AbstractType} */ item.parent ) : ( /** @type {ContentType} */ parentItem.content.type ); if (item.parentSub === null) { left = item.left; right = item; while (left !== null) { let leftTrace = left; while (leftTrace !== null && /** @type {AbstractType} */ leftTrace.parent._item !== parentItem) { leftTrace = leftTrace.redone === null ? null : getItemCleanStart(transaction, leftTrace.redone); } if (leftTrace !== null && /** @type {AbstractType} */ leftTrace.parent._item === parentItem) { left = leftTrace; break; } left = left.left; } while (right !== null) { let rightTrace = right; while (rightTrace !== null && /** @type {AbstractType} */ rightTrace.parent._item !== parentItem) { rightTrace = rightTrace.redone === null ? null : getItemCleanStart(transaction, rightTrace.redone); } if (rightTrace !== null && /** @type {AbstractType} */ rightTrace.parent._item === parentItem) { right = rightTrace; break; } right = right.right; } } else { right = null; if (item.right && !ignoreRemoteMapChanges) { left = item; while (left !== null && left.right !== null && (left.right.redone || isDeleted(itemsToDelete, left.right.id) || isDeletedByUndoStack(um.undoStack, left.right.id) || isDeletedByUndoStack(um.redoStack, left.right.id))) { left = left.right; while (left.redone) left = getItemCleanStart(transaction, left.redone); } if (left && left.right !== null) { return null; } } else { left = parentType._map.get(item.parentSub) || null; } } const nextClock = getState(store2, ownClientID); const nextId = createID(ownClientID, nextClock); const redoneItem = new Item( nextId, left, left && left.lastId, right, right && right.id, parentType, item.parentSub, item.content.copy() ); item.redone = nextId; keepItem(redoneItem, true); redoneItem.integrate(transaction, 0); return redoneItem; }; var Item = class _Item extends AbstractStruct { /** * @param {ID} id * @param {Item | null} left * @param {ID | null} origin * @param {Item | null} right * @param {ID | null} rightOrigin * @param {AbstractType|ID|null} parent Is a type if integrated, is null if it is possible to copy parent from left or right, is ID before integration to search for it. * @param {string | null} parentSub * @param {AbstractContent} content */ constructor(id2, left, origin2, right, rightOrigin, parent, parentSub, content) { super(id2, content.getLength()); this.origin = origin2; this.left = left; this.right = right; this.rightOrigin = rightOrigin; this.parent = parent; this.parentSub = parentSub; this.redone = null; this.content = content; this.info = this.content.isCountable() ? BIT2 : 0; } /** * This is used to mark the item as an indexed fast-search marker * * @type {boolean} */ set marker(isMarked) { if ((this.info & BIT4) > 0 !== isMarked) { this.info ^= BIT4; } } get marker() { return (this.info & BIT4) > 0; } /** * If true, do not garbage collect this Item. */ get keep() { return (this.info & BIT1) > 0; } set keep(doKeep) { if (this.keep !== doKeep) { this.info ^= BIT1; } } get countable() { return (this.info & BIT2) > 0; } /** * Whether this item was deleted or not. * @type {Boolean} */ get deleted() { return (this.info & BIT3) > 0; } set deleted(doDelete) { if (this.deleted !== doDelete) { this.info ^= BIT3; } } markDeleted() { this.info |= BIT3; } /** * Return the creator clientID of the missing op or define missing items and return null. * * @param {Transaction} transaction * @param {StructStore} store * @return {null | number} */ getMissing(transaction, store2) { if (this.origin && this.origin.client !== this.id.client && this.origin.clock >= getState(store2, this.origin.client)) { return this.origin.client; } if (this.rightOrigin && this.rightOrigin.client !== this.id.client && this.rightOrigin.clock >= getState(store2, this.rightOrigin.client)) { return this.rightOrigin.client; } if (this.parent && this.parent.constructor === ID && this.id.client !== this.parent.client && this.parent.clock >= getState(store2, this.parent.client)) { return this.parent.client; } if (this.origin) { this.left = getItemCleanEnd(transaction, store2, this.origin); this.origin = this.left.lastId; } if (this.rightOrigin) { this.right = getItemCleanStart(transaction, this.rightOrigin); this.rightOrigin = this.right.id; } if (this.left && this.left.constructor === GC || this.right && this.right.constructor === GC) { this.parent = null; } else if (!this.parent) { if (this.left && this.left.constructor === _Item) { this.parent = this.left.parent; this.parentSub = this.left.parentSub; } else if (this.right && this.right.constructor === _Item) { this.parent = this.right.parent; this.parentSub = this.right.parentSub; } } else if (this.parent.constructor === ID) { const parentItem = getItem(store2, this.parent); if (parentItem.constructor === GC) { this.parent = null; } else { this.parent = /** @type {ContentType} */ parentItem.content.type; } } return null; } /** * @param {Transaction} transaction * @param {number} offset */ integrate(transaction, offset) { if (offset > 0) { this.id.clock += offset; this.left = getItemCleanEnd(transaction, transaction.doc.store, createID(this.id.client, this.id.clock - 1)); this.origin = this.left.lastId; this.content = this.content.splice(offset); this.length -= offset; } if (this.parent) { if (!this.left && (!this.right || this.right.left !== null) || this.left && this.left.right !== this.right) { let left = this.left; let o; if (left !== null) { o = left.right; } else if (this.parentSub !== null) { o = /** @type {AbstractType} */ this.parent._map.get(this.parentSub) || null; while (o !== null && o.left !== null) { o = o.left; } } else { o = /** @type {AbstractType} */ this.parent._start; } const conflictingItems = /* @__PURE__ */ new Set(); const itemsBeforeOrigin = /* @__PURE__ */ new Set(); while (o !== null && o !== this.right) { itemsBeforeOrigin.add(o); conflictingItems.add(o); if (compareIDs(this.origin, o.origin)) { if (o.id.client < this.id.client) { left = o; conflictingItems.clear(); } else if (compareIDs(this.rightOrigin, o.rightOrigin)) { break; } } else if (o.origin !== null && itemsBeforeOrigin.has(getItem(transaction.doc.store, o.origin))) { if (!conflictingItems.has(getItem(transaction.doc.store, o.origin))) { left = o; conflictingItems.clear(); } } else { break; } o = o.right; } this.left = left; } if (this.left !== null) { const right = this.left.right; this.right = right; this.left.right = this; } else { let r; if (this.parentSub !== null) { r = /** @type {AbstractType} */ this.parent._map.get(this.parentSub) || null; while (r !== null && r.left !== null) { r = r.left; } } else { r = /** @type {AbstractType} */ this.parent._start; this.parent._start = this; } this.right = r; } if (this.right !== null) { this.right.left = this; } else if (this.parentSub !== null) { this.parent._map.set(this.parentSub, this); if (this.left !== null) { this.left.delete(transaction); } } if (this.parentSub === null && this.countable && !this.deleted) { this.parent._length += this.length; } addStruct(transaction.doc.store, this); this.content.integrate(transaction, this); addChangedTypeToTransaction( transaction, /** @type {AbstractType} */ this.parent, this.parentSub ); if ( /** @type {AbstractType} */ this.parent._item !== null && /** @type {AbstractType} */ this.parent._item.deleted || this.parentSub !== null && this.right !== null ) { this.delete(transaction); } } else { new GC(this.id, this.length).integrate(transaction, 0); } } /** * Returns the next non-deleted item */ get next() { let n = this.right; while (n !== null && n.deleted) { n = n.right; } return n; } /** * Returns the previous non-deleted item */ get prev() { let n = this.left; while (n !== null && n.deleted) { n = n.left; } return n; } /** * Computes the last content address of this Item. */ get lastId() { return this.length === 1 ? this.id : createID(this.id.client, this.id.clock + this.length - 1); } /** * Try to merge two items * * @param {Item} right * @return {boolean} */ mergeWith(right) { if (this.constructor === right.constructor && compareIDs(right.origin, this.lastId) && this.right === right && compareIDs(this.rightOrigin, right.rightOrigin) && this.id.client === right.id.client && this.id.clock + this.length === right.id.clock && this.deleted === right.deleted && this.redone === null && right.redone === null && this.content.constructor === right.content.constructor && this.content.mergeWith(right.content)) { const searchMarker = ( /** @type {AbstractType} */ this.parent._searchMarker ); if (searchMarker) { searchMarker.forEach((marker) => { if (marker.p === right) { marker.p = this; if (!this.deleted && this.countable) { marker.index -= this.length; } } }); } if (right.keep) { this.keep = true; } this.right = right.right; if (this.right !== null) { this.right.left = this; } this.length += right.length; return true; } return false; } /** * Mark this Item as deleted. * * @param {Transaction} transaction */ delete(transaction) { if (!this.deleted) { const parent = ( /** @type {AbstractType} */ this.parent ); if (this.countable && this.parentSub === null) { parent._length -= this.length; } this.markDeleted(); addToDeleteSet(transaction.deleteSet, this.id.client, this.id.clock, this.length); addChangedTypeToTransaction(transaction, parent, this.parentSub); this.content.delete(transaction); } } /** * @param {StructStore} store * @param {boolean} parentGCd */ gc(store2, parentGCd) { if (!this.deleted) { throw unexpectedCase(); } this.content.gc(store2); if (parentGCd) { replaceStruct(store2, this, new GC(this.id, this.length)); } else { this.content = new ContentDeleted(this.length); } } /** * Transform the properties of this type to binary and write it to an * BinaryEncoder. * * This is called when this Item is sent to a remote peer. * * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to. * @param {number} offset */ write(encoder, offset) { const origin2 = offset > 0 ? createID(this.id.client, this.id.clock + offset - 1) : this.origin; const rightOrigin = this.rightOrigin; const parentSub = this.parentSub; const info = this.content.getRef() & BITS5 | (origin2 === null ? 0 : BIT8) | // origin is defined (rightOrigin === null ? 0 : BIT7) | // right origin is defined (parentSub === null ? 0 : BIT6); encoder.writeInfo(info); if (origin2 !== null) { encoder.writeLeftID(origin2); } if (rightOrigin !== null) { encoder.writeRightID(rightOrigin); } if (origin2 === null && rightOrigin === null) { const parent = ( /** @type {AbstractType} */ this.parent ); if (parent._item !== void 0) { const parentItem = parent._item; if (parentItem === null) { const ykey = findRootTypeKey(parent); encoder.writeParentInfo(true); encoder.writeString(ykey); } else { encoder.writeParentInfo(false); encoder.writeLeftID(parentItem.id); } } else if (parent.constructor === String) { encoder.writeParentInfo(true); encoder.writeString(parent); } else if (parent.constructor === ID) { encoder.writeParentInfo(false); encoder.writeLeftID(parent); } else { unexpectedCase(); } if (parentSub !== null) { encoder.writeString(parentSub); } } this.content.write(encoder, offset); } }; var readItemContent = (decoder, info) => contentRefs[info & BITS5](decoder); var contentRefs = [ () => { unexpectedCase(); }, // GC is not ItemContent readContentDeleted, // 1 readContentJSON, // 2 readContentBinary, // 3 readContentString, // 4 readContentEmbed, // 5 readContentFormat, // 6 readContentType, // 7 readContentAny, // 8 readContentDoc, // 9 () => { unexpectedCase(); } // 10 - Skip is not ItemContent ]; var structSkipRefNumber = 10; var Skip = class extends AbstractStruct { get deleted() { return true; } delete() { } /** * @param {Skip} right * @return {boolean} */ mergeWith(right) { if (this.constructor !== right.constructor) { return false; } this.length += right.length; return true; } /** * @param {Transaction} transaction * @param {number} offset */ integrate(transaction, offset) { unexpectedCase(); } /** * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder * @param {number} offset */ write(encoder, offset) { encoder.writeInfo(structSkipRefNumber); writeVarUint(encoder.restEncoder, this.length - offset); } /** * @param {Transaction} transaction * @param {StructStore} store * @return {null | number} */ getMissing(transaction, store2) { return null; } }; var glo = ( /** @type {any} */ typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {} ); var importIdentifier = "__ $YJS$ __"; if (glo[importIdentifier] === true) { console.error("Yjs was already imported. This breaks constructor checks and will lead to issues! - https://github.com/yjs/yjs/issues/438"); } glo[importIdentifier] = true; // packages/sync/node_modules/y-protocols/awareness.js var outdatedTimeout = 3e4; var Awareness = class extends Observable { /** * @param {Y.Doc} doc */ constructor(doc2) { super(); this.doc = doc2; this.clientID = doc2.clientID; this.states = /* @__PURE__ */ new Map(); this.meta = /* @__PURE__ */ new Map(); this._checkInterval = /** @type {any} */ setInterval(() => { const now = getUnixTime(); if (this.getLocalState() !== null && outdatedTimeout / 2 <= now - /** @type {{lastUpdated:number}} */ this.meta.get(this.clientID).lastUpdated) { this.setLocalState(this.getLocalState()); } const remove = []; this.meta.forEach((meta, clientid) => { if (clientid !== this.clientID && outdatedTimeout <= now - meta.lastUpdated && this.states.has(clientid)) { remove.push(clientid); } }); if (remove.length > 0) { removeAwarenessStates(this, remove, "timeout"); } }, floor(outdatedTimeout / 10)); doc2.on("destroy", () => { this.destroy(); }); this.setLocalState({}); } destroy() { this.emit("destroy", [this]); this.setLocalState(null); super.destroy(); clearInterval(this._checkInterval); } /** * @return {Object|null} */ getLocalState() { return this.states.get(this.clientID) || null; } /** * @param {Object|null} state */ setLocalState(state) { const clientID = this.clientID; const currLocalMeta = this.meta.get(clientID); const clock = currLocalMeta === void 0 ? 0 : currLocalMeta.clock + 1; const prevState = this.states.get(clientID); if (state === null) { this.states.delete(clientID); } else { this.states.set(clientID, state); } this.meta.set(clientID, { clock, lastUpdated: getUnixTime() }); const added = []; const updated = []; const filteredUpdated = []; const removed = []; if (state === null) { removed.push(clientID); } else if (prevState == null) { if (state != null) { added.push(clientID); } } else { updated.push(clientID); if (!equalityDeep(prevState, state)) { filteredUpdated.push(clientID); } } if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) { this.emit("change", [{ added, updated: filteredUpdated, removed }, "local"]); } this.emit("update", [{ added, updated, removed }, "local"]); } /** * @param {string} field * @param {any} value */ setLocalStateField(field, value) { const state = this.getLocalState(); if (state !== null) { this.setLocalState({ ...state, [field]: value }); } } /** * @return {Map>} */ getStates() { return this.states; } }; var removeAwarenessStates = (awareness, clients, origin2) => { const removed = []; for (let i = 0; i < clients.length; i++) { const clientID = clients[i]; if (awareness.states.has(clientID)) { awareness.states.delete(clientID); if (clientID === awareness.clientID) { const curMeta = ( /** @type {MetaClientState} */ awareness.meta.get(clientID) ); awareness.meta.set(clientID, { clock: curMeta.clock + 1, lastUpdated: getUnixTime() }); } removed.push(clientID); } } if (removed.length > 0) { awareness.emit("change", [{ added: [], updated: [], removed }, origin2]); awareness.emit("update", [{ added: [], updated: [], removed }, origin2]); } }; // packages/sync/build-module/config.mjs var CRDT_DOC_VERSION = 1; var CRDT_DOC_META_PERSISTENCE_KEY = "fromPersistence"; var CRDT_RECORD_MAP_KEY = "document"; var CRDT_STATE_MAP_KEY = "state"; var CRDT_STATE_MAP_SAVED_AT_KEY = "savedAt"; var CRDT_STATE_MAP_SAVED_BY_KEY = "savedBy"; var CRDT_STATE_MAP_VERSION_KEY = "version"; var LOCAL_EDITOR_ORIGIN = "gutenberg"; var LOCAL_SYNC_MANAGER_ORIGIN = "syncManager"; var LOCAL_UNDO_IGNORED_ORIGIN = "gutenberg-undo-ignored"; // packages/sync/build-module/errors.mjs var ConnectionErrorCode = /* @__PURE__ */ ((ConnectionErrorCode22) => { ConnectionErrorCode22["AUTHENTICATION_FAILED"] = "authentication-failed"; ConnectionErrorCode22["CONNECTION_EXPIRED"] = "connection-expired"; ConnectionErrorCode22["CONNECTION_LIMIT_EXCEEDED"] = "connection-limit-exceeded"; ConnectionErrorCode22["DOCUMENT_SIZE_LIMIT_EXCEEDED"] = "document-size-limit-exceeded"; ConnectionErrorCode22["UNKNOWN_ERROR"] = "unknown-error"; return ConnectionErrorCode22; })(ConnectionErrorCode || {}); var ConnectionError = class extends Error { constructor(code = "unknown-error", message) { super(message); this.code = code; this.name = "ConnectionError"; } }; // packages/sync/build-module/lock-unlock.mjs var import_private_apis = __toESM(require_private_apis(), 1); var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)( "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.", "@wordpress/sync" ); // packages/sync/build-module/performance.mjs function logPerformanceTiming(fn) { return function(...args2) { const start = performance.now(); const result = fn.apply(this, args2); const end = performance.now(); console.log( `[SyncManager][performance]: ${fn.name} took ${(end - start).toFixed(2)} ms` ); return result; }; } function passThru(fn) { return ((...args2) => fn(...args2)); } function yieldToEventLoop(fn) { return function(...args2) { setTimeout(() => { fn.apply(this, args2); }, 0); }; } // packages/sync/build-module/providers/index.mjs var import_hooks3 = __toESM(require_hooks(), 1); // packages/sync/build-module/providers/http-polling/polling-manager.mjs var import_hooks2 = __toESM(require_hooks(), 1); // packages/sync/node_modules/y-protocols/sync.js var messageYjsSyncStep1 = 0; var messageYjsSyncStep2 = 1; var messageYjsUpdate = 2; var writeSyncStep1 = (encoder, doc2) => { writeVarUint(encoder, messageYjsSyncStep1); const sv = encodeStateVector(doc2); writeVarUint8Array(encoder, sv); }; var writeSyncStep2 = (encoder, doc2, encodedStateVector) => { writeVarUint(encoder, messageYjsSyncStep2); writeVarUint8Array(encoder, encodeStateAsUpdate(doc2, encodedStateVector)); }; var readSyncStep1 = (decoder, encoder, doc2) => writeSyncStep2(encoder, doc2, readVarUint8Array(decoder)); var readSyncStep2 = (decoder, doc2, transactionOrigin, errorHandler) => { try { applyUpdate(doc2, readVarUint8Array(decoder), transactionOrigin); } catch (error) { if (errorHandler != null) errorHandler( /** @type {Error} */ error ); console.error("Caught error while handling a Yjs update", error); } }; var readUpdate2 = readSyncStep2; var readSyncMessage = (decoder, encoder, doc2, transactionOrigin, errorHandler) => { const messageType = readVarUint(decoder); switch (messageType) { case messageYjsSyncStep1: readSyncStep1(decoder, encoder, doc2); break; case messageYjsSyncStep2: readSyncStep2(decoder, doc2, transactionOrigin, errorHandler); break; case messageYjsUpdate: readUpdate2(decoder, doc2, transactionOrigin, errorHandler); break; default: throw new Error("Unknown message type"); } return messageType; }; // packages/sync/build-module/providers/http-polling/config.mjs var import_hooks = __toESM(require_hooks(), 1); var DEFAULT_CLIENT_LIMIT_PER_ROOM = 3; var ERROR_RETRY_DELAYS_SOLO_MS = [ 2e3, 4e3, 8e3, 12e3 // Solo: 26s total retry time solo before dialog ]; var ERROR_RETRY_DELAYS_WITH_COLLABORATORS_MS = [ 1e3, 2e3, 4e3, 8e3 // With collaborators: 15s total retry time before dialog ]; var DISCONNECT_DIALOG_RETRY_MS = 3e4; var MANUAL_RETRY_INTERVAL_MS = 15e3; var MAX_UPDATE_SIZE_IN_BYTES = 1 * 1024 * 1024; var MAX_ROOMS_PER_REQUEST = 50; var POLLING_INTERVAL_IN_MS = (0, import_hooks.applyFilters)( "sync.pollingManager.pollingInterval", 4e3 // 4 seconds ); var POLLING_INTERVAL_WITH_COLLABORATORS_IN_MS = (0, import_hooks.applyFilters)( "sync.pollingManager.pollingIntervalWithCollaborators", 1e3 // 1 second ); var POLLING_INTERVAL_BACKGROUND_TAB_IN_MS = 25 * 1e3; // packages/sync/build-module/providers/http-polling/types.mjs var SyncUpdateType = /* @__PURE__ */ ((SyncUpdateType2) => { SyncUpdateType2["COMPACTION"] = "compaction"; SyncUpdateType2["SYNC_STEP_1"] = "sync_step1"; SyncUpdateType2["SYNC_STEP_2"] = "sync_step2"; SyncUpdateType2["UPDATE"] = "update"; return SyncUpdateType2; })(SyncUpdateType || {}); // packages/sync/build-module/providers/http-polling/utils.mjs var import_api_fetch = __toESM(require_api_fetch(), 1); var SYNC_API_PATH = "/wp-sync/v1/updates"; function uint8ArrayToBase64(data) { let binary = ""; const len = data.byteLength; for (let i = 0; i < len; i++) { binary += String.fromCharCode(data[i]); } return globalThis.btoa(binary); } function base64ToUint8Array(base64) { const binaryString = globalThis.atob(base64); const len = binaryString.length; const bytes = new Uint8Array(len); for (let i = 0; i < len; i++) { bytes[i] = binaryString.charCodeAt(i); } return bytes; } function createSyncUpdate(data, type) { return { data: uint8ArrayToBase64(data), type }; } function createUpdateQueue(initial = [], paused = true) { let isPaused = paused; const updates = [...initial]; return { add(update) { updates.push(update); }, addBulk(bulkUpdates) { if (0 === bulkUpdates.length) { return; } updates.push(...bulkUpdates); }, clear() { updates.splice(0, updates.length); }, get() { if (isPaused) { return []; } return updates.splice(0, updates.length); }, pause() { isPaused = true; }, restore(restoredUpdates) { const filtered = restoredUpdates.filter( (u) => u.type !== SyncUpdateType.COMPACTION ); if (0 === filtered.length) { return; } updates.unshift(...filtered); }, resume() { isPaused = false; }, size() { return updates.length; } }; } async function postSyncUpdate(payload) { const response = await (0, import_api_fetch.default)({ body: JSON.stringify(payload), headers: { "Content-Type": "application/json" }, method: "POST", parse: false, path: SYNC_API_PATH }); if (!response.ok) { throw new Error( `Sync update failed with status ${response.status}` ); } return await response.json(); } function postSyncUpdateNonBlocking(payload) { if (payload.rooms.length === 0) { return; } (0, import_api_fetch.default)({ body: JSON.stringify(payload), headers: { "Content-Type": "application/json" }, keepalive: true, method: "POST", parse: false, path: SYNC_API_PATH }).catch(() => { }); } function intValueOrDefault(value, defaultValue) { const intValue = parseInt(String(value), 10); return isNaN(intValue) ? defaultValue : intValue; } function rotateWindow(items2, offset, size2) { if (items2.length === 0) { return { window: [], nextOffset: 0 }; } const start = (offset % items2.length + items2.length) % items2.length; const wrapped = [...items2.slice(start), ...items2.slice(0, start)]; return { window: wrapped.slice(0, Math.max(0, size2)), nextOffset: (start + Math.max(0, size2)) % items2.length }; } // packages/sync/build-module/providers/http-polling/polling-manager.mjs var POLLING_MANAGER_ORIGIN = "polling-manager"; function isForbiddenError(error) { return error?.data?.status === 403; } function identifyForbiddenRoom(error, rooms) { const message = typeof error.message === "string" ? error.message : ""; const sortedRooms = [...rooms].sort((a, b) => b.length - a.length); for (const room of sortedRooms) { if (message.includes(room)) { return room; } } return null; } function handleForbiddenError(error, requestedRooms) { const forbiddenRoom = identifyForbiddenRoom( error, requestedRooms.map((r) => r.room) ); if (forbiddenRoom) { const state = roomStates.get(forbiddenRoom); if (state) { state.log( "Permission denied, unregistering room", { error }, "error", true // force ); unregisterRoom(forbiddenRoom, { sendDisconnectSignal: false }); } for (const room of requestedRooms) { if (room.room === forbiddenRoom || !roomStates.has(room.room)) { continue; } const remainingState = roomStates.get(room.room); if (room.updates.length > 0) { remainingState.updateQueue.restore(room.updates); } } } else { const rooms = [...roomStates.keys()]; for (const room of rooms) { const state = roomStates.get(room); if (state) { state.log( "Permission denied, unregistering room", { error }, "error", true // force ); unregisterRoom(room, { sendDisconnectSignal: false }); } } } } var roomStates = /* @__PURE__ */ new Map(); function createDeprecatedCompactionUpdate(updates) { const mergeable = updates.filter( (u) => [SyncUpdateType.COMPACTION, SyncUpdateType.UPDATE].includes( u.type ) ).map((u) => base64ToUint8Array(u.data)); return createSyncUpdate( mergeUpdatesV2(mergeable), SyncUpdateType.COMPACTION ); } function createSyncStep1Update(doc2) { const encoder = createEncoder(); writeSyncStep1(encoder, doc2); return createSyncUpdate( toUint8Array(encoder), SyncUpdateType.SYNC_STEP_1 ); } function createSyncStep2Update(doc2, step1) { const decoder = createDecoder(step1); const encoder = createEncoder(); readSyncMessage( decoder, encoder, doc2, POLLING_MANAGER_ORIGIN ); return createSyncUpdate( toUint8Array(encoder), SyncUpdateType.SYNC_STEP_2 ); } function processAwarenessUpdate(state, awareness) { const currentStates = awareness.getStates(); const added = /* @__PURE__ */ new Set(); const updated = /* @__PURE__ */ new Set(); const removed = new Set( Array.from(currentStates.keys()).filter( (clientId) => !state[clientId] ) ); Object.entries(state).forEach(([clientIdString, awarenessState]) => { const clientId = Number(clientIdString); if (clientId === awareness.clientID) { return; } if (null === awarenessState) { currentStates.delete(clientId); removed.add(clientId); return; } if (!currentStates.has(clientId)) { currentStates.set(clientId, awarenessState); added.add(clientId); return; } const currentState = currentStates.get(clientId); if (JSON.stringify(currentState) !== JSON.stringify(awarenessState)) { currentStates.set(clientId, awarenessState); updated.add(clientId); } }); if (added.size + updated.size > 0) { awareness.emit("change", [ { added: Array.from(added), updated: Array.from(updated), // Left blank on purpose, as the removal of clients is handled in the if condition below. removed: [] } ]); } if (removed.size > 0) { removeAwarenessStates( awareness, Array.from(removed), POLLING_MANAGER_ORIGIN ); } } function processDocUpdate(update, doc2, onSync) { const data = base64ToUint8Array(update.data); switch (update.type) { case SyncUpdateType.SYNC_STEP_1: { return createSyncStep2Update(doc2, data); } case SyncUpdateType.SYNC_STEP_2: { const decoder = createDecoder(data); const encoder = createEncoder(); readSyncMessage( decoder, encoder, doc2, POLLING_MANAGER_ORIGIN ); onSync(); return; } case SyncUpdateType.COMPACTION: case SyncUpdateType.UPDATE: { applyUpdateV2(doc2, data, POLLING_MANAGER_ORIGIN); } } } function checkConnectionLimit(awareness, roomState) { if (!roomState.isPrimaryRoom || hasCheckedConnectionLimit) { return false; } hasCheckedConnectionLimit = true; const maxClientsPerRoom = (0, import_hooks2.applyFilters)( "sync.pollingProvider.maxClientsPerRoom", DEFAULT_CLIENT_LIMIT_PER_ROOM, roomState.room ); const clientCount = Object.keys(awareness).length; const validatedLimit = intValueOrDefault( maxClientsPerRoom, DEFAULT_CLIENT_LIMIT_PER_ROOM ); if (clientCount > validatedLimit) { roomState.log("Connection limit exceeded", { clientCount, maxClientsPerRoom: validatedLimit, room: roomState.room }); return true; } return false; } var areListenersRegistered = false; var consecutiveFailures = 0; var hasCheckedConnectionLimit = false; var isManualRetry = false; var hasCollaborators = false; var isActiveBrowser = "visible" === document.visibilityState; var isPolling = false; var isUnloadPending = false; var pollInterval = POLLING_INTERVAL_IN_MS; var pollingTimeoutId = null; var roomOverflowOffset = 0; function handleBeforeUnload() { isUnloadPending = true; } function handlePageHide() { const rooms = Array.from(roomStates.entries()).map( ([room, state]) => ({ after: 0, awareness: null, client_id: state.clientId, room, updates: [] }) ); for (let i = 0; i < rooms.length; i += MAX_ROOMS_PER_REQUEST) { postSyncUpdateNonBlocking({ rooms: rooms.slice(i, i + MAX_ROOMS_PER_REQUEST) }); } } function handleVisibilityChange() { const wasActive = isActiveBrowser; isActiveBrowser = document.visibilityState === "visible"; if (isActiveBrowser && !wasActive) { if (pollingTimeoutId) { clearTimeout(pollingTimeoutId); pollingTimeoutId = null; poll(); } } } function selectRoomsForRequest() { const allRooms = Array.from(roomStates.values()); if (allRooms.length <= MAX_ROOMS_PER_REQUEST) { return allRooms; } const primaryRoom = allRooms.find((state) => state.isPrimaryRoom); const overflowRooms = allRooms.filter((state) => state !== primaryRoom); const overflowSlotsPerRequest = MAX_ROOMS_PER_REQUEST - (primaryRoom ? 1 : 0); const { window: overflowSlice, nextOffset } = rotateWindow( overflowRooms, roomOverflowOffset, overflowSlotsPerRequest ); roomOverflowOffset = nextOffset; if (primaryRoom) { return [primaryRoom, ...overflowSlice]; } return overflowSlice; } function poll() { isPolling = true; pollingTimeoutId = null; async function start() { if (0 === roomStates.size) { isPolling = false; return; } isUnloadPending = false; const roomsInRequest = selectRoomsForRequest(); const payload = { rooms: roomsInRequest.map((state) => ({ after: state.endCursor ?? 0, awareness: state.localAwarenessState, client_id: state.clientId, room: state.room, updates: state.updateQueue.get() })) }; roomsInRequest.forEach((state) => { state.onStatusChange({ status: "connecting" }); }); try { const { rooms } = await postSyncUpdate(payload); consecutiveFailures = 0; isManualRetry = false; roomsInRequest.forEach((state) => { if (roomStates.get(state.room) !== state) { return; } state.onStatusChange({ status: "connected" }); }); hasCollaborators = false; rooms.forEach((room) => { if (!roomStates.has(room.room)) { return; } const roomState = roomStates.get(room.room); roomState.endCursor = room.end_cursor; if (checkConnectionLimit(room.awareness, roomState)) { roomState.onStatusChange({ status: "disconnected", error: new ConnectionError( ConnectionErrorCode.CONNECTION_LIMIT_EXCEEDED, "Connection limit exceeded" ) }); unregisterRoom(room.room); return; } roomState.processAwarenessUpdate(room.awareness); if (roomState.isPrimaryRoom && Object.keys(room.awareness).length > 1) { hasCollaborators = true; roomStates.forEach((state) => { state.updateQueue.resume(); }); } const responseUpdates = []; for (const update of room.updates) { try { const response = roomState.processDocUpdate(update); if (response) { responseUpdates.push(response); } } catch (error) { roomState.log( "Failed to apply sync update", { error, update }, "error", true // force ); } } roomState.updateQueue.addBulk(responseUpdates); if (room.should_compact) { roomState.log("Server requested compaction update"); roomState.updateQueue.clear(); roomState.updateQueue.add( roomState.createCompactionUpdate() ); } else if (room.compaction_request) { roomState.log("Server requested (old) compaction update"); roomState.updateQueue.add( createDeprecatedCompactionUpdate( room.compaction_request ) ); } }); if (isActiveBrowser && hasCollaborators) { pollInterval = POLLING_INTERVAL_WITH_COLLABORATORS_IN_MS; } else if (isActiveBrowser) { pollInterval = POLLING_INTERVAL_IN_MS; } else { pollInterval = POLLING_INTERVAL_BACKGROUND_TAB_IN_MS; } } catch (error) { if (isForbiddenError(error)) { handleForbiddenError(error, payload.rooms); if (roomStates.size === 0) { isPolling = false; return; } } else { consecutiveFailures++; const retrySchedule = hasCollaborators ? ERROR_RETRY_DELAYS_WITH_COLLABORATORS_MS : ERROR_RETRY_DELAYS_SOLO_MS; if (consecutiveFailures <= retrySchedule.length) { pollInterval = retrySchedule[consecutiveFailures - 1]; } else { pollInterval = DISCONNECT_DIALOG_RETRY_MS; } if (isManualRetry) { pollInterval = MANUAL_RETRY_INTERVAL_MS; isManualRetry = false; } for (const room of payload.rooms) { if (!roomStates.has(room.room)) { continue; } const state = roomStates.get(room.room); if (room.updates.length > 0 && state.endCursor > 0) { state.updateQueue.clear(); state.updateQueue.add(state.createCompactionUpdate()); } else if (room.updates.length > 0) { state.updateQueue.restore(room.updates); } state.log( "Error posting sync update, will retry with backoff", { error, nextPoll: pollInterval }, "error", true // force ); } if (!isUnloadPending) { const backgroundRetriesFailed = consecutiveFailures > retrySchedule.length; roomsInRequest.forEach((state) => { if (roomStates.get(state.room) !== state) { return; } state.onStatusChange({ status: "disconnected", canManuallyRetry: true, consecutiveFailures, backgroundRetriesFailed, willAutoRetryInMs: pollInterval }); }); } } } pollingTimeoutId = setTimeout(poll, pollInterval); } void start(); } function registerRoom({ room, doc: doc2, awareness, log, onSync, onStatusChange }) { if (roomStates.has(room)) { return; } const updateQueue = createUpdateQueue([createSyncStep1Update(doc2)]); const isPrimaryRoom = 0 === roomStates.size; function onAwarenessUpdate() { roomState.localAwarenessState = awareness.getLocalState() ?? {}; } function onDocUpdate(update, origin2) { if (POLLING_MANAGER_ORIGIN === origin2) { return; } if (update.byteLength > MAX_UPDATE_SIZE_IN_BYTES) { const state = roomStates.get(room); if (!state) { return; } state.log("Document size limit exceeded", { maxUpdateSizeInBytes: MAX_UPDATE_SIZE_IN_BYTES, updateSizeInBytes: update.byteLength }); state.onStatusChange({ status: "disconnected", error: new ConnectionError( ConnectionErrorCode.DOCUMENT_SIZE_LIMIT_EXCEEDED, "Document size limit exceeded" ) }); unregisterRoom(room); } updateQueue.add(createSyncUpdate(update, SyncUpdateType.UPDATE)); } function unregister() { doc2.off("updateV2", onDocUpdate); awareness.off("change", onAwarenessUpdate); updateQueue.clear(); } const roomState = { clientId: doc2.clientID, createCompactionUpdate: () => createSyncUpdate( encodeStateAsUpdateV2(doc2), SyncUpdateType.COMPACTION ), endCursor: 0, isPrimaryRoom, localAwarenessState: awareness.getLocalState() ?? {}, log, onStatusChange, processAwarenessUpdate: (state) => processAwarenessUpdate(state, awareness), processDocUpdate: (update) => processDocUpdate(update, doc2, onSync), room, unregister, updateQueue }; doc2.on("updateV2", onDocUpdate); awareness.on("change", onAwarenessUpdate); roomStates.set(room, roomState); if (!areListenersRegistered) { window.addEventListener("beforeunload", handleBeforeUnload); window.addEventListener("pagehide", handlePageHide); document.addEventListener("visibilitychange", handleVisibilityChange); areListenersRegistered = true; } if (!isPolling) { poll(); } } function unregisterRoom(room, { sendDisconnectSignal = true } = {}) { const state = roomStates.get(room); if (state) { if (sendDisconnectSignal) { const rooms = [ { after: 0, awareness: null, client_id: state.clientId, room, updates: [] } ]; postSyncUpdateNonBlocking({ rooms }); } state.unregister(); roomStates.delete(room); } if (0 === roomStates.size && areListenersRegistered) { window.removeEventListener("beforeunload", handleBeforeUnload); window.removeEventListener("pagehide", handlePageHide); document.removeEventListener( "visibilitychange", handleVisibilityChange ); areListenersRegistered = false; hasCheckedConnectionLimit = false; consecutiveFailures = 0; roomOverflowOffset = 0; } } function retryNow() { isManualRetry = true; if (pollingTimeoutId) { clearTimeout(pollingTimeoutId); pollingTimeoutId = null; poll(); } } var pollingManager = { registerRoom, retryNow, unregisterRoom }; // packages/sync/build-module/providers/http-polling/http-polling-provider.mjs var HttpPollingProvider = class extends ObservableV2 { constructor(options) { super(); this.options = options; this.log("Initializing", { room: options.room }); this.awareness = options.awareness ?? new Awareness(options.ydoc); this.connect(); } awareness; status = "disconnected"; synced = false; /** * Connect to the endpoint and initialize sync. */ connect() { this.log("Connecting"); pollingManager.registerRoom({ room: this.options.room, doc: this.options.ydoc, awareness: this.awareness, log: this.log, onStatusChange: this.emitStatus, onSync: this.onSync }); } /** * Destroy the provider and cleanup resources. */ destroy() { this.disconnect(); super.destroy(); } /** * Disconnect the provider and allow reconnection later. */ disconnect() { this.log("Disconnecting"); pollingManager.unregisterRoom(this.options.room); this.emitStatus({ status: "disconnected" }); } /** * Emit connection status, passing the full object through so that * additional fields (e.g. `willAutoRetryInMs`) are preserved for consumers. * * @param connectionStatus The connection status object */ emitStatus = (connectionStatus) => { const { status } = connectionStatus; const error = status === "disconnected" ? connectionStatus.error : void 0; if (this.status === status && !error) { return; } if (status === "connecting" && this.status !== "disconnected") { return; } this.log("Status change", { status, error }); this.status = status; this.emit("status", [connectionStatus]); }; /** * Log debug messages if debugging is enabled. * * @param message The debug message * @param debug Additional debug information * @param errorLevel The console method to use for logging * @param force Whether to force logging regardless of debug setting */ log = (message, debug = {}, errorLevel = "log", force = false) => { if (!this.options.debug && !force) { return; } const logFn = console[errorLevel] || console.log; logFn(`[${this.constructor.name}]: ${message}`, { room: this.options.room, ...debug }); }; /** * Handle synchronization events from the polling manager. */ onSync = () => { if (!this.synced) { this.synced = true; this.log("Synced"); } }; }; function createHttpPollingProvider() { return async ({ awareness, objectType, objectId, ydoc }) => { const room = objectId ? `${objectType}:${objectId}` : objectType; const provider = new HttpPollingProvider({ awareness, // debug: true, room, ydoc }); return { destroy: () => provider.destroy(), // Adapter: ObservableV2.on is compatible with ProviderOn // The callback receives data as the first parameter on: (event, callback) => { provider.on(event, callback); } }; }; } // packages/sync/build-module/providers/index.mjs var providerCreators = null; function getDefaultProviderCreators() { return [createHttpPollingProvider()]; } function isProviderCreator(creator) { return "function" === typeof creator; } function getProviderCreators() { if (providerCreators) { return providerCreators; } if (!window._wpCollaborationEnabled) { return []; } const filteredProviderCreators = (0, import_hooks3.applyFilters)( "sync.providers", getDefaultProviderCreators() ); if (!Array.isArray(filteredProviderCreators)) { providerCreators = []; return providerCreators; } providerCreators = filteredProviderCreators.filter(isProviderCreator); return providerCreators; } // packages/sync/build-module/y-utilities/y-multidoc-undomanager.mjs var popStackItem2 = (mum, type) => { const stack = type === "undo" ? mum.undoStack : mum.redoStack; while (stack.length > 0) { const um = ( /** @type {Y.UndoManager} */ stack.pop() ); const prevUmStack = type === "undo" ? um.undoStack : um.redoStack; const stackItem = ( /** @type {any} */ prevUmStack.pop() ); let actionPerformed = false; if (type === "undo") { um.undoStack = [stackItem]; actionPerformed = um.undo() !== null; um.undoStack = prevUmStack; } else { um.redoStack = [stackItem]; actionPerformed = um.redo() !== null; um.redoStack = prevUmStack; } if (actionPerformed) { return stackItem; } } return null; }; var YMultiDocUndoManager = class extends Observable { /** * @param {Y.AbstractType|Array>} typeScope Accepts either a single type, or an array of types * @param {ConstructorParameters[1]} opts */ constructor(typeScope = [], opts = {}) { super(); this.docs = /* @__PURE__ */ new Map(); this.trackedOrigins = opts.trackedOrigins || /* @__PURE__ */ new Set([null]); opts.trackedOrigins = this.trackedOrigins; this._defaultOpts = opts; this.undoStack = []; this.redoStack = []; this.addToScope(typeScope); } /** * @param {Array> | Y.AbstractType} ytypes */ addToScope(ytypes) { ytypes = isArray(ytypes) ? ytypes : [ytypes]; ytypes.forEach((ytype) => { const ydoc = ( /** @type {Y.Doc} */ ytype.doc ); const um = setIfUndefined(this.docs, ydoc, () => { const um2 = new UndoManager([ytype], this._defaultOpts); um2.on( "stack-cleared", /** @param {any} opts */ ({ undoStackCleared, redoStackCleared }) => { this.clear(undoStackCleared, redoStackCleared); } ); ydoc.on("destroy", () => { this.docs.delete(ydoc); this.undoStack = this.undoStack.filter( (um3) => um3.doc !== ydoc ); this.redoStack = this.redoStack.filter( (um3) => um3.doc !== ydoc ); }); um2.on( "stack-item-added", /** @param {any} change */ (change) => { const stack = change.type === "undo" ? this.undoStack : this.redoStack; stack.push(um2); this.emit("stack-item-added", [ { ...change, ydoc }, this ]); } ); um2.on( "stack-item-updated", /** @param {any} change */ (change) => { this.emit("stack-item-updated", [ { ...change, ydoc }, this ]); } ); um2.on( "stack-item-popped", /** @param {any} change */ (change) => { this.emit("stack-item-popped", [ { ...change, ydoc }, this ]); } ); return um2; }); if (um.scope.every((yt) => yt !== ytype)) { um.scope.push(ytype); } }); } /** * @param {any} origin */ /* c8 ignore next 3 */ addTrackedOrigin(origin2) { this.trackedOrigins.add(origin2); } /** * @param {any} origin */ /* c8 ignore next 3 */ removeTrackedOrigin(origin2) { this.trackedOrigins.delete(origin2); } /** * Undo last changes on type. * * @return {any?} Returns StackItem if a change was applied */ undo() { return popStackItem2(this, "undo"); } /** * Redo last undo operation. * * @return {any?} Returns StackItem if a change was applied */ redo() { return popStackItem2(this, "redo"); } clear(clearUndoStack = true, clearRedoStack = true) { if (clearUndoStack && this.canUndo() || clearRedoStack && this.canRedo()) { this.docs.forEach((um) => { clearUndoStack && (this.undoStack = []); clearRedoStack && (this.redoStack = []); um.clear(clearUndoStack, clearRedoStack); }); this.emit("stack-cleared", [ { undoStackCleared: clearUndoStack, redoStackCleared: clearRedoStack } ]); } } /* c8 ignore next 5 */ stopCapturing() { this.docs.forEach((um) => { um.stopCapturing(); }); } /** * Are undo steps available? * * @return {boolean} `true` if undo is possible */ canUndo() { return this.undoStack.length > 0; } /** * Are redo steps available? * * @return {boolean} `true` if redo is possible */ canRedo() { return this.redoStack.length > 0; } destroy() { this.docs.forEach((um) => um.destroy()); super.destroy(); } }; // packages/sync/build-module/undo-manager.mjs function createUndoManager() { const yUndoManager = new YMultiDocUndoManager([], { // Throttle undo/redo captures after 500ms of inactivity. // 500 was selected from subjective local UX testing, shorter timeouts // may cause mid-word undo stack items. captureTimeout: 500, // Ensure that we only scope the undo/redo to the current editor. // The yjs document's clientID is added once it's available. trackedOrigins: /* @__PURE__ */ new Set([LOCAL_EDITOR_ORIGIN]) }); return { /** * Record changes into the history. * Since Yjs automatically tracks changes, this method translates the WordPress * HistoryRecord format into Yjs operations. * * @param _record A record of changes to record. * @param _isStaged Whether to immediately create an undo point or not. */ addRecord(_record, _isStaged = false) { }, /** * Add a Yjs map to the scope of the undo manager. * * @param {Y.Map< any >} ymap The Yjs map to add to the scope. * @param handlers * @param handlers.addUndoMeta * @param handlers.restoreUndoMeta */ addToScope(ymap, handlers) { if (ymap.doc === null) { return; } const ydoc = ymap.doc; yUndoManager.addToScope(ymap); const { addUndoMeta, restoreUndoMeta } = handlers; yUndoManager.on("stack-item-added", (event) => { addUndoMeta(ydoc, event.stackItem.meta); }); yUndoManager.on("stack-item-popped", (event) => { restoreUndoMeta(ydoc, event.stackItem.meta); }); }, /** * Undo the last recorded changes. * */ undo() { if (!yUndoManager.canUndo()) { return; } yUndoManager.undo(); return []; }, /** * Redo the last undone changes. */ redo() { if (!yUndoManager.canRedo()) { return; } yUndoManager.redo(); return []; }, /** * Check if there are changes that can be undone. * * @return {boolean} Whether there are changes to undo. */ hasUndo() { return yUndoManager.canUndo(); }, /** * Check if there are changes that can be redone. * * @return {boolean} Whether there are changes to redo. */ hasRedo() { return yUndoManager.canRedo(); }, /** * Stop capturing changes into the current undo item. * The next change will create a new undo item. */ stopCapturing() { yUndoManager.stopCapturing(); } }; } // packages/sync/build-module/utils.mjs function createYjsDoc(documentMeta = {}) { const metaMap = new Map( Object.entries(documentMeta) ); return new Doc({ meta: metaMap }); } function initializeYjsDoc(ydoc) { const stateMap = ydoc.getMap(CRDT_STATE_MAP_KEY); stateMap.set(CRDT_STATE_MAP_VERSION_KEY, CRDT_DOC_VERSION); } function markEntityAsSaved(ydoc) { const recordMeta = ydoc.getMap(CRDT_STATE_MAP_KEY); recordMeta.set(CRDT_STATE_MAP_SAVED_AT_KEY, Date.now()); recordMeta.set(CRDT_STATE_MAP_SAVED_BY_KEY, ydoc.clientID); } function pseudoRandomID() { return Math.floor(Math.random() * 1e9); } function serializeCrdtDoc(crdtDoc) { return JSON.stringify({ document: toBase64(encodeStateAsUpdateV2(crdtDoc)), updateId: pseudoRandomID() // helps with debugging }); } function deserializeCrdtDoc(serializedCrdtDoc) { try { const { document: document2 } = JSON.parse(serializedCrdtDoc); const docMeta = { [CRDT_DOC_META_PERSISTENCE_KEY]: true }; const ydoc = createYjsDoc(docMeta); const yupdate = fromBase64(document2); applyUpdateV2(ydoc, yupdate); ydoc.clientID = pseudoRandomID(); return ydoc; } catch (e) { return null; } } // packages/sync/build-module/manager.mjs function getEntityId(objectType, objectId) { return `${objectType}_${objectId}`; } function createSyncManager(debug = false) { const debugWrap = debug ? logPerformanceTiming : passThru; const collectionStates = /* @__PURE__ */ new Map(); const entityStates = /* @__PURE__ */ new Map(); let undoManager2; function log(component, message, entityId, context = {}) { if (!debug) { return; } console.log(`[SyncManager][${component}]: ${message}`, { ...context, entityId }); } async function loadEntity(syncConfig, objectType, objectId, record, handlers) { const providerCreators2 = getProviderCreators(); const entityId = getEntityId(objectType, objectId); if (0 === providerCreators2.length) { log("loadEntity", "no providers, skipping", entityId); return; } if (entityStates.has(entityId)) { log("loadEntity", "already loaded", entityId); return; } if (false === syncConfig.shouldSync?.(objectType, objectId)) { log("loadEntity", "shouldSync false, skipping", entityId); return; } log("loadEntity", "loading", entityId); handlers = { addUndoMeta: debugWrap(handlers.addUndoMeta), editRecord: debugWrap(handlers.editRecord), getEditedRecord: debugWrap(handlers.getEditedRecord), onStatusChange: debugWrap(handlers.onStatusChange), persistCRDTDoc: debugWrap(handlers.persistCRDTDoc), refetchRecord: debugWrap(handlers.refetchRecord), restoreUndoMeta: debugWrap(handlers.restoreUndoMeta) }; const ydoc = createYjsDoc({ objectType }); const recordMap = ydoc.getMap(CRDT_RECORD_MAP_KEY); const stateMap = ydoc.getMap(CRDT_STATE_MAP_KEY); const now = Date.now(); const unload = () => { log("loadEntity", "unloading", entityId); providerResults.forEach((result) => result.destroy()); handlers.onStatusChange(null); recordMap.unobserveDeep(onRecordUpdate); stateMap.unobserve(onStateMapUpdate); ydoc.destroy(); entityStates.delete(entityId); }; const awareness = syncConfig.createAwareness?.(ydoc, objectId); const onRecordUpdate = (_events, transaction) => { if (transaction.local && !(transaction.origin instanceof UndoManager)) { return; } void internal.updateEntityRecord(objectType, objectId); }; const onStateMapUpdate = (event, transaction) => { if (transaction.local) { return; } event.keysChanged.forEach((key) => { switch (key) { case CRDT_STATE_MAP_SAVED_AT_KEY: const newValue = stateMap.get(CRDT_STATE_MAP_SAVED_AT_KEY); if ("number" === typeof newValue && newValue > now) { log("loadEntity", "refetching record", entityId); void handlers.refetchRecord().catch(() => { }); } break; } }); }; if (!undoManager2) { undoManager2 = createUndoManager(); } const { addUndoMeta, restoreUndoMeta } = handlers; undoManager2.addToScope(recordMap, { addUndoMeta, restoreUndoMeta }); const entityState = { awareness, handlers, objectId, objectType, syncConfig, unload, ydoc }; entityStates.set(entityId, entityState); log("loadEntity", "connecting", entityId); const providerResults = await Promise.all( providerCreators2.map(async (create9) => { const provider = await create9({ objectType, objectId, ydoc, awareness }); provider.on("status", handlers.onStatusChange); return provider; }) ); recordMap.observeDeep(onRecordUpdate); stateMap.observe(onStateMapUpdate); initializeYjsDoc(ydoc); internal.applyPersistedCrdtDoc(objectType, objectId, record); } async function loadCollection(syncConfig, objectType, handlers) { const providerCreators2 = getProviderCreators(); const entityId = getEntityId(objectType, null); if (0 === providerCreators2.length) { log("loadCollection", "no providers, skipping", entityId); return; } if (collectionStates.has(objectType)) { log("loadCollection", "already loaded", entityId); return; } if (false === syncConfig.shouldSync?.(objectType, null)) { log("loadCollection", "shouldSync false, skipping", entityId); return; } log("loadCollection", "loading", entityId); const ydoc = createYjsDoc({ collection: true, objectType }); const stateMap = ydoc.getMap(CRDT_STATE_MAP_KEY); const now = Date.now(); const unload = () => { log("loadCollection", "unloading", entityId); providerResults.forEach((result) => result.destroy()); handlers.onStatusChange(null); stateMap.unobserve(onStateMapUpdate); ydoc.destroy(); collectionStates.delete(objectType); }; const onStateMapUpdate = (event, transaction) => { if (transaction.local) { return; } event.keysChanged.forEach((key) => { switch (key) { case CRDT_STATE_MAP_SAVED_AT_KEY: const newValue = stateMap.get(CRDT_STATE_MAP_SAVED_AT_KEY); if ("number" === typeof newValue && newValue > now) { void handlers.refetchRecords().catch(() => { }); } break; } }); }; const awareness = syncConfig.createAwareness?.(ydoc); const collectionState = { awareness, handlers, syncConfig, unload, ydoc }; collectionStates.set(objectType, collectionState); log("loadCollection", "connecting", entityId); const providerResults = await Promise.all( providerCreators2.map(async (create9) => { const provider = await create9({ awareness, objectType, objectId: null, ydoc }); provider.on("status", handlers.onStatusChange); return provider; }) ); stateMap.observe(onStateMapUpdate); initializeYjsDoc(ydoc); } function unloadEntity(objectType, objectId) { const entityId = getEntityId(objectType, objectId); log("unloadEntity", "unloading", entityId); entityStates.get(entityId)?.unload(); updateCRDTDoc(objectType, null, {}, origin, { isSave: true }); } function getAwareness(objectType, objectId) { const entityId = getEntityId(objectType, objectId); const entityState = entityStates.get(entityId); if (!entityState || !entityState.awareness) { return void 0; } return entityState.awareness; } function _applyPersistedCrdtDoc(objectType, objectId, record) { const entityId = getEntityId(objectType, objectId); const entityState = entityStates.get(entityId); if (!entityState) { log("applyPersistedCrdtDoc", "no entity state", entityId); return; } const { handlers, syncConfig: { applyChangesToCRDTDoc, getChangesFromCRDTDoc, getPersistedCRDTDoc }, ydoc: targetDoc } = entityState; const serialized = getPersistedCRDTDoc?.(record); const tempDoc = serialized ? deserializeCrdtDoc(serialized) : null; if (!tempDoc) { log("applyPersistedCrdtDoc", "no persisted doc", entityId); targetDoc.transact(() => { applyChangesToCRDTDoc(targetDoc, record); handlers.persistCRDTDoc(); }, LOCAL_SYNC_MANAGER_ORIGIN); return; } const update = encodeStateAsUpdateV2(tempDoc); applyUpdateV2(targetDoc, update); const invalidations = getChangesFromCRDTDoc(tempDoc, record); const invalidatedKeys = Object.keys(invalidations); tempDoc.destroy(); if (0 === invalidatedKeys.length) { log("applyPersistedCrdtDoc", "valid persisted doc", entityId); return; } log("applyPersistedCrdtDoc", "invalidated keys", entityId, { invalidatedKeys }); const changes = invalidatedKeys.reduce( (acc, key) => Object.assign(acc, { [key]: record[key] }), {} ); targetDoc.transact(() => { applyChangesToCRDTDoc(targetDoc, changes); handlers.persistCRDTDoc(); }, LOCAL_SYNC_MANAGER_ORIGIN); } function updateCRDTDoc(objectType, objectId, changes, origin2, options = {}) { const { isSave = false, isNewUndoLevel = false } = options; const entityId = getEntityId(objectType, objectId); const entityState = entityStates.get(entityId); const collectionState = collectionStates.get(objectType); if (entityState) { const { syncConfig, ydoc } = entityState; if (isNewUndoLevel && undoManager2) { undoManager2.stopCapturing?.(); } ydoc.transact(() => { log("updateCRDTDoc", "applying changes", entityId, { changedKeys: Object.keys(changes) }); syncConfig.applyChangesToCRDTDoc(ydoc, changes); if (isSave) { markEntityAsSaved(ydoc); } }, origin2); } if (collectionState && isSave) { collectionState.ydoc.transact(() => { markEntityAsSaved(collectionState.ydoc); }, origin2); } } async function _updateEntityRecord(objectType, objectId) { const entityId = getEntityId(objectType, objectId); const entityState = entityStates.get(entityId); if (!entityState) { log("updateEntityRecord", "no entity state", entityId); return; } const { handlers, syncConfig, ydoc } = entityState; const changes = syncConfig.getChangesFromCRDTDoc( ydoc, await handlers.getEditedRecord() ); const changedKeys = Object.keys(changes); if (0 === changedKeys.length) { return; } log("updateEntityRecord", "changes", entityId, { changedKeys }); handlers.editRecord(changes); } async function createPersistedCRDTDoc(objectType, objectId) { const entityId = getEntityId(objectType, objectId); const entityState = entityStates.get(entityId); if (!entityState?.ydoc) { return null; } await new Promise((resolve) => setTimeout(resolve, 0)); return serializeCrdtDoc(entityState.ydoc); } const internal = { applyPersistedCrdtDoc: debugWrap(_applyPersistedCrdtDoc), updateEntityRecord: debugWrap(_updateEntityRecord) }; return { createPersistedCRDTDoc: debugWrap(createPersistedCRDTDoc), getAwareness, load: debugWrap(loadEntity), loadCollection: debugWrap(loadCollection), // Use getter to ensure we always return the current value of `undoManager`. get undoManager() { return undoManager2; }, unload: debugWrap(unloadEntity), update: debugWrap(yieldToEventLoop(updateCRDTDoc)) }; } // packages/sync/node_modules/diff/libesm/diff/base.js var Diff = class { diff(oldStr, newStr, options = {}) { let callback; if (typeof options === "function") { callback = options; options = {}; } else if ("callback" in options) { callback = options.callback; } const oldString = this.castInput(oldStr, options); const newString = this.castInput(newStr, options); const oldTokens = this.removeEmpty(this.tokenize(oldString, options)); const newTokens = this.removeEmpty(this.tokenize(newString, options)); return this.diffWithOptionsObj(oldTokens, newTokens, options, callback); } diffWithOptionsObj(oldTokens, newTokens, options, callback) { var _a; const done = (value) => { value = this.postProcess(value, options); if (callback) { setTimeout(function() { callback(value); }, 0); return void 0; } else { return value; } }; const newLen = newTokens.length, oldLen = oldTokens.length; let editLength = 1; let maxEditLength = newLen + oldLen; if (options.maxEditLength != null) { maxEditLength = Math.min(maxEditLength, options.maxEditLength); } const maxExecutionTime = (_a = options.timeout) !== null && _a !== void 0 ? _a : Infinity; const abortAfterTimestamp = Date.now() + maxExecutionTime; const bestPath = [{ oldPos: -1, lastComponent: void 0 }]; let newPos = this.extractCommon(bestPath[0], newTokens, oldTokens, 0, options); if (bestPath[0].oldPos + 1 >= oldLen && newPos + 1 >= newLen) { return done(this.buildValues(bestPath[0].lastComponent, newTokens, oldTokens)); } let minDiagonalToConsider = -Infinity, maxDiagonalToConsider = Infinity; const execEditLength = () => { for (let diagonalPath = Math.max(minDiagonalToConsider, -editLength); diagonalPath <= Math.min(maxDiagonalToConsider, editLength); diagonalPath += 2) { let basePath; const removePath = bestPath[diagonalPath - 1], addPath = bestPath[diagonalPath + 1]; if (removePath) { bestPath[diagonalPath - 1] = void 0; } let canAdd = false; if (addPath) { const addPathNewPos = addPath.oldPos - diagonalPath; canAdd = addPath && 0 <= addPathNewPos && addPathNewPos < newLen; } const canRemove = removePath && removePath.oldPos + 1 < oldLen; if (!canAdd && !canRemove) { bestPath[diagonalPath] = void 0; continue; } if (!canRemove || canAdd && removePath.oldPos < addPath.oldPos) { basePath = this.addToPath(addPath, true, false, 0, options); } else { basePath = this.addToPath(removePath, false, true, 1, options); } newPos = this.extractCommon(basePath, newTokens, oldTokens, diagonalPath, options); if (basePath.oldPos + 1 >= oldLen && newPos + 1 >= newLen) { return done(this.buildValues(basePath.lastComponent, newTokens, oldTokens)) || true; } else { bestPath[diagonalPath] = basePath; if (basePath.oldPos + 1 >= oldLen) { maxDiagonalToConsider = Math.min(maxDiagonalToConsider, diagonalPath - 1); } if (newPos + 1 >= newLen) { minDiagonalToConsider = Math.max(minDiagonalToConsider, diagonalPath + 1); } } } editLength++; }; if (callback) { (function exec() { setTimeout(function() { if (editLength > maxEditLength || Date.now() > abortAfterTimestamp) { return callback(void 0); } if (!execEditLength()) { exec(); } }, 0); })(); } else { while (editLength <= maxEditLength && Date.now() <= abortAfterTimestamp) { const ret = execEditLength(); if (ret) { return ret; } } } } addToPath(path, added, removed, oldPosInc, options) { const last2 = path.lastComponent; if (last2 && !options.oneChangePerToken && last2.added === added && last2.removed === removed) { return { oldPos: path.oldPos + oldPosInc, lastComponent: { count: last2.count + 1, added, removed, previousComponent: last2.previousComponent } }; } else { return { oldPos: path.oldPos + oldPosInc, lastComponent: { count: 1, added, removed, previousComponent: last2 } }; } } extractCommon(basePath, newTokens, oldTokens, diagonalPath, options) { const newLen = newTokens.length, oldLen = oldTokens.length; let oldPos = basePath.oldPos, newPos = oldPos - diagonalPath, commonCount = 0; while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(oldTokens[oldPos + 1], newTokens[newPos + 1], options)) { newPos++; oldPos++; commonCount++; if (options.oneChangePerToken) { basePath.lastComponent = { count: 1, previousComponent: basePath.lastComponent, added: false, removed: false }; } } if (commonCount && !options.oneChangePerToken) { basePath.lastComponent = { count: commonCount, previousComponent: basePath.lastComponent, added: false, removed: false }; } basePath.oldPos = oldPos; return newPos; } equals(left, right, options) { if (options.comparator) { return options.comparator(left, right); } else { return left === right || !!options.ignoreCase && left.toLowerCase() === right.toLowerCase(); } } removeEmpty(array) { const ret = []; for (let i = 0; i < array.length; i++) { if (array[i]) { ret.push(array[i]); } } return ret; } // eslint-disable-next-line @typescript-eslint/no-unused-vars castInput(value, options) { return value; } // eslint-disable-next-line @typescript-eslint/no-unused-vars tokenize(value, options) { return Array.from(value); } join(chars) { return chars.join(""); } postProcess(changeObjects, options) { return changeObjects; } get useLongestToken() { return false; } buildValues(lastComponent, newTokens, oldTokens) { const components = []; let nextComponent; while (lastComponent) { components.push(lastComponent); nextComponent = lastComponent.previousComponent; delete lastComponent.previousComponent; lastComponent = nextComponent; } components.reverse(); const componentLen = components.length; let componentPos = 0, newPos = 0, oldPos = 0; for (; componentPos < componentLen; componentPos++) { const component = components[componentPos]; if (!component.removed) { if (!component.added && this.useLongestToken) { let value = newTokens.slice(newPos, newPos + component.count); value = value.map(function(value2, i) { const oldValue = oldTokens[oldPos + i]; return oldValue.length > value2.length ? oldValue : value2; }); component.value = this.join(value); } else { component.value = this.join(newTokens.slice(newPos, newPos + component.count)); } newPos += component.count; if (!component.added) { oldPos += component.count; } } else { component.value = this.join(oldTokens.slice(oldPos, oldPos + component.count)); oldPos += component.count; } } return components; } }; // packages/sync/node_modules/diff/libesm/diff/character.js var CharacterDiff = class extends Diff { }; var characterDiff = new CharacterDiff(); function diffChars(oldStr, newStr, options) { return characterDiff.diff(oldStr, newStr, options); } // packages/sync/node_modules/diff/libesm/diff/line.js var LineDiff = class extends Diff { constructor() { super(...arguments); this.tokenize = tokenize; } equals(left, right, options) { if (options.ignoreWhitespace) { if (!options.newlineIsToken || !left.includes("\n")) { left = left.trim(); } if (!options.newlineIsToken || !right.includes("\n")) { right = right.trim(); } } else if (options.ignoreNewlineAtEof && !options.newlineIsToken) { if (left.endsWith("\n")) { left = left.slice(0, -1); } if (right.endsWith("\n")) { right = right.slice(0, -1); } } return super.equals(left, right, options); } }; var lineDiff = new LineDiff(); function diffLines(oldStr, newStr, options) { return lineDiff.diff(oldStr, newStr, options); } function tokenize(value, options) { if (options.stripTrailingCr) { value = value.replace(/\r\n/g, "\n"); } const retLines = [], linesAndNewlines = value.split(/(\n|\r\n)/); if (!linesAndNewlines[linesAndNewlines.length - 1]) { linesAndNewlines.pop(); } for (let i = 0; i < linesAndNewlines.length; i++) { const line = linesAndNewlines[i]; if (i % 2 && !options.newlineIsToken) { retLines[retLines.length - 1] += line; } else { retLines.push(line); } } return retLines; } // packages/sync/build-module/quill-delta/Delta.mjs var import_es63 = __toESM(require_es6(), 1); // packages/sync/build-module/quill-delta/AttributeMap.mjs var import_es62 = __toESM(require_es6(), 1); function cloneDeep(value) { return JSON.parse(JSON.stringify(value)); } var AttributeMap; ((AttributeMap2) => { function compose3(a = {}, b = {}, keepNull = false) { if (typeof a !== "object") { a = {}; } if (typeof b !== "object") { b = {}; } let attributes = cloneDeep(b); if (!keepNull) { attributes = Object.keys(attributes).reduce( (copy2, key) => { if (attributes[key] !== null || attributes[key] !== void 0) { copy2[key] = attributes[key]; } return copy2; }, {} ); } for (const key in a) { if (a[key] !== void 0 && b[key] === void 0) { attributes[key] = a[key]; } } return Object.keys(attributes).length > 0 ? attributes : void 0; } AttributeMap2.compose = compose3; function diff(a = {}, b = {}) { if (typeof a !== "object") { a = {}; } if (typeof b !== "object") { b = {}; } const attributes = Object.keys(a).concat(Object.keys(b)).reduce((attrs, key) => { if (!(0, import_es62.default)(a[key], b[key])) { attrs[key] = b[key] === void 0 ? null : b[key]; } return attrs; }, {}); return Object.keys(attributes).length > 0 ? attributes : void 0; } AttributeMap2.diff = diff; function invert(attr = {}, base = {}) { attr = attr || {}; const baseInverted = Object.keys(base).reduce( (memo, key) => { if (base[key] !== attr[key] && attr[key] !== void 0) { memo[key] = base[key]; } return memo; }, {} ); return Object.keys(attr).reduce((memo, key) => { if (attr[key] !== base[key] && base[key] === void 0) { memo[key] = null; } return memo; }, baseInverted); } AttributeMap2.invert = invert; function transform(a, b, priority = false) { if (typeof a !== "object") { return b; } if (typeof b !== "object") { return void 0; } if (!priority) { return b; } const attributes = Object.keys(b).reduce( (attrs, key) => { if (a[key] === void 0) { attrs[key] = b[key]; } return attrs; }, {} ); return Object.keys(attributes).length > 0 ? attributes : void 0; } AttributeMap2.transform = transform; })(AttributeMap || (AttributeMap = {})); var AttributeMap_default = AttributeMap; // packages/sync/build-module/quill-delta/Op.mjs var Op; ((Op2) => { function length3(op) { if (typeof op.delete === "number") { return op.delete; } else if (typeof op.retain === "number") { return op.retain; } else if (typeof op.retain === "object" && op.retain !== null) { return 1; } return typeof op.insert === "string" ? op.insert.length : 1; } Op2.length = length3; })(Op || (Op = {})); var Op_default = Op; // packages/sync/build-module/quill-delta/OpIterator.mjs var Iterator2 = class { ops; index; offset; constructor(ops) { this.ops = ops; this.index = 0; this.offset = 0; } hasNext() { return this.peekLength() < Infinity; } next(length3) { if (!length3) { length3 = Infinity; } const nextOp = this.ops[this.index]; if (nextOp) { const offset = this.offset; const opLength = Op_default.length(nextOp); if (length3 >= opLength - offset) { length3 = opLength - offset; this.index += 1; this.offset = 0; } else { this.offset += length3; } if (typeof nextOp.delete === "number") { return { delete: length3 }; } const retOp = {}; if (nextOp.attributes) { retOp.attributes = nextOp.attributes; } if (typeof nextOp.retain === "number") { retOp.retain = length3; } else if (typeof nextOp.retain === "object" && nextOp.retain !== null) { retOp.retain = nextOp.retain; } else if (typeof nextOp.insert === "string") { retOp.insert = nextOp.insert.substr(offset, length3); } else { retOp.insert = nextOp.insert; } return retOp; } return { retain: Infinity }; } peek() { return this.ops[this.index]; } peekLength() { if (this.ops[this.index]) { return Op_default.length(this.ops[this.index]) - this.offset; } return Infinity; } peekType() { const op = this.ops[this.index]; if (op) { if (typeof op.delete === "number") { return "delete"; } else if (typeof op.retain === "number" || typeof op.retain === "object" && op.retain !== null) { return "retain"; } return "insert"; } return "retain"; } rest() { if (!this.hasNext()) { return []; } else if (this.offset === 0) { return this.ops.slice(this.index); } const offset = this.offset; const index = this.index; const next = this.next(); const rest = this.ops.slice(this.index); this.offset = offset; this.index = index; return [next].concat(rest); } }; // packages/sync/build-module/quill-delta/Delta.mjs function cloneDeep2(value) { return JSON.parse(JSON.stringify(value)); } var NULL_CHARACTER = String.fromCharCode(0); var STRING_TOO_LARGE_THRESHOLD = 1e4; function normalizeChangeCounts(changes) { return changes.map((change) => ({ ...change, count: change.value.length })); } var getEmbedTypeAndData = (a, b) => { if (typeof a !== "object" || a === null) { throw new Error(`cannot retain a ${typeof a}`); } if (typeof b !== "object" || b === null) { throw new Error(`cannot retain a ${typeof b}`); } const embedType = Object.keys(a)[0]; if (!embedType || embedType !== Object.keys(b)[0]) { throw new Error( `embed types not matched: ${embedType} != ${Object.keys(b)[0]}` ); } return [embedType, a[embedType], b[embedType]]; }; var Delta = class _Delta { static Op = Op_default; static OpIterator = Iterator2; static AttributeMap = AttributeMap_default; static handlers = {}; static registerEmbed(embedType, handler) { this.handlers[embedType] = handler; } static unregisterEmbed(embedType) { delete this.handlers[embedType]; } static getHandler(embedType) { const handler = this.handlers[embedType]; if (!handler) { throw new Error(`no handlers for embed type "${embedType}"`); } return handler; } ops; constructor(ops) { if (Array.isArray(ops)) { this.ops = ops; } else if (ops !== null && ops !== void 0 && Array.isArray(ops.ops)) { this.ops = ops.ops; } else { this.ops = []; } } insert(arg, attributes) { const newOp = {}; if (typeof arg === "string" && arg.length === 0) { return this; } newOp.insert = arg; if (attributes !== null && attributes !== void 0 && typeof attributes === "object" && Object.keys(attributes).length > 0) { newOp.attributes = attributes; } return this.push(newOp); } delete(length3) { if (length3 <= 0) { return this; } return this.push({ delete: length3 }); } retain(length3, attributes) { if (typeof length3 === "number" && length3 <= 0) { return this; } const newOp = { retain: length3 }; if (attributes !== null && attributes !== void 0 && typeof attributes === "object" && Object.keys(attributes).length > 0) { newOp.attributes = attributes; } return this.push(newOp); } push(newOp) { let index = this.ops.length; let lastOp = this.ops[index - 1]; newOp = cloneDeep2(newOp); if (typeof lastOp === "object") { if (typeof newOp.delete === "number" && typeof lastOp.delete === "number") { this.ops[index - 1] = { delete: lastOp.delete + newOp.delete }; return this; } if (typeof lastOp.delete === "number" && newOp.insert !== null && newOp.insert !== void 0) { index -= 1; lastOp = this.ops[index - 1]; if (typeof lastOp !== "object") { this.ops.unshift(newOp); return this; } } if ((0, import_es63.default)(newOp.attributes, lastOp.attributes)) { if (typeof newOp.insert === "string" && typeof lastOp.insert === "string") { this.ops[index - 1] = { insert: lastOp.insert + newOp.insert }; if (typeof newOp.attributes === "object") { this.ops[index - 1].attributes = newOp.attributes; } return this; } else if (typeof newOp.retain === "number" && typeof lastOp.retain === "number") { this.ops[index - 1] = { retain: lastOp.retain + newOp.retain }; if (typeof newOp.attributes === "object") { this.ops[index - 1].attributes = newOp.attributes; } return this; } } } if (index === this.ops.length) { this.ops.push(newOp); } else { this.ops.splice(index, 0, newOp); } return this; } chop() { const lastOp = this.ops[this.ops.length - 1]; if (lastOp && typeof lastOp.retain === "number" && !lastOp.attributes) { this.ops.pop(); } return this; } filter(predicate) { return this.ops.filter(predicate); } forEach(predicate) { this.ops.forEach(predicate); } map(predicate) { return this.ops.map(predicate); } partition(predicate) { const passed = []; const failed = []; this.forEach((op) => { const target = predicate(op) ? passed : failed; target.push(op); }); return [passed, failed]; } reduce(predicate, initialValue) { return this.ops.reduce(predicate, initialValue); } changeLength() { return this.reduce((length3, elem) => { if (elem.insert) { return length3 + Op_default.length(elem); } else if (elem.delete) { return length3 - elem.delete; } return length3; }, 0); } length() { return this.reduce((length3, elem) => { return length3 + Op_default.length(elem); }, 0); } slice(start = 0, end = Infinity) { const ops = []; const iter = new Iterator2(this.ops); let index = 0; while (index < end && iter.hasNext()) { let nextOp; if (index < start) { nextOp = iter.next(start - index); } else { nextOp = iter.next(end - index); ops.push(nextOp); } index += Op_default.length(nextOp); } return new _Delta(ops); } compose(other) { const thisIter = new Iterator2(this.ops); const otherIter = new Iterator2(other.ops); const ops = []; const firstOther = otherIter.peek(); if (firstOther !== null && firstOther !== void 0 && typeof firstOther.retain === "number" && (firstOther.attributes === null || firstOther.attributes === void 0)) { let firstLeft = firstOther.retain; while (thisIter.peekType() === "insert" && thisIter.peekLength() <= firstLeft) { firstLeft -= thisIter.peekLength(); ops.push(thisIter.next()); } if (firstOther.retain - firstLeft > 0) { otherIter.next(firstOther.retain - firstLeft); } } const delta = new _Delta(ops); while (thisIter.hasNext() || otherIter.hasNext()) { if (otherIter.peekType() === "insert") { delta.push(otherIter.next()); } else if (thisIter.peekType() === "delete") { delta.push(thisIter.next()); } else { const length3 = Math.min( thisIter.peekLength(), otherIter.peekLength() ); const thisOp = thisIter.next(length3); const otherOp = otherIter.next(length3); if (otherOp.retain) { const newOp = {}; if (typeof thisOp.retain === "number") { newOp.retain = typeof otherOp.retain === "number" ? length3 : otherOp.retain; } else if (typeof otherOp.retain === "number") { if (thisOp.retain === null || thisOp.retain === void 0) { newOp.insert = thisOp.insert; } else { newOp.retain = thisOp.retain; } } else { const action = thisOp.retain === null || thisOp.retain === void 0 ? "insert" : "retain"; const [embedType, thisData, otherData] = getEmbedTypeAndData( thisOp[action], otherOp.retain ); const handler = _Delta.getHandler(embedType); newOp[action] = { [embedType]: handler.compose( thisData, otherData, action === "retain" ) }; } const attributes = AttributeMap_default.compose( thisOp.attributes, otherOp.attributes, typeof thisOp.retain === "number" ); if (attributes) { newOp.attributes = attributes; } delta.push(newOp); if (!otherIter.hasNext() && (0, import_es63.default)(delta.ops[delta.ops.length - 1], newOp)) { const rest = new _Delta(thisIter.rest()); return delta.concat(rest).chop(); } } else if (typeof otherOp.delete === "number" && (typeof thisOp.retain === "number" || typeof thisOp.retain === "object" && thisOp.retain !== null)) { delta.push(otherOp); } } } return delta.chop(); } concat(other) { const delta = new _Delta(this.ops.slice()); if (other.ops.length > 0) { delta.push(other.ops[0]); delta.ops = delta.ops.concat(other.ops.slice(1)); } return delta; } diff(other) { if (this.ops === other.ops) { return new _Delta(); } const strings = this.deltasToStrings(other); const diffResult = normalizeChangeCounts( diffChars(strings[0], strings[1]) ); const thisIter = new Iterator2(this.ops); const otherIter = new Iterator2(other.ops); const retDelta = this.convertChangesToDelta( diffResult, thisIter, otherIter ); return retDelta.chop(); } eachLine(predicate, newline = "\n") { const iter = new Iterator2(this.ops); let line = new _Delta(); let i = 0; while (iter.hasNext()) { if (iter.peekType() !== "insert") { return; } const thisOp = iter.peek(); const start = Op_default.length(thisOp) - iter.peekLength(); const index = typeof thisOp.insert === "string" ? thisOp.insert.indexOf(newline, start) - start : -1; if (index < 0) { line.push(iter.next()); } else if (index > 0) { line.push(iter.next(index)); } else { if (predicate(line, iter.next(1).attributes || {}, i) === false) { return; } i += 1; line = new _Delta(); } } if (line.length() > 0) { predicate(line, {}, i); } } invert(base) { const inverted = new _Delta(); this.reduce((baseIndex, op) => { if (op.insert) { inverted.delete(Op_default.length(op)); } else if (typeof op.retain === "number" && (op.attributes === null || op.attributes === void 0)) { inverted.retain(op.retain); return baseIndex + op.retain; } else if (op.delete || typeof op.retain === "number") { const length3 = op.delete || op.retain; const slice = base.slice(baseIndex, baseIndex + length3); slice.forEach((baseOp) => { if (op.delete) { inverted.push(baseOp); } else if (op.retain && op.attributes) { inverted.retain( Op_default.length(baseOp), AttributeMap_default.invert( op.attributes, baseOp.attributes ) ); } }); return baseIndex + length3; } else if (typeof op.retain === "object" && op.retain !== null) { const slice = base.slice(baseIndex, baseIndex + 1); const baseOp = new Iterator2(slice.ops).next(); const [embedType, opData, baseOpData] = getEmbedTypeAndData( op.retain, baseOp.insert ); const handler = _Delta.getHandler(embedType); inverted.retain( { [embedType]: handler.invert(opData, baseOpData) }, AttributeMap_default.invert(op.attributes, baseOp.attributes) ); return baseIndex + 1; } return baseIndex; }, 0); return inverted.chop(); } transform(arg, priority = false) { priority = !!priority; if (typeof arg === "number") { return this.transformPosition(arg, priority); } const other = arg; const thisIter = new Iterator2(this.ops); const otherIter = new Iterator2(other.ops); const delta = new _Delta(); while (thisIter.hasNext() || otherIter.hasNext()) { if (thisIter.peekType() === "insert" && (priority || otherIter.peekType() !== "insert")) { delta.retain(Op_default.length(thisIter.next())); } else if (otherIter.peekType() === "insert") { delta.push(otherIter.next()); } else { const length3 = Math.min( thisIter.peekLength(), otherIter.peekLength() ); const thisOp = thisIter.next(length3); const otherOp = otherIter.next(length3); if (thisOp.delete) { continue; } else if (otherOp.delete) { delta.push(otherOp); } else { const thisData = thisOp.retain; const otherData = otherOp.retain; let transformedData = typeof otherData === "object" && otherData !== null ? otherData : length3; if (typeof thisData === "object" && thisData !== null && typeof otherData === "object" && otherData !== null) { const embedType = Object.keys(thisData)[0]; if (embedType === Object.keys(otherData)[0]) { const handler = _Delta.getHandler(embedType); if (handler) { transformedData = { [embedType]: handler.transform( thisData[embedType], otherData[embedType], priority ) }; } } } delta.retain( transformedData, AttributeMap_default.transform( thisOp.attributes, otherOp.attributes, priority ) ); } } } return delta.chop(); } transformPosition(index, priority = false) { priority = !!priority; const thisIter = new Iterator2(this.ops); let offset = 0; while (thisIter.hasNext() && offset <= index) { const length3 = thisIter.peekLength(); const nextType = thisIter.peekType(); thisIter.next(); if (nextType === "delete") { index -= Math.min(length3, index - offset); continue; } else if (nextType === "insert" && (offset < index || !priority)) { index += length3; } offset += length3; } return index; } /** * Given a Delta and a cursor position, do a diff and attempt to adjust * the diff to place insertions or deletions at the cursor position. * * @param other - The other Delta to diff against. * @param cursorAfterChange - The cursor position index after the change. * @return A Delta that attempts to place insertions or deletions at the cursor position. */ diffWithCursor(other, cursorAfterChange) { if (this.ops === other.ops) { return new _Delta(); } const strings = this.deltasToStrings(other); const maxStringLength = Math.max( ...strings.map((str) => str.length) ); if (maxStringLength > STRING_TOO_LARGE_THRESHOLD) { const diffResult = normalizeChangeCounts( diffLines(strings[0], strings[1]) ); const thisIterLarge = new Iterator2(this.ops); const otherIterLarge = new Iterator2(other.ops); return this.convertChangesToDelta( diffResult, thisIterLarge, otherIterLarge ).chop(); } else if (cursorAfterChange === null) { return this.diff(other); } let diffs = normalizeChangeCounts( diffChars(strings[0], strings[1]) ); let lastDiffPosition = 0; const adjustedDiffs = []; for (let i = 0; i < diffs.length; i++) { const diff = diffs[i]; const segmentStart = lastDiffPosition; const segmentEnd = lastDiffPosition + (diff.count ?? 0); const isCursorInSegment = cursorAfterChange > segmentStart && cursorAfterChange <= segmentEnd; const isUnchangedSegment = !diff.added && !diff.removed; const isRemovalSegment = diff.removed && !diff.added; const nextDiff = diffs[i + 1]; const isNextDiffAnInsert = nextDiff && nextDiff.added && !nextDiff.removed; if (isUnchangedSegment && isCursorInSegment && isNextDiffAnInsert) { const movedSegments = this.tryMoveInsertionToCursor( diff, nextDiff, cursorAfterChange, segmentStart ); if (movedSegments) { adjustedDiffs.push(...movedSegments); i++; lastDiffPosition = segmentEnd; continue; } } if (isRemovalSegment) { const movedSegments = this.tryMoveDeletionToCursor( diff, adjustedDiffs, cursorAfterChange, lastDiffPosition ); if (movedSegments) { adjustedDiffs.pop(); adjustedDiffs.push(...movedSegments); lastDiffPosition += diff.count ?? 0; continue; } } adjustedDiffs.push(diff); if (!diff.added) { lastDiffPosition += diff.count ?? 0; } } diffs = adjustedDiffs; const thisIter = new Iterator2(this.ops); const otherIter = new Iterator2(other.ops); const retDelta = this.convertChangesToDelta( diffs, thisIter, otherIter ); return retDelta.chop(); } /** * Try to move an insertion operation from after an unchanged segment to the cursor position within it. * This is a "look-ahead" strategy. * * @param diff - The current unchanged diff segment. * @param nextDiff - The next diff segment (expected to be an insertion). * @param cursorAfterChange - The cursor position after the change. * @param segmentStart - The start position of the current segment. * @return An array of adjusted diff segments if the insertion was successfully moved, null otherwise. */ tryMoveInsertionToCursor(diff, nextDiff, cursorAfterChange, segmentStart) { const nextDiffInsert = nextDiff.value; const insertLength = nextDiffInsert.length; const insertOffset = cursorAfterChange - segmentStart - insertLength; const textAtCursor = diff.value.substring( insertOffset, insertOffset + nextDiffInsert.length ); const isInsertMoveable = textAtCursor === nextDiffInsert; if (!isInsertMoveable) { return null; } const beforeCursor = diff.value.substring(0, insertOffset); const afterCursor = diff.value.substring(insertOffset); const result = []; if (beforeCursor.length > 0) { result.push({ value: beforeCursor, count: beforeCursor.length, added: false, removed: false }); } result.push(nextDiff); if (afterCursor.length > 0) { result.push({ value: afterCursor, count: afterCursor.length, added: false, removed: false }); } return result; } /** * Try to move a deletion operation to the cursor position by looking back at the previous unchanged segment. * This is a "look-back" strategy. * * @param diff - The current deletion diff segment. * @param adjustedDiffs - The array of previously processed diff segments. * @param cursorAfterChange - The cursor position after the change. * @param lastDiffPosition - The position in the document up to (but not including) the current diff. * @return An array of adjusted diff segments if the deletion was successfully moved, null otherwise. */ tryMoveDeletionToCursor(diff, adjustedDiffs, cursorAfterChange, lastDiffPosition) { const prevDiff = adjustedDiffs[adjustedDiffs.length - 1]; if (!prevDiff || prevDiff.added || prevDiff.removed) { return null; } const prevSegmentStart = lastDiffPosition - (prevDiff.count ?? 0); const prevSegmentEnd = lastDiffPosition; if (cursorAfterChange < prevSegmentStart || cursorAfterChange >= prevSegmentEnd) { return null; } const deletedChars = diff.value; const deleteOffset = cursorAfterChange - prevSegmentStart; const textAtCursor = prevDiff.value.substring( deleteOffset, deleteOffset + deletedChars.length ); const canBePlacedHere = textAtCursor === deletedChars; if (!canBePlacedHere) { return null; } const beforeCursor = prevDiff.value.substring(0, deleteOffset); const atAndAfterCursor = prevDiff.value.substring(deleteOffset); const deletionLength = diff.count ?? 0; const afterDeletion = atAndAfterCursor.substring(deletionLength); const result = []; if (beforeCursor.length > 0) { result.push({ value: beforeCursor, count: beforeCursor.length, added: false, removed: false }); } result.push(diff); if (afterDeletion.length > 0) { result.push({ value: afterDeletion, count: afterDeletion.length, added: false, removed: false }); } return result; } /** * Convert two Deltas to string representations for diffing. * * @param other - The other Delta to convert. * @return A tuple of [thisString, otherString]. */ deltasToStrings(other) { return [this, other].map((delta) => { return delta.map((op) => { if (op.insert !== null || op.insert !== void 0) { return typeof op.insert === "string" ? op.insert : NULL_CHARACTER; } const prep = delta === other ? "on" : "with"; throw new Error( "diff() called " + prep + " non-document" ); }).join(""); }); } /** * Process diff changes and convert them to Delta operations. * * @param changes - The array of changes from the diff algorithm. * @param thisIter - Iterator for this Delta's operations. * @param otherIter - Iterator for the other Delta's operations. * @return A Delta containing the processed diff operations. */ convertChangesToDelta(changes, thisIter, otherIter) { const retDelta = new _Delta(); changes.forEach((component) => { let length3 = component.count ?? 0; while (length3 > 0) { let opLength = 0; if (component.added) { opLength = Math.min(otherIter.peekLength(), length3); retDelta.push(otherIter.next(opLength)); } else if (component.removed) { opLength = Math.min(length3, thisIter.peekLength()); thisIter.next(opLength); retDelta.delete(opLength); } else { opLength = Math.min( thisIter.peekLength(), otherIter.peekLength(), length3 ); const thisOp = thisIter.next(opLength); const otherOp = otherIter.next(opLength); if ((0, import_es63.default)(thisOp.insert, otherOp.insert)) { retDelta.retain( opLength, AttributeMap_default.diff( thisOp.attributes, otherOp.attributes ) ); } else { retDelta.push(otherOp).delete(opLength); } } length3 -= opLength; } }); return retDelta; } }; var Delta_default = Delta; // packages/sync/build-module/private-apis.mjs var privateApis = {}; lock(privateApis, { ConnectionErrorCode, createSyncManager, Delta: Delta_default, CRDT_DOC_META_PERSISTENCE_KEY, CRDT_RECORD_MAP_KEY, LOCAL_EDITOR_ORIGIN, LOCAL_UNDO_IGNORED_ORIGIN, retrySyncConnection: () => pollingManager.retryNow() }); // packages/core-data/build-module/awareness/post-editor-awareness.mjs var import_block_editor3 = __toESM(require_block_editor(), 1); // packages/core-data/build-module/awareness/base-awareness.mjs var import_data2 = __toESM(require_data(), 1); // packages/core-data/build-module/awareness/config.mjs var AWARENESS_CURSOR_UPDATE_THROTTLE_IN_MS = 100; var LOCAL_CURSOR_UPDATE_DEBOUNCE_IN_MS = 5; var REMOVAL_DELAY_IN_MS = 5e3; // packages/core-data/build-module/awareness/utils.mjs function getBrowserName() { const userAgent = window.navigator.userAgent; let browserName = "Unknown"; if (userAgent.includes("Firefox")) { browserName = "Firefox"; } else if (userAgent.includes("Edg")) { browserName = "Microsoft Edge"; } else if (userAgent.includes("Chrome") && !userAgent.includes("Edg")) { browserName = "Chrome"; } else if (userAgent.includes("Safari") && !userAgent.includes("Chrome")) { browserName = "Safari"; } else if (userAgent.includes("MSIE") || userAgent.includes("Trident")) { browserName = "Internet Explorer"; } else if (userAgent.includes("Opera") || userAgent.includes("OPR")) { browserName = "Opera"; } return browserName; } function areMapsEqual(map1, map2, comparatorFn) { if (map1.size !== map2.size) { return false; } for (const [key, value1] of map1.entries()) { if (!map2.has(key)) { return false; } if (!comparatorFn(value1, map2.get(key))) { return false; } } return true; } function areCollaboratorInfosEqual(collaboratorInfo1, collaboratorInfo2) { if (!collaboratorInfo1 || !collaboratorInfo2) { return collaboratorInfo1 === collaboratorInfo2; } if (Object.keys(collaboratorInfo1).length !== Object.keys(collaboratorInfo2).length) { return false; } return Object.entries(collaboratorInfo1).every(([key, value]) => { return value === collaboratorInfo2[key]; }); } function generateCollaboratorInfo(currentCollaborator) { const { avatar_urls, id: id2, name, slug } = currentCollaborator; return { avatar_urls, // eslint-disable-line camelcase browserType: getBrowserName(), enteredAt: Date.now(), id: id2, name, slug }; } function getRecordValue(obj, key) { if ("object" === typeof obj && null !== obj && key in obj) { return obj[key]; } return null; } function getTypedKeys(obj) { return Object.keys(obj); } // packages/core-data/build-module/awareness/typed-awareness.mjs var TypedAwareness = class extends Awareness { /** * Get the states from an awareness document. */ getStates() { return super.getStates(); } /** * Get a local state field from an awareness document. * @param field */ getLocalStateField(field) { const state = this.getLocalState(); return getRecordValue(state, field); } /** * Set a local state field on an awareness document. * @param field * @param value */ setLocalStateField(field, value) { super.setLocalStateField(field, value); } }; // packages/core-data/build-module/awareness/awareness-state.mjs var AwarenessWithEqualityChecks = class extends TypedAwareness { /** OVERRIDDEN METHODS */ /** * Set a local state field on an awareness document. Calling this method may * trigger rerenders of any subscribed components. * * Equality checks are provided by the abstract `equalityFieldChecks` property. * @param field - The field to set. * @param value - The value to set. */ setLocalStateField(field, value) { if (this.isFieldEqual( field, value, this.getLocalStateField(field) ?? void 0 )) { return; } super.setLocalStateField(field, value); } /** CUSTOM METHODS */ /** * Determine if a field value has changed using the provided equality checks. * @param field - The field to check. * @param value1 - The first value to compare. * @param value2 - The second value to compare. */ isFieldEqual(field, value1, value2) { if (["clientId", "isConnected", "isMe"].includes(field)) { return value1 === value2; } if (field in this.equalityFieldChecks) { const fn = this.equalityFieldChecks[field]; return fn(value1, value2); } throw new Error( `No equality check implemented for awareness state field "${field.toString()}".` ); } /** * Determine if two states are equal by comparing each field using the * provided equality checks. * @param state1 - The first state to compare. * @param state2 - The second state to compare. */ isStateEqual(state1, state2) { return [ .../* @__PURE__ */ new Set([ ...getTypedKeys(state1), ...getTypedKeys(state2) ]) ].every((field) => { const value1 = state1[field]; const value2 = state2[field]; return this.isFieldEqual(field, value1, value2); }); } }; var AwarenessState = class extends AwarenessWithEqualityChecks { /** CUSTOM PROPERTIES */ /** * Whether the setUp method has been called, to avoid running it multiple * times. */ hasSetupRun = false; /** * We keep track of all seen states during the current session for two reasons: * * 1. So that we can represent recently disconnected collaborators in our UI, even * after they have been removed from the awareness document. * 2. So that we can provide debug information about all collaborators seen during * the session. */ disconnectedCollaborators = /* @__PURE__ */ new Set(); seenStates = /* @__PURE__ */ new Map(); /** * Hold a snapshot of the previous awareness state allows us to compare the * state values and avoid unnecessary updates to subscribers. */ previousSnapshot = /* @__PURE__ */ new Map(); stateSubscriptions = []; /** * In some cases, we may want to throttle setting local state fields to avoid * overwhelming the awareness document with rapid updates. At the same time, we * want to ensure that when we read our own state locally, we get the latest * value -- even if it hasn't yet been set on the awareness instance. */ myThrottledState = {}; throttleTimeouts = /* @__PURE__ */ new Map(); /** CUSTOM METHODS */ /** * Set up the awareness state. This method is idempotent and will only run * once. Subclasses should override `onSetUp()` instead of this method to * add their own setup logic. * * This is defined as a readonly arrow function property to prevent * subclasses from overriding it. */ setUp = () => { if (this.hasSetupRun) { return; } this.hasSetupRun = true; this.onSetUp(); this.on( "change", ({ added, removed, updated }) => { [...added, ...updated].forEach((id2) => { this.disconnectedCollaborators.delete(id2); }); removed.forEach((id2) => { this.disconnectedCollaborators.add(id2); setTimeout(() => { this.disconnectedCollaborators.delete(id2); this.updateSubscribers( true /* force update */ ); }, REMOVAL_DELAY_IN_MS); }); this.updateSubscribers(); } ); }; /** * Get the most recent state from the last processed change event. * * @return An array of EnhancedState< State >. */ getCurrentState() { return Array.from(this.previousSnapshot.values()); } /** * Get all seen states in this session to enable debug reporting. */ getSeenStates() { return this.seenStates; } /** * Allow external code to subscribe to awareness state changes. * @param callback - The callback to subscribe to. */ onStateChange(callback) { this.stateSubscriptions.push(callback); return () => { this.stateSubscriptions = this.stateSubscriptions.filter( (cb) => cb !== callback ); }; } /** * Set a local state field on an awareness document with throttle. See caveats * of this.setLocalStateField. * @param field - The field to set. * @param value - The value to set. * @param wait - The wait time in milliseconds. */ setThrottledLocalStateField(field, value, wait) { this.setLocalStateField(field, value); this.throttleTimeouts.set( field, setTimeout(() => { this.throttleTimeouts.delete(field); if (this.myThrottledState[field]) { this.setLocalStateField( field, this.myThrottledState[field] ); delete this.myThrottledState[field]; } }, wait) ); } /** * Set the current collaborator's connection status as awareness state. * @param isConnected - The connection status. */ setConnectionStatus(isConnected) { if (isConnected) { this.disconnectedCollaborators.delete(this.clientID); } else { this.disconnectedCollaborators.add(this.clientID); } this.updateSubscribers( true /* force update */ ); } /** * Update all subscribed listeners with the latest awareness state. * @param forceUpdate - Whether to force an update. */ updateSubscribers(forceUpdate = false) { if (!this.stateSubscriptions.length) { return; } const states = this.getStates(); this.seenStates = new Map([ ...this.seenStates.entries(), ...states.entries() ]); const updatedStates = new Map( [...this.disconnectedCollaborators, ...states.keys()].filter((clientId) => { return Object.keys(this.seenStates.get(clientId) ?? {}).length > 0; }).map((clientId) => { const rawState = this.seenStates.get(clientId); const isConnected = !this.disconnectedCollaborators.has(clientId); const isMe = clientId === this.clientID; const myState = isMe ? this.myThrottledState : {}; const state = { ...rawState, ...myState, clientId, isConnected, isMe }; return [clientId, state]; }) ); if (!forceUpdate) { if (areMapsEqual( this.previousSnapshot, updatedStates, this.isStateEqual.bind(this) )) { return; } } this.previousSnapshot = updatedStates; this.stateSubscriptions.forEach((callback) => { callback(Array.from(updatedStates.values())); }); } }; // packages/core-data/build-module/name.mjs var STORE_NAME = "core"; // packages/core-data/build-module/awareness/base-awareness.mjs var BaseAwarenessState = class extends AwarenessState { onSetUp() { void this.setCurrentCollaboratorInfo(); } /** * Set the current collaborator info in the local state. */ async setCurrentCollaboratorInfo() { const currentUser2 = await (0, import_data2.resolveSelect)(STORE_NAME).getCurrentUser(); const collaboratorInfo = generateCollaboratorInfo(currentUser2); this.setLocalStateField("collaboratorInfo", collaboratorInfo); } }; var baseEqualityFieldChecks = { collaboratorInfo: areCollaboratorInfosEqual }; var BaseAwareness = class extends BaseAwarenessState { equalityFieldChecks = baseEqualityFieldChecks; }; // packages/core-data/build-module/awareness/block-lookup.mjs var import_data3 = __toESM(require_data(), 1); var import_block_editor = __toESM(require_block_editor(), 1); function getBlockPathInYdoc(yType) { const path = []; let current = yType; while (current) { const parentArray = current.parent; if (!parentArray || !(parentArray instanceof yjs_exports.Array)) { return null; } let index = -1; for (let i = 0; i < parentArray.length; i++) { if (parentArray.get(i) === current) { index = i; break; } } if (index === -1) { return null; } path.unshift(index); const grandparent = parentArray.parent; if (grandparent instanceof yjs_exports.Map && grandparent.get("clientId") !== void 0) { current = grandparent; } else { break; } } return path; } function resolveBlockClientIdByPath(path) { if (path.length === 0) { return null; } const { getBlocks } = (0, import_data3.select)(import_block_editor.store); const postContentBlocks = getPostContentBlocks(getBlocks(), getBlocks); let blocks = postContentBlocks; for (let i = 0; i < path.length; i++) { const block = blocks[path[i]]; if (!block) { return null; } if (i === path.length - 1) { return block.clientId; } blocks = block.innerBlocks; } return null; } function getPostContentBlocks(rootBlocks, getBlocks) { const postContentBlock = findBlockByName(rootBlocks, "core/post-content"); if (postContentBlock) { return getBlocks(postContentBlock.clientId); } return rootBlocks; } function findBlockByName(blocks, name) { for (const block of blocks) { if (block.name === name) { return block; } if (block.innerBlocks?.length) { const found = findBlockByName(block.innerBlocks, name); if (found) { return found; } } } return null; } // packages/core-data/build-module/utils/crdt-utils.mjs var import_rich_text = __toESM(require_rich_text(), 1); // packages/core-data/build-module/lock-unlock.mjs var import_private_apis3 = __toESM(require_private_apis(), 1); var { lock: lock2, unlock: unlock2 } = (0, import_private_apis3.__dangerousOptInToUnstableAPIsOnlyForCoreModules)( "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.", "@wordpress/core-data" ); // packages/core-data/build-module/sync.mjs var { ConnectionErrorCode: ConnectionErrorCode2, createSyncManager: createSyncManager2, Delta: Delta2, CRDT_DOC_META_PERSISTENCE_KEY: CRDT_DOC_META_PERSISTENCE_KEY2, CRDT_RECORD_MAP_KEY: CRDT_RECORD_MAP_KEY2, LOCAL_EDITOR_ORIGIN: LOCAL_EDITOR_ORIGIN2, LOCAL_UNDO_IGNORED_ORIGIN: LOCAL_UNDO_IGNORED_ORIGIN2, retrySyncConnection } = unlock2(privateApis); var syncManager; function getSyncManager() { if (syncManager) { return syncManager; } syncManager = createSyncManager2(); return syncManager; } // packages/core-data/build-module/utils/crdt-utils.mjs function getRootMap(doc2, key) { return doc2.getMap(key); } function createYMap(partial = {}) { return new yjs_exports.Map(Object.entries(partial)); } function isYMap(value) { return value instanceof yjs_exports.Map; } function findBlockByClientIdInDoc(blockId, ydoc) { const ymap = getRootMap(ydoc, CRDT_RECORD_MAP_KEY2); const blocks = ymap.get("blocks"); if (!(blocks instanceof yjs_exports.Array)) { return null; } return findBlockByClientIdInBlocks(blockId, blocks); } var MARKER_START = 57344; function pickMarker(text2) { const tryCount = 16; for (let code = MARKER_START; code < MARKER_START + tryCount; code++) { const candidate = String.fromCharCode(code); if (!text2.includes(candidate)) { return candidate; } } return null; } function htmlIndexToRichTextOffset(html, htmlIndex) { if (!html.includes("<") && !html.includes("&")) { return htmlIndex; } const marker = pickMarker(html); if (!marker) { return htmlIndex; } const withMarker = html.slice(0, htmlIndex) + marker + html.slice(htmlIndex); const value = (0, import_rich_text.create)({ html: withMarker }); const markerPos = value.text.indexOf(marker); return markerPos === -1 ? htmlIndex : markerPos; } function richTextOffsetToHtmlIndex(html, richTextOffset) { if (!html.includes("<") && !html.includes("&")) { return richTextOffset; } const marker = pickMarker(html); if (!marker) { return richTextOffset; } const value = (0, import_rich_text.create)({ html }); const markerValue = (0, import_rich_text.create)({ text: marker }); if (value.formats[richTextOffset]) { markerValue.formats[0] = value.formats[richTextOffset]; } const withMarker = (0, import_rich_text.insert)( value, markerValue, richTextOffset, richTextOffset ); const htmlWithMarker = (0, import_rich_text.toHTMLString)({ value: withMarker }); const markerIndex = htmlWithMarker.indexOf(marker); return markerIndex === -1 ? richTextOffset : markerIndex; } function findBlockByClientIdInBlocks(blockId, blocks) { for (const block of blocks) { if (block.get("clientId") === blockId) { return block; } const innerBlocks = block.get("innerBlocks"); if (innerBlocks && innerBlocks.length > 0) { const innerBlock = findBlockByClientIdInBlocks( blockId, innerBlocks ); if (innerBlock) { return innerBlock; } } } return null; } // packages/core-data/build-module/utils/crdt-user-selections.mjs var import_data4 = __toESM(require_data(), 1); var import_block_editor2 = __toESM(require_block_editor(), 1); var SelectionType = /* @__PURE__ */ ((SelectionType2) => { SelectionType2["None"] = "none"; SelectionType2["Cursor"] = "cursor"; SelectionType2["SelectionInOneBlock"] = "selection-in-one-block"; SelectionType2["SelectionInMultipleBlocks"] = "selection-in-multiple-blocks"; SelectionType2["WholeBlock"] = "whole-block"; return SelectionType2; })(SelectionType || {}); var SelectionDirection = /* @__PURE__ */ ((SelectionDirection2) => { SelectionDirection2["Forward"] = "f"; SelectionDirection2["Backward"] = "b"; return SelectionDirection2; })(SelectionDirection || {}); function getSelectionState(selectionStart, selectionEnd, yDoc, options) { const { selectionDirection } = options ?? {}; const ymap = getRootMap(yDoc, CRDT_RECORD_MAP_KEY2); const yBlocks = ymap.get("blocks"); const isSelectionEmpty = Object.keys(selectionStart).length === 0; const noSelection = { type: "none" /* None */ }; if (isSelectionEmpty || !yBlocks) { return noSelection; } const isSelectionInOneBlock = selectionStart.clientId === selectionEnd.clientId; const isCursorOnly = isSelectionInOneBlock && selectionStart.offset === selectionEnd.offset; const isSelectionAWholeBlock = isSelectionInOneBlock && selectionStart.offset === void 0 && selectionEnd.offset === void 0; if (isSelectionAWholeBlock) { const path = getBlockPathForLocalClientId(selectionStart.clientId); const blockPosition = path ? createRelativePositionForBlockPath(path, yBlocks) : null; if (!blockPosition) { return noSelection; } return { type: "whole-block", blockPosition }; } else if (isCursorOnly) { const cursorPosition = getCursorPosition(selectionStart, yBlocks); if (!cursorPosition) { return noSelection; } return { type: "cursor", cursorPosition }; } else if (isSelectionInOneBlock) { const cursorStartPosition2 = getCursorPosition( selectionStart, yBlocks ); const cursorEndPosition2 = getCursorPosition(selectionEnd, yBlocks); if (!cursorStartPosition2 || !cursorEndPosition2) { return noSelection; } return { type: "selection-in-one-block", cursorStartPosition: cursorStartPosition2, cursorEndPosition: cursorEndPosition2, selectionDirection }; } const cursorStartPosition = getCursorPosition(selectionStart, yBlocks); const cursorEndPosition = getCursorPosition(selectionEnd, yBlocks); if (!cursorStartPosition || !cursorEndPosition) { return noSelection; } return { type: "selection-in-multiple-blocks", cursorStartPosition, cursorEndPosition, selectionDirection }; } function getCursorPosition(selection, blocks) { const path = getBlockPathForLocalClientId(selection.clientId); const block = path ? findBlockByPath(path, blocks) : null; if (!block || !selection.attributeKey || void 0 === selection.offset) { return null; } const attributes = block.get("attributes"); const currentYText = attributes?.get(selection.attributeKey); if (!(currentYText instanceof yjs_exports.Text)) { return null; } const relativePosition = yjs_exports.createRelativePositionFromTypeIndex( currentYText, richTextOffsetToHtmlIndex(currentYText.toString(), selection.offset) ); return { relativePosition, absoluteOffset: selection.offset }; } function getBlockPathForLocalClientId(clientId) { const { getBlockIndex, getBlockRootClientId, getBlockName } = (0, import_data4.select)(import_block_editor2.store); const path = []; let current = clientId; while (current) { const index = getBlockIndex(current); if (index === -1) { return null; } path.unshift(index); const parent = getBlockRootClientId(current); if (!parent) { break; } const parentName = getBlockName(parent); if (parentName === "core/post-content") { break; } current = parent; } return path.length > 0 ? path : null; } function findBlockByPath(path, blocks) { let currentBlocks = blocks; for (let i = 0; i < path.length; i++) { if (path[i] >= currentBlocks.length) { return null; } const block = currentBlocks.get(path[i]); if (!block) { return null; } if (i === path.length - 1) { return block; } currentBlocks = block.get("innerBlocks") ?? new yjs_exports.Array(); } return null; } function createRelativePositionForBlockPath(path, blocks) { let currentBlocks = blocks; for (let i = 0; i < path.length; i++) { if (path[i] >= currentBlocks.length) { return null; } if (i === path.length - 1) { return yjs_exports.createRelativePositionFromTypeIndex( currentBlocks, path[i] ); } const block = currentBlocks.get(path[i]); currentBlocks = block?.get("innerBlocks") ?? new yjs_exports.Array(); } return null; } function areSelectionsStatesEqual(selection1, selection2) { if (selection1.type !== selection2.type) { return false; } switch (selection1.type) { case "none": return true; case "cursor": return areCursorPositionsEqual( selection1.cursorPosition, selection2.cursorPosition ); case "selection-in-one-block": return areCursorPositionsEqual( selection1.cursorStartPosition, selection2.cursorStartPosition ) && areCursorPositionsEqual( selection1.cursorEndPosition, selection2.cursorEndPosition ) && selection1.selectionDirection === selection2.selectionDirection; case "selection-in-multiple-blocks": return areCursorPositionsEqual( selection1.cursorStartPosition, selection2.cursorStartPosition ) && areCursorPositionsEqual( selection1.cursorEndPosition, selection2.cursorEndPosition ) && selection1.selectionDirection === selection2.selectionDirection; case "whole-block": return yjs_exports.compareRelativePositions( selection1.blockPosition, selection2.blockPosition ); default: return false; } } function areCursorPositionsEqual(cursorPosition1, cursorPosition2) { const isRelativePositionEqual = yjs_exports.compareRelativePositions( cursorPosition1.relativePosition, cursorPosition2.relativePosition ); const isAbsoluteOffsetEqual = cursorPosition1.absoluteOffset === cursorPosition2.absoluteOffset; return isRelativePositionEqual && isAbsoluteOffsetEqual; } // packages/core-data/build-module/awareness/post-editor-awareness.mjs var PostEditorAwareness = class extends BaseAwarenessState { constructor(doc2, kind, name, postId) { super(doc2); this.kind = kind; this.name = name; this.postId = postId; } equalityFieldChecks = { ...baseEqualityFieldChecks, editorState: this.areEditorStatesEqual }; onSetUp() { super.onSetUp(); this.subscribeToCollaboratorSelectionChanges(); } /** * Subscribe to collaborator selection changes and update the selection state. */ subscribeToCollaboratorSelectionChanges() { const { getSelectionStart, getSelectionEnd, getSelectedBlocksInitialCaretPosition } = (0, import_data5.select)(import_block_editor3.store); let selectionStart = getSelectionStart(); let selectionEnd = getSelectionEnd(); let localCursorTimeout = null; let selectionBeforeDebounce = null; (0, import_data5.subscribe)(() => { const newSelectionStart = getSelectionStart(); const newSelectionEnd = getSelectionEnd(); if (newSelectionStart === selectionStart && newSelectionEnd === selectionEnd) { return; } if (!selectionBeforeDebounce) { selectionBeforeDebounce = { start: selectionStart, end: selectionEnd }; } selectionStart = newSelectionStart; selectionEnd = newSelectionEnd; const initialPosition = getSelectedBlocksInitialCaretPosition(); void this.updateSelectionInEntityRecord( selectionStart, selectionEnd, initialPosition ); if (localCursorTimeout) { clearTimeout(localCursorTimeout); } localCursorTimeout = setTimeout(() => { const selectionStateOptions = {}; if (selectionBeforeDebounce) { selectionStateOptions.selectionDirection = detectSelectionDirection( selectionBeforeDebounce.start, selectionBeforeDebounce.end, selectionStart, selectionEnd ); selectionBeforeDebounce = null; } const selectionState = getSelectionState( selectionStart, selectionEnd, this.doc, selectionStateOptions ); this.setThrottledLocalStateField( "editorState", { selection: selectionState }, AWARENESS_CURSOR_UPDATE_THROTTLE_IN_MS ); }, LOCAL_CURSOR_UPDATE_DEBOUNCE_IN_MS); }); } /** * Update the entity record with the current collaborator's selection. * * @param selectionStart - The start position of the selection. * @param selectionEnd - The end position of the selection. * @param initialPosition - The initial position of the selection. */ async updateSelectionInEntityRecord(selectionStart, selectionEnd, initialPosition) { const edits = { selection: { selectionStart, selectionEnd, initialPosition } }; const options = { undoIgnore: true }; (0, import_data5.dispatch)(STORE_NAME).editEntityRecord( this.kind, this.name, this.postId, edits, options ); } /** * Check if two editor states are equal. * * @param state1 - The first editor state. * @param state2 - The second editor state. * @return True if the editor states are equal, false otherwise. */ areEditorStatesEqual(state1, state2) { if (!state1 || !state2) { return state1 === state2; } if (!state1.selection || !state2.selection) { return state1.selection === state2.selection; } return areSelectionsStatesEqual(state1.selection, state2.selection); } /** * Resolve a selection state to a text index and block client ID. * * For text-based selections, navigates up from the resolved Y.Text via * AbstractType.parent to find the containing block, then resolves the * local clientId via the block's tree path. * For WholeBlock selections, resolves the block's relative position and * then finds the local clientId via tree path. * * Tree-path resolution is used instead of reading the clientId directly * from the Yjs block because the local block-editor store may use different * clientIds (e.g. in "Show Template" mode where blocks are cloned). * * @param selection - The selection state. * @return The rich-text offset and block client ID, or nulls if not resolvable. */ convertSelectionStateToAbsolute(selection) { if (selection.type === SelectionType.None) { return { richTextOffset: null, localClientId: null }; } if (selection.type === SelectionType.WholeBlock) { const absolutePos = yjs_exports.createAbsolutePositionFromRelativePosition( selection.blockPosition, this.doc ); let localClientId2 = null; if (absolutePos && absolutePos.type instanceof yjs_exports.Array) { const parentArray = absolutePos.type; const block = parentArray.get(absolutePos.index); if (block instanceof yjs_exports.Map) { const path2 = getBlockPathInYdoc(block); localClientId2 = path2 ? resolveBlockClientIdByPath(path2) : null; } } return { richTextOffset: null, localClientId: localClientId2 }; } const cursorPos = "cursorPosition" in selection ? selection.cursorPosition : selection.cursorStartPosition; const absolutePosition = yjs_exports.createAbsolutePositionFromRelativePosition( cursorPos.relativePosition, this.doc ); if (!absolutePosition) { return { richTextOffset: null, localClientId: null }; } const yType = absolutePosition.type.parent?.parent; const path = yType instanceof yjs_exports.Map ? getBlockPathInYdoc(yType) : null; const localClientId = path ? resolveBlockClientIdByPath(path) : null; return { richTextOffset: htmlIndexToRichTextOffset( absolutePosition.type.toString(), absolutePosition.index ), localClientId }; } /** * Type guard to check if a struct is a Y.Item (not Y.GC) * @param struct - The struct to check. * @return True if the struct is a Y.Item, false otherwise. */ isYItem(struct) { return "content" in struct; } /** * Get data for debugging, using the awareness state. * * @return {YDocDebugData} The debug data. */ getDebugData() { const ydoc = this.doc; const docData = Object.fromEntries( Array.from(ydoc.share, ([key, value]) => [ key, value.toJSON() ]) ); const collaboratorMapData = new Map( Array.from(this.getSeenStates().entries()).map( ([clientId, collaboratorState]) => [ String(clientId), { name: collaboratorState.collaboratorInfo.name, wpUserId: collaboratorState.collaboratorInfo.id } ] ) ); const serializableClientItems = {}; ydoc.store.clients.forEach((structs, clientId) => { const items2 = structs.filter(this.isYItem); serializableClientItems[clientId] = items2.map((item) => { const { left, right, ...rest } = item; return { ...rest, left: left ? { id: left.id, length: left.length, origin: left.origin, content: left.content } : null, right: right ? { id: right.id, length: right.length, origin: right.origin, content: right.content } : null }; }); }); return { doc: docData, clients: serializableClientItems, collaboratorMap: Object.fromEntries(collaboratorMapData) }; } }; function detectSelectionDirection(prevStart, prevEnd, newStart, newEnd) { const startMoved = !areBlockSelectionsEqual(prevStart, newStart); const endMoved = !areBlockSelectionsEqual(prevEnd, newEnd); if (startMoved && !endMoved) { return SelectionDirection.Backward; } return SelectionDirection.Forward; } function areBlockSelectionsEqual(a, b) { return a.clientId === b.clientId && a.attributeKey === b.attributeKey && a.offset === b.offset; } // packages/core-data/build-module/utils/crdt.mjs var import_es65 = __toESM(require_es6(), 1); var import_blocks3 = __toESM(require_blocks(), 1); // node_modules/uuid/dist/esm-browser/rng.js var getRandomValues2; var rnds8 = new Uint8Array(16); function rng() { if (!getRandomValues2) { getRandomValues2 = typeof crypto !== "undefined" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto); if (!getRandomValues2) { throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported"); } } return getRandomValues2(rnds8); } // node_modules/uuid/dist/esm-browser/stringify.js var byteToHex = []; for (let i = 0; i < 256; ++i) { byteToHex.push((i + 256).toString(16).slice(1)); } function unsafeStringify(arr, offset = 0) { return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]; } // node_modules/uuid/dist/esm-browser/native.js var randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto); var native_default = { randomUUID }; // node_modules/uuid/dist/esm-browser/v4.js function v4(options, buf, offset) { if (native_default.randomUUID && !buf && !options) { return native_default.randomUUID(); } options = options || {}; const rnds = options.random || (options.rng || rng)(); rnds[6] = rnds[6] & 15 | 64; rnds[8] = rnds[8] & 63 | 128; if (buf) { offset = offset || 0; for (let i = 0; i < 16; ++i) { buf[offset + i] = rnds[i]; } return buf; } return unsafeStringify(rnds); } var v4_default = v4; // packages/core-data/build-module/utils/crdt-blocks.mjs var import_es64 = __toESM(require_es6(), 1); var import_blocks = __toESM(require_blocks(), 1); var import_rich_text3 = __toESM(require_rich_text(), 1); // packages/core-data/build-module/utils/crdt-text.mjs var import_rich_text2 = __toESM(require_rich_text(), 1); var RICH_TEXT_CACHE_MAX_SIZE = 500; function createRichTextDataCache(maxSize) { const cache3 = /* @__PURE__ */ new Map(); return function(value) { const cached = cache3.get(value); if (cached) { return cached; } const result = import_rich_text2.RichTextData.fromHTMLString(value); if (cache3.size >= maxSize) { cache3.delete(cache3.keys().next().value); } cache3.set(value, result); return result; }; } var getCachedRichTextData = createRichTextDataCache( RICH_TEXT_CACHE_MAX_SIZE ); // packages/core-data/build-module/utils/crdt-blocks.mjs var serializableBlocksCache = /* @__PURE__ */ new WeakMap(); function serializeAttributeValue(value) { if (value instanceof import_rich_text3.RichTextData) { return value.valueOf(); } if (Array.isArray(value)) { return value.map(serializeAttributeValue); } if (value && typeof value === "object") { const result = {}; for (const [k, v] of Object.entries(value)) { result[k] = serializeAttributeValue(v); } return result; } return value; } function makeBlockAttributesSerializable(blockName, attributes) { const newAttributes = { ...attributes }; for (const [key, value] of Object.entries(attributes)) { if (isLocalAttribute(blockName, key)) { delete newAttributes[key]; continue; } newAttributes[key] = serializeAttributeValue(value); } return newAttributes; } function makeBlocksSerializable(blocks) { return blocks.map((block) => { const { name, innerBlocks, attributes, ...rest } = block; delete rest.validationIssues; return { ...rest, name, attributes: makeBlockAttributesSerializable(name, attributes), innerBlocks: makeBlocksSerializable(innerBlocks) }; }); } function deserializeAttributeValue(schema, value) { if (schema?.type === "rich-text" && typeof value === "string") { return getCachedRichTextData(value); } if (Array.isArray(value)) { return value.map( (item) => deserializeAttributeValue(schema, item) ); } if (value && typeof value === "object") { const result = {}; for (const [key, innerValue] of Object.entries( value )) { result[key] = deserializeAttributeValue( schema?.query?.[key], innerValue ); } return result; } return value; } function deserializeBlockAttributes(blocks) { return blocks.map((block) => { const { name, innerBlocks, attributes, ...rest } = block; const newAttributes = { ...attributes }; for (const [key, value] of Object.entries(attributes)) { const schema = getBlockAttributeType(name, key); if (schema) { newAttributes[key] = deserializeAttributeValue( schema, value ); } } return { ...rest, name, attributes: newAttributes, innerBlocks: deserializeBlockAttributes(innerBlocks ?? []) }; }); } function areBlocksEqual(gblock, yblock) { const yblockAsJson = yblock.toJSON(); const overwrites = { innerBlocks: null, clientId: null }; const res = (0, import_es64.default)( Object.assign({}, gblock, overwrites), Object.assign({}, yblockAsJson, overwrites) ); const inners = gblock.innerBlocks || []; const yinners = yblock.get("innerBlocks"); return res && inners.length === yinners?.length && inners.every( (block, i) => areBlocksEqual(block, yinners.get(i)) ); } function createNewYAttributeMap(blockName, attributes) { return new yjs_exports.Map( Object.entries(attributes).map( ([attributeName, attributeValue]) => { return [ attributeName, createNewYAttributeValue( blockName, attributeName, attributeValue ) ]; } ) ); } function createNewYAttributeValue(blockName, attributeName, attributeValue) { const isRichText = isRichTextAttribute(blockName, attributeName); if (isRichText) { return new yjs_exports.Text(attributeValue?.toString() ?? ""); } return attributeValue; } function createNewYBlock(block) { return createYMap( Object.fromEntries( Object.entries(block).map(([key, value]) => { switch (key) { case "attributes": { return [ key, createNewYAttributeMap(block.name, value) ]; } case "innerBlocks": { const innerBlocks = new yjs_exports.Array(); if (!Array.isArray(value)) { return [key, innerBlocks]; } innerBlocks.insert( 0, value.map( (innerBlock) => createNewYBlock(innerBlock) ) ); return [key, innerBlocks]; } default: return [key, value]; } }) ) ); } function mergeCrdtBlocks(yblocks, incomingBlocks, cursorPosition) { if (!serializableBlocksCache.has(incomingBlocks)) { serializableBlocksCache.set( incomingBlocks, makeBlocksSerializable(incomingBlocks) ); } const blocksToSync = serializableBlocksCache.get(incomingBlocks) ?? []; const numOfCommonEntries = Math.min( blocksToSync.length ?? 0, yblocks.length ); let left = 0; let right = 0; for (; left < numOfCommonEntries && areBlocksEqual(blocksToSync[left], yblocks.get(left)); left++) { } for (; right < numOfCommonEntries - left && areBlocksEqual( blocksToSync[blocksToSync.length - right - 1], yblocks.get(yblocks.length - right - 1) ); right++) { } const numOfUpdatesNeeded = numOfCommonEntries - left - right; const numOfInsertionsNeeded = Math.max( 0, blocksToSync.length - yblocks.length ); const numOfDeletionsNeeded = Math.max( 0, yblocks.length - blocksToSync.length ); for (let i = 0; i < numOfUpdatesNeeded; i++, left++) { const block = blocksToSync[left]; const yblock = yblocks.get(left); Object.entries(block).forEach(([key, value]) => { switch (key) { case "attributes": { const currentAttributes = yblock.get(key); if (!currentAttributes) { yblock.set( key, createNewYAttributeMap(block.name, value) ); break; } Object.entries(value).forEach( ([attributeName, attributeValue]) => { const currentAttribute = currentAttributes?.get(attributeName); const isExpectedType = isExpectedAttributeType( block.name, attributeName, currentAttribute ); const isAttributeChanged = !isExpectedType || !(0, import_es64.default)( currentAttribute, attributeValue ); if (isAttributeChanged) { updateYBlockAttribute( block.name, attributeName, attributeValue, currentAttributes, cursorPosition ); } } ); currentAttributes.forEach( (_attrValue, attrName) => { if (!value.hasOwnProperty(attrName)) { currentAttributes.delete(attrName); } } ); break; } case "innerBlocks": { let yInnerBlocks = yblock.get(key); if (!(yInnerBlocks instanceof yjs_exports.Array)) { yInnerBlocks = new yjs_exports.Array(); yblock.set(key, yInnerBlocks); } mergeCrdtBlocks( yInnerBlocks, value ?? [], cursorPosition ); break; } default: if (!(0, import_es64.default)(block[key], yblock.get(key))) { yblock.set(key, value); } } }); yblock.forEach((_v, k) => { if (!block.hasOwnProperty(k)) { yblock.delete(k); } }); } yblocks.delete(left, numOfDeletionsNeeded); for (let i = 0; i < numOfInsertionsNeeded; i++, left++) { const newBlock = [createNewYBlock(blocksToSync[left])]; yblocks.insert(left, newBlock); } const knownClientIds = /* @__PURE__ */ new Set(); for (let j = 0; j < yblocks.length; j++) { const yblock = yblocks.get(j); let clientId = yblock.get("clientId"); if (!clientId) { continue; } if (knownClientIds.has(clientId)) { clientId = v4_default(); yblock.set("clientId", clientId); } knownClientIds.add(clientId); } } function updateYBlockAttribute(blockName, attributeName, attributeValue, currentAttributes, cursorPosition) { const isRichText = isRichTextAttribute(blockName, attributeName); const currentAttribute = currentAttributes.get(attributeName); if (isRichText && "string" === typeof attributeValue && currentAttributes.has(attributeName) && currentAttribute instanceof yjs_exports.Text) { mergeRichTextUpdate(currentAttribute, attributeValue, cursorPosition); } else { currentAttributes.set( attributeName, createNewYAttributeValue(blockName, attributeName, attributeValue) ); } } var cachedBlockAttributeTypes; function getBlockAttributeType(blockName, attributeName) { if (!cachedBlockAttributeTypes) { cachedBlockAttributeTypes = /* @__PURE__ */ new Map(); for (const blockType of (0, import_blocks.getBlockTypes)()) { cachedBlockAttributeTypes.set( blockType.name, new Map( Object.entries(blockType.attributes ?? {}).map( ([name, definition]) => { const { role, type, query } = definition; return [name, { role, type, query }]; } ) ) ); } } return cachedBlockAttributeTypes.get(blockName)?.get(attributeName); } function isExpectedAttributeType(blockName, attributeName, attributeValue) { const expectedAttributeType = getBlockAttributeType( blockName, attributeName )?.type; if (expectedAttributeType === "rich-text") { return attributeValue instanceof yjs_exports.Text; } if (expectedAttributeType === "string") { return typeof attributeValue === "string"; } return true; } function isLocalAttribute(blockName, attributeName) { return "local" === getBlockAttributeType(blockName, attributeName)?.role; } function isRichTextAttribute(blockName, attributeName) { return "rich-text" === getBlockAttributeType(blockName, attributeName)?.type; } var localDoc; function mergeRichTextUpdate(blockYText, updatedValue, cursorPosition = null) { if (!localDoc) { localDoc = new yjs_exports.Doc(); } const localYText = localDoc.getText("temporary-text"); localYText.delete(0, localYText.length); localYText.insert(0, updatedValue); const currentValueAsDelta = new Delta2(blockYText.toDelta()); const updatedValueAsDelta = new Delta2(localYText.toDelta()); const deltaDiff = currentValueAsDelta.diffWithCursor( updatedValueAsDelta, cursorPosition ); blockYText.applyDelta(deltaDiff.ops); } // packages/core-data/build-module/utils/crdt-selection.mjs var import_data6 = __toESM(require_data(), 1); var import_block_editor4 = __toESM(require_block_editor(), 1); var import_blocks2 = __toESM(require_blocks(), 1); // packages/core-data/build-module/utils/block-selection-history.mjs var SELECTION_HISTORY_DEFAULT_SIZE = 5; var YSelectionType = /* @__PURE__ */ ((YSelectionType2) => { YSelectionType2["RelativeSelection"] = "RelativeSelection"; YSelectionType2["BlockSelection"] = "BlockSelection"; return YSelectionType2; })(YSelectionType || {}); function createBlockSelectionHistory(ydoc, historySize = SELECTION_HISTORY_DEFAULT_SIZE) { let history = []; const getSelectionHistory2 = () => { return history.slice(0); }; const updateSelection = (newSelection) => { if (!newSelection?.selectionStart?.clientId || !newSelection?.selectionEnd?.clientId) { return; } const { selectionStart, selectionEnd } = newSelection; const start = convertWPBlockSelectionToSelection( selectionStart, ydoc ); const end = convertWPBlockSelectionToSelection(selectionEnd, ydoc); addToHistory({ start, end }); }; const addToHistory = (yFullSelection) => { const startClientId = yFullSelection.start.clientId; const endClientId = yFullSelection.end.clientId; history = history.filter((entry) => { const isSameBlockCombination = entry.start.clientId === startClientId && entry.end.clientId === endClientId; return !isSameBlockCombination; }); history.unshift(yFullSelection); if (history.length > historySize + 1) { history = history.slice(0, historySize + 1); } }; return { getSelectionHistory: getSelectionHistory2, updateSelection }; } function convertWPBlockSelectionToSelection(selection, ydoc) { const clientId = selection.clientId; const block = findBlockByClientIdInDoc(clientId, ydoc); const attributes = block?.get("attributes"); const attributeKey = selection.attributeKey; const changedYText = attributeKey ? attributes?.get(attributeKey) : void 0; const isYText = changedYText instanceof yjs_exports.Text; const isFullyDefinedSelection = attributeKey && clientId; if (!isYText || !isFullyDefinedSelection) { return { type: "BlockSelection", clientId }; } const offset = selection.offset ?? 0; const relativePosition = yjs_exports.createRelativePositionFromTypeIndex( changedYText, richTextOffsetToHtmlIndex(changedYText.toString(), offset) ); return { type: "RelativeSelection", attributeKey, relativePosition, clientId, offset }; } // packages/core-data/build-module/utils/crdt-selection.mjs var selectionHistoryMap = /* @__PURE__ */ new WeakMap(); function getBlockSelectionHistory(ydoc) { let history = selectionHistoryMap.get(ydoc); if (!history) { history = createBlockSelectionHistory(ydoc); selectionHistoryMap.set(ydoc, history); } return history; } function getSelectionHistory(ydoc) { return getBlockSelectionHistory(ydoc).getSelectionHistory(); } function updateSelectionHistory(ydoc, wpSelection) { return getBlockSelectionHistory(ydoc).updateSelection(wpSelection); } function convertYSelectionToBlockSelection(ySelection, ydoc) { if (ySelection.type === YSelectionType.RelativeSelection) { const { relativePosition, attributeKey, clientId } = ySelection; const absolutePosition = yjs_exports.createAbsolutePositionFromRelativePosition( relativePosition, ydoc ); if (absolutePosition) { return { clientId, attributeKey, offset: htmlIndexToRichTextOffset( absolutePosition.type.toString(), absolutePosition.index ) }; } } else if (ySelection.type === YSelectionType.BlockSelection) { return { clientId: ySelection.clientId, attributeKey: void 0, offset: void 0 }; } return null; } function convertYFullSelectionToWPSelection(yFullSelection, ydoc) { const { start, end } = yFullSelection; const startBlock = findBlockByClientIdInDoc(start.clientId, ydoc); const endBlock = findBlockByClientIdInDoc(end.clientId, ydoc); if (!startBlock || !endBlock) { return null; } const startBlockSelection = convertYSelectionToBlockSelection( start, ydoc ); const endBlockSelection = convertYSelectionToBlockSelection(end, ydoc); if (startBlockSelection === null || endBlockSelection === null) { return null; } return { selectionStart: startBlockSelection, selectionEnd: endBlockSelection }; } function findSelectionFromHistory(ydoc, selectionHistory) { for (const positionToTry of selectionHistory) { const result = convertYFullSelectionToWPSelection( positionToTry, ydoc ); if (result !== null) { return result; } } return null; } function restoreSelection(selectionHistory, ydoc) { const selectionToRestore = findSelectionFromHistory( ydoc, selectionHistory ); if (selectionToRestore === null) { return; } const { getBlock } = (0, import_data6.select)(import_block_editor4.store); const { resetSelection } = (0, import_data6.dispatch)(import_block_editor4.store); const { selectionStart, selectionEnd } = selectionToRestore; const isSelectionInSameBlock = selectionStart.clientId === selectionEnd.clientId; if (isSelectionInSameBlock) { const block = getBlock(selectionStart.clientId); const isBlockEmpty = block && (0, import_blocks2.isUnmodifiedBlock)(block); const isBeginningOfEmptyBlock = 0 === selectionStart.offset && 0 === selectionEnd.offset && isBlockEmpty && !selectionStart.attributeKey && !selectionEnd.attributeKey; if (isBeginningOfEmptyBlock) { const selectionStartWithoutOffset = { clientId: selectionStart.clientId }; const selectionEndWithoutOffset = { clientId: selectionEnd.clientId }; resetSelection( selectionStartWithoutOffset, selectionEndWithoutOffset, 0 ); } else { resetSelection(selectionStart, selectionEnd, 0); } } else { resetSelection(selectionEnd, selectionEnd, 0); } } function getShiftedSelection(ydoc, selectionHistory) { if (selectionHistory.length === 0) { return null; } const { start, end } = selectionHistory[0]; if (start.type === YSelectionType.BlockSelection || end.type === YSelectionType.BlockSelection) { return null; } const selectionStart = convertYSelectionToBlockSelection(start, ydoc); const selectionEnd = convertYSelectionToBlockSelection(end, ydoc); if (!selectionStart || !selectionEnd) { return null; } const startShifted = selectionStart.offset !== start.offset; const endShifted = selectionEnd.offset !== end.offset; if (!startShifted && !endShifted) { return null; } return { selectionStart, selectionEnd }; } // packages/core-data/build-module/utils/crdt.mjs var POST_META_KEY_FOR_CRDT_DOC_PERSISTENCE = "_crdt_document"; var disallowedPostMetaKeys = /* @__PURE__ */ new Set([ POST_META_KEY_FOR_CRDT_DOC_PERSISTENCE ]); function defaultApplyChangesToCRDTDoc(ydoc, changes) { const ymap = getRootMap(ydoc, CRDT_RECORD_MAP_KEY2); Object.entries(changes).forEach(([key, newValue]) => { if ("function" === typeof newValue) { return; } switch (key) { // Add support for additional data types here. default: { const currentValue = ymap.get(key); updateMapValue(ymap, key, currentValue, newValue); } } }); } function applyPostChangesToCRDTDoc(ydoc, changes, syncedProperties) { const ymap = getRootMap(ydoc, CRDT_RECORD_MAP_KEY2); Object.keys(changes).forEach((key) => { if (!syncedProperties.has(key)) { return; } const newValue = changes[key]; if ("function" === typeof newValue) { return; } switch (key) { case "blocks": { if (!newValue) { ymap.set(key, void 0); break; } let currentBlocks = ymap.get(key); if (!(currentBlocks instanceof yjs_exports.Array)) { currentBlocks = new yjs_exports.Array(); ymap.set(key, currentBlocks); } const cursorPosition = changes.selection?.selectionStart?.offset ?? null; mergeCrdtBlocks(currentBlocks, newValue, cursorPosition); break; } case "content": case "excerpt": case "title": { const currentValue = ymap.get(key); let rawValue = getRawValue(newValue); if (key === "title" && !currentValue?.toString() && "Auto Draft" === rawValue) { rawValue = ""; } if (currentValue instanceof yjs_exports.Text) { mergeRichTextUpdate(currentValue, rawValue ?? ""); } else { const newYText = new yjs_exports.Text(rawValue ?? ""); ymap.set(key, newYText); } break; } // "Meta" is overloaded term; here, it refers to post meta. case "meta": { let metaMap = ymap.get("meta"); if (!isYMap(metaMap)) { metaMap = createYMap(); ymap.set("meta", metaMap); } Object.entries(newValue ?? {}).forEach( ([metaKey, metaValue]) => { if (disallowedPostMetaKeys.has(metaKey)) { return; } updateMapValue( metaMap, metaKey, metaMap.get(metaKey), // current value in CRDT metaValue // new value from changes ); } ); break; } case "slug": { if (!newValue) { break; } const currentValue = ymap.get(key); updateMapValue(ymap, key, currentValue, newValue); break; } // Add support for additional properties here. default: { const currentValue = ymap.get(key); updateMapValue(ymap, key, currentValue, newValue); } } }); if (changes.selection) { const selection = changes.selection; setTimeout(() => { updateSelectionHistory(ydoc, selection); }, 0); } } function defaultGetChangesFromCRDTDoc(crdtDoc) { return getRootMap(crdtDoc, CRDT_RECORD_MAP_KEY2).toJSON(); } function getPostChangesFromCRDTDoc(ydoc, editedRecord, syncedProperties) { const ymap = getRootMap(ydoc, CRDT_RECORD_MAP_KEY2); let allowedMetaChanges = {}; const changes = Object.fromEntries( Object.entries(ymap.toJSON()).filter(([key, newValue]) => { if (!syncedProperties.has(key)) { return false; } const currentValue = editedRecord[key]; switch (key) { case "blocks": { if (ydoc.meta?.get(CRDT_DOC_META_PERSISTENCE_KEY2) && editedRecord.content) { const blocksJson = ymap.get("blocks")?.toJSON() ?? []; return (0, import_blocks3.__unstableSerializeAndClean)(blocksJson).trim() !== getRawValue(editedRecord.content); } return true; } case "date": { const currentDateIsFloating = null === currentValue || editedRecord.modified === currentValue; if (currentDateIsFloating) { return false; } return haveValuesChanged(currentValue, newValue); } case "meta": { const currentMeta = currentValue ?? {}; allowedMetaChanges = Object.fromEntries( Object.entries(newValue ?? {}).filter( ([metaKey]) => { if (disallowedPostMetaKeys.has(metaKey)) { return false; } return metaKey in currentMeta; } ) ); const mergedValue = { ...currentMeta, ...allowedMetaChanges }; return haveValuesChanged(currentValue, mergedValue); } case "status": { if ("auto-draft" === newValue) { return false; } return haveValuesChanged(currentValue, newValue); } case "content": case "excerpt": case "title": { return haveValuesChanged( getRawValue(currentValue), newValue ); } // Add support for additional data types here. default: { return haveValuesChanged(currentValue, newValue); } } }) ); if (changes.blocks) { changes.blocks = deserializeBlockAttributes( changes.blocks ); } if ("object" === typeof changes.meta) { changes.meta = { ...editedRecord.meta, ...allowedMetaChanges }; } const selectionHistory = getSelectionHistory(ydoc); const shiftedSelection = getShiftedSelection(ydoc, selectionHistory); if (shiftedSelection) { changes.selection = { ...shiftedSelection, initialPosition: 0 }; } return changes; } var defaultSyncConfig = { applyChangesToCRDTDoc: defaultApplyChangesToCRDTDoc, createAwareness: (ydoc) => new BaseAwareness(ydoc), getChangesFromCRDTDoc: defaultGetChangesFromCRDTDoc }; var defaultCollectionSyncConfig = { applyChangesToCRDTDoc: () => { }, getChangesFromCRDTDoc: () => ({}), shouldSync: (_, objectId) => null === objectId }; function getRawValue(value) { if ("string" === typeof value) { return value; } if (value && "object" === typeof value && "raw" in value && "string" === typeof value.raw) { return value.raw; } return void 0; } function haveValuesChanged(currentValue, newValue) { return !(0, import_es65.default)(currentValue, newValue); } function updateMapValue(map2, key, currentValue, newValue) { if (void 0 === newValue) { map2.delete(key); return; } if (haveValuesChanged(currentValue, newValue)) { map2.set(key, newValue); } } // packages/core-data/build-module/entities.mjs var DEFAULT_ENTITY_KEY = "id"; var POST_RAW_ATTRIBUTES = ["title", "excerpt", "content"]; var blocksTransientEdits = { blocks: { read: (record) => (0, import_blocks4.parse)(record.content?.raw ?? ""), write: (record) => ({ content: (0, import_blocks4.__unstableSerializeAndClean)(record.blocks) }) } }; var rootEntitiesConfig = [ { label: (0, import_i18n.__)("Base"), kind: "root", key: false, name: "__unstableBase", baseURL: "/", baseURLParams: { // Please also change the preload path when changing this. // @see lib/compat/wordpress-7.0/preload.php _fields: [ "description", "gmt_offset", "home", "image_sizes", "image_size_threshold", "image_output_formats", "jpeg_interlaced", "png_interlaced", "gif_interlaced", "name", "site_icon", "site_icon_url", "site_logo", "timezone_string", "url", "page_for_posts", "page_on_front", "show_on_front" ].join(",") }, // The entity doesn't support selecting multiple records. // The property is maintained for backward compatibility. plural: "__unstableBases" }, { label: (0, import_i18n.__)("Post Type"), name: "postType", kind: "root", key: "slug", baseURL: "/wp/v2/types", baseURLParams: { context: "edit" }, plural: "postTypes" }, { name: "media", kind: "root", baseURL: "/wp/v2/media", baseURLParams: { context: "edit" }, plural: "mediaItems", label: (0, import_i18n.__)("Media"), rawAttributes: ["caption", "title", "description"], supportsPagination: true }, { name: "taxonomy", kind: "root", key: "slug", baseURL: "/wp/v2/taxonomies", baseURLParams: { context: "edit" }, plural: "taxonomies", label: (0, import_i18n.__)("Taxonomy") }, { name: "sidebar", kind: "root", baseURL: "/wp/v2/sidebars", baseURLParams: { context: "edit" }, plural: "sidebars", transientEdits: { blocks: true }, label: (0, import_i18n.__)("Widget areas") }, { name: "widget", kind: "root", baseURL: "/wp/v2/widgets", baseURLParams: { context: "edit" }, plural: "widgets", transientEdits: { blocks: true }, label: (0, import_i18n.__)("Widgets") }, { name: "widgetType", kind: "root", baseURL: "/wp/v2/widget-types", baseURLParams: { context: "edit" }, plural: "widgetTypes", label: (0, import_i18n.__)("Widget types") }, { label: (0, import_i18n.__)("User"), name: "user", kind: "root", baseURL: "/wp/v2/users", getTitle: (record) => record?.name || record?.slug, baseURLParams: { context: "edit" }, plural: "users", supportsPagination: true }, { name: "comment", kind: "root", baseURL: "/wp/v2/comments", baseURLParams: { context: "edit" }, plural: "comments", label: (0, import_i18n.__)("Comment"), supportsPagination: true, syncConfig: defaultCollectionSyncConfig }, { name: "menu", kind: "root", baseURL: "/wp/v2/menus", baseURLParams: { context: "edit" }, plural: "menus", label: (0, import_i18n.__)("Menu"), supportsPagination: true }, { name: "menuItem", kind: "root", baseURL: "/wp/v2/menu-items", baseURLParams: { context: "edit" }, plural: "menuItems", label: (0, import_i18n.__)("Menu Item"), rawAttributes: ["title"], supportsPagination: true }, { name: "menuLocation", kind: "root", baseURL: "/wp/v2/menu-locations", baseURLParams: { context: "edit" }, plural: "menuLocations", label: (0, import_i18n.__)("Menu Location"), key: "name" }, { label: (0, import_i18n.__)("Global Styles"), name: "globalStyles", kind: "root", baseURL: "/wp/v2/global-styles", baseURLParams: { context: "edit" }, plural: "globalStylesVariations", // Should be different from name. getTitle: () => (0, import_i18n.__)("Custom Styles"), getRevisionsUrl: (parentId, revisionId) => `/wp/v2/global-styles/${parentId}/revisions${revisionId ? "/" + revisionId : ""}`, supportsPagination: true }, { label: (0, import_i18n.__)("Themes"), name: "theme", kind: "root", baseURL: "/wp/v2/themes", baseURLParams: { context: "edit" }, plural: "themes", key: "stylesheet" }, { label: (0, import_i18n.__)("Plugins"), name: "plugin", kind: "root", baseURL: "/wp/v2/plugins", baseURLParams: { context: "edit" }, plural: "plugins", key: "plugin" }, { label: (0, import_i18n.__)("Status"), name: "status", kind: "root", baseURL: "/wp/v2/statuses", baseURLParams: { context: "edit" }, plural: "statuses", key: "slug" }, { label: (0, import_i18n.__)("Registered Templates"), name: "registeredTemplate", kind: "root", baseURL: "/wp/v2/registered-templates", key: "id" }, { label: (0, import_i18n.__)("Font Collections"), name: "fontCollection", kind: "root", baseURL: "/wp/v2/font-collections", baseURLParams: { context: "view" }, plural: "fontCollections", key: "slug" }, { label: (0, import_i18n.__)("Icons"), name: "icon", kind: "root", baseURL: "/wp/v2/icons", baseURLParams: { context: "view" }, plural: "icons", key: "name" } ]; var deprecatedEntities = { root: { media: { since: "6.9", alternative: { kind: "postType", name: "attachment" } } } }; var additionalEntityConfigLoaders = [ { kind: "postType", loadEntities: loadPostTypeEntities }, { kind: "taxonomy", loadEntities: loadTaxonomyEntities }, { kind: "root", name: "site", plural: "sites", loadEntities: loadSiteEntity } ]; var prePersistPostType = async (persistedRecord, edits, name, isTemplate) => { const newEdits = {}; if (!isTemplate && persistedRecord?.status === "auto-draft") { if (!edits.status && !newEdits.status) { newEdits.status = "draft"; } if ((!edits.title || edits.title === "Auto Draft") && !newEdits.title && (!persistedRecord?.title || persistedRecord?.title === "Auto Draft")) { newEdits.title = ""; } } if (persistedRecord) { const objectType = `postType/${name}`; const objectId = persistedRecord.id; const serializedDoc = await getSyncManager()?.createPersistedCRDTDoc( objectType, objectId ); if (serializedDoc) { newEdits.meta = { ...edits.meta, [POST_META_KEY_FOR_CRDT_DOC_PERSISTENCE]: serializedDoc }; } } return newEdits; }; async function loadPostTypeEntities() { const postTypesPromise = (0, import_api_fetch2.default)({ path: "/wp/v2/types?context=view" }); const taxonomiesPromise = window._wpCollaborationEnabled ? (0, import_api_fetch2.default)({ path: "/wp/v2/taxonomies?context=view" }) : Promise.resolve({}); const [postTypes, taxonomies] = await Promise.all([ postTypesPromise, taxonomiesPromise ]); return Object.entries(postTypes ?? {}).map(([name, postType]) => { const isTemplate = ["wp_template", "wp_template_part"].includes( name ); const namespace = postType?.rest_namespace ?? "wp/v2"; const syncedProperties = /* @__PURE__ */ new Set([ "author", "blocks", "content", "comment_status", "date", "excerpt", "featured_media", "format", "meta", "ping_status", "slug", "status", "sticky", "template", "title", ...postType.taxonomies?.map((taxonomy) => taxonomies?.[taxonomy]?.rest_base)?.filter(Boolean) ?? [] ]); const entity2 = { kind: "postType", baseURL: `/${namespace}/${postType.rest_base}`, baseURLParams: { context: "edit" }, name, label: postType.name, transientEdits: { ...blocksTransientEdits, selection: true }, mergedEdits: { meta: true }, rawAttributes: POST_RAW_ATTRIBUTES, getTitle: (record) => record?.title?.rendered || record?.title || (isTemplate ? capitalCase(record.slug ?? "") : String(record.id)), __unstablePrePersist: (persistedRecord, edits) => prePersistPostType(persistedRecord, edits, name, isTemplate), __unstable_rest_base: postType.rest_base, supportsPagination: true, getRevisionsUrl: (parentId, revisionId) => `/${namespace}/${postType.rest_base}/${parentId}/revisions${revisionId ? "/" + revisionId : ""}`, revisionKey: isTemplate && !window?.__experimentalTemplateActivate ? "wp_id" : DEFAULT_ENTITY_KEY }; entity2.syncConfig = { /** * Apply changes from the local editor to the local CRDT document so * that those changes can be synced to other peers (via the provider). * * @param {import('@wordpress/sync').CRDTDoc} crdtDoc * @param {Partial< import('@wordpress/sync').ObjectData >} changes * @return {void} */ applyChangesToCRDTDoc: (crdtDoc, changes) => applyPostChangesToCRDTDoc(crdtDoc, changes, syncedProperties), /** * Create the awareness instance for the entity's CRDT document. * * @param {import('@wordpress/sync').CRDTDoc} ydoc * @param {import('@wordpress/sync').ObjectID} objectId * @return {import('@wordpress/sync').Awareness} Awareness instance */ createAwareness: (ydoc, objectId) => { const kind = "postType"; const id2 = parseInt(objectId, 10); return new PostEditorAwareness(ydoc, kind, name, id2); }, /** * Extract changes from a CRDT document that can be used to update the * local editor state. * * @param {import('@wordpress/sync').CRDTDoc} crdtDoc * @param {import('@wordpress/sync').ObjectData} editedRecord * @return {Partial< import('@wordpress/sync').ObjectData >} Changes to record */ getChangesFromCRDTDoc: (crdtDoc, editedRecord) => getPostChangesFromCRDTDoc( crdtDoc, editedRecord, syncedProperties ), /** * Extract changes from a CRDT document that can be used to update the * local editor state. * * @param {import('@wordpress/sync').ObjectData} record * @return {Partial< import('@wordpress/sync').ObjectData >} Changes to record */ getPersistedCRDTDoc: (record) => { return record?.meta?.[POST_META_KEY_FOR_CRDT_DOC_PERSISTENCE] || null; } }; return entity2; }); } async function loadTaxonomyEntities() { const taxonomies = await (0, import_api_fetch2.default)({ path: "/wp/v2/taxonomies?context=view" }); return Object.entries(taxonomies ?? {}).map(([name, taxonomy]) => { const namespace = taxonomy?.rest_namespace ?? "wp/v2"; const entity2 = { kind: "taxonomy", baseURL: `/${namespace}/${taxonomy.rest_base}`, baseURLParams: { context: "edit" }, name, label: taxonomy.name, getTitle: (record) => record?.name, supportsPagination: true }; entity2.syncConfig = defaultSyncConfig; return entity2; }); } async function loadSiteEntity() { const entity2 = { label: (0, import_i18n.__)("Site"), name: "site", kind: "root", key: false, baseURL: "/wp/v2/settings", meta: {} }; const site = await (0, import_api_fetch2.default)({ path: entity2.baseURL, method: "OPTIONS" }); const labels = {}; Object.entries(site?.schema?.properties ?? {}).forEach( ([key, value]) => { if (typeof value === "object" && value.title) { labels[key] = value.title; } } ); return [{ ...entity2, meta: { labels } }]; } var getMethodName = (kind, name, prefix = "get") => { const kindPrefix = kind === "root" ? "" : pascalCase(kind); const suffix = pascalCase(name); return `${prefix}${kindPrefix}${suffix}`; }; // packages/core-data/build-module/queried-data/reducer.mjs function getContextFromAction(action) { const { query } = action; if (!query) { return "default"; } const queryParts = get_query_parts_default(query); return queryParts.context; } function getMergedItemIds(itemIds, nextItemIds, page, perPage) { const receivedAllIds = page === 1 && perPage === -1; if (receivedAllIds) { return nextItemIds; } const nextItemIdsStartIndex = (page - 1) * perPage; const size2 = Math.max( itemIds?.length ?? 0, nextItemIdsStartIndex + nextItemIds.length ); const mergedItemIds = new Array(size2); for (let i = 0; i < size2; i++) { const isInNextItemsRange = i >= nextItemIdsStartIndex && i < nextItemIdsStartIndex + perPage; mergedItemIds[i] = isInNextItemsRange ? nextItemIds[i - nextItemIdsStartIndex] : itemIds?.[i]; } return mergedItemIds; } function removeEntitiesById(entities2, ids) { return Object.fromEntries( Object.entries(entities2).filter( ([id2]) => !ids.some((itemId) => { if (Number.isInteger(itemId)) { return itemId === +id2; } return itemId === id2; }) ) ); } function items(state = {}, action) { switch (action.type) { case "RECEIVE_ITEMS": { const context = getContextFromAction(action); const key = action.key || DEFAULT_ENTITY_KEY; const itemsList = Array.isArray(action.items) ? action.items : [action.items]; return { ...state, [context]: { ...state[context], ...Object.fromEntries( itemsList.map((item) => [ item?.[key], conservativeMapItem( state?.[context]?.[item?.[key]], item ) ]) ) } }; } case "REMOVE_ITEMS": return Object.fromEntries( Object.entries(state).map(([itemId, contextState]) => [ itemId, removeEntitiesById(contextState, action.itemIds) ]) ); } return state; } function itemIsComplete(state = {}, action) { switch (action.type) { case "RECEIVE_ITEMS": { const context = getContextFromAction(action); const { query, key = DEFAULT_ENTITY_KEY } = action; const itemsList = Array.isArray(action.items) ? action.items : [action.items]; const queryParts = query ? get_query_parts_default(query) : {}; const isCompleteQuery = !query || !Array.isArray(queryParts.fields); return { ...state, [context]: { ...state[context], ...itemsList.reduce((result, item) => { const itemId = item?.[key]; result[itemId] = state?.[context]?.[itemId] || isCompleteQuery; return result; }, {}) } }; } case "REMOVE_ITEMS": return Object.fromEntries( Object.entries(state).map(([itemId, contextState]) => [ itemId, removeEntitiesById(contextState, action.itemIds) ]) ); } return state; } var receiveQueries = (0, import_compose.compose)([ // Limit to matching action type so we don't attempt to replace action on // an unhandled action. if_matching_action_default((action) => "query" in action), // Inject query parts into action for use both in `onSubKey` and reducer. replace_action_default((action) => { if (action.query) { return { ...action, ...get_query_parts_default(action.query) }; } return action; }), on_sub_key_default("context"), // Queries shape is shared, but keyed by query `stableKey` part. Original // reducer tracks only a single query object. on_sub_key_default("stableKey") ])((state = {}, action) => { if (action.type !== "RECEIVE_ITEMS") { return state; } if (!Array.isArray(action.items)) { return state; } const key = action.key ?? DEFAULT_ENTITY_KEY; return { itemIds: getMergedItemIds( state?.itemIds || [], action.items.map((item) => item?.[key]).filter(Boolean), action.page, action.perPage ), meta: action.meta }; }); var queries = (state = {}, action) => { switch (action.type) { case "RECEIVE_ITEMS": return receiveQueries(state, action); case "REMOVE_ITEMS": const removedItems = action.itemIds.reduce((result, itemId) => { result[itemId] = true; return result; }, {}); return Object.fromEntries( Object.entries(state).map( ([queryGroup, contextQueries]) => [ queryGroup, Object.fromEntries( Object.entries(contextQueries).map( ([query, queryItems]) => [ query, { ...queryItems, itemIds: queryItems.itemIds.filter( (queryId) => !removedItems[queryId] ) } ] ) ) ] ) ); default: return state; } }; var reducer_default = (0, import_data7.combineReducers)({ items, itemIsComplete, queries }); // packages/core-data/build-module/reducer.mjs function users(state = { byId: {}, queries: {} }, action) { switch (action.type) { case "RECEIVE_USER_QUERY": return { byId: { ...state.byId, // Key users by their ID. ...action.users.reduce( (newUsers, user) => ({ ...newUsers, [user.id]: user }), {} ) }, queries: { ...state.queries, [action.queryID]: action.users.map((user) => user.id) } }; } return state; } function currentUser(state = {}, action) { switch (action.type) { case "RECEIVE_CURRENT_USER": return action.currentUser; } return state; } function currentTheme(state = void 0, action) { switch (action.type) { case "RECEIVE_CURRENT_THEME": return action.currentTheme.stylesheet; } return state; } function currentGlobalStylesId(state = void 0, action) { switch (action.type) { case "RECEIVE_CURRENT_GLOBAL_STYLES_ID": return action.id; } return state; } function themeBaseGlobalStyles(state = {}, action) { switch (action.type) { case "RECEIVE_THEME_GLOBAL_STYLES": return { ...state, [action.stylesheet]: action.globalStyles }; } return state; } function themeGlobalStyleVariations(state = {}, action) { switch (action.type) { case "RECEIVE_THEME_GLOBAL_STYLE_VARIATIONS": return { ...state, [action.stylesheet]: action.variations }; } return state; } var withMultiEntityRecordEdits = (reducer) => (state, action) => { if (action.type === "UNDO" || action.type === "REDO") { const { record } = action; let newState = state; record.forEach(({ id: { kind, name, recordId }, changes }) => { newState = reducer(newState, { type: "EDIT_ENTITY_RECORD", kind, name, recordId, edits: Object.entries(changes).reduce( (acc, [key, value]) => { acc[key] = action.type === "UNDO" ? value.from : value.to; return acc; }, {} ) }); }); return newState; } return reducer(state, action); }; function entity(entityConfig) { return (0, import_compose2.compose)([ withMultiEntityRecordEdits, // Limit to matching action type so we don't attempt to replace action on // an unhandled action. if_matching_action_default( (action) => action.name && action.kind && action.name === entityConfig.name && action.kind === entityConfig.kind ), // Inject the entity config into the action. replace_action_default((action) => { return { key: entityConfig.key || DEFAULT_ENTITY_KEY, ...action }; }) ])( (0, import_data8.combineReducers)({ queriedData: reducer_default, edits: (state = {}, action) => { switch (action.type) { case "RECEIVE_ITEMS": const context = action?.query?.context ?? "default"; if (context !== "default") { return state; } const nextState = { ...state }; const itemsList = Array.isArray(action.items) ? action.items : [action.items]; for (const record of itemsList) { const recordId = record?.[action.key]; const edits = nextState[recordId]; if (!edits) { continue; } const nextEdits2 = Object.keys(edits).reduce( (acc, key) => { if ( // Edits are the "raw" attribute values, but records may have // objects with more properties, so we use `get` here for the // comparison. !(0, import_es66.default)( edits[key], record[key]?.raw ?? record[key] ) && // Sometimes the server alters the sent value which means // we need to also remove the edits before the api request. (!action.persistedEdits || !(0, import_es66.default)( edits[key], action.persistedEdits[key] )) ) { acc[key] = edits[key]; } return acc; }, {} ); if (Object.keys(nextEdits2).length) { nextState[recordId] = nextEdits2; } else { delete nextState[recordId]; } } return nextState; case "EDIT_ENTITY_RECORD": const nextEdits = { ...state[action.recordId], ...action.edits }; Object.keys(nextEdits).forEach((key) => { if (nextEdits[key] === void 0) { delete nextEdits[key]; } }); return { ...state, [action.recordId]: nextEdits }; } return state; }, saving: (state = {}, action) => { switch (action.type) { case "SAVE_ENTITY_RECORD_START": case "SAVE_ENTITY_RECORD_FINISH": return { ...state, [action.recordId]: { pending: action.type === "SAVE_ENTITY_RECORD_START", error: action.error, isAutosave: action.isAutosave } }; } return state; }, deleting: (state = {}, action) => { switch (action.type) { case "DELETE_ENTITY_RECORD_START": case "DELETE_ENTITY_RECORD_FINISH": return { ...state, [action.recordId]: { pending: action.type === "DELETE_ENTITY_RECORD_START", error: action.error } }; } return state; }, revisions: (state = {}, action) => { if (action.type === "RECEIVE_ITEM_REVISIONS") { const recordKey = action.recordKey; delete action.recordKey; const newState = reducer_default(state[recordKey], { ...action, type: "RECEIVE_ITEMS" }); return { ...state, [recordKey]: newState }; } if (action.type === "REMOVE_ITEMS") { return Object.fromEntries( Object.entries(state).filter( ([id2]) => !action.itemIds.some((itemId) => { if (Number.isInteger(itemId)) { return itemId === +id2; } return itemId === id2; }) ) ); } return state; } }) ); } function entitiesConfig(state = rootEntitiesConfig, action) { switch (action.type) { case "ADD_ENTITIES": return [...state, ...action.entities]; } return state; } var entities = (state = {}, action) => { const newConfig = entitiesConfig(state.config, action); let entitiesDataReducer = state.reducer; if (!entitiesDataReducer || newConfig !== state.config) { const entitiesByKind = newConfig.reduce((acc, record) => { const { kind } = record; if (!acc[kind]) { acc[kind] = []; } acc[kind].push(record); return acc; }, {}); entitiesDataReducer = (0, import_data8.combineReducers)( Object.fromEntries( Object.entries(entitiesByKind).map( ([kind, subEntities]) => { const kindReducer = (0, import_data8.combineReducers)( Object.fromEntries( subEntities.map((entityConfig) => [ entityConfig.name, entity(entityConfig) ]) ) ); return [kind, kindReducer]; } ) ) ); } const newData = entitiesDataReducer(state.records, action); if (newData === state.records && newConfig === state.config && entitiesDataReducer === state.reducer) { return state; } return { reducer: entitiesDataReducer, records: newData, config: newConfig }; }; function undoManager(state = (0, import_undo_manager2.createUndoManager)()) { return state; } function editsReference(state = {}, action) { switch (action.type) { case "EDIT_ENTITY_RECORD": case "UNDO": case "REDO": return {}; } return state; } function embedPreviews(state = {}, action) { switch (action.type) { case "RECEIVE_EMBED_PREVIEW": const { url, preview } = action; return { ...state, [url]: preview }; } return state; } function userPermissions(state = {}, action) { switch (action.type) { case "RECEIVE_USER_PERMISSION": return { ...state, [action.key]: action.isAllowed }; case "RECEIVE_USER_PERMISSIONS": return { ...state, ...action.permissions }; } return state; } function autosaves(state = {}, action) { switch (action.type) { case "RECEIVE_AUTOSAVES": const { postId, autosaves: autosavesData } = action; return { ...state, [postId]: autosavesData }; } return state; } function blockPatterns(state = [], action) { switch (action.type) { case "RECEIVE_BLOCK_PATTERNS": return action.patterns; } return state; } function blockPatternCategories(state = [], action) { switch (action.type) { case "RECEIVE_BLOCK_PATTERN_CATEGORIES": return action.categories; } return state; } function userPatternCategories(state = [], action) { switch (action.type) { case "RECEIVE_USER_PATTERN_CATEGORIES": return action.patternCategories; } return state; } function navigationFallbackId(state = null, action) { switch (action.type) { case "RECEIVE_NAVIGATION_FALLBACK_ID": return action.fallbackId; } return state; } function themeGlobalStyleRevisions(state = {}, action) { switch (action.type) { case "RECEIVE_THEME_GLOBAL_STYLE_REVISIONS": return { ...state, [action.currentId]: action.revisions }; } return state; } function defaultTemplates(state = {}, action) { switch (action.type) { case "RECEIVE_DEFAULT_TEMPLATE": return { ...state, [JSON.stringify(action.query)]: action.templateId }; } return state; } function registeredPostMeta(state = {}, action) { switch (action.type) { case "RECEIVE_REGISTERED_POST_META": return { ...state, [action.postType]: action.registeredPostMeta }; } return state; } function editorSettings(state = null, action) { switch (action.type) { case "RECEIVE_EDITOR_SETTINGS": return action.settings; } return state; } function editorAssets(state = null, action) { switch (action.type) { case "RECEIVE_EDITOR_ASSETS": return action.assets; } return state; } function syncConnectionStatuses(state = {}, action) { switch (action.type) { case "SET_SYNC_CONNECTION_STATUS": { const key = `${action.kind}/${action.name}:${action.key}`; return { ...state, [key]: action.status }; } case "CLEAR_SYNC_CONNECTION_STATUS": { const key = `${action.kind}/${action.name}:${action.key}`; const { [key]: _, ...rest } = state; return rest; } } return state; } function collaborationSupported(state = true, action) { switch (action.type) { case "SET_COLLABORATION_SUPPORTED": return action.supported; case "SET_SYNC_CONNECTION_STATUS": if (ConnectionErrorCode2.DOCUMENT_SIZE_LIMIT_EXCEEDED === action.status?.error?.code) { return false; } return state; } return state; } var reducer_default2 = (0, import_data8.combineReducers)({ users, currentTheme, currentGlobalStylesId, currentUser, themeGlobalStyleVariations, themeBaseGlobalStyles, themeGlobalStyleRevisions, entities, editsReference, undoManager, embedPreviews, userPermissions, autosaves, blockPatterns, blockPatternCategories, userPatternCategories, navigationFallbackId, defaultTemplates, registeredPostMeta, editorSettings, editorAssets, syncConnectionStatuses, collaborationSupported }); // packages/core-data/build-module/selectors.mjs var selectors_exports = {}; __export(selectors_exports, { __experimentalGetCurrentGlobalStylesId: () => __experimentalGetCurrentGlobalStylesId, __experimentalGetCurrentThemeBaseGlobalStyles: () => __experimentalGetCurrentThemeBaseGlobalStyles, __experimentalGetCurrentThemeGlobalStylesVariations: () => __experimentalGetCurrentThemeGlobalStylesVariations, __experimentalGetDirtyEntityRecords: () => __experimentalGetDirtyEntityRecords, __experimentalGetEntitiesBeingSaved: () => __experimentalGetEntitiesBeingSaved, __experimentalGetEntityRecordNoResolver: () => __experimentalGetEntityRecordNoResolver, canUser: () => canUser, canUserEditEntityRecord: () => canUserEditEntityRecord, getAuthors: () => getAuthors, getAutosave: () => getAutosave, getAutosaves: () => getAutosaves, getBlockPatternCategories: () => getBlockPatternCategories, getBlockPatterns: () => getBlockPatterns, getCurrentTheme: () => getCurrentTheme, getCurrentThemeGlobalStylesRevisions: () => getCurrentThemeGlobalStylesRevisions, getCurrentUser: () => getCurrentUser, getDefaultTemplateId: () => getDefaultTemplateId, getEditedEntityRecord: () => getEditedEntityRecord, getEmbedPreview: () => getEmbedPreview, getEntitiesByKind: () => getEntitiesByKind, getEntitiesConfig: () => getEntitiesConfig, getEntity: () => getEntity, getEntityConfig: () => getEntityConfig, getEntityRecord: () => getEntityRecord, getEntityRecordEdits: () => getEntityRecordEdits, getEntityRecordNonTransientEdits: () => getEntityRecordNonTransientEdits, getEntityRecords: () => getEntityRecords, getEntityRecordsTotalItems: () => getEntityRecordsTotalItems, getEntityRecordsTotalPages: () => getEntityRecordsTotalPages, getLastEntityDeleteError: () => getLastEntityDeleteError, getLastEntitySaveError: () => getLastEntitySaveError, getRawEntityRecord: () => getRawEntityRecord, getRedoEdit: () => getRedoEdit, getReferenceByDistinctEdits: () => getReferenceByDistinctEdits, getRevision: () => getRevision, getRevisions: () => getRevisions, getThemeSupports: () => getThemeSupports, getUndoEdit: () => getUndoEdit, getUserPatternCategories: () => getUserPatternCategories, getUserQueryResults: () => getUserQueryResults, hasEditsForEntityRecord: () => hasEditsForEntityRecord, hasEntityRecord: () => hasEntityRecord, hasEntityRecords: () => hasEntityRecords, hasFetchedAutosaves: () => hasFetchedAutosaves, hasRedo: () => hasRedo, hasUndo: () => hasUndo, isAutosavingEntityRecord: () => isAutosavingEntityRecord, isDeletingEntityRecord: () => isDeletingEntityRecord, isPreviewEmbedFallback: () => isPreviewEmbedFallback, isRequestingEmbedPreview: () => isRequestingEmbedPreview, isSavingEntityRecord: () => isSavingEntityRecord }); var import_data10 = __toESM(require_data(), 1); var import_url2 = __toESM(require_url(), 1); var import_deprecated2 = __toESM(require_deprecated(), 1); // packages/core-data/build-module/private-selectors.mjs var private_selectors_exports = {}; __export(private_selectors_exports, { getBlockPatternsForPostType: () => getBlockPatternsForPostType, getEditorAssets: () => getEditorAssets, getEditorSettings: () => getEditorSettings, getEntityRecordPermissions: () => getEntityRecordPermissions, getEntityRecordsPermissions: () => getEntityRecordsPermissions, getHomePage: () => getHomePage, getNavigationFallbackId: () => getNavigationFallbackId, getPostsPageId: () => getPostsPageId, getRegisteredPostMeta: () => getRegisteredPostMeta, getSyncConnectionStatus: () => getSyncConnectionStatus, getTemplateId: () => getTemplateId, getUndoManager: () => getUndoManager, isCollaborationSupported: () => isCollaborationSupported }); var import_data9 = __toESM(require_data(), 1); // packages/core-data/build-module/utils/log-entity-deprecation.mjs var import_deprecated = __toESM(require_deprecated(), 1); var loggedAlready = false; function logEntityDeprecation(kind, name, functionName, { alternativeFunctionName, isShorthandSelector = false } = {}) { const deprecation = deprecatedEntities[kind]?.[name]; if (!deprecation) { return; } if (!loggedAlready) { const { alternative } = deprecation; const message = isShorthandSelector ? `'${functionName}'` : `The '${kind}', '${name}' entity (used via '${functionName}')`; let alternativeMessage = `the '${alternative.kind}', '${alternative.name}' entity`; if (alternativeFunctionName) { alternativeMessage += ` via the '${alternativeFunctionName}' function`; } (0, import_deprecated.default)(message, { ...deprecation, alternative: alternativeMessage }); } loggedAlready = true; setTimeout(() => { loggedAlready = false; }, 0); } // packages/core-data/build-module/private-selectors.mjs function getUndoManager(state) { return getSyncManager()?.undoManager ?? state.undoManager; } function getNavigationFallbackId(state) { return state.navigationFallbackId; } var getBlockPatternsForPostType = (0, import_data9.createRegistrySelector)( (select5) => (0, import_data9.createSelector)( (state, postType) => select5(STORE_NAME).getBlockPatterns().filter( ({ postTypes }) => !postTypes || Array.isArray(postTypes) && postTypes.includes(postType) ), () => [select5(STORE_NAME).getBlockPatterns()] ) ); var getEntityRecordsPermissions = (0, import_data9.createRegistrySelector)( (select5) => (0, import_data9.createSelector)( (state, kind, name, ids) => { const normalizedIds = Array.isArray(ids) ? ids : [ids]; return normalizedIds.map((id2) => ({ delete: select5(STORE_NAME).canUser("delete", { kind, name, id: id2 }), update: select5(STORE_NAME).canUser("update", { kind, name, id: id2 }) })); }, (state) => [state.userPermissions] ) ); function getEntityRecordPermissions(state, kind, name, id2) { logEntityDeprecation(kind, name, "getEntityRecordPermissions"); return getEntityRecordsPermissions(state, kind, name, id2)[0]; } function getRegisteredPostMeta(state, postType) { return state.registeredPostMeta?.[postType] ?? {}; } function normalizePageId(value) { if (!value || !["number", "string"].includes(typeof value)) { return null; } if (Number(value) === 0) { return null; } return value.toString(); } var getHomePage = (0, import_data9.createRegistrySelector)( (select5) => (0, import_data9.createSelector)( () => { const siteData = select5(STORE_NAME).getEntityRecord( "root", "__unstableBase" ); if (!siteData) { return null; } const homepageId = siteData?.show_on_front === "page" ? normalizePageId(siteData.page_on_front) : null; if (homepageId) { return { postType: "page", postId: homepageId }; } const frontPageTemplateId = select5( STORE_NAME ).getDefaultTemplateId({ slug: "front-page" }); if (!frontPageTemplateId) { return null; } return { postType: "wp_template", postId: frontPageTemplateId }; }, (state) => [ // Even though getDefaultTemplateId.shouldInvalidate returns true when root/site changes, // it doesn't seem to invalidate this cache, I'm not sure why. getEntityRecord(state, "root", "site"), getEntityRecord(state, "root", "__unstableBase"), getDefaultTemplateId(state, { slug: "front-page" }) ] ) ); var getPostsPageId = (0, import_data9.createRegistrySelector)((select5) => () => { const siteData = select5(STORE_NAME).getEntityRecord( "root", "__unstableBase" ); return siteData?.show_on_front === "page" ? normalizePageId(siteData.page_for_posts) : null; }); var getTemplateId = (0, import_data9.createRegistrySelector)( (select5) => (state, postType, postId) => { const homepage = unlock2(select5(STORE_NAME)).getHomePage(); if (!homepage) { return; } if (postType === "page" && postType === homepage?.postType && postId.toString() === homepage?.postId) { const templates = select5(STORE_NAME).getEntityRecords( "postType", "wp_template", { per_page: -1 } ); if (!templates) { return; } const id2 = templates.find(({ slug }) => slug === "front-page")?.id; if (id2) { return id2; } } const editedEntity = select5(STORE_NAME).getEditedEntityRecord( "postType", postType, postId ); if (!editedEntity) { return; } const postsPageId = unlock2(select5(STORE_NAME)).getPostsPageId(); if (postType === "page" && postsPageId === postId.toString()) { return select5(STORE_NAME).getDefaultTemplateId({ slug: "home" }); } const currentTemplateSlug = editedEntity.template; if (currentTemplateSlug) { const currentTemplate = select5(STORE_NAME).getEntityRecords("postType", "wp_template", { per_page: -1 })?.find(({ slug }) => slug === currentTemplateSlug); if (currentTemplate) { return currentTemplate.id; } } let slugToCheck; if (editedEntity.slug) { slugToCheck = postType === "page" ? `${postType}-${editedEntity.slug}` : `single-${postType}-${editedEntity.slug}`; } else { slugToCheck = postType === "page" ? "page" : `single-${postType}`; } return select5(STORE_NAME).getDefaultTemplateId({ slug: slugToCheck }); } ); function getEditorSettings(state) { return state.editorSettings; } function getEditorAssets(state) { return state.editorAssets; } function isCollaborationSupported(state) { return state.collaborationSupported; } function getSyncConnectionStatus(state) { if (!state.syncConnectionStatuses) { return void 0; } const PRIORITIZED_STATUSES = ["disconnected", "connecting", "connected"]; let coalesced; for (const status of Object.values(state.syncConnectionStatuses)) { if (!coalesced || PRIORITIZED_STATUSES.indexOf(status.status) < PRIORITIZED_STATUSES.indexOf(coalesced.status)) { coalesced = status; } } return coalesced; } // packages/core-data/build-module/selectors.mjs var EMPTY_OBJECT = {}; var isRequestingEmbedPreview = (0, import_data10.createRegistrySelector)( (select5) => (state, url) => { return select5(STORE_NAME).isResolving("getEmbedPreview", [ url ]); } ); function getAuthors(state, query) { (0, import_deprecated2.default)("select( 'core' ).getAuthors()", { since: "5.9", alternative: "select( 'core' ).getUsers({ who: 'authors' })" }); const path = (0, import_url2.addQueryArgs)( "/wp/v2/users/?who=authors&per_page=100", query ); return getUserQueryResults(state, path); } function getCurrentUser(state) { return state.currentUser; } var getUserQueryResults = (0, import_data10.createSelector)( (state, queryID) => { const queryResults = state.users.queries[queryID] ?? []; return queryResults.map((id2) => state.users.byId[id2]); }, (state, queryID) => [ state.users.queries[queryID], state.users.byId ] ); function getEntitiesByKind(state, kind) { (0, import_deprecated2.default)("wp.data.select( 'core' ).getEntitiesByKind()", { since: "6.0", alternative: "wp.data.select( 'core' ).getEntitiesConfig()" }); return getEntitiesConfig(state, kind); } var getEntitiesConfig = (0, import_data10.createSelector)( (state, kind) => state.entities.config.filter((entity2) => entity2.kind === kind), /* eslint-disable @typescript-eslint/no-unused-vars */ (state, kind) => state.entities.config /* eslint-enable @typescript-eslint/no-unused-vars */ ); function getEntity(state, kind, name) { (0, import_deprecated2.default)("wp.data.select( 'core' ).getEntity()", { since: "6.0", alternative: "wp.data.select( 'core' ).getEntityConfig()" }); return getEntityConfig(state, kind, name); } function getEntityConfig(state, kind, name) { logEntityDeprecation(kind, name, "getEntityConfig"); return state.entities.config?.find( (config) => config.kind === kind && config.name === name ); } var getEntityRecord = (0, import_data10.createSelector)( ((state, kind, name, key, query) => { logEntityDeprecation(kind, name, "getEntityRecord"); const queriedState = state.entities.records?.[kind]?.[name]?.queriedData; if (!queriedState) { return void 0; } const context = query?.context ?? "default"; if (!query || !query._fields) { if (!queriedState.itemIsComplete[context]?.[key]) { return void 0; } return queriedState.items[context][key]; } const item = queriedState.items[context]?.[key]; if (!item) { return item; } const filteredItem = {}; const fields = get_normalized_comma_separable_default(query._fields) ?? []; for (let f = 0; f < fields.length; f++) { const field = fields[f].split("."); let value = item; field.forEach((fieldName) => { value = value?.[fieldName]; }); setNestedValue(filteredItem, field, value); } return filteredItem; }), (state, kind, name, recordId, query) => { const context = query?.context ?? "default"; const queriedState = state.entities.records?.[kind]?.[name]?.queriedData; return [ queriedState?.items[context]?.[recordId], queriedState?.itemIsComplete[context]?.[recordId] ]; } ); getEntityRecord.__unstableNormalizeArgs = (args2) => { const newArgs = [...args2]; const recordKey = newArgs?.[2]; newArgs[2] = isNumericID(recordKey) ? Number(recordKey) : recordKey; return newArgs; }; function hasEntityRecord(state, kind, name, key, query) { const queriedState = state.entities.records?.[kind]?.[name]?.queriedData; if (!queriedState) { return false; } const context = query?.context ?? "default"; if (!query || !query._fields) { return !!queriedState.itemIsComplete[context]?.[key]; } const item = queriedState.items[context]?.[key]; if (!item) { return false; } const fields = get_normalized_comma_separable_default(query._fields) ?? []; for (let i = 0; i < fields.length; i++) { const path = fields[i].split("."); let value = item; for (let p = 0; p < path.length; p++) { const part = path[p]; if (!value || !Object.hasOwn(value, part)) { return false; } value = value[part]; } } return true; } function __experimentalGetEntityRecordNoResolver(state, kind, name, key) { return getEntityRecord(state, kind, name, key); } var getRawEntityRecord = (0, import_data10.createSelector)( (state, kind, name, key) => { logEntityDeprecation(kind, name, "getRawEntityRecord"); const record = getEntityRecord( state, kind, name, key ); return record && Object.keys(record).reduce((accumulator, _key) => { if (isRawAttribute(getEntityConfig(state, kind, name), _key)) { accumulator[_key] = record[_key]?.raw !== void 0 ? record[_key]?.raw : record[_key]; } else { accumulator[_key] = record[_key]; } return accumulator; }, {}); }, (state, kind, name, recordId, query) => { const context = query?.context ?? "default"; return [ state.entities.config, state.entities.records?.[kind]?.[name]?.queriedData?.items[context]?.[recordId], state.entities.records?.[kind]?.[name]?.queriedData?.itemIsComplete[context]?.[recordId] ]; } ); function hasEntityRecords(state, kind, name, query) { logEntityDeprecation(kind, name, "hasEntityRecords"); return Array.isArray(getEntityRecords(state, kind, name, query)); } var getEntityRecords = ((state, kind, name, query) => { logEntityDeprecation(kind, name, "getEntityRecords"); const queriedState = state.entities.records?.[kind]?.[name]?.queriedData; if (!queriedState) { return null; } return getQueriedItems(queriedState, query); }); var getEntityRecordsTotalItems = (state, kind, name, query) => { logEntityDeprecation(kind, name, "getEntityRecordsTotalItems"); const queriedState = state.entities.records?.[kind]?.[name]?.queriedData; if (!queriedState) { return null; } return getQueriedTotalItems(queriedState, query); }; var getEntityRecordsTotalPages = (state, kind, name, query) => { logEntityDeprecation(kind, name, "getEntityRecordsTotalPages"); const queriedState = state.entities.records?.[kind]?.[name]?.queriedData; if (!queriedState) { return null; } if (query?.per_page === -1) { return 1; } const totalItems = getQueriedTotalItems(queriedState, query); if (!totalItems) { return totalItems; } if (!query?.per_page) { return getQueriedTotalPages(queriedState, query); } return Math.ceil(totalItems / query.per_page); }; var __experimentalGetDirtyEntityRecords = (0, import_data10.createSelector)( (state) => { const { entities: { records } } = state; const dirtyRecords = []; Object.keys(records).forEach((kind) => { Object.keys(records[kind]).forEach((name) => { const primaryKeys = Object.keys(records[kind][name].edits).filter( (primaryKey) => ( // The entity record must exist (not be deleted), // and it must have edits. getEntityRecord(state, kind, name, primaryKey) && hasEditsForEntityRecord(state, kind, name, primaryKey) ) ); if (primaryKeys.length) { const entityConfig = getEntityConfig(state, kind, name); primaryKeys.forEach((primaryKey) => { const entityRecord = getEditedEntityRecord( state, kind, name, primaryKey ); dirtyRecords.push({ // We avoid using primaryKey because it's transformed into a string // when it's used as an object key. key: entityRecord ? entityRecord[entityConfig.key || DEFAULT_ENTITY_KEY] : void 0, title: entityConfig?.getTitle?.(entityRecord) || "", name, kind }); }); } }); }); return dirtyRecords; }, (state) => [state.entities.records] ); var __experimentalGetEntitiesBeingSaved = (0, import_data10.createSelector)( (state) => { const { entities: { records } } = state; const recordsBeingSaved = []; Object.keys(records).forEach((kind) => { Object.keys(records[kind]).forEach((name) => { const primaryKeys = Object.keys(records[kind][name].saving).filter( (primaryKey) => isSavingEntityRecord(state, kind, name, primaryKey) ); if (primaryKeys.length) { const entityConfig = getEntityConfig(state, kind, name); primaryKeys.forEach((primaryKey) => { const entityRecord = getEditedEntityRecord( state, kind, name, primaryKey ); recordsBeingSaved.push({ // We avoid using primaryKey because it's transformed into a string // when it's used as an object key. key: entityRecord ? entityRecord[entityConfig.key || DEFAULT_ENTITY_KEY] : void 0, title: entityConfig?.getTitle?.(entityRecord) || "", name, kind }); }); } }); }); return recordsBeingSaved; }, (state) => [state.entities.records] ); function getEntityRecordEdits(state, kind, name, recordId) { logEntityDeprecation(kind, name, "getEntityRecordEdits"); return state.entities.records?.[kind]?.[name]?.edits?.[recordId]; } var getEntityRecordNonTransientEdits = (0, import_data10.createSelector)( (state, kind, name, recordId) => { logEntityDeprecation(kind, name, "getEntityRecordNonTransientEdits"); const { transientEdits } = getEntityConfig(state, kind, name) || {}; const edits = getEntityRecordEdits(state, kind, name, recordId) || {}; if (!transientEdits) { return edits; } return Object.keys(edits).reduce((acc, key) => { if (!transientEdits[key]) { acc[key] = edits[key]; } return acc; }, {}); }, (state, kind, name, recordId) => [ state.entities.config, state.entities.records?.[kind]?.[name]?.edits?.[recordId] ] ); function hasEditsForEntityRecord(state, kind, name, recordId) { logEntityDeprecation(kind, name, "hasEditsForEntityRecord"); return isSavingEntityRecord(state, kind, name, recordId) || Object.keys( getEntityRecordNonTransientEdits(state, kind, name, recordId) ).length > 0; } var getEditedEntityRecord = (0, import_data10.createSelector)( (state, kind, name, recordId) => { logEntityDeprecation(kind, name, "getEditedEntityRecord"); const raw = getRawEntityRecord(state, kind, name, recordId); const edited = getEntityRecordEdits(state, kind, name, recordId); if (!raw && !edited) { return false; } return { ...raw, ...edited }; }, (state, kind, name, recordId, query) => { const context = query?.context ?? "default"; return [ state.entities.config, state.entities.records?.[kind]?.[name]?.queriedData.items[context]?.[recordId], state.entities.records?.[kind]?.[name]?.queriedData.itemIsComplete[context]?.[recordId], state.entities.records?.[kind]?.[name]?.edits?.[recordId] ]; } ); function isAutosavingEntityRecord(state, kind, name, recordId) { logEntityDeprecation(kind, name, "isAutosavingEntityRecord"); const { pending, isAutosave } = state.entities.records?.[kind]?.[name]?.saving?.[recordId] ?? {}; return Boolean(pending && isAutosave); } function isSavingEntityRecord(state, kind, name, recordId) { logEntityDeprecation(kind, name, "isSavingEntityRecord"); return state.entities.records?.[kind]?.[name]?.saving?.[recordId]?.pending ?? false; } function isDeletingEntityRecord(state, kind, name, recordId) { logEntityDeprecation(kind, name, "isDeletingEntityRecord"); return state.entities.records?.[kind]?.[name]?.deleting?.[recordId]?.pending ?? false; } function getLastEntitySaveError(state, kind, name, recordId) { logEntityDeprecation(kind, name, "getLastEntitySaveError"); return state.entities.records?.[kind]?.[name]?.saving?.[recordId]?.error; } function getLastEntityDeleteError(state, kind, name, recordId) { logEntityDeprecation(kind, name, "getLastEntityDeleteError"); return state.entities.records?.[kind]?.[name]?.deleting?.[recordId]?.error; } function getUndoEdit(state) { (0, import_deprecated2.default)("select( 'core' ).getUndoEdit()", { since: "6.3" }); return void 0; } function getRedoEdit(state) { (0, import_deprecated2.default)("select( 'core' ).getRedoEdit()", { since: "6.3" }); return void 0; } function hasUndo(state) { return getUndoManager(state).hasUndo(); } function hasRedo(state) { return getUndoManager(state).hasRedo(); } function getCurrentTheme(state) { if (!state.currentTheme) { return null; } return getEntityRecord(state, "root", "theme", state.currentTheme); } function __experimentalGetCurrentGlobalStylesId(state) { return state.currentGlobalStylesId; } function getThemeSupports(state) { return getCurrentTheme(state)?.theme_supports ?? EMPTY_OBJECT; } function getEmbedPreview(state, url) { return state.embedPreviews[url]; } function isPreviewEmbedFallback(state, url) { const preview = state.embedPreviews[url]; const oEmbedLinkCheck = '' + url + ""; if (!preview) { return false; } return preview.html === oEmbedLinkCheck; } function canUser(state, action, resource, id2) { const isEntity = typeof resource === "object"; if (isEntity && (!resource.kind || !resource.name)) { return false; } if (isEntity) { logEntityDeprecation(resource.kind, resource.name, "canUser"); } const key = getUserPermissionCacheKey(action, resource, id2); return state.userPermissions[key]; } function canUserEditEntityRecord(state, kind, name, recordId) { (0, import_deprecated2.default)(`wp.data.select( 'core' ).canUserEditEntityRecord()`, { since: "6.7", alternative: `wp.data.select( 'core' ).canUser( 'update', { kind, name, id } )` }); return canUser(state, "update", { kind, name, id: recordId }); } function getAutosaves(state, postType, postId) { return state.autosaves[postId]; } function getAutosave(state, postType, postId, authorId) { if (authorId === void 0) { return; } const autosaves2 = state.autosaves[postId]; return autosaves2?.find( (autosave) => autosave.author === authorId ); } var hasFetchedAutosaves = (0, import_data10.createRegistrySelector)( (select5) => (state, postType, postId) => { return select5(STORE_NAME).hasFinishedResolution("getAutosaves", [ postType, postId ]); } ); function getReferenceByDistinctEdits(state) { return state.editsReference; } function __experimentalGetCurrentThemeBaseGlobalStyles(state) { const currentTheme2 = getCurrentTheme(state); if (!currentTheme2) { return null; } return state.themeBaseGlobalStyles[currentTheme2.stylesheet]; } function __experimentalGetCurrentThemeGlobalStylesVariations(state) { const currentTheme2 = getCurrentTheme(state); if (!currentTheme2) { return null; } return state.themeGlobalStyleVariations[currentTheme2.stylesheet]; } function getBlockPatterns(state) { return state.blockPatterns; } function getBlockPatternCategories(state) { return state.blockPatternCategories; } function getUserPatternCategories(state) { return state.userPatternCategories; } function getCurrentThemeGlobalStylesRevisions(state) { (0, import_deprecated2.default)("select( 'core' ).getCurrentThemeGlobalStylesRevisions()", { since: "6.5.0", alternative: "select( 'core' ).getRevisions( 'root', 'globalStyles', ${ recordKey } )" }); const currentGlobalStylesId2 = __experimentalGetCurrentGlobalStylesId(state); if (!currentGlobalStylesId2) { return null; } return state.themeGlobalStyleRevisions[currentGlobalStylesId2]; } function getDefaultTemplateId(state, query) { return state.defaultTemplates[JSON.stringify(query)]; } var getRevisions = (state, kind, name, recordKey, query) => { logEntityDeprecation(kind, name, "getRevisions"); const queriedStateRevisions = state.entities.records?.[kind]?.[name]?.revisions?.[recordKey]; if (!queriedStateRevisions) { return null; } return getQueriedItems(queriedStateRevisions, query); }; var getRevision = (0, import_data10.createSelector)( (state, kind, name, recordKey, revisionKey, query) => { logEntityDeprecation(kind, name, "getRevision"); const queriedState = state.entities.records?.[kind]?.[name]?.revisions?.[recordKey]; if (!queriedState) { return void 0; } const context = query?.context ?? "default"; if (!query || !query._fields) { if (!queriedState.itemIsComplete[context]?.[revisionKey]) { return void 0; } return queriedState.items[context][revisionKey]; } const item = queriedState.items[context]?.[revisionKey]; if (!item) { return item; } const filteredItem = {}; const fields = get_normalized_comma_separable_default(query._fields) ?? []; for (let f = 0; f < fields.length; f++) { const field = fields[f].split("."); let value = item; field.forEach((fieldName) => { value = value?.[fieldName]; }); setNestedValue(filteredItem, field, value); } return filteredItem; }, (state, kind, name, recordKey, revisionKey, query) => { const context = query?.context ?? "default"; const queriedState = state.entities.records?.[kind]?.[name]?.revisions?.[recordKey]; return [ queriedState?.items?.[context]?.[revisionKey], queriedState?.itemIsComplete?.[context]?.[revisionKey] ]; } ); // packages/core-data/build-module/actions.mjs var actions_exports = {}; __export(actions_exports, { __experimentalBatch: () => __experimentalBatch, __experimentalReceiveCurrentGlobalStylesId: () => __experimentalReceiveCurrentGlobalStylesId, __experimentalReceiveThemeBaseGlobalStyles: () => __experimentalReceiveThemeBaseGlobalStyles, __experimentalReceiveThemeGlobalStyleVariations: () => __experimentalReceiveThemeGlobalStyleVariations, __experimentalSaveSpecifiedEntityEdits: () => __experimentalSaveSpecifiedEntityEdits, __unstableCreateUndoLevel: () => __unstableCreateUndoLevel, addEntities: () => addEntities, clearEntityRecordEdits: () => clearEntityRecordEdits, deleteEntityRecord: () => deleteEntityRecord, editEntityRecord: () => editEntityRecord, receiveAutosaves: () => receiveAutosaves, receiveCurrentTheme: () => receiveCurrentTheme, receiveCurrentUser: () => receiveCurrentUser, receiveDefaultTemplateId: () => receiveDefaultTemplateId, receiveEmbedPreview: () => receiveEmbedPreview, receiveEntityRecords: () => receiveEntityRecords, receiveNavigationFallbackId: () => receiveNavigationFallbackId, receiveRevisions: () => receiveRevisions, receiveThemeGlobalStyleRevisions: () => receiveThemeGlobalStyleRevisions, receiveThemeSupports: () => receiveThemeSupports, receiveUploadPermissions: () => receiveUploadPermissions, receiveUserPermission: () => receiveUserPermission, receiveUserPermissions: () => receiveUserPermissions, receiveUserQuery: () => receiveUserQuery, redo: () => redo, saveEditedEntityRecord: () => saveEditedEntityRecord, saveEntityRecord: () => saveEntityRecord, undo: () => undo }); var import_es67 = __toESM(require_es6(), 1); var import_api_fetch4 = __toESM(require_api_fetch(), 1); var import_url3 = __toESM(require_url(), 1); var import_deprecated3 = __toESM(require_deprecated(), 1); // packages/core-data/build-module/batch/default-processor.mjs var import_api_fetch3 = __toESM(require_api_fetch(), 1); var maxItems = null; function chunk(arr, chunkSize) { const tmp = [...arr]; const cache3 = []; while (tmp.length) { cache3.push(tmp.splice(0, chunkSize)); } return cache3; } async function defaultProcessor(requests) { if (maxItems === null) { const preflightResponse = await (0, import_api_fetch3.default)({ path: "/batch/v1", method: "OPTIONS" }); maxItems = preflightResponse.endpoints[0].args.requests.maxItems; } const results = []; for (const batchRequests of chunk(requests, maxItems)) { const batchResponse = await (0, import_api_fetch3.default)({ path: "/batch/v1", method: "POST", data: { validation: "require-all-validate", requests: batchRequests.map((request) => ({ path: request.path, body: request.data, // Rename 'data' to 'body'. method: request.method, headers: request.headers })) } }); let batchResults; if (batchResponse.failed) { batchResults = batchResponse.responses.map((response) => ({ error: response?.body })); } else { batchResults = batchResponse.responses.map((response) => { const result = {}; if (response.status >= 200 && response.status < 300) { result.output = response.body; } else { result.error = response.body; } return result; }); } results.push(...batchResults); } return results; } // packages/core-data/build-module/batch/create-batch.mjs function createBatch(processor = defaultProcessor) { let lastId = 0; let queue = []; const pending = new ObservableSet(); return { /** * Adds an input to the batch and returns a promise that is resolved or * rejected when the input is processed by `batch.run()`. * * You may also pass a thunk which allows inputs to be added * asynchronously. * * ``` * // Both are allowed: * batch.add( { path: '/v1/books', ... } ); * batch.add( ( add ) => add( { path: '/v1/books', ... } ) ); * ``` * * If a thunk is passed, `batch.run()` will pause until either: * * - The thunk calls its `add` argument, or; * - The thunk returns a promise and that promise resolves, or; * - The thunk returns a non-promise. * * @param {any|Function} inputOrThunk Input to add or thunk to execute. * * @return {Promise|any} If given an input, returns a promise that * is resolved or rejected when the batch is * processed. If given a thunk, returns the return * value of that thunk. */ add(inputOrThunk) { const id2 = ++lastId; pending.add(id2); const add = (input) => new Promise((resolve, reject) => { queue.push({ input, resolve, reject }); pending.delete(id2); }); if (typeof inputOrThunk === "function") { return Promise.resolve(inputOrThunk(add)).finally(() => { pending.delete(id2); }); } return add(inputOrThunk); }, /** * Runs the batch. This calls `batchProcessor` and resolves or rejects * all promises returned by `add()`. * * @return {Promise} A promise that resolves to a boolean that is true * if the processor returned no errors. */ async run() { if (pending.size) { await new Promise((resolve) => { const unsubscribe = pending.subscribe(() => { if (!pending.size) { unsubscribe(); resolve(void 0); } }); }); } let results; try { results = await processor( queue.map(({ input }) => input) ); if (results.length !== queue.length) { throw new Error( "run: Array returned by processor must be same size as input array." ); } } catch (error) { for (const { reject } of queue) { reject(error); } throw error; } let isSuccess = true; results.forEach((result, key) => { const queueItem = queue[key]; if (result?.error) { queueItem?.reject(result.error); isSuccess = false; } else { queueItem?.resolve(result?.output ?? result); } }); queue = []; return isSuccess; } }; } var ObservableSet = class { constructor(...args2) { this.set = new Set(...args2); this.subscribers = /* @__PURE__ */ new Set(); } get size() { return this.set.size; } add(value) { this.set.add(value); this.subscribers.forEach((subscriber) => subscriber()); return this; } delete(value) { const isSuccess = this.set.delete(value); this.subscribers.forEach((subscriber) => subscriber()); return isSuccess; } subscribe(subscriber) { this.subscribers.add(subscriber); return () => { this.subscribers.delete(subscriber); }; } }; // packages/core-data/build-module/actions.mjs function addTitleToAutoDraft(record) { return record.status === "auto-draft" ? { ...record, title: "" } : record; } function receiveUserQuery(queryID, users2) { return { type: "RECEIVE_USER_QUERY", users: Array.isArray(users2) ? users2 : [users2], queryID }; } function receiveCurrentUser(currentUser2) { return { type: "RECEIVE_CURRENT_USER", currentUser: currentUser2 }; } function addEntities(entities2) { return { type: "ADD_ENTITIES", entities: entities2 }; } function receiveEntityRecords(kind, name, records, query = void 0, invalidateCache = false, edits = void 0, meta = void 0) { if (kind === "postType") { records = Array.isArray(records) ? records.map(addTitleToAutoDraft) : addTitleToAutoDraft(records); } let action; if (query) { action = receiveQueriedItems(records, query, edits, meta); } else { action = receiveItems(records, edits, meta); } return { ...action, kind, name, invalidateCache }; } function receiveCurrentTheme(currentTheme2) { return { type: "RECEIVE_CURRENT_THEME", currentTheme: currentTheme2 }; } function __experimentalReceiveCurrentGlobalStylesId(currentGlobalStylesId2) { return { type: "RECEIVE_CURRENT_GLOBAL_STYLES_ID", id: currentGlobalStylesId2 }; } function __experimentalReceiveThemeBaseGlobalStyles(stylesheet, globalStyles) { return { type: "RECEIVE_THEME_GLOBAL_STYLES", stylesheet, globalStyles }; } function __experimentalReceiveThemeGlobalStyleVariations(stylesheet, variations) { return { type: "RECEIVE_THEME_GLOBAL_STYLE_VARIATIONS", stylesheet, variations }; } function receiveThemeSupports() { (0, import_deprecated3.default)("wp.data.dispatch( 'core' ).receiveThemeSupports", { since: "5.9" }); return { type: "DO_NOTHING" }; } function receiveThemeGlobalStyleRevisions(currentId, revisions) { (0, import_deprecated3.default)( "wp.data.dispatch( 'core' ).receiveThemeGlobalStyleRevisions()", { since: "6.5.0", alternative: "wp.data.dispatch( 'core' ).receiveRevisions" } ); return { type: "RECEIVE_THEME_GLOBAL_STYLE_REVISIONS", currentId, revisions }; } function receiveEmbedPreview(url, preview) { return { type: "RECEIVE_EMBED_PREVIEW", url, preview }; } var deleteEntityRecord = (kind, name, recordId, query, { __unstableFetch = import_api_fetch4.default, throwOnError = false } = {}) => async ({ dispatch: dispatch3, resolveSelect: resolveSelect2 }) => { logEntityDeprecation(kind, name, "deleteEntityRecord"); const configs = await resolveSelect2.getEntitiesConfig(kind); const entityConfig = configs.find( (config) => config.kind === kind && config.name === name ); let error; let deletedRecord = false; if (!entityConfig) { return; } const lock3 = await dispatch3.__unstableAcquireStoreLock( STORE_NAME, ["entities", "records", kind, name, recordId], { exclusive: true } ); try { dispatch3({ type: "DELETE_ENTITY_RECORD_START", kind, name, recordId }); let hasError = false; let { baseURL } = entityConfig; if (kind === "postType" && name === "wp_template" && (recordId && typeof recordId === "string" && !/^\d+$/.test(recordId) || !window?.__experimentalTemplateActivate)) { baseURL = baseURL.slice(0, baseURL.lastIndexOf("/")) + "/templates"; } try { let path = `${baseURL}/${recordId}`; if (query) { path = (0, import_url3.addQueryArgs)(path, query); } deletedRecord = await __unstableFetch({ path, method: "DELETE" }); await dispatch3(removeItems(kind, name, recordId, true)); if (entityConfig.syncConfig) { const objectType = `${kind}/${name}`; const objectId = recordId; getSyncManager()?.unload(objectType, objectId); } } catch (_error) { hasError = true; error = _error; } dispatch3({ type: "DELETE_ENTITY_RECORD_FINISH", kind, name, recordId, error }); if (hasError && throwOnError) { throw error; } return deletedRecord; } finally { dispatch3.__unstableReleaseStoreLock(lock3); } }; var editEntityRecord = (kind, name, recordId, edits, options = {}) => ({ select: select5, dispatch: dispatch3 }) => { logEntityDeprecation(kind, name, "editEntityRecord"); const entityConfig = select5.getEntityConfig(kind, name); if (!entityConfig) { throw new Error( `The entity being edited (${kind}, ${name}) does not have a loaded config.` ); } const { mergedEdits = {} } = entityConfig; const record = select5.getRawEntityRecord(kind, name, recordId); const editedRecord = select5.getEditedEntityRecord( kind, name, recordId ); const editsWithMerges = Object.keys(edits).reduce((acc, key) => { acc[key] = mergedEdits[key] ? { ...editedRecord[key], ...edits[key] } : edits[key]; return acc; }, {}); const edit = { kind, name, recordId, // Clear edits when they are equal to their persisted counterparts // so that the property is not considered dirty. edits: Object.keys(edits).reduce((acc, key) => { const recordValue = record[key]; const value = editsWithMerges[key]; acc[key] = (0, import_es67.default)(recordValue, value) ? void 0 : value; return acc; }, {}) }; if (entityConfig.syncConfig) { const objectType = `${kind}/${name}`; const objectId = recordId; const isNewUndoLevel = options.undoIgnore ? false : !options.isCached; const origin2 = options.undoIgnore ? LOCAL_UNDO_IGNORED_ORIGIN2 : LOCAL_EDITOR_ORIGIN2; getSyncManager()?.update( objectType, objectId, editsWithMerges, origin2, { isNewUndoLevel } ); } if (!options.undoIgnore) { select5.getUndoManager().addRecord( [ { id: { kind, name, recordId }, changes: Object.keys(edits).reduce((acc, key) => { acc[key] = { from: editedRecord[key], to: edits[key] }; return acc; }, {}) } ], options.isCached ); } dispatch3({ type: "EDIT_ENTITY_RECORD", ...edit }); }; var clearEntityRecordEdits = (kind, name, recordId) => ({ select: select5, dispatch: dispatch3 }) => { const entityConfig = select5.getEntityConfig(kind, name); logEntityDeprecation(kind, name, "clearEntityRecordEdits"); if (!entityConfig) { throw new Error( `The entity being edited (${kind}, ${name}) does not have a loaded config.` ); } const currentEdits = select5.getEntityRecordEdits( kind, name, recordId ); if (!currentEdits) { return; } const clearedEdits = Object.keys(currentEdits).reduce( (acc, key) => { acc[key] = void 0; return acc; }, {} ); dispatch3({ type: "EDIT_ENTITY_RECORD", kind, name, recordId, edits: clearedEdits }); }; var undo = () => ({ select: select5, dispatch: dispatch3 }) => { const undoRecord = select5.getUndoManager().undo(); if (!undoRecord) { return; } dispatch3({ type: "UNDO", record: undoRecord }); }; var redo = () => ({ select: select5, dispatch: dispatch3 }) => { const redoRecord = select5.getUndoManager().redo(); if (!redoRecord) { return; } dispatch3({ type: "REDO", record: redoRecord }); }; var __unstableCreateUndoLevel = () => ({ select: select5 }) => { select5.getUndoManager().addRecord(); }; var saveEntityRecord = (kind, name, record, { isAutosave = false, __unstableFetch = import_api_fetch4.default, throwOnError = false } = {}) => async ({ select: select5, resolveSelect: resolveSelect2, dispatch: dispatch3 }) => { logEntityDeprecation(kind, name, "saveEntityRecord"); const configs = await resolveSelect2.getEntitiesConfig(kind); const entityConfig = configs.find( (config) => config.kind === kind && config.name === name ); if (!entityConfig) { return; } const entityIdKey = entityConfig.key ?? DEFAULT_ENTITY_KEY; const recordId = record[entityIdKey]; const isNewRecord = !!entityIdKey && !recordId; const lock3 = await dispatch3.__unstableAcquireStoreLock( STORE_NAME, ["entities", "records", kind, name, recordId || v4_default()], { exclusive: true } ); try { for (const [key, value] of Object.entries(record)) { if (typeof value === "function") { const evaluatedValue = value( select5.getEditedEntityRecord(kind, name, recordId) ); dispatch3.editEntityRecord( kind, name, recordId, { [key]: evaluatedValue }, { undoIgnore: true } ); record[key] = evaluatedValue; } } dispatch3({ type: "SAVE_ENTITY_RECORD_START", kind, name, recordId, isAutosave }); let updatedRecord; let error; let hasError = false; let { baseURL } = entityConfig; if (kind === "postType" && name === "wp_template" && (recordId && typeof recordId === "string" && !/^\d+$/.test(recordId) || !window?.__experimentalTemplateActivate)) { baseURL = baseURL.slice(0, baseURL.lastIndexOf("/")) + "/templates"; } try { const path = `${baseURL}${recordId ? "/" + recordId : ""}`; const persistedRecord = !isNewRecord ? select5.getRawEntityRecord(kind, name, recordId) : {}; if (isAutosave) { const currentUser2 = select5.getCurrentUser(); const currentUserId = currentUser2 ? currentUser2.id : void 0; const autosavePost = await resolveSelect2.getAutosave( persistedRecord.type, persistedRecord.id, currentUserId ); let data = { ...persistedRecord, ...autosavePost, ...record }; data = Object.keys(data).reduce( (acc, key) => { if ([ "title", "excerpt", "content", "meta" ].includes(key)) { acc[key] = data[key]; } return acc; }, { // Do not update the `status` if we have edited it when auto saving. // It's very important to let the user explicitly save this change, // because it can lead to unexpected results. An example would be to // have a draft post and change the status to publish. status: data.status === "auto-draft" ? "draft" : void 0 } ); updatedRecord = await __unstableFetch({ path: `${path}/autosaves`, method: "POST", data }); if (persistedRecord.id === updatedRecord.id) { let newRecord = { ...persistedRecord, ...data, ...updatedRecord }; newRecord = Object.keys(newRecord).reduce( (acc, key) => { if (["title", "excerpt", "content"].includes( key )) { acc[key] = newRecord[key]; } else if (key === "status") { acc[key] = persistedRecord.status === "auto-draft" && newRecord.status === "draft" ? newRecord.status : persistedRecord.status; } else { acc[key] = persistedRecord[key]; } return acc; }, {} ); dispatch3.receiveEntityRecords( kind, name, newRecord, void 0, true ); } else { dispatch3.receiveAutosaves( persistedRecord.id, updatedRecord ); } } else { let edits = record; if (entityConfig.__unstablePrePersist) { edits = { ...edits, ...await entityConfig.__unstablePrePersist( persistedRecord, edits ) }; } updatedRecord = await __unstableFetch({ path, method: recordId ? "PUT" : "POST", data: edits }); dispatch3.receiveEntityRecords( kind, name, updatedRecord, void 0, true, edits ); if (entityConfig.syncConfig) { getSyncManager()?.update( `${kind}/${name}`, recordId, updatedRecord, LOCAL_UNDO_IGNORED_ORIGIN2, { isSave: true } ); } } } catch (_error) { hasError = true; error = _error; } dispatch3({ type: "SAVE_ENTITY_RECORD_FINISH", kind, name, recordId, error, isAutosave }); if (hasError && throwOnError) { throw error; } return updatedRecord; } finally { dispatch3.__unstableReleaseStoreLock(lock3); } }; var __experimentalBatch = (requests) => async ({ dispatch: dispatch3 }) => { const batch = createBatch(); const api = { saveEntityRecord(kind, name, record, options) { return batch.add( (add) => dispatch3.saveEntityRecord(kind, name, record, { ...options, __unstableFetch: add }) ); }, saveEditedEntityRecord(kind, name, recordId, options) { return batch.add( (add) => dispatch3.saveEditedEntityRecord(kind, name, recordId, { ...options, __unstableFetch: add }) ); }, deleteEntityRecord(kind, name, recordId, query, options) { return batch.add( (add) => dispatch3.deleteEntityRecord(kind, name, recordId, query, { ...options, __unstableFetch: add }) ); } }; const resultPromises = requests.map((request) => request(api)); const [, ...results] = await Promise.all([ batch.run(), ...resultPromises ]); return results; }; var saveEditedEntityRecord = (kind, name, recordId, options) => async ({ select: select5, dispatch: dispatch3, resolveSelect: resolveSelect2 }) => { logEntityDeprecation(kind, name, "saveEditedEntityRecord"); if (!select5.hasEditsForEntityRecord(kind, name, recordId)) { return; } const configs = await resolveSelect2.getEntitiesConfig(kind); const entityConfig = configs.find( (config) => config.kind === kind && config.name === name ); if (!entityConfig) { return; } const entityIdKey = entityConfig.key || DEFAULT_ENTITY_KEY; const edits = select5.getEntityRecordNonTransientEdits( kind, name, recordId ); const record = { [entityIdKey]: recordId, ...edits }; return await dispatch3.saveEntityRecord(kind, name, record, options); }; var __experimentalSaveSpecifiedEntityEdits = (kind, name, recordId, itemsToSave, options) => async ({ select: select5, dispatch: dispatch3, resolveSelect: resolveSelect2 }) => { logEntityDeprecation( kind, name, "__experimentalSaveSpecifiedEntityEdits" ); if (!select5.hasEditsForEntityRecord(kind, name, recordId)) { return; } const edits = select5.getEntityRecordNonTransientEdits( kind, name, recordId ); const editsToSave = {}; for (const item of itemsToSave) { setNestedValue(editsToSave, item, getNestedValue(edits, item)); } const configs = await resolveSelect2.getEntitiesConfig(kind); const entityConfig = configs.find( (config) => config.kind === kind && config.name === name ); const entityIdKey = entityConfig?.key || DEFAULT_ENTITY_KEY; if (recordId) { editsToSave[entityIdKey] = recordId; } return await dispatch3.saveEntityRecord( kind, name, editsToSave, options ); }; function receiveUploadPermissions(hasUploadPermissions) { (0, import_deprecated3.default)("wp.data.dispatch( 'core' ).receiveUploadPermissions", { since: "5.9", alternative: "receiveUserPermission" }); return receiveUserPermission("create/media", hasUploadPermissions); } function receiveUserPermission(key, isAllowed) { return { type: "RECEIVE_USER_PERMISSION", key, isAllowed }; } function receiveUserPermissions(permissions) { return { type: "RECEIVE_USER_PERMISSIONS", permissions }; } function receiveAutosaves(postId, autosaves2) { return { type: "RECEIVE_AUTOSAVES", postId, autosaves: Array.isArray(autosaves2) ? autosaves2 : [autosaves2] }; } function receiveNavigationFallbackId(fallbackId) { return { type: "RECEIVE_NAVIGATION_FALLBACK_ID", fallbackId }; } function receiveDefaultTemplateId(query, templateId) { return { type: "RECEIVE_DEFAULT_TEMPLATE", query, templateId }; } var receiveRevisions = (kind, name, recordKey, records, query, invalidateCache = false, meta) => async ({ dispatch: dispatch3, resolveSelect: resolveSelect2 }) => { logEntityDeprecation(kind, name, "receiveRevisions"); const configs = await resolveSelect2.getEntitiesConfig(kind); const entityConfig = configs.find( (config) => config.kind === kind && config.name === name ); const key = entityConfig && entityConfig?.revisionKey ? entityConfig.revisionKey : DEFAULT_ENTITY_KEY; dispatch3({ type: "RECEIVE_ITEM_REVISIONS", key, items: records, recordKey, meta, query, kind, name, invalidateCache }); }; // packages/core-data/build-module/private-actions.mjs var private_actions_exports = {}; __export(private_actions_exports, { editMediaEntity: () => editMediaEntity, receiveEditorAssets: () => receiveEditorAssets, receiveEditorSettings: () => receiveEditorSettings, receiveRegisteredPostMeta: () => receiveRegisteredPostMeta, setCollaborationSupported: () => setCollaborationSupported, setSyncConnectionStatus: () => setSyncConnectionStatus }); var import_api_fetch5 = __toESM(require_api_fetch(), 1); function receiveRegisteredPostMeta(postType, registeredPostMeta2) { return { type: "RECEIVE_REGISTERED_POST_META", postType, registeredPostMeta: registeredPostMeta2 }; } var editMediaEntity = (recordId, edits = {}, { __unstableFetch = import_api_fetch5.default, throwOnError = false } = {}) => async ({ dispatch: dispatch3, resolveSelect: resolveSelect2 }) => { if (!recordId) { return; } const kind = "postType"; const name = "attachment"; const configs = await resolveSelect2.getEntitiesConfig(kind); const entityConfig = configs.find( (config) => config.kind === kind && config.name === name ); if (!entityConfig) { return; } const lock3 = await dispatch3.__unstableAcquireStoreLock( STORE_NAME, ["entities", "records", kind, name, recordId], { exclusive: true } ); let updatedRecord; let error; let hasError = false; try { dispatch3({ type: "SAVE_ENTITY_RECORD_START", kind, name, recordId }); try { const path = `${entityConfig.baseURL}/${recordId}/edit`; const newRecord = await __unstableFetch({ path, method: "POST", data: { ...edits } }); if (newRecord) { dispatch3.receiveEntityRecords( kind, name, newRecord, void 0, true, void 0, void 0 ); updatedRecord = newRecord; } } catch (e) { error = e; hasError = true; } dispatch3({ type: "SAVE_ENTITY_RECORD_FINISH", kind, name, recordId, error }); if (hasError && throwOnError) { throw error; } return updatedRecord; } finally { dispatch3.__unstableReleaseStoreLock(lock3); } }; function receiveEditorSettings(settings) { return { type: "RECEIVE_EDITOR_SETTINGS", settings }; } function receiveEditorAssets(assets) { return { type: "RECEIVE_EDITOR_ASSETS", assets }; } var setCollaborationSupported = (supported) => ({ dispatch: dispatch3 }) => { dispatch3({ type: "SET_COLLABORATION_SUPPORTED", supported }); }; function setSyncConnectionStatus(kind, name, key, status) { if (!status) { return { type: "CLEAR_SYNC_CONNECTION_STATUS", kind, name, key }; } return { type: "SET_SYNC_CONNECTION_STATUS", kind, name, key, status }; } // packages/core-data/build-module/resolvers.mjs var resolvers_exports = {}; __export(resolvers_exports, { __experimentalGetCurrentGlobalStylesId: () => __experimentalGetCurrentGlobalStylesId2, __experimentalGetCurrentThemeBaseGlobalStyles: () => __experimentalGetCurrentThemeBaseGlobalStyles2, __experimentalGetCurrentThemeGlobalStylesVariations: () => __experimentalGetCurrentThemeGlobalStylesVariations2, canUser: () => canUser2, canUserEditEntityRecord: () => canUserEditEntityRecord2, getAuthors: () => getAuthors2, getAutosave: () => getAutosave2, getAutosaves: () => getAutosaves2, getBlockPatternCategories: () => getBlockPatternCategories2, getBlockPatterns: () => getBlockPatterns2, getCurrentTheme: () => getCurrentTheme2, getCurrentThemeGlobalStylesRevisions: () => getCurrentThemeGlobalStylesRevisions2, getCurrentUser: () => getCurrentUser2, getDefaultTemplateId: () => getDefaultTemplateId2, getEditedEntityRecord: () => getEditedEntityRecord2, getEditorAssets: () => getEditorAssets2, getEditorSettings: () => getEditorSettings2, getEmbedPreview: () => getEmbedPreview2, getEntitiesConfig: () => getEntitiesConfig2, getEntityRecord: () => getEntityRecord2, getEntityRecords: () => getEntityRecords2, getEntityRecordsTotalItems: () => getEntityRecordsTotalItems2, getEntityRecordsTotalPages: () => getEntityRecordsTotalPages2, getNavigationFallbackId: () => getNavigationFallbackId2, getRawEntityRecord: () => getRawEntityRecord2, getRegisteredPostMeta: () => getRegisteredPostMeta2, getRevision: () => getRevision2, getRevisions: () => getRevisions2, getThemeSupports: () => getThemeSupports2, getUserPatternCategories: () => getUserPatternCategories2 }); var import_url6 = __toESM(require_url(), 1); var import_html_entities2 = __toESM(require_html_entities(), 1); var import_api_fetch9 = __toESM(require_api_fetch(), 1); // packages/core-data/build-module/fetch/index.mjs var import_api_fetch8 = __toESM(require_api_fetch(), 1); // packages/core-data/build-module/fetch/__experimental-fetch-link-suggestions.mjs var import_api_fetch6 = __toESM(require_api_fetch(), 1); var import_url4 = __toESM(require_url(), 1); var import_html_entities = __toESM(require_html_entities(), 1); var import_i18n2 = __toESM(require_i18n(), 1); async function fetchLinkSuggestions(search, searchOptions = {}, editorSettings2 = {}) { const searchOptionsToUse = searchOptions.isInitialSuggestions && searchOptions.initialSuggestionsSearchOptions ? { ...searchOptions, ...searchOptions.initialSuggestionsSearchOptions } : searchOptions; const { type, subtype, page, perPage = searchOptions.isInitialSuggestions ? 3 : 20 } = searchOptionsToUse; const { disablePostFormats = false } = editorSettings2; const queries2 = []; if (!type || type === "post") { queries2.push( (0, import_api_fetch6.default)({ path: (0, import_url4.addQueryArgs)("/wp/v2/search", { search, page, per_page: perPage, type: "post", subtype }) }).then((results2) => { return results2.map((result) => { return { id: result.id, url: result.url, title: (0, import_html_entities.decodeEntities)(result.title || "") || (0, import_i18n2.__)("(no title)"), type: result.subtype || result.type, kind: "post-type" }; }); }).catch(() => []) // Fail by returning no results. ); } if (!type || type === "term") { queries2.push( (0, import_api_fetch6.default)({ path: (0, import_url4.addQueryArgs)("/wp/v2/search", { search, page, per_page: perPage, type: "term", subtype }) }).then((results2) => { return results2.map((result) => { return { id: result.id, url: result.url, title: (0, import_html_entities.decodeEntities)(result.title || "") || (0, import_i18n2.__)("(no title)"), type: result.subtype || result.type, kind: "taxonomy" }; }); }).catch(() => []) // Fail by returning no results. ); } if (!disablePostFormats && (!type || type === "post-format")) { queries2.push( (0, import_api_fetch6.default)({ path: (0, import_url4.addQueryArgs)("/wp/v2/search", { search, page, per_page: perPage, type: "post-format", subtype }) }).then((results2) => { return results2.map((result) => { return { id: result.id, url: result.url, title: (0, import_html_entities.decodeEntities)(result.title || "") || (0, import_i18n2.__)("(no title)"), type: result.subtype || result.type, kind: "taxonomy" }; }); }).catch(() => []) // Fail by returning no results. ); } if (!type || type === "attachment") { queries2.push( (0, import_api_fetch6.default)({ path: (0, import_url4.addQueryArgs)("/wp/v2/media", { search, page, per_page: perPage }) }).then((results2) => { return results2.map((result) => { return { id: result.id, url: result.source_url, title: (0, import_html_entities.decodeEntities)(result.title.rendered || "") || (0, import_i18n2.__)("(no title)"), type: result.type, kind: "media" }; }); }).catch(() => []) // Fail by returning no results. ); } const responses = await Promise.all(queries2); let results = responses.flat(); results = results.filter((result) => !!result.id); results = sortResults(results, search); results = results.slice(0, perPage); return results; } function sortResults(results, search) { const searchTokens = tokenize2(search); const scores = {}; for (const result of results) { if (result.title) { const titleTokens = tokenize2(result.title); const exactMatchingTokens = titleTokens.filter( (titleToken) => searchTokens.some( (searchToken) => titleToken === searchToken ) ); const subMatchingTokens = titleTokens.filter( (titleToken) => searchTokens.some( (searchToken) => titleToken !== searchToken && titleToken.includes(searchToken) ) ); const exactMatchScore = exactMatchingTokens.length / titleTokens.length * 10; const subMatchScore = subMatchingTokens.length / titleTokens.length; scores[result.id] = exactMatchScore + subMatchScore; } else { scores[result.id] = 0; } } return results.sort((a, b) => scores[b.id] - scores[a.id]); } function tokenize2(text2) { return text2.toLowerCase().match(/[\p{L}\p{N}]+/gu) || []; } // packages/core-data/build-module/fetch/__experimental-fetch-url-data.mjs var import_api_fetch7 = __toESM(require_api_fetch(), 1); var import_url5 = __toESM(require_url(), 1); var CACHE = /* @__PURE__ */ new Map(); var fetchUrlData = async (url, options = {}) => { const endpoint = "/wp-block-editor/v1/url-details"; const args2 = { url: (0, import_url5.prependHTTP)(url) }; if (!(0, import_url5.isURL)(url)) { return Promise.reject(`${url} is not a valid URL.`); } const protocol = (0, import_url5.getProtocol)(url); if (!protocol || !(0, import_url5.isValidProtocol)(protocol) || !protocol.startsWith("http") || !/^https?:\/\/[^\/\s]/i.test(url)) { return Promise.reject( `${url} does not have a valid protocol. URLs must be "http" based` ); } if (CACHE.has(url)) { return CACHE.get(url); } return (0, import_api_fetch7.default)({ path: (0, import_url5.addQueryArgs)(endpoint, args2), ...options }).then((res) => { CACHE.set(url, res); return res; }); }; var experimental_fetch_url_data_default = fetchUrlData; // packages/core-data/build-module/fetch/index.mjs async function fetchBlockPatterns() { const restPatterns = await (0, import_api_fetch8.default)({ path: "/wp/v2/block-patterns/patterns" }); if (!restPatterns) { return []; } return restPatterns.map( (pattern) => Object.fromEntries( Object.entries(pattern).map(([key, value]) => [ camelCase(key), value ]) ) ); } // packages/core-data/build-module/resolvers.mjs var getAuthors2 = (query) => async ({ dispatch: dispatch3 }) => { const path = (0, import_url6.addQueryArgs)( "/wp/v2/users/?who=authors&per_page=100", query ); const users2 = await (0, import_api_fetch9.default)({ path }); dispatch3.receiveUserQuery(path, users2); }; var getCurrentUser2 = () => async ({ dispatch: dispatch3 }) => { const currentUser2 = await (0, import_api_fetch9.default)({ path: "/wp/v2/users/me" }); dispatch3.receiveCurrentUser(currentUser2); }; var getEntityRecord2 = (kind, name, key = "", query) => async ({ select: select5, dispatch: dispatch3, registry, resolveSelect: resolveSelect2 }) => { const configs = await resolveSelect2.getEntitiesConfig(kind); const entityConfig = configs.find( (config) => config.name === name && config.kind === kind ); if (!entityConfig) { return; } const lock3 = await dispatch3.__unstableAcquireStoreLock( STORE_NAME, ["entities", "records", kind, name, key], { exclusive: false } ); try { if (query !== void 0 && query._fields) { query = { ...query, _fields: [ .../* @__PURE__ */ new Set([ ...get_normalized_comma_separable_default(query._fields) || [], entityConfig.key || DEFAULT_ENTITY_KEY ]) ].join() }; } if (query !== void 0 && query._fields) { const hasRecord = select5.hasEntityRecord( kind, name, key, query ); if (hasRecord) { return; } } let { baseURL } = entityConfig; if (kind === "postType" && name === "wp_template" && (key && typeof key === "string" && !/^\d+$/.test(key) || !window?.__experimentalTemplateActivate)) { baseURL = baseURL.slice(0, baseURL.lastIndexOf("/")) + "/templates"; } const path = (0, import_url6.addQueryArgs)(baseURL + (key ? "/" + key : ""), { ...entityConfig.baseURLParams, ...query }); const response = await (0, import_api_fetch9.default)({ path, parse: false }); const record = await response.json(); const permissions = getUserPermissionsFromAllowHeader( response.headers?.get("allow") ); const canUserResolutionsArgs = []; const receiveUserPermissionArgs = {}; for (const action of ALLOWED_RESOURCE_ACTIONS) { receiveUserPermissionArgs[getUserPermissionCacheKey(action, { kind, name, id: key })] = permissions[action]; canUserResolutionsArgs.push([ action, { kind, name, id: key } ]); } if (entityConfig.syncConfig && isNumericID(key) && !query) { const objectType = `${kind}/${name}`; const objectId = key; const recordWithTransients = { ...record }; Object.entries(entityConfig.transientEdits ?? {}).filter( ([propName, transientConfig]) => void 0 === recordWithTransients[propName] && transientConfig && "object" === typeof transientConfig && "read" in transientConfig && "function" === typeof transientConfig.read ).forEach(([propName, transientConfig]) => { recordWithTransients[propName] = transientConfig.read(recordWithTransients); }); void getSyncManager()?.load( entityConfig.syncConfig, objectType, objectId, recordWithTransients, { // Handle edits sourced from the sync manager. editRecord: (edits, options = {}) => { if (!Object.keys(edits).length) { return; } dispatch3({ type: "EDIT_ENTITY_RECORD", kind, name, recordId: key, edits, meta: { undo: void 0 }, options }); }, // Get the current entity record (with edits) getEditedRecord: async () => await resolveSelect2.getEditedEntityRecord( kind, name, key ), // Handle sync connection status changes. onStatusChange: (status) => { dispatch3.setSyncConnectionStatus( kind, name, key, status ); }, // Refetch the current entity record from the database. refetchRecord: async () => { dispatch3.receiveEntityRecords( kind, name, await (0, import_api_fetch9.default)({ path, parse: true }), query ); }, // Persist the CRDT document. // // TODO: Currently, persisted CRDT documents are stored in post meta. // This effectively means that only post entities support CRDT // persistence. As we add support for syncing additional entity, // we'll need to revisit where persisted CRDT documents are stored. persistCRDTDoc: () => { resolveSelect2.getEditedEntityRecord(kind, name, key).then((editedRecord) => { const { meta, status } = editedRecord; if ("auto-draft" === status || !meta) { return; } dispatch3.saveEntityRecord( kind, name, editedRecord ); }); }, addUndoMeta: (ydoc, meta) => { const selectionHistory = getSelectionHistory(ydoc); if (selectionHistory) { meta.set( "selectionHistory", selectionHistory ); } }, restoreUndoMeta: (ydoc, meta) => { const selectionHistory = meta.get("selectionHistory"); if (selectionHistory) { setTimeout(() => { restoreSelection(selectionHistory, ydoc); }, 0); } } } ); } registry.batch(() => { dispatch3.receiveEntityRecords(kind, name, record, query); dispatch3.receiveUserPermissions(receiveUserPermissionArgs); dispatch3.finishResolutions("canUser", canUserResolutionsArgs); }); } finally { dispatch3.__unstableReleaseStoreLock(lock3); } }; getEntityRecord2.shouldInvalidate = (action, kind, name) => { return kind === "root" && name === "site" && (action.type === "RECEIVE_ITEMS" && // Making sure persistedEdits is set seems to be the only way of // knowing whether it's an update or fetch. Only an update would // have persistedEdits. action.persistedEdits && action.persistedEdits.status !== "auto-draft" || action.type === "REMOVE_ITEMS") && action.kind === "postType" && action.name === "wp_template"; }; var getRawEntityRecord2 = forward_resolver_default("getEntityRecord"); var getEditedEntityRecord2 = forward_resolver_default("getEntityRecord"); var getEntityRecords2 = (kind, name, query = {}) => async ({ dispatch: dispatch3, registry, resolveSelect: resolveSelect2 }) => { const configs = await resolveSelect2.getEntitiesConfig(kind); const entityConfig = configs.find( (config) => config.name === name && config.kind === kind ); if (!entityConfig) { return; } const lock3 = await dispatch3.__unstableAcquireStoreLock( STORE_NAME, ["entities", "records", kind, name], { exclusive: false } ); const rawQuery = { ...query }; const key = entityConfig.key || DEFAULT_ENTITY_KEY; function getResolutionsArgs(records, recordsQuery) { const queryArgs = Object.fromEntries( Object.entries(recordsQuery).filter(([k, v]) => { return ["context", "_fields"].includes(k) && !!v; }) ); return records.filter((record) => record?.[key]).map((record) => [ kind, name, record[key], Object.keys(queryArgs).length > 0 ? queryArgs : void 0 ]); } try { if (query._fields) { query = { ...query, _fields: [ .../* @__PURE__ */ new Set([ ...get_normalized_comma_separable_default(query._fields) || [], key ]) ].join() }; } let { baseURL } = entityConfig; const { combinedTemplates = true } = query; if (kind === "postType" && name === "wp_template" && combinedTemplates) { baseURL = baseURL.slice(0, baseURL.lastIndexOf("/")) + "/templates"; } const path = (0, import_url6.addQueryArgs)(baseURL, { ...entityConfig.baseURLParams, ...query }); let records = [], meta; if (entityConfig.supportsPagination && query.per_page !== -1) { const response = await (0, import_api_fetch9.default)({ path, parse: false }); records = Object.values(await response.json()); meta = { totalItems: parseInt( response.headers.get("X-WP-Total") ), totalPages: parseInt( response.headers.get("X-WP-TotalPages") ) }; } else if (query.per_page === -1 && query[RECEIVE_INTERMEDIATE_RESULTS] === true) { let page = 1; let totalPages; do { const response = await (0, import_api_fetch9.default)({ path: (0, import_url6.addQueryArgs)(path, { page, per_page: 100 }), parse: false }); const pageRecords = Object.values(await response.json()); totalPages = parseInt( response.headers.get("X-WP-TotalPages") ); if (!meta) { meta = { totalItems: parseInt( response.headers.get("X-WP-Total") ), totalPages: 1 }; } records.push(...pageRecords); registry.batch(() => { dispatch3.receiveEntityRecords( kind, name, records, query, false, void 0, meta ); dispatch3.finishResolutions( "getEntityRecord", getResolutionsArgs(pageRecords, rawQuery) ); }); page++; } while (page <= totalPages); } else { records = Object.values(await (0, import_api_fetch9.default)({ path })); meta = { totalItems: records.length, totalPages: 1 }; } if (entityConfig.syncConfig && -1 === query.per_page) { const objectType = `${kind}/${name}`; getSyncManager()?.loadCollection( entityConfig.syncConfig, objectType, { onStatusChange: (status) => { dispatch3.setSyncConnectionStatus( kind, name, null, status ); }, refetchRecords: async () => { dispatch3.receiveEntityRecords( kind, name, await (0, import_api_fetch9.default)({ path, parse: true }), query ); } } ); } if (query._fields) { records = records.map((record) => { query._fields.split(",").forEach((field) => { if (!record.hasOwnProperty(field)) { record[field] = void 0; } }); return record; }); } registry.batch(() => { dispatch3.receiveEntityRecords( kind, name, records, query, false, void 0, meta ); const targetHints = records.filter( (record) => !!record?.[key] && !!record?._links?.self?.[0]?.targetHints?.allow ).map((record) => ({ id: record[key], permissions: getUserPermissionsFromAllowHeader( record._links.self[0].targetHints.allow ) })); const canUserResolutionsArgs = []; const receiveUserPermissionArgs = {}; for (const targetHint of targetHints) { for (const action of ALLOWED_RESOURCE_ACTIONS) { canUserResolutionsArgs.push([ action, { kind, name, id: targetHint.id } ]); receiveUserPermissionArgs[getUserPermissionCacheKey(action, { kind, name, id: targetHint.id })] = targetHint.permissions[action]; } } if (targetHints.length > 0) { dispatch3.receiveUserPermissions( receiveUserPermissionArgs ); dispatch3.finishResolutions( "canUser", canUserResolutionsArgs ); } dispatch3.finishResolutions( "getEntityRecord", getResolutionsArgs(records, rawQuery) ); dispatch3.__unstableReleaseStoreLock(lock3); }); } catch (e) { dispatch3.__unstableReleaseStoreLock(lock3); } }; getEntityRecords2.shouldInvalidate = (action, kind, name) => { return (action.type === "RECEIVE_ITEMS" || action.type === "REMOVE_ITEMS") && action.invalidateCache && kind === action.kind && name === action.name; }; var getEntityRecordsTotalItems2 = forward_resolver_default("getEntityRecords"); var getEntityRecordsTotalPages2 = forward_resolver_default("getEntityRecords"); var getCurrentTheme2 = () => async ({ dispatch: dispatch3, resolveSelect: resolveSelect2 }) => { const activeThemes = await resolveSelect2.getEntityRecords( "root", "theme", { status: "active" } ); dispatch3.receiveCurrentTheme(activeThemes[0]); }; var getThemeSupports2 = forward_resolver_default("getCurrentTheme"); var getEmbedPreview2 = (url) => async ({ dispatch: dispatch3 }) => { try { const embedProxyResponse = await (0, import_api_fetch9.default)({ path: (0, import_url6.addQueryArgs)("/oembed/1.0/proxy", { url }) }); dispatch3.receiveEmbedPreview(url, embedProxyResponse); } catch (error) { dispatch3.receiveEmbedPreview(url, false); } }; var canUser2 = (requestedAction, resource, id2) => async ({ dispatch: dispatch3, registry, resolveSelect: resolveSelect2 }) => { if (!ALLOWED_RESOURCE_ACTIONS.includes(requestedAction)) { throw new Error(`'${requestedAction}' is not a valid action.`); } const { hasStartedResolution } = registry.select(STORE_NAME); for (const relatedAction of ALLOWED_RESOURCE_ACTIONS) { if (relatedAction === requestedAction) { continue; } const isAlreadyResolving = hasStartedResolution("canUser", [ relatedAction, resource, id2 ]); if (isAlreadyResolving) { return; } } let resourcePath = null; if (typeof resource === "object") { if (!resource.kind || !resource.name) { throw new Error("The entity resource object is not valid."); } const configs = await resolveSelect2.getEntitiesConfig( resource.kind ); const entityConfig = configs.find( (config) => config.name === resource.name && config.kind === resource.kind ); if (!entityConfig) { return; } resourcePath = entityConfig.baseURL + (resource.id ? "/" + resource.id : ""); } else { resourcePath = `/wp/v2/${resource}` + (id2 ? "/" + id2 : ""); } let response; try { response = await (0, import_api_fetch9.default)({ path: resourcePath, method: "OPTIONS", parse: false }); } catch (error) { return; } const permissions = getUserPermissionsFromAllowHeader( response.headers?.get("allow") ); registry.batch(() => { for (const action of ALLOWED_RESOURCE_ACTIONS) { const key = getUserPermissionCacheKey(action, resource, id2); dispatch3.receiveUserPermission(key, permissions[action]); if (action !== requestedAction) { dispatch3.finishResolution("canUser", [ action, resource, id2 ]); } } }); }; var canUserEditEntityRecord2 = (kind, name, recordId) => async ({ dispatch: dispatch3 }) => { await dispatch3(canUser2("update", { kind, name, id: recordId })); }; var getAutosaves2 = (postType, postId) => async ({ dispatch: dispatch3, resolveSelect: resolveSelect2 }) => { const { rest_base: restBase, rest_namespace: restNamespace = "wp/v2", supports } = await resolveSelect2.getPostType(postType); if (!supports?.autosave) { return; } const autosaves2 = await (0, import_api_fetch9.default)({ path: `/${restNamespace}/${restBase}/${postId}/autosaves?context=edit` }); if (autosaves2 && autosaves2.length) { dispatch3.receiveAutosaves(postId, autosaves2); } }; var getAutosave2 = (postType, postId) => async ({ resolveSelect: resolveSelect2 }) => { await resolveSelect2.getAutosaves(postType, postId); }; var __experimentalGetCurrentGlobalStylesId2 = () => async ({ dispatch: dispatch3, resolveSelect: resolveSelect2 }) => { const activeThemes = await resolveSelect2.getEntityRecords( "root", "theme", { status: "active" } ); const globalStylesURL = activeThemes?.[0]?._links?.["wp:user-global-styles"]?.[0]?.href; if (!globalStylesURL) { return; } const matches = globalStylesURL.match(/\/(\d+)(?:\?|$)/); const id2 = matches ? Number(matches[1]) : null; if (id2) { dispatch3.__experimentalReceiveCurrentGlobalStylesId(id2); } }; var __experimentalGetCurrentThemeBaseGlobalStyles2 = () => async ({ resolveSelect: resolveSelect2, dispatch: dispatch3 }) => { const currentTheme2 = await resolveSelect2.getCurrentTheme(); const themeGlobalStyles = await (0, import_api_fetch9.default)({ path: `/wp/v2/global-styles/themes/${currentTheme2.stylesheet}?context=view` }); dispatch3.__experimentalReceiveThemeBaseGlobalStyles( currentTheme2.stylesheet, themeGlobalStyles ); }; var __experimentalGetCurrentThemeGlobalStylesVariations2 = () => async ({ resolveSelect: resolveSelect2, dispatch: dispatch3 }) => { const currentTheme2 = await resolveSelect2.getCurrentTheme(); const variations = await (0, import_api_fetch9.default)({ path: `/wp/v2/global-styles/themes/${currentTheme2.stylesheet}/variations?context=view` }); dispatch3.__experimentalReceiveThemeGlobalStyleVariations( currentTheme2.stylesheet, variations ); }; var getCurrentThemeGlobalStylesRevisions2 = () => async ({ resolveSelect: resolveSelect2, dispatch: dispatch3 }) => { const globalStylesId = await resolveSelect2.__experimentalGetCurrentGlobalStylesId(); const record = globalStylesId ? await resolveSelect2.getEntityRecord( "root", "globalStyles", globalStylesId ) : void 0; const revisionsURL = record?._links?.["version-history"]?.[0]?.href; if (revisionsURL) { const resetRevisions = await (0, import_api_fetch9.default)({ url: revisionsURL }); const revisions = resetRevisions?.map( (revision) => Object.fromEntries( Object.entries(revision).map(([key, value]) => [ camelCase(key), value ]) ) ); dispatch3.receiveThemeGlobalStyleRevisions( globalStylesId, revisions ); } }; getCurrentThemeGlobalStylesRevisions2.shouldInvalidate = (action) => { return action.type === "SAVE_ENTITY_RECORD_FINISH" && action.kind === "root" && !action.error && action.name === "globalStyles"; }; var getBlockPatterns2 = () => async ({ dispatch: dispatch3 }) => { const patterns = await fetchBlockPatterns(); dispatch3({ type: "RECEIVE_BLOCK_PATTERNS", patterns }); }; var getBlockPatternCategories2 = () => async ({ dispatch: dispatch3 }) => { const categories = await (0, import_api_fetch9.default)({ path: "/wp/v2/block-patterns/categories" }); dispatch3({ type: "RECEIVE_BLOCK_PATTERN_CATEGORIES", categories }); }; var getUserPatternCategories2 = () => async ({ dispatch: dispatch3, resolveSelect: resolveSelect2 }) => { const patternCategories = await resolveSelect2.getEntityRecords( "taxonomy", "wp_pattern_category", { per_page: -1, _fields: "id,name,description,slug", context: "view" } ); const mappedPatternCategories = patternCategories?.map((userCategory) => ({ ...userCategory, label: (0, import_html_entities2.decodeEntities)(userCategory.name), name: userCategory.slug })) || []; dispatch3({ type: "RECEIVE_USER_PATTERN_CATEGORIES", patternCategories: mappedPatternCategories }); }; var getNavigationFallbackId2 = () => async ({ dispatch: dispatch3, select: select5, registry }) => { const fallback = await (0, import_api_fetch9.default)({ path: (0, import_url6.addQueryArgs)("/wp-block-editor/v1/navigation-fallback", { _embed: true }) }); const record = fallback?._embedded?.self; registry.batch(() => { dispatch3.receiveNavigationFallbackId(fallback?.id); if (!record) { return; } const existingFallbackEntityRecord = select5.getEntityRecord( "postType", "wp_navigation", fallback.id ); const invalidateNavigationQueries = !existingFallbackEntityRecord; dispatch3.receiveEntityRecords( "postType", "wp_navigation", record, void 0, invalidateNavigationQueries ); dispatch3.finishResolution("getEntityRecord", [ "postType", "wp_navigation", fallback.id ]); }); }; var getDefaultTemplateId2 = (query) => async ({ dispatch: dispatch3, registry, resolveSelect: resolveSelect2 }) => { const template = await (0, import_api_fetch9.default)({ path: (0, import_url6.addQueryArgs)("/wp/v2/templates/lookup", query) }); await resolveSelect2.getEntitiesConfig("postType"); const id2 = window?.__experimentalTemplateActivate ? template?.wp_id || template?.id : template?.id; if (id2) { template.id = id2; registry.batch(() => { dispatch3.receiveDefaultTemplateId(query, id2); dispatch3.receiveEntityRecords( "postType", template.type, template ); dispatch3.finishResolution("getEntityRecord", [ "postType", template.type, id2 ]); }); } }; getDefaultTemplateId2.shouldInvalidate = (action) => { return action.type === "RECEIVE_ITEMS" && action.kind === "root" && action.name === "site"; }; var getRevisions2 = (kind, name, recordKey, query = {}) => async ({ dispatch: dispatch3, registry, resolveSelect: resolveSelect2 }) => { const configs = await resolveSelect2.getEntitiesConfig(kind); const entityConfig = configs.find( (config) => config.name === name && config.kind === kind ); if (!entityConfig) { return; } if (query._fields) { query = { ...query, _fields: [ .../* @__PURE__ */ new Set([ ...get_normalized_comma_separable_default(query._fields) || [], entityConfig.revisionKey || DEFAULT_ENTITY_KEY ]) ].join() }; } const path = (0, import_url6.addQueryArgs)( entityConfig.getRevisionsUrl(recordKey), query ); let records, response; const meta = {}; const isPaginated = entityConfig.supportsPagination && query.per_page !== -1; try { response = await (0, import_api_fetch9.default)({ path, parse: !isPaginated }); } catch (error) { return; } if (response) { if (isPaginated) { records = Object.values(await response.json()); meta.totalItems = parseInt( response.headers.get("X-WP-Total") ); } else { records = Object.values(response); } if (query._fields) { records = records.map((record) => { query._fields.split(",").forEach((field) => { if (!record.hasOwnProperty(field)) { record[field] = void 0; } }); return record; }); } registry.batch(() => { dispatch3.receiveRevisions( kind, name, recordKey, records, query, false, meta ); if (!query?._fields && !query.context) { const key = entityConfig.revisionKey || DEFAULT_ENTITY_KEY; const resolutionsArgs = records.filter((record) => record[key]).map((record) => [ kind, name, recordKey, record[key] ]); dispatch3.finishResolutions( "getRevision", resolutionsArgs ); } }); } }; getRevisions2.shouldInvalidate = (action, kind, name, recordKey) => action.type === "SAVE_ENTITY_RECORD_FINISH" && name === action.name && kind === action.kind && !action.error && recordKey === action.recordId; var getRevision2 = (kind, name, recordKey, revisionKey, query) => async ({ dispatch: dispatch3, resolveSelect: resolveSelect2 }) => { const configs = await resolveSelect2.getEntitiesConfig(kind); const entityConfig = configs.find( (config) => config.name === name && config.kind === kind ); if (!entityConfig) { return; } if (query !== void 0 && query._fields) { query = { ...query, _fields: [ .../* @__PURE__ */ new Set([ ...get_normalized_comma_separable_default(query._fields) || [], entityConfig.revisionKey || DEFAULT_ENTITY_KEY ]) ].join() }; } const path = (0, import_url6.addQueryArgs)( entityConfig.getRevisionsUrl(recordKey, revisionKey), query ); let record; try { record = await (0, import_api_fetch9.default)({ path }); } catch (error) { return; } if (record) { dispatch3.receiveRevisions(kind, name, recordKey, record, query); } }; var getRegisteredPostMeta2 = (postType) => async ({ dispatch: dispatch3, resolveSelect: resolveSelect2 }) => { let options; try { const { rest_namespace: restNamespace = "wp/v2", rest_base: restBase } = await resolveSelect2.getPostType(postType) || {}; options = await (0, import_api_fetch9.default)({ path: `${restNamespace}/${restBase}/?context=edit`, method: "OPTIONS" }); } catch (error) { return; } if (options) { dispatch3.receiveRegisteredPostMeta( postType, options?.schema?.properties?.meta?.properties ); } }; var getEntitiesConfig2 = (kind) => async ({ dispatch: dispatch3 }) => { const loader = additionalEntityConfigLoaders.find( (l) => l.kind === kind ); if (!loader) { return; } try { const configs = await loader.loadEntities(); if (!configs.length) { return; } dispatch3.addEntities(configs); } catch { } }; var getEditorSettings2 = () => async ({ dispatch: dispatch3 }) => { const settings = await (0, import_api_fetch9.default)({ path: "/wp-block-editor/v1/settings" }); dispatch3.receiveEditorSettings(settings); }; var getEditorAssets2 = () => async ({ dispatch: dispatch3 }) => { const assets = await (0, import_api_fetch9.default)({ path: "/wp-block-editor/v1/assets" }); dispatch3.receiveEditorAssets(assets); }; // packages/core-data/build-module/locks/utils.mjs function deepCopyLocksTreePath(tree, path) { const newTree = { ...tree }; let currentNode = newTree; for (const branchName of path) { currentNode.children = { ...currentNode.children, [branchName]: { locks: [], children: {}, ...currentNode.children[branchName] } }; currentNode = currentNode.children[branchName]; } return newTree; } function getNode(tree, path) { let currentNode = tree; for (const branchName of path) { const nextNode = currentNode.children[branchName]; if (!nextNode) { return null; } currentNode = nextNode; } return currentNode; } function* iteratePath(tree, path) { let currentNode = tree; yield currentNode; for (const branchName of path) { const nextNode = currentNode.children[branchName]; if (!nextNode) { break; } yield nextNode; currentNode = nextNode; } } function* iterateDescendants(node) { const stack = Object.values(node.children); while (stack.length) { const childNode = stack.pop(); yield childNode; stack.push(...Object.values(childNode.children)); } } function hasConflictingLock({ exclusive }, locks2) { if (exclusive && locks2.length) { return true; } if (!exclusive && locks2.filter((lock3) => lock3.exclusive).length) { return true; } return false; } // packages/core-data/build-module/locks/reducer.mjs var DEFAULT_STATE = { requests: [], tree: { locks: [], children: {} } }; function locks(state = DEFAULT_STATE, action) { switch (action.type) { case "ENQUEUE_LOCK_REQUEST": { const { request } = action; return { ...state, requests: [request, ...state.requests] }; } case "GRANT_LOCK_REQUEST": { const { lock: lock3, request } = action; const { store: store2, path } = request; const storePath = [store2, ...path]; const newTree = deepCopyLocksTreePath(state.tree, storePath); const node = getNode(newTree, storePath); node.locks = [...node.locks, lock3]; return { ...state, requests: state.requests.filter((r) => r !== request), tree: newTree }; } case "RELEASE_LOCK": { const { lock: lock3 } = action; const storePath = [lock3.store, ...lock3.path]; const newTree = deepCopyLocksTreePath(state.tree, storePath); const node = getNode(newTree, storePath); node.locks = node.locks.filter((l) => l !== lock3); return { ...state, tree: newTree }; } } return state; } // packages/core-data/build-module/locks/selectors.mjs function getPendingLockRequests(state) { return state.requests; } function isLockAvailable(state, store2, path, { exclusive }) { const storePath = [store2, ...path]; const locks2 = state.tree; for (const node2 of iteratePath(locks2, storePath)) { if (hasConflictingLock({ exclusive }, node2.locks)) { return false; } } const node = getNode(locks2, storePath); if (!node) { return true; } for (const descendant of iterateDescendants(node)) { if (hasConflictingLock({ exclusive }, descendant.locks)) { return false; } } return true; } // packages/core-data/build-module/locks/engine.mjs function createLocks() { let state = locks(void 0, { type: "@@INIT" }); function processPendingLockRequests() { for (const request of getPendingLockRequests(state)) { const { store: store2, path, exclusive, notifyAcquired } = request; if (isLockAvailable(state, store2, path, { exclusive })) { const lock3 = { store: store2, path, exclusive }; state = locks(state, { type: "GRANT_LOCK_REQUEST", lock: lock3, request }); notifyAcquired(lock3); } } } function acquire(store2, path, exclusive) { return new Promise((resolve) => { state = locks(state, { type: "ENQUEUE_LOCK_REQUEST", request: { store: store2, path, exclusive, notifyAcquired: resolve } }); processPendingLockRequests(); }); } function release(lock3) { state = locks(state, { type: "RELEASE_LOCK", lock: lock3 }); processPendingLockRequests(); } return { acquire, release }; } // packages/core-data/build-module/locks/actions.mjs function createLocksActions() { const locks2 = createLocks(); function __unstableAcquireStoreLock(store2, path, { exclusive }) { return () => locks2.acquire(store2, path, exclusive); } function __unstableReleaseStoreLock(lock3) { return () => locks2.release(lock3); } return { __unstableAcquireStoreLock, __unstableReleaseStoreLock }; } // packages/core-data/build-module/dynamic-entities.mjs var dynamicActions; var dynamicSelectors; // packages/core-data/build-module/entity-provider.mjs var import_element2 = __toESM(require_element(), 1); // packages/core-data/build-module/entity-context.mjs var import_element = __toESM(require_element(), 1); var EntityContext = (0, import_element.createContext)({}); EntityContext.displayName = "EntityContext"; // packages/core-data/build-module/entity-provider.mjs var import_jsx_runtime = __toESM(require_jsx_runtime(), 1); function EntityProvider({ kind, type: name, id: id2, revisionId, children }) { const parent = (0, import_element2.useContext)(EntityContext); const childContext = (0, import_element2.useMemo)( () => ({ ...parent, ...kind && { [kind]: { ...parent?.[kind], [name]: id2 } }, ...revisionId !== void 0 && { revisionId } }), [parent, kind, name, id2, revisionId] ); return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EntityContext.Provider, { value: childContext, children }); } // packages/core-data/build-module/hooks/use-entity-record.mjs var import_data12 = __toESM(require_data(), 1); var import_deprecated4 = __toESM(require_deprecated(), 1); var import_element3 = __toESM(require_element(), 1); // packages/core-data/build-module/hooks/use-query-select.mjs var import_data11 = __toESM(require_data(), 1); // node_modules/memize/dist/index.js function memize(fn, options) { var size2 = 0; var head; var tail; options = options || {}; function memoized() { var node = head, len = arguments.length, args2, i; searchCache: while (node) { if (node.args.length !== arguments.length) { node = node.next; continue; } for (i = 0; i < len; i++) { if (node.args[i] !== arguments[i]) { node = node.next; continue searchCache; } } if (node !== head) { if (node === tail) { tail = node.prev; } node.prev.next = node.next; if (node.next) { node.next.prev = node.prev; } node.next = head; node.prev = null; head.prev = node; head = node; } return node.val; } args2 = new Array(len); for (i = 0; i < len; i++) { args2[i] = arguments[i]; } node = { args: args2, // Generate the result from original function val: fn.apply(null, args2) }; if (head) { head.prev = node; node.next = head; } else { tail = node; } if (size2 === /** @type {MemizeOptions} */ options.maxSize) { tail = /** @type {MemizeCacheNode} */ tail.prev; tail.next = null; } else { size2++; } head = node; return node.val; } memoized.clear = function() { head = null; tail = null; size2 = 0; }; return memoized; } // packages/core-data/build-module/hooks/memoize.mjs var memoize_default = memize; // packages/core-data/build-module/hooks/constants.mjs var Status = /* @__PURE__ */ ((Status2) => { Status2["Idle"] = "IDLE"; Status2["Resolving"] = "RESOLVING"; Status2["Error"] = "ERROR"; Status2["Success"] = "SUCCESS"; return Status2; })(Status || {}); // packages/core-data/build-module/hooks/use-query-select.mjs var META_SELECTORS = [ "getIsResolving", "hasStartedResolution", "hasFinishedResolution", "isResolving", "getCachedResolvers" ]; function useQuerySelect(mapQuerySelect, deps) { return (0, import_data11.useSelect)((select5, registry) => { const resolve = (store2) => enrichSelectors(select5(store2)); return mapQuerySelect(resolve, registry); }, deps); } var enrichSelectors = memoize_default(((selectors) => { const resolvers = {}; for (const selectorName in selectors) { if (META_SELECTORS.includes(selectorName)) { continue; } Object.defineProperty(resolvers, selectorName, { get: () => (...args2) => { const data = selectors[selectorName](...args2); const resolutionStatus = selectors.getResolutionState( selectorName, args2 )?.status; let status; switch (resolutionStatus) { case "resolving": status = Status.Resolving; break; case "finished": status = Status.Success; break; case "error": status = Status.Error; break; case void 0: status = Status.Idle; break; } return { data, status, isResolving: status === Status.Resolving, hasStarted: status !== Status.Idle, hasResolved: status === Status.Success || status === Status.Error }; } }); } return resolvers; })); // packages/core-data/build-module/hooks/use-entity-record.mjs var EMPTY_OBJECT2 = {}; function useEntityRecord(kind, name, recordId, options = { enabled: true }) { const { editEntityRecord: editEntityRecord2, saveEditedEntityRecord: saveEditedEntityRecord2 } = (0, import_data12.useDispatch)(store); const mutations = (0, import_element3.useMemo)( () => ({ edit: (record2, editOptions = {}) => editEntityRecord2(kind, name, recordId, record2, editOptions), save: (saveOptions = {}) => saveEditedEntityRecord2(kind, name, recordId, { throwOnError: true, ...saveOptions }) }), [editEntityRecord2, kind, name, recordId, saveEditedEntityRecord2] ); const { editedRecord, hasEdits, edits } = (0, import_data12.useSelect)( (select5) => { if (!options.enabled) { return { editedRecord: EMPTY_OBJECT2, hasEdits: false, edits: EMPTY_OBJECT2 }; } return { editedRecord: select5(store).getEditedEntityRecord( kind, name, recordId ), hasEdits: select5(store).hasEditsForEntityRecord( kind, name, recordId ), edits: select5(store).getEntityRecordNonTransientEdits( kind, name, recordId ) }; }, [kind, name, recordId, options.enabled] ); const { data: record, ...querySelectRest } = useQuerySelect( (query) => { if (!options.enabled) { return { data: null }; } return query(store).getEntityRecord(kind, name, recordId); }, [kind, name, recordId, options.enabled] ); return { record, editedRecord, hasEdits, edits, ...querySelectRest, ...mutations }; } function __experimentalUseEntityRecord(kind, name, recordId, options) { (0, import_deprecated4.default)(`wp.data.__experimentalUseEntityRecord`, { alternative: "wp.data.useEntityRecord", since: "6.1" }); return useEntityRecord(kind, name, recordId, options); } // packages/core-data/build-module/hooks/use-entity-records.mjs var import_url7 = __toESM(require_url(), 1); var import_deprecated5 = __toESM(require_deprecated(), 1); var import_data13 = __toESM(require_data(), 1); var import_element4 = __toESM(require_element(), 1); var EMPTY_ARRAY = []; function useEntityRecords(kind, name, queryArgs = {}, options = { enabled: true }) { const queryAsString = (0, import_url7.addQueryArgs)("", queryArgs); const { data: records, ...rest } = useQuerySelect( (query) => { if (!options.enabled) { return { // Avoiding returning a new reference on every execution. data: EMPTY_ARRAY }; } return query(store).getEntityRecords(kind, name, queryArgs); }, [kind, name, queryAsString, options.enabled] ); const { totalItems, totalPages } = (0, import_data13.useSelect)( (select5) => { if (!options.enabled) { return { totalItems: null, totalPages: null }; } return { totalItems: select5(store).getEntityRecordsTotalItems( kind, name, queryArgs ), totalPages: select5(store).getEntityRecordsTotalPages( kind, name, queryArgs ) }; }, [kind, name, queryAsString, options.enabled] ); return { records, totalItems, totalPages, ...rest }; } function __experimentalUseEntityRecords(kind, name, queryArgs, options) { (0, import_deprecated5.default)(`wp.data.__experimentalUseEntityRecords`, { alternative: "wp.data.useEntityRecords", since: "6.1" }); return useEntityRecords(kind, name, queryArgs, options); } function useEntityRecordsWithPermissions(kind, name, queryArgs = {}, options = { enabled: true }) { const entityConfig = (0, import_data13.useSelect)( (select5) => select5(store).getEntityConfig(kind, name), [kind, name] ); const { records: data, ...ret } = useEntityRecords( kind, name, { ...queryArgs, // If _fields is provided, we need to include _links in the request for permission caching to work. ...queryArgs._fields ? { _fields: [ .../* @__PURE__ */ new Set([ ...get_normalized_comma_separable_default( queryArgs._fields ) || [], "_links" ]) ].join() } : {} }, options ); const ids = (0, import_element4.useMemo)( () => data?.map( // @ts-ignore (record) => record[entityConfig?.key ?? "id"] ) ?? [], [data, entityConfig?.key] ); const permissions = (0, import_data13.useSelect)( (select5) => { const { getEntityRecordsPermissions: getEntityRecordsPermissions2 } = unlock2( select5(store) ); return getEntityRecordsPermissions2(kind, name, ids); }, [ids, kind, name] ); const dataWithPermissions = (0, import_element4.useMemo)( () => data?.map((record, index) => ({ // @ts-ignore ...record, permissions: permissions[index] })) ?? [], [data, permissions] ); return { records: dataWithPermissions, ...ret }; } // packages/core-data/build-module/hooks/use-resource-permissions.mjs var import_deprecated6 = __toESM(require_deprecated(), 1); var import_warning = __toESM(require_warning(), 1); function useResourcePermissions(resource, id2) { const isEntity = typeof resource === "object"; const resourceAsString = isEntity ? JSON.stringify(resource) : resource; if (isEntity && typeof id2 !== "undefined") { (0, import_warning.default)( `When 'resource' is an entity object, passing 'id' as a separate argument isn't supported.` ); } return useQuerySelect( (resolve) => { const hasId = isEntity ? !!resource.id : !!id2; const { canUser: canUser3 } = resolve(store); const create9 = canUser3( "create", isEntity ? { kind: resource.kind, name: resource.name } : resource ); if (!hasId) { const read2 = canUser3("read", resource); const isResolving2 = create9.isResolving || read2.isResolving; const hasResolved2 = create9.hasResolved && read2.hasResolved; let status2 = Status.Idle; if (isResolving2) { status2 = Status.Resolving; } else if (hasResolved2) { status2 = Status.Success; } return { status: status2, isResolving: isResolving2, hasResolved: hasResolved2, canCreate: create9.hasResolved && create9.data, canRead: read2.hasResolved && read2.data }; } const read = canUser3("read", resource, id2); const update = canUser3("update", resource, id2); const _delete = canUser3("delete", resource, id2); const isResolving = read.isResolving || create9.isResolving || update.isResolving || _delete.isResolving; const hasResolved = read.hasResolved && create9.hasResolved && update.hasResolved && _delete.hasResolved; let status = Status.Idle; if (isResolving) { status = Status.Resolving; } else if (hasResolved) { status = Status.Success; } return { status, isResolving, hasResolved, canRead: hasResolved && read.data, canCreate: hasResolved && create9.data, canUpdate: hasResolved && update.data, canDelete: hasResolved && _delete.data }; }, [resourceAsString, id2] ); } var use_resource_permissions_default = useResourcePermissions; function __experimentalUseResourcePermissions(resource, id2) { (0, import_deprecated6.default)(`wp.data.__experimentalUseResourcePermissions`, { alternative: "wp.data.useResourcePermissions", since: "6.1" }); return useResourcePermissions(resource, id2); } // packages/core-data/build-module/hooks/use-entity-block-editor.mjs var import_element6 = __toESM(require_element(), 1); var import_data14 = __toESM(require_data(), 1); var import_blocks5 = __toESM(require_blocks(), 1); // packages/core-data/build-module/hooks/use-entity-id.mjs var import_element5 = __toESM(require_element(), 1); function useEntityId(kind, name) { const context = (0, import_element5.useContext)(EntityContext); return context?.[kind]?.[name]; } // packages/core-data/build-module/footnotes/index.mjs var import_rich_text4 = __toESM(require_rich_text(), 1); // packages/core-data/build-module/footnotes/get-rich-text-values-cached.mjs var import_block_editor5 = __toESM(require_block_editor(), 1); var unlockedApis; var cache = /* @__PURE__ */ new WeakMap(); function getRichTextValuesCached(block) { if (!unlockedApis) { unlockedApis = unlock2(import_block_editor5.privateApis); } if (!cache.has(block)) { const values = unlockedApis.getRichTextValues([block]); cache.set(block, values); } return cache.get(block); } // packages/core-data/build-module/footnotes/get-footnotes-order.mjs var cache2 = /* @__PURE__ */ new WeakMap(); function getBlockFootnotesOrder(block) { if (!cache2.has(block)) { const order = []; for (const value of getRichTextValuesCached(block)) { if (!value) { continue; } value.replacements.forEach(({ type, attributes }) => { if (type === "core/footnote") { order.push(attributes["data-fn"]); } }); } cache2.set(block, order); } return cache2.get(block); } function getFootnotesOrder(blocks) { return blocks.flatMap(getBlockFootnotesOrder); } // packages/core-data/build-module/footnotes/index.mjs var oldFootnotes = {}; function updateFootnotesFromMeta(blocks, meta) { const output = { blocks }; if (!meta) { return output; } if (meta.footnotes === void 0) { return output; } const newOrder = getFootnotesOrder(blocks); const footnotes = meta.footnotes ? JSON.parse(meta.footnotes) : []; const currentOrder = footnotes.map((fn) => fn.id); if (currentOrder.join("") === newOrder.join("")) { return output; } const newFootnotes = newOrder.map( (fnId) => footnotes.find((fn) => fn.id === fnId) || oldFootnotes[fnId] || { id: fnId, content: "" } ); function updateAttributes(attributes) { if (!attributes || Array.isArray(attributes) || typeof attributes !== "object") { return attributes; } attributes = { ...attributes }; for (const key in attributes) { const value = attributes[key]; if (Array.isArray(value)) { attributes[key] = value.map(updateAttributes); continue; } if (typeof value !== "string" && !(value instanceof import_rich_text4.RichTextData)) { continue; } const richTextValue = typeof value === "string" ? import_rich_text4.RichTextData.fromHTMLString(value) : new import_rich_text4.RichTextData(value); let hasFootnotes = false; richTextValue.replacements.forEach((replacement) => { if (replacement.type === "core/footnote") { const id2 = replacement.attributes["data-fn"]; const index = newOrder.indexOf(id2); const countValue = (0, import_rich_text4.create)({ html: replacement.innerHTML }); countValue.text = String(index + 1); countValue.formats = Array.from( { length: countValue.text.length }, () => countValue.formats[0] ); countValue.replacements = Array.from( { length: countValue.text.length }, () => countValue.replacements[0] ); replacement.innerHTML = (0, import_rich_text4.toHTMLString)({ value: countValue }); hasFootnotes = true; } }); if (hasFootnotes) { attributes[key] = typeof value === "string" ? richTextValue.toHTMLString() : richTextValue; } } return attributes; } function updateBlocksAttributes(__blocks) { return __blocks.map((block) => { return { ...block, attributes: updateAttributes(block.attributes), innerBlocks: updateBlocksAttributes(block.innerBlocks) }; }); } const newBlocks = updateBlocksAttributes(blocks); oldFootnotes = { ...oldFootnotes, ...footnotes.reduce((acc, fn) => { if (!newOrder.includes(fn.id)) { acc[fn.id] = fn; } return acc; }, {}) }; return { meta: { ...meta, footnotes: JSON.stringify(newFootnotes) }, blocks: newBlocks }; } // packages/core-data/build-module/hooks/use-entity-block-editor.mjs var EMPTY_ARRAY2 = []; var parsedBlocksCache = /* @__PURE__ */ new Map(); function useEntityBlockEditor(kind, name, { id: _id } = {}) { const providerId = useEntityId(kind, name); const id2 = _id ?? providerId; const { content, editedBlocks, meta } = (0, import_data14.useSelect)( (select5) => { if (!id2) { return {}; } const { getEditedEntityRecord: getEditedEntityRecord3 } = select5(STORE_NAME); const editedRecord = getEditedEntityRecord3(kind, name, id2); return { editedBlocks: editedRecord.blocks, content: editedRecord.content, meta: editedRecord.meta }; }, [kind, name, id2] ); const { __unstableCreateUndoLevel: __unstableCreateUndoLevel2, editEntityRecord: editEntityRecord2 } = (0, import_data14.useDispatch)(STORE_NAME); const blocks = (0, import_element6.useMemo)(() => { if (!id2) { return void 0; } if (editedBlocks) { return editedBlocks; } if (!content || typeof content !== "string") { return EMPTY_ARRAY2; } const cacheKey = `${kind}:${name}:${id2}`; const cached = parsedBlocksCache.get(cacheKey); let _blocks; if (cached && cached.content === content) { _blocks = cached.blocks; } else { _blocks = (0, import_blocks5.parse)(content); parsedBlocksCache.set(cacheKey, { content, blocks: _blocks }); } return _blocks; }, [kind, name, id2, editedBlocks, content]); const onChange = (0, import_element6.useCallback)( (newBlocks, options) => { const noChange = blocks === newBlocks; if (noChange) { return __unstableCreateUndoLevel2(kind, name, id2); } const { selection, ...rest } = options; const edits = { selection, content: ({ blocks: blocksForSerialization = [] }) => (0, import_blocks5.__unstableSerializeAndClean)(blocksForSerialization), ...updateFootnotesFromMeta(newBlocks, meta) }; editEntityRecord2(kind, name, id2, edits, { isCached: false, ...rest }); }, [ kind, name, id2, blocks, meta, __unstableCreateUndoLevel2, editEntityRecord2 ] ); const onInput = (0, import_element6.useCallback)( (newBlocks, options) => { const { selection, ...rest } = options; const edits = { selection, ...updateFootnotesFromMeta(newBlocks, meta) }; editEntityRecord2(kind, name, id2, edits, { isCached: true, ...rest }); }, [kind, name, id2, meta, editEntityRecord2] ); return [blocks, onInput, onChange]; } // packages/core-data/build-module/hooks/use-entity-prop.mjs var import_element7 = __toESM(require_element(), 1); var import_data15 = __toESM(require_data(), 1); function useEntityProp(kind, name, prop, _id) { const providerId = useEntityId(kind, name); const id2 = _id ?? providerId; const context = (0, import_element7.useContext)(EntityContext); const revisionId = context?.revisionId; const { value, fullValue } = (0, import_data15.useSelect)( (select5) => { if (revisionId) { const revisions = select5(STORE_NAME).getRevisions( kind, name, id2, { per_page: -1, context: "edit", _fields: "id,date,author,meta,title.raw,excerpt.raw,content.raw" } ); const entityConfig = select5(STORE_NAME).getEntityConfig( kind, name ); const revKey = entityConfig?.revisionKey || DEFAULT_ENTITY_KEY; const revision = revisions?.find( (r) => r[revKey] === revisionId ); return revision ? { value: revision[prop]?.raw ?? revision[prop], fullValue: revision[prop] } : {}; } const { getEntityRecord: getEntityRecord3, getEditedEntityRecord: getEditedEntityRecord3 } = select5(STORE_NAME); const record = getEntityRecord3(kind, name, id2); const editedRecord = getEditedEntityRecord3(kind, name, id2); return record && editedRecord ? { value: editedRecord[prop], fullValue: record[prop] } : {}; }, [kind, name, id2, prop, revisionId] ); const { editEntityRecord: editEntityRecord2 } = (0, import_data15.useDispatch)(STORE_NAME); const setValue = (0, import_element7.useCallback)( (newValue) => { if (revisionId) { return; } editEntityRecord2(kind, name, id2, { [prop]: newValue }); }, [editEntityRecord2, kind, name, id2, prop, revisionId] ); return [value, setValue, fullValue]; } // packages/core-data/build-module/hooks/use-post-editor-awareness-state.mjs var import_compose3 = __toESM(require_compose(), 1); var import_element8 = __toESM(require_element(), 1); var defaultResolvedSelection = { richTextOffset: null, localClientId: null }; var defaultState = { activeCollaborators: [], resolveSelection: () => defaultResolvedSelection, getDebugData: () => ({ doc: {}, clients: {}, collaboratorMap: {} }), isCurrentCollaboratorDisconnected: false }; function getAwarenessState(awareness, newState) { const activeCollaborators = newState ?? awareness.getCurrentState(); return { activeCollaborators, resolveSelection: (selection) => awareness.convertSelectionStateToAbsolute(selection), getDebugData: () => awareness.getDebugData(), isCurrentCollaboratorDisconnected: activeCollaborators.find((collaborator) => collaborator.isMe)?.isConnected === false }; } function usePostEditorAwarenessState(postId, postType) { const [state, setState] = (0, import_element8.useState)(defaultState); (0, import_element8.useEffect)(() => { if (null === postId || null === postType) { setState(defaultState); return; } const objectType = `postType/${postType}`; const objectId = postId.toString(); const awareness = getSyncManager()?.getAwareness( objectType, objectId ); if (!awareness) { setState(defaultState); return; } awareness.setUp(); setState(getAwarenessState(awareness)); const unsubscribe = awareness?.onStateChange( (newState) => { setState(getAwarenessState(awareness, newState)); } ); return unsubscribe; }, [postId, postType]); return state; } function useActiveCollaborators(postId, postType) { return usePostEditorAwarenessState(postId, postType).activeCollaborators; } function useResolvedSelection(postId, postType) { return usePostEditorAwarenessState(postId, postType).resolveSelection; } function useLastPostSave(postId, postType) { const [lastSave, setLastSave] = (0, import_element8.useState)(null); (0, import_element8.useEffect)(() => { if (null === postId || null === postType) { setLastSave(null); return; } const awareness = getSyncManager()?.getAwareness( `postType/${postType}`, postId.toString() ); if (!awareness) { setLastSave(null); return; } awareness.setUp(); const stateMap = awareness.doc.getMap("state"); const recordMap = awareness.doc.getMap("document"); const setupTime = Date.now(); const observer = (event) => { if (event.keysChanged.has("savedAt")) { const savedAt = stateMap.get("savedAt"); const savedByClientId = stateMap.get("savedBy"); if (typeof savedAt === "number" && typeof savedByClientId === "number" && savedAt > setupTime) { const postStatus = recordMap.get("status"); setLastSave({ savedAt, savedByClientId, postStatus }); } } }; stateMap.observe(observer); return () => { stateMap.unobserve(observer); }; }, [postId, postType]); return lastSave; } function useOnCollaboratorJoin(postId, postType, callback) { const { activeCollaborators } = usePostEditorAwarenessState( postId, postType ); const prevCollaborators = (0, import_compose3.usePrevious)(activeCollaborators); (0, import_element8.useEffect)(() => { if (!prevCollaborators || prevCollaborators.length === 0) { return; } const prevMap = new Map( prevCollaborators.map((collaborator) => [ collaborator.clientId, collaborator ]) ); const me = activeCollaborators.find( (collaborator) => collaborator.isMe ); for (const collaborator of activeCollaborators) { if (!prevMap.has(collaborator.clientId) && !collaborator.isMe) { callback(collaborator, me); } } }, [activeCollaborators, prevCollaborators, callback]); } function useOnCollaboratorLeave(postId, postType, callback) { const { activeCollaborators } = usePostEditorAwarenessState( postId, postType ); const prevCollaborators = (0, import_compose3.usePrevious)(activeCollaborators); (0, import_element8.useEffect)(() => { if (!prevCollaborators || prevCollaborators.length === 0) { return; } const newMap = new Map( activeCollaborators.map((collaborator) => [ collaborator.clientId, collaborator ]) ); for (const prevCollab of prevCollaborators) { if (prevCollab.isMe || !prevCollab.isConnected) { continue; } const newCollab = newMap.get(prevCollab.clientId); if (!newCollab?.isConnected) { callback(prevCollab); } } }, [activeCollaborators, prevCollaborators, callback]); } function useOnPostSave(postId, postType, callback) { const { activeCollaborators } = usePostEditorAwarenessState( postId, postType ); const lastPostSave = useLastPostSave(postId, postType); const prevPostSave = (0, import_compose3.usePrevious)(lastPostSave); (0, import_element8.useEffect)(() => { if (!lastPostSave) { return; } if (prevPostSave && lastPostSave.savedAt === prevPostSave.savedAt) { return; } const saver = activeCollaborators.find( (collaborator) => collaborator.clientId === lastPostSave.savedByClientId && !collaborator.isMe ); if (!saver) { return; } callback(lastPostSave, saver, prevPostSave ?? null); }, [lastPostSave, prevPostSave, activeCollaborators, callback]); } // packages/core-data/build-module/private-apis.mjs var lockedApis = { useEntityRecordsWithPermissions, RECEIVE_INTERMEDIATE_RESULTS, retrySyncConnection, useActiveCollaborators, useResolvedSelection, useOnCollaboratorJoin, useOnCollaboratorLeave, useOnPostSave, SelectionType, SelectionDirection }; var privateApis2 = {}; lock2(privateApis2, lockedApis); // packages/core-data/build-module/index.mjs var entitiesConfig2 = [ ...rootEntitiesConfig, ...additionalEntityConfigLoaders.filter((config) => !!config.name) ]; var entitySelectors = entitiesConfig2.reduce((result, entity2) => { const { kind, name, plural } = entity2; const getEntityRecordMethodName = getMethodName(kind, name); result[getEntityRecordMethodName] = (state, key, query) => { logEntityDeprecation(kind, name, getEntityRecordMethodName, { isShorthandSelector: true, alternativeFunctionName: "getEntityRecord" }); return getEntityRecord(state, kind, name, key, query); }; if (plural) { const getEntityRecordsMethodName = getMethodName(kind, plural, "get"); result[getEntityRecordsMethodName] = (state, query) => { logEntityDeprecation(kind, name, getEntityRecordsMethodName, { isShorthandSelector: true, alternativeFunctionName: "getEntityRecords" }); return getEntityRecords(state, kind, name, query); }; } return result; }, {}); var entityResolvers = entitiesConfig2.reduce((result, entity2) => { const { kind, name, plural } = entity2; const getEntityRecordMethodName = getMethodName(kind, name); result[getEntityRecordMethodName] = (key, query) => { logEntityDeprecation(kind, name, getEntityRecordMethodName, { isShorthandSelector: true, alternativeFunctionName: "getEntityRecord" }); return getEntityRecord2(kind, name, key, query); }; if (plural) { const getEntityRecordsMethodName = getMethodName(kind, plural, "get"); result[getEntityRecordsMethodName] = (...args2) => { logEntityDeprecation(kind, plural, getEntityRecordsMethodName, { isShorthandSelector: true, alternativeFunctionName: "getEntityRecords" }); return getEntityRecords2(kind, name, ...args2); }; result[getEntityRecordsMethodName].shouldInvalidate = (action) => getEntityRecords2.shouldInvalidate(action, kind, name); } return result; }, {}); var entityActions = entitiesConfig2.reduce((result, entity2) => { const { kind, name } = entity2; const saveEntityRecordMethodName = getMethodName(kind, name, "save"); result[saveEntityRecordMethodName] = (record, options) => { logEntityDeprecation(kind, name, saveEntityRecordMethodName, { isShorthandSelector: true, alternativeFunctionName: "saveEntityRecord" }); return saveEntityRecord(kind, name, record, options); }; const deleteEntityRecordMethodName = getMethodName(kind, name, "delete"); result[deleteEntityRecordMethodName] = (key, query, options) => { logEntityDeprecation(kind, name, deleteEntityRecordMethodName, { isShorthandSelector: true, alternativeFunctionName: "deleteEntityRecord" }); return deleteEntityRecord(kind, name, key, query, options); }; return result; }, {}); var storeConfig = () => ({ reducer: reducer_default2, actions: { ...dynamicActions, ...actions_exports, ...entityActions, ...createLocksActions() }, selectors: { ...dynamicSelectors, ...selectors_exports, ...entitySelectors }, resolvers: { ...resolvers_exports, ...entityResolvers } }); var store = (0, import_data16.createReduxStore)(STORE_NAME, storeConfig()); unlock2(store).registerPrivateSelectors(private_selectors_exports); unlock2(store).registerPrivateActions(private_actions_exports); (0, import_data16.register)(store); return __toCommonJS(index_exports); })(); list-reusable-blocks.js000064400000032076152214270310011135 0ustar00var wp; (wp ||= {}).listReusableBlocks = (() => { var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); // package-external:@wordpress/element var require_element = __commonJS({ "package-external:@wordpress/element"(exports, module) { module.exports = window.wp.element; } }); // package-external:@wordpress/i18n var require_i18n = __commonJS({ "package-external:@wordpress/i18n"(exports, module) { module.exports = window.wp.i18n; } }); // package-external:@wordpress/api-fetch var require_api_fetch = __commonJS({ "package-external:@wordpress/api-fetch"(exports, module) { module.exports = window.wp.apiFetch; } }); // package-external:@wordpress/blob var require_blob = __commonJS({ "package-external:@wordpress/blob"(exports, module) { module.exports = window.wp.blob; } }); // package-external:@wordpress/compose var require_compose = __commonJS({ "package-external:@wordpress/compose"(exports, module) { module.exports = window.wp.compose; } }); // package-external:@wordpress/components var require_components = __commonJS({ "package-external:@wordpress/components"(exports, module) { module.exports = window.wp.components; } }); // vendor-external:react/jsx-runtime var require_jsx_runtime = __commonJS({ "vendor-external:react/jsx-runtime"(exports, module) { module.exports = window.ReactJSXRuntime; } }); // packages/list-reusable-blocks/build-module/index.mjs var import_element2 = __toESM(require_element(), 1); var import_i18n3 = __toESM(require_i18n(), 1); // node_modules/tslib/tslib.es6.mjs var __assign = function() { __assign = Object.assign || function __assign2(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; // node_modules/lower-case/dist.es2015/index.js function lowerCase(str) { return str.toLowerCase(); } // node_modules/no-case/dist.es2015/index.js var DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g]; var DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi; function noCase(input, options) { if (options === void 0) { options = {}; } var _a = options.splitRegexp, splitRegexp = _a === void 0 ? DEFAULT_SPLIT_REGEXP : _a, _b = options.stripRegexp, stripRegexp = _b === void 0 ? DEFAULT_STRIP_REGEXP : _b, _c = options.transform, transform = _c === void 0 ? lowerCase : _c, _d = options.delimiter, delimiter = _d === void 0 ? " " : _d; var result = replace(replace(input, splitRegexp, "$1\0$2"), stripRegexp, "\0"); var start = 0; var end = result.length; while (result.charAt(start) === "\0") start++; while (result.charAt(end - 1) === "\0") end--; return result.slice(start, end).split("\0").map(transform).join(delimiter); } function replace(input, re, value) { if (re instanceof RegExp) return input.replace(re, value); return re.reduce(function(input2, re2) { return input2.replace(re2, value); }, input); } // node_modules/dot-case/dist.es2015/index.js function dotCase(input, options) { if (options === void 0) { options = {}; } return noCase(input, __assign({ delimiter: "." }, options)); } // node_modules/param-case/dist.es2015/index.js function paramCase(input, options) { if (options === void 0) { options = {}; } return dotCase(input, __assign({ delimiter: "-" }, options)); } // packages/list-reusable-blocks/build-module/utils/export.mjs var import_api_fetch = __toESM(require_api_fetch(), 1); var import_blob = __toESM(require_blob(), 1); async function exportReusableBlock(id) { const postType = await (0, import_api_fetch.default)({ path: `/wp/v2/types/wp_block` }); const post = await (0, import_api_fetch.default)({ path: `/wp/v2/${postType.rest_base}/${id}?context=edit` }); const title = post.title.raw; const content = post.content.raw; const syncStatus = post.wp_pattern_sync_status; const fileContent = JSON.stringify( { __file: "wp_block", title, content, syncStatus }, null, 2 ); const fileName = paramCase(title) + ".json"; (0, import_blob.downloadBlob)(fileName, fileContent, "application/json"); } var export_default = exportReusableBlock; // packages/list-reusable-blocks/build-module/components/import-dropdown/index.mjs var import_compose2 = __toESM(require_compose(), 1); var import_i18n2 = __toESM(require_i18n(), 1); var import_components2 = __toESM(require_components(), 1); // packages/list-reusable-blocks/build-module/components/import-form/index.mjs var import_element = __toESM(require_element(), 1); var import_compose = __toESM(require_compose(), 1); var import_i18n = __toESM(require_i18n(), 1); var import_components = __toESM(require_components(), 1); // packages/list-reusable-blocks/build-module/utils/import.mjs var import_api_fetch2 = __toESM(require_api_fetch(), 1); // packages/list-reusable-blocks/build-module/utils/file.mjs function readTextFile(file) { const reader = new window.FileReader(); return new Promise((resolve) => { reader.onload = () => { resolve(reader.result); }; reader.readAsText(file); }); } // packages/list-reusable-blocks/build-module/utils/import.mjs async function importReusableBlock(file) { const fileContent = await readTextFile(file); let parsedContent; try { parsedContent = JSON.parse(fileContent); } catch (e) { throw new Error("Invalid JSON file"); } if (parsedContent.__file !== "wp_block" || !parsedContent.title || !parsedContent.content || typeof parsedContent.title !== "string" || typeof parsedContent.content !== "string" || parsedContent.syncStatus && typeof parsedContent.syncStatus !== "string") { throw new Error("Invalid pattern JSON file"); } const postType = await (0, import_api_fetch2.default)({ path: `/wp/v2/types/wp_block` }); const reusableBlock = await (0, import_api_fetch2.default)({ path: `/wp/v2/${postType.rest_base}`, data: { title: parsedContent.title, content: parsedContent.content, status: "publish", meta: parsedContent.syncStatus === "unsynced" ? { wp_pattern_sync_status: parsedContent.syncStatus } : void 0 }, method: "POST" }); return reusableBlock; } var import_default = importReusableBlock; // packages/list-reusable-blocks/build-module/components/import-form/index.mjs var import_jsx_runtime = __toESM(require_jsx_runtime(), 1); function ImportForm({ instanceId, onUpload }) { const inputId = "list-reusable-blocks-import-form-" + instanceId; const formRef = (0, import_element.useRef)(); const [isLoading, setIsLoading] = (0, import_element.useState)(false); const [error, setError] = (0, import_element.useState)(null); const [file, setFile] = (0, import_element.useState)(null); const onChangeFile = (event) => { setFile(event.target.files[0]); setError(null); }; const onSubmit = (event) => { event.preventDefault(); if (!file) { return; } setIsLoading({ isLoading: true }); import_default(file).then((reusableBlock) => { if (!formRef) { return; } setIsLoading(false); onUpload(reusableBlock); }).catch((errors) => { if (!formRef) { return; } let uiMessage; switch (errors.message) { case "Invalid JSON file": uiMessage = (0, import_i18n.__)("Invalid JSON file"); break; case "Invalid pattern JSON file": uiMessage = (0, import_i18n.__)("Invalid pattern JSON file"); break; default: uiMessage = (0, import_i18n.__)("Unknown error"); } setIsLoading(false); setError(uiMessage); }); }; const onDismissError = () => { setError(null); }; return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)( "form", { className: "list-reusable-blocks-import-form", onSubmit, ref: formRef, children: [ error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Notice, { status: "error", onRemove: () => onDismissError(), children: error }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)( "label", { htmlFor: inputId, className: "list-reusable-blocks-import-form__label", children: (0, import_i18n.__)("File") } ), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { id: inputId, type: "file", onChange: onChangeFile }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)( import_components.Button, { __next40pxDefaultSize: true, type: "submit", isBusy: isLoading, accessibleWhenDisabled: true, disabled: !file || isLoading, variant: "secondary", className: "list-reusable-blocks-import-form__button", children: (0, import_i18n._x)("Import", "button label") } ) ] } ); } var import_form_default = (0, import_compose.withInstanceId)(ImportForm); // packages/list-reusable-blocks/build-module/components/import-dropdown/index.mjs var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1); function ImportDropdown({ onUpload }) { return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( import_components2.Dropdown, { popoverProps: { placement: "bottom-start" }, contentClassName: "list-reusable-blocks-import-dropdown__content", renderToggle: ({ isOpen, onToggle }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( import_components2.Button, { size: "compact", className: "list-reusable-blocks-import-dropdown__button", "aria-expanded": isOpen, onClick: onToggle, variant: "primary", children: (0, import_i18n2.__)("Import from JSON") } ), renderContent: ({ onClose }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_form_default, { onUpload: (0, import_compose2.pipe)(onClose, onUpload) }) } ); } var import_dropdown_default = ImportDropdown; // packages/list-reusable-blocks/build-module/index.mjs var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1); document.body.addEventListener("click", (event) => { if (!event.target.classList.contains("wp-list-reusable-blocks__export")) { return; } event.preventDefault(); export_default(event.target.dataset.id); }); document.addEventListener("DOMContentLoaded", () => { const button = document.querySelector(".page-title-action"); if (!button) { return; } const showNotice = () => { const notice = document.createElement("div"); notice.className = "notice notice-success is-dismissible"; notice.innerHTML = `

${(0, import_i18n3.__)("Pattern imported successfully!")}

`; const headerEnd = document.querySelector(".wp-header-end"); if (!headerEnd) { return; } headerEnd.parentNode.insertBefore(notice, headerEnd); }; const container = document.createElement("div"); container.className = "list-reusable-blocks__container"; button.parentNode.insertBefore(container, button); (0, import_element2.createRoot)(container).render( /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_element2.StrictMode, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_dropdown_default, { onUpload: showNotice }) }) ); }); })(); dom.min.js000064400000031167152214270310006450 0ustar00"use strict";var wp;(wp||={}).dom=(()=>{var Dt=Object.create;var v=Object.defineProperty;var At=Object.getOwnPropertyDescriptor;var vt=Object.getOwnPropertyNames;var Ot=Object.getPrototypeOf,Lt=Object.prototype.hasOwnProperty;var Ht=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),B=(t,e)=>{for(var r in e)v(t,r,{get:e[r],enumerable:!0})},Z=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of vt(e))!Lt.call(t,n)&&n!==r&&v(t,n,{get:()=>e[n],enumerable:!(o=At(e,n))||o.enumerable});return t};var Ft=(t,e,r)=>(r=t!=null?Dt(Ot(t)):{},Z(e||!t||!t.__esModule?v(r,"default",{value:t,enumerable:!0}):r,t)),Pt=t=>Z(v({},"__esModule",{value:!0}),t);var ut=Ht((Ye,lt)=>{lt.exports=window.wp.deprecated});var Qt={};B(Qt,{__unstableStripHTML:()=>Nt,computeCaretRect:()=>K,documentHasSelection:()=>et,documentHasTextSelection:()=>E,documentHasUncollapsedSelection:()=>tt,focus:()=>Kt,getFilesFromDataTransfer:()=>Jt,getOffsetParent:()=>rt,getPhrasingContentSchema:()=>Et,getRectangleFromRange:()=>h,getScrollContainer:()=>W,insertAfter:()=>y,isEmpty:()=>R,isEntirelySelected:()=>nt,isFormElement:()=>it,isHorizontalEdge:()=>ft,isNumberInput:()=>dt,isPhrasingContent:()=>A,isRTL:()=>T,isSelectionForward:()=>O,isTextContent:()=>Zt,isTextField:()=>C,isVerticalEdge:()=>mt,placeCaretAtHorizontalEdge:()=>pt,placeCaretAtVerticalEdge:()=>gt,remove:()=>g,removeInvalidHTML:()=>Tt,replace:()=>ht,replaceTag:()=>bt,safeHTML:()=>M,unwrap:()=>w,wrap:()=>xt});var z={};B(z,{find:()=>S});function Mt(t){return[t?'[tabindex]:not([tabindex^="-"])':"[tabindex]","a[href]","button:not([disabled])",'input:not([type="hidden"]):not([disabled])',"select:not([disabled])","textarea:not([disabled])",'iframe:not([tabindex^="-"])',"object","embed","summary","area[href]","[contenteditable]:not([contenteditable=false])"].join(",")}function $(t){return t.offsetWidth>0||t.offsetHeight>0||t.getClientRects().length>0}function Vt(t){let e=t.closest("map[name]");if(!e)return!1;let r=t.ownerDocument.querySelector('img[usemap="#'+e.name+'"]');return!!r&&$(r)}function S(t,{sequential:e=!1}={}){let r=t.querySelectorAll(Mt(e));return Array.from(r).filter(o=>{if(!$(o)||o.closest("[inert]"))return!1;let{nodeName:n}=o;return n==="AREA"?Vt(o):!0})}var k={};B(k,{find:()=>jt,findNext:()=>Wt,findPrevious:()=>kt,isTabbableIndex:()=>J});function U(t){let e=t.getAttribute("tabindex");return e===null?0:parseInt(e,10)}function J(t){return U(t)!==-1}function _t(){let t={};return function(r,o){let{nodeName:n,type:i,checked:a,name:s}=o;if(n!=="INPUT"||i!=="radio"||!s)return r.concat(o);let f=t.hasOwnProperty(s);if(!(a||!f))return r;if(f){let d=t[s];r=r.filter(l=>l!==d)}return t[s]=o,r.concat(o)}}function Bt(t,e){return{element:t,index:e}}function zt(t){return t.element}function Ut(t,e){let r=U(t.element),o=U(e.element);return r===o?t.index-e.index:r-o}function j(t){return t.filter(J).map(Bt).sort(Ut).map(zt).reduce(_t(),[])}function jt(t){return j(S(t))}function kt(t){return j(S(t.ownerDocument.body)).reverse().find(e=>t.compareDocumentPosition(e)&t.DOCUMENT_POSITION_PRECEDING)}function Wt(t){return j(S(t.ownerDocument.body)).find(e=>t.compareDocumentPosition(e)&t.DOCUMENT_POSITION_FOLLOWING)}function h(t){if(!t.collapsed){let i=Array.from(t.getClientRects());if(i.length===1)return i[0];let a=i.filter(({width:l})=>l>1);if(a.length===0)return t.getBoundingClientRect();if(a.length===1)return a[0];let{top:s,bottom:f,left:u,right:d}=a[0];for(let{top:l,bottom:c,left:m,right:N}of a)lf&&(f=c),md&&(d=N);return new window.DOMRect(u,s,d-u,f-s)}let{startContainer:e}=t,{ownerDocument:r}=e;if(e.nodeName==="BR"){let{parentNode:i}=e;let a=Array.from(i.childNodes).indexOf(e);t=r.createRange(),t.setStart(i,a),t.setEnd(i,a)}let o=t.getClientRects();if(o.length>1)return null;let n=o[0];if(!n||n.height===0){let i=r.createTextNode("\u200B");t=t.cloneRange(),t.insertNode(i),n=t.getClientRects()[0],i.parentNode,i.parentNode.removeChild(i)}return n}function K(t){let e=t.getSelection();let r=e.rangeCount?e.getRangeAt(0):null;return r?h(r):null}function E(t){t.defaultView;let e=t.defaultView.getSelection();let r=e.rangeCount?e.getRangeAt(0):null;return!!r&&!r.collapsed}function b(t){return t?.nodeName==="INPUT"}function C(t){let e=["button","checkbox","hidden","file","radio","image","range","reset","submit","number","email","time"];return b(t)&&t.type&&!e.includes(t.type)||t.nodeName==="TEXTAREA"||t.contentEditable==="true"}function Q(t){if(!b(t)&&!C(t))return!1;try{let{selectionStart:e,selectionEnd:r}=t;return e===null||e!==r}catch{return!0}}function tt(t){return E(t)||!!t.activeElement&&Q(t.activeElement)}function et(t){return!!t.activeElement&&(b(t.activeElement)||C(t.activeElement)||E(t))}function p(t){return t.ownerDocument.defaultView,t.ownerDocument.defaultView.getComputedStyle(t)}function W(t,e="vertical"){if(t){if((e==="vertical"||e==="all")&&t.scrollHeight>t.clientHeight){let{overflowY:r}=p(t);if(/(auto|scroll)/.test(r))return t}if((e==="horizontal"||e==="all")&&t.scrollWidth>t.clientWidth){let{overflowX:r}=p(t);if(/(auto|scroll)/.test(r))return t}return t.ownerDocument===t.parentNode?t:W(t.parentNode,e)}}function rt(t){let e;for(;(e=t.parentNode)&&e.nodeType!==e.ELEMENT_NODE;);return e?p(e).position!=="static"?e:e.offsetParent:null}function x(t){return t.tagName==="INPUT"||t.tagName==="TEXTAREA"}var qt="\uFEFF";function nt(t){if(x(t))return t.selectionStart===0&&t.value.length===t.selectionEnd;if(!t.isContentEditable)return!0;let e=t.textContent||"";if(e===""||e===qt)return!0;let{ownerDocument:r}=t,{defaultView:o}=r;let n=o.getSelection();let i=n.rangeCount?n.getRangeAt(0):null;if(!i)return!0;let{startContainer:a,endContainer:s,startOffset:f,endOffset:u}=i;if(a===t&&s===t&&f===0&&u===t.childNodes.length)return!0;let d=t.lastChild;let l=s.nodeType===s.TEXT_NODE?s.data.length:s.childNodes.length;return ot(a,t,"firstChild")&&ot(s,t,"lastChild")&&f===0&&u===l}function ot(t,e,r){let o=e;do{if(t===o)return!0;for(o=o[r];o&&o.nodeType===o.TEXT_NODE&&o.nodeValue==="";)o=o[r==="lastChild"?"previousSibling":"nextSibling"]}while(o);return!1}function it(t){if(!t)return!1;let{tagName:e}=t;return x(t)||e==="BUTTON"||e==="SELECT"}function T(t){return p(t).direction==="rtl"}function at(t){let e=Array.from(t.getClientRects());if(!e.length)return;let r=Math.min(...e.map(({top:n})=>n));return Math.max(...e.map(({bottom:n})=>n))-r}function O(t){let{anchorNode:e,focusNode:r,anchorOffset:o,focusOffset:n}=t;let i=e.compareDocumentPosition(r);return i&e.DOCUMENT_POSITION_PRECEDING?!1:i&e.DOCUMENT_POSITION_FOLLOWING?!0:i===0?o<=n:!0}function st(t,e,r){if(t.caretRangeFromPoint)return t.caretRangeFromPoint(e,r);if(!t.caretPositionFromPoint)return null;let o=t.caretPositionFromPoint(e,r);if(!o)return null;let n=t.createRange();return n.setStart(o.offsetNode,o.offset),n.collapse(!0),n}function L(t,e,r,o){let n=o.style.zIndex,i=o.style.position,a=o.style.borderRadius,{position:s="static"}=p(o);s==="static"&&(o.style.position="relative"),o.style.zIndex="10000",o.style.borderRadius="0";let f=st(t,e,r);return o.style.zIndex=n,o.style.position=i,o.style.borderRadius=a,f}function H(t,e,r){let o=r();return(!o||!o.startContainer||!t.contains(o.startContainer))&&(t.scrollIntoView(e),o=r(),!o||!o.startContainer||!t.contains(o.startContainer))?null:o}function F(t,e,r=!1){if(x(t)&&typeof t.selectionStart=="number")return t.selectionStart!==t.selectionEnd?!1:e?t.selectionStart===0:t.value.length===t.selectionStart;if(!t.isContentEditable)return!0;let{ownerDocument:o}=t,{defaultView:n}=o;let i=n.getSelection();if(!i||!i.rangeCount)return!1;let a=i.getRangeAt(0),s=a.cloneRange(),f=O(i),u=i.isCollapsed;u||s.collapse(!f);let d=h(s),l=h(a);if(!d||!l)return!1;let c=at(a);if(!u&&c&&c>d.height&&f===e)return!1;let m=T(t)?!e:e,N=t.getBoundingClientRect(),yt=m?N.left+1:N.right-1,wt=e?N.top+1:N.bottom-1,q=H(t,e,()=>L(o,yt,wt,t));if(!q)return!1;let _=h(q);if(!_)return!1;let G=e?"top":"bottom",X=m?"left":"right",It=_[G]-l[G],St=_[X]-d[X],Y=Math.abs(It)<=1,Rt=Math.abs(St)<=1;return r?Y:Y&&Rt}function ft(t,e){return F(t,e)}var ct=Ft(ut(),1);function dt(t){return(0,ct.default)("wp.dom.isNumberInput",{since:"6.1",version:"6.5"}),b(t)&&t.type==="number"&&!isNaN(t.valueAsNumber)}function mt(t,e){return F(t,e,!0)}function Gt(t,e,r){let{ownerDocument:o}=t,n=T(t)?!e:e,i=t.getBoundingClientRect();r===void 0?r=e?i.right-1:i.left+1:r<=i.left?r=i.left+1:r>=i.right&&(r=i.right-1);let a=n?i.bottom-1:i.top+1;return L(o,r,a,t)}function P(t,e,r){if(!t)return;if(t.focus(),x(t)){if(typeof t.selectionStart!="number")return;e?(t.selectionStart=t.value.length,t.selectionEnd=t.value.length):(t.selectionStart=0,t.selectionEnd=0);return}if(!t.isContentEditable)return;let o=H(t,e,()=>Gt(t,e,r));if(!o)return;let{ownerDocument:n}=t,{defaultView:i}=n;let a=i.getSelection();a.removeAllRanges(),a.addRange(o)}function pt(t,e){return P(t,e,void 0)}function gt(t,e,r){return P(t,e,r?.left)}function y(t,e){e.parentNode,e.parentNode.insertBefore(t,e.nextSibling)}function g(t){t.parentNode,t.parentNode.removeChild(t)}function ht(t,e){t.parentNode,y(e,t.parentNode),g(t)}function w(t){let e=t.parentNode;for(;t.firstChild;)e.insertBefore(t.firstChild,t);e.removeChild(t)}function bt(t,e){let r=t.ownerDocument.createElement(e);for(;t.firstChild;)r.appendChild(t.firstChild);return t.parentNode,t.parentNode.replaceChild(r,t),r}function xt(t,e){e.parentNode,e.parentNode.insertBefore(t,e),t.appendChild(e)}function M(t){let{body:e}=document.implementation.createHTMLDocument("");e.innerHTML=t;let r=e.getElementsByTagName("*"),o=r.length;for(;o--;){let n=r[o];if(n.tagName==="SCRIPT")g(n);else{let i=n.attributes.length;for(;i--;){let{name:a}=n.attributes[i];a.startsWith("on")&&n.removeAttribute(a)}}}return e.innerHTML}function Nt(t){t=M(t);let e=document.implementation.createHTMLDocument("");return e.body.innerHTML=t,e.body.textContent||""}function R(t){switch(t.nodeType){case t.TEXT_NODE:return/^[ \f\n\r\t\v\u00a0]*$/.test(t.nodeValue||"");case t.ELEMENT_NODE:return t.hasAttributes()?!1:t.hasChildNodes()?Array.from(t.childNodes).every(R):!0;default:return!0}}var D={strong:{},em:{},s:{},del:{},ins:{},a:{attributes:["href","target","rel","id"]},code:{},abbr:{attributes:["title"]},sub:{},sup:{},br:{},small:{},q:{attributes:["cite"]},dfn:{attributes:["title"]},data:{attributes:["value"]},time:{attributes:["datetime"]},var:{},samp:{},kbd:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{attributes:["dir"]},bdo:{attributes:["dir"]},wbr:{},"#text":{}},Xt=["#text","br"];Object.keys(D).filter(t=>!Xt.includes(t)).forEach(t=>{let{[t]:e,...r}=D;D[t].children=r});var Yt={audio:{attributes:["src","preload","autoplay","mediagroup","loop","muted"]},canvas:{attributes:["width","height"]},embed:{attributes:["src","type","width","height"]},img:{attributes:["alt","src","srcset","usemap","ismap","width","height"]},object:{attributes:["data","type","name","usemap","form","width","height"]},video:{attributes:["src","poster","preload","playsinline","autoplay","mediagroup","loop","muted","controls","width","height"]},math:{attributes:["display","xmlns"],children:"*"}},V={...D,...Yt};function Et(t){if(t!=="paste")return V;let{u:e,abbr:r,data:o,time:n,wbr:i,bdi:a,bdo:s,...f}={...V,ins:{children:V.ins.children},del:{children:V.del.children}};return f}function A(t){let e=t.nodeName.toLowerCase();return Et().hasOwnProperty(e)||e==="span"}function Zt(t){let e=t.nodeName.toLowerCase();return D.hasOwnProperty(e)||e==="span"}function Ct(t){return!!t&&t.nodeType===t.ELEMENT_NODE}var $t=()=>{};function I(t,e,r,o){Array.from(t).forEach(n=>{let i=n.nodeName.toLowerCase();if(r.hasOwnProperty(i)&&(!r[i].isMatch||r[i].isMatch?.(n))){if(Ct(n)){let{attributes:a=[],classes:s=[],children:f,require:u=[],allowEmpty:d}=r[i];if(f&&!d&&R(n)){g(n);return}if(n.hasAttributes()&&(Array.from(n.attributes).forEach(({name:l})=>{l!=="class"&&!a.includes(l)&&n.removeAttribute(l)}),n.classList&&n.classList.length)){let l=s.map(c=>c==="*"?()=>!0:typeof c=="string"?m=>m===c:c instanceof RegExp?m=>c.test(m):$t);Array.from(n.classList).forEach(c=>{l.some(m=>m(c))||n.classList.remove(c)}),n.classList.length||n.removeAttribute("class")}if(n.hasChildNodes()){if(f==="*")return;if(f)u.length&&!n.querySelector(u.join(","))?(I(n.childNodes,e,r,o),w(n)):n.parentNode&&n.parentNode.nodeName==="BODY"&&A(n)?(I(n.childNodes,e,r,o),Array.from(n.childNodes).some(l=>!A(l))&&w(n)):I(n.childNodes,e,f,o);else for(;n.firstChild;)g(n.firstChild)}}}else I(n.childNodes,e,r,o),o&&!A(n)&&n.nextElementSibling&&y(e.createElement("br"),n),w(n)})}function Tt(t,e,r){let o=document.implementation.createHTMLDocument("");return o.body.innerHTML=t,I(o.body.childNodes,o,e,r),o.body.innerHTML}function Jt(t){let e=Array.from(t.files);return Array.from(t.items).forEach(r=>{let o=r.getAsFile();o&&!e.find(({name:n,type:i,size:a})=>n===o.name&&i===o.type&&a===o.size)&&e.push(o)}),e}var Kt={focusable:z,tabbable:k};return Pt(Qt);})(); block-directory.js000064400000157256152214270310010213 0ustar00var wp; (wp ||= {}).blockDirectory = (() => { var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // package-external:@wordpress/plugins var require_plugins = __commonJS({ "package-external:@wordpress/plugins"(exports, module) { module.exports = window.wp.plugins; } }); // package-external:@wordpress/hooks var require_hooks = __commonJS({ "package-external:@wordpress/hooks"(exports, module) { module.exports = window.wp.hooks; } }); // package-external:@wordpress/blocks var require_blocks = __commonJS({ "package-external:@wordpress/blocks"(exports, module) { module.exports = window.wp.blocks; } }); // package-external:@wordpress/data var require_data = __commonJS({ "package-external:@wordpress/data"(exports, module) { module.exports = window.wp.data; } }); // package-external:@wordpress/element var require_element = __commonJS({ "package-external:@wordpress/element"(exports, module) { module.exports = window.wp.element; } }); // package-external:@wordpress/editor var require_editor = __commonJS({ "package-external:@wordpress/editor"(exports, module) { module.exports = window.wp.editor; } }); // package-external:@wordpress/block-editor var require_block_editor = __commonJS({ "package-external:@wordpress/block-editor"(exports, module) { module.exports = window.wp.blockEditor; } }); // package-external:@wordpress/i18n var require_i18n = __commonJS({ "package-external:@wordpress/i18n"(exports, module) { module.exports = window.wp.i18n; } }); // package-external:@wordpress/api-fetch var require_api_fetch = __commonJS({ "package-external:@wordpress/api-fetch"(exports, module) { module.exports = window.wp.apiFetch; } }); // package-external:@wordpress/notices var require_notices = __commonJS({ "package-external:@wordpress/notices"(exports, module) { module.exports = window.wp.notices; } }); // package-external:@wordpress/url var require_url = __commonJS({ "package-external:@wordpress/url"(exports, module) { module.exports = window.wp.url; } }); // package-external:@wordpress/compose var require_compose = __commonJS({ "package-external:@wordpress/compose"(exports, module) { module.exports = window.wp.compose; } }); // package-external:@wordpress/components var require_components = __commonJS({ "package-external:@wordpress/components"(exports, module) { module.exports = window.wp.components; } }); // package-external:@wordpress/core-data var require_core_data = __commonJS({ "package-external:@wordpress/core-data"(exports, module) { module.exports = window.wp.coreData; } }); // package-external:@wordpress/html-entities var require_html_entities = __commonJS({ "package-external:@wordpress/html-entities"(exports, module) { module.exports = window.wp.htmlEntities; } }); // package-external:@wordpress/primitives var require_primitives = __commonJS({ "package-external:@wordpress/primitives"(exports, module) { module.exports = window.wp.primitives; } }); // vendor-external:react/jsx-runtime var require_jsx_runtime = __commonJS({ "vendor-external:react/jsx-runtime"(exports, module) { module.exports = window.ReactJSXRuntime; } }); // package-external:@wordpress/a11y var require_a11y = __commonJS({ "package-external:@wordpress/a11y"(exports, module) { module.exports = window.wp.a11y; } }); // packages/block-directory/build-module/index.mjs var index_exports = {}; __export(index_exports, { store: () => store }); // packages/block-directory/build-module/plugins/index.mjs var import_plugins = __toESM(require_plugins(), 1); var import_hooks = __toESM(require_hooks(), 1); // packages/block-directory/build-module/components/auto-block-uninstaller/index.mjs var import_blocks2 = __toESM(require_blocks(), 1); var import_data4 = __toESM(require_data(), 1); var import_element = __toESM(require_element(), 1); var import_editor = __toESM(require_editor(), 1); // packages/block-directory/build-module/store/index.mjs var import_data3 = __toESM(require_data(), 1); // packages/block-directory/build-module/store/reducer.mjs var import_data = __toESM(require_data(), 1); var downloadableBlocks = (state = {}, action) => { switch (action.type) { case "FETCH_DOWNLOADABLE_BLOCKS": return { ...state, [action.filterValue]: { isRequesting: true } }; case "RECEIVE_DOWNLOADABLE_BLOCKS": return { ...state, [action.filterValue]: { results: action.downloadableBlocks, isRequesting: false } }; } return state; }; var blockManagement = (state = { installedBlockTypes: [], isInstalling: {} }, action) => { switch (action.type) { case "ADD_INSTALLED_BLOCK_TYPE": return { ...state, installedBlockTypes: [ ...state.installedBlockTypes, action.item ] }; case "REMOVE_INSTALLED_BLOCK_TYPE": return { ...state, installedBlockTypes: state.installedBlockTypes.filter( (blockType) => blockType.name !== action.item.name ) }; case "SET_INSTALLING_BLOCK": return { ...state, isInstalling: { ...state.isInstalling, [action.blockId]: action.isInstalling } }; } return state; }; var errorNotices = (state = {}, action) => { switch (action.type) { case "SET_ERROR_NOTICE": return { ...state, [action.blockId]: { message: action.message, isFatal: action.isFatal } }; case "CLEAR_ERROR_NOTICE": const { [action.blockId]: blockId, ...restState } = state; return restState; } return state; }; var reducer_default = (0, import_data.combineReducers)({ downloadableBlocks, blockManagement, errorNotices }); // packages/block-directory/build-module/store/selectors.mjs var selectors_exports = {}; __export(selectors_exports, { getDownloadableBlocks: () => getDownloadableBlocks, getErrorNoticeForBlock: () => getErrorNoticeForBlock, getErrorNotices: () => getErrorNotices, getInstalledBlockTypes: () => getInstalledBlockTypes, getNewBlockTypes: () => getNewBlockTypes, getUnusedBlockTypes: () => getUnusedBlockTypes, isInstalling: () => isInstalling, isRequestingDownloadableBlocks: () => isRequestingDownloadableBlocks }); var import_data2 = __toESM(require_data(), 1); var import_block_editor = __toESM(require_block_editor(), 1); var EMPTY_ARRAY = []; function isRequestingDownloadableBlocks(state, filterValue) { return state.downloadableBlocks[filterValue]?.isRequesting ?? false; } function getDownloadableBlocks(state, filterValue) { return state.downloadableBlocks[filterValue]?.results ?? EMPTY_ARRAY; } function getInstalledBlockTypes(state) { return state.blockManagement.installedBlockTypes; } var getNewBlockTypes = (0, import_data2.createRegistrySelector)( (select) => (0, import_data2.createSelector)( (state) => { const installedBlockTypes = getInstalledBlockTypes(state); if (!installedBlockTypes.length) { return EMPTY_ARRAY; } const { getBlockName, getClientIdsWithDescendants } = select(import_block_editor.store); const installedBlockNames = installedBlockTypes.map( (blockType) => blockType.name ); const foundBlockNames = getClientIdsWithDescendants().flatMap( (clientId) => { const blockName = getBlockName(clientId); return installedBlockNames.includes(blockName) ? blockName : []; } ); const newBlockTypes = installedBlockTypes.filter( (blockType) => foundBlockNames.includes(blockType.name) ); return newBlockTypes.length > 0 ? newBlockTypes : EMPTY_ARRAY; }, (state) => [ getInstalledBlockTypes(state), select(import_block_editor.store).getClientIdsWithDescendants() ] ) ); var getUnusedBlockTypes = (0, import_data2.createRegistrySelector)( (select) => (0, import_data2.createSelector)( (state) => { const installedBlockTypes = getInstalledBlockTypes(state); if (!installedBlockTypes.length) { return EMPTY_ARRAY; } const { getBlockName, getClientIdsWithDescendants } = select(import_block_editor.store); const installedBlockNames = installedBlockTypes.map( (blockType) => blockType.name ); const foundBlockNames = getClientIdsWithDescendants().flatMap( (clientId) => { const blockName = getBlockName(clientId); return installedBlockNames.includes(blockName) ? blockName : []; } ); const unusedBlockTypes = installedBlockTypes.filter( (blockType) => !foundBlockNames.includes(blockType.name) ); return unusedBlockTypes.length > 0 ? unusedBlockTypes : EMPTY_ARRAY; }, (state) => [ getInstalledBlockTypes(state), select(import_block_editor.store).getClientIdsWithDescendants() ] ) ); function isInstalling(state, blockId) { return state.blockManagement.isInstalling[blockId] || false; } function getErrorNotices(state) { return state.errorNotices; } function getErrorNoticeForBlock(state, blockId) { return state.errorNotices[blockId]; } // packages/block-directory/build-module/store/actions.mjs var actions_exports = {}; __export(actions_exports, { addInstalledBlockType: () => addInstalledBlockType, clearErrorNotice: () => clearErrorNotice, fetchDownloadableBlocks: () => fetchDownloadableBlocks, installBlockType: () => installBlockType, receiveDownloadableBlocks: () => receiveDownloadableBlocks, removeInstalledBlockType: () => removeInstalledBlockType, setErrorNotice: () => setErrorNotice, setIsInstalling: () => setIsInstalling, uninstallBlockType: () => uninstallBlockType }); var import_blocks = __toESM(require_blocks(), 1); var import_i18n = __toESM(require_i18n(), 1); var import_api_fetch2 = __toESM(require_api_fetch(), 1); var import_notices = __toESM(require_notices(), 1); var import_url = __toESM(require_url(), 1); // packages/block-directory/build-module/store/load-assets.mjs var import_api_fetch = __toESM(require_api_fetch(), 1); var loadAsset = (el) => { return new Promise((resolve, reject) => { const newNode = document.createElement(el.nodeName); ["id", "rel", "src", "href", "type"].forEach((attr) => { if (el[attr]) { newNode[attr] = el[attr]; } }); if (el.innerHTML) { newNode.appendChild(document.createTextNode(el.innerHTML)); } newNode.onload = () => resolve(true); newNode.onerror = () => reject(new Error("Error loading asset.")); document.body.appendChild(newNode); if ("link" === newNode.nodeName.toLowerCase() || "script" === newNode.nodeName.toLowerCase() && !newNode.src) { resolve(); } }); }; async function loadAssets() { const response = await (0, import_api_fetch.default)({ url: document.location.href, parse: false }); const data = await response.text(); const doc = new window.DOMParser().parseFromString(data, "text/html"); const newAssets = Array.from( doc.querySelectorAll('link[rel="stylesheet"],script') ).filter((asset) => asset.id && !document.getElementById(asset.id)); for (const newAsset of newAssets) { await loadAsset(newAsset); } } // packages/block-directory/build-module/store/utils/get-plugin-url.mjs function getPluginUrl(block) { if (!block) { return false; } const link = block.links["wp:plugin"] || block.links.self; if (link && link.length) { return link[0].href; } return false; } // packages/block-directory/build-module/store/actions.mjs function fetchDownloadableBlocks(filterValue) { return { type: "FETCH_DOWNLOADABLE_BLOCKS", filterValue }; } function receiveDownloadableBlocks(downloadableBlocks2, filterValue) { return { type: "RECEIVE_DOWNLOADABLE_BLOCKS", downloadableBlocks: downloadableBlocks2, filterValue }; } var installBlockType = (block) => async ({ registry, dispatch }) => { const { id, name } = block; let success = false; dispatch.clearErrorNotice(id); try { dispatch.setIsInstalling(id, true); const url = getPluginUrl(block); let links = {}; if (url) { await (0, import_api_fetch2.default)({ method: "PUT", url, data: { status: "active" } }); } else { const response = await (0, import_api_fetch2.default)({ method: "POST", path: "wp/v2/plugins", data: { slug: id, status: "active" } }); links = response._links; } dispatch.addInstalledBlockType({ ...block, links: { ...block.links, ...links } }); const metadataFields = [ "api_version", "title", "category", "parent", "ancestor", "icon", "description", "keywords", "attributes", "provides_context", "uses_context", "selectors", "supports", "styles", "example", "variations", "allowed_blocks", "block_hooks" ]; await (0, import_api_fetch2.default)({ path: (0, import_url.addQueryArgs)(`/wp/v2/block-types/${name}`, { _fields: metadataFields }) }).catch(() => { }).then((response) => { if (!response) { return; } (0, import_blocks.unstable__bootstrapServerSideBlockDefinitions)({ [name]: Object.fromEntries( Object.entries(response).filter( ([key]) => metadataFields.includes(key) ) ) }); }); await loadAssets(); const registeredBlocks = registry.select(import_blocks.store).getBlockTypes(); if (!registeredBlocks.some((i) => i.name === name)) { throw new Error( (0, import_i18n.__)("Error registering block. Try reloading the page.") ); } registry.dispatch(import_notices.store).createInfoNotice( (0, import_i18n.sprintf)( // translators: %s is the block title. (0, import_i18n.__)("Block %s installed and added."), block.title ), { speak: true, type: "snackbar" } ); success = true; } catch (error) { let message = error.message || (0, import_i18n.__)("An error occurred."); let isFatal = error instanceof Error; const fatalAPIErrors = { folder_exists: (0, import_i18n.__)( "This block is already installed. Try reloading the page." ), unable_to_connect_to_filesystem: (0, import_i18n.__)( "Error installing block. You can reload the page and try again." ) }; if (fatalAPIErrors[error.code]) { isFatal = true; message = fatalAPIErrors[error.code]; } dispatch.setErrorNotice(id, message, isFatal); registry.dispatch(import_notices.store).createErrorNotice(message, { speak: true, isDismissible: true }); } dispatch.setIsInstalling(id, false); return success; }; var uninstallBlockType = (block) => async ({ registry, dispatch }) => { try { const url = getPluginUrl(block); await (0, import_api_fetch2.default)({ method: "PUT", url, data: { status: "inactive" } }); await (0, import_api_fetch2.default)({ method: "DELETE", url }); dispatch.removeInstalledBlockType(block); } catch (error) { registry.dispatch(import_notices.store).createErrorNotice( error.message || (0, import_i18n.__)("An error occurred.") ); } }; function addInstalledBlockType(item) { return { type: "ADD_INSTALLED_BLOCK_TYPE", item }; } function removeInstalledBlockType(item) { return { type: "REMOVE_INSTALLED_BLOCK_TYPE", item }; } function setIsInstalling(blockId, isInstalling2) { return { type: "SET_INSTALLING_BLOCK", blockId, isInstalling: isInstalling2 }; } function setErrorNotice(blockId, message, isFatal = false) { return { type: "SET_ERROR_NOTICE", blockId, message, isFatal }; } function clearErrorNotice(blockId) { return { type: "CLEAR_ERROR_NOTICE", blockId }; } // packages/block-directory/build-module/store/resolvers.mjs var resolvers_exports = {}; __export(resolvers_exports, { getDownloadableBlocks: () => getDownloadableBlocks2 }); // node_modules/tslib/tslib.es6.mjs var __assign = function() { __assign = Object.assign || function __assign2(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; // node_modules/lower-case/dist.es2015/index.js function lowerCase(str) { return str.toLowerCase(); } // node_modules/no-case/dist.es2015/index.js var DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g]; var DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi; function noCase(input, options) { if (options === void 0) { options = {}; } var _a = options.splitRegexp, splitRegexp = _a === void 0 ? DEFAULT_SPLIT_REGEXP : _a, _b = options.stripRegexp, stripRegexp = _b === void 0 ? DEFAULT_STRIP_REGEXP : _b, _c = options.transform, transform = _c === void 0 ? lowerCase : _c, _d = options.delimiter, delimiter = _d === void 0 ? " " : _d; var result = replace(replace(input, splitRegexp, "$1\0$2"), stripRegexp, "\0"); var start = 0; var end = result.length; while (result.charAt(start) === "\0") start++; while (result.charAt(end - 1) === "\0") end--; return result.slice(start, end).split("\0").map(transform).join(delimiter); } function replace(input, re, value) { if (re instanceof RegExp) return input.replace(re, value); return re.reduce(function(input2, re2) { return input2.replace(re2, value); }, input); } // node_modules/pascal-case/dist.es2015/index.js function pascalCaseTransform(input, index) { var firstChar = input.charAt(0); var lowerChars = input.substr(1).toLowerCase(); if (index > 0 && firstChar >= "0" && firstChar <= "9") { return "_" + firstChar + lowerChars; } return "" + firstChar.toUpperCase() + lowerChars; } function pascalCase(input, options) { if (options === void 0) { options = {}; } return noCase(input, __assign({ delimiter: "", transform: pascalCaseTransform }, options)); } // node_modules/camel-case/dist.es2015/index.js function camelCaseTransform(input, index) { if (index === 0) return input.toLowerCase(); return pascalCaseTransform(input, index); } function camelCase(input, options) { if (options === void 0) { options = {}; } return pascalCase(input, __assign({ transform: camelCaseTransform }, options)); } // packages/block-directory/build-module/store/resolvers.mjs var import_api_fetch3 = __toESM(require_api_fetch(), 1); var getDownloadableBlocks2 = (filterValue) => async ({ dispatch }) => { if (!filterValue) { return; } try { dispatch(fetchDownloadableBlocks(filterValue)); const results = await (0, import_api_fetch3.default)({ path: `wp/v2/block-directory/search?term=${filterValue}` }); const blocks = results.map( (result) => Object.fromEntries( Object.entries(result).map(([key, value]) => [ camelCase(key), value ]) ) ); dispatch(receiveDownloadableBlocks(blocks, filterValue)); } catch { dispatch(receiveDownloadableBlocks([], filterValue)); } }; // packages/block-directory/build-module/store/index.mjs var STORE_NAME = "core/block-directory"; var storeConfig = { reducer: reducer_default, selectors: selectors_exports, actions: actions_exports, resolvers: resolvers_exports }; var store = (0, import_data3.createReduxStore)(STORE_NAME, storeConfig); (0, import_data3.register)(store); // packages/block-directory/build-module/components/auto-block-uninstaller/index.mjs function AutoBlockUninstaller() { const { uninstallBlockType: uninstallBlockType2 } = (0, import_data4.useDispatch)(store); const shouldRemoveBlockTypes = (0, import_data4.useSelect)((select) => { const { isAutosavingPost, isSavingPost } = select(import_editor.store); return isSavingPost() && !isAutosavingPost(); }, []); const unusedBlockTypes = (0, import_data4.useSelect)( (select) => select(store).getUnusedBlockTypes(), [] ); (0, import_element.useEffect)(() => { if (shouldRemoveBlockTypes && unusedBlockTypes.length) { unusedBlockTypes.forEach((blockType) => { uninstallBlockType2(blockType); (0, import_blocks2.unregisterBlockType)(blockType.name); }); } }, [shouldRemoveBlockTypes]); return null; } // packages/block-directory/build-module/plugins/inserter-menu-downloadable-blocks-panel/index.mjs var import_block_editor3 = __toESM(require_block_editor(), 1); var import_compose = __toESM(require_compose(), 1); var import_element5 = __toESM(require_element(), 1); // packages/block-directory/build-module/components/downloadable-blocks-panel/index.mjs var import_i18n8 = __toESM(require_i18n(), 1); var import_components4 = __toESM(require_components(), 1); var import_core_data = __toESM(require_core_data(), 1); var import_data8 = __toESM(require_data(), 1); var import_blocks5 = __toESM(require_blocks(), 1); // packages/block-directory/build-module/components/downloadable-blocks-list/index.mjs var import_i18n5 = __toESM(require_i18n(), 1); var import_components2 = __toESM(require_components(), 1); var import_blocks4 = __toESM(require_blocks(), 1); var import_data7 = __toESM(require_data(), 1); // node_modules/clsx/dist/clsx.mjs function r(e) { var t, f, n = ""; if ("string" == typeof e || "number" == typeof e) n += e; else if ("object" == typeof e) if (Array.isArray(e)) { var o = e.length; for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f); } else for (f in e) e[f] && (n && (n += " "), n += f); return n; } function clsx() { for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t); return n; } var clsx_default = clsx; // packages/block-directory/build-module/components/downloadable-block-list-item/index.mjs var import_i18n4 = __toESM(require_i18n(), 1); var import_components = __toESM(require_components(), 1); var import_element3 = __toESM(require_element(), 1); var import_html_entities = __toESM(require_html_entities(), 1); var import_blocks3 = __toESM(require_blocks(), 1); var import_data6 = __toESM(require_data(), 1); // packages/block-directory/build-module/components/block-ratings/stars.mjs var import_i18n2 = __toESM(require_i18n(), 1); // packages/icons/build-module/icon/index.mjs var import_element2 = __toESM(require_element(), 1); var icon_default = (0, import_element2.forwardRef)( ({ icon, size = 24, ...props }, ref) => { return (0, import_element2.cloneElement)(icon, { width: size, height: size, ...props, ref }); } ); // packages/icons/build-module/library/star-empty.mjs var import_primitives = __toESM(require_primitives(), 1); var import_jsx_runtime = __toESM(require_jsx_runtime(), 1); var star_empty_default = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_primitives.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_primitives.Path, { fillRule: "evenodd", clipRule: "evenodd", d: "M9.706 8.646a.25.25 0 01-.188.137l-4.626.672a.25.25 0 00-.139.427l3.348 3.262a.25.25 0 01.072.222l-.79 4.607a.25.25 0 00.362.264l4.138-2.176a.25.25 0 01.233 0l4.137 2.175a.25.25 0 00.363-.263l-.79-4.607a.25.25 0 01.072-.222l3.347-3.262a.25.25 0 00-.139-.427l-4.626-.672a.25.25 0 01-.188-.137l-2.069-4.192a.25.25 0 00-.448 0L9.706 8.646zM12 7.39l-.948 1.921a1.75 1.75 0 01-1.317.957l-2.12.308 1.534 1.495c.412.402.6.982.503 1.55l-.362 2.11 1.896-.997a1.75 1.75 0 011.629 0l1.895.997-.362-2.11a1.75 1.75 0 01.504-1.55l1.533-1.495-2.12-.308a1.75 1.75 0 01-1.317-.957L12 7.39z" }) }); // packages/icons/build-module/library/star-filled.mjs var import_primitives2 = __toESM(require_primitives(), 1); var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1); var star_filled_default = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_primitives2.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_primitives2.Path, { d: "M11.776 4.454a.25.25 0 01.448 0l2.069 4.192a.25.25 0 00.188.137l4.626.672a.25.25 0 01.139.426l-3.348 3.263a.25.25 0 00-.072.222l.79 4.607a.25.25 0 01-.362.263l-4.138-2.175a.25.25 0 00-.232 0l-4.138 2.175a.25.25 0 01-.363-.263l.79-4.607a.25.25 0 00-.071-.222L4.754 9.881a.25.25 0 01.139-.426l4.626-.672a.25.25 0 00.188-.137l2.069-4.192z" }) }); // packages/icons/build-module/library/star-half.mjs var import_primitives3 = __toESM(require_primitives(), 1); var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1); var star_half_default = /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_primitives3.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_primitives3.Path, { d: "M9.518 8.783a.25.25 0 00.188-.137l2.069-4.192a.25.25 0 01.448 0l2.07 4.192a.25.25 0 00.187.137l4.626.672a.25.25 0 01.139.427l-3.347 3.262a.25.25 0 00-.072.222l.79 4.607a.25.25 0 01-.363.264l-4.137-2.176a.25.25 0 00-.233 0l-4.138 2.175a.25.25 0 01-.362-.263l.79-4.607a.25.25 0 00-.072-.222L4.753 9.882a.25.25 0 01.14-.427l4.625-.672zM12 14.533c.28 0 .559.067.814.2l1.895.997-.362-2.11a1.75 1.75 0 01.504-1.55l1.533-1.495-2.12-.308a1.75 1.75 0 01-1.317-.957L12 7.39v7.143z" }) }); // packages/block-directory/build-module/components/block-ratings/stars.mjs var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1); function Stars({ rating }) { const stars = Math.round(rating / 0.5) * 0.5; const fullStarCount = Math.floor(rating); const halfStarCount = Math.ceil(rating - fullStarCount); const emptyStarCount = 5 - (fullStarCount + halfStarCount); return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)( "span", { "aria-label": (0, import_i18n2.sprintf)( /* translators: %s: number of stars. */ (0, import_i18n2.__)("%s out of 5 stars"), stars ), children: [ Array.from({ length: fullStarCount }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)( icon_default, { className: "block-directory-block-ratings__star-full", icon: star_filled_default, size: 16 }, `full_stars_${i}` )), Array.from({ length: halfStarCount }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)( icon_default, { className: "block-directory-block-ratings__star-half-full", icon: star_half_default, size: 16 }, `half_stars_${i}` )), Array.from({ length: emptyStarCount }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)( icon_default, { className: "block-directory-block-ratings__star-empty", icon: star_empty_default, size: 16 }, `empty_stars_${i}` )) ] } ); } var stars_default = Stars; // packages/block-directory/build-module/components/block-ratings/index.mjs var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1); var BlockRatings = ({ rating }) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "block-directory-block-ratings", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(stars_default, { rating }) }); var block_ratings_default = BlockRatings; // packages/block-directory/build-module/components/downloadable-block-icon/index.mjs var import_block_editor2 = __toESM(require_block_editor(), 1); var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1); function DownloadableBlockIcon({ icon }) { const className = "block-directory-downloadable-block-icon"; return icon.match(/\.(jpeg|jpg|gif|png|svg)(?:\?.*)?$/) !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("img", { className, src: icon, alt: "" }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_block_editor2.BlockIcon, { className, icon, showColors: true }); } var downloadable_block_icon_default = DownloadableBlockIcon; // packages/block-directory/build-module/components/downloadable-block-notice/index.mjs var import_i18n3 = __toESM(require_i18n(), 1); var import_data5 = __toESM(require_data(), 1); var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1); var DownloadableBlockNotice = ({ block }) => { const errorNotice = (0, import_data5.useSelect)( (select) => select(store).getErrorNoticeForBlock(block.id), [block] ); if (!errorNotice) { return null; } return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "block-directory-downloadable-block-notice", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "block-directory-downloadable-block-notice__content", children: [ errorNotice.message, errorNotice.isFatal ? " " + (0, import_i18n3.__)("Try reloading the page.") : null ] }) }); }; var downloadable_block_notice_default = DownloadableBlockNotice; // packages/block-directory/build-module/components/downloadable-block-list-item/index.mjs var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1); function getDownloadableBlockLabel({ title, rating, ratingCount }, { hasNotice, isInstalled, isInstalling: isInstalling2 }) { const stars = Math.round(rating / 0.5) * 0.5; if (!isInstalled && hasNotice) { return (0, import_i18n4.sprintf)("Retry installing %s.", (0, import_html_entities.decodeEntities)(title)); } if (isInstalled) { return (0, import_i18n4.sprintf)("Add %s.", (0, import_html_entities.decodeEntities)(title)); } if (isInstalling2) { return (0, import_i18n4.sprintf)("Installing %s.", (0, import_html_entities.decodeEntities)(title)); } if (ratingCount < 1) { return (0, import_i18n4.sprintf)("Install %s.", (0, import_html_entities.decodeEntities)(title)); } return (0, import_i18n4.sprintf)( /* translators: 1: block title, 2: average rating, 3: total ratings count. */ (0, import_i18n4._n)( "Install %1$s. %2$s stars with %3$s review.", "Install %1$s. %2$s stars with %3$s reviews.", ratingCount ), (0, import_html_entities.decodeEntities)(title), stars, ratingCount ); } function DownloadableBlockListItem({ item, onClick }) { const { author, description, icon, rating, title } = item; const isInstalled = !!(0, import_blocks3.getBlockType)(item.name); const { hasNotice, isInstalling: isInstalling2, isInstallable } = (0, import_data6.useSelect)( (select) => { const { getErrorNoticeForBlock: getErrorNoticeForBlock2, isInstalling: isBlockInstalling } = select(store); const notice = getErrorNoticeForBlock2(item.id); const hasFatal = notice && notice.isFatal; return { hasNotice: !!notice, isInstalling: isBlockInstalling(item.id), isInstallable: !hasFatal }; }, [item] ); let statusText = ""; if (isInstalled) { statusText = (0, import_i18n4.__)("Installed!"); } else if (isInstalling2) { statusText = (0, import_i18n4.__)("Installing\u2026"); } const itemLabel = getDownloadableBlockLabel(item, { hasNotice, isInstalled, isInstalling: isInstalling2 }); return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_components.Tooltip, { placement: "top", text: itemLabel, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)( import_components.Composite.Item, { className: clsx_default( "block-directory-downloadable-block-list-item", isInstalling2 && "is-installing" ), accessibleWhenDisabled: true, disabled: isInstalling2 || !isInstallable, onClick: (event) => { event.preventDefault(); onClick(); }, "aria-label": itemLabel, type: "button", role: "option", children: [ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "block-directory-downloadable-block-list-item__icon", children: [ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(downloadable_block_icon_default, { icon, title }), isInstalling2 ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "block-directory-downloadable-block-list-item__spinner", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_components.Spinner, {}) }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(block_ratings_default, { rating }) ] }), /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { className: "block-directory-downloadable-block-list-item__details", children: [ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "block-directory-downloadable-block-list-item__title", children: (0, import_element3.createInterpolateElement)( (0, import_i18n4.sprintf)( /* translators: 1: block title. 2: author name. */ (0, import_i18n4.__)("%1$s by %2$s"), (0, import_html_entities.decodeEntities)(title), author ), { span: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "block-directory-downloadable-block-list-item__author" }) } ) }), hasNotice ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(downloadable_block_notice_default, { block: item }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "block-directory-downloadable-block-list-item__desc", children: !!statusText ? statusText : (0, import_html_entities.decodeEntities)(description) }), isInstallable && !(isInstalled || isInstalling2) && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_components.VisuallyHidden, { children: (0, import_i18n4.__)("Install block") }) ] }) ] }) ] } ) }); } var downloadable_block_list_item_default = DownloadableBlockListItem; // packages/block-directory/build-module/components/downloadable-blocks-list/index.mjs var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1); var noop = () => { }; function DownloadableBlocksList({ items, onHover = noop, onSelect }) { const { installBlockType: installBlockType2 } = (0, import_data7.useDispatch)(store); if (!items.length) { return null; } return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)( import_components2.Composite, { role: "listbox", className: "block-directory-downloadable-blocks-list", "aria-label": (0, import_i18n5.__)("Blocks available for install"), children: items.map((item) => { return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)( downloadable_block_list_item_default, { onClick: () => { if ((0, import_blocks4.getBlockType)(item.name)) { onSelect(item); } else { installBlockType2(item).then((success) => { if (success) { onSelect(item); } }); } onHover(null); }, onHover, item }, item.id ); }) } ); } var downloadable_blocks_list_default = DownloadableBlocksList; // packages/block-directory/build-module/components/downloadable-blocks-panel/inserter-panel.mjs var import_i18n6 = __toESM(require_i18n(), 1); var import_element4 = __toESM(require_element(), 1); var import_a11y = __toESM(require_a11y(), 1); var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1); function DownloadableBlocksInserterPanel({ children, downloadableItems, hasLocalBlocks }) { const count = downloadableItems.length; (0, import_element4.useEffect)(() => { (0, import_a11y.speak)( (0, import_i18n6.sprintf)( /* translators: %d: number of available blocks. */ (0, import_i18n6._n)( "%d additional block is available to install.", "%d additional blocks are available to install.", count ), count ) ); }, [count]); return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [ !hasLocalBlocks && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "block-directory-downloadable-blocks-panel__no-local", children: (0, import_i18n6.__)("No results available from your installed blocks.") }), /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "block-editor-inserter__quick-inserter-separator" }), /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "block-directory-downloadable-blocks-panel", children: [ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "block-directory-downloadable-blocks-panel__header", children: [ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h2", { className: "block-directory-downloadable-blocks-panel__title", children: (0, import_i18n6.__)("Available to install") }), /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "block-directory-downloadable-blocks-panel__description", children: (0, import_i18n6.__)( "Select a block to install and add it to your post." ) }) ] }), children ] }) ] }); } var inserter_panel_default = DownloadableBlocksInserterPanel; // packages/block-directory/build-module/components/downloadable-blocks-panel/no-results.mjs var import_i18n7 = __toESM(require_i18n(), 1); var import_components3 = __toESM(require_components(), 1); var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1); function DownloadableBlocksNoResults() { return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "block-editor-inserter__no-results", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { children: (0, import_i18n7.__)("No results found.") }) }), /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "block-editor-inserter__tips", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_components3.Tip, { children: [ (0, import_i18n7.__)("Interested in creating your own block?"), /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("br", {}), /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_components3.ExternalLink, { href: "https://developer.wordpress.org/block-editor/", children: [ (0, import_i18n7.__)("Get started here"), "." ] }) ] }) }) ] }); } var no_results_default = DownloadableBlocksNoResults; // packages/block-directory/build-module/components/downloadable-blocks-panel/index.mjs var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1); var EMPTY_ARRAY2 = []; var useDownloadableBlocks = (filterValue) => (0, import_data8.useSelect)( (select) => { const { getDownloadableBlocks: getDownloadableBlocks3, isRequestingDownloadableBlocks: isRequestingDownloadableBlocks2, getInstalledBlockTypes: getInstalledBlockTypes2 } = select(store); const hasPermission = select(import_core_data.store).canUser( "read", "block-directory/search" ); let downloadableBlocks2 = EMPTY_ARRAY2; if (hasPermission) { downloadableBlocks2 = getDownloadableBlocks3(filterValue); const installedBlockTypes = getInstalledBlockTypes2(); const installableBlocks = downloadableBlocks2.filter( ({ name }) => { const isJustInstalled = installedBlockTypes.some( (blockType) => blockType.name === name ); const isPreviouslyInstalled = (0, import_blocks5.getBlockType)(name); return isJustInstalled || !isPreviouslyInstalled; } ); if (installableBlocks.length !== downloadableBlocks2.length) { downloadableBlocks2 = installableBlocks; } if (downloadableBlocks2.length === 0) { downloadableBlocks2 = EMPTY_ARRAY2; } } return { hasPermission, downloadableBlocks: downloadableBlocks2, isLoading: isRequestingDownloadableBlocks2(filterValue) }; }, [filterValue] ); function DownloadableBlocksPanel({ onSelect, onHover, hasLocalBlocks, isTyping, filterValue }) { const { hasPermission, downloadableBlocks: downloadableBlocks2, isLoading } = useDownloadableBlocks(filterValue); if (hasPermission === void 0 || isLoading || isTyping) { return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [ hasPermission && !hasLocalBlocks && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "block-directory-downloadable-blocks-panel__no-local", children: (0, import_i18n8.__)( "No results available from your installed blocks." ) }), /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "block-editor-inserter__quick-inserter-separator" }) ] }), /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "block-directory-downloadable-blocks-panel has-blocks-loading", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_components4.Spinner, {}) }) ] }); } if (false === hasPermission) { if (!hasLocalBlocks) { return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(no_results_default, {}); } return null; } if (downloadableBlocks2.length === 0) { return hasLocalBlocks ? null : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(no_results_default, {}); } return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)( inserter_panel_default, { downloadableItems: downloadableBlocks2, hasLocalBlocks, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)( downloadable_blocks_list_default, { items: downloadableBlocks2, onSelect, onHover } ) } ); } // packages/block-directory/build-module/plugins/inserter-menu-downloadable-blocks-panel/index.mjs var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1); function InserterMenuDownloadableBlocksPanel() { const [debouncedFilterValue, setFilterValue] = (0, import_element5.useState)(""); const debouncedSetFilterValue = (0, import_compose.debounce)(setFilterValue, 400); return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_block_editor3.__unstableInserterMenuExtension, { children: ({ onSelect, onHover, filterValue, hasItems }) => { if (debouncedFilterValue !== filterValue) { debouncedSetFilterValue(filterValue); } if (!debouncedFilterValue) { return null; } return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)( DownloadableBlocksPanel, { onSelect, onHover, filterValue: debouncedFilterValue, hasLocalBlocks: hasItems, isTyping: filterValue !== debouncedFilterValue } ); } }); } var inserter_menu_downloadable_blocks_panel_default = InserterMenuDownloadableBlocksPanel; // packages/block-directory/build-module/plugins/installed-blocks-pre-publish-panel/index.mjs var import_i18n10 = __toESM(require_i18n(), 1); var import_data9 = __toESM(require_data(), 1); var import_editor2 = __toESM(require_editor(), 1); // packages/block-directory/build-module/components/compact-list/index.mjs var import_i18n9 = __toESM(require_i18n(), 1); var import_jsx_runtime14 = __toESM(require_jsx_runtime(), 1); function CompactList({ items }) { if (!items.length) { return null; } return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("ul", { className: "block-directory-compact-list", children: items.map(({ icon, id, title, author }) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("li", { className: "block-directory-compact-list__item", children: [ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(downloadable_block_icon_default, { icon, title }), /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "block-directory-compact-list__item-details", children: [ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "block-directory-compact-list__item-title", children: title }), /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "block-directory-compact-list__item-author", children: (0, import_i18n9.sprintf)( /* translators: %s: Name of the block author. */ (0, import_i18n9.__)("By %s"), author ) }) ] }) ] }, id)) }); } // packages/block-directory/build-module/plugins/installed-blocks-pre-publish-panel/index.mjs var import_jsx_runtime15 = __toESM(require_jsx_runtime(), 1); function InstalledBlocksPrePublishPanel() { const newBlockTypes = (0, import_data9.useSelect)( (select) => select(store).getNewBlockTypes(), [] ); if (!newBlockTypes.length) { return null; } return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)( import_editor2.PluginPrePublishPanel, { title: (0, import_i18n10.sprintf)( // translators: %d: number of blocks (number). (0, import_i18n10._n)( "Added: %d block", "Added: %d blocks", newBlockTypes.length ), newBlockTypes.length ), initialOpen: true, children: [ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "installed-blocks-pre-publish-panel__copy", children: (0, import_i18n10._n)( "The following block has been added to your site.", "The following blocks have been added to your site.", newBlockTypes.length ) }), /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(CompactList, { items: newBlockTypes }) ] } ); } // packages/block-directory/build-module/plugins/get-install-missing/index.mjs var import_i18n12 = __toESM(require_i18n(), 1); var import_components6 = __toESM(require_components(), 1); var import_blocks7 = __toESM(require_blocks(), 1); var import_element6 = __toESM(require_element(), 1); var import_data11 = __toESM(require_data(), 1); var import_core_data2 = __toESM(require_core_data(), 1); var import_block_editor5 = __toESM(require_block_editor(), 1); // packages/block-directory/build-module/plugins/get-install-missing/install-button.mjs var import_i18n11 = __toESM(require_i18n(), 1); var import_components5 = __toESM(require_components(), 1); var import_blocks6 = __toESM(require_blocks(), 1); var import_data10 = __toESM(require_data(), 1); var import_block_editor4 = __toESM(require_block_editor(), 1); var import_jsx_runtime16 = __toESM(require_jsx_runtime(), 1); function InstallButton({ attributes, block, clientId }) { const isInstallingBlock = (0, import_data10.useSelect)( (select) => select(store).isInstalling(block.id), [block.id] ); const { installBlockType: installBlockType2 } = (0, import_data10.useDispatch)(store); const { replaceBlock } = (0, import_data10.useDispatch)(import_block_editor4.store); return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)( import_components5.Button, { __next40pxDefaultSize: true, onClick: () => installBlockType2(block).then((success) => { if (success) { const blockType = (0, import_blocks6.getBlockType)(block.name); const [originalBlock] = (0, import_blocks6.parse)( attributes.originalContent ); if (originalBlock && blockType) { replaceBlock( clientId, (0, import_blocks6.createBlock)( blockType.name, originalBlock.attributes, originalBlock.innerBlocks ) ); } } }), accessibleWhenDisabled: true, disabled: isInstallingBlock, isBusy: isInstallingBlock, variant: "primary", children: (0, import_i18n11.sprintf)( /* translators: %s: block name */ (0, import_i18n11.__)("Install %s"), block.title ) } ); } // packages/block-directory/build-module/plugins/get-install-missing/index.mjs var import_jsx_runtime17 = __toESM(require_jsx_runtime(), 1); var getInstallMissing = (OriginalComponent) => (props) => { const { originalName } = props.attributes; const { block, hasPermission } = (0, import_data11.useSelect)( (select) => { const { getDownloadableBlocks: getDownloadableBlocks3 } = select(store); const blocks = getDownloadableBlocks3( "block:" + originalName ).filter(({ name }) => originalName === name); return { hasPermission: select(import_core_data2.store).canUser( "read", "block-directory/search" ), block: blocks.length && blocks[0] }; }, [originalName] ); if (!hasPermission || !block) { return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(OriginalComponent, { ...props }); } return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ModifiedWarning, { ...props, originalBlock: block }); }; var ModifiedWarning = ({ originalBlock, ...props }) => { const { originalName, originalUndelimitedContent, clientId } = props.attributes; const { replaceBlock } = (0, import_data11.useDispatch)(import_block_editor5.store); const convertToHTML = () => { replaceBlock( props.clientId, (0, import_blocks7.createBlock)("core/html", { content: originalUndelimitedContent }) ); }; const hasContent = !!originalUndelimitedContent; const hasHTMLBlock = (0, import_data11.useSelect)( (select) => { const { canInsertBlockType, getBlockRootClientId } = select(import_block_editor5.store); return canInsertBlockType( "core/html", getBlockRootClientId(clientId) ); }, [clientId] ); let messageHTML = (0, import_i18n12.sprintf)( /* translators: %s: block name */ (0, import_i18n12.__)( "Your site doesn\u2019t include support for the %s block. You can try installing the block or remove it entirely." ), originalBlock.title || originalName ); const actions = [ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)( InstallButton, { block: originalBlock, attributes: props.attributes, clientId: props.clientId }, "install" ) ]; if (hasContent && hasHTMLBlock) { messageHTML = (0, import_i18n12.sprintf)( /* translators: %s: block name */ (0, import_i18n12.__)( "Your site doesn\u2019t include support for the %s block. You can try installing the block, convert it to a Custom HTML block, or remove it entirely." ), originalBlock.title || originalName ); actions.push( /* @__PURE__ */ (0, import_jsx_runtime17.jsx)( import_components6.Button, { __next40pxDefaultSize: true, onClick: convertToHTML, variant: "tertiary", children: (0, import_i18n12.__)("Keep as HTML") }, "convert" ) ); } return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { ...(0, import_block_editor5.useBlockProps)(), children: [ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_block_editor5.Warning, { actions, children: messageHTML }), /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_element6.RawHTML, { children: originalUndelimitedContent }) ] }); }; var get_install_missing_default = getInstallMissing; // packages/block-directory/build-module/plugins/index.mjs var import_jsx_runtime18 = __toESM(require_jsx_runtime(), 1); (0, import_plugins.registerPlugin)("block-directory", { // The icon is explicitly set to undefined to prevent PluginPrePublishPanel // from rendering the fallback icon pluginIcon. icon: void 0, render() { return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(AutoBlockUninstaller, {}), /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(inserter_menu_downloadable_blocks_panel_default, {}), /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(InstalledBlocksPrePublishPanel, {}) ] }); } }); (0, import_hooks.addFilter)( "blocks.registerBlockType", "block-directory/fallback", (settings, name) => { if (name !== "core/missing") { return settings; } settings.edit = get_install_missing_default(settings.edit); return settings; } ); return __toCommonJS(index_exports); })(); edit-widgets.js000064400000500376152214270310007503 0ustar00var wp; (wp ||= {}).editWidgets = (() => { var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { for (var name2 in all) __defProp(target, name2, { get: all[name2], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // package-external:@wordpress/blocks var require_blocks = __commonJS({ "package-external:@wordpress/blocks"(exports, module) { module.exports = window.wp.blocks; } }); // package-external:@wordpress/data var require_data = __commonJS({ "package-external:@wordpress/data"(exports, module) { module.exports = window.wp.data; } }); // package-external:@wordpress/deprecated var require_deprecated = __commonJS({ "package-external:@wordpress/deprecated"(exports, module) { module.exports = window.wp.deprecated; } }); // package-external:@wordpress/element var require_element = __commonJS({ "package-external:@wordpress/element"(exports, module) { module.exports = window.wp.element; } }); // package-external:@wordpress/block-library var require_block_library = __commonJS({ "package-external:@wordpress/block-library"(exports, module) { module.exports = window.wp.blockLibrary; } }); // package-external:@wordpress/core-data var require_core_data = __commonJS({ "package-external:@wordpress/core-data"(exports, module) { module.exports = window.wp.coreData; } }); // package-external:@wordpress/widgets var require_widgets = __commonJS({ "package-external:@wordpress/widgets"(exports, module) { module.exports = window.wp.widgets; } }); // package-external:@wordpress/preferences var require_preferences = __commonJS({ "package-external:@wordpress/preferences"(exports, module) { module.exports = window.wp.preferences; } }); // package-external:@wordpress/api-fetch var require_api_fetch = __commonJS({ "package-external:@wordpress/api-fetch"(exports, module) { module.exports = window.wp.apiFetch; } }); // package-external:@wordpress/i18n var require_i18n = __commonJS({ "package-external:@wordpress/i18n"(exports, module) { module.exports = window.wp.i18n; } }); // package-external:@wordpress/notices var require_notices = __commonJS({ "package-external:@wordpress/notices"(exports, module) { module.exports = window.wp.notices; } }); // package-external:@wordpress/components var require_components = __commonJS({ "package-external:@wordpress/components"(exports, module) { module.exports = window.wp.components; } }); // package-external:@wordpress/primitives var require_primitives = __commonJS({ "package-external:@wordpress/primitives"(exports, module) { module.exports = window.wp.primitives; } }); // vendor-external:react/jsx-runtime var require_jsx_runtime = __commonJS({ "vendor-external:react/jsx-runtime"(exports, module) { module.exports = window.ReactJSXRuntime; } }); // package-external:@wordpress/viewport var require_viewport = __commonJS({ "package-external:@wordpress/viewport"(exports, module) { module.exports = window.wp.viewport; } }); // package-external:@wordpress/compose var require_compose = __commonJS({ "package-external:@wordpress/compose"(exports, module) { module.exports = window.wp.compose; } }); // package-external:@wordpress/plugins var require_plugins = __commonJS({ "package-external:@wordpress/plugins"(exports, module) { module.exports = window.wp.plugins; } }); // package-external:@wordpress/private-apis var require_private_apis = __commonJS({ "package-external:@wordpress/private-apis"(exports, module) { module.exports = window.wp.privateApis; } }); // package-external:@wordpress/block-editor var require_block_editor = __commonJS({ "package-external:@wordpress/block-editor"(exports, module) { module.exports = window.wp.blockEditor; } }); // package-external:@wordpress/hooks var require_hooks = __commonJS({ "package-external:@wordpress/hooks"(exports, module) { module.exports = window.wp.hooks; } }); // package-external:@wordpress/media-utils var require_media_utils = __commonJS({ "package-external:@wordpress/media-utils"(exports, module) { module.exports = window.wp.mediaUtils; } }); // package-external:@wordpress/patterns var require_patterns = __commonJS({ "package-external:@wordpress/patterns"(exports, module) { module.exports = window.wp.patterns; } }); // package-external:@wordpress/keyboard-shortcuts var require_keyboard_shortcuts = __commonJS({ "package-external:@wordpress/keyboard-shortcuts"(exports, module) { module.exports = window.wp.keyboardShortcuts; } }); // package-external:@wordpress/keycodes var require_keycodes = __commonJS({ "package-external:@wordpress/keycodes"(exports, module) { module.exports = window.wp.keycodes; } }); // package-external:@wordpress/url var require_url = __commonJS({ "package-external:@wordpress/url"(exports, module) { module.exports = window.wp.url; } }); // package-external:@wordpress/dom var require_dom = __commonJS({ "package-external:@wordpress/dom"(exports, module) { module.exports = window.wp.dom; } }); // packages/edit-widgets/build-module/index.mjs var index_exports = {}; __export(index_exports, { initialize: () => initialize, initializeEditor: () => initializeEditor, reinitializeEditor: () => reinitializeEditor, store: () => store2 }); var import_blocks3 = __toESM(require_blocks(), 1); var import_data32 = __toESM(require_data(), 1); var import_deprecated6 = __toESM(require_deprecated(), 1); var import_element25 = __toESM(require_element(), 1); var import_block_library2 = __toESM(require_block_library(), 1); var import_core_data12 = __toESM(require_core_data(), 1); var import_widgets5 = __toESM(require_widgets(), 1); var import_preferences10 = __toESM(require_preferences(), 1); // packages/edit-widgets/build-module/store/index.mjs var import_api_fetch = __toESM(require_api_fetch(), 1); var import_data8 = __toESM(require_data(), 1); // packages/edit-widgets/build-module/store/reducer.mjs var import_data = __toESM(require_data(), 1); function widgetAreasOpenState(state = {}, action) { const { type } = action; switch (type) { case "SET_WIDGET_AREAS_OPEN_STATE": { return action.widgetAreasOpenState; } case "SET_IS_WIDGET_AREA_OPEN": { const { clientId, isOpen } = action; return { ...state, [clientId]: isOpen }; } default: { return state; } } } function blockInserterPanel(state = false, action) { switch (action.type) { case "SET_IS_LIST_VIEW_OPENED": return action.isOpen ? false : state; case "SET_IS_INSERTER_OPENED": return action.value; } return state; } function listViewPanel(state = false, action) { switch (action.type) { case "SET_IS_INSERTER_OPENED": return action.value ? false : state; case "SET_IS_LIST_VIEW_OPENED": return action.isOpen; } return state; } function listViewToggleRef(state = { current: null }) { return state; } function inserterSidebarToggleRef(state = { current: null }) { return state; } function widgetSavingLock(state = {}, action) { switch (action.type) { case "LOCK_WIDGET_SAVING": return { ...state, [action.lockName]: true }; case "UNLOCK_WIDGET_SAVING": { const { [action.lockName]: removedLockName, ...restState } = state; return restState; } } return state; } var reducer_default = (0, import_data.combineReducers)({ blockInserterPanel, inserterSidebarToggleRef, listViewPanel, listViewToggleRef, widgetAreasOpenState, widgetSavingLock }); // packages/edit-widgets/build-module/store/resolvers.mjs var resolvers_exports = {}; __export(resolvers_exports, { getWidgetAreas: () => getWidgetAreas, getWidgets: () => getWidgets }); var import_blocks2 = __toESM(require_blocks(), 1); var import_core_data2 = __toESM(require_core_data(), 1); // packages/edit-widgets/build-module/store/actions.mjs var actions_exports2 = {}; __export(actions_exports2, { closeGeneralSidebar: () => closeGeneralSidebar, lockWidgetSaving: () => lockWidgetSaving, moveBlockToWidgetArea: () => moveBlockToWidgetArea, persistStubPost: () => persistStubPost, saveEditedWidgetAreas: () => saveEditedWidgetAreas, saveWidgetArea: () => saveWidgetArea, saveWidgetAreas: () => saveWidgetAreas, setIsInserterOpened: () => setIsInserterOpened, setIsListViewOpened: () => setIsListViewOpened, setIsWidgetAreaOpen: () => setIsWidgetAreaOpen, setWidgetAreasOpenState: () => setWidgetAreasOpenState, setWidgetIdForClientId: () => setWidgetIdForClientId, unlockWidgetSaving: () => unlockWidgetSaving }); var import_i18n3 = __toESM(require_i18n(), 1); var import_notices = __toESM(require_notices(), 1); // node_modules/clsx/dist/clsx.mjs function r(e) { var t, f, n = ""; if ("string" == typeof e || "number" == typeof e) n += e; else if ("object" == typeof e) if (Array.isArray(e)) { var o = e.length; for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f); } else for (f in e) e[f] && (n && (n += " "), n += f); return n; } function clsx() { for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t); return n; } var clsx_default = clsx; // packages/interface/build-module/components/complementary-area/index.mjs var import_components5 = __toESM(require_components(), 1); var import_data6 = __toESM(require_data(), 1); var import_i18n = __toESM(require_i18n(), 1); // packages/icons/build-module/library/block-default.mjs var import_primitives = __toESM(require_primitives(), 1); var import_jsx_runtime = __toESM(require_jsx_runtime(), 1); var block_default_default = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_primitives.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_primitives.Path, { d: "M19 8h-1V6h-5v2h-2V6H6v2H5c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-8c0-1.1-.9-2-2-2zm.5 10c0 .3-.2.5-.5.5H5c-.3 0-.5-.2-.5-.5v-8c0-.3.2-.5.5-.5h14c.3 0 .5.2.5.5v8z" }) }); // packages/icons/build-module/library/check.mjs var import_primitives2 = __toESM(require_primitives(), 1); var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1); var check_default = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_primitives2.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_primitives2.Path, { d: "M16.5 7.5 10 13.9l-2.5-2.4-1 1 3.5 3.6 7.5-7.6z" }) }); // packages/icons/build-module/library/close-small.mjs var import_primitives3 = __toESM(require_primitives(), 1); var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1); var close_small_default = /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_primitives3.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_primitives3.Path, { d: "M12 13.06l3.712 3.713 1.061-1.06L13.061 12l3.712-3.712-1.06-1.06L12 10.938 8.288 7.227l-1.061 1.06L10.939 12l-3.712 3.712 1.06 1.061L12 13.061z" }) }); // packages/icons/build-module/library/drawer-left.mjs var import_primitives4 = __toESM(require_primitives(), 1); var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1); var drawer_left_default = /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_primitives4.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_primitives4.Path, { fillRule: "evenodd", clipRule: "evenodd", d: "M18 4H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM8.5 18.5H6c-.3 0-.5-.2-.5-.5V6c0-.3.2-.5.5-.5h2.5v13zm10-.5c0 .3-.2.5-.5.5h-8v-13h8c.3 0 .5.2.5.5v12z" }) }); // packages/icons/build-module/library/drawer-right.mjs var import_primitives5 = __toESM(require_primitives(), 1); var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1); var drawer_right_default = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_primitives5.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_primitives5.Path, { fillRule: "evenodd", clipRule: "evenodd", d: "M18 4H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-4 14.5H6c-.3 0-.5-.2-.5-.5V6c0-.3.2-.5.5-.5h8v13zm4.5-.5c0 .3-.2.5-.5.5h-2.5v-13H18c.3 0 .5.2.5.5v12z" }) }); // packages/icons/build-module/library/external.mjs var import_primitives6 = __toESM(require_primitives(), 1); var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1); var external_default = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_primitives6.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_primitives6.Path, { d: "M19.5 4.5h-7V6h4.44l-5.97 5.97 1.06 1.06L18 7.06v4.44h1.5v-7Zm-13 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-3H17v3a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h3V5.5h-3Z" }) }); // packages/icons/build-module/library/list-view.mjs var import_primitives7 = __toESM(require_primitives(), 1); var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1); var list_view_default = /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_primitives7.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_primitives7.Path, { d: "M3 6h11v1.5H3V6Zm3.5 5.5h11V13h-11v-1.5ZM21 17H10v1.5h11V17Z" }) }); // packages/icons/build-module/library/more-vertical.mjs var import_primitives8 = __toESM(require_primitives(), 1); var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1); var more_vertical_default = /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_primitives8.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_primitives8.Path, { d: "M13 19h-2v-2h2v2zm0-6h-2v-2h2v2zm0-6h-2V5h2v2z" }) }); // packages/icons/build-module/library/plus.mjs var import_primitives9 = __toESM(require_primitives(), 1); var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1); var plus_default = /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_primitives9.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_primitives9.Path, { d: "M11 12.5V17.5H12.5V12.5H17.5V11H12.5V6H11V11H6V12.5H11Z" }) }); // packages/icons/build-module/library/redo.mjs var import_primitives10 = __toESM(require_primitives(), 1); var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1); var redo_default = /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_primitives10.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_primitives10.Path, { d: "M15.6 6.5l-1.1 1 2.9 3.3H8c-.9 0-1.7.3-2.3.9-1.4 1.5-1.4 4.2-1.4 5.6v.2h1.5v-.3c0-1.1 0-3.5 1-4.5.3-.3.7-.5 1.3-.5h9.2L14.5 15l1.1 1.1 4.6-4.6-4.6-5z" }) }); // packages/icons/build-module/library/star-empty.mjs var import_primitives11 = __toESM(require_primitives(), 1); var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1); var star_empty_default = /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_primitives11.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_primitives11.Path, { fillRule: "evenodd", clipRule: "evenodd", d: "M9.706 8.646a.25.25 0 01-.188.137l-4.626.672a.25.25 0 00-.139.427l3.348 3.262a.25.25 0 01.072.222l-.79 4.607a.25.25 0 00.362.264l4.138-2.176a.25.25 0 01.233 0l4.137 2.175a.25.25 0 00.363-.263l-.79-4.607a.25.25 0 01.072-.222l3.347-3.262a.25.25 0 00-.139-.427l-4.626-.672a.25.25 0 01-.188-.137l-2.069-4.192a.25.25 0 00-.448 0L9.706 8.646zM12 7.39l-.948 1.921a1.75 1.75 0 01-1.317.957l-2.12.308 1.534 1.495c.412.402.6.982.503 1.55l-.362 2.11 1.896-.997a1.75 1.75 0 011.629 0l1.895.997-.362-2.11a1.75 1.75 0 01.504-1.55l1.533-1.495-2.12-.308a1.75 1.75 0 01-1.317-.957L12 7.39z" }) }); // packages/icons/build-module/library/star-filled.mjs var import_primitives12 = __toESM(require_primitives(), 1); var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1); var star_filled_default = /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_primitives12.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_primitives12.Path, { d: "M11.776 4.454a.25.25 0 01.448 0l2.069 4.192a.25.25 0 00.188.137l4.626.672a.25.25 0 01.139.426l-3.348 3.263a.25.25 0 00-.072.222l.79 4.607a.25.25 0 01-.362.263l-4.138-2.175a.25.25 0 00-.232 0l-4.138 2.175a.25.25 0 01-.363-.263l.79-4.607a.25.25 0 00-.071-.222L4.754 9.881a.25.25 0 01.139-.426l4.626-.672a.25.25 0 00.188-.137l2.069-4.192z" }) }); // packages/icons/build-module/library/undo.mjs var import_primitives13 = __toESM(require_primitives(), 1); var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1); var undo_default = /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_primitives13.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_primitives13.Path, { d: "M18.3 11.7c-.6-.6-1.4-.9-2.3-.9H6.7l2.9-3.3-1.1-1-4.5 5L8.5 16l1-1-2.7-2.7H16c.5 0 .9.2 1.3.5 1 1 1 3.4 1 4.5v.3h1.5v-.2c0-1.5 0-4.3-1.5-5.7z" }) }); // packages/interface/build-module/components/complementary-area/index.mjs var import_element2 = __toESM(require_element(), 1); var import_viewport = __toESM(require_viewport(), 1); var import_preferences3 = __toESM(require_preferences(), 1); var import_compose = __toESM(require_compose(), 1); var import_plugins2 = __toESM(require_plugins(), 1); // packages/interface/build-module/components/complementary-area-toggle/index.mjs var import_components = __toESM(require_components(), 1); var import_data5 = __toESM(require_data(), 1); var import_plugins = __toESM(require_plugins(), 1); // packages/interface/build-module/store/index.mjs var import_data4 = __toESM(require_data(), 1); // packages/interface/build-module/store/actions.mjs var actions_exports = {}; __export(actions_exports, { closeModal: () => closeModal, disableComplementaryArea: () => disableComplementaryArea, enableComplementaryArea: () => enableComplementaryArea, openModal: () => openModal, pinItem: () => pinItem, setDefaultComplementaryArea: () => setDefaultComplementaryArea, setFeatureDefaults: () => setFeatureDefaults, setFeatureValue: () => setFeatureValue, toggleFeature: () => toggleFeature, unpinItem: () => unpinItem }); var import_deprecated2 = __toESM(require_deprecated(), 1); var import_preferences = __toESM(require_preferences(), 1); // packages/interface/build-module/store/deprecated.mjs var import_deprecated = __toESM(require_deprecated(), 1); function normalizeComplementaryAreaScope(scope) { if (["core/edit-post", "core/edit-site"].includes(scope)) { (0, import_deprecated.default)(`${scope} interface scope`, { alternative: "core interface scope", hint: "core/edit-post and core/edit-site are merging.", version: "6.6" }); return "core"; } return scope; } function normalizeComplementaryAreaName(scope, name2) { if (scope === "core" && name2 === "edit-site/template") { (0, import_deprecated.default)(`edit-site/template sidebar`, { alternative: "edit-post/document", version: "6.6" }); return "edit-post/document"; } if (scope === "core" && name2 === "edit-site/block-inspector") { (0, import_deprecated.default)(`edit-site/block-inspector sidebar`, { alternative: "edit-post/block", version: "6.6" }); return "edit-post/block"; } return name2; } // packages/interface/build-module/store/actions.mjs var setDefaultComplementaryArea = (scope, area) => { scope = normalizeComplementaryAreaScope(scope); area = normalizeComplementaryAreaName(scope, area); return { type: "SET_DEFAULT_COMPLEMENTARY_AREA", scope, area }; }; var enableComplementaryArea = (scope, area) => ({ registry, dispatch: dispatch2 }) => { if (!area) { return; } scope = normalizeComplementaryAreaScope(scope); area = normalizeComplementaryAreaName(scope, area); const isComplementaryAreaVisible = registry.select(import_preferences.store).get(scope, "isComplementaryAreaVisible"); if (!isComplementaryAreaVisible) { registry.dispatch(import_preferences.store).set(scope, "isComplementaryAreaVisible", true); } dispatch2({ type: "ENABLE_COMPLEMENTARY_AREA", scope, area }); }; var disableComplementaryArea = (scope) => ({ registry }) => { scope = normalizeComplementaryAreaScope(scope); const isComplementaryAreaVisible = registry.select(import_preferences.store).get(scope, "isComplementaryAreaVisible"); if (isComplementaryAreaVisible) { registry.dispatch(import_preferences.store).set(scope, "isComplementaryAreaVisible", false); } }; var pinItem = (scope, item) => ({ registry }) => { if (!item) { return; } scope = normalizeComplementaryAreaScope(scope); item = normalizeComplementaryAreaName(scope, item); const pinnedItems = registry.select(import_preferences.store).get(scope, "pinnedItems"); if (pinnedItems?.[item] === true) { return; } registry.dispatch(import_preferences.store).set(scope, "pinnedItems", { ...pinnedItems, [item]: true }); }; var unpinItem = (scope, item) => ({ registry }) => { if (!item) { return; } scope = normalizeComplementaryAreaScope(scope); item = normalizeComplementaryAreaName(scope, item); const pinnedItems = registry.select(import_preferences.store).get(scope, "pinnedItems"); registry.dispatch(import_preferences.store).set(scope, "pinnedItems", { ...pinnedItems, [item]: false }); }; function toggleFeature(scope, featureName) { return function({ registry }) { (0, import_deprecated2.default)(`dispatch( 'core/interface' ).toggleFeature`, { since: "6.0", alternative: `dispatch( 'core/preferences' ).toggle` }); registry.dispatch(import_preferences.store).toggle(scope, featureName); }; } function setFeatureValue(scope, featureName, value) { return function({ registry }) { (0, import_deprecated2.default)(`dispatch( 'core/interface' ).setFeatureValue`, { since: "6.0", alternative: `dispatch( 'core/preferences' ).set` }); registry.dispatch(import_preferences.store).set(scope, featureName, !!value); }; } function setFeatureDefaults(scope, defaults) { return function({ registry }) { (0, import_deprecated2.default)(`dispatch( 'core/interface' ).setFeatureDefaults`, { since: "6.0", alternative: `dispatch( 'core/preferences' ).setDefaults` }); registry.dispatch(import_preferences.store).setDefaults(scope, defaults); }; } function openModal(name2) { return { type: "OPEN_MODAL", name: name2 }; } function closeModal() { return { type: "CLOSE_MODAL" }; } // packages/interface/build-module/store/selectors.mjs var selectors_exports = {}; __export(selectors_exports, { getActiveComplementaryArea: () => getActiveComplementaryArea, isComplementaryAreaLoading: () => isComplementaryAreaLoading, isFeatureActive: () => isFeatureActive, isItemPinned: () => isItemPinned, isModalActive: () => isModalActive }); var import_data2 = __toESM(require_data(), 1); var import_deprecated4 = __toESM(require_deprecated(), 1); var import_preferences2 = __toESM(require_preferences(), 1); var getActiveComplementaryArea = (0, import_data2.createRegistrySelector)( (select) => (state, scope) => { scope = normalizeComplementaryAreaScope(scope); const isComplementaryAreaVisible = select(import_preferences2.store).get( scope, "isComplementaryAreaVisible" ); if (isComplementaryAreaVisible === void 0) { return void 0; } if (isComplementaryAreaVisible === false) { return null; } return state?.complementaryAreas?.[scope]; } ); var isComplementaryAreaLoading = (0, import_data2.createRegistrySelector)( (select) => (state, scope) => { scope = normalizeComplementaryAreaScope(scope); const isVisible = select(import_preferences2.store).get( scope, "isComplementaryAreaVisible" ); const identifier = state?.complementaryAreas?.[scope]; return isVisible && identifier === void 0; } ); var isItemPinned = (0, import_data2.createRegistrySelector)( (select) => (state, scope, item) => { scope = normalizeComplementaryAreaScope(scope); item = normalizeComplementaryAreaName(scope, item); const pinnedItems = select(import_preferences2.store).get( scope, "pinnedItems" ); return pinnedItems?.[item] ?? true; } ); var isFeatureActive = (0, import_data2.createRegistrySelector)( (select) => (state, scope, featureName) => { (0, import_deprecated4.default)( `select( 'core/interface' ).isFeatureActive( scope, featureName )`, { since: "6.0", alternative: `select( 'core/preferences' ).get( scope, featureName )` } ); return !!select(import_preferences2.store).get(scope, featureName); } ); function isModalActive(state, modalName) { return state.activeModal === modalName; } // packages/interface/build-module/store/reducer.mjs var import_data3 = __toESM(require_data(), 1); function complementaryAreas(state = {}, action) { switch (action.type) { case "SET_DEFAULT_COMPLEMENTARY_AREA": { const { scope, area } = action; if (state[scope]) { return state; } return { ...state, [scope]: area }; } case "ENABLE_COMPLEMENTARY_AREA": { const { scope, area } = action; return { ...state, [scope]: area }; } } return state; } function activeModal(state = null, action) { switch (action.type) { case "OPEN_MODAL": return action.name; case "CLOSE_MODAL": return null; } return state; } var reducer_default2 = (0, import_data3.combineReducers)({ complementaryAreas, activeModal }); // packages/interface/build-module/store/constants.mjs var STORE_NAME = "core/interface"; // packages/interface/build-module/store/index.mjs var store = (0, import_data4.createReduxStore)(STORE_NAME, { reducer: reducer_default2, actions: actions_exports, selectors: selectors_exports }); (0, import_data4.register)(store); // packages/interface/build-module/components/complementary-area-toggle/index.mjs var import_jsx_runtime14 = __toESM(require_jsx_runtime(), 1); function roleSupportsCheckedState(role) { return [ "checkbox", "option", "radio", "switch", "menuitemcheckbox", "menuitemradio", "treeitem" ].includes(role); } function ComplementaryAreaToggle({ as = import_components.Button, scope, identifier: identifierProp, icon: iconProp, selectedIcon, name: name2, shortcut, ...props }) { const ComponentToUse = as; const context = (0, import_plugins.usePluginContext)(); const icon = iconProp || context.icon; const identifier = identifierProp || `${context.name}/${name2}`; const isSelected = (0, import_data5.useSelect)( (select) => select(store).getActiveComplementaryArea(scope) === identifier, [identifier, scope] ); const { enableComplementaryArea: enableComplementaryArea2, disableComplementaryArea: disableComplementaryArea2 } = (0, import_data5.useDispatch)(store); return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)( ComponentToUse, { icon: selectedIcon && isSelected ? selectedIcon : icon, "aria-controls": identifier.replace("/", ":"), "aria-checked": roleSupportsCheckedState(props.role) ? isSelected : void 0, onClick: () => { if (isSelected) { disableComplementaryArea2(scope); } else { enableComplementaryArea2(scope, identifier); } }, shortcut, ...props } ); } // packages/interface/build-module/components/complementary-area-header/index.mjs var import_jsx_runtime15 = __toESM(require_jsx_runtime(), 1); var ComplementaryAreaHeader = ({ children, className, toggleButtonProps }) => { const toggleButton = /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ComplementaryAreaToggle, { icon: close_small_default, ...toggleButtonProps }); return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)( "div", { className: clsx_default( "components-panel__header", "interface-complementary-area-header", className ), tabIndex: -1, children: [ children, toggleButton ] } ); }; var complementary_area_header_default = ComplementaryAreaHeader; // packages/interface/build-module/components/complementary-area-more-menu-item/index.mjs var import_components3 = __toESM(require_components(), 1); // packages/interface/build-module/components/action-item/index.mjs var import_components2 = __toESM(require_components(), 1); var import_element = __toESM(require_element(), 1); var import_jsx_runtime16 = __toESM(require_jsx_runtime(), 1); var noop = () => { }; function ActionItemSlot({ name: name2, as: Component2 = import_components2.MenuGroup, fillProps = {}, bubblesVirtually, ...props }) { return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)( import_components2.Slot, { name: name2, bubblesVirtually, fillProps, children: (fills) => { if (!import_element.Children.toArray(fills).length) { return null; } const initializedByPlugins = []; import_element.Children.forEach( fills, ({ props: { __unstableExplicitMenuItem, __unstableTarget } }) => { if (__unstableTarget && __unstableExplicitMenuItem) { initializedByPlugins.push(__unstableTarget); } } ); const children = import_element.Children.map(fills, (child) => { if (!child.props.__unstableExplicitMenuItem && initializedByPlugins.includes( child.props.__unstableTarget )) { return null; } return child; }); return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Component2, { ...props, children }); } } ); } function ActionItem({ name: name2, as: Component2 = import_components2.Button, onClick, ...props }) { return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_components2.Fill, { name: name2, children: ({ onClick: fpOnClick }) => { return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)( Component2, { onClick: onClick || fpOnClick ? (...args) => { (onClick || noop)(...args); (fpOnClick || noop)(...args); } : void 0, ...props } ); } }); } ActionItem.Slot = ActionItemSlot; var action_item_default = ActionItem; // packages/interface/build-module/components/complementary-area-more-menu-item/index.mjs var import_jsx_runtime17 = __toESM(require_jsx_runtime(), 1); var PluginsMenuItem = ({ // Menu item is marked with unstable prop for backward compatibility. // They are removed so they don't leak to DOM elements. // @see https://github.com/WordPress/gutenberg/issues/14457 __unstableExplicitMenuItem, __unstableTarget, ...restProps }) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_components3.MenuItem, { ...restProps }); function ComplementaryAreaMoreMenuItem({ scope, target, __unstableExplicitMenuItem, ...props }) { return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)( ComplementaryAreaToggle, { as: (toggleProps) => { return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)( action_item_default, { __unstableExplicitMenuItem, __unstableTarget: `${scope}/${target}`, as: PluginsMenuItem, name: `${scope}/plugin-more-menu`, ...toggleProps } ); }, role: "menuitemcheckbox", selectedIcon: check_default, name: target, scope, ...props } ); } // packages/interface/build-module/components/pinned-items/index.mjs var import_components4 = __toESM(require_components(), 1); var import_jsx_runtime18 = __toESM(require_jsx_runtime(), 1); function PinnedItems({ scope, ...props }) { return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_components4.Fill, { name: `PinnedItems/${scope}`, ...props }); } function PinnedItemsSlot({ scope, className, ...props }) { return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_components4.Slot, { name: `PinnedItems/${scope}`, ...props, children: (fills) => fills?.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)( "div", { className: clsx_default( className, "interface-pinned-items" ), children: fills } ) }); } PinnedItems.Slot = PinnedItemsSlot; var pinned_items_default = PinnedItems; // packages/interface/build-module/components/complementary-area/index.mjs var import_jsx_runtime19 = __toESM(require_jsx_runtime(), 1); var ANIMATION_DURATION = 0.3; function ComplementaryAreaSlot({ scope, ...props }) { return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_components5.Slot, { name: `ComplementaryArea/${scope}`, ...props }); } var SIDEBAR_WIDTH = 280; var variants = { open: { width: SIDEBAR_WIDTH }, closed: { width: 0 }, mobileOpen: { width: "100vw" } }; function ComplementaryAreaFill({ activeArea, isActive, scope, children, className, id }) { const disableMotion = (0, import_compose.useReducedMotion)(); const isMobileViewport = (0, import_compose.useViewportMatch)("medium", "<"); const previousActiveArea = (0, import_compose.usePrevious)(activeArea); const previousIsActive = (0, import_compose.usePrevious)(isActive); const [, setState] = (0, import_element2.useState)({}); (0, import_element2.useEffect)(() => { setState({}); }, [isActive]); const transition = { type: "tween", duration: disableMotion || isMobileViewport || !!previousActiveArea && !!activeArea && activeArea !== previousActiveArea ? 0 : ANIMATION_DURATION, ease: [0.6, 0, 0.4, 1] }; return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_components5.Fill, { name: `ComplementaryArea/${scope}`, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_components5.__unstableAnimatePresence, { initial: false, children: (previousIsActive || isActive) && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)( import_components5.__unstableMotion.div, { variants, initial: "closed", animate: isMobileViewport ? "mobileOpen" : "open", exit: "closed", transition, className: "interface-complementary-area__fill", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)( "div", { id, className, style: { width: isMobileViewport ? "100vw" : SIDEBAR_WIDTH }, children } ) } ) }) }); } function useAdjustComplementaryListener(scope, identifier, activeArea, isActive, isSmall) { const previousIsSmallRef = (0, import_element2.useRef)(false); const shouldOpenWhenNotSmallRef = (0, import_element2.useRef)(false); const { enableComplementaryArea: enableComplementaryArea2, disableComplementaryArea: disableComplementaryArea2 } = (0, import_data6.useDispatch)(store); (0, import_element2.useEffect)(() => { if (isActive && isSmall && !previousIsSmallRef.current) { disableComplementaryArea2(scope); shouldOpenWhenNotSmallRef.current = true; } else if ( // If there is a flag indicating the complementary area should be // enabled when we go from small to big window size and we are going // from a small to big window size. shouldOpenWhenNotSmallRef.current && !isSmall && previousIsSmallRef.current ) { shouldOpenWhenNotSmallRef.current = false; enableComplementaryArea2(scope, identifier); } else if ( // If the flag is indicating the current complementary should be // reopened but another complementary area becomes active, remove // the flag. shouldOpenWhenNotSmallRef.current && activeArea && activeArea !== identifier ) { shouldOpenWhenNotSmallRef.current = false; } if (isSmall !== previousIsSmallRef.current) { previousIsSmallRef.current = isSmall; } }, [ isActive, isSmall, scope, identifier, activeArea, disableComplementaryArea2, enableComplementaryArea2 ]); } function ComplementaryArea({ children, className, closeLabel = (0, import_i18n.__)("Close plugin"), identifier: identifierProp, header, headerClassName, icon: iconProp, isPinnable = true, panelClassName, scope, name: name2, title, toggleShortcut, isActiveByDefault }) { const context = (0, import_plugins2.usePluginContext)(); const icon = iconProp || context.icon; const identifier = identifierProp || `${context.name}/${name2}`; const [isReady, setIsReady] = (0, import_element2.useState)(false); const { isLoading, isActive, isPinned, activeArea, isSmall, isLarge, showIconLabels } = (0, import_data6.useSelect)( (select) => { const { getActiveComplementaryArea: getActiveComplementaryArea2, isComplementaryAreaLoading: isComplementaryAreaLoading2, isItemPinned: isItemPinned2 } = select(store); const { get } = select(import_preferences3.store); const _activeArea = getActiveComplementaryArea2(scope); return { isLoading: isComplementaryAreaLoading2(scope), isActive: _activeArea === identifier, isPinned: isItemPinned2(scope, identifier), activeArea: _activeArea, isSmall: select(import_viewport.store).isViewportMatch("< medium"), isLarge: select(import_viewport.store).isViewportMatch("large"), showIconLabels: get("core", "showIconLabels") }; }, [identifier, scope] ); const isMobileViewport = (0, import_compose.useViewportMatch)("medium", "<"); useAdjustComplementaryListener( scope, identifier, activeArea, isActive, isSmall ); const { enableComplementaryArea: enableComplementaryArea2, disableComplementaryArea: disableComplementaryArea2, pinItem: pinItem2, unpinItem: unpinItem2 } = (0, import_data6.useDispatch)(store); (0, import_element2.useEffect)(() => { if (isActiveByDefault && activeArea === void 0 && !isSmall) { enableComplementaryArea2(scope, identifier); } else if (activeArea === void 0 && isSmall) { disableComplementaryArea2(scope, identifier); } setIsReady(true); }, [ activeArea, isActiveByDefault, scope, identifier, isSmall, enableComplementaryArea2, disableComplementaryArea2 ]); if (!isReady) { return; } return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [ isPinnable && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(pinned_items_default, { scope, children: isPinned && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)( ComplementaryAreaToggle, { scope, identifier, isPressed: isActive && (!showIconLabels || isLarge), "aria-expanded": isActive, "aria-disabled": isLoading, label: title, icon: showIconLabels ? check_default : icon, showTooltip: !showIconLabels, variant: showIconLabels ? "tertiary" : void 0, size: "compact", shortcut: toggleShortcut } ) }), name2 && isPinnable && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)( ComplementaryAreaMoreMenuItem, { target: name2, scope, icon, identifier, children: title } ), /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)( ComplementaryAreaFill, { activeArea, isActive, className: clsx_default("interface-complementary-area", className), scope, id: identifier.replace("/", ":"), children: [ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)( complementary_area_header_default, { className: headerClassName, closeLabel, onClose: () => disableComplementaryArea2(scope), toggleButtonProps: { label: closeLabel, size: "compact", shortcut: toggleShortcut, scope, identifier }, children: header || /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("h2", { className: "interface-complementary-area-header__title", children: title }), isPinnable && !isMobileViewport && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)( import_components5.Button, { className: "interface-complementary-area__pin-unpin-item", icon: isPinned ? star_filled_default : star_empty_default, label: isPinned ? (0, import_i18n.__)("Unpin from toolbar") : (0, import_i18n.__)("Pin to toolbar"), onClick: () => (isPinned ? unpinItem2 : pinItem2)( scope, identifier ), isPressed: isPinned, "aria-expanded": isPinned, size: "compact" } ) ] }) } ), /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_components5.Panel, { className: panelClassName, children }) ] } ) ] }); } ComplementaryArea.Slot = ComplementaryAreaSlot; var complementary_area_default = ComplementaryArea; // packages/admin-ui/build-module/navigable-region/index.mjs var import_element3 = __toESM(require_element(), 1); var import_jsx_runtime20 = __toESM(require_jsx_runtime(), 1); var NavigableRegion = (0, import_element3.forwardRef)( ({ children, className, ariaLabel, as: Tag = "div", ...props }, ref) => { return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)( Tag, { ref, className: clsx_default("admin-ui-navigable-region", className), "aria-label": ariaLabel, role: "region", tabIndex: "-1", ...props, children } ); } ); NavigableRegion.displayName = "NavigableRegion"; var navigable_region_default = NavigableRegion; // packages/interface/build-module/components/interface-skeleton/index.mjs var import_element4 = __toESM(require_element(), 1); var import_components6 = __toESM(require_components(), 1); var import_i18n2 = __toESM(require_i18n(), 1); var import_compose2 = __toESM(require_compose(), 1); var import_jsx_runtime21 = __toESM(require_jsx_runtime(), 1); var ANIMATION_DURATION2 = 0.25; var commonTransition = { type: "tween", duration: ANIMATION_DURATION2, ease: [0.6, 0, 0.4, 1] }; function useHTMLClass(className) { (0, import_element4.useEffect)(() => { const element = document && document.querySelector(`html:not(.${className})`); if (!element) { return; } element.classList.toggle(className); return () => { element.classList.toggle(className); }; }, [className]); } var headerVariants = { hidden: { opacity: 1, marginTop: -60 }, visible: { opacity: 1, marginTop: 0 }, distractionFreeHover: { opacity: 1, marginTop: 0, transition: { ...commonTransition, delay: 0.2, delayChildren: 0.2 } }, distractionFreeHidden: { opacity: 0, marginTop: -60 }, distractionFreeDisabled: { opacity: 0, marginTop: 0, transition: { ...commonTransition, delay: 0.8, delayChildren: 0.8 } } }; function InterfaceSkeleton({ isDistractionFree, footer, header, editorNotices, sidebar, secondarySidebar, content, actions, labels, className }, ref) { const [secondarySidebarResizeListener, secondarySidebarSize] = (0, import_compose2.useResizeObserver)(); const isMobileViewport = (0, import_compose2.useViewportMatch)("medium", "<"); const disableMotion = (0, import_compose2.useReducedMotion)(); const defaultTransition = { type: "tween", duration: disableMotion ? 0 : ANIMATION_DURATION2, ease: [0.6, 0, 0.4, 1] }; useHTMLClass("interface-interface-skeleton__html-container"); const defaultLabels = { /* translators: accessibility text for the top bar landmark region. */ header: (0, import_i18n2._x)("Header", "header landmark area"), /* translators: accessibility text for the content landmark region. */ body: (0, import_i18n2.__)("Content"), /* translators: accessibility text for the secondary sidebar landmark region. */ secondarySidebar: (0, import_i18n2.__)("Block Library"), /* translators: accessibility text for the settings landmark region. */ sidebar: (0, import_i18n2._x)("Settings", "settings landmark area"), /* translators: accessibility text for the publish landmark region. */ actions: (0, import_i18n2.__)("Publish"), /* translators: accessibility text for the footer landmark region. */ footer: (0, import_i18n2.__)("Footer") }; const mergedLabels = { ...defaultLabels, ...labels }; return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)( "div", { ref, className: clsx_default( className, "interface-interface-skeleton", !!footer && "has-footer" ), children: [ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "interface-interface-skeleton__editor", children: [ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_components6.__unstableAnimatePresence, { initial: false, children: !!header && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)( navigable_region_default, { as: import_components6.__unstableMotion.div, className: "interface-interface-skeleton__header", "aria-label": mergedLabels.header, initial: isDistractionFree && !isMobileViewport ? "distractionFreeHidden" : "hidden", whileHover: isDistractionFree && !isMobileViewport ? "distractionFreeHover" : "visible", animate: isDistractionFree && !isMobileViewport ? "distractionFreeDisabled" : "visible", exit: isDistractionFree && !isMobileViewport ? "distractionFreeHidden" : "hidden", variants: headerVariants, transition: defaultTransition, children: header } ) }), isDistractionFree && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "interface-interface-skeleton__header", children: editorNotices }), /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "interface-interface-skeleton__body", children: [ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_components6.__unstableAnimatePresence, { initial: false, children: !!secondarySidebar && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)( navigable_region_default, { className: "interface-interface-skeleton__secondary-sidebar", ariaLabel: mergedLabels.secondarySidebar, as: import_components6.__unstableMotion.div, initial: "closed", animate: "open", exit: "closed", variants: { open: { width: secondarySidebarSize.width }, closed: { width: 0 } }, transition: defaultTransition, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)( import_components6.__unstableMotion.div, { style: { position: "absolute", width: isMobileViewport ? "100vw" : "fit-content", height: "100%", left: 0 }, variants: { open: { x: 0 }, closed: { x: "-100%" } }, transition: defaultTransition, children: [ secondarySidebarResizeListener, secondarySidebar ] } ) } ) }), /* @__PURE__ */ (0, import_jsx_runtime21.jsx)( navigable_region_default, { className: "interface-interface-skeleton__content", ariaLabel: mergedLabels.body, children: content } ), !!sidebar && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)( navigable_region_default, { className: "interface-interface-skeleton__sidebar", ariaLabel: mergedLabels.sidebar, children: sidebar } ), !!actions && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)( navigable_region_default, { className: "interface-interface-skeleton__actions", ariaLabel: mergedLabels.actions, children: actions } ) ] }) ] }), !!footer && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)( navigable_region_default, { className: "interface-interface-skeleton__footer", ariaLabel: mergedLabels.footer, children: footer } ) ] } ); } var interface_skeleton_default = (0, import_element4.forwardRef)(InterfaceSkeleton); // packages/edit-widgets/build-module/store/actions.mjs var import_widgets2 = __toESM(require_widgets(), 1); var import_core_data = __toESM(require_core_data(), 1); var import_block_editor = __toESM(require_block_editor(), 1); // packages/edit-widgets/build-module/store/transformers.mjs var import_blocks = __toESM(require_blocks(), 1); var import_widgets = __toESM(require_widgets(), 1); function transformWidgetToBlock(widget) { if (widget.id_base === "block") { const parsedBlocks = (0, import_blocks.parse)(widget.instance.raw.content, { __unstableSkipAutop: true }); if (!parsedBlocks.length) { return (0, import_widgets.addWidgetIdToBlock)( (0, import_blocks.createBlock)("core/paragraph", {}, []), widget.id ); } return (0, import_widgets.addWidgetIdToBlock)(parsedBlocks[0], widget.id); } let attributes; if (widget._embedded.about[0].is_multi) { attributes = { idBase: widget.id_base, instance: widget.instance }; } else { attributes = { id: widget.id }; } return (0, import_widgets.addWidgetIdToBlock)( (0, import_blocks.createBlock)("core/legacy-widget", attributes, []), widget.id ); } function transformBlockToWidget(block, relatedWidget = {}) { let widget; const isValidLegacyWidgetBlock = block.name === "core/legacy-widget" && (block.attributes.id || block.attributes.instance); if (isValidLegacyWidgetBlock) { widget = { ...relatedWidget, id: block.attributes.id ?? relatedWidget.id, id_base: block.attributes.idBase ?? relatedWidget.id_base, instance: block.attributes.instance ?? relatedWidget.instance }; } else { widget = { ...relatedWidget, id_base: "block", instance: { raw: { content: (0, import_blocks.serialize)(block) } } }; } delete widget.rendered; delete widget.rendered_form; return widget; } // packages/edit-widgets/build-module/store/utils.mjs var KIND = "root"; var WIDGET_AREA_ENTITY_TYPE = "sidebar"; var POST_TYPE = "postType"; var buildWidgetAreaPostId = (widgetAreaId) => `widget-area-${widgetAreaId}`; var buildWidgetAreasPostId = () => `widget-areas`; function buildWidgetAreasQuery() { return { per_page: -1 }; } function buildWidgetsQuery() { return { per_page: -1, _embed: "about" }; } var createStubPost = (id, blocks) => ({ id, slug: id, status: "draft", type: "page", blocks, meta: { widgetAreaId: id } }); // packages/edit-widgets/build-module/store/constants.mjs var STORE_NAME2 = "core/edit-widgets"; // packages/edit-widgets/build-module/store/actions.mjs var persistStubPost = (id, blocks) => ({ registry }) => { const stubPost = createStubPost(id, blocks); registry.dispatch(import_core_data.store).receiveEntityRecords( KIND, POST_TYPE, stubPost, { id: stubPost.id }, false ); return stubPost; }; var saveEditedWidgetAreas = () => async ({ select, dispatch: dispatch2, registry }) => { const editedWidgetAreas = select.getEditedWidgetAreas(); if (!editedWidgetAreas?.length) { return; } try { await dispatch2.saveWidgetAreas(editedWidgetAreas); registry.dispatch(import_notices.store).createSuccessNotice((0, import_i18n3.__)("Widgets saved."), { type: "snackbar" }); } catch (e) { registry.dispatch(import_notices.store).createErrorNotice( /* translators: %s: The error message. */ (0, import_i18n3.sprintf)((0, import_i18n3.__)("There was an error. %s"), e.message), { type: "snackbar" } ); } }; var saveWidgetAreas = (widgetAreas) => async ({ dispatch: dispatch2, registry }) => { try { for (const widgetArea of widgetAreas) { await dispatch2.saveWidgetArea(widgetArea.id); } } finally { await registry.dispatch(import_core_data.store).finishResolution( "getEntityRecord", KIND, WIDGET_AREA_ENTITY_TYPE, buildWidgetAreasQuery() ); } }; var saveWidgetArea = (widgetAreaId) => async ({ dispatch: dispatch2, select, registry }) => { const widgets = select.getWidgets(); const post = registry.select(import_core_data.store).getEditedEntityRecord( KIND, POST_TYPE, buildWidgetAreaPostId(widgetAreaId) ); const areaWidgets = Object.values(widgets).filter( ({ sidebar }) => sidebar === widgetAreaId ); const usedReferenceWidgets = []; const widgetsBlocks = post.blocks.filter((block) => { const { id } = block.attributes; if (block.name === "core/legacy-widget" && id) { if (usedReferenceWidgets.includes(id)) { return false; } usedReferenceWidgets.push(id); } return true; }); const deletedWidgets = []; for (const widget of areaWidgets) { const widgetsNewArea = select.getWidgetAreaForWidgetId(widget.id); if (!widgetsNewArea) { deletedWidgets.push(widget); } } const batchMeta = []; const batchTasks = []; const sidebarWidgetsIds = []; for (let i = 0; i < widgetsBlocks.length; i++) { const block = widgetsBlocks[i]; const widgetId = (0, import_widgets2.getWidgetIdFromBlock)(block); const oldWidget = widgets[widgetId]; const widget = transformBlockToWidget(block, oldWidget); sidebarWidgetsIds.push(widgetId); if (oldWidget) { registry.dispatch(import_core_data.store).editEntityRecord( "root", "widget", widgetId, { ...widget, sidebar: widgetAreaId }, { undoIgnore: true } ); const hasEdits = registry.select(import_core_data.store).hasEditsForEntityRecord("root", "widget", widgetId); if (!hasEdits) { continue; } batchTasks.push( ({ saveEditedEntityRecord }) => saveEditedEntityRecord("root", "widget", widgetId) ); } else { batchTasks.push( ({ saveEntityRecord }) => saveEntityRecord("root", "widget", { ...widget, sidebar: widgetAreaId }) ); } batchMeta.push({ block, position: i, clientId: block.clientId }); } for (const widget of deletedWidgets) { batchTasks.push( ({ deleteEntityRecord }) => deleteEntityRecord("root", "widget", widget.id, { force: true }) ); } const records = await registry.dispatch(import_core_data.store).__experimentalBatch(batchTasks); const preservedRecords = records.filter( (record) => !record.hasOwnProperty("deleted") ); const failedWidgetNames = []; for (let i = 0; i < preservedRecords.length; i++) { const widget = preservedRecords[i]; const { block, position } = batchMeta[i]; post.blocks[position].attributes.__internalWidgetId = widget.id; const error = registry.select(import_core_data.store).getLastEntitySaveError("root", "widget", widget.id); if (error) { failedWidgetNames.push(block.attributes?.name || block?.name); } if (!sidebarWidgetsIds[position]) { sidebarWidgetsIds[position] = widget.id; } } if (failedWidgetNames.length) { throw new Error( (0, import_i18n3.sprintf)( /* translators: %s: List of widget names */ (0, import_i18n3.__)("Could not save the following widgets: %s."), failedWidgetNames.join(", ") ) ); } registry.dispatch(import_core_data.store).editEntityRecord( KIND, WIDGET_AREA_ENTITY_TYPE, widgetAreaId, { widgets: sidebarWidgetsIds }, { undoIgnore: true } ); dispatch2(trySaveWidgetArea(widgetAreaId)); registry.dispatch(import_core_data.store).receiveEntityRecords(KIND, POST_TYPE, post, void 0); }; var trySaveWidgetArea = (widgetAreaId) => ({ registry }) => { registry.dispatch(import_core_data.store).saveEditedEntityRecord( KIND, WIDGET_AREA_ENTITY_TYPE, widgetAreaId, { throwOnError: true } ); }; function setWidgetIdForClientId(clientId, widgetId) { return { type: "SET_WIDGET_ID_FOR_CLIENT_ID", clientId, widgetId }; } function setWidgetAreasOpenState(widgetAreasOpenState2) { return { type: "SET_WIDGET_AREAS_OPEN_STATE", widgetAreasOpenState: widgetAreasOpenState2 }; } function setIsWidgetAreaOpen(clientId, isOpen) { return { type: "SET_IS_WIDGET_AREA_OPEN", clientId, isOpen }; } function setIsInserterOpened(value) { return { type: "SET_IS_INSERTER_OPENED", value }; } function setIsListViewOpened(isOpen) { return { type: "SET_IS_LIST_VIEW_OPENED", isOpen }; } var closeGeneralSidebar = () => ({ registry }) => { registry.dispatch(store).disableComplementaryArea(STORE_NAME2); }; var moveBlockToWidgetArea = (clientId, widgetAreaId) => async ({ dispatch: dispatch2, select, registry }) => { const sourceRootClientId = registry.select(import_block_editor.store).getBlockRootClientId(clientId); const widgetAreas = registry.select(import_block_editor.store).getBlocks(); const destinationWidgetAreaBlock = widgetAreas.find( ({ attributes }) => attributes.id === widgetAreaId ); const destinationRootClientId = destinationWidgetAreaBlock.clientId; const destinationInnerBlocksClientIds = registry.select(import_block_editor.store).getBlockOrder(destinationRootClientId); const destinationIndex = destinationInnerBlocksClientIds.length; const isDestinationWidgetAreaOpen = select.getIsWidgetAreaOpen( destinationRootClientId ); if (!isDestinationWidgetAreaOpen) { dispatch2.setIsWidgetAreaOpen(destinationRootClientId, true); } registry.dispatch(import_block_editor.store).moveBlocksToPosition( [clientId], sourceRootClientId, destinationRootClientId, destinationIndex ); }; function unlockWidgetSaving(lockName) { return { type: "UNLOCK_WIDGET_SAVING", lockName }; } function lockWidgetSaving(lockName) { return { type: "LOCK_WIDGET_SAVING", lockName }; } // packages/edit-widgets/build-module/store/resolvers.mjs var getWidgetAreas = () => async ({ dispatch: dispatch2, registry }) => { const query = buildWidgetAreasQuery(); const widgetAreas = await registry.resolveSelect(import_core_data2.store).getEntityRecords(KIND, WIDGET_AREA_ENTITY_TYPE, query); const widgetAreaBlocks = []; const sortedWidgetAreas = widgetAreas.sort((a, b) => { if (a.id === "wp_inactive_widgets") { return 1; } if (b.id === "wp_inactive_widgets") { return -1; } return 0; }); for (const widgetArea of sortedWidgetAreas) { widgetAreaBlocks.push( (0, import_blocks2.createBlock)("core/widget-area", { id: widgetArea.id, name: widgetArea.name }) ); if (!widgetArea.widgets.length) { dispatch2( persistStubPost( buildWidgetAreaPostId(widgetArea.id), [] ) ); } } const widgetAreasOpenState2 = {}; widgetAreaBlocks.forEach((widgetAreaBlock, index) => { widgetAreasOpenState2[widgetAreaBlock.clientId] = index === 0; }); dispatch2(setWidgetAreasOpenState(widgetAreasOpenState2)); dispatch2( persistStubPost(buildWidgetAreasPostId(), widgetAreaBlocks) ); }; var getWidgets = () => async ({ dispatch: dispatch2, registry }) => { const query = buildWidgetsQuery(); const widgets = await registry.resolveSelect(import_core_data2.store).getEntityRecords("root", "widget", query); const groupedBySidebar = {}; for (const widget of widgets) { const block = transformWidgetToBlock(widget); groupedBySidebar[widget.sidebar] = groupedBySidebar[widget.sidebar] || []; groupedBySidebar[widget.sidebar].push(block); } for (const sidebarId in groupedBySidebar) { if (groupedBySidebar.hasOwnProperty(sidebarId)) { dispatch2( persistStubPost( buildWidgetAreaPostId(sidebarId), groupedBySidebar[sidebarId] ) ); } } }; // packages/edit-widgets/build-module/store/selectors.mjs var selectors_exports2 = {}; __export(selectors_exports2, { __experimentalGetInsertionPoint: () => __experimentalGetInsertionPoint, canInsertBlockInWidgetArea: () => canInsertBlockInWidgetArea, getEditedWidgetAreas: () => getEditedWidgetAreas, getIsWidgetAreaOpen: () => getIsWidgetAreaOpen, getParentWidgetAreaBlock: () => getParentWidgetAreaBlock, getReferenceWidgetBlocks: () => getReferenceWidgetBlocks, getWidget: () => getWidget, getWidgetAreaForWidgetId: () => getWidgetAreaForWidgetId, getWidgetAreas: () => getWidgetAreas2, getWidgets: () => getWidgets2, isInserterOpened: () => isInserterOpened, isListViewOpened: () => isListViewOpened, isSavingWidgetAreas: () => isSavingWidgetAreas, isWidgetSavingLocked: () => isWidgetSavingLocked }); var import_data7 = __toESM(require_data(), 1); var import_widgets3 = __toESM(require_widgets(), 1); var import_core_data3 = __toESM(require_core_data(), 1); var import_block_editor2 = __toESM(require_block_editor(), 1); var EMPTY_INSERTION_POINT = { rootClientId: void 0, insertionIndex: void 0 }; var getWidgets2 = (0, import_data7.createRegistrySelector)( (select) => (0, import_data7.createSelector)( () => { const widgets = select(import_core_data3.store).getEntityRecords( "root", "widget", buildWidgetsQuery() ); return ( // Key widgets by their ID. widgets?.reduce( (allWidgets, widget) => ({ ...allWidgets, [widget.id]: widget }), {} ) ?? {} ); }, () => [ select(import_core_data3.store).getEntityRecords( "root", "widget", buildWidgetsQuery() ) ] ) ); var getWidget = (0, import_data7.createRegistrySelector)( (select) => (state, id) => { const widgets = select(STORE_NAME2).getWidgets(); return widgets[id]; } ); var getWidgetAreas2 = (0, import_data7.createRegistrySelector)((select) => () => { const query = buildWidgetAreasQuery(); return select(import_core_data3.store).getEntityRecords( KIND, WIDGET_AREA_ENTITY_TYPE, query ); }); var getWidgetAreaForWidgetId = (0, import_data7.createRegistrySelector)( (select) => (state, widgetId) => { const widgetAreas = select(STORE_NAME2).getWidgetAreas(); return widgetAreas.find((widgetArea) => { const post = select(import_core_data3.store).getEditedEntityRecord( KIND, POST_TYPE, buildWidgetAreaPostId(widgetArea.id) ); const blockWidgetIds = post.blocks.map( (block) => (0, import_widgets3.getWidgetIdFromBlock)(block) ); return blockWidgetIds.includes(widgetId); }); } ); var getParentWidgetAreaBlock = (0, import_data7.createRegistrySelector)( (select) => (state, clientId) => { const { getBlock, getBlockName, getBlockParents } = select(import_block_editor2.store); const blockParents = getBlockParents(clientId); const widgetAreaClientId = blockParents.find( (parentClientId) => getBlockName(parentClientId) === "core/widget-area" ); return getBlock(widgetAreaClientId); } ); var getEditedWidgetAreas = (0, import_data7.createRegistrySelector)( (select) => (state, ids) => { let widgetAreas = select(STORE_NAME2).getWidgetAreas(); if (!widgetAreas) { return []; } if (ids) { widgetAreas = widgetAreas.filter( ({ id }) => ids.includes(id) ); } return widgetAreas.filter( ({ id }) => select(import_core_data3.store).hasEditsForEntityRecord( KIND, POST_TYPE, buildWidgetAreaPostId(id) ) ).map( ({ id }) => select(import_core_data3.store).getEditedEntityRecord( KIND, WIDGET_AREA_ENTITY_TYPE, id ) ); } ); var getReferenceWidgetBlocks = (0, import_data7.createRegistrySelector)( (select) => (state, referenceWidgetName = null) => { const results = []; const widgetAreas = select(STORE_NAME2).getWidgetAreas(); for (const _widgetArea of widgetAreas) { const post = select(import_core_data3.store).getEditedEntityRecord( KIND, POST_TYPE, buildWidgetAreaPostId(_widgetArea.id) ); for (const block of post.blocks) { if (block.name === "core/legacy-widget" && (!referenceWidgetName || block.attributes?.referenceWidgetName === referenceWidgetName)) { results.push(block); } } } return results; } ); var isSavingWidgetAreas = (0, import_data7.createRegistrySelector)((select) => () => { const widgetAreasIds = select(STORE_NAME2).getWidgetAreas()?.map(({ id }) => id); if (!widgetAreasIds) { return false; } for (const id of widgetAreasIds) { const isSaving = select(import_core_data3.store).isSavingEntityRecord( KIND, WIDGET_AREA_ENTITY_TYPE, id ); if (isSaving) { return true; } } const widgetIds = [ ...Object.keys(select(STORE_NAME2).getWidgets()), void 0 // account for new widgets without an ID ]; for (const id of widgetIds) { const isSaving = select(import_core_data3.store).isSavingEntityRecord( "root", "widget", id ); if (isSaving) { return true; } } return false; }); var getIsWidgetAreaOpen = (state, clientId) => { const { widgetAreasOpenState: widgetAreasOpenState2 } = state; return !!widgetAreasOpenState2[clientId]; }; function isInserterOpened(state) { return !!state.blockInserterPanel; } function __experimentalGetInsertionPoint(state) { if (typeof state.blockInserterPanel === "boolean") { return EMPTY_INSERTION_POINT; } return state.blockInserterPanel; } var canInsertBlockInWidgetArea = (0, import_data7.createRegistrySelector)( (select) => (state, blockName) => { const widgetAreas = select(import_block_editor2.store).getBlocks(); const [firstWidgetArea] = widgetAreas; return select(import_block_editor2.store).canInsertBlockType( blockName, firstWidgetArea.clientId ); } ); function isListViewOpened(state) { return state.listViewPanel; } function isWidgetSavingLocked(state) { return Object.keys(state.widgetSavingLock).length > 0; } // packages/edit-widgets/build-module/store/private-selectors.mjs var private_selectors_exports = {}; __export(private_selectors_exports, { getInserterSidebarToggleRef: () => getInserterSidebarToggleRef, getListViewToggleRef: () => getListViewToggleRef }); function getListViewToggleRef(state) { return state.listViewToggleRef; } function getInserterSidebarToggleRef(state) { return state.inserterSidebarToggleRef; } // packages/edit-widgets/build-module/lock-unlock.mjs var import_private_apis = __toESM(require_private_apis(), 1); var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)( "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.", "@wordpress/edit-widgets" ); // packages/edit-widgets/build-module/store/index.mjs var storeConfig = { reducer: reducer_default, selectors: selectors_exports2, resolvers: resolvers_exports, actions: actions_exports2 }; var store2 = (0, import_data8.createReduxStore)(STORE_NAME2, storeConfig); (0, import_data8.register)(store2); import_api_fetch.default.use(function(options, next) { if (options.path?.indexOf("/wp/v2/types/widget-area") === 0) { return Promise.resolve({}); } return next(options); }); unlock(store2).registerPrivateSelectors(private_selectors_exports); // packages/edit-widgets/build-module/filters/move-to-widget-area.mjs var import_block_editor3 = __toESM(require_block_editor(), 1); var import_compose3 = __toESM(require_compose(), 1); var import_data9 = __toESM(require_data(), 1); var import_hooks = __toESM(require_hooks(), 1); var import_widgets4 = __toESM(require_widgets(), 1); var import_jsx_runtime22 = __toESM(require_jsx_runtime(), 1); var withMoveToWidgetAreaToolbarItem = (0, import_compose3.createHigherOrderComponent)( (BlockEdit) => (props) => { const { clientId, name: blockName } = props; const { widgetAreas, currentWidgetAreaId, canInsertBlockInWidgetArea: canInsertBlockInWidgetArea2 } = (0, import_data9.useSelect)( (select) => { if (blockName === "core/widget-area") { return {}; } const selectors = select(store2); const widgetAreaBlock = selectors.getParentWidgetAreaBlock(clientId); return { widgetAreas: selectors.getWidgetAreas(), currentWidgetAreaId: widgetAreaBlock?.attributes?.id, canInsertBlockInWidgetArea: selectors.canInsertBlockInWidgetArea(blockName) }; }, [clientId, blockName] ); const { moveBlockToWidgetArea: moveBlockToWidgetArea2 } = (0, import_data9.useDispatch)(store2); const hasMultipleWidgetAreas = widgetAreas?.length > 1; const isMoveToWidgetAreaVisible = blockName !== "core/widget-area" && hasMultipleWidgetAreas && canInsertBlockInWidgetArea2; return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_jsx_runtime22.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(BlockEdit, { ...props }, "edit"), isMoveToWidgetAreaVisible && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_block_editor3.BlockControls, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)( import_widgets4.MoveToWidgetArea, { widgetAreas, currentWidgetAreaId, onSelect: (widgetAreaId) => { moveBlockToWidgetArea2( props.clientId, widgetAreaId ); } } ) }) ] }); }, "withMoveToWidgetAreaToolbarItem" ); (0, import_hooks.addFilter)( "editor.BlockEdit", "core/edit-widgets/block-edit", withMoveToWidgetAreaToolbarItem ); // packages/edit-widgets/build-module/filters/replace-media-upload.mjs var import_hooks2 = __toESM(require_hooks(), 1); var import_media_utils = __toESM(require_media_utils(), 1); var replaceMediaUpload = () => import_media_utils.MediaUpload; (0, import_hooks2.addFilter)( "editor.MediaUpload", "core/edit-widgets/replace-media-upload", replaceMediaUpload ); // packages/edit-widgets/build-module/blocks/widget-area/index.mjs var widget_area_exports = {}; __export(widget_area_exports, { metadata: () => block_default, name: () => name, settings: () => settings }); var import_i18n4 = __toESM(require_i18n(), 1); // packages/edit-widgets/build-module/blocks/widget-area/block.json var block_default = { $schema: "https://schemas.wp.org/trunk/block.json", apiVersion: 3, name: "core/widget-area", title: "Widget Area", category: "widgets", attributes: { id: { type: "string" }, name: { type: "string" } }, supports: { html: false, inserter: false, customClassName: false, reusable: false, renaming: false, visibility: false, __experimentalToolbar: false, __experimentalParentSelector: false, __experimentalDisableBlockOverlay: true }, editorStyle: "wp-block-widget-area-editor", style: "wp-block-widget-area" }; // packages/edit-widgets/build-module/blocks/widget-area/edit/index.mjs var import_element7 = __toESM(require_element(), 1); var import_data10 = __toESM(require_data(), 1); var import_core_data5 = __toESM(require_core_data(), 1); var import_components7 = __toESM(require_components(), 1); var import_block_editor5 = __toESM(require_block_editor(), 1); // packages/edit-widgets/build-module/blocks/widget-area/edit/inner-blocks.mjs var import_core_data4 = __toESM(require_core_data(), 1); var import_block_editor4 = __toESM(require_block_editor(), 1); var import_element6 = __toESM(require_element(), 1); // packages/edit-widgets/build-module/blocks/widget-area/edit/use-is-dragging-within.mjs var import_element5 = __toESM(require_element(), 1); var useIsDraggingWithin = (elementRef) => { const [isDraggingWithin, setIsDraggingWithin] = (0, import_element5.useState)(false); (0, import_element5.useEffect)(() => { const { ownerDocument } = elementRef.current; function handleDragStart(event) { handleDragEnter(event); } function handleDragEnd() { setIsDraggingWithin(false); } function handleDragEnter(event) { if (elementRef.current.contains(event.target)) { setIsDraggingWithin(true); } else { setIsDraggingWithin(false); } } ownerDocument.addEventListener("dragstart", handleDragStart); ownerDocument.addEventListener("dragend", handleDragEnd); ownerDocument.addEventListener("dragenter", handleDragEnter); return () => { ownerDocument.removeEventListener("dragstart", handleDragStart); ownerDocument.removeEventListener("dragend", handleDragEnd); ownerDocument.removeEventListener("dragenter", handleDragEnter); }; }, []); return isDraggingWithin; }; var use_is_dragging_within_default = useIsDraggingWithin; // packages/edit-widgets/build-module/blocks/widget-area/edit/inner-blocks.mjs var import_jsx_runtime23 = __toESM(require_jsx_runtime(), 1); function WidgetAreaInnerBlocks({ id }) { const [blocks, onInput, onChange] = (0, import_core_data4.useEntityBlockEditor)( "root", "postType" ); const innerBlocksRef = (0, import_element6.useRef)(); const isDraggingWithinInnerBlocks = use_is_dragging_within_default(innerBlocksRef); const shouldHighlightDropZone = isDraggingWithinInnerBlocks; const innerBlocksProps = (0, import_block_editor4.useInnerBlocksProps)( { ref: innerBlocksRef }, { value: blocks, onInput, onChange, templateLock: false, renderAppender: import_block_editor4.InnerBlocks.ButtonBlockAppender } ); return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)( "div", { "data-widget-area-id": id, className: clsx_default( "wp-block-widget-area__inner-blocks block-editor-inner-blocks editor-styles-wrapper", { "wp-block-widget-area__highlight-drop-zone": shouldHighlightDropZone } ), children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { ...innerBlocksProps }) } ); } // packages/edit-widgets/build-module/blocks/widget-area/edit/index.mjs var import_jsx_runtime24 = __toESM(require_jsx_runtime(), 1); function WidgetAreaEdit({ clientId, attributes: { id, name: name2 } }) { const isOpen = (0, import_data10.useSelect)( (select) => select(store2).getIsWidgetAreaOpen(clientId), [clientId] ); const { setIsWidgetAreaOpen: setIsWidgetAreaOpen2 } = (0, import_data10.useDispatch)(store2); const wrapper = (0, import_element7.useRef)(); const setOpen = (0, import_element7.useCallback)( (openState) => setIsWidgetAreaOpen2(clientId, openState), [clientId] ); const isDragging = useIsDragging(wrapper); const isDraggingWithin = use_is_dragging_within_default(wrapper); const [openedWhileDragging, setOpenedWhileDragging] = (0, import_element7.useState)(false); (0, import_element7.useEffect)(() => { if (!isDragging) { setOpenedWhileDragging(false); return; } if (isDraggingWithin && !isOpen) { setOpen(true); setOpenedWhileDragging(true); } else if (!isDraggingWithin && isOpen && openedWhileDragging) { setOpen(false); } }, [isOpen, isDragging, isDraggingWithin, openedWhileDragging]); const blockProps = (0, import_block_editor5.useBlockProps)(); return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { ...blockProps, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_components7.Panel, { ref: wrapper, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)( import_components7.PanelBody, { title: name2, opened: isOpen, onToggle: () => { setIsWidgetAreaOpen2(clientId, !isOpen); }, scrollAfterOpen: !isDragging, children: ({ opened }) => ( // This is required to ensure LegacyWidget blocks are not // unmounted when the panel is collapsed. Unmounting legacy // widgets may have unintended consequences (e.g. TinyMCE // not being properly reinitialized) /* @__PURE__ */ (0, import_jsx_runtime24.jsx)( import_components7.__unstableDisclosureContent, { className: "wp-block-widget-area__panel-body-content", visible: opened, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)( import_core_data5.EntityProvider, { kind: "root", type: "postType", id: `widget-area-${id}`, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(WidgetAreaInnerBlocks, { id }) } ) } ) ) } ) }) }); } var useIsDragging = (elementRef) => { const [isDragging, setIsDragging] = (0, import_element7.useState)(false); (0, import_element7.useEffect)(() => { const { ownerDocument } = elementRef.current; function handleDragStart() { setIsDragging(true); } function handleDragEnd() { setIsDragging(false); } ownerDocument.addEventListener("dragstart", handleDragStart); ownerDocument.addEventListener("dragend", handleDragEnd); return () => { ownerDocument.removeEventListener("dragstart", handleDragStart); ownerDocument.removeEventListener("dragend", handleDragEnd); }; }, []); return isDragging; }; // packages/edit-widgets/build-module/blocks/widget-area/index.mjs var { name } = block_default; var settings = { title: (0, import_i18n4.__)("Widget Area"), description: (0, import_i18n4.__)("A widget area container."), __experimentalLabel: ({ name: label }) => label, edit: WidgetAreaEdit }; // packages/edit-widgets/build-module/components/layout/index.mjs var import_i18n21 = __toESM(require_i18n(), 1); var import_data31 = __toESM(require_data(), 1); var import_plugins3 = __toESM(require_plugins(), 1); var import_notices4 = __toESM(require_notices(), 1); var import_components22 = __toESM(require_components(), 1); // packages/edit-widgets/build-module/components/error-boundary/index.mjs var import_element8 = __toESM(require_element(), 1); var import_i18n5 = __toESM(require_i18n(), 1); var import_components8 = __toESM(require_components(), 1); var import_block_editor6 = __toESM(require_block_editor(), 1); var import_compose4 = __toESM(require_compose(), 1); var import_hooks3 = __toESM(require_hooks(), 1); var import_jsx_runtime25 = __toESM(require_jsx_runtime(), 1); function CopyButton({ text, children }) { const ref = (0, import_compose4.useCopyToClipboard)(text); return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_components8.Button, { __next40pxDefaultSize: true, variant: "secondary", ref, children }); } function ErrorBoundaryWarning({ message, error }) { const actions = [ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(CopyButton, { text: error.stack, children: (0, import_i18n5.__)("Copy Error") }, "copy-error") ]; return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_block_editor6.Warning, { className: "edit-widgets-error-boundary", actions, children: message }); } var ErrorBoundary = class extends import_element8.Component { constructor() { super(...arguments); this.state = { error: null }; } componentDidCatch(error) { (0, import_hooks3.doAction)("editor.ErrorBoundary.errorLogged", error); } static getDerivedStateFromError(error) { return { error }; } render() { if (!this.state.error) { return this.props.children; } return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)( ErrorBoundaryWarning, { message: (0, import_i18n5.__)( "The editor has encountered an unexpected error." ), error: this.state.error } ); } }; // packages/edit-widgets/build-module/components/widget-areas-block-editor-provider/index.mjs var import_components9 = __toESM(require_components(), 1); var import_compose5 = __toESM(require_compose(), 1); var import_media_utils2 = __toESM(require_media_utils(), 1); var import_data13 = __toESM(require_data(), 1); var import_core_data8 = __toESM(require_core_data(), 1); var import_element10 = __toESM(require_element(), 1); var import_block_editor8 = __toESM(require_block_editor(), 1); var import_patterns = __toESM(require_patterns(), 1); var import_preferences4 = __toESM(require_preferences(), 1); var import_block_library = __toESM(require_block_library(), 1); // packages/edit-widgets/build-module/components/keyboard-shortcuts/index.mjs var import_element9 = __toESM(require_element(), 1); var import_keyboard_shortcuts = __toESM(require_keyboard_shortcuts(), 1); var import_keycodes = __toESM(require_keycodes(), 1); var import_data11 = __toESM(require_data(), 1); var import_i18n6 = __toESM(require_i18n(), 1); var import_core_data6 = __toESM(require_core_data(), 1); function KeyboardShortcuts() { const { redo, undo } = (0, import_data11.useDispatch)(import_core_data6.store); const { saveEditedWidgetAreas: saveEditedWidgetAreas2 } = (0, import_data11.useDispatch)(store2); (0, import_keyboard_shortcuts.useShortcut)("core/edit-widgets/undo", (event) => { undo(); event.preventDefault(); }); (0, import_keyboard_shortcuts.useShortcut)("core/edit-widgets/redo", (event) => { redo(); event.preventDefault(); }); (0, import_keyboard_shortcuts.useShortcut)("core/edit-widgets/save", (event) => { event.preventDefault(); saveEditedWidgetAreas2(); }); return null; } function KeyboardShortcutsRegister() { const { registerShortcut } = (0, import_data11.useDispatch)(import_keyboard_shortcuts.store); (0, import_element9.useEffect)(() => { registerShortcut({ name: "core/edit-widgets/undo", category: "global", description: (0, import_i18n6.__)("Undo your last changes."), keyCombination: { modifier: "primary", character: "z" } }); registerShortcut({ name: "core/edit-widgets/redo", category: "global", description: (0, import_i18n6.__)("Redo your last undo."), keyCombination: { modifier: "primaryShift", character: "z" }, // Disable on Apple OS because it conflicts with the browser's // history shortcut. It's a fine alias for both Windows and Linux. // Since there's no conflict for Ctrl+Shift+Z on both Windows and // Linux, we keep it as the default for consistency. aliases: (0, import_keycodes.isAppleOS)() ? [] : [ { modifier: "primary", character: "y" } ] }); registerShortcut({ name: "core/edit-widgets/save", category: "global", description: (0, import_i18n6.__)("Save your changes."), keyCombination: { modifier: "primary", character: "s" } }); registerShortcut({ name: "core/edit-widgets/keyboard-shortcuts", category: "main", description: (0, import_i18n6.__)("Display these keyboard shortcuts."), keyCombination: { modifier: "access", character: "h" } }); registerShortcut({ name: "core/edit-widgets/next-region", category: "global", description: (0, import_i18n6.__)("Navigate to the next part of the editor."), keyCombination: { modifier: "ctrl", character: "`" }, aliases: [ { modifier: "access", character: "n" } ] }); registerShortcut({ name: "core/edit-widgets/previous-region", category: "global", description: (0, import_i18n6.__)("Navigate to the previous part of the editor."), keyCombination: { modifier: "ctrlShift", character: "`" }, aliases: [ { modifier: "access", character: "p" }, { modifier: "ctrlShift", character: "~" } ] }); }, [registerShortcut]); return null; } KeyboardShortcuts.Register = KeyboardShortcutsRegister; var keyboard_shortcuts_default = KeyboardShortcuts; // packages/edit-widgets/build-module/hooks/use-last-selected-widget-area.mjs var import_data12 = __toESM(require_data(), 1); var import_block_editor7 = __toESM(require_block_editor(), 1); var import_core_data7 = __toESM(require_core_data(), 1); var useLastSelectedWidgetArea = () => (0, import_data12.useSelect)((select) => { const { getBlockSelectionEnd, getBlockName } = select(import_block_editor7.store); const selectionEndClientId = getBlockSelectionEnd(); if (getBlockName(selectionEndClientId) === "core/widget-area") { return selectionEndClientId; } const { getParentWidgetAreaBlock: getParentWidgetAreaBlock2 } = select(store2); const widgetAreaBlock = getParentWidgetAreaBlock2(selectionEndClientId); const widgetAreaBlockClientId = widgetAreaBlock?.clientId; if (widgetAreaBlockClientId) { return widgetAreaBlockClientId; } const { getEntityRecord } = select(import_core_data7.store); const widgetAreasPost = getEntityRecord( KIND, POST_TYPE, buildWidgetAreasPostId() ); return widgetAreasPost?.blocks[0]?.clientId; }, []); var use_last_selected_widget_area_default = useLastSelectedWidgetArea; // packages/edit-widgets/build-module/constants.mjs var ALLOW_REUSABLE_BLOCKS = false; // packages/edit-widgets/build-module/components/widget-areas-block-editor-provider/index.mjs var import_jsx_runtime26 = __toESM(require_jsx_runtime(), 1); var { ExperimentalBlockEditorProvider } = unlock(import_block_editor8.privateApis); var { PatternsMenuItems } = unlock(import_patterns.privateApis); var { BlockKeyboardShortcuts } = unlock(import_block_library.privateApis); var EMPTY_ARRAY = []; function WidgetAreasBlockEditorProvider({ blockEditorSettings, children, ...props }) { const isLargeViewport = (0, import_compose5.useViewportMatch)("medium"); const { hasUploadPermissions, reusableBlocks, isFixedToolbarActive, keepCaretInsideBlock, pageOnFront, pageForPosts } = (0, import_data13.useSelect)((select) => { const { canUser, getEntityRecord, getEntityRecords } = select(import_core_data8.store); const siteSettings = canUser("read", { kind: "root", name: "site" }) ? getEntityRecord("root", "site") : void 0; return { hasUploadPermissions: canUser("create", { kind: "postType", name: "attachment" }) ?? true, reusableBlocks: ALLOW_REUSABLE_BLOCKS ? getEntityRecords("postType", "wp_block") : EMPTY_ARRAY, isFixedToolbarActive: !!select(import_preferences4.store).get( "core/edit-widgets", "fixedToolbar" ), keepCaretInsideBlock: !!select(import_preferences4.store).get( "core/edit-widgets", "keepCaretInsideBlock" ), pageOnFront: siteSettings?.page_on_front, pageForPosts: siteSettings?.page_for_posts }; }, []); const { setIsInserterOpened: setIsInserterOpened2 } = (0, import_data13.useDispatch)(store2); const settings2 = (0, import_element10.useMemo)(() => { let mediaUploadBlockEditor; if (hasUploadPermissions) { mediaUploadBlockEditor = ({ onError, ...argumentsObject }) => { (0, import_media_utils2.uploadMedia)({ wpAllowedMimeTypes: blockEditorSettings.allowedMimeTypes, onError: ({ message }) => onError(message), ...argumentsObject }); }; } return { ...blockEditorSettings, __experimentalReusableBlocks: reusableBlocks, hasFixedToolbar: isFixedToolbarActive || !isLargeViewport, keepCaretInsideBlock, mediaUpload: mediaUploadBlockEditor, templateLock: "all", __experimentalSetIsInserterOpened: setIsInserterOpened2, pageOnFront, pageForPosts, editorTool: "edit" }; }, [ hasUploadPermissions, blockEditorSettings, isFixedToolbarActive, isLargeViewport, keepCaretInsideBlock, reusableBlocks, setIsInserterOpened2, pageOnFront, pageForPosts ]); const widgetAreaId = use_last_selected_widget_area_default(); const [blocks, onInput, onChange] = (0, import_core_data8.useEntityBlockEditor)( KIND, POST_TYPE, { id: buildWidgetAreasPostId() } ); return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_components9.SlotFillProvider, { children: [ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(keyboard_shortcuts_default.Register, {}), /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(BlockKeyboardShortcuts, {}), /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)( ExperimentalBlockEditorProvider, { value: blocks, onInput, onChange, settings: settings2, useSubRegistry: false, ...props, children: [ children, /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(PatternsMenuItems, { rootClientId: widgetAreaId }) ] } ) ] }); } // packages/edit-widgets/build-module/components/sidebar/index.mjs var import_element12 = __toESM(require_element(), 1); var import_i18n8 = __toESM(require_i18n(), 1); var import_block_editor10 = __toESM(require_block_editor(), 1); var import_components11 = __toESM(require_components(), 1); var import_data15 = __toESM(require_data(), 1); // packages/edit-widgets/build-module/components/sidebar/widget-areas.mjs var import_data14 = __toESM(require_data(), 1); var import_element11 = __toESM(require_element(), 1); var import_block_editor9 = __toESM(require_block_editor(), 1); var import_components10 = __toESM(require_components(), 1); var import_i18n7 = __toESM(require_i18n(), 1); var import_url = __toESM(require_url(), 1); var import_dom = __toESM(require_dom(), 1); var import_jsx_runtime27 = __toESM(require_jsx_runtime(), 1); function WidgetAreas({ selectedWidgetAreaId }) { const widgetAreas = (0, import_data14.useSelect)( (select) => select(store2).getWidgetAreas(), [] ); const selectedWidgetArea = (0, import_element11.useMemo)( () => selectedWidgetAreaId && widgetAreas?.find( (widgetArea) => widgetArea.id === selectedWidgetAreaId ), [selectedWidgetAreaId, widgetAreas] ); let description; if (!selectedWidgetArea) { description = (0, import_i18n7.__)( // eslint-disable-next-line no-restricted-syntax -- 'sidebar' is a common web design term for layouts "Widget Areas are global parts in your site\u2019s layout that can accept blocks. These vary by theme, but are typically parts like your Sidebar or Footer." ); } else if (selectedWidgetAreaId === "wp_inactive_widgets") { description = (0, import_i18n7.__)( "Blocks in this Widget Area will not be displayed in your site." ); } else { description = selectedWidgetArea.description; } return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "edit-widgets-widget-areas", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "edit-widgets-widget-areas__top-container", children: [ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_block_editor9.BlockIcon, { icon: block_default_default }), /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { children: [ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)( "p", { dangerouslySetInnerHTML: { __html: (0, import_dom.safeHTML)(description) } } ), widgetAreas?.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("p", { children: (0, import_i18n7.__)( "Your theme does not contain any Widget Areas." ) }), !selectedWidgetArea && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)( import_components10.Button, { __next40pxDefaultSize: true, href: (0, import_url.addQueryArgs)("customize.php", { "autofocus[panel]": "widgets", return: window.location.pathname }), variant: "tertiary", children: (0, import_i18n7.__)("Manage with live preview") } ) ] }) ] }) }); } // packages/edit-widgets/build-module/components/sidebar/index.mjs var import_jsx_runtime28 = __toESM(require_jsx_runtime(), 1); var SIDEBAR_ACTIVE_BY_DEFAULT = import_element12.Platform.select({ web: true, native: false }); var BLOCK_INSPECTOR_IDENTIFIER = "edit-widgets/block-inspector"; var WIDGET_AREAS_IDENTIFIER = "edit-widgets/block-areas"; var { Tabs } = unlock(import_components11.privateApis); function SidebarHeader({ selectedWidgetAreaBlock }) { return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Tabs.TabList, { children: [ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Tabs.Tab, { tabId: WIDGET_AREAS_IDENTIFIER, children: selectedWidgetAreaBlock ? selectedWidgetAreaBlock.attributes.name : (0, import_i18n8.__)("Widget Areas") }), /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Tabs.Tab, { tabId: BLOCK_INSPECTOR_IDENTIFIER, children: (0, import_i18n8.__)("Block") }) ] }); } function SidebarContent({ hasSelectedNonAreaBlock, currentArea, isGeneralSidebarOpen, selectedWidgetAreaBlock }) { const { enableComplementaryArea: enableComplementaryArea2 } = (0, import_data15.useDispatch)(store); (0, import_element12.useEffect)(() => { if (hasSelectedNonAreaBlock && currentArea === WIDGET_AREAS_IDENTIFIER && isGeneralSidebarOpen) { enableComplementaryArea2( "core/edit-widgets", BLOCK_INSPECTOR_IDENTIFIER ); } if (!hasSelectedNonAreaBlock && currentArea === BLOCK_INSPECTOR_IDENTIFIER && isGeneralSidebarOpen) { enableComplementaryArea2( "core/edit-widgets", WIDGET_AREAS_IDENTIFIER ); } }, [hasSelectedNonAreaBlock, enableComplementaryArea2]); const tabsContextValue = (0, import_element12.useContext)(Tabs.Context); return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)( complementary_area_default, { className: "edit-widgets-sidebar", header: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Tabs.Context.Provider, { value: tabsContextValue, children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)( SidebarHeader, { selectedWidgetAreaBlock } ) }), headerClassName: "edit-widgets-sidebar__panel-tabs", title: (0, import_i18n8.__)("Settings"), closeLabel: (0, import_i18n8.__)("Close Settings"), scope: "core/edit-widgets", identifier: currentArea, icon: (0, import_i18n8.isRTL)() ? drawer_left_default : drawer_right_default, isActiveByDefault: SIDEBAR_ACTIVE_BY_DEFAULT, children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Tabs.Context.Provider, { value: tabsContextValue, children: [ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)( Tabs.TabPanel, { tabId: WIDGET_AREAS_IDENTIFIER, focusable: false, children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)( WidgetAreas, { selectedWidgetAreaId: selectedWidgetAreaBlock?.attributes.id } ) } ), /* @__PURE__ */ (0, import_jsx_runtime28.jsx)( Tabs.TabPanel, { tabId: BLOCK_INSPECTOR_IDENTIFIER, focusable: false, children: hasSelectedNonAreaBlock ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_block_editor10.BlockInspector, {}) : ( // Pretend that Widget Areas are part of the UI by not // showing the Block Inspector when one is selected. /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "block-editor-block-inspector__no-blocks", children: (0, import_i18n8.__)("No block selected.") }) ) } ) ] }) } ); } function Sidebar() { const { currentArea, hasSelectedNonAreaBlock, isGeneralSidebarOpen, selectedWidgetAreaBlock } = (0, import_data15.useSelect)((select) => { const { getSelectedBlock, getBlock, getBlockParentsByBlockName } = select(import_block_editor10.store); const { getActiveComplementaryArea: getActiveComplementaryArea2 } = select(store); const selectedBlock = getSelectedBlock(); const activeArea = getActiveComplementaryArea2(store2.name); let currentSelection = activeArea; if (!currentSelection) { if (selectedBlock) { currentSelection = BLOCK_INSPECTOR_IDENTIFIER; } else { currentSelection = WIDGET_AREAS_IDENTIFIER; } } let widgetAreaBlock; if (selectedBlock) { if (selectedBlock.name === "core/widget-area") { widgetAreaBlock = selectedBlock; } else { widgetAreaBlock = getBlock( getBlockParentsByBlockName( selectedBlock.clientId, "core/widget-area" )[0] ); } } return { currentArea: currentSelection, hasSelectedNonAreaBlock: !!(selectedBlock && selectedBlock.name !== "core/widget-area"), isGeneralSidebarOpen: !!activeArea, selectedWidgetAreaBlock: widgetAreaBlock }; }, []); const { enableComplementaryArea: enableComplementaryArea2 } = (0, import_data15.useDispatch)(store); const onTabSelect = (0, import_element12.useCallback)( (newSelectedTabId) => { if (!!newSelectedTabId) { enableComplementaryArea2( store2.name, newSelectedTabId ); } }, [enableComplementaryArea2] ); return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)( Tabs, { selectedTabId: isGeneralSidebarOpen ? currentArea : null, onSelect: onTabSelect, selectOnMove: false, children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)( SidebarContent, { hasSelectedNonAreaBlock, currentArea, isGeneralSidebarOpen, selectedWidgetAreaBlock } ) } ); } // packages/edit-widgets/build-module/components/layout/interface.mjs var import_compose12 = __toESM(require_compose(), 1); var import_block_editor17 = __toESM(require_block_editor(), 1); var import_element22 = __toESM(require_element(), 1); var import_data28 = __toESM(require_data(), 1); var import_i18n18 = __toESM(require_i18n(), 1); var import_preferences8 = __toESM(require_preferences(), 1); // packages/edit-widgets/build-module/components/header/index.mjs var import_block_editor12 = __toESM(require_block_editor(), 1); var import_data22 = __toESM(require_data(), 1); var import_element18 = __toESM(require_element(), 1); var import_i18n16 = __toESM(require_i18n(), 1); var import_components19 = __toESM(require_components(), 1); var import_compose8 = __toESM(require_compose(), 1); var import_preferences6 = __toESM(require_preferences(), 1); // packages/edit-widgets/build-module/components/header/document-tools/index.mjs var import_data18 = __toESM(require_data(), 1); var import_i18n11 = __toESM(require_i18n(), 1); var import_components14 = __toESM(require_components(), 1); var import_block_editor11 = __toESM(require_block_editor(), 1); var import_element15 = __toESM(require_element(), 1); var import_compose6 = __toESM(require_compose(), 1); // packages/edit-widgets/build-module/components/header/undo-redo/undo.mjs var import_i18n9 = __toESM(require_i18n(), 1); var import_components12 = __toESM(require_components(), 1); var import_data16 = __toESM(require_data(), 1); var import_keycodes2 = __toESM(require_keycodes(), 1); var import_core_data9 = __toESM(require_core_data(), 1); var import_element13 = __toESM(require_element(), 1); var import_jsx_runtime29 = __toESM(require_jsx_runtime(), 1); function UndoButton(props, ref) { const hasUndo = (0, import_data16.useSelect)( (select) => select(import_core_data9.store).hasUndo(), [] ); const { undo } = (0, import_data16.useDispatch)(import_core_data9.store); return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)( import_components12.Button, { ...props, ref, icon: !(0, import_i18n9.isRTL)() ? undo_default : redo_default, label: (0, import_i18n9.__)("Undo"), shortcut: import_keycodes2.displayShortcut.primary("z"), "aria-disabled": !hasUndo, onClick: hasUndo ? undo : void 0, size: "compact" } ); } var undo_default2 = (0, import_element13.forwardRef)(UndoButton); // packages/edit-widgets/build-module/components/header/undo-redo/redo.mjs var import_i18n10 = __toESM(require_i18n(), 1); var import_components13 = __toESM(require_components(), 1); var import_data17 = __toESM(require_data(), 1); var import_keycodes3 = __toESM(require_keycodes(), 1); var import_core_data10 = __toESM(require_core_data(), 1); var import_element14 = __toESM(require_element(), 1); var import_jsx_runtime30 = __toESM(require_jsx_runtime(), 1); function RedoButton(props, ref) { const shortcut = (0, import_keycodes3.isAppleOS)() ? import_keycodes3.displayShortcut.primaryShift("z") : import_keycodes3.displayShortcut.primary("y"); const hasRedo = (0, import_data17.useSelect)( (select) => select(import_core_data10.store).hasRedo(), [] ); const { redo } = (0, import_data17.useDispatch)(import_core_data10.store); return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( import_components13.Button, { ...props, ref, icon: !(0, import_i18n10.isRTL)() ? redo_default : undo_default, label: (0, import_i18n10.__)("Redo"), shortcut, "aria-disabled": !hasRedo, onClick: hasRedo ? redo : void 0, size: "compact" } ); } var redo_default2 = (0, import_element14.forwardRef)(RedoButton); // packages/edit-widgets/build-module/components/header/document-tools/index.mjs var import_jsx_runtime31 = __toESM(require_jsx_runtime(), 1); function DocumentTools() { const isMediumViewport = (0, import_compose6.useViewportMatch)("medium"); const { isInserterOpen, isListViewOpen, inserterSidebarToggleRef: inserterSidebarToggleRef2, listViewToggleRef: listViewToggleRef2 } = (0, import_data18.useSelect)((select) => { const { isInserterOpened: isInserterOpened2, getInserterSidebarToggleRef: getInserterSidebarToggleRef2, isListViewOpened: isListViewOpened2, getListViewToggleRef: getListViewToggleRef2 } = unlock(select(store2)); return { isInserterOpen: isInserterOpened2(), isListViewOpen: isListViewOpened2(), inserterSidebarToggleRef: getInserterSidebarToggleRef2(), listViewToggleRef: getListViewToggleRef2() }; }, []); const { setIsInserterOpened: setIsInserterOpened2, setIsListViewOpened: setIsListViewOpened2 } = (0, import_data18.useDispatch)(store2); const toggleListView = (0, import_element15.useCallback)( () => setIsListViewOpened2(!isListViewOpen), [setIsListViewOpened2, isListViewOpen] ); const toggleInserterSidebar = (0, import_element15.useCallback)( () => setIsInserterOpened2(!isInserterOpen), [setIsInserterOpened2, isInserterOpen] ); return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)( import_block_editor11.NavigableToolbar, { className: "edit-widgets-header-toolbar", "aria-label": (0, import_i18n11.__)("Document tools"), variant: "unstyled", children: [ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( import_components14.ToolbarItem, { ref: inserterSidebarToggleRef2, as: import_components14.Button, className: "edit-widgets-header-toolbar__inserter-toggle", variant: "primary", isPressed: isInserterOpen, onMouseDown: (event) => { event.preventDefault(); }, onClick: toggleInserterSidebar, icon: plus_default, label: (0, import_i18n11._x)( "Block Inserter", "Generic label for block inserter button" ), size: "compact" } ), isMediumViewport && /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_jsx_runtime31.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_components14.ToolbarItem, { as: undo_default2 }), /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_components14.ToolbarItem, { as: redo_default2 }), /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( import_components14.ToolbarItem, { as: import_components14.Button, className: "edit-widgets-header-toolbar__list-view-toggle", icon: list_view_default, isPressed: isListViewOpen, label: (0, import_i18n11.__)("List View"), onClick: toggleListView, ref: listViewToggleRef2, size: "compact" } ) ] }) ] } ); } var document_tools_default = DocumentTools; // packages/edit-widgets/build-module/components/save-button/index.mjs var import_components15 = __toESM(require_components(), 1); var import_i18n12 = __toESM(require_i18n(), 1); var import_data19 = __toESM(require_data(), 1); var import_jsx_runtime32 = __toESM(require_jsx_runtime(), 1); function SaveButton() { const { hasEditedWidgetAreaIds, isSaving, isWidgetSaveLocked } = (0, import_data19.useSelect)( (select) => { const { getEditedWidgetAreas: getEditedWidgetAreas2, isSavingWidgetAreas: isSavingWidgetAreas2, isWidgetSavingLocked: isWidgetSavingLocked2 } = select(store2); return { hasEditedWidgetAreaIds: getEditedWidgetAreas2()?.length > 0, isSaving: isSavingWidgetAreas2(), isWidgetSaveLocked: isWidgetSavingLocked2() }; }, [] ); const { saveEditedWidgetAreas: saveEditedWidgetAreas2 } = (0, import_data19.useDispatch)(store2); const isDisabled = isWidgetSaveLocked || isSaving || !hasEditedWidgetAreaIds; return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)( import_components15.Button, { variant: "primary", isBusy: isSaving, "aria-disabled": isDisabled, onClick: isDisabled ? void 0 : saveEditedWidgetAreas2, size: "compact", children: isSaving ? (0, import_i18n12.__)("Saving\u2026") : (0, import_i18n12.__)("Update") } ); } var save_button_default = SaveButton; // packages/edit-widgets/build-module/components/more-menu/index.mjs var import_components18 = __toESM(require_components(), 1); var import_element17 = __toESM(require_element(), 1); var import_i18n15 = __toESM(require_i18n(), 1); var import_preferences5 = __toESM(require_preferences(), 1); var import_keycodes5 = __toESM(require_keycodes(), 1); var import_keyboard_shortcuts5 = __toESM(require_keyboard_shortcuts(), 1); var import_compose7 = __toESM(require_compose(), 1); // packages/edit-widgets/build-module/components/keyboard-shortcut-help-modal/index.mjs var import_components16 = __toESM(require_components(), 1); var import_i18n14 = __toESM(require_i18n(), 1); var import_keyboard_shortcuts4 = __toESM(require_keyboard_shortcuts(), 1); var import_data21 = __toESM(require_data(), 1); // packages/edit-widgets/build-module/components/keyboard-shortcut-help-modal/config.mjs var import_i18n13 = __toESM(require_i18n(), 1); var textFormattingShortcuts = [ { keyCombination: { modifier: "primary", character: "b" }, description: (0, import_i18n13.__)("Make the selected text bold.") }, { keyCombination: { modifier: "primary", character: "i" }, description: (0, import_i18n13.__)("Make the selected text italic.") }, { keyCombination: { modifier: "primary", character: "k" }, description: (0, import_i18n13.__)("Convert the selected text into a link.") }, { keyCombination: { modifier: "primaryShift", character: "k" }, description: (0, import_i18n13.__)("Remove a link.") }, { keyCombination: { character: "[[" }, description: (0, import_i18n13.__)("Insert a link to a post or page.") }, { keyCombination: { modifier: "primary", character: "u" }, description: (0, import_i18n13.__)("Underline the selected text.") }, { keyCombination: { modifier: "access", character: "d" }, description: (0, import_i18n13.__)("Strikethrough the selected text.") }, { keyCombination: { modifier: "access", character: "x" }, description: (0, import_i18n13.__)("Make the selected text inline code.") }, { keyCombination: { modifier: "access", character: "0" }, aliases: [ { modifier: "access", character: "7" } ], description: (0, import_i18n13.__)("Convert the current heading to a paragraph.") }, { keyCombination: { modifier: "access", character: "1-6" }, description: (0, import_i18n13.__)( "Convert the current paragraph or heading to a heading of level 1 to 6." ) }, { keyCombination: { modifier: "primaryShift", character: "SPACE" }, description: (0, import_i18n13.__)("Add non breaking space.") } ]; // packages/edit-widgets/build-module/components/keyboard-shortcut-help-modal/shortcut.mjs var import_element16 = __toESM(require_element(), 1); var import_keycodes4 = __toESM(require_keycodes(), 1); var import_jsx_runtime33 = __toESM(require_jsx_runtime(), 1); function KeyCombination({ keyCombination, forceAriaLabel }) { const shortcut = keyCombination.modifier ? import_keycodes4.displayShortcutList[keyCombination.modifier]( keyCombination.character ) : keyCombination.character; const ariaLabel = keyCombination.modifier ? import_keycodes4.shortcutAriaLabel[keyCombination.modifier]( keyCombination.character ) : keyCombination.character; const shortcuts = Array.isArray(shortcut) ? shortcut : [shortcut]; return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( "kbd", { className: "edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination", "aria-label": forceAriaLabel || ariaLabel, children: shortcuts.map((character, index) => { if (character === "+") { return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_element16.Fragment, { children: character }, index); } return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( "kbd", { className: "edit-widgets-keyboard-shortcut-help-modal__shortcut-key", children: character }, index ); }) } ); } function Shortcut({ description, keyCombination, aliases = [], ariaLabel }) { return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_jsx_runtime33.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "edit-widgets-keyboard-shortcut-help-modal__shortcut-description", children: description }), /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "edit-widgets-keyboard-shortcut-help-modal__shortcut-term", children: [ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( KeyCombination, { keyCombination, forceAriaLabel: ariaLabel } ), aliases.map((alias, index) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( KeyCombination, { keyCombination: alias, forceAriaLabel: ariaLabel }, index )) ] }) ] }); } var shortcut_default = Shortcut; // packages/edit-widgets/build-module/components/keyboard-shortcut-help-modal/dynamic-shortcut.mjs var import_data20 = __toESM(require_data(), 1); var import_keyboard_shortcuts3 = __toESM(require_keyboard_shortcuts(), 1); var import_jsx_runtime34 = __toESM(require_jsx_runtime(), 1); function DynamicShortcut({ name: name2 }) { const { keyCombination, description, aliases } = (0, import_data20.useSelect)( (select) => { const { getShortcutKeyCombination, getShortcutDescription, getShortcutAliases } = select(import_keyboard_shortcuts3.store); return { keyCombination: getShortcutKeyCombination(name2), aliases: getShortcutAliases(name2), description: getShortcutDescription(name2) }; }, [name2] ); if (!keyCombination) { return null; } return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)( shortcut_default, { keyCombination, description, aliases } ); } var dynamic_shortcut_default = DynamicShortcut; // packages/edit-widgets/build-module/components/keyboard-shortcut-help-modal/index.mjs var import_jsx_runtime35 = __toESM(require_jsx_runtime(), 1); var ShortcutList = ({ shortcuts }) => ( /* * Disable reason: The `list` ARIA role is redundant but * Safari+VoiceOver won't announce the list otherwise. */ /* eslint-disable jsx-a11y/no-redundant-roles */ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( "ul", { className: "edit-widgets-keyboard-shortcut-help-modal__shortcut-list", role: "list", children: shortcuts.map((shortcut, index) => /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( "li", { className: "edit-widgets-keyboard-shortcut-help-modal__shortcut", children: typeof shortcut === "string" ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(dynamic_shortcut_default, { name: shortcut }) : /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(shortcut_default, { ...shortcut }) }, index )) } ) ); var ShortcutSection = ({ title, shortcuts, className }) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)( "section", { className: clsx_default( "edit-widgets-keyboard-shortcut-help-modal__section", className ), children: [ !!title && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("h2", { className: "edit-widgets-keyboard-shortcut-help-modal__section-title", children: title }), /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(ShortcutList, { shortcuts }) ] } ); var ShortcutCategorySection = ({ title, categoryName, additionalShortcuts = [] }) => { const categoryShortcuts = (0, import_data21.useSelect)( (select) => { return select(import_keyboard_shortcuts4.store).getCategoryShortcuts( categoryName ); }, [categoryName] ); return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( ShortcutSection, { title, shortcuts: categoryShortcuts.concat(additionalShortcuts) } ); }; function KeyboardShortcutHelpModal({ isModalActive: isModalActive2, toggleModal }) { (0, import_keyboard_shortcuts4.useShortcut)("core/edit-widgets/keyboard-shortcuts", toggleModal, { bindGlobal: true }); if (!isModalActive2) { return null; } return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)( import_components16.Modal, { className: "edit-widgets-keyboard-shortcut-help-modal", title: (0, import_i18n14.__)("Keyboard shortcuts"), onRequestClose: toggleModal, children: [ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( ShortcutSection, { className: "edit-widgets-keyboard-shortcut-help-modal__main-shortcuts", shortcuts: ["core/edit-widgets/keyboard-shortcuts"] } ), /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( ShortcutCategorySection, { title: (0, import_i18n14.__)("Global shortcuts"), categoryName: "global" } ), /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( ShortcutCategorySection, { title: (0, import_i18n14.__)("Selection shortcuts"), categoryName: "selection" } ), /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( ShortcutCategorySection, { title: (0, import_i18n14.__)("Block shortcuts"), categoryName: "block", additionalShortcuts: [ { keyCombination: { character: "/" }, description: (0, import_i18n14.__)( "Change the block type after adding a new paragraph." ), /* translators: The forward-slash character. e.g. '/'. */ ariaLabel: (0, import_i18n14.__)("Forward-slash") } ] } ), /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( ShortcutSection, { title: (0, import_i18n14.__)("Text formatting"), shortcuts: textFormattingShortcuts } ), /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( ShortcutCategorySection, { title: (0, import_i18n14.__)("List View shortcuts"), categoryName: "list-view" } ) ] } ); } // packages/edit-widgets/build-module/components/more-menu/tools-more-menu-group.mjs var import_components17 = __toESM(require_components(), 1); var import_jsx_runtime36 = __toESM(require_jsx_runtime(), 1); var { Fill: ToolsMoreMenuGroup, Slot: Slot4 } = (0, import_components17.createSlotFill)( "EditWidgetsToolsMoreMenuGroup" ); ToolsMoreMenuGroup.Slot = ({ fillProps }) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Slot4, { fillProps, children: (fills) => fills.length > 0 && fills }); var tools_more_menu_group_default = ToolsMoreMenuGroup; // packages/edit-widgets/build-module/components/more-menu/index.mjs var import_jsx_runtime37 = __toESM(require_jsx_runtime(), 1); function MoreMenu() { const [ isKeyboardShortcutsModalActive, setIsKeyboardShortcutsModalVisible ] = (0, import_element17.useState)(false); const toggleKeyboardShortcutsModal = () => setIsKeyboardShortcutsModalVisible(!isKeyboardShortcutsModalActive); (0, import_keyboard_shortcuts5.useShortcut)( "core/edit-widgets/keyboard-shortcuts", toggleKeyboardShortcutsModal ); const isLargeViewport = (0, import_compose7.useViewportMatch)("medium"); return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_jsx_runtime37.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( import_components18.DropdownMenu, { icon: more_vertical_default, label: (0, import_i18n15.__)("Options"), popoverProps: { placement: "bottom-end", className: "more-menu-dropdown__content" }, toggleProps: { tooltipPosition: "bottom", size: "compact" }, children: (onClose) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_jsx_runtime37.Fragment, { children: [ isLargeViewport && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_components18.MenuGroup, { label: (0, import_i18n15._x)("View", "noun"), children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( import_preferences5.PreferenceToggleMenuItem, { scope: "core/edit-widgets", name: "fixedToolbar", label: (0, import_i18n15.__)("Top toolbar"), info: (0, import_i18n15.__)( "Access all block and document tools in a single place" ), messageActivated: (0, import_i18n15.__)( "Top toolbar activated" ), messageDeactivated: (0, import_i18n15.__)( "Top toolbar deactivated" ) } ) }), /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_components18.MenuGroup, { label: (0, import_i18n15.__)("Tools"), children: [ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( import_components18.MenuItem, { onClick: () => { setIsKeyboardShortcutsModalVisible(true); }, shortcut: import_keycodes5.displayShortcut.access("h"), children: (0, import_i18n15.__)("Keyboard shortcuts") } ), /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( import_preferences5.PreferenceToggleMenuItem, { scope: "core/edit-widgets", name: "welcomeGuide", label: (0, import_i18n15.__)("Welcome Guide") } ), /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)( import_components18.MenuItem, { role: "menuitem", icon: external_default, href: (0, import_i18n15.__)( "https://wordpress.org/documentation/article/block-based-widgets-editor/" ), target: "_blank", rel: "noopener noreferrer", children: [ (0, import_i18n15.__)("Help"), /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_components18.VisuallyHidden, { as: "span", /* translators: accessibility text */ children: (0, import_i18n15.__)("(opens in a new tab)") }) ] } ), /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( tools_more_menu_group_default.Slot, { fillProps: { onClose } } ) ] }), /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_components18.MenuGroup, { label: (0, import_i18n15.__)("Preferences"), children: [ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( import_preferences5.PreferenceToggleMenuItem, { scope: "core/edit-widgets", name: "keepCaretInsideBlock", label: (0, import_i18n15.__)( "Contain text cursor inside block" ), info: (0, import_i18n15.__)( "Aids screen readers by stopping text caret from leaving blocks." ), messageActivated: (0, import_i18n15.__)( "Contain text cursor inside block activated" ), messageDeactivated: (0, import_i18n15.__)( "Contain text cursor inside block deactivated" ) } ), /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( import_preferences5.PreferenceToggleMenuItem, { scope: "core/edit-widgets", name: "themeStyles", info: (0, import_i18n15.__)( "Make the editor look like your theme." ), label: (0, import_i18n15.__)("Use theme styles") } ), isLargeViewport && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( import_preferences5.PreferenceToggleMenuItem, { scope: "core/edit-widgets", name: "showBlockBreadcrumbs", label: (0, import_i18n15.__)("Display block breadcrumbs"), info: (0, import_i18n15.__)( "Shows block breadcrumbs at the bottom of the editor." ), messageActivated: (0, import_i18n15.__)( "Display block breadcrumbs activated" ), messageDeactivated: (0, import_i18n15.__)( "Display block breadcrumbs deactivated" ) } ) ] }) ] }) } ), /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( KeyboardShortcutHelpModal, { isModalActive: isKeyboardShortcutsModalActive, toggleModal: toggleKeyboardShortcutsModal } ) ] }); } // packages/edit-widgets/build-module/components/header/index.mjs var import_jsx_runtime38 = __toESM(require_jsx_runtime(), 1); function Header() { const isLargeViewport = (0, import_compose8.useViewportMatch)("medium"); const blockToolbarRef = (0, import_element18.useRef)(); const { hasFixedToolbar } = (0, import_data22.useSelect)( (select) => ({ hasFixedToolbar: !!select(import_preferences6.store).get( "core/edit-widgets", "fixedToolbar" ) }), [] ); return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_jsx_runtime38.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: "edit-widgets-header", children: [ /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: "edit-widgets-header__navigable-toolbar-wrapper", children: [ isLargeViewport && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("h1", { className: "edit-widgets-header__title", children: (0, import_i18n16.__)("Widgets") }), !isLargeViewport && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( import_components19.VisuallyHidden, { as: "h1", className: "edit-widgets-header__title", children: (0, import_i18n16.__)("Widgets") } ), /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(document_tools_default, {}), hasFixedToolbar && isLargeViewport && /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_jsx_runtime38.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "selected-block-tools-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_block_editor12.BlockToolbar, { hideDragHandle: true }) }), /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( import_components19.Popover.Slot, { ref: blockToolbarRef, name: "block-toolbar" } ) ] }) ] }), /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: "edit-widgets-header__actions", children: [ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(pinned_items_default.Slot, { scope: "core/edit-widgets" }), /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(save_button_default, {}), /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(MoreMenu, {}) ] }) ] }) }); } var header_default = Header; // packages/edit-widgets/build-module/components/widget-areas-block-editor-content/index.mjs var import_block_editor13 = __toESM(require_block_editor(), 1); var import_compose9 = __toESM(require_compose(), 1); var import_data23 = __toESM(require_data(), 1); var import_element19 = __toESM(require_element(), 1); var import_preferences7 = __toESM(require_preferences(), 1); // packages/edit-widgets/build-module/components/notices/index.mjs var import_notices2 = __toESM(require_notices(), 1); var import_jsx_runtime39 = __toESM(require_jsx_runtime(), 1); function Notices() { return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_jsx_runtime39.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)( import_notices2.InlineNotices, { pinnedNoticesClassName: "edit-widgets-notices__pinned", dismissibleNoticesClassName: "edit-widgets-notices__dismissible" } ), /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_notices2.SnackbarNotices, { className: "edit-widgets-notices__snackbar" }) ] }); } var notices_default = Notices; // packages/edit-widgets/build-module/components/widget-areas-block-editor-content/index.mjs var import_jsx_runtime40 = __toESM(require_jsx_runtime(), 1); function WidgetAreasBlockEditorContent({ blockEditorSettings }) { const hasThemeStyles = (0, import_data23.useSelect)( (select) => !!select(import_preferences7.store).get( "core/edit-widgets", "themeStyles" ), [] ); const isLargeViewport = (0, import_compose9.useViewportMatch)("medium"); const styles = (0, import_element19.useMemo)(() => { return hasThemeStyles ? blockEditorSettings.styles : []; }, [blockEditorSettings, hasThemeStyles]); return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("div", { className: "edit-widgets-block-editor", children: [ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(notices_default, {}), !isLargeViewport && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_block_editor13.BlockToolbar, { hideDragHandle: true }), /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_block_editor13.BlockTools, { children: [ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(keyboard_shortcuts_default, {}), /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( import_block_editor13.__unstableEditorStyles, { styles, scope: ":where(.editor-styles-wrapper)" } ), /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_block_editor13.BlockSelectionClearer, { children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_block_editor13.WritingFlow, { children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_block_editor13.BlockList, { className: "edit-widgets-main-block-list" }) }) }) ] }) ] }); } // packages/edit-widgets/build-module/components/secondary-sidebar/index.mjs var import_data27 = __toESM(require_data(), 1); // packages/edit-widgets/build-module/components/secondary-sidebar/inserter-sidebar.mjs var import_block_editor15 = __toESM(require_block_editor(), 1); var import_compose10 = __toESM(require_compose(), 1); var import_element20 = __toESM(require_element(), 1); var import_data25 = __toESM(require_data(), 1); // packages/edit-widgets/build-module/hooks/use-widget-library-insertion-point.mjs var import_data24 = __toESM(require_data(), 1); var import_block_editor14 = __toESM(require_block_editor(), 1); var import_core_data11 = __toESM(require_core_data(), 1); var useWidgetLibraryInsertionPoint = () => { const firstRootId = (0, import_data24.useSelect)((select) => { const { getEntityRecord } = select(import_core_data11.store); const widgetAreasPost = getEntityRecord( KIND, POST_TYPE, buildWidgetAreasPostId() ); return widgetAreasPost?.blocks[0]?.clientId; }, []); return (0, import_data24.useSelect)( (select) => { const { getBlockRootClientId, getBlockSelectionEnd, getBlockOrder, getBlockIndex } = select(import_block_editor14.store); const insertionPoint = select(store2).__experimentalGetInsertionPoint(); if (insertionPoint.rootClientId) { return insertionPoint; } const clientId = getBlockSelectionEnd() || firstRootId; const rootClientId = getBlockRootClientId(clientId); if (clientId && rootClientId === "") { return { rootClientId: clientId, insertionIndex: getBlockOrder(clientId).length }; } return { rootClientId, insertionIndex: getBlockIndex(clientId) + 1 }; }, [firstRootId] ); }; var use_widget_library_insertion_point_default = useWidgetLibraryInsertionPoint; // packages/edit-widgets/build-module/components/secondary-sidebar/inserter-sidebar.mjs var import_jsx_runtime41 = __toESM(require_jsx_runtime(), 1); function InserterSidebar() { const isMobileViewport = (0, import_compose10.useViewportMatch)("medium", "<"); const { rootClientId, insertionIndex } = use_widget_library_insertion_point_default(); const { setIsInserterOpened: setIsInserterOpened2 } = (0, import_data25.useDispatch)(store2); const closeInserter = (0, import_element20.useCallback)(() => { return setIsInserterOpened2(false); }, [setIsInserterOpened2]); const libraryRef = (0, import_element20.useRef)(); return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "edit-widgets-layout__inserter-panel", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "edit-widgets-layout__inserter-panel-content", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)( import_block_editor15.__experimentalLibrary, { showInserterHelpPanel: true, shouldFocusBlock: isMobileViewport, rootClientId, __experimentalInsertionIndex: insertionIndex, ref: libraryRef, onClose: closeInserter } ) }) }); } // packages/edit-widgets/build-module/components/secondary-sidebar/list-view-sidebar.mjs var import_block_editor16 = __toESM(require_block_editor(), 1); var import_components20 = __toESM(require_components(), 1); var import_compose11 = __toESM(require_compose(), 1); var import_data26 = __toESM(require_data(), 1); var import_element21 = __toESM(require_element(), 1); var import_i18n17 = __toESM(require_i18n(), 1); var import_keycodes6 = __toESM(require_keycodes(), 1); var import_jsx_runtime42 = __toESM(require_jsx_runtime(), 1); function ListViewSidebar() { const { setIsListViewOpened: setIsListViewOpened2 } = (0, import_data26.useDispatch)(store2); const { getListViewToggleRef: getListViewToggleRef2 } = unlock((0, import_data26.useSelect)(store2)); const [dropZoneElement, setDropZoneElement] = (0, import_element21.useState)(null); const focusOnMountRef = (0, import_compose11.useFocusOnMount)("firstElement"); const closeListView = (0, import_element21.useCallback)(() => { setIsListViewOpened2(false); getListViewToggleRef2().current?.focus(); }, [getListViewToggleRef2, setIsListViewOpened2]); const closeOnEscape = (0, import_element21.useCallback)( (event) => { if (event.keyCode === import_keycodes6.ESCAPE && !event.defaultPrevented) { event.preventDefault(); closeListView(); } }, [closeListView] ); return ( // eslint-disable-next-line jsx-a11y/no-static-element-interactions /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)( "div", { className: "edit-widgets-editor__list-view-panel", onKeyDown: closeOnEscape, children: [ /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "edit-widgets-editor__list-view-panel-header", children: [ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("strong", { children: (0, import_i18n17.__)("List View") }), /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( import_components20.Button, { icon: close_small_default, label: (0, import_i18n17.__)("Close"), onClick: closeListView, size: "compact" } ) ] }), /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( "div", { className: "edit-widgets-editor__list-view-panel-content", ref: (0, import_compose11.useMergeRefs)([focusOnMountRef, setDropZoneElement]), children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_block_editor16.__experimentalListView, { dropZoneElement }) } ) ] } ) ); } // packages/edit-widgets/build-module/components/secondary-sidebar/index.mjs var import_jsx_runtime43 = __toESM(require_jsx_runtime(), 1); function SecondarySidebar() { const { isInserterOpen, isListViewOpen } = (0, import_data27.useSelect)((select) => { const { isInserterOpened: isInserterOpened2, isListViewOpened: isListViewOpened2 } = select(store2); return { isInserterOpen: isInserterOpened2(), isListViewOpen: isListViewOpened2() }; }, []); if (isInserterOpen) { return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(InserterSidebar, {}); } if (isListViewOpen) { return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(ListViewSidebar, {}); } return null; } // packages/edit-widgets/build-module/components/layout/interface.mjs var import_jsx_runtime44 = __toESM(require_jsx_runtime(), 1); var interfaceLabels = { /* translators: accessibility text for the widgets screen top bar landmark region. */ header: (0, import_i18n18.__)("Widgets top bar"), /* translators: accessibility text for the widgets screen content landmark region. */ body: (0, import_i18n18.__)("Widgets and blocks"), /* translators: accessibility text for the widgets screen settings landmark region. */ sidebar: (0, import_i18n18.__)("Widgets settings"), /* translators: accessibility text for the widgets screen footer landmark region. */ footer: (0, import_i18n18.__)("Widgets footer") }; function Interface({ blockEditorSettings }) { const isMobileViewport = (0, import_compose12.useViewportMatch)("medium", "<"); const isHugeViewport = (0, import_compose12.useViewportMatch)("huge", ">="); const { setIsInserterOpened: setIsInserterOpened2, setIsListViewOpened: setIsListViewOpened2, closeGeneralSidebar: closeGeneralSidebar2 } = (0, import_data28.useDispatch)(store2); const { hasBlockBreadCrumbsEnabled, hasSidebarEnabled, isInserterOpened: isInserterOpened2, isListViewOpened: isListViewOpened2 } = (0, import_data28.useSelect)( (select) => ({ hasSidebarEnabled: !!select( store ).getActiveComplementaryArea(store2.name), isInserterOpened: !!select(store2).isInserterOpened(), isListViewOpened: !!select(store2).isListViewOpened(), hasBlockBreadCrumbsEnabled: !!select(import_preferences8.store).get( "core/edit-widgets", "showBlockBreadcrumbs" ) }), [] ); (0, import_element22.useEffect)(() => { if (hasSidebarEnabled && !isHugeViewport) { setIsInserterOpened2(false); setIsListViewOpened2(false); } }, [hasSidebarEnabled, isHugeViewport]); (0, import_element22.useEffect)(() => { if ((isInserterOpened2 || isListViewOpened2) && !isHugeViewport) { closeGeneralSidebar2(); } }, [isInserterOpened2, isListViewOpened2, isHugeViewport]); const secondarySidebarLabel = isListViewOpened2 ? (0, import_i18n18.__)("List View") : (0, import_i18n18.__)("Block Library"); const hasSecondarySidebar = isListViewOpened2 || isInserterOpened2; return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)( interface_skeleton_default, { labels: { ...interfaceLabels, secondarySidebar: secondarySidebarLabel }, header: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(header_default, {}), secondarySidebar: hasSecondarySidebar && /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(SecondarySidebar, {}), sidebar: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(complementary_area_default.Slot, { scope: "core/edit-widgets" }), content: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_jsx_runtime44.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)( WidgetAreasBlockEditorContent, { blockEditorSettings } ) }), footer: hasBlockBreadCrumbsEnabled && !isMobileViewport && /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("div", { className: "edit-widgets-layout__footer", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_block_editor17.BlockBreadcrumb, { rootLabelText: (0, import_i18n18.__)("Widgets") }) }) } ); } var interface_default = Interface; // packages/edit-widgets/build-module/components/layout/unsaved-changes-warning.mjs var import_i18n19 = __toESM(require_i18n(), 1); var import_element23 = __toESM(require_element(), 1); var import_data29 = __toESM(require_data(), 1); function UnsavedChangesWarning() { const isDirty = (0, import_data29.useSelect)((select) => { const { getEditedWidgetAreas: getEditedWidgetAreas2 } = select(store2); const editedWidgetAreas = getEditedWidgetAreas2(); return editedWidgetAreas?.length > 0; }, []); (0, import_element23.useEffect)(() => { const warnIfUnsavedChanges = (event) => { if (isDirty) { event.returnValue = (0, import_i18n19.__)( "You have unsaved changes. If you proceed, they will be lost." ); return event.returnValue; } }; window.addEventListener("beforeunload", warnIfUnsavedChanges); return () => { window.removeEventListener("beforeunload", warnIfUnsavedChanges); }; }, [isDirty]); return null; } // packages/edit-widgets/build-module/components/welcome-guide/index.mjs var import_data30 = __toESM(require_data(), 1); var import_components21 = __toESM(require_components(), 1); var import_i18n20 = __toESM(require_i18n(), 1); var import_element24 = __toESM(require_element(), 1); var import_preferences9 = __toESM(require_preferences(), 1); var import_jsx_runtime45 = __toESM(require_jsx_runtime(), 1); function WelcomeGuide() { const isActive = (0, import_data30.useSelect)( (select) => !!select(import_preferences9.store).get( "core/edit-widgets", "welcomeGuide" ), [] ); const { toggle } = (0, import_data30.useDispatch)(import_preferences9.store); const widgetAreas = (0, import_data30.useSelect)( (select) => select(store2).getWidgetAreas({ per_page: -1 }), [] ); if (!isActive) { return null; } const isEntirelyBlockWidgets = widgetAreas?.every( (widgetArea) => widgetArea.id === "wp_inactive_widgets" || widgetArea.widgets.every( (widgetId) => widgetId.startsWith("block-") ) ); const numWidgetAreas = widgetAreas?.filter( (widgetArea) => widgetArea.id !== "wp_inactive_widgets" ).length ?? 0; return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( import_components21.Guide, { className: "edit-widgets-welcome-guide", contentLabel: (0, import_i18n20.__)("Welcome to block Widgets"), finishButtonText: (0, import_i18n20.__)("Get started"), onFinish: () => toggle("core/edit-widgets", "welcomeGuide"), pages: [ { image: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( WelcomeGuideImage, { nonAnimatedSrc: "https://s.w.org/images/block-editor/welcome-canvas.svg", animatedSrc: "https://s.w.org/images/block-editor/welcome-canvas.gif" } ), content: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_jsx_runtime45.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("h1", { className: "edit-widgets-welcome-guide__heading", children: (0, import_i18n20.__)("Welcome to block Widgets") }), isEntirelyBlockWidgets ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_jsx_runtime45.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "edit-widgets-welcome-guide__text", children: (0, import_i18n20.sprintf)( // Translators: %s: Number of block areas in the current theme. (0, import_i18n20._n)( "Your theme provides %s \u201Cblock\u201D area for you to add and edit content.\xA0Try adding a search bar, social icons, or other types of blocks here and see how they\u2019ll look on your site.", "Your theme provides %s different \u201Cblock\u201D areas for you to add and edit content.\xA0Try adding a search bar, social icons, or other types of blocks here and see how they\u2019ll look on your site.", numWidgetAreas ), numWidgetAreas ) }) }) : /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_jsx_runtime45.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "edit-widgets-welcome-guide__text", children: (0, import_i18n20.__)( "You can now add any block to your site\u2019s widget areas. Don\u2019t worry, all of your favorite widgets still work flawlessly." ) }), /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("p", { className: "edit-widgets-welcome-guide__text", children: [ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("strong", { children: (0, import_i18n20.__)( "Want to stick with the old widgets?" ) }), " ", /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( import_components21.ExternalLink, { href: (0, import_i18n20.__)( "https://wordpress.org/plugins/classic-widgets/" ), children: (0, import_i18n20.__)( "Get the Classic Widgets plugin." ) } ) ] }) ] }) ] }) }, { image: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( WelcomeGuideImage, { nonAnimatedSrc: "https://s.w.org/images/block-editor/welcome-editor.svg", animatedSrc: "https://s.w.org/images/block-editor/welcome-editor.gif" } ), content: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_jsx_runtime45.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("h1", { className: "edit-widgets-welcome-guide__heading", children: (0, import_i18n20.__)("Customize each block") }), /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "edit-widgets-welcome-guide__text", children: (0, import_i18n20.__)( "Each block comes with its own set of controls for changing things like color, width, and alignment. These will show and hide automatically when you have a block selected." ) }) ] }) }, { image: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( WelcomeGuideImage, { nonAnimatedSrc: "https://s.w.org/images/block-editor/welcome-library.svg", animatedSrc: "https://s.w.org/images/block-editor/welcome-library.gif" } ), content: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_jsx_runtime45.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("h1", { className: "edit-widgets-welcome-guide__heading", children: (0, import_i18n20.__)("Explore all blocks") }), /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "edit-widgets-welcome-guide__text", children: (0, import_element24.createInterpolateElement)( (0, import_i18n20.__)( "All of the blocks available to you live in the block library. You\u2019ll find it wherever you see the icon." ), { InserterIconImage: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( "img", { className: "edit-widgets-welcome-guide__inserter-icon", alt: (0, import_i18n20.__)("inserter"), src: "data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='18' height='18' rx='2' fill='%231E1E1E'/%3E%3Cpath d='M9.22727 4V14M4 8.77273H14' stroke='white' stroke-width='1.5'/%3E%3C/svg%3E%0A" } ) } ) }) ] }) }, { image: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( WelcomeGuideImage, { nonAnimatedSrc: "https://s.w.org/images/block-editor/welcome-documentation.svg", animatedSrc: "https://s.w.org/images/block-editor/welcome-documentation.gif" } ), content: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_jsx_runtime45.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("h1", { className: "edit-widgets-welcome-guide__heading", children: (0, import_i18n20.__)("Learn more") }), /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "edit-widgets-welcome-guide__text", children: (0, import_element24.createInterpolateElement)( (0, import_i18n20.__)( "New to the block editor? Want to learn more about using it? Here's a detailed guide." ), { a: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( import_components21.ExternalLink, { href: (0, import_i18n20.__)( "https://wordpress.org/documentation/article/wordpress-block-editor/" ) } ) } ) }) ] }) } ] } ); } function WelcomeGuideImage({ nonAnimatedSrc, animatedSrc }) { return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("picture", { className: "edit-widgets-welcome-guide__image", children: [ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( "source", { srcSet: nonAnimatedSrc, media: "(prefers-reduced-motion: reduce)" } ), /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("img", { src: animatedSrc, width: "312", height: "240", alt: "" }) ] }); } // packages/edit-widgets/build-module/components/layout/index.mjs var import_jsx_runtime46 = __toESM(require_jsx_runtime(), 1); function Layout({ blockEditorSettings }) { const { createErrorNotice } = (0, import_data31.useDispatch)(import_notices4.store); function onPluginAreaError(name2) { createErrorNotice( (0, import_i18n21.sprintf)( /* translators: %s: plugin name */ (0, import_i18n21.__)( 'The "%s" plugin has encountered an error and cannot be rendered.' ), name2 ) ); } const navigateRegionsProps = (0, import_components22.__unstableUseNavigateRegions)(); return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(ErrorBoundary, { children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)( "div", { className: navigateRegionsProps.className, ...navigateRegionsProps, ref: navigateRegionsProps.ref, children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)( WidgetAreasBlockEditorProvider, { blockEditorSettings, children: [ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(interface_default, { blockEditorSettings }), /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Sidebar, {}), /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_plugins3.PluginArea, { onError: onPluginAreaError }), /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(UnsavedChangesWarning, {}), /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(WelcomeGuide, {}) ] } ) } ) }); } var layout_default = Layout; // packages/edit-widgets/build-module/index.mjs var import_jsx_runtime47 = __toESM(require_jsx_runtime(), 1); var disabledBlocks = [ "core/more", "core/freeform", "core/template-part", ...ALLOW_REUSABLE_BLOCKS ? [] : ["core/block"] ]; function initializeEditor(id, settings2) { const target = document.getElementById(id); const root = (0, import_element25.createRoot)(target); const coreBlocks = (0, import_block_library2.__experimentalGetCoreBlocks)().filter((block) => { return !(disabledBlocks.includes(block.name) || block.name.startsWith("core/post") || block.name.startsWith("core/query") || block.name.startsWith("core/site") || block.name.startsWith("core/navigation") || block.name.startsWith("core/term")); }); (0, import_data32.dispatch)(import_preferences10.store).setDefaults("core/edit-widgets", { fixedToolbar: false, welcomeGuide: true, showBlockBreadcrumbs: true, themeStyles: true }); (0, import_data32.dispatch)(import_blocks3.store).reapplyBlockTypeFilters(); (0, import_block_library2.registerCoreBlocks)(coreBlocks); (0, import_widgets5.registerLegacyWidgetBlock)(); if (false) { (0, import_block_library2.__experimentalRegisterExperimentalCoreBlocks)({ enableFSEBlocks: ENABLE_EXPERIMENTAL_FSE_BLOCKS }); } (0, import_widgets5.registerLegacyWidgetVariations)(settings2); registerBlock(widget_area_exports); (0, import_widgets5.registerWidgetGroupBlock)(); settings2.__experimentalFetchLinkSuggestions = (search, searchOptions) => (0, import_core_data12.__experimentalFetchLinkSuggestions)(search, searchOptions, settings2); (0, import_blocks3.setFreeformContentHandlerName)("core/html"); root.render( /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_element25.StrictMode, { children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(layout_default, { blockEditorSettings: settings2 }) }) ); return root; } var initialize = initializeEditor; function reinitializeEditor() { (0, import_deprecated6.default)("wp.editWidgets.reinitializeEditor", { since: "6.2", version: "6.3" }); } var registerBlock = (block) => { if (!block) { return; } const { metadata, settings: settings2, name: name2 } = block; if (metadata) { (0, import_blocks3.unstable__bootstrapServerSideBlockDefinitions)({ [name2]: metadata }); } (0, import_blocks3.registerBlockType)(name2, settings2); }; return __toCommonJS(index_exports); })(); core-commands.js000064400000071267152214270310007643 0ustar00var wp; (wp ||= {}).coreCommands = (() => { var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // package-external:@wordpress/element var require_element = __commonJS({ "package-external:@wordpress/element"(exports, module) { module.exports = window.wp.element; } }); // package-external:@wordpress/router var require_router = __commonJS({ "package-external:@wordpress/router"(exports, module) { module.exports = window.wp.router; } }); // package-external:@wordpress/commands var require_commands = __commonJS({ "package-external:@wordpress/commands"(exports, module) { module.exports = window.wp.commands; } }); // package-external:@wordpress/i18n var require_i18n = __commonJS({ "package-external:@wordpress/i18n"(exports, module) { module.exports = window.wp.i18n; } }); // package-external:@wordpress/primitives var require_primitives = __commonJS({ "package-external:@wordpress/primitives"(exports, module) { module.exports = window.wp.primitives; } }); // vendor-external:react/jsx-runtime var require_jsx_runtime = __commonJS({ "vendor-external:react/jsx-runtime"(exports, module) { module.exports = window.ReactJSXRuntime; } }); // package-external:@wordpress/core-data var require_core_data = __commonJS({ "package-external:@wordpress/core-data"(exports, module) { module.exports = window.wp.coreData; } }); // package-external:@wordpress/data var require_data = __commonJS({ "package-external:@wordpress/data"(exports, module) { module.exports = window.wp.data; } }); // package-external:@wordpress/url var require_url = __commonJS({ "package-external:@wordpress/url"(exports, module) { module.exports = window.wp.url; } }); // package-external:@wordpress/compose var require_compose = __commonJS({ "package-external:@wordpress/compose"(exports, module) { module.exports = window.wp.compose; } }); // package-external:@wordpress/html-entities var require_html_entities = __commonJS({ "package-external:@wordpress/html-entities"(exports, module) { module.exports = window.wp.htmlEntities; } }); // package-external:@wordpress/private-apis var require_private_apis = __commonJS({ "package-external:@wordpress/private-apis"(exports, module) { module.exports = window.wp.privateApis; } }); // packages/core-commands/build-module/index.mjs var index_exports = {}; __export(index_exports, { initializeCommandPalette: () => initializeCommandPalette, privateApis: () => privateApis }); var import_element3 = __toESM(require_element(), 1); var import_router2 = __toESM(require_router(), 1); var import_commands3 = __toESM(require_commands(), 1); // packages/core-commands/build-module/admin-navigation-commands.mjs var import_commands = __toESM(require_commands(), 1); var import_i18n = __toESM(require_i18n(), 1); // packages/icons/build-module/library/brush.mjs var import_primitives = __toESM(require_primitives(), 1); var import_jsx_runtime = __toESM(require_jsx_runtime(), 1); var brush_default = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_primitives.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_primitives.Path, { d: "M4 20h8v-1.5H4V20zM18.9 3.5c-.6-.6-1.5-.6-2.1 0l-7.2 7.2c-.4-.1-.7 0-1.1.1-.5.2-1.5.7-1.9 2.2-.4 1.7-.8 2.2-1.1 2.7-.1.1-.2.3-.3.4l-.6 1.1H6c2 0 3.4-.4 4.7-1.4.8-.6 1.2-1.4 1.3-2.3 0-.3 0-.5-.1-.7L19 5.7c.5-.6.5-1.6-.1-2.2zM9.7 14.7c-.7.5-1.5.8-2.4 1 .2-.5.5-1.2.8-2.3.2-.6.4-1 .8-1.1.5-.1 1 .1 1.3.3.2.2.3.5.2.8 0 .3-.1.9-.7 1.3z" }) }); // packages/icons/build-module/library/external.mjs var import_primitives2 = __toESM(require_primitives(), 1); var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1); var external_default = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_primitives2.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_primitives2.Path, { d: "M19.5 4.5h-7V6h4.44l-5.97 5.97 1.06 1.06L18 7.06v4.44h1.5v-7Zm-13 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-3H17v3a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h3V5.5h-3Z" }) }); // packages/icons/build-module/library/layout.mjs var import_primitives3 = __toESM(require_primitives(), 1); var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1); var layout_default = /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_primitives3.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_primitives3.Path, { d: "M18 5.5H6a.5.5 0 00-.5.5v3h13V6a.5.5 0 00-.5-.5zm.5 5H10v8h8a.5.5 0 00.5-.5v-7.5zm-10 0h-3V18a.5.5 0 00.5.5h2.5v-8zM6 4h12a2 2 0 012 2v12a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2z" }) }); // packages/icons/build-module/library/navigation.mjs var import_primitives4 = __toESM(require_primitives(), 1); var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1); var navigation_default = /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_primitives4.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_primitives4.Path, { d: "M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm0 14.5c-3.6 0-6.5-2.9-6.5-6.5S8.4 5.5 12 5.5s6.5 2.9 6.5 6.5-2.9 6.5-6.5 6.5zM9 16l4.5-3L15 8.4l-4.5 3L9 16z" }) }); // packages/icons/build-module/library/page.mjs var import_primitives5 = __toESM(require_primitives(), 1); var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1); var page_default = /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_primitives5.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: [ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_primitives5.Path, { d: "M15.5 7.5h-7V9h7V7.5Zm-7 3.5h7v1.5h-7V11Zm7 3.5h-7V16h7v-1.5Z" }), /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_primitives5.Path, { d: "M17 4H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2ZM7 5.5h10a.5.5 0 0 1 .5.5v12a.5.5 0 0 1-.5.5H7a.5.5 0 0 1-.5-.5V6a.5.5 0 0 1 .5-.5Z" }) ] }); // packages/icons/build-module/library/post.mjs var import_primitives6 = __toESM(require_primitives(), 1); var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1); var post_default = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_primitives6.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_primitives6.Path, { d: "m7.3 9.7 1.4 1.4c.2-.2.3-.3.4-.5 0 0 0-.1.1-.1.3-.5.4-1.1.3-1.6L12 7 9 4 7.2 6.5c-.6-.1-1.1 0-1.6.3 0 0-.1 0-.1.1-.3.1-.4.2-.6.4l1.4 1.4L4 11v1h1l2.3-2.3zM4 20h9v-1.5H4V20zm0-5.5V16h16v-1.5H4z" }) }); // packages/icons/build-module/library/styles.mjs var import_primitives7 = __toESM(require_primitives(), 1); var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1); var styles_default = /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_primitives7.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_primitives7.Path, { fillRule: "evenodd", clipRule: "evenodd", d: "M20 12a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-1.5 0a6.5 6.5 0 0 1-6.5 6.5v-13a6.5 6.5 0 0 1 6.5 6.5Z" }) }); // packages/icons/build-module/library/symbol-filled.mjs var import_primitives8 = __toESM(require_primitives(), 1); var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1); var symbol_filled_default = /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_primitives8.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_primitives8.Path, { d: "M21.3 10.8l-5.6-5.6c-.7-.7-1.8-.7-2.5 0l-5.6 5.6c-.7.7-.7 1.8 0 2.5l5.6 5.6c.3.3.8.5 1.2.5s.9-.2 1.2-.5l5.6-5.6c.8-.7.8-1.9.1-2.5zm-17.6 1L10 5.5l-1-1-6.3 6.3c-.7.7-.7 1.8 0 2.5L9 19.5l1.1-1.1-6.3-6.3c-.2 0-.2-.2-.1-.3z" }) }); // packages/icons/build-module/library/symbol.mjs var import_primitives9 = __toESM(require_primitives(), 1); var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1); var symbol_default = /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_primitives9.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_primitives9.Path, { d: "M21.3 10.8l-5.6-5.6c-.7-.7-1.8-.7-2.5 0l-5.6 5.6c-.7.7-.7 1.8 0 2.5l5.6 5.6c.3.3.8.5 1.2.5s.9-.2 1.2-.5l5.6-5.6c.8-.7.8-1.9.1-2.5zm-1 1.4l-5.6 5.6c-.1.1-.3.1-.4 0l-5.6-5.6c-.1-.1-.1-.3 0-.4l5.6-5.6s.1-.1.2-.1.1 0 .2.1l5.6 5.6c.1.1.1.3 0 .4zm-16.6-.4L10 5.5l-1-1-6.3 6.3c-.7.7-.7 1.8 0 2.5L9 19.5l1.1-1.1-6.3-6.3c-.2 0-.2-.2-.1-.3z" }) }); // packages/core-commands/build-module/admin-navigation-commands.mjs var import_element = __toESM(require_element(), 1); var import_core_data = __toESM(require_core_data(), 1); var import_data = __toESM(require_data(), 1); var getViewSiteCommand = () => function useViewSiteCommand() { const homeUrl = (0, import_data.useSelect)((select) => { return select(import_core_data.store).getEntityRecord( "root", "__unstableBase" )?.home; }, []); const commands = (0, import_element.useMemo)(() => { if (!homeUrl) { return []; } return [ { name: "core/view-site", label: (0, import_i18n.__)("View site"), icon: external_default, category: "view", callback: ({ close }) => { close(); window.open(homeUrl, "_blank"); } } ]; }, [homeUrl]); return { isLoading: false, commands }; }; function useAdminNavigationCommands(menuCommands) { const commands = (0, import_element.useMemo)(() => { return (menuCommands ?? []).map((menuCommand) => { const label = (0, import_i18n.sprintf)( /* translators: %s: menu label */ (0, import_i18n.__)("Go to: %s"), menuCommand.label ); return { name: menuCommand.name, label, searchLabel: label, category: "view", callback: ({ close }) => { document.location = menuCommand.url; close(); } }; }); }, [menuCommands]); (0, import_commands.useCommands)(commands); (0, import_commands.useCommandLoader)({ name: "core/view-site", hook: getViewSiteCommand() }); } // packages/core-commands/build-module/site-editor-navigation-commands.mjs var import_commands2 = __toESM(require_commands(), 1); var import_i18n2 = __toESM(require_i18n(), 1); var import_element2 = __toESM(require_element(), 1); var import_data2 = __toESM(require_data(), 1); var import_core_data2 = __toESM(require_core_data(), 1); var import_router = __toESM(require_router(), 1); var import_url = __toESM(require_url(), 1); var import_compose = __toESM(require_compose(), 1); var import_html_entities = __toESM(require_html_entities(), 1); // packages/core-commands/build-module/lock-unlock.mjs var import_private_apis = __toESM(require_private_apis(), 1); var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)( "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.", "@wordpress/core-commands" ); // packages/core-commands/build-module/utils/order-entity-records-by-search.mjs function orderEntityRecordsBySearch(records = [], search = "") { if (!Array.isArray(records) || !records.length) { return []; } if (!search) { return records; } const priority = []; const nonPriority = []; for (let i = 0; i < records.length; i++) { const record = records[i]; if (record?.title?.raw?.toLowerCase()?.includes(search?.toLowerCase())) { priority.push(record); } else { nonPriority.push(record); } } return priority.concat(nonPriority); } // packages/core-commands/build-module/site-editor-navigation-commands.mjs var { useHistory } = unlock(import_router.privateApis); var icons = { post: post_default, page: page_default, wp_template: layout_default, wp_template_part: symbol_filled_default }; function useDebouncedValue(value) { const [debouncedValue, setDebouncedValue] = (0, import_element2.useState)(""); const debounced = (0, import_compose.useDebounce)(setDebouncedValue, 250); (0, import_element2.useEffect)(() => { debounced(value); return () => debounced.cancel(); }, [debounced, value]); return debouncedValue; } var ROUTE_MAPPING = { "/template": "/templates", "/pattern": "/patterns" }; function getSiteEditorPage() { return window.__experimentalExtensibleSiteEditor ? "admin.php?page=site-editor-v2" : "site-editor.php"; } function mapRoute(path) { if (!window.__experimentalExtensibleSiteEditor) { return path; } for (const [oldPath, newPath] of Object.entries(ROUTE_MAPPING)) { if (path === oldPath || path.startsWith(oldPath + "?")) { if (path.includes("postType=wp_template_part")) { return "/template-parts"; } return path.replace(oldPath, newPath); } } return path; } function isInSiteEditor() { const path = (0, import_url.getPath)(window.location.href); return path?.includes("site-editor.php") || path?.includes("page=site-editor-v2"); } var getNavigationCommandLoaderPerPostType = (postType) => function useNavigationCommandLoader({ search }) { const history = useHistory(); const { isBlockBasedTheme, canCreateTemplate } = (0, import_data2.useSelect)( (select) => { return { isBlockBasedTheme: select(import_core_data2.store).getCurrentTheme()?.is_block_theme, canCreateTemplate: select(import_core_data2.store).canUser("create", { kind: "postType", name: "wp_template" }) }; }, [] ); const delayedSearch = useDebouncedValue(search); const { records, isLoading } = (0, import_data2.useSelect)( (select) => { if (!delayedSearch) { return { isLoading: false }; } const query = { search: delayedSearch, per_page: 10, orderby: "relevance", status: [ "publish", "future", "draft", "pending", "private" ] }; return { records: select(import_core_data2.store).getEntityRecords( "postType", postType, query ), isLoading: !select(import_core_data2.store).hasFinishedResolution( "getEntityRecords", ["postType", postType, query] ) }; }, [delayedSearch] ); const commands = (0, import_element2.useMemo)(() => { return (records ?? []).map((record) => { const command = { name: postType + "-" + record.id, searchLabel: record.title?.rendered + " " + record.id, label: record.title?.rendered ? (0, import_html_entities.decodeEntities)(record.title?.rendered) : (0, import_i18n2.__)("(no title)"), icon: icons[postType], category: "edit" }; if (!canCreateTemplate || postType === "post" || postType === "page" && !isBlockBasedTheme) { return { ...command, callback: ({ close }) => { const args = { post: record.id, action: "edit" }; const targetUrl = (0, import_url.addQueryArgs)("post.php", args); document.location = targetUrl; close(); } }; } const isSiteEditor = isInSiteEditor(); return { ...command, callback: ({ close }) => { if (isSiteEditor) { history.navigate( `/${postType}/${record.id}?canvas=edit` ); } else { document.location = (0, import_url.addQueryArgs)( getSiteEditorPage(), { p: `/${postType}/${record.id}`, canvas: "edit" } ); } close(); } }; }); }, [canCreateTemplate, records, isBlockBasedTheme, history]); return { commands, isLoading }; }; var getNavigationCommandLoaderPerTemplate = (templateType) => function useNavigationCommandLoader({ search }) { const history = useHistory(); const { isBlockBasedTheme, canCreateTemplate } = (0, import_data2.useSelect)( (select) => { return { isBlockBasedTheme: select(import_core_data2.store).getCurrentTheme()?.is_block_theme, canCreateTemplate: select(import_core_data2.store).canUser("create", { kind: "postType", name: templateType }) }; }, [] ); const { records, isLoading } = (0, import_data2.useSelect)((select) => { const { getEntityRecords } = select(import_core_data2.store); const query = { per_page: -1 }; return { records: getEntityRecords("postType", templateType, query), isLoading: !select(import_core_data2.store).hasFinishedResolution( "getEntityRecords", ["postType", templateType, query] ) }; }, []); const orderedRecords = (0, import_element2.useMemo)(() => { return orderEntityRecordsBySearch(records, search).slice(0, 10); }, [records, search]); const commands = (0, import_element2.useMemo)(() => { if (!canCreateTemplate || !isBlockBasedTheme && !templateType === "wp_template_part") { return []; } const isSiteEditor = (0, import_url.getPath)(window.location.href)?.includes( "site-editor.php" ); const result = []; result.push( ...orderedRecords.map((record) => { return { name: templateType + "-" + record.id, searchLabel: record.title?.rendered + " " + record.id, label: record.title?.rendered ? record.title?.rendered : (0, import_i18n2.__)("(no title)"), icon: icons[templateType], category: "edit", callback: ({ close }) => { if (isSiteEditor) { history.navigate( `/${templateType}/${record.id}?canvas=edit` ); } else { document.location = (0, import_url.addQueryArgs)( getSiteEditorPage(), { p: `/${templateType}/${record.id}`, canvas: "edit" } ); } close(); } }; }) ); if (orderedRecords?.length > 0 && templateType === "wp_template_part") { result.push({ name: "core/edit-site/open-template-parts", label: (0, import_i18n2.__)("Go to: Template parts"), icon: symbol_filled_default, category: "view", callback: ({ close }) => { if (isSiteEditor) { history.navigate( mapRoute( "/pattern?postType=wp_template_part&categoryId=all-parts" ) ); } else { document.location = (0, import_url.addQueryArgs)( getSiteEditorPage(), { p: mapRoute("/pattern"), postType: "wp_template_part", categoryId: "all-parts" } ); } close(); } }); } return result; }, [canCreateTemplate, isBlockBasedTheme, orderedRecords, history]); return { commands, isLoading }; }; var getSiteEditorBasicNavigationCommands = () => function useSiteEditorBasicNavigationCommands() { const history = useHistory(); const isSiteEditor = isInSiteEditor(); const { isBlockBasedTheme, canCreateTemplate, canCreatePatterns } = (0, import_data2.useSelect)((select) => { return { isBlockBasedTheme: select(import_core_data2.store).getCurrentTheme()?.is_block_theme, canCreateTemplate: select(import_core_data2.store).canUser("create", { kind: "postType", name: "wp_template" }), canCreatePatterns: select(import_core_data2.store).canUser("create", { kind: "postType", name: "wp_block" }) }; }, []); const commands = (0, import_element2.useMemo)(() => { const result = []; if (canCreateTemplate && isBlockBasedTheme) { result.push({ name: "core/edit-site/open-styles", label: (0, import_i18n2.__)("Go to: Styles"), icon: styles_default, category: "view", callback: ({ close }) => { if (isSiteEditor) { history.navigate("/styles"); } else { document.location = (0, import_url.addQueryArgs)( getSiteEditorPage(), { p: "/styles" } ); } close(); } }); result.push({ name: "core/edit-site/open-navigation", label: (0, import_i18n2.__)("Go to: Navigation"), icon: navigation_default, category: "view", callback: ({ close }) => { if (isSiteEditor) { history.navigate("/navigation"); } else { document.location = (0, import_url.addQueryArgs)( getSiteEditorPage(), { p: "/navigation" } ); } close(); } }); result.push({ name: "core/edit-site/open-templates", label: (0, import_i18n2.__)("Go to: Templates"), icon: layout_default, category: "view", callback: ({ close }) => { if (isSiteEditor) { history.navigate(mapRoute("/template")); } else { document.location = (0, import_url.addQueryArgs)( getSiteEditorPage(), { p: mapRoute("/template") } ); } close(); } }); } if (canCreatePatterns) { result.push({ name: "core/edit-site/open-patterns", label: (0, import_i18n2.__)("Go to: Patterns"), icon: symbol_default, category: "view", callback: ({ close }) => { if (canCreateTemplate) { if (isSiteEditor) { history.navigate(mapRoute("/pattern")); } else { document.location = (0, import_url.addQueryArgs)( getSiteEditorPage(), { p: mapRoute("/pattern") } ); } close(); } else { document.location.href = "edit.php?post_type=wp_block"; } } }); } return result; }, [ history, isSiteEditor, canCreateTemplate, canCreatePatterns, isBlockBasedTheme ]); return { commands, isLoading: false }; }; var getGlobalStylesOpenCssCommands = () => function useGlobalStylesOpenCssCommands() { const history = useHistory(); const isSiteEditor = isInSiteEditor(); const { canEditCSS } = (0, import_data2.useSelect)((select) => { const { getEntityRecord, __experimentalGetCurrentGlobalStylesId } = select(import_core_data2.store); const globalStylesId = __experimentalGetCurrentGlobalStylesId(); const globalStyles = globalStylesId ? getEntityRecord("root", "globalStyles", globalStylesId) : void 0; return { canEditCSS: !!globalStyles?._links?.["wp:action-edit-css"] }; }, []); const commands = (0, import_element2.useMemo)(() => { if (!canEditCSS) { return []; } return [ { name: "core/open-styles-css", label: (0, import_i18n2.__)("Open custom CSS"), icon: brush_default, category: "view", callback: ({ close }) => { close(); if (isSiteEditor) { history.navigate("/styles?section=/css"); } else { document.location = (0, import_url.addQueryArgs)( getSiteEditorPage(), { p: "/styles", section: "/css" } ); } } } ]; }, [history, canEditCSS, isSiteEditor]); return { isLoading: false, commands }; }; function useSiteEditorNavigationCommands(isNetworkAdmin) { (0, import_commands2.useCommandLoader)({ name: "core/edit-site/navigate-pages", hook: getNavigationCommandLoaderPerPostType("page"), disabled: isNetworkAdmin }); (0, import_commands2.useCommandLoader)({ name: "core/edit-site/navigate-posts", hook: getNavigationCommandLoaderPerPostType("post"), disabled: isNetworkAdmin }); (0, import_commands2.useCommandLoader)({ name: "core/edit-site/navigate-templates", hook: getNavigationCommandLoaderPerTemplate("wp_template"), disabled: isNetworkAdmin }); (0, import_commands2.useCommandLoader)({ name: "core/edit-site/navigate-template-parts", hook: getNavigationCommandLoaderPerTemplate("wp_template_part"), disabled: isNetworkAdmin }); (0, import_commands2.useCommandLoader)({ name: "core/edit-site/basic-navigation", hook: getSiteEditorBasicNavigationCommands(), context: "site-editor", disabled: isNetworkAdmin }); (0, import_commands2.useCommandLoader)({ name: "core/edit-site/global-styles-css", hook: getGlobalStylesOpenCssCommands(), disabled: isNetworkAdmin }); } // packages/core-commands/build-module/private-apis.mjs function useCommands2() { useAdminNavigationCommands(); useSiteEditorNavigationCommands(); } var privateApis = {}; lock(privateApis, { useCommands: useCommands2 }); // packages/core-commands/build-module/index.mjs var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1); var { RouterProvider } = unlock(import_router2.privateApis); function CommandPalette({ settings }) { const { menu_commands: menuCommands, is_network_admin: isNetworkAdmin } = settings; useAdminNavigationCommands(menuCommands); useSiteEditorNavigationCommands(isNetworkAdmin); return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RouterProvider, { pathArg: "p", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_commands3.CommandMenu, {}) }); } function initializeCommandPalette(settings) { const root = document.createElement("div"); document.body.appendChild(root); (0, import_element3.createRoot)(root).render( /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_element3.StrictMode, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CommandPalette, { settings }) }) ); } return __toCommonJS(index_exports); })(); keyboard-shortcuts.js000064400000023271152214270310010740 0ustar00var wp; (wp ||= {}).keyboardShortcuts = (() => { var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // package-external:@wordpress/data var require_data = __commonJS({ "package-external:@wordpress/data"(exports, module) { module.exports = window.wp.data; } }); // package-external:@wordpress/keycodes var require_keycodes = __commonJS({ "package-external:@wordpress/keycodes"(exports, module) { module.exports = window.wp.keycodes; } }); // package-external:@wordpress/element var require_element = __commonJS({ "package-external:@wordpress/element"(exports, module) { module.exports = window.wp.element; } }); // vendor-external:react/jsx-runtime var require_jsx_runtime = __commonJS({ "vendor-external:react/jsx-runtime"(exports, module) { module.exports = window.ReactJSXRuntime; } }); // packages/keyboard-shortcuts/build-module/index.mjs var index_exports = {}; __export(index_exports, { ShortcutProvider: () => ShortcutProvider, __unstableUseShortcutEventMatch: () => useShortcutEventMatch, store: () => store, useShortcut: () => useShortcut }); // packages/keyboard-shortcuts/build-module/store/index.mjs var import_data2 = __toESM(require_data(), 1); // packages/keyboard-shortcuts/build-module/store/reducer.mjs function reducer(state = {}, action) { switch (action.type) { case "REGISTER_SHORTCUT": return { ...state, [action.name]: { category: action.category, keyCombination: action.keyCombination, aliases: action.aliases, description: action.description } }; case "UNREGISTER_SHORTCUT": const { [action.name]: actionName, ...remainingState } = state; return remainingState; } return state; } var reducer_default = reducer; // packages/keyboard-shortcuts/build-module/store/actions.mjs var actions_exports = {}; __export(actions_exports, { registerShortcut: () => registerShortcut, unregisterShortcut: () => unregisterShortcut }); function registerShortcut({ name, category, description, keyCombination, aliases }) { return { type: "REGISTER_SHORTCUT", name, category, keyCombination, aliases, description }; } function unregisterShortcut(name) { return { type: "UNREGISTER_SHORTCUT", name }; } // packages/keyboard-shortcuts/build-module/store/selectors.mjs var selectors_exports = {}; __export(selectors_exports, { getAllShortcutKeyCombinations: () => getAllShortcutKeyCombinations, getAllShortcutRawKeyCombinations: () => getAllShortcutRawKeyCombinations, getCategoryShortcuts: () => getCategoryShortcuts, getShortcutAliases: () => getShortcutAliases, getShortcutDescription: () => getShortcutDescription, getShortcutKeyCombination: () => getShortcutKeyCombination, getShortcutRepresentation: () => getShortcutRepresentation }); var import_data = __toESM(require_data(), 1); var import_keycodes = __toESM(require_keycodes(), 1); var EMPTY_ARRAY = []; var FORMATTING_METHODS = { display: import_keycodes.displayShortcut, raw: import_keycodes.rawShortcut, ariaLabel: import_keycodes.shortcutAriaLabel }; function getKeyCombinationRepresentation(shortcut, representation) { if (!shortcut) { return null; } return shortcut.modifier ? FORMATTING_METHODS[representation][shortcut.modifier]( shortcut.character ) : shortcut.character; } function getShortcutKeyCombination(state, name) { return state[name] ? state[name].keyCombination : null; } function getShortcutRepresentation(state, name, representation = "display") { const shortcut = getShortcutKeyCombination(state, name); return getKeyCombinationRepresentation(shortcut, representation); } function getShortcutDescription(state, name) { return state[name] ? state[name].description : null; } function getShortcutAliases(state, name) { return state[name] && state[name].aliases ? state[name].aliases : EMPTY_ARRAY; } var getAllShortcutKeyCombinations = (0, import_data.createSelector)( (state, name) => { return [ getShortcutKeyCombination(state, name), ...getShortcutAliases(state, name) ].filter(Boolean); }, (state, name) => [state[name]] ); var getAllShortcutRawKeyCombinations = (0, import_data.createSelector)( (state, name) => { return getAllShortcutKeyCombinations(state, name).map( (combination) => getKeyCombinationRepresentation(combination, "raw") ); }, (state, name) => [state[name]] ); var getCategoryShortcuts = (0, import_data.createSelector)( (state, categoryName) => { return Object.entries(state).filter(([, shortcut]) => shortcut.category === categoryName).map(([name]) => name); }, (state) => [state] ); // packages/keyboard-shortcuts/build-module/store/index.mjs var STORE_NAME = "core/keyboard-shortcuts"; var store = (0, import_data2.createReduxStore)(STORE_NAME, { reducer: reducer_default, actions: actions_exports, selectors: selectors_exports }); (0, import_data2.register)(store); // packages/keyboard-shortcuts/build-module/hooks/use-shortcut.mjs var import_element2 = __toESM(require_element(), 1); // packages/keyboard-shortcuts/build-module/hooks/use-shortcut-event-match.mjs var import_data3 = __toESM(require_data(), 1); var import_keycodes2 = __toESM(require_keycodes(), 1); function useShortcutEventMatch() { const { getAllShortcutKeyCombinations: getAllShortcutKeyCombinations2 } = (0, import_data3.useSelect)( store ); function isMatch(name, event) { return getAllShortcutKeyCombinations2(name).some( ({ modifier, character }) => { return import_keycodes2.isKeyboardEvent[modifier](event, character); } ); } return isMatch; } // packages/keyboard-shortcuts/build-module/context.mjs var import_element = __toESM(require_element(), 1); var globalShortcuts = /* @__PURE__ */ new Set(); var globalListener = (event) => { for (const keyboardShortcut of globalShortcuts) { keyboardShortcut(event); } }; var context = (0, import_element.createContext)({ add: (shortcut) => { if (globalShortcuts.size === 0) { document.addEventListener("keydown", globalListener); } globalShortcuts.add(shortcut); }, delete: (shortcut) => { globalShortcuts.delete(shortcut); if (globalShortcuts.size === 0) { document.removeEventListener("keydown", globalListener); } } }); context.displayName = "KeyboardShortcutsContext"; // packages/keyboard-shortcuts/build-module/hooks/use-shortcut.mjs function useShortcut(name, callback, { isDisabled = false } = {}) { const shortcuts = (0, import_element2.useContext)(context); const isMatch = useShortcutEventMatch(); const callbackRef = (0, import_element2.useRef)(); (0, import_element2.useEffect)(() => { callbackRef.current = callback; }, [callback]); (0, import_element2.useEffect)(() => { if (isDisabled) { return; } function _callback(event) { if (isMatch(name, event)) { callbackRef.current(event); } } shortcuts.add(_callback); return () => { shortcuts.delete(_callback); }; }, [name, isDisabled, shortcuts]); } // packages/keyboard-shortcuts/build-module/components/shortcut-provider.mjs var import_element3 = __toESM(require_element(), 1); var import_jsx_runtime = __toESM(require_jsx_runtime(), 1); var { Provider } = context; function ShortcutProvider(props) { const [keyboardShortcuts] = (0, import_element3.useState)(() => /* @__PURE__ */ new Set()); function onKeyDown(event) { if (props.onKeyDown) { props.onKeyDown(event); } for (const keyboardShortcut of keyboardShortcuts) { keyboardShortcut(event); } } return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Provider, { value: keyboardShortcuts, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { ...props, onKeyDown }) }); } return __toCommonJS(index_exports); })(); patterns.js000064400000164374152214270310006756 0ustar00var wp; (wp ||= {}).patterns = (() => { var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // package-external:@wordpress/data var require_data = __commonJS({ "package-external:@wordpress/data"(exports, module) { module.exports = window.wp.data; } }); // package-external:@wordpress/blocks var require_blocks = __commonJS({ "package-external:@wordpress/blocks"(exports, module) { module.exports = window.wp.blocks; } }); // package-external:@wordpress/core-data var require_core_data = __commonJS({ "package-external:@wordpress/core-data"(exports, module) { module.exports = window.wp.coreData; } }); // package-external:@wordpress/block-editor var require_block_editor = __commonJS({ "package-external:@wordpress/block-editor"(exports, module) { module.exports = window.wp.blockEditor; } }); // package-external:@wordpress/private-apis var require_private_apis = __commonJS({ "package-external:@wordpress/private-apis"(exports, module) { module.exports = window.wp.privateApis; } }); // package-external:@wordpress/components var require_components = __commonJS({ "package-external:@wordpress/components"(exports, module) { module.exports = window.wp.components; } }); // package-external:@wordpress/element var require_element = __commonJS({ "package-external:@wordpress/element"(exports, module) { module.exports = window.wp.element; } }); // package-external:@wordpress/i18n var require_i18n = __commonJS({ "package-external:@wordpress/i18n"(exports, module) { module.exports = window.wp.i18n; } }); // vendor-external:react/jsx-runtime var require_jsx_runtime = __commonJS({ "vendor-external:react/jsx-runtime"(exports, module) { module.exports = window.ReactJSXRuntime; } }); // package-external:@wordpress/notices var require_notices = __commonJS({ "package-external:@wordpress/notices"(exports, module) { module.exports = window.wp.notices; } }); // package-external:@wordpress/compose var require_compose = __commonJS({ "package-external:@wordpress/compose"(exports, module) { module.exports = window.wp.compose; } }); // package-external:@wordpress/html-entities var require_html_entities = __commonJS({ "package-external:@wordpress/html-entities"(exports, module) { module.exports = window.wp.htmlEntities; } }); // package-external:@wordpress/primitives var require_primitives = __commonJS({ "package-external:@wordpress/primitives"(exports, module) { module.exports = window.wp.primitives; } }); // package-external:@wordpress/url var require_url = __commonJS({ "package-external:@wordpress/url"(exports, module) { module.exports = window.wp.url; } }); // package-external:@wordpress/a11y var require_a11y = __commonJS({ "package-external:@wordpress/a11y"(exports, module) { module.exports = window.wp.a11y; } }); // packages/patterns/build-module/index.mjs var index_exports = {}; __export(index_exports, { privateApis: () => privateApis, store: () => store }); // packages/patterns/build-module/store/index.mjs var import_data2 = __toESM(require_data(), 1); // packages/patterns/build-module/store/reducer.mjs var import_data = __toESM(require_data(), 1); function isEditingPattern(state = {}, action) { if (action?.type === "SET_EDITING_PATTERN") { return { ...state, [action.clientId]: action.isEditing }; } return state; } var reducer_default = (0, import_data.combineReducers)({ isEditingPattern }); // packages/patterns/build-module/store/actions.mjs var actions_exports = {}; __export(actions_exports, { convertSyncedPatternToStatic: () => convertSyncedPatternToStatic, createPattern: () => createPattern, createPatternFromFile: () => createPatternFromFile, setEditingPattern: () => setEditingPattern }); var import_blocks = __toESM(require_blocks(), 1); var import_core_data = __toESM(require_core_data(), 1); var import_block_editor = __toESM(require_block_editor(), 1); // packages/patterns/build-module/constants.mjs var PATTERN_TYPES = { theme: "pattern", user: "wp_block" }; var PATTERN_DEFAULT_CATEGORY = "all-patterns"; var PATTERN_USER_CATEGORY = "my-patterns"; var EXCLUDED_PATTERN_SOURCES = [ "core", "pattern-directory/core", "pattern-directory/featured" ]; var PATTERN_SYNC_TYPES = { full: "fully", unsynced: "unsynced" }; var PATTERN_OVERRIDES_BINDING_SOURCE = "core/pattern-overrides"; // packages/patterns/build-module/store/actions.mjs var createPattern = (title, syncType, content, categories) => async ({ registry }) => { const meta = syncType === PATTERN_SYNC_TYPES.unsynced ? { wp_pattern_sync_status: syncType } : void 0; const reusableBlock = { title, content, status: "publish", meta, wp_pattern_category: categories }; const updatedRecord = await registry.dispatch(import_core_data.store).saveEntityRecord("postType", "wp_block", reusableBlock); return updatedRecord; }; var createPatternFromFile = (file, categories) => async ({ dispatch }) => { const fileContent = await file.text(); let parsedContent; try { parsedContent = JSON.parse(fileContent); } catch (e) { throw new Error("Invalid JSON file"); } if (parsedContent.__file !== "wp_block" || !parsedContent.title || !parsedContent.content || typeof parsedContent.title !== "string" || typeof parsedContent.content !== "string" || parsedContent.syncStatus && typeof parsedContent.syncStatus !== "string") { throw new Error("Invalid pattern JSON file"); } const pattern = await dispatch.createPattern( parsedContent.title, parsedContent.syncStatus, parsedContent.content, categories ); return pattern; }; var convertSyncedPatternToStatic = (clientId) => ({ registry }) => { const patternBlock = registry.select(import_block_editor.store).getBlock(clientId); const existingOverrides = patternBlock.attributes?.content; function cloneBlocksAndRemoveBindings(blocks) { return blocks.map((block) => { let metadata = block.attributes.metadata; if (metadata) { metadata = { ...metadata }; delete metadata.id; delete metadata.bindings; if (existingOverrides?.[metadata.name]) { for (const [attributeName, value] of Object.entries( existingOverrides[metadata.name] )) { if (!(0, import_blocks.getBlockType)(block.name)?.attributes[attributeName]) { continue; } block.attributes[attributeName] = value; } } } return (0, import_blocks.cloneBlock)( block, { metadata: metadata && Object.keys(metadata).length > 0 ? metadata : void 0 }, cloneBlocksAndRemoveBindings(block.innerBlocks) ); }); } const patternInnerBlocks = registry.select(import_block_editor.store).getBlocks(patternBlock.clientId); registry.dispatch(import_block_editor.store).replaceBlocks( patternBlock.clientId, cloneBlocksAndRemoveBindings(patternInnerBlocks) ); }; function setEditingPattern(clientId, isEditing) { return { type: "SET_EDITING_PATTERN", clientId, isEditing }; } // packages/patterns/build-module/store/constants.mjs var STORE_NAME = "core/patterns"; // packages/patterns/build-module/store/selectors.mjs var selectors_exports = {}; __export(selectors_exports, { isEditingPattern: () => isEditingPattern2 }); function isEditingPattern2(state, clientId) { return state.isEditingPattern[clientId]; } // packages/patterns/build-module/lock-unlock.mjs var import_private_apis = __toESM(require_private_apis(), 1); var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)( "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.", "@wordpress/patterns" ); // packages/patterns/build-module/store/index.mjs var storeConfig = { reducer: reducer_default }; var store = (0, import_data2.createReduxStore)(STORE_NAME, { ...storeConfig }); (0, import_data2.register)(store); unlock(store).registerPrivateActions(actions_exports); unlock(store).registerPrivateSelectors(selectors_exports); // packages/patterns/build-module/components/overrides-panel.mjs var import_block_editor2 = __toESM(require_block_editor(), 1); var import_components = __toESM(require_components(), 1); var import_data3 = __toESM(require_data(), 1); var import_element = __toESM(require_element(), 1); var import_i18n = __toESM(require_i18n(), 1); // packages/patterns/build-module/api/index.mjs function isOverridableBlock(block) { return !!block.attributes.metadata?.name && !!block.attributes.metadata?.bindings && Object.values(block.attributes.metadata.bindings).some( (binding) => binding.source === "core/pattern-overrides" ); } // packages/patterns/build-module/components/overrides-panel.mjs var import_jsx_runtime = __toESM(require_jsx_runtime(), 1); var { BlockQuickNavigation } = unlock(import_block_editor2.privateApis); function OverridesPanel() { const { allClientIds, supportedBlockTypesRaw } = (0, import_data3.useSelect)( (select) => ({ allClientIds: select(import_block_editor2.store).getClientIdsWithDescendants(), supportedBlockTypesRaw: select(import_block_editor2.store).getSettings()?.__experimentalBlockBindingsSupportedAttributes }), [] ); const { getBlock } = (0, import_data3.useSelect)(import_block_editor2.store); const clientIdsWithOverrides = (0, import_element.useMemo)(() => { const supportedBlockTypes = Object.keys(supportedBlockTypesRaw ?? {}); return allClientIds.filter((clientId) => { const block = getBlock(clientId); return supportedBlockTypes.includes(block.name) && isOverridableBlock(block); }); }, [allClientIds, getBlock, supportedBlockTypesRaw]); if (!clientIdsWithOverrides?.length) { return null; } 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 }) }); } // packages/patterns/build-module/components/create-pattern-modal.mjs var import_components3 = __toESM(require_components(), 1); var import_i18n3 = __toESM(require_i18n(), 1); var import_element4 = __toESM(require_element(), 1); var import_data5 = __toESM(require_data(), 1); var import_notices = __toESM(require_notices(), 1); var import_core_data3 = __toESM(require_core_data(), 1); // packages/patterns/build-module/components/category-selector.mjs var import_i18n2 = __toESM(require_i18n(), 1); var import_element2 = __toESM(require_element(), 1); var import_components2 = __toESM(require_components(), 1); var import_compose = __toESM(require_compose(), 1); var import_html_entities = __toESM(require_html_entities(), 1); var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1); var unescapeString = (arg) => { return (0, import_html_entities.decodeEntities)(arg); }; var CATEGORY_SLUG = "wp_pattern_category"; function CategorySelector({ categoryTerms, onChange, categoryMap }) { const [search, setSearch] = (0, import_element2.useState)(""); const debouncedSearch = (0, import_compose.useDebounce)(setSearch, 500); const suggestions = (0, import_element2.useMemo)(() => { return Array.from(categoryMap.values()).map((category) => unescapeString(category.label)).filter((category) => { if (search !== "") { return category.toLowerCase().includes(search.toLowerCase()); } return true; }).sort((a, b) => a.localeCompare(b)); }, [search, categoryMap]); function handleChange(termNames) { const uniqueTerms = termNames.reduce((terms, newTerm) => { if (!terms.some( (term) => term.toLowerCase() === newTerm.toLowerCase() )) { terms.push(newTerm); } return terms; }, []); onChange(uniqueTerms); } return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)( import_components2.FormTokenField, { className: "patterns-menu-items__convert-modal-categories", value: categoryTerms, suggestions, onChange: handleChange, onInputChange: debouncedSearch, label: (0, import_i18n2.__)("Categories"), tokenizeOnBlur: true, __experimentalExpandOnFocus: true, __next40pxDefaultSize: true } ); } // packages/patterns/build-module/private-hooks.mjs var import_data4 = __toESM(require_data(), 1); var import_core_data2 = __toESM(require_core_data(), 1); var import_element3 = __toESM(require_element(), 1); function useAddPatternCategory() { const { saveEntityRecord, invalidateResolution } = (0, import_data4.useDispatch)(import_core_data2.store); const { corePatternCategories, userPatternCategories } = (0, import_data4.useSelect)( (select) => { const { getUserPatternCategories, getBlockPatternCategories } = select(import_core_data2.store); return { corePatternCategories: getBlockPatternCategories(), userPatternCategories: getUserPatternCategories() }; }, [] ); const categoryMap = (0, import_element3.useMemo)(() => { const uniqueCategories = /* @__PURE__ */ new Map(); userPatternCategories.forEach((category) => { uniqueCategories.set(category.label.toLowerCase(), { label: category.label, name: category.name, id: category.id }); }); corePatternCategories.forEach((category) => { if (!uniqueCategories.has(category.label.toLowerCase()) && // There are two core categories with `Post` label so explicitly remove the one with // the `query` slug to avoid any confusion. category.name !== "query") { uniqueCategories.set(category.label.toLowerCase(), { label: category.label, name: category.name }); } }); return uniqueCategories; }, [userPatternCategories, corePatternCategories]); async function findOrCreateTerm(term) { try { const existingTerm = categoryMap.get(term.toLowerCase()); if (existingTerm?.id) { return existingTerm.id; } const termData = existingTerm ? { name: existingTerm.label, slug: existingTerm.name } : { name: term }; const newTerm = await saveEntityRecord( "taxonomy", CATEGORY_SLUG, termData, { throwOnError: true } ); invalidateResolution("getUserPatternCategories"); return newTerm.id; } catch (error) { if (error.code !== "term_exists") { throw error; } return error.data.term_id; } } return { categoryMap, findOrCreateTerm }; } // packages/patterns/build-module/components/create-pattern-modal.mjs var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1); function CreatePatternModal({ className = "patterns-menu-items__convert-modal", modalTitle, ...restProps }) { const defaultModalTitle = (0, import_data5.useSelect)( (select) => select(import_core_data3.store).getPostType(PATTERN_TYPES.user)?.labels?.add_new_item, [] ); return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)( import_components3.Modal, { title: modalTitle || defaultModalTitle, onRequestClose: restProps.onClose, overlayClassName: className, focusOnMount: "firstContentElement", size: "small", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CreatePatternModalContents, { ...restProps }) } ); } function CreatePatternModalContents({ confirmLabel = (0, import_i18n3.__)("Add"), defaultCategories = [], content, onClose, onError, onSuccess, defaultSyncType = PATTERN_SYNC_TYPES.full, defaultTitle = "" }) { const [syncType, setSyncType] = (0, import_element4.useState)(defaultSyncType); const [categoryTerms, setCategoryTerms] = (0, import_element4.useState)(defaultCategories); const [title, setTitle] = (0, import_element4.useState)(defaultTitle); const [isSaving, setIsSaving] = (0, import_element4.useState)(false); const { createPattern: createPattern2 } = unlock((0, import_data5.useDispatch)(store)); const { createErrorNotice } = (0, import_data5.useDispatch)(import_notices.store); const { categoryMap, findOrCreateTerm } = useAddPatternCategory(); async function onCreate(patternTitle, sync) { if (!title || isSaving) { return; } try { setIsSaving(true); const categories = await Promise.all( categoryTerms.map( (termName) => findOrCreateTerm(termName) ) ); const newPattern = await createPattern2( patternTitle, sync, typeof content === "function" ? content() : content, categories ); onSuccess({ pattern: newPattern, categoryId: PATTERN_DEFAULT_CATEGORY }); } catch (error) { createErrorNotice(error.message, { type: "snackbar", id: "pattern-create" }); onError?.(); } finally { setIsSaving(false); setCategoryTerms([]); setTitle(""); } } return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)( "form", { onSubmit: (event) => { event.preventDefault(); onCreate(title, syncType); }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_components3.__experimentalVStack, { spacing: "5", children: [ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)( import_components3.TextControl, { label: (0, import_i18n3.__)("Name"), value: title, onChange: setTitle, placeholder: (0, import_i18n3.__)("My pattern"), className: "patterns-create-modal__name-input", __next40pxDefaultSize: true } ), /* @__PURE__ */ (0, import_jsx_runtime3.jsx)( CategorySelector, { categoryTerms, onChange: setCategoryTerms, categoryMap } ), /* @__PURE__ */ (0, import_jsx_runtime3.jsx)( import_components3.ToggleControl, { label: (0, import_i18n3._x)("Synced", "pattern (singular)"), help: (0, import_i18n3.__)( "Sync this pattern across multiple locations." ), checked: syncType === PATTERN_SYNC_TYPES.full, onChange: () => { setSyncType( syncType === PATTERN_SYNC_TYPES.full ? PATTERN_SYNC_TYPES.unsynced : PATTERN_SYNC_TYPES.full ); } } ), /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_components3.__experimentalHStack, { justify: "right", children: [ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)( import_components3.Button, { __next40pxDefaultSize: true, variant: "tertiary", onClick: () => { onClose(); setTitle(""); }, children: (0, import_i18n3.__)("Cancel") } ), /* @__PURE__ */ (0, import_jsx_runtime3.jsx)( import_components3.Button, { __next40pxDefaultSize: true, variant: "primary", type: "submit", "aria-disabled": !title || isSaving, isBusy: isSaving, children: confirmLabel } ) ] }) ] }) } ); } // packages/patterns/build-module/components/duplicate-pattern-modal.mjs var import_core_data4 = __toESM(require_core_data(), 1); var import_data6 = __toESM(require_data(), 1); var import_i18n4 = __toESM(require_i18n(), 1); var import_notices2 = __toESM(require_notices(), 1); var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1); function getTermLabels(pattern, categories) { if (pattern.type !== PATTERN_TYPES.user) { return categories.core?.filter( (category) => pattern.categories?.includes(category.name) ).map((category) => category.label); } return categories.user?.filter( (category) => pattern.wp_pattern_category?.includes(category.id) ).map((category) => category.label); } function useDuplicatePatternProps({ pattern, onSuccess }) { const { createSuccessNotice } = (0, import_data6.useDispatch)(import_notices2.store); const categories = (0, import_data6.useSelect)((select) => { const { getUserPatternCategories, getBlockPatternCategories } = select(import_core_data4.store); return { core: getBlockPatternCategories(), user: getUserPatternCategories() }; }); if (!pattern) { return null; } return { content: pattern.content, defaultCategories: getTermLabels(pattern, categories), defaultSyncType: pattern.type !== PATTERN_TYPES.user ? PATTERN_SYNC_TYPES.unsynced : pattern.wp_pattern_sync_status || PATTERN_SYNC_TYPES.full, defaultTitle: (0, import_i18n4.sprintf)( /* translators: %s: Existing pattern title */ (0, import_i18n4._x)("%s (Copy)", "pattern"), typeof pattern.title === "string" ? pattern.title : pattern.title.raw ), onSuccess: ({ pattern: newPattern }) => { createSuccessNotice( (0, import_i18n4.sprintf)( // translators: %s: The new pattern's title e.g. 'Call to action (copy)'. (0, import_i18n4._x)('"%s" duplicated.', "pattern"), newPattern.title.raw ), { type: "snackbar", id: "patterns-create" } ); onSuccess?.({ pattern: newPattern }); } }; } function DuplicatePatternModal({ pattern, onClose, onSuccess }) { const duplicatedProps = useDuplicatePatternProps({ pattern, onSuccess }); if (!pattern) { return null; } return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)( CreatePatternModal, { modalTitle: (0, import_i18n4.__)("Duplicate pattern"), confirmLabel: (0, import_i18n4.__)("Duplicate"), onClose, onError: onClose, ...duplicatedProps } ); } // packages/patterns/build-module/components/rename-pattern-modal.mjs var import_components4 = __toESM(require_components(), 1); var import_core_data5 = __toESM(require_core_data(), 1); var import_data7 = __toESM(require_data(), 1); var import_element5 = __toESM(require_element(), 1); var import_html_entities2 = __toESM(require_html_entities(), 1); var import_i18n5 = __toESM(require_i18n(), 1); var import_notices3 = __toESM(require_notices(), 1); var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1); function RenamePatternModal({ onClose, onError, onSuccess, pattern, ...props }) { const originalName = (0, import_html_entities2.decodeEntities)(pattern.title); const [name, setName] = (0, import_element5.useState)(originalName); const [isSaving, setIsSaving] = (0, import_element5.useState)(false); const { editEntityRecord, __experimentalSaveSpecifiedEntityEdits: saveSpecifiedEntityEdits } = (0, import_data7.useDispatch)(import_core_data5.store); const { createSuccessNotice, createErrorNotice } = (0, import_data7.useDispatch)(import_notices3.store); const onRename = async (event) => { event.preventDefault(); if (!name || name === pattern.title || isSaving) { return; } try { await editEntityRecord("postType", pattern.type, pattern.id, { title: name }); setIsSaving(true); setName(""); onClose?.(); const savedRecord = await saveSpecifiedEntityEdits( "postType", pattern.type, pattern.id, ["title"], { throwOnError: true } ); onSuccess?.(savedRecord); createSuccessNotice((0, import_i18n5.__)("Pattern renamed"), { type: "snackbar", id: "pattern-update" }); } catch (error) { onError?.(); const errorMessage = error.message && error.code !== "unknown_error" ? error.message : (0, import_i18n5.__)("An error occurred while renaming the pattern."); createErrorNotice(errorMessage, { type: "snackbar", id: "pattern-update" }); } finally { setIsSaving(false); setName(""); } }; const onRequestClose = () => { onClose?.(); setName(""); }; return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)( import_components4.Modal, { title: (0, import_i18n5.__)("Rename"), ...props, onRequestClose: onClose, focusOnMount: "firstContentElement", size: "small", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("form", { onSubmit: onRename, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_components4.__experimentalVStack, { spacing: "5", children: [ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)( import_components4.TextControl, { __next40pxDefaultSize: true, label: (0, import_i18n5.__)("Name"), value: name, onChange: setName, required: true } ), /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_components4.__experimentalHStack, { justify: "right", children: [ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)( import_components4.Button, { __next40pxDefaultSize: true, variant: "tertiary", onClick: onRequestClose, children: (0, import_i18n5.__)("Cancel") } ), /* @__PURE__ */ (0, import_jsx_runtime5.jsx)( import_components4.Button, { __next40pxDefaultSize: true, variant: "primary", type: "submit", children: (0, import_i18n5.__)("Save") } ) ] }) ] }) }) } ); } // packages/patterns/build-module/components/index.mjs var import_block_editor5 = __toESM(require_block_editor(), 1); // packages/patterns/build-module/components/pattern-convert-button.mjs var import_blocks2 = __toESM(require_blocks(), 1); var import_block_editor3 = __toESM(require_block_editor(), 1); var import_element6 = __toESM(require_element(), 1); var import_components5 = __toESM(require_components(), 1); // packages/icons/build-module/library/symbol.mjs var import_primitives = __toESM(require_primitives(), 1); var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1); var symbol_default = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_primitives.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_primitives.Path, { d: "M21.3 10.8l-5.6-5.6c-.7-.7-1.8-.7-2.5 0l-5.6 5.6c-.7.7-.7 1.8 0 2.5l5.6 5.6c.3.3.8.5 1.2.5s.9-.2 1.2-.5l5.6-5.6c.8-.7.8-1.9.1-2.5zm-1 1.4l-5.6 5.6c-.1.1-.3.1-.4 0l-5.6-5.6c-.1-.1-.1-.3 0-.4l5.6-5.6s.1-.1.2-.1.1 0 .2.1l5.6 5.6c.1.1.1.3 0 .4zm-16.6-.4L10 5.5l-1-1-6.3 6.3c-.7.7-.7 1.8 0 2.5L9 19.5l1.1-1.1-6.3-6.3c-.2 0-.2-.2-.1-.3z" }) }); // packages/patterns/build-module/components/pattern-convert-button.mjs var import_data8 = __toESM(require_data(), 1); var import_core_data6 = __toESM(require_core_data(), 1); var import_i18n6 = __toESM(require_i18n(), 1); var import_notices4 = __toESM(require_notices(), 1); var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1); function PatternConvertButton({ clientIds, rootClientId, closeBlockSettingsMenu }) { const { createSuccessNotice } = (0, import_data8.useDispatch)(import_notices4.store); const { replaceBlocks, updateBlockAttributes } = (0, import_data8.useDispatch)(import_block_editor3.store); const { setEditingPattern: setEditingPattern2 } = unlock((0, import_data8.useDispatch)(store)); const [isModalOpen, setIsModalOpen] = (0, import_element6.useState)(false); const { getBlockAttributes } = (0, import_data8.useSelect)(import_block_editor3.store); const canConvert = (0, import_data8.useSelect)( (select) => { const { canUser } = select(import_core_data6.store); const { getBlocksByClientId: getBlocksByClientId2, canInsertBlockType, getBlockRootClientId } = select(import_block_editor3.store); const rootId = rootClientId || (clientIds.length > 0 ? getBlockRootClientId(clientIds[0]) : void 0); const blocks = getBlocksByClientId2(clientIds) ?? []; const hasReusableBlockSupport = (blockName) => { const blockType = (0, import_blocks2.getBlockType)(blockName); const hasParent = blockType && "parent" in blockType; return (0, import_blocks2.hasBlockSupport)(blockName, "reusable", !hasParent); }; const isSyncedPattern = blocks.length === 1 && blocks[0] && (0, import_blocks2.isReusableBlock)(blocks[0]) && !!select(import_core_data6.store).getEntityRecord( "postType", "wp_block", blocks[0].attributes.ref ); const isUnsyncedPattern = blocks.length === 1 && blocks?.[0]?.attributes?.metadata?.patternName; const _canConvert = ( // Hide when this is already a pattern. !isUnsyncedPattern && !isSyncedPattern && // Hide when patterns are disabled. canInsertBlockType("core/block", rootId) && blocks.every( (block) => ( // Guard against the case where a regular block has *just* been converted. !!block && // Hide on invalid blocks. block.isValid && // Hide when block doesn't support being made into a pattern. hasReusableBlockSupport(block.name) ) ) && // Hide when current doesn't have permission to do that. // Blocks refers to the wp_block post type, this checks the ability to create a post of that type. !!canUser("create", { kind: "postType", name: "wp_block" }) ); return _canConvert; }, [clientIds, rootClientId] ); const { getBlocksByClientId } = (0, import_data8.useSelect)(import_block_editor3.store); const getContent = (0, import_element6.useCallback)( () => (0, import_blocks2.serialize)(getBlocksByClientId(clientIds)), [getBlocksByClientId, clientIds] ); if (!canConvert) { return null; } const handleSuccess = ({ pattern }) => { if (pattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced) { if (clientIds?.length === 1) { const existingAttributes = getBlockAttributes(clientIds[0]); updateBlockAttributes(clientIds[0], { metadata: { ...existingAttributes?.metadata ? existingAttributes.metadata : {}, patternName: `core/block/${pattern.id}`, name: pattern.title.raw } }); } } else { const newBlock = (0, import_blocks2.createBlock)("core/block", { ref: pattern.id }); replaceBlocks(clientIds, newBlock); setEditingPattern2(newBlock.clientId, true); } createSuccessNotice( pattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced ? (0, import_i18n6.sprintf)( // translators: %s: the name the user has given to the pattern. (0, import_i18n6.__)("Unsynced pattern created: %s"), pattern.title.raw ) : (0, import_i18n6.sprintf)( // translators: %s: the name the user has given to the pattern. (0, import_i18n6.__)("Synced pattern created: %s"), pattern.title.raw ), { type: "snackbar", id: "convert-to-pattern-success" } ); setIsModalOpen(false); closeBlockSettingsMenu(); }; return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)( import_components5.MenuItem, { icon: symbol_default, onClick: () => setIsModalOpen(true), "aria-expanded": isModalOpen, "aria-haspopup": "dialog", children: (0, import_i18n6.__)("Create pattern") } ), isModalOpen && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)( CreatePatternModal, { content: getContent, onSuccess: (pattern) => { handleSuccess(pattern); }, onError: () => { setIsModalOpen(false); }, onClose: () => { setIsModalOpen(false); closeBlockSettingsMenu(); } } ) ] }); } // packages/patterns/build-module/components/patterns-manage-button.mjs var import_components6 = __toESM(require_components(), 1); var import_i18n7 = __toESM(require_i18n(), 1); var import_blocks3 = __toESM(require_blocks(), 1); var import_data9 = __toESM(require_data(), 1); var import_element7 = __toESM(require_element(), 1); var import_block_editor4 = __toESM(require_block_editor(), 1); var import_url = __toESM(require_url(), 1); var import_core_data7 = __toESM(require_core_data(), 1); var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1); function PatternsManageButton({ clientId, onClose }) { const [showConfirmDialog, setShowConfirmDialog] = (0, import_element7.useState)(false); const { attributes, canDetach, isVisible, managePatternsUrl, isSyncedPattern, isUnsyncedPattern, canEdit } = (0, import_data9.useSelect)( (select) => { const { canRemoveBlock, getBlock, canEditBlock } = select(import_block_editor4.store); const { canUser } = select(import_core_data7.store); const block = getBlock(clientId); const _isUnsyncedPattern = !!block?.attributes?.metadata?.patternName; const _isSyncedPattern = !!block && (0, import_blocks3.isReusableBlock)(block) && !!canUser("update", { kind: "postType", name: "wp_block", id: block.attributes.ref }); return { attributes: block.attributes, canEdit: canEditBlock(clientId), // For unsynced patterns, detaching is simply removing the `patternName` attribute. // For synced patterns, the `core:block` block is replaced with its inner blocks, // so checking whether `canRemoveBlock` is possible is required. canDetach: _isUnsyncedPattern || _isSyncedPattern && canRemoveBlock(clientId), isUnsyncedPattern: _isUnsyncedPattern, isSyncedPattern: _isSyncedPattern, isVisible: _isUnsyncedPattern || _isSyncedPattern, // The site editor and templates both check whether the user // has edit_theme_options capabilities. We can leverage that here // and omit the manage patterns link if the user can't access it. managePatternsUrl: canUser("create", { kind: "postType", name: "wp_template" }) ? (0, import_url.addQueryArgs)("site-editor.php", { p: "/pattern" }) : (0, import_url.addQueryArgs)("edit.php", { post_type: "wp_block" }) }; }, [clientId] ); const { updateBlockAttributes } = (0, import_data9.useDispatch)(import_block_editor4.store); const { convertSyncedPatternToStatic: convertSyncedPatternToStatic2 } = unlock( (0, import_data9.useDispatch)(store) ); if (!isVisible || !canEdit) { return null; } const handleDetach = () => { if (isSyncedPattern) { convertSyncedPatternToStatic2(clientId); } if (isUnsyncedPattern) { const { patternName, ...attributesWithoutPatternName } = attributes?.metadata ?? {}; updateBlockAttributes(clientId, { metadata: attributesWithoutPatternName }); } onClose?.(); setShowConfirmDialog(false); }; return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [ canDetach && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_components6.MenuItem, { onClick: () => setShowConfirmDialog(true), children: (0, import_i18n7.__)("Detach") }), /* @__PURE__ */ (0, import_jsx_runtime8.jsx)( import_components6.__experimentalConfirmDialog, { isOpen: showConfirmDialog, onConfirm: handleDetach, onCancel: () => setShowConfirmDialog(false), confirmButtonText: (0, import_i18n7.__)("Detach"), size: "medium", title: (0, import_i18n7.__)("Detach pattern?"), __experimentalHideHeader: false, children: isSyncedPattern ? (0, import_i18n7.__)( "The blocks will be separated from the original pattern and will be fully editable. Future changes to the pattern will not apply here." ) : (0, import_i18n7.__)( "Blocks will no longer be associated with this pattern and will be fully editable." ) } ) ] }), /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_components6.MenuItem, { href: managePatternsUrl, children: (0, import_i18n7.__)("Manage patterns") }) ] }); } var patterns_manage_button_default = PatternsManageButton; // packages/patterns/build-module/components/index.mjs var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1); function PatternsMenuItems({ rootClientId }) { 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: [ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)( PatternConvertButton, { clientIds: selectedClientIds, rootClientId, closeBlockSettingsMenu: onClose } ), selectedClientIds.length === 1 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)( patterns_manage_button_default, { clientId: selectedClientIds[0], onClose } ) ] }) }); } // packages/patterns/build-module/components/rename-pattern-category-modal.mjs var import_components7 = __toESM(require_components(), 1); var import_core_data8 = __toESM(require_core_data(), 1); var import_data10 = __toESM(require_data(), 1); var import_element8 = __toESM(require_element(), 1); var import_html_entities3 = __toESM(require_html_entities(), 1); var import_i18n8 = __toESM(require_i18n(), 1); var import_notices5 = __toESM(require_notices(), 1); var import_a11y = __toESM(require_a11y(), 1); var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1); function RenamePatternCategoryModal({ category, existingCategories, onClose, onError, onSuccess, ...props }) { const id = (0, import_element8.useId)(); const textControlRef = (0, import_element8.useRef)(); const [name, setName] = (0, import_element8.useState)((0, import_html_entities3.decodeEntities)(category.name)); const [isSaving, setIsSaving] = (0, import_element8.useState)(false); const [validationMessage, setValidationMessage] = (0, import_element8.useState)(false); const validationMessageId = validationMessage ? `patterns-rename-pattern-category-modal__validation-message-${id}` : void 0; const { saveEntityRecord, invalidateResolution } = (0, import_data10.useDispatch)(import_core_data8.store); const { createErrorNotice, createSuccessNotice } = (0, import_data10.useDispatch)(import_notices5.store); const onChange = (newName) => { if (validationMessage) { setValidationMessage(void 0); } setName(newName); }; const onSave = async (event) => { event.preventDefault(); if (isSaving) { return; } if (!name || name === category.name) { const message = (0, import_i18n8.__)("Please enter a new name for this category."); (0, import_a11y.speak)(message, "assertive"); setValidationMessage(message); textControlRef.current?.focus(); return; } if (existingCategories.patternCategories.find((existingCategory) => { return existingCategory.id !== category.id && existingCategory.label.toLowerCase() === name.toLowerCase(); })) { const message = (0, import_i18n8.__)( "This category already exists. Please use a different name." ); (0, import_a11y.speak)(message, "assertive"); setValidationMessage(message); textControlRef.current?.focus(); return; } try { setIsSaving(true); const savedRecord = await saveEntityRecord( "taxonomy", CATEGORY_SLUG, { id: category.id, slug: category.slug, name } ); invalidateResolution("getUserPatternCategories"); onSuccess?.(savedRecord); onClose(); createSuccessNotice((0, import_i18n8.__)("Pattern category renamed."), { type: "snackbar", id: "pattern-category-update" }); } catch (error) { onError?.(); createErrorNotice(error.message, { type: "snackbar", id: "pattern-category-update" }); } finally { setIsSaving(false); setName(""); } }; const onRequestClose = () => { onClose(); setName(""); }; return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)( import_components7.Modal, { title: (0, import_i18n8.__)("Rename"), onRequestClose, ...props, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("form", { onSubmit: onSave, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_components7.__experimentalVStack, { spacing: "5", children: [ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_components7.__experimentalVStack, { spacing: "2", children: [ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)( import_components7.TextControl, { ref: textControlRef, __next40pxDefaultSize: true, label: (0, import_i18n8.__)("Name"), value: name, onChange, "aria-describedby": validationMessageId, required: true } ), validationMessage && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)( "span", { className: "patterns-rename-pattern-category-modal__validation-message", id: validationMessageId, children: validationMessage } ) ] }), /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_components7.__experimentalHStack, { justify: "right", children: [ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)( import_components7.Button, { __next40pxDefaultSize: true, variant: "tertiary", onClick: onRequestClose, children: (0, import_i18n8.__)("Cancel") } ), /* @__PURE__ */ (0, import_jsx_runtime10.jsx)( import_components7.Button, { __next40pxDefaultSize: true, variant: "primary", type: "submit", "aria-disabled": !name || name === category.name || isSaving, isBusy: isSaving, children: (0, import_i18n8.__)("Save") } ) ] }) ] }) }) } ); } // packages/patterns/build-module/components/pattern-overrides-controls.mjs var import_element10 = __toESM(require_element(), 1); var import_block_editor6 = __toESM(require_block_editor(), 1); var import_components9 = __toESM(require_components(), 1); var import_i18n10 = __toESM(require_i18n(), 1); // packages/patterns/build-module/components/allow-overrides-modal.mjs var import_components8 = __toESM(require_components(), 1); var import_i18n9 = __toESM(require_i18n(), 1); var import_element9 = __toESM(require_element(), 1); var import_a11y2 = __toESM(require_a11y(), 1); var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1); function AllowOverridesModal({ placeholder, initialName = "", onClose, onSave }) { const [editedBlockName, setEditedBlockName] = (0, import_element9.useState)(initialName); const descriptionId = (0, import_element9.useId)(); const isNameValid = !!editedBlockName.trim(); const handleSubmit = () => { if (editedBlockName !== initialName) { const message = (0, import_i18n9.sprintf)( /* translators: %s: new name/label for the block */ (0, import_i18n9.__)('Block name changed to: "%s".'), editedBlockName ); (0, import_a11y2.speak)(message, "assertive"); } onSave(editedBlockName); onClose(); }; return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)( import_components8.Modal, { title: (0, import_i18n9.__)("Enable overrides"), onRequestClose: onClose, focusOnMount: "firstContentElement", aria: { describedby: descriptionId }, size: "small", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)( "form", { onSubmit: (event) => { event.preventDefault(); if (!isNameValid) { return; } handleSubmit(); }, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_components8.__experimentalVStack, { spacing: "6", children: [ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_components8.__experimentalText, { id: descriptionId, children: (0, import_i18n9.__)( "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." ) }), /* @__PURE__ */ (0, import_jsx_runtime11.jsx)( import_components8.TextControl, { __next40pxDefaultSize: true, value: editedBlockName, label: (0, import_i18n9.__)("Name"), help: (0, import_i18n9.__)( 'For example, if you are creating a recipe pattern, you use "Recipe Title", "Recipe Description", etc.' ), placeholder, onChange: setEditedBlockName } ), /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_components8.__experimentalHStack, { justify: "right", children: [ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)( import_components8.Button, { __next40pxDefaultSize: true, variant: "tertiary", onClick: onClose, children: (0, import_i18n9.__)("Cancel") } ), /* @__PURE__ */ (0, import_jsx_runtime11.jsx)( import_components8.Button, { __next40pxDefaultSize: true, "aria-disabled": !isNameValid, variant: "primary", type: "submit", children: (0, import_i18n9.__)("Enable") } ) ] }) ] }) } ) } ); } function DisallowOverridesModal({ onClose, onSave }) { const descriptionId = (0, import_element9.useId)(); return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)( import_components8.Modal, { title: (0, import_i18n9.__)("Disable overrides"), onRequestClose: onClose, aria: { describedby: descriptionId }, size: "small", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)( "form", { onSubmit: (event) => { event.preventDefault(); onSave(); onClose(); }, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_components8.__experimentalVStack, { spacing: "6", children: [ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_components8.__experimentalText, { id: descriptionId, children: (0, import_i18n9.__)( "Are you sure you want to disable overrides? Disabling overrides will revert all applied overrides for this block throughout instances of this pattern." ) }), /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_components8.__experimentalHStack, { justify: "right", children: [ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)( import_components8.Button, { __next40pxDefaultSize: true, variant: "tertiary", onClick: onClose, children: (0, import_i18n9.__)("Cancel") } ), /* @__PURE__ */ (0, import_jsx_runtime11.jsx)( import_components8.Button, { __next40pxDefaultSize: true, variant: "primary", type: "submit", children: (0, import_i18n9.__)("Disable") } ) ] }) ] }) } ) } ); } // packages/patterns/build-module/components/pattern-overrides-controls.mjs var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1); function PatternOverridesControls({ attributes, setAttributes, name: blockName }) { const controlId = (0, import_element10.useId)(); const [showAllowOverridesModal, setShowAllowOverridesModal] = (0, import_element10.useState)(false); const [showDisallowOverridesModal, setShowDisallowOverridesModal] = (0, import_element10.useState)(false); const hasName = !!attributes.metadata?.name; const defaultBindings = attributes.metadata?.bindings?.__default; const hasOverrides = hasName && defaultBindings?.source === PATTERN_OVERRIDES_BINDING_SOURCE; const isConnectedToOtherSources = defaultBindings?.source && defaultBindings.source !== PATTERN_OVERRIDES_BINDING_SOURCE; const { updateBlockBindings } = (0, import_block_editor6.useBlockBindingsUtils)(); function updateBindings(isChecked, customName) { if (customName) { setAttributes({ metadata: { ...attributes.metadata, name: customName } }); } updateBlockBindings({ __default: isChecked ? { source: PATTERN_OVERRIDES_BINDING_SOURCE } : void 0 }); } if (isConnectedToOtherSources) { return null; } const hasUnsupportedImageAttributes = blockName === "core/image" && !!attributes.href?.length; const helpText = !hasOverrides && hasUnsupportedImageAttributes ? (0, import_i18n10.__)( `Overrides currently don't support image links. Remove the link first before enabling overrides.` ) : (0, import_i18n10.__)( "Allow changes to this block throughout instances of this pattern." ); return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_block_editor6.InspectorControls, { group: "advanced", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)( import_components9.BaseControl, { id: controlId, label: (0, import_i18n10.__)("Overrides"), help: helpText, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)( import_components9.Button, { __next40pxDefaultSize: true, className: "pattern-overrides-control__allow-overrides-button", variant: "secondary", "aria-haspopup": "dialog", onClick: () => { if (hasOverrides) { setShowDisallowOverridesModal(true); } else { setShowAllowOverridesModal(true); } }, disabled: !hasOverrides && hasUnsupportedImageAttributes, accessibleWhenDisabled: true, children: hasOverrides ? (0, import_i18n10.__)("Disable overrides") : (0, import_i18n10.__)("Enable overrides") } ) } ) }), showAllowOverridesModal && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)( AllowOverridesModal, { initialName: attributes.metadata?.name, onClose: () => setShowAllowOverridesModal(false), onSave: (newName) => { updateBindings(true, newName); } } ), showDisallowOverridesModal && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)( DisallowOverridesModal, { onClose: () => setShowDisallowOverridesModal(false), onSave: () => updateBindings(false) } ) ] }); } var pattern_overrides_controls_default = PatternOverridesControls; // packages/patterns/build-module/components/reset-overrides-control.mjs var import_block_editor7 = __toESM(require_block_editor(), 1); var import_components10 = __toESM(require_components(), 1); var import_data11 = __toESM(require_data(), 1); var import_i18n11 = __toESM(require_i18n(), 1); var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1); var CONTENT = "content"; function ResetOverridesControl(props) { const name = props.attributes.metadata?.name; const registry = (0, import_data11.useRegistry)(); const isOverridden = (0, import_data11.useSelect)( (select) => { if (!name) { return; } const { getBlockAttributes, getBlockParentsByBlockName } = select(import_block_editor7.store); const [patternClientId] = getBlockParentsByBlockName( props.clientId, "core/block", true ); if (!patternClientId) { return; } const overrides = getBlockAttributes(patternClientId)[CONTENT]; if (!overrides) { return; } return overrides.hasOwnProperty(name); }, [props.clientId, name] ); function onClick() { const { getBlockAttributes, getBlockParentsByBlockName } = registry.select(import_block_editor7.store); const [patternClientId] = getBlockParentsByBlockName( props.clientId, "core/block", true ); if (!patternClientId) { return; } const overrides = getBlockAttributes(patternClientId)[CONTENT]; if (!overrides.hasOwnProperty(name)) { return; } const { updateBlockAttributes, __unstableMarkLastChangeAsPersistent } = registry.dispatch(import_block_editor7.store); __unstableMarkLastChangeAsPersistent(); let newOverrides = { ...overrides }; delete newOverrides[name]; if (!Object.keys(newOverrides).length) { newOverrides = void 0; } updateBlockAttributes(patternClientId, { [CONTENT]: newOverrides }); } 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") }) }) }); } // packages/patterns/build-module/private-apis.mjs var privateApis = {}; lock(privateApis, { OverridesPanel, CreatePatternModal, CreatePatternModalContents, DuplicatePatternModal, isOverridableBlock, useDuplicatePatternProps, RenamePatternModal, PatternsMenuItems, RenamePatternCategoryModal, PatternOverridesControls: pattern_overrides_controls_default, ResetOverridesControl, useAddPatternCategory, PATTERN_TYPES, PATTERN_DEFAULT_CATEGORY, PATTERN_USER_CATEGORY, EXCLUDED_PATTERN_SOURCES, PATTERN_SYNC_TYPES }); return __toCommonJS(index_exports); })(); url.min.js000064400000024137152214270310006472 0ustar00"use strict";var wp;(wp||={}).url=(()=>{var M=Object.create;var l=Object.defineProperty;var Y=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var B=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var W=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Z=(e,t)=>{for(var r in t)l(e,r,{get:t[r],enumerable:!0})},E=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of j(t))!K.call(e,o)&&o!==r&&l(e,o,{get:()=>t[o],enumerable:!(n=Y(t,o))||n.enumerable});return e};var J=(e,t,r)=>(r=e!=null?M(B(e)):{},E(t||!e||!e.__esModule?l(r,"default",{value:e,enumerable:!0}):r,e)),ee=e=>E(l({},"__esModule",{value:!0}),e);var L=W((Me,U)=>{var z={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u1EA4:"A",\u1EAE:"A",\u1EB2:"A",\u1EB4:"A",\u1EB6:"A",\u00C6:"AE",\u1EA6:"A",\u1EB0:"A",\u0202:"A",\u1EA2:"A",\u1EA0:"A",\u1EA8:"A",\u1EAA:"A",\u1EAC:"A",\u00C7:"C",\u1E08:"C",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u1EBE:"E",\u1E16:"E",\u1EC0:"E",\u1E14:"E",\u1E1C:"E",\u0206:"E",\u1EBA:"E",\u1EBC:"E",\u1EB8:"E",\u1EC2:"E",\u1EC4:"E",\u1EC6:"E",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u1E2E:"I",\u020A:"I",\u1EC8:"I",\u1ECA:"I",\u00D0:"D",\u00D1:"N",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u1ED0:"O",\u1E4C:"O",\u1E52:"O",\u020E:"O",\u1ECE:"O",\u1ECC:"O",\u1ED4:"O",\u1ED6:"O",\u1ED8:"O",\u1EDC:"O",\u1EDE:"O",\u1EE0:"O",\u1EDA:"O",\u1EE2:"O",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u1EE6:"U",\u1EE4:"U",\u1EEC:"U",\u1EEE:"U",\u1EF0:"U",\u00DD:"Y",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u1EA5:"a",\u1EAF:"a",\u1EB3:"a",\u1EB5:"a",\u1EB7:"a",\u00E6:"ae",\u1EA7:"a",\u1EB1:"a",\u0203:"a",\u1EA3:"a",\u1EA1:"a",\u1EA9:"a",\u1EAB:"a",\u1EAD:"a",\u00E7:"c",\u1E09:"c",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u1EBF:"e",\u1E17:"e",\u1EC1:"e",\u1E15:"e",\u1E1D:"e",\u0207:"e",\u1EBB:"e",\u1EBD:"e",\u1EB9:"e",\u1EC3:"e",\u1EC5:"e",\u1EC7:"e",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u1E2F:"i",\u020B:"i",\u1EC9:"i",\u1ECB:"i",\u00F0:"d",\u00F1:"n",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u1ED1:"o",\u1E4D:"o",\u1E53:"o",\u020F:"o",\u1ECF:"o",\u1ECD:"o",\u1ED5:"o",\u1ED7:"o",\u1ED9:"o",\u1EDD:"o",\u1EDF:"o",\u1EE1:"o",\u1EDB:"o",\u1EE3:"o",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u1EE7:"u",\u1EE5:"u",\u1EED:"u",\u1EEF:"u",\u1EF1:"u",\u00FD:"y",\u00FF:"y",\u0100:"A",\u0101:"a",\u0102:"A",\u0103:"a",\u0104:"A",\u0105:"a",\u0106:"C",\u0107:"c",\u0108:"C",\u0109:"c",\u010A:"C",\u010B:"c",\u010C:"C",\u010D:"c",C\u0306:"C",c\u0306:"c",\u010E:"D",\u010F:"d",\u0110:"D",\u0111:"d",\u0112:"E",\u0113:"e",\u0114:"E",\u0115:"e",\u0116:"E",\u0117:"e",\u0118:"E",\u0119:"e",\u011A:"E",\u011B:"e",\u011C:"G",\u01F4:"G",\u011D:"g",\u01F5:"g",\u011E:"G",\u011F:"g",\u0120:"G",\u0121:"g",\u0122:"G",\u0123:"g",\u0124:"H",\u0125:"h",\u0126:"H",\u0127:"h",\u1E2A:"H",\u1E2B:"h",\u0128:"I",\u0129:"i",\u012A:"I",\u012B:"i",\u012C:"I",\u012D:"i",\u012E:"I",\u012F:"i",\u0130:"I",\u0131:"i",\u0132:"IJ",\u0133:"ij",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u1E30:"K",\u1E31:"k",K\u0306:"K",k\u0306:"k",\u0139:"L",\u013A:"l",\u013B:"L",\u013C:"l",\u013D:"L",\u013E:"l",\u013F:"L",\u0140:"l",\u0141:"l",\u0142:"l",\u1E3E:"M",\u1E3F:"m",M\u0306:"M",m\u0306:"m",\u0143:"N",\u0144:"n",\u0145:"N",\u0146:"n",\u0147:"N",\u0148:"n",\u0149:"n",N\u0306:"N",n\u0306:"n",\u014C:"O",\u014D:"o",\u014E:"O",\u014F:"o",\u0150:"O",\u0151:"o",\u0152:"OE",\u0153:"oe",P\u0306:"P",p\u0306:"p",\u0154:"R",\u0155:"r",\u0156:"R",\u0157:"r",\u0158:"R",\u0159:"r",R\u0306:"R",r\u0306:"r",\u0212:"R",\u0213:"r",\u015A:"S",\u015B:"s",\u015C:"S",\u015D:"s",\u015E:"S",\u0218:"S",\u0219:"s",\u015F:"s",\u0160:"S",\u0161:"s",\u0162:"T",\u0163:"t",\u021B:"t",\u021A:"T",\u0164:"T",\u0165:"t",\u0166:"T",\u0167:"t",T\u0306:"T",t\u0306:"t",\u0168:"U",\u0169:"u",\u016A:"U",\u016B:"u",\u016C:"U",\u016D:"u",\u016E:"U",\u016F:"u",\u0170:"U",\u0171:"u",\u0172:"U",\u0173:"u",\u0216:"U",\u0217:"u",V\u0306:"V",v\u0306:"v",\u0174:"W",\u0175:"w",\u1E82:"W",\u1E83:"w",X\u0306:"X",x\u0306:"x",\u0176:"Y",\u0177:"y",\u0178:"Y",Y\u0306:"Y",y\u0306:"y",\u0179:"Z",\u017A:"z",\u017B:"Z",\u017C:"z",\u017D:"Z",\u017E:"z",\u017F:"s",\u0192:"f",\u01A0:"O",\u01A1:"o",\u01AF:"U",\u01B0:"u",\u01CD:"A",\u01CE:"a",\u01CF:"I",\u01D0:"i",\u01D1:"O",\u01D2:"o",\u01D3:"U",\u01D4:"u",\u01D5:"U",\u01D6:"u",\u01D7:"U",\u01D8:"u",\u01D9:"U",\u01DA:"u",\u01DB:"U",\u01DC:"u",\u1EE8:"U",\u1EE9:"u",\u1E78:"U",\u1E79:"u",\u01FA:"A",\u01FB:"a",\u01FC:"AE",\u01FD:"ae",\u01FE:"O",\u01FF:"o",\u00DE:"TH",\u00FE:"th",\u1E54:"P",\u1E55:"p",\u1E64:"S",\u1E65:"s",X\u0301:"X",x\u0301:"x",\u0403:"\u0413",\u0453:"\u0433",\u040C:"\u041A",\u045C:"\u043A",A\u030B:"A",a\u030B:"a",E\u030B:"E",e\u030B:"e",I\u030B:"I",i\u030B:"i",\u01F8:"N",\u01F9:"n",\u1ED2:"O",\u1ED3:"o",\u1E50:"O",\u1E51:"o",\u1EEA:"U",\u1EEB:"u",\u1E80:"W",\u1E81:"w",\u1EF2:"Y",\u1EF3:"y",\u0200:"A",\u0201:"a",\u0204:"E",\u0205:"e",\u0208:"I",\u0209:"i",\u020C:"O",\u020D:"o",\u0210:"R",\u0211:"r",\u0214:"U",\u0215:"u",B\u030C:"B",b\u030C:"b",\u010C\u0323:"C",\u010D\u0323:"c",\u00CA\u030C:"E",\u00EA\u030C:"e",F\u030C:"F",f\u030C:"f",\u01E6:"G",\u01E7:"g",\u021E:"H",\u021F:"h",J\u030C:"J",\u01F0:"j",\u01E8:"K",\u01E9:"k",M\u030C:"M",m\u030C:"m",P\u030C:"P",p\u030C:"p",Q\u030C:"Q",q\u030C:"q",\u0158\u0329:"R",\u0159\u0329:"r",\u1E66:"S",\u1E67:"s",V\u030C:"V",v\u030C:"v",W\u030C:"W",w\u030C:"w",X\u030C:"X",x\u030C:"x",Y\u030C:"Y",y\u030C:"y",A\u0327:"A",a\u0327:"a",B\u0327:"B",b\u0327:"b",\u1E10:"D",\u1E11:"d",\u0228:"E",\u0229:"e",\u0190\u0327:"E",\u025B\u0327:"e",\u1E28:"H",\u1E29:"h",I\u0327:"I",i\u0327:"i",\u0197\u0327:"I",\u0268\u0327:"i",M\u0327:"M",m\u0327:"m",O\u0327:"O",o\u0327:"o",Q\u0327:"Q",q\u0327:"q",U\u0327:"U",u\u0327:"u",X\u0327:"X",x\u0327:"x",Z\u0327:"Z",z\u0327:"z",\u0439:"\u0438",\u0419:"\u0418",\u0451:"\u0435",\u0401:"\u0415"},D=Object.keys(z).join("|"),ie=new RegExp(D,"g"),ae=new RegExp(D,"");function se(e){return z[e]}var H=function(e){return e.replace(ie,se)},ce=function(e){return!!e.match(ae)};U.exports=H;U.exports.has=ce;U.exports.remove=H});var pe={};Z(pe,{addQueryArgs:()=>w,buildQueryString:()=>u,cleanForSlug:()=>X,filterURLForDisplay:()=>$,getAuthority:()=>P,getFilename:()=>q,getFragment:()=>A,getPath:()=>d,getPathAndQueryString:()=>b,getProtocol:()=>R,getQueryArg:()=>h,getQueryArgs:()=>s,getQueryString:()=>p,hasQueryArg:()=>N,isEmail:()=>g,isPhoneNumber:()=>I,isURL:()=>O,isValidAuthority:()=>Q,isValidFragment:()=>T,isValidPath:()=>v,isValidProtocol:()=>S,isValidQueryString:()=>C,normalizePath:()=>_,prependHTTP:()=>x,prependHTTPS:()=>G,removeQueryArgs:()=>F,safeDecodeURI:()=>V,safeDecodeURIComponent:()=>y});function O(e){try{return new URL(e),!0}catch{return!1}}var te=/^(mailto:)?[a-z0-9._%+-]+@[a-z0-9][a-z0-9.-]*\.[a-z]{2,63}$/i;function g(e){return te.test(e)}var re=/^(tel:)?(\+)?\d{6,15}$/;function I(e){return e=e.replace(/[-.() ]/g,""),re.test(e)}function R(e){let t=/^([^\s:]+:)/.exec(e);if(t)return t[1]}function S(e){return e?/^[a-z\-.\+]+[0-9]*:$/i.test(e):!1}function P(e){let t=/^[^\/\s:]+:(?:\/\/)?\/?([^\/\s#?]+)[\/#?]{0,1}\S*$/.exec(e);if(t)return t[1]}function Q(e){return e?/^[^\s#?]+$/.test(e):!1}function d(e){let t=/^[^\/\s:]+:(?:\/\/)?[^\/\s#?]+[\/]([^\s#?]+)[#?]{0,1}\S*$/.exec(e);if(t)return t[1]}function v(e){return e?/^[^\s#?]+$/.test(e):!1}function p(e){let t;try{t=new URL(e,"http://example.com").search.substring(1)}catch{}if(t)return t}function u(e){let t="",r=Object.entries(e),n;for(;n=r.shift();){let[o,i]=n;if(Array.isArray(i)||i&&i.constructor===Object){let c=Object.entries(i).reverse();for(let[m,f]of c)r.unshift([`${o}[${m}]`,f])}else i!==void 0&&(i===null&&(i=""),t+="&"+[o,String(i)].map(encodeURIComponent).join("="))}return t.substr(1)}function C(e){return e?/^[^\s#?\/]+$/.test(e):!1}function b(e){let t=d(e),r=p(e),n="/";return t&&(n+=t),r&&(n+=`?${r}`),n}function A(e){let t=/^\S+?(#[^\s\?]*)/.exec(e);if(t)return t[1]}function T(e){return e?/^#[^\s#?\/]*$/.test(e):!1}function y(e){try{return decodeURIComponent(e)}catch{return e}}function oe(e,t,r){let n=t.length,o=n-1;for(let i=0;i{let[n,o=""]=r.split("=").filter(Boolean).map(y);if(n){let i=n.replace(/\]/g,"").split("[");oe(t,i,o)}return t},Object.create(null))}function w(e="",t){if(!t||!Object.keys(t).length)return e;let r=A(e)||"",n=e.replace(r,""),o=e.indexOf("?");return o!==-1&&(t=Object.assign(s(e),t),n=n.substr(0,o)),n+"?"+u(t)+r}function h(e,t){return s(e)[t]}function N(e,t){return h(e,t)!==void 0}function F(e,...t){let r=e.replace(/^[^#]*/,"");e=e.replace(/#.*/,"");let n=e.indexOf("?");if(n===-1)return e+r;let o=s(e),i=e.substr(0,n);t.forEach(m=>delete o[m]);let a=u(o);return(a?i+"?"+a:i)+r}var ne=/^(?:[a-z]+:|#|\?|\.|\/)/i;function x(e){return e&&(e=e.trim(),!ne.test(e)&&!g(e)?"http://"+e:e)}function V(e){try{return decodeURI(e)}catch{return e}}function $(e,t=null){if(!e)return"";let r=e.replace(/^[a-z\-.\+]+[0-9]*:(\/\/)?/i,"").replace(/^www\./i,"");r.match(/^[^\/]+\/$/)&&(r=r.replace("/",""));let n=/\/([^\/?]+)\.(?:[\w]+)(?=\?|$)/;if(!t||r.length<=t||!r.match(n))return r;r=r.split("?")[0];let o=r.split("/"),i=o[o.length-1];if(i.length<=t)return"\u2026"+r.slice(-t);let a=i.lastIndexOf("."),[c,m]=[i.slice(0,a),i.slice(a+1)],f=c.slice(-3)+"."+m;return i.slice(0,t-f.length-1)+"\u2026"+f}var k=J(L(),1);function X(e){return e?(0,k.default)(e).replace(/( |–|—)/g,"-").replace(/[\s\./]+/g,"-").replace(/&\S+?;/g,"").replace(/[^\p{L}\p{N}_-]+/gu,"").toLowerCase().replace(/-+/g,"-").replace(/(^-+)|(-+$)/g,""):""}function q(e){let t;if(e){try{t=new URL(e,"http://example.com").pathname.split("/").pop()}catch{}if(t)return t}}function _(e){let t=e.split("?"),r=t[1],n=t[0];return r?n+"?"+r.split("&").map(o=>o.split("=")).map(o=>o.map(decodeURIComponent)).sort((o,i)=>o[0].localeCompare(i[0])).map(o=>o.map(encodeURIComponent)).map(o=>o.join("=")).join("&"):n}function G(e){return!e||e.startsWith("http://")?e:(e=x(e),e.replace(/^http:/,"https:"))}return ee(pe);})(); components.js000064400017246470152214270310007311 0ustar00"use strict"; var wp; (wp ||= {}).components = (() => { var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __esm = (fn, res) => function __init() { return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; }; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from2, except, desc) => { if (from2 && typeof from2 === "object" || typeof from2 === "function") { for (let key of __getOwnPropNames(from2)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // package-external:@wordpress/primitives var require_primitives = __commonJS({ "package-external:@wordpress/primitives"(exports, module) { module.exports = window.wp.primitives; } }); // package-external:@wordpress/i18n var require_i18n = __commonJS({ "package-external:@wordpress/i18n"(exports, module) { module.exports = window.wp.i18n; } }); // package-external:@wordpress/compose var require_compose = __commonJS({ "package-external:@wordpress/compose"(exports, module) { module.exports = window.wp.compose; } }); // package-external:@wordpress/element var require_element = __commonJS({ "package-external:@wordpress/element"(exports, module) { module.exports = window.wp.element; } }); // vendor-external:react var require_react = __commonJS({ "vendor-external:react"(exports, module) { module.exports = window.React; } }); // vendor-external:react/jsx-runtime var require_jsx_runtime = __commonJS({ "vendor-external:react/jsx-runtime"(exports, module) { module.exports = window.ReactJSXRuntime; } }); // node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js var require_use_sync_external_store_shim_development = __commonJS({ "node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js"(exports) { "use strict"; (function() { function is(x2, y3) { return x2 === y3 && (0 !== x2 || 1 / x2 === 1 / y3) || x2 !== x2 && y3 !== y3; } function useSyncExternalStore$2(subscribe2, getSnapshot) { didWarnOld18Alpha || void 0 === React41.startTransition || (didWarnOld18Alpha = true, console.error( "You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release." )); var value = getSnapshot(); if (!didWarnUncachedGetSnapshot) { var cachedValue = getSnapshot(); objectIs(value, cachedValue) || (console.error( "The result of getSnapshot should be cached to avoid an infinite loop" ), didWarnUncachedGetSnapshot = true); } cachedValue = useState85({ inst: { value, getSnapshot } }); var inst = cachedValue[0].inst, forceUpdate = cachedValue[1]; useLayoutEffect24( function() { inst.value = value; inst.getSnapshot = getSnapshot; checkIfSnapshotChanged(inst) && forceUpdate({ inst }); }, [subscribe2, value, getSnapshot] ); useEffect79( function() { checkIfSnapshotChanged(inst) && forceUpdate({ inst }); return subscribe2(function() { checkIfSnapshotChanged(inst) && forceUpdate({ inst }); }); }, [subscribe2] ); useDebugValue(value); return value; } function checkIfSnapshotChanged(inst) { var latestGetSnapshot = inst.getSnapshot; inst = inst.value; try { var nextValue = latestGetSnapshot(); return !objectIs(inst, nextValue); } catch (error) { return true; } } function useSyncExternalStore$1(subscribe2, getSnapshot) { return getSnapshot(); } "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); var React41 = require_react(), objectIs = "function" === typeof Object.is ? Object.is : is, useState85 = React41.useState, useEffect79 = React41.useEffect, useLayoutEffect24 = React41.useLayoutEffect, useDebugValue = React41.useDebugValue, didWarnOld18Alpha = false, didWarnUncachedGetSnapshot = false, shim = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? useSyncExternalStore$1 : useSyncExternalStore$2; exports.useSyncExternalStore = void 0 !== React41.useSyncExternalStore ? React41.useSyncExternalStore : shim; "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error()); })(); } }); // node_modules/use-sync-external-store/shim/index.js var require_shim = __commonJS({ "node_modules/use-sync-external-store/shim/index.js"(exports, module) { "use strict"; if (false) { module.exports = null; } else { module.exports = require_use_sync_external_store_shim_development(); } } }); // vendor-external:react-dom var require_react_dom = __commonJS({ "vendor-external:react-dom"(exports, module) { module.exports = window.ReactDOM; } }); // package-external:@wordpress/deprecated var require_deprecated = __commonJS({ "package-external:@wordpress/deprecated"(exports, module) { module.exports = window.wp.deprecated; } }); // node_modules/@emotion/memoize/dist/emotion-memoize.esm.js function memoize(fn) { var cache2 = /* @__PURE__ */ Object.create(null); return function(arg) { if (cache2[arg] === void 0) cache2[arg] = fn(arg); return cache2[arg]; }; } var init_emotion_memoize_esm = __esm({ "node_modules/@emotion/memoize/dist/emotion-memoize.esm.js"() { } }); // node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js var emotion_is_prop_valid_esm_exports = {}; __export(emotion_is_prop_valid_esm_exports, { default: () => isPropValid }); var reactPropsRegex, isPropValid; var init_emotion_is_prop_valid_esm = __esm({ "node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js"() { init_emotion_memoize_esm(); reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|disableRemotePlayback|download|draggable|encType|enterKeyHint|fetchpriority|fetchPriority|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|popover|popoverTarget|popoverTargetAction|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; isPropValid = /* @__PURE__ */ memoize( function(prop) { return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111 && prop.charCodeAt(1) === 110 && prop.charCodeAt(2) < 91; } /* Z+1 */ ); } }); // node_modules/react-is/cjs/react-is.development.js var require_react_is_development = __commonJS({ "node_modules/react-is/cjs/react-is.development.js"(exports) { "use strict"; if (true) { (function() { "use strict"; var hasSymbol = typeof Symbol === "function" && Symbol.for; var REACT_ELEMENT_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.element") : 60103; var REACT_PORTAL_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.portal") : 60106; var REACT_FRAGMENT_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.fragment") : 60107; var REACT_STRICT_MODE_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.strict_mode") : 60108; var REACT_PROFILER_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.profiler") : 60114; var REACT_PROVIDER_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.provider") : 60109; var REACT_CONTEXT_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.context") : 60110; var REACT_ASYNC_MODE_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.async_mode") : 60111; var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.concurrent_mode") : 60111; var REACT_FORWARD_REF_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.forward_ref") : 60112; var REACT_SUSPENSE_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.suspense") : 60113; var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.suspense_list") : 60120; var REACT_MEMO_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.memo") : 60115; var REACT_LAZY_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.lazy") : 60116; var REACT_BLOCK_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.block") : 60121; var REACT_FUNDAMENTAL_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.fundamental") : 60117; var REACT_RESPONDER_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.responder") : 60118; var REACT_SCOPE_TYPE = hasSymbol ? /* @__PURE__ */ Symbol.for("react.scope") : 60119; function isValidElementType(type) { return typeof type === "string" || typeof type === "function" || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === "object" && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE); } function typeOf(object) { if (typeof object === "object" && object !== null) { var $$typeof = object.$$typeof; switch ($$typeof) { case REACT_ELEMENT_TYPE: var type = object.type; switch (type) { case REACT_ASYNC_MODE_TYPE: case REACT_CONCURRENT_MODE_TYPE: case REACT_FRAGMENT_TYPE: case REACT_PROFILER_TYPE: case REACT_STRICT_MODE_TYPE: case REACT_SUSPENSE_TYPE: return type; default: var $$typeofType = type && type.$$typeof; switch ($$typeofType) { case REACT_CONTEXT_TYPE: case REACT_FORWARD_REF_TYPE: case REACT_LAZY_TYPE: case REACT_MEMO_TYPE: case REACT_PROVIDER_TYPE: return $$typeofType; default: return $$typeof; } } case REACT_PORTAL_TYPE: return $$typeof; } } return void 0; } var AsyncMode = REACT_ASYNC_MODE_TYPE; var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE; var ContextConsumer = REACT_CONTEXT_TYPE; var ContextProvider = REACT_PROVIDER_TYPE; var Element2 = REACT_ELEMENT_TYPE; var ForwardRef = REACT_FORWARD_REF_TYPE; var Fragment11 = REACT_FRAGMENT_TYPE; var Lazy = REACT_LAZY_TYPE; var Memo = REACT_MEMO_TYPE; var Portal3 = REACT_PORTAL_TYPE; var Profiler = REACT_PROFILER_TYPE; var StrictMode = REACT_STRICT_MODE_TYPE; var Suspense = REACT_SUSPENSE_TYPE; var hasWarnedAboutDeprecatedIsAsyncMode = false; function isAsyncMode(object) { { if (!hasWarnedAboutDeprecatedIsAsyncMode) { hasWarnedAboutDeprecatedIsAsyncMode = true; console["warn"]("The ReactIs.isAsyncMode() alias has been deprecated, and will be removed in React 17+. Update your code to use ReactIs.isConcurrentMode() instead. It has the exact same API."); } } return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE; } function isConcurrentMode(object) { return typeOf(object) === REACT_CONCURRENT_MODE_TYPE; } function isContextConsumer(object) { return typeOf(object) === REACT_CONTEXT_TYPE; } function isContextProvider(object) { return typeOf(object) === REACT_PROVIDER_TYPE; } function isElement2(object) { return typeof object === "object" && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; } function isForwardRef(object) { return typeOf(object) === REACT_FORWARD_REF_TYPE; } function isFragment(object) { return typeOf(object) === REACT_FRAGMENT_TYPE; } function isLazy(object) { return typeOf(object) === REACT_LAZY_TYPE; } function isMemo(object) { return typeOf(object) === REACT_MEMO_TYPE; } function isPortal(object) { return typeOf(object) === REACT_PORTAL_TYPE; } function isProfiler(object) { return typeOf(object) === REACT_PROFILER_TYPE; } function isStrictMode(object) { return typeOf(object) === REACT_STRICT_MODE_TYPE; } function isSuspense(object) { return typeOf(object) === REACT_SUSPENSE_TYPE; } exports.AsyncMode = AsyncMode; exports.ConcurrentMode = ConcurrentMode; exports.ContextConsumer = ContextConsumer; exports.ContextProvider = ContextProvider; exports.Element = Element2; exports.ForwardRef = ForwardRef; exports.Fragment = Fragment11; exports.Lazy = Lazy; exports.Memo = Memo; exports.Portal = Portal3; exports.Profiler = Profiler; exports.StrictMode = StrictMode; exports.Suspense = Suspense; exports.isAsyncMode = isAsyncMode; exports.isConcurrentMode = isConcurrentMode; exports.isContextConsumer = isContextConsumer; exports.isContextProvider = isContextProvider; exports.isElement = isElement2; exports.isForwardRef = isForwardRef; exports.isFragment = isFragment; exports.isLazy = isLazy; exports.isMemo = isMemo; exports.isPortal = isPortal; exports.isProfiler = isProfiler; exports.isStrictMode = isStrictMode; exports.isSuspense = isSuspense; exports.isValidElementType = isValidElementType; exports.typeOf = typeOf; })(); } } }); // node_modules/react-is/index.js var require_react_is = __commonJS({ "node_modules/react-is/index.js"(exports, module) { "use strict"; if (false) { module.exports = null; } else { module.exports = require_react_is_development(); } } }); // node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js var require_hoist_non_react_statics_cjs = __commonJS({ "node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"(exports, module) { "use strict"; var reactIs = require_react_is(); var REACT_STATICS = { childContextTypes: true, contextType: true, contextTypes: true, defaultProps: true, displayName: true, getDefaultProps: true, getDerivedStateFromError: true, getDerivedStateFromProps: true, mixins: true, propTypes: true, type: true }; var KNOWN_STATICS = { name: true, length: true, prototype: true, caller: true, callee: true, arguments: true, arity: true }; var FORWARD_REF_STATICS = { "$$typeof": true, render: true, defaultProps: true, displayName: true, propTypes: true }; var MEMO_STATICS = { "$$typeof": true, compare: true, defaultProps: true, displayName: true, propTypes: true, type: true }; var TYPE_STATICS = {}; TYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS; TYPE_STATICS[reactIs.Memo] = MEMO_STATICS; function getStatics(component) { if (reactIs.isMemo(component)) { return MEMO_STATICS; } return TYPE_STATICS[component["$$typeof"]] || REACT_STATICS; } var defineProperty = Object.defineProperty; var getOwnPropertyNames = Object.getOwnPropertyNames; var getOwnPropertySymbols = Object.getOwnPropertySymbols; var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; var getPrototypeOf = Object.getPrototypeOf; var objectPrototype = Object.prototype; function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) { if (typeof sourceComponent !== "string") { if (objectPrototype) { var inheritedComponent = getPrototypeOf(sourceComponent); if (inheritedComponent && inheritedComponent !== objectPrototype) { hoistNonReactStatics(targetComponent, inheritedComponent, blacklist); } } var keys = getOwnPropertyNames(sourceComponent); if (getOwnPropertySymbols) { keys = keys.concat(getOwnPropertySymbols(sourceComponent)); } var targetStatics = getStatics(targetComponent); var sourceStatics = getStatics(sourceComponent); for (var i3 = 0; i3 < keys.length; ++i3) { var key = keys[i3]; if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) { var descriptor = getOwnPropertyDescriptor(sourceComponent, key); try { defineProperty(targetComponent, key, descriptor); } catch (e3) { } } } } return targetComponent; } module.exports = hoistNonReactStatics; } }); // node_modules/deepmerge/dist/cjs.js var require_cjs = __commonJS({ "node_modules/deepmerge/dist/cjs.js"(exports, module) { "use strict"; var isMergeableObject = function isMergeableObject2(value) { return isNonNullObject(value) && !isSpecial(value); }; function isNonNullObject(value) { return !!value && typeof value === "object"; } function isSpecial(value) { var stringValue = Object.prototype.toString.call(value); return stringValue === "[object RegExp]" || stringValue === "[object Date]" || isReactElement(value); } var canUseSymbol = typeof Symbol === "function" && Symbol.for; var REACT_ELEMENT_TYPE = canUseSymbol ? /* @__PURE__ */ Symbol.for("react.element") : 60103; function isReactElement(value) { return value.$$typeof === REACT_ELEMENT_TYPE; } function emptyTarget(val) { return Array.isArray(val) ? [] : {}; } function cloneUnlessOtherwiseSpecified(value, options2) { return options2.clone !== false && options2.isMergeableObject(value) ? deepmerge2(emptyTarget(value), value, options2) : value; } function defaultArrayMerge(target, source, options2) { return target.concat(source).map(function(element) { return cloneUnlessOtherwiseSpecified(element, options2); }); } function getMergeFunction(key, options2) { if (!options2.customMerge) { return deepmerge2; } var customMerge = options2.customMerge(key); return typeof customMerge === "function" ? customMerge : deepmerge2; } function getEnumerableOwnPropertySymbols(target) { return Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(target).filter(function(symbol4) { return Object.propertyIsEnumerable.call(target, symbol4); }) : []; } function getKeys2(target) { return Object.keys(target).concat(getEnumerableOwnPropertySymbols(target)); } function propertyIsOnObject(object, property) { try { return property in object; } catch (_2) { return false; } } function propertyIsUnsafe(target, key) { return propertyIsOnObject(target, key) && !(Object.hasOwnProperty.call(target, key) && Object.propertyIsEnumerable.call(target, key)); } function mergeObject(target, source, options2) { var destination = {}; if (options2.isMergeableObject(target)) { getKeys2(target).forEach(function(key) { destination[key] = cloneUnlessOtherwiseSpecified(target[key], options2); }); } getKeys2(source).forEach(function(key) { if (propertyIsUnsafe(target, key)) { return; } if (propertyIsOnObject(target, key) && options2.isMergeableObject(source[key])) { destination[key] = getMergeFunction(key, options2)(target[key], source[key], options2); } else { destination[key] = cloneUnlessOtherwiseSpecified(source[key], options2); } }); return destination; } function deepmerge2(target, source, options2) { options2 = options2 || {}; options2.arrayMerge = options2.arrayMerge || defaultArrayMerge; options2.isMergeableObject = options2.isMergeableObject || isMergeableObject; options2.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified; var sourceIsArray = Array.isArray(source); var targetIsArray = Array.isArray(target); var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray; if (!sourceAndTargetTypesMatch) { return cloneUnlessOtherwiseSpecified(source, options2); } else if (sourceIsArray) { return options2.arrayMerge(target, source, options2); } else { return mergeObject(target, source, options2); } } deepmerge2.all = function deepmergeAll(array, options2) { if (!Array.isArray(array)) { throw new Error("first argument should be an array"); } return array.reduce(function(prev2, next2) { return deepmerge2(prev2, next2, options2); }, {}); }; var deepmerge_1 = deepmerge2; module.exports = deepmerge_1; } }); // node_modules/fast-deep-equal/es6/index.js var require_es6 = __commonJS({ "node_modules/fast-deep-equal/es6/index.js"(exports, module) { "use strict"; module.exports = function equal(a3, b3) { if (a3 === b3) return true; if (a3 && b3 && typeof a3 == "object" && typeof b3 == "object") { if (a3.constructor !== b3.constructor) return false; var length2, i3, keys; if (Array.isArray(a3)) { length2 = a3.length; if (length2 != b3.length) return false; for (i3 = length2; i3-- !== 0; ) if (!equal(a3[i3], b3[i3])) return false; return true; } if (a3 instanceof Map && b3 instanceof Map) { if (a3.size !== b3.size) return false; for (i3 of a3.entries()) if (!b3.has(i3[0])) return false; for (i3 of a3.entries()) if (!equal(i3[1], b3.get(i3[0]))) return false; return true; } if (a3 instanceof Set && b3 instanceof Set) { if (a3.size !== b3.size) return false; for (i3 of a3.entries()) if (!b3.has(i3[0])) return false; return true; } if (ArrayBuffer.isView(a3) && ArrayBuffer.isView(b3)) { length2 = a3.length; if (length2 != b3.length) return false; for (i3 = length2; i3-- !== 0; ) if (a3[i3] !== b3[i3]) return false; return true; } if (a3.constructor === RegExp) return a3.source === b3.source && a3.flags === b3.flags; if (a3.valueOf !== Object.prototype.valueOf) return a3.valueOf() === b3.valueOf(); if (a3.toString !== Object.prototype.toString) return a3.toString() === b3.toString(); keys = Object.keys(a3); length2 = keys.length; if (length2 !== Object.keys(b3).length) return false; for (i3 = length2; i3-- !== 0; ) if (!Object.prototype.hasOwnProperty.call(b3, keys[i3])) return false; for (i3 = length2; i3-- !== 0; ) { var key = keys[i3]; if (!equal(a3[key], b3[key])) return false; } return true; } return a3 !== a3 && b3 !== b3; }; } }); // package-external:@wordpress/warning var require_warning = __commonJS({ "package-external:@wordpress/warning"(exports, module) { module.exports = window.wp.warning; } }); // node_modules/highlight-words-core/dist/index.js var require_dist = __commonJS({ "node_modules/highlight-words-core/dist/index.js"(exports, module) { module.exports = /******/ (function(modules) { var installedModules = {}; function __webpack_require__(moduleId) { if (installedModules[moduleId]) return installedModules[moduleId].exports; var module2 = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; modules[moduleId].call(module2.exports, module2, module2.exports, __webpack_require__); module2.loaded = true; return module2.exports; } __webpack_require__.m = modules; __webpack_require__.c = installedModules; __webpack_require__.p = ""; return __webpack_require__(0); })([ /* 0 */ /***/ (function(module2, exports2, __webpack_require__) { module2.exports = __webpack_require__(1); }), /* 1 */ /***/ (function(module2, exports2, __webpack_require__) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); var _utils = __webpack_require__(2); Object.defineProperty(exports2, "combineChunks", { enumerable: true, get: function get() { return _utils.combineChunks; } }); Object.defineProperty(exports2, "fillInChunks", { enumerable: true, get: function get() { return _utils.fillInChunks; } }); Object.defineProperty(exports2, "findAll", { enumerable: true, get: function get() { return _utils.findAll; } }); Object.defineProperty(exports2, "findChunks", { enumerable: true, get: function get() { return _utils.findChunks; } }); }), /* 2 */ /***/ (function(module2, exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); var findAll2 = exports2.findAll = function findAll3(_ref11) { var autoEscape = _ref11.autoEscape, _ref$caseSensitive = _ref11.caseSensitive, caseSensitive = _ref$caseSensitive === void 0 ? false : _ref$caseSensitive, _ref$findChunks = _ref11.findChunks, findChunks = _ref$findChunks === void 0 ? defaultFindChunks : _ref$findChunks, sanitize2 = _ref11.sanitize, searchWords = _ref11.searchWords, textToHighlight = _ref11.textToHighlight; return fillInChunks({ chunksToHighlight: combineChunks({ chunks: findChunks({ autoEscape, caseSensitive, sanitize: sanitize2, searchWords, textToHighlight }) }), totalLength: textToHighlight ? textToHighlight.length : 0 }); }; var combineChunks = exports2.combineChunks = function combineChunks2(_ref25) { var chunks = _ref25.chunks; chunks = chunks.sort(function(first, second) { return first.start - second.start; }).reduce(function(processedChunks, nextChunk) { if (processedChunks.length === 0) { return [nextChunk]; } else { var prevChunk = processedChunks.pop(); if (nextChunk.start <= prevChunk.end) { var endIndex = Math.max(prevChunk.end, nextChunk.end); processedChunks.push({ highlight: false, start: prevChunk.start, end: endIndex }); } else { processedChunks.push(prevChunk, nextChunk); } return processedChunks; } }, []); return chunks; }; var defaultFindChunks = function defaultFindChunks2(_ref32) { var autoEscape = _ref32.autoEscape, caseSensitive = _ref32.caseSensitive, _ref3$sanitize = _ref32.sanitize, sanitize2 = _ref3$sanitize === void 0 ? defaultSanitize : _ref3$sanitize, searchWords = _ref32.searchWords, textToHighlight = _ref32.textToHighlight; textToHighlight = sanitize2(textToHighlight); return searchWords.filter(function(searchWord) { return searchWord; }).reduce(function(chunks, searchWord) { searchWord = sanitize2(searchWord); if (autoEscape) { searchWord = escapeRegExpFn(searchWord); } var regex = new RegExp(searchWord, caseSensitive ? "g" : "gi"); var match4 = void 0; while (match4 = regex.exec(textToHighlight)) { var _start = match4.index; var _end = regex.lastIndex; if (_end > _start) { chunks.push({ highlight: false, start: _start, end: _end }); } if (match4.index === regex.lastIndex) { regex.lastIndex++; } } return chunks; }, []); }; exports2.findChunks = defaultFindChunks; var fillInChunks = exports2.fillInChunks = function fillInChunks2(_ref42) { var chunksToHighlight = _ref42.chunksToHighlight, totalLength = _ref42.totalLength; var allChunks = []; var append2 = function append3(start, end, highlight) { if (end - start > 0) { allChunks.push({ start, end, highlight }); } }; if (chunksToHighlight.length === 0) { append2(0, totalLength, false); } else { var lastIndex = 0; chunksToHighlight.forEach(function(chunk) { append2(lastIndex, chunk.start, false); append2(chunk.start, chunk.end, true); lastIndex = chunk.end; }); append2(lastIndex, totalLength, false); } return allChunks; }; function defaultSanitize(string) { return string; } function escapeRegExpFn(string) { return string.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); } }) /******/ ]); } }); // node_modules/remove-accents/index.js var require_remove_accents = __commonJS({ "node_modules/remove-accents/index.js"(exports, module) { var characterMap = { "\xC0": "A", "\xC1": "A", "\xC2": "A", "\xC3": "A", "\xC4": "A", "\xC5": "A", "\u1EA4": "A", "\u1EAE": "A", "\u1EB2": "A", "\u1EB4": "A", "\u1EB6": "A", "\xC6": "AE", "\u1EA6": "A", "\u1EB0": "A", "\u0202": "A", "\u1EA2": "A", "\u1EA0": "A", "\u1EA8": "A", "\u1EAA": "A", "\u1EAC": "A", "\xC7": "C", "\u1E08": "C", "\xC8": "E", "\xC9": "E", "\xCA": "E", "\xCB": "E", "\u1EBE": "E", "\u1E16": "E", "\u1EC0": "E", "\u1E14": "E", "\u1E1C": "E", "\u0206": "E", "\u1EBA": "E", "\u1EBC": "E", "\u1EB8": "E", "\u1EC2": "E", "\u1EC4": "E", "\u1EC6": "E", "\xCC": "I", "\xCD": "I", "\xCE": "I", "\xCF": "I", "\u1E2E": "I", "\u020A": "I", "\u1EC8": "I", "\u1ECA": "I", "\xD0": "D", "\xD1": "N", "\xD2": "O", "\xD3": "O", "\xD4": "O", "\xD5": "O", "\xD6": "O", "\xD8": "O", "\u1ED0": "O", "\u1E4C": "O", "\u1E52": "O", "\u020E": "O", "\u1ECE": "O", "\u1ECC": "O", "\u1ED4": "O", "\u1ED6": "O", "\u1ED8": "O", "\u1EDC": "O", "\u1EDE": "O", "\u1EE0": "O", "\u1EDA": "O", "\u1EE2": "O", "\xD9": "U", "\xDA": "U", "\xDB": "U", "\xDC": "U", "\u1EE6": "U", "\u1EE4": "U", "\u1EEC": "U", "\u1EEE": "U", "\u1EF0": "U", "\xDD": "Y", "\xE0": "a", "\xE1": "a", "\xE2": "a", "\xE3": "a", "\xE4": "a", "\xE5": "a", "\u1EA5": "a", "\u1EAF": "a", "\u1EB3": "a", "\u1EB5": "a", "\u1EB7": "a", "\xE6": "ae", "\u1EA7": "a", "\u1EB1": "a", "\u0203": "a", "\u1EA3": "a", "\u1EA1": "a", "\u1EA9": "a", "\u1EAB": "a", "\u1EAD": "a", "\xE7": "c", "\u1E09": "c", "\xE8": "e", "\xE9": "e", "\xEA": "e", "\xEB": "e", "\u1EBF": "e", "\u1E17": "e", "\u1EC1": "e", "\u1E15": "e", "\u1E1D": "e", "\u0207": "e", "\u1EBB": "e", "\u1EBD": "e", "\u1EB9": "e", "\u1EC3": "e", "\u1EC5": "e", "\u1EC7": "e", "\xEC": "i", "\xED": "i", "\xEE": "i", "\xEF": "i", "\u1E2F": "i", "\u020B": "i", "\u1EC9": "i", "\u1ECB": "i", "\xF0": "d", "\xF1": "n", "\xF2": "o", "\xF3": "o", "\xF4": "o", "\xF5": "o", "\xF6": "o", "\xF8": "o", "\u1ED1": "o", "\u1E4D": "o", "\u1E53": "o", "\u020F": "o", "\u1ECF": "o", "\u1ECD": "o", "\u1ED5": "o", "\u1ED7": "o", "\u1ED9": "o", "\u1EDD": "o", "\u1EDF": "o", "\u1EE1": "o", "\u1EDB": "o", "\u1EE3": "o", "\xF9": "u", "\xFA": "u", "\xFB": "u", "\xFC": "u", "\u1EE7": "u", "\u1EE5": "u", "\u1EED": "u", "\u1EEF": "u", "\u1EF1": "u", "\xFD": "y", "\xFF": "y", "\u0100": "A", "\u0101": "a", "\u0102": "A", "\u0103": "a", "\u0104": "A", "\u0105": "a", "\u0106": "C", "\u0107": "c", "\u0108": "C", "\u0109": "c", "\u010A": "C", "\u010B": "c", "\u010C": "C", "\u010D": "c", "C\u0306": "C", "c\u0306": "c", "\u010E": "D", "\u010F": "d", "\u0110": "D", "\u0111": "d", "\u0112": "E", "\u0113": "e", "\u0114": "E", "\u0115": "e", "\u0116": "E", "\u0117": "e", "\u0118": "E", "\u0119": "e", "\u011A": "E", "\u011B": "e", "\u011C": "G", "\u01F4": "G", "\u011D": "g", "\u01F5": "g", "\u011E": "G", "\u011F": "g", "\u0120": "G", "\u0121": "g", "\u0122": "G", "\u0123": "g", "\u0124": "H", "\u0125": "h", "\u0126": "H", "\u0127": "h", "\u1E2A": "H", "\u1E2B": "h", "\u0128": "I", "\u0129": "i", "\u012A": "I", "\u012B": "i", "\u012C": "I", "\u012D": "i", "\u012E": "I", "\u012F": "i", "\u0130": "I", "\u0131": "i", "\u0132": "IJ", "\u0133": "ij", "\u0134": "J", "\u0135": "j", "\u0136": "K", "\u0137": "k", "\u1E30": "K", "\u1E31": "k", "K\u0306": "K", "k\u0306": "k", "\u0139": "L", "\u013A": "l", "\u013B": "L", "\u013C": "l", "\u013D": "L", "\u013E": "l", "\u013F": "L", "\u0140": "l", "\u0141": "l", "\u0142": "l", "\u1E3E": "M", "\u1E3F": "m", "M\u0306": "M", "m\u0306": "m", "\u0143": "N", "\u0144": "n", "\u0145": "N", "\u0146": "n", "\u0147": "N", "\u0148": "n", "\u0149": "n", "N\u0306": "N", "n\u0306": "n", "\u014C": "O", "\u014D": "o", "\u014E": "O", "\u014F": "o", "\u0150": "O", "\u0151": "o", "\u0152": "OE", "\u0153": "oe", "P\u0306": "P", "p\u0306": "p", "\u0154": "R", "\u0155": "r", "\u0156": "R", "\u0157": "r", "\u0158": "R", "\u0159": "r", "R\u0306": "R", "r\u0306": "r", "\u0212": "R", "\u0213": "r", "\u015A": "S", "\u015B": "s", "\u015C": "S", "\u015D": "s", "\u015E": "S", "\u0218": "S", "\u0219": "s", "\u015F": "s", "\u0160": "S", "\u0161": "s", "\u0162": "T", "\u0163": "t", "\u021B": "t", "\u021A": "T", "\u0164": "T", "\u0165": "t", "\u0166": "T", "\u0167": "t", "T\u0306": "T", "t\u0306": "t", "\u0168": "U", "\u0169": "u", "\u016A": "U", "\u016B": "u", "\u016C": "U", "\u016D": "u", "\u016E": "U", "\u016F": "u", "\u0170": "U", "\u0171": "u", "\u0172": "U", "\u0173": "u", "\u0216": "U", "\u0217": "u", "V\u0306": "V", "v\u0306": "v", "\u0174": "W", "\u0175": "w", "\u1E82": "W", "\u1E83": "w", "X\u0306": "X", "x\u0306": "x", "\u0176": "Y", "\u0177": "y", "\u0178": "Y", "Y\u0306": "Y", "y\u0306": "y", "\u0179": "Z", "\u017A": "z", "\u017B": "Z", "\u017C": "z", "\u017D": "Z", "\u017E": "z", "\u017F": "s", "\u0192": "f", "\u01A0": "O", "\u01A1": "o", "\u01AF": "U", "\u01B0": "u", "\u01CD": "A", "\u01CE": "a", "\u01CF": "I", "\u01D0": "i", "\u01D1": "O", "\u01D2": "o", "\u01D3": "U", "\u01D4": "u", "\u01D5": "U", "\u01D6": "u", "\u01D7": "U", "\u01D8": "u", "\u01D9": "U", "\u01DA": "u", "\u01DB": "U", "\u01DC": "u", "\u1EE8": "U", "\u1EE9": "u", "\u1E78": "U", "\u1E79": "u", "\u01FA": "A", "\u01FB": "a", "\u01FC": "AE", "\u01FD": "ae", "\u01FE": "O", "\u01FF": "o", "\xDE": "TH", "\xFE": "th", "\u1E54": "P", "\u1E55": "p", "\u1E64": "S", "\u1E65": "s", "X\u0301": "X", "x\u0301": "x", "\u0403": "\u0413", "\u0453": "\u0433", "\u040C": "\u041A", "\u045C": "\u043A", "A\u030B": "A", "a\u030B": "a", "E\u030B": "E", "e\u030B": "e", "I\u030B": "I", "i\u030B": "i", "\u01F8": "N", "\u01F9": "n", "\u1ED2": "O", "\u1ED3": "o", "\u1E50": "O", "\u1E51": "o", "\u1EEA": "U", "\u1EEB": "u", "\u1E80": "W", "\u1E81": "w", "\u1EF2": "Y", "\u1EF3": "y", "\u0200": "A", "\u0201": "a", "\u0204": "E", "\u0205": "e", "\u0208": "I", "\u0209": "i", "\u020C": "O", "\u020D": "o", "\u0210": "R", "\u0211": "r", "\u0214": "U", "\u0215": "u", "B\u030C": "B", "b\u030C": "b", "\u010C\u0323": "C", "\u010D\u0323": "c", "\xCA\u030C": "E", "\xEA\u030C": "e", "F\u030C": "F", "f\u030C": "f", "\u01E6": "G", "\u01E7": "g", "\u021E": "H", "\u021F": "h", "J\u030C": "J", "\u01F0": "j", "\u01E8": "K", "\u01E9": "k", "M\u030C": "M", "m\u030C": "m", "P\u030C": "P", "p\u030C": "p", "Q\u030C": "Q", "q\u030C": "q", "\u0158\u0329": "R", "\u0159\u0329": "r", "\u1E66": "S", "\u1E67": "s", "V\u030C": "V", "v\u030C": "v", "W\u030C": "W", "w\u030C": "w", "X\u030C": "X", "x\u030C": "x", "Y\u030C": "Y", "y\u030C": "y", "A\u0327": "A", "a\u0327": "a", "B\u0327": "B", "b\u0327": "b", "\u1E10": "D", "\u1E11": "d", "\u0228": "E", "\u0229": "e", "\u0190\u0327": "E", "\u025B\u0327": "e", "\u1E28": "H", "\u1E29": "h", "I\u0327": "I", "i\u0327": "i", "\u0197\u0327": "I", "\u0268\u0327": "i", "M\u0327": "M", "m\u0327": "m", "O\u0327": "O", "o\u0327": "o", "Q\u0327": "Q", "q\u0327": "q", "U\u0327": "U", "u\u0327": "u", "X\u0327": "X", "x\u0327": "x", "Z\u0327": "Z", "z\u0327": "z", "\u0439": "\u0438", "\u0419": "\u0418", "\u0451": "\u0435", "\u0401": "\u0415" }; var chars2 = Object.keys(characterMap).join("|"); var allAccents = new RegExp(chars2, "g"); var firstAccent = new RegExp(chars2, ""); function matcher(match4) { return characterMap[match4]; } var removeAccents5 = function(string) { return string.replace(allAccents, matcher); }; var hasAccents = function(string) { return !!string.match(firstAccent); }; module.exports = removeAccents5; module.exports.has = hasAccents; module.exports.remove = removeAccents5; } }); // package-external:@wordpress/rich-text var require_rich_text = __commonJS({ "package-external:@wordpress/rich-text"(exports, module) { module.exports = window.wp.richText; } }); // package-external:@wordpress/a11y var require_a11y = __commonJS({ "package-external:@wordpress/a11y"(exports, module) { module.exports = window.wp.a11y; } }); // package-external:@wordpress/keycodes var require_keycodes = __commonJS({ "package-external:@wordpress/keycodes"(exports, module) { module.exports = window.wp.keycodes; } }); // package-external:@wordpress/is-shallow-equal var require_is_shallow_equal = __commonJS({ "package-external:@wordpress/is-shallow-equal"(exports, module) { module.exports = window.wp.isShallowEqual; } }); // node_modules/gradient-parser/build/node.js var require_node = __commonJS({ "node_modules/gradient-parser/build/node.js"(exports) { var GradientParser = GradientParser || {}; GradientParser.stringify = /* @__PURE__ */ (function() { var visitor = { "visit_linear-gradient": function(node2) { return visitor.visit_gradient(node2); }, "visit_repeating-linear-gradient": function(node2) { return visitor.visit_gradient(node2); }, "visit_radial-gradient": function(node2) { return visitor.visit_gradient(node2); }, "visit_repeating-radial-gradient": function(node2) { return visitor.visit_gradient(node2); }, "visit_gradient": function(node2) { var orientation = visitor.visit(node2.orientation); if (orientation) { orientation += ", "; } return node2.type + "(" + orientation + visitor.visit(node2.colorStops) + ")"; }, "visit_shape": function(node2) { var result = node2.value, at = visitor.visit(node2.at), style2 = visitor.visit(node2.style); if (style2) { result += " " + style2; } if (at) { result += " at " + at; } return result; }, "visit_default-radial": function(node2) { var result = "", at = visitor.visit(node2.at); if (at) { result += at; } return result; }, "visit_extent-keyword": function(node2) { var result = node2.value, at = visitor.visit(node2.at); if (at) { result += " at " + at; } return result; }, "visit_position-keyword": function(node2) { return node2.value; }, "visit_position": function(node2) { return visitor.visit(node2.value.x) + " " + visitor.visit(node2.value.y); }, "visit_%": function(node2) { return node2.value + "%"; }, "visit_em": function(node2) { return node2.value + "em"; }, "visit_px": function(node2) { return node2.value + "px"; }, "visit_calc": function(node2) { return "calc(" + node2.value + ")"; }, "visit_literal": function(node2) { return visitor.visit_color(node2.value, node2); }, "visit_hex": function(node2) { return visitor.visit_color("#" + node2.value, node2); }, "visit_rgb": function(node2) { return visitor.visit_color("rgb(" + node2.value.join(", ") + ")", node2); }, "visit_rgba": function(node2) { return visitor.visit_color("rgba(" + node2.value.join(", ") + ")", node2); }, "visit_hsl": function(node2) { return visitor.visit_color("hsl(" + node2.value[0] + ", " + node2.value[1] + "%, " + node2.value[2] + "%)", node2); }, "visit_hsla": function(node2) { return visitor.visit_color("hsla(" + node2.value[0] + ", " + node2.value[1] + "%, " + node2.value[2] + "%, " + node2.value[3] + ")", node2); }, "visit_var": function(node2) { return visitor.visit_color("var(" + node2.value + ")", node2); }, "visit_color": function(resultColor, node2) { var result = resultColor, length2 = visitor.visit(node2.length); if (length2) { result += " " + length2; } return result; }, "visit_angular": function(node2) { return node2.value + "deg"; }, "visit_directional": function(node2) { return "to " + node2.value; }, "visit_array": function(elements2) { var result = "", size3 = elements2.length; elements2.forEach(function(element, i3) { result += visitor.visit(element); if (i3 < size3 - 1) { result += ", "; } }); return result; }, "visit_object": function(obj) { if (obj.width && obj.height) { return visitor.visit(obj.width) + " " + visitor.visit(obj.height); } return ""; }, "visit": function(element) { if (!element) { return ""; } var result = ""; if (element instanceof Array) { return visitor.visit_array(element); } else if (typeof element === "object" && !element.type) { return visitor.visit_object(element); } else if (element.type) { var nodeVisitor = visitor["visit_" + element.type]; if (nodeVisitor) { return nodeVisitor(element); } else { throw Error("Missing visitor visit_" + element.type); } } else { throw Error("Invalid node."); } } }; return function(root) { return visitor.visit(root); }; })(); var GradientParser = GradientParser || {}; GradientParser.parse = /* @__PURE__ */ (function() { var tokens = { linearGradient: /^(\-(webkit|o|ms|moz)\-)?(linear\-gradient)/i, repeatingLinearGradient: /^(\-(webkit|o|ms|moz)\-)?(repeating\-linear\-gradient)/i, radialGradient: /^(\-(webkit|o|ms|moz)\-)?(radial\-gradient)/i, repeatingRadialGradient: /^(\-(webkit|o|ms|moz)\-)?(repeating\-radial\-gradient)/i, sideOrCorner: /^to (left (top|bottom)|right (top|bottom)|top (left|right)|bottom (left|right)|left|right|top|bottom)/i, extentKeywords: /^(closest\-side|closest\-corner|farthest\-side|farthest\-corner|contain|cover)/, positionKeywords: /^(left|center|right|top|bottom)/i, pixelValue: /^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))px/, percentageValue: /^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))\%/, emValue: /^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))em/, angleValue: /^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))deg/, radianValue: /^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))rad/, startCall: /^\(/, endCall: /^\)/, comma: /^,/, hexColor: /^\#([0-9a-fA-F]+)/, literalColor: /^([a-zA-Z]+)/, rgbColor: /^rgb/i, rgbaColor: /^rgba/i, varColor: /^var/i, calcValue: /^calc/i, variableName: /^(--[a-zA-Z0-9-,\s\#]+)/, number: /^(([0-9]*\.[0-9]+)|([0-9]+\.?))/, hslColor: /^hsl/i, hslaColor: /^hsla/i }; var input = ""; function error(msg) { var err = new Error(input + ": " + msg); err.source = input; throw err; } function getAST() { var ast = matchListDefinitions(); if (input.length > 0) { error("Invalid input not EOF"); } return ast; } function matchListDefinitions() { return matchListing(matchDefinition); } function matchDefinition() { return matchGradient( "linear-gradient", tokens.linearGradient, matchLinearOrientation ) || matchGradient( "repeating-linear-gradient", tokens.repeatingLinearGradient, matchLinearOrientation ) || matchGradient( "radial-gradient", tokens.radialGradient, matchListRadialOrientations ) || matchGradient( "repeating-radial-gradient", tokens.repeatingRadialGradient, matchListRadialOrientations ); } function matchGradient(gradientType, pattern, orientationMatcher) { return matchCall(pattern, function(captures) { var orientation = orientationMatcher(); if (orientation) { if (!scan(tokens.comma)) { error("Missing comma before color stops"); } } return { type: gradientType, orientation, colorStops: matchListing(matchColorStop) }; }); } function matchCall(pattern, callback) { var captures = scan(pattern); if (captures) { if (!scan(tokens.startCall)) { error("Missing ("); } var result = callback(captures); if (!scan(tokens.endCall)) { error("Missing )"); } return result; } } function matchLinearOrientation() { var sideOrCorner = matchSideOrCorner(); if (sideOrCorner) { return sideOrCorner; } var legacyDirection = match4("position-keyword", tokens.positionKeywords, 1); if (legacyDirection) { return { type: "directional", value: legacyDirection.value }; } return matchAngle(); } function matchSideOrCorner() { return match4("directional", tokens.sideOrCorner, 1); } function matchAngle() { return match4("angular", tokens.angleValue, 1) || match4("angular", tokens.radianValue, 1); } function matchListRadialOrientations() { var radialOrientations, radialOrientation = matchRadialOrientation(), lookaheadCache; if (radialOrientation) { radialOrientations = []; radialOrientations.push(radialOrientation); lookaheadCache = input; if (scan(tokens.comma)) { radialOrientation = matchRadialOrientation(); if (radialOrientation) { radialOrientations.push(radialOrientation); } else { input = lookaheadCache; } } } return radialOrientations; } function matchRadialOrientation() { var radialType = matchCircle() || matchEllipse(); if (radialType) { radialType.at = matchAtPosition(); } else { var extent = matchExtentKeyword(); if (extent) { radialType = extent; var positionAt = matchAtPosition(); if (positionAt) { radialType.at = positionAt; } } else { var atPosition = matchAtPosition(); if (atPosition) { radialType = { type: "default-radial", at: atPosition }; } else { var defaultPosition = matchPositioning(); if (defaultPosition) { radialType = { type: "default-radial", at: defaultPosition }; } } } } return radialType; } function matchCircle() { var circle = match4("shape", /^(circle)/i, 0); if (circle) { circle.style = matchLength() || matchExtentKeyword(); } return circle; } function matchEllipse() { var ellipse = match4("shape", /^(ellipse)/i, 0); if (ellipse) { ellipse.style = matchPositioning() || matchDistance() || matchExtentKeyword(); } return ellipse; } function matchExtentKeyword() { return match4("extent-keyword", tokens.extentKeywords, 1); } function matchAtPosition() { if (match4("position", /^at/, 0)) { var positioning = matchPositioning(); if (!positioning) { error("Missing positioning value"); } return positioning; } } function matchPositioning() { var location = matchCoordinates(); if (location.x || location.y) { return { type: "position", value: location }; } } function matchCoordinates() { return { x: matchDistance(), y: matchDistance() }; } function matchListing(matcher) { var captures = matcher(), result = []; if (captures) { result.push(captures); while (scan(tokens.comma)) { captures = matcher(); if (captures) { result.push(captures); } else { error("One extra comma"); } } } return result; } function matchColorStop() { var color2 = matchColor(); if (!color2) { error("Expected color definition"); } color2.length = matchDistance(); return color2; } function matchColor() { return matchHexColor() || matchHSLAColor() || matchHSLColor() || matchRGBAColor() || matchRGBColor() || matchVarColor() || matchLiteralColor(); } function matchLiteralColor() { return match4("literal", tokens.literalColor, 0); } function matchHexColor() { return match4("hex", tokens.hexColor, 1); } function matchRGBColor() { return matchCall(tokens.rgbColor, function() { return { type: "rgb", value: matchListing(matchNumber) }; }); } function matchRGBAColor() { return matchCall(tokens.rgbaColor, function() { return { type: "rgba", value: matchListing(matchNumber) }; }); } function matchVarColor() { return matchCall(tokens.varColor, function() { return { type: "var", value: matchVariableName() }; }); } function matchHSLColor() { return matchCall(tokens.hslColor, function() { var lookahead = scan(tokens.percentageValue); if (lookahead) { error("HSL hue value must be a number in degrees (0-360) or normalized (-360 to 360), not a percentage"); } var hue = matchNumber(); scan(tokens.comma); var captures = scan(tokens.percentageValue); var sat = captures ? captures[1] : null; scan(tokens.comma); captures = scan(tokens.percentageValue); var light = captures ? captures[1] : null; if (!sat || !light) { error("Expected percentage value for saturation and lightness in HSL"); } return { type: "hsl", value: [hue, sat, light] }; }); } function matchHSLAColor() { return matchCall(tokens.hslaColor, function() { var hue = matchNumber(); scan(tokens.comma); var captures = scan(tokens.percentageValue); var sat = captures ? captures[1] : null; scan(tokens.comma); captures = scan(tokens.percentageValue); var light = captures ? captures[1] : null; scan(tokens.comma); var alpha2 = matchNumber(); if (!sat || !light) { error("Expected percentage value for saturation and lightness in HSLA"); } return { type: "hsla", value: [hue, sat, light, alpha2] }; }); } function matchPercentage() { var captures = scan(tokens.percentageValue); return captures ? captures[1] : null; } function matchVariableName() { return scan(tokens.variableName)[1]; } function matchNumber() { return scan(tokens.number)[1]; } function matchDistance() { return match4("%", tokens.percentageValue, 1) || matchPositionKeyword() || matchCalc() || matchLength(); } function matchPositionKeyword() { return match4("position-keyword", tokens.positionKeywords, 1); } function matchCalc() { return matchCall(tokens.calcValue, function() { var openParenCount = 1; var i3 = 0; while (openParenCount > 0 && i3 < input.length) { var char2 = input.charAt(i3); if (char2 === "(") { openParenCount++; } else if (char2 === ")") { openParenCount--; } i3++; } if (openParenCount > 0) { error("Missing closing parenthesis in calc() expression"); } var calcContent = input.substring(0, i3 - 1); consume(i3 - 1); return { type: "calc", value: calcContent }; }); } function matchLength() { return match4("px", tokens.pixelValue, 1) || match4("em", tokens.emValue, 1); } function match4(type, pattern, captureIndex) { var captures = scan(pattern); if (captures) { return { type, value: captures[captureIndex] }; } } function scan(regexp) { var captures, blankCaptures; blankCaptures = /^[\n\r\t\s]+/.exec(input); if (blankCaptures) { consume(blankCaptures[0].length); } captures = regexp.exec(input); if (captures) { consume(captures[0].length); } return captures; } function consume(size3) { input = input.substr(size3); } return function(code) { input = code.toString().trim(); if (input.endsWith(";")) { input = input.slice(0, -1); } return getAST(); }; })(); exports.parse = GradientParser.parse; exports.stringify = GradientParser.stringify; } }); // package-external:@wordpress/dom var require_dom = __commonJS({ "package-external:@wordpress/dom"(exports, module) { module.exports = window.wp.dom; } }); // package-external:@wordpress/date var require_date = __commonJS({ "package-external:@wordpress/date"(exports, module) { module.exports = window.wp.date; } }); // package-external:@wordpress/escape-html var require_escape_html = __commonJS({ "package-external:@wordpress/escape-html"(exports, module) { module.exports = window.wp.escapeHtml; } }); // package-external:@wordpress/html-entities var require_html_entities = __commonJS({ "package-external:@wordpress/html-entities"(exports, module) { module.exports = window.wp.htmlEntities; } }); // node_modules/fast-memoize/src/index.js var require_src = __commonJS({ "node_modules/fast-memoize/src/index.js"(exports, module) { function memoize3(fn, options2) { var cache2 = options2 && options2.cache ? options2.cache : cacheDefault; var serializer = options2 && options2.serializer ? options2.serializer : serializerDefault; var strategy = options2 && options2.strategy ? options2.strategy : strategyDefault; return strategy(fn, { cache: cache2, serializer }); } function isPrimitive(value) { return value == null || typeof value === "number" || typeof value === "boolean"; } function monadic(fn, cache2, serializer, arg) { var cacheKey = isPrimitive(arg) ? arg : serializer(arg); var computedValue = cache2.get(cacheKey); if (typeof computedValue === "undefined") { computedValue = fn.call(this, arg); cache2.set(cacheKey, computedValue); } return computedValue; } function variadic(fn, cache2, serializer) { var args = Array.prototype.slice.call(arguments, 3); var cacheKey = serializer(args); var computedValue = cache2.get(cacheKey); if (typeof computedValue === "undefined") { computedValue = fn.apply(this, args); cache2.set(cacheKey, computedValue); } return computedValue; } function assemble(fn, context, strategy, cache2, serialize2) { return strategy.bind( context, fn, cache2, serialize2 ); } function strategyDefault(fn, options2) { var strategy = fn.length === 1 ? monadic : variadic; return assemble( fn, this, strategy, options2.cache.create(), options2.serializer ); } function strategyVariadic(fn, options2) { var strategy = variadic; return assemble( fn, this, strategy, options2.cache.create(), options2.serializer ); } function strategyMonadic(fn, options2) { var strategy = monadic; return assemble( fn, this, strategy, options2.cache.create(), options2.serializer ); } function serializerDefault() { return JSON.stringify(arguments); } function ObjectWithoutPrototypeCache() { this.cache = /* @__PURE__ */ Object.create(null); } ObjectWithoutPrototypeCache.prototype.has = function(key) { return key in this.cache; }; ObjectWithoutPrototypeCache.prototype.get = function(key) { return this.cache[key]; }; ObjectWithoutPrototypeCache.prototype.set = function(key, value) { this.cache[key] = value; }; var cacheDefault = { create: function create2() { return new ObjectWithoutPrototypeCache(); } }; module.exports = memoize3; module.exports.strategies = { variadic: strategyVariadic, monadic: strategyMonadic }; } }); // package-external:@wordpress/hooks var require_hooks = __commonJS({ "package-external:@wordpress/hooks"(exports, module) { module.exports = window.wp.hooks; } }); // package-external:@wordpress/private-apis var require_private_apis = __commonJS({ "package-external:@wordpress/private-apis"(exports, module) { module.exports = window.wp.privateApis; } }); // packages/components/build-module/index.mjs var index_exports = {}; __export(index_exports, { AlignmentMatrixControl: () => alignment_matrix_control_default, AnglePickerControl: () => angle_picker_control_default, Animate: () => animate_default, Autocomplete: () => Autocomplete, BaseControl: () => base_control_default, BlockQuotation: () => import_primitives36.BlockQuotation, BorderBoxControl: () => component_default24, BorderControl: () => component_default21, BoxControl: () => box_control_default, Button: () => button_default, ButtonGroup: () => button_group_default, Card: () => component_default27, CardBody: () => component_default29, CardDivider: () => component_default31, CardFooter: () => component_default32, CardHeader: () => component_default33, CardMedia: () => component_default34, CheckboxControl: () => checkbox_control_default, Circle: () => import_primitives36.Circle, ClipboardButton: () => ClipboardButton, ColorIndicator: () => color_indicator_default, ColorPalette: () => color_palette_default, ColorPicker: () => LegacyAdapter, ComboboxControl: () => combobox_control_default, Composite: () => Composite22, CustomGradientPicker: () => custom_gradient_picker_default, CustomSelectControl: () => custom_select_control_default, Dashicon: () => dashicon_default, DatePicker: () => date_default, DateTimePicker: () => date_time_default2, Disabled: () => disabled_default, Draggable: () => draggable_default, DropZone: () => drop_zone_default, DropZoneProvider: () => DropZoneProvider, Dropdown: () => dropdown_default, DropdownMenu: () => dropdown_menu_default, DuotonePicker: () => duotone_picker_default, DuotoneSwatch: () => duotone_swatch_default, ExternalLink: () => external_link_default, Fill: () => Fill, Flex: () => component_default3, FlexBlock: () => component_default5, FlexItem: () => component_default4, FocalPointPicker: () => focal_point_picker_default, FocusReturnProvider: () => Provider3, FocusableIframe: () => FocusableIframe, FontSizePicker: () => font_size_picker_default, FormFileUpload: () => form_file_upload_default, FormToggle: () => form_toggle_default, FormTokenField: () => form_token_field_default, G: () => import_primitives36.G, GradientPicker: () => gradient_picker_default, Guide: () => guide_default, GuidePage: () => GuidePage, HorizontalRule: () => import_primitives36.HorizontalRule, Icon: () => icon_default3, IconButton: () => deprecated_default, IsolatedEventContainer: () => isolated_event_container_default, KeyboardShortcuts: () => keyboard_shortcuts_default, Line: () => import_primitives36.Line, MenuGroup: () => menu_group_default, MenuItem: () => menu_item_default, MenuItemsChoice: () => menu_items_choice_default, Modal: () => modal_default, NavigableMenu: () => menu_default2, Navigator: () => Navigator3, Notice: () => notice_default, NoticeList: () => list_default, Panel: () => panel_default, PanelBody: () => body_default, PanelHeader: () => header_default, PanelRow: () => row_default, Path: () => import_primitives36.Path, Placeholder: () => placeholder_default, Polygon: () => import_primitives36.Polygon, Popover: () => popover_default, ProgressBar: () => progress_bar_default, QueryControls: () => query_controls_default, RadioControl: () => radio_control_default, RangeControl: () => range_control_default, Rect: () => import_primitives36.Rect, ResizableBox: () => resizable_box_default, ResponsiveWrapper: () => responsive_wrapper_default, SVG: () => import_primitives36.SVG, SandBox: () => sandbox_default, ScrollLock: () => scroll_lock_default, SearchControl: () => search_control_default, SelectControl: () => select_control_default, Slot: () => Slot3, SlotFillProvider: () => Provider, Snackbar: () => snackbar_default, SnackbarList: () => list_default2, Spinner: () => spinner_default, TabPanel: () => tab_panel_default, TabbableContainer: () => tabbable_default, TextControl: () => text_control_default, TextHighlight: () => text_highlight_default, TextareaControl: () => textarea_control_default, TimePicker: () => time_default, Tip: () => tip_default2, ToggleControl: () => toggle_control_default, Toolbar: () => toolbar_default, ToolbarButton: () => toolbar_button_default, ToolbarDropdownMenu: () => toolbar_dropdown_menu_default, ToolbarGroup: () => toolbar_group_default, ToolbarItem: () => toolbar_item_default, Tooltip: () => tooltip_default, TreeSelect: () => tree_select_default, VisuallyHidden: () => component_default2, __experimentalAlignmentMatrixControl: () => alignment_matrix_control_default, __experimentalApplyValueToSides: () => applyValueToSides, __experimentalBorderBoxControl: () => component_default24, __experimentalBorderControl: () => component_default21, __experimentalBoxControl: () => box_control_default, __experimentalConfirmDialog: () => component_default37, __experimentalDivider: () => component_default30, __experimentalDropdownContentWrapper: () => dropdown_content_wrapper_default, __experimentalElevation: () => component_default25, __experimentalGrid: () => component_default22, __experimentalHStack: () => component_default9, __experimentalHasSplitBorders: () => hasSplitBorders, __experimentalHeading: () => component_default19, __experimentalInputControl: () => input_control_default, __experimentalInputControlPrefixWrapper: () => input_prefix_wrapper_default, __experimentalInputControlSuffixWrapper: () => input_suffix_wrapper_default, __experimentalIsDefinedBorder: () => isDefinedBorder, __experimentalIsEmptyBorder: () => isEmptyBorder, __experimentalItem: () => component_default35, __experimentalItemGroup: () => component_default36, __experimentalNavigation: () => navigation_default, __experimentalNavigationBackButton: () => back_button_default, __experimentalNavigationGroup: () => group_default, __experimentalNavigationItem: () => item_default2, __experimentalNavigationMenu: () => menu_default3, __experimentalNavigatorBackButton: () => NavigatorBackButton2, __experimentalNavigatorButton: () => NavigatorButton2, __experimentalNavigatorProvider: () => NavigatorProvider, __experimentalNavigatorScreen: () => NavigatorScreen2, __experimentalNavigatorToParentButton: () => NavigatorToParentButton2, __experimentalNumberControl: () => number_control_default, __experimentalPaletteEdit: () => palette_edit_default, __experimentalParseQuantityAndUnitFromRawValue: () => parseQuantityAndUnitFromRawValue, __experimentalRadio: () => radio_default, __experimentalRadioGroup: () => radio_group_default, __experimentalScrollable: () => component_default28, __experimentalSpacer: () => component_default6, __experimentalStyleProvider: () => style_provider_default, __experimentalSurface: () => component_default26, __experimentalText: () => component_default8, __experimentalToggleGroupControl: () => component_default12, __experimentalToggleGroupControlOption: () => component_default14, __experimentalToggleGroupControlOptionIcon: () => component_default15, __experimentalToolbarContext: () => toolbar_context_default, __experimentalToolsPanel: () => component_default39, __experimentalToolsPanelContext: () => ToolsPanelContext, __experimentalToolsPanelItem: () => component_default40, __experimentalTreeGrid: () => tree_grid_default, __experimentalTreeGridCell: () => cell_default, __experimentalTreeGridItem: () => item_default3, __experimentalTreeGridRow: () => row_default2, __experimentalTruncate: () => component_default7, __experimentalUnitControl: () => unit_control_default, __experimentalUseCustomUnits: () => useCustomUnits, __experimentalUseNavigator: () => useNavigator, __experimentalUseSlot: () => useSlot, __experimentalUseSlotFills: () => useSlotFills, __experimentalVStack: () => component_default18, __experimentalView: () => component_default, __experimentalZStack: () => component_default41, __unstableAnimatePresence: () => AnimatePresence, __unstableComposite: () => Composite4, __unstableCompositeGroup: () => CompositeGroup4, __unstableCompositeItem: () => CompositeItem4, __unstableDisclosureContent: () => DisclosureContent22, __unstableGetAnimateClassName: () => getAnimateClassName, __unstableMotion: () => motion, __unstableUseAutocompleteProps: () => useAutocompleteProps, __unstableUseCompositeState: () => useCompositeState, __unstableUseNavigateRegions: () => useNavigateRegions, createSlotFill: () => createSlotFill, navigateRegions: () => navigate_regions_default, privateApis: () => privateApis, useBaseControlProps: () => useBaseControlProps, useNavigator: () => useNavigator, withConstrainedTabbing: () => with_constrained_tabbing_default, withFallbackStyles: () => with_fallback_styles_default, withFilters: () => withFilters, withFocusOutside: () => with_focus_outside_default, withFocusReturn: () => with_focus_return_default, withNotices: () => with_notices_default, withSpokenMessages: () => with_spoken_messages_default }); var import_primitives36 = __toESM(require_primitives(), 1); // node_modules/clsx/dist/clsx.mjs function r(e3) { var t4, f3, n3 = ""; if ("string" == typeof e3 || "number" == typeof e3) n3 += e3; else if ("object" == typeof e3) if (Array.isArray(e3)) { var o4 = e3.length; for (t4 = 0; t4 < o4; t4++) e3[t4] && (f3 = r(e3[t4])) && (n3 && (n3 += " "), n3 += f3); } else for (f3 in e3) e3[f3] && (n3 && (n3 += " "), n3 += f3); return n3; } function clsx() { for (var e3, t4, f3 = 0, n3 = "", o4 = arguments.length; f3 < o4; f3++) (e3 = arguments[f3]) && (t4 = r(e3)) && (n3 && (n3 += " "), n3 += t4); return n3; } var clsx_default = clsx; // packages/components/build-module/alignment-matrix-control/index.mjs var import_i18n4 = __toESM(require_i18n(), 1); var import_compose2 = __toESM(require_compose(), 1); var import_element18 = __toESM(require_element(), 1); // node_modules/@ariakit/core/esm/__chunks/XMCVU3LR.js function noop(..._2) { } function shallowEqual(a3, b3) { if (a3 === b3) return true; if (!a3) return false; if (!b3) return false; if (typeof a3 !== "object") return false; if (typeof b3 !== "object") return false; const aKeys = Object.keys(a3); const bKeys = Object.keys(b3); const { length: length2 } = aKeys; if (bKeys.length !== length2) return false; for (const key of aKeys) { if (a3[key] !== b3[key]) { return false; } } return true; } function applyState(argument, currentValue) { if (isUpdater(argument)) { const value = isLazyValue(currentValue) ? currentValue() : currentValue; return argument(value); } return argument; } function isUpdater(argument) { return typeof argument === "function"; } function isLazyValue(value) { return typeof value === "function"; } function hasOwnProperty(object, prop) { if (typeof Object.hasOwn === "function") { return Object.hasOwn(object, prop); } return Object.prototype.hasOwnProperty.call(object, prop); } function chain(...fns) { return (...args) => { for (const fn of fns) { if (typeof fn === "function") { fn(...args); } } }; } function normalizeString(str) { return str.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); } function omit(object, keys) { const result = { ...object }; for (const key of keys) { if (hasOwnProperty(result, key)) { delete result[key]; } } return result; } function pick(object, paths) { const result = {}; for (const key of paths) { if (hasOwnProperty(object, key)) { result[key] = object[key]; } } return result; } function identity(value) { return value; } function invariant(condition, message2) { if (condition) return; if (typeof message2 !== "string") throw new Error("Invariant failed"); throw new Error(message2); } function getKeys(obj) { return Object.keys(obj); } function isFalsyBooleanCallback(booleanOrCallback, ...args) { const result = typeof booleanOrCallback === "function" ? booleanOrCallback(...args) : booleanOrCallback; if (result == null) return false; return !result; } function disabledFromProps(props) { return props.disabled || props["aria-disabled"] === true || props["aria-disabled"] === "true"; } function removeUndefinedValues(obj) { const result = {}; for (const key in obj) { if (obj[key] !== void 0) { result[key] = obj[key]; } } return result; } function defaultValue(...values) { for (const value of values) { if (value !== void 0) return value; } return void 0; } // node_modules/@ariakit/react-core/esm/__chunks/YXGXYGQX.js var import_react = __toESM(require_react(), 1); function setRef(ref, value) { if (typeof ref === "function") { ref(value); } else if (ref) { ref.current = value; } } function isValidElementWithRef(element) { if (!element) return false; if (!(0, import_react.isValidElement)(element)) return false; if ("ref" in element.props) return true; if ("ref" in element) return true; return false; } function getRefProperty(element) { if (!isValidElementWithRef(element)) return null; const props = { ...element.props }; return props.ref || element.ref; } function mergeProps(base, overrides) { const props = { ...base }; for (const key in overrides) { if (!hasOwnProperty(overrides, key)) continue; if (key === "className") { const prop = "className"; props[prop] = base[prop] ? `${base[prop]} ${overrides[prop]}` : overrides[prop]; continue; } if (key === "style") { const prop = "style"; props[prop] = base[prop] ? { ...base[prop], ...overrides[prop] } : overrides[prop]; continue; } const overrideValue = overrides[key]; if (typeof overrideValue === "function" && key.startsWith("on")) { const baseValue = base[key]; if (typeof baseValue === "function") { props[key] = (...args) => { overrideValue(...args); baseValue(...args); }; continue; } } props[key] = overrideValue; } return props; } // node_modules/@ariakit/core/esm/__chunks/3DNM6L6E.js var canUseDOM = checkIsBrowser(); function checkIsBrowser() { var _a; return typeof window !== "undefined" && !!((_a = window.document) == null ? void 0 : _a.createElement); } function getDocument(node2) { if (!node2) return document; if ("self" in node2) return node2.document; return node2.ownerDocument || document; } function getWindow(node2) { if (!node2) return self; if ("self" in node2) return node2.self; return getDocument(node2).defaultView || window; } function getActiveElement(node2, activeDescendant = false) { var _a; const { activeElement } = getDocument(node2); if (!(activeElement == null ? void 0 : activeElement.nodeName)) { return null; } if (isFrame(activeElement) && ((_a = activeElement.contentDocument) == null ? void 0 : _a.body)) { return getActiveElement( activeElement.contentDocument.body, activeDescendant ); } if (activeDescendant) { const id3 = activeElement.getAttribute("aria-activedescendant"); if (id3) { const element = getDocument(activeElement).getElementById(id3); if (element) { return element; } } } return activeElement; } function contains(parent, child) { return parent === child || parent.contains(child); } function isFrame(element) { return element.tagName === "IFRAME"; } function isButton(element) { const tagName = element.tagName.toLowerCase(); if (tagName === "button") return true; if (tagName === "input" && element.type) { return buttonInputTypes.indexOf(element.type) !== -1; } return false; } var buttonInputTypes = [ "button", "color", "file", "image", "reset", "submit" ]; function isVisible(element) { if (typeof element.checkVisibility === "function") { return element.checkVisibility(); } const htmlElement = element; return htmlElement.offsetWidth > 0 || htmlElement.offsetHeight > 0 || element.getClientRects().length > 0; } function isTextField(element) { try { const isTextInput = element instanceof HTMLInputElement && element.selectionStart !== null; const isTextArea = element.tagName === "TEXTAREA"; return isTextInput || isTextArea || false; } catch (_error) { return false; } } function isTextbox(element) { return element.isContentEditable || isTextField(element); } function getTextboxValue(element) { if (isTextField(element)) { return element.value; } if (element.isContentEditable) { const range = getDocument(element).createRange(); range.selectNodeContents(element); return range.toString(); } return ""; } function getTextboxSelection(element) { let start = 0; let end = 0; if (isTextField(element)) { start = element.selectionStart || 0; end = element.selectionEnd || 0; } else if (element.isContentEditable) { const selection = getDocument(element).getSelection(); if ((selection == null ? void 0 : selection.rangeCount) && selection.anchorNode && contains(element, selection.anchorNode) && selection.focusNode && contains(element, selection.focusNode)) { const range = selection.getRangeAt(0); const nextRange = range.cloneRange(); nextRange.selectNodeContents(element); nextRange.setEnd(range.startContainer, range.startOffset); start = nextRange.toString().length; nextRange.setEnd(range.endContainer, range.endOffset); end = nextRange.toString().length; } } return { start, end }; } function getPopupRole(element, fallback) { const allowedPopupRoles = ["dialog", "menu", "listbox", "tree", "grid"]; const role = element == null ? void 0 : element.getAttribute("role"); if (role && allowedPopupRoles.indexOf(role) !== -1) { return role; } return fallback; } function getPopupItemRole(element, fallback) { var _a; const itemRoleByPopupRole = { menu: "menuitem", listbox: "option", tree: "treeitem" }; const popupRole = getPopupRole(element); if (!popupRole) return fallback; const key = popupRole; return (_a = itemRoleByPopupRole[key]) != null ? _a : fallback; } function getScrollingElement(element) { if (!element) return null; const isScrollableOverflow = (overflow) => { if (overflow === "auto") return true; if (overflow === "scroll") return true; return false; }; if (element.clientHeight && element.scrollHeight > element.clientHeight) { const { overflowY } = getComputedStyle(element); if (isScrollableOverflow(overflowY)) return element; } else if (element.clientWidth && element.scrollWidth > element.clientWidth) { const { overflowX } = getComputedStyle(element); if (isScrollableOverflow(overflowX)) return element; } return getScrollingElement(element.parentElement) || document.scrollingElement || document.body; } function sortBasedOnDOMPosition(items, getElement) { const pairs = items.map((item2, index2) => [index2, item2]); let isOrderDifferent = false; pairs.sort(([indexA, a3], [indexB, b3]) => { const elementA = getElement(a3); const elementB = getElement(b3); if (elementA === elementB) return 0; if (!elementA || !elementB) return 0; if (isElementPreceding(elementA, elementB)) { if (indexA > indexB) { isOrderDifferent = true; } return -1; } if (indexA < indexB) { isOrderDifferent = true; } return 1; }); if (isOrderDifferent) { return pairs.map(([_2, item2]) => item2); } return items; } function isElementPreceding(a3, b3) { return Boolean( b3.compareDocumentPosition(a3) & Node.DOCUMENT_POSITION_PRECEDING ); } // node_modules/@ariakit/core/esm/__chunks/SNHYQNEZ.js function isTouchDevice() { return canUseDOM && !!navigator.maxTouchPoints; } function isApple() { if (!canUseDOM) return false; return /mac|iphone|ipad|ipod/i.test(navigator.platform); } function isSafari() { return canUseDOM && isApple() && /apple/i.test(navigator.vendor); } function isFirefox() { return canUseDOM && /firefox\//i.test(navigator.userAgent); } function isMac() { return canUseDOM && navigator.platform.startsWith("Mac") && !isTouchDevice(); } // node_modules/@ariakit/core/esm/utils/events.js function isPortalEvent(event) { return Boolean( event.currentTarget && !contains(event.currentTarget, event.target) ); } function isSelfTarget(event) { return event.target === event.currentTarget; } function isOpeningInNewTab(event) { const element = event.currentTarget; if (!element) return false; const isAppleDevice = isApple(); if (isAppleDevice && !event.metaKey) return false; if (!isAppleDevice && !event.ctrlKey) return false; const tagName = element.tagName.toLowerCase(); if (tagName === "a") return true; if (tagName === "button" && element.type === "submit") return true; if (tagName === "input" && element.type === "submit") return true; return false; } function isDownloading(event) { const element = event.currentTarget; if (!element) return false; const tagName = element.tagName.toLowerCase(); if (!event.altKey) return false; if (tagName === "a") return true; if (tagName === "button" && element.type === "submit") return true; if (tagName === "input" && element.type === "submit") return true; return false; } function fireEvent(element, type, eventInit) { const event = new Event(type, eventInit); return element.dispatchEvent(event); } function fireBlurEvent(element, eventInit) { const event = new FocusEvent("blur", eventInit); const defaultAllowed = element.dispatchEvent(event); const bubbleInit = { ...eventInit, bubbles: true }; element.dispatchEvent(new FocusEvent("focusout", bubbleInit)); return defaultAllowed; } function fireKeyboardEvent(element, type, eventInit) { const event = new KeyboardEvent(type, eventInit); return element.dispatchEvent(event); } function fireClickEvent(element, eventInit) { const event = new MouseEvent("click", eventInit); return element.dispatchEvent(event); } function isFocusEventOutside(event, container) { const containerElement = container || event.currentTarget; const relatedTarget = event.relatedTarget; return !relatedTarget || !contains(containerElement, relatedTarget); } function queueBeforeEvent(element, type, callback, timeout) { const createTimer = (callback2) => { if (timeout) { const timerId2 = setTimeout(callback2, timeout); return () => clearTimeout(timerId2); } const timerId = requestAnimationFrame(callback2); return () => cancelAnimationFrame(timerId); }; const cancelTimer = createTimer(() => { element.removeEventListener(type, callSync, true); callback(); }); const callSync = () => { cancelTimer(); callback(); }; element.addEventListener(type, callSync, { once: true, capture: true }); return cancelTimer; } function addGlobalEventListener(type, listener, options2, scope = window) { const children = []; try { scope.document.addEventListener(type, listener, options2); for (const frame2 of Array.from(scope.frames)) { children.push(addGlobalEventListener(type, listener, options2, frame2)); } } catch (e3) { } const removeEventListener = () => { try { scope.document.removeEventListener(type, listener, options2); } catch (e3) { } for (const remove of children) { remove(); } }; return removeEventListener; } // node_modules/@ariakit/react-core/esm/__chunks/KPHZR4MB.js var React = __toESM(require_react(), 1); var import_react2 = __toESM(require_react(), 1); var _React = { ...React }; var useReactId = _React.useId; var useReactDeferredValue = _React.useDeferredValue; var useReactInsertionEffect = _React.useInsertionEffect; var useSafeLayoutEffect = canUseDOM ? import_react2.useLayoutEffect : import_react2.useEffect; function useInitialValue(value) { const [initialValue2] = (0, import_react2.useState)(value); return initialValue2; } function useLiveRef(value) { const ref = (0, import_react2.useRef)(value); useSafeLayoutEffect(() => { ref.current = value; }); return ref; } function useEvent(callback) { const ref = (0, import_react2.useRef)(() => { throw new Error("Cannot call an event handler while rendering."); }); if (useReactInsertionEffect) { useReactInsertionEffect(() => { ref.current = callback; }); } else { ref.current = callback; } return (0, import_react2.useCallback)((...args) => { var _a; return (_a = ref.current) == null ? void 0 : _a.call(ref, ...args); }, []); } function useTransactionState(callback) { const [state, setState] = (0, import_react2.useState)(null); useSafeLayoutEffect(() => { if (state == null) return; if (!callback) return; let prevState = null; callback((prev2) => { prevState = prev2; return state; }); return () => { callback(prevState); }; }, [state, callback]); return [state, setState]; } function useMergeRefs(...refs) { return (0, import_react2.useMemo)(() => { if (!refs.some(Boolean)) return; return (value) => { for (const ref of refs) { setRef(ref, value); } }; }, refs); } function useId(defaultId) { if (useReactId) { const reactId = useReactId(); if (defaultId) return defaultId; return reactId; } const [id3, setId] = (0, import_react2.useState)(defaultId); useSafeLayoutEffect(() => { if (defaultId || id3) return; const random = Math.random().toString(36).slice(2, 8); setId(`id-${random}`); }, [defaultId, id3]); return defaultId || id3; } function useTagName(refOrElement, type) { const stringOrUndefined = (type2) => { if (typeof type2 !== "string") return; return type2; }; const [tagName, setTagName] = (0, import_react2.useState)(() => stringOrUndefined(type)); useSafeLayoutEffect(() => { const element = refOrElement && "current" in refOrElement ? refOrElement.current : refOrElement; setTagName((element == null ? void 0 : element.tagName.toLowerCase()) || stringOrUndefined(type)); }, [refOrElement, type]); return tagName; } function useAttribute(refOrElement, attributeName, defaultValue2) { const initialValue2 = useInitialValue(defaultValue2); const [attribute, setAttribute2] = (0, import_react2.useState)(initialValue2); (0, import_react2.useEffect)(() => { const element = refOrElement && "current" in refOrElement ? refOrElement.current : refOrElement; if (!element) return; const callback = () => { const value = element.getAttribute(attributeName); setAttribute2(value == null ? initialValue2 : value); }; const observer = new MutationObserver(callback); observer.observe(element, { attributeFilter: [attributeName] }); callback(); return () => observer.disconnect(); }, [refOrElement, attributeName, initialValue2]); return attribute; } function useUpdateEffect(effect, deps) { const mounted = (0, import_react2.useRef)(false); (0, import_react2.useEffect)(() => { if (mounted.current) { return effect(); } mounted.current = true; }, deps); (0, import_react2.useEffect)( () => () => { mounted.current = false; }, [] ); } function useForceUpdate() { return (0, import_react2.useReducer)(() => [], []); } function useBooleanEvent(booleanOrCallback) { return useEvent( typeof booleanOrCallback === "function" ? booleanOrCallback : () => booleanOrCallback ); } function useWrapElement(props, callback, deps = []) { const wrapElement = (0, import_react2.useCallback)( (element) => { if (props.wrapElement) { element = props.wrapElement(element); } return callback(element); }, [...deps, props.wrapElement] ); return { ...props, wrapElement }; } function usePortalRef(portalProp = false, portalRefProp) { const [portalNode, setPortalNode] = (0, import_react2.useState)(null); const portalRef = useMergeRefs(setPortalNode, portalRefProp); const domReady = !portalProp || portalNode; return { portalRef, portalNode, domReady }; } function useMetadataProps(props, key, value) { const parent = props.onLoadedMetadataCapture; const onLoadedMetadataCapture = (0, import_react2.useMemo)(() => { return Object.assign(() => { }, { ...parent, [key]: value }); }, [parent, key, value]); return [parent == null ? void 0 : parent[key], { onLoadedMetadataCapture }]; } var hasInstalledGlobalEventListeners = false; function useIsMouseMoving() { (0, import_react2.useEffect)(() => { if (hasInstalledGlobalEventListeners) return; addGlobalEventListener("mousemove", setMouseMoving, true); addGlobalEventListener("mousedown", resetMouseMoving, true); addGlobalEventListener("mouseup", resetMouseMoving, true); addGlobalEventListener("keydown", resetMouseMoving, true); addGlobalEventListener("scroll", resetMouseMoving, true); hasInstalledGlobalEventListeners = true; }, []); const isMouseMoving = useEvent(() => mouseMoving); return isMouseMoving; } var mouseMoving = false; var previousScreenX = 0; var previousScreenY = 0; function hasMouseMovement(event) { const movementX = event.movementX || event.screenX - previousScreenX; const movementY = event.movementY || event.screenY - previousScreenY; previousScreenX = event.screenX; previousScreenY = event.screenY; return movementX || movementY || false; } function setMouseMoving(event) { if (!hasMouseMovement(event)) return; mouseMoving = true; } function resetMouseMoving() { mouseMoving = false; } // node_modules/@ariakit/react-core/esm/__chunks/GWSL6KNJ.js var React2 = __toESM(require_react(), 1); var import_jsx_runtime = __toESM(require_jsx_runtime(), 1); function forwardRef2(render) { const Role3 = React2.forwardRef( // @ts-ignore Incompatible with React 19 types. Ignore for now. (props, ref) => render({ ...props, ref }) ); Role3.displayName = render.displayName || render.name; return Role3; } function memo2(Component9, propsAreEqual) { return React2.memo(Component9, propsAreEqual); } function createElement(Type, props) { const { wrapElement, render, ...rest } = props; const mergedRef = useMergeRefs(props.ref, getRefProperty(render)); let element; if (React2.isValidElement(render)) { const renderProps = { // @ts-ignore Incompatible with React 19 types. Ignore for now. ...render.props, ref: mergedRef }; element = React2.cloneElement(render, mergeProps(rest, renderProps)); } else if (render) { element = render(rest); } else { element = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Type, { ...rest }); } if (wrapElement) { return wrapElement(element); } return element; } function createHook(useProps) { const useRole3 = (props = {}) => { return useProps(props); }; useRole3.displayName = useProps.name; return useRole3; } function createStoreContext(providers = [], scopedProviders = []) { const context = React2.createContext(void 0); const scopedContext = React2.createContext(void 0); const useContext210 = () => React2.useContext(context); const useScopedContext = (onlyScoped = false) => { const scoped = React2.useContext(scopedContext); const store = useContext210(); if (onlyScoped) return scoped; return scoped || store; }; const useProviderContext = () => { const scoped = React2.useContext(scopedContext); const store = useContext210(); if (scoped && scoped === store) return; return store; }; const ContextProvider = (props) => { return providers.reduceRight( (children, Provider4) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Provider4, { ...props, children }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(context.Provider, { ...props }) ); }; const ScopedContextProvider = (props) => { return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ContextProvider, { ...props, children: scopedProviders.reduceRight( (children, Provider4) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Provider4, { ...props, children }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(scopedContext.Provider, { ...props }) ) }); }; return { context, scopedContext, useContext: useContext210, useScopedContext, useProviderContext, ContextProvider, ScopedContextProvider }; } // node_modules/@ariakit/react-core/esm/__chunks/SMPCIMZM.js var ctx = createStoreContext(); var useCollectionContext = ctx.useContext; var useCollectionScopedContext = ctx.useScopedContext; var useCollectionProviderContext = ctx.useProviderContext; var CollectionContextProvider = ctx.ContextProvider; var CollectionScopedContextProvider = ctx.ScopedContextProvider; // node_modules/@ariakit/react-core/esm/__chunks/AVVXDJMZ.js var import_react3 = __toESM(require_react(), 1); var ctx2 = createStoreContext( [CollectionContextProvider], [CollectionScopedContextProvider] ); var useCompositeContext = ctx2.useContext; var useCompositeScopedContext = ctx2.useScopedContext; var useCompositeProviderContext = ctx2.useProviderContext; var CompositeContextProvider = ctx2.ContextProvider; var CompositeScopedContextProvider = ctx2.ScopedContextProvider; var CompositeItemContext = (0, import_react3.createContext)( void 0 ); var CompositeRowContext = (0, import_react3.createContext)( void 0 ); // node_modules/@ariakit/react-core/esm/__chunks/NF43FNG5.js var ctx3 = createStoreContext( [CompositeContextProvider], [CompositeScopedContextProvider] ); var useTabContext = ctx3.useContext; var useTabScopedContext = ctx3.useScopedContext; var useTabProviderContext = ctx3.useProviderContext; var TabContextProvider = ctx3.ContextProvider; var TabScopedContextProvider = ctx3.ScopedContextProvider; // node_modules/@ariakit/react-core/esm/__chunks/5VQZOHHZ.js var NULL_ITEM = { id: null }; function flipItems(items, activeId, shouldInsertNullItem = false) { const index2 = items.findIndex((item2) => item2.id === activeId); return [ ...items.slice(index2 + 1), ...shouldInsertNullItem ? [NULL_ITEM] : [], ...items.slice(0, index2) ]; } function findFirstEnabledItem(items, excludeId) { return items.find((item2) => { if (excludeId) { return !item2.disabled && item2.id !== excludeId; } return !item2.disabled; }); } function getEnabledItem(store, id3) { if (!id3) return null; return store.item(id3) || null; } function groupItemsByRows(items) { const rows = []; for (const item2 of items) { const row = rows.find((currentRow) => { var _a; return ((_a = currentRow[0]) == null ? void 0 : _a.rowId) === item2.rowId; }); if (row) { row.push(item2); } else { rows.push([item2]); } } return rows; } function selectTextField(element, collapseToEnd = false) { if (isTextField(element)) { element.setSelectionRange( collapseToEnd ? element.value.length : 0, element.value.length ); } else if (element.isContentEditable) { const selection = getDocument(element).getSelection(); selection == null ? void 0 : selection.selectAllChildren(element); if (collapseToEnd) { selection == null ? void 0 : selection.collapseToEnd(); } } } var FOCUS_SILENTLY = /* @__PURE__ */ Symbol("FOCUS_SILENTLY"); function focusSilently(element) { element[FOCUS_SILENTLY] = true; element.focus({ preventScroll: true }); } function silentlyFocused(element) { const isSilentlyFocused = element[FOCUS_SILENTLY]; delete element[FOCUS_SILENTLY]; return isSilentlyFocused; } function isItem(store, element, exclude) { if (!element) return false; if (element === exclude) return false; const item2 = store.item(element.id); if (!item2) return false; if (exclude && item2.element === exclude) return false; return true; } // node_modules/@ariakit/react-core/esm/__chunks/Z2O3VLAQ.js var import_react4 = __toESM(require_react(), 1); var TagName = "div"; var useCollectionItem = createHook( function useCollectionItem2({ store, shouldRegisterItem = true, getItem = identity, // @ts-expect-error This prop may come from a collection renderer. element, ...props }) { const context = useCollectionContext(); store = store || context; const id3 = useId(props.id); const ref = (0, import_react4.useRef)(element); (0, import_react4.useEffect)(() => { const element2 = ref.current; if (!id3) return; if (!element2) return; if (!shouldRegisterItem) return; const item2 = getItem({ id: id3, element: element2 }); return store == null ? void 0 : store.renderItem(item2); }, [id3, shouldRegisterItem, getItem, store]); props = { ...props, ref: useMergeRefs(ref, props.ref) }; return removeUndefinedValues(props); } ); var CollectionItem = forwardRef2(function CollectionItem2(props) { const htmlProps = useCollectionItem(props); return createElement(TagName, htmlProps); }); // node_modules/@ariakit/react-core/esm/__chunks/SWN3JYXT.js var import_react5 = __toESM(require_react(), 1); var FocusableContext = (0, import_react5.createContext)(true); // node_modules/@ariakit/core/esm/utils/focus.js var selector = "input:not([type='hidden']):not([disabled]), select:not([disabled]), textarea:not([disabled]), a[href], button:not([disabled]), [tabindex], summary, iframe, object, embed, area[href], audio[controls], video[controls], [contenteditable]:not([contenteditable='false'])"; function hasNegativeTabIndex(element) { const tabIndex = Number.parseInt(element.getAttribute("tabindex") || "0", 10); return tabIndex < 0; } function isFocusable(element) { if (!element.matches(selector)) return false; if (!isVisible(element)) return false; if (element.closest("[inert]")) return false; return true; } function isTabbable(element) { if (!isFocusable(element)) return false; if (hasNegativeTabIndex(element)) return false; if (!("form" in element)) return true; if (!element.form) return true; if (element.checked) return true; if (element.type !== "radio") return true; const radioGroup = element.form.elements.namedItem(element.name); if (!radioGroup) return true; if (!("length" in radioGroup)) return true; const activeElement = getActiveElement(element); if (!activeElement) return true; if (activeElement === element) return true; if (!("form" in activeElement)) return true; if (activeElement.form !== element.form) return true; if (activeElement.name !== element.name) return true; return false; } function getAllFocusableIn(container, includeContainer) { const elements2 = Array.from( container.querySelectorAll(selector) ); if (includeContainer) { elements2.unshift(container); } const focusableElements2 = elements2.filter(isFocusable); focusableElements2.forEach((element, i3) => { var _a; if (!isFrame(element)) return; const frameBody = (_a = element.contentDocument) == null ? void 0 : _a.body; if (!frameBody) return; focusableElements2.splice(i3, 1, ...getAllFocusableIn(frameBody)); }); return focusableElements2; } function getAllTabbableIn(container, includeContainer, fallbackToFocusable) { const elements2 = Array.from( container.querySelectorAll(selector) ); const tabbableElements = elements2.filter(isTabbable); if (includeContainer && isTabbable(container)) { tabbableElements.unshift(container); } tabbableElements.forEach((element, i3) => { var _a; if (!isFrame(element)) return; const frameBody = (_a = element.contentDocument) == null ? void 0 : _a.body; if (!frameBody) return; const allFrameTabbable = getAllTabbableIn( frameBody, false, fallbackToFocusable ); tabbableElements.splice(i3, 1, ...allFrameTabbable); }); if (!tabbableElements.length && fallbackToFocusable) { return elements2; } return tabbableElements; } function getFirstTabbableIn(container, includeContainer, fallbackToFocusable) { const [first] = getAllTabbableIn( container, includeContainer, fallbackToFocusable ); return first || null; } function getNextTabbableIn(container, includeContainer, fallbackToFirst, fallbackToFocusable) { const activeElement = getActiveElement(container); const allFocusable = getAllFocusableIn(container, includeContainer); const activeIndex = allFocusable.indexOf(activeElement); const nextFocusableElements = allFocusable.slice(activeIndex + 1); return nextFocusableElements.find(isTabbable) || (fallbackToFirst ? allFocusable.find(isTabbable) : null) || (fallbackToFocusable ? nextFocusableElements[0] : null) || null; } function getNextTabbable(fallbackToFirst, fallbackToFocusable) { return getNextTabbableIn( document.body, false, fallbackToFirst, fallbackToFocusable ); } function getPreviousTabbableIn(container, includeContainer, fallbackToLast, fallbackToFocusable) { const activeElement = getActiveElement(container); const allFocusable = getAllFocusableIn(container, includeContainer).reverse(); const activeIndex = allFocusable.indexOf(activeElement); const previousFocusableElements = allFocusable.slice(activeIndex + 1); return previousFocusableElements.find(isTabbable) || (fallbackToLast ? allFocusable.find(isTabbable) : null) || (fallbackToFocusable ? previousFocusableElements[0] : null) || null; } function getPreviousTabbable(fallbackToFirst, fallbackToFocusable) { return getPreviousTabbableIn( document.body, false, fallbackToFirst, fallbackToFocusable ); } function getClosestFocusable(element) { while (element && !isFocusable(element)) { element = element.closest(selector); } return element || null; } function hasFocus(element) { const activeElement = getActiveElement(element); if (!activeElement) return false; if (activeElement === element) return true; const activeDescendant = activeElement.getAttribute("aria-activedescendant"); if (!activeDescendant) return false; return activeDescendant === element.id; } function hasFocusWithin(element) { const activeElement = getActiveElement(element); if (!activeElement) return false; if (contains(element, activeElement)) return true; const activeDescendant = activeElement.getAttribute("aria-activedescendant"); if (!activeDescendant) return false; if (!("id" in element)) return false; if (activeDescendant === element.id) return true; return !!element.querySelector(`#${CSS.escape(activeDescendant)}`); } function focusIfNeeded(element) { if (!hasFocusWithin(element) && isFocusable(element)) { element.focus(); } } function disableFocus(element) { var _a; const currentTabindex = (_a = element.getAttribute("tabindex")) != null ? _a : ""; element.setAttribute("data-tabindex", currentTabindex); element.setAttribute("tabindex", "-1"); } function disableFocusIn(container, includeContainer) { const tabbableElements = getAllTabbableIn(container, includeContainer); for (const element of tabbableElements) { disableFocus(element); } } function restoreFocusIn(container) { const elements2 = container.querySelectorAll("[data-tabindex]"); const restoreTabIndex = (element) => { const tabindex = element.getAttribute("data-tabindex"); element.removeAttribute("data-tabindex"); if (tabindex) { element.setAttribute("tabindex", tabindex); } else { element.removeAttribute("tabindex"); } }; if (container.hasAttribute("data-tabindex")) { restoreTabIndex(container); } for (const element of elements2) { restoreTabIndex(element); } } function focusIntoView(element, options2) { if (!("scrollIntoView" in element)) { element.focus(); } else { element.focus({ preventScroll: true }); element.scrollIntoView({ block: "nearest", inline: "nearest", ...options2 }); } } // node_modules/@ariakit/react-core/esm/__chunks/U6HHPQDW.js var import_react6 = __toESM(require_react(), 1); var TagName2 = "div"; var isSafariBrowser = isSafari(); var alwaysFocusVisibleInputTypes = [ "text", "search", "url", "tel", "email", "password", "number", "date", "month", "week", "time", "datetime", "datetime-local" ]; var safariFocusAncestorSymbol = /* @__PURE__ */ Symbol("safariFocusAncestor"); function isSafariFocusAncestor(element) { if (!element) return false; return !!element[safariFocusAncestorSymbol]; } function markSafariFocusAncestor(element, value) { if (!element) return; element[safariFocusAncestorSymbol] = value; } function isAlwaysFocusVisible(element) { const { tagName, readOnly, type } = element; if (tagName === "TEXTAREA" && !readOnly) return true; if (tagName === "SELECT" && !readOnly) return true; if (tagName === "INPUT" && !readOnly) { return alwaysFocusVisibleInputTypes.includes(type); } if (element.isContentEditable) return true; const role = element.getAttribute("role"); if (role === "combobox" && element.dataset.name) { return true; } return false; } function getLabels(element) { if ("labels" in element) { return element.labels; } return null; } function isNativeCheckboxOrRadio(element) { const tagName = element.tagName.toLowerCase(); if (tagName === "input" && element.type) { return element.type === "radio" || element.type === "checkbox"; } return false; } function isNativeTabbable(tagName) { if (!tagName) return true; return tagName === "button" || tagName === "summary" || tagName === "input" || tagName === "select" || tagName === "textarea" || tagName === "a"; } function supportsDisabledAttribute(tagName) { if (!tagName) return true; return tagName === "button" || tagName === "input" || tagName === "select" || tagName === "textarea"; } function getTabIndex(focusable, trulyDisabled, nativeTabbable, supportsDisabled, tabIndexProp) { if (!focusable) { return tabIndexProp; } if (trulyDisabled) { if (nativeTabbable && !supportsDisabled) { return -1; } return; } if (nativeTabbable) { return tabIndexProp; } return tabIndexProp || 0; } function useDisableEvent(onEvent, disabled) { return useEvent((event) => { onEvent == null ? void 0 : onEvent(event); if (event.defaultPrevented) return; if (disabled) { event.stopPropagation(); event.preventDefault(); } }); } var hasInstalledGlobalEventListeners2 = false; var isKeyboardModality = true; function onGlobalMouseDown(event) { const target = event.target; if (target && "hasAttribute" in target) { if (!target.hasAttribute("data-focus-visible")) { isKeyboardModality = false; } } } function onGlobalKeyDown(event) { if (event.metaKey) return; if (event.ctrlKey) return; if (event.altKey) return; isKeyboardModality = true; } var useFocusable = createHook( function useFocusable2({ focusable = true, accessibleWhenDisabled, autoFocus, onFocusVisible, ...props }) { const ref = (0, import_react6.useRef)(null); (0, import_react6.useEffect)(() => { if (!focusable) return; if (hasInstalledGlobalEventListeners2) return; addGlobalEventListener("mousedown", onGlobalMouseDown, true); addGlobalEventListener("keydown", onGlobalKeyDown, true); hasInstalledGlobalEventListeners2 = true; }, [focusable]); if (isSafariBrowser) { (0, import_react6.useEffect)(() => { if (!focusable) return; const element = ref.current; if (!element) return; if (!isNativeCheckboxOrRadio(element)) return; const labels = getLabels(element); if (!labels) return; const onMouseUp = () => queueMicrotask(() => element.focus()); for (const label of labels) { label.addEventListener("mouseup", onMouseUp); } return () => { for (const label of labels) { label.removeEventListener("mouseup", onMouseUp); } }; }, [focusable]); } const disabled = focusable && disabledFromProps(props); const trulyDisabled = !!disabled && !accessibleWhenDisabled; const [focusVisible, setFocusVisible] = (0, import_react6.useState)(false); (0, import_react6.useEffect)(() => { if (!focusable) return; if (trulyDisabled && focusVisible) { setFocusVisible(false); } }, [focusable, trulyDisabled, focusVisible]); (0, import_react6.useEffect)(() => { if (!focusable) return; if (!focusVisible) return; const element = ref.current; if (!element) return; if (typeof IntersectionObserver === "undefined") return; const observer = new IntersectionObserver(() => { if (!isFocusable(element)) { setFocusVisible(false); } }); observer.observe(element); return () => observer.disconnect(); }, [focusable, focusVisible]); const onKeyPressCapture = useDisableEvent( props.onKeyPressCapture, disabled ); const onMouseDownCapture = useDisableEvent( props.onMouseDownCapture, disabled ); const onClickCapture = useDisableEvent(props.onClickCapture, disabled); const onMouseDownProp = props.onMouseDown; const onMouseDown = useEvent((event) => { onMouseDownProp == null ? void 0 : onMouseDownProp(event); if (event.defaultPrevented) return; if (!focusable) return; const element = event.currentTarget; if (!isSafariBrowser) return; if (isPortalEvent(event)) return; if (!isButton(element) && !isNativeCheckboxOrRadio(element)) return; let receivedFocus = false; const onFocus = () => { receivedFocus = true; }; const options2 = { capture: true, once: true }; element.addEventListener("focusin", onFocus, options2); const focusableContainer = getClosestFocusable(element.parentElement); markSafariFocusAncestor(focusableContainer, true); queueBeforeEvent(element, "mouseup", () => { element.removeEventListener("focusin", onFocus, true); markSafariFocusAncestor(focusableContainer, false); if (receivedFocus) return; focusIfNeeded(element); }); }); const handleFocusVisible = (event, currentTarget) => { if (currentTarget) { event.currentTarget = currentTarget; } if (!focusable) return; const element = event.currentTarget; if (!element) return; if (!hasFocus(element)) return; onFocusVisible == null ? void 0 : onFocusVisible(event); if (event.defaultPrevented) return; element.dataset.focusVisible = "true"; setFocusVisible(true); }; const onKeyDownCaptureProp = props.onKeyDownCapture; const onKeyDownCapture = useEvent((event) => { onKeyDownCaptureProp == null ? void 0 : onKeyDownCaptureProp(event); if (event.defaultPrevented) return; if (!focusable) return; if (focusVisible) return; if (event.metaKey) return; if (event.altKey) return; if (event.ctrlKey) return; if (!isSelfTarget(event)) return; const element = event.currentTarget; const applyFocusVisible = () => handleFocusVisible(event, element); queueBeforeEvent(element, "focusout", applyFocusVisible); }); const onFocusCaptureProp = props.onFocusCapture; const onFocusCapture = useEvent((event) => { onFocusCaptureProp == null ? void 0 : onFocusCaptureProp(event); if (event.defaultPrevented) return; if (!focusable) return; if (!isSelfTarget(event)) { setFocusVisible(false); return; } const element = event.currentTarget; const applyFocusVisible = () => handleFocusVisible(event, element); if (isKeyboardModality || isAlwaysFocusVisible(event.target)) { queueBeforeEvent(event.target, "focusout", applyFocusVisible); } else { setFocusVisible(false); } }); const onBlurProp = props.onBlur; const onBlur = useEvent((event) => { onBlurProp == null ? void 0 : onBlurProp(event); if (!focusable) return; if (!isFocusEventOutside(event)) return; event.currentTarget.removeAttribute("data-focus-visible"); setFocusVisible(false); }); const autoFocusOnShow = (0, import_react6.useContext)(FocusableContext); const autoFocusRef = useEvent((element) => { if (!focusable) return; if (!autoFocus) return; if (!element) return; if (!autoFocusOnShow) return; queueMicrotask(() => { if (hasFocus(element)) return; if (!isFocusable(element)) return; element.focus(); }); }); const tagName = useTagName(ref); const nativeTabbable = focusable && isNativeTabbable(tagName); const supportsDisabled = focusable && supportsDisabledAttribute(tagName); const styleProp = props.style; const style2 = (0, import_react6.useMemo)(() => { if (trulyDisabled) { return { pointerEvents: "none", ...styleProp }; } return styleProp; }, [trulyDisabled, styleProp]); props = { "data-focus-visible": focusable && focusVisible || void 0, "data-autofocus": autoFocus || void 0, "aria-disabled": disabled || void 0, ...props, ref: useMergeRefs(ref, autoFocusRef, props.ref), style: style2, tabIndex: getTabIndex( focusable, trulyDisabled, nativeTabbable, supportsDisabled, props.tabIndex ), disabled: supportsDisabled && trulyDisabled ? true : void 0, // TODO: Test Focusable contentEditable. contentEditable: disabled ? void 0 : props.contentEditable, onKeyPressCapture, onClickCapture, onMouseDownCapture, onMouseDown, onKeyDownCapture, onFocusCapture, onBlur }; return removeUndefinedValues(props); } ); var Focusable = forwardRef2(function Focusable2(props) { const htmlProps = useFocusable(props); return createElement(TagName2, htmlProps); }); // node_modules/@ariakit/react-core/esm/__chunks/PZ3OL7I2.js var import_react7 = __toESM(require_react(), 1); var TagName3 = "button"; function isNativeClick(event) { if (!event.isTrusted) return false; const element = event.currentTarget; if (event.key === "Enter") { return isButton(element) || element.tagName === "SUMMARY" || element.tagName === "A"; } if (event.key === " ") { return isButton(element) || element.tagName === "SUMMARY" || element.tagName === "INPUT" || element.tagName === "SELECT"; } return false; } var symbol = /* @__PURE__ */ Symbol("command"); var useCommand = createHook( function useCommand2({ clickOnEnter = true, clickOnSpace = true, ...props }) { const ref = (0, import_react7.useRef)(null); const [isNativeButton, setIsNativeButton] = (0, import_react7.useState)(false); (0, import_react7.useEffect)(() => { if (!ref.current) return; setIsNativeButton(isButton(ref.current)); }, []); const [active, setActive] = (0, import_react7.useState)(false); const activeRef = (0, import_react7.useRef)(false); const disabled = disabledFromProps(props); const [isDuplicate, metadataProps] = useMetadataProps(props, symbol, true); const onKeyDownProp = props.onKeyDown; const onKeyDown = useEvent((event) => { onKeyDownProp == null ? void 0 : onKeyDownProp(event); const element = event.currentTarget; if (event.defaultPrevented) return; if (isDuplicate) return; if (disabled) return; if (!isSelfTarget(event)) return; if (isTextField(element)) return; if (element.isContentEditable) return; const isEnter = clickOnEnter && event.key === "Enter"; const isSpace = clickOnSpace && event.key === " "; const shouldPreventEnter = event.key === "Enter" && !clickOnEnter; const shouldPreventSpace = event.key === " " && !clickOnSpace; if (shouldPreventEnter || shouldPreventSpace) { event.preventDefault(); return; } if (isEnter || isSpace) { const nativeClick = isNativeClick(event); if (isEnter) { if (!nativeClick) { event.preventDefault(); const { view, ...eventInit } = event; const click = () => fireClickEvent(element, eventInit); if (isFirefox()) { queueBeforeEvent(element, "keyup", click); } else { queueMicrotask(click); } } } else if (isSpace) { activeRef.current = true; if (!nativeClick) { event.preventDefault(); setActive(true); } } } }); const onKeyUpProp = props.onKeyUp; const onKeyUp = useEvent((event) => { onKeyUpProp == null ? void 0 : onKeyUpProp(event); if (event.defaultPrevented) return; if (isDuplicate) return; if (disabled) return; if (event.metaKey) return; const isSpace = clickOnSpace && event.key === " "; if (activeRef.current && isSpace) { activeRef.current = false; if (!isNativeClick(event)) { event.preventDefault(); setActive(false); const element = event.currentTarget; const { view, ...eventInit } = event; queueMicrotask(() => fireClickEvent(element, eventInit)); } } }); props = { "data-active": active || void 0, type: isNativeButton ? "button" : void 0, ...metadataProps, ...props, ref: useMergeRefs(ref, props.ref), onKeyDown, onKeyUp }; props = useFocusable(props); return props; } ); var Command = forwardRef2(function Command2(props) { const htmlProps = useCommand(props); return createElement(TagName3, htmlProps); }); // node_modules/@ariakit/core/esm/__chunks/SXKM4CGU.js function getInternal(store, key) { const internals = store.__unstableInternals; invariant(internals, "Invalid store"); return internals[key]; } function createStore(initialState, ...stores) { let state = initialState; let prevStateBatch = state; let lastUpdate = /* @__PURE__ */ Symbol(); let destroy = noop; const instances = /* @__PURE__ */ new Set(); const updatedKeys = /* @__PURE__ */ new Set(); const setups = /* @__PURE__ */ new Set(); const listeners = /* @__PURE__ */ new Set(); const batchListeners = /* @__PURE__ */ new Set(); const disposables = /* @__PURE__ */ new WeakMap(); const listenerKeys = /* @__PURE__ */ new WeakMap(); const storeSetup = (callback) => { setups.add(callback); return () => setups.delete(callback); }; const storeInit = () => { const initialized = instances.size; const instance = /* @__PURE__ */ Symbol(); instances.add(instance); const maybeDestroy = () => { instances.delete(instance); if (instances.size) return; destroy(); }; if (initialized) return maybeDestroy; const desyncs = getKeys(state).map( (key) => chain( ...stores.map((store) => { var _a; const storeState = (_a = store == null ? void 0 : store.getState) == null ? void 0 : _a.call(store); if (!storeState) return; if (!hasOwnProperty(storeState, key)) return; return sync(store, [key], (state2) => { setState( key, state2[key], // @ts-expect-error - Not public API. This is just to prevent // infinite loops. true ); }); }) ) ); const teardowns = []; for (const setup2 of setups) { teardowns.push(setup2()); } const cleanups2 = stores.map(init); destroy = chain(...desyncs, ...teardowns, ...cleanups2); return maybeDestroy; }; const sub = (keys, listener, set2 = listeners) => { set2.add(listener); listenerKeys.set(listener, keys); return () => { var _a; (_a = disposables.get(listener)) == null ? void 0 : _a(); disposables.delete(listener); listenerKeys.delete(listener); set2.delete(listener); }; }; const storeSubscribe = (keys, listener) => sub(keys, listener); const storeSync = (keys, listener) => { disposables.set(listener, listener(state, state)); return sub(keys, listener); }; const storeBatch = (keys, listener) => { disposables.set(listener, listener(state, prevStateBatch)); return sub(keys, listener, batchListeners); }; const storePick = (keys) => createStore(pick(state, keys), finalStore); const storeOmit = (keys) => createStore(omit(state, keys), finalStore); const getState = () => state; const setState = (key, value, fromStores = false) => { var _a; if (!hasOwnProperty(state, key)) return; const nextValue = applyState(value, state[key]); if (nextValue === state[key]) return; if (!fromStores) { for (const store of stores) { (_a = store == null ? void 0 : store.setState) == null ? void 0 : _a.call(store, key, nextValue); } } const prevState = state; state = { ...state, [key]: nextValue }; const thisUpdate = /* @__PURE__ */ Symbol(); lastUpdate = thisUpdate; updatedKeys.add(key); const run = (listener, prev2, uKeys) => { var _a2; const keys = listenerKeys.get(listener); const updated = (k3) => uKeys ? uKeys.has(k3) : k3 === key; if (!keys || keys.some(updated)) { (_a2 = disposables.get(listener)) == null ? void 0 : _a2(); disposables.set(listener, listener(state, prev2)); } }; for (const listener of listeners) { run(listener, prevState); } queueMicrotask(() => { if (lastUpdate !== thisUpdate) return; const snapshot = state; for (const listener of batchListeners) { run(listener, prevStateBatch, updatedKeys); } prevStateBatch = snapshot; updatedKeys.clear(); }); }; const finalStore = { getState, setState, __unstableInternals: { setup: storeSetup, init: storeInit, subscribe: storeSubscribe, sync: storeSync, batch: storeBatch, pick: storePick, omit: storeOmit } }; return finalStore; } function setup(store, ...args) { if (!store) return; return getInternal(store, "setup")(...args); } function init(store, ...args) { if (!store) return; return getInternal(store, "init")(...args); } function subscribe(store, ...args) { if (!store) return; return getInternal(store, "subscribe")(...args); } function sync(store, ...args) { if (!store) return; return getInternal(store, "sync")(...args); } function batch(store, ...args) { if (!store) return; return getInternal(store, "batch")(...args); } function omit2(store, ...args) { if (!store) return; return getInternal(store, "omit")(...args); } function pick2(store, ...args) { if (!store) return; return getInternal(store, "pick")(...args); } function mergeStore(...stores) { var _a; const initialState = {}; for (const store2 of stores) { const nextState = (_a = store2 == null ? void 0 : store2.getState) == null ? void 0 : _a.call(store2); if (nextState) { Object.assign(initialState, nextState); } } const store = createStore(initialState, ...stores); return Object.assign({}, ...stores, store); } function throwOnConflictingProps(props, store) { if (false) return; if (!store) return; const defaultKeys = Object.entries(props).filter(([key, value]) => key.startsWith("default") && value !== void 0).map(([key]) => { var _a; const stateKey = key.replace("default", ""); return `${((_a = stateKey[0]) == null ? void 0 : _a.toLowerCase()) || ""}${stateKey.slice(1)}`; }); if (!defaultKeys.length) return; const storeState = store.getState(); const conflictingProps = defaultKeys.filter( (key) => hasOwnProperty(storeState, key) ); if (!conflictingProps.length) return; throw new Error( `Passing a store prop in conjunction with a default state is not supported. const store = useSelectStore(); ^ ^ Instead, pass the default state to the topmost store: const store = useSelectStore({ defaultValue: "Apple" }); See https://github.com/ariakit/ariakit/pull/2745 for more details. If there's a particular need for this, please submit a feature request at https://github.com/ariakit/ariakit ` ); } // node_modules/@ariakit/react-core/esm/__chunks/Q5W46E73.js var React3 = __toESM(require_react(), 1); var import_shim = __toESM(require_shim(), 1); var { useSyncExternalStore } = import_shim.default; var noopSubscribe = () => () => { }; function useStoreState(store, keyOrSelector = identity) { const storeSubscribe = React3.useCallback( (callback) => { if (!store) return noopSubscribe(); return subscribe(store, null, callback); }, [store] ); const getSnapshot = () => { const key = typeof keyOrSelector === "string" ? keyOrSelector : null; const selector2 = typeof keyOrSelector === "function" ? keyOrSelector : null; const state = store == null ? void 0 : store.getState(); if (selector2) return selector2(state); if (!state) return; if (!key) return; if (!hasOwnProperty(state, key)) return; return state[key]; }; return useSyncExternalStore(storeSubscribe, getSnapshot, getSnapshot); } function useStoreStateObject(store, object) { const objRef = React3.useRef( {} ); const storeSubscribe = React3.useCallback( (callback) => { if (!store) return noopSubscribe(); return subscribe(store, null, callback); }, [store] ); const getSnapshot = () => { const state = store == null ? void 0 : store.getState(); let updated = false; const obj = objRef.current; for (const prop in object) { const keyOrSelector = object[prop]; if (typeof keyOrSelector === "function") { const value = keyOrSelector(state); if (value !== obj[prop]) { obj[prop] = value; updated = true; } } if (typeof keyOrSelector === "string") { if (!state) continue; if (!hasOwnProperty(state, keyOrSelector)) continue; const value = state[keyOrSelector]; if (value !== obj[prop]) { obj[prop] = value; updated = true; } } } if (updated) { objRef.current = { ...obj }; } return objRef.current; }; return useSyncExternalStore(storeSubscribe, getSnapshot, getSnapshot); } function useStoreProps(store, props, key, setKey) { const value = hasOwnProperty(props, key) ? props[key] : void 0; const setValue = setKey ? props[setKey] : void 0; const propsRef = useLiveRef({ value, setValue }); useSafeLayoutEffect(() => { return sync(store, [key], (state, prev2) => { const { value: value2, setValue: setValue2 } = propsRef.current; if (!setValue2) return; if (state[key] === prev2[key]) return; if (state[key] === value2) return; setValue2(state[key]); }); }, [store, key]); useSafeLayoutEffect(() => { if (value === void 0) return; store.setState(key, value); return batch(store, [key], () => { if (value === void 0) return; store.setState(key, value); }); }); } function useStore(createStore2, props) { const [store, setStore] = React3.useState(() => createStore2(props)); useSafeLayoutEffect(() => init(store), [store]); const useState210 = React3.useCallback( (keyOrSelector) => useStoreState(store, keyOrSelector), [store] ); const memoizedStore = React3.useMemo( () => ({ ...store, useState: useState210 }), [store, useState210] ); const updateStore = useEvent(() => { setStore((store2) => createStore2({ ...props, ...store2.getState() })); }); return [memoizedStore, updateStore]; } // node_modules/@ariakit/react-core/esm/__chunks/WZWDIE3S.js var import_react8 = __toESM(require_react(), 1); var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1); var TagName4 = "button"; function isEditableElement(element) { if (isTextbox(element)) return true; return element.tagName === "INPUT" && !isButton(element); } function getNextPageOffset(scrollingElement, pageUp = false) { const height = scrollingElement.clientHeight; const { top } = scrollingElement.getBoundingClientRect(); const pageSize = Math.max(height * 0.875, height - 40) * 1.5; const pageOffset = pageUp ? height - pageSize + top : pageSize + top; if (scrollingElement.tagName === "HTML") { return pageOffset + scrollingElement.scrollTop; } return pageOffset; } function getItemOffset(itemElement, pageUp = false) { const { top } = itemElement.getBoundingClientRect(); if (pageUp) { return top + itemElement.clientHeight; } return top; } function findNextPageItemId(element, store, next2, pageUp = false) { var _a; if (!store) return; if (!next2) return; const { renderedItems } = store.getState(); const scrollingElement = getScrollingElement(element); if (!scrollingElement) return; const nextPageOffset = getNextPageOffset(scrollingElement, pageUp); let id3; let prevDifference; for (let i3 = 0; i3 < renderedItems.length; i3 += 1) { const previousId = id3; id3 = next2(i3); if (!id3) break; if (id3 === previousId) continue; const itemElement = (_a = getEnabledItem(store, id3)) == null ? void 0 : _a.element; if (!itemElement) continue; const itemOffset = getItemOffset(itemElement, pageUp); const difference = itemOffset - nextPageOffset; const absDifference = Math.abs(difference); if (pageUp && difference <= 0 || !pageUp && difference >= 0) { if (prevDifference !== void 0 && prevDifference < absDifference) { id3 = previousId; } break; } prevDifference = absDifference; } return id3; } function targetIsAnotherItem(event, store) { if (isSelfTarget(event)) return false; return isItem(store, event.target); } var useCompositeItem = createHook( function useCompositeItem2({ store, rowId: rowIdProp, preventScrollOnKeyDown = false, moveOnKeyPress = true, tabbable = false, getItem: getItemProp, "aria-setsize": ariaSetSizeProp, "aria-posinset": ariaPosInSetProp, ...props }) { const context = useCompositeContext(); store = store || context; const id3 = useId(props.id); const ref = (0, import_react8.useRef)(null); const row = (0, import_react8.useContext)(CompositeRowContext); const disabled = disabledFromProps(props); const trulyDisabled = disabled && !props.accessibleWhenDisabled; const { rowId, baseElement, isActiveItem, ariaSetSize, ariaPosInSet, isTabbable: isTabbable2 } = useStoreStateObject(store, { rowId(state) { if (rowIdProp) return rowIdProp; if (!state) return; if (!(row == null ? void 0 : row.baseElement)) return; if (row.baseElement !== state.baseElement) return; return row.id; }, baseElement(state) { return (state == null ? void 0 : state.baseElement) || void 0; }, isActiveItem(state) { return !!state && state.activeId === id3; }, ariaSetSize(state) { if (ariaSetSizeProp != null) return ariaSetSizeProp; if (!state) return; if (!(row == null ? void 0 : row.ariaSetSize)) return; if (row.baseElement !== state.baseElement) return; return row.ariaSetSize; }, ariaPosInSet(state) { if (ariaPosInSetProp != null) return ariaPosInSetProp; if (!state) return; if (!(row == null ? void 0 : row.ariaPosInSet)) return; if (row.baseElement !== state.baseElement) return; const itemsInRow = state.renderedItems.filter( (item2) => item2.rowId === rowId ); return row.ariaPosInSet + itemsInRow.findIndex((item2) => item2.id === id3); }, isTabbable(state) { if (!(state == null ? void 0 : state.renderedItems.length)) return true; if (state.virtualFocus) return false; if (tabbable) return true; if (state.activeId === null) return false; const item2 = store == null ? void 0 : store.item(state.activeId); if (item2 == null ? void 0 : item2.disabled) return true; if (!(item2 == null ? void 0 : item2.element)) return true; return state.activeId === id3; } }); const getItem = (0, import_react8.useCallback)( (item2) => { var _a; const nextItem = { ...item2, id: id3 || item2.id, rowId, disabled: !!trulyDisabled, children: (_a = item2.element) == null ? void 0 : _a.textContent }; if (getItemProp) { return getItemProp(nextItem); } return nextItem; }, [id3, rowId, trulyDisabled, getItemProp] ); const onFocusProp = props.onFocus; const hasFocusedComposite = (0, import_react8.useRef)(false); const onFocus = useEvent((event) => { onFocusProp == null ? void 0 : onFocusProp(event); if (event.defaultPrevented) return; if (isPortalEvent(event)) return; if (!id3) return; if (!store) return; if (targetIsAnotherItem(event, store)) return; const { virtualFocus, baseElement: baseElement2 } = store.getState(); store.setActiveId(id3); if (isTextbox(event.currentTarget)) { selectTextField(event.currentTarget); } if (!virtualFocus) return; if (!isSelfTarget(event)) return; if (isEditableElement(event.currentTarget)) return; if (!(baseElement2 == null ? void 0 : baseElement2.isConnected)) return; if (isSafari() && event.currentTarget.hasAttribute("data-autofocus")) { event.currentTarget.scrollIntoView({ block: "nearest", inline: "nearest" }); } hasFocusedComposite.current = true; const fromComposite = event.relatedTarget === baseElement2 || isItem(store, event.relatedTarget); if (fromComposite) { focusSilently(baseElement2); } else { baseElement2.focus(); } }); const onBlurCaptureProp = props.onBlurCapture; const onBlurCapture = useEvent((event) => { onBlurCaptureProp == null ? void 0 : onBlurCaptureProp(event); if (event.defaultPrevented) return; const state = store == null ? void 0 : store.getState(); if ((state == null ? void 0 : state.virtualFocus) && hasFocusedComposite.current) { hasFocusedComposite.current = false; event.preventDefault(); event.stopPropagation(); } }); const onKeyDownProp = props.onKeyDown; const preventScrollOnKeyDownProp = useBooleanEvent(preventScrollOnKeyDown); const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress); const onKeyDown = useEvent((event) => { onKeyDownProp == null ? void 0 : onKeyDownProp(event); if (event.defaultPrevented) return; if (!isSelfTarget(event)) return; if (!store) return; const { currentTarget } = event; const state = store.getState(); const item2 = store.item(id3); const isGrid2 = !!(item2 == null ? void 0 : item2.rowId); const isVertical = state.orientation !== "horizontal"; const isHorizontal = state.orientation !== "vertical"; const canHomeEnd = () => { if (isGrid2) return true; if (isHorizontal) return true; if (!state.baseElement) return true; if (!isTextField(state.baseElement)) return true; return false; }; const keyMap = { ArrowUp: (isGrid2 || isVertical) && store.up, ArrowRight: (isGrid2 || isHorizontal) && store.next, ArrowDown: (isGrid2 || isVertical) && store.down, ArrowLeft: (isGrid2 || isHorizontal) && store.previous, Home: () => { if (!canHomeEnd()) return; if (!isGrid2 || event.ctrlKey) { return store == null ? void 0 : store.first(); } return store == null ? void 0 : store.previous(-1); }, End: () => { if (!canHomeEnd()) return; if (!isGrid2 || event.ctrlKey) { return store == null ? void 0 : store.last(); } return store == null ? void 0 : store.next(-1); }, PageUp: () => { return findNextPageItemId(currentTarget, store, store == null ? void 0 : store.up, true); }, PageDown: () => { return findNextPageItemId(currentTarget, store, store == null ? void 0 : store.down); } }; const action = keyMap[event.key]; if (action) { if (isTextbox(currentTarget)) { const selection = getTextboxSelection(currentTarget); const isLeft = isHorizontal && event.key === "ArrowLeft"; const isRight = isHorizontal && event.key === "ArrowRight"; const isUp = isVertical && event.key === "ArrowUp"; const isDown = isVertical && event.key === "ArrowDown"; if (isRight || isDown) { const { length: valueLength } = getTextboxValue(currentTarget); if (selection.end !== valueLength) return; } else if ((isLeft || isUp) && selection.start !== 0) return; } const nextId = action(); if (preventScrollOnKeyDownProp(event) || nextId !== void 0) { if (!moveOnKeyPressProp(event)) return; event.preventDefault(); store.move(nextId); } } }); const providerValue = (0, import_react8.useMemo)( () => ({ id: id3, baseElement }), [id3, baseElement] ); props = useWrapElement( props, (element) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(CompositeItemContext.Provider, { value: providerValue, children: element }), [providerValue] ); props = { id: id3, "data-active-item": isActiveItem || void 0, ...props, ref: useMergeRefs(ref, props.ref), tabIndex: isTabbable2 ? props.tabIndex : -1, onFocus, onBlurCapture, onKeyDown }; props = useCommand(props); props = useCollectionItem({ store, ...props, getItem, shouldRegisterItem: id3 ? props.shouldRegisterItem : false }); return removeUndefinedValues({ ...props, "aria-setsize": ariaSetSize, "aria-posinset": ariaPosInSet }); } ); var CompositeItem = memo2( forwardRef2(function CompositeItem2(props) { const htmlProps = useCompositeItem(props); return createElement(TagName4, htmlProps); }) ); // node_modules/@ariakit/react-core/esm/tab/tab.js var import_react9 = __toESM(require_react(), 1); var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1); var TagName5 = "button"; var useTab = createHook(function useTab2({ store, getItem: getItemProp, ...props }) { var _a; const context = useTabScopedContext(); store = store || context; invariant( store, "Tab must be wrapped in a TabList component." ); const defaultId = useId(); const id3 = props.id || defaultId; const dimmed = disabledFromProps(props); const getItem = (0, import_react9.useCallback)( (item2) => { const nextItem = { ...item2, dimmed }; if (getItemProp) { return getItemProp(nextItem); } return nextItem; }, [dimmed, getItemProp] ); const onClickProp = props.onClick; const onClick = useEvent((event) => { onClickProp == null ? void 0 : onClickProp(event); if (event.defaultPrevented) return; store == null ? void 0 : store.setSelectedId(id3); }); const panelId = store.panels.useState( (state) => { var _a2; return (_a2 = state.items.find((item2) => item2.tabId === id3)) == null ? void 0 : _a2.id; } ); const shouldRegisterItem = defaultId ? props.shouldRegisterItem : false; const isActive = store.useState((state) => !!id3 && state.activeId === id3); const selected = store.useState((state) => !!id3 && state.selectedId === id3); const hasActiveItem2 = store.useState((state) => !!store.item(state.activeId)); const canRegisterComposedItem = isActive || selected && !hasActiveItem2; const accessibleWhenDisabled = selected || ((_a = props.accessibleWhenDisabled) != null ? _a : true); const isWithinVirtualFocusComposite = useStoreState( store.combobox || store.composite, "virtualFocus" ); if (isWithinVirtualFocusComposite) { props = { ...props, tabIndex: -1 }; } props = { id: id3, role: "tab", "aria-selected": selected, "aria-controls": panelId || void 0, ...props, onClick }; if (store.composite) { const defaultProps = { id: id3, accessibleWhenDisabled, store: store.composite, shouldRegisterItem: canRegisterComposedItem && shouldRegisterItem, rowId: props.rowId, render: props.render }; props = { ...props, render: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)( CompositeItem, { ...defaultProps, render: store.combobox && store.composite !== store.combobox ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CompositeItem, { ...defaultProps, store: store.combobox }) : defaultProps.render } ) }; } props = useCompositeItem({ store, ...props, accessibleWhenDisabled, getItem, shouldRegisterItem }); return props; }); var Tab = memo2( forwardRef2(function Tab2(props) { const htmlProps = useTab(props); return createElement(TagName5, htmlProps); }) ); // node_modules/@ariakit/core/esm/__chunks/7PRQYBBV.js function toArray(arg) { if (Array.isArray(arg)) { return arg; } return typeof arg !== "undefined" ? [arg] : []; } function flatten2DArray(array) { const flattened = []; for (const row of array) { flattened.push(...row); } return flattened; } function reverseArray(array) { return array.slice().reverse(); } // node_modules/@ariakit/react-core/esm/__chunks/ZMWF7ASR.js var import_react10 = __toESM(require_react(), 1); var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1); var TagName6 = "div"; function isGrid(items) { return items.some((item2) => !!item2.rowId); } function isPrintableKey(event) { const target = event.target; if (target && !isTextField(target)) return false; return event.key.length === 1 && !event.ctrlKey && !event.metaKey; } function isModifierKey(event) { return event.key === "Shift" || event.key === "Control" || event.key === "Alt" || event.key === "Meta"; } function useKeyboardEventProxy(store, onKeyboardEvent, previousElementRef) { return useEvent((event) => { var _a; onKeyboardEvent == null ? void 0 : onKeyboardEvent(event); if (event.defaultPrevented) return; if (event.isPropagationStopped()) return; if (!isSelfTarget(event)) return; if (isModifierKey(event)) return; if (isPrintableKey(event)) return; const state = store.getState(); const activeElement = (_a = getEnabledItem(store, state.activeId)) == null ? void 0 : _a.element; if (!activeElement) return; const { view, ...eventInit } = event; const previousElement = previousElementRef == null ? void 0 : previousElementRef.current; if (activeElement !== previousElement) { activeElement.focus(); } if (!fireKeyboardEvent(activeElement, event.type, eventInit)) { event.preventDefault(); } if (event.currentTarget.contains(activeElement)) { event.stopPropagation(); } }); } function findFirstEnabledItemInTheLastRow(items) { return findFirstEnabledItem( flatten2DArray(reverseArray(groupItemsByRows(items))) ); } function useScheduleFocus(store) { const [scheduled, setScheduled] = (0, import_react10.useState)(false); const schedule = (0, import_react10.useCallback)(() => setScheduled(true), []); const activeItem = store.useState( (state) => getEnabledItem(store, state.activeId) ); (0, import_react10.useEffect)(() => { const activeElement = activeItem == null ? void 0 : activeItem.element; if (!scheduled) return; if (!activeElement) return; setScheduled(false); activeElement.focus({ preventScroll: true }); }, [activeItem, scheduled]); return schedule; } var useComposite = createHook( function useComposite2({ store, composite = true, focusOnMove = composite, moveOnKeyPress = true, ...props }) { const context = useCompositeProviderContext(); store = store || context; invariant( store, "Composite must receive a `store` prop or be wrapped in a CompositeProvider component." ); const ref = (0, import_react10.useRef)(null); const previousElementRef = (0, import_react10.useRef)(null); const scheduleFocus = useScheduleFocus(store); const moves = store.useState("moves"); const [, setBaseElement] = useTransactionState( composite ? store.setBaseElement : null ); (0, import_react10.useEffect)(() => { var _a; if (!store) return; if (!moves) return; if (!composite) return; if (!focusOnMove) return; const { activeId: activeId2 } = store.getState(); const itemElement = (_a = getEnabledItem(store, activeId2)) == null ? void 0 : _a.element; if (!itemElement) return; focusIntoView(itemElement); }, [store, moves, composite, focusOnMove]); useSafeLayoutEffect(() => { if (!store) return; if (!moves) return; if (!composite) return; const { baseElement, activeId: activeId2 } = store.getState(); const isSelfAcive = activeId2 === null; if (!isSelfAcive) return; if (!baseElement) return; const previousElement = previousElementRef.current; previousElementRef.current = null; if (previousElement) { fireBlurEvent(previousElement, { relatedTarget: baseElement }); } if (!hasFocus(baseElement)) { baseElement.focus(); } }, [store, moves, composite]); const activeId = store.useState("activeId"); const virtualFocus = store.useState("virtualFocus"); useSafeLayoutEffect(() => { var _a; if (!store) return; if (!composite) return; if (!virtualFocus) return; const previousElement = previousElementRef.current; previousElementRef.current = null; if (!previousElement) return; const activeElement = (_a = getEnabledItem(store, activeId)) == null ? void 0 : _a.element; const relatedTarget = activeElement || getActiveElement(previousElement); if (relatedTarget === previousElement) return; fireBlurEvent(previousElement, { relatedTarget }); }, [store, activeId, virtualFocus, composite]); const onKeyDownCapture = useKeyboardEventProxy( store, props.onKeyDownCapture, previousElementRef ); const onKeyUpCapture = useKeyboardEventProxy( store, props.onKeyUpCapture, previousElementRef ); const onFocusCaptureProp = props.onFocusCapture; const onFocusCapture = useEvent((event) => { onFocusCaptureProp == null ? void 0 : onFocusCaptureProp(event); if (event.defaultPrevented) return; if (!store) return; const { virtualFocus: virtualFocus2 } = store.getState(); if (!virtualFocus2) return; const previousActiveElement = event.relatedTarget; const isSilentlyFocused = silentlyFocused(event.currentTarget); if (isSelfTarget(event) && isSilentlyFocused) { event.stopPropagation(); previousElementRef.current = previousActiveElement; } }); const onFocusProp = props.onFocus; const onFocus = useEvent((event) => { onFocusProp == null ? void 0 : onFocusProp(event); if (event.defaultPrevented) return; if (!composite) return; if (!store) return; const { relatedTarget } = event; const { virtualFocus: virtualFocus2 } = store.getState(); if (virtualFocus2) { if (isSelfTarget(event) && !isItem(store, relatedTarget)) { queueMicrotask(scheduleFocus); } } else if (isSelfTarget(event)) { store.setActiveId(null); } }); const onBlurCaptureProp = props.onBlurCapture; const onBlurCapture = useEvent((event) => { var _a; onBlurCaptureProp == null ? void 0 : onBlurCaptureProp(event); if (event.defaultPrevented) return; if (!store) return; const { virtualFocus: virtualFocus2, activeId: activeId2 } = store.getState(); if (!virtualFocus2) return; const activeElement = (_a = getEnabledItem(store, activeId2)) == null ? void 0 : _a.element; const nextActiveElement = event.relatedTarget; const nextActiveElementIsItem = isItem(store, nextActiveElement); const previousElement = previousElementRef.current; previousElementRef.current = null; if (isSelfTarget(event) && nextActiveElementIsItem) { if (nextActiveElement === activeElement) { if (previousElement && previousElement !== nextActiveElement) { fireBlurEvent(previousElement, event); } } else if (activeElement) { fireBlurEvent(activeElement, event); } else if (previousElement) { fireBlurEvent(previousElement, event); } event.stopPropagation(); } else { const targetIsItem = isItem(store, event.target); if (!targetIsItem && activeElement) { fireBlurEvent(activeElement, event); } } }); const onKeyDownProp = props.onKeyDown; const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress); const onKeyDown = useEvent((event) => { var _a; onKeyDownProp == null ? void 0 : onKeyDownProp(event); if (event.nativeEvent.isComposing) return; if (event.defaultPrevented) return; if (!store) return; if (!isSelfTarget(event)) return; const { orientation, renderedItems, activeId: activeId2 } = store.getState(); const activeItem = getEnabledItem(store, activeId2); if ((_a = activeItem == null ? void 0 : activeItem.element) == null ? void 0 : _a.isConnected) return; const isVertical = orientation !== "horizontal"; const isHorizontal = orientation !== "vertical"; const grid = isGrid(renderedItems); const isHorizontalKey = event.key === "ArrowLeft" || event.key === "ArrowRight" || event.key === "Home" || event.key === "End"; if (isHorizontalKey && isTextField(event.currentTarget)) return; const up = () => { if (grid) { const item2 = findFirstEnabledItemInTheLastRow(renderedItems); return item2 == null ? void 0 : item2.id; } return store == null ? void 0 : store.last(); }; const keyMap = { ArrowUp: (grid || isVertical) && up, ArrowRight: (grid || isHorizontal) && store.first, ArrowDown: (grid || isVertical) && store.first, ArrowLeft: (grid || isHorizontal) && store.last, Home: store.first, End: store.last, PageUp: store.first, PageDown: store.last }; const action = keyMap[event.key]; if (action) { const id3 = action(); if (id3 !== void 0) { if (!moveOnKeyPressProp(event)) return; event.preventDefault(); store.move(id3); } } }); props = useWrapElement( props, (element) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(CompositeContextProvider, { value: store, children: element }), [store] ); const activeDescendant = store.useState((state) => { var _a; if (!store) return; if (!composite) return; if (!state.virtualFocus) return; return (_a = getEnabledItem(store, state.activeId)) == null ? void 0 : _a.id; }); props = { "aria-activedescendant": activeDescendant, ...props, ref: useMergeRefs(ref, setBaseElement, props.ref), onKeyDownCapture, onKeyUpCapture, onFocusCapture, onFocus, onBlurCapture, onKeyDown }; const focusable = store.useState( (state) => composite && (state.virtualFocus || state.activeId === null) ); props = useFocusable({ focusable, ...props }); return props; } ); var Composite = forwardRef2(function Composite2(props) { const htmlProps = useComposite(props); return createElement(TagName6, htmlProps); }); // node_modules/@ariakit/react-core/esm/tab/tab-list.js var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1); var TagName7 = "div"; var useTabList = createHook( function useTabList2({ store, ...props }) { const context = useTabProviderContext(); store = store || context; invariant( store, "TabList must receive a `store` prop or be wrapped in a TabProvider component." ); const orientation = store.useState( (state) => state.orientation === "both" ? void 0 : state.orientation ); props = useWrapElement( props, (element) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(TabScopedContextProvider, { value: store, children: element }), [store] ); if (store.composite) { props = { focusable: false, ...props }; } props = { role: "tablist", "aria-orientation": orientation, ...props }; props = useComposite({ store, ...props }); return props; } ); var TabList = forwardRef2(function TabList2(props) { const htmlProps = useTabList(props); return createElement(TagName7, htmlProps); }); // node_modules/@ariakit/react-core/esm/__chunks/LVDQFHCH.js var ctx4 = createStoreContext(); var useDisclosureContext = ctx4.useContext; var useDisclosureScopedContext = ctx4.useScopedContext; var useDisclosureProviderContext = ctx4.useProviderContext; var DisclosureContextProvider = ctx4.ContextProvider; var DisclosureScopedContextProvider = ctx4.ScopedContextProvider; // node_modules/@ariakit/react-core/esm/__chunks/A62MDFCW.js var import_react11 = __toESM(require_react(), 1); var ctx5 = createStoreContext( [DisclosureContextProvider], [DisclosureScopedContextProvider] ); var useDialogContext = ctx5.useContext; var useDialogScopedContext = ctx5.useScopedContext; var useDialogProviderContext = ctx5.useProviderContext; var DialogContextProvider = ctx5.ContextProvider; var DialogScopedContextProvider = ctx5.ScopedContextProvider; var DialogHeadingContext = (0, import_react11.createContext)(void 0); var DialogDescriptionContext = (0, import_react11.createContext)(void 0); // node_modules/@ariakit/react-core/esm/__chunks/6B3RXHKP.js var import_react12 = __toESM(require_react(), 1); var import_react_dom = __toESM(require_react_dom(), 1); var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1); var TagName8 = "div"; function afterTimeout(timeoutMs, cb) { const timeoutId = setTimeout(cb, timeoutMs); return () => clearTimeout(timeoutId); } function afterPaint2(cb) { let raf = requestAnimationFrame(() => { raf = requestAnimationFrame(cb); }); return () => cancelAnimationFrame(raf); } function parseCSSTime(...times) { return times.join(", ").split(", ").reduce((longestTime, currentTimeString) => { const multiplier = currentTimeString.endsWith("ms") ? 1 : 1e3; const currentTime = Number.parseFloat(currentTimeString || "0s") * multiplier; if (currentTime > longestTime) return currentTime; return longestTime; }, 0); } function isHidden(mounted, hidden, alwaysVisible) { return !alwaysVisible && hidden !== false && (!mounted || !!hidden); } var useDisclosureContent = createHook(function useDisclosureContent2({ store, alwaysVisible, ...props }) { const context = useDisclosureProviderContext(); store = store || context; invariant( store, "DisclosureContent must receive a `store` prop or be wrapped in a DisclosureProvider component." ); const ref = (0, import_react12.useRef)(null); const id3 = useId(props.id); const [transition, setTransition] = (0, import_react12.useState)(null); const open = store.useState("open"); const mounted = store.useState("mounted"); const animated = store.useState("animated"); const contentElement = store.useState("contentElement"); const otherElement = useStoreState(store.disclosure, "contentElement"); useSafeLayoutEffect(() => { if (!ref.current) return; store == null ? void 0 : store.setContentElement(ref.current); }, [store]); useSafeLayoutEffect(() => { let previousAnimated; store == null ? void 0 : store.setState("animated", (animated2) => { previousAnimated = animated2; return true; }); return () => { if (previousAnimated === void 0) return; store == null ? void 0 : store.setState("animated", previousAnimated); }; }, [store]); useSafeLayoutEffect(() => { if (!animated) return; if (!(contentElement == null ? void 0 : contentElement.isConnected)) { setTransition(null); return; } return afterPaint2(() => { setTransition(open ? "enter" : mounted ? "leave" : null); }); }, [animated, contentElement, open, mounted]); useSafeLayoutEffect(() => { if (!store) return; if (!animated) return; if (!transition) return; if (!contentElement) return; const stopAnimation = () => store == null ? void 0 : store.setState("animating", false); const stopAnimationSync = () => (0, import_react_dom.flushSync)(stopAnimation); if (transition === "leave" && open) return; if (transition === "enter" && !open) return; if (typeof animated === "number") { const timeout2 = animated; return afterTimeout(timeout2, stopAnimationSync); } const { transitionDuration, animationDuration, transitionDelay, animationDelay } = getComputedStyle(contentElement); const { transitionDuration: transitionDuration2 = "0", animationDuration: animationDuration2 = "0", transitionDelay: transitionDelay2 = "0", animationDelay: animationDelay2 = "0" } = otherElement ? getComputedStyle(otherElement) : {}; const delay2 = parseCSSTime( transitionDelay, animationDelay, transitionDelay2, animationDelay2 ); const duration = parseCSSTime( transitionDuration, animationDuration, transitionDuration2, animationDuration2 ); const timeout = delay2 + duration; if (!timeout) { if (transition === "enter") { store.setState("animated", false); } stopAnimation(); return; } const frameRate = 1e3 / 60; const maxTimeout = Math.max(timeout - frameRate, 0); return afterTimeout(maxTimeout, stopAnimationSync); }, [store, animated, contentElement, otherElement, open, transition]); props = useWrapElement( props, (element) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DialogScopedContextProvider, { value: store, children: element }), [store] ); const hidden = isHidden(mounted, props.hidden, alwaysVisible); const styleProp = props.style; const style2 = (0, import_react12.useMemo)(() => { if (hidden) { return { ...styleProp, display: "none" }; } return styleProp; }, [hidden, styleProp]); props = { id: id3, "data-open": open || void 0, "data-enter": transition === "enter" || void 0, "data-leave": transition === "leave" || void 0, hidden, ...props, ref: useMergeRefs(id3 ? store.setContentElement : null, ref, props.ref), style: style2 }; return removeUndefinedValues(props); }); var DisclosureContentImpl = forwardRef2(function DisclosureContentImpl2(props) { const htmlProps = useDisclosureContent(props); return createElement(TagName8, htmlProps); }); var DisclosureContent = forwardRef2(function DisclosureContent2({ unmountOnHide, ...props }) { const context = useDisclosureProviderContext(); const store = props.store || context; const mounted = useStoreState( store, (state) => !unmountOnHide || (state == null ? void 0 : state.mounted) ); if (mounted === false) return null; return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DisclosureContentImpl, { ...props }); }); // node_modules/@ariakit/core/esm/__chunks/75BJEVSH.js function createDisclosureStore(props = {}) { const store = mergeStore( props.store, omit2(props.disclosure, ["contentElement", "disclosureElement"]) ); throwOnConflictingProps(props, store); const syncState = store == null ? void 0 : store.getState(); const open = defaultValue( props.open, syncState == null ? void 0 : syncState.open, props.defaultOpen, false ); const animated = defaultValue(props.animated, syncState == null ? void 0 : syncState.animated, false); const initialState = { open, animated, animating: !!animated && open, mounted: open, contentElement: defaultValue(syncState == null ? void 0 : syncState.contentElement, null), disclosureElement: defaultValue(syncState == null ? void 0 : syncState.disclosureElement, null) }; const disclosure = createStore(initialState, store); setup( disclosure, () => sync(disclosure, ["animated", "animating"], (state) => { if (state.animated) return; disclosure.setState("animating", false); }) ); setup( disclosure, () => subscribe(disclosure, ["open"], () => { if (!disclosure.getState().animated) return; disclosure.setState("animating", true); }) ); setup( disclosure, () => sync(disclosure, ["open", "animating"], (state) => { disclosure.setState("mounted", state.open || state.animating); }) ); return { ...disclosure, disclosure: props.disclosure, setOpen: (value) => disclosure.setState("open", value), show: () => disclosure.setState("open", true), hide: () => disclosure.setState("open", false), toggle: () => disclosure.setState("open", (open2) => !open2), stopAnimation: () => disclosure.setState("animating", false), setContentElement: (value) => disclosure.setState("contentElement", value), setDisclosureElement: (value) => disclosure.setState("disclosureElement", value) }; } // node_modules/@ariakit/react-core/esm/__chunks/WLZ6H5FH.js function useDisclosureStoreProps(store, update, props) { useUpdateEffect(update, [props.store, props.disclosure]); useStoreProps(store, props, "open", "setOpen"); useStoreProps(store, props, "mounted", "setMounted"); useStoreProps(store, props, "animated"); return Object.assign(store, { disclosure: props.disclosure }); } function useDisclosureStore(props = {}) { const [store, update] = useStore(createDisclosureStore, props); return useDisclosureStoreProps(store, update, props); } // node_modules/@ariakit/react-core/esm/tab/tab-panel.js var import_react13 = __toESM(require_react(), 1); var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1); var TagName9 = "div"; var useTabPanel = createHook( function useTabPanel2({ store, unmountOnHide, tabId: tabIdProp, getItem: getItemProp, scrollRestoration, scrollElement, ...props }) { const context = useTabProviderContext(); store = store || context; invariant( store, "TabPanel must receive a `store` prop or be wrapped in a TabProvider component." ); const ref = (0, import_react13.useRef)(null); const id3 = useId(props.id); const tabId = useStoreState( store.panels, () => { var _a; return tabIdProp || ((_a = store == null ? void 0 : store.panels.item(id3)) == null ? void 0 : _a.tabId); } ); const open = useStoreState( store, (state) => !!tabId && state.selectedId === tabId ); const disclosure = useDisclosureStore({ open }); const mounted = useStoreState(disclosure, "mounted"); const scrollPositionRef = (0, import_react13.useRef)( /* @__PURE__ */ new Map() ); const getScrollElement = useEvent(() => { const panelElement = ref.current; if (!panelElement) return null; if (!scrollElement) return panelElement; if (typeof scrollElement === "function") { return scrollElement(panelElement); } if ("current" in scrollElement) { return scrollElement.current; } return scrollElement; }); (0, import_react13.useEffect)(() => { var _a, _b; if (!scrollRestoration) return; if (!mounted) return; const element = getScrollElement(); if (!element) return; if (scrollRestoration === "reset") { element.scroll(0, 0); return; } if (!tabId) return; const position2 = scrollPositionRef.current.get(tabId); element.scroll((_a = position2 == null ? void 0 : position2.x) != null ? _a : 0, (_b = position2 == null ? void 0 : position2.y) != null ? _b : 0); const onScroll = () => { scrollPositionRef.current.set(tabId, { x: element.scrollLeft, y: element.scrollTop }); }; element.addEventListener("scroll", onScroll); return () => { element.removeEventListener("scroll", onScroll); }; }, [scrollRestoration, mounted, tabId, getScrollElement, store]); const [hasTabbableChildren, setHasTabbableChildren] = (0, import_react13.useState)(false); (0, import_react13.useEffect)(() => { const element = ref.current; if (!element) return; const tabbable = getAllTabbableIn(element); setHasTabbableChildren(!!tabbable.length); }, []); const getItem = (0, import_react13.useCallback)( (item2) => { const nextItem = { ...item2, id: id3 || item2.id, tabId: tabIdProp }; if (getItemProp) { return getItemProp(nextItem); } return nextItem; }, [id3, tabIdProp, getItemProp] ); const onKeyDownProp = props.onKeyDown; const onKeyDown = useEvent((event) => { onKeyDownProp == null ? void 0 : onKeyDownProp(event); if (event.defaultPrevented) return; if (!(store == null ? void 0 : store.composite)) return; const keyMap = { ArrowLeft: store.previous, ArrowRight: store.next, Home: store.first, End: store.last }; const action = keyMap[event.key]; if (!action) return; const { selectedId } = store.getState(); const nextId = action({ activeId: selectedId }); if (!nextId) return; event.preventDefault(); store.move(nextId); }); props = useWrapElement( props, (element) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TabScopedContextProvider, { value: store, children: element }), [store] ); props = { id: id3, role: "tabpanel", "aria-labelledby": tabId || void 0, ...props, children: unmountOnHide && !mounted ? null : props.children, ref: useMergeRefs(ref, props.ref), onKeyDown }; props = useFocusable({ // If the tab panel is rendered as part of another composite widget such // as combobox, it should not be focusable. focusable: !store.composite && !hasTabbableChildren, ...props }); props = useDisclosureContent({ store: disclosure, ...props }); props = useCollectionItem({ store: store.panels, ...props, getItem }); return props; } ); var TabPanel = forwardRef2(function TabPanel2(props) { const htmlProps = useTabPanel(props); return createElement(TagName9, htmlProps); }); // node_modules/@ariakit/react-core/esm/__chunks/JMU4N4M5.js var ctx6 = createStoreContext( [DialogContextProvider], [DialogScopedContextProvider] ); var usePopoverContext = ctx6.useContext; var usePopoverScopedContext = ctx6.useScopedContext; var usePopoverProviderContext = ctx6.useProviderContext; var PopoverContextProvider = ctx6.ContextProvider; var PopoverScopedContextProvider = ctx6.ScopedContextProvider; // node_modules/@ariakit/react-core/esm/__chunks/AEGCXJZV.js var import_react14 = __toESM(require_react(), 1); var ctx7 = createStoreContext( [PopoverContextProvider, CompositeContextProvider], [PopoverScopedContextProvider, CompositeScopedContextProvider] ); var useSelectContext = ctx7.useContext; var useSelectScopedContext = ctx7.useScopedContext; var useSelectProviderContext = ctx7.useProviderContext; var SelectContextProvider = ctx7.ContextProvider; var SelectScopedContextProvider = ctx7.ScopedContextProvider; var SelectItemCheckedContext = (0, import_react14.createContext)(false); var SelectHeadingContext = (0, import_react14.createContext)(null); // node_modules/@ariakit/core/esm/__chunks/N5XGANPW.js function getCommonParent(items) { var _a; const firstItem = items.find((item2) => !!item2.element); const lastItem = [...items].reverse().find((item2) => !!item2.element); let parentElement = (_a = firstItem == null ? void 0 : firstItem.element) == null ? void 0 : _a.parentElement; while (parentElement && (lastItem == null ? void 0 : lastItem.element)) { const parent = parentElement; if (lastItem && parent.contains(lastItem.element)) { return parentElement; } parentElement = parentElement.parentElement; } return getDocument(parentElement).body; } function getPrivateStore(store) { return store == null ? void 0 : store.__unstablePrivateStore; } function createCollectionStore(props = {}) { var _a; throwOnConflictingProps(props, props.store); const syncState = (_a = props.store) == null ? void 0 : _a.getState(); const items = defaultValue( props.items, syncState == null ? void 0 : syncState.items, props.defaultItems, [] ); const itemsMap = new Map(items.map((item2) => [item2.id, item2])); const initialState = { items, renderedItems: defaultValue(syncState == null ? void 0 : syncState.renderedItems, []) }; const syncPrivateStore = getPrivateStore(props.store); const privateStore = createStore( { items, renderedItems: initialState.renderedItems }, syncPrivateStore ); const collection = createStore(initialState, props.store); const sortItems = (renderedItems) => { const sortedItems = sortBasedOnDOMPosition(renderedItems, (i3) => i3.element); privateStore.setState("renderedItems", sortedItems); collection.setState("renderedItems", sortedItems); }; setup(collection, () => init(privateStore)); setup(privateStore, () => { return batch(privateStore, ["items"], (state) => { collection.setState("items", state.items); }); }); setup(privateStore, () => { return batch(privateStore, ["renderedItems"], (state) => { let firstRun = true; let raf = requestAnimationFrame(() => { const { renderedItems } = collection.getState(); if (state.renderedItems === renderedItems) return; sortItems(state.renderedItems); }); if (typeof IntersectionObserver !== "function") { return () => cancelAnimationFrame(raf); } const ioCallback = () => { if (firstRun) { firstRun = false; return; } cancelAnimationFrame(raf); raf = requestAnimationFrame(() => sortItems(state.renderedItems)); }; const root = getCommonParent(state.renderedItems); const observer = new IntersectionObserver(ioCallback, { root }); for (const item2 of state.renderedItems) { if (!item2.element) continue; observer.observe(item2.element); } return () => { cancelAnimationFrame(raf); observer.disconnect(); }; }); }); const mergeItem = (item2, setItems, canDeleteFromMap = false) => { let prevItem; setItems((items2) => { const index2 = items2.findIndex(({ id: id3 }) => id3 === item2.id); const nextItems = items2.slice(); if (index2 !== -1) { prevItem = items2[index2]; const nextItem = { ...prevItem, ...item2 }; nextItems[index2] = nextItem; itemsMap.set(item2.id, nextItem); } else { nextItems.push(item2); itemsMap.set(item2.id, item2); } return nextItems; }); const unmergeItem = () => { setItems((items2) => { if (!prevItem) { if (canDeleteFromMap) { itemsMap.delete(item2.id); } return items2.filter(({ id: id3 }) => id3 !== item2.id); } const index2 = items2.findIndex(({ id: id3 }) => id3 === item2.id); if (index2 === -1) return items2; const nextItems = items2.slice(); nextItems[index2] = prevItem; itemsMap.set(item2.id, prevItem); return nextItems; }); }; return unmergeItem; }; const registerItem = (item2) => mergeItem( item2, (getItems) => privateStore.setState("items", getItems), true ); return { ...collection, registerItem, renderItem: (item2) => chain( registerItem(item2), mergeItem( item2, (getItems) => privateStore.setState("renderedItems", getItems) ) ), item: (id3) => { if (!id3) return null; let item2 = itemsMap.get(id3); if (!item2) { const { items: items2 } = privateStore.getState(); item2 = items2.find((item22) => item22.id === id3); if (item2) { itemsMap.set(id3, item2); } } return item2 || null; }, // @ts-expect-error Internal __unstablePrivateStore: privateStore }; } // node_modules/@ariakit/react-core/esm/__chunks/GVAFFF2B.js function useCollectionStoreProps(store, update, props) { useUpdateEffect(update, [props.store]); useStoreProps(store, props, "items", "setItems"); return store; } // node_modules/@ariakit/core/esm/__chunks/RVTIKFRL.js var NULL_ITEM2 = { id: null }; function findFirstEnabledItem2(items, excludeId) { return items.find((item2) => { if (excludeId) { return !item2.disabled && item2.id !== excludeId; } return !item2.disabled; }); } function getEnabledItems(items, excludeId) { return items.filter((item2) => { if (excludeId) { return !item2.disabled && item2.id !== excludeId; } return !item2.disabled; }); } function getItemsInRow(items, rowId) { return items.filter((item2) => item2.rowId === rowId); } function flipItems2(items, activeId, shouldInsertNullItem = false) { const index2 = items.findIndex((item2) => item2.id === activeId); return [ ...items.slice(index2 + 1), ...shouldInsertNullItem ? [NULL_ITEM2] : [], ...items.slice(0, index2) ]; } function groupItemsByRows2(items) { const rows = []; for (const item2 of items) { const row = rows.find((currentRow) => { var _a; return ((_a = currentRow[0]) == null ? void 0 : _a.rowId) === item2.rowId; }); if (row) { row.push(item2); } else { rows.push([item2]); } } return rows; } function getMaxRowLength(array) { let maxLength = 0; for (const { length: length2 } of array) { if (length2 > maxLength) { maxLength = length2; } } return maxLength; } function createEmptyItem(rowId) { return { id: "__EMPTY_ITEM__", disabled: true, rowId }; } function normalizeRows(rows, activeId, focusShift) { const maxLength = getMaxRowLength(rows); for (const row of rows) { for (let i3 = 0; i3 < maxLength; i3 += 1) { const item2 = row[i3]; if (!item2 || focusShift && item2.disabled) { const isFirst = i3 === 0; const previousItem = isFirst && focusShift ? findFirstEnabledItem2(row) : row[i3 - 1]; row[i3] = previousItem && activeId !== previousItem.id && focusShift ? previousItem : createEmptyItem(previousItem == null ? void 0 : previousItem.rowId); } } } return rows; } function verticalizeItems(items) { const rows = groupItemsByRows2(items); const maxLength = getMaxRowLength(rows); const verticalized = []; for (let i3 = 0; i3 < maxLength; i3 += 1) { for (const row of rows) { const item2 = row[i3]; if (item2) { verticalized.push({ ...item2, // If there's no rowId, it means that it's not a grid composite, but // a single row instead. So, instead of verticalizing it, that is, // assigning a different rowId based on the column index, we keep it // undefined so they will be part of the same row. This is useful // when using up/down on one-dimensional composites. rowId: item2.rowId ? `${i3}` : void 0 }); } } } return verticalized; } function createCompositeStore(props = {}) { var _a; const syncState = (_a = props.store) == null ? void 0 : _a.getState(); const collection = createCollectionStore(props); const activeId = defaultValue( props.activeId, syncState == null ? void 0 : syncState.activeId, props.defaultActiveId ); const initialState = { ...collection.getState(), id: defaultValue( props.id, syncState == null ? void 0 : syncState.id, `id-${Math.random().toString(36).slice(2, 8)}` ), activeId, baseElement: defaultValue(syncState == null ? void 0 : syncState.baseElement, null), includesBaseElement: defaultValue( props.includesBaseElement, syncState == null ? void 0 : syncState.includesBaseElement, activeId === null ), moves: defaultValue(syncState == null ? void 0 : syncState.moves, 0), orientation: defaultValue( props.orientation, syncState == null ? void 0 : syncState.orientation, "both" ), rtl: defaultValue(props.rtl, syncState == null ? void 0 : syncState.rtl, false), virtualFocus: defaultValue( props.virtualFocus, syncState == null ? void 0 : syncState.virtualFocus, false ), focusLoop: defaultValue(props.focusLoop, syncState == null ? void 0 : syncState.focusLoop, false), focusWrap: defaultValue(props.focusWrap, syncState == null ? void 0 : syncState.focusWrap, false), focusShift: defaultValue(props.focusShift, syncState == null ? void 0 : syncState.focusShift, false) }; const composite = createStore(initialState, collection, props.store); setup( composite, () => sync(composite, ["renderedItems", "activeId"], (state) => { composite.setState("activeId", (activeId2) => { var _a2; if (activeId2 !== void 0) return activeId2; return (_a2 = findFirstEnabledItem2(state.renderedItems)) == null ? void 0 : _a2.id; }); }) ); const getNextId = (direction = "next", options2 = {}) => { var _a2, _b; const defaultState = composite.getState(); const { skip = 0, activeId: activeId2 = defaultState.activeId, focusShift = defaultState.focusShift, focusLoop = defaultState.focusLoop, focusWrap = defaultState.focusWrap, includesBaseElement = defaultState.includesBaseElement, renderedItems = defaultState.renderedItems, rtl: rtl2 = defaultState.rtl } = options2; const isVerticalDirection = direction === "up" || direction === "down"; const isNextDirection = direction === "next" || direction === "down"; const canReverse = isNextDirection ? rtl2 && !isVerticalDirection : !rtl2 || isVerticalDirection; const canShift = focusShift && !skip; let items = !isVerticalDirection ? renderedItems : flatten2DArray( normalizeRows(groupItemsByRows2(renderedItems), activeId2, canShift) ); items = canReverse ? reverseArray(items) : items; items = isVerticalDirection ? verticalizeItems(items) : items; if (activeId2 == null) { return (_a2 = findFirstEnabledItem2(items)) == null ? void 0 : _a2.id; } const activeItem = items.find((item2) => item2.id === activeId2); if (!activeItem) { return (_b = findFirstEnabledItem2(items)) == null ? void 0 : _b.id; } const isGrid2 = items.some((item2) => item2.rowId); const activeIndex = items.indexOf(activeItem); const nextItems = items.slice(activeIndex + 1); const nextItemsInRow = getItemsInRow(nextItems, activeItem.rowId); if (skip) { const nextEnabledItemsInRow = getEnabledItems(nextItemsInRow, activeId2); const nextItem2 = nextEnabledItemsInRow.slice(skip)[0] || // If we can't find an item, just return the last one. nextEnabledItemsInRow[nextEnabledItemsInRow.length - 1]; return nextItem2 == null ? void 0 : nextItem2.id; } const canLoop = focusLoop && (isVerticalDirection ? focusLoop !== "horizontal" : focusLoop !== "vertical"); const canWrap = isGrid2 && focusWrap && (isVerticalDirection ? focusWrap !== "horizontal" : focusWrap !== "vertical"); const hasNullItem = isNextDirection ? (!isGrid2 || isVerticalDirection) && canLoop && includesBaseElement : isVerticalDirection ? includesBaseElement : false; if (canLoop) { const loopItems = canWrap && !hasNullItem ? items : getItemsInRow(items, activeItem.rowId); const sortedItems = flipItems2(loopItems, activeId2, hasNullItem); const nextItem2 = findFirstEnabledItem2(sortedItems, activeId2); return nextItem2 == null ? void 0 : nextItem2.id; } if (canWrap) { const nextItem2 = findFirstEnabledItem2( // We can use nextItems, which contains all the next items, including // items from other rows, to wrap between rows. However, if there is a // null item (the composite container), we'll only use the next items in // the row. So moving next from the last item will focus on the // composite container. On grid composites, horizontal navigation never // focuses on the composite container, only vertical. hasNullItem ? nextItemsInRow : nextItems, activeId2 ); const nextId = hasNullItem ? (nextItem2 == null ? void 0 : nextItem2.id) || null : nextItem2 == null ? void 0 : nextItem2.id; return nextId; } const nextItem = findFirstEnabledItem2(nextItemsInRow, activeId2); if (!nextItem && hasNullItem) { return null; } return nextItem == null ? void 0 : nextItem.id; }; return { ...collection, ...composite, setBaseElement: (element) => composite.setState("baseElement", element), setActiveId: (id3) => composite.setState("activeId", id3), move: (id3) => { if (id3 === void 0) return; composite.setState("activeId", id3); composite.setState("moves", (moves) => moves + 1); }, first: () => { var _a2; return (_a2 = findFirstEnabledItem2(composite.getState().renderedItems)) == null ? void 0 : _a2.id; }, last: () => { var _a2; return (_a2 = findFirstEnabledItem2(reverseArray(composite.getState().renderedItems))) == null ? void 0 : _a2.id; }, next: (options2) => { if (options2 !== void 0 && typeof options2 === "number") { options2 = { skip: options2 }; } return getNextId("next", options2); }, previous: (options2) => { if (options2 !== void 0 && typeof options2 === "number") { options2 = { skip: options2 }; } return getNextId("previous", options2); }, down: (options2) => { if (options2 !== void 0 && typeof options2 === "number") { options2 = { skip: options2 }; } return getNextId("down", options2); }, up: (options2) => { if (options2 !== void 0 && typeof options2 === "number") { options2 = { skip: options2 }; } return getNextId("up", options2); } }; } // node_modules/@ariakit/react-core/esm/__chunks/IQYAUKXT.js function useCompositeStoreOptions(props) { const id3 = useId(props.id); return { id: id3, ...props }; } function useCompositeStoreProps(store, update, props) { store = useCollectionStoreProps(store, update, props); useStoreProps(store, props, "activeId", "setActiveId"); useStoreProps(store, props, "includesBaseElement"); useStoreProps(store, props, "virtualFocus"); useStoreProps(store, props, "orientation"); useStoreProps(store, props, "rtl"); useStoreProps(store, props, "focusLoop"); useStoreProps(store, props, "focusWrap"); useStoreProps(store, props, "focusShift"); return store; } function useCompositeStore(props = {}) { props = useCompositeStoreOptions(props); const [store, update] = useStore(createCompositeStore, props); return useCompositeStoreProps(store, update, props); } // node_modules/@ariakit/react-core/esm/__chunks/CVCFNOHX.js var import_react15 = __toESM(require_react(), 1); var ComboboxListRoleContext = (0, import_react15.createContext)( void 0 ); var ctx8 = createStoreContext( [PopoverContextProvider, CompositeContextProvider], [PopoverScopedContextProvider, CompositeScopedContextProvider] ); var useComboboxContext = ctx8.useContext; var useComboboxScopedContext = ctx8.useScopedContext; var useComboboxProviderContext = ctx8.useProviderContext; var ComboboxContextProvider = ctx8.ContextProvider; var ComboboxScopedContextProvider = ctx8.ScopedContextProvider; var ComboboxItemValueContext = (0, import_react15.createContext)( void 0 ); var ComboboxItemCheckedContext = (0, import_react15.createContext)(false); // node_modules/@ariakit/core/esm/tab/tab-store.js function createTabStore({ composite: parentComposite, combobox, ...props } = {}) { const independentKeys = [ "items", "renderedItems", "moves", "orientation", "virtualFocus", "includesBaseElement", "baseElement", "focusLoop", "focusShift", "focusWrap" ]; const store = mergeStore( props.store, omit2(parentComposite, independentKeys), omit2(combobox, independentKeys) ); const syncState = store == null ? void 0 : store.getState(); const composite = createCompositeStore({ ...props, store, // We need to explicitly set the default value of `includesBaseElement` to // `false` since we don't want the composite store to default it to `true` // when the activeId state is null, which could be the case when rendering // combobox with tab. includesBaseElement: defaultValue( props.includesBaseElement, syncState == null ? void 0 : syncState.includesBaseElement, false ), orientation: defaultValue( props.orientation, syncState == null ? void 0 : syncState.orientation, "horizontal" ), focusLoop: defaultValue(props.focusLoop, syncState == null ? void 0 : syncState.focusLoop, true) }); const panels = createCollectionStore(); const initialState = { ...composite.getState(), selectedId: defaultValue( props.selectedId, syncState == null ? void 0 : syncState.selectedId, props.defaultSelectedId ), selectOnMove: defaultValue( props.selectOnMove, syncState == null ? void 0 : syncState.selectOnMove, true ) }; const tab = createStore(initialState, composite, store); setup( tab, () => sync(tab, ["moves"], () => { const { activeId, selectOnMove } = tab.getState(); if (!selectOnMove) return; if (!activeId) return; const tabItem = composite.item(activeId); if (!tabItem) return; if (tabItem.dimmed) return; if (tabItem.disabled) return; tab.setState("selectedId", tabItem.id); }) ); let syncActiveId = true; setup( tab, () => batch(tab, ["selectedId"], (state, prev2) => { if (!syncActiveId) { syncActiveId = true; return; } if (parentComposite && state.selectedId === prev2.selectedId) return; tab.setState("activeId", state.selectedId); }) ); setup( tab, () => sync(tab, ["selectedId", "renderedItems"], (state) => { if (state.selectedId !== void 0) return; const { activeId, renderedItems } = tab.getState(); const tabItem = composite.item(activeId); if (tabItem && !tabItem.disabled && !tabItem.dimmed) { tab.setState("selectedId", tabItem.id); } else { const tabItem2 = renderedItems.find( (item2) => !item2.disabled && !item2.dimmed ); tab.setState("selectedId", tabItem2 == null ? void 0 : tabItem2.id); } }) ); setup( tab, () => sync(tab, ["renderedItems"], (state) => { const tabs = state.renderedItems; if (!tabs.length) return; return sync(panels, ["renderedItems"], (state2) => { const items = state2.renderedItems; const hasOrphanPanels = items.some((panel) => !panel.tabId); if (!hasOrphanPanels) return; items.forEach((panel, i3) => { if (panel.tabId) return; const tabItem = tabs[i3]; if (!tabItem) return; panels.renderItem({ ...panel, tabId: tabItem.id }); }); }); }) ); let selectedIdFromSelectedValue = null; setup(tab, () => { const backupSelectedId = () => { selectedIdFromSelectedValue = tab.getState().selectedId; }; const restoreSelectedId = () => { syncActiveId = false; tab.setState("selectedId", selectedIdFromSelectedValue); }; if (parentComposite && "setSelectElement" in parentComposite) { return chain( sync(parentComposite, ["value"], backupSelectedId), sync(parentComposite, ["mounted"], restoreSelectedId) ); } if (!combobox) return; return chain( sync(combobox, ["selectedValue"], backupSelectedId), sync(combobox, ["mounted"], restoreSelectedId) ); }); return { ...composite, ...tab, panels, setSelectedId: (id3) => tab.setState("selectedId", id3), select: (id3) => { tab.setState("selectedId", id3); composite.move(id3); } }; } // node_modules/@ariakit/react-core/esm/__chunks/OJYI6SUJ.js var import_react16 = __toESM(require_react(), 1); function useTabStoreProps(store, update, props) { useUpdateEffect(update, [props.composite, props.combobox]); store = useCompositeStoreProps(store, update, props); useStoreProps(store, props, "selectedId", "setSelectedId"); useStoreProps(store, props, "selectOnMove"); const [panels, updatePanels] = useStore(() => store.panels, {}); useUpdateEffect(updatePanels, [store, updatePanels]); return Object.assign( (0, import_react16.useMemo)(() => ({ ...store, panels }), [store, panels]), { composite: props.composite, combobox: props.combobox } ); } function useTabStore(props = {}) { const combobox = useComboboxContext(); const composite = useSelectContext() || combobox; props = { ...props, composite: props.composite !== void 0 ? props.composite : composite, combobox: props.combobox !== void 0 ? props.combobox : combobox }; const [store, update] = useStore(createTabStore, props); return useTabStoreProps(store, update, props); } // node_modules/@ariakit/core/esm/toolbar/toolbar-store.js function createToolbarStore(props = {}) { var _a; const syncState = (_a = props.store) == null ? void 0 : _a.getState(); return createCompositeStore({ ...props, orientation: defaultValue( props.orientation, syncState == null ? void 0 : syncState.orientation, "horizontal" ), focusLoop: defaultValue(props.focusLoop, syncState == null ? void 0 : syncState.focusLoop, true) }); } // node_modules/@ariakit/react-core/esm/__chunks/5WUV565P.js function useToolbarStoreProps(store, update, props) { return useCompositeStoreProps(store, update, props); } function useToolbarStore(props = {}) { const [store, update] = useStore(createToolbarStore, props); return useToolbarStoreProps(store, update, props); } // node_modules/@ariakit/react-core/esm/__chunks/WZDDDI4V.js var ctx9 = createStoreContext( [CompositeContextProvider], [CompositeScopedContextProvider] ); var useToolbarContext = ctx9.useContext; var useToolbarScopedContext = ctx9.useScopedContext; var useToolbarProviderContext = ctx9.useProviderContext; var ToolbarContextProvider = ctx9.ContextProvider; var ToolbarScopedContextProvider = ctx9.ScopedContextProvider; // node_modules/@ariakit/react-core/esm/toolbar/toolbar.js var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1); var TagName10 = "div"; var useToolbar = createHook( function useToolbar2({ store: storeProp, orientation: orientationProp, virtualFocus, focusLoop, rtl: rtl2, ...props }) { const context = useToolbarProviderContext(); storeProp = storeProp || context; const store = useToolbarStore({ store: storeProp, orientation: orientationProp, virtualFocus, focusLoop, rtl: rtl2 }); const orientation = store.useState( (state) => state.orientation === "both" ? void 0 : state.orientation ); props = useWrapElement( props, (element) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ToolbarScopedContextProvider, { value: store, children: element }), [store] ); props = { role: "toolbar", "aria-orientation": orientation, ...props }; props = useComposite({ store, ...props }); return props; } ); var Toolbar = forwardRef2(function Toolbar2(props) { const htmlProps = useToolbar(props); return createElement(TagName10, htmlProps); }); // node_modules/@ariakit/react-core/esm/__chunks/HSU7H6PW.js var TagName11 = "button"; var useToolbarItem = createHook( function useToolbarItem2({ store, ...props }) { const context = useToolbarContext(); store = store || context; props = useCompositeItem({ store, ...props }); return props; } ); var ToolbarItem = memo2( forwardRef2(function ToolbarItem2(props) { const htmlProps = useToolbarItem(props); return createElement(TagName11, htmlProps); }) ); // node_modules/@ariakit/react-core/esm/__chunks/P7VC6T3R.js var TagName12 = "hr"; var useSeparator = createHook( function useSeparator2({ orientation = "horizontal", ...props }) { props = { role: "separator", "aria-orientation": orientation, ...props }; return props; } ); var Separator = forwardRef2(function Separator2(props) { const htmlProps = useSeparator(props); return createElement(TagName12, htmlProps); }); // node_modules/@ariakit/react-core/esm/__chunks/YBRT277Q.js var TagName13 = "hr"; var useCompositeSeparator = createHook(function useCompositeSeparator2({ store, ...props }) { const context = useCompositeContext(); store = store || context; invariant( store, "CompositeSeparator must be wrapped in a Composite component." ); const orientation = store.useState( (state) => state.orientation === "horizontal" ? "vertical" : "horizontal" ); props = useSeparator({ ...props, orientation }); return props; }); var CompositeSeparator = forwardRef2(function CompositeSeparator2(props) { const htmlProps = useCompositeSeparator(props); return createElement(TagName13, htmlProps); }); // node_modules/@ariakit/react-core/esm/__chunks/PTRWAQFT.js var ctx10 = createStoreContext( [PopoverContextProvider], [PopoverScopedContextProvider] ); var useHovercardContext = ctx10.useContext; var useHovercardScopedContext = ctx10.useScopedContext; var useHovercardProviderContext = ctx10.useProviderContext; var HovercardContextProvider = ctx10.ContextProvider; var HovercardScopedContextProvider = ctx10.ScopedContextProvider; // node_modules/@ariakit/react-core/esm/__chunks/UZXQ5DX3.js var ctx11 = createStoreContext( [HovercardContextProvider], [HovercardScopedContextProvider] ); var useTooltipContext = ctx11.useContext; var useTooltipScopedContext = ctx11.useScopedContext; var useTooltipProviderContext = ctx11.useProviderContext; var TooltipContextProvider = ctx11.ContextProvider; var TooltipScopedContextProvider = ctx11.ScopedContextProvider; // node_modules/@ariakit/react-core/esm/__chunks/X7QOZUD3.js function getEventPoint(event) { return [event.clientX, event.clientY]; } function isPointInPolygon(point, polygon) { const [x2, y3] = point; let inside = false; const length2 = polygon.length; for (let l3 = length2, i3 = 0, j2 = l3 - 1; i3 < l3; j2 = i3++) { const [xi, yi] = polygon[i3]; const [xj, yj] = polygon[j2]; const [, vy] = polygon[j2 === 0 ? l3 - 1 : j2 - 1] || [0, 0]; const where = (yi - yj) * (x2 - xi) - (xi - xj) * (y3 - yi); if (yj < yi) { if (y3 >= yj && y3 < yi) { if (where === 0) return true; if (where > 0) { if (y3 === yj) { if (y3 > vy) { inside = !inside; } } else { inside = !inside; } } } } else if (yi < yj) { if (y3 > yi && y3 <= yj) { if (where === 0) return true; if (where < 0) { if (y3 === yj) { if (y3 < vy) { inside = !inside; } } else { inside = !inside; } } } } else if (y3 === yi && (x2 >= xj && x2 <= xi || x2 >= xi && x2 <= xj)) { return true; } } return inside; } function getEnterPointPlacement(enterPoint, rect) { const { top, right, bottom, left } = rect; const [x2, y3] = enterPoint; const placementX = x2 < left ? "left" : x2 > right ? "right" : null; const placementY = y3 < top ? "top" : y3 > bottom ? "bottom" : null; return [placementX, placementY]; } function getElementPolygon(element, enterPoint) { const rect = element.getBoundingClientRect(); const { top, right, bottom, left } = rect; const [x2, y3] = getEnterPointPlacement(enterPoint, rect); const polygon = [enterPoint]; if (x2) { if (y3 !== "top") { polygon.push([x2 === "left" ? left : right, top]); } polygon.push([x2 === "left" ? right : left, top]); polygon.push([x2 === "left" ? right : left, bottom]); if (y3 !== "bottom") { polygon.push([x2 === "left" ? left : right, bottom]); } } else if (y3 === "top") { polygon.push([left, top]); polygon.push([left, bottom]); polygon.push([right, bottom]); polygon.push([right, top]); } else { polygon.push([left, bottom]); polygon.push([left, top]); polygon.push([right, top]); polygon.push([right, bottom]); } return polygon; } // node_modules/@ariakit/react-core/esm/__chunks/AOQQTIBO.js var import_react17 = __toESM(require_react(), 1); var PortalContext = (0, import_react17.createContext)(null); // node_modules/@ariakit/react-core/esm/__chunks/2F57YTN4.js var TagName14 = "span"; var useVisuallyHidden = createHook( function useVisuallyHidden2(props) { props = { ...props, style: { border: 0, clip: "rect(0 0 0 0)", height: "1px", margin: "-1px", overflow: "hidden", padding: 0, position: "absolute", whiteSpace: "nowrap", width: "1px", ...props.style } }; return props; } ); var VisuallyHidden = forwardRef2(function VisuallyHidden2(props) { const htmlProps = useVisuallyHidden(props); return createElement(TagName14, htmlProps); }); // node_modules/@ariakit/react-core/esm/__chunks/BFOIJXK2.js var TagName15 = "span"; var useFocusTrap = createHook( function useFocusTrap2(props) { props = { "data-focus-trap": "", tabIndex: 0, "aria-hidden": true, ...props, style: { // Prevents unintended scroll jumps. position: "fixed", top: 0, left: 0, ...props.style } }; props = useVisuallyHidden(props); return props; } ); var FocusTrap = forwardRef2(function FocusTrap2(props) { const htmlProps = useFocusTrap(props); return createElement(TagName15, htmlProps); }); // node_modules/@ariakit/react-core/esm/__chunks/VJH3F6TN.js var import_react18 = __toESM(require_react(), 1); var import_react_dom2 = __toESM(require_react_dom(), 1); var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1); var TagName16 = "div"; function getRootElement(element) { return getDocument(element).body; } function getPortalElement(element, portalElement) { if (!portalElement) { return getDocument(element).createElement("div"); } if (typeof portalElement === "function") { return portalElement(element); } return portalElement; } function getRandomId(prefix2 = "id") { return `${prefix2 ? `${prefix2}-` : ""}${Math.random().toString(36).slice(2, 8)}`; } function queueFocus(element) { queueMicrotask(() => { element == null ? void 0 : element.focus(); }); } var usePortal = createHook(function usePortal2({ preserveTabOrder, preserveTabOrderAnchor, portalElement, portalRef, portal = true, ...props }) { const ref = (0, import_react18.useRef)(null); const refProp = useMergeRefs(ref, props.ref); const context = (0, import_react18.useContext)(PortalContext); const [portalNode, setPortalNode] = (0, import_react18.useState)(null); const [anchorPortalNode, setAnchorPortalNode] = (0, import_react18.useState)( null ); const outerBeforeRef = (0, import_react18.useRef)(null); const innerBeforeRef = (0, import_react18.useRef)(null); const innerAfterRef = (0, import_react18.useRef)(null); const outerAfterRef = (0, import_react18.useRef)(null); useSafeLayoutEffect(() => { const element = ref.current; if (!element || !portal) { setPortalNode(null); return; } const portalEl = getPortalElement(element, portalElement); if (!portalEl) { setPortalNode(null); return; } const isPortalInDocument = portalEl.isConnected; if (!isPortalInDocument) { const rootElement = context || getRootElement(element); rootElement.appendChild(portalEl); } if (!portalEl.id) { portalEl.id = element.id ? `portal/${element.id}` : getRandomId(); } setPortalNode(portalEl); setRef(portalRef, portalEl); if (isPortalInDocument) return; return () => { portalEl.remove(); setRef(portalRef, null); }; }, [portal, portalElement, context, portalRef]); useSafeLayoutEffect(() => { if (!portal) return; if (!preserveTabOrder) return; if (!preserveTabOrderAnchor) return; const doc = getDocument(preserveTabOrderAnchor); const element = doc.createElement("span"); element.style.position = "fixed"; preserveTabOrderAnchor.insertAdjacentElement("afterend", element); setAnchorPortalNode(element); return () => { element.remove(); setAnchorPortalNode(null); }; }, [portal, preserveTabOrder, preserveTabOrderAnchor]); (0, import_react18.useEffect)(() => { if (!portalNode) return; if (!preserveTabOrder) return; let raf = 0; const onFocus = (event) => { if (!isFocusEventOutside(event)) return; const focusing = event.type === "focusin"; cancelAnimationFrame(raf); if (focusing) { return restoreFocusIn(portalNode); } raf = requestAnimationFrame(() => { disableFocusIn(portalNode, true); }); }; portalNode.addEventListener("focusin", onFocus, true); portalNode.addEventListener("focusout", onFocus, true); return () => { cancelAnimationFrame(raf); portalNode.removeEventListener("focusin", onFocus, true); portalNode.removeEventListener("focusout", onFocus, true); }; }, [portalNode, preserveTabOrder]); props = useWrapElement( props, (element) => { element = // While the portal node is not in the DOM, we need to pass the // current context to the portal context, otherwise it's going to // reset to the body element on nested portals. /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(PortalContext.Provider, { value: portalNode || context, children: element }); if (!portal) return element; if (!portalNode) { return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)( "span", { ref: refProp, id: props.id, style: { position: "fixed" }, hidden: true } ); } element = /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [ preserveTabOrder && portalNode && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)( FocusTrap, { ref: innerBeforeRef, "data-focus-trap": props.id, className: "__focus-trap-inner-before", onFocus: (event) => { if (isFocusEventOutside(event, portalNode)) { queueFocus(getNextTabbable()); } else { queueFocus(outerBeforeRef.current); } } } ), element, preserveTabOrder && portalNode && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)( FocusTrap, { ref: innerAfterRef, "data-focus-trap": props.id, className: "__focus-trap-inner-after", onFocus: (event) => { if (isFocusEventOutside(event, portalNode)) { queueFocus(getPreviousTabbable()); } else { queueFocus(outerAfterRef.current); } } } ) ] }); if (portalNode) { element = (0, import_react_dom2.createPortal)(element, portalNode); } let preserveTabOrderElement = /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [ preserveTabOrder && portalNode && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)( FocusTrap, { ref: outerBeforeRef, "data-focus-trap": props.id, className: "__focus-trap-outer-before", onFocus: (event) => { const fromOuter = event.relatedTarget === outerAfterRef.current; if (!fromOuter && isFocusEventOutside(event, portalNode)) { queueFocus(innerBeforeRef.current); } else { queueFocus(getPreviousTabbable()); } } } ), preserveTabOrder && // We're using position: fixed here so that the browser doesn't // add margin to the element when setting gap on a parent element. /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { "aria-owns": portalNode == null ? void 0 : portalNode.id, style: { position: "fixed" } }), preserveTabOrder && portalNode && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)( FocusTrap, { ref: outerAfterRef, "data-focus-trap": props.id, className: "__focus-trap-outer-after", onFocus: (event) => { if (isFocusEventOutside(event, portalNode)) { queueFocus(innerAfterRef.current); } else { const nextTabbable = getNextTabbable(); if (nextTabbable === innerBeforeRef.current) { requestAnimationFrame(() => { var _a; return (_a = getNextTabbable()) == null ? void 0 : _a.focus(); }); return; } queueFocus(nextTabbable); } } } ) ] }); if (anchorPortalNode && preserveTabOrder) { preserveTabOrderElement = (0, import_react_dom2.createPortal)( preserveTabOrderElement, anchorPortalNode ); } return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [ preserveTabOrderElement, element ] }); }, [portalNode, context, portal, props.id, preserveTabOrder, anchorPortalNode] ); props = { ...props, ref: refProp }; return props; }); var Portal = forwardRef2(function Portal2(props) { const htmlProps = usePortal(props); return createElement(TagName16, htmlProps); }); // node_modules/@ariakit/react-core/esm/__chunks/CZ4GFWYL.js var import_react19 = __toESM(require_react(), 1); var HeadingContext = (0, import_react19.createContext)(0); // node_modules/@ariakit/react-core/esm/__chunks/5M6RIVE2.js var import_react20 = __toESM(require_react(), 1); var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1); function HeadingLevel({ level, children }) { const contextLevel = (0, import_react20.useContext)(HeadingContext); const nextLevel = Math.max( Math.min(level || contextLevel + 1, 6), 1 ); return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(HeadingContext.Provider, { value: nextLevel, children }); } // node_modules/@ariakit/react-core/esm/__chunks/3HM4TGWW.js var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1); var TagName17 = "div"; var useFocusableContainer = createHook(function useFocusableContainer2({ autoFocusOnShow = true, ...props }) { props = useWrapElement( props, (element) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(FocusableContext.Provider, { value: autoFocusOnShow, children: element }), [autoFocusOnShow] ); return props; }); var FocusableContainer = forwardRef2(function FocusableContainer2(props) { const htmlProps = useFocusableContainer(props); return createElement(TagName17, htmlProps); }); // node_modules/@ariakit/react-core/esm/__chunks/6GXEOXGT.js function prependHiddenDismiss(container, onClick) { const document2 = getDocument(container); const button = document2.createElement("button"); button.type = "button"; button.tabIndex = -1; button.textContent = "Dismiss popup"; Object.assign(button.style, { border: "0px", clip: "rect(0 0 0 0)", height: "1px", margin: "-1px", overflow: "hidden", padding: "0px", position: "absolute", whiteSpace: "nowrap", width: "1px" }); button.addEventListener("click", onClick); container.prepend(button); const removeHiddenDismiss = () => { button.removeEventListener("click", onClick); button.remove(); }; return removeHiddenDismiss; } // node_modules/@ariakit/react-core/esm/__chunks/U3R3WHDK.js var import_react21 = __toESM(require_react(), 1); function usePreviousMouseDownRef(enabled) { const previousMouseDownRef = (0, import_react21.useRef)(null); (0, import_react21.useEffect)(() => { if (!enabled) { previousMouseDownRef.current = null; return; } const onMouseDown = (event) => { previousMouseDownRef.current = event.target; }; return addGlobalEventListener("mousedown", onMouseDown, true); }, [enabled]); return previousMouseDownRef; } // node_modules/@ariakit/react-core/esm/__chunks/K2ZF5NU7.js var cleanups = /* @__PURE__ */ new WeakMap(); function orchestrate(element, key, setup2) { if (!cleanups.has(element)) { cleanups.set(element, /* @__PURE__ */ new Map()); } const elementCleanups = cleanups.get(element); const prevCleanup = elementCleanups.get(key); if (!prevCleanup) { elementCleanups.set(key, setup2()); return () => { var _a; (_a = elementCleanups.get(key)) == null ? void 0 : _a(); elementCleanups.delete(key); }; } const cleanup = setup2(); const nextCleanup = () => { cleanup(); prevCleanup(); elementCleanups.delete(key); }; elementCleanups.set(key, nextCleanup); return () => { const isCurrent = elementCleanups.get(key) === nextCleanup; if (!isCurrent) return; cleanup(); elementCleanups.set(key, prevCleanup); }; } function setAttribute(element, attr, value) { const setup2 = () => { const previousValue = element.getAttribute(attr); element.setAttribute(attr, value); return () => { if (previousValue == null) { element.removeAttribute(attr); } else { element.setAttribute(attr, previousValue); } }; }; return orchestrate(element, attr, setup2); } function setProperty(element, property, value) { const setup2 = () => { const exists = property in element; const previousValue = element[property]; element[property] = value; return () => { if (!exists) { delete element[property]; } else { element[property] = previousValue; } }; }; return orchestrate(element, property, setup2); } function assignStyle(element, style2) { if (!element) return () => { }; const setup2 = () => { const prevStyle = element.style.cssText; Object.assign(element.style, style2); return () => { element.style.cssText = prevStyle; }; }; return orchestrate(element, "style", setup2); } function setCSSProperty(element, property, value) { if (!element) return () => { }; const setup2 = () => { const previousValue = element.style.getPropertyValue(property); element.style.setProperty(property, value); return () => { if (previousValue) { element.style.setProperty(property, previousValue); } else { element.style.removeProperty(property); } }; }; return orchestrate(element, property, setup2); } // node_modules/@ariakit/react-core/esm/__chunks/AOUGVQZ3.js var ignoreTags = ["SCRIPT", "STYLE"]; function getSnapshotPropertyName(id3) { return `__ariakit-dialog-snapshot-${id3}`; } function inSnapshot(id3, element) { const doc = getDocument(element); const propertyName = getSnapshotPropertyName(id3); if (!doc.body[propertyName]) return true; do { if (element === doc.body) return false; if (element[propertyName]) return true; if (!element.parentElement) return false; element = element.parentElement; } while (true); } function isValidElement3(id3, element, ignoredElements) { if (ignoreTags.includes(element.tagName)) return false; if (!inSnapshot(id3, element)) return false; return !ignoredElements.some( (enabledElement) => enabledElement && contains(element, enabledElement) ); } function walkTreeOutside(id3, elements2, callback, ancestorCallback) { for (let element of elements2) { if (!(element == null ? void 0 : element.isConnected)) continue; const hasAncestorAlready = elements2.some((maybeAncestor) => { if (!maybeAncestor) return false; if (maybeAncestor === element) return false; return maybeAncestor.contains(element); }); const doc = getDocument(element); const originalElement = element; while (element.parentElement && element !== doc.body) { ancestorCallback == null ? void 0 : ancestorCallback(element.parentElement, originalElement); if (!hasAncestorAlready) { for (const child of element.parentElement.children) { if (isValidElement3(id3, child, elements2)) { callback(child, originalElement); } } } element = element.parentElement; } } } function createWalkTreeSnapshot(id3, elements2) { const { body } = getDocument(elements2[0]); const cleanups2 = []; const markElement2 = (element) => { cleanups2.push(setProperty(element, getSnapshotPropertyName(id3), true)); }; walkTreeOutside(id3, elements2, markElement2); return chain(setProperty(body, getSnapshotPropertyName(id3), true), () => { for (const cleanup of cleanups2) { cleanup(); } }); } // node_modules/@ariakit/react-core/esm/__chunks/63XF7ACK.js function isBackdrop(element, ...ids) { if (!element) return false; const backdrop = element.getAttribute("data-backdrop"); if (backdrop == null) return false; if (backdrop === "") return true; if (backdrop === "true") return true; if (!ids.length) return true; return ids.some((id3) => backdrop === id3); } // node_modules/@ariakit/react-core/esm/__chunks/3NDVDEB4.js function getPropertyName(id3 = "", ancestor = false) { return `__ariakit-dialog-${ancestor ? "ancestor" : "outside"}${id3 ? `-${id3}` : ""}`; } function markElement(element, id3 = "") { return chain( setProperty(element, getPropertyName(), true), setProperty(element, getPropertyName(id3), true) ); } function markAncestor(element, id3 = "") { return chain( setProperty(element, getPropertyName("", true), true), setProperty(element, getPropertyName(id3, true), true) ); } function isElementMarked(element, id3) { const ancestorProperty = getPropertyName(id3, true); if (element[ancestorProperty]) return true; const elementProperty = getPropertyName(id3); do { if (element[elementProperty]) return true; if (!element.parentElement) return false; element = element.parentElement; } while (true); } function markTreeOutside(id3, elements2) { const cleanups2 = []; const ids = elements2.map((el) => el == null ? void 0 : el.id); walkTreeOutside( id3, elements2, (element) => { if (isBackdrop(element, ...ids)) return; cleanups2.unshift(markElement(element, id3)); }, (ancestor, element) => { const isAnotherDialogAncestor = element.hasAttribute("data-dialog") && element.id !== id3; if (isAnotherDialogAncestor) return; cleanups2.unshift(markAncestor(ancestor, id3)); } ); const restoreAccessibilityTree = () => { for (const cleanup of cleanups2) { cleanup(); } }; return restoreAccessibilityTree; } // node_modules/@ariakit/react-core/esm/__chunks/KKITJVHA.js var import_react22 = __toESM(require_react(), 1); function isInDocument(target) { if (target.tagName === "HTML") return true; return contains(getDocument(target).body, target); } function isDisclosure(disclosure, target) { if (!disclosure) return false; if (contains(disclosure, target)) return true; const activeId = target.getAttribute("aria-activedescendant"); if (activeId) { const activeElement = getDocument(disclosure).getElementById(activeId); if (activeElement) { return contains(disclosure, activeElement); } } return false; } function isMouseEventOnDialog(event, dialog) { if (!("clientY" in event)) return false; const rect = dialog.getBoundingClientRect(); if (rect.width === 0 || rect.height === 0) return false; return rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width; } function useEventOutside({ store, type, listener, capture, domReady }) { const callListener = useEvent(listener); const open = useStoreState(store, "open"); const focusedRef = (0, import_react22.useRef)(false); useSafeLayoutEffect(() => { if (!open) return; if (!domReady) return; const { contentElement } = store.getState(); if (!contentElement) return; const onFocus = () => { focusedRef.current = true; }; contentElement.addEventListener("focusin", onFocus, true); return () => contentElement.removeEventListener("focusin", onFocus, true); }, [store, open, domReady]); (0, import_react22.useEffect)(() => { if (!open) return; const onEvent = (event) => { const { contentElement, disclosureElement } = store.getState(); const target = event.target; if (!contentElement) return; if (!target) return; if (!isInDocument(target)) return; if (contains(contentElement, target)) return; if (isDisclosure(disclosureElement, target)) return; if (target.hasAttribute("data-focus-trap")) return; if (isMouseEventOnDialog(event, contentElement)) return; const focused = focusedRef.current; if (focused && !isElementMarked(target, contentElement.id)) return; if (isSafariFocusAncestor(target)) return; callListener(event); }; return addGlobalEventListener(type, onEvent, capture); }, [open, capture]); } function shouldHideOnInteractOutside(hideOnInteractOutside, event) { if (typeof hideOnInteractOutside === "function") { return hideOnInteractOutside(event); } return !!hideOnInteractOutside; } function useHideOnInteractOutside(store, hideOnInteractOutside, domReady) { const open = useStoreState(store, "open"); const previousMouseDownRef = usePreviousMouseDownRef(open); const props = { store, domReady, capture: true }; useEventOutside({ ...props, type: "click", listener: (event) => { const { contentElement } = store.getState(); const previousMouseDown = previousMouseDownRef.current; if (!previousMouseDown) return; if (!isVisible(previousMouseDown)) return; if (!isElementMarked(previousMouseDown, contentElement == null ? void 0 : contentElement.id)) return; if (!shouldHideOnInteractOutside(hideOnInteractOutside, event)) return; store.hide(); } }); useEventOutside({ ...props, type: "focusin", listener: (event) => { const { contentElement } = store.getState(); if (!contentElement) return; if (event.target === getDocument(contentElement)) return; if (!shouldHideOnInteractOutside(hideOnInteractOutside, event)) return; store.hide(); } }); useEventOutside({ ...props, type: "contextmenu", listener: (event) => { if (!shouldHideOnInteractOutside(hideOnInteractOutside, event)) return; store.hide(); } }); } // node_modules/@ariakit/react-core/esm/__chunks/JSI7U3EA.js var import_react23 = __toESM(require_react(), 1); var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1); var NestedDialogsContext = (0, import_react23.createContext)({}); function useNestedDialogs(store) { const context = (0, import_react23.useContext)(NestedDialogsContext); const [dialogs, setDialogs] = (0, import_react23.useState)([]); const add2 = (0, import_react23.useCallback)( (dialog) => { var _a; setDialogs((dialogs2) => [...dialogs2, dialog]); return chain((_a = context.add) == null ? void 0 : _a.call(context, dialog), () => { setDialogs((dialogs2) => dialogs2.filter((d3) => d3 !== dialog)); }); }, [context] ); useSafeLayoutEffect(() => { return sync(store, ["open", "contentElement"], (state) => { var _a; if (!state.open) return; if (!state.contentElement) return; return (_a = context.add) == null ? void 0 : _a.call(context, store); }); }, [store, context]); const providerValue = (0, import_react23.useMemo)(() => ({ store, add: add2 }), [store, add2]); const wrapElement = (0, import_react23.useCallback)( (element) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(NestedDialogsContext.Provider, { value: providerValue, children: element }), [providerValue] ); return { wrapElement, nestedDialogs: dialogs }; } // node_modules/@ariakit/react-core/esm/__chunks/OT5RJDXG.js var import_react24 = __toESM(require_react(), 1); var import_react_dom3 = __toESM(require_react_dom(), 1); function useRootDialog({ attribute, contentId, contentElement, enabled }) { const [updated, retry] = useForceUpdate(); const isRootDialog = (0, import_react24.useCallback)(() => { if (!enabled) return false; if (!contentElement) return false; const { body } = getDocument(contentElement); const id3 = body.getAttribute(attribute); return !id3 || id3 === contentId; }, [updated, enabled, contentElement, attribute, contentId]); (0, import_react24.useEffect)(() => { if (!enabled) return; if (!contentId) return; if (!contentElement) return; const { body } = getDocument(contentElement); if (isRootDialog()) { body.setAttribute(attribute, contentId); return () => body.removeAttribute(attribute); } const observer = new MutationObserver(() => (0, import_react_dom3.flushSync)(retry)); observer.observe(body, { attributeFilter: [attribute] }); return () => observer.disconnect(); }, [updated, enabled, contentId, contentElement, isRootDialog, attribute]); return isRootDialog; } // node_modules/@ariakit/react-core/esm/__chunks/B6W4QFKS.js var import_react25 = __toESM(require_react(), 1); function getPaddingProperty(documentElement) { const documentLeft = documentElement.getBoundingClientRect().left; const scrollbarX = Math.round(documentLeft) + documentElement.scrollLeft; return scrollbarX ? "paddingLeft" : "paddingRight"; } function usePreventBodyScroll(contentElement, contentId, enabled) { const isRootDialog = useRootDialog({ attribute: "data-dialog-prevent-body-scroll", contentElement, contentId, enabled }); (0, import_react25.useEffect)(() => { if (!isRootDialog()) return; if (!contentElement) return; const doc = getDocument(contentElement); const win = getWindow(contentElement); const { documentElement, body } = doc; const cssScrollbarWidth = documentElement.style.getPropertyValue("--scrollbar-width"); const scrollbarWidth = cssScrollbarWidth ? Number.parseInt(cssScrollbarWidth, 10) : win.innerWidth - documentElement.clientWidth; const setScrollbarWidthProperty = () => setCSSProperty( documentElement, "--scrollbar-width", `${scrollbarWidth}px` ); const paddingProperty = getPaddingProperty(documentElement); const setStyle = () => assignStyle(body, { overflow: "hidden", [paddingProperty]: `${scrollbarWidth}px` }); const setIOSStyle = () => { var _a, _b; const { scrollX: scrollX2, scrollY: scrollY2, visualViewport } = win; const offsetLeft = (_a = visualViewport == null ? void 0 : visualViewport.offsetLeft) != null ? _a : 0; const offsetTop = (_b = visualViewport == null ? void 0 : visualViewport.offsetTop) != null ? _b : 0; const restoreStyle = assignStyle(body, { position: "fixed", overflow: "hidden", top: `${-(scrollY2 - Math.floor(offsetTop))}px`, left: `${-(scrollX2 - Math.floor(offsetLeft))}px`, right: "0", [paddingProperty]: `${scrollbarWidth}px` }); return () => { restoreStyle(); if (true) { win.scrollTo({ left: scrollX2, top: scrollY2, behavior: "instant" }); } }; }; const isIOS = isApple() && !isMac(); return chain( setScrollbarWidthProperty(), isIOS ? setIOSStyle() : setStyle() ); }, [isRootDialog, contentElement]); } // node_modules/@ariakit/react-core/esm/__chunks/IGR4SXG2.js function isFocusTrap(element, ...ids) { if (!element) return false; const attr = element.getAttribute("data-focus-trap"); if (attr == null) return false; if (!ids.length) return true; if (attr === "") return false; return ids.some((id3) => attr === id3); } // node_modules/@ariakit/react-core/esm/__chunks/677M2CI3.js function supportsInert() { return "inert" in HTMLElement.prototype; } // node_modules/@ariakit/react-core/esm/__chunks/S7U6BLGA.js function hideElementFromAccessibilityTree(element) { return setAttribute(element, "aria-hidden", "true"); } // node_modules/@ariakit/react-core/esm/__chunks/Z5GCVBAY.js function disableTree(element, ignoredElements) { if (!("style" in element)) return noop; if (supportsInert()) { return setProperty(element, "inert", true); } const tabbableElements = getAllTabbableIn(element, true); const enableElements = tabbableElements.map((element2) => { if (ignoredElements == null ? void 0 : ignoredElements.some((el) => el && contains(el, element2))) return noop; const restoreFocusMethod = orchestrate(element2, "focus", () => { element2.focus = noop; return () => { delete element2.focus; }; }); return chain(setAttribute(element2, "tabindex", "-1"), restoreFocusMethod); }); return chain( ...enableElements, hideElementFromAccessibilityTree(element), assignStyle(element, { pointerEvents: "none", userSelect: "none", cursor: "default" }) ); } function disableTreeOutside(id3, elements2) { const cleanups2 = []; const ids = elements2.map((el) => el == null ? void 0 : el.id); walkTreeOutside( id3, elements2, (element) => { if (isBackdrop(element, ...ids)) return; if (isFocusTrap(element, ...ids)) return; cleanups2.unshift(disableTree(element, elements2)); }, (element) => { if (!element.hasAttribute("role")) return; if (elements2.some((el) => el && contains(el, element))) return; cleanups2.unshift(setAttribute(element, "role", "none")); } ); const restoreTreeOutside = () => { for (const cleanup of cleanups2) { cleanup(); } }; return restoreTreeOutside; } // node_modules/@ariakit/react-core/esm/__chunks/JG4VNI52.js var TagName18 = "div"; var elements = [ "a", "button", "details", "dialog", "div", "form", "h1", "h2", "h3", "h4", "h5", "h6", "header", "img", "input", "label", "li", "nav", "ol", "p", "section", "select", "span", "summary", "textarea", "ul", "svg" ]; var useRole = createHook( function useRole2(props) { return props; } ); var Role = forwardRef2( // @ts-expect-error function Role2(props) { return createElement(TagName18, props); } ); Object.assign( Role, elements.reduce((acc, element) => { acc[element] = forwardRef2(function Role3(props) { return createElement(element, props); }); return acc; }, {}) ); // node_modules/@ariakit/react-core/esm/__chunks/P45QRJLH.js var import_react26 = __toESM(require_react(), 1); var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1); function DialogBackdrop({ store, backdrop, alwaysVisible, hidden }) { const ref = (0, import_react26.useRef)(null); const disclosure = useDisclosureStore({ disclosure: store }); const contentElement = useStoreState(store, "contentElement"); (0, import_react26.useEffect)(() => { const backdrop2 = ref.current; const dialog = contentElement; if (!backdrop2) return; if (!dialog) return; backdrop2.style.zIndex = getComputedStyle(dialog).zIndex; }, [contentElement]); useSafeLayoutEffect(() => { const id3 = contentElement == null ? void 0 : contentElement.id; if (!id3) return; const backdrop2 = ref.current; if (!backdrop2) return; return markAncestor(backdrop2, id3); }, [contentElement]); const props = useDisclosureContent({ ref, store: disclosure, role: "presentation", "data-backdrop": (contentElement == null ? void 0 : contentElement.id) || "", alwaysVisible, hidden: hidden != null ? hidden : void 0, style: { position: "fixed", top: 0, right: 0, bottom: 0, left: 0 } }); if (!backdrop) return null; if ((0, import_react26.isValidElement)(backdrop)) { return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Role, { ...props, render: backdrop }); } const Component9 = typeof backdrop !== "boolean" ? backdrop : "div"; return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Role, { ...props, render: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Component9, {}) }); } // node_modules/@ariakit/core/esm/__chunks/KMAUV3TY.js function createDialogStore(props = {}) { return createDisclosureStore(props); } // node_modules/@ariakit/react-core/esm/__chunks/4NYSH4UO.js function useDialogStoreProps(store, update, props) { return useDisclosureStoreProps(store, update, props); } function useDialogStore(props = {}) { const [store, update] = useStore(createDialogStore, props); return useDialogStoreProps(store, update, props); } // node_modules/@ariakit/react-core/esm/__chunks/Z32PU2LQ.js var import_react27 = __toESM(require_react(), 1); var import_jsx_runtime14 = __toESM(require_jsx_runtime(), 1); var TagName19 = "div"; var isSafariBrowser2 = isSafari(); function isAlreadyFocusingAnotherElement(dialog) { const activeElement = getActiveElement(); if (!activeElement) return false; if (dialog && contains(dialog, activeElement)) return false; if (isFocusable(activeElement)) return true; return false; } function getElementFromProp(prop, focusable = false) { if (!prop) return null; const element = "current" in prop ? prop.current : prop; if (!element) return null; if (focusable) return isFocusable(element) ? element : null; return element; } var useDialog = createHook(function useDialog2({ store: storeProp, open: openProp, onClose, focusable = true, modal = true, portal = !!modal, backdrop = !!modal, hideOnEscape = true, hideOnInteractOutside = true, getPersistentElements, preventBodyScroll = !!modal, autoFocusOnShow = true, autoFocusOnHide = true, initialFocus, finalFocus, unmountOnHide, unstable_treeSnapshotKey, ...props }) { const context = useDialogProviderContext(); const ref = (0, import_react27.useRef)(null); const store = useDialogStore({ store: storeProp || context, open: openProp, setOpen(open2) { if (open2) return; const dialog = ref.current; if (!dialog) return; const event = new Event("close", { bubbles: false, cancelable: true }); if (onClose) { dialog.addEventListener("close", onClose, { once: true }); } dialog.dispatchEvent(event); if (!event.defaultPrevented) return; store.setOpen(true); } }); const { portalRef, domReady } = usePortalRef(portal, props.portalRef); const preserveTabOrderProp = props.preserveTabOrder; const preserveTabOrder = useStoreState( store, (state) => preserveTabOrderProp && !modal && state.mounted ); const id3 = useId(props.id); const open = useStoreState(store, "open"); const mounted = useStoreState(store, "mounted"); const contentElement = useStoreState(store, "contentElement"); const hidden = isHidden(mounted, props.hidden, props.alwaysVisible); usePreventBodyScroll(contentElement, id3, preventBodyScroll && !hidden); useHideOnInteractOutside(store, hideOnInteractOutside, domReady); const { wrapElement, nestedDialogs } = useNestedDialogs(store); props = useWrapElement(props, wrapElement, [wrapElement]); useSafeLayoutEffect(() => { if (!open) return; const dialog = ref.current; const activeElement = getActiveElement(dialog, true); if (!activeElement) return; if (activeElement.tagName === "BODY") return; if (dialog && contains(dialog, activeElement)) return; store.setDisclosureElement(activeElement); }, [store, open]); if (isSafariBrowser2) { (0, import_react27.useEffect)(() => { if (!mounted) return; const { disclosureElement } = store.getState(); if (!disclosureElement) return; if (!isButton(disclosureElement)) return; const onMouseDown = () => { let receivedFocus = false; const onFocus = () => { receivedFocus = true; }; const options2 = { capture: true, once: true }; disclosureElement.addEventListener("focusin", onFocus, options2); queueBeforeEvent(disclosureElement, "mouseup", () => { disclosureElement.removeEventListener("focusin", onFocus, true); if (receivedFocus) return; focusIfNeeded(disclosureElement); }); }; disclosureElement.addEventListener("mousedown", onMouseDown); return () => { disclosureElement.removeEventListener("mousedown", onMouseDown); }; }, [store, mounted]); } (0, import_react27.useEffect)(() => { if (!mounted) return; if (!domReady) return; const dialog = ref.current; if (!dialog) return; const win = getWindow(dialog); const viewport = win.visualViewport || win; const setViewportHeight = () => { var _a, _b; const height = (_b = (_a = win.visualViewport) == null ? void 0 : _a.height) != null ? _b : win.innerHeight; dialog.style.setProperty("--dialog-viewport-height", `${height}px`); }; setViewportHeight(); viewport.addEventListener("resize", setViewportHeight); return () => { viewport.removeEventListener("resize", setViewportHeight); }; }, [mounted, domReady]); (0, import_react27.useEffect)(() => { if (!modal) return; if (!mounted) return; if (!domReady) return; const dialog = ref.current; if (!dialog) return; const existingDismiss = dialog.querySelector("[data-dialog-dismiss]"); if (existingDismiss) return; return prependHiddenDismiss(dialog, store.hide); }, [store, modal, mounted, domReady]); useSafeLayoutEffect(() => { if (!supportsInert()) return; if (open) return; if (!mounted) return; if (!domReady) return; const dialog = ref.current; if (!dialog) return; return disableTree(dialog); }, [open, mounted, domReady]); const canTakeTreeSnapshot = open && domReady; useSafeLayoutEffect(() => { if (!id3) return; if (!canTakeTreeSnapshot) return; const dialog = ref.current; return createWalkTreeSnapshot(id3, [dialog]); }, [id3, canTakeTreeSnapshot, unstable_treeSnapshotKey]); const getPersistentElementsProp = useEvent(getPersistentElements); useSafeLayoutEffect(() => { if (!id3) return; if (!canTakeTreeSnapshot) return; const { disclosureElement } = store.getState(); const dialog = ref.current; const persistentElements = getPersistentElementsProp() || []; const allElements = [ dialog, ...persistentElements, ...nestedDialogs.map((dialog2) => dialog2.getState().contentElement) ]; if (modal) { return chain( markTreeOutside(id3, allElements), disableTreeOutside(id3, allElements) ); } return markTreeOutside(id3, [disclosureElement, ...allElements]); }, [ id3, store, canTakeTreeSnapshot, getPersistentElementsProp, nestedDialogs, modal, unstable_treeSnapshotKey ]); const mayAutoFocusOnShow = !!autoFocusOnShow; const autoFocusOnShowProp = useBooleanEvent(autoFocusOnShow); const [autoFocusEnabled, setAutoFocusEnabled] = (0, import_react27.useState)(false); (0, import_react27.useEffect)(() => { if (!open) return; if (!mayAutoFocusOnShow) return; if (!domReady) return; if (!(contentElement == null ? void 0 : contentElement.isConnected)) return; const element = getElementFromProp(initialFocus, true) || // If no initial focus is specified, we try to focus the first element // with the autofocus attribute. If it's an Ariakit component, the // Focusable component will consume the autoFocus prop and add the // data-autofocus attribute to the element instead. contentElement.querySelector( "[data-autofocus=true],[autofocus]" ) || // We have to fallback to the first focusable element otherwise portaled // dialogs with preserveTabOrder set to true will not receive focus // properly because the elements aren't tabbable until the dialog receives // focus. getFirstTabbableIn(contentElement, true, portal && preserveTabOrder) || // Finally, we fallback to the dialog element itself. contentElement; const isElementFocusable = isFocusable(element); if (!autoFocusOnShowProp(isElementFocusable ? element : null)) return; setAutoFocusEnabled(true); queueMicrotask(() => { element.focus(); if (!isSafariBrowser2) return; if (!isElementFocusable) return; element.scrollIntoView({ block: "nearest", inline: "nearest" }); }); }, [ open, mayAutoFocusOnShow, domReady, contentElement, initialFocus, portal, preserveTabOrder, autoFocusOnShowProp ]); const mayAutoFocusOnHide = !!autoFocusOnHide; const autoFocusOnHideProp = useBooleanEvent(autoFocusOnHide); const [hasOpened, setHasOpened] = (0, import_react27.useState)(false); (0, import_react27.useEffect)(() => { if (!open) return; setHasOpened(true); return () => setHasOpened(false); }, [open]); const focusOnHide = (0, import_react27.useCallback)( (dialog, retry = true) => { const { disclosureElement } = store.getState(); if (isAlreadyFocusingAnotherElement(dialog)) return; let element = getElementFromProp(finalFocus) || disclosureElement; if (element == null ? void 0 : element.id) { const doc = getDocument(element); const selector2 = `[aria-activedescendant="${element.id}"]`; const composite = doc.querySelector(selector2); if (composite) { element = composite; } } if (element && !isFocusable(element)) { const maybeParentDialog = element.closest("[data-dialog]"); if (maybeParentDialog == null ? void 0 : maybeParentDialog.id) { const doc = getDocument(maybeParentDialog); const selector2 = `[aria-controls~="${maybeParentDialog.id}"]`; const control = doc.querySelector(selector2); if (control) { element = control; } } } const isElementFocusable = element && isFocusable(element); if (!isElementFocusable && retry) { requestAnimationFrame(() => focusOnHide(dialog, false)); return; } if (!autoFocusOnHideProp(isElementFocusable ? element : null)) return; if (!isElementFocusable) return; element == null ? void 0 : element.focus({ preventScroll: true }); }, [store, finalFocus, autoFocusOnHideProp] ); const focusedOnHideRef = (0, import_react27.useRef)(false); useSafeLayoutEffect(() => { if (open) return; if (!hasOpened) return; if (!mayAutoFocusOnHide) return; const dialog = ref.current; focusedOnHideRef.current = true; focusOnHide(dialog); }, [open, hasOpened, domReady, mayAutoFocusOnHide, focusOnHide]); (0, import_react27.useEffect)(() => { if (!hasOpened) return; if (!mayAutoFocusOnHide) return; const dialog = ref.current; return () => { if (focusedOnHideRef.current) { focusedOnHideRef.current = false; return; } focusOnHide(dialog); }; }, [hasOpened, mayAutoFocusOnHide, focusOnHide]); const hideOnEscapeProp = useBooleanEvent(hideOnEscape); (0, import_react27.useEffect)(() => { if (!domReady) return; if (!mounted) return; const onKeyDown = (event) => { if (event.key !== "Escape") return; if (event.defaultPrevented) return; const dialog = ref.current; if (!dialog) return; if (isElementMarked(dialog)) return; const target = event.target; if (!target) return; const { disclosureElement } = store.getState(); const isValidTarget = () => { if (target.tagName === "BODY") return true; if (contains(dialog, target)) return true; if (!disclosureElement) return true; if (contains(disclosureElement, target)) return true; return false; }; if (!isValidTarget()) return; if (!hideOnEscapeProp(event)) return; store.hide(); }; return addGlobalEventListener("keydown", onKeyDown, true); }, [store, domReady, mounted, hideOnEscapeProp]); props = useWrapElement( props, (element) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(HeadingLevel, { level: modal ? 1 : void 0, children: element }), [modal] ); const hiddenProp = props.hidden; const alwaysVisible = props.alwaysVisible; props = useWrapElement( props, (element) => { if (!backdrop) return element; return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)( DialogBackdrop, { store, backdrop, hidden: hiddenProp, alwaysVisible } ), element ] }); }, [store, backdrop, hiddenProp, alwaysVisible] ); const [headingId, setHeadingId] = (0, import_react27.useState)(); const [descriptionId, setDescriptionId] = (0, import_react27.useState)(); props = useWrapElement( props, (element) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DialogScopedContextProvider, { value: store, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DialogHeadingContext.Provider, { value: setHeadingId, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DialogDescriptionContext.Provider, { value: setDescriptionId, children: element }) }) }), [store] ); props = { id: id3, "data-dialog": "", role: "dialog", tabIndex: focusable ? -1 : void 0, "aria-labelledby": headingId, "aria-describedby": descriptionId, ...props, ref: useMergeRefs(ref, props.ref) }; props = useFocusableContainer({ ...props, autoFocusOnShow: autoFocusEnabled }); props = useDisclosureContent({ store, ...props }); props = useFocusable({ ...props, focusable }); props = usePortal({ portal, ...props, portalRef, preserveTabOrder }); return props; }); function createDialogComponent(Component9, useProviderContext = useDialogProviderContext) { return forwardRef2(function DialogComponent(props) { const context = useProviderContext(); const store = props.store || context; const mounted = useStoreState( store, (state) => !props.unmountOnHide || (state == null ? void 0 : state.mounted) || !!props.open ); if (!mounted) return null; return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Component9, { ...props }); }); } var Dialog = createDialogComponent( forwardRef2(function Dialog2(props) { const htmlProps = useDialog(props); return createElement(TagName19, htmlProps); }), useDialogProviderContext ); // node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs var min = Math.min; var max = Math.max; var round = Math.round; var floor = Math.floor; var createCoords = (v3) => ({ x: v3, y: v3 }); var oppositeSideMap = { left: "right", right: "left", bottom: "top", top: "bottom" }; var oppositeAlignmentMap = { start: "end", end: "start" }; function clamp(start, value, end) { return max(start, min(value, end)); } function evaluate(value, param) { return typeof value === "function" ? value(param) : value; } function getSide(placement) { return placement.split("-")[0]; } function getAlignment(placement) { return placement.split("-")[1]; } function getOppositeAxis(axis) { return axis === "x" ? "y" : "x"; } function getAxisLength(axis) { return axis === "y" ? "height" : "width"; } var yAxisSides = /* @__PURE__ */ new Set(["top", "bottom"]); function getSideAxis(placement) { return yAxisSides.has(getSide(placement)) ? "y" : "x"; } function getAlignmentAxis(placement) { return getOppositeAxis(getSideAxis(placement)); } function getAlignmentSides(placement, rects, rtl2) { if (rtl2 === void 0) { rtl2 = false; } const alignment = getAlignment(placement); const alignmentAxis = getAlignmentAxis(placement); const length2 = getAxisLength(alignmentAxis); let mainAlignmentSide = alignmentAxis === "x" ? alignment === (rtl2 ? "end" : "start") ? "right" : "left" : alignment === "start" ? "bottom" : "top"; if (rects.reference[length2] > rects.floating[length2]) { mainAlignmentSide = getOppositePlacement(mainAlignmentSide); } return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)]; } function getExpandedPlacements(placement) { const oppositePlacement = getOppositePlacement(placement); return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)]; } function getOppositeAlignmentPlacement(placement) { return placement.replace(/start|end/g, (alignment) => oppositeAlignmentMap[alignment]); } var lrPlacement = ["left", "right"]; var rlPlacement = ["right", "left"]; var tbPlacement = ["top", "bottom"]; var btPlacement = ["bottom", "top"]; function getSideList(side, isStart, rtl2) { switch (side) { case "top": case "bottom": if (rtl2) return isStart ? rlPlacement : lrPlacement; return isStart ? lrPlacement : rlPlacement; case "left": case "right": return isStart ? tbPlacement : btPlacement; default: return []; } } function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl2) { const alignment = getAlignment(placement); let list = getSideList(getSide(placement), direction === "start", rtl2); if (alignment) { list = list.map((side) => side + "-" + alignment); if (flipAlignment) { list = list.concat(list.map(getOppositeAlignmentPlacement)); } } return list; } function getOppositePlacement(placement) { return placement.replace(/left|right|bottom|top/g, (side) => oppositeSideMap[side]); } function expandPaddingObject(padding2) { return { top: 0, right: 0, bottom: 0, left: 0, ...padding2 }; } function getPaddingObject(padding2) { return typeof padding2 !== "number" ? expandPaddingObject(padding2) : { top: padding2, right: padding2, bottom: padding2, left: padding2 }; } function rectToClientRect(rect) { const { x: x2, y: y3, width, height } = rect; return { width, height, top: y3, left: x2, right: x2 + width, bottom: y3 + height, x: x2, y: y3 }; } // node_modules/@floating-ui/core/dist/floating-ui.core.mjs function computeCoordsFromPlacement(_ref11, placement, rtl2) { let { reference, floating } = _ref11; const sideAxis = getSideAxis(placement); const alignmentAxis = getAlignmentAxis(placement); const alignLength = getAxisLength(alignmentAxis); const side = getSide(placement); const isVertical = sideAxis === "y"; const commonX = reference.x + reference.width / 2 - floating.width / 2; const commonY = reference.y + reference.height / 2 - floating.height / 2; const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2; let coords; switch (side) { case "top": coords = { x: commonX, y: reference.y - floating.height }; break; case "bottom": coords = { x: commonX, y: reference.y + reference.height }; break; case "right": coords = { x: reference.x + reference.width, y: commonY }; break; case "left": coords = { x: reference.x - floating.width, y: commonY }; break; default: coords = { x: reference.x, y: reference.y }; } switch (getAlignment(placement)) { case "start": coords[alignmentAxis] -= commonAlign * (rtl2 && isVertical ? -1 : 1); break; case "end": coords[alignmentAxis] += commonAlign * (rtl2 && isVertical ? -1 : 1); break; } return coords; } var computePosition = async (reference, floating, config) => { const { placement = "bottom", strategy = "absolute", middleware: middleware2 = [], platform: platform2 } = config; const validMiddleware = middleware2.filter(Boolean); const rtl2 = await (platform2.isRTL == null ? void 0 : platform2.isRTL(floating)); let rects = await platform2.getElementRects({ reference, floating, strategy }); let { x: x2, y: y3 } = computeCoordsFromPlacement(rects, placement, rtl2); let statefulPlacement = placement; let middlewareData = {}; let resetCount = 0; for (let i3 = 0; i3 < validMiddleware.length; i3++) { const { name, fn } = validMiddleware[i3]; const { x: nextX, y: nextY, data, reset } = await fn({ x: x2, y: y3, initialPlacement: placement, placement: statefulPlacement, strategy, middlewareData, rects, platform: platform2, elements: { reference, floating } }); x2 = nextX != null ? nextX : x2; y3 = nextY != null ? nextY : y3; middlewareData = { ...middlewareData, [name]: { ...middlewareData[name], ...data } }; if (reset && resetCount <= 50) { resetCount++; if (typeof reset === "object") { if (reset.placement) { statefulPlacement = reset.placement; } if (reset.rects) { rects = reset.rects === true ? await platform2.getElementRects({ reference, floating, strategy }) : reset.rects; } ({ x: x2, y: y3 } = computeCoordsFromPlacement(rects, statefulPlacement, rtl2)); } i3 = -1; } } return { x: x2, y: y3, placement: statefulPlacement, strategy, middlewareData }; }; async function detectOverflow(state, options2) { var _await$platform$isEle; if (options2 === void 0) { options2 = {}; } const { x: x2, y: y3, platform: platform2, rects, elements: elements2, strategy } = state; const { boundary = "clippingAncestors", rootBoundary = "viewport", elementContext = "floating", altBoundary = false, padding: padding2 = 0 } = evaluate(options2, state); const paddingObject = getPaddingObject(padding2); const altContext = elementContext === "floating" ? "reference" : "floating"; const element = elements2[altBoundary ? altContext : elementContext]; const clippingClientRect = rectToClientRect(await platform2.getClippingRect({ element: ((_await$platform$isEle = await (platform2.isElement == null ? void 0 : platform2.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || await (platform2.getDocumentElement == null ? void 0 : platform2.getDocumentElement(elements2.floating)), boundary, rootBoundary, strategy })); const rect = elementContext === "floating" ? { x: x2, y: y3, width: rects.floating.width, height: rects.floating.height } : rects.reference; const offsetParent = await (platform2.getOffsetParent == null ? void 0 : platform2.getOffsetParent(elements2.floating)); const offsetScale = await (platform2.isElement == null ? void 0 : platform2.isElement(offsetParent)) ? await (platform2.getScale == null ? void 0 : platform2.getScale(offsetParent)) || { x: 1, y: 1 } : { x: 1, y: 1 }; const elementClientRect = rectToClientRect(platform2.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform2.convertOffsetParentRelativeRectToViewportRelativeRect({ elements: elements2, rect, offsetParent, strategy }) : rect); return { top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y, bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y, left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x, right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x }; } var arrow = (options2) => ({ name: "arrow", options: options2, async fn(state) { const { x: x2, y: y3, placement, rects, platform: platform2, elements: elements2, middlewareData } = state; const { element, padding: padding2 = 0 } = evaluate(options2, state) || {}; if (element == null) { return {}; } const paddingObject = getPaddingObject(padding2); const coords = { x: x2, y: y3 }; const axis = getAlignmentAxis(placement); const length2 = getAxisLength(axis); const arrowDimensions = await platform2.getDimensions(element); const isYAxis = axis === "y"; const minProp = isYAxis ? "top" : "left"; const maxProp = isYAxis ? "bottom" : "right"; const clientProp = isYAxis ? "clientHeight" : "clientWidth"; const endDiff = rects.reference[length2] + rects.reference[axis] - coords[axis] - rects.floating[length2]; const startDiff = coords[axis] - rects.reference[axis]; const arrowOffsetParent = await (platform2.getOffsetParent == null ? void 0 : platform2.getOffsetParent(element)); let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0; if (!clientSize || !await (platform2.isElement == null ? void 0 : platform2.isElement(arrowOffsetParent))) { clientSize = elements2.floating[clientProp] || rects.floating[length2]; } const centerToReference = endDiff / 2 - startDiff / 2; const largestPossiblePadding = clientSize / 2 - arrowDimensions[length2] / 2 - 1; const minPadding = min(paddingObject[minProp], largestPossiblePadding); const maxPadding = min(paddingObject[maxProp], largestPossiblePadding); const min$1 = minPadding; const max3 = clientSize - arrowDimensions[length2] - maxPadding; const center = clientSize / 2 - arrowDimensions[length2] / 2 + centerToReference; const offset3 = clamp(min$1, center, max3); const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset3 && rects.reference[length2] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length2] / 2 < 0; const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max3 : 0; return { [axis]: coords[axis] + alignmentOffset, data: { [axis]: offset3, centerOffset: center - offset3 - alignmentOffset, ...shouldAddOffset && { alignmentOffset } }, reset: shouldAddOffset }; } }); var flip = function(options2) { if (options2 === void 0) { options2 = {}; } return { name: "flip", options: options2, async fn(state) { var _middlewareData$arrow, _middlewareData$flip; const { placement, middlewareData, rects, initialPlacement, platform: platform2, elements: elements2 } = state; const { mainAxis: checkMainAxis = true, crossAxis: checkCrossAxis = true, fallbackPlacements: specifiedFallbackPlacements, fallbackStrategy = "bestFit", fallbackAxisSideDirection = "none", flipAlignment = true, ...detectOverflowOptions } = evaluate(options2, state); if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { return {}; } const side = getSide(placement); const initialSideAxis = getSideAxis(initialPlacement); const isBasePlacement = getSide(initialPlacement) === initialPlacement; const rtl2 = await (platform2.isRTL == null ? void 0 : platform2.isRTL(elements2.floating)); const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement)); const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== "none"; if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) { fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl2)); } const placements2 = [initialPlacement, ...fallbackPlacements]; const overflow = await detectOverflow(state, detectOverflowOptions); const overflows = []; let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || []; if (checkMainAxis) { overflows.push(overflow[side]); } if (checkCrossAxis) { const sides3 = getAlignmentSides(placement, rects, rtl2); overflows.push(overflow[sides3[0]], overflow[sides3[1]]); } overflowsData = [...overflowsData, { placement, overflows }]; if (!overflows.every((side2) => side2 <= 0)) { var _middlewareData$flip2, _overflowsData$filter; const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1; const nextPlacement = placements2[nextIndex]; if (nextPlacement) { const ignoreCrossAxisOverflow = checkCrossAxis === "alignment" ? initialSideAxis !== getSideAxis(nextPlacement) : false; if (!ignoreCrossAxisOverflow || // We leave the current main axis only if every placement on that axis // overflows the main axis. overflowsData.every((d3) => getSideAxis(d3.placement) === initialSideAxis ? d3.overflows[0] > 0 : true)) { return { data: { index: nextIndex, overflows: overflowsData }, reset: { placement: nextPlacement } }; } } let resetPlacement = (_overflowsData$filter = overflowsData.filter((d3) => d3.overflows[0] <= 0).sort((a3, b3) => a3.overflows[1] - b3.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement; if (!resetPlacement) { switch (fallbackStrategy) { case "bestFit": { var _overflowsData$filter2; const placement2 = (_overflowsData$filter2 = overflowsData.filter((d3) => { if (hasFallbackAxisSideDirection) { const currentSideAxis = getSideAxis(d3.placement); return currentSideAxis === initialSideAxis || // Create a bias to the `y` side axis due to horizontal // reading directions favoring greater width. currentSideAxis === "y"; } return true; }).map((d3) => [d3.placement, d3.overflows.filter((overflow2) => overflow2 > 0).reduce((acc, overflow2) => acc + overflow2, 0)]).sort((a3, b3) => a3[1] - b3[1])[0]) == null ? void 0 : _overflowsData$filter2[0]; if (placement2) { resetPlacement = placement2; } break; } case "initialPlacement": resetPlacement = initialPlacement; break; } } if (placement !== resetPlacement) { return { reset: { placement: resetPlacement } }; } } return {}; } }; }; var originSides = /* @__PURE__ */ new Set(["left", "top"]); async function convertValueToCoords(state, options2) { const { placement, platform: platform2, elements: elements2 } = state; const rtl2 = await (platform2.isRTL == null ? void 0 : platform2.isRTL(elements2.floating)); const side = getSide(placement); const alignment = getAlignment(placement); const isVertical = getSideAxis(placement) === "y"; const mainAxisMulti = originSides.has(side) ? -1 : 1; const crossAxisMulti = rtl2 && isVertical ? -1 : 1; const rawValue = evaluate(options2, state); let { mainAxis, crossAxis, alignmentAxis } = typeof rawValue === "number" ? { mainAxis: rawValue, crossAxis: 0, alignmentAxis: null } : { mainAxis: rawValue.mainAxis || 0, crossAxis: rawValue.crossAxis || 0, alignmentAxis: rawValue.alignmentAxis }; if (alignment && typeof alignmentAxis === "number") { crossAxis = alignment === "end" ? alignmentAxis * -1 : alignmentAxis; } return isVertical ? { x: crossAxis * crossAxisMulti, y: mainAxis * mainAxisMulti } : { x: mainAxis * mainAxisMulti, y: crossAxis * crossAxisMulti }; } var offset = function(options2) { if (options2 === void 0) { options2 = 0; } return { name: "offset", options: options2, async fn(state) { var _middlewareData$offse, _middlewareData$arrow; const { x: x2, y: y3, placement, middlewareData } = state; const diffCoords = await convertValueToCoords(state, options2); if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { return {}; } return { x: x2 + diffCoords.x, y: y3 + diffCoords.y, data: { ...diffCoords, placement } }; } }; }; var shift = function(options2) { if (options2 === void 0) { options2 = {}; } return { name: "shift", options: options2, async fn(state) { const { x: x2, y: y3, placement } = state; const { mainAxis: checkMainAxis = true, crossAxis: checkCrossAxis = false, limiter = { fn: (_ref11) => { let { x: x3, y: y4 } = _ref11; return { x: x3, y: y4 }; } }, ...detectOverflowOptions } = evaluate(options2, state); const coords = { x: x2, y: y3 }; const overflow = await detectOverflow(state, detectOverflowOptions); const crossAxis = getSideAxis(getSide(placement)); const mainAxis = getOppositeAxis(crossAxis); let mainAxisCoord = coords[mainAxis]; let crossAxisCoord = coords[crossAxis]; if (checkMainAxis) { const minSide = mainAxis === "y" ? "top" : "left"; const maxSide = mainAxis === "y" ? "bottom" : "right"; const min3 = mainAxisCoord + overflow[minSide]; const max3 = mainAxisCoord - overflow[maxSide]; mainAxisCoord = clamp(min3, mainAxisCoord, max3); } if (checkCrossAxis) { const minSide = crossAxis === "y" ? "top" : "left"; const maxSide = crossAxis === "y" ? "bottom" : "right"; const min3 = crossAxisCoord + overflow[minSide]; const max3 = crossAxisCoord - overflow[maxSide]; crossAxisCoord = clamp(min3, crossAxisCoord, max3); } const limitedCoords = limiter.fn({ ...state, [mainAxis]: mainAxisCoord, [crossAxis]: crossAxisCoord }); return { ...limitedCoords, data: { x: limitedCoords.x - x2, y: limitedCoords.y - y3, enabled: { [mainAxis]: checkMainAxis, [crossAxis]: checkCrossAxis } } }; } }; }; var limitShift = function(options2) { if (options2 === void 0) { options2 = {}; } return { options: options2, fn(state) { const { x: x2, y: y3, placement, rects, middlewareData } = state; const { offset: offset3 = 0, mainAxis: checkMainAxis = true, crossAxis: checkCrossAxis = true } = evaluate(options2, state); const coords = { x: x2, y: y3 }; const crossAxis = getSideAxis(placement); const mainAxis = getOppositeAxis(crossAxis); let mainAxisCoord = coords[mainAxis]; let crossAxisCoord = coords[crossAxis]; const rawOffset = evaluate(offset3, state); const computedOffset = typeof rawOffset === "number" ? { mainAxis: rawOffset, crossAxis: 0 } : { mainAxis: 0, crossAxis: 0, ...rawOffset }; if (checkMainAxis) { const len = mainAxis === "y" ? "height" : "width"; const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis; const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis; if (mainAxisCoord < limitMin) { mainAxisCoord = limitMin; } else if (mainAxisCoord > limitMax) { mainAxisCoord = limitMax; } } if (checkCrossAxis) { var _middlewareData$offse, _middlewareData$offse2; const len = mainAxis === "y" ? "width" : "height"; const isOriginSide = originSides.has(getSide(placement)); const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis); const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0); if (crossAxisCoord < limitMin) { crossAxisCoord = limitMin; } else if (crossAxisCoord > limitMax) { crossAxisCoord = limitMax; } } return { [mainAxis]: mainAxisCoord, [crossAxis]: crossAxisCoord }; } }; }; var size = function(options2) { if (options2 === void 0) { options2 = {}; } return { name: "size", options: options2, async fn(state) { var _state$middlewareData, _state$middlewareData2; const { placement, rects, platform: platform2, elements: elements2 } = state; const { apply = () => { }, ...detectOverflowOptions } = evaluate(options2, state); const overflow = await detectOverflow(state, detectOverflowOptions); const side = getSide(placement); const alignment = getAlignment(placement); const isYAxis = getSideAxis(placement) === "y"; const { width, height } = rects.floating; let heightSide; let widthSide; if (side === "top" || side === "bottom") { heightSide = side; widthSide = alignment === (await (platform2.isRTL == null ? void 0 : platform2.isRTL(elements2.floating)) ? "start" : "end") ? "left" : "right"; } else { widthSide = side; heightSide = alignment === "end" ? "top" : "bottom"; } const maximumClippingHeight = height - overflow.top - overflow.bottom; const maximumClippingWidth = width - overflow.left - overflow.right; const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight); const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth); const noShift = !state.middlewareData.shift; let availableHeight = overflowAvailableHeight; let availableWidth = overflowAvailableWidth; if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) { availableWidth = maximumClippingWidth; } if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) { availableHeight = maximumClippingHeight; } if (noShift && !alignment) { const xMin = max(overflow.left, 0); const xMax = max(overflow.right, 0); const yMin = max(overflow.top, 0); const yMax = max(overflow.bottom, 0); if (isYAxis) { availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right)); } else { availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom)); } } await apply({ ...state, availableWidth, availableHeight }); const nextDimensions = await platform2.getDimensions(elements2.floating); if (width !== nextDimensions.width || height !== nextDimensions.height) { return { reset: { rects: true } }; } return {}; } }; }; // node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs function hasWindow() { return typeof window !== "undefined"; } function getNodeName(node2) { if (isNode(node2)) { return (node2.nodeName || "").toLowerCase(); } return "#document"; } function getWindow2(node2) { var _node$ownerDocument; return (node2 == null || (_node$ownerDocument = node2.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window; } function getDocumentElement(node2) { var _ref11; return (_ref11 = (isNode(node2) ? node2.ownerDocument : node2.document) || window.document) == null ? void 0 : _ref11.documentElement; } function isNode(value) { if (!hasWindow()) { return false; } return value instanceof Node || value instanceof getWindow2(value).Node; } function isElement(value) { if (!hasWindow()) { return false; } return value instanceof Element || value instanceof getWindow2(value).Element; } function isHTMLElement(value) { if (!hasWindow()) { return false; } return value instanceof HTMLElement || value instanceof getWindow2(value).HTMLElement; } function isShadowRoot(value) { if (!hasWindow() || typeof ShadowRoot === "undefined") { return false; } return value instanceof ShadowRoot || value instanceof getWindow2(value).ShadowRoot; } var invalidOverflowDisplayValues = /* @__PURE__ */ new Set(["inline", "contents"]); function isOverflowElement(element) { const { overflow, overflowX, overflowY, display } = getComputedStyle2(element); return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display); } var tableElements = /* @__PURE__ */ new Set(["table", "td", "th"]); function isTableElement(element) { return tableElements.has(getNodeName(element)); } var topLayerSelectors = [":popover-open", ":modal"]; function isTopLayer(element) { return topLayerSelectors.some((selector2) => { try { return element.matches(selector2); } catch (_e) { return false; } }); } var transformProperties = ["transform", "translate", "scale", "rotate", "perspective"]; var willChangeValues = ["transform", "translate", "scale", "rotate", "perspective", "filter"]; var containValues = ["paint", "layout", "strict", "content"]; function isContainingBlock(elementOrCss) { const webkit = isWebKit(); const css3 = isElement(elementOrCss) ? getComputedStyle2(elementOrCss) : elementOrCss; return transformProperties.some((value) => css3[value] ? css3[value] !== "none" : false) || (css3.containerType ? css3.containerType !== "normal" : false) || !webkit && (css3.backdropFilter ? css3.backdropFilter !== "none" : false) || !webkit && (css3.filter ? css3.filter !== "none" : false) || willChangeValues.some((value) => (css3.willChange || "").includes(value)) || containValues.some((value) => (css3.contain || "").includes(value)); } function getContainingBlock(element) { let currentNode = getParentNode(element); while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) { if (isContainingBlock(currentNode)) { return currentNode; } else if (isTopLayer(currentNode)) { return null; } currentNode = getParentNode(currentNode); } return null; } function isWebKit() { if (typeof CSS === "undefined" || !CSS.supports) return false; return CSS.supports("-webkit-backdrop-filter", "none"); } var lastTraversableNodeNames = /* @__PURE__ */ new Set(["html", "body", "#document"]); function isLastTraversableNode(node2) { return lastTraversableNodeNames.has(getNodeName(node2)); } function getComputedStyle2(element) { return getWindow2(element).getComputedStyle(element); } function getNodeScroll(element) { if (isElement(element)) { return { scrollLeft: element.scrollLeft, scrollTop: element.scrollTop }; } return { scrollLeft: element.scrollX, scrollTop: element.scrollY }; } function getParentNode(node2) { if (getNodeName(node2) === "html") { return node2; } const result = ( // Step into the shadow DOM of the parent of a slotted node. node2.assignedSlot || // DOM Element detected. node2.parentNode || // ShadowRoot detected. isShadowRoot(node2) && node2.host || // Fallback. getDocumentElement(node2) ); return isShadowRoot(result) ? result.host : result; } function getNearestOverflowAncestor(node2) { const parentNode = getParentNode(node2); if (isLastTraversableNode(parentNode)) { return node2.ownerDocument ? node2.ownerDocument.body : node2.body; } if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) { return parentNode; } return getNearestOverflowAncestor(parentNode); } function getOverflowAncestors(node2, list, traverseIframes) { var _node$ownerDocument2; if (list === void 0) { list = []; } if (traverseIframes === void 0) { traverseIframes = true; } const scrollableAncestor = getNearestOverflowAncestor(node2); const isBody = scrollableAncestor === ((_node$ownerDocument2 = node2.ownerDocument) == null ? void 0 : _node$ownerDocument2.body); const win = getWindow2(scrollableAncestor); if (isBody) { const frameElement = getFrameElement(win); return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []); } return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes)); } function getFrameElement(win) { return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null; } // node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs function getCssDimensions(element) { const css3 = getComputedStyle2(element); let width = parseFloat(css3.width) || 0; let height = parseFloat(css3.height) || 0; const hasOffset = isHTMLElement(element); const offsetWidth = hasOffset ? element.offsetWidth : width; const offsetHeight = hasOffset ? element.offsetHeight : height; const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight; if (shouldFallback) { width = offsetWidth; height = offsetHeight; } return { width, height, $: shouldFallback }; } function unwrapElement(element) { return !isElement(element) ? element.contextElement : element; } function getScale(element) { const domElement = unwrapElement(element); if (!isHTMLElement(domElement)) { return createCoords(1); } const rect = domElement.getBoundingClientRect(); const { width, height, $: $3 } = getCssDimensions(domElement); let x2 = ($3 ? round(rect.width) : rect.width) / width; let y3 = ($3 ? round(rect.height) : rect.height) / height; if (!x2 || !Number.isFinite(x2)) { x2 = 1; } if (!y3 || !Number.isFinite(y3)) { y3 = 1; } return { x: x2, y: y3 }; } var noOffsets = /* @__PURE__ */ createCoords(0); function getVisualOffsets(element) { const win = getWindow2(element); if (!isWebKit() || !win.visualViewport) { return noOffsets; } return { x: win.visualViewport.offsetLeft, y: win.visualViewport.offsetTop }; } function shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) { if (isFixed === void 0) { isFixed = false; } if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow2(element)) { return false; } return isFixed; } function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) { if (includeScale === void 0) { includeScale = false; } if (isFixedStrategy === void 0) { isFixedStrategy = false; } const clientRect = element.getBoundingClientRect(); const domElement = unwrapElement(element); let scale2 = createCoords(1); if (includeScale) { if (offsetParent) { if (isElement(offsetParent)) { scale2 = getScale(offsetParent); } } else { scale2 = getScale(element); } } const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0); let x2 = (clientRect.left + visualOffsets.x) / scale2.x; let y3 = (clientRect.top + visualOffsets.y) / scale2.y; let width = clientRect.width / scale2.x; let height = clientRect.height / scale2.y; if (domElement) { const win = getWindow2(domElement); const offsetWin = offsetParent && isElement(offsetParent) ? getWindow2(offsetParent) : offsetParent; let currentWin = win; let currentIFrame = getFrameElement(currentWin); while (currentIFrame && offsetParent && offsetWin !== currentWin) { const iframeScale = getScale(currentIFrame); const iframeRect = currentIFrame.getBoundingClientRect(); const css3 = getComputedStyle2(currentIFrame); const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css3.paddingLeft)) * iframeScale.x; const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css3.paddingTop)) * iframeScale.y; x2 *= iframeScale.x; y3 *= iframeScale.y; width *= iframeScale.x; height *= iframeScale.y; x2 += left; y3 += top; currentWin = getWindow2(currentIFrame); currentIFrame = getFrameElement(currentWin); } } return rectToClientRect({ width, height, x: x2, y: y3 }); } function getWindowScrollBarX(element, rect) { const leftScroll = getNodeScroll(element).scrollLeft; if (!rect) { return getBoundingClientRect(getDocumentElement(element)).left + leftScroll; } return rect.left + leftScroll; } function getHTMLOffset(documentElement, scroll) { const htmlRect = documentElement.getBoundingClientRect(); const x2 = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect); const y3 = htmlRect.top + scroll.scrollTop; return { x: x2, y: y3 }; } function convertOffsetParentRelativeRectToViewportRelativeRect(_ref11) { let { elements: elements2, rect, offsetParent, strategy } = _ref11; const isFixed = strategy === "fixed"; const documentElement = getDocumentElement(offsetParent); const topLayer = elements2 ? isTopLayer(elements2.floating) : false; if (offsetParent === documentElement || topLayer && isFixed) { return rect; } let scroll = { scrollLeft: 0, scrollTop: 0 }; let scale2 = createCoords(1); const offsets = createCoords(0); const isOffsetParentAnElement = isHTMLElement(offsetParent); if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) { scroll = getNodeScroll(offsetParent); } if (isHTMLElement(offsetParent)) { const offsetRect = getBoundingClientRect(offsetParent); scale2 = getScale(offsetParent); offsets.x = offsetRect.x + offsetParent.clientLeft; offsets.y = offsetRect.y + offsetParent.clientTop; } } const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0); return { width: rect.width * scale2.x, height: rect.height * scale2.y, x: rect.x * scale2.x - scroll.scrollLeft * scale2.x + offsets.x + htmlOffset.x, y: rect.y * scale2.y - scroll.scrollTop * scale2.y + offsets.y + htmlOffset.y }; } function getClientRects(element) { return Array.from(element.getClientRects()); } function getDocumentRect(element) { const html = getDocumentElement(element); const scroll = getNodeScroll(element); const body = element.ownerDocument.body; const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth); const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight); let x2 = -scroll.scrollLeft + getWindowScrollBarX(element); const y3 = -scroll.scrollTop; if (getComputedStyle2(body).direction === "rtl") { x2 += max(html.clientWidth, body.clientWidth) - width; } return { width, height, x: x2, y: y3 }; } var SCROLLBAR_MAX = 25; function getViewportRect(element, strategy) { const win = getWindow2(element); const html = getDocumentElement(element); const visualViewport = win.visualViewport; let width = html.clientWidth; let height = html.clientHeight; let x2 = 0; let y3 = 0; if (visualViewport) { width = visualViewport.width; height = visualViewport.height; const visualViewportBased = isWebKit(); if (!visualViewportBased || visualViewportBased && strategy === "fixed") { x2 = visualViewport.offsetLeft; y3 = visualViewport.offsetTop; } } const windowScrollbarX = getWindowScrollBarX(html); if (windowScrollbarX <= 0) { const doc = html.ownerDocument; const body = doc.body; const bodyStyles = getComputedStyle(body); const bodyMarginInline = doc.compatMode === "CSS1Compat" ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0; const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline); if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) { width -= clippingStableScrollbarWidth; } } else if (windowScrollbarX <= SCROLLBAR_MAX) { width += windowScrollbarX; } return { width, height, x: x2, y: y3 }; } var absoluteOrFixed = /* @__PURE__ */ new Set(["absolute", "fixed"]); function getInnerBoundingClientRect(element, strategy) { const clientRect = getBoundingClientRect(element, true, strategy === "fixed"); const top = clientRect.top + element.clientTop; const left = clientRect.left + element.clientLeft; const scale2 = isHTMLElement(element) ? getScale(element) : createCoords(1); const width = element.clientWidth * scale2.x; const height = element.clientHeight * scale2.y; const x2 = left * scale2.x; const y3 = top * scale2.y; return { width, height, x: x2, y: y3 }; } function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) { let rect; if (clippingAncestor === "viewport") { rect = getViewportRect(element, strategy); } else if (clippingAncestor === "document") { rect = getDocumentRect(getDocumentElement(element)); } else if (isElement(clippingAncestor)) { rect = getInnerBoundingClientRect(clippingAncestor, strategy); } else { const visualOffsets = getVisualOffsets(element); rect = { x: clippingAncestor.x - visualOffsets.x, y: clippingAncestor.y - visualOffsets.y, width: clippingAncestor.width, height: clippingAncestor.height }; } return rectToClientRect(rect); } function hasFixedPositionAncestor(element, stopNode) { const parentNode = getParentNode(element); if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) { return false; } return getComputedStyle2(parentNode).position === "fixed" || hasFixedPositionAncestor(parentNode, stopNode); } function getClippingElementAncestors(element, cache2) { const cachedResult = cache2.get(element); if (cachedResult) { return cachedResult; } let result = getOverflowAncestors(element, [], false).filter((el) => isElement(el) && getNodeName(el) !== "body"); let currentContainingBlockComputedStyle = null; const elementIsFixed = getComputedStyle2(element).position === "fixed"; let currentNode = elementIsFixed ? getParentNode(element) : element; while (isElement(currentNode) && !isLastTraversableNode(currentNode)) { const computedStyle = getComputedStyle2(currentNode); const currentNodeIsContaining = isContainingBlock(currentNode); if (!currentNodeIsContaining && computedStyle.position === "fixed") { currentContainingBlockComputedStyle = null; } const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === "static" && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode); if (shouldDropCurrentNode) { result = result.filter((ancestor) => ancestor !== currentNode); } else { currentContainingBlockComputedStyle = computedStyle; } currentNode = getParentNode(currentNode); } cache2.set(element, result); return result; } function getClippingRect(_ref11) { let { element, boundary, rootBoundary, strategy } = _ref11; const elementClippingAncestors = boundary === "clippingAncestors" ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary); const clippingAncestors = [...elementClippingAncestors, rootBoundary]; const firstClippingAncestor = clippingAncestors[0]; const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => { const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy); accRect.top = max(rect.top, accRect.top); accRect.right = min(rect.right, accRect.right); accRect.bottom = min(rect.bottom, accRect.bottom); accRect.left = max(rect.left, accRect.left); return accRect; }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy)); return { width: clippingRect.right - clippingRect.left, height: clippingRect.bottom - clippingRect.top, x: clippingRect.left, y: clippingRect.top }; } function getDimensions(element) { const { width, height } = getCssDimensions(element); return { width, height }; } function getRectRelativeToOffsetParent(element, offsetParent, strategy) { const isOffsetParentAnElement = isHTMLElement(offsetParent); const documentElement = getDocumentElement(offsetParent); const isFixed = strategy === "fixed"; const rect = getBoundingClientRect(element, true, isFixed, offsetParent); let scroll = { scrollLeft: 0, scrollTop: 0 }; const offsets = createCoords(0); function setLeftRTLScrollbarOffset() { offsets.x = getWindowScrollBarX(documentElement); } if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) { scroll = getNodeScroll(offsetParent); } if (isOffsetParentAnElement) { const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent); offsets.x = offsetRect.x + offsetParent.clientLeft; offsets.y = offsetRect.y + offsetParent.clientTop; } else if (documentElement) { setLeftRTLScrollbarOffset(); } } if (isFixed && !isOffsetParentAnElement && documentElement) { setLeftRTLScrollbarOffset(); } const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0); const x2 = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x; const y3 = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y; return { x: x2, y: y3, width: rect.width, height: rect.height }; } function isStaticPositioned(element) { return getComputedStyle2(element).position === "static"; } function getTrueOffsetParent(element, polyfill) { if (!isHTMLElement(element) || getComputedStyle2(element).position === "fixed") { return null; } if (polyfill) { return polyfill(element); } let rawOffsetParent = element.offsetParent; if (getDocumentElement(element) === rawOffsetParent) { rawOffsetParent = rawOffsetParent.ownerDocument.body; } return rawOffsetParent; } function getOffsetParent(element, polyfill) { const win = getWindow2(element); if (isTopLayer(element)) { return win; } if (!isHTMLElement(element)) { let svgOffsetParent = getParentNode(element); while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) { if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) { return svgOffsetParent; } svgOffsetParent = getParentNode(svgOffsetParent); } return win; } let offsetParent = getTrueOffsetParent(element, polyfill); while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) { offsetParent = getTrueOffsetParent(offsetParent, polyfill); } if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) { return win; } return offsetParent || getContainingBlock(element) || win; } var getElementRects = async function(data) { const getOffsetParentFn = this.getOffsetParent || getOffsetParent; const getDimensionsFn = this.getDimensions; const floatingDimensions = await getDimensionsFn(data.floating); return { reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy), floating: { x: 0, y: 0, width: floatingDimensions.width, height: floatingDimensions.height } }; }; function isRTL(element) { return getComputedStyle2(element).direction === "rtl"; } var platform = { convertOffsetParentRelativeRectToViewportRelativeRect, getDocumentElement, getClippingRect, getOffsetParent, getElementRects, getClientRects, getDimensions, getScale, isElement, isRTL }; function rectsAreEqual(a3, b3) { return a3.x === b3.x && a3.y === b3.y && a3.width === b3.width && a3.height === b3.height; } function observeMove(element, onMove) { let io = null; let timeoutId; const root = getDocumentElement(element); function cleanup() { var _io; clearTimeout(timeoutId); (_io = io) == null || _io.disconnect(); io = null; } function refresh(skip, threshold) { if (skip === void 0) { skip = false; } if (threshold === void 0) { threshold = 1; } cleanup(); const elementRectForRootMargin = element.getBoundingClientRect(); const { left, top, width, height } = elementRectForRootMargin; if (!skip) { onMove(); } if (!width || !height) { return; } const insetTop = floor(top); const insetRight = floor(root.clientWidth - (left + width)); const insetBottom = floor(root.clientHeight - (top + height)); const insetLeft = floor(left); const rootMargin = -insetTop + "px " + -insetRight + "px " + -insetBottom + "px " + -insetLeft + "px"; const options2 = { rootMargin, threshold: max(0, min(1, threshold)) || 1 }; let isFirstUpdate = true; function handleObserve(entries) { const ratio = entries[0].intersectionRatio; if (ratio !== threshold) { if (!isFirstUpdate) { return refresh(); } if (!ratio) { timeoutId = setTimeout(() => { refresh(false, 1e-7); }, 1e3); } else { refresh(false, ratio); } } if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) { refresh(); } isFirstUpdate = false; } try { io = new IntersectionObserver(handleObserve, { ...options2, // Handle