Jake Vanderwerf
2026-09-09 8318f60480aedd4aa1e64dc35468247dfbba9316
=Simplified event fields a bit, removed the recurrence for now to get Northeh done. Scaffolded a basic block to select a specific field to render anywhere.
4 files deleted
2 files added
18 files modified
1327 ■■■■■ changed files
build/_meta/fields.asset.php 2 ●●●●● patch | view | raw | blame | history
build/_meta/fields.js 2 ●●●●● patch | view | raw | blame | history
build/meta/block.json 6 ●●●●● patch | view | raw | blame | history
build/meta/index-rtl.css 1 ●●●●● patch | view | raw | blame | history
build/meta/index.asset.php 2 ●●●●● patch | view | raw | blame | history
build/meta/index.css 1 ●●●●● patch | view | raw | blame | history
build/meta/index.js 2 ●●●●● patch | view | raw | blame | history
build/meta/style-index-rtl.css 1 ●●●●● patch | view | raw | blame | history
build/meta/style-index.css 1 ●●●●● patch | view | raw | blame | history
inc/meta/Sanitizer.php 5 ●●●●● patch | view | raw | blame | history
inc/registrar/helpers/AddCustomFields.php 27 ●●●●● patch | view | raw | blame | history
inc/registrar/helpers/MakeCalendarType.php 207 ●●●●● patch | view | raw | blame | history
package-lock.json 892 ●●●●● patch | view | raw | blame | history
package.json 3 ●●●●● patch | view | raw | blame | history
src/_meta/Fields.js 4 ●●●●● patch | view | raw | blame | history
src/_meta/SidePanel.js 1 ●●●●● patch | view | raw | blame | history
src/_meta/fields/date-field.js 12 ●●●●● patch | view | raw | blame | history
src/_meta/fields/group-field.js 31 ●●●●● patch | view | raw | blame | history
src/_meta/fields/repeater-field.css 3 ●●●●● patch | view | raw | blame | history
src/_meta/fields/repeater-field.js 1 ●●●●● patch | view | raw | blame | history
src/_meta/fields/selector-field.js 6 ●●●●● patch | view | raw | blame | history
src/meta/block.json 3 ●●●●● patch | view | raw | blame | history
src/meta/edit.js 83 ●●●●● patch | view | raw | blame | history
src/meta/index.js 31 ●●●●● patch | view | raw | blame | history
build/_meta/fields.asset.php
@@ -1 +1 @@
<?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' => '6043ce2edcd946554582');
<?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' => 'b289cda300edfd519494');
build/_meta/fields.js
@@ -1 +1 @@
(()=>{"use strict";const e={n:t=>{const l=t&&t.__esModule?()=>t.default:()=>t;return e.d(l,{a:l}),l},d:(t,l)=>{for(var a in l)e.o(l,a)&&!e.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:l[a]})},o:(e,t)=>Object.hasOwn(e,t)},t=window.wp.plugins,l=(window.wp.i18n,window.wp.compose),a=window.wp.data,n=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:t,onChange:l})=>"textarea"===e.type?(0,o.jsx)(s.TextareaControl,{label:e.label,help:e.description,value:t??"",onChange:l,id:e.name}):(0,o.jsx)(s.TextControl,{label:e.label,help:e.description,type:r[e.type]||"text",value:t??"",onChange:l,required:e.required,id:e.name}),c=({field:e,value:t,onChange:l})=>{const a=Object.entries(e.options||{}).map(([e,t])=>({label:t,value:e}));return"radio"===e.type?(0,o.jsx)(s.RadioControl,{label:e.label,help:e.description,selected:t,options:a,onChange:l,id:e.name}):(0,o.jsx)(s.SelectControl,{label:e.label,help:e.description,value:t??"",options:[{label:"— Select —",value:""},...a],onChange:l,id:e.name})},u=({field:e,value:t,onChange:l})=>{const a=Array.isArray(t)?t:[];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,t])=>(0,o.jsx)(s.CheckboxControl,{label:t,checked:a.includes(e),onChange:t=>((e,t)=>{l(t?[...a,e]:a.filter(t=>t!==e))})(e,t)},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,t,l)=>e?.includes("{{")?e.replace(/{{(.*?)}}/g,(e,l)=>{const a=t[l];return void 0===a?"":Array.isArray(a)?a.join(", "):String(a)}):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:t})=>{const[l,a]=(0,v.useState)(null);(0,v.useEffect)(()=>{let t=!1;if(e)return f()({path:`/wp/v2/media/${e}`}).then(e=>!t&&a(e)).catch(()=>{}),()=>{t=!0}},[e]);const n=l?.media_details?.sizes?.thumbnail?.source_url||l?.source_url,i="image"===l?.media_type;return(0,o.jsxs)("div",{className:"jvb-upload-thumb",children:[i&&n?(0,o.jsx)("img",{src:n,alt:l?.alt_text||""}):(0,o.jsx)("div",{className:"jvb-upload-thumb-placeholder",children:l?.title?.rendered||`#${e}`}),(0,o.jsx)(s.Button,{variant:"link",isDestructive:!0,onClick:()=>t(e),children:"Remove"})]})},C=window.wp.url,_=e=>e.subtype||e.type,k=(e,t,l)=>"post"===t?{title:l,status:"publish",postType:e.post_type}:{name:l},S=(e,t)=>"user"===t?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:t,onChange:l})=>(0,o.jsx)(s.ToggleControl,{label:e.label,help:e.description,checked:!!t,onChange:l,id:e.name}),date:({field:e,value:t,onChange:l})=>{const[a,n]=(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:a,onChange:l,help:e.description,value:t??""}),m(e)]})},time:({field:e,value:t,onChange:l})=>(0,o.jsx)(s.BaseControl,{label:e.label,help:e.description,id:e.name,children:(0,o.jsx)("input",{type:"time",id:e.name,value:t??"",onChange:e=>l(e.target.value)})}),datetime:({field:e,value:t,onChange:l})=>{const[a,n]=(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.DateTimePicker,{currentDate:a,onChange:l,label:e.label,help:e.description,value:t??"",is12Hour:!0}),h(e)]})},repeater:({field:e,value:t,onChange:l,meta:a})=>{const n=Array.isArray(t)?t:[],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:n.map((t,c)=>(0,o.jsxs)(s.PanelBody,{title:b(e.row_label,t)||`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:t[e],onChange:t=>((e,t,a)=>{const i=n.map((l,n)=>n===e?{...l,[t]:a}:l);l(i)})(c,e,t),meta:a},e)),(0,o.jsx)(s.Button,{variant:"link",isDestructive:!0,onClick:()=>(e=>l(n.filter((t,l)=>l!==e)))(c),children:"Remove"})]},c))}),(0,o.jsx)(s.Button,{variant:"secondary",onClick:()=>{return l([...n,(e=i,Object.fromEntries(Object.entries(e||{}).map(([e,t])=>[e,t.default??""])))]);var e},children:e.add_label||"Add Row"})]})},upload:({field:e,value:t,onChange:l})=>{const a=e.multiple||"gallery"===e.type,n=a?Array.isArray(t)?t:[]:t,i=w[e.subtype]?[w[e.subtype]]:"",r=e=>{l(a?n.filter(t=>t!==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:a?"jvb-upload-grid":"jvb-upload-single",children:a?n.map(e=>(0,o.jsx)(y,{id:e,onRemove:r},e)):!!n&&(0,o.jsx)(y,{id:n,onRemove:r})}),(0,o.jsx)(x.MediaUploadCheck,{children:(0,o.jsx)(j.MediaUpload,{onSelect:e=>l(a?e.map(e=>e.id):e.id),allowedTypes:i,multiple:a,value:a?n:n||void 0,render:({open:t})=>(0,o.jsxs)(s.Button,{variant:"secondary",onClick:t,children:[(a?n.length:n)?"Change":"Select"," ",e.label]})})})]})},selector:({field:e,value:t,onChange:l})=>{const a=_(e),n="taxonomy"===a,i=(e=>{const t=_(e);return"user"===t?e=>(0,C.addQueryArgs)("/wp/v2/users",{search:e,per_page:20}):"taxonomy"===t?t=>(0,C.addQueryArgs)(`/wp/v2/${e.taxonomy}`,{search:t,per_page:20}):t=>(0,C.addQueryArgs)("/wp/v2/search",{search:t,type:"post",subtype:e.post_type,per_page:20})})(e),r=Array.isArray(t)?t:t?t.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(t=>{if(e)return;const l={},n=[];t.flat().forEach(e=>{const t=S(e,a);l[t]=e.id,n.push(t)}),p(e=>({...e,...l})),c(n)}).catch(()=>{}),()=>{e=!0};c([])},[JSON.stringify(r)]);const y=(0,v.useCallback)(e=>{j(e),e?f()({path:i(e)}).then(e=>{const t={};e.forEach(e=>{t[S(e,a)]=e.id}),h(t)}).catch(()=>{}):h({})},[i,a]),A=t=>{const a=1===e.max;l(a?t[t.length-1]??0:e.max?t.slice(0,e.max):t)},N=b&&!Object.keys(m).some(e=>e.toLowerCase()===b.toLowerCase()),O=1===e.max&&d.length?[]:[...Object.keys(m),...n&&N?[w]:[]];return(0,o.jsx)(s.FormTokenField,{label:e.label,help:e.description,value:d,suggestions:O,onChange:t=>{if(t.find(e=>e===w)&&n&&!x)return g(!0),void f()({path:`/wp/v2/${e.taxonomy}`,method:"POST",data:k(a,b)}).then(e=>{const t=S(e,a),l=d.filter(e=>e!==w).concat(t),n=l.map(l=>u[l]??m[l]??(l===t?e.id:void 0)).filter(e=>void 0!==e);p(l=>({...l,[t]:e.id})),c(l),A(n)}).catch(()=>{}).finally(()=>g(!1));const l=t.filter(e=>void 0!==u[e]||void 0!==m[e]),i=l.map(e=>u[e]??m[e]);c(l),p(e=>({...e,...m})),A(i)},onInputChange:y,maxLength:e.max||void 0,id:e.name,__experimentalExpandOnFocus:!0})},location:({field:e,value:t,onChange:a})=>{const n=t||{},[i,r]=(0,v.useState)(n.address||""),[d,c]=(0,v.useState)([]),[u,p]=(0,v.useState)(!1),m=(0,l.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 t=e.address||{},l={address:[t.house_number,t.road].filter(Boolean).join(" "),city:t.city||t.town||t.village||"",province:t.state||"",postal_code:t.postcode||"",country:t.country||"",lat:parseFloat(e.lat),lng:parseFloat(e.lng)};a(l),r(l.address),c([])})(e),style:{display:"block",textAlign:"left"},children:e.display_name},e.place_id)),!!n.lat&&(0,o.jsxs)("p",{className:"jvb-location-summary",children:[n.address,", ",n.city,", ",n.province," ",n.postal_code,", ",n.country,(0,o.jsx)("br",{}),(0,o.jsx)(s.Button,{variant:"link",isDestructive:!0,onClick:()=>{a({}),r(""),c([])},children:"Clear"})]})]})]})}},N={"=":(e,t)=>e==t,"==":(e,t)=>e==t,"!=":(e,t)=>e!=t,">":(e,t)=>e>t,"<":(e,t)=>e<t,in:(e,t)=>Array.isArray(t)?t.includes(e):String(t).split(",").includes(e)},O=({id:e,field:t,value:l,onChange:a,meta:n})=>{if(!((e,t)=>!e?.field||(N[e.operator]||N["="])(t?.[e.field],e.value))(t.condition,n))return null;const i=A[t.type];return i?(0,o.jsx)(s.PanelRow,{children:(0,o.jsx)(i,{field:t,value:l,onChange:a})}):null},R=({id:e,name:t,fields:l,meta:a,setMeta:n,isOpen:i=!1})=>(e="jvb-section-"+e,(0,o.jsx)(s.PanelBody,{name:e,title:t,initialOpen:i,children:l.map(e=>(0,o.jsx)(O,{field:e,value:a?.[e.name],onChange:t=>((e,t)=>n({...a,[e]:t}))(e.name,t),meta:a},e.name))})),P=()=>(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"})}),F=(0,a.withSelect)(e=>({metaFields:e("core/editor").getEditedPostAttribute("meta"),postType:e("core/editor").getCurrentPostType()})),T=(0,a.withDispatch)(e=>({setMetaFields(t){e("core/editor").editPost({meta:t})}})),D=({section:e,fields:t})=>t.filter(t=>e.fields.includes(t.name)),z=e=>0===e,B=(0,l.compose)([F,T])(({postType:e,metaFields:t,setMetaFields:l})=>{const{fields:a,sections:s}=window.jvbFieldConfig||{},[r,d]=(0,i.useEntityProp)("postType",e,"meta");return a&&a.length?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.PluginSidebarMoreMenuItem,{target:"jvb-meta-fields",icon:(0,o.jsx)(P,{}),children:"Additional Fields"}),(0,o.jsx)(n.PluginSidebar,{name:"jvb-meta-fields",icon:(0,o.jsx)(P,{}),title:"Additional Fields",children:Object.values(s).map((e,t)=>(0,o.jsx)(R,{name:e.title,fields:D({section:e,fields:a}),meta:r,setMeta:d,isOpen:z(t)},e.id))})]}):null});(0,t.registerPlugin)("jvb-meta-fields",{render:B})})();
(()=>{"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})},p=({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))]})},u=window.React,m=e=>{if(!e)return null;const[l,t,n]=e.split("-").map(Number);return new Date(l,t-1,n)},h=e=>{if(e.description&&0!==e.description.length)return(0,o.jsx)("p",{className:"hint",children:e.description})},v=e=>{if(e.description&&0!==e.description.length)return(0,o.jsx)("p",{className:"hint",children:e.description})},b=window.wp.element,j=(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,x=window.wp.mediaUtils,g=window.wp.blockEditor,f=window.wp.apiFetch;var w=e.n(f);const y={image:"image",video:"video",document:"application",all:""},C=({id:e,onRemove:l})=>{const[t,n]=(0,b.useState)(null);(0,b.useEffect)(()=>{let l=!1;if(e)return w()({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"})]})},_=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},N=(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:p,set:p,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})=>(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:m(l),onChange:t,help:e.description}),h(e)]}),time:({field:e,value:l,onChange:t})=>(0,o.jsx)(s.BaseControl,{label:e.label,help:e.description,id:e.name,children:(0,o.jsx)("input",{type:"time",id:e.name,value:l??"",onChange:e=>t(e.target.value)})}),datetime:({field:e,value:l,onChange:t})=>{const[n,a]=(0,u.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.DateTimePicker,{currentDate:n,onChange:t,label:e.label,help:e.description,value:l??"",is12Hour:!0}),v(e)]})},repeater:({field:e,value:l,onChange:t,meta:n})=>{const a=Array.isArray(l)?l:[],i=e.fields||{},[r,d]=(0,b.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:j(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)(R,{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=y[e.subtype]?[y[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)(C,{id:e,onRemove:r},e)):!!a&&(0,o.jsx)(C,{id:a,onRemove:r})}),(0,o.jsx)(g.MediaUploadCheck,{children:(0,o.jsx)(x.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,i=(e=>{const l=k(e);return"user"===l?e=>(0,_.addQueryArgs)("/wp/v2/users",{search:e,per_page:20}):"taxonomy"===l?l=>(0,_.addQueryArgs)(`/wp/v2/${e.taxonomy}`,{search:l,per_page:20,hide_empty:!1}):l=>(0,_.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,b.useState)([]),[p,u]=(0,b.useState)({}),[m,h]=(0,b.useState)({}),[v,j]=(0,b.useState)(""),[x,g]=(0,b.useState)(!1),f=v?`Not found. Create "${v}"?`:null;(0,b.useEffect)(()=>{y("");let e=!1;if(r.length)return Promise.all(r.map(e=>w()({path:i("")+`&include=${e}`}))).then(l=>{if(e)return;const t={},a=[];l.flat().forEach(e=>{const l=N(e,n);t[l]=e.id,a.push(l)}),u(e=>({...e,...t})),c(a)}).catch(()=>{}),()=>{e=!0};c([])},[JSON.stringify(r)]);const y=(0,b.useCallback)(e=>{j(e),w()({path:i(e)}).then(e=>{const l={};e.forEach(e=>{l[N(e,n)]=e.id}),h(l)}).catch(()=>{})},[i,n]),C=l=>{const n=1===e.max;t(n?l[l.length-1]??0:(e.max?l.slice(0,e.max):l).join(","))},A=v&&!Object.keys(m).some(e=>e.toLowerCase()===v.toLowerCase()),O=1===e.max&&d.length?[]:[...Object.keys(m),...a&&A?[f]:[]];return(0,o.jsx)(s.FormTokenField,{label:e.label,help:e.description,value:d,suggestions:O,onChange:l=>{if(l.find(e=>e===f)&&a&&!x)return g(!0),void w()({path:`/wp/v2/${e.taxonomy}`,method:"POST",data:S(n,v)}).then(e=>{const l=N(e,n),t=d.filter(e=>e!==f).concat(l),a=t.map(t=>p[t]??m[t]??(t===l?e.id:void 0)).filter(e=>void 0!==e);u(t=>({...t,[l]:e.id})),c(t),C(a)}).catch(()=>{}).finally(()=>g(!1));const t=l.filter(e=>void 0!==p[e]||void 0!==m[e]),i=t.map(e=>p[e]??m[e]);c(t),u(e=>({...e,...m})),C(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,b.useState)(a.address||""),[d,c]=(0,b.useState)([]),[p,u]=(0,b.useState)(!1),m=(0,t.useDebounce)(e=>{if(!e)return c([]);u(!0),w()({path:`jvb/v1/geocode?q=${encodeURIComponent(e)}`}).then(c).finally(()=>u(!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)}}),p&&(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"})]})]})]})},group:({field:e,value:l,onChange:t})=>{const n=l||{};return(0,o.jsxs)("div",{className:"jvb-group-field",id:e.name,children:[e.label&&(0,o.jsx)("h4",{className:"components-base-control__label",children:e.label}),Object.entries(e.fields||{}).map(([e,l])=>(0,o.jsx)(R,{field:{...l,name:e},value:n[e],onChange:l=>((e,l)=>{t({...n,[e]:l})})(e,l),meta:n},e)),e.description&&(0,o.jsx)("p",{className:"hint",children:e.description})]})}},O={"=":(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)},R=({id:e,field:l,value:t,onChange:n,meta:a})=>{if(!((e,l)=>!e?.field||(O[e.operator]||O["="])(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,(0,o.jsx)(s.PanelBody,{name:e,title:l,initialOpen:i,children:t.map(e=>(0,o.jsx)(R,{field:e,value:n?.[e.name],onChange:l=>((e,l)=>a({...n,[e]:l}))(e.name,l),meta:n},e.name))})),F=()=>(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()})),D=(0,n.withDispatch)(e=>({setMetaFields(l){e("core/editor").editPost({meta:l})}})),z=({section:e,fields:l})=>l.filter(l=>e.fields.includes(l.name)),B=e=>0===e,L=(0,t.compose)([T,D])(({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)(F,{}),children:"Additional Fields"}),(0,o.jsx)(a.PluginSidebar,{name:"jvb-meta-fields",icon:(0,o.jsx)(F,{}),title:"Additional Fields",children:Object.values(s).map((e,l)=>(0,o.jsx)(P,{name:e.title,fields:z({section:e,fields:n}),meta:r,setMeta:d,isOpen:B(l)},e.id))})]}):null});(0,l.registerPlugin)("jvb-meta-fields",{render:L})})();
build/meta/block.json
@@ -8,6 +8,12 @@
  "icon": "edit-large",
  "description": "Add a specific field from this content",
  "example": {},
  "attributes": {
    "fieldName": {
      "type": "string",
      "default": ""
    }
  },
  "supports": {
    "align": [
      "wide",
build/meta/index-rtl.css
File was deleted
build/meta/index.asset.php
@@ -1 +1 @@
<?php return array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-i18n'), 'version' => '6cfb5d257a0c1c7f9d85');
<?php return array('dependencies' => array('react', 'react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-media-utils', 'wp-url'), 'version' => '4fc77565e544173d57f5');
build/meta/index.css
File was deleted
build/meta/index.js
@@ -1 +1 @@
(()=>{"use strict";var t={796(){const t=window.wp.blocks,o=window.wp.i18n,e=window.wp.blockEditor,n=window.ReactJSXRuntime;(0,t.registerBlockType)("jvb/meta",{edit:function(){return(0,n.jsx)("p",{...(0,e.useBlockProps)(),children:(0,o.__)("Will output the menu","jvb")})}})}};const o={};function e(n){const r=o[n];if(void 0!==r)return r.exports;const i=o[n]={exports:{}};return t[n](i,i.exports,e),i.exports}e.m=t,(()=>{const t=[];e.O=(o,n,r,i)=>{if(n){i||=0;for(var s=t.length;s>0&&t[s-1][2]>i;s--)t[s]=t[s-1];return void(t[s]=[n,r,i])}let c=1/0;for(s=0;s<t.length;s++){let[n,r,i]=t[s],u=!0;for(var l=0;l<n.length;l++)1&i&&!(c>=i)||!Object.keys(e.O).every(t=>e.O[t](n[l]))?(u=!1,i<c&&(c=i)):n.splice(l--,1);if(u){t.splice(s--,1);const e=r();void 0!==e&&(o=e)}}return o}})(),e.o=(t,o)=>Object.hasOwn(t,o),(()=>{const t={105:0,933:0};e.O.j=o=>0===t[o];const o=(o,n)=>{let[r,i,s]=n;var c,l,u=0;if(r.some(o=>0!==t[o])){for(c in i)e.o(i,c)&&(e.m[c]=i[c]);if(s)var p=s(e)}for(o&&o(n);u<r.length;u++)l=r[u],e.o(t,l)&&t[l]&&t[l][0](),t[l]=0;return e.O(p)},n=globalThis.webpackChunkjvb||=[];n.forEach(o.bind(null,0)),n.push=o.bind(null,n.push.bind(n))})();let n=e.O(void 0,[933],()=>e(796));n=e.O(n)})();
(()=>{"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 a in t)e.o(t,a)&&!e.o(l,a)&&Object.defineProperty(l,a,{enumerable:!0,get:t[a]})},o:(e,l)=>Object.hasOwn(e,l)},l=window.wp.blocks,t=window.wp.blockEditor,a=window.wp.components,n=window.wp.coreData,i=window.wp.data,s=window.ReactJSXRuntime,o={text:"text",email:"email",tel:"tel",url:"url",number:"number"},r=({field:e,value:l,onChange:t})=>"textarea"===e.type?(0,s.jsx)(a.TextareaControl,{label:e.label,help:e.description,value:l??"",onChange:t,id:e.name}):(0,s.jsx)(a.TextControl,{label:e.label,help:e.description,type:o[e.type]||"text",value:l??"",onChange:t,required:e.required,id:e.name}),d=({field:e,value:l,onChange:t})=>{const n=Object.entries(e.options||{}).map(([e,l])=>({label:l,value:e}));return"radio"===e.type?(0,s.jsx)(a.RadioControl,{label:e.label,help:e.description,selected:l,options:n,onChange:t,id:e.name}):(0,s.jsx)(a.SelectControl,{label:e.label,help:e.description,value:l??"",options:[{label:"— Select —",value:""},...n],onChange:t,id:e.name})},c=({field:e,value:l,onChange:t})=>{const n=Array.isArray(l)?l:[];return(0,s.jsxs)("fieldset",{id:e.name,children:[(0,s.jsx)("legend",{className:"jvb-field-label",children:e.label}),Object.entries(e.options||{}).map(([e,l])=>(0,s.jsx)(a.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,u=e=>{if(!e)return null;const[l,t,a]=e.split("-").map(Number);return new Date(l,t-1,a)},m=e=>{if(e.description&&0!==e.description.length)return(0,s.jsx)("p",{className:"hint",children:e.description})},h=e=>{if(e.description&&0!==e.description.length)return(0,s.jsx)("p",{className:"hint",children:e.description})},b=window.wp.element,v=(e,l,t)=>e?.includes("{{")?e.replace(/{{(.*?)}}/g,(e,t)=>{const a=l[t];return void 0===a?"":Array.isArray(a)?a.join(", "):String(a)}):e,j=window.wp.mediaUtils,x=window.wp.apiFetch;var f=e.n(x);const g={image:"image",video:"video",document:"application",all:""},y=({id:e,onRemove:l})=>{const[t,n]=(0,b.useState)(null);(0,b.useEffect)(()=>{let l=!1;if(e)return f()({path:`/wp/v2/media/${e}`}).then(e=>!l&&n(e)).catch(()=>{}),()=>{l=!0}},[e]);const i=t?.media_details?.sizes?.thumbnail?.source_url||t?.source_url,o="image"===t?.media_type;return(0,s.jsxs)("div",{className:"jvb-upload-thumb",children:[o&&i?(0,s.jsx)("img",{src:i,alt:t?.alt_text||""}):(0,s.jsx)("div",{className:"jvb-upload-thumb-placeholder",children:t?.title?.rendered||`#${e}`}),(0,s.jsx)(a.Button,{variant:"link",isDestructive:!0,onClick:()=>l(e),children:"Remove"})]})},C=window.wp.url,w=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,k=window.wp.compose,N={text:r,email:r,tel:r,url:r,number:r,textarea:r,select:d,radio:d,checkbox:c,set:c,true_false:({field:e,value:l,onChange:t})=>(0,s.jsx)(a.ToggleControl,{label:e.label,help:e.description,checked:!!l,onChange:t,id:e.name}),date:({field:e,value:l,onChange:t})=>(0,s.jsxs)("div",{className:"components-base-control",id:e.name,children:[(0,s.jsx)("label",{className:"components-base-control__label",children:e.label}),(0,s.jsx)(a.DatePicker,{currentDate:u(l),onChange:t,help:e.description}),m(e)]}),time:({field:e,value:l,onChange:t})=>(0,s.jsx)(a.BaseControl,{label:e.label,help:e.description,id:e.name,children:(0,s.jsx)("input",{type:"time",id:e.name,value:l??"",onChange:e=>t(e.target.value)})}),datetime:({field:e,value:l,onChange:t})=>{const[n,i]=(0,p.useState)(new Date);return(0,s.jsxs)("div",{className:"components-base-control",id:e.name,children:[(0,s.jsx)("label",{className:"components-base-control__label",children:e.label}),(0,s.jsx)(a.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 i=Array.isArray(l)?l:[],o=e.fields||{},[r,d]=(0,b.useState)(null);return(0,s.jsxs)("div",{className:"jvb-repeater-field",id:e.name,children:[(0,s.jsx)("p",{className:"jvb-field-label",children:e.label}),(0,s.jsx)(a.Panel,{children:i.map((l,c)=>(0,s.jsxs)(a.PanelBody,{title:v(e.row_label,l)||`Row ${c+1}`,initialOpen:r===c,onToggle:()=>d(r===c?null:c),children:[Object.entries(o).map(([e,a])=>(0,s.jsx)(O,{field:{...a,name:e},value:l[e],onChange:l=>((e,l,a)=>{const n=i.map((t,n)=>n===e?{...t,[l]:a}:t);t(n)})(c,e,l),meta:n},e)),(0,s.jsx)(a.Button,{variant:"link",isDestructive:!0,onClick:()=>(e=>t(i.filter((l,t)=>t!==e)))(c),children:"Remove"})]},c))}),(0,s.jsx)(a.Button,{variant:"secondary",onClick:()=>{return t([...i,(e=o,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:n})=>{const i=e.multiple||"gallery"===e.type,o=i?Array.isArray(l)?l:[]:l,r=g[e.subtype]?[g[e.subtype]]:"",d=e=>{n(i?o.filter(l=>l!==e):0)};return(0,s.jsxs)("div",{className:"jvb-upload-field",id:e.name,children:[(0,s.jsx)("p",{className:"jvb-field-label",children:e.label}),(0,s.jsx)("div",{className:i?"jvb-upload-grid":"jvb-upload-single",children:i?o.map(e=>(0,s.jsx)(y,{id:e,onRemove:d},e)):!!o&&(0,s.jsx)(y,{id:o,onRemove:d})}),(0,s.jsx)(t.MediaUploadCheck,{children:(0,s.jsx)(j.MediaUpload,{onSelect:e=>n(i?e.map(e=>e.id):e.id),allowedTypes:r,multiple:i,value:i?o:o||void 0,render:({open:l})=>(0,s.jsxs)(a.Button,{variant:"secondary",onClick:l,children:[(i?o.length:o)?"Change":"Select"," ",e.label]})})})]})},selector:({field:e,value:l,onChange:t})=>{const n=w(e),i="taxonomy"===n,o=(e=>{const l=w(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,hide_empty:!1}):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,b.useState)([]),[p,u]=(0,b.useState)({}),[m,h]=(0,b.useState)({}),[v,j]=(0,b.useState)(""),[x,g]=(0,b.useState)(!1),y=v?`Not found. Create "${v}"?`:null;(0,b.useEffect)(()=>{k("");let e=!1;if(r.length)return Promise.all(r.map(e=>f()({path:o("")+`&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)}),u(e=>({...e,...t})),c(a)}).catch(()=>{}),()=>{e=!0};c([])},[JSON.stringify(r)]);const k=(0,b.useCallback)(e=>{j(e),f()({path:o(e)}).then(e=>{const l={};e.forEach(e=>{l[_(e,n)]=e.id}),h(l)}).catch(()=>{})},[o,n]),N=l=>{const a=1===e.max;t(a?l[l.length-1]??0:(e.max?l.slice(0,e.max):l).join(","))},A=v&&!Object.keys(m).some(e=>e.toLowerCase()===v.toLowerCase()),O=1===e.max&&d.length?[]:[...Object.keys(m),...i&&A?[y]:[]];return(0,s.jsx)(a.FormTokenField,{label:e.label,help:e.description,value:d,suggestions:O,onChange:l=>{if(l.find(e=>e===y)&&i&&!x)return g(!0),void f()({path:`/wp/v2/${e.taxonomy}`,method:"POST",data:S(n,v)}).then(e=>{const l=_(e,n),t=d.filter(e=>e!==y).concat(l),a=t.map(t=>p[t]??m[t]??(t===l?e.id:void 0)).filter(e=>void 0!==e);u(t=>({...t,[l]:e.id})),c(t),N(a)}).catch(()=>{}).finally(()=>g(!1));const t=l.filter(e=>void 0!==p[e]||void 0!==m[e]),a=t.map(e=>p[e]??m[e]);c(t),u(e=>({...e,...m})),N(a)},onInputChange:k,maxLength:e.max||void 0,id:e.name,__experimentalExpandOnFocus:!0})},location:({field:e,value:l,onChange:t})=>{const n=l||{},[i,o]=(0,b.useState)(n.address||""),[r,d]=(0,b.useState)([]),[c,p]=(0,b.useState)(!1),u=(0,k.useDebounce)(e=>{if(!e)return d([]);p(!0),f()({path:`jvb/v1/geocode?q=${encodeURIComponent(e)}`}).then(d).finally(()=>p(!1))},400);return(0,s.jsxs)("div",{className:"jvb-location-field",id:e.name,children:[(0,s.jsx)(a.TextControl,{label:e.label,value:i,onChange:e=>{o(e),u(e)}}),c&&(0,s.jsx)(a.Spinner,{}),!!r.length&&(0,s.jsxs)("div",{className:"jvb-location-results",children:[r.map(e=>(0,s.jsx)(a.Button,{variant:"tertiary",onClick:()=>(e=>{const l=e.address||{},a={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)};t(a),o(a.address),d([])})(e),style:{display:"block",textAlign:"left"},children:e.display_name},e.place_id)),!!n.lat&&(0,s.jsxs)("p",{className:"jvb-location-summary",children:[n.address,", ",n.city,", ",n.province," ",n.postal_code,", ",n.country,(0,s.jsx)("br",{}),(0,s.jsx)(a.Button,{variant:"link",isDestructive:!0,onClick:()=>{t({}),o(""),d([])},children:"Clear"})]})]})]})},group:({field:e,value:l,onChange:t})=>{const a=l||{};return(0,s.jsxs)("div",{className:"jvb-group-field",id:e.name,children:[e.label&&(0,s.jsx)("h4",{className:"components-base-control__label",children:e.label}),Object.entries(e.fields||{}).map(([e,l])=>(0,s.jsx)(O,{field:{...l,name:e},value:a[e],onChange:l=>((e,l)=>{t({...a,[e]:l})})(e,l),meta:a},e)),e.description&&(0,s.jsx)("p",{className:"hint",children:e.description})]})}},A={"=":(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:i})=>{if(!((e,l)=>!e?.field||(A[e.operator]||A["="])(l?.[e.field],e.value))(l.condition,i))return null;const o=N[l.type];return o?(0,s.jsx)(a.PanelRow,{children:(0,s.jsx)(o,{field:l,value:t,onChange:n})}):null},P=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":3,"name":"jvb/meta","version":"0.1.0","title":"Custom Field","category":"jvb","icon":"edit-large","description":"Add a specific field from this content","example":{},"attributes":{"fieldName":{"type":"string","default":""}},"supports":{"align":["wide","full"]},"textdomain":"jvb","selectors":{"root":".jvb-meta"},"editorScript":"file:./index.js","editorStyle":"file:./index.css","style":"file:./style-index.css","render":"file:./render.php","viewScript":"file:./view.js"}');(0,l.registerBlockType)(P,{edit:({attributes:e,setAttributes:l})=>{const{fieldName:o}=e,{fields:r}=window.jvbFieldConfig||{},d=(0,i.useSelect)(e=>e("core/editor").getCurrentPostType(),[]),[c,p]=(0,n.useEntityProp)("postType",d,"meta"),u=(r||[]).find(e=>e.name===o),m=(0,t.useBlockProps)();return(0,s.jsxs)("div",{...m,children:[(0,s.jsx)(t.InspectorControls,{children:(0,s.jsx)(a.PanelBody,{title:"Field",children:(0,s.jsx)(a.SelectControl,{label:"Meta field",value:o,options:[{label:"Select a field…",value:""},...(r||[]).map(e=>({label:e.label||e.name,value:e.name}))],onChange:e=>l({fieldName:e})})})}),!u&&(0,s.jsx)(a.Placeholder,{label:"Meta Field",instructions:"Select a field in the block settings."}),u&&(0,s.jsx)(O,{field:u,value:c?.[o],onChange:e=>p({...c,[o]:e}),meta:c})]})},save:()=>null})})();
build/meta/style-index-rtl.css
File was deleted
build/meta/style-index.css
File was deleted
inc/meta/Sanitizer.php
@@ -205,9 +205,12 @@
        return implode(',', $valid_ids);
    }
    protected static function sanitizeLocation(array $value, array $field_config):array
    protected static function sanitizeLocation(array $value, array $field_config):?array
    {
        error_log('Location field to sanitize: '.print_r($value, true));
        if (empty($value['address']??'')) {
            return MetaTypeManager::getType('location')['default'];
        }
        return [
            'address' => sanitize_text_field($value['address'] ?? ''),
            'lat' => (float)($value['lat'] ?? 0),
inc/registrar/helpers/AddCustomFields.php
@@ -73,8 +73,15 @@
        foreach ($this->registrar->getFields(false) as $name => $config) {
            $metaType = $this->getSchemaType($config);
            $schema = $metaType === 'array' ? $this->determineSchema($config) : true;
            $rawSchema = in_array($metaType, ['array', 'object'], true)
                ? $this->determineSchema($config)
                : true;
            $schema = is_array($rawSchema) ? $this->schema($rawSchema) : $rawSchema;
            //Allow for null
            if ($metaType === 'object') {
                $metaType = ['object', 'null'];
            }
            register_post_meta($this->registrar->getBased(), jvbCheckBase($name), [
                'single'            => true,
                'type'              => $metaType,
@@ -163,16 +170,16 @@
                $required[] = $name;
            }
            $schema = $this->determineSchema($c);
            if (is_array($schema)) {
                if (array_key_exists('default', $schema)) {
                    $args['default'] = $schema['default'];
            $tmp = $this->determineSchema($c);
            if (is_array($tmp)) {
                if (array_key_exists('default', $tmp)) {
                    $args['default'] = $tmp['default'];
                }
                if (array_key_exists('enum', $schema)) {
                    $args['enum'] = $schema['enum'];
                if (array_key_exists('enum', $tmp)) {
                    $args['enum'] = $tmp['enum'];
                }
                if (array_key_exists('format', $schema)) {
                    $args['format'] = $schema['format'];
                if (array_key_exists('format', $tmp)) {
                    $args['format'] = $tmp['format'];
                }
            }
            if (array_key_exists('default', $c)) {
@@ -201,7 +208,7 @@
    protected function schemaLocation(array $config):array|true
    {
        return [
            'type'          => 'object',
            'type'          => ['object', 'null'],
            'properties'    => [
                'address'   => [
                    'type'  => 'string'
inc/registrar/helpers/MakeCalendarType.php
@@ -101,6 +101,7 @@
                'label' => 'Daily Schedule',
                'description' => 'Set specific times for multi-day events',
                'add_label' => 'Add Day',
                'row_label' => 'New Day',
                'condition' => [
                    'field' => 'make_multiple',
                    'operator' => '==',
@@ -162,107 +163,115 @@
                'label' => 'Drop-ins Welcome?',
                'default' => true,
            ],
            'recurrence' => [
                'type' => 'group',
                'label' => 'Event Recurrence',
                'condition' => [
                    'field' => 'status',
                    'operator' => '==',
                    'value' => 'repeat',
                ],
                'fields' => [
                    'recurrence_type' => [
                        'type' => 'select',
                        'label' => 'Repeats',
                        'options' => [
                            'daily' => 'Daily',
                            'weekly' => 'Weekly',
                            'monthly' => 'Monthly',
                            'custom' => 'Custom'
                        ]
                    ],
                    'recurrence_interval' => [
                        'type' => 'number',
                        'label' => 'Every',
                        'description' => 'Repeat every X days/weeks/months',
                        'default' => 1,
                    ],
                    'recurrence_days' => [
                        'type' => 'set',
                        'label' => 'On These Days',
                        'options' => [
                            'monday' => 'Monday',
                            'tuesday' => 'Tuesday',
                            'wednesday' => 'Wednesday',
                            'thursday' => 'Thursday',
                            'friday' => 'Friday',
                            'saturday' => 'Saturday',
                            'sunday' => 'Sunday'
                        ],
                        'condition' => [
                            'field' => 'recurrence_type',
                            'operator' => '==',
                            'value' => 'weekly'
                        ]
                    ],
                    'recurrence_ends' => [
                        'type' => 'group',
                        'label' => 'Recurrence Ends',
                        'fields' => [
                            'type' => [
                                'type' => 'select',
                                'label' => 'Recurrence Ends',
                                'options' => [
                                    'never' => 'Never',
                                    'after' => 'After X occurrences',
                                    'on' => 'On date'
                                ]
                            ],
                            'count' => [
                                'type' => 'number',
                                'label' => 'Number of occurrences',
                                'condition' => [
                                    'field' => 'type',
                                    'operator' => '==',
                                    'value' => 'after'
                                ]
                            ],
                            'date' => [
                                'type' => 'date',
                                'label' => 'End date',
                                'condition' => [
                                    'field' => 'type',
                                    'operator' => '==',
                                    'value' => 'on'
                                ]
                            ]
                        ],
                    ],
                    'rsvp_required' => [
                        'type' => 'true_false',
                        'label' => 'RSVP Required?'
                    ],
                    'rsvp_limit' => [
                        'type' => 'number',
                        'label' => 'RSVP Limit',
                        'condition' => [
                            'field' => 'rsvp_required',
                            'operator' => '==',
                            'value' => 1
                        ]
                    ],
                    'rsvp_deadline' => [
                        'type' => 'datetime',
                        'label' => 'RSVP Deadline',
                        'condition' => [
                            'field' => 'rsvp_required',
                            'operator' => '==',
                            'value' => 1
                        ]
                    ],
            //TODO
            //RECURRENCE
//          'make_recurring' => [
//              'type' => 'true_false',
//              'label' => 'Make Repeating Event',
//              'default' => 0,
//          ],
//          'recurrence_type' => [
//              'type' => 'select',
//              'label' => 'Repeats',
//              'options' => [
//                  'daily' => 'Daily',
//                  'weekly' => 'Weekly',
//                  'monthly' => 'Monthly',
//                  'custom' => 'Custom'
//              ],
//              'condition' => [
//                  'field' => 'make_recurring',
//                  'operator' => '==',
//                  'value' => '1',
//              ],
//          ],
//          'recurrence_interval' => [
//              'type' => 'number',
//              'label' => 'Repeat',
//              'description' => 'Repeat every X days/weeks/months',
//              'default' => 1,
//
//              'condition' => [
//                  'field' => 'make_recurring',
//                  'operator' => '==',
//                  'value' => '1',
//              ],
//          ],
//          'recurrence_days' => [
//              'type' => 'set',
//              'label' => 'On These Days',
//              'options' => [
//                  'monday' => 'Monday',
//                  'tuesday' => 'Tuesday',
//                  'wednesday' => 'Wednesday',
//                  'thursday' => 'Thursday',
//                  'friday' => 'Friday',
//                  'saturday' => 'Saturday',
//                  'sunday' => 'Sunday'
//              ],
//              'condition' => [
//                  'field' => 'recurrence_type',
//                  'operator' => '==',
//                  'value' => 'weekly'
//              ]
//          ],
//          'recurrence_ends' => [
//              'type' => 'select',
//              'label' => 'Recurrence Ends',
//              'options' => [
//                  'never' => 'Never',
//                  'after' => 'After X occurrences',
//                  'on' => 'On date'
//              ],
//              'condition' => [
//                  'field' => 'make_recurring',
//                  'operator' => '==',
//                  'value' => '1',
//              ],
//          ],
//          'recurrence_ends_number' => [
//              'type' => 'number',
//              'label' => 'Number of occurrences',
//              'condition' => [
//                  'field' => 'recurrence_ends',
//                  'operator' => '==',
//                  'value' => 'after',
//              ],
//          ],
//          'recurrence_ends_date' => [
//              'type' => 'date',
//              'label' => 'End date',
//              'condition' => [
//                  'field' => 'recurrence_ends',
//                  'operator' => '==',
//                  'value' => 'on'
//              ]
//          ],
            //RSVP
            'rsvp_required' => [
                'type' => 'true_false',
                'label' => 'RSVP Required?'
            ],
            'rsvp_limit' => [
                'type' => 'number',
                'label' => 'RSVP Limit',
                'condition' => [
                    'field' => 'rsvp_required',
                    'operator' => '==',
                    'value' => 1
                ]
            ]
            ],
            'rsvp_deadline' => [
                'type' => 'datetime',
                'label' => 'RSVP Deadline',
                'condition' => [
                    'field' => 'rsvp_required',
                    'operator' => '==',
                    'value' => 1
                ]
            ],
        ];
        foreach ($fields as $name => $config) {
package-lock.json
@@ -25,6 +25,9 @@
                "sass": "^1.103.1"
            },
            "devDependencies": {
                "@dnd-kit/core": "^6.3.1",
                "@dnd-kit/sortable": "^10.0.0",
                "@dnd-kit/utilities": "^3.2.2",
                "@wordpress/scripts": "^34.2.0"
            }
        },
@@ -192,6 +195,13 @@
                "url": "https://opencollective.com/babel"
            }
        },
        "node_modules/@babel/core/node_modules/convert-source-map": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
            "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
            "dev": true,
            "license": "MIT"
        },
        "node_modules/@babel/eslint-parser": {
            "version": "7.29.7",
            "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.29.7.tgz",
@@ -2430,6 +2440,63 @@
                "node": ">=10.0.0"
            }
        },
        "node_modules/@dnd-kit/accessibility": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz",
            "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "tslib": "^2.0.0"
            },
            "peerDependencies": {
                "react": ">=16.8.0"
            }
        },
        "node_modules/@dnd-kit/core": {
            "version": "6.3.1",
            "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz",
            "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "@dnd-kit/accessibility": "^3.1.1",
                "@dnd-kit/utilities": "^3.2.2",
                "tslib": "^2.0.0"
            },
            "peerDependencies": {
                "react": ">=16.8.0",
                "react-dom": ">=16.8.0"
            }
        },
        "node_modules/@dnd-kit/sortable": {
            "version": "10.0.0",
            "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz",
            "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "@dnd-kit/utilities": "^3.2.2",
                "tslib": "^2.0.0"
            },
            "peerDependencies": {
                "@dnd-kit/core": "^6.3.0",
                "react": ">=16.8.0"
            }
        },
        "node_modules/@dnd-kit/utilities": {
            "version": "3.2.2",
            "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz",
            "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "tslib": "^2.0.0"
            },
            "peerDependencies": {
                "react": ">=16.8.0"
            }
        },
        "node_modules/@dual-bundle/import-meta-resolve": {
            "version": "4.2.1",
            "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz",
@@ -2494,21 +2561,6 @@
                "stylis": "4.2.0"
            }
        },
        "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
            "version": "1.9.0",
            "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
            "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
            "license": "MIT"
        },
        "node_modules/@emotion/babel-plugin/node_modules/source-map": {
            "version": "0.5.7",
            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
            "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
            "license": "BSD-3-Clause",
            "engines": {
                "node": ">=0.10.0"
            }
        },
        "node_modules/@emotion/cache": {
            "version": "11.14.0",
            "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz",
@@ -2667,9 +2719,9 @@
            }
        },
        "node_modules/@eslint-community/eslint-plugin-eslint-comments": {
            "version": "4.7.2",
            "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.7.2.tgz",
            "integrity": "sha512-LF03qURSwEWm2dz5wtdDCzNk+7Opl0X7q6I3undsaIuNsEiNvRV3BCtqu14Q/6Pzg1tBj44LcxpW2EpSLZStZw==",
            "version": "4.8.0",
            "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.8.0.tgz",
            "integrity": "sha512-bzGg2H83F9p55TKzlNUS/LWb1WF2OqdVX67FK1OadDPLVOhabFRERC7TiDJzk//LedaVnRS5uqK/2f/AZ/+VyA==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
@@ -3544,6 +3596,13 @@
                "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
            }
        },
        "node_modules/@jest/source-map/node_modules/convert-source-map": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
            "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
            "dev": true,
            "license": "MIT"
        },
        "node_modules/@jest/test-result": {
            "version": "30.5.1",
            "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.5.1.tgz",
@@ -3602,6 +3661,13 @@
                "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
            }
        },
        "node_modules/@jest/transform/node_modules/convert-source-map": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
            "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
            "dev": true,
            "license": "MIT"
        },
        "node_modules/@jest/types": {
            "version": "30.5.1",
            "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.5.1.tgz",
@@ -3730,14 +3796,14 @@
            }
        },
        "node_modules/@jsonjoy.com/fs-core": {
            "version": "4.69.1",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.69.1.tgz",
            "integrity": "sha512-ohxv/4KZSG03UmjDo//eIjedRRQEcIc0w4IjbyBcMS4mdkvTVMQwfNm1Ivxj4z35xIwpQbJ+1sGKq3l4vTaFiA==",
            "version": "4.71.0",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.71.0.tgz",
            "integrity": "sha512-9DFR/j+bm+tig1abs1CWS1/r0IVjNUdTp/+q6R/PXayXpO1rgbUh7tkanGYP40I0zdxbOreN3tmzBpVHgfMKzg==",
            "dev": true,
            "license": "Apache-2.0",
            "dependencies": {
                "@jsonjoy.com/fs-node-builtins": "4.69.1",
                "@jsonjoy.com/fs-node-utils": "4.69.1",
                "@jsonjoy.com/fs-node-builtins": "4.71.0",
                "@jsonjoy.com/fs-node-utils": "4.71.0",
                "thingies": "^2.5.0"
            },
            "engines": {
@@ -3752,15 +3818,15 @@
            }
        },
        "node_modules/@jsonjoy.com/fs-fsa": {
            "version": "4.69.1",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.69.1.tgz",
            "integrity": "sha512-z9IfdQyZGXL9GB9gv+dXRuMjOjY8s2EmFQ8DhdxxjFJGfPITDDW1j/W84jlBr2SmCc+yv47yYiNQ3powkqWGVQ==",
            "version": "4.71.0",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.71.0.tgz",
            "integrity": "sha512-dRw5ojxzep3lntVGVBLzQUMYj1hXLH+DAz9sK0vKU+594x/zA2nYPOiitlyhYtOJ2nv1FXNq7c55rgwANknIWw==",
            "dev": true,
            "license": "Apache-2.0",
            "dependencies": {
                "@jsonjoy.com/fs-core": "4.69.1",
                "@jsonjoy.com/fs-node-builtins": "4.69.1",
                "@jsonjoy.com/fs-node-utils": "4.69.1",
                "@jsonjoy.com/fs-core": "4.71.0",
                "@jsonjoy.com/fs-node-builtins": "4.71.0",
                "@jsonjoy.com/fs-node-utils": "4.71.0",
                "thingies": "^2.5.0"
            },
            "engines": {
@@ -3775,17 +3841,17 @@
            }
        },
        "node_modules/@jsonjoy.com/fs-node": {
            "version": "4.69.1",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.69.1.tgz",
            "integrity": "sha512-oIIXv5EfAqj2Wsck9dDa5njbTyCpef4OV+W1h7cYrlph0rRIay91DIhNk+OdiwLgKHoqyBmUWRy3GXAHGiXQZw==",
            "version": "4.71.0",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.71.0.tgz",
            "integrity": "sha512-yt5Ak0otPdHPIlmMvF16aLG2qSZL52EYJ7HOkYpBcIPWw+kmT1FtTSj4oiV2OUkJbG8pLzA+RhMgrlRl85QuBw==",
            "dev": true,
            "license": "Apache-2.0",
            "dependencies": {
                "@jsonjoy.com/fs-core": "4.69.1",
                "@jsonjoy.com/fs-node-builtins": "4.69.1",
                "@jsonjoy.com/fs-node-utils": "4.69.1",
                "@jsonjoy.com/fs-print": "4.69.1",
                "@jsonjoy.com/fs-snapshot": "4.69.1",
                "@jsonjoy.com/fs-core": "4.71.0",
                "@jsonjoy.com/fs-node-builtins": "4.71.0",
                "@jsonjoy.com/fs-node-utils": "4.71.0",
                "@jsonjoy.com/fs-print": "4.71.0",
                "@jsonjoy.com/fs-snapshot": "4.71.0",
                "glob-to-regex.js": "^1.0.0",
                "thingies": "^2.5.0"
            },
@@ -3801,9 +3867,9 @@
            }
        },
        "node_modules/@jsonjoy.com/fs-node-builtins": {
            "version": "4.69.1",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.69.1.tgz",
            "integrity": "sha512-nJddTKNx2FrH+fNRHcHJpCD8bwZlQmYaT8SPEG86kKUae5XzWU5hXdk9T4vKU9yBoXfT2po1A3K/twf8ujBd0g==",
            "version": "4.71.0",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.71.0.tgz",
            "integrity": "sha512-BSzl+QFSxZF58BxGjV1wqCJ+qSn3b2IZnb+z3hDQq6goqOO5RuxF8gRihjsFx17AfpEpa7XjYcP8XpQtDU8RrQ==",
            "dev": true,
            "license": "Apache-2.0",
            "engines": {
@@ -3818,15 +3884,15 @@
            }
        },
        "node_modules/@jsonjoy.com/fs-node-to-fsa": {
            "version": "4.69.1",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.69.1.tgz",
            "integrity": "sha512-1GTORTbZ2GcshGyaGNgqJAm/INOWyTdHMbeuj2CsBWKYEQYHW4ZvkKHaR+46SO762skZcNVja3dLIfk3s1AdcQ==",
            "version": "4.71.0",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.71.0.tgz",
            "integrity": "sha512-OlXBZKIeDx5bIGcQmn0w+nVkLheCiuQSepKiBAiWSWimSdn8Q6Yc9ih2y8zStcJk31fieqnov9V+o8XTWn/5Rw==",
            "dev": true,
            "license": "Apache-2.0",
            "dependencies": {
                "@jsonjoy.com/fs-fsa": "4.69.1",
                "@jsonjoy.com/fs-node-builtins": "4.69.1",
                "@jsonjoy.com/fs-node-utils": "4.69.1"
                "@jsonjoy.com/fs-fsa": "4.71.0",
                "@jsonjoy.com/fs-node-builtins": "4.71.0",
                "@jsonjoy.com/fs-node-utils": "4.71.0"
            },
            "engines": {
                "node": ">=10.0"
@@ -3840,13 +3906,13 @@
            }
        },
        "node_modules/@jsonjoy.com/fs-node-utils": {
            "version": "4.69.1",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.69.1.tgz",
            "integrity": "sha512-45kAGpkTUKBNRguS34fdBkXbkBuZM75oU+snf3kRjfQGWHmp93aNKHdtbqrVqxpOdOvWAFnMx+UN6rRSLN2p9g==",
            "version": "4.71.0",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.71.0.tgz",
            "integrity": "sha512-YtzCL3jbKYx6LHxqS9ymJ9Ob7SO9cucI+kpNO3LijGNFEjFbvNsTlHkvFgocAMAjUk96TpQTCsYkzFQi1CdlAA==",
            "dev": true,
            "license": "Apache-2.0",
            "dependencies": {
                "@jsonjoy.com/fs-node-builtins": "4.69.1",
                "@jsonjoy.com/fs-node-builtins": "4.71.0",
                "glob-to-regex.js": "^1.0.1"
            },
            "engines": {
@@ -3861,13 +3927,13 @@
            }
        },
        "node_modules/@jsonjoy.com/fs-print": {
            "version": "4.69.1",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.69.1.tgz",
            "integrity": "sha512-As9V7Ra/mHsjHQicor5PTTymcqPb2QRTonedIsMuqMz2JEAZIFdRy+qvi5O15lIe88fASxHQXLIU6H5G01kfxg==",
            "version": "4.71.0",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.71.0.tgz",
            "integrity": "sha512-OhfDSdvyO8uGV0U11OP+mOeVCPgjuP1HqCGR/TdBQLxHoDEWJAK3KOP5fPXo57H7i3G0x0Vmv8xPRHDle4XGzA==",
            "dev": true,
            "license": "Apache-2.0",
            "dependencies": {
                "@jsonjoy.com/fs-node-utils": "4.69.1",
                "@jsonjoy.com/fs-node-utils": "4.71.0",
                "tree-dump": "^1.1.0"
            },
            "engines": {
@@ -3882,14 +3948,14 @@
            }
        },
        "node_modules/@jsonjoy.com/fs-snapshot": {
            "version": "4.69.1",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.69.1.tgz",
            "integrity": "sha512-wUffyQdpDSh5RVA+oubKLMcorJfpxUia+ETYPnK6LK+myJ4YVDKWX4UMSjUCapvbhjZRxr6tvwYh4zE3aBpAuA==",
            "version": "4.71.0",
            "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.71.0.tgz",
            "integrity": "sha512-md+Wov365xa9A3nfW9YQTHLcweHHAee/e/0UoVRbldEHxboPJknuO3sEkNVVECO0dTqKra/ERaQylAMRrGWd0Q==",
            "dev": true,
            "license": "Apache-2.0",
            "dependencies": {
                "@jsonjoy.com/buffers": "^17.65.0",
                "@jsonjoy.com/fs-node-utils": "4.69.1",
                "@jsonjoy.com/fs-node-utils": "4.71.0",
                "@jsonjoy.com/json-pack": "^17.65.0",
                "@jsonjoy.com/util": "^17.65.0"
            },
@@ -5333,14 +5399,14 @@
            }
        },
        "node_modules/@playwright/test": {
            "version": "1.62.1",
            "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.1.tgz",
            "integrity": "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==",
            "version": "1.63.0",
            "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.63.0.tgz",
            "integrity": "sha512-oxMK4vllB9RK5NQ2l1pq1IfOf2AvnEuj/vYGDj0H2nMtmtZpKtCwt/l00GEO6xjGfpBNAvjovvYdCm50dRQkpQ==",
            "dev": true,
            "license": "Apache-2.0",
            "peer": true,
            "dependencies": {
                "playwright": "1.62.1"
                "playwright": "1.63.0"
            },
            "bin": {
                "playwright": "cli.js"
@@ -5398,6 +5464,16 @@
                }
            }
        },
        "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": {
            "version": "0.7.6",
            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
            "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
            "dev": true,
            "license": "BSD-3-Clause",
            "engines": {
                "node": ">= 12"
            }
        },
        "node_modules/@polka/url": {
            "version": "1.0.0-next.29",
            "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
@@ -6298,9 +6374,9 @@
            "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==",
            "version": "1.162.2",
            "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.162.2.tgz",
            "integrity": "sha512-Lemp3DJbzNqcin/nZpWxycDaEqySDbnIshDbyHJMMCapD4ZQMe57szRpBXOfzfP6fyWAtHNrLrcBUyANJ6Vlow==",
            "license": "MIT",
            "engines": {
                "node": ">=20.19"
@@ -6311,14 +6387,14 @@
            }
        },
        "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==",
            "version": "1.170.33",
            "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.170.33.tgz",
            "integrity": "sha512-iNnI98vH3kO/V4dy6YM0CInhqwWBddU0G5wZK5jiMvr3HsK2avDQSRx3RY/y6v+6zQAqb2kD6hUPHIenrJBTSw==",
            "license": "MIT",
            "dependencies": {
                "@tanstack/history": "1.162.1",
                "@tanstack/history": "1.162.2",
                "@tanstack/react-store": "^0.9.3",
                "@tanstack/router-core": "1.171.27",
                "@tanstack/router-core": "1.171.28",
                "isbot": "^5.1.22"
            },
            "engines": {
@@ -6352,12 +6428,12 @@
            }
        },
        "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==",
            "version": "1.171.28",
            "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.171.28.tgz",
            "integrity": "sha512-PvPWSklhw6i9b0rzScVh0btQsK5u/gBYN3mBHyDzhC/U4LrB3WzPXPkUunQUKvQOGXCp16UEb7Htc/ITGm5DkQ==",
            "license": "MIT",
            "dependencies": {
                "@tanstack/history": "1.162.1",
                "@tanstack/history": "1.162.2",
                "cookie-es": "^3.0.0",
                "seroval": "^1.6.2",
                "seroval-plugins": "^1.6.2"
@@ -6841,17 +6917,17 @@
            }
        },
        "node_modules/@typescript-eslint/eslint-plugin": {
            "version": "8.69.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.69.0.tgz",
            "integrity": "sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==",
            "version": "8.70.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.70.0.tgz",
            "integrity": "sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "@eslint-community/regexpp": "^4.12.2",
                "@typescript-eslint/scope-manager": "8.69.0",
                "@typescript-eslint/type-utils": "8.69.0",
                "@typescript-eslint/utils": "8.69.0",
                "@typescript-eslint/visitor-keys": "8.69.0",
                "@typescript-eslint/scope-manager": "8.70.0",
                "@typescript-eslint/type-utils": "8.70.0",
                "@typescript-eslint/utils": "8.70.0",
                "@typescript-eslint/visitor-keys": "8.70.0",
                "ignore": "^7.0.5",
                "natural-compare": "^1.4.0",
                "ts-api-utils": "^2.5.0"
@@ -6864,22 +6940,22 @@
                "url": "https://opencollective.com/typescript-eslint"
            },
            "peerDependencies": {
                "@typescript-eslint/parser": "^8.69.0",
                "@typescript-eslint/parser": "^8.70.0",
                "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
                "typescript": ">=4.8.4 <6.1.0"
            }
        },
        "node_modules/@typescript-eslint/parser": {
            "version": "8.69.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.69.0.tgz",
            "integrity": "sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==",
            "version": "8.70.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.70.0.tgz",
            "integrity": "sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "@typescript-eslint/scope-manager": "8.69.0",
                "@typescript-eslint/types": "8.69.0",
                "@typescript-eslint/typescript-estree": "8.69.0",
                "@typescript-eslint/visitor-keys": "8.69.0",
                "@typescript-eslint/scope-manager": "8.70.0",
                "@typescript-eslint/types": "8.70.0",
                "@typescript-eslint/typescript-estree": "8.70.0",
                "@typescript-eslint/visitor-keys": "8.70.0",
                "debug": "^4.4.3"
            },
            "engines": {
@@ -6895,14 +6971,14 @@
            }
        },
        "node_modules/@typescript-eslint/project-service": {
            "version": "8.69.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.69.0.tgz",
            "integrity": "sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==",
            "version": "8.70.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.70.0.tgz",
            "integrity": "sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "@typescript-eslint/tsconfig-utils": "^8.69.0",
                "@typescript-eslint/types": "^8.69.0",
                "@typescript-eslint/tsconfig-utils": "^8.70.0",
                "@typescript-eslint/types": "^8.70.0",
                "debug": "^4.4.3"
            },
            "engines": {
@@ -6917,14 +6993,14 @@
            }
        },
        "node_modules/@typescript-eslint/scope-manager": {
            "version": "8.69.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.69.0.tgz",
            "integrity": "sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==",
            "version": "8.70.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.70.0.tgz",
            "integrity": "sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "@typescript-eslint/types": "8.69.0",
                "@typescript-eslint/visitor-keys": "8.69.0"
                "@typescript-eslint/types": "8.70.0",
                "@typescript-eslint/visitor-keys": "8.70.0"
            },
            "engines": {
                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -6935,9 +7011,9 @@
            }
        },
        "node_modules/@typescript-eslint/tsconfig-utils": {
            "version": "8.69.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.69.0.tgz",
            "integrity": "sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==",
            "version": "8.70.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.70.0.tgz",
            "integrity": "sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==",
            "dev": true,
            "license": "MIT",
            "engines": {
@@ -6952,15 +7028,15 @@
            }
        },
        "node_modules/@typescript-eslint/type-utils": {
            "version": "8.69.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.69.0.tgz",
            "integrity": "sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==",
            "version": "8.70.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.70.0.tgz",
            "integrity": "sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "@typescript-eslint/types": "8.69.0",
                "@typescript-eslint/typescript-estree": "8.69.0",
                "@typescript-eslint/utils": "8.69.0",
                "@typescript-eslint/types": "8.70.0",
                "@typescript-eslint/typescript-estree": "8.70.0",
                "@typescript-eslint/utils": "8.70.0",
                "debug": "^4.4.3",
                "ts-api-utils": "^2.5.0"
            },
