From eef16f5a0f5af0aea313e411534643678ba4bea1 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 06 Sep 2026 20:58:21 +0000
Subject: [PATCH] =Polishing up the gutenberg sidebar for custom meta. Seems to be working more or less. Added integration with OpenStreetMaps for location fields. Still to add: row ordering for repeaters, Maybe a better view for the selector field (terms, posts, etc), ensure fields save correctly and repopulate.

---
 src/editor-fields/fields/checkbox-field.js |    2 
 src/editor-fields/fields/repeater-field.js |    5 
 package-lock.json                          | 2308 ++++++++++++++++++++++++++++++++++++++++++++++++++
 inc/registrar/helpers/AddCustomFields.php  |   16 
 src/editor-fields/fields/date-field.js     |    2 
 src/editor-fields/fields/switch-field.js   |    2 
 build/_meta/fields.js                      |    2 
 jvb.php                                    |    3 
 build/_meta/fields.asset.php               |    2 
 src/editor-fields/fields/location-field.js |   84 +
 inc/meta/MetaTypeManager.php               |    7 
 src/editor-fields/fields/text-field.js     |    2 
 inc/rest/_setup.php                        |    1 
 inc/rest/routes/OpenStreetMaps.php         |   47 +
 src/editor-fields/fields/time-field.js     |    7 
 src/editor-fields/fields/selector-field.js |   64 +
 src/editor-fields/fields/datetime-field.js |    2 
 package.json                               |   11 
 src/editor-fields/Fields.js                |   29 
 src/editor-fields/fields/select-field.js   |    2 
 src/editor-fields/fields/upload-field.js   |    7 
 src/editor-fields/Section.js               |   18 
 src/editor-fields/SidePanel.js             |   30 
 src/editor-fields/index.js                 |   14 
 24 files changed, 2,551 insertions(+), 116 deletions(-)