@@ -6977,9 +7053,9 @@
            }
        },
        "node_modules/@typescript-eslint/types": {
            "version": "8.69.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.69.0.tgz",
            "integrity": "sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==",
            "version": "8.70.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.70.0.tgz",
            "integrity": "sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==",
            "dev": true,
            "license": "MIT",
            "engines": {
@@ -6991,16 +7067,16 @@
            }
        },
        "node_modules/@typescript-eslint/typescript-estree": {
            "version": "8.69.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.69.0.tgz",
            "integrity": "sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==",
            "version": "8.70.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.70.0.tgz",
            "integrity": "sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "@typescript-eslint/project-service": "8.69.0",
                "@typescript-eslint/tsconfig-utils": "8.69.0",
                "@typescript-eslint/types": "8.69.0",
                "@typescript-eslint/visitor-keys": "8.69.0",
                "@typescript-eslint/project-service": "8.70.0",
                "@typescript-eslint/tsconfig-utils": "8.70.0",
                "@typescript-eslint/types": "8.70.0",
                "@typescript-eslint/visitor-keys": "8.70.0",
                "debug": "^4.4.3",
                "minimatch": "^10.2.2",
                "semver": "^7.7.3",
@@ -7071,16 +7147,16 @@
            }
        },
        "node_modules/@typescript-eslint/utils": {
            "version": "8.69.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.69.0.tgz",
            "integrity": "sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==",
            "version": "8.70.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.70.0.tgz",
            "integrity": "sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "@eslint-community/eslint-utils": "^4.9.1",
                "@typescript-eslint/scope-manager": "8.69.0",
                "@typescript-eslint/types": "8.69.0",
                "@typescript-eslint/typescript-estree": "8.69.0"
                "@typescript-eslint/scope-manager": "8.70.0",
                "@typescript-eslint/types": "8.70.0",
                "@typescript-eslint/typescript-estree": "8.70.0"
            },
            "engines": {
                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -7095,13 +7171,13 @@
            }
        },
        "node_modules/@typescript-eslint/visitor-keys": {
            "version": "8.69.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.69.0.tgz",
            "integrity": "sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==",
            "version": "8.70.0",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.70.0.tgz",
            "integrity": "sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "@typescript-eslint/types": "8.69.0",
                "@typescript-eslint/types": "8.70.0",
                "eslint-visitor-keys": "^5.0.0"
            },
            "engines": {
@@ -8033,25 +8109,6 @@
                }
            }
        },
        "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",
@@ -8164,25 +8221,6 @@
                }
            }
        },
        "node_modules/@wordpress/components/node_modules/path-to-regexp": {
            "version": "6.3.0",
            "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
            "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
            "license": "MIT"
        },
        "node_modules/@wordpress/components/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/compose": {
            "version": "8.7.0",
            "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-8.7.0.tgz",
@@ -8274,19 +8312,6 @@
                }
            }
        },
        "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",
@@ -8546,51 +8571,6 @@
                }
            }
        },
        "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",
@@ -8606,19 +8586,6 @@
                "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",
@@ -8706,52 +8673,6 @@
                }
            }
        },
        "node_modules/@wordpress/eslint-plugin/node_modules/@wordpress/theme": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/@wordpress/theme/-/theme-2.0.0.tgz",
            "integrity": "sha512-4yFei1ayJinMOVY6cTzKZV961p2Vjex9Nst1SReIFKv3ckb6ih5QN+qMpJQdpuukwabXrBTaoiA4ZB1akl2CfQ==",
            "dev": true,
            "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/eslint-plugin/node_modules/cosmiconfig": {
            "version": "7.1.0",
            "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
@@ -9403,12 +9324,6 @@
                }
            }
        },
        "node_modules/@wordpress/plugins/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/postcss-plugins-preset": {
            "version": "5.54.0",
            "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-5.54.0.tgz",
@@ -9805,9 +9720,9 @@
            }
        },
        "node_modules/@wordpress/scripts/node_modules/eslint": {
            "version": "10.9.1",
            "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.9.1.tgz",
            "integrity": "sha512-9VaAkDURekixUQJy0oJYl2DcN6oKMfxay7XzaGYAWQwsb6qfKf+x76R2k1L8kb1boc+FyCAaTA9GmiKaaiaF+A==",
            "version": "10.10.0",
            "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.10.0.tgz",
            "integrity": "sha512-NPXn6r5zl4uET1DAVPaOwzX3rut4c0wcmw3dWJAfOsTM5+TogXo0DDjz8pwm/hL8cyVNpHqeK4JpN0NjnyFFNw==",
            "dev": true,
            "license": "MIT",
            "workspaces": [
@@ -9819,7 +9734,7 @@
                "@eslint/config-array": "^0.23.5",
                "@eslint/config-helpers": "^0.7.0",
                "@eslint/core": "^1.2.1",
                "@eslint/plugin-kit": "^0.7.2",
                "@eslint/plugin-kit": "^0.7.3",
                "@humanfs/node": "^0.16.6",
                "@humanwhocodes/module-importer": "^1.0.1",
                "@humanwhocodes/retry": "^0.4.2",
@@ -9834,7 +9749,7 @@
                "esquery": "^1.7.0",
                "esutils": "^2.0.2",
                "fast-deep-equal": "^3.1.3",
                "file-entry-cache": "^8.0.0",
                "file-entry-cache": "11.1.5 || >11.1.6 <12",
                "find-up": "^5.0.0",
                "glob-parent": "^6.0.2",
                "ignore": "^5.2.0",
@@ -9913,6 +9828,16 @@
                "url": "https://opencollective.com/eslint"
            }
        },
        "node_modules/@wordpress/scripts/node_modules/file-entry-cache": {
            "version": "11.1.5",
            "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.5.tgz",
            "integrity": "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "flat-cache": "^6.1.23"
            }
        },
        "node_modules/@wordpress/scripts/node_modules/find-up": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -9930,6 +9855,18 @@
                "url": "https://github.com/sponsors/sindresorhus"
            }
        },
        "node_modules/@wordpress/scripts/node_modules/flat-cache": {
            "version": "6.1.23",
            "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz",
            "integrity": "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "cacheable": "^2.5.0",
                "flatted": "^3.4.2",
                "hookified": "^1.15.0"
            }
        },
        "node_modules/@wordpress/scripts/node_modules/ignore": {
            "version": "5.3.2",
            "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -10084,11 +10021,31 @@
                "stylelint-scss": "^6.4.0"
            }
        },
        "node_modules/@wordpress/stylelint-config/node_modules/@wordpress/theme": {
        "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/theme": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/@wordpress/theme/-/theme-2.0.0.tgz",
            "integrity": "sha512-4yFei1ayJinMOVY6cTzKZV961p2Vjex9Nst1SReIFKv3ckb6ih5QN+qMpJQdpuukwabXrBTaoiA4ZB1akl2CfQ==",
            "dev": true,
            "license": "GPL-2.0-or-later",
            "dependencies": {
                "@wordpress/compose": "^8.7.0",
@@ -10130,27 +10087,6 @@
                }
            }
        },
        "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",