diff --git a/build/_meta/fields.asset.php b/build/_meta/fields.asset.php
index 690d791..fba0b04 100644
--- a/build/_meta/fields.asset.php
+++ b/build/_meta/fields.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-jsx-runtime', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-i18n', 'wp-plugins'), 'version' => '867be6566063509d0ebe');
+<?php return array('dependencies' => array('react', 'react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-i18n', 'wp-media-utils', 'wp-plugins', 'wp-url'), 'version' => 'db98e6b71865d1cce76d');
diff --git a/build/_meta/fields.js b/build/_meta/fields.js
index 6a0b93b..55bd086 100644
--- a/build/_meta/fields.js
+++ b/build/_meta/fields.js
@@ -1 +1 @@
-(()=>{"use strict";const e=window.wp.plugins,l=(window.wp.i18n,window.wp.compose),n=window.wp.data,t=window.wp.editor,i=window.wp.components,a=window.wp.coreData,o=window.ReactJSXRuntime,s={text:"text",email:"email",tel:"tel",url:"url",number:"number"},r=({field:e,value:l,onChange:n})=>"textarea"===e.type?(0,o.jsx)(i.TextareaControl,{label:e.label,help:e.description,value:l??"",onChange:n}):(0,o.jsx)(i.TextControl,{label:e.label,help:e.description,type:s[e.type]||"text",value:l??"",onChange:n,required:e.required}),c=({field:e,value:l,onChange:n})=>{const t=Object.entries(e.options||{}).map(([e,l])=>({label:l,value:e}));return"radio"===e.type?(0,o.jsx)(i.RadioControl,{label:e.label,help:e.description,selected:l,options:t,onChange:n}):(0,o.jsx)(i.SelectControl,{label:e.label,help:e.description,value:l??"",options:[{label:"— Select —",value:""},...t],onChange:n})},d=({field:e,value:l,onChange:n})=>{const t=Array.isArray(l)?l:[];return(0,o.jsxs)("fieldset",{children:[(0,o.jsx)("legend",{className:"jvb-field-label",children:e.label}),Object.entries(e.options||{}).map(([e,l])=>(0,o.jsx)(i.CheckboxControl,{label:l,checked:t.includes(e),onChange:l=>((e,l)=>{n(l?[...t,e]:t.filter(l=>l!==e))})(e,l)},e))]})},p=window.React,u=e=>{if(e.description&&0!==e.description.length)return(0,o.jsx)("p",{className:"hint",children:e.description})},m=e=>{if(e.description&&0!==e.description.length)return(0,o.jsx)("p",{className:"hint",children:e.description})},h={text:r,email:r,tel:r,url:r,number:r,textarea:r,select:c,radio:c,checkbox:d,set:d,true_false:({field:e,value:l,onChange:n})=>(0,o.jsx)(i.ToggleControl,{label:e.label,help:e.description,checked:!!l,onChange:n}),date:({field:e,value:l,onChange:n})=>{const[t,a]=(0,p.useState)(new Date);return(0,o.jsxs)("div",{className:"components-base-control",children:[(0,o.jsx)("label",{className:"components-base-control__label",children:e.label}),(0,o.jsx)(i.DatePicker,{currentDate:t,onChange:n,help:e.description,value:l??""}),u(e)]})},time:({field:e,value:l,onChange:n})=>{const[t,a]=(0,p.useState)(new Date);return(0,o.jsx)(i.TimePicker,{currentTime:t,onChange:n,label:e.label,help:e.description,value:l??"",is12Hour:!0})},datetime:({field:e,value:l,onChange:n})=>{const[t,a]=(0,p.useState)(new Date);return console.log(e),(0,o.jsxs)("div",{className:"components-base-control",children:[(0,o.jsx)("label",{className:"components-base-control__label",children:e.label}),(0,o.jsx)(i.DateTimePicker,{currentDate:t,onChange:n,label:e.label,help:e.description,value:l??"",is12Hour:!0}),m(e)]})}},b=({field:e,value:l,onChange:n})=>{const t=h[e.type];return t?(0,o.jsx)(i.PanelRow,{children:(0,o.jsx)(t,{field:e,value:l,onChange:n})}):null},g=({id:e,name:l,isOpen:n=!1})=>{const{content:t,fields:s,sections:r,base:c}=window.jvbFieldConfig||{},[d,p]=(0,a.useEntityProp)("postType",t,"meta");return(0,o.jsx)(i.PanelBody,{name:"jvb-"+e,title:l,initialOpen:n,children:s.map(e=>(0,o.jsx)(b,{field:e,value:d?.[e.name],onChange:l=>((e,l)=>p({...d,[e]:l}))(e.name,l)},e.name))})},w=()=>(0,o.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",fillRule:"evenodd",strokeLinecap:"square",strokeLinejoin:"round",strokeMiterlimit:"1.5",clipRule:"evenodd",viewBox:"0 0 32 32",children:(0,o.jsx)("path",{fill:"currentColor",fillRule:"nonzero",d:"M16.58 2.133c-7.715 0-15.14 6.014-14.547 13.707.561 7.287 6.938 13.185 13.938 13.947 8.25.898 14.47-5.953 14.004-13.988-.447-7.7-5.683-13.666-13.395-13.666m0 .607h.031v26.492q-.285-.017-.574-.048c-6.724-.732-12.86-6.391-13.398-13.391C2.072 8.442 9.209 2.74 16.58 2.74m-.488 1.145L16 3.889c-3.275.13-6.448 1.476-8.744 3.611-2.297 2.135-3.716 5.065-3.463 8.346.492 6.384 6.071 11.538 12.201 12.207l.09.01.021-.182-.091-.01c-6.041-.66-11.555-5.755-12.04-12.04-.247-3.221 1.142-6.092 3.405-8.196s5.4-3.437 8.629-3.565l.092-.004zm0 1.502L16 5.39c-2.868.113-5.647 1.293-7.658 3.164-2.012 1.87-3.255 4.436-3.033 7.31.43 5.593 5.316 10.106 10.685 10.692l.09.01.021-.18-.091-.01c-5.28-.576-10.1-5.031-10.524-10.525-.217-2.815.997-5.325 2.975-7.164 1.978-1.84 4.72-3.004 7.543-3.116l.092-.004zm0 1.504L16 6.893c-2.462.097-4.846 1.111-6.572 2.716-1.727 1.606-2.796 3.808-2.606 6.276.37 4.8 4.564 8.674 9.172 9.177l.09.01.021-.181-.091-.01c-4.52-.494-8.648-4.307-9.01-9.01-.186-2.408.854-4.554 2.547-6.129s4.04-2.57 6.457-2.666l.092-.004zm0 1.502L16 8.396c-2.055.082-4.045.926-5.486 2.266-1.442 1.34-2.335 3.182-2.176 5.244.309 4.009 3.808 7.24 7.656 7.66l.09.01.008-.068v-.002l.002-.01.004-.01v-.02l.007-.072-.091-.01c-3.76-.41-7.193-3.58-7.494-7.491-.155-2.002.709-3.787 2.117-5.096s3.361-2.14 5.37-2.219l.093-.004zm0 1.502L16 9.898a6.95 6.95 0 0 0-4.402 1.819c-1.157 1.075-1.872 2.553-1.744 4.209.247 3.216 3.053 5.81 6.14 6.146l.09.01.021-.182-.091-.01c-2.999-.327-5.739-2.86-5.979-5.978-.123-1.595.564-3.018 1.688-4.062a6.78 6.78 0 0 1 4.285-1.77l.092-.004zm0 1.503L16 11.4a5.24 5.24 0 0 0-3.316 1.372c-.872.81-1.413 1.924-1.317 3.173.187 2.425 2.3 4.377 4.627 4.631l.09.01.021-.182-.091-.01c-2.238-.244-4.286-2.136-4.465-4.462-.092-1.19.421-2.248 1.26-3.028a5.06 5.06 0 0 1 3.199-1.32l.092-.004zm0 1.502-.092.004a3.52 3.52 0 0 0-2.23.92c-.587.546-.952 1.3-.887 2.143.126 1.633 1.545 2.942 3.111 3.113h-.008l.01.002h.01l.078.01.022-.182-.092-.01c-1.477-.16-2.831-1.412-2.95-2.947-.06-.782.277-1.48.83-1.994a3.35 3.35 0 0 1 2.114-.873l.092-.004zm0 1.502-.092.004c-.43.017-.843.192-1.145.473-.301.28-.49.67-.457 1.107.065.841.791 1.512 1.596 1.6l.09.01.021-.182-.091-.01c-.717-.078-1.377-.688-1.434-1.431-.029-.377.132-.712.4-.961.269-.25.644-.409 1.028-.424l.092-.004z",clipRule:"nonzero",overflow:"visible"})}),x=(0,n.withSelect)(e=>({metaFields:e("core/editor").getEditedPostAttribute("meta"),postType:e("core/editor").getCurrentPostType()})),j=(0,n.withDispatch)(e=>({setMetaFields(l){e("core/editor").editPost({meta:l})}})),v=({section:e,fields:l,base:n})=>{const t=e.fields.map(e=>n+e);return l.filter(e=>t.includes(e.name))},f=e=>0===e,C=(0,l.compose)([x,j])(({postType:e,metaFields:l,setMetaFields:n})=>{const{content:i,fields:s,sections:r,base:c}=window.jvbFieldConfig||{},[d,p]=(0,a.useEntityProp)("postType",i,"meta");return s&&s.length?(console.log(s),console.log(r),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.PluginSidebarMoreMenuItem,{target:"jvb-meta-fields",icon:(0,o.jsx)(w,{}),children:"Additional Fields"}),(0,o.jsx)(t.PluginSidebar,{name:"jvb-meta-fields",icon:(0,o.jsx)(w,{}),title:"Additional Fields",children:Object.values(r).map((e,l)=>(0,o.jsx)(g,{id:e.slug,name:e.title,fields:v({section:e,fields:s,base:c}),meta:d,setMeta:p,isOpen:f(l)}))})]})):null});(0,e.registerPlugin)("jvb-meta-fields",{render:C})})();
\ No newline at end of file
+(()=>{"use strict";const e={n:l=>{const t=l&&l.__esModule?()=>l.default:()=>l;return e.d(t,{a:t}),t},d:(l,t)=>{for(var n in t)e.o(t,n)&&!e.o(l,n)&&Object.defineProperty(l,n,{enumerable:!0,get:t[n]})},o:(e,l)=>Object.hasOwn(e,l)},l=window.wp.plugins,t=(window.wp.i18n,window.wp.compose),n=window.wp.data,a=window.wp.editor,i=window.wp.coreData,s=window.wp.components,o=window.ReactJSXRuntime,r={text:"text",email:"email",tel:"tel",url:"url",number:"number"},d=({field:e,value:l,onChange:t})=>"textarea"===e.type?(0,o.jsx)(s.TextareaControl,{label:e.label,help:e.description,value:l??"",onChange:t,id:e.name}):(0,o.jsx)(s.TextControl,{label:e.label,help:e.description,type:r[e.type]||"text",value:l??"",onChange:t,required:e.required,id:e.name}),c=({field:e,value:l,onChange:t})=>{const n=Object.entries(e.options||{}).map(([e,l])=>({label:l,value:e}));return"radio"===e.type?(0,o.jsx)(s.RadioControl,{label:e.label,help:e.description,selected:l,options:n,onChange:t,id:e.name}):(0,o.jsx)(s.SelectControl,{label:e.label,help:e.description,value:l??"",options:[{label:"— Select —",value:""},...n],onChange:t,id:e.name})},u=({field:e,value:l,onChange:t})=>{const n=Array.isArray(l)?l:[];return(0,o.jsxs)("fieldset",{id:e.name,children:[(0,o.jsx)("legend",{className:"jvb-field-label",children:e.label}),Object.entries(e.options||{}).map(([e,l])=>(0,o.jsx)(s.CheckboxControl,{label:l,checked:n.includes(e),onChange:l=>((e,l)=>{t(l?[...n,e]:n.filter(l=>l!==e))})(e,l)},e))]})},p=window.React,m=e=>{if(e.description&&0!==e.description.length)return(0,o.jsx)("p",{className:"hint",children:e.description})},h=e=>{if(e.description&&0!==e.description.length)return(0,o.jsx)("p",{className:"hint",children:e.description})},v=window.wp.element,b=(e,l,t)=>e?.includes("{{")?e.replace(/{{(.*?)}}/g,(e,t)=>{const n=l[t];return void 0===n?"":Array.isArray(n)?n.join(", "):String(n)}):e,j=window.wp.mediaUtils,x=window.wp.blockEditor,g=window.wp.apiFetch;var f=e.n(g);const w={image:"image",video:"video",document:"application",all:""},y=({id:e,onRemove:l})=>{const[t,n]=(0,v.useState)(null);(0,v.useEffect)(()=>{let l=!1;if(e)return f()({path:`/wp/v2/media/${e}`}).then(e=>!l&&n(e)).catch(()=>{}),()=>{l=!0}},[e]);const a=t?.media_details?.sizes?.thumbnail?.source_url||t?.source_url,i="image"===t?.media_type;return(0,o.jsxs)("div",{className:"jvb-upload-thumb",children:[i&&a?(0,o.jsx)("img",{src:a,alt:t?.alt_text||""}):(0,o.jsx)("div",{className:"jvb-upload-thumb-placeholder",children:t?.title?.rendered||`#${e}`}),(0,o.jsx)(s.Button,{variant:"link",isDestructive:!0,onClick:()=>l(e),children:"Remove"})]})},C=window.wp.url,k=e=>e.subtype||e.type,S=(e,l,t)=>"post"===l?{title:t,status:"publish",postType:e.post_type}:{name:t},_=(e,l)=>"user"===l?e.name:e.title?.rendered??e.title??e.name,A={text:d,email:d,tel:d,url:d,number:d,textarea:d,select:c,radio:c,checkbox:u,set:u,true_false:({field:e,value:l,onChange:t})=>(0,o.jsx)(s.ToggleControl,{label:e.label,help:e.description,checked:!!l,onChange:t,id:e.name}),date:({field:e,value:l,onChange:t})=>{const[n,a]=(0,p.useState)(new Date);return(0,o.jsxs)("div",{className:"components-base-control",id:e.name,children:[(0,o.jsx)("label",{className:"components-base-control__label",children:e.label}),(0,o.jsx)(s.DatePicker,{currentDate:n,onChange:t,help:e.description,value:l??""}),m(e)]})},time:({field:e,value:l,onChange:t})=>{const[n,a]=(0,p.useState)(new Date);return(0,o.jsx)(s.TimePicker,{currentTime:n,onChange:t,label:e.label,help:e.description,value:l??"",is12Hour:!0,id:e.name})},datetime:({field:e,value:l,onChange:t})=>{const[n,a]=(0,p.useState)(new Date);return console.log(e),(0,o.jsxs)("div",{className:"components-base-control",id:e.name,children:[(0,o.jsx)("label",{className:"components-base-control__label",children:e.label}),(0,o.jsx)(s.DateTimePicker,{currentDate:n,onChange:t,label:e.label,help:e.description,value:l??"",is12Hour:!0}),h(e)]})},repeater:({field:e,value:l,onChange:t,meta:n})=>{const a=Array.isArray(l)?l:[],i=e.fields||{},[r,d]=(0,v.useState)(null);return(0,o.jsxs)("div",{className:"jvb-repeater-field",id:e.name,children:[(0,o.jsx)("p",{className:"jvb-field-label",children:e.label}),(0,o.jsx)(s.Panel,{children:a.map((l,c)=>(0,o.jsxs)(s.PanelBody,{title:b(e.row_label,l)||`Row ${c+1}`,initialOpen:r===c,onToggle:()=>d(r===c?null:c),children:[Object.entries(i).map(([e,i])=>(0,o.jsx)(O,{field:{...i,name:e},value:l[e],onChange:l=>((e,l,n)=>{const i=a.map((t,a)=>a===e?{...t,[l]:n}:t);t(i)})(c,e,l),meta:n},e)),(0,o.jsx)(s.Button,{variant:"link",isDestructive:!0,onClick:()=>(e=>t(a.filter((l,t)=>t!==e)))(c),children:"Remove"})]},c))}),(0,o.jsx)(s.Button,{variant:"secondary",onClick:()=>{return t([...a,(e=i,Object.fromEntries(Object.entries(e||{}).map(([e,l])=>[e,l.default??""])))]);var e},children:e.add_label||"Add Row"})]})},upload:({field:e,value:l,onChange:t})=>{const n=e.multiple||"gallery"===e.type,a=n?Array.isArray(l)?l:[]:l,i=w[e.subtype]?[w[e.subtype]]:"",r=e=>{t(n?a.filter(l=>l!==e):0)};return(0,o.jsxs)("div",{className:"jvb-upload-field",id:e.name,children:[(0,o.jsx)("p",{className:"jvb-field-label",children:e.label}),(0,o.jsx)("div",{className:n?"jvb-upload-grid":"jvb-upload-single",children:n?a.map(e=>(0,o.jsx)(y,{id:e,onRemove:r},e)):!!a&&(0,o.jsx)(y,{id:a,onRemove:r})}),(0,o.jsx)(x.MediaUploadCheck,{children:(0,o.jsx)(j.MediaUpload,{onSelect:e=>t(n?e.map(e=>e.id):e.id),allowedTypes:i,multiple:n,value:n?a:a||void 0,render:({open:l})=>(0,o.jsxs)(s.Button,{variant:"secondary",onClick:l,children:[(n?a.length:a)?"Change":"Select"," ",e.label]})})})]})},selector:({field:e,value:l,onChange:t})=>{const n=k(e),a="taxonomy"===n;console.log(e);const i=(e=>{const l=k(e);return"user"===l?e=>(0,C.addQueryArgs)("/wp/v2/users",{search:e,per_page:20}):"taxonomy"===l?l=>(0,C.addQueryArgs)(`/wp/v2/${e.taxonomy}`,{search:l,per_page:20}):l=>(0,C.addQueryArgs)("/wp/v2/search",{search:l,type:"post",subtype:e.post_type,per_page:20})})(e),r=Array.isArray(l)?l:l?l.split(","):[],[d,c]=(0,v.useState)([]),[u,p]=(0,v.useState)({}),[m,h]=(0,v.useState)({}),[b,j]=(0,v.useState)(""),[x,g]=(0,v.useState)(!1),w=b?`Not found. Create "${b}"?`:null;(0,v.useEffect)(()=>{let e=!1;if(r.length)return Promise.all(r.map(e=>f()({path:i("")+`&include=${e}`}))).then(l=>{if(e)return;const t={},a=[];l.flat().forEach(e=>{const l=_(e,n);t[l]=e.id,a.push(l)}),p(e=>({...e,...t})),c(a)}).catch(()=>{}),()=>{e=!0};c([])},[JSON.stringify(r)]);const y=(0,v.useCallback)(e=>{j(e),e?f()({path:i(e)}).then(e=>{const l={};e.forEach(e=>{l[_(e,n)]=e.id}),h(l)}).catch(()=>{}):h({})},[i,n]),A=l=>{const n=1===e.max;t(n?l[l.length-1]??0:e.max?l.slice(0,e.max):l)},N=b&&!Object.keys(m).some(e=>e.toLowerCase()===b.toLowerCase()),O=1===e.max&&d.length?[]:[...Object.keys(m),...a&&N?[w]:[]];return(0,o.jsx)(s.FormTokenField,{label:e.label,help:e.description,value:d,suggestions:O,onChange:l=>{if(l.find(e=>e===w)&&a&&!x)return g(!0),void f()({path:`/wp/v2/${e.taxonomy}`,method:"POST",data:S(e,n,b)}).then(e=>{const l=_(e,n);p(t=>({...t,[l]:e.id})),c(t=>{const n=t.filter(e=>e!==w).concat(l),a=n.map(t=>u[t]??m[t]??(t===l?e.id:void 0)).filter(e=>void 0!==e);return A(a),n})}).catch(()=>{}).finally(()=>g(!1));const t=l.filter(e=>void 0!==u[e]||void 0!==m[e]),i=t.map(e=>u[e]??m[e]);c(t),p(e=>({...e,...m})),A(i)},onInputChange:y,maxLength:e.max||void 0,id:e.name,__experimentalExpandOnFocus:!0})},location:({field:e,value:l,onChange:n})=>{const a=l||{},[i,r]=(0,v.useState)(a.address||""),[d,c]=(0,v.useState)([]),[u,p]=(0,v.useState)(!1),m=(0,t.useDebounce)(e=>{if(!e)return c([]);p(!0),f()({path:`jvb/v1/geocode?q=${encodeURIComponent(e)}`}).then(c).finally(()=>p(!1))},400);return(0,o.jsxs)("div",{className:"jvb-location-field",id:e.name,children:[(0,o.jsx)(s.TextControl,{label:e.label,value:i,onChange:e=>{r(e),m(e)}}),u&&(0,o.jsx)(s.Spinner,{}),!!d.length&&(0,o.jsxs)("div",{className:"jvb-location-results",children:[d.map(e=>(0,o.jsx)(s.Button,{variant:"tertiary",onClick:()=>(e=>{const l=e.address||{},t={address:[l.house_number,l.road].filter(Boolean).join(" "),city:l.city||l.town||l.village||"",province:l.state||"",postal_code:l.postcode||"",country:l.country||"",lat:parseFloat(e.lat),lng:parseFloat(e.lng)};n(t),r(t.address),c([])})(e),style:{display:"block",textAlign:"left"},children:e.display_name},e.place_id)),!!a.lat&&(0,o.jsxs)("p",{className:"jvb-location-summary",children:[a.address,", ",a.city,", ",a.province," ",a.postal_code,", ",a.country,(0,o.jsx)("br",{}),(0,o.jsx)(s.Button,{variant:"link",isDestructive:!0,onClick:()=>{n({}),r(""),c([])},children:"Clear"})]})]})]})}},N={"=":(e,l)=>e==l,"==":(e,l)=>e==l,"!=":(e,l)=>e!=l,">":(e,l)=>e>l,"<":(e,l)=>e<l,in:(e,l)=>Array.isArray(l)?l.includes(e):String(l).split(",").includes(e)},O=({id:e,field:l,value:t,onChange:n,meta:a})=>{if(!((e,l)=>!e?.field||(N[e.operator]||N["="])(l?.[e.field],e.value))(l.condition,a))return null;const i=A[l.type];return i?(0,o.jsx)(s.PanelRow,{children:(0,o.jsx)(i,{field:l,value:t,onChange:n})}):null},P=({id:e,name:l,fields:t,meta:n,setMeta:a,isOpen:i=!1})=>(e="jvb-section-"+e,console.log(t,"fields"),(0,o.jsx)(s.PanelBody,{name:e,title:l,initialOpen:i,children:t.map(e=>(0,o.jsx)(O,{field:e,value:n?.[e.name],onChange:l=>((e,l)=>a({...n,[e]:l}))(e.name,l),meta:n},e.name))})),R=()=>(0,o.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",fillRule:"evenodd",strokeLinecap:"square",strokeLinejoin:"round",strokeMiterlimit:"1.5",clipRule:"evenodd",viewBox:"0 0 32 32",children:(0,o.jsx)("path",{fill:"currentColor",fillRule:"nonzero",d:"M16.58 2.133c-7.715 0-15.14 6.014-14.547 13.707.561 7.287 6.938 13.185 13.938 13.947 8.25.898 14.47-5.953 14.004-13.988-.447-7.7-5.683-13.666-13.395-13.666m0 .607h.031v26.492q-.285-.017-.574-.048c-6.724-.732-12.86-6.391-13.398-13.391C2.072 8.442 9.209 2.74 16.58 2.74m-.488 1.145L16 3.889c-3.275.13-6.448 1.476-8.744 3.611-2.297 2.135-3.716 5.065-3.463 8.346.492 6.384 6.071 11.538 12.201 12.207l.09.01.021-.182-.091-.01c-6.041-.66-11.555-5.755-12.04-12.04-.247-3.221 1.142-6.092 3.405-8.196s5.4-3.437 8.629-3.565l.092-.004zm0 1.502L16 5.39c-2.868.113-5.647 1.293-7.658 3.164-2.012 1.87-3.255 4.436-3.033 7.31.43 5.593 5.316 10.106 10.685 10.692l.09.01.021-.18-.091-.01c-5.28-.576-10.1-5.031-10.524-10.525-.217-2.815.997-5.325 2.975-7.164 1.978-1.84 4.72-3.004 7.543-3.116l.092-.004zm0 1.504L16 6.893c-2.462.097-4.846 1.111-6.572 2.716-1.727 1.606-2.796 3.808-2.606 6.276.37 4.8 4.564 8.674 9.172 9.177l.09.01.021-.181-.091-.01c-4.52-.494-8.648-4.307-9.01-9.01-.186-2.408.854-4.554 2.547-6.129s4.04-2.57 6.457-2.666l.092-.004zm0 1.502L16 8.396c-2.055.082-4.045.926-5.486 2.266-1.442 1.34-2.335 3.182-2.176 5.244.309 4.009 3.808 7.24 7.656 7.66l.09.01.008-.068v-.002l.002-.01.004-.01v-.02l.007-.072-.091-.01c-3.76-.41-7.193-3.58-7.494-7.491-.155-2.002.709-3.787 2.117-5.096s3.361-2.14 5.37-2.219l.093-.004zm0 1.502L16 9.898a6.95 6.95 0 0 0-4.402 1.819c-1.157 1.075-1.872 2.553-1.744 4.209.247 3.216 3.053 5.81 6.14 6.146l.09.01.021-.182-.091-.01c-2.999-.327-5.739-2.86-5.979-5.978-.123-1.595.564-3.018 1.688-4.062a6.78 6.78 0 0 1 4.285-1.77l.092-.004zm0 1.503L16 11.4a5.24 5.24 0 0 0-3.316 1.372c-.872.81-1.413 1.924-1.317 3.173.187 2.425 2.3 4.377 4.627 4.631l.09.01.021-.182-.091-.01c-2.238-.244-4.286-2.136-4.465-4.462-.092-1.19.421-2.248 1.26-3.028a5.06 5.06 0 0 1 3.199-1.32l.092-.004zm0 1.502-.092.004a3.52 3.52 0 0 0-2.23.92c-.587.546-.952 1.3-.887 2.143.126 1.633 1.545 2.942 3.111 3.113h-.008l.01.002h.01l.078.01.022-.182-.092-.01c-1.477-.16-2.831-1.412-2.95-2.947-.06-.782.277-1.48.83-1.994a3.35 3.35 0 0 1 2.114-.873l.092-.004zm0 1.502-.092.004c-.43.017-.843.192-1.145.473-.301.28-.49.67-.457 1.107.065.841.791 1.512 1.596 1.6l.09.01.021-.182-.091-.01c-.717-.078-1.377-.688-1.434-1.431-.029-.377.132-.712.4-.961.269-.25.644-.409 1.028-.424l.092-.004z",clipRule:"nonzero",overflow:"visible"})}),T=(0,n.withSelect)(e=>({metaFields:e("core/editor").getEditedPostAttribute("meta"),postType:e("core/editor").getCurrentPostType()})),F=(0,n.withDispatch)(e=>({setMetaFields(l){e("core/editor").editPost({meta:l})}})),D=({section:e,fields:l})=>l.filter(l=>e.fields.includes(l.name)),z=e=>0===e,L=(0,t.compose)([T,F])(({postType:e,metaFields:l,setMetaFields:t})=>{const{fields:n,sections:s}=window.jvbFieldConfig||{},[r,d]=(0,i.useEntityProp)("postType",e,"meta");return n&&n.length?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.PluginSidebarMoreMenuItem,{target:"jvb-meta-fields",icon:(0,o.jsx)(R,{}),children:"Additional Fields"}),(0,o.jsx)(a.PluginSidebar,{name:"jvb-meta-fields",icon:(0,o.jsx)(R,{}),title:"Additional Fields",children:Object.values(s).map((e,l)=>(0,o.jsx)(P,{name:e.title,fields:D({section:e,fields:n}),meta:r,setMeta:d,isOpen:z(l)},e.id))})]}):null});(0,l.registerPlugin)("jvb-meta-fields",{render:L})})();
\ No newline at end of file
diff --git a/inc/meta/MetaTypeManager.php b/inc/meta/MetaTypeManager.php
index 461ef1a..8e7afe0 100644
--- a/inc/meta/MetaTypeManager.php
+++ b/inc/meta/MetaTypeManager.php
@@ -111,7 +111,12 @@
 			'default'	=> [
 				'address' => '',
 				'lat' => 0,
-				'lng' => 0
+				'lng' => 0,
+				'street' => '',
+				'city' => '',
+				'province' => '',
+				'postal_code'=> '',
+				'country' => '',
 			]
         ],
         'date' => [
diff --git a/inc/registrar/helpers/AddCustomFields.php b/inc/registrar/helpers/AddCustomFields.php
index 2e730ff..8bb2682 100644
--- a/inc/registrar/helpers/AddCustomFields.php
+++ b/inc/registrar/helpers/AddCustomFields.php
@@ -35,7 +35,7 @@
 
 		wp_enqueue_script(
 			'jvb-editor-fields',
-			JVB_URL.'/build/_meta/fields.js',
+			JVB_URL.'build/_meta/fields.js',
 			$asset['dependencies'],
 			$asset['version'],
 			true
@@ -44,13 +44,21 @@
 		wp_add_inline_script(
 			'jvb-editor-fields',
 			'window.jvbFieldConfig = '.wp_json_encode([
-				'postType' => $this->registrar->getBased(),
 				'fields'   => array_map(function($f) {
 					$f['name'] = jvbCheckBase($f['name']);
+					$f['id'] = jvbCheckBase($f['name']);
+					if ($f['type'] === 'selector') {
+						$f['taxonomy'] = jvbCheckBase($f['taxonomy']);
+					}
 					return $f;
 				},array_values($this->registrar->getFields(false))),
-				'sections'  => $this->registrar->getSections(),
-				'base'  => BASE
+				'sections'  => array_map(function ($s) {
+					$s['id'] = jvbCheckBase($s['slug']);
+					$s['fields'] = array_map(function ($f) {
+						return jvbCheckBase($f);
+					}, $s['fields']);
+					return $s;
+				},$this->registrar->getSections()),
 			]).';',
 			'before'
 		);
diff --git a/inc/rest/_setup.php b/inc/rest/_setup.php
index ec64fe3..2f67daf 100644
--- a/inc/rest/_setup.php
+++ b/inc/rest/_setup.php
@@ -76,3 +76,4 @@
 require(JVB_DIR .'/inc/rest/routes/IntegrationsRoutes.php');
 require(JVB_DIR .'/inc/rest/routes/LoginRoutes.php');
 require(JVB_DIR .'/inc/rest/routes/UserRoutes.php');
+require(JVB_DIR .'/inc/rest/routes/OpenStreetMaps.php');
diff --git a/inc/rest/routes/OpenStreetMaps.php b/inc/rest/routes/OpenStreetMaps.php
new file mode 100644
index 0000000..4ceb1c0
--- /dev/null
+++ b/inc/rest/routes/OpenStreetMaps.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace JVBase\inc\rest\routes;
+
+use JVBase\Instance;
+use JVBase\managers\Cache;
+use JVBase\rest\PermissionHandler;
+use JVBase\rest\Rest;
+use JVBase\rest\Route;
+use WP_REST_Request;
+use WP_REST_Response;
+
+class OpenStreetMaps extends Rest
+{
+	use Instance;
+
+	public function __construct()
+	{
+		$this->cacheName = 'openstreetmaps';
+		parent::__construct();
+		$this->cache = Cache::for($this->cacheName, null, DAY_IN_SECONDS);
+	}
+	public function registerRoutes(): void {
+		Route::for('geocode')
+			->get([$this, 'getGeocode'])
+			->auth(PermissionHandler::combine(['user']))
+			->args(['q'=> 'string|required'])
+			->rateLimit(1,1)
+			->register();
+	}
+
+	public function getGeocode(WP_REST_Request $request): WP_REST_Response
+	{
+		$query = sanitize_text_field($request->get_param( 'q' ));
+		$userAgent = str_replace(' ', '', get_bloginfo('name')). ' (' . get_option('admin_email').')';
+		$response = wp_remote_get(
+			'https://nominatim.openstreetmap.org/search?' . http_build_query( [
+				'format'         => 'json',
+				'addressdetails' => 1,
+				'limit'          => 5,
+				'q'              => $query,
+			] ),
+			[ 'headers' => [ 'User-Agent' => $userAgent ] ]
+		);
+		return rest_ensure_response( json_decode( wp_remote_retrieve_body( $response ) ) );
+	}
+}
diff --git a/jvb.php b/jvb.php
index cd08de1..8f1544b 100644
--- a/jvb.php
+++ b/jvb.php
@@ -15,6 +15,7 @@
 use JVBase\admin\SEOAdmin;
 use JVBase\base\SchemaHelper;
 use JVBase\blocks\CustomBlocks;
+use JVBase\inc\rest\routes\OpenStreetMaps;
 use JVBase\JVB;
 use JVBase\managers\AdminPages;
 use JVBase\managers\Approvals;
@@ -441,6 +442,8 @@
 	{
 		NewsRoutes::getInstance();
 	}
+	
+	OpenStreetMaps::getInstance();
 }
 
 
diff --git a/package-lock.json b/package-lock.json
index d2da3e7..f2b28d0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,18 @@
             "version": "0.2.0",
             "license": "GPL-2.0-or-later",
             "dependencies": {
+                "@wordpress/api-fetch": "^7.54.0",
+                "@wordpress/block-editor": "^17.0.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/core-data": "^7.54.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/editor": "^14.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/media-utils": "^5.54.0",
                 "@wordpress/plugins": "^7.54.0",
+                "@wordpress/upload-media": "^0.39.0",
+                "@wordpress/url": "^4.54.0",
                 "sass": "^1.103.1"
             },
             "devDependencies": {
@@ -2080,13 +2091,13 @@
             }
         },
         "node_modules/@base-ui/react": {
-            "version": "1.7.0",
-            "resolved": "https://registry.npmjs.org/@base-ui/react/-/react-1.7.0.tgz",
-            "integrity": "sha512-j+8QjX44C32jrXD/qyEAGpFr70FRpGL2CY61mQd9nBPWN737CK0xxD1ceJ055rW4RtdvFDT1e7otzdlfxvsYug==",
+            "version": "1.8.0",
+            "resolved": "https://registry.npmjs.org/@base-ui/react/-/react-1.8.0.tgz",
+            "integrity": "sha512-P0/1sxo6SBVZOklKMIedvTWqw2s2IQzi9x5bIVsXu980cuSOD4NeuRSs+/L7LZQfDkZP/uRZyGPyfFl/B1oH+Q==",
             "license": "MIT",
             "dependencies": {
-                "@babel/runtime": "^7.29.2",
-                "@base-ui/utils": "0.3.2",
+                "@babel/runtime": "^7.29.7",
+                "@base-ui/utils": "0.4.0",
                 "@floating-ui/react-dom": "^2.1.9",
                 "@floating-ui/utils": "^0.2.12",
                 "use-sync-external-store": "^1.6.0"
@@ -2118,12 +2129,12 @@
             }
         },
         "node_modules/@base-ui/utils": {
-            "version": "0.3.2",
-            "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.3.2.tgz",
-            "integrity": "sha512-oWy1aq/I2GmYjpl4PhEAhzflF8VPGKgZeq0xAWTbfD5KBWyxcN0ZP2+WHSUm/5Z6lVMBDLReLcoXwSYoRc/zNQ==",
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.4.0.tgz",
+            "integrity": "sha512-bO9fz25kKtPf+aZVyfQrC0PDmJdmVni31W2hCS5/Owb+inwdIL3XU26pCPRPlt4LSxZrBgLwubXQXQlKaFEZzw==",
             "license": "MIT",
             "dependencies": {
-                "@babel/runtime": "^7.29.2",
+                "@babel/runtime": "^7.29.7",
                 "@floating-ui/utils": "^0.2.12",
                 "reselect": "^5.2.0",
                 "use-sync-external-store": "^1.6.0"
@@ -5393,6 +5404,32 @@
             "dev": true,
             "license": "MIT"
         },
+        "node_modules/@preact/signals": {
+            "version": "1.3.4",
+            "resolved": "https://registry.npmjs.org/@preact/signals/-/signals-1.3.4.tgz",
+            "integrity": "sha512-TPMkStdT0QpSc8FpB63aOwXoSiZyIrPsP9Uj347KopdS6olZdAYeeird/5FZv/M1Yc1ge5qstub2o8VDbvkT4g==",
+            "license": "MIT",
+            "dependencies": {
+                "@preact/signals-core": "^1.7.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/preact"
+            },
+            "peerDependencies": {
+                "preact": "10.x"
+            }
+        },
+        "node_modules/@preact/signals-core": {
+            "version": "1.14.4",
+            "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.14.4.tgz",
+            "integrity": "sha512-HNB6HYeYKhQbJ1aKl+YRjrS4+QWHLKX6qKoUsfS/m0vqzsVaEBiZiaKbG/e+NKk2ch5ALQr/ihWaMHxiCuuWHA==",
+            "license": "MIT",
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/preact"
+            }
+        },
         "node_modules/@prisma/instrumentation": {
             "version": "6.11.1",
             "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-6.11.1.tgz",
@@ -5441,6 +5478,392 @@
                 "node": ">=10"
             }
         },
+        "node_modules/@radix-ui/primitive": {
+            "version": "1.1.7",
+            "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz",
+            "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==",
+            "license": "MIT"
+        },
+        "node_modules/@radix-ui/react-compose-refs": {
+            "version": "1.1.5",
+            "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz",
+            "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==",
+            "license": "MIT",
+            "peerDependencies": {
+                "@types/react": "*",
+                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@radix-ui/react-context": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz",
+            "integrity": "sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==",
+            "license": "MIT",
+            "peerDependencies": {
+                "@types/react": "*",
+                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@radix-ui/react-dialog": {
+            "version": "1.1.23",
+            "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz",
+            "integrity": "sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==",
+            "license": "MIT",
+            "dependencies": {
+                "@radix-ui/primitive": "1.1.7",
+                "@radix-ui/react-compose-refs": "1.1.5",
+                "@radix-ui/react-context": "1.2.2",
+                "@radix-ui/react-dismissable-layer": "1.1.19",
+                "@radix-ui/react-focus-guards": "1.1.6",
+                "@radix-ui/react-focus-scope": "1.1.16",
+                "@radix-ui/react-id": "1.1.4",
+                "@radix-ui/react-portal": "1.1.17",
+                "@radix-ui/react-presence": "1.1.10",
+                "@radix-ui/react-primitive": "2.1.10",
+                "@radix-ui/react-slot": "1.3.3",
+                "@radix-ui/react-use-controllable-state": "1.2.6",
+                "@radix-ui/react-use-layout-effect": "1.1.4",
+                "aria-hidden": "^1.2.4",
+                "react-remove-scroll": "^2.7.2"
+            },
+            "peerDependencies": {
+                "@types/react": "*",
+                "@types/react-dom": "*",
+                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                },
+                "@types/react-dom": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@radix-ui/react-dismissable-layer": {
+            "version": "1.1.19",
+            "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz",
+            "integrity": "sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==",
+            "license": "MIT",
+            "dependencies": {
+                "@radix-ui/primitive": "1.1.7",
+                "@radix-ui/react-compose-refs": "1.1.5",
+                "@radix-ui/react-primitive": "2.1.10",
+                "@radix-ui/react-use-callback-ref": "1.1.4",
+                "@radix-ui/react-use-effect-event": "0.0.5"
+            },
+            "peerDependencies": {
+                "@types/react": "*",
+                "@types/react-dom": "*",
+                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                },
+                "@types/react-dom": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@radix-ui/react-focus-guards": {
+            "version": "1.1.6",
+            "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz",
+            "integrity": "sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==",
+            "license": "MIT",
+            "peerDependencies": {
+                "@types/react": "*",
+                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@radix-ui/react-focus-scope": {
+            "version": "1.1.16",
+            "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz",
+            "integrity": "sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@radix-ui/react-compose-refs": "1.1.5",
+                "@radix-ui/react-primitive": "2.1.10",
+                "@radix-ui/react-use-callback-ref": "1.1.4"
+            },
+            "peerDependencies": {
+                "@types/react": "*",
+                "@types/react-dom": "*",
+                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                },
+                "@types/react-dom": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@radix-ui/react-id": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz",
+            "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==",
+            "license": "MIT",
+            "dependencies": {
+                "@radix-ui/react-use-layout-effect": "1.1.4"
+            },
+            "peerDependencies": {
+                "@types/react": "*",
+                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@radix-ui/react-portal": {
+            "version": "1.1.17",
+            "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.17.tgz",
+            "integrity": "sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@radix-ui/react-primitive": "2.1.10",
+                "@radix-ui/react-use-layout-effect": "1.1.4"
+            },
+            "peerDependencies": {
+                "@types/react": "*",
+                "@types/react-dom": "*",
+                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                },
+                "@types/react-dom": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@radix-ui/react-presence": {
+            "version": "1.1.10",
+            "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz",
+            "integrity": "sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==",
+            "license": "MIT",
+            "dependencies": {
+                "@radix-ui/react-use-layout-effect": "1.1.4"
+            },
+            "peerDependencies": {
+                "@types/react": "*",
+                "@types/react-dom": "*",
+                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                },
+                "@types/react-dom": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@radix-ui/react-primitive": {
+            "version": "2.1.10",
+            "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz",
+            "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==",
+            "license": "MIT",
+            "dependencies": {
+                "@radix-ui/react-slot": "1.3.3"
+            },
+            "peerDependencies": {
+                "@types/react": "*",
+                "@types/react-dom": "*",
+                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+                "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                },
+                "@types/react-dom": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@radix-ui/react-slot": {
+            "version": "1.3.3",
+            "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz",
+            "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==",
+            "license": "MIT",
+            "dependencies": {
+                "@radix-ui/react-compose-refs": "1.1.5"
+            },
+            "peerDependencies": {
+                "@types/react": "*",
+                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@radix-ui/react-use-callback-ref": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz",
+            "integrity": "sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==",
+            "license": "MIT",
+            "peerDependencies": {
+                "@types/react": "*",
+                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@radix-ui/react-use-controllable-state": {
+            "version": "1.2.6",
+            "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz",
+            "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@radix-ui/primitive": "1.1.7",
+                "@radix-ui/react-use-effect-event": "0.0.5",
+                "@radix-ui/react-use-layout-effect": "1.1.4"
+            },
+            "peerDependencies": {
+                "@types/react": "*",
+                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@radix-ui/react-use-effect-event": {
+            "version": "0.0.5",
+            "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz",
+            "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==",
+            "license": "MIT",
+            "dependencies": {
+                "@radix-ui/react-use-layout-effect": "1.1.4"
+            },
+            "peerDependencies": {
+                "@types/react": "*",
+                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@radix-ui/react-use-layout-effect": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz",
+            "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==",
+            "license": "MIT",
+            "peerDependencies": {
+                "@types/react": "*",
+                "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@react-spring/animated": {
+            "version": "9.7.5",
+            "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz",
+            "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==",
+            "license": "MIT",
+            "dependencies": {
+                "@react-spring/shared": "~9.7.5",
+                "@react-spring/types": "~9.7.5"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-spring/core": {
+            "version": "9.7.5",
+            "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz",
+            "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==",
+            "license": "MIT",
+            "dependencies": {
+                "@react-spring/animated": "~9.7.5",
+                "@react-spring/shared": "~9.7.5",
+                "@react-spring/types": "~9.7.5"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/react-spring/donate"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-spring/rafz": {
+            "version": "9.7.5",
+            "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz",
+            "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==",
+            "license": "MIT"
+        },
+        "node_modules/@react-spring/shared": {
+            "version": "9.7.5",
+            "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz",
+            "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==",
+            "license": "MIT",
+            "dependencies": {
+                "@react-spring/rafz": "~9.7.5",
+                "@react-spring/types": "~9.7.5"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-spring/types": {
+            "version": "9.7.5",
+            "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz",
+            "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==",
+            "license": "MIT"
+        },
+        "node_modules/@react-spring/web": {
+            "version": "9.7.5",
+            "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz",
+            "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@react-spring/animated": "~9.7.5",
+                "@react-spring/core": "~9.7.5",
+                "@react-spring/shared": "~9.7.5",
+                "@react-spring/types": "~9.7.5"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+                "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+            }
+        },
         "node_modules/@rtsao/scc": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
@@ -5933,6 +6356,48 @@
             "integrity": "sha512-RwARl+hFwhzy0tg9atWcchLFvoQiOh4rrP7uG2N5E4W80BPCUX0ElcUR9St43fxB9EfjsW2df9Qp+UsTbvQDjA==",
             "license": "MIT"
         },
+        "node_modules/@tanstack/history": {
+            "version": "1.162.1",
+            "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.162.1.tgz",
+            "integrity": "sha512-DR9t6lfLVdrjgCwpglrR9DR7Ok8/HlXjcOE+goWXF3zyuLUO/ug7vMbSFxTqrQTtbRghJfyhmIZ0S6LhPIy44w==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=20.19"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/tannerlinsley"
+            }
+        },
+        "node_modules/@tanstack/router-core": {
+            "version": "1.171.27",
+            "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.171.27.tgz",
+            "integrity": "sha512-wDwSLvoLwIaNcnx9UNcN9Mb7Y8QwCYq1U1RQZwyN186gnkIoIYI2SOxy8VqH1vFigbkHkk4FmwMAQlghPgDK2g==",
+            "license": "MIT",
+            "dependencies": {
+                "@tanstack/history": "1.162.1",
+                "cookie-es": "^3.0.0",
+                "seroval": "^1.6.2",
+                "seroval-plugins": "^1.6.2"
+            },
+            "engines": {
+                "node": ">=20.19"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/tannerlinsley"
+            }
+        },
+        "node_modules/@tanstack/store": {
+            "version": "0.9.3",
+            "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.9.3.tgz",
+            "integrity": "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==",
+            "license": "MIT",
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/tannerlinsley"
+            }
+        },
         "node_modules/@tootallnate/quickjs-emscripten": {
             "version": "0.23.0",
             "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
@@ -6038,6 +6503,21 @@
                 "@types/node": "*"
             }
         },
+        "node_modules/@types/dom-mediacapture-transform": {
+            "version": "0.1.12",
+            "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.12.tgz",
+            "integrity": "sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==",
+            "license": "MIT",
+            "dependencies": {
+                "@types/dom-webcodecs": "*"
+            }
+        },
+        "node_modules/@types/dom-webcodecs": {
+            "version": "0.1.13",
+            "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz",
+            "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==",
+            "license": "MIT"
+        },
         "node_modules/@types/esrecurse": {
             "version": "4.3.1",
             "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
@@ -7253,6 +7733,60 @@
                 "npm": ">=8.19.2"
             }
         },
+        "node_modules/@wordpress/admin-ui": {
+            "version": "2.9.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/admin-ui/-/admin-ui-2.9.0.tgz",
+            "integrity": "sha512-qBunBhH5T4b7oxQaFcAonMppcfa2y1323/kdJ/vSJpqxuNVcAX0V1F22WZfsyWa26cELUG3ldQQ/duYZFBkokg==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/route": "^0.20.0",
+                "@wordpress/style-runtime": "^0.10.0",
+                "@wordpress/ui": "^0.21.0",
+                "clsx": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@wordpress/api-fetch": {
+            "version": "7.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.54.0.tgz",
+            "integrity": "sha512-L3aijA4rSYdxcM0IDysZcAMhUN3xMibNZWDmSi3B+72Yc1OWClD2aRNbbx2OL7LfHmHOi/844J+KHqlaRJnB4A==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/url": "^4.54.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            }
+        },
+        "node_modules/@wordpress/autop": {
+            "version": "4.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-4.54.0.tgz",
+            "integrity": "sha512-SaxCrUJ6jhKZspq/HiMISD/cBTnloZxfFrckv6G26C1zpexKKWHZHUod/1n19j5C/IInpuHhzeS1eHxZgdg0zw==",
+            "license": "GPL-2.0-or-later",
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            }
+        },
         "node_modules/@wordpress/babel-preset-default": {
             "version": "8.54.0",
             "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.54.0.tgz",
@@ -7277,19 +7811,6 @@
                 "npm": ">=8.19.2"
             }
         },
-        "node_modules/@wordpress/babel-preset-default/node_modules/react": {
-            "version": "18.3.1",
-            "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
-            "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
-            "dev": true,
-            "license": "MIT",
-            "dependencies": {
-                "loose-envify": "^1.1.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/@wordpress/base-styles": {
             "version": "13.0.0",
             "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-13.0.0.tgz",
@@ -7300,6 +7821,182 @@
                 "npm": ">=8.19.2"
             }
         },
+        "node_modules/@wordpress/blob": {
+            "version": "4.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-4.54.0.tgz",
+            "integrity": "sha512-/9s3JpYBNlK44v9V1fHT0dgPVxDVzcNss6cbGk/kNOtntoLJkBaRWLjCXm9WGWQ2kv2sm6PLDzlSiiOCF5sPHg==",
+            "license": "GPL-2.0-or-later",
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            }
+        },
+        "node_modules/@wordpress/block-editor": {
+            "version": "17.0.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-17.0.0.tgz",
+            "integrity": "sha512-RGWvjWLwIKMKEgLt6kZseC+oEO7oNnDFMzfZ56eGuQKZCKM88x5F7jaEly6YWqj8XtonXEz1ihfxL5JrPeSFNg==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@react-spring/web": "^9.4.5",
+                "@wordpress/a11y": "^4.54.0",
+                "@wordpress/base-styles": "^13.0.0",
+                "@wordpress/blob": "^4.54.0",
+                "@wordpress/block-serialization-default-parser": "^5.54.0",
+                "@wordpress/blocks": "^15.27.0",
+                "@wordpress/commands": "^1.54.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/dataviews": "^18.1.0",
+                "@wordpress/date": "^5.54.0",
+                "@wordpress/deprecated": "^4.54.0",
+                "@wordpress/dom": "^4.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/escape-html": "^3.54.0",
+                "@wordpress/global-styles-engine": "^1.21.0",
+                "@wordpress/hooks": "^4.54.0",
+                "@wordpress/html-entities": "^4.54.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/icons": "^15.5.0",
+                "@wordpress/image-cropper": "^1.18.0",
+                "@wordpress/interactivity": "^6.54.0",
+                "@wordpress/is-shallow-equal": "^5.54.0",
+                "@wordpress/kebab-case": "^1.1.0",
+                "@wordpress/keyboard-shortcuts": "^5.54.0",
+                "@wordpress/keycodes": "^4.54.0",
+                "@wordpress/notices": "^5.54.0",
+                "@wordpress/preferences": "^4.54.0",
+                "@wordpress/priority-queue": "^3.54.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/rich-text": "^7.54.0",
+                "@wordpress/style-engine": "^2.54.0",
+                "@wordpress/token-list": "^3.54.0",
+                "@wordpress/ui": "^0.21.0",
+                "@wordpress/upload-media": "^0.39.0",
+                "@wordpress/url": "^4.54.0",
+                "@wordpress/warning": "^3.54.0",
+                "@wordpress/wordcount": "^4.54.0",
+                "change-case": "^4.1.2",
+                "clsx": "^2.1.1",
+                "colord": "^2.9.3",
+                "deepmerge": "^4.3.1",
+                "diff": "^8.0.3",
+                "fast-deep-equal": "^3.1.3",
+                "parsel-js": "^1.1.2",
+                "postcss": "^8.4.38",
+                "postcss-prefix-selector": "^1.16.0",
+                "postcss-urlrebase": "^1.4.0",
+                "react-autosize-textarea": "^7.1.0",
+                "react-easy-crop": "^5.4.2",
+                "remove-accents": "^0.5.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19",
+                "react-dom": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@wordpress/block-editor/node_modules/react-autosize-textarea": {
+            "version": "7.1.0",
+            "resolved": "https://registry.npmjs.org/react-autosize-textarea/-/react-autosize-textarea-7.1.0.tgz",
+            "integrity": "sha512-BHpjCDkuOlllZn3nLazY2F8oYO1tS2jHnWhcjTWQdcKiiMU6gHLNt/fzmqMSyerR0eTdKtfSIqtSeTtghNwS+g==",
+            "license": "MIT",
+            "dependencies": {
+                "autosize": "^4.0.2",
+                "line-height": "^0.3.1",
+                "prop-types": "^15.5.6"
+            },
+            "peerDependencies": {
+                "react": "^0.14.0 || ^15.0.0 || ^16.0.0",
+                "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0"
+            }
+        },
+        "node_modules/@wordpress/block-serialization-default-parser": {
+            "version": "5.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-5.54.0.tgz",
+            "integrity": "sha512-7y2wtF7+QUlyFuhpIMI0JxI1EK6vbiYFKWvnPeqhaulg9b2xPG1IFjhZNKD+5oQgvOpRU2tKV/fisbagqxdqgA==",
+            "license": "GPL-2.0-or-later",
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            }
+        },
+        "node_modules/@wordpress/blocks": {
+            "version": "15.27.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-15.27.0.tgz",
+            "integrity": "sha512-HW8SJBMF2HhZn8/9XKxu37Rspm3Oqb5odGHnpcc29jZKbYRzH/7AhEUYAdjuUedVwXB2UvzaybDMFFOZ6lN4FA==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/autop": "^4.54.0",
+                "@wordpress/blob": "^4.54.0",
+                "@wordpress/block-serialization-default-parser": "^5.54.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/deprecated": "^4.54.0",
+                "@wordpress/dom": "^4.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/hooks": "^4.54.0",
+                "@wordpress/html-entities": "^4.54.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/is-shallow-equal": "^5.54.0",
+                "@wordpress/keycodes": "^4.54.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/rich-text": "^7.54.0",
+                "@wordpress/shortcode": "^4.54.0",
+                "@wordpress/warning": "^3.54.0",
+                "change-case": "^4.1.2",
+                "colord": "^2.9.3",
+                "fast-deep-equal": "^3.1.3",
+                "hpq": "^1.4.0",
+                "is-plain-object": "^5.1.0",
+                "marked": "^18.0.3",
+                "memize": "^2.1.1",
+                "react-is": "^18.3.0",
+                "remove-accents": "^0.5.0",
+                "simple-html-tokenizer": "^0.5.7",
+                "uuid": "^14.0.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@wordpress/blocks/node_modules/react-is": {
+            "version": "18.3.1",
+            "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+            "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+            "license": "MIT"
+        },
+        "node_modules/@wordpress/blocks/node_modules/uuid": {
+            "version": "14.0.2",
+            "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz",
+            "integrity": "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==",
+            "funding": [
+                "https://github.com/sponsors/broofa",
+                "https://github.com/sponsors/ctavan"
+            ],
+            "license": "MIT",
+            "bin": {
+                "uuid": "dist-node/bin/uuid"
+            }
+        },
         "node_modules/@wordpress/browserslist-config": {
             "version": "6.54.0",
             "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.54.0.tgz",
@@ -7311,6 +8008,35 @@
                 "npm": ">=8.19.2"
             }
         },
+        "node_modules/@wordpress/commands": {
+            "version": "1.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/commands/-/commands-1.54.0.tgz",
+            "integrity": "sha512-TUo0n4011kzxkIGyHT9yz38c731rONyctmyynQO0Tro/uP8MhxNbWdzMOjzJXNwZTCqEME5b7WVTgT/bF7WCvw==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/base-styles": "^13.0.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/icons": "^15.5.0",
+                "@wordpress/keyboard-shortcuts": "^5.54.0",
+                "@wordpress/keycodes": "^4.54.0",
+                "@wordpress/preferences": "^4.54.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/warning": "^3.54.0",
+                "clsx": "^2.1.1",
+                "cmdk": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "react": "^18 || ^19",
+                "react-dom": "^18 || ^19"
+            }
+        },
         "node_modules/@wordpress/components": {
             "version": "40.0.0",
             "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-40.0.0.tgz",
@@ -7444,6 +8170,68 @@
                 "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
             }
         },
+        "node_modules/@wordpress/core-data": {
+            "version": "7.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/core-data/-/core-data-7.54.0.tgz",
+            "integrity": "sha512-4a1FVQFJIcdsy2BX3ejxtCbYZktrUg14z4Qy9QvMGjyVWRYgtXvqxInHUIaGDCMU4uEt59wb7gMEhWrgMu1ouw==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/api-fetch": "^7.54.0",
+                "@wordpress/base-styles": "^13.0.0",
+                "@wordpress/block-editor": "^17.0.0",
+                "@wordpress/blocks": "^15.27.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/deprecated": "^4.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/global-styles-engine": "^1.21.0",
+                "@wordpress/html-entities": "^4.54.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/icons": "^15.5.0",
+                "@wordpress/is-shallow-equal": "^5.54.0",
+                "@wordpress/notices": "^5.54.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/rich-text": "^7.54.0",
+                "@wordpress/sync": "^1.54.0",
+                "@wordpress/undo-manager": "^1.54.0",
+                "@wordpress/url": "^4.54.0",
+                "@wordpress/warning": "^3.54.0",
+                "change-case": "^4.1.2",
+                "clsx": "^2.1.1",
+                "equivalent-key-map": "^0.2.2",
+                "fast-deep-equal": "^3.1.3",
+                "memize": "^2.1.1",
+                "uuid": "^14.0.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19",
+                "react-dom": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@wordpress/core-data/node_modules/uuid": {
+            "version": "14.0.2",
+            "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz",
+            "integrity": "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==",
+            "funding": [
+                "https://github.com/sponsors/broofa",
+                "https://github.com/sponsors/ctavan"
+            ],
+            "license": "MIT",
+            "bin": {
+                "uuid": "dist-node/bin/uuid"
+            }
+        },
         "node_modules/@wordpress/data": {
             "version": "10.54.0",
             "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-10.54.0.tgz",
@@ -7488,6 +8276,51 @@
                 "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
             }
         },
+        "node_modules/@wordpress/dataviews": {
+            "version": "18.1.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/dataviews/-/dataviews-18.1.0.tgz",
+            "integrity": "sha512-vV3wvSnqxjGqsUj9fnRmVVzXVCy/N+pRGYx+WyyXZUslbLX9xn1JfI2Z8uXFptKZJ5vGJ3BnLkfE4r2HdvG0Zg==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@ariakit/react": "^0.4.37",
+                "@date-fns/tz": "^1.5.0",
+                "@wordpress/a11y": "^4.54.0",
+                "@wordpress/base-styles": "^13.0.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/date": "^5.54.0",
+                "@wordpress/deprecated": "^4.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/icons": "^15.5.0",
+                "@wordpress/kebab-case": "^1.1.0",
+                "@wordpress/keycodes": "^4.54.0",
+                "@wordpress/primitives": "^4.54.0",
+                "@wordpress/ui": "^0.21.0",
+                "@wordpress/warning": "^3.54.0",
+                "clsx": "^2.1.1",
+                "colord": "^2.9.3",
+                "date-fns": "^4.4.0",
+                "deepmerge": "^4.3.1",
+                "fast-deep-equal": "^3.1.3",
+                "remove-accents": "^0.5.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19",
+                "react-dom": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@wordpress/date": {
             "version": "5.54.0",
             "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-5.54.0.tgz",
@@ -7578,6 +8411,159 @@
                 "@types/node": "^20.17.10"
             }
         },
+        "node_modules/@wordpress/editor": {
+            "version": "14.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/editor/-/editor-14.54.0.tgz",
+            "integrity": "sha512-Z0YD/Ns1JONBDkNMo7mo1szBcC02TvGpUv9JEz2S8bFIzH3jEaPERvJc4bVEvgc8xA+CbbIC/RKJhiI+VkIm3A==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/a11y": "^4.54.0",
+                "@wordpress/api-fetch": "^7.54.0",
+                "@wordpress/base-styles": "^13.0.0",
+                "@wordpress/blob": "^4.54.0",
+                "@wordpress/block-editor": "^17.0.0",
+                "@wordpress/block-serialization-default-parser": "^5.54.0",
+                "@wordpress/blocks": "^15.27.0",
+                "@wordpress/commands": "^1.54.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/core-data": "^7.54.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/dataviews": "^18.1.0",
+                "@wordpress/date": "^5.54.0",
+                "@wordpress/deprecated": "^4.54.0",
+                "@wordpress/dom": "^4.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/escape-html": "^3.54.0",
+                "@wordpress/fields": "^0.46.0",
+                "@wordpress/global-styles-engine": "^1.21.0",
+                "@wordpress/global-styles-ui": "^1.21.0",
+                "@wordpress/hooks": "^4.54.0",
+                "@wordpress/html-entities": "^4.54.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/icons": "^15.5.0",
+                "@wordpress/interface": "^10.0.0",
+                "@wordpress/kebab-case": "^1.1.0",
+                "@wordpress/keyboard-shortcuts": "^5.54.0",
+                "@wordpress/keycodes": "^4.54.0",
+                "@wordpress/media-editor": "^0.17.0",
+                "@wordpress/media-fields": "^0.19.0",
+                "@wordpress/media-utils": "^5.54.0",
+                "@wordpress/notices": "^5.54.0",
+                "@wordpress/patterns": "^2.54.0",
+                "@wordpress/plugins": "^7.54.0",
+                "@wordpress/preferences": "^4.54.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/reusable-blocks": "^5.54.0",
+                "@wordpress/rich-text": "^7.54.0",
+                "@wordpress/server-side-render": "^6.30.0",
+                "@wordpress/theme": "^2.0.0",
+                "@wordpress/ui": "^0.21.0",
+                "@wordpress/upload-media": "^0.39.0",
+                "@wordpress/url": "^4.54.0",
+                "@wordpress/views": "^1.21.0",
+                "@wordpress/warning": "^3.54.0",
+                "@wordpress/wordcount": "^4.54.0",
+                "change-case": "^4.1.2",
+                "client-zip": "^2.4.5",
+                "clsx": "^2.1.1",
+                "colord": "^2.9.3",
+                "date-fns": "^4.4.0",
+                "diff": "^8.0.3",
+                "fast-deep-equal": "^3.1.3",
+                "react-autosize-textarea": "^7.1.0",
+                "redux": "^5.0.1",
+                "remove-accents": "^0.5.0",
+                "uuid": "^14.0.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19",
+                "react-dom": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@wordpress/editor/node_modules/@wordpress/theme": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/theme/-/theme-2.0.0.tgz",
+            "integrity": "sha512-4yFei1ayJinMOVY6cTzKZV961p2Vjex9Nst1SReIFKv3ckb6ih5QN+qMpJQdpuukwabXrBTaoiA4ZB1akl2CfQ==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/deprecated": "^4.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/style-runtime": "^0.10.0",
+                "colorjs.io": "^0.7.1",
+                "memize": "^2.1.1"
+            },
+            "engines": {
+                "node": "^20.19.0 || >=22.13.0",
+                "npm": ">=10.2.3"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "esbuild": ">=0.27.2 <1.0.0",
+                "postcss": "^8.0.0",
+                "react": "^18 || ^19",
+                "react-dom": "^18 || ^19",
+                "stylelint": "^16 || ^17",
+                "vite": "^7 || ^8"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                },
+                "esbuild": {
+                    "optional": true
+                },
+                "postcss": {
+                    "optional": true
+                },
+                "stylelint": {
+                    "optional": true
+                },
+                "vite": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@wordpress/editor/node_modules/react-autosize-textarea": {
+            "version": "7.1.0",
+            "resolved": "https://registry.npmjs.org/react-autosize-textarea/-/react-autosize-textarea-7.1.0.tgz",
+            "integrity": "sha512-BHpjCDkuOlllZn3nLazY2F8oYO1tS2jHnWhcjTWQdcKiiMU6gHLNt/fzmqMSyerR0eTdKtfSIqtSeTtghNwS+g==",
+            "license": "MIT",
+            "dependencies": {
+                "autosize": "^4.0.2",
+                "line-height": "^0.3.1",
+                "prop-types": "^15.5.6"
+            },
+            "peerDependencies": {
+                "react": "^0.14.0 || ^15.0.0 || ^16.0.0",
+                "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0"
+            }
+        },
+        "node_modules/@wordpress/editor/node_modules/uuid": {
+            "version": "14.0.2",
+            "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz",
+            "integrity": "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==",
+            "funding": [
+                "https://github.com/sponsors/broofa",
+                "https://github.com/sponsors/ctavan"
+            ],
+            "license": "MIT",
+            "bin": {
+                "uuid": "dist-node/bin/uuid"
+            }
+        },
         "node_modules/@wordpress/element": {
             "version": "8.6.0",
             "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-8.6.0.tgz",
@@ -7728,6 +8714,123 @@
                 "node": ">=10"
             }
         },
+        "node_modules/@wordpress/fields": {
+            "version": "0.46.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/fields/-/fields-0.46.0.tgz",
+            "integrity": "sha512-RbNxuLB9yL1zHY4aliEqjJaKnXSoOrJL+6NmeV0FVwGdu9vgsBk56rkuGF06O48bb6eQ4YJLki86Yza7VjvUeA==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@react-spring/web": "^9.4.5",
+                "@wordpress/a11y": "^4.54.0",
+                "@wordpress/api-fetch": "^7.54.0",
+                "@wordpress/base-styles": "^13.0.0",
+                "@wordpress/blob": "^4.54.0",
+                "@wordpress/blocks": "^15.27.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/core-data": "^7.54.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/dataviews": "^18.1.0",
+                "@wordpress/date": "^5.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/hooks": "^4.54.0",
+                "@wordpress/html-entities": "^4.54.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/icons": "^15.5.0",
+                "@wordpress/media-utils": "^5.54.0",
+                "@wordpress/notices": "^5.54.0",
+                "@wordpress/patterns": "^2.54.0",
+                "@wordpress/primitives": "^4.54.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/router": "^1.54.0",
+                "@wordpress/ui": "^0.21.0",
+                "@wordpress/url": "^4.54.0",
+                "@wordpress/warning": "^3.54.0",
+                "@wordpress/wordcount": "^4.54.0",
+                "change-case": "^4.1.2",
+                "client-zip": "^2.4.5",
+                "clsx": "^2.1.1",
+                "remove-accents": "^0.5.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@wordpress/global-styles-engine": {
+            "version": "1.21.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/global-styles-engine/-/global-styles-engine-1.21.0.tgz",
+            "integrity": "sha512-90qh8jHOSqghRLKHmJxg32rNXU9AQ8pjVlH1wjmJywq3h0d4qABSRUSKm2nb5HLwF1zbIX7xTbdLMqqXyZiNFQ==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/blocks": "^15.27.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/style-engine": "^2.54.0",
+                "colord": "^2.9.3",
+                "deepmerge": "^4.3.1",
+                "fast-deep-equal": "^3.1.3",
+                "is-plain-object": "^5.1.0",
+                "memize": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            }
+        },
+        "node_modules/@wordpress/global-styles-ui": {
+            "version": "1.21.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/global-styles-ui/-/global-styles-ui-1.21.0.tgz",
+            "integrity": "sha512-7wyIQGlQzWm65WIoSbQfb83r4ayUWj+PBxafHC2CZdnF1Llf2MWObR6/A8NTvQ0Ig46Y7yeQbZEq2WVy3EWaOQ==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/a11y": "^4.54.0",
+                "@wordpress/api-fetch": "^7.54.0",
+                "@wordpress/base-styles": "^13.0.0",
+                "@wordpress/block-editor": "^17.0.0",
+                "@wordpress/blocks": "^15.27.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/core-data": "^7.54.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/date": "^5.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/global-styles-engine": "^1.21.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/icons": "^15.5.0",
+                "@wordpress/kebab-case": "^1.1.0",
+                "@wordpress/keycodes": "^4.54.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/ui": "^0.21.0",
+                "change-case": "^4.1.2",
+                "clsx": "^2.1.1",
+                "colord": "^2.9.3"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19",
+                "react-dom": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@wordpress/hooks": {
             "version": "4.54.0",
             "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.54.0.tgz",
@@ -7791,6 +8894,79 @@
                 }
             }
         },
+        "node_modules/@wordpress/image-cropper": {
+            "version": "1.18.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/image-cropper/-/image-cropper-1.18.0.tgz",
+            "integrity": "sha512-5pZG9fUT1+KPqGT5ovxOORS3pglRqs4v+X2DTPWGF/wWxbT+cS2UIM/n/VHEilKffLH9SnVK5++aAbsnbIob7Q==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/i18n": "^6.27.0",
+                "clsx": "^2.1.1",
+                "dequal": "^2.0.3",
+                "react-easy-crop": "^5.4.2"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19",
+                "react-dom": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@wordpress/interactivity": {
+            "version": "6.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/interactivity/-/interactivity-6.54.0.tgz",
+            "integrity": "sha512-4/nfcysWRH52lGDMrnltJ1PC8JJmAmGQzuO+zUu7lOosINK6h0xyMNeh0mwTrP78eRfQtyL4lDT7s5tGwwnRbA==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@preact/signals": "^1.3.0",
+                "@preact/signals-core": "^1.7.0",
+                "preact": "^10.29.1"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            }
+        },
+        "node_modules/@wordpress/interface": {
+            "version": "10.0.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/interface/-/interface-10.0.0.tgz",
+            "integrity": "sha512-OGAUpSrVrX4NGu5VI2VZiAoYtSyJMQbAA5cNjOQuhAqL13H94Kan/YBZYvf/i7+smu2zAD52L5oN/EQ95PKHOA==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/a11y": "^4.54.0",
+                "@wordpress/admin-ui": "^2.9.0",
+                "@wordpress/base-styles": "^13.0.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/deprecated": "^4.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/icons": "^15.5.0",
+                "@wordpress/plugins": "^7.54.0",
+                "@wordpress/preferences": "^4.54.0",
+                "@wordpress/viewport": "^6.54.0",
+                "clsx": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "react": "^18 || ^19",
+                "react-dom": "^18 || ^19"
+            }
+        },
         "node_modules/@wordpress/is-shallow-equal": {
             "version": "5.54.0",
             "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-5.54.0.tgz",
@@ -7852,6 +9028,30 @@
                 "npm": ">=10.2.3"
             }
         },