@@ -10199,51 +10135,6 @@
                }
            }
        },
        "node_modules/@wordpress/ui/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/undo-manager": {
            "version": "1.54.0",
            "resolved": "https://registry.npmjs.org/@wordpress/undo-manager/-/undo-manager-1.54.0.tgz",
@@ -10290,19 +10181,6 @@
                }
            }
        },
        "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",
@@ -11015,9 +10893,9 @@
            }
        },
        "node_modules/autoprefixer": {
            "version": "10.5.4",
            "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz",
            "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==",
            "version": "10.5.5",
            "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.5.tgz",
            "integrity": "sha512-uiRYvQYe/nNSzBJ7OUnd2/TZVsAdob3blml44teEpee9Cc1f4rGZFewO+JT3Wo8mgFOSzNqes4FHZn/Qz8WOuw==",
            "dev": true,
            "funding": [
                {
@@ -11035,8 +10913,8 @@
            ],
            "license": "MIT",
            "dependencies": {
                "browserslist": "^4.28.6",
                "caniuse-lite": "^1.0.30001806",
                "browserslist": "^4.28.9",
                "caniuse-lite": "^1.0.30001810",
                "fraction.js": "^5.3.4",
                "picocolors": "^1.1.1",
                "postcss-value-parser": "^4.2.0"
@@ -11444,9 +11322,9 @@
            }
        },
        "node_modules/body-parser": {
            "version": "1.20.6",
            "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz",
            "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==",
            "version": "1.20.8",
            "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.8.tgz",
            "integrity": "sha512-JNcyFQ64OiijEkPzUBTCe+hyPXUD/3LEldGQ6iF5LR1w00mx9o7xtDWHXBY2iItjdCFGoilOLNQbH943ut7pHA==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
@@ -11458,7 +11336,7 @@
                "http-errors": "~2.0.1",
                "iconv-lite": "~0.4.24",
                "on-finished": "~2.4.1",
                "qs": "~6.15.1",
                "qs": "~6.16.0",
                "raw-body": "~2.5.3",
                "type-is": "~1.6.18",
                "unpipe": "~1.0.0"
@@ -11498,6 +11376,23 @@
            "dev": true,
            "license": "MIT"
        },
        "node_modules/body-parser/node_modules/qs": {
            "version": "6.16.0",
            "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.0.tgz",
            "integrity": "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==",
            "dev": true,
            "license": "BSD-3-Clause",
            "dependencies": {
                "es-define-property": "^1.0.1",
                "side-channel": "^1.1.1"
            },
            "engines": {
                "node": ">=0.6"
            },
            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }
        },
        "node_modules/bonjour-service": {
            "version": "1.4.4",
            "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.4.4.tgz",
@@ -11541,9 +11436,9 @@
            }
        },
        "node_modules/browserslist": {
            "version": "4.28.8",
            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz",
            "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==",
            "version": "4.28.9",
            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.9.tgz",
            "integrity": "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==",
            "dev": true,
            "funding": [
                {
@@ -11561,11 +11456,11 @@
            ],
            "license": "MIT",
            "dependencies": {
                "baseline-browser-mapping": "^2.11.12",
                "caniuse-lite": "^1.0.30001809",
                "electron-to-chromium": "^1.5.402",
                "node-releases": "^2.0.53",
                "update-browserslist-db": "^1.3.0"
                "baseline-browser-mapping": "^2.11.20",
                "caniuse-lite": "^1.0.30001810",
                "electron-to-chromium": "^1.5.420",
                "node-releases": "^2.0.54",
                "update-browserslist-db": "^1.3.2"
            },
            "bin": {
                "browserslist": "cli.js"
@@ -12282,10 +12177,9 @@
            }
        },
        "node_modules/convert-source-map": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
            "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
            "dev": true,
            "version": "1.9.0",
            "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
            "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
            "license": "MIT"
        },
        "node_modules/cookie": {
@@ -13281,9 +13175,9 @@
            "license": "MIT"
        },
        "node_modules/electron-to-chromium": {
            "version": "1.5.420",
            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.420.tgz",
            "integrity": "sha512-2yD6XreGusOfNV+dUcvipJEXc3n/n7fgr7996aszTG+YY5E4mqM4tOq/3uhP129cazL9YHbVWSpc79ePotWtPA==",
            "version": "1.5.424",
            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.424.tgz",
            "integrity": "sha512-rTOe76LHREmnLOWc0NlakB7AlnWjhTNflk4YE3gnIBPbSXLiY+VDEgwYl4wAYdBPD7eq9NQq6TR8lvd9Fls2CA==",
            "dev": true,
            "license": "ISC"
        },