+        "node_modules/@wordpress/keyboard-shortcuts": {
+            "version": "5.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-5.54.0.tgz",
+            "integrity": "sha512-EiguLibri6ZBjQHe7rqumTFk5eZrw47Y2m7TuXro08FQS+qxY6YsYlefbCfWBehFIiptYkaZ0OyRu2KhmDOwuA==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/keycodes": "^4.54.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@wordpress/keycodes": {
             "version": "4.54.0",
             "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.54.0.tgz",
@@ -7873,6 +9073,144 @@
                 }
             }
         },
+        "node_modules/@wordpress/media-editor": {
+            "version": "0.17.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/media-editor/-/media-editor-0.17.0.tgz",
+            "integrity": "sha512-xtkc1f/464ydBhLdwlu+LDVyq83A/8Tr0DOcOnWfFZ7kFyz2zfOqnU+geiWcmilgc0biNqxLMlBbGsoJaViS2g==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/a11y": "^4.54.0",
+                "@wordpress/api-fetch": "^7.54.0",
+                "@wordpress/base-styles": "^13.0.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/core-data": "^7.54.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/dataviews": "^18.1.0",
+                "@wordpress/date": "^5.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/icons": "^15.5.0",
+                "@wordpress/interface": "^10.0.0",
+                "@wordpress/keyboard-shortcuts": "^5.54.0",
+                "@wordpress/keycodes": "^4.54.0",
+                "@wordpress/notices": "^5.54.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/ui": "^0.21.0",
+                "clsx": "^2.1.1",
+                "gl-matrix": "^3.4.3"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@wordpress/media-fields": {
+            "version": "0.19.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/media-fields/-/media-fields-0.19.0.tgz",
+            "integrity": "sha512-bGNqM6UOeY53jz/mbOwW15R8moAsy5Rzw+aBNuLSaKM9mmg1bezAkAIEoQHaMvlxiaHTmegW7qnH6bXlpeUqMQ==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/base-styles": "^13.0.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/core-data": "^7.54.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/dataviews": "^18.1.0",
+                "@wordpress/date": "^5.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/icons": "^15.5.0",
+                "@wordpress/primitives": "^4.54.0",
+                "@wordpress/ui": "^0.21.0",
+                "@wordpress/url": "^4.54.0",
+                "clsx": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@wordpress/media-utils": {
+            "version": "5.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/media-utils/-/media-utils-5.54.0.tgz",
+            "integrity": "sha512-MOHXv3e6bVB9uXS17TT9aaY4DPhaUalisFJqsYqXMnJcwRu2hgrVfDEry+J5/ho8XWd31vnY0OcV0GGKeQiuBQ==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/api-fetch": "^7.54.0",
+                "@wordpress/base-styles": "^13.0.0",
+                "@wordpress/blob": "^4.54.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/core-data": "^7.54.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/dataviews": "^18.1.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/icons": "^15.5.0",
+                "@wordpress/media-fields": "^0.19.0",
+                "@wordpress/notices": "^5.54.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/ui": "^0.21.0",
+                "@wordpress/views": "^1.21.0",
+                "clsx": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@wordpress/notices": {
+            "version": "5.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-5.54.0.tgz",
+            "integrity": "sha512-fZcDoJEOdRwVtL8pUWVuK7ggNIivMd46/jczxhsX+LmSVT/vlhrBEKv22IeiqpcyGRY8GakXfcK7c02n61HLVw==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/a11y": "^4.54.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/data": "^10.54.0",
+                "clsx": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@wordpress/npm-package-json-lint-config": {
             "version": "5.54.0",
             "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.54.0.tgz",
@@ -7887,6 +9225,38 @@
                 "npm-package-json-lint": ">=6.0.0"
             }
         },
+        "node_modules/@wordpress/patterns": {
+            "version": "2.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/patterns/-/patterns-2.54.0.tgz",
+            "integrity": "sha512-Phqyr+t6jyb5P9++UNtbbc9byX5MiUykAotRgvfgtEwsafWYSomwWEoy7Y3Httb7SVR8SpbibSPMQzIMZw/fsQ==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/a11y": "^4.54.0",
+                "@wordpress/base-styles": "^13.0.0",
+                "@wordpress/block-editor": "^17.0.0",
+                "@wordpress/blocks": "^15.27.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/core-data": "^7.54.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/html-entities": "^4.54.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/icons": "^15.5.0",
+                "@wordpress/notices": "^5.54.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/ui": "^0.21.0",
+                "@wordpress/url": "^4.54.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "react": "^18 || ^19",
+                "react-dom": "^18 || ^19"
+            }
+        },
         "node_modules/@wordpress/plugins": {
             "version": "7.54.0",
             "resolved": "https://registry.npmjs.org/@wordpress/plugins/-/plugins-7.54.0.tgz",
@@ -7944,6 +9314,39 @@
                 "postcss": "^8.0.0"
             }
         },
+        "node_modules/@wordpress/preferences": {
+            "version": "4.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-4.54.0.tgz",
+            "integrity": "sha512-yFEJopdYAE0KmlrqrZxfTcwS8rSJcHV+qYfzFlz8pHgZe2UVB5MENPKJetPT7fhM4uN5WISY9cgnEniF3+EoDw==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/a11y": "^4.54.0",
+                "@wordpress/base-styles": "^13.0.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/deprecated": "^4.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/icons": "^15.5.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "clsx": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19",
+                "react-dom": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@wordpress/prettier-config": {
             "version": "4.54.0",
             "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-4.54.0.tgz",
@@ -8022,6 +9425,35 @@
                 "redux": ">=4"
             }
         },
+        "node_modules/@wordpress/reusable-blocks": {
+            "version": "5.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/reusable-blocks/-/reusable-blocks-5.54.0.tgz",
+            "integrity": "sha512-UEDUTMPQb/CjlvypFnpWC6Ts4t/t7SQMzkuQ9AAk39pXaQAUbg6h8GiwH6tqvWhUHknwiey7RRmiCn/X3x4eGw==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/base-styles": "^13.0.0",
+                "@wordpress/block-editor": "^17.0.0",
+                "@wordpress/blocks": "^15.27.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/core-data": "^7.54.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/deprecated": "^4.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/icons": "^15.5.0",
+                "@wordpress/notices": "^5.54.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/url": "^4.54.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "react": "^18 || ^19",
+                "react-dom": "^18 || ^19"
+            }
+        },
         "node_modules/@wordpress/rich-text": {
             "version": "7.54.0",
             "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-7.54.0.tgz",
@@ -8054,6 +9486,92 @@
                 }
             }
         },
+        "node_modules/@wordpress/route": {
+            "version": "0.20.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/route/-/route-0.20.0.tgz",
+            "integrity": "sha512-vLp0EvAcmCZnTVFjkhuFaPbm9qwrvGIaFHMaskU3uBw/qsxj/0xDT5Zm43MZNAKrbU8x2FC+KMXk0c28Ya5tFg==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@tanstack/history": "^1.133.28",
+                "@tanstack/react-router": "^1.120.5",
+                "@wordpress/private-apis": "^1.54.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "react": "^18 || ^19"
+            }
+        },
+        "node_modules/@wordpress/route/node_modules/@tanstack/react-router": {
+            "version": "1.170.32",
+            "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.170.32.tgz",
+            "integrity": "sha512-SIpxvaTKco100a5ZR3ePmArbhtm3XOx+w1dpGYY9gxHDta4iXSKDdQuhLonwJbIMkVJsU1rwXf0UDHMrF/1snw==",
+            "license": "MIT",
+            "dependencies": {
+                "@tanstack/history": "1.162.1",
+                "@tanstack/react-store": "^0.9.3",
+                "@tanstack/router-core": "1.171.27",
+                "isbot": "^5.1.22"
+            },
+            "engines": {
+                "node": ">=20.19"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/tannerlinsley"
+            },
+            "peerDependencies": {
+                "react": ">=18.0.0 || >=19.0.0",
+                "react-dom": ">=18.0.0 || >=19.0.0"
+            }
+        },
+        "node_modules/@wordpress/route/node_modules/@tanstack/react-router/node_modules/@tanstack/react-store": {
+            "version": "0.9.3",
+            "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.9.3.tgz",
+            "integrity": "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==",
+            "license": "MIT",
+            "dependencies": {
+                "@tanstack/store": "0.9.3",
+                "use-sync-external-store": "^1.6.0"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/tannerlinsley"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+                "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+            }
+        },
+        "node_modules/@wordpress/router": {
+            "version": "1.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/router/-/router-1.54.0.tgz",
+            "integrity": "sha512-2iSKZ5VFaXufLrStGAkRbf2stpZi09m1i6DMt3pmGVVlrDRZaZkSed4LAK0BNeMXD11HsPg8G/iQGkGi3AiN2g==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/url": "^4.54.0",
+                "history": "^5.3.0",
+                "route-recognizer": "^0.3.4"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@wordpress/scripts": {
             "version": "34.2.0",
             "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-34.2.0.tgz",
@@ -8396,6 +9914,71 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
+        "node_modules/@wordpress/server-side-render": {
+            "version": "6.30.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/server-side-render/-/server-side-render-6.30.0.tgz",
+            "integrity": "sha512-AafaeSWKTZr78BrYSoSeApMDAFgZBwqjdUI0rftIZwP3F7cx+Ajal9TzVnWNFobuCMCQzbPtBL9RMJjw2DjZ6A==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/api-fetch": "^7.54.0",
+                "@wordpress/blocks": "^15.27.0",
+                "@wordpress/components": "^40.0.0",
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/deprecated": "^4.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/url": "^4.54.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19",
+                "react-dom": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@wordpress/shortcode": {
+            "version": "4.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-4.54.0.tgz",
+            "integrity": "sha512-Lt0BzcnaCRH5vIlYHtXN3PHrq1Fc04WC4mhITctUoJeV8hQFpbuQAUKaFrKUTn2jCcQclYKRC8aUVabld8AmcA==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "memize": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            }
+        },
+        "node_modules/@wordpress/style-engine": {
+            "version": "2.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/style-engine/-/style-engine-2.54.0.tgz",
+            "integrity": "sha512-CpZaTUFZovM1X7E884eylSmjufEHBtCzrskCnI0kyCy4N2I+it7B3xAF16qlVVch1QAq0WEvfUhm1phFiaMEXA==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "change-case": "^4.1.2"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@wordpress/style-runtime": {
             "version": "0.10.0",
             "resolved": "https://registry.npmjs.org/@wordpress/style-runtime/-/style-runtime-0.10.0.tgz",
@@ -8473,6 +10056,37 @@
                 }
             }
         },