@@ -14580,6 +14474,13 @@
            "dev": true,
            "license": "MIT"
        },
        "node_modules/express/node_modules/path-to-regexp": {
            "version": "0.1.13",
            "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz",
            "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==",
            "dev": true,
            "license": "MIT"
        },
        "node_modules/extract-zip": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
@@ -14775,6 +14676,7 @@
            "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
            "dev": true,
            "license": "MIT",
            "peer": true,
            "dependencies": {
                "flat-cache": "^4.0.0"
            },
@@ -14891,6 +14793,7 @@
            "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
            "dev": true,
            "license": "MIT",
            "peer": true,
            "dependencies": {
                "flatted": "^3.2.9",
                "keyv": "^4.5.4"
@@ -15049,9 +14952,9 @@
            "license": "ISC"
        },
        "node_modules/fsevents": {
            "version": "2.3.2",
            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
            "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
            "version": "2.3.3",
            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
            "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
            "dev": true,
            "hasInstallScript": true,
            "license": "MIT",
@@ -15729,6 +15632,12 @@
                "react-is": "^16.7.0"
            }
        },
        "node_modules/hoist-non-react-statics/node_modules/react-is": {
            "version": "16.13.1",
            "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
            "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
            "license": "MIT"
        },
        "node_modules/hookified": {
            "version": "1.15.1",
            "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz",
@@ -16037,9 +15946,9 @@
            }
        },
        "node_modules/ignore": {
            "version": "7.0.8",
            "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.8.tgz",
            "integrity": "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==",
            "version": "7.0.9",
            "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.9.tgz",
            "integrity": "sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==",
            "devOptional": true,
            "license": "MIT",
            "engines": {
@@ -17724,7 +17633,8 @@
            "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
            "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
            "dev": true,
            "license": "MIT"
            "license": "MIT",
            "peer": true
        },
        "node_modules/json-parse-even-better-errors": {
            "version": "2.3.1",
@@ -17795,6 +17705,7 @@
            "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
            "dev": true,
            "license": "MIT",
            "peer": true,
            "dependencies": {
                "json-buffer": "3.0.1"
            }
@@ -18377,9 +18288,9 @@
            "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==",
            "version": "18.0.12",
            "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.12.tgz",
            "integrity": "sha512-LEm4ga2YeI2T3GVHj9b0BaDPPk93LLTHMFeMyQbNIzPxc8vCI0y/scy0ZA6z6lXKyT9j9Nhl/OC6ZYKYGuFScA==",
            "license": "MIT",
            "bin": {
                "marked": "bin/marked.js"
@@ -18441,9 +18352,9 @@
            }
        },
        "node_modules/mediabunny": {
            "version": "1.55.7",
            "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.55.7.tgz",
            "integrity": "sha512-Sb/vI8frRiDPbPUwl3hz0n69NSe9yt4Nydcv5yxi8Rdgk0BgnujEGjZqE+uCTehFbafcqIu6gDAok8ln98dcqg==",
            "version": "1.56.0",
            "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.56.0.tgz",
            "integrity": "sha512-VLVYEVXI4fA2PabQoZs3XOmxDsio4gpG1Npz0iVICRNCQ+XYI3fBOngnwHljafaEjHUbYzrIDoctZbxcVfQpgQ==",
            "license": "MPL-2.0",
            "workspaces": [
                ".",
@@ -18459,20 +18370,20 @@
            }
        },
        "node_modules/memfs": {
            "version": "4.69.1",
            "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.69.1.tgz",
            "integrity": "sha512-x4Ion23tLmo/6CTNYrKriwACRWlsw5hg+ZDYr4sRriYiZEu04UmK+7ZE/jXjAeDfe2DlL4UIFAVKllqZlWCJ+g==",
            "version": "4.71.0",
            "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.71.0.tgz",
            "integrity": "sha512-Zwrk7TpTXBkic7taZL+2QeppbauG0QOufRsT1zuXDYLW8jCajH0W1VSZ17+I7ODqiNbH9J1Vf1QJCqFlCfurDg==",
            "dev": true,
            "license": "Apache-2.0",
            "dependencies": {
                "@jsonjoy.com/fs-core": "4.69.1",
                "@jsonjoy.com/fs-fsa": "4.69.1",
                "@jsonjoy.com/fs-node": "4.69.1",
                "@jsonjoy.com/fs-node-builtins": "4.69.1",
                "@jsonjoy.com/fs-node-to-fsa": "4.69.1",
                "@jsonjoy.com/fs-node-utils": "4.69.1",
                "@jsonjoy.com/fs-print": "4.69.1",
                "@jsonjoy.com/fs-snapshot": "4.69.1",
                "@jsonjoy.com/fs-core": "4.71.0",
                "@jsonjoy.com/fs-fsa": "4.71.0",
                "@jsonjoy.com/fs-node": "4.71.0",
                "@jsonjoy.com/fs-node-builtins": "4.71.0",
                "@jsonjoy.com/fs-node-to-fsa": "4.71.0",
                "@jsonjoy.com/fs-node-utils": "4.71.0",
                "@jsonjoy.com/fs-print": "4.71.0",
                "@jsonjoy.com/fs-snapshot": "4.71.0",
                "@jsonjoy.com/json-pack": "^1.11.0",
                "@jsonjoy.com/util": "^1.9.0",
                "glob-to-regex.js": "^1.0.1",
@@ -18745,9 +18656,9 @@
            }
        },
        "node_modules/minimizer-webpack-plugin": {
            "version": "5.9.0",
            "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.9.0.tgz",
            "integrity": "sha512-OASqv+dewv8vjkOBjqMOHvxUaXhtGBLZAXq7JbmYE8TSzBvOswiGq5JcBdc8ypuLL/8YUT1OEyupga6/iqdyTA==",
            "version": "5.10.0",
            "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.10.0.tgz",
            "integrity": "sha512-2//60T4S0X1Ug/dqLDOgDaGlZsN1Lv8hf8oB0NOV/KIHSaXlPwXBBIbim79dE2Z7NEs52ES8YHoSv6Lmsk+XNg==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
@@ -19871,10 +19782,9 @@
            }
        },
        "node_modules/path-to-regexp": {
            "version": "0.1.13",
            "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz",
            "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==",
            "dev": true,
            "version": "6.3.0",
            "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
            "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
            "license": "MIT"
        },
        "node_modules/path-type": {
@@ -20079,29 +19989,26 @@
            }
        },
        "node_modules/playwright": {
            "version": "1.62.1",
            "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz",
            "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==",
            "version": "1.63.0",
            "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz",
            "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==",
            "dev": true,
            "license": "Apache-2.0",
            "peer": true,
            "dependencies": {
                "playwright-core": "1.62.1"
                "playwright-core": "1.63.0"
            },
            "bin": {
                "playwright": "cli.js"
            },
            "engines": {
                "node": ">=20"
            },
            "optionalDependencies": {
                "fsevents": "2.3.2"
            }
        },
        "node_modules/playwright-core": {
            "version": "1.62.1",
            "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz",
            "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==",
            "version": "1.63.0",
            "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz",
            "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==",
            "dev": true,
            "license": "Apache-2.0",
            "peer": true,
@@ -20753,9 +20660,9 @@
            "license": "MIT"
        },
        "node_modules/postcss-safe-parser": {
            "version": "7.0.1",
            "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz",
            "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==",
            "version": "7.1.0",
            "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.1.0.tgz",
            "integrity": "sha512-1WzZxRLaAFwEh6Do+zyGpjWV3nGJNxxhuh7Ubu/q1ICImMgZJnLwhoaEpRbG4pJppp2Y1ncL9ffA2f+LhrefQg==",
            "devOptional": true,
            "funding": [
                {
@@ -21029,6 +20936,12 @@
                "react-is": "^16.13.1"
            }
        },
        "node_modules/prop-types/node_modules/react-is": {
            "version": "16.13.1",
            "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
            "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
            "license": "MIT"
        },
        "node_modules/proxy-addr": {
            "version": "2.0.7",
            "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -21375,9 +21288,9 @@
            }
        },
        "node_modules/react-is": {
            "version": "16.13.1",
            "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
            "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
            "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/react-refresh": {
@@ -22064,9 +21977,9 @@
            "license": "MIT"
        },
        "node_modules/sass": {
            "version": "1.103.1",
            "resolved": "https://registry.npmjs.org/sass/-/sass-1.103.1.tgz",
            "integrity": "sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw==",
            "version": "1.104.0",
            "resolved": "https://registry.npmjs.org/sass/-/sass-1.104.0.tgz",
            "integrity": "sha512-btHMApW2bgolvClhRW8AlQJzgI9lUB3pPSofBQQT+E46GWvf9o0TVQ13SYv5riWZVFyPN+JNz3TKW9XhBlc10w==",
            "license": "MIT",
            "dependencies": {
                "chokidar": "^5.0.0",
@@ -22322,18 +22235,18 @@
            }
        },
        "node_modules/seroval": {
            "version": "1.6.4",
            "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.6.4.tgz",
            "integrity": "sha512-LErWMNS2RRFdu2RMA5u/PA59/IWs0XsikyEXGQ2/36iEWFrdG0ABmg17E17cikrv76891kOAMq3TkTFXpwAHXw==",
            "version": "1.6.7",
            "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.6.7.tgz",
            "integrity": "sha512-AeDcLh0yO2SFm9W71essgnSzLV9DI8ZH0x0knXn2DMnUZj728mpLbxjlbB6IqKCmqh8JA3cEqRyGoNkt584JcQ==",
            "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==",
            "version": "1.6.7",
            "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.6.7.tgz",
            "integrity": "sha512-4Nk35ttD3DTDJW4hgw5StsVAPeU6qnDFnULAouw6tQ7oLTV/ICXrWpsXo2EE52eSP2joUMazbVf52mFEcADqRw==",
            "license": "MIT",
            "engines": {
                "node": ">=10"
@@ -22712,6 +22625,17 @@
                "websocket-driver": "^0.7.4"
            }
        },
        "node_modules/sockjs/node_modules/uuid": {
            "version": "8.3.2",
            "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
            "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
            "deprecated": "uuid@10 and below is no longer supported.  For ESM codebases, update to uuid@latest.  For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
            "dev": true,
            "license": "MIT",
            "bin": {
                "uuid": "dist/bin/uuid"
            }
        },
        "node_modules/socks": {
            "version": "2.8.10",
            "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.10.tgz",
@@ -22743,13 +22667,12 @@
            }
        },
        "node_modules/source-map": {
            "version": "0.7.6",
            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
            "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
            "dev": true,
            "version": "0.5.7",
            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
            "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
            "license": "BSD-3-Clause",
            "engines": {
                "node": ">= 12"
                "node": ">=0.10.0"
            }
        },
        "node_modules/source-map-js": {
@@ -24202,20 +24125,20 @@
            }
        },
        "node_modules/tldts-core": {
            "version": "7.4.11",
            "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.11.tgz",
            "integrity": "sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==",
            "version": "7.4.12",
            "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.12.tgz",
            "integrity": "sha512-nYNzS2WRf4QJmjzFFgAxLOBjyBxAGRbCy9PVBPaglcYyYajh40VBn+v5Ngr96ZMc7oM0+aCJdtQnNejvdBnXMQ==",
            "dev": true,
            "license": "MIT"
        },
        "node_modules/tldts-icann": {
            "version": "7.4.11",
            "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-7.4.11.tgz",
            "integrity": "sha512-1p+NDJ7FUYCliESmsQl9EW5Um8JIyFheiy6Y6ZoHho27d+TLAGFa0gMf1VOVy02vNY1aQo6xeKiaGj45+7P+PA==",
            "version": "7.4.12",
            "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-7.4.12.tgz",
            "integrity": "sha512-KYMFombFttNwGKI9GhqlHBn/+QROOk2bvh5p+aVmRSF8VH+YYVS9fEq0ux099jzw0JXmk2yRErCiviveSL/QhA==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "tldts-core": "^7.4.11"
                "tldts-core": "^7.4.12"
            }
        },
        "node_modules/tldts/node_modules/tldts-core": {
@@ -24537,16 +24460,16 @@
            }
        },
        "node_modules/typescript-eslint": {
            "version": "8.69.0",
            "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.69.0.tgz",
            "integrity": "sha512-B3MltX0VqjUBNEe3b3sSuiRbfa6XrfHFtBiPamjT5AsW/dfq+y+bc0wyuS9DxAS1LyzCxRp2+rxzpLUvqM2BvA==",
            "version": "8.70.0",
            "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.70.0.tgz",
            "integrity": "sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==",
            "dev": true,
            "license": "MIT",
            "dependencies": {
                "@typescript-eslint/eslint-plugin": "8.69.0",
                "@typescript-eslint/parser": "8.69.0",
                "@typescript-eslint/typescript-estree": "8.69.0",
                "@typescript-eslint/utils": "8.69.0"
                "@typescript-eslint/eslint-plugin": "8.70.0",
                "@typescript-eslint/parser": "8.70.0",
                "@typescript-eslint/typescript-estree": "8.70.0",
                "@typescript-eslint/utils": "8.70.0"
            },
            "engines": {
                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -24861,14 +24784,16 @@
            }
        },
        "node_modules/uuid": {
            "version": "8.3.2",
            "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
            "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
            "deprecated": "uuid@10 and below is no longer supported.  For ESM codebases, update to uuid@latest.  For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
            "dev": true,
            "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/bin/uuid"
                "uuid": "dist-node/bin/uuid"
            }
        },
        "node_modules/v8-to-istanbul": {
@@ -24886,6 +24811,13 @@
                "node": ">=10.12.0"
            }
        },
        "node_modules/v8-to-istanbul/node_modules/convert-source-map": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
            "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
            "dev": true,
            "license": "MIT"
        },
        "node_modules/validate-npm-package-license": {
            "version": "3.0.4",
            "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
package.json
@@ -16,6 +16,9 @@
        "start": "wp-scripts start"
    },
    "devDependencies": {
        "@dnd-kit/core": "^6.3.1",
        "@dnd-kit/sortable": "^10.0.0",
        "@dnd-kit/utilities": "^3.2.2",
        "@wordpress/scripts": "^34.2.0"
    },
    "dependencies": {
src/_meta/Fields.js
@@ -9,6 +9,7 @@
import UploadField from "./fields/upload-field";
import SelectorField from "./fields/selector-field";
import LocationField from "./fields/location-field.js";
import GroupField from "./fields/group-field";
import { PanelRow } from '@wordpress/components';
const FIELD_MAP = {
@@ -29,7 +30,8 @@
    repeater: RepeaterField,
    upload: UploadField,
    selector: SelectorField,
    location: LocationField
    location: LocationField,
    group: GroupField
};
const OPERATORS = {
src/_meta/SidePanel.js
@@ -10,6 +10,7 @@
  <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"/>
</svg>
);
const SidePanel = ( { postType, metaFields, setMetaFields } ) => {
    const { fields, sections } = window.jvbFieldConfig || {};
src/_meta/fields/date-field.js
@@ -2,22 +2,28 @@
import { DatePicker } from '@wordpress/components';
const DateField = ({field, value, onChange}) => {
    const [ date, setDate ] = useState( new Date() );
    // const [ date, setDate ] = useState( new Date() );
    return (
        <div className="components-base-control" id={field.name}>
            <label className="components-base-control__label">
                { field.label }
            </label>
            <DatePicker
                currentDate={ date }
                currentDate={ toLocalDate(value) }
                onChange={ onChange }
                help={ field.description }
                value={value??''}
            />
            { getDescription(field) }
        </div>
    );
};
const toLocalDate = (value) => {
    if (!value) return null;
    const [year, month, day] = value.split('-').map(Number);
    return new Date(year, month - 1, day);
};
const getDescription = (field) => {
    if (!field.description || field.description.length === 0) return;
    return (
src/_meta/fields/group-field.js
New file
@@ -0,0 +1,31 @@
import Fields from '../Fields';
const GroupField = ({ field, value, onChange }) => {
    const groupValue = value || {};
    const setSubField = (name, subValue) => {
        onChange({ ...groupValue, [name]: subValue });
    };
    return (
        <div className="jvb-group-field" id={field.name}>
            { field.label && (
                <h4 className="components-base-control__label">{ field.label }</h4>
            ) }
            {
                Object.entries(field.fields || {}).map(([name, subfield]) => (
                    <Fields
                        key={name}
                        field={{ ...subfield, name }}
                        value={groupValue[name]}
                        onChange={(v) => setSubField(name, v)}
                        meta={groupValue}
                    />
                ))
            }
            { field.description && <p className="hint">{field.description}</p> }
        </div>
    );
};
export default GroupField;
src/_meta/fields/repeater-field.css
New file
@@ -0,0 +1,3 @@
.jvb-repeater-row { display: flex; align-items: flex-start; gap: 4px; }
.jvb-repeater-row .jvb-repeater-field-body /* your PanelBody wrapper */ { flex: 1; }
.jvb-repeater-drag-handle { cursor: grab; padding: 8px 4px; touch-action: none; }
src/_meta/fields/repeater-field.js
@@ -15,6 +15,7 @@
    Object.fromEntries(Object.entries(fields || {}).map(([name, f]) => [name, f.default ?? '']));
const RepeaterField = ({ field, value, onChange, meta }) => {
    const rows = Array.isArray(value) ? value : [];
    const subFields = field.fields || {};
    const [openIndex, setOpenIndex] = useState(null);
src/_meta/fields/selector-field.js
@@ -12,7 +12,7 @@
    }
    if (subtype === 'taxonomy') {
        // Assumes taxonomy rest_base matches the (unprefixed) taxonomy slug.
        return (search) => addQueryArgs(`/wp/v2/${field.taxonomy}`, { search, per_page: 20 });
        return (search) => addQueryArgs(`/wp/v2/${field.taxonomy}`, { search, per_page: 20, hide_empty: false });
    }
    return (search) => addQueryArgs('/wp/v2/search', { search, type: 'post', subtype: field.post_type, per_page: 20 });
};
@@ -40,6 +40,7 @@
    // Resolve current IDs to labels on mount / value change
    useEffect(() => {
        onInputChange('');
        let cancelled = false;
        if (!ids.length) {
            setTokens([]);
@@ -65,7 +66,6 @@
    const onInputChange = useCallback((search) => {
        setSearch(search);
        if (!search) { setOptions({}); return;}
        apiFetch({ path: buildPath(search) })
            .then((results) => {
@@ -81,7 +81,7 @@
        if (isSingle) {
            onChange(newIds[newIds.length - 1] ?? 0);
        } else {
            onChange(field.max ? newIds.slice(0, field.max) : newIds);
            onChange((field.max ? newIds.slice(0, field.max) : newIds).join(','));
        }
    };
src/meta/block.json
@@ -8,6 +8,9 @@
    "icon": "edit-large",
    "description": "Add a specific field from this content",
    "example": {},
    "attributes": {
        "fieldName": { "type": "string", "default": "" }
    },
    "supports": {
        "align": ["wide", "full"]
    },
src/meta/edit.js
@@ -1,38 +1,51 @@
/**
 * Retrieves the translation of text.
 *
 * @see https://developer.wordpress.org/block-editor/reference-guides/packages/packages-i18n/
 */
import { __ } from '@wordpress/i18n';
import { InspectorControls, useBlockProps } from '@wordpress/block-editor';
import { PanelBody, SelectControl, Placeholder } from '@wordpress/components';
import { useEntityProp } from '@wordpress/core-data';
import { useSelect } from '@wordpress/data';
import Fields from '../_meta/Fields';
/**
 * React hook that is used to mark the block wrapper element.
 * It provides all the necessary props like the class name.
 *
 * @see https://developer.wordpress.org/block-editor/reference-guides/packages/packages-block-editor/#useblockprops
 */
import { useBlockProps } from '@wordpress/block-editor';
const Edit = ({ attributes, setAttributes }) => {
    const { fieldName } = attributes;
    const { fields } = window.jvbFieldConfig || {};
/**
 * Lets webpack process CSS, SASS or SCSS files referenced in JavaScript files.
 * Those files can contain any CSS code that gets applied to the editor.
 *
 * @see https://www.npmjs.com/package/@wordpress/scripts#using-css
 */
import './editor.scss';
/**
 * The edit function describes the structure of your block in the context of the
 * editor. This represents what the editor will render when the block is used.
 *
 * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-edit-save/#edit
 *
 * @return {Element} Element to render.
 */
export default function Edit() {
    return (
        <p { ...useBlockProps() }>
            { __( 'Will output the menu', 'jvb' ) }
        </p>
    const postType = useSelect(
        (select) => select('core/editor').getCurrentPostType(),
        []
    );
}
    const [meta, setMeta] = useEntityProp('postType', postType, 'meta');
    const field = (fields || []).find((f) => f.name === fieldName);
    const blockProps = useBlockProps();
    return (
        <div {...blockProps}>
            <InspectorControls>
                <PanelBody title="Field">
                    <SelectControl
                        label="Meta field"
                        value={fieldName}
                        options={[
                            { label: 'Select a field…', value: '' },
                            ...(fields || []).map((f) => ({ label: f.label || f.name, value: f.name })),
                        ]}
                        onChange={(value) => setAttributes({ fieldName: value })}
                    />
                </PanelBody>
            </InspectorControls>
            { !field && <Placeholder label="Meta Field" instructions="Select a field in the block settings." /> }
            { field && (
                <Fields
                    field={field}
                    value={meta?.[fieldName]}
                    onChange={(value) => setMeta({ ...meta, [fieldName]: value })}
                    meta={meta}
                />
            ) }
        </div>
    );
};
export default Edit;
src/meta/index.js
@@ -1,33 +1,8 @@
/**
 * Registers a new block provided a unique name and an object defining its behavior.
 *
 * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-registration/
 */
import { registerBlockType } from '@wordpress/blocks';
/**
 * Lets webpack process CSS, SASS or SCSS files referenced in JavaScript files.
 * All files containing `style` keyword are bundled together. The code used
 * gets applied both to the front of your site and to the editor.
 *
 * @see https://www.npmjs.com/package/@wordpress/scripts#using-css
 */
import './style.scss';
/**
 * Internal dependencies
 */
import Edit from './edit';
import metadata from './block.json';
/**
 * Every block starts by registering a new block type definition.
 *
 * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-registration/
 */
registerBlockType( metadata.name, {
    /**
     * @see ./edit.js
     */
registerBlockType(metadata, {
    edit: Edit,
} );
    save: () => null, // dynamic/meta-driven, nothing saved to post_content
});