+        "node_modules/@wordpress/sync": {
+            "version": "1.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/sync/-/sync-1.54.0.tgz",
+            "integrity": "sha512-NHRGP27HecH/hGdM3YVFcKFqUw06UfLoUQPp8IuIR3Bk7DPj1PdM5PnbqyYibSf8caDE+bIduacbHv0mn2JLSg==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/api-fetch": "^7.54.0",
+                "@wordpress/hooks": "^4.54.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/undo-manager": "^1.54.0",
+                "diff": "^8.0.3",
+                "fast-deep-equal": "^3.1.3",
+                "lib0": "^0.2.99",
+                "y-protocols": "^1.0.7",
+                "yjs": "^13.6.29"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            }
+        },
+        "node_modules/@wordpress/token-list": {
+            "version": "3.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-3.54.0.tgz",
+            "integrity": "sha512-U3LMm0zq35H+kmAVv2bwG8W75sflglI45YLV/KPLGMZIv/f45LTtMkzpJ16c3TSYs0CP+slsV4YIMttetcQwPg==",
+            "license": "GPL-2.0-or-later",
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            }
+        },
         "node_modules/@wordpress/ui": {
             "version": "0.21.0",
             "resolved": "https://registry.npmjs.org/@wordpress/ui/-/ui-0.21.0.tgz",
@@ -8569,6 +10183,136 @@
                 "npm": ">=8.19.2"
             }
         },
+        "node_modules/@wordpress/upload-media": {
+            "version": "0.39.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/upload-media/-/upload-media-0.39.0.tgz",
+            "integrity": "sha512-SL5cCERYah4KoF/yviarLEOYw3dH8z0UA78tWFAaR3f+uja2mj92Ub59kRBDnCLrn0SWInW+JbMwWM5mkQRhbw==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/blob": "^4.54.0",
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/i18n": "^6.27.0",
+                "@wordpress/preferences": "^4.54.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "@wordpress/url": "^4.54.0",
+                "@wordpress/video-conversion": "^0.5.0",
+                "@wordpress/vips": "^4.0.0",
+                "uuid": "^14.0.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19",
+                "react-dom": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@wordpress/upload-media/node_modules/uuid": {
+            "version": "14.0.2",
+            "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz",
+            "integrity": "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==",
+            "funding": [
+                "https://github.com/sponsors/broofa",
+                "https://github.com/sponsors/ctavan"
+            ],
+            "license": "MIT",
+            "bin": {
+                "uuid": "dist-node/bin/uuid"
+            }
+        },
+        "node_modules/@wordpress/url": {
+            "version": "4.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-4.54.0.tgz",
+            "integrity": "sha512-wa+61i0zyHjNZOAvXLdLrjc+dHyBjX9lfqnAfBw1N0yWAGU/vL3qBkfTBIDx9LxqjKXQ9HRSSxvQVfzGyGRzkg==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "remove-accents": "^0.5.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            }
+        },
+        "node_modules/@wordpress/video-conversion": {
+            "version": "0.5.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/video-conversion/-/video-conversion-0.5.0.tgz",
+            "integrity": "sha512-WM9DLabhL0L/ZNZtrdRotRuFsfMFiMhrEWxUxP1bQoP7ln0wfqq9WubR+PKR5y3DN8k2xgqi2ChHUemZHANUKw==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/worker-threads": "^1.14.0",
+                "mediabunny": "^1.45.2"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            }
+        },
+        "node_modules/@wordpress/viewport": {
+            "version": "6.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/viewport/-/viewport-6.54.0.tgz",
+            "integrity": "sha512-7jGDRi0MJh78HPRPHI1ImBkUYJVUf2Y+y7p84S7MrgWxZdFCaEQMVLxH9+s4QXkjKHVq87774BsJ+IrQzwJL9Q==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/compose": "^8.7.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/element": "^8.6.0"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            },
+            "peerDependencies": {
+                "@types/react": "^18 || ^19",
+                "react": "^18 || ^19"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@wordpress/views": {
+            "version": "1.21.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/views/-/views-1.21.0.tgz",
+            "integrity": "sha512-FLQy56UtFRHNsTMF9uY8oyViIimTlnHwWRHGBuR8jWNgveFXayBsQOB9kEhKJudH89QeinXfU4IkdCyRjBmWiQ==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/core-data": "^7.54.0",
+                "@wordpress/data": "^10.54.0",
+                "@wordpress/dataviews": "^18.1.0",
+                "@wordpress/element": "^8.6.0",
+                "@wordpress/preferences": "^4.54.0",
+                "@wordpress/private-apis": "^1.54.0",
+                "dequal": "^2.0.3"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            }
+        },
+        "node_modules/@wordpress/vips": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/vips/-/vips-4.0.0.tgz",
+            "integrity": "sha512-ArVropSpPfvB8AbqKtBcW1qG//yevwObABjDCKFN2ym0XA7xVcgwWy48MzFdQMDJ3RCf5q1iButc4n0Tk2Tf1w==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "@wordpress/worker-threads": "^1.14.0",
+                "wasm-vips": "^0.0.18"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            }
+        },
         "node_modules/@wordpress/warning": {
             "version": "3.54.0",
             "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.54.0.tgz",
@@ -8579,6 +10323,29 @@
                 "npm": ">=8.19.2"
             }
         },
+        "node_modules/@wordpress/wordcount": {
+            "version": "4.54.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-4.54.0.tgz",
+            "integrity": "sha512-hITSDjfFELk0n3ZzajvJRO6WjRN3+UM9P3ApL37kaNMV54HHLJRSEhzRbQJEcrRqkMrd6uMRmpCbrH0BB6lZPQ==",
+            "license": "GPL-2.0-or-later",
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            }
+        },
+        "node_modules/@wordpress/worker-threads": {
+            "version": "1.14.0",
+            "resolved": "https://registry.npmjs.org/@wordpress/worker-threads/-/worker-threads-1.14.0.tgz",
+            "integrity": "sha512-jcJoMirVeEVtM+PC1gnqmgvRBd72rzgsaAb17Pzz0q8FBK/Kn6/bNhaWXMLQG8bVCeF5Ot2pDqnPmmi2Rj0qsQ==",
+            "license": "GPL-2.0-or-later",
+            "dependencies": {
+                "comctx": "^1.4.3"
+            },
+            "engines": {
+                "node": ">=18.12.0",
+                "npm": ">=8.19.2"
+            }
+        },
         "node_modules/@xtuc/ieee754": {
             "version": "1.2.0",
             "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
@@ -8895,6 +10662,18 @@
                 "sprintf-js": "~1.0.2"
             }
         },
+        "node_modules/aria-hidden": {
+            "version": "1.2.6",
+            "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
+            "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
+            "license": "MIT",
+            "dependencies": {
+                "tslib": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/aria-query": {
             "version": "5.3.2",
             "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
@@ -9198,6 +10977,12 @@
                 "postcss": "^8.1.0"
             }
         },
+        "node_modules/autosize": {
+            "version": "4.0.4",
+            "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz",
+            "integrity": "sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ==",
+            "license": "MIT"
+        },
         "node_modules/available-typed-arrays": {
             "version": "1.0.7",
             "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
@@ -10130,6 +11915,12 @@
             "dev": true,
             "license": "MIT"
         },
+        "node_modules/client-zip": {
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/client-zip/-/client-zip-2.5.0.tgz",
+            "integrity": "sha512-ydG4nDZesbFurnNq0VVCp/yyomIBh+X/1fZPI/P24zbnG4dtC4tQAfI5uQsomigsUMeiRO2wiTPizLWQh+IAyQ==",
+            "license": "MIT"
+        },
         "node_modules/cliui": {
             "version": "8.0.1",
             "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
@@ -10182,6 +11973,22 @@
                 "node": ">=6"
             }
         },
+        "node_modules/cmdk": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz",
+            "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==",
+            "license": "MIT",
+            "dependencies": {
+                "@radix-ui/react-compose-refs": "^1.1.1",
+                "@radix-ui/react-dialog": "^1.1.6",
+                "@radix-ui/react-id": "^1.1.0",
+                "@radix-ui/react-primitive": "^2.0.2"
+            },
+            "peerDependencies": {
+                "react": "^18 || ^19 || ^19.0.0-rc",
+                "react-dom": "^18 || ^19 || ^19.0.0-rc"
+            }
+        },
         "node_modules/co": {
             "version": "4.6.0",
             "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -10243,6 +12050,12 @@
                 "url": "https://opencollective.com/color"
             }
         },
+        "node_modules/comctx": {
+            "version": "1.7.5",
+            "resolved": "https://registry.npmjs.org/comctx/-/comctx-1.7.5.tgz",
+            "integrity": "sha512-0fsxsxr1Hg2T99wOIteUbsJOX6jMmnhAJepcVRqNRMWpcbxRhbm2+0R8qEuQEaE4gWjfdXaKeAGYAn0yeElylQ==",
+            "license": "MIT"
+        },
         "node_modules/commander": {
             "version": "9.0.0",
             "resolved": "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz",
@@ -10319,6 +12132,11 @@
             "dev": true,
             "license": "MIT"
         },
+        "node_modules/computed-style": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/computed-style/-/computed-style-0.1.4.tgz",
+            "integrity": "sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w=="
+        },
         "node_modules/concat-map": {
             "version": "0.0.1",
             "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -10406,6 +12224,12 @@
                 "node": ">= 0.6"
             }
         },
+        "node_modules/cookie-es": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-3.1.1.tgz",
+            "integrity": "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==",
+            "license": "MIT"
+        },
         "node_modules/cookie-signature": {
             "version": "1.0.7",
             "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
@@ -11140,6 +12964,15 @@
                 "node": ">= 0.8"
             }
         },
+        "node_modules/dequal": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+            "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            }
+        },
         "node_modules/destroy": {
             "version": "1.2.0",
             "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
@@ -11178,6 +13011,12 @@
             "dev": true,
             "license": "MIT"
         },
+        "node_modules/detect-node-es": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+            "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+            "license": "MIT"
+        },
         "node_modules/devtools-protocol": {
             "version": "0.0.1507524",
             "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1507524.tgz",
@@ -11185,6 +13024,15 @@
             "dev": true,
             "license": "BSD-3-Clause"
         },
+        "node_modules/diff": {
+            "version": "8.0.4",
+            "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz",
+            "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==",
+            "license": "BSD-3-Clause",
+            "engines": {
+                "node": ">=0.3.1"
+            }
+        },
         "node_modules/dir-glob": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -13239,6 +15087,15 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/get-nonce": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+            "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            }
+        },
         "node_modules/get-package-type": {
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
@@ -13358,6 +15215,12 @@
                 "safe-buffer": "^5.1.1"
             }
         },
+        "node_modules/gl-matrix": {
+            "version": "3.4.4",
+            "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz",
+            "integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==",
+            "license": "MIT"
+        },
         "node_modules/glob": {
             "version": "13.0.6",
             "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
@@ -13774,6 +15637,15 @@
             "integrity": "sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ==",
             "license": "MIT"
         },
+        "node_modules/history": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz",
+            "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.6"
+            }
+        },
         "node_modules/hoist-non-react-statics": {
             "version": "3.3.2",
             "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
@@ -13876,6 +15748,12 @@
                 "safe-buffer": "~5.1.0"
             }
         },
+        "node_modules/hpq": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/hpq/-/hpq-1.4.0.tgz",
+            "integrity": "sha512-ycJQMRaRPBcfnoT1gS5I1XCvbbw9KO94Y0vkwksuOjcJMqNZtb03MF2tCItLI2mQbkZWSSeFinoRDPmjzv4tKg==",
+            "license": "MIT"
+        },
         "node_modules/html-encoding-sniffer": {
             "version": "4.0.0",
             "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
@@ -14929,6 +16807,15 @@
             "dev": true,
             "license": "MIT"
         },
+        "node_modules/isbot": {
+            "version": "5.2.2",
+            "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.2.2.tgz",
+            "integrity": "sha512-iQcBXcd+Rv/pkubRyGh2utW2j1oPG5hZY6TUhVPpqK4G+o3IbxpJNx04hgksjc/N7GK5pEorUxDeg31cFgEk/w==",
+            "license": "Unlicense",
+            "engines": {
+                "node": ">=18"
+            }
+        },
         "node_modules/isexe": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -14946,6 +16833,16 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/isomorphic.js": {
+            "version": "0.2.5",
+            "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz",
+            "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==",
+            "license": "MIT",
+            "funding": {
+                "type": "GitHub Sponsors ❤",
+                "url": "https://github.com/sponsors/dmonad"
+            }
+        },
         "node_modules/istanbul-lib-coverage": {
             "version": "3.2.2",
             "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
@@ -15917,6 +17814,27 @@
                 "node": ">= 0.8.0"
             }
         },
+        "node_modules/lib0": {
+            "version": "0.2.117",
+            "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.117.tgz",
+            "integrity": "sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==",
+            "license": "MIT",
+            "dependencies": {
+                "isomorphic.js": "^0.2.4"
+            },
+            "bin": {
+                "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js",
+                "0gentesthtml": "bin/gentesthtml.js",
+                "0serve": "bin/0serve.js"
+            },
+            "engines": {
+                "node": ">=16"
+            },
+            "funding": {
+                "type": "GitHub Sponsors ❤",
+                "url": "https://github.com/sponsors/dmonad"
+            }
+        },
         "node_modules/lighthouse": {
             "version": "12.8.2",
             "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.8.2.tgz",
@@ -16014,6 +17932,18 @@
                 "url": "https://github.com/sponsors/antonk52"
             }
         },
+        "node_modules/line-height": {
+            "version": "0.3.1",
+            "resolved": "https://registry.npmjs.org/line-height/-/line-height-0.3.1.tgz",
+            "integrity": "sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w==",
+            "license": "MIT",
+            "dependencies": {
+                "computed-style": "~0.1.3"
+            },
+            "engines": {
+                "node": ">= 4.0.0"
+            }
+        },
         "node_modules/lines-and-columns": {
             "version": "1.2.4",
             "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
@@ -16129,7 +18059,6 @@
             "version": "1.4.0",
             "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
             "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
-            "dev": true,
             "license": "MIT",
             "dependencies": {
                 "js-tokens": "^3.0.0 || ^4.0.0"
@@ -16373,6 +18302,18 @@
             "dev": true,
             "license": "MIT"
         },
+        "node_modules/marked": {
+            "version": "18.0.11",
+            "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.11.tgz",
+            "integrity": "sha512-HnslJfsZkRPBDJRHvVtAaWlZHEpSu7u8LgQuJCELjRKuWR+hpq4A7sLq3p8HaI9ypVoXDXxV34CsQJEe1+J5Aw==",
+            "license": "MIT",
+            "bin": {
+                "marked": "bin/marked.js"
+            },
+            "engines": {
+                "node": ">= 20"
+            }
+        },
         "node_modules/marky": {
             "version": "1.3.0",
             "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz",
@@ -16425,6 +18366,24 @@
                 "node": ">= 0.6"
             }
         },
+        "node_modules/mediabunny": {
+            "version": "1.55.7",
+            "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.55.7.tgz",
+            "integrity": "sha512-Sb/vI8frRiDPbPUwl3hz0n69NSe9yt4Nydcv5yxi8Rdgk0BgnujEGjZqE+uCTehFbafcqIu6gDAok8ln98dcqg==",
+            "license": "MPL-2.0",
+            "workspaces": [
+                ".",
+                "packages/*"
+            ],
+            "dependencies": {
+                "@types/dom-mediacapture-transform": "^0.1.11",
+                "@types/dom-webcodecs": "0.1.13"
+            },
+            "funding": {
+                "type": "individual",
+                "url": "https://github.com/sponsors/Vanilagy"
+            }
+        },
         "node_modules/memfs": {
             "version": "4.69.1",
             "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.69.1.tgz",
@@ -16915,7 +18874,6 @@
             "version": "3.3.18",
             "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
             "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
-            "devOptional": true,
             "funding": [
                 {
                     "type": "github",
@@ -17072,6 +19030,12 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/normalize-wheel": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
+            "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==",
+            "license": "BSD-3-Clause"
+        },
         "node_modules/npm-bundled": {
             "version": "1.1.2",
             "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz",
@@ -17274,7 +19238,6 @@
             "version": "4.1.1",
             "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
             "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
-            "dev": true,
             "license": "MIT",
             "engines": {
                 "node": ">=0.10.0"
@@ -17724,6 +19687,22 @@
                 "url": "https://github.com/fb55/entities?sponsor=1"
             }
         },
+        "node_modules/parsel-js": {
+            "version": "1.2.3",
+            "resolved": "https://registry.npmjs.org/parsel-js/-/parsel-js-1.2.3.tgz",
+            "integrity": "sha512-kJHFmSNnujpusFfVEXjNaoJ09VYHF8Ih0aVUn7Clu+Ug8AFoA2wx7Ezh17JfW4+vhm/lauAd9A+//uFkmydZtQ==",
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://github.com/sponsors/LeaVerou"
+                },
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/leaverou"
+                }
+            ],
+            "license": "MIT"
+        },
         "node_modules/parseurl": {
             "version": "1.3.3",
             "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -18089,7 +20068,6 @@
             "version": "8.5.28",
             "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz",
             "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==",
-            "devOptional": true,
             "funding": [
                 {
                     "type": "opencollective",
@@ -18651,6 +20629,15 @@
                 "postcss": "^8.4.31"
             }
         },
+        "node_modules/postcss-prefix-selector": {
+            "version": "1.16.1",
+            "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz",
+            "integrity": "sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==",
+            "license": "MIT",
+            "peerDependencies": {
+                "postcss": ">4 <9"
+            }
+        },
         "node_modules/postcss-reduce-initial": {
             "version": "6.1.0",
             "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz",
@@ -18792,11 +20779,22 @@
                 "postcss": "^8.4.31"
             }
         },
+        "node_modules/postcss-urlrebase": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/postcss-urlrebase/-/postcss-urlrebase-1.4.0.tgz",
+            "integrity": "sha512-rRaxMmWvXrn8Rk1PqsxmaJwldRHsr0WbbASKKCZYxXwotHkM/5X/6IrwaEe8pdzpbNGCEY86yhYMN0MhgOkADA==",
+            "license": "MIT",
+            "dependencies": {
+                "postcss-value-parser": "^4.2.0"
+            },
+            "peerDependencies": {
+                "postcss": "^8.3.0"
+            }
+        },
         "node_modules/postcss-value-parser": {
             "version": "4.2.0",
             "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
             "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
-            "devOptional": true,
             "license": "MIT"
         },
         "node_modules/postgres-array": {
@@ -18842,6 +20840,24 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/preact": {
+            "version": "10.29.8",
+            "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.8.tgz",
+            "integrity": "sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==",
+            "license": "MIT",
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/preact"
+            },
+            "peerDependencies": {
+                "preact-render-to-string": ">=5"
+            },
+            "peerDependenciesMeta": {
+                "preact-render-to-string": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/prelude-ls": {
             "version": "1.2.1",
             "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -18932,7 +20948,6 @@
             "version": "15.8.1",
             "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
             "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
-            "dev": true,
             "license": "MIT",
             "dependencies": {
                 "loose-envify": "^1.4.0",
@@ -19213,11 +21228,13 @@
             }
         },
         "node_modules/react": {
-            "version": "19.2.8",
-            "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz",
-            "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==",
+            "version": "18.3.1",
+            "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+            "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
             "license": "MIT",
-            "peer": true,
+            "dependencies": {
+                "loose-envify": "^1.1.0"
+            },
             "engines": {
                 "node": ">=0.10.0"
             }
@@ -19259,16 +21276,31 @@
             }
         },
         "node_modules/react-dom": {
-            "version": "19.2.8",
-            "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz",
-            "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==",
+            "version": "18.3.1",
+            "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+            "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
             "license": "MIT",
             "peer": true,
             "dependencies": {
-                "scheduler": "^0.27.0"
+                "loose-envify": "^1.1.0",
+                "scheduler": "^0.23.2"
             },
             "peerDependencies": {
-                "react": "^19.2.8"
+                "react": "^18.3.1"
+            }
+        },
+        "node_modules/react-easy-crop": {
+            "version": "5.5.7",
+            "resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-5.5.7.tgz",
+            "integrity": "sha512-kYo4NtMeXFQB7h1U+h5yhUkE46WQbQdq7if54uDlbMdZHdRgNehfvaFrXnFw5NR1PNoUOJIfTwLnWmEx/MaZnA==",
+            "license": "MIT",
+            "dependencies": {
+                "normalize-wheel": "^1.0.1",
+                "tslib": "^2.0.1"
+            },
+            "peerDependencies": {
+                "react": ">=16.4.0",
+                "react-dom": ">=16.4.0"
             }
         },
         "node_modules/react-is": {
@@ -19287,6 +21319,75 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/react-remove-scroll": {
+            "version": "2.7.2",
+            "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
+            "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
+            "license": "MIT",
+            "dependencies": {
+                "react-remove-scroll-bar": "^2.3.7",
+                "react-style-singleton": "^2.2.3",
+                "tslib": "^2.1.0",
+                "use-callback-ref": "^1.3.3",
+                "use-sidecar": "^1.1.3"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "peerDependencies": {
+                "@types/react": "*",
+                "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/react-remove-scroll-bar": {
+            "version": "2.3.8",
+            "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
+            "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
+            "license": "MIT",
+            "dependencies": {
+                "react-style-singleton": "^2.2.2",
+                "tslib": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "peerDependencies": {
+                "@types/react": "*",
+                "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/react-style-singleton": {
+            "version": "2.2.3",
+            "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
+            "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
+            "license": "MIT",
+            "dependencies": {
+                "get-nonce": "^1.0.0",
+                "tslib": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "peerDependencies": {
+                "@types/react": "*",
+                "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/read-cache": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.2.tgz",
@@ -19719,6 +21820,12 @@
                 "node": ">=10.0.0"
             }
         },
+        "node_modules/route-recognizer": {
+            "version": "0.3.4",
+            "resolved": "https://registry.npmjs.org/route-recognizer/-/route-recognizer-0.3.4.tgz",
+            "integrity": "sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g==",
+            "license": "MIT"
+        },
         "node_modules/rrweb-cssom": {
             "version": "0.8.0",
             "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz",
@@ -19970,11 +22077,14 @@
             }
         },
         "node_modules/scheduler": {
-            "version": "0.27.0",
-            "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
-            "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+            "version": "0.23.2",
+            "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+            "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
             "license": "MIT",
-            "peer": true
+            "peer": true,
+            "dependencies": {
+                "loose-envify": "^1.1.0"
+            }
         },
         "node_modules/schema-utils": {
             "version": "4.3.3",
@@ -20140,6 +22250,27 @@
                 "randombytes": "^2.1.0"
             }
         },
+        "node_modules/seroval": {
+            "version": "1.6.4",
+            "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.6.4.tgz",
+            "integrity": "sha512-LErWMNS2RRFdu2RMA5u/PA59/IWs0XsikyEXGQ2/36iEWFrdG0ABmg17E17cikrv76891kOAMq3TkTFXpwAHXw==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/seroval-plugins": {
+            "version": "1.6.4",
+            "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.6.4.tgz",
+            "integrity": "sha512-R0f1U9hmn38+dFMz6b6ab8lwucmw4AtiY7St+JPWudy1dm+Bs3g884nyrsH9Cy6rKpZKLYayXuMda9GZ/fl8JQ==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=10"
+            },
+            "peerDependencies": {
+                "seroval": "^1.0"
+            }
+        },
         "node_modules/serve-index": {
             "version": "1.9.2",
             "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz",
@@ -20428,6 +22559,12 @@
             "dev": true,
             "license": "ISC"
         },
+        "node_modules/simple-html-tokenizer": {
+            "version": "0.5.11",
+            "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz",
+            "integrity": "sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og==",
+            "license": "MIT"
+        },
         "node_modules/sirv": {
             "version": "2.0.4",
             "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz",
@@ -22583,6 +24720,49 @@
                 "url": "https://opencollective.com/webpack"
             }
         },
+        "node_modules/use-callback-ref": {
+            "version": "1.3.3",
+            "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
+            "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
+            "license": "MIT",
+            "dependencies": {
+                "tslib": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "peerDependencies": {
+                "@types/react": "*",
+                "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/use-sidecar": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
+            "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
+            "license": "MIT",
+            "dependencies": {
+                "detect-node-es": "^1.1.0",
+                "tslib": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "peerDependencies": {
+                "@types/react": "*",
+                "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+            },
+            "peerDependenciesMeta": {
+                "@types/react": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/use-sync-external-store": {
             "version": "1.6.0",
             "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
@@ -22690,6 +24870,15 @@
                 "node": ">=18"
             }
         },
+        "node_modules/wasm-vips": {
+            "version": "0.0.18",
+            "resolved": "https://registry.npmjs.org/wasm-vips/-/wasm-vips-0.0.18.tgz",
+            "integrity": "sha512-AJyCvxZj/3qceKNnh+YyEobu/IaJFoPN7x7SxyyHmYBS3kASMqJqxQEuN0ZHKQDWsCJ8armfx4Tq3uKrNc+nMA==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=17.0.0"
+            }
+        },
         "node_modules/watchpack": {
             "version": "2.5.2",
             "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz",
@@ -23498,6 +25687,26 @@
                 "node": ">=0.4"
             }
         },
+        "node_modules/y-protocols": {
+            "version": "1.0.7",
+            "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.7.tgz",
+            "integrity": "sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw==",
+            "license": "MIT",
+            "dependencies": {
+                "lib0": "^0.2.85"
+            },
+            "engines": {
+                "node": ">=16.0.0",
+                "npm": ">=8.0.0"
+            },
+            "funding": {
+                "type": "GitHub Sponsors ❤",
+                "url": "https://github.com/sponsors/dmonad"
+            },
+            "peerDependencies": {
+                "yjs": "^13.0.0"
+            }
+        },
         "node_modules/y18n": {
             "version": "5.0.8",
             "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
@@ -23564,6 +25773,23 @@
                 "fd-slicer": "~1.1.0"
             }
         },
+        "node_modules/yjs": {
+            "version": "13.6.32",
+            "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.32.tgz",
+            "integrity": "sha512-lfiJIIC4Xayt5ItynE407ehlE03pCjeOc4hkR4yxxvvNJ4kuiN25B0g+Qp8XagYz361LLL7DCzR5bvFJ81QKtQ==",
+            "license": "MIT",
+            "dependencies": {
+                "lib0": "^0.2.99"
+            },
+            "engines": {
+                "node": ">=16.0.0",
+                "npm": ">=8.0.0"
+            },
+            "funding": {
+                "type": "GitHub Sponsors ❤",
+                "url": "https://github.com/sponsors/dmonad"
+            }
+        },
         "node_modules/yocto-queue": {
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index d765c25..8969333 100644
--- a/package.json
+++ b/package.json
@@ -19,7 +19,18 @@
         "@wordpress/scripts": "^34.2.0"
     },
     "dependencies": {
+        "@wordpress/api-fetch": "^7.54.0",
+        "@wordpress/block-editor": "^17.0.0",
+        "@wordpress/components": "^40.0.0",
+        "@wordpress/compose": "^8.7.0",
+        "@wordpress/core-data": "^7.54.0",
+        "@wordpress/data": "^10.54.0",
+        "@wordpress/editor": "^14.54.0",
+        "@wordpress/element": "^8.6.0",
+        "@wordpress/media-utils": "^5.54.0",
         "@wordpress/plugins": "^7.54.0",
+        "@wordpress/upload-media": "^0.39.0",
+        "@wordpress/url": "^4.54.0",
         "sass": "^1.103.1"
     }
 }
diff --git a/src/editor-fields/Fields.js b/src/editor-fields/Fields.js
index bcc16c7..f0bdafa 100644
--- a/src/editor-fields/Fields.js
+++ b/src/editor-fields/Fields.js
@@ -5,6 +5,10 @@
 import DateField from './fields/date-field';
 import TimeField from './fields/time-field';
 import DateTimeField from "./fields/datetime-field";
+import RepeaterField from "./fields/repeater-field";
+import UploadField from "./fields/upload-field";
+import SelectorField from "./fields/selector-field";
+import LocationField from "./fields/location-field.js";
 import { PanelRow } from '@wordpress/components';
 
 const FIELD_MAP = {
@@ -22,9 +26,32 @@
 	date: DateField,
 	time: TimeField,
 	datetime: DateTimeField,
+	repeater: RepeaterField,
+	upload: UploadField,
+	selector: SelectorField,
+	location: LocationField
 };
 
-const Fields = ({ field, value, onChange }) => {
+const OPERATORS = {
+	'=':  (a, b) => a == b,
+	'==': (a, b) => a == b,
+	'!=': (a, b) => a != b,
+	'>':  (a, b) => a > b,
+	'<':  (a, b) => a < b,
+	'in': (a, b) => Array.isArray(b) ? b.includes(a) : String(b).split(',').includes(a),
+};
+
+export const checkCondition = (condition, meta) => {
+	if (!condition?.field) return true;
+	const compare = OPERATORS[condition.operator] || OPERATORS['='];
+	return compare(meta?.[condition.field], condition.value);
+};
+
+const Fields = ({ id, field, value, onChange, meta }) => {
+	if (!checkCondition(field.condition, meta)) {
+		return null;
+	}
+
 	const Component = FIELD_MAP[field.type];
 	if (!Component) return null; // repeater/upload/selector: TODO
 	return <PanelRow><Component field={field} value={value} onChange={onChange} /></PanelRow>;
diff --git a/src/editor-fields/Section.js b/src/editor-fields/Section.js
index 1cf29a6..08605f1 100644
--- a/src/editor-fields/Section.js
+++ b/src/editor-fields/Section.js
@@ -2,23 +2,23 @@
 import Fields from "./Fields";
 import { useEntityProp } from '@wordpress/core-data';
 
-const Section = ({id, name, isOpen = false}) => {
+const Section = ({id, name, fields, meta, setMeta, isOpen = false}) => {
 
-	const { content, fields, sections, base } = window.jvbFieldConfig || {};
-	const [meta, setMeta] = useEntityProp('postType', content, 'meta');
-
+	id = 'jvb-section-'+id;
 	const setField = (name, value) => setMeta({ ...meta, [name]: value });
+	console.log(fields, 'fields');
 	return (
-		<PanelBody name={'jvb-'+id} title={name} initialOpen={isOpen}>
+		<PanelBody name={id} title={name} initialOpen={isOpen}>
 			{
-				fields.map((field) => (
-					<Fields
+				fields.map((field) => {
+					return <Fields
 						key={field.name}
 						field={field}
 						value={meta?.[field.name]}
 						onChange={(value) => setField(field.name, value)}
-					/>
-				))
+						meta={meta}
+					/>;
+				})
 			}
 		</PanelBody>
 	);
diff --git a/src/editor-fields/SidePanel.js b/src/editor-fields/SidePanel.js
index a877ef5..8a4006d 100644
--- a/src/editor-fields/SidePanel.js
+++ b/src/editor-fields/SidePanel.js
@@ -2,7 +2,6 @@
 import { compose } from '@wordpress/compose';
 import { withSelect, withDispatch } from '@wordpress/data';
 import { PluginSidebar, PluginSidebarMoreMenuItem } from '@wordpress/editor';
-import { PanelBody, PanelRow, TextControl, DateTimePicker } from '@wordpress/components';
 import { useEntityProp } from '@wordpress/core-data';
 import Section from './Section';
 
@@ -12,16 +11,11 @@
 </svg>
 );
 const SidePanel = ( { postType, metaFields, setMetaFields } ) => {
-	const { content, fields, sections, base } = window.jvbFieldConfig || {};
-	const [meta, setMeta] = useEntityProp('postType', content, 'meta');
+	const { fields, sections } = window.jvbFieldConfig || {};
+
+	const [meta, setMeta] = useEntityProp('postType', postType, 'meta');
 
 	if (!fields || !fields.length) return null;
-
-	console.log(fields);
-	console.log(sections);
-
-
-
 	return (
 		<>
 			<PluginSidebarMoreMenuItem
@@ -36,17 +30,16 @@
 				title="Additional Fields"
 			>
 				{
-					Object.values(sections).map((section, index) => (
-
-						<Section
-							id={section.slug}
+					Object.values(sections).map((section, index) => {
+						return <Section
+							key={section.id}
 							name={section.title}
-							fields={filterFields({section, fields, base})}
+							fields={filterFields({section, fields})}
 							meta={meta}
 							setMeta={setMeta}
 							isOpen={testOpen(index)}
-						/>
-					))
+						/>;
+					})
 				}
 			</PluginSidebar>
 		</>
@@ -68,9 +61,8 @@
 	}
 } );
 
-const filterFields = ({section, fields, base}) => {
-	const sectionFields = section.fields.map(f => base+f);
-	return fields.filter(item => sectionFields.includes(item.name))
+const filterFields = ({section, fields}) => {
+	return fields.filter(item => section.fields.includes(item.name))
 };
 
 const testOpen = (index) => {
diff --git a/src/editor-fields/fields/checkbox-field.js b/src/editor-fields/fields/checkbox-field.js
index 83d0281..bf517ff 100644
--- a/src/editor-fields/fields/checkbox-field.js
+++ b/src/editor-fields/fields/checkbox-field.js
@@ -8,7 +8,7 @@
 	};
 
 	return (
-		<fieldset>
+		<fieldset id={field.name}>
 			<legend className="jvb-field-label">{field.label}</legend>
 			{Object.entries(field.options || {}).map(([key, label]) => (
 				<CheckboxControl
diff --git a/src/editor-fields/fields/date-field.js b/src/editor-fields/fields/date-field.js
index 3d377fe..4cf8860 100644
--- a/src/editor-fields/fields/date-field.js
+++ b/src/editor-fields/fields/date-field.js
@@ -4,7 +4,7 @@
 const DateField = ({field, value, onChange}) => {
 	const [ date, setDate ] = useState( new Date() );
 	return (
-		<div className="components-base-control">
+		<div className="components-base-control" id={field.name}>
 			<label className="components-base-control__label">
 				{ field.label }
 			</label>
diff --git a/src/editor-fields/fields/datetime-field.js b/src/editor-fields/fields/datetime-field.js
index 4bcf9c2..6493810 100644
--- a/src/editor-fields/fields/datetime-field.js
+++ b/src/editor-fields/fields/datetime-field.js
@@ -6,7 +6,7 @@
 	console.log(field);
 	return (
 
-		<div className="components-base-control">
+		<div className="components-base-control" id={field.name}>
 			<label className="components-base-control__label">
 				{ field.label }
 			</label>
diff --git a/src/editor-fields/fields/location-field.js b/src/editor-fields/fields/location-field.js
new file mode 100644
index 0000000..4cceea2
--- /dev/null
+++ b/src/editor-fields/fields/location-field.js
@@ -0,0 +1,84 @@
+import { useState } from '@wordpress/element';
+import { TextControl, Spinner, Button } from '@wordpress/components';
+import apiFetch from '@wordpress/api-fetch';
+import { useDebounce } from '@wordpress/compose';
+
+const LocationField = ({field, value, onChange }) => {
+	const address = value || {};
+
+	const [query, setQuery] = useState(address.address || '');
+	const [results, setResults] = useState([]);
+	const [loading, setLoading] = useState(false);
+
+	const search = useDebounce((search) => {
+		if (!search) return setResults([]);
+		setLoading(true);
+
+		apiFetch({path: `jvb/v1/geocode?q=${encodeURIComponent(search)}`})
+			.then(setResults)
+			.finally(()=>setLoading(false));
+
+	}, 400);
+
+	const onSelect = (result) => {
+		const a = result.address || {};
+
+		const newAddress = {
+			address: 	[a.house_number, a.road].filter(Boolean).join(' '),
+			city: 		a.city||a.town||a.village||'',
+			province:	a.state || '',
+			postal_code:a.postcode||'',
+			country:	a.country||'',
+			lat:		parseFloat(result.lat),
+			lng:		parseFloat(result.lng),
+		};
+		onChange(newAddress);
+		setQuery(newAddress.address);
+		setResults([]);
+	};
+
+	const onClear = () => {
+		onChange({});
+		setQuery('');
+		setResults([]);
+	}
+
+	return (
+		<div className="jvb-location-field" id={field.name}>
+			<TextControl
+				label={field.label}
+				value={query}
+				onChange={(newQuery) => {
+					setQuery(newQuery);
+					search(newQuery)
+				}}
+			/>
+			{loading && <Spinner />}
+			{!!results.length && (
+				<div className="jvb-location-results">
+					{results.map((result) => (
+
+						<Button
+							key={result.place_id}
+							variant="tertiary"
+							onClick={()=>onSelect(result)}
+							style={{display:'block', textAlign:'left'}}
+						>
+							{result.display_name}
+						</Button>
+					))}
+					{!!address.lat && (
+						<p className="jvb-location-summary">
+							{address.address}, {address.city}, {address.province}{' '}
+							{address.postal_code}, {address.country}
+							<br />
+							<Button variant="link" isDestructive onClick={onClear}>Clear</Button>
+						</p>
+					)}
+				</div>
+			)}
+		</div>
+	);
+};
+
+export default LocationField;
diff --git a/src/editor-fields/fields/repeater-field.js b/src/editor-fields/fields/repeater-field.js
index ec82ec2..227de72 100644
--- a/src/editor-fields/fields/repeater-field.js
+++ b/src/editor-fields/fields/repeater-field.js
@@ -14,7 +14,7 @@
 const emptyRow = (fields) =>
 	Object.fromEntries(Object.entries(fields || {}).map(([name, f]) => [name, f.default ?? '']));
 
-const RepeaterField = ({ field, value, onChange }) => {
+const RepeaterField = ({ field, value, onChange, meta }) => {
 	const rows = Array.isArray(value) ? value : [];
 	const subFields = field.fields || {};
 	const [openIndex, setOpenIndex] = useState(null);
@@ -28,7 +28,7 @@
 	const removeRow = (index) => onChange(rows.filter((_, i) => i !== index));
 
 	return (
-		<div className="jvb-repeater-field">
+		<div className="jvb-repeater-field" id={field.name}>
 			<p className="jvb-field-label">{field.label}</p>
 
 			<Panel>
@@ -45,6 +45,7 @@
 								field={{ ...subField, name }}
 								value={row[name]}
 								onChange={(val) => updateRow(index, name, val)}
+								meta={ meta }
 							/>
 						))}
 						<Button variant="link" isDestructive onClick={() => removeRow(index)}>
diff --git a/src/editor-fields/fields/select-field.js b/src/editor-fields/fields/select-field.js
index e3e3349..4b6634b 100644
--- a/src/editor-fields/fields/select-field.js
+++ b/src/editor-fields/fields/select-field.js
@@ -11,6 +11,7 @@
 				selected={value}
 				options={options}
 				onChange={onChange}
+				id={field.name}
 			/>
 		);
 	}
@@ -22,6 +23,7 @@
 			value={value ?? ''}
 			options={[{ label: '— Select —', value: '' }, ...options]}
 			onChange={onChange}
+			id={field.name}
 		/>
 	);
 };
diff --git a/src/editor-fields/fields/selector-field.js b/src/editor-fields/fields/selector-field.js
index 88d32ec..3e4cad2 100644
--- a/src/editor-fields/fields/selector-field.js
+++ b/src/editor-fields/fields/selector-field.js
@@ -17,16 +17,26 @@
 	return (search) => addQueryArgs('/wp/v2/search', { search, type: 'post', subtype: field.post_type, per_page: 20 });
 };
 
+const createPayload = (field, subtype, name) =>
+	subtype === 'post' ? { title: name, status: 'publish', postType: field.post_type } : { name };
+
 const labelOf = (item, subtype) => (subtype === 'user' ? item.name : item.title?.rendered ?? item.title ?? item.name);
 
 const SelectorField = ({ field, value, onChange }) => {
 	const subtype = resolveSubtype(field);
+	const canCreate = subtype === 'taxonomy';
+	console.log(field);
 	const buildPath = searchPath(field);
-	const ids = Array.isArray(value) ? value : value ? [value] : [];
+	const ids = Array.isArray(value) ? value : value ? value.split(',') : [];
 
 	const [tokens, setTokens] = useState([]);   // display strings
 	const [idByLabel, setIdByLabel] = useState({});
 	const [options, setOptions] = useState({}); // label -> id, from last search
+	const [search, setSearch] = useState('');
+	const [creating, setCreating] = useState(false);
+
+	const createLabel = search ? `Not found. Create "${search}"?` : null;
+
 
 	// Resolve current IDs to labels on mount / value change
 	useEffect(() => {
@@ -54,7 +64,9 @@
 	}, [JSON.stringify(ids)]);
 
 	const onInputChange = useCallback((search) => {
-		if (!search) return;
+		setSearch(search);
+		if (!search) { setOptions({}); return;}
+
 		apiFetch({ path: buildPath(search) })
 			.then((results) => {
 				const map = {};
@@ -64,13 +76,7 @@
 			.catch(() => {});
 	}, [buildPath, subtype]);
 
-	const onChangeTokens = (newTokens) => {
-		setTokens(newTokens);
-		const newIds = newTokens
-			.map((label) => idByLabel[label] ?? options[label])
-			.filter((id) => id !== undefined);
-		setIdByLabel((prev) => ({ ...prev, ...options }));
-
+	const commitIds = (newIds) => {
 		const isSingle = field.max === 1;
 		if (isSingle) {
 			onChange(newIds[newIds.length - 1] ?? 0);
@@ -79,15 +85,53 @@
 		}
 	};
 
+	const onChangeTokens = (newTokens) => {
+		const pendingCreate = newTokens.find((t) => t === createLabel);
+
+		if (pendingCreate && canCreate && !creating) {
+			setCreating(true);
+			apiFetch({ path: `/wp/v2/${field.taxonomy}`, method: 'POST', data: createPayload(field, subtype, search) })
+				.then((item) => {
+					const label = labelOf(item, subtype);
+					setIdByLabel((prev) => ({ ...prev, [label]: item.id }));
+					setTokens((prev) => {
+						const finalTokens = prev.filter((t) => t !== createLabel).concat(label);
+						const newIds = finalTokens.map((l) => idByLabel[l] ?? options[l] ?? (l === label ? item.id : undefined))
+							.filter((id) => id !== undefined);
+						commitIds(newIds);
+						return finalTokens;
+					});
+				})
+				.catch(() => {})
+				.finally(() => setCreating(false));
+			return;
+		}
+
+		const resolved = newTokens.filter(
+			(label) => idByLabel[label] !== undefined || options[label] !== undefined
+		);
+		const newIds = resolved.map((label) => idByLabel[label] ?? options[label]);
+		setTokens(resolved);
+		setIdByLabel((prev) => ({ ...prev, ...options }));
+		commitIds(newIds);
+	};
+
+	const noMatch = search && !Object.keys(options).some((l) => l.toLowerCase() === search.toLowerCase());
+	const suggestions = field.max === 1 && tokens.length
+		? []
+		: [...Object.keys(options), ...(canCreate && noMatch ? [createLabel] : [])];
+
+
 	return (
 		<FormTokenField
 			label={field.label}
 			help={field.description}
 			value={tokens}
-			suggestions={field.max === 1 && tokens.length ? [] : Object.keys(options)}
+			suggestions={suggestions}
 			onChange={onChangeTokens}
 			onInputChange={onInputChange}
 			maxLength={field.max || undefined}
+			id={field.name}
 			__experimentalExpandOnFocus
 		/>
 	);
diff --git a/src/editor-fields/fields/switch-field.js b/src/editor-fields/fields/switch-field.js
index 29111ee..bd0cd4b 100644
--- a/src/editor-fields/fields/switch-field.js
+++ b/src/editor-fields/fields/switch-field.js
@@ -1,7 +1,7 @@
 import { ToggleControl } from '@wordpress/components';
 
 const SwitchField = ({ field, value, onChange }) => (
-	<ToggleControl label={field.label} help={field.description} checked={!!value} onChange={onChange} />
+	<ToggleControl label={field.label} help={field.description} checked={!!value} onChange={onChange}  id={field.name} />
 );
 
 export default SwitchField;
diff --git a/src/editor-fields/fields/text-field.js b/src/editor-fields/fields/text-field.js
index e2a8f0a..dc85801 100644
--- a/src/editor-fields/fields/text-field.js
+++ b/src/editor-fields/fields/text-field.js
@@ -10,6 +10,7 @@
 				help={field.description}
 				value={value ?? ''}
 				onChange={onChange}
+				id={field.name}
 			/>
 		);
 	}
@@ -22,6 +23,7 @@
 			value={value ?? ''}
 			onChange={onChange}
 			required={field.required}
+			id={field.name}
 		/>
 	);
 };
diff --git a/src/editor-fields/fields/time-field.js b/src/editor-fields/fields/time-field.js
index 2a9f529..719c543 100644
--- a/src/editor-fields/fields/time-field.js
+++ b/src/editor-fields/fields/time-field.js
@@ -11,15 +11,10 @@
 			help={ field.description }
 			value={value??''}
 			is12Hour={ true }
+			id={field.name}
 		/>
 	);
 };
 
-const getDescription = (field) => {
-	if (!field.description || field.description.length === 0) return;
-	return (
-		<p className="hint">{field.description}</p>
-	)
-};
 
 export default TimeField;
diff --git a/src/editor-fields/fields/upload-field.js b/src/editor-fields/fields/upload-field.js
index 65189fa..edb5939 100644
--- a/src/editor-fields/fields/upload-field.js
+++ b/src/editor-fields/fields/upload-field.js
@@ -1,5 +1,6 @@
 import { useState, useEffect } from '@wordpress/element';
-import { MediaUpload, MediaUploadCheck } from '@wordpress/media-utils';
+import { MediaUpload } from '@wordpress/media-utils';
+import {MediaUploadCheck} from '@wordpress/block-editor';
 import { Button } from '@wordpress/components';
 import apiFetch from '@wordpress/api-fetch';
 
@@ -39,7 +40,7 @@
 const UploadField = ({ field, value, onChange }) => {
 	const multiple = field.multiple || field.type === 'gallery';
 	const ids = multiple ? (Array.isArray(value) ? value : []) : value;
-	const allowedTypes = SUBTYPE_MAP[field.subtype] ? [SUBTYPE_MAP[field.subtype]] : undefined;
+	const allowedTypes = SUBTYPE_MAP[field.subtype] ? [SUBTYPE_MAP[field.subtype]] : '';
 
 	const onSelect = (media) => onChange(multiple ? media.map((m) => m.id) : media.id);
 
@@ -48,7 +49,7 @@
 	};
 
 	return (
-		<div className="jvb-upload-field">
+		<div className="jvb-upload-field" id={field.name}>
 			<p className="jvb-field-label">{field.label}</p>
 
 			<div className={multiple ? 'jvb-upload-grid' : 'jvb-upload-single'}>
diff --git a/src/editor-fields/index.js b/src/editor-fields/index.js
index 13eff99..3aba262 100644
--- a/src/editor-fields/index.js
+++ b/src/editor-fields/index.js
@@ -3,20 +3,6 @@
 import SidePanel from './SidePanel';
 
 
-import Fields from './Fields';
-
-const CustomFieldsPanel = () => {
-
-
-	if (!fields || !fields.length) {
-		return null;
-	}
-
-	const setField = (name, value) => setMeta({ ...meta, [name]: value });
-
-
-};
-
 registerPlugin('jvb-meta-fields', {
 	render: SidePanel
 });

--
Gitblit v1.10.0