From 4e959dbbaa838e3ff248bc588e7ef01c96051a59 Mon Sep 17 00:00:00 2001 From: Brad Vincent Date: Thu, 7 May 2026 12:51:04 +0100 Subject: [PATCH 1/9] Fix provider model refresh --- build/scripts/admin.asset.php | 2 +- build/scripts/admin.js | 2 +- includes/functions.php | 13 +-- includes/rest/class-settings-controller.php | 33 +++++++ src/js/admin/components/views/SettingsView.js | 89 +------------------ tests/Unit/RestApiTest.php | 37 +++++++- 6 files changed, 75 insertions(+), 101 deletions(-) diff --git a/build/scripts/admin.asset.php b/build/scripts/admin.asset.php index 5d0c291..d3e72d0 100644 --- a/build/scripts/admin.asset.php +++ b/build/scripts/admin.asset.php @@ -1 +1 @@ - array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-core-data', 'wp-data', 'wp-date', 'wp-dom-ready', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-primitives'), 'version' => 'a955a4331ceaf436aed6'); + array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-core-data', 'wp-data', 'wp-date', 'wp-dom-ready', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-primitives'), 'version' => '7f4e58ec2035e3ca96d7'); diff --git a/build/scripts/admin.js b/build/scripts/admin.js index 7f654af..0cad959 100644 --- a/build/scripts/admin.js +++ b/build/scripts/admin.js @@ -181,4 +181,4 @@ label:(0,a.__)("Not on"),filterText:(c,l)=>eB((0,a.sprintf)( /* translators: %d: Number of fields that need attention */ /* translators: %d: Number of fields that need attention */ (0,a._n)("%d field needs attention","%d fields need attention",Z),Z)}):null,R={blockStart:"medium",blockEnd:"medium",inlineStart:"medium",inlineEnd:"medium"};if(l.children){const t=!!l.label&&n.withHeader,b={blockStart:t?"none":"medium",blockEnd:"medium",inlineStart:"medium",inlineEnd:"medium"};return(0,m.jsxs)(wC,{className:"dataforms-layouts-card__field",size:R,children:[t&&(0,m.jsxs)(u,{className:"dataforms-layouts-card__field-header",children:[(0,m.jsx)("span",{className:"dataforms-layouts-card__field-header-label",children:l.label}),H,g.length>0&&n.withHeader&&(0,m.jsx)("div",{className:"dataforms-layouts-card__field-summary",children:g.map(l=>(0,m.jsx)(l.render,{item:c,field:l},l.id))})]}),(i||!t)&&(0,m.jsxs)(_C,{size:b,className:"dataforms-layouts-card__field-control",ref:X,onBlur:s,children:[l.description&&(0,m.jsx)("div",{className:"dataforms-layouts-card__field-description",children:l.description}),(0,m.jsx)(uA,{data:c,form:G,onChange:e,validity:d?.children})]})]})}const I=b.find(c=>c.id===l.id);if(!I||!I.Edit)return null;const r=iA("regular")?.component;if(!r)return null;const B=!!I.label&&n.withHeader,y={blockStart:B?"none":"medium",blockEnd:"medium",inlineStart:"medium",inlineEnd:"medium"};return(0,m.jsxs)(wC,{className:"dataforms-layouts-card__field",size:R,children:[B&&(0,m.jsxs)(u,{className:"dataforms-layouts-card__field-header",children:[(0,m.jsx)("span",{className:"dataforms-layouts-card__field-header-label",children:I.label}),H,g.length>0&&n.withHeader&&(0,m.jsx)("div",{className:"dataforms-layouts-card__field-summary",children:g.map(l=>(0,m.jsx)(l.render,{item:c,field:l},l.id))})]}),(i||!B)&&(0,m.jsx)(_C,{size:y,className:"dataforms-layouts-card__field-control",ref:X,onBlur:s,children:(0,m.jsx)(r,{data:c,field:l,onChange:e,hideLabelFromVision:t||B,validity:d})})]})},wrapper:({children:c})=>(0,m.jsx)(xy,{direction:"column",className:"dataforms-layouts__wrapper",gap:"lg",children:c})},{type:"row",component:function({data:c,field:l,onChange:e,hideLabelFromVision:t,validity:d}){const b=l.layout;if(l.children){const n={layout:Qw,fields:l.children};return(0,m.jsxs)("div",{className:"dataforms-layouts-row__field",children:[!t&&l.label&&(0,m.jsx)(nA,{title:l.label}),(0,m.jsx)(xy,{direction:"row",align:b.alignment,gap:"md",children:(0,m.jsx)(uA,{data:c,form:n,onChange:e,validity:d?.children,as:XA,children:(l,d,n)=>(0,m.jsx)("div",{className:"dataforms-layouts-row__field-control",style:b.styles[d.id],children:(0,m.jsx)(l,{data:c,field:d,onChange:e,hideLabelFromVision:t,validity:n})},d.id)})})]})}const n=iA("regular")?.component;return n?(0,m.jsx)(m.Fragment,{children:(0,m.jsx)("div",{className:"dataforms-layouts-row__field-control",children:(0,m.jsx)(n,{data:c,field:l,onChange:e,validity:d})})}):null},wrapper:({children:c,layout:l})=>(0,m.jsx)(xy,{direction:"column",className:"dataforms-layouts__wrapper",gap:"md",children:(0,m.jsx)("div",{className:"dataforms-layouts-row__field",children:(0,m.jsx)(xy,{direction:"row",gap:"md",align:l.alignment,children:c})})})},{type:"details",component:function({data:c,field:l,onChange:e}){const{fields:t}=(0,W.useContext)(Aw),d=(0,W.useMemo)(()=>({layout:Qw,fields:l.children??[]}),[l]);if(!l.children)return null;const b=l.layout.summary??"",n=b?t.find(c=>c.id===b):void 0;let X;return X=n&&n.render?(0,m.jsx)(n.render,{item:c,field:n}):l.label||(0,a.__)("More details"),(0,m.jsxs)("details",{className:"dataforms-layouts-details__details",children:[(0,m.jsx)("summary",{className:"dataforms-layouts-details__summary",children:X}),(0,m.jsx)("div",{className:"dataforms-layouts-details__content",children:(0,m.jsx)(uA,{data:c,form:d,onChange:e})})]})}}];function iA(c){return GA.find(l=>l.type===c)}var aA=({children:c})=>(0,m.jsx)(xy,{direction:"column",className:"dataforms-layouts__wrapper",gap:"md",children:c});function uA({data:c,form:l,onChange:e,validity:t,children:d,as:b}){const{fields:n}=(0,W.useContext)(Aw),X=b??iA(l.layout.type)?.wrapper??aA;return(0,m.jsx)(X,{layout:l.layout,children:l.fields.map(l=>{const b=iA(l.layout.type)?.component;if(!b)return null;const X=l.children?void 0:(G=l,n.find(c=>c.id===G.id));var G;return X&&X.isVisible&&!X.isVisible(c)?null:d?d(b,l,t?.[l.id]):(0,m.jsx)(b,{data:c,field:l,onChange:e,validity:t?.[l.id]},l.id)})})}function xA({data:c,form:l,fields:e,onChange:t,validity:d}){const b=(0,W.useMemo)(()=>Uw(l),[l]),n=(0,W.useMemo)(()=>Bw(e),[e]);return l.fields?(0,m.jsx)(ww,{fields:n,children:(0,m.jsx)(uA,{data:c,form:b,onChange:t,validity:d})}):null}const oA=window.wp.coreData,sA=window.wp.primitives;var gA=(0,m.jsx)(sA.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,m.jsx)(sA.Path,{d:"M19.5 4.5h-7V6h4.44l-5.97 5.97 1.06 1.06L18 7.06v4.44h1.5v-7Zm-13 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-3H17v3a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h3V5.5h-3Z"})}),mA=(0,m.jsx)(sA.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,m.jsx)(sA.Path,{d:"m19 7-3-3-8.5 8.5-1 4 4-1L19 7Zm-7 11.5H5V20h7v-1.5Z"})}),ZA=(0,m.jsx)(sA.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,m.jsx)(sA.Path,{fillRule:"evenodd",clipRule:"evenodd",d:"M12 5.5A2.25 2.25 0 0 0 9.878 7h4.244A2.251 2.251 0 0 0 12 5.5ZM12 4a3.751 3.751 0 0 0-3.675 3H5v1.5h1.27l.818 8.997a2.75 2.75 0 0 0 2.739 2.501h4.347a2.75 2.75 0 0 0 2.738-2.5L17.73 8.5H19V7h-3.325A3.751 3.751 0 0 0 12 4Zm4.224 4.5H7.776l.806 8.861a1.25 1.25 0 0 0 1.245 1.137h4.347a1.25 1.25 0 0 0 1.245-1.137l.805-8.861Z"})});const HA=[{id:"title",label:(0,a.__)("Title","clawpress"),type:"text",enableHiding:!1,enableSorting:!0,enableGlobalSearch:!0,getValue:({item:c})=>c.title?.rendered||"",render:({item:c})=>(0,m.jsx)("a",{href:c.link,target:"_blank",rel:"noopener noreferrer",children:c.title?.rendered||(0,a.__)("(no title)","clawpress")})},{id:"status",label:(0,a.__)("Status","clawpress"),type:"text",enableHiding:!0,enableSorting:!1,getValue:({item:c})=>c.status,render:({item:c})=>{const l={publish:(0,a.__)("Published","clawpress"),draft:(0,a.__)("Draft","clawpress"),pending:(0,a.__)("Pending","clawpress"),private:(0,a.__)("Private","clawpress"),trash:(0,a.__)("Trash","clawpress")};return(0,m.jsx)("span",{className:`status-badge status-${c.status}`,children:l[c.status]||c.status})}},{id:"date",label:(0,a.__)("Date","clawpress"),type:"text",enableHiding:!0,enableSorting:!0,getValue:({item:c})=>c.date,render:({item:c})=>new Date(c.date).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})},{id:"modified",label:(0,a.__)("Modified","clawpress"),type:"text",enableHiding:!0,enableSorting:!1,getValue:({item:c})=>c.modified,render:({item:c})=>new Date(c.modified).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}];function RA(){const[c,l]=(0,G.useState)({type:"table",perPage:10,page:1,sort:{field:"date",direction:"desc"},search:"",filters:[],fields:["title","status","date"]}),{records:e,total:t,totalPages:d,isLoading:b}=function(c){const{records:l,totalItems:e,totalPages:t,isResolving:d,hasResolved:b}=(0,oA.useEntityRecords)("postType","clawpress_agent_file",{per_page:c.perPage,page:c.page,orderby:"title"===c.sort?.field?"title":"date",order:c.sort?.direction||"desc",search:c.search||void 0,status:"any"});return{records:l||[],total:e||0,totalPages:t||0,isLoading:d,hasResolved:b}}(c);return(0,m.jsxs)("div",{className:"clawpress-dataviews",children:[(0,m.jsx)("p",{children:(0,a.__)("Showing ClawPress Agent Files.","clawpress")}),(0,m.jsx)(Fw,{data:e,fields:HA,view:c,onChangeView:l,actions:[{id:"view",label:(0,a.__)("View","clawpress"),icon:gA,callback:c=>{window.open(c[0].link,"_blank")}},{id:"edit",label:(0,a.__)("Edit","clawpress"),icon:mA,callback:c=>{window.location.href=`/wp-admin/post.php?post=${c[0].id}&action=edit`}},{id:"trash",label:(0,a.__)("Move to Trash","clawpress"),icon:ZA,isDestructive:!0,supportsBulk:!0,RenderModal:({items:c,closeModal:l})=>{const{deleteEntityRecord:e}=(0,rW.useDispatch)(oA.store);return(0,m.jsxs)("div",{children:[(0,m.jsx)("p",{children:1===c.length?(0,a.__)("Move this agent file to trash?","clawpress"):(0,a.sprintf)(/* translators: %d: number of agent files */ /* translators: %d: number of agent files */ -(0,a.__)("Move %d agent files to trash?","clawpress"),c.length)}),(0,m.jsxs)(i.Flex,{justify:"flex-end",gap:2,children:[(0,m.jsx)(i.Button,{variant:"secondary",onClick:l,children:(0,a.__)("Cancel","clawpress")}),(0,m.jsx)(i.Button,{variant:"primary",isDestructive:!0,onClick:async()=>{for(const l of c)await e("postType","clawpress_agent_file",l.id);l()},children:(0,a.__)("Move to Trash","clawpress")})]})]})}}],paginationInfo:{totalItems:t,totalPages:d},isLoading:b,getItemId:c=>c.id,defaultLayouts:{table:{},grid:{}},search:!0})]})}var IA=(0,m.jsx)(sA.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,m.jsx)(sA.Path,{d:"m11.3 17.2-5-5c-.1-.1-.1-.3 0-.4l2.3-2.3-1.1-1-2.3 2.3c-.7.7-.7 1.8 0 2.5l5 5H7.5v1.5h5.3v-5.2h-1.5v2.6zm7.5-6.4-5-5h2.7V4.2h-5.2v5.2h1.5V6.8l5 5c.1.1.1.3 0 .4l-2.3 2.3 1.1 1.1 2.3-2.3c.6-.7.6-1.9-.1-2.5z"})});const rA={provider:"",model:"",temperature:.2,top_p:.9,max_output_tokens:1200,frequency_penalty:.2,presence_penalty:0,request_timeout:45,agent_user_id:0,memory_enabled:!1,setup_completed:!1},WA="clawpress_wp_ai_provider_models_v1",BA=c=>"string"==typeof c?c.trim().toLowerCase():"",yA=c=>"string"==typeof c?c.trim().toLowerCase().replace(/[^a-z0-9]/g,""):"",pA=c=>Array.isArray(c)?c.map(c=>{const l="string"==typeof c?.id?c.id.trim():"";let e="";return"string"==typeof c?.label?e=c.label.trim():"string"==typeof c?.name&&(e=c.name.trim()),l?{id:l,label:e||l}:null}).filter(Boolean):[],hA=()=>[{value:"openai",label:(0,a.__)("OpenAI","clawpress")},{value:"anthropic",label:(0,a.__)("Anthropic","clawpress")},{value:"google",label:(0,a.__)("Google","clawpress")}],VA=async c=>{const l="undefined"!=typeof window&&"string"==typeof window.CLAWPRESS_ADMIN?.restBase?window.CLAWPRESS_ADMIN.restBase:"/wp-json/clawpress/v1",e="undefined"!=typeof window&&"string"==typeof window.CLAWPRESS_ADMIN?.nonce?window.CLAWPRESS_ADMIN.nonce:"",t=`${l.replace(/\/clawpress\/v1\/?$/,"/wp-ai/v1")}/${c.replace(/^\//,"")}`,d=await fetch(t,{method:"GET",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":e}}),b=await d.text();let n=[];if(b)try{n=JSON.parse(b)}catch{n=[]}if(!d.ok)throw new Error("wp_ai_request_failed");return n},YA=()=>{if("undefined"==typeof window||!window.localStorage)return{};try{const c=window.localStorage.getItem(WA);if(!c)return{};const l=JSON.parse(c);return l&&"object"==typeof l&&!Array.isArray(l)?l:{}}catch{return{}}},JA=c=>{if("undefined"!=typeof window&&window.localStorage)try{window.localStorage.setItem(WA,JSON.stringify(c))}catch{}},FA=c=>{if(!Array.isArray(c))return hA();const l=c.map(c=>{const l=BA(c?.value),e="string"==typeof c?.label?c.label.trim():"";return l&&e?{value:l,label:e}:null}).filter(Boolean);return l.length>0?l:hA()},CA=(c,l,e)=>c.filter(c=>{const t=yA(e(c));return t&&l&&(l.startsWith(t)||t.startsWith(l))}).sort((c,l)=>yA(e(l)).length-yA(e(c)).length)[0]||null;function vA(){const[c,l]=(0,G.useState)(!0),[e,t]=(0,G.useState)(!1),[d,b]=(0,G.useState)(""),[n,X]=(0,G.useState)(""),[u,x]=(0,G.useState)(rA),[o,s]=(0,G.useState)(hA()),[Z,H]=(0,G.useState)({}),[R,I]=(0,G.useState)({}),[r,W]=(0,G.useState)({});(0,G.useEffect)(()=>{let c=!0;return(async()=>{l(!0),b("");try{const l=await g("settings");if(!c)return;x(((c={})=>({provider:"string"==typeof c.provider?c.provider:"",model:"string"==typeof c.model?c.model:"",temperature:Number.isFinite(Number(c.temperature))?Number(c.temperature):.2,top_p:Number.isFinite(Number(c.top_p))?Number(c.top_p):.9,max_output_tokens:Number.isFinite(Number(c.max_output_tokens))&&Number(c.max_output_tokens)>0?Number(c.max_output_tokens):1200,frequency_penalty:Number.isFinite(Number(c.frequency_penalty))?Number(c.frequency_penalty):.2,presence_penalty:Number.isFinite(Number(c.presence_penalty))?Number(c.presence_penalty):0,request_timeout:Number.isFinite(Number(c.request_timeout))&&Number(c.request_timeout)>0?Number(c.request_timeout):45,agent_user_id:Number.isFinite(Number(c.agent_user_id))?Number(c.agent_user_id):0,memory_enabled:Boolean(c.memory_enabled),setup_completed:Boolean(c.setup_completed)}))(l?.settings||{})),s(FA(l?.providers||[])),H(!(t=l?.models||{})||"object"!=typeof t||Array.isArray(t)?{}:Object.entries(t).reduce((c,[l,e])=>{const t=BA(l);return t&&Array.isArray(e)?(c[t]=pA(e),c):c},{})),I(!(e=l?.model_catalog||{})||"object"!=typeof e||Array.isArray(e)?{}:Object.entries(e).reduce((c,[l,e])=>{const t=BA(l);if(!t||!Array.isArray(e))return c;const d=e.map(c=>{const l="string"==typeof c?.id?c.id.trim():"",e="string"==typeof c?.label?c.label.trim():"",t="string"==typeof c?.context?c.context.trim():"",d="string"==typeof c?.cost?c.cost.trim():"";return l?{id:l,label:e||l,context:t,cost:d}:null}).filter(Boolean);return d.length>0&&(c[t]=d),c},{}));const d=await(async()=>{let c=[];try{c=await VA("providers")}catch{return null}if(!Array.isArray(c)||0===c.length)return null;const l=c.map(c=>{const l=BA(c?.id),e="string"==typeof c?.name?c.name.trim():l;return l?{value:l,label:e||l}:null}).filter(Boolean);return l.length>0?l:null})();if(!c||!d)return;s(FA(d))}catch(l){if(!c)return;b(l?.message||(0,a.__)("Unable to load settings.","clawpress"))}finally{c&&l(!1)}var e,t})(),()=>{c=!1}},[]);const B=(0,G.useCallback)(async(c,{forceRefresh:l=!1}={})=>{const e=BA(c);if(!e)return[];if(!l){const c=(c=>{const l=BA(c);if(!l)return{hasValue:!1,options:[]};const e=YA()[l];return Array.isArray(e)?{hasValue:!0,options:pA(e)}:e&&"object"==typeof e&&Array.isArray(e.models)?{hasValue:!0,options:pA(e.models)}:{hasValue:!1,options:[]}})(e);if(c.hasValue)return H(l=>({...l,[e]:c.options})),c.options}W(c=>({...c,[e]:!0}));try{const c=await(async c=>{const l=BA(c);if(!l)return[];const e=await VA(`providers/${encodeURIComponent(l)}/models`);return Array.isArray(e)?pA(e):[]})(e);return H(l=>({...l,[e]:c})),((c,l)=>{const e=BA(c);if(!e)return;const t=YA();t[e]={cached_at:Date.now(),models:pA(l)},JA(t)})(e,c),c}catch{return b((0,a.__)("Unable to refresh models for the selected provider.","clawpress")),[]}finally{W(c=>({...c,[e]:!1}))}},[]),y=BA(u.provider),p=Boolean(r?.[y]),h=(0,G.useMemo)(()=>Array.isArray(Z?.[y])?Z[y]:[],[y,Z]),V=(0,G.useMemo)(()=>{const c="string"==typeof u.model?u.model.trim():"";return c?h.some(l=>l.id===c)?null:{id:c,label:c}:null},[h,u.model]);(0,G.useEffect)(()=>{y&&B(y)},[y,B]);const Y=(0,G.useMemo)(()=>[{label:(0,a.__)("Select a model","clawpress"),value:""},...V?[{label:V.label,value:V.id}]:[],...h.map(c=>({label:c.label,value:c.id}))],[h,V]),J=((c,l,e,t)=>{const d="string"==typeof l?l.trim():"";if(!d)return{selectedEntry:null,modelId:d};const b=BA(c),n=b&&Array.isArray(e?.[b])?e[b]:[],X=Array.isArray(t?.[b])?t[b]:[],G=n.find(c=>c.id===d)||null;return{selectedEntry:((c,l,e="")=>{if(!Array.isArray(c)||0===c.length)return null;const t="string"==typeof l?l.trim():"",d=c.find(c=>c.id===t)||null;if(d)return d;const b=yA(t),n=c.find(c=>yA(c.id)===b)||null;if(n)return n;const X=CA(c,b,c=>c.id);if(X)return X;const G=yA(e);return G?c.find(c=>yA(c.label)===G)||CA(c,G,c=>c.label):null})(X,d,G?.label||"")||null,modelId:d}})(u.provider,u.model,Z,R);let F=null;if(J.modelId){const c=J.selectedEntry?.context||"",l=J.selectedEntry?.cost||"";F=(0,m.jsxs)("span",{className:"clawpress-settings__model-meta",children:[(0,m.jsx)("code",{children:J.modelId}),c?(0,m.jsxs)(m.Fragment,{children:[" ",(0,a.__)("Context Size :","clawpress")," ",(0,m.jsx)("code",{children:c})]}):null,l?(0,m.jsxs)(m.Fragment,{children:[" ",(0,a.__)("Cost :","clawpress")," ",(0,m.jsx)("code",{children:l})]}):null]})}const C=[{id:"provider",type:"text",label:(0,a.__)("Provider","clawpress"),description:(0,a.__)("Choose which AI service ClawPress should use.","clawpress"),Edit:"select",elements:[{label:(0,a.__)("Select a provider","clawpress"),value:""},...o]},{id:"model",type:"text",label:(0,a.__)("Model","clawpress"),description:F,Edit:"select",elements:Y},{id:"temperature",type:"number",label:(0,a.__)("Temperature","clawpress"),description:(0,a.__)("Lower values make replies more focused and consistent. Higher values make replies more creative and varied.","clawpress")},{id:"top_p",type:"number",label:(0,a.__)("Top P","clawpress"),description:(0,a.__)("Lower values keep replies more predictable. Higher values allow more variety in wording and ideas.","clawpress")},{id:"max_output_tokens",type:"integer",label:(0,a.__)("Max Output Tokens","clawpress"),description:(0,a.__)("Sets the maximum reply length. Higher values allow longer answers; lower values keep answers shorter.","clawpress")},{id:"frequency_penalty",type:"number",label:(0,a.__)("Frequency Penalty","clawpress"),description:(0,a.__)("Higher values reduce repeated words and phrases. Lower values allow more repetition.","clawpress")},{id:"presence_penalty",type:"number",label:(0,a.__)("Presence Penalty","clawpress"),description:(0,a.__)("Higher values encourage fresh ideas. Lower values keep replies closer to what has already been said.","clawpress")},{id:"request_timeout",type:"integer",label:(0,a.__)("Request Timeout (seconds)","clawpress"),description:(0,a.__)("How long ClawPress waits for a reply before stopping the request.","clawpress")},{id:"agent_user_id",type:"integer",label:(0,a.__)("Agent User ID","clawpress"),description:(0,a.__)("Use 0 if this is not configured yet.","clawpress")},{id:"memory_enabled",type:"boolean",label:(0,a.__)("Enable Memory","clawpress"),description:(0,a.__)("When enabled, ClawPress can remember useful details from earlier chats.","clawpress"),Edit:"toggle"},{id:"setup_completed",type:"boolean",label:(0,a.__)("Setup Completed","clawpress"),description:(0,a.__)("Turn this on after you finish the initial setup.","clawpress"),Edit:"toggle"}],v={layout:{type:"regular",labelPosition:"top"},fields:["provider","model","request_timeout","agent_user_id","memory_enabled","setup_completed",{id:"generation_settings",label:(0,a.__)("LLM Reply Settings","clawpress"),description:(0,a.__)("Not all settings are supported by every provider or model. Unsupported settings are skipped automatically.","clawpress"),layout:{type:"card",isOpened:!0,withHeader:!0},children:["temperature","top_p","max_output_tokens","frequency_penalty","presence_penalty"]}]};return(0,m.jsx)("div",{className:"clawpress-settings",children:(0,m.jsxs)(i.Card,{children:[(0,m.jsx)(i.CardHeader,{children:(0,m.jsx)("h3",{children:(0,a.__)("Settings","clawpress")})}),(0,m.jsxs)(i.CardBody,{children:[d?(0,m.jsx)(i.Notice,{status:"error",isDismissible:!1,children:d}):null,n?(0,m.jsx)(i.Notice,{status:"success",isDismissible:!1,children:n}):null,c?(0,m.jsx)(i.Spinner,{}):(0,m.jsxs)("div",{children:[(0,m.jsx)(xA,{data:u,fields:C,form:v,onChange:c=>x(l=>{const e={...l,...c};if(Object.prototype.hasOwnProperty.call(c,"provider")){const c=BA(e.provider);(Array.isArray(Z?.[c])?Z[c]:[]).some(c=>c.id===e.model)||(e.model="")}return e})}),(0,m.jsxs)("div",{className:"clawpress-settings__actions",children:[(0,m.jsx)(i.Button,{className:"clawpress-settings__save-button",variant:"primary",onClick:async()=>{t(!0),b(""),X("");try{await g("settings",{method:"POST",body:{provider:u.provider,model:u.model,temperature:Number.isFinite(Number(u.temperature))?Number(u.temperature):.2,top_p:Number.isFinite(Number(u.top_p))?Number(u.top_p):.9,max_output_tokens:Number.isFinite(Number(u.max_output_tokens))&&Number(u.max_output_tokens)>0?Number(u.max_output_tokens):1200,frequency_penalty:Number.isFinite(Number(u.frequency_penalty))?Number(u.frequency_penalty):.2,presence_penalty:Number.isFinite(Number(u.presence_penalty))?Number(u.presence_penalty):0,request_timeout:Number.isFinite(Number(u.request_timeout))&&Number(u.request_timeout)>0?Number(u.request_timeout):45,agent_user_id:Number.isFinite(Number(u.agent_user_id))&&Number(u.agent_user_id)>0?Number(u.agent_user_id):0,memory_enabled:Boolean(u.memory_enabled),setup_completed:Boolean(u.setup_completed)}}),X((0,a.__)("Settings saved.","clawpress"))}catch(c){b(c?.message||(0,a.__)("Unable to save settings.","clawpress"))}finally{t(!1)}},isBusy:e,disabled:e,children:e?(0,a.__)("Saving…","clawpress"):(0,a.__)("Save Settings","clawpress")}),(0,m.jsx)(i.Button,{className:"clawpress-settings__refresh-models-button",variant:"secondary",icon:IA,onClick:async()=>{y&&(b(""),(c=>{const l=BA(c);if(!l)return;const e=YA();delete e[l],JA(e)})(y),await B(y,{forceRefresh:!0}))},isBusy:p,disabled:!y||p||e,children:(0,a.__)("Refresh Models","clawpress")})]})]})]})]})})}function NA(){const{currentView:c,handleTabSelect:l,VIEWS:e}=s(),t=[{name:e.PAGES,title:(0,a.__)("Agent Files","clawpress"),content:(0,m.jsx)(RA,{})},{name:e.SETTINGS,title:(0,a.__)("Settings","clawpress"),content:(0,m.jsx)(vA,{})},{name:e.ABILITIES,title:(0,a.__)("Abilities","clawpress"),content:(0,m.jsx)(r,{})}];return(0,m.jsx)("div",{className:"clawpress-app",children:(0,m.jsx)(i.TabPanel,{tabs:t,initialTabName:c,onSelect:l,children:({content:c})=>(0,m.jsx)("div",{className:"clawpress-tab-content",children:c})})})}X()(()=>{const c=document.getElementById("clawpress-admin-root");c&&(0,G.createRoot)(c).render((0,m.jsx)(NA,{}))})},744(c){"use strict";var l=function(c){return function(c){return!!c&&"object"==typeof c}(c)&&!function(c){var l=Object.prototype.toString.call(c);return"[object RegExp]"===l||"[object Date]"===l||function(c){return c.$$typeof===e}(c)}(c)},e="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function t(c,l){return!1!==l.clone&&l.isMergeableObject(c)?X((e=c,Array.isArray(e)?[]:{}),c,l):c;var e}function d(c,l,e){return c.concat(l).map(function(c){return t(c,e)})}function b(c){return Object.keys(c).concat(function(c){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(c).filter(function(l){return Object.propertyIsEnumerable.call(c,l)}):[]}(c))}function n(c,l){try{return l in c}catch(c){return!1}}function X(c,e,G){(G=G||{}).arrayMerge=G.arrayMerge||d,G.isMergeableObject=G.isMergeableObject||l,G.cloneUnlessOtherwiseSpecified=t;var i=Array.isArray(e);return i===Array.isArray(c)?i?G.arrayMerge(c,e,G):function(c,l,e){var d={};return e.isMergeableObject(c)&&b(c).forEach(function(l){d[l]=t(c[l],e)}),b(l).forEach(function(b){(function(c,l){return n(c,l)&&!(Object.hasOwnProperty.call(c,l)&&Object.propertyIsEnumerable.call(c,l))})(c,b)||(n(c,b)&&e.isMergeableObject(l[b])?d[b]=function(c,l){if(!l.customMerge)return X;var e=l.customMerge(c);return"function"==typeof e?e:X}(b,e)(c[b],l[b],e):d[b]=t(l[b],e))}),d}(c,e,G):t(e,G)}X.all=function(c,l){if(!Array.isArray(c))throw new Error("first argument should be an array");return c.reduce(function(c,e){return X(c,e,l)},{})};var G=X;c.exports=G},252(c){"use strict";c.exports=function c(l,e){if(l===e)return!0;if(l&&e&&"object"==typeof l&&"object"==typeof e){if(l.constructor!==e.constructor)return!1;var t,d,b;if(Array.isArray(l)){if((t=l.length)!=e.length)return!1;for(d=t;0!==d--;)if(!c(l[d],e[d]))return!1;return!0}if(l instanceof Map&&e instanceof Map){if(l.size!==e.size)return!1;for(d of l.entries())if(!e.has(d[0]))return!1;for(d of l.entries())if(!c(d[1],e.get(d[0])))return!1;return!0}if(l instanceof Set&&e instanceof Set){if(l.size!==e.size)return!1;for(d of l.entries())if(!e.has(d[0]))return!1;return!0}if(ArrayBuffer.isView(l)&&ArrayBuffer.isView(e)){if((t=l.length)!=e.length)return!1;for(d=t;0!==d--;)if(l[d]!==e[d])return!1;return!0}if(l.constructor===RegExp)return l.source===e.source&&l.flags===e.flags;if(l.valueOf!==Object.prototype.valueOf)return l.valueOf()===e.valueOf();if(l.toString!==Object.prototype.toString)return l.toString()===e.toString();if((t=(b=Object.keys(l)).length)!==Object.keys(e).length)return!1;for(d=t;0!==d--;)if(!Object.prototype.hasOwnProperty.call(e,b[d]))return!1;for(d=t;0!==d--;){var n=b[d];if(!c(l[n],e[n]))return!1}return!0}return l!=l&&e!=e}},542(c){c.exports=function(c){var l={};function e(t){if(l[t])return l[t].exports;var d=l[t]={exports:{},id:t,loaded:!1};return c[t].call(d.exports,d,d.exports,e),d.loaded=!0,d.exports}return e.m=c,e.c=l,e.p="",e(0)}([function(c,l,e){c.exports=e(1)},function(c,l,e){"use strict";Object.defineProperty(l,"__esModule",{value:!0});var t=e(2);Object.defineProperty(l,"combineChunks",{enumerable:!0,get:function(){return t.combineChunks}}),Object.defineProperty(l,"fillInChunks",{enumerable:!0,get:function(){return t.fillInChunks}}),Object.defineProperty(l,"findAll",{enumerable:!0,get:function(){return t.findAll}}),Object.defineProperty(l,"findChunks",{enumerable:!0,get:function(){return t.findChunks}})},function(c,l){"use strict";Object.defineProperty(l,"__esModule",{value:!0}),l.findAll=function(c){var l=c.autoEscape,b=c.caseSensitive,n=void 0!==b&&b,X=c.findChunks,G=void 0===X?t:X,i=c.sanitize,a=c.searchWords,u=c.textToHighlight;return d({chunksToHighlight:e({chunks:G({autoEscape:l,caseSensitive:n,sanitize:i,searchWords:a,textToHighlight:u})}),totalLength:u?u.length:0})};var e=l.combineChunks=function(c){var l=c.chunks;return l.sort(function(c,l){return c.start-l.start}).reduce(function(c,l){if(0===c.length)return[l];var e=c.pop();if(l.startG&&c.push({highlight:!1,start:G,end:i}),n.index===b.lastIndex&&b.lastIndex++}return c},[])};l.findChunks=t;var d=l.fillInChunks=function(c){var l=c.chunksToHighlight,e=c.totalLength,t=[],d=function(c,l,e){l-c>0&&t.push({start:c,end:l,highlight:e})};if(0===l.length)d(0,e,!1);else{var b=0;l.forEach(function(c){d(b,c.start,!1),d(c.start,c.end,!0),b=c.end}),d(b,e,!1)}return t};function b(c){return c}}])},146(c,l,e){"use strict";var t=e(363),d={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},b={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},n={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},X={};function G(c){return t.isMemo(c)?n:X[c.$$typeof]||d}X[t.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},X[t.Memo]=n;var i=Object.defineProperty,a=Object.getOwnPropertyNames,u=Object.getOwnPropertySymbols,x=Object.getOwnPropertyDescriptor,o=Object.getPrototypeOf,s=Object.prototype;c.exports=function c(l,e,t){if("string"!=typeof e){if(s){var d=o(e);d&&d!==s&&c(l,d,t)}var n=a(e);u&&(n=n.concat(u(e)));for(var X=G(l),g=G(e),m=0;m{if(!e){var n=1/0;for(a=0;a=d)&&Object.keys(b.O).every(c=>b.O[c](e[G]))?e.splice(G--,1):(X=!1,d0&&c[a-1][2]>d;a--)c[a]=c[a-1];c[a]=[e,t,d]},b.n=c=>{var l=c&&c.__esModule?()=>c.default:()=>c;return b.d(l,{a:l}),l},e=Object.getPrototypeOf?c=>Object.getPrototypeOf(c):c=>c.__proto__,b.t=function(c,t){if(1&t&&(c=this(c)),8&t)return c;if("object"==typeof c&&c){if(4&t&&c.__esModule)return c;if(16&t&&"function"==typeof c.then)return c}var d=Object.create(null);b.r(d);var n={};l=l||[null,e({}),e([]),e(e)];for(var X=2&t&&c;("object"==typeof X||"function"==typeof X)&&!~l.indexOf(X);X=e(X))Object.getOwnPropertyNames(X).forEach(l=>n[l]=()=>c[l]);return n.default=()=>c,b.d(d,n),d},b.d=(c,l)=>{for(var e in l)b.o(l,e)&&!b.o(c,e)&&Object.defineProperty(c,e,{enumerable:!0,get:l[e]})},b.o=(c,l)=>Object.prototype.hasOwnProperty.call(c,l),b.r=c=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(c,"__esModule",{value:!0})},(()=>{var c={884:0,15:0};b.O.j=l=>0===c[l];var l=(l,e)=>{var t,d,[n,X,G]=e,i=0;if(n.some(l=>0!==c[l])){for(t in X)b.o(X,t)&&(b.m[t]=X[t]);if(G)var a=G(b)}for(l&&l(e);ib(71));n=b.O(n)})(); \ No newline at end of file +(0,a.__)("Move %d agent files to trash?","clawpress"),c.length)}),(0,m.jsxs)(i.Flex,{justify:"flex-end",gap:2,children:[(0,m.jsx)(i.Button,{variant:"secondary",onClick:l,children:(0,a.__)("Cancel","clawpress")}),(0,m.jsx)(i.Button,{variant:"primary",isDestructive:!0,onClick:async()=>{for(const l of c)await e("postType","clawpress_agent_file",l.id);l()},children:(0,a.__)("Move to Trash","clawpress")})]})]})}}],paginationInfo:{totalItems:t,totalPages:d},isLoading:b,getItemId:c=>c.id,defaultLayouts:{table:{},grid:{}},search:!0})]})}var IA=(0,m.jsx)(sA.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,m.jsx)(sA.Path,{d:"m11.3 17.2-5-5c-.1-.1-.1-.3 0-.4l2.3-2.3-1.1-1-2.3 2.3c-.7.7-.7 1.8 0 2.5l5 5H7.5v1.5h5.3v-5.2h-1.5v2.6zm7.5-6.4-5-5h2.7V4.2h-5.2v5.2h1.5V6.8l5 5c.1.1.1.3 0 .4l-2.3 2.3 1.1 1.1 2.3-2.3c.6-.7.6-1.9-.1-2.5z"})});const rA={provider:"",model:"",temperature:.2,top_p:.9,max_output_tokens:1200,frequency_penalty:.2,presence_penalty:0,request_timeout:45,agent_user_id:0,memory_enabled:!1,setup_completed:!1},WA="clawpress_wp_ai_provider_models_v1",BA=c=>"string"==typeof c?c.trim().toLowerCase():"",yA=c=>"string"==typeof c?c.trim().toLowerCase().replace(/[^a-z0-9]/g,""):"",pA=c=>Array.isArray(c)?c.map(c=>{const l="string"==typeof c?.id?c.id.trim():"";let e="";return"string"==typeof c?.label?e=c.label.trim():"string"==typeof c?.name&&(e=c.name.trim()),l?{id:l,label:e||l}:null}).filter(Boolean):[],hA=()=>[{value:"openai",label:(0,a.__)("OpenAI","clawpress")},{value:"anthropic",label:(0,a.__)("Anthropic","clawpress")},{value:"google",label:(0,a.__)("Google","clawpress")}],VA=()=>{if("undefined"==typeof window||!window.localStorage)return{};try{const c=window.localStorage.getItem(WA);if(!c)return{};const l=JSON.parse(c);return l&&"object"==typeof l&&!Array.isArray(l)?l:{}}catch{return{}}},YA=c=>{if("undefined"!=typeof window&&window.localStorage)try{window.localStorage.setItem(WA,JSON.stringify(c))}catch{}},JA=(c,l,e)=>c.filter(c=>{const t=yA(e(c));return t&&l&&(l.startsWith(t)||t.startsWith(l))}).sort((c,l)=>yA(e(l)).length-yA(e(c)).length)[0]||null;function FA(){const[c,l]=(0,G.useState)(!0),[e,t]=(0,G.useState)(!1),[d,b]=(0,G.useState)(""),[n,X]=(0,G.useState)(""),[u,x]=(0,G.useState)(rA),[o,s]=(0,G.useState)(hA()),[Z,H]=(0,G.useState)({}),[R,I]=(0,G.useState)({}),[r,W]=(0,G.useState)({});(0,G.useEffect)(()=>{let c=!0;return(async()=>{l(!0),b("");try{const l=await g("settings");if(!c)return;x(((c={})=>({provider:"string"==typeof c.provider?c.provider:"",model:"string"==typeof c.model?c.model:"",temperature:Number.isFinite(Number(c.temperature))?Number(c.temperature):.2,top_p:Number.isFinite(Number(c.top_p))?Number(c.top_p):.9,max_output_tokens:Number.isFinite(Number(c.max_output_tokens))&&Number(c.max_output_tokens)>0?Number(c.max_output_tokens):1200,frequency_penalty:Number.isFinite(Number(c.frequency_penalty))?Number(c.frequency_penalty):.2,presence_penalty:Number.isFinite(Number(c.presence_penalty))?Number(c.presence_penalty):0,request_timeout:Number.isFinite(Number(c.request_timeout))&&Number(c.request_timeout)>0?Number(c.request_timeout):45,agent_user_id:Number.isFinite(Number(c.agent_user_id))?Number(c.agent_user_id):0,memory_enabled:Boolean(c.memory_enabled),setup_completed:Boolean(c.setup_completed)}))(l?.settings||{})),s((c=>{if(!Array.isArray(c))return hA();const l=c.map(c=>{const l=BA(c?.value),e="string"==typeof c?.label?c.label.trim():"";return l&&e?{value:l,label:e}:null}).filter(Boolean);return l.length>0?l:hA()})(l?.providers||[])),H(!(t=l?.models||{})||"object"!=typeof t||Array.isArray(t)?{}:Object.entries(t).reduce((c,[l,e])=>{const t=BA(l);return t&&Array.isArray(e)?(c[t]=pA(e),c):c},{})),I(!(e=l?.model_catalog||{})||"object"!=typeof e||Array.isArray(e)?{}:Object.entries(e).reduce((c,[l,e])=>{const t=BA(l);if(!t||!Array.isArray(e))return c;const d=e.map(c=>{const l="string"==typeof c?.id?c.id.trim():"",e="string"==typeof c?.label?c.label.trim():"",t="string"==typeof c?.context?c.context.trim():"",d="string"==typeof c?.cost?c.cost.trim():"";return l?{id:l,label:e||l,context:t,cost:d}:null}).filter(Boolean);return d.length>0&&(c[t]=d),c},{}))}catch(l){if(!c)return;b(l?.message||(0,a.__)("Unable to load settings.","clawpress"))}finally{c&&l(!1)}var e,t})(),()=>{c=!1}},[]);const B=(0,G.useCallback)(async(c,{forceRefresh:l=!1}={})=>{const e=BA(c);if(!e)return[];if(!l){const c=(c=>{const l=BA(c);if(!l)return{hasValue:!1,options:[]};const e=VA()[l];return Array.isArray(e)?{hasValue:!0,options:pA(e)}:e&&"object"==typeof e&&Array.isArray(e.models)?{hasValue:!0,options:pA(e.models)}:{hasValue:!1,options:[]}})(e);if(c.hasValue)return H(l=>({...l,[e]:c.options})),c.options}W(c=>({...c,[e]:!0}));try{const c=await(async c=>{const l=BA(c);if(!l)return[];const e=await g(`providers/${encodeURIComponent(l)}/models`);return Array.isArray(e)?pA(e):[]})(e);return H(l=>({...l,[e]:c})),((c,l)=>{const e=BA(c);if(!e)return;const t=VA();t[e]={cached_at:Date.now(),models:pA(l)},YA(t)})(e,c),c}catch{return b((0,a.__)("Unable to refresh models for the selected provider.","clawpress")),[]}finally{W(c=>({...c,[e]:!1}))}},[]),y=BA(u.provider),p=Boolean(r?.[y]),h=(0,G.useMemo)(()=>Array.isArray(Z?.[y])?Z[y]:[],[y,Z]),V=(0,G.useMemo)(()=>{const c="string"==typeof u.model?u.model.trim():"";return c?h.some(l=>l.id===c)?null:{id:c,label:c}:null},[h,u.model]);(0,G.useEffect)(()=>{y&&B(y)},[y,B]);const Y=(0,G.useMemo)(()=>[{label:(0,a.__)("Select a model","clawpress"),value:""},...V?[{label:V.label,value:V.id}]:[],...h.map(c=>({label:c.label,value:c.id}))],[h,V]),J=((c,l,e,t)=>{const d="string"==typeof l?l.trim():"";if(!d)return{selectedEntry:null,modelId:d};const b=BA(c),n=b&&Array.isArray(e?.[b])?e[b]:[],X=Array.isArray(t?.[b])?t[b]:[],G=n.find(c=>c.id===d)||null;return{selectedEntry:((c,l,e="")=>{if(!Array.isArray(c)||0===c.length)return null;const t="string"==typeof l?l.trim():"",d=c.find(c=>c.id===t)||null;if(d)return d;const b=yA(t),n=c.find(c=>yA(c.id)===b)||null;if(n)return n;const X=JA(c,b,c=>c.id);if(X)return X;const G=yA(e);return G?c.find(c=>yA(c.label)===G)||JA(c,G,c=>c.label):null})(X,d,G?.label||"")||null,modelId:d}})(u.provider,u.model,Z,R);let F=null;if(J.modelId){const c=J.selectedEntry?.context||"",l=J.selectedEntry?.cost||"";F=(0,m.jsxs)("span",{className:"clawpress-settings__model-meta",children:[(0,m.jsx)("code",{children:J.modelId}),c?(0,m.jsxs)(m.Fragment,{children:[" ",(0,a.__)("Context Size :","clawpress")," ",(0,m.jsx)("code",{children:c})]}):null,l?(0,m.jsxs)(m.Fragment,{children:[" ",(0,a.__)("Cost :","clawpress")," ",(0,m.jsx)("code",{children:l})]}):null]})}const C=[{id:"provider",type:"text",label:(0,a.__)("Provider","clawpress"),description:(0,a.__)("Choose which AI service ClawPress should use.","clawpress"),Edit:"select",elements:[{label:(0,a.__)("Select a provider","clawpress"),value:""},...o]},{id:"model",type:"text",label:(0,a.__)("Model","clawpress"),description:F,Edit:"select",elements:Y},{id:"temperature",type:"number",label:(0,a.__)("Temperature","clawpress"),description:(0,a.__)("Lower values make replies more focused and consistent. Higher values make replies more creative and varied.","clawpress")},{id:"top_p",type:"number",label:(0,a.__)("Top P","clawpress"),description:(0,a.__)("Lower values keep replies more predictable. Higher values allow more variety in wording and ideas.","clawpress")},{id:"max_output_tokens",type:"integer",label:(0,a.__)("Max Output Tokens","clawpress"),description:(0,a.__)("Sets the maximum reply length. Higher values allow longer answers; lower values keep answers shorter.","clawpress")},{id:"frequency_penalty",type:"number",label:(0,a.__)("Frequency Penalty","clawpress"),description:(0,a.__)("Higher values reduce repeated words and phrases. Lower values allow more repetition.","clawpress")},{id:"presence_penalty",type:"number",label:(0,a.__)("Presence Penalty","clawpress"),description:(0,a.__)("Higher values encourage fresh ideas. Lower values keep replies closer to what has already been said.","clawpress")},{id:"request_timeout",type:"integer",label:(0,a.__)("Request Timeout (seconds)","clawpress"),description:(0,a.__)("How long ClawPress waits for a reply before stopping the request.","clawpress")},{id:"agent_user_id",type:"integer",label:(0,a.__)("Agent User ID","clawpress"),description:(0,a.__)("Use 0 if this is not configured yet.","clawpress")},{id:"memory_enabled",type:"boolean",label:(0,a.__)("Enable Memory","clawpress"),description:(0,a.__)("When enabled, ClawPress can remember useful details from earlier chats.","clawpress"),Edit:"toggle"},{id:"setup_completed",type:"boolean",label:(0,a.__)("Setup Completed","clawpress"),description:(0,a.__)("Turn this on after you finish the initial setup.","clawpress"),Edit:"toggle"}],v={layout:{type:"regular",labelPosition:"top"},fields:["provider","model","request_timeout","agent_user_id","memory_enabled","setup_completed",{id:"generation_settings",label:(0,a.__)("LLM Reply Settings","clawpress"),description:(0,a.__)("Not all settings are supported by every provider or model. Unsupported settings are skipped automatically.","clawpress"),layout:{type:"card",isOpened:!0,withHeader:!0},children:["temperature","top_p","max_output_tokens","frequency_penalty","presence_penalty"]}]};return(0,m.jsx)("div",{className:"clawpress-settings",children:(0,m.jsxs)(i.Card,{children:[(0,m.jsx)(i.CardHeader,{children:(0,m.jsx)("h3",{children:(0,a.__)("Settings","clawpress")})}),(0,m.jsxs)(i.CardBody,{children:[d?(0,m.jsx)(i.Notice,{status:"error",isDismissible:!1,children:d}):null,n?(0,m.jsx)(i.Notice,{status:"success",isDismissible:!1,children:n}):null,c?(0,m.jsx)(i.Spinner,{}):(0,m.jsxs)("div",{children:[(0,m.jsx)(xA,{data:u,fields:C,form:v,onChange:c=>x(l=>{const e={...l,...c};if(Object.prototype.hasOwnProperty.call(c,"provider")){const c=BA(e.provider);(Array.isArray(Z?.[c])?Z[c]:[]).some(c=>c.id===e.model)||(e.model="")}return e})}),(0,m.jsxs)("div",{className:"clawpress-settings__actions",children:[(0,m.jsx)(i.Button,{className:"clawpress-settings__save-button",variant:"primary",onClick:async()=>{t(!0),b(""),X("");try{await g("settings",{method:"POST",body:{provider:u.provider,model:u.model,temperature:Number.isFinite(Number(u.temperature))?Number(u.temperature):.2,top_p:Number.isFinite(Number(u.top_p))?Number(u.top_p):.9,max_output_tokens:Number.isFinite(Number(u.max_output_tokens))&&Number(u.max_output_tokens)>0?Number(u.max_output_tokens):1200,frequency_penalty:Number.isFinite(Number(u.frequency_penalty))?Number(u.frequency_penalty):.2,presence_penalty:Number.isFinite(Number(u.presence_penalty))?Number(u.presence_penalty):0,request_timeout:Number.isFinite(Number(u.request_timeout))&&Number(u.request_timeout)>0?Number(u.request_timeout):45,agent_user_id:Number.isFinite(Number(u.agent_user_id))&&Number(u.agent_user_id)>0?Number(u.agent_user_id):0,memory_enabled:Boolean(u.memory_enabled),setup_completed:Boolean(u.setup_completed)}}),X((0,a.__)("Settings saved.","clawpress"))}catch(c){b(c?.message||(0,a.__)("Unable to save settings.","clawpress"))}finally{t(!1)}},isBusy:e,disabled:e,children:e?(0,a.__)("Saving…","clawpress"):(0,a.__)("Save Settings","clawpress")}),(0,m.jsx)(i.Button,{className:"clawpress-settings__refresh-models-button",variant:"secondary",icon:IA,onClick:async()=>{y&&(b(""),(c=>{const l=BA(c);if(!l)return;const e=VA();delete e[l],YA(e)})(y),await B(y,{forceRefresh:!0}))},isBusy:p,disabled:!y||p||e,children:(0,a.__)("Refresh Models","clawpress")})]})]})]})]})})}function CA(){const{currentView:c,handleTabSelect:l,VIEWS:e}=s(),t=[{name:e.PAGES,title:(0,a.__)("Agent Files","clawpress"),content:(0,m.jsx)(RA,{})},{name:e.SETTINGS,title:(0,a.__)("Settings","clawpress"),content:(0,m.jsx)(FA,{})},{name:e.ABILITIES,title:(0,a.__)("Abilities","clawpress"),content:(0,m.jsx)(r,{})}];return(0,m.jsx)("div",{className:"clawpress-app",children:(0,m.jsx)(i.TabPanel,{tabs:t,initialTabName:c,onSelect:l,children:({content:c})=>(0,m.jsx)("div",{className:"clawpress-tab-content",children:c})})})}X()(()=>{const c=document.getElementById("clawpress-admin-root");c&&(0,G.createRoot)(c).render((0,m.jsx)(CA,{}))})},744(c){"use strict";var l=function(c){return function(c){return!!c&&"object"==typeof c}(c)&&!function(c){var l=Object.prototype.toString.call(c);return"[object RegExp]"===l||"[object Date]"===l||function(c){return c.$$typeof===e}(c)}(c)},e="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function t(c,l){return!1!==l.clone&&l.isMergeableObject(c)?X((e=c,Array.isArray(e)?[]:{}),c,l):c;var e}function d(c,l,e){return c.concat(l).map(function(c){return t(c,e)})}function b(c){return Object.keys(c).concat(function(c){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(c).filter(function(l){return Object.propertyIsEnumerable.call(c,l)}):[]}(c))}function n(c,l){try{return l in c}catch(c){return!1}}function X(c,e,G){(G=G||{}).arrayMerge=G.arrayMerge||d,G.isMergeableObject=G.isMergeableObject||l,G.cloneUnlessOtherwiseSpecified=t;var i=Array.isArray(e);return i===Array.isArray(c)?i?G.arrayMerge(c,e,G):function(c,l,e){var d={};return e.isMergeableObject(c)&&b(c).forEach(function(l){d[l]=t(c[l],e)}),b(l).forEach(function(b){(function(c,l){return n(c,l)&&!(Object.hasOwnProperty.call(c,l)&&Object.propertyIsEnumerable.call(c,l))})(c,b)||(n(c,b)&&e.isMergeableObject(l[b])?d[b]=function(c,l){if(!l.customMerge)return X;var e=l.customMerge(c);return"function"==typeof e?e:X}(b,e)(c[b],l[b],e):d[b]=t(l[b],e))}),d}(c,e,G):t(e,G)}X.all=function(c,l){if(!Array.isArray(c))throw new Error("first argument should be an array");return c.reduce(function(c,e){return X(c,e,l)},{})};var G=X;c.exports=G},252(c){"use strict";c.exports=function c(l,e){if(l===e)return!0;if(l&&e&&"object"==typeof l&&"object"==typeof e){if(l.constructor!==e.constructor)return!1;var t,d,b;if(Array.isArray(l)){if((t=l.length)!=e.length)return!1;for(d=t;0!==d--;)if(!c(l[d],e[d]))return!1;return!0}if(l instanceof Map&&e instanceof Map){if(l.size!==e.size)return!1;for(d of l.entries())if(!e.has(d[0]))return!1;for(d of l.entries())if(!c(d[1],e.get(d[0])))return!1;return!0}if(l instanceof Set&&e instanceof Set){if(l.size!==e.size)return!1;for(d of l.entries())if(!e.has(d[0]))return!1;return!0}if(ArrayBuffer.isView(l)&&ArrayBuffer.isView(e)){if((t=l.length)!=e.length)return!1;for(d=t;0!==d--;)if(l[d]!==e[d])return!1;return!0}if(l.constructor===RegExp)return l.source===e.source&&l.flags===e.flags;if(l.valueOf!==Object.prototype.valueOf)return l.valueOf()===e.valueOf();if(l.toString!==Object.prototype.toString)return l.toString()===e.toString();if((t=(b=Object.keys(l)).length)!==Object.keys(e).length)return!1;for(d=t;0!==d--;)if(!Object.prototype.hasOwnProperty.call(e,b[d]))return!1;for(d=t;0!==d--;){var n=b[d];if(!c(l[n],e[n]))return!1}return!0}return l!=l&&e!=e}},542(c){c.exports=function(c){var l={};function e(t){if(l[t])return l[t].exports;var d=l[t]={exports:{},id:t,loaded:!1};return c[t].call(d.exports,d,d.exports,e),d.loaded=!0,d.exports}return e.m=c,e.c=l,e.p="",e(0)}([function(c,l,e){c.exports=e(1)},function(c,l,e){"use strict";Object.defineProperty(l,"__esModule",{value:!0});var t=e(2);Object.defineProperty(l,"combineChunks",{enumerable:!0,get:function(){return t.combineChunks}}),Object.defineProperty(l,"fillInChunks",{enumerable:!0,get:function(){return t.fillInChunks}}),Object.defineProperty(l,"findAll",{enumerable:!0,get:function(){return t.findAll}}),Object.defineProperty(l,"findChunks",{enumerable:!0,get:function(){return t.findChunks}})},function(c,l){"use strict";Object.defineProperty(l,"__esModule",{value:!0}),l.findAll=function(c){var l=c.autoEscape,b=c.caseSensitive,n=void 0!==b&&b,X=c.findChunks,G=void 0===X?t:X,i=c.sanitize,a=c.searchWords,u=c.textToHighlight;return d({chunksToHighlight:e({chunks:G({autoEscape:l,caseSensitive:n,sanitize:i,searchWords:a,textToHighlight:u})}),totalLength:u?u.length:0})};var e=l.combineChunks=function(c){var l=c.chunks;return l.sort(function(c,l){return c.start-l.start}).reduce(function(c,l){if(0===c.length)return[l];var e=c.pop();if(l.startG&&c.push({highlight:!1,start:G,end:i}),n.index===b.lastIndex&&b.lastIndex++}return c},[])};l.findChunks=t;var d=l.fillInChunks=function(c){var l=c.chunksToHighlight,e=c.totalLength,t=[],d=function(c,l,e){l-c>0&&t.push({start:c,end:l,highlight:e})};if(0===l.length)d(0,e,!1);else{var b=0;l.forEach(function(c){d(b,c.start,!1),d(c.start,c.end,!0),b=c.end}),d(b,e,!1)}return t};function b(c){return c}}])},146(c,l,e){"use strict";var t=e(363),d={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},b={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},n={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},X={};function G(c){return t.isMemo(c)?n:X[c.$$typeof]||d}X[t.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},X[t.Memo]=n;var i=Object.defineProperty,a=Object.getOwnPropertyNames,u=Object.getOwnPropertySymbols,x=Object.getOwnPropertyDescriptor,o=Object.getPrototypeOf,s=Object.prototype;c.exports=function c(l,e,t){if("string"!=typeof e){if(s){var d=o(e);d&&d!==s&&c(l,d,t)}var n=a(e);u&&(n=n.concat(u(e)));for(var X=G(l),g=G(e),m=0;m{if(!e){var n=1/0;for(a=0;a=d)&&Object.keys(b.O).every(c=>b.O[c](e[G]))?e.splice(G--,1):(X=!1,d0&&c[a-1][2]>d;a--)c[a]=c[a-1];c[a]=[e,t,d]},b.n=c=>{var l=c&&c.__esModule?()=>c.default:()=>c;return b.d(l,{a:l}),l},e=Object.getPrototypeOf?c=>Object.getPrototypeOf(c):c=>c.__proto__,b.t=function(c,t){if(1&t&&(c=this(c)),8&t)return c;if("object"==typeof c&&c){if(4&t&&c.__esModule)return c;if(16&t&&"function"==typeof c.then)return c}var d=Object.create(null);b.r(d);var n={};l=l||[null,e({}),e([]),e(e)];for(var X=2&t&&c;("object"==typeof X||"function"==typeof X)&&!~l.indexOf(X);X=e(X))Object.getOwnPropertyNames(X).forEach(l=>n[l]=()=>c[l]);return n.default=()=>c,b.d(d,n),d},b.d=(c,l)=>{for(var e in l)b.o(l,e)&&!b.o(c,e)&&Object.defineProperty(c,e,{enumerable:!0,get:l[e]})},b.o=(c,l)=>Object.prototype.hasOwnProperty.call(c,l),b.r=c=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(c,"__esModule",{value:!0})},(()=>{var c={884:0,15:0};b.O.j=l=>0===c[l];var l=(l,e)=>{var t,d,[n,X,G]=e,i=0;if(n.some(l=>0!==c[l])){for(t in X)b.o(X,t)&&(b.m[t]=X[t]);if(G)var a=G(b)}for(l&&l(e);ib(71));n=b.O(n)})(); \ No newline at end of file diff --git a/includes/functions.php b/includes/functions.php index f02b834..8d7e049 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -303,18 +303,7 @@ function clawpress_validate_request_timeout( $value ): bool { */ function clawpress_sanitize_provider( $value ): string { $provider = strtolower( sanitize_key( sanitize_text_field( (string) $value ) ) ); - if ( '' === $provider ) { - return ''; - } - - try { - return \ClawPress\Helpers\Provider_Helper::get_instance()->supports_provider_id( $provider ) - ? $provider - : ''; - } catch ( \Throwable $throwable ) { - unset( $throwable ); - return ''; - } + return '' !== $provider ? $provider : ''; } } diff --git a/includes/rest/class-settings-controller.php b/includes/rest/class-settings-controller.php index 2fe878b..7c52cb8 100644 --- a/includes/rest/class-settings-controller.php +++ b/includes/rest/class-settings-controller.php @@ -125,6 +125,25 @@ public function register_routes(): void { ], ] ); + + register_rest_route( + 'clawpress/v1', + '/providers/(?P[a-z0-9_-]+)/models', + [ + 'methods' => 'GET', + 'callback' => [ $this, 'get_provider_models' ], + 'permission_callback' => 'clawpress_check_permissions', + 'args' => [ + 'provider' => [ + 'required' => true, + 'sanitize_callback' => 'clawpress_sanitize_provider', + 'validate_callback' => static function ( $value ): bool { + return '' !== clawpress_sanitize_provider( $value ); + }, + ], + ], + ] + ); } /** @@ -144,6 +163,20 @@ public function get_settings(): \WP_REST_Response { ); } + /** + * Get model options for a provider. + * + * @param \WP_REST_Request $request The request object. + */ + public function get_provider_models( \WP_REST_Request $request ): \WP_REST_Response { + $provider = clawpress_sanitize_provider( $request->get_param( 'provider' ) ); + + return new \WP_REST_Response( + $this->model_helper->get_options_for_provider( $provider ), + 200 + ); + } + /** * Update plugin settings. * diff --git a/src/js/admin/components/views/SettingsView.js b/src/js/admin/components/views/SettingsView.js index d3fd71e..dcbdd74 100644 --- a/src/js/admin/components/views/SettingsView.js +++ b/src/js/admin/components/views/SettingsView.js @@ -112,90 +112,14 @@ const getDefaultProviderOptions = () => [ }, ]; -const requestWpAiJson = async ( path ) => { - const restBase = - typeof window !== 'undefined' && - typeof window.CLAWPRESS_ADMIN?.restBase === 'string' - ? window.CLAWPRESS_ADMIN.restBase - : '/wp-json/clawpress/v1'; - const nonce = - typeof window !== 'undefined' && - typeof window.CLAWPRESS_ADMIN?.nonce === 'string' - ? window.CLAWPRESS_ADMIN.nonce - : ''; - const wpAiBase = restBase.replace( /\/clawpress\/v1\/?$/, '/wp-ai/v1' ); - const url = `${ wpAiBase }/${ path.replace( /^\//, '' ) }`; - - const response = await fetch( url, { - method: 'GET', - credentials: 'same-origin', - headers: { - 'Content-Type': 'application/json', - 'X-WP-Nonce': nonce, - }, - } ); - - const text = await response.text(); - let payload = []; - - if ( text ) { - try { - payload = JSON.parse( text ); - } catch { - payload = []; - } - } - - if ( ! response.ok ) { - throw new Error( 'wp_ai_request_failed' ); - } - - return payload; -}; - -const loadWpAiProviders = async () => { - let providers = []; - - try { - providers = await requestWpAiJson( 'providers' ); - } catch { - return null; - } - - if ( ! Array.isArray( providers ) || providers.length === 0 ) { - return null; - } - - const providerOptions = providers - .map( ( provider ) => { - const providerId = normalizeProviderId( provider?.id ); - const providerLabel = - typeof provider?.name === 'string' - ? provider.name.trim() - : providerId; - - if ( ! providerId ) { - return null; - } - - return { - value: providerId, - label: providerLabel || providerId, - }; - } ) - .filter( Boolean ); - - return providerOptions.length > 0 ? providerOptions : null; -}; - -const loadWpAiProviderModels = async ( providerId ) => { +const fetchProviderModelOptions = async ( providerId ) => { const normalizedProviderId = normalizeProviderId( providerId ); if ( ! normalizedProviderId ) { return []; } - const providerModels = await requestWpAiJson( + const providerModels = await requestJson( `providers/${ encodeURIComponent( normalizedProviderId ) }/models` ); @@ -562,13 +486,6 @@ export default function SettingsView() { setModelCatalogByProvider( normalizeModelCatalog( data?.model_catalog || {} ) ); - - const wpAiProviders = await loadWpAiProviders(); - if ( ! mounted || ! wpAiProviders ) { - return; - } - - setProviderOptions( normalizeProviderOptions( wpAiProviders ) ); } catch ( e ) { if ( ! mounted ) { return; @@ -676,7 +593,7 @@ export default function SettingsView() { try { const refreshedOptions = - await loadWpAiProviderModels( normalizedProviderId ); + await fetchProviderModelOptions( normalizedProviderId ); setDiscoveredModelOptionsByProvider( ( current ) => ( { ...current, [ normalizedProviderId ]: refreshedOptions, diff --git a/tests/Unit/RestApiTest.php b/tests/Unit/RestApiTest.php index 3a3dc81..8cf104d 100644 --- a/tests/Unit/RestApiTest.php +++ b/tests/Unit/RestApiTest.php @@ -38,9 +38,10 @@ static function ( array $route ): string { WordPress_Stubs::$rest_routes ); - $this->assertCount( 14, WordPress_Stubs::$rest_routes ); + $this->assertCount( 15, WordPress_Stubs::$rest_routes ); $this->assertContains( '/settings:GET', $routes ); $this->assertContains( '/settings:POST', $routes ); + $this->assertContains( '/providers/(?P[a-z0-9_-]+)/models:GET', $routes ); $this->assertContains( '/settings/abilites:GET', $routes ); $this->assertContains( '/settings/abilites:POST', $routes ); $this->assertContains( '/status:GET', $routes ); @@ -93,6 +94,23 @@ static function ( array $route ): bool { $this->assertSame( 'clawpress_check_permissions', $settings_routes[1]['args']['permission_callback'] ); } + public function test_provider_models_route_uses_global_manage_options_permission_callback(): void { + $settings_controller = new Settings_Controller(); + $settings_controller->register_routes(); + + $model_routes = array_values( + array_filter( + WordPress_Stubs::$rest_routes, + static function ( array $route ): bool { + return '/providers/(?P[a-z0-9_-]+)/models' === $route['route']; + } + ) + ); + + $this->assertCount( 1, $model_routes ); + $this->assertSame( 'clawpress_check_permissions', $model_routes[0]['args']['permission_callback'] ); + } + public function test_get_settings_returns_current_option_value(): void { $settings_controller = new Settings_Controller(); WordPress_Stubs::$options['clawpress_settings'] = array( @@ -123,6 +141,23 @@ public function test_get_settings_returns_current_option_value(): void { ); } + public function test_get_provider_models_returns_provider_options(): void { + $settings_controller = new Settings_Controller(); + $response = $settings_controller->get_provider_models( + new \WP_REST_Request( + array( + 'provider' => 'openai', + ) + ) + ); + $data = $response->get_data(); + + $this->assertSame( 200, $response->get_status() ); + $this->assertNotEmpty( $data ); + $this->assertSame( 'gpt-5.2-codex', $data[0]['id'] ); + $this->assertSame( 'GPT-5.2 Codex', $data[0]['label'] ); + } + public function test_get_settings_backfills_new_generation_defaults_for_existing_settings(): void { $settings_controller = new Settings_Controller(); WordPress_Stubs::$options['clawpress_settings'] = array( From 7b7e92cdc226237fec0518a149da7cec8c99e544 Mon Sep 17 00:00:00 2001 From: Brad Vincent Date: Thu, 7 May 2026 13:04:18 +0100 Subject: [PATCH 2/9] Add model option metadata helper --- .../helpers/class-model-option-helper.php | 462 ++++++++++++++++++ tests/Support/AiClientStubs.php | 97 +++- tests/Support/WordPressStubs.php | 12 + tests/Unit/ModelOptionHelperTest.php | 124 +++++ 4 files changed, 677 insertions(+), 18 deletions(-) create mode 100644 includes/helpers/class-model-option-helper.php create mode 100644 tests/Unit/ModelOptionHelperTest.php diff --git a/includes/helpers/class-model-option-helper.php b/includes/helpers/class-model-option-helper.php new file mode 100644 index 0000000..46c1884 --- /dev/null +++ b/includes/helpers/class-model-option-helper.php @@ -0,0 +1,462 @@ + + */ + private const GENERATION_OPTION_NAMES = [ + 'temperature' => 'temperature', + 'top_p' => 'topP', + 'max_output_tokens' => 'maxTokens', + 'frequency_penalty' => 'frequencyPenalty', + 'presence_penalty' => 'presencePenalty', + ]; + + /** + * Provider parameter names mapped to ClawPress generation setting keys. + * + * @var array + */ + private const PARAMETER_ALIASES = [ + 'temperature' => 'temperature', + 'top_p' => 'top_p', + 'topp' => 'top_p', + 'topP' => 'top_p', + 'max_tokens' => 'max_output_tokens', + 'maxtokens' => 'max_output_tokens', + 'maxTokens' => 'max_output_tokens', + 'max_output_tokens' => 'max_output_tokens', + 'maxoutputtokens' => 'max_output_tokens', + 'max_completion_tokens' => 'max_output_tokens', + 'maxcompletiontokens' => 'max_output_tokens', + 'frequency_penalty' => 'frequency_penalty', + 'frequencypenalty' => 'frequency_penalty', + 'frequencyPenalty' => 'frequency_penalty', + 'presence_penalty' => 'presence_penalty', + 'presencepenalty' => 'presence_penalty', + 'presencePenalty' => 'presence_penalty', + ]; + + /** + * Singleton instance. + * + * @var ?self + */ + private static ?self $instance = null; + + /** + * Constructor. + */ + private function __construct() {} + + /** + * Get singleton instance. + */ + public static function get_instance(): self { + if ( null === self::$instance ) { + self::$instance = new self(); + } + + return self::$instance; + } + + /** + * Check whether a generation option should be sent for a provider/model pair. + * + * Unknown metadata is treated as supported so providers without metadata keep + * working, while learned provider errors still disable known-bad options. + * + * @param string $provider Provider identifier. + * @param string $model Model identifier. + * @param string $option_key Generation setting key. + * @param mixed $value Setting value. + */ + public function supports_generation_option( string $provider, string $model, string $option_key, $value ): bool { + $option_key = $this->normalize_generation_option_key( $option_key ); + if ( '' === $option_key ) { + return false; + } + + if ( $this->has_learned_unsupported_generation_option( $provider, $model, $option_key ) ) { + return false; + } + + $metadata_support = $this->metadata_supports_option( + $provider, + $model, + self::GENERATION_OPTION_NAMES[ $option_key ], + $value + ); + + return false !== $metadata_support; + } + + /** + * Check option support from model metadata. + * + * Returns null when metadata cannot be resolved. + * + * @param string $provider Provider identifier. + * @param string $model Model identifier. + * @param string $option_name AI client metadata option name. + * @param mixed $value Optional value to validate. + */ + public function metadata_supports_option( string $provider, string $model, string $option_name, $value = null ): ?bool { + $provider = clawpress_sanitize_provider( $provider ); + $model = trim( sanitize_text_field( $model ) ); + if ( '' === $provider || '' === $model || '' === trim( $option_name ) ) { + return null; + } + + $metadata = $this->resolve_model_metadata( $provider, $model ); + if ( null === $metadata || ! method_exists( $metadata, 'getSupportedOptions' ) ) { + return null; + } + + $supported_options = $metadata->getSupportedOptions(); + if ( ! is_array( $supported_options ) ) { + return null; + } + + $normalized_target = $this->normalize_metadata_option_name( $option_name ); + foreach ( $supported_options as $supported_option ) { + if ( ! is_object( $supported_option ) || ! method_exists( $supported_option, 'getName' ) ) { + continue; + } + + $supported_name = $this->normalize_metadata_option_name( $supported_option->getName() ); + if ( $normalized_target !== $supported_name ) { + continue; + } + + if ( null !== $value && method_exists( $supported_option, 'isSupportedValue' ) ) { + return (bool) $supported_option->isSupportedValue( $value ); + } + + return true; + } + + return false; + } + + /** + * Get metadata option names supported by a model. + * + * @param string $provider Provider identifier. + * @param string $model Model identifier. + * @return array + */ + public function get_supported_option_names( string $provider, string $model ): array { + $metadata = $this->resolve_model_metadata( + clawpress_sanitize_provider( $provider ), + trim( sanitize_text_field( $model ) ) + ); + if ( null === $metadata || ! method_exists( $metadata, 'getSupportedOptions' ) ) { + return []; + } + + $supported_options = $metadata->getSupportedOptions(); + if ( ! is_array( $supported_options ) ) { + return []; + } + + $option_names = []; + foreach ( $supported_options as $supported_option ) { + if ( ! is_object( $supported_option ) || ! method_exists( $supported_option, 'getName' ) ) { + continue; + } + + $option_name = $this->get_metadata_option_value( $supported_option->getName() ); + if ( '' !== $option_name ) { + $option_names[] = $option_name; + } + } + + return array_values( array_unique( $option_names ) ); + } + + /** + * Get unsupported generation option metadata for a model. + * + * @param string $provider Provider identifier. + * @param string $model Model identifier. + * @return array{supported_options:array,unsupported_generation_options:array,unsupported_generation_option_labels:array,learned_unsupported_options:array} + */ + public function get_generation_option_summary( string $provider, string $model ): array { + $unsupported = []; + $learned = []; + + foreach ( array_keys( self::GENERATION_OPTION_NAMES ) as $option_key ) { + if ( $this->has_learned_unsupported_generation_option( $provider, $model, $option_key ) ) { + $unsupported[] = $option_key; + $learned[] = $option_key; + continue; + } + + $metadata_support = $this->metadata_supports_option( + $provider, + $model, + self::GENERATION_OPTION_NAMES[ $option_key ] + ); + if ( false === $metadata_support ) { + $unsupported[] = $option_key; + } + } + + $unsupported = array_values( array_unique( $unsupported ) ); + + return [ + 'supported_options' => $this->get_supported_option_names( $provider, $model ), + 'unsupported_generation_options' => $unsupported, + 'unsupported_generation_option_labels' => array_map( + [ $this, 'get_generation_option_label' ], + $unsupported + ), + 'learned_unsupported_options' => array_values( array_unique( $learned ) ), + ]; + } + + /** + * Record an unsupported provider parameter if an error identifies one. + * + * @param string $provider Provider identifier. + * @param string $model Model identifier. + * @param Throwable|string $error Provider error. + */ + public function record_unsupported_parameter_from_error( string $provider, string $model, $error ): ?string { + $message = $error instanceof Throwable ? $error->getMessage() : (string) $error; + $option_key = $this->extract_unsupported_generation_option( $message ); + if ( null === $option_key ) { + return null; + } + + $this->mark_generation_option_unsupported( $provider, $model, $option_key ); + return $option_key; + } + + /** + * Extract a known generation setting key from an unsupported parameter error. + * + * @param string $message Error message. + */ + public function extract_unsupported_generation_option( string $message ): ?string { + $message = trim( $message ); + if ( '' === $message ) { + return null; + } + + $patterns = [ + '/unsupported\s+parameter\s*:?\s*[\'"]?([a-zA-Z0-9_.-]+)[\'"]?/i', + '/unknown\s+parameter\s*:?\s*[\'"]?([a-zA-Z0-9_.-]+)[\'"]?/i', + '/unrecognized\s+(?:request\s+)?(?:argument|parameter).*?[\'"]([a-zA-Z0-9_.-]+)[\'"]/i', + '/[\'"]([a-zA-Z0-9_.-]+)[\'"]\s+is\s+not\s+supported/i', + ]; + + foreach ( $patterns as $pattern ) { + if ( 1 !== preg_match( $pattern, $message, $matches ) ) { + continue; + } + + $option_key = $this->normalize_generation_parameter_name( (string) ( $matches[1] ?? '' ) ); + if ( '' !== $option_key ) { + return $option_key; + } + } + + return null; + } + + /** + * Check whether an option was learned unsupported from an earlier provider error. + * + * @param string $provider Provider identifier. + * @param string $model Model identifier. + * @param string $option_key Generation setting key. + */ + public function has_learned_unsupported_generation_option( string $provider, string $model, string $option_key ): bool { + $provider = clawpress_sanitize_provider( $provider ); + $model = trim( sanitize_text_field( $model ) ); + $option_key = $this->normalize_generation_option_key( $option_key ); + if ( '' === $provider || '' === $model || '' === $option_key ) { + return false; + } + + $options = $this->get_learned_unsupported_options(); + return isset( $options[ $provider ][ $model ][ $option_key ] ); + } + + /** + * Mark a generation option unsupported for a provider/model pair. + * + * @param string $provider Provider identifier. + * @param string $model Model identifier. + * @param string $option_key Generation setting key. + */ + public function mark_generation_option_unsupported( string $provider, string $model, string $option_key ): void { + $provider = clawpress_sanitize_provider( $provider ); + $model = trim( sanitize_text_field( $model ) ); + $option_key = $this->normalize_generation_option_key( $option_key ); + if ( '' === $provider || '' === $model || '' === $option_key ) { + return; + } + + $options = $this->get_learned_unsupported_options(); + if ( ! isset( $options[ $provider ] ) || ! is_array( $options[ $provider ] ) ) { + $options[ $provider ] = []; + } + if ( ! isset( $options[ $provider ][ $model ] ) || ! is_array( $options[ $provider ][ $model ] ) ) { + $options[ $provider ][ $model ] = []; + } + + $options[ $provider ][ $model ][ $option_key ] = time(); + update_option( self::UNSUPPORTED_OPTIONS_OPTION, $options, false ); + } + + /** + * Get a user-facing generation option label. + * + * @param string $option_key Generation setting key. + */ + public function get_generation_option_label( string $option_key ): string { + switch ( $this->normalize_generation_option_key( $option_key ) ) { + case 'temperature': + return __( 'Temperature', 'clawpress' ); + case 'top_p': + return __( 'Top P', 'clawpress' ); + case 'max_output_tokens': + return __( 'Max Output Tokens', 'clawpress' ); + case 'frequency_penalty': + return __( 'Frequency Penalty', 'clawpress' ); + case 'presence_penalty': + return __( 'Presence Penalty', 'clawpress' ); + } + + return $option_key; + } + + /** + * Resolve model metadata from the AI client registry. + * + * @param string $provider Provider identifier. + * @param string $model Model identifier. + */ + private function resolve_model_metadata( string $provider, string $model ): ?object { + if ( '' === $provider || '' === $model ) { + return null; + } + + try { + $selected_model = AiClient::defaultRegistry()->getProviderModel( + $provider, + $model, + ModelConfig::fromArray( [] ) + ); + } catch ( Throwable $throwable ) { + unset( $throwable ); + return null; + } + + if ( ! is_object( $selected_model ) || ! method_exists( $selected_model, 'metadata' ) ) { + return null; + } + + $metadata = $selected_model->metadata(); + return is_object( $metadata ) ? $metadata : null; + } + + /** + * Normalize a metadata option name for comparison. + * + * @param mixed $option_name Metadata option enum/string. + */ + private function normalize_metadata_option_name( $option_name ): string { + return strtolower( preg_replace( '/[^a-z0-9]/i', '', $this->get_metadata_option_value( $option_name ) ) ?? '' ); + } + + /** + * Read a metadata option enum/string value. + * + * @param mixed $option_name Metadata option enum/string. + */ + private function get_metadata_option_value( $option_name ): string { + if ( is_string( $option_name ) ) { + return trim( $option_name ); + } + + if ( is_object( $option_name ) ) { + try { + if ( isset( $option_name->value ) && is_string( $option_name->value ) ) { + return trim( $option_name->value ); + } + } catch ( Throwable $throwable ) { + unset( $throwable ); + } + } + + return ''; + } + + /** + * Normalize a provider parameter name into a generation setting key. + * + * @param string $parameter_name Provider parameter name. + */ + private function normalize_generation_parameter_name( string $parameter_name ): string { + $parameter_name = trim( $parameter_name ); + if ( '' === $parameter_name ) { + return ''; + } + + if ( isset( self::PARAMETER_ALIASES[ $parameter_name ] ) ) { + return self::PARAMETER_ALIASES[ $parameter_name ]; + } + + $normalized = strtolower( preg_replace( '/[^a-z0-9]/i', '', $parameter_name ) ?? '' ); + return self::PARAMETER_ALIASES[ $normalized ] ?? ''; + } + + /** + * Normalize a generation setting key. + * + * @param string $option_key Generation setting key. + */ + private function normalize_generation_option_key( string $option_key ): string { + $option_key = strtolower( sanitize_key( sanitize_text_field( $option_key ) ) ); + return isset( self::GENERATION_OPTION_NAMES[ $option_key ] ) ? $option_key : ''; + } + + /** + * Get learned unsupported options from storage. + * + * @return array>> + */ + private function get_learned_unsupported_options(): array { + $options = get_option( self::UNSUPPORTED_OPTIONS_OPTION, [] ); + return is_array( $options ) ? $options : []; + } +} diff --git a/tests/Support/AiClientStubs.php b/tests/Support/AiClientStubs.php index 2095746..af850a4 100644 --- a/tests/Support/AiClientStubs.php +++ b/tests/Support/AiClientStubs.php @@ -338,6 +338,8 @@ public function getMaxRedirects(): int { if ( ! class_exists( __NAMESPACE__ . '\ModelConfig', false ) ) { final class ModelConfig { + public const KEY_CUSTOM_OPTIONS = 'customOptions'; + /** @var array */ private array $data; @@ -364,15 +366,62 @@ public function toArray(): array { } } + if ( ! class_exists( __NAMESPACE__ . '\SupportedOption', false ) ) { + final class SupportedOption { + /** @var mixed */ + private $name; + + /** @var array|null */ + private ?array $supported_values; + + /** + * @param mixed $name Option name. + * @param array|null $supported_values Supported values. + */ + public function __construct( $name, ?array $supported_values = null ) { + $this->name = $name; + $this->supported_values = $supported_values; + } + + /** + * @return mixed + */ + public function getName() { + return $this->name; + } + + /** + * @param mixed $value Value to test. + */ + public function isSupportedValue( $value ): bool { + if ( null === $this->supported_values ) { + return true; + } + + return in_array( $value, $this->supported_values, true ); + } + } + } + if ( ! class_exists( __NAMESPACE__ . '\ModelMetadata', false ) ) { final class ModelMetadata { private string $id; private string $name; - public function __construct( string $id, string $name = '' ) { - $this->id = $id; - $this->name = $name; + /** @var array */ + private array $supported_options; + + /** + * @param array $supported_capabilities Supported capabilities. + * @param array $supported_options Supported options. + */ + public function __construct( string $id, string $name = '', array $supported_capabilities = [], array $supported_options = [] ) { + unset( $supported_capabilities ); + + $this->id = $id; + $this->name = $name; + $this->supported_options = $supported_options; } public function getId(): string { @@ -382,6 +431,13 @@ public function getId(): string { public function getName(): string { return $this->name; } + + /** + * @return array + */ + public function getSupportedOptions(): array { + return $this->supported_options; + } } } } @@ -444,17 +500,17 @@ final class ProviderRegistry { * @return array */ public function getRegisteredProviderIds(): array { - return []; + return \ClawPress\Tests\Support\WordPress_Stubs::$ai_registered_provider_ids; } public function hasProvider( string $provider ): bool { - unset( $provider ); - return false; + return in_array( $provider, \ClawPress\Tests\Support\WordPress_Stubs::$ai_registered_provider_ids, true ) + || isset( \ClawPress\Tests\Support\WordPress_Stubs::$ai_provider_class_names[ $provider ] ) + || isset( \ClawPress\Tests\Support\WordPress_Stubs::$ai_provider_models[ $provider ] ); } public function getProviderClassName( string $provider ): string { - unset( $provider ); - return ''; + return \ClawPress\Tests\Support\WordPress_Stubs::$ai_provider_class_names[ $provider ] ?? ''; } public function getHttpTransporter(): ?object { @@ -462,18 +518,23 @@ public function getHttpTransporter(): ?object { } public function getProviderModel( string $provider, string $model, \WordPress\AiClient\Providers\Models\DTO\ModelConfig $config ): object { - unset( $provider, $model, $config ); + unset( $config ); + + $registered_models = \ClawPress\Tests\Support\WordPress_Stubs::$ai_provider_models[ $provider ] ?? []; + $metadata = $registered_models[ $model ] ?? null; + if ( ! $metadata instanceof \WordPress\AiClient\Providers\Models\DTO\ModelMetadata ) { + $metadata = new \WordPress\AiClient\Providers\Models\DTO\ModelMetadata( $model, $model ); + } + + return new class( $metadata ) { + private \WordPress\AiClient\Providers\Models\DTO\ModelMetadata $metadata; + + public function __construct( \WordPress\AiClient\Providers\Models\DTO\ModelMetadata $metadata ) { + $this->metadata = $metadata; + } - return new class() { public function metadata(): object { - return new class() { - /** - * @return array - */ - public function getSupportedOptions(): array { - return []; - } - }; + return $this->metadata; } }; } diff --git a/tests/Support/WordPressStubs.php b/tests/Support/WordPressStubs.php index 3ba3b96..983f4bc 100644 --- a/tests/Support/WordPressStubs.php +++ b/tests/Support/WordPressStubs.php @@ -85,6 +85,15 @@ final class WordPress_Stubs { /** @var array */ public static array $http_validate_url_results = array(); + /** @var array */ + public static array $ai_registered_provider_ids = array(); + + /** @var array */ + public static array $ai_provider_class_names = array(); + + /** @var array> */ + public static array $ai_provider_models = array(); + public static int $next_post_id = 1; public static bool $can_manage_options = true; @@ -130,6 +139,9 @@ public static function reset(): void { self::$remote_request_responses = array(); self::$validated_urls = array(); self::$http_validate_url_results = array(); + self::$ai_registered_provider_ids = array(); + self::$ai_provider_class_names = array(); + self::$ai_provider_models = array(); self::$next_post_id = 1; self::$can_manage_options = true; self::$user_capabilities = array(); diff --git a/tests/Unit/ModelOptionHelperTest.php b/tests/Unit/ModelOptionHelperTest.php new file mode 100644 index 0000000..170862a --- /dev/null +++ b/tests/Unit/ModelOptionHelperTest.php @@ -0,0 +1,124 @@ + [ + 'gpt-test' => new ModelMetadata( + 'gpt-test', + 'GPT Test', + [], + [ + new SupportedOption( 'temperature' ), + new SupportedOption( 'topP' ), + new SupportedOption( 'maxTokens' ), + ] + ), + ], + ]; + + $helper = Model_Option_Helper::get_instance(); + + $this->assertTrue( $helper->supports_generation_option( 'openai', 'gpt-test', 'temperature', 0.2 ) ); + $this->assertTrue( $helper->supports_generation_option( 'openai', 'gpt-test', 'top_p', 0.9 ) ); + $this->assertTrue( $helper->supports_generation_option( 'openai', 'gpt-test', 'max_output_tokens', 1200 ) ); + } + + public function test_skips_generation_option_when_metadata_omits_option(): void { + WordPress_Stubs::$ai_provider_models = [ + 'openai' => [ + 'gpt-test' => new ModelMetadata( + 'gpt-test', + 'GPT Test', + [], + [ + new SupportedOption( 'temperature' ), + ] + ), + ], + ]; + + $helper = Model_Option_Helper::get_instance(); + + $this->assertTrue( $helper->supports_generation_option( 'openai', 'gpt-test', 'temperature', 0.2 ) ); + $this->assertFalse( $helper->supports_generation_option( 'openai', 'gpt-test', 'top_p', 0.9 ) ); + } + + public function test_treats_unavailable_metadata_as_supported_until_provider_reports_error(): void { + $helper = Model_Option_Helper::get_instance(); + + $this->assertTrue( $helper->supports_generation_option( 'custom', 'model-a', 'top_p', 0.9 ) ); + } + + public function test_honors_supported_option_value_constraints(): void { + WordPress_Stubs::$ai_provider_models = [ + 'openai' => [ + 'gpt-test' => new ModelMetadata( + 'gpt-test', + 'GPT Test', + [], + [ + new SupportedOption( 'topP', [ 0.5 ] ), + ] + ), + ], + ]; + + $helper = Model_Option_Helper::get_instance(); + + $this->assertTrue( $helper->supports_generation_option( 'openai', 'gpt-test', 'top_p', 0.5 ) ); + $this->assertFalse( $helper->supports_generation_option( 'openai', 'gpt-test', 'top_p', 0.9 ) ); + } + + public function test_records_unsupported_parameter_errors_for_future_requests(): void { + $helper = Model_Option_Helper::get_instance(); + + $option = $helper->record_unsupported_parameter_from_error( + 'openai', + 'gpt-test', + new RuntimeException( "Unsupported parameter: 'top_p' is not supported with this model." ) + ); + + $this->assertSame( 'top_p', $option ); + $this->assertTrue( $helper->has_learned_unsupported_generation_option( 'openai', 'gpt-test', 'top_p' ) ); + $this->assertFalse( $helper->supports_generation_option( 'openai', 'gpt-test', 'top_p', 0.9 ) ); + } + + public function test_generation_option_summary_exposes_unsupported_labels(): void { + WordPress_Stubs::$ai_provider_models = [ + 'openai' => [ + 'gpt-test' => new ModelMetadata( + 'gpt-test', + 'GPT Test', + [], + [ + new SupportedOption( 'temperature' ), + ] + ), + ], + ]; + + $helper = Model_Option_Helper::get_instance(); + $summary = $helper->get_generation_option_summary( 'openai', 'gpt-test' ); + + $this->assertContains( 'temperature', $summary['supported_options'] ); + $this->assertContains( 'top_p', $summary['unsupported_generation_options'] ); + $this->assertContains( 'Top P', $summary['unsupported_generation_option_labels'] ); + } +} From 637490a37b001a6b55f412377cd9433571d32c05 Mon Sep 17 00:00:00 2001 From: Brad Vincent Date: Thu, 7 May 2026 13:12:26 +0100 Subject: [PATCH 3/9] Use model metadata for generation options --- .../handlers/class-setup-command-handler.php | 84 +++++---- .../handlers/class-test-command-handler.php | 142 +++++++-------- includes/helpers/class-agent-loop-helper.php | 161 ++++++++++-------- includes/helpers/class-provider-helper.php | 88 +--------- ...class-anthropic-provider-message-rules.php | 64 ------- .../class-generic-provider-message-rules.php | 83 --------- .../class-google-provider-message-rules.php | 64 ------- .../class-openai-provider-message-rules.php | 91 ---------- .../class-provider-message-rules-resolver.php | 94 ---------- .../class-provider-message-rules.php | 57 ------- tests/Unit/ProviderHelperTest.php | 61 +++---- 11 files changed, 224 insertions(+), 765 deletions(-) delete mode 100644 includes/helpers/provider-rules/class-anthropic-provider-message-rules.php delete mode 100644 includes/helpers/provider-rules/class-generic-provider-message-rules.php delete mode 100644 includes/helpers/provider-rules/class-google-provider-message-rules.php delete mode 100644 includes/helpers/provider-rules/class-openai-provider-message-rules.php delete mode 100644 includes/helpers/provider-rules/class-provider-message-rules-resolver.php delete mode 100644 includes/helpers/provider-rules/class-provider-message-rules.php diff --git a/includes/commands/handlers/class-setup-command-handler.php b/includes/commands/handlers/class-setup-command-handler.php index 970be86..dc303fc 100644 --- a/includes/commands/handlers/class-setup-command-handler.php +++ b/includes/commands/handlers/class-setup-command-handler.php @@ -14,6 +14,7 @@ use ClawPress\Commands\Command_Response; use ClawPress\Helpers\Agent_File_Helper; use ClawPress\Helpers\Model_Helper; +use ClawPress\Helpers\Model_Option_Helper; use ClawPress\Helpers\Provider_Helper; use ClawPress\Helpers\Settings_Helper; use ClawPress\Helpers\User_Helper; @@ -81,6 +82,13 @@ final class Setup_Command_Handler implements Command_Handler { */ private Model_Helper $model_helper; + /** + * Model option helper. + * + * @var Model_Option_Helper + */ + private Model_Option_Helper $model_option_helper; + /** * User helper. * @@ -123,6 +131,7 @@ public function __construct( $this->settings_helper = $settings_helper; $this->provider_helper = $provider_helper; $this->model_helper = $model_helper; + $this->model_option_helper = Model_Option_Helper::get_instance(); $this->user_helper = $user_helper; $this->workspace_helper = $workspace_helper; $this->agent_file_helper = $agent_file_helper; @@ -1135,33 +1144,49 @@ private function generate_text_with_explicit_model_fallback( RequestOptions $request_options, array $generation_settings ): string { - $builder = $this->build_prompt_builder( - $prompt, - $provider, - $model, - $request_options, - $generation_settings, - false - ); - - try { - return $builder->generateText(); - } catch ( Throwable $throwable ) { - if ( ! $this->should_retry_with_explicit_model( $throwable, $provider, $model ) ) { - throw $throwable; - } + $use_explicit_model = false; + $retried_unsupported_options = []; + $last_throwable = null; - $fallback_builder = $this->build_prompt_builder( + for ( $attempt = 0; $attempt < 8; $attempt++ ) { + $builder = $this->build_prompt_builder( $prompt, $provider, $model, $request_options, $generation_settings, - true + $use_explicit_model ); - return $fallback_builder->generateText(); + try { + return $builder->generateText(); + } catch ( Throwable $throwable ) { + $last_throwable = $throwable; + $unsupported_option = $this->model_option_helper->record_unsupported_parameter_from_error( + $provider, + $model, + $throwable + ); + + if ( null !== $unsupported_option && ! in_array( $unsupported_option, $retried_unsupported_options, true ) ) { + $retried_unsupported_options[] = $unsupported_option; + continue; + } + + if ( ! $use_explicit_model && $this->should_retry_with_explicit_model( $throwable, $provider, $model ) ) { + $use_explicit_model = true; + continue; + } + + throw $throwable; + } + } + + if ( $last_throwable instanceof Throwable ) { + throw $last_throwable; } + + throw new \RuntimeException( __( 'AI generation failed.', 'clawpress' ) ); } /** @@ -1259,9 +1284,6 @@ private function apply_generation_settings( object $builder, array $generation_s /** * Apply max output token setting to prompt builder. * - * Uses `max_output_tokens` for OpenAI model families that reject - * legacy `max_tokens` in the Responses API. - * * @param object $builder Prompt builder instance. * @param int $max_output_tokens Max output tokens. * @param string $provider Provider identifier. @@ -1269,16 +1291,8 @@ private function apply_generation_settings( object $builder, array $generation_s * @return object */ private function apply_max_output_tokens( object $builder, int $max_output_tokens, string $provider, string $model ): object { - if ( $this->provider_helper->should_use_max_output_tokens( $provider, $model ) && method_exists( $builder, 'usingModelConfig' ) ) { - $model_config = ModelConfig::fromArray( - [ - ModelConfig::KEY_CUSTOM_OPTIONS => [ - 'max_output_tokens' => $max_output_tokens, - ], - ] - ); - - return $builder->usingModelConfig( $model_config ); + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'max_output_tokens', $max_output_tokens ) ) { + return $builder; } return $builder->usingMaxTokens( $max_output_tokens ); @@ -1294,7 +1308,7 @@ private function apply_max_output_tokens( object $builder, int $max_output_token * @return object */ private function apply_temperature( object $builder, float $temperature, string $provider, string $model ): object { - if ( ! $this->provider_helper->should_use_temperature( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'temperature', $temperature ) ) { return $builder; } @@ -1311,7 +1325,7 @@ private function apply_temperature( object $builder, float $temperature, string * @return object */ private function apply_top_p( object $builder, float $top_p, string $provider, string $model ): object { - if ( ! $this->provider_helper->should_use_top_p( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'top_p', $top_p ) ) { return $builder; } @@ -1328,7 +1342,7 @@ private function apply_top_p( object $builder, float $top_p, string $provider, s * @return object */ private function apply_frequency_penalty( object $builder, float $frequency_penalty, string $provider, string $model ): object { - if ( ! $this->provider_helper->should_use_frequency_penalty( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'frequency_penalty', $frequency_penalty ) ) { return $builder; } @@ -1345,7 +1359,7 @@ private function apply_frequency_penalty( object $builder, float $frequency_pena * @return object */ private function apply_presence_penalty( object $builder, float $presence_penalty, string $provider, string $model ): object { - if ( ! $this->provider_helper->should_use_presence_penalty( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'presence_penalty', $presence_penalty ) ) { return $builder; } diff --git a/includes/commands/handlers/class-test-command-handler.php b/includes/commands/handlers/class-test-command-handler.php index d37bb2a..1c0ed82 100644 --- a/includes/commands/handlers/class-test-command-handler.php +++ b/includes/commands/handlers/class-test-command-handler.php @@ -12,13 +12,13 @@ use ClawPress\Commands\Command_Handler; use ClawPress\Commands\Command_Request; use ClawPress\Commands\Command_Response; +use ClawPress\Helpers\Model_Option_Helper; use ClawPress\Helpers\Provider_Helper; use ClawPress\Helpers\Settings_Helper; use Throwable; use WordPress\AiClient\AiClient; use WordPress\AiClient\Providers\Http\DTO\RequestOptions; use WordPress\AiClient\Providers\Models\DTO\ModelConfig; -use WordPress\AiClient\Providers\Models\Enums\OptionEnum; defined( 'ABSPATH' ) || exit; @@ -40,6 +40,13 @@ final class Test_Command_Handler implements Command_Handler { */ private Provider_Helper $provider_helper; + /** + * Model option helper. + * + * @var Model_Option_Helper + */ + private Model_Option_Helper $model_option_helper; + /** * Constructor. * @@ -47,8 +54,9 @@ final class Test_Command_Handler implements Command_Handler { * @param Provider_Helper $provider_helper Provider helper. */ public function __construct( Settings_Helper $settings_helper, Provider_Helper $provider_helper ) { - $this->settings_helper = $settings_helper; - $this->provider_helper = $provider_helper; + $this->settings_helper = $settings_helper; + $this->provider_helper = $provider_helper; + $this->model_option_helper = Model_Option_Helper::get_instance(); } /** @@ -238,33 +246,49 @@ private function generate_text_with_explicit_model_fallback( RequestOptions $request_options, array $generation_settings ): string { - $builder = $this->build_prompt_builder( - $prompt, - $provider, - $model, - $request_options, - $generation_settings, - false - ); + $use_explicit_model = false; + $retried_unsupported_options = []; + $last_throwable = null; - try { - return $builder->generateText(); - } catch ( Throwable $throwable ) { - if ( ! $this->should_retry_with_explicit_model( $throwable, $provider, $model ) ) { - throw $throwable; - } - - $fallback_builder = $this->build_prompt_builder( + for ( $attempt = 0; $attempt < 8; $attempt++ ) { + $builder = $this->build_prompt_builder( $prompt, $provider, $model, $request_options, $generation_settings, - true + $use_explicit_model ); - return $fallback_builder->generateText(); + try { + return $builder->generateText(); + } catch ( Throwable $throwable ) { + $last_throwable = $throwable; + $unsupported_option = $this->model_option_helper->record_unsupported_parameter_from_error( + $provider, + $model, + $throwable + ); + + if ( null !== $unsupported_option && ! in_array( $unsupported_option, $retried_unsupported_options, true ) ) { + $retried_unsupported_options[] = $unsupported_option; + continue; + } + + if ( ! $use_explicit_model && $this->should_retry_with_explicit_model( $throwable, $provider, $model ) ) { + $use_explicit_model = true; + continue; + } + + throw $throwable; + } } + + if ( $last_throwable instanceof Throwable ) { + throw $last_throwable; + } + + throw new \RuntimeException( __( 'AI generation failed.', 'clawpress' ) ); } /** @@ -358,53 +382,12 @@ private function get_tool_call_support_line( string $provider, string $model ): * @param string $model Model identifier. */ private function detect_tool_call_support( string $provider, string $model ): ?bool { - if ( '' === $provider || '' === $model ) { - return null; - } - - try { - $selected_model = AiClient::defaultRegistry()->getProviderModel( - $provider, - $model, - ModelConfig::fromArray( [] ) - ); - } catch ( Throwable $throwable ) { - unset( $throwable ); - return null; - } - - if ( ! is_object( $selected_model ) || ! method_exists( $selected_model, 'metadata' ) ) { - return null; - } - - $metadata = $selected_model->metadata(); - if ( ! is_object( $metadata ) || ! method_exists( $metadata, 'getSupportedOptions' ) ) { - return null; - } - - $supported_options = $metadata->getSupportedOptions(); - if ( ! is_array( $supported_options ) ) { - return null; - } - - foreach ( $supported_options as $supported_option ) { - if ( ! is_object( $supported_option ) || ! method_exists( $supported_option, 'getName' ) ) { - continue; - } - - $option_name = $supported_option->getName(); - if ( ! $option_name instanceof OptionEnum || ! $option_name->isFunctionDeclarations() ) { - continue; - } - - if ( method_exists( $supported_option, 'isSupportedValue' ) ) { - return (bool) $supported_option->isSupportedValue( true ); - } - - return true; - } - - return false; + return $this->model_option_helper->metadata_supports_option( + $provider, + $model, + 'functionDeclarations', + true + ); } /** @@ -440,9 +423,6 @@ private function apply_generation_settings( object $builder, array $generation_s /** * Apply max output token setting to prompt builder. * - * Uses `max_output_tokens` for OpenAI model families that reject - * legacy `max_tokens` in the Responses API. - * * @param object $builder Prompt builder instance. * @param int $max_output_tokens Max output tokens. * @param string $provider Provider identifier. @@ -450,16 +430,8 @@ private function apply_generation_settings( object $builder, array $generation_s * @return object */ private function apply_max_output_tokens( object $builder, int $max_output_tokens, string $provider, string $model ): object { - if ( $this->provider_helper->should_use_max_output_tokens( $provider, $model ) && method_exists( $builder, 'usingModelConfig' ) ) { - $model_config = ModelConfig::fromArray( - [ - ModelConfig::KEY_CUSTOM_OPTIONS => [ - 'max_output_tokens' => $max_output_tokens, - ], - ] - ); - - return $builder->usingModelConfig( $model_config ); + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'max_output_tokens', $max_output_tokens ) ) { + return $builder; } return $builder->usingMaxTokens( $max_output_tokens ); @@ -475,7 +447,7 @@ private function apply_max_output_tokens( object $builder, int $max_output_token * @return object */ private function apply_temperature( object $builder, float $temperature, string $provider, string $model ): object { - if ( ! $this->provider_helper->should_use_temperature( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'temperature', $temperature ) ) { return $builder; } @@ -492,7 +464,7 @@ private function apply_temperature( object $builder, float $temperature, string * @return object */ private function apply_top_p( object $builder, float $top_p, string $provider, string $model ): object { - if ( ! $this->provider_helper->should_use_top_p( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'top_p', $top_p ) ) { return $builder; } @@ -509,7 +481,7 @@ private function apply_top_p( object $builder, float $top_p, string $provider, s * @return object */ private function apply_frequency_penalty( object $builder, float $frequency_penalty, string $provider, string $model ): object { - if ( ! $this->provider_helper->should_use_frequency_penalty( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'frequency_penalty', $frequency_penalty ) ) { return $builder; } @@ -526,7 +498,7 @@ private function apply_frequency_penalty( object $builder, float $frequency_pena * @return object */ private function apply_presence_penalty( object $builder, float $presence_penalty, string $provider, string $model ): object { - if ( ! $this->provider_helper->should_use_presence_penalty( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'presence_penalty', $presence_penalty ) ) { return $builder; } diff --git a/includes/helpers/class-agent-loop-helper.php b/includes/helpers/class-agent-loop-helper.php index a368e1d..f10d1b5 100644 --- a/includes/helpers/class-agent-loop-helper.php +++ b/includes/helpers/class-agent-loop-helper.php @@ -75,6 +75,13 @@ final class Agent_Loop_Helper { */ private Provider_Helper $provider_helper; + /** + * Model option helper. + * + * @var Model_Option_Helper + */ + private Model_Option_Helper $model_option_helper; + /** * Context helper. * @@ -109,6 +116,7 @@ final class Agent_Loop_Helper { private function __construct() { $this->settings_helper = Settings_Helper::get_instance(); $this->provider_helper = Provider_Helper::get_instance(); + $this->model_option_helper = Model_Option_Helper::get_instance(); $this->context_helper = Context_Helper::get_instance(); $this->abilities_helper = Abilities_Helper::get_instance(); $this->confirmation_store = new Command_Confirmation_Store(); @@ -1617,25 +1625,12 @@ private function generate_result_with_explicit_model_fallback( ); } - $builder = $this->build_prompt_builder_for_round( - $conversation, - $provider, - $model, - $system_prompt, - $request_timeout, - $generation_settings, - $tool_declarations, - false - ); + $use_explicit_model = false; + $retried_unsupported_options = []; + $last_throwable = null; - try { - return $builder->generateResult(); - } catch ( Throwable $throwable ) { - if ( ! $this->should_retry_with_explicit_model( $throwable, $provider, $model ) ) { - throw $throwable; - } - - $fallback_builder = $this->build_prompt_builder_for_round( + for ( $attempt = 0; $attempt < 8; $attempt++ ) { + $builder = $this->build_prompt_builder_for_round( $conversation, $provider, $model, @@ -1643,11 +1638,38 @@ private function generate_result_with_explicit_model_fallback( $request_timeout, $generation_settings, $tool_declarations, - true + $use_explicit_model ); - return $fallback_builder->generateResult(); + try { + return $builder->generateResult(); + } catch ( Throwable $throwable ) { + $last_throwable = $throwable; + $unsupported_option = $this->model_option_helper->record_unsupported_parameter_from_error( + $provider, + $model, + $throwable + ); + + if ( null !== $unsupported_option && ! in_array( $unsupported_option, $retried_unsupported_options, true ) ) { + $retried_unsupported_options[] = $unsupported_option; + continue; + } + + if ( ! $use_explicit_model && $this->should_retry_with_explicit_model( $throwable, $provider, $model ) ) { + $use_explicit_model = true; + continue; + } + + throw $throwable; + } } + + if ( $last_throwable instanceof Throwable ) { + throw $last_throwable; + } + + throw new \RuntimeException( __( 'AI generation failed.', 'clawpress' ) ); } /** @@ -1672,26 +1694,12 @@ private function generate_streaming_result_with_explicit_model_fallback( array $tool_declarations, array $stream_generation_args ): GenerativeAiResult { - $builder = $this->build_streaming_prompt_builder_for_round( - $conversation, - $provider, - $model, - $system_prompt, - $request_timeout, - $generation_settings, - $tool_declarations, - false, - $stream_generation_args - ); - - try { - return $this->generate_result_from_streaming_builder( $builder ); - } catch ( Throwable $throwable ) { - if ( ! $this->should_retry_with_explicit_model( $throwable, $provider, $model ) ) { - throw $throwable; - } + $use_explicit_model = false; + $retried_unsupported_options = []; + $last_throwable = null; - $fallback_builder = $this->build_streaming_prompt_builder_for_round( + for ( $attempt = 0; $attempt < 8; $attempt++ ) { + $builder = $this->build_streaming_prompt_builder_for_round( $conversation, $provider, $model, @@ -1699,12 +1707,39 @@ private function generate_streaming_result_with_explicit_model_fallback( $request_timeout, $generation_settings, $tool_declarations, - true, + $use_explicit_model, $stream_generation_args ); - return $this->generate_result_from_streaming_builder( $fallback_builder ); + try { + return $this->generate_result_from_streaming_builder( $builder ); + } catch ( Throwable $throwable ) { + $last_throwable = $throwable; + $unsupported_option = $this->model_option_helper->record_unsupported_parameter_from_error( + $provider, + $model, + $throwable + ); + + if ( null !== $unsupported_option && ! in_array( $unsupported_option, $retried_unsupported_options, true ) ) { + $retried_unsupported_options[] = $unsupported_option; + continue; + } + + if ( ! $use_explicit_model && $this->should_retry_with_explicit_model( $throwable, $provider, $model ) ) { + $use_explicit_model = true; + continue; + } + + throw $throwable; + } + } + + if ( $last_throwable instanceof Throwable ) { + throw $last_throwable; } + + throw new \RuntimeException( __( 'AI generation failed.', 'clawpress' ) ); } /** @@ -1963,16 +1998,8 @@ private function apply_generation_settings_to_streaming_prompt_builder( object $ * @param string $model Model identifier. */ private function apply_max_output_tokens_to_prompt_builder( PromptBuilder $builder, int $max_output_tokens, string $provider, string $model ): PromptBuilder { - if ( $this->provider_helper->should_use_max_output_tokens( $provider, $model ) ) { - $model_config = ModelConfig::fromArray( - [ - ModelConfig::KEY_CUSTOM_OPTIONS => [ - 'max_output_tokens' => $max_output_tokens, - ], - ] - ); - - return $builder->usingModelConfig( $model_config ); + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'max_output_tokens', $max_output_tokens ) ) { + return $builder; } return $builder->usingMaxTokens( $max_output_tokens ); @@ -1985,16 +2012,8 @@ private function apply_max_output_tokens_to_prompt_builder( PromptBuilder $build * @return object */ private function apply_max_output_tokens_to_streaming_prompt_builder( object $builder, int $max_output_tokens, string $provider, string $model ): object { - if ( $this->provider_helper->should_use_max_output_tokens( $provider, $model ) ) { - $model_config = ModelConfig::fromArray( - [ - ModelConfig::KEY_CUSTOM_OPTIONS => [ - 'max_output_tokens' => $max_output_tokens, - ], - ] - ); - - return $builder->using_model_config( $model_config ); + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'max_output_tokens', $max_output_tokens ) ) { + return $builder; } return $builder->using_max_tokens( $max_output_tokens ); @@ -2009,7 +2028,7 @@ private function apply_max_output_tokens_to_streaming_prompt_builder( object $bu * @param string $model Model identifier. */ private function apply_temperature_to_prompt_builder( PromptBuilder $builder, float $temperature, string $provider, string $model ): PromptBuilder { - if ( ! $this->provider_helper->should_use_temperature( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'temperature', $temperature ) ) { return $builder; } @@ -2023,7 +2042,7 @@ private function apply_temperature_to_prompt_builder( PromptBuilder $builder, fl * @return object */ private function apply_temperature_to_streaming_prompt_builder( object $builder, float $temperature, string $provider, string $model ): object { - if ( ! $this->provider_helper->should_use_temperature( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'temperature', $temperature ) ) { return $builder; } @@ -2039,7 +2058,7 @@ private function apply_temperature_to_streaming_prompt_builder( object $builder, * @param string $model Model identifier. */ private function apply_top_p_to_prompt_builder( PromptBuilder $builder, float $top_p, string $provider, string $model ): PromptBuilder { - if ( ! $this->provider_helper->should_use_top_p( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'top_p', $top_p ) ) { return $builder; } @@ -2053,7 +2072,7 @@ private function apply_top_p_to_prompt_builder( PromptBuilder $builder, float $t * @return object */ private function apply_top_p_to_streaming_prompt_builder( object $builder, float $top_p, string $provider, string $model ): object { - if ( ! $this->provider_helper->should_use_top_p( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'top_p', $top_p ) ) { return $builder; } @@ -2069,7 +2088,7 @@ private function apply_top_p_to_streaming_prompt_builder( object $builder, float * @param string $model Model identifier. */ private function apply_frequency_penalty_to_prompt_builder( PromptBuilder $builder, float $frequency_penalty, string $provider, string $model ): PromptBuilder { - if ( ! $this->provider_helper->should_use_frequency_penalty( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'frequency_penalty', $frequency_penalty ) ) { return $builder; } @@ -2083,7 +2102,7 @@ private function apply_frequency_penalty_to_prompt_builder( PromptBuilder $build * @return object */ private function apply_frequency_penalty_to_streaming_prompt_builder( object $builder, float $frequency_penalty, string $provider, string $model ): object { - if ( ! $this->provider_helper->should_use_frequency_penalty( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'frequency_penalty', $frequency_penalty ) ) { return $builder; } @@ -2099,7 +2118,7 @@ private function apply_frequency_penalty_to_streaming_prompt_builder( object $bu * @param string $model Model identifier. */ private function apply_presence_penalty_to_prompt_builder( PromptBuilder $builder, float $presence_penalty, string $provider, string $model ): PromptBuilder { - if ( ! $this->provider_helper->should_use_presence_penalty( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'presence_penalty', $presence_penalty ) ) { return $builder; } @@ -2113,7 +2132,7 @@ private function apply_presence_penalty_to_prompt_builder( PromptBuilder $builde * @return object */ private function apply_presence_penalty_to_streaming_prompt_builder( object $builder, float $presence_penalty, string $provider, string $model ): object { - if ( ! $this->provider_helper->should_use_presence_penalty( $provider, $model ) ) { + if ( ! $this->model_option_helper->supports_generation_option( $provider, $model, 'presence_penalty', $presence_penalty ) ) { return $builder; } @@ -2181,6 +2200,10 @@ public function classify_provider_error_type( Throwable $throwable, string $erro } } + if ( null !== $this->model_option_helper->extract_unsupported_generation_option( $message ) ) { + return 'unsupported_parameter'; + } + return 'provider'; } diff --git a/includes/helpers/class-provider-helper.php b/includes/helpers/class-provider-helper.php index 4a048a6..3cc3b6d 100644 --- a/includes/helpers/class-provider-helper.php +++ b/includes/helpers/class-provider-helper.php @@ -9,8 +9,6 @@ namespace ClawPress\Helpers; -use ClawPress\Helpers\ProviderRules\Provider_Message_Rules; -use ClawPress\Helpers\ProviderRules\Provider_Message_Rules_Resolver; use Throwable; use WordPress\AiClient\AiClient; @@ -45,19 +43,10 @@ final class Provider_Helper { */ private array $provider_configuration_cache = []; - /** - * Provider message rules resolver. - * - * @var Provider_Message_Rules_Resolver - */ - private Provider_Message_Rules_Resolver $provider_message_rules_resolver; - /** * Constructor. */ - private function __construct() { - $this->provider_message_rules_resolver = new Provider_Message_Rules_Resolver(); - } + private function __construct() {} /** * Get singleton instance. @@ -207,81 +196,6 @@ public function resolve_provider_and_model( array $settings ): array { ]; } - /** - * Whether a provider/model combination should apply temperature sampling. - * - * @param string $provider Provider identifier. - * @param string $model Model identifier. - */ - public function should_use_temperature( string $provider, string $model ): bool { - return $this->resolve_provider_message_rules( $provider )->should_use_temperature( $model ); - } - - /** - * Whether a provider/model combination should use `max_output_tokens`. - * - * Some OpenAI model families reject legacy `max_tokens` and require - * `max_output_tokens` when using the Responses API. - * - * @param string $provider Provider identifier. - * @param string $model Model identifier. - */ - public function should_use_max_output_tokens( string $provider, string $model ): bool { - return $this->resolve_provider_message_rules( $provider )->should_use_max_output_tokens( $model ); - } - - /** - * Backward-compatible alias for earlier naming. - * - * @param string $provider Provider identifier. - * @param string $model Model identifier. - */ - public function should_use_max_completion_tokens( string $provider, string $model ): bool { - return $this->should_use_max_output_tokens( $provider, $model ); - } - - /** - * Whether a provider/model combination should apply top-p sampling. - * - * Anthropic rejects requests that send both temperature and top_p together, - * so we skip top_p there and keep temperature as the single sampling control. - * - * @param string $provider Provider identifier. - * @param string $model Model identifier. - */ - public function should_use_top_p( string $provider, string $model ): bool { - return $this->resolve_provider_message_rules( $provider )->should_use_top_p( $model ); - } - - /** - * Whether a provider/model combination supports frequency penalty settings. - * - * @param string $provider Provider identifier. - * @param string $model Model identifier. - */ - public function should_use_frequency_penalty( string $provider, string $model ): bool { - return $this->resolve_provider_message_rules( $provider )->should_use_frequency_penalty( $model ); - } - - /** - * Whether a provider/model combination supports presence penalty settings. - * - * @param string $provider Provider identifier. - * @param string $model Model identifier. - */ - public function should_use_presence_penalty( string $provider, string $model ): bool { - return $this->resolve_provider_message_rules( $provider )->should_use_presence_penalty( $model ); - } - - /** - * Resolve provider message rules implementation for a provider. - * - * @param string $provider Provider identifier. - */ - private function resolve_provider_message_rules( string $provider ): Provider_Message_Rules { - return $this->provider_message_rules_resolver->resolve_for_provider( $provider ); - } - /** * Check whether credentials exist for a provider. * diff --git a/includes/helpers/provider-rules/class-anthropic-provider-message-rules.php b/includes/helpers/provider-rules/class-anthropic-provider-message-rules.php deleted file mode 100644 index 8fa98c8..0000000 --- a/includes/helpers/provider-rules/class-anthropic-provider-message-rules.php +++ /dev/null @@ -1,64 +0,0 @@ -provider_id = '' !== trim( $provider_id ) ? trim( $provider_id ) : '*'; - } - - /** - * {@inheritDoc} - */ - public function get_provider_id(): string { - return $this->provider_id; - } - - /** - * {@inheritDoc} - */ - public function should_use_temperature( string $model ): bool { - unset( $model ); - return false; - } - - /** - * {@inheritDoc} - */ - public function should_use_max_output_tokens( string $model ): bool { - unset( $model ); - return false; - } - - /** - * {@inheritDoc} - */ - public function should_use_top_p( string $model ): bool { - unset( $model ); - return false; - } - - /** - * {@inheritDoc} - */ - public function should_use_frequency_penalty( string $model ): bool { - unset( $model ); - return false; - } - - /** - * {@inheritDoc} - */ - public function should_use_presence_penalty( string $model ): bool { - unset( $model ); - return false; - } -} diff --git a/includes/helpers/provider-rules/class-google-provider-message-rules.php b/includes/helpers/provider-rules/class-google-provider-message-rules.php deleted file mode 100644 index 334cc7d..0000000 --- a/includes/helpers/provider-rules/class-google-provider-message-rules.php +++ /dev/null @@ -1,64 +0,0 @@ - - */ - private const TEMPERATURE_SUPPORTED_MODELS = [ - 'gpt-5.3-codex', - 'gpt-5.2', - 'gpt-5.2-2025-12-11', - ]; - - /** - * Models that reject top_p sampling fields. - * - * @var array - */ - private const TOP_P_UNSUPPORTED_MODELS = [ - 'gpt-5.3-chat-latest', - ]; - - /** - * {@inheritDoc} - */ - public function get_provider_id(): string { - return 'openai'; - } - - /** - * {@inheritDoc} - */ - public function should_use_temperature( string $model ): bool { - $normalized_model = strtolower( trim( $model ) ); - return in_array( $normalized_model, self::TEMPERATURE_SUPPORTED_MODELS, true ); - } - - /** - * {@inheritDoc} - */ - public function should_use_max_output_tokens( string $model ): bool { - $normalized_model = strtolower( trim( $model ) ); - if ( '' === $normalized_model ) { - return false; - } - - return str_starts_with( $normalized_model, 'o1' ) - || str_starts_with( $normalized_model, 'o3' ) - || str_starts_with( $normalized_model, 'o4' ) - || str_starts_with( $normalized_model, 'gpt-5' ); - } - - /** - * {@inheritDoc} - */ - public function should_use_top_p( string $model ): bool { - $normalized_model = strtolower( trim( $model ) ); - return ! in_array( $normalized_model, self::TOP_P_UNSUPPORTED_MODELS, true ); - } - - /** - * {@inheritDoc} - */ - public function should_use_frequency_penalty( string $model ): bool { - unset( $model ); - return true; - } - - /** - * {@inheritDoc} - */ - public function should_use_presence_penalty( string $model ): bool { - unset( $model ); - return true; - } -} diff --git a/includes/helpers/provider-rules/class-provider-message-rules-resolver.php b/includes/helpers/provider-rules/class-provider-message-rules-resolver.php deleted file mode 100644 index a28fa98..0000000 --- a/includes/helpers/provider-rules/class-provider-message-rules-resolver.php +++ /dev/null @@ -1,94 +0,0 @@ - - */ - private array $rules_by_provider = []; - - /** - * Constructor. - * - * @param array|null $rules Optional rules. - */ - public function __construct( ?array $rules = null ) { - $registered_rules = is_array( $rules ) && [] !== $rules - ? $rules - : $this->get_default_rules(); - - foreach ( $registered_rules as $rule ) { - if ( ! $rule instanceof Provider_Message_Rules ) { - continue; - } - - $provider_id = trim( $rule->get_provider_id() ); - if ( self::FALLBACK_PROVIDER_KEY === $provider_id ) { - $this->rules_by_provider[ self::FALLBACK_PROVIDER_KEY ] = $rule; - continue; - } - - $normalized_provider_id = clawpress_sanitize_provider( $provider_id ); - if ( '' === $normalized_provider_id ) { - continue; - } - - $this->rules_by_provider[ $normalized_provider_id ] = $rule; - } - - if ( ! isset( $this->rules_by_provider[ self::FALLBACK_PROVIDER_KEY ] ) ) { - $this->rules_by_provider[ self::FALLBACK_PROVIDER_KEY ] = new Generic_Provider_Message_Rules( - self::FALLBACK_PROVIDER_KEY - ); - } - } - - /** - * Resolve rules for a provider. - * - * @param string $provider Provider identifier. - */ - public function resolve_for_provider( string $provider ): Provider_Message_Rules { - $provider = clawpress_sanitize_provider( $provider ); - if ( '' !== $provider && isset( $this->rules_by_provider[ $provider ] ) ) { - return $this->rules_by_provider[ $provider ]; - } - - return $this->rules_by_provider[ self::FALLBACK_PROVIDER_KEY ]; - } - - /** - * Get the default rule implementations. - * - * @return array - */ - private function get_default_rules(): array { - return [ - new OpenAI_Provider_Message_Rules(), - new Anthropic_Provider_Message_Rules(), - new Google_Provider_Message_Rules(), - new Generic_Provider_Message_Rules( self::FALLBACK_PROVIDER_KEY ), - ]; - } -} - diff --git a/includes/helpers/provider-rules/class-provider-message-rules.php b/includes/helpers/provider-rules/class-provider-message-rules.php deleted file mode 100644 index 6d8e3f0..0000000 --- a/includes/helpers/provider-rules/class-provider-message-rules.php +++ /dev/null @@ -1,57 +0,0 @@ -assertTrue( $provider_helper->should_use_max_output_tokens( 'openai', 'gpt-5.2' ) ); - $this->assertFalse( $provider_helper->should_use_max_output_tokens( 'openai', 'gpt-4o' ) ); - $this->assertTrue( $provider_helper->should_use_max_completion_tokens( 'openai', 'gpt-5.2' ) ); - $this->assertTrue( $provider_helper->should_use_temperature( 'openai', 'gpt-5.2' ) ); - $this->assertTrue( $provider_helper->should_use_temperature( 'openai', 'gpt-5.3-codex' ) ); - $this->assertFalse( $provider_helper->should_use_temperature( 'openai', 'gpt-5.3-chat-latest' ) ); - $this->assertTrue( $provider_helper->should_use_temperature( 'openai', 'gpt-5.2-2025-12-11' ) ); - $this->assertFalse( $provider_helper->should_use_temperature( 'openai', 'gpt-4o' ) ); - $this->assertTrue( $provider_helper->should_use_top_p( 'openai', 'gpt-5.2' ) ); - $this->assertFalse( $provider_helper->should_use_top_p( 'openai', 'gpt-5.3-chat-latest' ) ); - $this->assertTrue( $provider_helper->should_use_frequency_penalty( 'openai', 'gpt-5.2' ) ); - $this->assertTrue( $provider_helper->should_use_presence_penalty( 'openai', 'gpt-5.2' ) ); - } + public function test_supports_provider_id_uses_registered_provider_ids(): void { + WordPress_Stubs::$ai_registered_provider_ids = [ 'openai', 'custom-provider' ]; - public function test_anthropic_rules_disable_conflicting_sampling_and_penalty_options(): void { $provider_helper = Provider_Helper::get_instance(); - $this->assertFalse( $provider_helper->should_use_max_output_tokens( 'anthropic', 'claude-sonnet-4-5' ) ); - $this->assertFalse( $provider_helper->should_use_temperature( 'anthropic', 'claude-sonnet-4-5' ) ); - $this->assertFalse( $provider_helper->should_use_top_p( 'anthropic', 'claude-sonnet-4-5' ) ); - $this->assertFalse( $provider_helper->should_use_frequency_penalty( 'anthropic', 'claude-sonnet-4-5' ) ); - $this->assertFalse( $provider_helper->should_use_presence_penalty( 'anthropic', 'claude-sonnet-4-5' ) ); + $this->assertTrue( $provider_helper->supports_provider_id( 'openai' ) ); + $this->assertTrue( $provider_helper->supports_provider_id( 'custom-provider' ) ); + $this->assertFalse( $provider_helper->supports_provider_id( 'anthropic' ) ); } - public function test_google_rules_use_generic_non_openai_penalty_behavior(): void { + public function test_supports_provider_id_falls_back_to_local_provider_map(): void { $provider_helper = Provider_Helper::get_instance(); - $this->assertFalse( $provider_helper->should_use_max_output_tokens( 'google', 'gemini-2.5-pro' ) ); - $this->assertTrue( $provider_helper->should_use_temperature( 'google', 'gemini-2.5-pro' ) ); - $this->assertTrue( $provider_helper->should_use_top_p( 'google', 'gemini-2.5-pro' ) ); - $this->assertFalse( $provider_helper->should_use_frequency_penalty( 'google', 'gemini-2.5-pro' ) ); - $this->assertFalse( $provider_helper->should_use_presence_penalty( 'google', 'gemini-2.5-pro' ) ); + $this->assertTrue( $provider_helper->supports_provider_id( 'openai' ) ); + $this->assertTrue( $provider_helper->supports_provider_id( 'anthropic' ) ); + $this->assertFalse( $provider_helper->supports_provider_id( 'custom-provider' ) ); } - public function test_unknown_provider_falls_back_to_generic_rules(): void { - $provider_helper = Provider_Helper::get_instance(); + public function test_get_provider_options_formats_registered_provider_labels(): void { + WordPress_Stubs::$ai_registered_provider_ids = [ 'custom-provider' ]; - $this->assertFalse( $provider_helper->should_use_max_output_tokens( 'custom-provider', 'custom-model' ) ); - $this->assertFalse( $provider_helper->should_use_temperature( 'custom-provider', 'custom-model' ) ); - $this->assertFalse( $provider_helper->should_use_top_p( 'custom-provider', 'custom-model' ) ); - $this->assertFalse( $provider_helper->should_use_frequency_penalty( 'custom-provider', 'custom-model' ) ); - $this->assertFalse( $provider_helper->should_use_presence_penalty( 'custom-provider', 'custom-model' ) ); + $provider_helper = Provider_Helper::get_instance(); + $options = $provider_helper->get_provider_options(); + + $this->assertSame( + [ + [ + 'value' => 'custom-provider', + 'label' => 'Custom Provider', + ], + ], + $options + ); } } From 6e9457b4ced5340a2eb9c3c5a484f323d757a23b Mon Sep 17 00:00:00 2001 From: Brad Vincent Date: Thu, 7 May 2026 13:22:39 +0100 Subject: [PATCH 4/9] Show unsupported model settings --- build/scripts/admin.asset.php | 2 +- build/scripts/admin.js | 2 +- build/scripts/style-admin-rtl.css | 2 +- build/scripts/style-admin.css | 2 +- includes/helpers/class-model-helper.php | 33 ++-- .../helpers/class-model-option-helper.php | 143 +++++++++++------- includes/rest/class-settings-controller.php | 28 +++- src/js/admin/components/views/SettingsView.js | 122 ++++++++++++++- src/js/admin/style.scss | 5 + tests/Support/AiClientStubs.php | 2 +- 10 files changed, 262 insertions(+), 79 deletions(-) diff --git a/build/scripts/admin.asset.php b/build/scripts/admin.asset.php index d3e72d0..8fe9dd2 100644 --- a/build/scripts/admin.asset.php +++ b/build/scripts/admin.asset.php @@ -1 +1 @@ - array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-core-data', 'wp-data', 'wp-date', 'wp-dom-ready', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-primitives'), 'version' => '7f4e58ec2035e3ca96d7'); + array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-core-data', 'wp-data', 'wp-date', 'wp-dom-ready', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-primitives'), 'version' => 'a6160f9fb1b0468ff485'); diff --git a/build/scripts/admin.js b/build/scripts/admin.js index 0cad959..bc02780 100644 --- a/build/scripts/admin.js +++ b/build/scripts/admin.js @@ -181,4 +181,4 @@ label:(0,a.__)("Not on"),filterText:(c,l)=>eB((0,a.sprintf)( /* translators: %d: Number of fields that need attention */ /* translators: %d: Number of fields that need attention */ (0,a._n)("%d field needs attention","%d fields need attention",Z),Z)}):null,R={blockStart:"medium",blockEnd:"medium",inlineStart:"medium",inlineEnd:"medium"};if(l.children){const t=!!l.label&&n.withHeader,b={blockStart:t?"none":"medium",blockEnd:"medium",inlineStart:"medium",inlineEnd:"medium"};return(0,m.jsxs)(wC,{className:"dataforms-layouts-card__field",size:R,children:[t&&(0,m.jsxs)(u,{className:"dataforms-layouts-card__field-header",children:[(0,m.jsx)("span",{className:"dataforms-layouts-card__field-header-label",children:l.label}),H,g.length>0&&n.withHeader&&(0,m.jsx)("div",{className:"dataforms-layouts-card__field-summary",children:g.map(l=>(0,m.jsx)(l.render,{item:c,field:l},l.id))})]}),(i||!t)&&(0,m.jsxs)(_C,{size:b,className:"dataforms-layouts-card__field-control",ref:X,onBlur:s,children:[l.description&&(0,m.jsx)("div",{className:"dataforms-layouts-card__field-description",children:l.description}),(0,m.jsx)(uA,{data:c,form:G,onChange:e,validity:d?.children})]})]})}const I=b.find(c=>c.id===l.id);if(!I||!I.Edit)return null;const r=iA("regular")?.component;if(!r)return null;const B=!!I.label&&n.withHeader,y={blockStart:B?"none":"medium",blockEnd:"medium",inlineStart:"medium",inlineEnd:"medium"};return(0,m.jsxs)(wC,{className:"dataforms-layouts-card__field",size:R,children:[B&&(0,m.jsxs)(u,{className:"dataforms-layouts-card__field-header",children:[(0,m.jsx)("span",{className:"dataforms-layouts-card__field-header-label",children:I.label}),H,g.length>0&&n.withHeader&&(0,m.jsx)("div",{className:"dataforms-layouts-card__field-summary",children:g.map(l=>(0,m.jsx)(l.render,{item:c,field:l},l.id))})]}),(i||!B)&&(0,m.jsx)(_C,{size:y,className:"dataforms-layouts-card__field-control",ref:X,onBlur:s,children:(0,m.jsx)(r,{data:c,field:l,onChange:e,hideLabelFromVision:t||B,validity:d})})]})},wrapper:({children:c})=>(0,m.jsx)(xy,{direction:"column",className:"dataforms-layouts__wrapper",gap:"lg",children:c})},{type:"row",component:function({data:c,field:l,onChange:e,hideLabelFromVision:t,validity:d}){const b=l.layout;if(l.children){const n={layout:Qw,fields:l.children};return(0,m.jsxs)("div",{className:"dataforms-layouts-row__field",children:[!t&&l.label&&(0,m.jsx)(nA,{title:l.label}),(0,m.jsx)(xy,{direction:"row",align:b.alignment,gap:"md",children:(0,m.jsx)(uA,{data:c,form:n,onChange:e,validity:d?.children,as:XA,children:(l,d,n)=>(0,m.jsx)("div",{className:"dataforms-layouts-row__field-control",style:b.styles[d.id],children:(0,m.jsx)(l,{data:c,field:d,onChange:e,hideLabelFromVision:t,validity:n})},d.id)})})]})}const n=iA("regular")?.component;return n?(0,m.jsx)(m.Fragment,{children:(0,m.jsx)("div",{className:"dataforms-layouts-row__field-control",children:(0,m.jsx)(n,{data:c,field:l,onChange:e,validity:d})})}):null},wrapper:({children:c,layout:l})=>(0,m.jsx)(xy,{direction:"column",className:"dataforms-layouts__wrapper",gap:"md",children:(0,m.jsx)("div",{className:"dataforms-layouts-row__field",children:(0,m.jsx)(xy,{direction:"row",gap:"md",align:l.alignment,children:c})})})},{type:"details",component:function({data:c,field:l,onChange:e}){const{fields:t}=(0,W.useContext)(Aw),d=(0,W.useMemo)(()=>({layout:Qw,fields:l.children??[]}),[l]);if(!l.children)return null;const b=l.layout.summary??"",n=b?t.find(c=>c.id===b):void 0;let X;return X=n&&n.render?(0,m.jsx)(n.render,{item:c,field:n}):l.label||(0,a.__)("More details"),(0,m.jsxs)("details",{className:"dataforms-layouts-details__details",children:[(0,m.jsx)("summary",{className:"dataforms-layouts-details__summary",children:X}),(0,m.jsx)("div",{className:"dataforms-layouts-details__content",children:(0,m.jsx)(uA,{data:c,form:d,onChange:e})})]})}}];function iA(c){return GA.find(l=>l.type===c)}var aA=({children:c})=>(0,m.jsx)(xy,{direction:"column",className:"dataforms-layouts__wrapper",gap:"md",children:c});function uA({data:c,form:l,onChange:e,validity:t,children:d,as:b}){const{fields:n}=(0,W.useContext)(Aw),X=b??iA(l.layout.type)?.wrapper??aA;return(0,m.jsx)(X,{layout:l.layout,children:l.fields.map(l=>{const b=iA(l.layout.type)?.component;if(!b)return null;const X=l.children?void 0:(G=l,n.find(c=>c.id===G.id));var G;return X&&X.isVisible&&!X.isVisible(c)?null:d?d(b,l,t?.[l.id]):(0,m.jsx)(b,{data:c,field:l,onChange:e,validity:t?.[l.id]},l.id)})})}function xA({data:c,form:l,fields:e,onChange:t,validity:d}){const b=(0,W.useMemo)(()=>Uw(l),[l]),n=(0,W.useMemo)(()=>Bw(e),[e]);return l.fields?(0,m.jsx)(ww,{fields:n,children:(0,m.jsx)(uA,{data:c,form:b,onChange:t,validity:d})}):null}const oA=window.wp.coreData,sA=window.wp.primitives;var gA=(0,m.jsx)(sA.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,m.jsx)(sA.Path,{d:"M19.5 4.5h-7V6h4.44l-5.97 5.97 1.06 1.06L18 7.06v4.44h1.5v-7Zm-13 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-3H17v3a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h3V5.5h-3Z"})}),mA=(0,m.jsx)(sA.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,m.jsx)(sA.Path,{d:"m19 7-3-3-8.5 8.5-1 4 4-1L19 7Zm-7 11.5H5V20h7v-1.5Z"})}),ZA=(0,m.jsx)(sA.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,m.jsx)(sA.Path,{fillRule:"evenodd",clipRule:"evenodd",d:"M12 5.5A2.25 2.25 0 0 0 9.878 7h4.244A2.251 2.251 0 0 0 12 5.5ZM12 4a3.751 3.751 0 0 0-3.675 3H5v1.5h1.27l.818 8.997a2.75 2.75 0 0 0 2.739 2.501h4.347a2.75 2.75 0 0 0 2.738-2.5L17.73 8.5H19V7h-3.325A3.751 3.751 0 0 0 12 4Zm4.224 4.5H7.776l.806 8.861a1.25 1.25 0 0 0 1.245 1.137h4.347a1.25 1.25 0 0 0 1.245-1.137l.805-8.861Z"})});const HA=[{id:"title",label:(0,a.__)("Title","clawpress"),type:"text",enableHiding:!1,enableSorting:!0,enableGlobalSearch:!0,getValue:({item:c})=>c.title?.rendered||"",render:({item:c})=>(0,m.jsx)("a",{href:c.link,target:"_blank",rel:"noopener noreferrer",children:c.title?.rendered||(0,a.__)("(no title)","clawpress")})},{id:"status",label:(0,a.__)("Status","clawpress"),type:"text",enableHiding:!0,enableSorting:!1,getValue:({item:c})=>c.status,render:({item:c})=>{const l={publish:(0,a.__)("Published","clawpress"),draft:(0,a.__)("Draft","clawpress"),pending:(0,a.__)("Pending","clawpress"),private:(0,a.__)("Private","clawpress"),trash:(0,a.__)("Trash","clawpress")};return(0,m.jsx)("span",{className:`status-badge status-${c.status}`,children:l[c.status]||c.status})}},{id:"date",label:(0,a.__)("Date","clawpress"),type:"text",enableHiding:!0,enableSorting:!0,getValue:({item:c})=>c.date,render:({item:c})=>new Date(c.date).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})},{id:"modified",label:(0,a.__)("Modified","clawpress"),type:"text",enableHiding:!0,enableSorting:!1,getValue:({item:c})=>c.modified,render:({item:c})=>new Date(c.modified).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}];function RA(){const[c,l]=(0,G.useState)({type:"table",perPage:10,page:1,sort:{field:"date",direction:"desc"},search:"",filters:[],fields:["title","status","date"]}),{records:e,total:t,totalPages:d,isLoading:b}=function(c){const{records:l,totalItems:e,totalPages:t,isResolving:d,hasResolved:b}=(0,oA.useEntityRecords)("postType","clawpress_agent_file",{per_page:c.perPage,page:c.page,orderby:"title"===c.sort?.field?"title":"date",order:c.sort?.direction||"desc",search:c.search||void 0,status:"any"});return{records:l||[],total:e||0,totalPages:t||0,isLoading:d,hasResolved:b}}(c);return(0,m.jsxs)("div",{className:"clawpress-dataviews",children:[(0,m.jsx)("p",{children:(0,a.__)("Showing ClawPress Agent Files.","clawpress")}),(0,m.jsx)(Fw,{data:e,fields:HA,view:c,onChangeView:l,actions:[{id:"view",label:(0,a.__)("View","clawpress"),icon:gA,callback:c=>{window.open(c[0].link,"_blank")}},{id:"edit",label:(0,a.__)("Edit","clawpress"),icon:mA,callback:c=>{window.location.href=`/wp-admin/post.php?post=${c[0].id}&action=edit`}},{id:"trash",label:(0,a.__)("Move to Trash","clawpress"),icon:ZA,isDestructive:!0,supportsBulk:!0,RenderModal:({items:c,closeModal:l})=>{const{deleteEntityRecord:e}=(0,rW.useDispatch)(oA.store);return(0,m.jsxs)("div",{children:[(0,m.jsx)("p",{children:1===c.length?(0,a.__)("Move this agent file to trash?","clawpress"):(0,a.sprintf)(/* translators: %d: number of agent files */ /* translators: %d: number of agent files */ -(0,a.__)("Move %d agent files to trash?","clawpress"),c.length)}),(0,m.jsxs)(i.Flex,{justify:"flex-end",gap:2,children:[(0,m.jsx)(i.Button,{variant:"secondary",onClick:l,children:(0,a.__)("Cancel","clawpress")}),(0,m.jsx)(i.Button,{variant:"primary",isDestructive:!0,onClick:async()=>{for(const l of c)await e("postType","clawpress_agent_file",l.id);l()},children:(0,a.__)("Move to Trash","clawpress")})]})]})}}],paginationInfo:{totalItems:t,totalPages:d},isLoading:b,getItemId:c=>c.id,defaultLayouts:{table:{},grid:{}},search:!0})]})}var IA=(0,m.jsx)(sA.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,m.jsx)(sA.Path,{d:"m11.3 17.2-5-5c-.1-.1-.1-.3 0-.4l2.3-2.3-1.1-1-2.3 2.3c-.7.7-.7 1.8 0 2.5l5 5H7.5v1.5h5.3v-5.2h-1.5v2.6zm7.5-6.4-5-5h2.7V4.2h-5.2v5.2h1.5V6.8l5 5c.1.1.1.3 0 .4l-2.3 2.3 1.1 1.1 2.3-2.3c.6-.7.6-1.9-.1-2.5z"})});const rA={provider:"",model:"",temperature:.2,top_p:.9,max_output_tokens:1200,frequency_penalty:.2,presence_penalty:0,request_timeout:45,agent_user_id:0,memory_enabled:!1,setup_completed:!1},WA="clawpress_wp_ai_provider_models_v1",BA=c=>"string"==typeof c?c.trim().toLowerCase():"",yA=c=>"string"==typeof c?c.trim().toLowerCase().replace(/[^a-z0-9]/g,""):"",pA=c=>Array.isArray(c)?c.map(c=>{const l="string"==typeof c?.id?c.id.trim():"";let e="";return"string"==typeof c?.label?e=c.label.trim():"string"==typeof c?.name&&(e=c.name.trim()),l?{id:l,label:e||l}:null}).filter(Boolean):[],hA=()=>[{value:"openai",label:(0,a.__)("OpenAI","clawpress")},{value:"anthropic",label:(0,a.__)("Anthropic","clawpress")},{value:"google",label:(0,a.__)("Google","clawpress")}],VA=()=>{if("undefined"==typeof window||!window.localStorage)return{};try{const c=window.localStorage.getItem(WA);if(!c)return{};const l=JSON.parse(c);return l&&"object"==typeof l&&!Array.isArray(l)?l:{}}catch{return{}}},YA=c=>{if("undefined"!=typeof window&&window.localStorage)try{window.localStorage.setItem(WA,JSON.stringify(c))}catch{}},JA=(c,l,e)=>c.filter(c=>{const t=yA(e(c));return t&&l&&(l.startsWith(t)||t.startsWith(l))}).sort((c,l)=>yA(e(l)).length-yA(e(c)).length)[0]||null;function FA(){const[c,l]=(0,G.useState)(!0),[e,t]=(0,G.useState)(!1),[d,b]=(0,G.useState)(""),[n,X]=(0,G.useState)(""),[u,x]=(0,G.useState)(rA),[o,s]=(0,G.useState)(hA()),[Z,H]=(0,G.useState)({}),[R,I]=(0,G.useState)({}),[r,W]=(0,G.useState)({});(0,G.useEffect)(()=>{let c=!0;return(async()=>{l(!0),b("");try{const l=await g("settings");if(!c)return;x(((c={})=>({provider:"string"==typeof c.provider?c.provider:"",model:"string"==typeof c.model?c.model:"",temperature:Number.isFinite(Number(c.temperature))?Number(c.temperature):.2,top_p:Number.isFinite(Number(c.top_p))?Number(c.top_p):.9,max_output_tokens:Number.isFinite(Number(c.max_output_tokens))&&Number(c.max_output_tokens)>0?Number(c.max_output_tokens):1200,frequency_penalty:Number.isFinite(Number(c.frequency_penalty))?Number(c.frequency_penalty):.2,presence_penalty:Number.isFinite(Number(c.presence_penalty))?Number(c.presence_penalty):0,request_timeout:Number.isFinite(Number(c.request_timeout))&&Number(c.request_timeout)>0?Number(c.request_timeout):45,agent_user_id:Number.isFinite(Number(c.agent_user_id))?Number(c.agent_user_id):0,memory_enabled:Boolean(c.memory_enabled),setup_completed:Boolean(c.setup_completed)}))(l?.settings||{})),s((c=>{if(!Array.isArray(c))return hA();const l=c.map(c=>{const l=BA(c?.value),e="string"==typeof c?.label?c.label.trim():"";return l&&e?{value:l,label:e}:null}).filter(Boolean);return l.length>0?l:hA()})(l?.providers||[])),H(!(t=l?.models||{})||"object"!=typeof t||Array.isArray(t)?{}:Object.entries(t).reduce((c,[l,e])=>{const t=BA(l);return t&&Array.isArray(e)?(c[t]=pA(e),c):c},{})),I(!(e=l?.model_catalog||{})||"object"!=typeof e||Array.isArray(e)?{}:Object.entries(e).reduce((c,[l,e])=>{const t=BA(l);if(!t||!Array.isArray(e))return c;const d=e.map(c=>{const l="string"==typeof c?.id?c.id.trim():"",e="string"==typeof c?.label?c.label.trim():"",t="string"==typeof c?.context?c.context.trim():"",d="string"==typeof c?.cost?c.cost.trim():"";return l?{id:l,label:e||l,context:t,cost:d}:null}).filter(Boolean);return d.length>0&&(c[t]=d),c},{}))}catch(l){if(!c)return;b(l?.message||(0,a.__)("Unable to load settings.","clawpress"))}finally{c&&l(!1)}var e,t})(),()=>{c=!1}},[]);const B=(0,G.useCallback)(async(c,{forceRefresh:l=!1}={})=>{const e=BA(c);if(!e)return[];if(!l){const c=(c=>{const l=BA(c);if(!l)return{hasValue:!1,options:[]};const e=VA()[l];return Array.isArray(e)?{hasValue:!0,options:pA(e)}:e&&"object"==typeof e&&Array.isArray(e.models)?{hasValue:!0,options:pA(e.models)}:{hasValue:!1,options:[]}})(e);if(c.hasValue)return H(l=>({...l,[e]:c.options})),c.options}W(c=>({...c,[e]:!0}));try{const c=await(async c=>{const l=BA(c);if(!l)return[];const e=await g(`providers/${encodeURIComponent(l)}/models`);return Array.isArray(e)?pA(e):[]})(e);return H(l=>({...l,[e]:c})),((c,l)=>{const e=BA(c);if(!e)return;const t=VA();t[e]={cached_at:Date.now(),models:pA(l)},YA(t)})(e,c),c}catch{return b((0,a.__)("Unable to refresh models for the selected provider.","clawpress")),[]}finally{W(c=>({...c,[e]:!1}))}},[]),y=BA(u.provider),p=Boolean(r?.[y]),h=(0,G.useMemo)(()=>Array.isArray(Z?.[y])?Z[y]:[],[y,Z]),V=(0,G.useMemo)(()=>{const c="string"==typeof u.model?u.model.trim():"";return c?h.some(l=>l.id===c)?null:{id:c,label:c}:null},[h,u.model]);(0,G.useEffect)(()=>{y&&B(y)},[y,B]);const Y=(0,G.useMemo)(()=>[{label:(0,a.__)("Select a model","clawpress"),value:""},...V?[{label:V.label,value:V.id}]:[],...h.map(c=>({label:c.label,value:c.id}))],[h,V]),J=((c,l,e,t)=>{const d="string"==typeof l?l.trim():"";if(!d)return{selectedEntry:null,modelId:d};const b=BA(c),n=b&&Array.isArray(e?.[b])?e[b]:[],X=Array.isArray(t?.[b])?t[b]:[],G=n.find(c=>c.id===d)||null;return{selectedEntry:((c,l,e="")=>{if(!Array.isArray(c)||0===c.length)return null;const t="string"==typeof l?l.trim():"",d=c.find(c=>c.id===t)||null;if(d)return d;const b=yA(t),n=c.find(c=>yA(c.id)===b)||null;if(n)return n;const X=JA(c,b,c=>c.id);if(X)return X;const G=yA(e);return G?c.find(c=>yA(c.label)===G)||JA(c,G,c=>c.label):null})(X,d,G?.label||"")||null,modelId:d}})(u.provider,u.model,Z,R);let F=null;if(J.modelId){const c=J.selectedEntry?.context||"",l=J.selectedEntry?.cost||"";F=(0,m.jsxs)("span",{className:"clawpress-settings__model-meta",children:[(0,m.jsx)("code",{children:J.modelId}),c?(0,m.jsxs)(m.Fragment,{children:[" ",(0,a.__)("Context Size :","clawpress")," ",(0,m.jsx)("code",{children:c})]}):null,l?(0,m.jsxs)(m.Fragment,{children:[" ",(0,a.__)("Cost :","clawpress")," ",(0,m.jsx)("code",{children:l})]}):null]})}const C=[{id:"provider",type:"text",label:(0,a.__)("Provider","clawpress"),description:(0,a.__)("Choose which AI service ClawPress should use.","clawpress"),Edit:"select",elements:[{label:(0,a.__)("Select a provider","clawpress"),value:""},...o]},{id:"model",type:"text",label:(0,a.__)("Model","clawpress"),description:F,Edit:"select",elements:Y},{id:"temperature",type:"number",label:(0,a.__)("Temperature","clawpress"),description:(0,a.__)("Lower values make replies more focused and consistent. Higher values make replies more creative and varied.","clawpress")},{id:"top_p",type:"number",label:(0,a.__)("Top P","clawpress"),description:(0,a.__)("Lower values keep replies more predictable. Higher values allow more variety in wording and ideas.","clawpress")},{id:"max_output_tokens",type:"integer",label:(0,a.__)("Max Output Tokens","clawpress"),description:(0,a.__)("Sets the maximum reply length. Higher values allow longer answers; lower values keep answers shorter.","clawpress")},{id:"frequency_penalty",type:"number",label:(0,a.__)("Frequency Penalty","clawpress"),description:(0,a.__)("Higher values reduce repeated words and phrases. Lower values allow more repetition.","clawpress")},{id:"presence_penalty",type:"number",label:(0,a.__)("Presence Penalty","clawpress"),description:(0,a.__)("Higher values encourage fresh ideas. Lower values keep replies closer to what has already been said.","clawpress")},{id:"request_timeout",type:"integer",label:(0,a.__)("Request Timeout (seconds)","clawpress"),description:(0,a.__)("How long ClawPress waits for a reply before stopping the request.","clawpress")},{id:"agent_user_id",type:"integer",label:(0,a.__)("Agent User ID","clawpress"),description:(0,a.__)("Use 0 if this is not configured yet.","clawpress")},{id:"memory_enabled",type:"boolean",label:(0,a.__)("Enable Memory","clawpress"),description:(0,a.__)("When enabled, ClawPress can remember useful details from earlier chats.","clawpress"),Edit:"toggle"},{id:"setup_completed",type:"boolean",label:(0,a.__)("Setup Completed","clawpress"),description:(0,a.__)("Turn this on after you finish the initial setup.","clawpress"),Edit:"toggle"}],v={layout:{type:"regular",labelPosition:"top"},fields:["provider","model","request_timeout","agent_user_id","memory_enabled","setup_completed",{id:"generation_settings",label:(0,a.__)("LLM Reply Settings","clawpress"),description:(0,a.__)("Not all settings are supported by every provider or model. Unsupported settings are skipped automatically.","clawpress"),layout:{type:"card",isOpened:!0,withHeader:!0},children:["temperature","top_p","max_output_tokens","frequency_penalty","presence_penalty"]}]};return(0,m.jsx)("div",{className:"clawpress-settings",children:(0,m.jsxs)(i.Card,{children:[(0,m.jsx)(i.CardHeader,{children:(0,m.jsx)("h3",{children:(0,a.__)("Settings","clawpress")})}),(0,m.jsxs)(i.CardBody,{children:[d?(0,m.jsx)(i.Notice,{status:"error",isDismissible:!1,children:d}):null,n?(0,m.jsx)(i.Notice,{status:"success",isDismissible:!1,children:n}):null,c?(0,m.jsx)(i.Spinner,{}):(0,m.jsxs)("div",{children:[(0,m.jsx)(xA,{data:u,fields:C,form:v,onChange:c=>x(l=>{const e={...l,...c};if(Object.prototype.hasOwnProperty.call(c,"provider")){const c=BA(e.provider);(Array.isArray(Z?.[c])?Z[c]:[]).some(c=>c.id===e.model)||(e.model="")}return e})}),(0,m.jsxs)("div",{className:"clawpress-settings__actions",children:[(0,m.jsx)(i.Button,{className:"clawpress-settings__save-button",variant:"primary",onClick:async()=>{t(!0),b(""),X("");try{await g("settings",{method:"POST",body:{provider:u.provider,model:u.model,temperature:Number.isFinite(Number(u.temperature))?Number(u.temperature):.2,top_p:Number.isFinite(Number(u.top_p))?Number(u.top_p):.9,max_output_tokens:Number.isFinite(Number(u.max_output_tokens))&&Number(u.max_output_tokens)>0?Number(u.max_output_tokens):1200,frequency_penalty:Number.isFinite(Number(u.frequency_penalty))?Number(u.frequency_penalty):.2,presence_penalty:Number.isFinite(Number(u.presence_penalty))?Number(u.presence_penalty):0,request_timeout:Number.isFinite(Number(u.request_timeout))&&Number(u.request_timeout)>0?Number(u.request_timeout):45,agent_user_id:Number.isFinite(Number(u.agent_user_id))&&Number(u.agent_user_id)>0?Number(u.agent_user_id):0,memory_enabled:Boolean(u.memory_enabled),setup_completed:Boolean(u.setup_completed)}}),X((0,a.__)("Settings saved.","clawpress"))}catch(c){b(c?.message||(0,a.__)("Unable to save settings.","clawpress"))}finally{t(!1)}},isBusy:e,disabled:e,children:e?(0,a.__)("Saving…","clawpress"):(0,a.__)("Save Settings","clawpress")}),(0,m.jsx)(i.Button,{className:"clawpress-settings__refresh-models-button",variant:"secondary",icon:IA,onClick:async()=>{y&&(b(""),(c=>{const l=BA(c);if(!l)return;const e=VA();delete e[l],YA(e)})(y),await B(y,{forceRefresh:!0}))},isBusy:p,disabled:!y||p||e,children:(0,a.__)("Refresh Models","clawpress")})]})]})]})]})})}function CA(){const{currentView:c,handleTabSelect:l,VIEWS:e}=s(),t=[{name:e.PAGES,title:(0,a.__)("Agent Files","clawpress"),content:(0,m.jsx)(RA,{})},{name:e.SETTINGS,title:(0,a.__)("Settings","clawpress"),content:(0,m.jsx)(FA,{})},{name:e.ABILITIES,title:(0,a.__)("Abilities","clawpress"),content:(0,m.jsx)(r,{})}];return(0,m.jsx)("div",{className:"clawpress-app",children:(0,m.jsx)(i.TabPanel,{tabs:t,initialTabName:c,onSelect:l,children:({content:c})=>(0,m.jsx)("div",{className:"clawpress-tab-content",children:c})})})}X()(()=>{const c=document.getElementById("clawpress-admin-root");c&&(0,G.createRoot)(c).render((0,m.jsx)(CA,{}))})},744(c){"use strict";var l=function(c){return function(c){return!!c&&"object"==typeof c}(c)&&!function(c){var l=Object.prototype.toString.call(c);return"[object RegExp]"===l||"[object Date]"===l||function(c){return c.$$typeof===e}(c)}(c)},e="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function t(c,l){return!1!==l.clone&&l.isMergeableObject(c)?X((e=c,Array.isArray(e)?[]:{}),c,l):c;var e}function d(c,l,e){return c.concat(l).map(function(c){return t(c,e)})}function b(c){return Object.keys(c).concat(function(c){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(c).filter(function(l){return Object.propertyIsEnumerable.call(c,l)}):[]}(c))}function n(c,l){try{return l in c}catch(c){return!1}}function X(c,e,G){(G=G||{}).arrayMerge=G.arrayMerge||d,G.isMergeableObject=G.isMergeableObject||l,G.cloneUnlessOtherwiseSpecified=t;var i=Array.isArray(e);return i===Array.isArray(c)?i?G.arrayMerge(c,e,G):function(c,l,e){var d={};return e.isMergeableObject(c)&&b(c).forEach(function(l){d[l]=t(c[l],e)}),b(l).forEach(function(b){(function(c,l){return n(c,l)&&!(Object.hasOwnProperty.call(c,l)&&Object.propertyIsEnumerable.call(c,l))})(c,b)||(n(c,b)&&e.isMergeableObject(l[b])?d[b]=function(c,l){if(!l.customMerge)return X;var e=l.customMerge(c);return"function"==typeof e?e:X}(b,e)(c[b],l[b],e):d[b]=t(l[b],e))}),d}(c,e,G):t(e,G)}X.all=function(c,l){if(!Array.isArray(c))throw new Error("first argument should be an array");return c.reduce(function(c,e){return X(c,e,l)},{})};var G=X;c.exports=G},252(c){"use strict";c.exports=function c(l,e){if(l===e)return!0;if(l&&e&&"object"==typeof l&&"object"==typeof e){if(l.constructor!==e.constructor)return!1;var t,d,b;if(Array.isArray(l)){if((t=l.length)!=e.length)return!1;for(d=t;0!==d--;)if(!c(l[d],e[d]))return!1;return!0}if(l instanceof Map&&e instanceof Map){if(l.size!==e.size)return!1;for(d of l.entries())if(!e.has(d[0]))return!1;for(d of l.entries())if(!c(d[1],e.get(d[0])))return!1;return!0}if(l instanceof Set&&e instanceof Set){if(l.size!==e.size)return!1;for(d of l.entries())if(!e.has(d[0]))return!1;return!0}if(ArrayBuffer.isView(l)&&ArrayBuffer.isView(e)){if((t=l.length)!=e.length)return!1;for(d=t;0!==d--;)if(l[d]!==e[d])return!1;return!0}if(l.constructor===RegExp)return l.source===e.source&&l.flags===e.flags;if(l.valueOf!==Object.prototype.valueOf)return l.valueOf()===e.valueOf();if(l.toString!==Object.prototype.toString)return l.toString()===e.toString();if((t=(b=Object.keys(l)).length)!==Object.keys(e).length)return!1;for(d=t;0!==d--;)if(!Object.prototype.hasOwnProperty.call(e,b[d]))return!1;for(d=t;0!==d--;){var n=b[d];if(!c(l[n],e[n]))return!1}return!0}return l!=l&&e!=e}},542(c){c.exports=function(c){var l={};function e(t){if(l[t])return l[t].exports;var d=l[t]={exports:{},id:t,loaded:!1};return c[t].call(d.exports,d,d.exports,e),d.loaded=!0,d.exports}return e.m=c,e.c=l,e.p="",e(0)}([function(c,l,e){c.exports=e(1)},function(c,l,e){"use strict";Object.defineProperty(l,"__esModule",{value:!0});var t=e(2);Object.defineProperty(l,"combineChunks",{enumerable:!0,get:function(){return t.combineChunks}}),Object.defineProperty(l,"fillInChunks",{enumerable:!0,get:function(){return t.fillInChunks}}),Object.defineProperty(l,"findAll",{enumerable:!0,get:function(){return t.findAll}}),Object.defineProperty(l,"findChunks",{enumerable:!0,get:function(){return t.findChunks}})},function(c,l){"use strict";Object.defineProperty(l,"__esModule",{value:!0}),l.findAll=function(c){var l=c.autoEscape,b=c.caseSensitive,n=void 0!==b&&b,X=c.findChunks,G=void 0===X?t:X,i=c.sanitize,a=c.searchWords,u=c.textToHighlight;return d({chunksToHighlight:e({chunks:G({autoEscape:l,caseSensitive:n,sanitize:i,searchWords:a,textToHighlight:u})}),totalLength:u?u.length:0})};var e=l.combineChunks=function(c){var l=c.chunks;return l.sort(function(c,l){return c.start-l.start}).reduce(function(c,l){if(0===c.length)return[l];var e=c.pop();if(l.startG&&c.push({highlight:!1,start:G,end:i}),n.index===b.lastIndex&&b.lastIndex++}return c},[])};l.findChunks=t;var d=l.fillInChunks=function(c){var l=c.chunksToHighlight,e=c.totalLength,t=[],d=function(c,l,e){l-c>0&&t.push({start:c,end:l,highlight:e})};if(0===l.length)d(0,e,!1);else{var b=0;l.forEach(function(c){d(b,c.start,!1),d(c.start,c.end,!0),b=c.end}),d(b,e,!1)}return t};function b(c){return c}}])},146(c,l,e){"use strict";var t=e(363),d={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},b={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},n={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},X={};function G(c){return t.isMemo(c)?n:X[c.$$typeof]||d}X[t.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},X[t.Memo]=n;var i=Object.defineProperty,a=Object.getOwnPropertyNames,u=Object.getOwnPropertySymbols,x=Object.getOwnPropertyDescriptor,o=Object.getPrototypeOf,s=Object.prototype;c.exports=function c(l,e,t){if("string"!=typeof e){if(s){var d=o(e);d&&d!==s&&c(l,d,t)}var n=a(e);u&&(n=n.concat(u(e)));for(var X=G(l),g=G(e),m=0;m{if(!e){var n=1/0;for(a=0;a=d)&&Object.keys(b.O).every(c=>b.O[c](e[G]))?e.splice(G--,1):(X=!1,d0&&c[a-1][2]>d;a--)c[a]=c[a-1];c[a]=[e,t,d]},b.n=c=>{var l=c&&c.__esModule?()=>c.default:()=>c;return b.d(l,{a:l}),l},e=Object.getPrototypeOf?c=>Object.getPrototypeOf(c):c=>c.__proto__,b.t=function(c,t){if(1&t&&(c=this(c)),8&t)return c;if("object"==typeof c&&c){if(4&t&&c.__esModule)return c;if(16&t&&"function"==typeof c.then)return c}var d=Object.create(null);b.r(d);var n={};l=l||[null,e({}),e([]),e(e)];for(var X=2&t&&c;("object"==typeof X||"function"==typeof X)&&!~l.indexOf(X);X=e(X))Object.getOwnPropertyNames(X).forEach(l=>n[l]=()=>c[l]);return n.default=()=>c,b.d(d,n),d},b.d=(c,l)=>{for(var e in l)b.o(l,e)&&!b.o(c,e)&&Object.defineProperty(c,e,{enumerable:!0,get:l[e]})},b.o=(c,l)=>Object.prototype.hasOwnProperty.call(c,l),b.r=c=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(c,"__esModule",{value:!0})},(()=>{var c={884:0,15:0};b.O.j=l=>0===c[l];var l=(l,e)=>{var t,d,[n,X,G]=e,i=0;if(n.some(l=>0!==c[l])){for(t in X)b.o(X,t)&&(b.m[t]=X[t]);if(G)var a=G(b)}for(l&&l(e);ib(71));n=b.O(n)})(); \ No newline at end of file +(0,a.__)("Move %d agent files to trash?","clawpress"),c.length)}),(0,m.jsxs)(i.Flex,{justify:"flex-end",gap:2,children:[(0,m.jsx)(i.Button,{variant:"secondary",onClick:l,children:(0,a.__)("Cancel","clawpress")}),(0,m.jsx)(i.Button,{variant:"primary",isDestructive:!0,onClick:async()=>{for(const l of c)await e("postType","clawpress_agent_file",l.id);l()},children:(0,a.__)("Move to Trash","clawpress")})]})]})}}],paginationInfo:{totalItems:t,totalPages:d},isLoading:b,getItemId:c=>c.id,defaultLayouts:{table:{},grid:{}},search:!0})]})}var IA=(0,m.jsx)(sA.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,m.jsx)(sA.Path,{d:"m11.3 17.2-5-5c-.1-.1-.1-.3 0-.4l2.3-2.3-1.1-1-2.3 2.3c-.7.7-.7 1.8 0 2.5l5 5H7.5v1.5h5.3v-5.2h-1.5v2.6zm7.5-6.4-5-5h2.7V4.2h-5.2v5.2h1.5V6.8l5 5c.1.1.1.3 0 .4l-2.3 2.3 1.1 1.1 2.3-2.3c.6-.7.6-1.9-.1-2.5z"})});const rA={provider:"",model:"",temperature:.2,top_p:.9,max_output_tokens:1200,frequency_penalty:.2,presence_penalty:0,request_timeout:45,agent_user_id:0,memory_enabled:!1,setup_completed:!1},WA="clawpress_wp_ai_provider_models_v1",BA=c=>"string"==typeof c?c.trim().toLowerCase():"",yA=c=>"string"==typeof c?c.trim().toLowerCase().replace(/[^a-z0-9]/g,""):"",pA=c=>Array.isArray(c)?c.map(c=>"string"==typeof c?c.trim():"").filter(Boolean):[],hA=c=>Array.isArray(c)?c.map(c=>{const l="string"==typeof c?.id?c.id.trim():"";let e="";return"string"==typeof c?.label?e=c.label.trim():"string"==typeof c?.name&&(e=c.name.trim()),l?{id:l,label:e||l,supported_options:pA(c?.supported_options),unsupported_generation_options:pA(c?.unsupported_generation_options),unsupported_generation_option_labels:pA(c?.unsupported_generation_option_labels),learned_unsupported_options:pA(c?.learned_unsupported_options)}:null}).filter(Boolean):[],VA=()=>[{value:"openai",label:(0,a.__)("OpenAI","clawpress")},{value:"anthropic",label:(0,a.__)("Anthropic","clawpress")},{value:"google",label:(0,a.__)("Google","clawpress")}],YA=()=>{if("undefined"==typeof window||!window.localStorage)return{};try{const c=window.localStorage.getItem(WA);if(!c)return{};const l=JSON.parse(c);return l&&"object"==typeof l&&!Array.isArray(l)?l:{}}catch{return{}}},JA=c=>{if("undefined"!=typeof window&&window.localStorage)try{window.localStorage.setItem(WA,JSON.stringify(c))}catch{}},FA=(c,l,e)=>c.filter(c=>{const t=yA(e(c));return t&&l&&(l.startsWith(t)||t.startsWith(l))}).sort((c,l)=>yA(e(l)).length-yA(e(c)).length)[0]||null;function CA(){const[c,l]=(0,G.useState)(!0),[e,t]=(0,G.useState)(!1),[d,b]=(0,G.useState)(""),[n,X]=(0,G.useState)(""),[u,x]=(0,G.useState)(rA),[o,s]=(0,G.useState)(VA()),[Z,H]=(0,G.useState)({}),[R,I]=(0,G.useState)({}),[r,W]=(0,G.useState)({});(0,G.useEffect)(()=>{let c=!0;return(async()=>{l(!0),b("");try{const l=await g("settings");if(!c)return;x(((c={})=>({provider:"string"==typeof c.provider?c.provider:"",model:"string"==typeof c.model?c.model:"",temperature:Number.isFinite(Number(c.temperature))?Number(c.temperature):.2,top_p:Number.isFinite(Number(c.top_p))?Number(c.top_p):.9,max_output_tokens:Number.isFinite(Number(c.max_output_tokens))&&Number(c.max_output_tokens)>0?Number(c.max_output_tokens):1200,frequency_penalty:Number.isFinite(Number(c.frequency_penalty))?Number(c.frequency_penalty):.2,presence_penalty:Number.isFinite(Number(c.presence_penalty))?Number(c.presence_penalty):0,request_timeout:Number.isFinite(Number(c.request_timeout))&&Number(c.request_timeout)>0?Number(c.request_timeout):45,agent_user_id:Number.isFinite(Number(c.agent_user_id))?Number(c.agent_user_id):0,memory_enabled:Boolean(c.memory_enabled),setup_completed:Boolean(c.setup_completed)}))(l?.settings||{})),s((c=>{if(!Array.isArray(c))return VA();const l=c.map(c=>{const l=BA(c?.value),e="string"==typeof c?.label?c.label.trim():"";return l&&e?{value:l,label:e}:null}).filter(Boolean);return l.length>0?l:VA()})(l?.providers||[])),H(((c,l,e,t)=>{const d=BA(l),b="string"==typeof e?e.trim():"",n=(c=>!c||"object"!=typeof c||Array.isArray(c)?null:{supported_options:pA(c.supported_options),unsupported_generation_options:pA(c.unsupported_generation_options),unsupported_generation_option_labels:pA(c.unsupported_generation_option_labels),learned_unsupported_options:pA(c.learned_unsupported_options)})(t);if(!d||!b||!n)return c;const X=Array.isArray(c?.[d])?c[d]:[],G=X.findIndex(c=>c.id===b),i={...G>=0?X[G]:{id:b,label:b},...n},a=G>=0?X.map((c,l)=>l===G?i:c):[i,...X];return{...c,[d]:a}})(!(t=l?.models||{})||"object"!=typeof t||Array.isArray(t)?{}:Object.entries(t).reduce((c,[l,e])=>{const t=BA(l);return t&&Array.isArray(e)?(c[t]=hA(e),c):c},{}),l?.settings?.provider,l?.settings?.model,l?.model_option_summary)),I(!(e=l?.model_catalog||{})||"object"!=typeof e||Array.isArray(e)?{}:Object.entries(e).reduce((c,[l,e])=>{const t=BA(l);if(!t||!Array.isArray(e))return c;const d=e.map(c=>{const l="string"==typeof c?.id?c.id.trim():"",e="string"==typeof c?.label?c.label.trim():"",t="string"==typeof c?.context?c.context.trim():"",d="string"==typeof c?.cost?c.cost.trim():"";return l?{id:l,label:e||l,context:t,cost:d}:null}).filter(Boolean);return d.length>0&&(c[t]=d),c},{}))}catch(l){if(!c)return;b(l?.message||(0,a.__)("Unable to load settings.","clawpress"))}finally{c&&l(!1)}var e,t})(),()=>{c=!1}},[]);const B=(0,G.useCallback)(async(c,{forceRefresh:l=!1}={})=>{const e=BA(c);if(!e)return[];if(!l){const c=(c=>{const l=BA(c);if(!l)return{hasValue:!1,options:[]};const e=YA()[l];return Array.isArray(e)?{hasValue:!0,options:hA(e)}:e&&"object"==typeof e&&Array.isArray(e.models)?{hasValue:!0,options:hA(e.models)}:{hasValue:!1,options:[]}})(e);if(c.hasValue)return H(l=>({...l,[e]:c.options})),c.options}W(c=>({...c,[e]:!0}));try{const c=await(async c=>{const l=BA(c);if(!l)return[];const e=await g(`providers/${encodeURIComponent(l)}/models`);return Array.isArray(e)?hA(e):[]})(e);return H(l=>({...l,[e]:c})),((c,l)=>{const e=BA(c);if(!e)return;const t=YA();t[e]={cached_at:Date.now(),models:hA(l)},JA(t)})(e,c),c}catch{return b((0,a.__)("Unable to refresh models for the selected provider.","clawpress")),[]}finally{W(c=>({...c,[e]:!1}))}},[]),y=BA(u.provider),p=Boolean(r?.[y]),h=(0,G.useMemo)(()=>Array.isArray(Z?.[y])?Z[y]:[],[y,Z]),V=(0,G.useMemo)(()=>{const c="string"==typeof u.model?u.model.trim():"";return c&&h.find(l=>l.id===c)||null},[h,u.model]),Y=(0,G.useMemo)(()=>{const c="string"==typeof u.model?u.model.trim():"";return c?V?null:{id:c,label:c}:null},[V,u.model]);(0,G.useEffect)(()=>{y&&B(y)},[y,B]);const J=(0,G.useMemo)(()=>[{label:(0,a.__)("Select a model","clawpress"),value:""},...Y?[{label:Y.label,value:Y.id}]:[],...h.map(c=>({label:c.label,value:c.id}))],[h,Y]),F=((c,l,e,t)=>{const d="string"==typeof l?l.trim():"";if(!d)return{selectedEntry:null,modelId:d};const b=BA(c),n=b&&Array.isArray(e?.[b])?e[b]:[],X=Array.isArray(t?.[b])?t[b]:[],G=n.find(c=>c.id===d)||null;return{selectedEntry:((c,l,e="")=>{if(!Array.isArray(c)||0===c.length)return null;const t="string"==typeof l?l.trim():"",d=c.find(c=>c.id===t)||null;if(d)return d;const b=yA(t),n=c.find(c=>yA(c.id)===b)||null;if(n)return n;const X=FA(c,b,c=>c.id);if(X)return X;const G=yA(e);return G?c.find(c=>yA(c.label)===G)||FA(c,G,c=>c.label):null})(X,d,G?.label||"")||null,modelId:d}})(u.provider,u.model,Z,R);let C=null;if(F.modelId){const c=F.selectedEntry?.context||"",l=F.selectedEntry?.cost||"",e=V?.unsupported_generation_option_labels||[];C=(0,m.jsxs)("span",{className:"clawpress-settings__model-meta",children:[(0,m.jsx)("code",{children:F.modelId}),c?(0,m.jsxs)(m.Fragment,{children:[" ",(0,a.__)("Context Size :","clawpress")," ",(0,m.jsx)("code",{children:c})]}):null,l?(0,m.jsxs)(m.Fragment,{children:[" ",(0,a.__)("Cost :","clawpress")," ",(0,m.jsx)("code",{children:l})]}):null,e.length>0?(0,m.jsxs)("span",{className:"clawpress-settings__model-skipped",children:[" ",(0,a.__)("Skipped Settings :","clawpress")," ",(0,m.jsx)("code",{children:e.join(", ")})]}):null]})}const v=[{id:"provider",type:"text",label:(0,a.__)("Provider","clawpress"),description:(0,a.__)("Choose which AI service ClawPress should use.","clawpress"),Edit:"select",elements:[{label:(0,a.__)("Select a provider","clawpress"),value:""},...o]},{id:"model",type:"text",label:(0,a.__)("Model","clawpress"),description:C,Edit:"select",elements:J},{id:"temperature",type:"number",label:(0,a.__)("Temperature","clawpress"),description:(0,a.__)("Lower values make replies more focused and consistent. Higher values make replies more creative and varied.","clawpress")},{id:"top_p",type:"number",label:(0,a.__)("Top P","clawpress"),description:(0,a.__)("Lower values keep replies more predictable. Higher values allow more variety in wording and ideas.","clawpress")},{id:"max_output_tokens",type:"integer",label:(0,a.__)("Max Output Tokens","clawpress"),description:(0,a.__)("Sets the maximum reply length. Higher values allow longer answers; lower values keep answers shorter.","clawpress")},{id:"frequency_penalty",type:"number",label:(0,a.__)("Frequency Penalty","clawpress"),description:(0,a.__)("Higher values reduce repeated words and phrases. Lower values allow more repetition.","clawpress")},{id:"presence_penalty",type:"number",label:(0,a.__)("Presence Penalty","clawpress"),description:(0,a.__)("Higher values encourage fresh ideas. Lower values keep replies closer to what has already been said.","clawpress")},{id:"request_timeout",type:"integer",label:(0,a.__)("Request Timeout (seconds)","clawpress"),description:(0,a.__)("How long ClawPress waits for a reply before stopping the request.","clawpress")},{id:"agent_user_id",type:"integer",label:(0,a.__)("Agent User ID","clawpress"),description:(0,a.__)("Use 0 if this is not configured yet.","clawpress")},{id:"memory_enabled",type:"boolean",label:(0,a.__)("Enable Memory","clawpress"),description:(0,a.__)("When enabled, ClawPress can remember useful details from earlier chats.","clawpress"),Edit:"toggle"},{id:"setup_completed",type:"boolean",label:(0,a.__)("Setup Completed","clawpress"),description:(0,a.__)("Turn this on after you finish the initial setup.","clawpress"),Edit:"toggle"}],N={layout:{type:"regular",labelPosition:"top"},fields:["provider","model","request_timeout","agent_user_id","memory_enabled","setup_completed",{id:"generation_settings",label:(0,a.__)("LLM Reply Settings","clawpress"),description:(0,a.__)("Not all settings are supported by every provider or model. Unsupported settings are skipped automatically.","clawpress"),layout:{type:"card",isOpened:!0,withHeader:!0},children:["temperature","top_p","max_output_tokens","frequency_penalty","presence_penalty"]}]};return(0,m.jsx)("div",{className:"clawpress-settings",children:(0,m.jsxs)(i.Card,{children:[(0,m.jsx)(i.CardHeader,{children:(0,m.jsx)("h3",{children:(0,a.__)("Settings","clawpress")})}),(0,m.jsxs)(i.CardBody,{children:[d?(0,m.jsx)(i.Notice,{status:"error",isDismissible:!1,children:d}):null,n?(0,m.jsx)(i.Notice,{status:"success",isDismissible:!1,children:n}):null,c?(0,m.jsx)(i.Spinner,{}):(0,m.jsxs)("div",{children:[(0,m.jsx)(xA,{data:u,fields:v,form:N,onChange:c=>x(l=>{const e={...l,...c};if(Object.prototype.hasOwnProperty.call(c,"provider")){const c=BA(e.provider);(Array.isArray(Z?.[c])?Z[c]:[]).some(c=>c.id===e.model)||(e.model="")}return e})}),(0,m.jsxs)("div",{className:"clawpress-settings__actions",children:[(0,m.jsx)(i.Button,{className:"clawpress-settings__save-button",variant:"primary",onClick:async()=>{t(!0),b(""),X("");try{await g("settings",{method:"POST",body:{provider:u.provider,model:u.model,temperature:Number.isFinite(Number(u.temperature))?Number(u.temperature):.2,top_p:Number.isFinite(Number(u.top_p))?Number(u.top_p):.9,max_output_tokens:Number.isFinite(Number(u.max_output_tokens))&&Number(u.max_output_tokens)>0?Number(u.max_output_tokens):1200,frequency_penalty:Number.isFinite(Number(u.frequency_penalty))?Number(u.frequency_penalty):.2,presence_penalty:Number.isFinite(Number(u.presence_penalty))?Number(u.presence_penalty):0,request_timeout:Number.isFinite(Number(u.request_timeout))&&Number(u.request_timeout)>0?Number(u.request_timeout):45,agent_user_id:Number.isFinite(Number(u.agent_user_id))&&Number(u.agent_user_id)>0?Number(u.agent_user_id):0,memory_enabled:Boolean(u.memory_enabled),setup_completed:Boolean(u.setup_completed)}}),X((0,a.__)("Settings saved.","clawpress"))}catch(c){b(c?.message||(0,a.__)("Unable to save settings.","clawpress"))}finally{t(!1)}},isBusy:e,disabled:e,children:e?(0,a.__)("Saving…","clawpress"):(0,a.__)("Save Settings","clawpress")}),(0,m.jsx)(i.Button,{className:"clawpress-settings__refresh-models-button",variant:"secondary",icon:IA,onClick:async()=>{y&&(b(""),(c=>{const l=BA(c);if(!l)return;const e=YA();delete e[l],JA(e)})(y),await B(y,{forceRefresh:!0}))},isBusy:p,disabled:!y||p||e,children:(0,a.__)("Refresh Models","clawpress")})]})]})]})]})})}function vA(){const{currentView:c,handleTabSelect:l,VIEWS:e}=s(),t=[{name:e.PAGES,title:(0,a.__)("Agent Files","clawpress"),content:(0,m.jsx)(RA,{})},{name:e.SETTINGS,title:(0,a.__)("Settings","clawpress"),content:(0,m.jsx)(CA,{})},{name:e.ABILITIES,title:(0,a.__)("Abilities","clawpress"),content:(0,m.jsx)(r,{})}];return(0,m.jsx)("div",{className:"clawpress-app",children:(0,m.jsx)(i.TabPanel,{tabs:t,initialTabName:c,onSelect:l,children:({content:c})=>(0,m.jsx)("div",{className:"clawpress-tab-content",children:c})})})}X()(()=>{const c=document.getElementById("clawpress-admin-root");c&&(0,G.createRoot)(c).render((0,m.jsx)(vA,{}))})},744(c){"use strict";var l=function(c){return function(c){return!!c&&"object"==typeof c}(c)&&!function(c){var l=Object.prototype.toString.call(c);return"[object RegExp]"===l||"[object Date]"===l||function(c){return c.$$typeof===e}(c)}(c)},e="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function t(c,l){return!1!==l.clone&&l.isMergeableObject(c)?X((e=c,Array.isArray(e)?[]:{}),c,l):c;var e}function d(c,l,e){return c.concat(l).map(function(c){return t(c,e)})}function b(c){return Object.keys(c).concat(function(c){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(c).filter(function(l){return Object.propertyIsEnumerable.call(c,l)}):[]}(c))}function n(c,l){try{return l in c}catch(c){return!1}}function X(c,e,G){(G=G||{}).arrayMerge=G.arrayMerge||d,G.isMergeableObject=G.isMergeableObject||l,G.cloneUnlessOtherwiseSpecified=t;var i=Array.isArray(e);return i===Array.isArray(c)?i?G.arrayMerge(c,e,G):function(c,l,e){var d={};return e.isMergeableObject(c)&&b(c).forEach(function(l){d[l]=t(c[l],e)}),b(l).forEach(function(b){(function(c,l){return n(c,l)&&!(Object.hasOwnProperty.call(c,l)&&Object.propertyIsEnumerable.call(c,l))})(c,b)||(n(c,b)&&e.isMergeableObject(l[b])?d[b]=function(c,l){if(!l.customMerge)return X;var e=l.customMerge(c);return"function"==typeof e?e:X}(b,e)(c[b],l[b],e):d[b]=t(l[b],e))}),d}(c,e,G):t(e,G)}X.all=function(c,l){if(!Array.isArray(c))throw new Error("first argument should be an array");return c.reduce(function(c,e){return X(c,e,l)},{})};var G=X;c.exports=G},252(c){"use strict";c.exports=function c(l,e){if(l===e)return!0;if(l&&e&&"object"==typeof l&&"object"==typeof e){if(l.constructor!==e.constructor)return!1;var t,d,b;if(Array.isArray(l)){if((t=l.length)!=e.length)return!1;for(d=t;0!==d--;)if(!c(l[d],e[d]))return!1;return!0}if(l instanceof Map&&e instanceof Map){if(l.size!==e.size)return!1;for(d of l.entries())if(!e.has(d[0]))return!1;for(d of l.entries())if(!c(d[1],e.get(d[0])))return!1;return!0}if(l instanceof Set&&e instanceof Set){if(l.size!==e.size)return!1;for(d of l.entries())if(!e.has(d[0]))return!1;return!0}if(ArrayBuffer.isView(l)&&ArrayBuffer.isView(e)){if((t=l.length)!=e.length)return!1;for(d=t;0!==d--;)if(l[d]!==e[d])return!1;return!0}if(l.constructor===RegExp)return l.source===e.source&&l.flags===e.flags;if(l.valueOf!==Object.prototype.valueOf)return l.valueOf()===e.valueOf();if(l.toString!==Object.prototype.toString)return l.toString()===e.toString();if((t=(b=Object.keys(l)).length)!==Object.keys(e).length)return!1;for(d=t;0!==d--;)if(!Object.prototype.hasOwnProperty.call(e,b[d]))return!1;for(d=t;0!==d--;){var n=b[d];if(!c(l[n],e[n]))return!1}return!0}return l!=l&&e!=e}},542(c){c.exports=function(c){var l={};function e(t){if(l[t])return l[t].exports;var d=l[t]={exports:{},id:t,loaded:!1};return c[t].call(d.exports,d,d.exports,e),d.loaded=!0,d.exports}return e.m=c,e.c=l,e.p="",e(0)}([function(c,l,e){c.exports=e(1)},function(c,l,e){"use strict";Object.defineProperty(l,"__esModule",{value:!0});var t=e(2);Object.defineProperty(l,"combineChunks",{enumerable:!0,get:function(){return t.combineChunks}}),Object.defineProperty(l,"fillInChunks",{enumerable:!0,get:function(){return t.fillInChunks}}),Object.defineProperty(l,"findAll",{enumerable:!0,get:function(){return t.findAll}}),Object.defineProperty(l,"findChunks",{enumerable:!0,get:function(){return t.findChunks}})},function(c,l){"use strict";Object.defineProperty(l,"__esModule",{value:!0}),l.findAll=function(c){var l=c.autoEscape,b=c.caseSensitive,n=void 0!==b&&b,X=c.findChunks,G=void 0===X?t:X,i=c.sanitize,a=c.searchWords,u=c.textToHighlight;return d({chunksToHighlight:e({chunks:G({autoEscape:l,caseSensitive:n,sanitize:i,searchWords:a,textToHighlight:u})}),totalLength:u?u.length:0})};var e=l.combineChunks=function(c){var l=c.chunks;return l.sort(function(c,l){return c.start-l.start}).reduce(function(c,l){if(0===c.length)return[l];var e=c.pop();if(l.startG&&c.push({highlight:!1,start:G,end:i}),n.index===b.lastIndex&&b.lastIndex++}return c},[])};l.findChunks=t;var d=l.fillInChunks=function(c){var l=c.chunksToHighlight,e=c.totalLength,t=[],d=function(c,l,e){l-c>0&&t.push({start:c,end:l,highlight:e})};if(0===l.length)d(0,e,!1);else{var b=0;l.forEach(function(c){d(b,c.start,!1),d(c.start,c.end,!0),b=c.end}),d(b,e,!1)}return t};function b(c){return c}}])},146(c,l,e){"use strict";var t=e(363),d={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},b={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},n={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},X={};function G(c){return t.isMemo(c)?n:X[c.$$typeof]||d}X[t.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},X[t.Memo]=n;var i=Object.defineProperty,a=Object.getOwnPropertyNames,u=Object.getOwnPropertySymbols,x=Object.getOwnPropertyDescriptor,o=Object.getPrototypeOf,s=Object.prototype;c.exports=function c(l,e,t){if("string"!=typeof e){if(s){var d=o(e);d&&d!==s&&c(l,d,t)}var n=a(e);u&&(n=n.concat(u(e)));for(var X=G(l),g=G(e),m=0;m{if(!e){var n=1/0;for(a=0;a=d)&&Object.keys(b.O).every(c=>b.O[c](e[G]))?e.splice(G--,1):(X=!1,d0&&c[a-1][2]>d;a--)c[a]=c[a-1];c[a]=[e,t,d]},b.n=c=>{var l=c&&c.__esModule?()=>c.default:()=>c;return b.d(l,{a:l}),l},e=Object.getPrototypeOf?c=>Object.getPrototypeOf(c):c=>c.__proto__,b.t=function(c,t){if(1&t&&(c=this(c)),8&t)return c;if("object"==typeof c&&c){if(4&t&&c.__esModule)return c;if(16&t&&"function"==typeof c.then)return c}var d=Object.create(null);b.r(d);var n={};l=l||[null,e({}),e([]),e(e)];for(var X=2&t&&c;("object"==typeof X||"function"==typeof X)&&!~l.indexOf(X);X=e(X))Object.getOwnPropertyNames(X).forEach(l=>n[l]=()=>c[l]);return n.default=()=>c,b.d(d,n),d},b.d=(c,l)=>{for(var e in l)b.o(l,e)&&!b.o(c,e)&&Object.defineProperty(c,e,{enumerable:!0,get:l[e]})},b.o=(c,l)=>Object.prototype.hasOwnProperty.call(c,l),b.r=c=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(c,"__esModule",{value:!0})},(()=>{var c={884:0,15:0};b.O.j=l=>0===c[l];var l=(l,e)=>{var t,d,[n,X,G]=e,i=0;if(n.some(l=>0!==c[l])){for(t in X)b.o(X,t)&&(b.m[t]=X[t]);if(G)var a=G(b)}for(l&&l(e);ib(71));n=b.O(n)})(); \ No newline at end of file diff --git a/build/scripts/style-admin-rtl.css b/build/scripts/style-admin-rtl.css index bbc78a9..d99977b 100644 --- a/build/scripts/style-admin-rtl.css +++ b/build/scripts/style-admin-rtl.css @@ -1 +1 @@ -:root{--wpds-border-radius-lg:8px;--wpds-border-radius-md:4px;--wpds-border-radius-sm:2px;--wpds-border-radius-xs:1px;--wpds-border-width-focus:2px;--wpds-border-width-lg:8px;--wpds-border-width-md:4px;--wpds-border-width-sm:2px;--wpds-border-width-xs:1px;--wpds-color-bg-interactive-brand-strong:#3858e9;--wpds-color-bg-interactive-brand-strong-active:#2e49d9;--wpds-color-bg-interactive-brand-weak:#00000000;--wpds-color-bg-interactive-brand-weak-active:#e6eaf4;--wpds-color-bg-interactive-error:#00000000;--wpds-color-bg-interactive-error-active:#fff6f4;--wpds-color-bg-interactive-error-strong:#cc1818;--wpds-color-bg-interactive-error-strong-active:#b90000;--wpds-color-bg-interactive-error-weak:#00000000;--wpds-color-bg-interactive-error-weak-active:#f6e6e3;--wpds-color-bg-interactive-neutral-strong:#2d2d2d;--wpds-color-bg-interactive-neutral-strong-active:#1e1e1e;--wpds-color-bg-interactive-neutral-strong-disabled:#e2e2e2;--wpds-color-bg-interactive-neutral-weak:#00000000;--wpds-color-bg-interactive-neutral-weak-active:#eaeaea;--wpds-color-bg-interactive-neutral-weak-disabled:#00000000;--wpds-color-bg-surface-brand:#ecf0f9;--wpds-color-bg-surface-caution:#fee994;--wpds-color-bg-surface-caution-weak:#fff9c9;--wpds-color-bg-surface-error:#f6e6e3;--wpds-color-bg-surface-error-weak:#fff6f4;--wpds-color-bg-surface-info:#deebfa;--wpds-color-bg-surface-info-weak:#f2f9ff;--wpds-color-bg-surface-neutral:#f8f8f8;--wpds-color-bg-surface-neutral-strong:#fff;--wpds-color-bg-surface-neutral-weak:#f0f0f0;--wpds-color-bg-surface-success:#c5f7cc;--wpds-color-bg-surface-success-weak:#eaffed;--wpds-color-bg-surface-warning:#fde6bd;--wpds-color-bg-surface-warning-weak:#fff7e0;--wpds-color-bg-thumb-brand:#3858e9;--wpds-color-bg-thumb-brand-active:#3858e9;--wpds-color-bg-thumb-neutral-disabled:#d8d8d8;--wpds-color-bg-thumb-neutral-weak:#8a8a8a;--wpds-color-bg-thumb-neutral-weak-active:#6c6c6c;--wpds-color-bg-track-neutral:#d8d8d8;--wpds-color-bg-track-neutral-weak:#e0e0e0;--wpds-color-fg-content-caution:#281d00;--wpds-color-fg-content-caution-weak:#826a00;--wpds-color-fg-content-error:#470000;--wpds-color-fg-content-error-weak:#cc1818;--wpds-color-fg-content-info:#001b4f;--wpds-color-fg-content-info-weak:#006bd7;--wpds-color-fg-content-neutral:#1e1e1e;--wpds-color-fg-content-neutral-weak:#6d6d6d;--wpds-color-fg-content-success:#002900;--wpds-color-fg-content-success-weak:#007f30;--wpds-color-fg-content-warning:#2e1900;--wpds-color-fg-content-warning-weak:#926300;--wpds-color-fg-interactive-brand:#3858e9;--wpds-color-fg-interactive-brand-active:#3858e9;--wpds-color-fg-interactive-brand-strong:#eff0f2;--wpds-color-fg-interactive-brand-strong-active:#eff0f2;--wpds-color-fg-interactive-error:#cc1818;--wpds-color-fg-interactive-error-active:#cc1818;--wpds-color-fg-interactive-error-strong:#f2efef;--wpds-color-fg-interactive-error-strong-active:#f2efef;--wpds-color-fg-interactive-neutral:#1e1e1e;--wpds-color-fg-interactive-neutral-active:#1e1e1e;--wpds-color-fg-interactive-neutral-disabled:#8a8a8a;--wpds-color-fg-interactive-neutral-strong:#f0f0f0;--wpds-color-fg-interactive-neutral-strong-active:#f0f0f0;--wpds-color-fg-interactive-neutral-strong-disabled:#8a8a8a;--wpds-color-fg-interactive-neutral-weak:#6d6d6d;--wpds-color-fg-interactive-neutral-weak-disabled:#8a8a8a;--wpds-color-stroke-focus-brand:#3858e9;--wpds-color-stroke-interactive-brand:#3858e9;--wpds-color-stroke-interactive-brand-active:#2337c8;--wpds-color-stroke-interactive-error:#cc1818;--wpds-color-stroke-interactive-error-active:#9d0000;--wpds-color-stroke-interactive-error-strong:#cc1818;--wpds-color-stroke-interactive-neutral:#8a8a8a;--wpds-color-stroke-interactive-neutral-active:#6c6c6c;--wpds-color-stroke-interactive-neutral-disabled:#d8d8d8;--wpds-color-stroke-interactive-neutral-strong:#6c6c6c;--wpds-color-stroke-surface-brand:#a3b1d4;--wpds-color-stroke-surface-brand-strong:#3858e9;--wpds-color-stroke-surface-error:#daa39b;--wpds-color-stroke-surface-error-strong:#cc1818;--wpds-color-stroke-surface-info:#9fbcdc;--wpds-color-stroke-surface-info-strong:#006bd7;--wpds-color-stroke-surface-neutral:#d8d8d8;--wpds-color-stroke-surface-neutral-strong:#8a8a8a;--wpds-color-stroke-surface-neutral-weak:#e0e0e0;--wpds-color-stroke-surface-success:#8ac894;--wpds-color-stroke-surface-success-strong:#007f30;--wpds-color-stroke-surface-warning:#d0b381;--wpds-color-stroke-surface-warning-strong:#926300;--wpds-dimension-base:4px;--wpds-dimension-gap-2xs:4px;--wpds-dimension-gap-lg:24px;--wpds-dimension-gap-md:16px;--wpds-dimension-gap-sm:12px;--wpds-dimension-gap-xl:40px;--wpds-dimension-gap-xs:8px;--wpds-dimension-padding-surface-2xs:4px;--wpds-dimension-padding-surface-lg:32px;--wpds-dimension-padding-surface-md:24px;--wpds-dimension-padding-surface-sm:16px;--wpds-dimension-padding-surface-xs:8px;--wpds-elevation-large:0 5px 15px 0 #00000014,0 15px 27px 0 #00000012,0 30px 36px 0 #0000000a,0 50px 43px 0 #00000005;--wpds-elevation-medium:0 2px 3px 0 #0000000d,0 4px 5px 0 #0000000a,0 12px 12px 0 #00000008,0 16px 16px 0 #00000005;--wpds-elevation-small:0 1px 2px 0 #0000000d,0 2px 3px 0 #0000000a,0 6px 6px 0 #00000008,0 8px 8px 0 #00000005;--wpds-elevation-x-small:0 1px 1px 0 #00000008,0 1px 2px 0 #00000005,0 3px 3px 0 #00000005,0 4px 4px 0 #00000003;--wpds-font-family-body:-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif;--wpds-font-family-heading:-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif;--wpds-font-family-mono:"Menlo","Consolas",monaco,monospace;--wpds-font-line-height-2xl:40px;--wpds-font-line-height-lg:28px;--wpds-font-line-height-md:24px;--wpds-font-line-height-sm:20px;--wpds-font-line-height-xl:32px;--wpds-font-line-height-xs:16px;--wpds-font-size-2xl:32px;--wpds-font-size-lg:15px;--wpds-font-size-md:13px;--wpds-font-size-sm:12px;--wpds-font-size-xl:20px;--wpds-font-size-xs:11px;--wpds-font-weight-medium:499;--wpds-font-weight-regular:400}[data-wpds-theme-provider-id][data-wpds-density=default]{--wpds-dimension-base:4px;--wpds-dimension-gap-2xs:4px;--wpds-dimension-gap-lg:24px;--wpds-dimension-gap-md:16px;--wpds-dimension-gap-sm:12px;--wpds-dimension-gap-xl:40px;--wpds-dimension-gap-xs:8px;--wpds-dimension-padding-surface-2xs:4px;--wpds-dimension-padding-surface-lg:32px;--wpds-dimension-padding-surface-md:24px;--wpds-dimension-padding-surface-sm:16px;--wpds-dimension-padding-surface-xs:8px}[data-wpds-theme-provider-id][data-wpds-density=compact]{--wpds-dimension-gap-2xs:4px;--wpds-dimension-gap-lg:20px;--wpds-dimension-gap-md:12px;--wpds-dimension-gap-sm:8px;--wpds-dimension-gap-xl:32px;--wpds-dimension-gap-xs:4px;--wpds-dimension-padding-surface-2xs:4px;--wpds-dimension-padding-surface-lg:24px;--wpds-dimension-padding-surface-md:20px;--wpds-dimension-padding-surface-sm:12px;--wpds-dimension-padding-surface-xs:4px}[data-wpds-theme-provider-id][data-wpds-density=comfortable]{--wpds-dimension-gap-2xs:8px;--wpds-dimension-gap-lg:32px;--wpds-dimension-gap-md:20px;--wpds-dimension-gap-sm:16px;--wpds-dimension-gap-xl:48px;--wpds-dimension-gap-xs:12px;--wpds-dimension-padding-surface-2xs:8px;--wpds-dimension-padding-surface-lg:40px;--wpds-dimension-padding-surface-md:32px;--wpds-dimension-padding-surface-sm:20px;--wpds-dimension-padding-surface-xs:12px}@media (min-resolution:192dpi){:root{--wpds-border-width-focus:1.5px}}.dataviews-picker-wrapper,.dataviews-wrapper{background-color:var(--wp-dataviews-color-background,#fff);box-sizing:border-box;container:dataviews-wrapper/inline-size;display:flex;flex-direction:column;font-size:13px;height:100%;line-height:1.4;overflow:auto;scroll-padding-bottom:64px}.dataviews-filters__container,.dataviews__view-actions{background-color:inherit;box-sizing:border-box;flex-shrink:0;right:0;padding:16px 24px;position:sticky}@media not (prefers-reduced-motion){.dataviews-filters__container,.dataviews__view-actions{transition:padding .1s ease-out}}.dataviews-loading,.dataviews-no-results{align-items:center;display:flex;flex-grow:1;justify-content:center;padding:0 24px}@media not (prefers-reduced-motion){.dataviews-loading,.dataviews-no-results{transition:padding .1s ease-out}}.dataviews-loading-more{text-align:center}@container (max-width: 430px){.dataviews-filters__container,.dataviews__view-actions{padding:12px 24px}}.dataviews-title-field{font-size:13px;font-weight:499;width:100%}.dataviews-title-field,.dataviews-title-field a{color:#2f2f2f;text-overflow:ellipsis;white-space:nowrap}.dataviews-title-field a{display:block;flex-grow:0;overflow:hidden;text-decoration:none}.dataviews-title-field a:hover{color:var(--wp-admin-theme-color)}.dataviews-title-field a:focus{border-radius:2px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color,#007cba);color:var(--wp-admin-theme-color--rgb)}.dataviews-title-field button.components-button.is-link{color:#1e1e1e;display:block;font-weight:inherit;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;width:100%}.dataviews-title-field button.components-button.is-link:hover{color:var(--wp-admin-theme-color)}.dataviews-title-field--clickable{color:#2f2f2f;cursor:pointer}.dataviews-title-field--clickable:hover{color:var(--wp-admin-theme-color)}.dataviews-title-field--clickable:focus{border-radius:2px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color,#007cba);color:var(--wp-admin-theme-color--rgb)}.components-card__body:has(>.dataviews-picker-wrapper),.components-card__body:has(>.dataviews-wrapper){overflow:hidden;padding:8px 0 0}.dataviews-bulk-actions-footer__item-count{color:#1e1e1e}.dataviews-bulk-actions-footer__container{margin-left:auto;min-height:32px}.dataviews-filters__button{position:relative}.dataviews-filters__container{padding-top:0}.dataviews-filters__reset-button.dataviews-filters__reset-button[aria-disabled=true],.dataviews-filters__reset-button.dataviews-filters__reset-button[aria-disabled=true]:hover{opacity:0}.dataviews-filters__reset-button.dataviews-filters__reset-button[aria-disabled=true]:focus{opacity:1}.dataviews-filters__summary-popover{font-size:13px;line-height:1.4}.dataviews-filters__summary-popover .components-popover__content{border-radius:4px;max-width:250px;min-width:230px;width:100%}.dataviews-filters__summary-popover.components-dropdown__content .components-popover__content{padding:0}.dataviews-filters__summary-operators-container{padding:8px 16px}.dataviews-filters__summary-operators-container:has(+.dataviews-filters__search-widget-listbox),.dataviews-filters__summary-operators-container:has(+.dataviews-filters__search-widget-no-elements),.dataviews-filters__summary-operators-container:has(+.dataviews-filters__user-input-widget){border-bottom:1px solid #e0e0e0}.dataviews-filters__summary-operators-container:empty{display:none}.dataviews-filters__summary-operators-container .dataviews-filters__summary-operators-filter-name{color:#757575;flex-shrink:0;max-width:calc(100% - 55px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dataviews-filters__summary-operators-container .dataviews-filters__summary-operators-filter-select{overflow:hidden;white-space:nowrap;width:100%}.dataviews-filters__summary-chip-container{position:relative;white-space:pre-wrap}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip{align-items:center;background:#f0f0f0;border:1px solid transparent;border-radius:16px;box-sizing:border-box;color:#2f2f2f;cursor:pointer;display:flex;min-height:32px;padding:4px 12px;position:relative}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.is-not-clickable{cursor:default}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-reset{padding-inline-end:28px}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip:focus-visible,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip:hover:not(.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.is-not-clickable),.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip[aria-expanded=true]{background:#e0e0e0;color:#1e1e1e}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-values{background:rgba(var(--wp-admin-theme-color--rgb),.04);color:var(--wp-admin-theme-color)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-values:hover,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-values[aria-expanded=true]{background:rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:none}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip .dataviews-filters-__summary-filter-text-name{font-weight:499}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove{align-items:center;background:transparent;border:0;border-radius:50%;cursor:pointer;display:flex;height:24px;justify-content:center;padding:0;position:absolute;left:4px;top:50%;transform:translateY(-50%);width:24px}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove svg{fill:#757575}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:focus,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:hover{background:#e0e0e0}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:focus svg,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:hover svg{fill:#1e1e1e}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove.has-values svg{fill:var(--wp-admin-theme-color)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove.has-values:hover{background:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:none}.dataviews-filters__search-widget-filter-combobox-list{border-top:1px solid #e0e0e0;max-height:184px;overflow:auto;padding:4px}.dataviews-filters__search-widget-filter-combobox-list .dataviews-filters__search-widget-filter-combobox-item-value [data-user-value]{font-weight:600}.dataviews-filters__search-widget-listbox{overflow:auto;padding:4px}.dataviews-filters__search-widget-listitem{align-items:center;border-radius:2px;box-sizing:border-box;cursor:default;display:flex;font-family:-apple-system,"system-ui",Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:400;gap:8px;line-height:20px;min-height:32px;padding:4px 12px}.dataviews-filters__search-widget-listitem:last-child{margin-block-end:0}.dataviews-filters__search-widget-listitem:focus,.dataviews-filters__search-widget-listitem:hover,.dataviews-filters__search-widget-listitem[data-active-item]{background-color:var(--wp-admin-theme-color);color:#fff}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-description,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-description,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-description{color:#fff}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-single-selection,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-single-selection,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-single-selection{background:#fff;border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-single-selection.is-selected,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-single-selection.is-selected,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-single-selection.is-selected{background:var(--wp-admin-theme-color-darker-20,#183ad6);border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-multi-selection,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-multi-selection,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-multi-selection{border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-multi-selection.is-selected,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-multi-selection.is-selected,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-multi-selection.is-selected{background:var(--wp-admin-theme-color-darker-20,#183ad6);border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-description{color:#757575;display:block;font-size:12px;line-height:16px;overflow:hidden;text-overflow:ellipsis}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{border:1px solid #1e1e1e;border-radius:50%;height:24px;margin-left:12px;max-width:24px;min-width:24px;position:relative;transition:none;width:24px}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{transition:box-shadow .1s linear}}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{height:16px;max-width:16px;min-width:16px;width:16px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:checked:before{background-color:#fff;border:4px solid #fff;box-sizing:inherit;height:12px;right:50%;margin:0;position:absolute;top:50%;transform:translate(50%,-50%);width:12px}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:checked:before{height:8px;width:8px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:checked{background:var(--wp-admin-theme-color);border:none}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{margin:0;padding:0}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection.is-selected{background:var(--wp-admin-theme-color,#3858e9);border-color:var(--wp-admin-theme-color,#3858e9)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection.is-selected:before{background-color:#fff;border:4px solid #fff;border-radius:50%;box-sizing:inherit;content:"";height:12px;right:50%;margin:0;position:absolute;top:50%;transform:translate(50%,-50%);width:12px}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection.is-selected:before{height:8px;width:8px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{--checkbox-size:24px;border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 transparent;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:normal;margin-left:12px;padding:6px 8px;transition:none}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{transition:box-shadow .1s linear}}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{font-size:13px;line-height:normal}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection::-moz-placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection::placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:checked{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:checked:before,.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{color:#fff;margin:-3px -5px}@media (min-width:782px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:checked:before,.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{margin:-4px -5px 0 0}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{content:"\f460";display:inline-block;float:right;font:normal 30px/1 dashicons;vertical-align:middle;width:16px;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (min-width:782px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{float:none;font-size:21px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:disabled,.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-disabled=true]{background:#f0f0f0;border-color:#ddd;cursor:default;opacity:1}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{background:#fff;color:#1e1e1e;height:var(--checkbox-size);margin:0;padding:0;position:relative;width:var(--checkbox-size)}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{--checkbox-size:16px}}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{transition:border-color .1s ease-in-out}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection.is-selected{background:var(--wp-admin-theme-color,#3858e9);border-color:var(--wp-admin-theme-color,#3858e9)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection.is-selected svg{--checkmark-size:var(--checkbox-size);fill:#fff;height:var(--checkmark-size);right:50%;position:absolute;top:50%;transform:translate(50%,-50%);width:var(--checkmark-size)}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection.is-selected svg{--checkmark-size:calc(var(--checkbox-size) + 4px)}}.dataviews-filters__search-widget-filter-combobox__wrapper{padding:8px;position:relative}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 transparent;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;line-height:normal;padding:6px 8px}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{transition:box-shadow .1s linear}}@media (min-width:600px){.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{font-size:13px;line-height:normal}}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid transparent}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-moz-placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{display:block;font-size:16px;height:32px;margin-right:0;margin-left:0;padding:0 32px 0 8px;width:100%}@media (min-width:600px){.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{font-size:13px}}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input:focus{background:#fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-moz-placeholder{color:#757575}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::placeholder{color:#757575}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-cancel-button,.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-decoration,.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-results-button,.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-results-decoration{-webkit-appearance:none}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__icon{align-items:center;bottom:0;display:flex;inset-inline-start:12px;justify-content:center;position:absolute;top:0;width:24px}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__icon:dir(ltr){transform:scaleX(-1)}.dataviews-filters__container-visibility-toggle{flex-shrink:0;position:relative}.dataviews-filters-toggle__count{background:var(--wp-admin-theme-color,#3858e9);border-radius:8px;box-sizing:border-box;color:#fff;font-size:11px;height:16px;line-height:16px;min-width:16px;outline:var(--wp-admin-border-width-focus) solid #fff;padding:0 4px;position:absolute;left:0;text-align:center;top:0;transform:translate(-50%,-50%)}.dataviews-search{width:-moz-fit-content;width:fit-content}.dataviews-filters__user-input-widget{padding:16px}.dataviews-filters__user-input-widget .components-input-control__prefix{padding-right:8px}.dataviews-filters__search-widget-no-elements{align-items:center;display:flex;justify-content:center;padding:16px}.dataviews-footer{background-color:inherit;border-top:1px solid #f0f0f0;bottom:0;flex-shrink:0;right:0;padding:12px 24px;position:sticky}@media not (prefers-reduced-motion){.dataviews-footer{transition:padding .1s ease-out}}.dataviews-footer{z-index:2}@container (max-width: 560px){.dataviews-footer{flex-direction:column!important}.dataviews-footer .dataviews-bulk-actions-footer__container{width:100%}.dataviews-footer .dataviews-bulk-actions-footer__item-count{flex-grow:1}.dataviews-footer .dataviews-pagination{justify-content:space-between;width:100%}}.dataviews-pagination__page-select{font-size:11px;font-weight:499;text-transform:uppercase}@media (min-width:600px){.dataviews-pagination__page-select .components-select-control__input{font-size:11px!important;font-weight:499}}.dataviews-action-modal{z-index:1000001}.dataviews-selection-checkbox{--checkbox-input-size:24px}@media (min-width:600px){.dataviews-selection-checkbox{--checkbox-input-size:16px}}.dataviews-selection-checkbox{flex-shrink:0;line-height:0}.dataviews-selection-checkbox .components-checkbox-control__input-container{margin:0}.dataviews-view-config{container-type:inline-size;font-size:13px;line-height:1.4;width:320px}.dataviews-config__popover.is-expanded .dataviews-config__popover-content-wrapper{height:100%;overflow-y:scroll}.dataviews-config__popover.is-expanded .dataviews-config__popover-content-wrapper .dataviews-view-config{width:auto}.dataviews-view-config__sort-direction .components-toggle-group-control-option-base{text-transform:uppercase}.dataviews-settings-section__title.dataviews-settings-section__title{font-size:15px;line-height:24px}.dataviews-settings-section__sidebar{grid-column:span 4}.dataviews-settings-section__content,.dataviews-settings-section__content>*{grid-column:span 8}.dataviews-settings-section__content .is-divided-in-two{display:contents}.dataviews-settings-section__content .is-divided-in-two>*{grid-column:span 4}.dataviews-settings-section:has(.dataviews-settings-section__content:empty){display:none}@container (max-width: 500px){.dataviews-settings-section.dataviews-settings-section{grid-template-columns:repeat(2,1fr)}.dataviews-settings-section.dataviews-settings-section .dataviews-settings-section__content,.dataviews-settings-section.dataviews-settings-section .dataviews-settings-section__sidebar{grid-column:span 2}}.dataviews-view-config__label{text-wrap:nowrap}.dataviews-view-grid-items{container-type:inline-size;display:grid;gap:32px;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));grid-template-rows:max-content;margin-bottom:auto;padding:0 24px 24px}@media not (prefers-reduced-motion){.dataviews-view-grid-items{transition:padding .1s ease-out}}.dataviews-view-grid{container-type:inline-size;display:flex;flex-direction:column;gap:32px;margin-bottom:auto;padding:0 24px 24px}@media not (prefers-reduced-motion){.dataviews-view-grid{transition:padding .1s ease-out}}.dataviews-view-grid .dataviews-view-grid__row{display:grid;gap:32px}.dataviews-view-grid .dataviews-view-grid__row .dataviews-view-grid__row__gridcell{border-radius:4px;position:relative}.dataviews-view-grid .dataviews-view-grid__row .dataviews-view-grid__row__gridcell[data-focus-visible]:after{border-radius:4px;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";height:100%;right:0;outline:2px solid transparent;pointer-events:none;position:absolute;top:0;width:100%}.dataviews-view-grid .dataviews-view-grid__card{height:100%;justify-content:flex-start;position:relative}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-actions{padding:8px 0 4px}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-field{align-content:center;min-height:24px;overflow:hidden;text-align:start}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-field--clickable{width:-moz-fit-content;width:fit-content}.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{color:#1e1e1e}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__media:focus:after,.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__media:after{background-color:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__media:after{box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__media:focus:after{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.dataviews-view-grid .dataviews-view-grid__media{aspect-ratio:1/1;background-color:#fff;border-radius:4px;overflow:hidden;position:relative;width:100%}.dataviews-view-grid .dataviews-view-grid__media img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-grid .dataviews-view-grid__media:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;right:0;pointer-events:none;position:absolute;top:0;width:100%}.dataviews-view-grid .dataviews-view-grid__fields{font-size:12px;line-height:16px;position:relative}.dataviews-view-grid .dataviews-view-grid__fields:not(:empty){padding:0 0 12px}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field-value:not(:empty){line-height:20px;min-height:24px;padding-top:2px}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field{align-items:center;min-height:24px}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-name{color:#757575;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:35%}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:65%}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field:not(:has(.dataviews-view-grid__field-value:not(:empty))){display:none}.dataviews-view-grid .dataviews-view-grid__badge-fields:not(:empty){padding-bottom:12px}.dataviews-view-grid__field-value:empty,.dataviews-view-grid__field:empty{display:none}.dataviews-view-grid__card .dataviews-selection-checkbox{right:8px;opacity:0;position:absolute;top:-9999em;z-index:1}@media not (prefers-reduced-motion){.dataviews-view-grid__card .dataviews-selection-checkbox{transition:opacity .1s linear}}@media (hover:none){.dataviews-view-grid__card .dataviews-selection-checkbox{opacity:1;top:8px}}.dataviews-view-grid__card.is-selected .dataviews-selection-checkbox,.dataviews-view-grid__card:focus-within .dataviews-selection-checkbox,.dataviews-view-grid__card:hover .dataviews-selection-checkbox{opacity:1;top:8px}.dataviews-view-grid__card .dataviews-view-grid__media-actions{opacity:0;position:absolute;left:4px;top:4px}.dataviews-view-grid__card .dataviews-view-grid__media-actions .dataviews-all-actions-button{background-color:#fff}@media not (prefers-reduced-motion){.dataviews-view-grid__card .dataviews-view-grid__media-actions{transition:opacity .1s linear}}@media (hover:none){.dataviews-view-grid__card .dataviews-view-grid__media-actions{opacity:1;top:4px}}.dataviews-view-grid__card .dataviews-view-grid__media-actions:has(.dataviews-all-actions-button[aria-expanded=true]),.dataviews-view-grid__card:focus-within .dataviews-view-grid__media-actions,.dataviews-view-grid__card:hover .dataviews-view-grid__media-actions{opacity:1}.dataviews-view-grid__media--clickable{cursor:pointer}.dataviews-view-grid__group-header{color:#1e1e1e;container-type:inline-size;font-size:15px;font-weight:499;margin:0 0 8px;padding:0 24px}div.dataviews-view-list{list-style-type:none}.dataviews-view-list{margin:0 0 auto}.dataviews-view-list div[role=article],.dataviews-view-list div[role=row]{border-top:1px solid #f0f0f0;margin:0}.dataviews-view-list div[role=article] .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=row] .dataviews-view-list__item-wrapper{box-sizing:border-box;padding:16px 24px;position:relative}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions,.dataviews-view-list div[role=row] .dataviews-view-list__item-actions{display:flex;flex:0 0 auto;gap:4px;white-space:nowrap;width:-moz-max-content;width:max-content}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions .components-button,.dataviews-view-list div[role=row] .dataviews-view-list__item-actions .components-button{position:relative;z-index:1}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions>div,.dataviews-view-list div[role=row] .dataviews-view-list__item-actions>div{height:24px}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions>:not(:last-child),.dataviews-view-list div[role=row] .dataviews-view-list__item-actions>:not(:last-child){flex:0;overflow:hidden;width:0}.dataviews-view-list div[role=article]:where(.is-selected,.is-hovered,:focus-within) .dataviews-view-list__item-actions>:not(:last-child),.dataviews-view-list div[role=row]:where(.is-selected,.is-hovered,:focus-within) .dataviews-view-list__item-actions>:not(:last-child){flex-basis:min-content;overflow:unset;width:auto}@media (hover:none){.dataviews-view-list div[role=article] .dataviews-view-list__item-actions>:not(:last-child),.dataviews-view-list div[role=row] .dataviews-view-list__item-actions>:not(:last-child){flex-basis:min-content;overflow:unset;width:auto}}.dataviews-view-list div[role=article].is-selected.is-selected,.dataviews-view-list div[role=article].is-selected.is-selected+div[role=article],.dataviews-view-list div[role=article].is-selected.is-selected+div[role=row],.dataviews-view-list div[role=row].is-selected.is-selected,.dataviews-view-list div[role=row].is-selected.is-selected+div[role=article],.dataviews-view-list div[role=row].is-selected.is-selected+div[role=row]{border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-list div[role=article]:not(.is-selected).is-hovered,.dataviews-view-list div[role=article]:not(.is-selected):focus-within,.dataviews-view-list div[role=article]:not(.is-selected):hover,.dataviews-view-list div[role=row]:not(.is-selected).is-hovered,.dataviews-view-list div[role=row]:not(.is-selected):focus-within,.dataviews-view-list div[role=row]:not(.is-selected):hover{background-color:rgba(var(--wp-admin-theme-color--rgb),.04);border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12);color:var(--wp-admin-theme-color)}.dataviews-view-list div[role=article]:not(.is-selected).is-hovered+div[role=article],.dataviews-view-list div[role=article]:not(.is-selected).is-hovered+div[role=row],.dataviews-view-list div[role=article]:not(.is-selected):focus-within+div[role=article],.dataviews-view-list div[role=article]:not(.is-selected):focus-within+div[role=row],.dataviews-view-list div[role=article]:not(.is-selected):hover+div[role=article],.dataviews-view-list div[role=article]:not(.is-selected):hover+div[role=row],.dataviews-view-list div[role=row]:not(.is-selected).is-hovered+div[role=article],.dataviews-view-list div[role=row]:not(.is-selected).is-hovered+div[role=row],.dataviews-view-list div[role=row]:not(.is-selected):focus-within+div[role=article],.dataviews-view-list div[role=row]:not(.is-selected):focus-within+div[role=row],.dataviews-view-list div[role=row]:not(.is-selected):hover+div[role=article],.dataviews-view-list div[role=row]:not(.is-selected):hover+div[role=row]{border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-list div[role=article]:not(.is-selected).is-hovered .dataviews-title-field,.dataviews-view-list div[role=article]:not(.is-selected).is-hovered .dataviews-view-list__field,.dataviews-view-list div[role=article]:not(.is-selected):focus-within .dataviews-title-field,.dataviews-view-list div[role=article]:not(.is-selected):focus-within .dataviews-view-list__field,.dataviews-view-list div[role=article]:not(.is-selected):hover .dataviews-title-field,.dataviews-view-list div[role=article]:not(.is-selected):hover .dataviews-view-list__field,.dataviews-view-list div[role=row]:not(.is-selected).is-hovered .dataviews-title-field,.dataviews-view-list div[role=row]:not(.is-selected).is-hovered .dataviews-view-list__field,.dataviews-view-list div[role=row]:not(.is-selected):focus-within .dataviews-title-field,.dataviews-view-list div[role=row]:not(.is-selected):focus-within .dataviews-view-list__field,.dataviews-view-list div[role=row]:not(.is-selected):hover .dataviews-title-field,.dataviews-view-list div[role=row]:not(.is-selected):hover .dataviews-view-list__field{color:var(--wp-admin-theme-color)}.dataviews-view-list div[role=article].is-selected .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=article].is-selected:focus-within .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=row].is-selected .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=row].is-selected:focus-within .dataviews-view-list__item-wrapper{background-color:rgba(var(--wp-admin-theme-color--rgb),.08);color:#1e1e1e}.dataviews-view-list div[role=article].is-selected .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=article].is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__field,.dataviews-view-list div[role=article].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=article].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__field,.dataviews-view-list div[role=row].is-selected .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=row].is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__field,.dataviews-view-list div[role=row].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=row].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__field{color:#1e1e1e}.dataviews-view-list .dataviews-view-list__item{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:none;cursor:pointer;inset:0;padding:0;position:absolute;scroll-margin:8px 0;z-index:1}.dataviews-view-list .dataviews-view-list__item:focus-visible{outline:none}.dataviews-view-list .dataviews-view-list__item:focus-visible:before{border-radius:2px;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";inset:var(--wp-admin-border-width-focus);outline:2px solid transparent;position:absolute}.dataviews-view-list .dataviews-view-list__title-field{flex:1;line-height:24px;min-height:24px;overflow:hidden}.dataviews-view-list .dataviews-view-list__title-field:has(a,button){z-index:1}.dataviews-view-list .dataviews-view-list__media-wrapper{background-color:#fff;border-radius:4px;flex-shrink:0;height:52px;overflow:hidden;position:relative;width:52px}.dataviews-view-list .dataviews-view-list__media-wrapper img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-list .dataviews-view-list__media-wrapper:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;right:0;position:absolute;top:0;width:100%}.dataviews-view-list .dataviews-view-list__field-wrapper{flex-grow:1;min-height:52px}.dataviews-view-list .dataviews-view-list__field{color:#757575}.dataviews-view-list .dataviews-view-list__fields{display:flex;flex-wrap:wrap;font-size:12px;gap:12px;row-gap:4px}.dataviews-view-list .dataviews-view-list__fields:empty{display:none}.dataviews-view-list .dataviews-view-list__fields .dataviews-view-list__field:has(.dataviews-view-list__field-value:empty){display:none}.dataviews-view-list .dataviews-view-list__fields .dataviews-view-list__field-value{align-items:center;display:flex;line-height:20px;min-height:24px}.dataviews-view-list+.dataviews-pagination{justify-content:space-between}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__item-wrapper{padding:8px 24px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__title-field{line-height:16px;min-height:16px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__media-wrapper{height:32px;width:32px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__field-wrapper{min-height:32px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__fields{gap:8px;row-gap:4px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__fields .dataviews-view-list__field-value{line-height:16px;min-height:16px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__item-wrapper{padding:24px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__title-field{line-height:32px;min-height:32px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__media-wrapper{height:64px;width:64px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__field-wrapper{min-height:64px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__fields{gap:16px;row-gap:8px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__fields .dataviews-view-list__field-value{line-height:24px;min-height:32px}.dataviews-view-list__group-header{color:#1e1e1e;font-size:15px;font-weight:499;margin:0 0 8px;padding:0 24px}.dataviews-view-table{background-color:inherit;border-collapse:collapse;border-color:inherit;color:#757575;margin-bottom:auto;position:relative;text-indent:0;width:100%}.dataviews-view-table th{color:#1e1e1e;font-size:13px;font-weight:400;text-align:right}.dataviews-view-table td,.dataviews-view-table th{padding:12px}.dataviews-view-table td.dataviews-view-table__actions-column,.dataviews-view-table th.dataviews-view-table__actions-column{text-align:left}.dataviews-view-table td.dataviews-view-table__actions-column--sticky,.dataviews-view-table th.dataviews-view-table__actions-column--sticky{background-color:var(--wp-dataviews-color-background,#fff);position:sticky;left:0}.dataviews-view-table td.dataviews-view-table__actions-column--stuck:after,.dataviews-view-table th.dataviews-view-table__actions-column--stuck:after{background-color:#f0f0f0;bottom:0;content:"";display:block;right:0;position:absolute;top:0;width:1px}.dataviews-view-table td.dataviews-view-table__checkbox-column,.dataviews-view-table th.dataviews-view-table__checkbox-column{padding-left:0}.dataviews-view-table td.dataviews-view-table__checkbox-column .dataviews-view-table__cell-content-wrapper,.dataviews-view-table th.dataviews-view-table__checkbox-column .dataviews-view-table__cell-content-wrapper{max-width:auto;min-width:auto}.dataviews-view-table tr{background-color:inherit;border-top:1px solid #f0f0f0}.dataviews-view-table tr td:first-child,.dataviews-view-table tr th:first-child{padding-right:24px}.dataviews-view-table tr td:last-child,.dataviews-view-table tr th:last-child{padding-left:24px}.dataviews-view-table tr:last-child{border-bottom:0}.dataviews-view-table tr .dataviews-item-actions .components-button:not(.dataviews-all-actions-button){opacity:0}@media (hover:none){.dataviews-view-table tr .dataviews-item-actions .components-button:not(.dataviews-all-actions-button){opacity:1}}.dataviews-view-table tr.is-selected{background-color:color-mix(in srgb,rgb(var(--wp-admin-theme-color--rgb)) 4%,#fff);color:#757575}.dataviews-view-table tr.is-selected,.dataviews-view-table tr.is-selected+tr{border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-table tr.is-selected .dataviews-view-table__actions-column--sticky{background-color:color-mix(in srgb,rgb(var(--wp-admin-theme-color--rgb)) 4%,#fff)}.dataviews-view-table tr.is-hovered .dataviews-item-actions .components-button:not(.dataviews-all-actions-button),.dataviews-view-table tr:focus-within .dataviews-item-actions .components-button:not(.dataviews-all-actions-button),.dataviews-view-table tr:hover .dataviews-item-actions .components-button:not(.dataviews-all-actions-button){opacity:1}.dataviews-view-table.has-bulk-actions tr:focus-within .dataviews-view-table__actions-column--sticky,.dataviews-view-table.has-bulk-actions tr:hover .dataviews-view-table__actions-column--sticky{background-color:var(--wp-dataviews-color-background,#fff)}.dataviews-view-table.has-bulk-actions tr.is-selected .dataviews-view-table__actions-column--sticky,.dataviews-view-table.has-bulk-actions tr.is-selected:hover .dataviews-view-table__actions-column--sticky{background-color:color-mix(in srgb,rgb(var(--wp-admin-theme-color--rgb)) 4%,#fff)}.dataviews-view-table thead{background-color:inherit;inset-block-start:0;position:sticky;z-index:1}.dataviews-view-table thead tr{border:0}.dataviews-view-table thead th{background-color:inherit;font-size:11px;font-weight:499;padding-bottom:8px;padding-top:8px;text-transform:uppercase}.dataviews-view-table thead th:has(.dataviews-view-table-header-button){padding-right:4px;padding-left:4px}.dataviews-view-table thead th:has(.dataviews-view-table-header-button) .dataviews-view-table-header-button{gap:4px}.dataviews-view-table thead th:has(.dataviews-view-table-header-button):first-child{padding-right:40px}.dataviews-view-table thead th:has(.dataviews-view-table-header-button):last-child{padding-left:40px}.dataviews-view-table tbody td{vertical-align:top}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper{align-items:center;display:flex;min-height:32px;white-space:nowrap}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper.dataviews-view-table__cell-align-end{justify-content:flex-end}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper.dataviews-view-table__cell-align-center{justify-content:center}.dataviews-view-table tbody .components-v-stack>.dataviews-view-table__cell-content-wrapper:not(:first-child){min-height:0}.dataviews-view-table .dataviews-view-table-header-button{font-size:11px;font-weight:499;padding:4px 8px;text-transform:uppercase}.dataviews-view-table .dataviews-view-table-header-button:not(:hover){color:#1e1e1e}.dataviews-view-table .dataviews-view-table-header-button span{speak:none}.dataviews-view-table .dataviews-view-table-header-button span:empty{display:none}.dataviews-view-table .dataviews-view-table-header{padding-right:4px}.dataviews-view-table .dataviews-view-table__actions-column{white-space:nowrap;width:auto}.dataviews-view-table.has-compact-density thead th:has(.dataviews-view-table-header-button):not(:first-child){padding-right:0}.dataviews-view-table.has-compact-density thead th:has(.dataviews-view-table-header-button):not(:last-child){padding-left:0}.dataviews-view-table.has-compact-density td,.dataviews-view-table.has-compact-density th{padding:4px 8px}.dataviews-view-table.has-comfortable-density td,.dataviews-view-table.has-comfortable-density th{padding:16px 12px}.dataviews-view-table.has-comfortable-density td.dataviews-view-table__checkbox-column,.dataviews-view-table.has-comfortable-density th.dataviews-view-table__checkbox-column,.dataviews-view-table.has-compact-density td.dataviews-view-table__checkbox-column,.dataviews-view-table.has-compact-density th.dataviews-view-table__checkbox-column{padding-left:0}.dataviews-view-table-selection-checkbox{--checkbox-input-size:24px}@media (min-width:600px){.dataviews-view-table-selection-checkbox{--checkbox-input-size:16px}}.dataviews-column-primary__media{background-color:#fff;border-radius:4px;flex-shrink:0;max-width:60px;min-height:32px;min-width:32px;overflow:hidden;position:relative}.dataviews-column-primary__media img{height:32px;-o-object-fit:cover;object-fit:cover;width:32px}.dataviews-column-primary__media:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;right:0;position:absolute;top:0;width:100%}.dataviews-view-table__cell-content-wrapper:not(.dataviews-column-primary__media),.dataviews-view-table__primary-column-content:not(.dataviews-column-primary__media){max-width:80ch;min-width:15ch}.dataviews-view-table__group-header-row .dataviews-view-table__group-header-cell{color:#1e1e1e;font-weight:499;padding:12px 24px}.dataviews-view-table col[class^=dataviews-view-table__col-]:not(.dataviews-view-table__col-first-data){width:1%}.dataviews-view-picker-grid .dataviews-view-picker-grid__card{height:100%;justify-content:flex-start;position:relative}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__title-actions{padding:8px 0 4px}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__title-field{align-content:center;min-height:24px;overflow:hidden;text-align:start}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__title-field--clickable{width:-moz-fit-content;width:fit-content}.dataviews-view-picker-grid .dataviews-view-picker-grid__card.is-selected .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field .dataviews-view-picker-grid__field-value{color:#1e1e1e}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__media:focus:after,.dataviews-view-picker-grid .dataviews-view-picker-grid__card.is-selected .dataviews-view-picker-grid__media:after{background-color:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-view-picker-grid .dataviews-view-picker-grid__card.is-selected .dataviews-view-picker-grid__media:after{box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__media:focus:after{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.dataviews-view-picker-grid:focus-visible[aria-activedescendant]{outline:none}.dataviews-view-picker-grid:focus-visible [data-active-item=true]{outline:2px solid var(--wp-admin-theme-color)}.dataviews-view-picker-grid .dataviews-selection-checkbox{top:8px!important}.dataviews-view-picker-grid .dataviews-selection-checkbox input{pointer-events:none}.dataviews-view-picker-grid .dataviews-view-picker-grid__media{aspect-ratio:1/1;background-color:#fff;border-radius:4px;min-height:0;position:relative;width:100%}.dataviews-view-picker-grid .dataviews-view-picker-grid__media img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-picker-grid .dataviews-view-picker-grid__media:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;right:0;pointer-events:none;position:absolute;top:0;width:100%}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields{font-size:12px;line-height:16px;position:relative}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields:not(:empty){padding:0 0 12px}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field-value:not(:empty){line-height:20px;min-height:24px;padding-top:2px}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field{align-items:center;min-height:24px}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field .dataviews-view-picker-grid__field-name{color:#757575;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:35%}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field .dataviews-view-picker-grid__field-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:65%}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field:not(:has(.dataviews-view-picker-grid__field-value:not(:empty))){display:none}.dataviews-view-picker-grid .dataviews-view-picker-grid__badge-fields:not(:empty){padding-bottom:12px}.dataviews-view-picker-grid__field-value:empty,.dataviews-view-picker-grid__field:empty{display:none}.dataviews-view-picker-grid__card .dataviews-selection-checkbox{right:8px;position:absolute;top:-9999em;z-index:1}@media (hover:none){.dataviews-view-picker-grid__card .dataviews-selection-checkbox{top:8px}}.dataviews-view-picker-grid__card.is-selected .dataviews-selection-checkbox,.dataviews-view-picker-grid__card:focus-within .dataviews-selection-checkbox,.dataviews-view-picker-grid__card:hover .dataviews-selection-checkbox{top:8px}.dataviews-view-picker-grid__media--clickable{cursor:pointer}.dataviews-view-picker-grid-group__header{color:#1e1e1e;font-size:15px;font-weight:499;margin:0 0 8px;padding:0 48px}.dataviews-view-picker-table{background-color:inherit}.dataviews-view-picker-table .dataviews-view-table__checkbox-column{width:48px}.dataviews-view-picker-table tbody:focus-visible[aria-activedescendant]{outline:none}.dataviews-view-picker-table tbody:focus-visible [data-active-item=true]{outline:2px solid var(--wp-admin-theme-color)}.dataviews-view-picker-table .dataviews-selection-checkbox .components-checkbox-control__input.components-checkbox-control__input{opacity:1;pointer-events:none}.dataviews-view-picker-table .dataviews-view-table__row{cursor:pointer}.dataviews-view-picker-table .dataviews-view-table__row.is-selected{background-color:rgba(var(--wp-admin-theme-color--rgb),.04)}.dataviews-view-picker-table .dataviews-view-table__row.is-hovered{background-color:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-view-picker-table .dataviews-view-table__row.is-selected.is-hovered{background-color:rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-activity{margin:0 0 auto;padding:8px 24px}.dataviews-view-activity .dataviews-view-activity__group-header{color:#949494;font-size:15px;font-weight:499;margin:0 0 8px;padding:0}.dataviews-view-activity .dataviews-view-activity__item-actions{min-width:24px}.dataviews-view-activity .dataviews-view-activity__item-content{flex-grow:1}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-description,.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields,.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title{min-height:16px}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title{align-items:center;display:flex;flex:1;overflow:hidden;position:relative}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title--clickable{cursor:pointer}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title--clickable:focus-visible{border-radius:2px;outline:var(--wp-admin-border-width-focus) solid var(--wp-admin-theme-color);outline-offset:var(--wp-admin-border-width-focus)}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__primary-actions{display:flex;flex:0 0 auto;width:-moz-max-content;width:max-content}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__primary-actions .components-button{position:relative;z-index:1}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields{color:#757575;display:flex;flex-wrap:wrap;gap:12px;row-gap:4px}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields:empty{display:none}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields .dataviews-view-activity__item-field:has(.dataviews-view-activity__item-field-value:empty){display:none}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields .dataviews-view-activity__item-field-value{align-items:center;display:flex}.dataviews-view-activity .dataviews-view-activity__item-type{align-self:stretch;flex-shrink:0}.dataviews-view-activity .dataviews-view-activity__item-type:after{background-color:#ddd;content:"";flex:1 1 auto;margin:0 auto;width:1px}.dataviews-view-activity .dataviews-view-activity__item-type:before{background-color:#ddd;content:"";flex:0 0 auto;margin:0 auto;width:1px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-type{width:8px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-type:before{height:12px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-type-icon{height:11px;width:11px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-content{margin:12px 0}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-type{width:24px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-type:before{height:12px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-type-icon{height:25px;width:25px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-content{margin:12px 0;padding-top:8px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-type{width:32px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-type:before{height:8px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-type-icon{height:33px;width:33px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-content{margin:8px 0 16px;padding-top:12px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-bullet,.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-bullet{height:9px;position:relative;top:50%;transform:translateY(-50%);width:9px}.dataviews-view-activity .dataviews-view-activity__item:first-child .dataviews-view-activity__item-type:before{visibility:hidden}.dataviews-view-activity .dataviews-view-activity__group:last-of-type>.dataviews-view-activity__item:last-of-type .dataviews-view-activity__item-type:after,.dataviews-view-activity>.dataviews-view-activity__item:last-child .dataviews-view-activity__item-type:after{background:linear-gradient(-180deg,#ddd 0,hsla(0,0%,87%,.2) 60%,hsla(0,0%,87%,0))}.dataviews-view-activity .dataviews-view-activity__item-type-icon{background-color:#fff;flex-shrink:0;overflow:hidden}.dataviews-view-activity .dataviews-view-activity__item-type-icon .dataviews-view-activity__item-bullet,.dataviews-view-activity .dataviews-view-activity__item-type-icon img,.dataviews-view-activity .dataviews-view-activity__item-type-icon svg{border-radius:50%;box-shadow:inset 0 0 0 1px #ddd;box-sizing:border-box;display:block;height:100%;margin:0 auto;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-activity .dataviews-view-activity__item-type-icon svg{padding:4px}.dataviews-view-activity .dataviews-view-activity__item-type-icon .dataviews-view-activity__item-bullet{background-color:#ddd;content:""}.dataviews-view-activity+.dataviews-pagination{justify-content:space-between}.dataviews-picker-footer__bulk-selection{align-self:flex-start;height:32px}.dataviews-picker-footer__actions{align-self:flex-end}.dataviews-controls__datetime{border:none;padding:0}.dataviews-controls__relative-date-number,.dataviews-controls__relative-date-unit{flex:1 1 50%}.dataviews-controls__date input[type=date]::-webkit-calendar-picker-indicator,.dataviews-controls__date input[type=date]::-webkit-inner-spin-button{-webkit-appearance:none;display:none}.dataviews-controls__date-range-inputs>*{min-width:0}.dataviews-controls__date-preset{border:1px solid #ddd}.dataviews-controls__date-preset:active{background-color:#000}.dataforms-layouts-panel__field{align-items:flex-start!important;justify-content:flex-start!important;min-height:32px;width:100%}.dataforms-layouts-panel__field--label-position-none{align-items:center!important}.dataforms-layouts-panel__field-label{align-items:center;display:flex;flex-shrink:0;hyphens:auto;line-height:20px;min-height:32px;width:38%}.dataforms-layouts-panel__field-label--label-position-side{align-self:center}.dataforms-layouts-panel__field-label.has-error{color:#cc1818}.dataforms-layouts-panel__field-label-error-content{cursor:help;fill:#cc1818}.dataforms-layouts-panel__field-label-error-content svg{fill:currentColor}.dataforms-layouts-panel__field-control{align-items:center;display:flex;flex-grow:1;min-height:32px}.dataforms-layouts-panel__field-control .components-button{max-width:100%;min-height:32px;text-align:right;text-wrap:balance;text-wrap:pretty;white-space:normal}.dataforms-layouts-panel__field-control.components-button.is-link[aria-disabled=true]{text-decoration:none}.dataforms-layouts-panel__field-control .components-dropdown{max-width:100%}.dataforms-layouts-panel__field-dropdown .components-popover__content{min-width:320px;padding:16px}.dataforms-layouts-panel__dropdown-header{margin-bottom:16px}.dataforms-layouts-panel__modal-footer{margin-top:16px}.components-popover.components-dropdown__content.dataforms-layouts-panel__field-dropdown{z-index:159990}.dataforms-layouts-panel__summary-button:empty{min-width:160px}.dataforms-layouts-regular__field{align-items:flex-start!important;justify-content:flex-start!important;min-height:32px;width:100%}.dataforms-layouts-regular__field-label{align-items:center;display:flex;flex-shrink:0;hyphens:auto;line-height:20px;min-height:32px;width:38%}.dataforms-layouts-regular__field-label--label-position-side{align-self:center}.dataforms-layouts-regular__field-control{align-items:center;display:flex;flex-grow:1;min-height:32px}.dataforms-layouts-card__field-header-label{font-family:-apple-system,"system-ui",Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:15px;font-weight:499;line-height:20px}.dataforms-layouts-card__field{width:100%}.dataforms-layouts-card__field-description{color:#757575;display:block;font-size:13px;margin-bottom:16px}.dataforms-layouts-card__field-summary{display:flex;flex-direction:row;gap:16px}.dataforms-layouts-details__content{padding-top:12px}.dataforms-layouts-row__field-control{width:100%}.dataforms-layouts__wrapper{font-family:-apple-system,"system-ui",Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:400;line-height:20px}.clawpress-settings__actions{align-items:center;display:flex;gap:8px;margin-top:16px}.clawpress-settings__model-description,.clawpress-settings__model-meta{color:#50575e}.clawpress-abilities__header{align-items:baseline;display:flex;gap:12px;justify-content:space-between}.clawpress-abilities__header h3{font-size:24px;line-height:1.2;margin:0}.clawpress-abilities__header p{color:#50575e;margin:0}.clawpress-abilities__toolbar{align-items:flex-end;display:flex;gap:12px;justify-content:space-between;margin-bottom:20px}.clawpress-abilities__toolbar .components-base-control{margin-bottom:0;min-width:220px}.clawpress-abilities__actions{display:flex;gap:8px}.clawpress-abilities__grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(320px,1fr))}.clawpress-abilities__item{background:linear-gradient(-180deg,#fff,#f6f7f7);border:1px solid #dcdcde;border-radius:10px;display:flex;flex-direction:column;gap:10px;padding:14px}.clawpress-abilities__item-header{align-items:flex-start;display:flex;gap:12px;justify-content:space-between}.clawpress-abilities__item h4{margin:0}.clawpress-abilities__item .components-base-control{margin-bottom:0}.clawpress-abilities__description{color:#1d2327;margin:0}.clawpress-abilities__annotations{display:flex;flex-wrap:wrap;gap:6px;min-height:24px}.clawpress-abilities__annotation{align-items:center;border-radius:999px;display:inline-flex;font-size:11px;font-weight:600;line-height:1.4;padding:3px 8px}.clawpress-abilities__annotation.is-readonly{background:#d6f5e3;color:#0f5132}.clawpress-abilities__annotation.is-destructive{background:#fbe6e8;color:#8a2424}.clawpress-abilities__meta{color:#50575e;font-size:12px;margin:0}.clawpress-abilities__warning{color:#b32d2e;font-size:12px;margin:0}.clawpress-abilities__empty{color:#50575e;margin:0}@media(max-width:782px){.clawpress-abilities__toolbar{align-items:stretch;flex-direction:column}.clawpress-abilities__actions{justify-content:flex-start}} +:root{--wpds-border-radius-lg:8px;--wpds-border-radius-md:4px;--wpds-border-radius-sm:2px;--wpds-border-radius-xs:1px;--wpds-border-width-focus:2px;--wpds-border-width-lg:8px;--wpds-border-width-md:4px;--wpds-border-width-sm:2px;--wpds-border-width-xs:1px;--wpds-color-bg-interactive-brand-strong:#3858e9;--wpds-color-bg-interactive-brand-strong-active:#2e49d9;--wpds-color-bg-interactive-brand-weak:#00000000;--wpds-color-bg-interactive-brand-weak-active:#e6eaf4;--wpds-color-bg-interactive-error:#00000000;--wpds-color-bg-interactive-error-active:#fff6f4;--wpds-color-bg-interactive-error-strong:#cc1818;--wpds-color-bg-interactive-error-strong-active:#b90000;--wpds-color-bg-interactive-error-weak:#00000000;--wpds-color-bg-interactive-error-weak-active:#f6e6e3;--wpds-color-bg-interactive-neutral-strong:#2d2d2d;--wpds-color-bg-interactive-neutral-strong-active:#1e1e1e;--wpds-color-bg-interactive-neutral-strong-disabled:#e2e2e2;--wpds-color-bg-interactive-neutral-weak:#00000000;--wpds-color-bg-interactive-neutral-weak-active:#eaeaea;--wpds-color-bg-interactive-neutral-weak-disabled:#00000000;--wpds-color-bg-surface-brand:#ecf0f9;--wpds-color-bg-surface-caution:#fee994;--wpds-color-bg-surface-caution-weak:#fff9c9;--wpds-color-bg-surface-error:#f6e6e3;--wpds-color-bg-surface-error-weak:#fff6f4;--wpds-color-bg-surface-info:#deebfa;--wpds-color-bg-surface-info-weak:#f2f9ff;--wpds-color-bg-surface-neutral:#f8f8f8;--wpds-color-bg-surface-neutral-strong:#fff;--wpds-color-bg-surface-neutral-weak:#f0f0f0;--wpds-color-bg-surface-success:#c5f7cc;--wpds-color-bg-surface-success-weak:#eaffed;--wpds-color-bg-surface-warning:#fde6bd;--wpds-color-bg-surface-warning-weak:#fff7e0;--wpds-color-bg-thumb-brand:#3858e9;--wpds-color-bg-thumb-brand-active:#3858e9;--wpds-color-bg-thumb-neutral-disabled:#d8d8d8;--wpds-color-bg-thumb-neutral-weak:#8a8a8a;--wpds-color-bg-thumb-neutral-weak-active:#6c6c6c;--wpds-color-bg-track-neutral:#d8d8d8;--wpds-color-bg-track-neutral-weak:#e0e0e0;--wpds-color-fg-content-caution:#281d00;--wpds-color-fg-content-caution-weak:#826a00;--wpds-color-fg-content-error:#470000;--wpds-color-fg-content-error-weak:#cc1818;--wpds-color-fg-content-info:#001b4f;--wpds-color-fg-content-info-weak:#006bd7;--wpds-color-fg-content-neutral:#1e1e1e;--wpds-color-fg-content-neutral-weak:#6d6d6d;--wpds-color-fg-content-success:#002900;--wpds-color-fg-content-success-weak:#007f30;--wpds-color-fg-content-warning:#2e1900;--wpds-color-fg-content-warning-weak:#926300;--wpds-color-fg-interactive-brand:#3858e9;--wpds-color-fg-interactive-brand-active:#3858e9;--wpds-color-fg-interactive-brand-strong:#eff0f2;--wpds-color-fg-interactive-brand-strong-active:#eff0f2;--wpds-color-fg-interactive-error:#cc1818;--wpds-color-fg-interactive-error-active:#cc1818;--wpds-color-fg-interactive-error-strong:#f2efef;--wpds-color-fg-interactive-error-strong-active:#f2efef;--wpds-color-fg-interactive-neutral:#1e1e1e;--wpds-color-fg-interactive-neutral-active:#1e1e1e;--wpds-color-fg-interactive-neutral-disabled:#8a8a8a;--wpds-color-fg-interactive-neutral-strong:#f0f0f0;--wpds-color-fg-interactive-neutral-strong-active:#f0f0f0;--wpds-color-fg-interactive-neutral-strong-disabled:#8a8a8a;--wpds-color-fg-interactive-neutral-weak:#6d6d6d;--wpds-color-fg-interactive-neutral-weak-disabled:#8a8a8a;--wpds-color-stroke-focus-brand:#3858e9;--wpds-color-stroke-interactive-brand:#3858e9;--wpds-color-stroke-interactive-brand-active:#2337c8;--wpds-color-stroke-interactive-error:#cc1818;--wpds-color-stroke-interactive-error-active:#9d0000;--wpds-color-stroke-interactive-error-strong:#cc1818;--wpds-color-stroke-interactive-neutral:#8a8a8a;--wpds-color-stroke-interactive-neutral-active:#6c6c6c;--wpds-color-stroke-interactive-neutral-disabled:#d8d8d8;--wpds-color-stroke-interactive-neutral-strong:#6c6c6c;--wpds-color-stroke-surface-brand:#a3b1d4;--wpds-color-stroke-surface-brand-strong:#3858e9;--wpds-color-stroke-surface-error:#daa39b;--wpds-color-stroke-surface-error-strong:#cc1818;--wpds-color-stroke-surface-info:#9fbcdc;--wpds-color-stroke-surface-info-strong:#006bd7;--wpds-color-stroke-surface-neutral:#d8d8d8;--wpds-color-stroke-surface-neutral-strong:#8a8a8a;--wpds-color-stroke-surface-neutral-weak:#e0e0e0;--wpds-color-stroke-surface-success:#8ac894;--wpds-color-stroke-surface-success-strong:#007f30;--wpds-color-stroke-surface-warning:#d0b381;--wpds-color-stroke-surface-warning-strong:#926300;--wpds-dimension-base:4px;--wpds-dimension-gap-2xs:4px;--wpds-dimension-gap-lg:24px;--wpds-dimension-gap-md:16px;--wpds-dimension-gap-sm:12px;--wpds-dimension-gap-xl:40px;--wpds-dimension-gap-xs:8px;--wpds-dimension-padding-surface-2xs:4px;--wpds-dimension-padding-surface-lg:32px;--wpds-dimension-padding-surface-md:24px;--wpds-dimension-padding-surface-sm:16px;--wpds-dimension-padding-surface-xs:8px;--wpds-elevation-large:0 5px 15px 0 #00000014,0 15px 27px 0 #00000012,0 30px 36px 0 #0000000a,0 50px 43px 0 #00000005;--wpds-elevation-medium:0 2px 3px 0 #0000000d,0 4px 5px 0 #0000000a,0 12px 12px 0 #00000008,0 16px 16px 0 #00000005;--wpds-elevation-small:0 1px 2px 0 #0000000d,0 2px 3px 0 #0000000a,0 6px 6px 0 #00000008,0 8px 8px 0 #00000005;--wpds-elevation-x-small:0 1px 1px 0 #00000008,0 1px 2px 0 #00000005,0 3px 3px 0 #00000005,0 4px 4px 0 #00000003;--wpds-font-family-body:-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif;--wpds-font-family-heading:-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif;--wpds-font-family-mono:"Menlo","Consolas",monaco,monospace;--wpds-font-line-height-2xl:40px;--wpds-font-line-height-lg:28px;--wpds-font-line-height-md:24px;--wpds-font-line-height-sm:20px;--wpds-font-line-height-xl:32px;--wpds-font-line-height-xs:16px;--wpds-font-size-2xl:32px;--wpds-font-size-lg:15px;--wpds-font-size-md:13px;--wpds-font-size-sm:12px;--wpds-font-size-xl:20px;--wpds-font-size-xs:11px;--wpds-font-weight-medium:499;--wpds-font-weight-regular:400}[data-wpds-theme-provider-id][data-wpds-density=default]{--wpds-dimension-base:4px;--wpds-dimension-gap-2xs:4px;--wpds-dimension-gap-lg:24px;--wpds-dimension-gap-md:16px;--wpds-dimension-gap-sm:12px;--wpds-dimension-gap-xl:40px;--wpds-dimension-gap-xs:8px;--wpds-dimension-padding-surface-2xs:4px;--wpds-dimension-padding-surface-lg:32px;--wpds-dimension-padding-surface-md:24px;--wpds-dimension-padding-surface-sm:16px;--wpds-dimension-padding-surface-xs:8px}[data-wpds-theme-provider-id][data-wpds-density=compact]{--wpds-dimension-gap-2xs:4px;--wpds-dimension-gap-lg:20px;--wpds-dimension-gap-md:12px;--wpds-dimension-gap-sm:8px;--wpds-dimension-gap-xl:32px;--wpds-dimension-gap-xs:4px;--wpds-dimension-padding-surface-2xs:4px;--wpds-dimension-padding-surface-lg:24px;--wpds-dimension-padding-surface-md:20px;--wpds-dimension-padding-surface-sm:12px;--wpds-dimension-padding-surface-xs:4px}[data-wpds-theme-provider-id][data-wpds-density=comfortable]{--wpds-dimension-gap-2xs:8px;--wpds-dimension-gap-lg:32px;--wpds-dimension-gap-md:20px;--wpds-dimension-gap-sm:16px;--wpds-dimension-gap-xl:48px;--wpds-dimension-gap-xs:12px;--wpds-dimension-padding-surface-2xs:8px;--wpds-dimension-padding-surface-lg:40px;--wpds-dimension-padding-surface-md:32px;--wpds-dimension-padding-surface-sm:20px;--wpds-dimension-padding-surface-xs:12px}@media (min-resolution:192dpi){:root{--wpds-border-width-focus:1.5px}}.dataviews-picker-wrapper,.dataviews-wrapper{background-color:var(--wp-dataviews-color-background,#fff);box-sizing:border-box;container:dataviews-wrapper/inline-size;display:flex;flex-direction:column;font-size:13px;height:100%;line-height:1.4;overflow:auto;scroll-padding-bottom:64px}.dataviews-filters__container,.dataviews__view-actions{background-color:inherit;box-sizing:border-box;flex-shrink:0;right:0;padding:16px 24px;position:sticky}@media not (prefers-reduced-motion){.dataviews-filters__container,.dataviews__view-actions{transition:padding .1s ease-out}}.dataviews-loading,.dataviews-no-results{align-items:center;display:flex;flex-grow:1;justify-content:center;padding:0 24px}@media not (prefers-reduced-motion){.dataviews-loading,.dataviews-no-results{transition:padding .1s ease-out}}.dataviews-loading-more{text-align:center}@container (max-width: 430px){.dataviews-filters__container,.dataviews__view-actions{padding:12px 24px}}.dataviews-title-field{font-size:13px;font-weight:499;width:100%}.dataviews-title-field,.dataviews-title-field a{color:#2f2f2f;text-overflow:ellipsis;white-space:nowrap}.dataviews-title-field a{display:block;flex-grow:0;overflow:hidden;text-decoration:none}.dataviews-title-field a:hover{color:var(--wp-admin-theme-color)}.dataviews-title-field a:focus{border-radius:2px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color,#007cba);color:var(--wp-admin-theme-color--rgb)}.dataviews-title-field button.components-button.is-link{color:#1e1e1e;display:block;font-weight:inherit;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;width:100%}.dataviews-title-field button.components-button.is-link:hover{color:var(--wp-admin-theme-color)}.dataviews-title-field--clickable{color:#2f2f2f;cursor:pointer}.dataviews-title-field--clickable:hover{color:var(--wp-admin-theme-color)}.dataviews-title-field--clickable:focus{border-radius:2px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color,#007cba);color:var(--wp-admin-theme-color--rgb)}.components-card__body:has(>.dataviews-picker-wrapper),.components-card__body:has(>.dataviews-wrapper){overflow:hidden;padding:8px 0 0}.dataviews-bulk-actions-footer__item-count{color:#1e1e1e}.dataviews-bulk-actions-footer__container{margin-left:auto;min-height:32px}.dataviews-filters__button{position:relative}.dataviews-filters__container{padding-top:0}.dataviews-filters__reset-button.dataviews-filters__reset-button[aria-disabled=true],.dataviews-filters__reset-button.dataviews-filters__reset-button[aria-disabled=true]:hover{opacity:0}.dataviews-filters__reset-button.dataviews-filters__reset-button[aria-disabled=true]:focus{opacity:1}.dataviews-filters__summary-popover{font-size:13px;line-height:1.4}.dataviews-filters__summary-popover .components-popover__content{border-radius:4px;max-width:250px;min-width:230px;width:100%}.dataviews-filters__summary-popover.components-dropdown__content .components-popover__content{padding:0}.dataviews-filters__summary-operators-container{padding:8px 16px}.dataviews-filters__summary-operators-container:has(+.dataviews-filters__search-widget-listbox),.dataviews-filters__summary-operators-container:has(+.dataviews-filters__search-widget-no-elements),.dataviews-filters__summary-operators-container:has(+.dataviews-filters__user-input-widget){border-bottom:1px solid #e0e0e0}.dataviews-filters__summary-operators-container:empty{display:none}.dataviews-filters__summary-operators-container .dataviews-filters__summary-operators-filter-name{color:#757575;flex-shrink:0;max-width:calc(100% - 55px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dataviews-filters__summary-operators-container .dataviews-filters__summary-operators-filter-select{overflow:hidden;white-space:nowrap;width:100%}.dataviews-filters__summary-chip-container{position:relative;white-space:pre-wrap}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip{align-items:center;background:#f0f0f0;border:1px solid transparent;border-radius:16px;box-sizing:border-box;color:#2f2f2f;cursor:pointer;display:flex;min-height:32px;padding:4px 12px;position:relative}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.is-not-clickable{cursor:default}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-reset{padding-inline-end:28px}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip:focus-visible,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip:hover:not(.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.is-not-clickable),.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip[aria-expanded=true]{background:#e0e0e0;color:#1e1e1e}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-values{background:rgba(var(--wp-admin-theme-color--rgb),.04);color:var(--wp-admin-theme-color)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-values:hover,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-values[aria-expanded=true]{background:rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:none}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip .dataviews-filters-__summary-filter-text-name{font-weight:499}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove{align-items:center;background:transparent;border:0;border-radius:50%;cursor:pointer;display:flex;height:24px;justify-content:center;padding:0;position:absolute;left:4px;top:50%;transform:translateY(-50%);width:24px}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove svg{fill:#757575}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:focus,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:hover{background:#e0e0e0}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:focus svg,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:hover svg{fill:#1e1e1e}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove.has-values svg{fill:var(--wp-admin-theme-color)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove.has-values:hover{background:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:none}.dataviews-filters__search-widget-filter-combobox-list{border-top:1px solid #e0e0e0;max-height:184px;overflow:auto;padding:4px}.dataviews-filters__search-widget-filter-combobox-list .dataviews-filters__search-widget-filter-combobox-item-value [data-user-value]{font-weight:600}.dataviews-filters__search-widget-listbox{overflow:auto;padding:4px}.dataviews-filters__search-widget-listitem{align-items:center;border-radius:2px;box-sizing:border-box;cursor:default;display:flex;font-family:-apple-system,"system-ui",Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:400;gap:8px;line-height:20px;min-height:32px;padding:4px 12px}.dataviews-filters__search-widget-listitem:last-child{margin-block-end:0}.dataviews-filters__search-widget-listitem:focus,.dataviews-filters__search-widget-listitem:hover,.dataviews-filters__search-widget-listitem[data-active-item]{background-color:var(--wp-admin-theme-color);color:#fff}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-description,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-description,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-description{color:#fff}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-single-selection,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-single-selection,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-single-selection{background:#fff;border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-single-selection.is-selected,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-single-selection.is-selected,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-single-selection.is-selected{background:var(--wp-admin-theme-color-darker-20,#183ad6);border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-multi-selection,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-multi-selection,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-multi-selection{border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-multi-selection.is-selected,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-multi-selection.is-selected,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-multi-selection.is-selected{background:var(--wp-admin-theme-color-darker-20,#183ad6);border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-description{color:#757575;display:block;font-size:12px;line-height:16px;overflow:hidden;text-overflow:ellipsis}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{border:1px solid #1e1e1e;border-radius:50%;height:24px;margin-left:12px;max-width:24px;min-width:24px;position:relative;transition:none;width:24px}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{transition:box-shadow .1s linear}}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{height:16px;max-width:16px;min-width:16px;width:16px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:checked:before{background-color:#fff;border:4px solid #fff;box-sizing:inherit;height:12px;right:50%;margin:0;position:absolute;top:50%;transform:translate(50%,-50%);width:12px}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:checked:before{height:8px;width:8px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:checked{background:var(--wp-admin-theme-color);border:none}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{margin:0;padding:0}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection.is-selected{background:var(--wp-admin-theme-color,#3858e9);border-color:var(--wp-admin-theme-color,#3858e9)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection.is-selected:before{background-color:#fff;border:4px solid #fff;border-radius:50%;box-sizing:inherit;content:"";height:12px;right:50%;margin:0;position:absolute;top:50%;transform:translate(50%,-50%);width:12px}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection.is-selected:before{height:8px;width:8px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{--checkbox-size:24px;border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 transparent;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:normal;margin-left:12px;padding:6px 8px;transition:none}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{transition:box-shadow .1s linear}}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{font-size:13px;line-height:normal}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection::-moz-placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection::placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:checked{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:checked:before,.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{color:#fff;margin:-3px -5px}@media (min-width:782px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:checked:before,.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{margin:-4px -5px 0 0}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{content:"\f460";display:inline-block;float:right;font:normal 30px/1 dashicons;vertical-align:middle;width:16px;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (min-width:782px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{float:none;font-size:21px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:disabled,.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-disabled=true]{background:#f0f0f0;border-color:#ddd;cursor:default;opacity:1}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{background:#fff;color:#1e1e1e;height:var(--checkbox-size);margin:0;padding:0;position:relative;width:var(--checkbox-size)}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{--checkbox-size:16px}}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{transition:border-color .1s ease-in-out}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection.is-selected{background:var(--wp-admin-theme-color,#3858e9);border-color:var(--wp-admin-theme-color,#3858e9)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection.is-selected svg{--checkmark-size:var(--checkbox-size);fill:#fff;height:var(--checkmark-size);right:50%;position:absolute;top:50%;transform:translate(50%,-50%);width:var(--checkmark-size)}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection.is-selected svg{--checkmark-size:calc(var(--checkbox-size) + 4px)}}.dataviews-filters__search-widget-filter-combobox__wrapper{padding:8px;position:relative}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 transparent;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;line-height:normal;padding:6px 8px}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{transition:box-shadow .1s linear}}@media (min-width:600px){.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{font-size:13px;line-height:normal}}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid transparent}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-moz-placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{display:block;font-size:16px;height:32px;margin-right:0;margin-left:0;padding:0 32px 0 8px;width:100%}@media (min-width:600px){.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{font-size:13px}}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input:focus{background:#fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-moz-placeholder{color:#757575}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::placeholder{color:#757575}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-cancel-button,.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-decoration,.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-results-button,.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-results-decoration{-webkit-appearance:none}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__icon{align-items:center;bottom:0;display:flex;inset-inline-start:12px;justify-content:center;position:absolute;top:0;width:24px}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__icon:dir(ltr){transform:scaleX(-1)}.dataviews-filters__container-visibility-toggle{flex-shrink:0;position:relative}.dataviews-filters-toggle__count{background:var(--wp-admin-theme-color,#3858e9);border-radius:8px;box-sizing:border-box;color:#fff;font-size:11px;height:16px;line-height:16px;min-width:16px;outline:var(--wp-admin-border-width-focus) solid #fff;padding:0 4px;position:absolute;left:0;text-align:center;top:0;transform:translate(-50%,-50%)}.dataviews-search{width:-moz-fit-content;width:fit-content}.dataviews-filters__user-input-widget{padding:16px}.dataviews-filters__user-input-widget .components-input-control__prefix{padding-right:8px}.dataviews-filters__search-widget-no-elements{align-items:center;display:flex;justify-content:center;padding:16px}.dataviews-footer{background-color:inherit;border-top:1px solid #f0f0f0;bottom:0;flex-shrink:0;right:0;padding:12px 24px;position:sticky}@media not (prefers-reduced-motion){.dataviews-footer{transition:padding .1s ease-out}}.dataviews-footer{z-index:2}@container (max-width: 560px){.dataviews-footer{flex-direction:column!important}.dataviews-footer .dataviews-bulk-actions-footer__container{width:100%}.dataviews-footer .dataviews-bulk-actions-footer__item-count{flex-grow:1}.dataviews-footer .dataviews-pagination{justify-content:space-between;width:100%}}.dataviews-pagination__page-select{font-size:11px;font-weight:499;text-transform:uppercase}@media (min-width:600px){.dataviews-pagination__page-select .components-select-control__input{font-size:11px!important;font-weight:499}}.dataviews-action-modal{z-index:1000001}.dataviews-selection-checkbox{--checkbox-input-size:24px}@media (min-width:600px){.dataviews-selection-checkbox{--checkbox-input-size:16px}}.dataviews-selection-checkbox{flex-shrink:0;line-height:0}.dataviews-selection-checkbox .components-checkbox-control__input-container{margin:0}.dataviews-view-config{container-type:inline-size;font-size:13px;line-height:1.4;width:320px}.dataviews-config__popover.is-expanded .dataviews-config__popover-content-wrapper{height:100%;overflow-y:scroll}.dataviews-config__popover.is-expanded .dataviews-config__popover-content-wrapper .dataviews-view-config{width:auto}.dataviews-view-config__sort-direction .components-toggle-group-control-option-base{text-transform:uppercase}.dataviews-settings-section__title.dataviews-settings-section__title{font-size:15px;line-height:24px}.dataviews-settings-section__sidebar{grid-column:span 4}.dataviews-settings-section__content,.dataviews-settings-section__content>*{grid-column:span 8}.dataviews-settings-section__content .is-divided-in-two{display:contents}.dataviews-settings-section__content .is-divided-in-two>*{grid-column:span 4}.dataviews-settings-section:has(.dataviews-settings-section__content:empty){display:none}@container (max-width: 500px){.dataviews-settings-section.dataviews-settings-section{grid-template-columns:repeat(2,1fr)}.dataviews-settings-section.dataviews-settings-section .dataviews-settings-section__content,.dataviews-settings-section.dataviews-settings-section .dataviews-settings-section__sidebar{grid-column:span 2}}.dataviews-view-config__label{text-wrap:nowrap}.dataviews-view-grid-items{container-type:inline-size;display:grid;gap:32px;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));grid-template-rows:max-content;margin-bottom:auto;padding:0 24px 24px}@media not (prefers-reduced-motion){.dataviews-view-grid-items{transition:padding .1s ease-out}}.dataviews-view-grid{container-type:inline-size;display:flex;flex-direction:column;gap:32px;margin-bottom:auto;padding:0 24px 24px}@media not (prefers-reduced-motion){.dataviews-view-grid{transition:padding .1s ease-out}}.dataviews-view-grid .dataviews-view-grid__row{display:grid;gap:32px}.dataviews-view-grid .dataviews-view-grid__row .dataviews-view-grid__row__gridcell{border-radius:4px;position:relative}.dataviews-view-grid .dataviews-view-grid__row .dataviews-view-grid__row__gridcell[data-focus-visible]:after{border-radius:4px;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";height:100%;right:0;outline:2px solid transparent;pointer-events:none;position:absolute;top:0;width:100%}.dataviews-view-grid .dataviews-view-grid__card{height:100%;justify-content:flex-start;position:relative}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-actions{padding:8px 0 4px}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-field{align-content:center;min-height:24px;overflow:hidden;text-align:start}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-field--clickable{width:-moz-fit-content;width:fit-content}.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{color:#1e1e1e}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__media:focus:after,.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__media:after{background-color:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__media:after{box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__media:focus:after{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.dataviews-view-grid .dataviews-view-grid__media{aspect-ratio:1/1;background-color:#fff;border-radius:4px;overflow:hidden;position:relative;width:100%}.dataviews-view-grid .dataviews-view-grid__media img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-grid .dataviews-view-grid__media:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;right:0;pointer-events:none;position:absolute;top:0;width:100%}.dataviews-view-grid .dataviews-view-grid__fields{font-size:12px;line-height:16px;position:relative}.dataviews-view-grid .dataviews-view-grid__fields:not(:empty){padding:0 0 12px}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field-value:not(:empty){line-height:20px;min-height:24px;padding-top:2px}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field{align-items:center;min-height:24px}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-name{color:#757575;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:35%}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:65%}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field:not(:has(.dataviews-view-grid__field-value:not(:empty))){display:none}.dataviews-view-grid .dataviews-view-grid__badge-fields:not(:empty){padding-bottom:12px}.dataviews-view-grid__field-value:empty,.dataviews-view-grid__field:empty{display:none}.dataviews-view-grid__card .dataviews-selection-checkbox{right:8px;opacity:0;position:absolute;top:-9999em;z-index:1}@media not (prefers-reduced-motion){.dataviews-view-grid__card .dataviews-selection-checkbox{transition:opacity .1s linear}}@media (hover:none){.dataviews-view-grid__card .dataviews-selection-checkbox{opacity:1;top:8px}}.dataviews-view-grid__card.is-selected .dataviews-selection-checkbox,.dataviews-view-grid__card:focus-within .dataviews-selection-checkbox,.dataviews-view-grid__card:hover .dataviews-selection-checkbox{opacity:1;top:8px}.dataviews-view-grid__card .dataviews-view-grid__media-actions{opacity:0;position:absolute;left:4px;top:4px}.dataviews-view-grid__card .dataviews-view-grid__media-actions .dataviews-all-actions-button{background-color:#fff}@media not (prefers-reduced-motion){.dataviews-view-grid__card .dataviews-view-grid__media-actions{transition:opacity .1s linear}}@media (hover:none){.dataviews-view-grid__card .dataviews-view-grid__media-actions{opacity:1;top:4px}}.dataviews-view-grid__card .dataviews-view-grid__media-actions:has(.dataviews-all-actions-button[aria-expanded=true]),.dataviews-view-grid__card:focus-within .dataviews-view-grid__media-actions,.dataviews-view-grid__card:hover .dataviews-view-grid__media-actions{opacity:1}.dataviews-view-grid__media--clickable{cursor:pointer}.dataviews-view-grid__group-header{color:#1e1e1e;container-type:inline-size;font-size:15px;font-weight:499;margin:0 0 8px;padding:0 24px}div.dataviews-view-list{list-style-type:none}.dataviews-view-list{margin:0 0 auto}.dataviews-view-list div[role=article],.dataviews-view-list div[role=row]{border-top:1px solid #f0f0f0;margin:0}.dataviews-view-list div[role=article] .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=row] .dataviews-view-list__item-wrapper{box-sizing:border-box;padding:16px 24px;position:relative}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions,.dataviews-view-list div[role=row] .dataviews-view-list__item-actions{display:flex;flex:0 0 auto;gap:4px;white-space:nowrap;width:-moz-max-content;width:max-content}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions .components-button,.dataviews-view-list div[role=row] .dataviews-view-list__item-actions .components-button{position:relative;z-index:1}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions>div,.dataviews-view-list div[role=row] .dataviews-view-list__item-actions>div{height:24px}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions>:not(:last-child),.dataviews-view-list div[role=row] .dataviews-view-list__item-actions>:not(:last-child){flex:0;overflow:hidden;width:0}.dataviews-view-list div[role=article]:where(.is-selected,.is-hovered,:focus-within) .dataviews-view-list__item-actions>:not(:last-child),.dataviews-view-list div[role=row]:where(.is-selected,.is-hovered,:focus-within) .dataviews-view-list__item-actions>:not(:last-child){flex-basis:min-content;overflow:unset;width:auto}@media (hover:none){.dataviews-view-list div[role=article] .dataviews-view-list__item-actions>:not(:last-child),.dataviews-view-list div[role=row] .dataviews-view-list__item-actions>:not(:last-child){flex-basis:min-content;overflow:unset;width:auto}}.dataviews-view-list div[role=article].is-selected.is-selected,.dataviews-view-list div[role=article].is-selected.is-selected+div[role=article],.dataviews-view-list div[role=article].is-selected.is-selected+div[role=row],.dataviews-view-list div[role=row].is-selected.is-selected,.dataviews-view-list div[role=row].is-selected.is-selected+div[role=article],.dataviews-view-list div[role=row].is-selected.is-selected+div[role=row]{border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-list div[role=article]:not(.is-selected).is-hovered,.dataviews-view-list div[role=article]:not(.is-selected):focus-within,.dataviews-view-list div[role=article]:not(.is-selected):hover,.dataviews-view-list div[role=row]:not(.is-selected).is-hovered,.dataviews-view-list div[role=row]:not(.is-selected):focus-within,.dataviews-view-list div[role=row]:not(.is-selected):hover{background-color:rgba(var(--wp-admin-theme-color--rgb),.04);border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12);color:var(--wp-admin-theme-color)}.dataviews-view-list div[role=article]:not(.is-selected).is-hovered+div[role=article],.dataviews-view-list div[role=article]:not(.is-selected).is-hovered+div[role=row],.dataviews-view-list div[role=article]:not(.is-selected):focus-within+div[role=article],.dataviews-view-list div[role=article]:not(.is-selected):focus-within+div[role=row],.dataviews-view-list div[role=article]:not(.is-selected):hover+div[role=article],.dataviews-view-list div[role=article]:not(.is-selected):hover+div[role=row],.dataviews-view-list div[role=row]:not(.is-selected).is-hovered+div[role=article],.dataviews-view-list div[role=row]:not(.is-selected).is-hovered+div[role=row],.dataviews-view-list div[role=row]:not(.is-selected):focus-within+div[role=article],.dataviews-view-list div[role=row]:not(.is-selected):focus-within+div[role=row],.dataviews-view-list div[role=row]:not(.is-selected):hover+div[role=article],.dataviews-view-list div[role=row]:not(.is-selected):hover+div[role=row]{border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-list div[role=article]:not(.is-selected).is-hovered .dataviews-title-field,.dataviews-view-list div[role=article]:not(.is-selected).is-hovered .dataviews-view-list__field,.dataviews-view-list div[role=article]:not(.is-selected):focus-within .dataviews-title-field,.dataviews-view-list div[role=article]:not(.is-selected):focus-within .dataviews-view-list__field,.dataviews-view-list div[role=article]:not(.is-selected):hover .dataviews-title-field,.dataviews-view-list div[role=article]:not(.is-selected):hover .dataviews-view-list__field,.dataviews-view-list div[role=row]:not(.is-selected).is-hovered .dataviews-title-field,.dataviews-view-list div[role=row]:not(.is-selected).is-hovered .dataviews-view-list__field,.dataviews-view-list div[role=row]:not(.is-selected):focus-within .dataviews-title-field,.dataviews-view-list div[role=row]:not(.is-selected):focus-within .dataviews-view-list__field,.dataviews-view-list div[role=row]:not(.is-selected):hover .dataviews-title-field,.dataviews-view-list div[role=row]:not(.is-selected):hover .dataviews-view-list__field{color:var(--wp-admin-theme-color)}.dataviews-view-list div[role=article].is-selected .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=article].is-selected:focus-within .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=row].is-selected .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=row].is-selected:focus-within .dataviews-view-list__item-wrapper{background-color:rgba(var(--wp-admin-theme-color--rgb),.08);color:#1e1e1e}.dataviews-view-list div[role=article].is-selected .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=article].is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__field,.dataviews-view-list div[role=article].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=article].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__field,.dataviews-view-list div[role=row].is-selected .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=row].is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__field,.dataviews-view-list div[role=row].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=row].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__field{color:#1e1e1e}.dataviews-view-list .dataviews-view-list__item{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:none;cursor:pointer;inset:0;padding:0;position:absolute;scroll-margin:8px 0;z-index:1}.dataviews-view-list .dataviews-view-list__item:focus-visible{outline:none}.dataviews-view-list .dataviews-view-list__item:focus-visible:before{border-radius:2px;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";inset:var(--wp-admin-border-width-focus);outline:2px solid transparent;position:absolute}.dataviews-view-list .dataviews-view-list__title-field{flex:1;line-height:24px;min-height:24px;overflow:hidden}.dataviews-view-list .dataviews-view-list__title-field:has(a,button){z-index:1}.dataviews-view-list .dataviews-view-list__media-wrapper{background-color:#fff;border-radius:4px;flex-shrink:0;height:52px;overflow:hidden;position:relative;width:52px}.dataviews-view-list .dataviews-view-list__media-wrapper img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-list .dataviews-view-list__media-wrapper:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;right:0;position:absolute;top:0;width:100%}.dataviews-view-list .dataviews-view-list__field-wrapper{flex-grow:1;min-height:52px}.dataviews-view-list .dataviews-view-list__field{color:#757575}.dataviews-view-list .dataviews-view-list__fields{display:flex;flex-wrap:wrap;font-size:12px;gap:12px;row-gap:4px}.dataviews-view-list .dataviews-view-list__fields:empty{display:none}.dataviews-view-list .dataviews-view-list__fields .dataviews-view-list__field:has(.dataviews-view-list__field-value:empty){display:none}.dataviews-view-list .dataviews-view-list__fields .dataviews-view-list__field-value{align-items:center;display:flex;line-height:20px;min-height:24px}.dataviews-view-list+.dataviews-pagination{justify-content:space-between}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__item-wrapper{padding:8px 24px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__title-field{line-height:16px;min-height:16px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__media-wrapper{height:32px;width:32px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__field-wrapper{min-height:32px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__fields{gap:8px;row-gap:4px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__fields .dataviews-view-list__field-value{line-height:16px;min-height:16px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__item-wrapper{padding:24px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__title-field{line-height:32px;min-height:32px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__media-wrapper{height:64px;width:64px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__field-wrapper{min-height:64px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__fields{gap:16px;row-gap:8px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__fields .dataviews-view-list__field-value{line-height:24px;min-height:32px}.dataviews-view-list__group-header{color:#1e1e1e;font-size:15px;font-weight:499;margin:0 0 8px;padding:0 24px}.dataviews-view-table{background-color:inherit;border-collapse:collapse;border-color:inherit;color:#757575;margin-bottom:auto;position:relative;text-indent:0;width:100%}.dataviews-view-table th{color:#1e1e1e;font-size:13px;font-weight:400;text-align:right}.dataviews-view-table td,.dataviews-view-table th{padding:12px}.dataviews-view-table td.dataviews-view-table__actions-column,.dataviews-view-table th.dataviews-view-table__actions-column{text-align:left}.dataviews-view-table td.dataviews-view-table__actions-column--sticky,.dataviews-view-table th.dataviews-view-table__actions-column--sticky{background-color:var(--wp-dataviews-color-background,#fff);position:sticky;left:0}.dataviews-view-table td.dataviews-view-table__actions-column--stuck:after,.dataviews-view-table th.dataviews-view-table__actions-column--stuck:after{background-color:#f0f0f0;bottom:0;content:"";display:block;right:0;position:absolute;top:0;width:1px}.dataviews-view-table td.dataviews-view-table__checkbox-column,.dataviews-view-table th.dataviews-view-table__checkbox-column{padding-left:0}.dataviews-view-table td.dataviews-view-table__checkbox-column .dataviews-view-table__cell-content-wrapper,.dataviews-view-table th.dataviews-view-table__checkbox-column .dataviews-view-table__cell-content-wrapper{max-width:auto;min-width:auto}.dataviews-view-table tr{background-color:inherit;border-top:1px solid #f0f0f0}.dataviews-view-table tr td:first-child,.dataviews-view-table tr th:first-child{padding-right:24px}.dataviews-view-table tr td:last-child,.dataviews-view-table tr th:last-child{padding-left:24px}.dataviews-view-table tr:last-child{border-bottom:0}.dataviews-view-table tr .dataviews-item-actions .components-button:not(.dataviews-all-actions-button){opacity:0}@media (hover:none){.dataviews-view-table tr .dataviews-item-actions .components-button:not(.dataviews-all-actions-button){opacity:1}}.dataviews-view-table tr.is-selected{background-color:color-mix(in srgb,rgb(var(--wp-admin-theme-color--rgb)) 4%,#fff);color:#757575}.dataviews-view-table tr.is-selected,.dataviews-view-table tr.is-selected+tr{border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-table tr.is-selected .dataviews-view-table__actions-column--sticky{background-color:color-mix(in srgb,rgb(var(--wp-admin-theme-color--rgb)) 4%,#fff)}.dataviews-view-table tr.is-hovered .dataviews-item-actions .components-button:not(.dataviews-all-actions-button),.dataviews-view-table tr:focus-within .dataviews-item-actions .components-button:not(.dataviews-all-actions-button),.dataviews-view-table tr:hover .dataviews-item-actions .components-button:not(.dataviews-all-actions-button){opacity:1}.dataviews-view-table.has-bulk-actions tr:focus-within .dataviews-view-table__actions-column--sticky,.dataviews-view-table.has-bulk-actions tr:hover .dataviews-view-table__actions-column--sticky{background-color:var(--wp-dataviews-color-background,#fff)}.dataviews-view-table.has-bulk-actions tr.is-selected .dataviews-view-table__actions-column--sticky,.dataviews-view-table.has-bulk-actions tr.is-selected:hover .dataviews-view-table__actions-column--sticky{background-color:color-mix(in srgb,rgb(var(--wp-admin-theme-color--rgb)) 4%,#fff)}.dataviews-view-table thead{background-color:inherit;inset-block-start:0;position:sticky;z-index:1}.dataviews-view-table thead tr{border:0}.dataviews-view-table thead th{background-color:inherit;font-size:11px;font-weight:499;padding-bottom:8px;padding-top:8px;text-transform:uppercase}.dataviews-view-table thead th:has(.dataviews-view-table-header-button){padding-right:4px;padding-left:4px}.dataviews-view-table thead th:has(.dataviews-view-table-header-button) .dataviews-view-table-header-button{gap:4px}.dataviews-view-table thead th:has(.dataviews-view-table-header-button):first-child{padding-right:40px}.dataviews-view-table thead th:has(.dataviews-view-table-header-button):last-child{padding-left:40px}.dataviews-view-table tbody td{vertical-align:top}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper{align-items:center;display:flex;min-height:32px;white-space:nowrap}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper.dataviews-view-table__cell-align-end{justify-content:flex-end}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper.dataviews-view-table__cell-align-center{justify-content:center}.dataviews-view-table tbody .components-v-stack>.dataviews-view-table__cell-content-wrapper:not(:first-child){min-height:0}.dataviews-view-table .dataviews-view-table-header-button{font-size:11px;font-weight:499;padding:4px 8px;text-transform:uppercase}.dataviews-view-table .dataviews-view-table-header-button:not(:hover){color:#1e1e1e}.dataviews-view-table .dataviews-view-table-header-button span{speak:none}.dataviews-view-table .dataviews-view-table-header-button span:empty{display:none}.dataviews-view-table .dataviews-view-table-header{padding-right:4px}.dataviews-view-table .dataviews-view-table__actions-column{white-space:nowrap;width:auto}.dataviews-view-table.has-compact-density thead th:has(.dataviews-view-table-header-button):not(:first-child){padding-right:0}.dataviews-view-table.has-compact-density thead th:has(.dataviews-view-table-header-button):not(:last-child){padding-left:0}.dataviews-view-table.has-compact-density td,.dataviews-view-table.has-compact-density th{padding:4px 8px}.dataviews-view-table.has-comfortable-density td,.dataviews-view-table.has-comfortable-density th{padding:16px 12px}.dataviews-view-table.has-comfortable-density td.dataviews-view-table__checkbox-column,.dataviews-view-table.has-comfortable-density th.dataviews-view-table__checkbox-column,.dataviews-view-table.has-compact-density td.dataviews-view-table__checkbox-column,.dataviews-view-table.has-compact-density th.dataviews-view-table__checkbox-column{padding-left:0}.dataviews-view-table-selection-checkbox{--checkbox-input-size:24px}@media (min-width:600px){.dataviews-view-table-selection-checkbox{--checkbox-input-size:16px}}.dataviews-column-primary__media{background-color:#fff;border-radius:4px;flex-shrink:0;max-width:60px;min-height:32px;min-width:32px;overflow:hidden;position:relative}.dataviews-column-primary__media img{height:32px;-o-object-fit:cover;object-fit:cover;width:32px}.dataviews-column-primary__media:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;right:0;position:absolute;top:0;width:100%}.dataviews-view-table__cell-content-wrapper:not(.dataviews-column-primary__media),.dataviews-view-table__primary-column-content:not(.dataviews-column-primary__media){max-width:80ch;min-width:15ch}.dataviews-view-table__group-header-row .dataviews-view-table__group-header-cell{color:#1e1e1e;font-weight:499;padding:12px 24px}.dataviews-view-table col[class^=dataviews-view-table__col-]:not(.dataviews-view-table__col-first-data){width:1%}.dataviews-view-picker-grid .dataviews-view-picker-grid__card{height:100%;justify-content:flex-start;position:relative}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__title-actions{padding:8px 0 4px}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__title-field{align-content:center;min-height:24px;overflow:hidden;text-align:start}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__title-field--clickable{width:-moz-fit-content;width:fit-content}.dataviews-view-picker-grid .dataviews-view-picker-grid__card.is-selected .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field .dataviews-view-picker-grid__field-value{color:#1e1e1e}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__media:focus:after,.dataviews-view-picker-grid .dataviews-view-picker-grid__card.is-selected .dataviews-view-picker-grid__media:after{background-color:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-view-picker-grid .dataviews-view-picker-grid__card.is-selected .dataviews-view-picker-grid__media:after{box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__media:focus:after{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.dataviews-view-picker-grid:focus-visible[aria-activedescendant]{outline:none}.dataviews-view-picker-grid:focus-visible [data-active-item=true]{outline:2px solid var(--wp-admin-theme-color)}.dataviews-view-picker-grid .dataviews-selection-checkbox{top:8px!important}.dataviews-view-picker-grid .dataviews-selection-checkbox input{pointer-events:none}.dataviews-view-picker-grid .dataviews-view-picker-grid__media{aspect-ratio:1/1;background-color:#fff;border-radius:4px;min-height:0;position:relative;width:100%}.dataviews-view-picker-grid .dataviews-view-picker-grid__media img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-picker-grid .dataviews-view-picker-grid__media:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;right:0;pointer-events:none;position:absolute;top:0;width:100%}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields{font-size:12px;line-height:16px;position:relative}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields:not(:empty){padding:0 0 12px}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field-value:not(:empty){line-height:20px;min-height:24px;padding-top:2px}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field{align-items:center;min-height:24px}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field .dataviews-view-picker-grid__field-name{color:#757575;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:35%}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field .dataviews-view-picker-grid__field-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:65%}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field:not(:has(.dataviews-view-picker-grid__field-value:not(:empty))){display:none}.dataviews-view-picker-grid .dataviews-view-picker-grid__badge-fields:not(:empty){padding-bottom:12px}.dataviews-view-picker-grid__field-value:empty,.dataviews-view-picker-grid__field:empty{display:none}.dataviews-view-picker-grid__card .dataviews-selection-checkbox{right:8px;position:absolute;top:-9999em;z-index:1}@media (hover:none){.dataviews-view-picker-grid__card .dataviews-selection-checkbox{top:8px}}.dataviews-view-picker-grid__card.is-selected .dataviews-selection-checkbox,.dataviews-view-picker-grid__card:focus-within .dataviews-selection-checkbox,.dataviews-view-picker-grid__card:hover .dataviews-selection-checkbox{top:8px}.dataviews-view-picker-grid__media--clickable{cursor:pointer}.dataviews-view-picker-grid-group__header{color:#1e1e1e;font-size:15px;font-weight:499;margin:0 0 8px;padding:0 48px}.dataviews-view-picker-table{background-color:inherit}.dataviews-view-picker-table .dataviews-view-table__checkbox-column{width:48px}.dataviews-view-picker-table tbody:focus-visible[aria-activedescendant]{outline:none}.dataviews-view-picker-table tbody:focus-visible [data-active-item=true]{outline:2px solid var(--wp-admin-theme-color)}.dataviews-view-picker-table .dataviews-selection-checkbox .components-checkbox-control__input.components-checkbox-control__input{opacity:1;pointer-events:none}.dataviews-view-picker-table .dataviews-view-table__row{cursor:pointer}.dataviews-view-picker-table .dataviews-view-table__row.is-selected{background-color:rgba(var(--wp-admin-theme-color--rgb),.04)}.dataviews-view-picker-table .dataviews-view-table__row.is-hovered{background-color:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-view-picker-table .dataviews-view-table__row.is-selected.is-hovered{background-color:rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-activity{margin:0 0 auto;padding:8px 24px}.dataviews-view-activity .dataviews-view-activity__group-header{color:#949494;font-size:15px;font-weight:499;margin:0 0 8px;padding:0}.dataviews-view-activity .dataviews-view-activity__item-actions{min-width:24px}.dataviews-view-activity .dataviews-view-activity__item-content{flex-grow:1}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-description,.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields,.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title{min-height:16px}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title{align-items:center;display:flex;flex:1;overflow:hidden;position:relative}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title--clickable{cursor:pointer}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title--clickable:focus-visible{border-radius:2px;outline:var(--wp-admin-border-width-focus) solid var(--wp-admin-theme-color);outline-offset:var(--wp-admin-border-width-focus)}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__primary-actions{display:flex;flex:0 0 auto;width:-moz-max-content;width:max-content}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__primary-actions .components-button{position:relative;z-index:1}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields{color:#757575;display:flex;flex-wrap:wrap;gap:12px;row-gap:4px}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields:empty{display:none}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields .dataviews-view-activity__item-field:has(.dataviews-view-activity__item-field-value:empty){display:none}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields .dataviews-view-activity__item-field-value{align-items:center;display:flex}.dataviews-view-activity .dataviews-view-activity__item-type{align-self:stretch;flex-shrink:0}.dataviews-view-activity .dataviews-view-activity__item-type:after{background-color:#ddd;content:"";flex:1 1 auto;margin:0 auto;width:1px}.dataviews-view-activity .dataviews-view-activity__item-type:before{background-color:#ddd;content:"";flex:0 0 auto;margin:0 auto;width:1px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-type{width:8px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-type:before{height:12px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-type-icon{height:11px;width:11px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-content{margin:12px 0}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-type{width:24px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-type:before{height:12px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-type-icon{height:25px;width:25px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-content{margin:12px 0;padding-top:8px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-type{width:32px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-type:before{height:8px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-type-icon{height:33px;width:33px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-content{margin:8px 0 16px;padding-top:12px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-bullet,.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-bullet{height:9px;position:relative;top:50%;transform:translateY(-50%);width:9px}.dataviews-view-activity .dataviews-view-activity__item:first-child .dataviews-view-activity__item-type:before{visibility:hidden}.dataviews-view-activity .dataviews-view-activity__group:last-of-type>.dataviews-view-activity__item:last-of-type .dataviews-view-activity__item-type:after,.dataviews-view-activity>.dataviews-view-activity__item:last-child .dataviews-view-activity__item-type:after{background:linear-gradient(-180deg,#ddd 0,hsla(0,0%,87%,.2) 60%,hsla(0,0%,87%,0))}.dataviews-view-activity .dataviews-view-activity__item-type-icon{background-color:#fff;flex-shrink:0;overflow:hidden}.dataviews-view-activity .dataviews-view-activity__item-type-icon .dataviews-view-activity__item-bullet,.dataviews-view-activity .dataviews-view-activity__item-type-icon img,.dataviews-view-activity .dataviews-view-activity__item-type-icon svg{border-radius:50%;box-shadow:inset 0 0 0 1px #ddd;box-sizing:border-box;display:block;height:100%;margin:0 auto;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-activity .dataviews-view-activity__item-type-icon svg{padding:4px}.dataviews-view-activity .dataviews-view-activity__item-type-icon .dataviews-view-activity__item-bullet{background-color:#ddd;content:""}.dataviews-view-activity+.dataviews-pagination{justify-content:space-between}.dataviews-picker-footer__bulk-selection{align-self:flex-start;height:32px}.dataviews-picker-footer__actions{align-self:flex-end}.dataviews-controls__datetime{border:none;padding:0}.dataviews-controls__relative-date-number,.dataviews-controls__relative-date-unit{flex:1 1 50%}.dataviews-controls__date input[type=date]::-webkit-calendar-picker-indicator,.dataviews-controls__date input[type=date]::-webkit-inner-spin-button{-webkit-appearance:none;display:none}.dataviews-controls__date-range-inputs>*{min-width:0}.dataviews-controls__date-preset{border:1px solid #ddd}.dataviews-controls__date-preset:active{background-color:#000}.dataforms-layouts-panel__field{align-items:flex-start!important;justify-content:flex-start!important;min-height:32px;width:100%}.dataforms-layouts-panel__field--label-position-none{align-items:center!important}.dataforms-layouts-panel__field-label{align-items:center;display:flex;flex-shrink:0;hyphens:auto;line-height:20px;min-height:32px;width:38%}.dataforms-layouts-panel__field-label--label-position-side{align-self:center}.dataforms-layouts-panel__field-label.has-error{color:#cc1818}.dataforms-layouts-panel__field-label-error-content{cursor:help;fill:#cc1818}.dataforms-layouts-panel__field-label-error-content svg{fill:currentColor}.dataforms-layouts-panel__field-control{align-items:center;display:flex;flex-grow:1;min-height:32px}.dataforms-layouts-panel__field-control .components-button{max-width:100%;min-height:32px;text-align:right;text-wrap:balance;text-wrap:pretty;white-space:normal}.dataforms-layouts-panel__field-control.components-button.is-link[aria-disabled=true]{text-decoration:none}.dataforms-layouts-panel__field-control .components-dropdown{max-width:100%}.dataforms-layouts-panel__field-dropdown .components-popover__content{min-width:320px;padding:16px}.dataforms-layouts-panel__dropdown-header{margin-bottom:16px}.dataforms-layouts-panel__modal-footer{margin-top:16px}.components-popover.components-dropdown__content.dataforms-layouts-panel__field-dropdown{z-index:159990}.dataforms-layouts-panel__summary-button:empty{min-width:160px}.dataforms-layouts-regular__field{align-items:flex-start!important;justify-content:flex-start!important;min-height:32px;width:100%}.dataforms-layouts-regular__field-label{align-items:center;display:flex;flex-shrink:0;hyphens:auto;line-height:20px;min-height:32px;width:38%}.dataforms-layouts-regular__field-label--label-position-side{align-self:center}.dataforms-layouts-regular__field-control{align-items:center;display:flex;flex-grow:1;min-height:32px}.dataforms-layouts-card__field-header-label{font-family:-apple-system,"system-ui",Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:15px;font-weight:499;line-height:20px}.dataforms-layouts-card__field{width:100%}.dataforms-layouts-card__field-description{color:#757575;display:block;font-size:13px;margin-bottom:16px}.dataforms-layouts-card__field-summary{display:flex;flex-direction:row;gap:16px}.dataforms-layouts-details__content{padding-top:12px}.dataforms-layouts-row__field-control{width:100%}.dataforms-layouts__wrapper{font-family:-apple-system,"system-ui",Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:400;line-height:20px}.clawpress-settings__actions{align-items:center;display:flex;gap:8px;margin-top:16px}.clawpress-settings__model-description,.clawpress-settings__model-meta{color:#50575e}.clawpress-settings__model-skipped{display:inline-block;margin-top:4px}.clawpress-abilities__header{align-items:baseline;display:flex;gap:12px;justify-content:space-between}.clawpress-abilities__header h3{font-size:24px;line-height:1.2;margin:0}.clawpress-abilities__header p{color:#50575e;margin:0}.clawpress-abilities__toolbar{align-items:flex-end;display:flex;gap:12px;justify-content:space-between;margin-bottom:20px}.clawpress-abilities__toolbar .components-base-control{margin-bottom:0;min-width:220px}.clawpress-abilities__actions{display:flex;gap:8px}.clawpress-abilities__grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(320px,1fr))}.clawpress-abilities__item{background:linear-gradient(-180deg,#fff,#f6f7f7);border:1px solid #dcdcde;border-radius:10px;display:flex;flex-direction:column;gap:10px;padding:14px}.clawpress-abilities__item-header{align-items:flex-start;display:flex;gap:12px;justify-content:space-between}.clawpress-abilities__item h4{margin:0}.clawpress-abilities__item .components-base-control{margin-bottom:0}.clawpress-abilities__description{color:#1d2327;margin:0}.clawpress-abilities__annotations{display:flex;flex-wrap:wrap;gap:6px;min-height:24px}.clawpress-abilities__annotation{align-items:center;border-radius:999px;display:inline-flex;font-size:11px;font-weight:600;line-height:1.4;padding:3px 8px}.clawpress-abilities__annotation.is-readonly{background:#d6f5e3;color:#0f5132}.clawpress-abilities__annotation.is-destructive{background:#fbe6e8;color:#8a2424}.clawpress-abilities__meta{color:#50575e;font-size:12px;margin:0}.clawpress-abilities__warning{color:#b32d2e;font-size:12px;margin:0}.clawpress-abilities__empty{color:#50575e;margin:0}@media(max-width:782px){.clawpress-abilities__toolbar{align-items:stretch;flex-direction:column}.clawpress-abilities__actions{justify-content:flex-start}} diff --git a/build/scripts/style-admin.css b/build/scripts/style-admin.css index 32b69c9..6afb57a 100644 --- a/build/scripts/style-admin.css +++ b/build/scripts/style-admin.css @@ -1 +1 @@ -:root{--wpds-border-radius-lg:8px;--wpds-border-radius-md:4px;--wpds-border-radius-sm:2px;--wpds-border-radius-xs:1px;--wpds-border-width-focus:2px;--wpds-border-width-lg:8px;--wpds-border-width-md:4px;--wpds-border-width-sm:2px;--wpds-border-width-xs:1px;--wpds-color-bg-interactive-brand-strong:#3858e9;--wpds-color-bg-interactive-brand-strong-active:#2e49d9;--wpds-color-bg-interactive-brand-weak:#00000000;--wpds-color-bg-interactive-brand-weak-active:#e6eaf4;--wpds-color-bg-interactive-error:#00000000;--wpds-color-bg-interactive-error-active:#fff6f4;--wpds-color-bg-interactive-error-strong:#cc1818;--wpds-color-bg-interactive-error-strong-active:#b90000;--wpds-color-bg-interactive-error-weak:#00000000;--wpds-color-bg-interactive-error-weak-active:#f6e6e3;--wpds-color-bg-interactive-neutral-strong:#2d2d2d;--wpds-color-bg-interactive-neutral-strong-active:#1e1e1e;--wpds-color-bg-interactive-neutral-strong-disabled:#e2e2e2;--wpds-color-bg-interactive-neutral-weak:#00000000;--wpds-color-bg-interactive-neutral-weak-active:#eaeaea;--wpds-color-bg-interactive-neutral-weak-disabled:#00000000;--wpds-color-bg-surface-brand:#ecf0f9;--wpds-color-bg-surface-caution:#fee994;--wpds-color-bg-surface-caution-weak:#fff9c9;--wpds-color-bg-surface-error:#f6e6e3;--wpds-color-bg-surface-error-weak:#fff6f4;--wpds-color-bg-surface-info:#deebfa;--wpds-color-bg-surface-info-weak:#f2f9ff;--wpds-color-bg-surface-neutral:#f8f8f8;--wpds-color-bg-surface-neutral-strong:#fff;--wpds-color-bg-surface-neutral-weak:#f0f0f0;--wpds-color-bg-surface-success:#c5f7cc;--wpds-color-bg-surface-success-weak:#eaffed;--wpds-color-bg-surface-warning:#fde6bd;--wpds-color-bg-surface-warning-weak:#fff7e0;--wpds-color-bg-thumb-brand:#3858e9;--wpds-color-bg-thumb-brand-active:#3858e9;--wpds-color-bg-thumb-neutral-disabled:#d8d8d8;--wpds-color-bg-thumb-neutral-weak:#8a8a8a;--wpds-color-bg-thumb-neutral-weak-active:#6c6c6c;--wpds-color-bg-track-neutral:#d8d8d8;--wpds-color-bg-track-neutral-weak:#e0e0e0;--wpds-color-fg-content-caution:#281d00;--wpds-color-fg-content-caution-weak:#826a00;--wpds-color-fg-content-error:#470000;--wpds-color-fg-content-error-weak:#cc1818;--wpds-color-fg-content-info:#001b4f;--wpds-color-fg-content-info-weak:#006bd7;--wpds-color-fg-content-neutral:#1e1e1e;--wpds-color-fg-content-neutral-weak:#6d6d6d;--wpds-color-fg-content-success:#002900;--wpds-color-fg-content-success-weak:#007f30;--wpds-color-fg-content-warning:#2e1900;--wpds-color-fg-content-warning-weak:#926300;--wpds-color-fg-interactive-brand:#3858e9;--wpds-color-fg-interactive-brand-active:#3858e9;--wpds-color-fg-interactive-brand-strong:#eff0f2;--wpds-color-fg-interactive-brand-strong-active:#eff0f2;--wpds-color-fg-interactive-error:#cc1818;--wpds-color-fg-interactive-error-active:#cc1818;--wpds-color-fg-interactive-error-strong:#f2efef;--wpds-color-fg-interactive-error-strong-active:#f2efef;--wpds-color-fg-interactive-neutral:#1e1e1e;--wpds-color-fg-interactive-neutral-active:#1e1e1e;--wpds-color-fg-interactive-neutral-disabled:#8a8a8a;--wpds-color-fg-interactive-neutral-strong:#f0f0f0;--wpds-color-fg-interactive-neutral-strong-active:#f0f0f0;--wpds-color-fg-interactive-neutral-strong-disabled:#8a8a8a;--wpds-color-fg-interactive-neutral-weak:#6d6d6d;--wpds-color-fg-interactive-neutral-weak-disabled:#8a8a8a;--wpds-color-stroke-focus-brand:#3858e9;--wpds-color-stroke-interactive-brand:#3858e9;--wpds-color-stroke-interactive-brand-active:#2337c8;--wpds-color-stroke-interactive-error:#cc1818;--wpds-color-stroke-interactive-error-active:#9d0000;--wpds-color-stroke-interactive-error-strong:#cc1818;--wpds-color-stroke-interactive-neutral:#8a8a8a;--wpds-color-stroke-interactive-neutral-active:#6c6c6c;--wpds-color-stroke-interactive-neutral-disabled:#d8d8d8;--wpds-color-stroke-interactive-neutral-strong:#6c6c6c;--wpds-color-stroke-surface-brand:#a3b1d4;--wpds-color-stroke-surface-brand-strong:#3858e9;--wpds-color-stroke-surface-error:#daa39b;--wpds-color-stroke-surface-error-strong:#cc1818;--wpds-color-stroke-surface-info:#9fbcdc;--wpds-color-stroke-surface-info-strong:#006bd7;--wpds-color-stroke-surface-neutral:#d8d8d8;--wpds-color-stroke-surface-neutral-strong:#8a8a8a;--wpds-color-stroke-surface-neutral-weak:#e0e0e0;--wpds-color-stroke-surface-success:#8ac894;--wpds-color-stroke-surface-success-strong:#007f30;--wpds-color-stroke-surface-warning:#d0b381;--wpds-color-stroke-surface-warning-strong:#926300;--wpds-dimension-base:4px;--wpds-dimension-gap-2xs:4px;--wpds-dimension-gap-lg:24px;--wpds-dimension-gap-md:16px;--wpds-dimension-gap-sm:12px;--wpds-dimension-gap-xl:40px;--wpds-dimension-gap-xs:8px;--wpds-dimension-padding-surface-2xs:4px;--wpds-dimension-padding-surface-lg:32px;--wpds-dimension-padding-surface-md:24px;--wpds-dimension-padding-surface-sm:16px;--wpds-dimension-padding-surface-xs:8px;--wpds-elevation-large:0 5px 15px 0 #00000014,0 15px 27px 0 #00000012,0 30px 36px 0 #0000000a,0 50px 43px 0 #00000005;--wpds-elevation-medium:0 2px 3px 0 #0000000d,0 4px 5px 0 #0000000a,0 12px 12px 0 #00000008,0 16px 16px 0 #00000005;--wpds-elevation-small:0 1px 2px 0 #0000000d,0 2px 3px 0 #0000000a,0 6px 6px 0 #00000008,0 8px 8px 0 #00000005;--wpds-elevation-x-small:0 1px 1px 0 #00000008,0 1px 2px 0 #00000005,0 3px 3px 0 #00000005,0 4px 4px 0 #00000003;--wpds-font-family-body:-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif;--wpds-font-family-heading:-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif;--wpds-font-family-mono:"Menlo","Consolas",monaco,monospace;--wpds-font-line-height-2xl:40px;--wpds-font-line-height-lg:28px;--wpds-font-line-height-md:24px;--wpds-font-line-height-sm:20px;--wpds-font-line-height-xl:32px;--wpds-font-line-height-xs:16px;--wpds-font-size-2xl:32px;--wpds-font-size-lg:15px;--wpds-font-size-md:13px;--wpds-font-size-sm:12px;--wpds-font-size-xl:20px;--wpds-font-size-xs:11px;--wpds-font-weight-medium:499;--wpds-font-weight-regular:400}[data-wpds-theme-provider-id][data-wpds-density=default]{--wpds-dimension-base:4px;--wpds-dimension-gap-2xs:4px;--wpds-dimension-gap-lg:24px;--wpds-dimension-gap-md:16px;--wpds-dimension-gap-sm:12px;--wpds-dimension-gap-xl:40px;--wpds-dimension-gap-xs:8px;--wpds-dimension-padding-surface-2xs:4px;--wpds-dimension-padding-surface-lg:32px;--wpds-dimension-padding-surface-md:24px;--wpds-dimension-padding-surface-sm:16px;--wpds-dimension-padding-surface-xs:8px}[data-wpds-theme-provider-id][data-wpds-density=compact]{--wpds-dimension-gap-2xs:4px;--wpds-dimension-gap-lg:20px;--wpds-dimension-gap-md:12px;--wpds-dimension-gap-sm:8px;--wpds-dimension-gap-xl:32px;--wpds-dimension-gap-xs:4px;--wpds-dimension-padding-surface-2xs:4px;--wpds-dimension-padding-surface-lg:24px;--wpds-dimension-padding-surface-md:20px;--wpds-dimension-padding-surface-sm:12px;--wpds-dimension-padding-surface-xs:4px}[data-wpds-theme-provider-id][data-wpds-density=comfortable]{--wpds-dimension-gap-2xs:8px;--wpds-dimension-gap-lg:32px;--wpds-dimension-gap-md:20px;--wpds-dimension-gap-sm:16px;--wpds-dimension-gap-xl:48px;--wpds-dimension-gap-xs:12px;--wpds-dimension-padding-surface-2xs:8px;--wpds-dimension-padding-surface-lg:40px;--wpds-dimension-padding-surface-md:32px;--wpds-dimension-padding-surface-sm:20px;--wpds-dimension-padding-surface-xs:12px}@media (min-resolution:192dpi){:root{--wpds-border-width-focus:1.5px}}.dataviews-picker-wrapper,.dataviews-wrapper{background-color:var(--wp-dataviews-color-background,#fff);box-sizing:border-box;container:dataviews-wrapper/inline-size;display:flex;flex-direction:column;font-size:13px;height:100%;line-height:1.4;overflow:auto;scroll-padding-bottom:64px}.dataviews-filters__container,.dataviews__view-actions{background-color:inherit;box-sizing:border-box;flex-shrink:0;left:0;padding:16px 24px;position:sticky}@media not (prefers-reduced-motion){.dataviews-filters__container,.dataviews__view-actions{transition:padding .1s ease-out}}.dataviews-loading,.dataviews-no-results{align-items:center;display:flex;flex-grow:1;justify-content:center;padding:0 24px}@media not (prefers-reduced-motion){.dataviews-loading,.dataviews-no-results{transition:padding .1s ease-out}}.dataviews-loading-more{text-align:center}@container (max-width: 430px){.dataviews-filters__container,.dataviews__view-actions{padding:12px 24px}}.dataviews-title-field{font-size:13px;font-weight:499;width:100%}.dataviews-title-field,.dataviews-title-field a{color:#2f2f2f;text-overflow:ellipsis;white-space:nowrap}.dataviews-title-field a{display:block;flex-grow:0;overflow:hidden;text-decoration:none}.dataviews-title-field a:hover{color:var(--wp-admin-theme-color)}.dataviews-title-field a:focus{border-radius:2px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color,#007cba);color:var(--wp-admin-theme-color--rgb)}.dataviews-title-field button.components-button.is-link{color:#1e1e1e;display:block;font-weight:inherit;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;width:100%}.dataviews-title-field button.components-button.is-link:hover{color:var(--wp-admin-theme-color)}.dataviews-title-field--clickable{color:#2f2f2f;cursor:pointer}.dataviews-title-field--clickable:hover{color:var(--wp-admin-theme-color)}.dataviews-title-field--clickable:focus{border-radius:2px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color,#007cba);color:var(--wp-admin-theme-color--rgb)}.components-card__body:has(>.dataviews-picker-wrapper),.components-card__body:has(>.dataviews-wrapper){overflow:hidden;padding:8px 0 0}.dataviews-bulk-actions-footer__item-count{color:#1e1e1e}.dataviews-bulk-actions-footer__container{margin-right:auto;min-height:32px}.dataviews-filters__button{position:relative}.dataviews-filters__container{padding-top:0}.dataviews-filters__reset-button.dataviews-filters__reset-button[aria-disabled=true],.dataviews-filters__reset-button.dataviews-filters__reset-button[aria-disabled=true]:hover{opacity:0}.dataviews-filters__reset-button.dataviews-filters__reset-button[aria-disabled=true]:focus{opacity:1}.dataviews-filters__summary-popover{font-size:13px;line-height:1.4}.dataviews-filters__summary-popover .components-popover__content{border-radius:4px;max-width:250px;min-width:230px;width:100%}.dataviews-filters__summary-popover.components-dropdown__content .components-popover__content{padding:0}.dataviews-filters__summary-operators-container{padding:8px 16px}.dataviews-filters__summary-operators-container:has(+.dataviews-filters__search-widget-listbox),.dataviews-filters__summary-operators-container:has(+.dataviews-filters__search-widget-no-elements),.dataviews-filters__summary-operators-container:has(+.dataviews-filters__user-input-widget){border-bottom:1px solid #e0e0e0}.dataviews-filters__summary-operators-container:empty{display:none}.dataviews-filters__summary-operators-container .dataviews-filters__summary-operators-filter-name{color:#757575;flex-shrink:0;max-width:calc(100% - 55px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dataviews-filters__summary-operators-container .dataviews-filters__summary-operators-filter-select{overflow:hidden;white-space:nowrap;width:100%}.dataviews-filters__summary-chip-container{position:relative;white-space:pre-wrap}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip{align-items:center;background:#f0f0f0;border:1px solid transparent;border-radius:16px;box-sizing:border-box;color:#2f2f2f;cursor:pointer;display:flex;min-height:32px;padding:4px 12px;position:relative}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.is-not-clickable{cursor:default}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-reset{padding-inline-end:28px}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip:focus-visible,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip:hover:not(.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.is-not-clickable),.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip[aria-expanded=true]{background:#e0e0e0;color:#1e1e1e}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-values{background:rgba(var(--wp-admin-theme-color--rgb),.04);color:var(--wp-admin-theme-color)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-values:hover,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-values[aria-expanded=true]{background:rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:none}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip .dataviews-filters-__summary-filter-text-name{font-weight:499}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove{align-items:center;background:transparent;border:0;border-radius:50%;cursor:pointer;display:flex;height:24px;justify-content:center;padding:0;position:absolute;right:4px;top:50%;transform:translateY(-50%);width:24px}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove svg{fill:#757575}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:focus,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:hover{background:#e0e0e0}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:focus svg,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:hover svg{fill:#1e1e1e}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove.has-values svg{fill:var(--wp-admin-theme-color)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove.has-values:hover{background:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:none}.dataviews-filters__search-widget-filter-combobox-list{border-top:1px solid #e0e0e0;max-height:184px;overflow:auto;padding:4px}.dataviews-filters__search-widget-filter-combobox-list .dataviews-filters__search-widget-filter-combobox-item-value [data-user-value]{font-weight:600}.dataviews-filters__search-widget-listbox{overflow:auto;padding:4px}.dataviews-filters__search-widget-listitem{align-items:center;border-radius:2px;box-sizing:border-box;cursor:default;display:flex;font-family:-apple-system,"system-ui",Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:400;gap:8px;line-height:20px;min-height:32px;padding:4px 12px}.dataviews-filters__search-widget-listitem:last-child{margin-block-end:0}.dataviews-filters__search-widget-listitem:focus,.dataviews-filters__search-widget-listitem:hover,.dataviews-filters__search-widget-listitem[data-active-item]{background-color:var(--wp-admin-theme-color);color:#fff}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-description,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-description,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-description{color:#fff}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-single-selection,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-single-selection,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-single-selection{background:#fff;border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-single-selection.is-selected,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-single-selection.is-selected,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-single-selection.is-selected{background:var(--wp-admin-theme-color-darker-20,#183ad6);border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-multi-selection,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-multi-selection,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-multi-selection{border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-multi-selection.is-selected,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-multi-selection.is-selected,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-multi-selection.is-selected{background:var(--wp-admin-theme-color-darker-20,#183ad6);border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-description{color:#757575;display:block;font-size:12px;line-height:16px;overflow:hidden;text-overflow:ellipsis}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{border:1px solid #1e1e1e;border-radius:50%;height:24px;margin-right:12px;max-width:24px;min-width:24px;position:relative;transition:none;width:24px}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{transition:box-shadow .1s linear}}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{height:16px;max-width:16px;min-width:16px;width:16px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:checked:before{background-color:#fff;border:4px solid #fff;box-sizing:inherit;height:12px;left:50%;margin:0;position:absolute;top:50%;transform:translate(-50%,-50%);width:12px}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:checked:before{height:8px;width:8px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:checked{background:var(--wp-admin-theme-color);border:none}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{margin:0;padding:0}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection.is-selected{background:var(--wp-admin-theme-color,#3858e9);border-color:var(--wp-admin-theme-color,#3858e9)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection.is-selected:before{background-color:#fff;border:4px solid #fff;border-radius:50%;box-sizing:inherit;content:"";height:12px;left:50%;margin:0;position:absolute;top:50%;transform:translate(-50%,-50%);width:12px}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection.is-selected:before{height:8px;width:8px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{--checkbox-size:24px;border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 transparent;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:normal;margin-right:12px;padding:6px 8px;transition:none}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{transition:box-shadow .1s linear}}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{font-size:13px;line-height:normal}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection::-moz-placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection::placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:checked{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:checked:before,.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{color:#fff;margin:-3px -5px}@media (min-width:782px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:checked:before,.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{margin:-4px 0 0 -5px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{content:"\f460";display:inline-block;float:left;font:normal 30px/1 dashicons;vertical-align:middle;width:16px;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (min-width:782px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{float:none;font-size:21px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:disabled,.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-disabled=true]{background:#f0f0f0;border-color:#ddd;cursor:default;opacity:1}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{background:#fff;color:#1e1e1e;height:var(--checkbox-size);margin:0;padding:0;position:relative;width:var(--checkbox-size)}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{--checkbox-size:16px}}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{transition:border-color .1s ease-in-out}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection.is-selected{background:var(--wp-admin-theme-color,#3858e9);border-color:var(--wp-admin-theme-color,#3858e9)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection.is-selected svg{--checkmark-size:var(--checkbox-size);fill:#fff;height:var(--checkmark-size);left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:var(--checkmark-size)}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection.is-selected svg{--checkmark-size:calc(var(--checkbox-size) + 4px)}}.dataviews-filters__search-widget-filter-combobox__wrapper{padding:8px;position:relative}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 transparent;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;line-height:normal;padding:6px 8px}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{transition:box-shadow .1s linear}}@media (min-width:600px){.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{font-size:13px;line-height:normal}}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid transparent}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-moz-placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{display:block;font-size:16px;height:32px;margin-left:0;margin-right:0;padding:0 8px 0 32px;width:100%}@media (min-width:600px){.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{font-size:13px}}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input:focus{background:#fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-moz-placeholder{color:#757575}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::placeholder{color:#757575}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-cancel-button,.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-decoration,.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-results-button,.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-results-decoration{-webkit-appearance:none}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__icon{align-items:center;bottom:0;display:flex;inset-inline-start:12px;justify-content:center;position:absolute;top:0;width:24px}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__icon:dir(ltr){transform:scaleX(-1)}.dataviews-filters__container-visibility-toggle{flex-shrink:0;position:relative}.dataviews-filters-toggle__count{background:var(--wp-admin-theme-color,#3858e9);border-radius:8px;box-sizing:border-box;color:#fff;font-size:11px;height:16px;line-height:16px;min-width:16px;outline:var(--wp-admin-border-width-focus) solid #fff;padding:0 4px;position:absolute;right:0;text-align:center;top:0;transform:translate(50%,-50%)}.dataviews-search{width:-moz-fit-content;width:fit-content}.dataviews-filters__user-input-widget{padding:16px}.dataviews-filters__user-input-widget .components-input-control__prefix{padding-left:8px}.dataviews-filters__search-widget-no-elements{align-items:center;display:flex;justify-content:center;padding:16px}.dataviews-footer{background-color:inherit;border-top:1px solid #f0f0f0;bottom:0;flex-shrink:0;left:0;padding:12px 24px;position:sticky}@media not (prefers-reduced-motion){.dataviews-footer{transition:padding .1s ease-out}}.dataviews-footer{z-index:2}@container (max-width: 560px){.dataviews-footer{flex-direction:column!important}.dataviews-footer .dataviews-bulk-actions-footer__container{width:100%}.dataviews-footer .dataviews-bulk-actions-footer__item-count{flex-grow:1}.dataviews-footer .dataviews-pagination{justify-content:space-between;width:100%}}.dataviews-pagination__page-select{font-size:11px;font-weight:499;text-transform:uppercase}@media (min-width:600px){.dataviews-pagination__page-select .components-select-control__input{font-size:11px!important;font-weight:499}}.dataviews-action-modal{z-index:1000001}.dataviews-selection-checkbox{--checkbox-input-size:24px}@media (min-width:600px){.dataviews-selection-checkbox{--checkbox-input-size:16px}}.dataviews-selection-checkbox{flex-shrink:0;line-height:0}.dataviews-selection-checkbox .components-checkbox-control__input-container{margin:0}.dataviews-view-config{container-type:inline-size;font-size:13px;line-height:1.4;width:320px}.dataviews-config__popover.is-expanded .dataviews-config__popover-content-wrapper{height:100%;overflow-y:scroll}.dataviews-config__popover.is-expanded .dataviews-config__popover-content-wrapper .dataviews-view-config{width:auto}.dataviews-view-config__sort-direction .components-toggle-group-control-option-base{text-transform:uppercase}.dataviews-settings-section__title.dataviews-settings-section__title{font-size:15px;line-height:24px}.dataviews-settings-section__sidebar{grid-column:span 4}.dataviews-settings-section__content,.dataviews-settings-section__content>*{grid-column:span 8}.dataviews-settings-section__content .is-divided-in-two{display:contents}.dataviews-settings-section__content .is-divided-in-two>*{grid-column:span 4}.dataviews-settings-section:has(.dataviews-settings-section__content:empty){display:none}@container (max-width: 500px){.dataviews-settings-section.dataviews-settings-section{grid-template-columns:repeat(2,1fr)}.dataviews-settings-section.dataviews-settings-section .dataviews-settings-section__content,.dataviews-settings-section.dataviews-settings-section .dataviews-settings-section__sidebar{grid-column:span 2}}.dataviews-view-config__label{text-wrap:nowrap}.dataviews-view-grid-items{container-type:inline-size;display:grid;gap:32px;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));grid-template-rows:max-content;margin-bottom:auto;padding:0 24px 24px}@media not (prefers-reduced-motion){.dataviews-view-grid-items{transition:padding .1s ease-out}}.dataviews-view-grid{container-type:inline-size;display:flex;flex-direction:column;gap:32px;margin-bottom:auto;padding:0 24px 24px}@media not (prefers-reduced-motion){.dataviews-view-grid{transition:padding .1s ease-out}}.dataviews-view-grid .dataviews-view-grid__row{display:grid;gap:32px}.dataviews-view-grid .dataviews-view-grid__row .dataviews-view-grid__row__gridcell{border-radius:4px;position:relative}.dataviews-view-grid .dataviews-view-grid__row .dataviews-view-grid__row__gridcell[data-focus-visible]:after{border-radius:4px;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";height:100%;left:0;outline:2px solid transparent;pointer-events:none;position:absolute;top:0;width:100%}.dataviews-view-grid .dataviews-view-grid__card{height:100%;justify-content:flex-start;position:relative}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-actions{padding:8px 0 4px}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-field{align-content:center;min-height:24px;overflow:hidden;text-align:start}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-field--clickable{width:-moz-fit-content;width:fit-content}.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{color:#1e1e1e}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__media:focus:after,.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__media:after{background-color:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__media:after{box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__media:focus:after{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.dataviews-view-grid .dataviews-view-grid__media{aspect-ratio:1/1;background-color:#fff;border-radius:4px;overflow:hidden;position:relative;width:100%}.dataviews-view-grid .dataviews-view-grid__media img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-grid .dataviews-view-grid__media:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%}.dataviews-view-grid .dataviews-view-grid__fields{font-size:12px;line-height:16px;position:relative}.dataviews-view-grid .dataviews-view-grid__fields:not(:empty){padding:0 0 12px}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field-value:not(:empty){line-height:20px;min-height:24px;padding-top:2px}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field{align-items:center;min-height:24px}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-name{color:#757575;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:35%}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:65%}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field:not(:has(.dataviews-view-grid__field-value:not(:empty))){display:none}.dataviews-view-grid .dataviews-view-grid__badge-fields:not(:empty){padding-bottom:12px}.dataviews-view-grid__field-value:empty,.dataviews-view-grid__field:empty{display:none}.dataviews-view-grid__card .dataviews-selection-checkbox{left:8px;opacity:0;position:absolute;top:-9999em;z-index:1}@media not (prefers-reduced-motion){.dataviews-view-grid__card .dataviews-selection-checkbox{transition:opacity .1s linear}}@media (hover:none){.dataviews-view-grid__card .dataviews-selection-checkbox{opacity:1;top:8px}}.dataviews-view-grid__card.is-selected .dataviews-selection-checkbox,.dataviews-view-grid__card:focus-within .dataviews-selection-checkbox,.dataviews-view-grid__card:hover .dataviews-selection-checkbox{opacity:1;top:8px}.dataviews-view-grid__card .dataviews-view-grid__media-actions{opacity:0;position:absolute;right:4px;top:4px}.dataviews-view-grid__card .dataviews-view-grid__media-actions .dataviews-all-actions-button{background-color:#fff}@media not (prefers-reduced-motion){.dataviews-view-grid__card .dataviews-view-grid__media-actions{transition:opacity .1s linear}}@media (hover:none){.dataviews-view-grid__card .dataviews-view-grid__media-actions{opacity:1;top:4px}}.dataviews-view-grid__card .dataviews-view-grid__media-actions:has(.dataviews-all-actions-button[aria-expanded=true]),.dataviews-view-grid__card:focus-within .dataviews-view-grid__media-actions,.dataviews-view-grid__card:hover .dataviews-view-grid__media-actions{opacity:1}.dataviews-view-grid__media--clickable{cursor:pointer}.dataviews-view-grid__group-header{color:#1e1e1e;container-type:inline-size;font-size:15px;font-weight:499;margin:0 0 8px;padding:0 24px}div.dataviews-view-list{list-style-type:none}.dataviews-view-list{margin:0 0 auto}.dataviews-view-list div[role=article],.dataviews-view-list div[role=row]{border-top:1px solid #f0f0f0;margin:0}.dataviews-view-list div[role=article] .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=row] .dataviews-view-list__item-wrapper{box-sizing:border-box;padding:16px 24px;position:relative}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions,.dataviews-view-list div[role=row] .dataviews-view-list__item-actions{display:flex;flex:0 0 auto;gap:4px;white-space:nowrap;width:-moz-max-content;width:max-content}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions .components-button,.dataviews-view-list div[role=row] .dataviews-view-list__item-actions .components-button{position:relative;z-index:1}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions>div,.dataviews-view-list div[role=row] .dataviews-view-list__item-actions>div{height:24px}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions>:not(:last-child),.dataviews-view-list div[role=row] .dataviews-view-list__item-actions>:not(:last-child){flex:0;overflow:hidden;width:0}.dataviews-view-list div[role=article]:where(.is-selected,.is-hovered,:focus-within) .dataviews-view-list__item-actions>:not(:last-child),.dataviews-view-list div[role=row]:where(.is-selected,.is-hovered,:focus-within) .dataviews-view-list__item-actions>:not(:last-child){flex-basis:min-content;overflow:unset;width:auto}@media (hover:none){.dataviews-view-list div[role=article] .dataviews-view-list__item-actions>:not(:last-child),.dataviews-view-list div[role=row] .dataviews-view-list__item-actions>:not(:last-child){flex-basis:min-content;overflow:unset;width:auto}}.dataviews-view-list div[role=article].is-selected.is-selected,.dataviews-view-list div[role=article].is-selected.is-selected+div[role=article],.dataviews-view-list div[role=article].is-selected.is-selected+div[role=row],.dataviews-view-list div[role=row].is-selected.is-selected,.dataviews-view-list div[role=row].is-selected.is-selected+div[role=article],.dataviews-view-list div[role=row].is-selected.is-selected+div[role=row]{border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-list div[role=article]:not(.is-selected).is-hovered,.dataviews-view-list div[role=article]:not(.is-selected):focus-within,.dataviews-view-list div[role=article]:not(.is-selected):hover,.dataviews-view-list div[role=row]:not(.is-selected).is-hovered,.dataviews-view-list div[role=row]:not(.is-selected):focus-within,.dataviews-view-list div[role=row]:not(.is-selected):hover{background-color:rgba(var(--wp-admin-theme-color--rgb),.04);border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12);color:var(--wp-admin-theme-color)}.dataviews-view-list div[role=article]:not(.is-selected).is-hovered+div[role=article],.dataviews-view-list div[role=article]:not(.is-selected).is-hovered+div[role=row],.dataviews-view-list div[role=article]:not(.is-selected):focus-within+div[role=article],.dataviews-view-list div[role=article]:not(.is-selected):focus-within+div[role=row],.dataviews-view-list div[role=article]:not(.is-selected):hover+div[role=article],.dataviews-view-list div[role=article]:not(.is-selected):hover+div[role=row],.dataviews-view-list div[role=row]:not(.is-selected).is-hovered+div[role=article],.dataviews-view-list div[role=row]:not(.is-selected).is-hovered+div[role=row],.dataviews-view-list div[role=row]:not(.is-selected):focus-within+div[role=article],.dataviews-view-list div[role=row]:not(.is-selected):focus-within+div[role=row],.dataviews-view-list div[role=row]:not(.is-selected):hover+div[role=article],.dataviews-view-list div[role=row]:not(.is-selected):hover+div[role=row]{border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-list div[role=article]:not(.is-selected).is-hovered .dataviews-title-field,.dataviews-view-list div[role=article]:not(.is-selected).is-hovered .dataviews-view-list__field,.dataviews-view-list div[role=article]:not(.is-selected):focus-within .dataviews-title-field,.dataviews-view-list div[role=article]:not(.is-selected):focus-within .dataviews-view-list__field,.dataviews-view-list div[role=article]:not(.is-selected):hover .dataviews-title-field,.dataviews-view-list div[role=article]:not(.is-selected):hover .dataviews-view-list__field,.dataviews-view-list div[role=row]:not(.is-selected).is-hovered .dataviews-title-field,.dataviews-view-list div[role=row]:not(.is-selected).is-hovered .dataviews-view-list__field,.dataviews-view-list div[role=row]:not(.is-selected):focus-within .dataviews-title-field,.dataviews-view-list div[role=row]:not(.is-selected):focus-within .dataviews-view-list__field,.dataviews-view-list div[role=row]:not(.is-selected):hover .dataviews-title-field,.dataviews-view-list div[role=row]:not(.is-selected):hover .dataviews-view-list__field{color:var(--wp-admin-theme-color)}.dataviews-view-list div[role=article].is-selected .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=article].is-selected:focus-within .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=row].is-selected .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=row].is-selected:focus-within .dataviews-view-list__item-wrapper{background-color:rgba(var(--wp-admin-theme-color--rgb),.08);color:#1e1e1e}.dataviews-view-list div[role=article].is-selected .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=article].is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__field,.dataviews-view-list div[role=article].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=article].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__field,.dataviews-view-list div[role=row].is-selected .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=row].is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__field,.dataviews-view-list div[role=row].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=row].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__field{color:#1e1e1e}.dataviews-view-list .dataviews-view-list__item{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:none;cursor:pointer;inset:0;padding:0;position:absolute;scroll-margin:8px 0;z-index:1}.dataviews-view-list .dataviews-view-list__item:focus-visible{outline:none}.dataviews-view-list .dataviews-view-list__item:focus-visible:before{border-radius:2px;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";inset:var(--wp-admin-border-width-focus);outline:2px solid transparent;position:absolute}.dataviews-view-list .dataviews-view-list__title-field{flex:1;line-height:24px;min-height:24px;overflow:hidden}.dataviews-view-list .dataviews-view-list__title-field:has(a,button){z-index:1}.dataviews-view-list .dataviews-view-list__media-wrapper{background-color:#fff;border-radius:4px;flex-shrink:0;height:52px;overflow:hidden;position:relative;width:52px}.dataviews-view-list .dataviews-view-list__media-wrapper img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-list .dataviews-view-list__media-wrapper:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;left:0;position:absolute;top:0;width:100%}.dataviews-view-list .dataviews-view-list__field-wrapper{flex-grow:1;min-height:52px}.dataviews-view-list .dataviews-view-list__field{color:#757575}.dataviews-view-list .dataviews-view-list__fields{display:flex;flex-wrap:wrap;font-size:12px;gap:12px;row-gap:4px}.dataviews-view-list .dataviews-view-list__fields:empty{display:none}.dataviews-view-list .dataviews-view-list__fields .dataviews-view-list__field:has(.dataviews-view-list__field-value:empty){display:none}.dataviews-view-list .dataviews-view-list__fields .dataviews-view-list__field-value{align-items:center;display:flex;line-height:20px;min-height:24px}.dataviews-view-list+.dataviews-pagination{justify-content:space-between}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__item-wrapper{padding:8px 24px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__title-field{line-height:16px;min-height:16px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__media-wrapper{height:32px;width:32px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__field-wrapper{min-height:32px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__fields{gap:8px;row-gap:4px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__fields .dataviews-view-list__field-value{line-height:16px;min-height:16px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__item-wrapper{padding:24px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__title-field{line-height:32px;min-height:32px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__media-wrapper{height:64px;width:64px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__field-wrapper{min-height:64px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__fields{gap:16px;row-gap:8px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__fields .dataviews-view-list__field-value{line-height:24px;min-height:32px}.dataviews-view-list__group-header{color:#1e1e1e;font-size:15px;font-weight:499;margin:0 0 8px;padding:0 24px}.dataviews-view-table{background-color:inherit;border-collapse:collapse;border-color:inherit;color:#757575;margin-bottom:auto;position:relative;text-indent:0;width:100%}.dataviews-view-table th{color:#1e1e1e;font-size:13px;font-weight:400;text-align:left}.dataviews-view-table td,.dataviews-view-table th{padding:12px}.dataviews-view-table td.dataviews-view-table__actions-column,.dataviews-view-table th.dataviews-view-table__actions-column{text-align:right}.dataviews-view-table td.dataviews-view-table__actions-column--sticky,.dataviews-view-table th.dataviews-view-table__actions-column--sticky{background-color:var(--wp-dataviews-color-background,#fff);position:sticky;right:0}.dataviews-view-table td.dataviews-view-table__actions-column--stuck:after,.dataviews-view-table th.dataviews-view-table__actions-column--stuck:after{background-color:#f0f0f0;bottom:0;content:"";display:block;left:0;position:absolute;top:0;width:1px}.dataviews-view-table td.dataviews-view-table__checkbox-column,.dataviews-view-table th.dataviews-view-table__checkbox-column{padding-right:0}.dataviews-view-table td.dataviews-view-table__checkbox-column .dataviews-view-table__cell-content-wrapper,.dataviews-view-table th.dataviews-view-table__checkbox-column .dataviews-view-table__cell-content-wrapper{max-width:auto;min-width:auto}.dataviews-view-table tr{background-color:inherit;border-top:1px solid #f0f0f0}.dataviews-view-table tr td:first-child,.dataviews-view-table tr th:first-child{padding-left:24px}.dataviews-view-table tr td:last-child,.dataviews-view-table tr th:last-child{padding-right:24px}.dataviews-view-table tr:last-child{border-bottom:0}.dataviews-view-table tr .dataviews-item-actions .components-button:not(.dataviews-all-actions-button){opacity:0}@media (hover:none){.dataviews-view-table tr .dataviews-item-actions .components-button:not(.dataviews-all-actions-button){opacity:1}}.dataviews-view-table tr.is-selected{background-color:color-mix(in srgb,rgb(var(--wp-admin-theme-color--rgb)) 4%,#fff);color:#757575}.dataviews-view-table tr.is-selected,.dataviews-view-table tr.is-selected+tr{border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-table tr.is-selected .dataviews-view-table__actions-column--sticky{background-color:color-mix(in srgb,rgb(var(--wp-admin-theme-color--rgb)) 4%,#fff)}.dataviews-view-table tr.is-hovered .dataviews-item-actions .components-button:not(.dataviews-all-actions-button),.dataviews-view-table tr:focus-within .dataviews-item-actions .components-button:not(.dataviews-all-actions-button),.dataviews-view-table tr:hover .dataviews-item-actions .components-button:not(.dataviews-all-actions-button){opacity:1}.dataviews-view-table.has-bulk-actions tr:focus-within .dataviews-view-table__actions-column--sticky,.dataviews-view-table.has-bulk-actions tr:hover .dataviews-view-table__actions-column--sticky{background-color:var(--wp-dataviews-color-background,#fff)}.dataviews-view-table.has-bulk-actions tr.is-selected .dataviews-view-table__actions-column--sticky,.dataviews-view-table.has-bulk-actions tr.is-selected:hover .dataviews-view-table__actions-column--sticky{background-color:color-mix(in srgb,rgb(var(--wp-admin-theme-color--rgb)) 4%,#fff)}.dataviews-view-table thead{background-color:inherit;inset-block-start:0;position:sticky;z-index:1}.dataviews-view-table thead tr{border:0}.dataviews-view-table thead th{background-color:inherit;font-size:11px;font-weight:499;padding-bottom:8px;padding-top:8px;text-transform:uppercase}.dataviews-view-table thead th:has(.dataviews-view-table-header-button){padding-left:4px;padding-right:4px}.dataviews-view-table thead th:has(.dataviews-view-table-header-button) .dataviews-view-table-header-button{gap:4px}.dataviews-view-table thead th:has(.dataviews-view-table-header-button):first-child{padding-left:40px}.dataviews-view-table thead th:has(.dataviews-view-table-header-button):last-child{padding-right:40px}.dataviews-view-table tbody td{vertical-align:top}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper{align-items:center;display:flex;min-height:32px;white-space:nowrap}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper.dataviews-view-table__cell-align-end{justify-content:flex-end}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper.dataviews-view-table__cell-align-center{justify-content:center}.dataviews-view-table tbody .components-v-stack>.dataviews-view-table__cell-content-wrapper:not(:first-child){min-height:0}.dataviews-view-table .dataviews-view-table-header-button{font-size:11px;font-weight:499;padding:4px 8px;text-transform:uppercase}.dataviews-view-table .dataviews-view-table-header-button:not(:hover){color:#1e1e1e}.dataviews-view-table .dataviews-view-table-header-button span{speak:none}.dataviews-view-table .dataviews-view-table-header-button span:empty{display:none}.dataviews-view-table .dataviews-view-table-header{padding-left:4px}.dataviews-view-table .dataviews-view-table__actions-column{white-space:nowrap;width:auto}.dataviews-view-table.has-compact-density thead th:has(.dataviews-view-table-header-button):not(:first-child){padding-left:0}.dataviews-view-table.has-compact-density thead th:has(.dataviews-view-table-header-button):not(:last-child){padding-right:0}.dataviews-view-table.has-compact-density td,.dataviews-view-table.has-compact-density th{padding:4px 8px}.dataviews-view-table.has-comfortable-density td,.dataviews-view-table.has-comfortable-density th{padding:16px 12px}.dataviews-view-table.has-comfortable-density td.dataviews-view-table__checkbox-column,.dataviews-view-table.has-comfortable-density th.dataviews-view-table__checkbox-column,.dataviews-view-table.has-compact-density td.dataviews-view-table__checkbox-column,.dataviews-view-table.has-compact-density th.dataviews-view-table__checkbox-column{padding-right:0}.dataviews-view-table-selection-checkbox{--checkbox-input-size:24px}@media (min-width:600px){.dataviews-view-table-selection-checkbox{--checkbox-input-size:16px}}.dataviews-column-primary__media{background-color:#fff;border-radius:4px;flex-shrink:0;max-width:60px;min-height:32px;min-width:32px;overflow:hidden;position:relative}.dataviews-column-primary__media img{height:32px;-o-object-fit:cover;object-fit:cover;width:32px}.dataviews-column-primary__media:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;left:0;position:absolute;top:0;width:100%}.dataviews-view-table__cell-content-wrapper:not(.dataviews-column-primary__media),.dataviews-view-table__primary-column-content:not(.dataviews-column-primary__media){max-width:80ch;min-width:15ch}.dataviews-view-table__group-header-row .dataviews-view-table__group-header-cell{color:#1e1e1e;font-weight:499;padding:12px 24px}.dataviews-view-table col[class^=dataviews-view-table__col-]:not(.dataviews-view-table__col-first-data){width:1%}.dataviews-view-picker-grid .dataviews-view-picker-grid__card{height:100%;justify-content:flex-start;position:relative}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__title-actions{padding:8px 0 4px}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__title-field{align-content:center;min-height:24px;overflow:hidden;text-align:start}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__title-field--clickable{width:-moz-fit-content;width:fit-content}.dataviews-view-picker-grid .dataviews-view-picker-grid__card.is-selected .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field .dataviews-view-picker-grid__field-value{color:#1e1e1e}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__media:focus:after,.dataviews-view-picker-grid .dataviews-view-picker-grid__card.is-selected .dataviews-view-picker-grid__media:after{background-color:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-view-picker-grid .dataviews-view-picker-grid__card.is-selected .dataviews-view-picker-grid__media:after{box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__media:focus:after{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.dataviews-view-picker-grid:focus-visible[aria-activedescendant]{outline:none}.dataviews-view-picker-grid:focus-visible [data-active-item=true]{outline:2px solid var(--wp-admin-theme-color)}.dataviews-view-picker-grid .dataviews-selection-checkbox{top:8px!important}.dataviews-view-picker-grid .dataviews-selection-checkbox input{pointer-events:none}.dataviews-view-picker-grid .dataviews-view-picker-grid__media{aspect-ratio:1/1;background-color:#fff;border-radius:4px;min-height:0;position:relative;width:100%}.dataviews-view-picker-grid .dataviews-view-picker-grid__media img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-picker-grid .dataviews-view-picker-grid__media:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields{font-size:12px;line-height:16px;position:relative}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields:not(:empty){padding:0 0 12px}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field-value:not(:empty){line-height:20px;min-height:24px;padding-top:2px}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field{align-items:center;min-height:24px}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field .dataviews-view-picker-grid__field-name{color:#757575;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:35%}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field .dataviews-view-picker-grid__field-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:65%}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field:not(:has(.dataviews-view-picker-grid__field-value:not(:empty))){display:none}.dataviews-view-picker-grid .dataviews-view-picker-grid__badge-fields:not(:empty){padding-bottom:12px}.dataviews-view-picker-grid__field-value:empty,.dataviews-view-picker-grid__field:empty{display:none}.dataviews-view-picker-grid__card .dataviews-selection-checkbox{left:8px;position:absolute;top:-9999em;z-index:1}@media (hover:none){.dataviews-view-picker-grid__card .dataviews-selection-checkbox{top:8px}}.dataviews-view-picker-grid__card.is-selected .dataviews-selection-checkbox,.dataviews-view-picker-grid__card:focus-within .dataviews-selection-checkbox,.dataviews-view-picker-grid__card:hover .dataviews-selection-checkbox{top:8px}.dataviews-view-picker-grid__media--clickable{cursor:pointer}.dataviews-view-picker-grid-group__header{color:#1e1e1e;font-size:15px;font-weight:499;margin:0 0 8px;padding:0 48px}.dataviews-view-picker-table{background-color:inherit}.dataviews-view-picker-table .dataviews-view-table__checkbox-column{width:48px}.dataviews-view-picker-table tbody:focus-visible[aria-activedescendant]{outline:none}.dataviews-view-picker-table tbody:focus-visible [data-active-item=true]{outline:2px solid var(--wp-admin-theme-color)}.dataviews-view-picker-table .dataviews-selection-checkbox .components-checkbox-control__input.components-checkbox-control__input{opacity:1;pointer-events:none}.dataviews-view-picker-table .dataviews-view-table__row{cursor:pointer}.dataviews-view-picker-table .dataviews-view-table__row.is-selected{background-color:rgba(var(--wp-admin-theme-color--rgb),.04)}.dataviews-view-picker-table .dataviews-view-table__row.is-hovered{background-color:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-view-picker-table .dataviews-view-table__row.is-selected.is-hovered{background-color:rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-activity{margin:0 0 auto;padding:8px 24px}.dataviews-view-activity .dataviews-view-activity__group-header{color:#949494;font-size:15px;font-weight:499;margin:0 0 8px;padding:0}.dataviews-view-activity .dataviews-view-activity__item-actions{min-width:24px}.dataviews-view-activity .dataviews-view-activity__item-content{flex-grow:1}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-description,.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields,.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title{min-height:16px}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title{align-items:center;display:flex;flex:1;overflow:hidden;position:relative}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title--clickable{cursor:pointer}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title--clickable:focus-visible{border-radius:2px;outline:var(--wp-admin-border-width-focus) solid var(--wp-admin-theme-color);outline-offset:var(--wp-admin-border-width-focus)}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__primary-actions{display:flex;flex:0 0 auto;width:-moz-max-content;width:max-content}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__primary-actions .components-button{position:relative;z-index:1}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields{color:#757575;display:flex;flex-wrap:wrap;gap:12px;row-gap:4px}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields:empty{display:none}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields .dataviews-view-activity__item-field:has(.dataviews-view-activity__item-field-value:empty){display:none}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields .dataviews-view-activity__item-field-value{align-items:center;display:flex}.dataviews-view-activity .dataviews-view-activity__item-type{align-self:stretch;flex-shrink:0}.dataviews-view-activity .dataviews-view-activity__item-type:after{background-color:#ddd;content:"";flex:1 1 auto;margin:0 auto;width:1px}.dataviews-view-activity .dataviews-view-activity__item-type:before{background-color:#ddd;content:"";flex:0 0 auto;margin:0 auto;width:1px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-type{width:8px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-type:before{height:12px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-type-icon{height:11px;width:11px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-content{margin:12px 0}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-type{width:24px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-type:before{height:12px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-type-icon{height:25px;width:25px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-content{margin:12px 0;padding-top:8px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-type{width:32px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-type:before{height:8px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-type-icon{height:33px;width:33px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-content{margin:8px 0 16px;padding-top:12px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-bullet,.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-bullet{height:9px;position:relative;top:50%;transform:translateY(-50%);width:9px}.dataviews-view-activity .dataviews-view-activity__item:first-child .dataviews-view-activity__item-type:before{visibility:hidden}.dataviews-view-activity .dataviews-view-activity__group:last-of-type>.dataviews-view-activity__item:last-of-type .dataviews-view-activity__item-type:after,.dataviews-view-activity>.dataviews-view-activity__item:last-child .dataviews-view-activity__item-type:after{background:linear-gradient(180deg,#ddd 0,hsla(0,0%,87%,.2) 60%,hsla(0,0%,87%,0))}.dataviews-view-activity .dataviews-view-activity__item-type-icon{background-color:#fff;flex-shrink:0;overflow:hidden}.dataviews-view-activity .dataviews-view-activity__item-type-icon .dataviews-view-activity__item-bullet,.dataviews-view-activity .dataviews-view-activity__item-type-icon img,.dataviews-view-activity .dataviews-view-activity__item-type-icon svg{border-radius:50%;box-shadow:inset 0 0 0 1px #ddd;box-sizing:border-box;display:block;height:100%;margin:0 auto;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-activity .dataviews-view-activity__item-type-icon svg{padding:4px}.dataviews-view-activity .dataviews-view-activity__item-type-icon .dataviews-view-activity__item-bullet{background-color:#ddd;content:""}.dataviews-view-activity+.dataviews-pagination{justify-content:space-between}.dataviews-picker-footer__bulk-selection{align-self:flex-start;height:32px}.dataviews-picker-footer__actions{align-self:flex-end}.dataviews-controls__datetime{border:none;padding:0}.dataviews-controls__relative-date-number,.dataviews-controls__relative-date-unit{flex:1 1 50%}.dataviews-controls__date input[type=date]::-webkit-calendar-picker-indicator,.dataviews-controls__date input[type=date]::-webkit-inner-spin-button{-webkit-appearance:none;display:none}.dataviews-controls__date-range-inputs>*{min-width:0}.dataviews-controls__date-preset{border:1px solid #ddd}.dataviews-controls__date-preset:active{background-color:#000}.dataforms-layouts-panel__field{align-items:flex-start!important;justify-content:flex-start!important;min-height:32px;width:100%}.dataforms-layouts-panel__field--label-position-none{align-items:center!important}.dataforms-layouts-panel__field-label{align-items:center;display:flex;flex-shrink:0;hyphens:auto;line-height:20px;min-height:32px;width:38%}.dataforms-layouts-panel__field-label--label-position-side{align-self:center}.dataforms-layouts-panel__field-label.has-error{color:#cc1818}.dataforms-layouts-panel__field-label-error-content{cursor:help;fill:#cc1818}.dataforms-layouts-panel__field-label-error-content svg{fill:currentColor}.dataforms-layouts-panel__field-control{align-items:center;display:flex;flex-grow:1;min-height:32px}.dataforms-layouts-panel__field-control .components-button{max-width:100%;min-height:32px;text-align:left;text-wrap:balance;text-wrap:pretty;white-space:normal}.dataforms-layouts-panel__field-control.components-button.is-link[aria-disabled=true]{text-decoration:none}.dataforms-layouts-panel__field-control .components-dropdown{max-width:100%}.dataforms-layouts-panel__field-dropdown .components-popover__content{min-width:320px;padding:16px}.dataforms-layouts-panel__dropdown-header{margin-bottom:16px}.dataforms-layouts-panel__modal-footer{margin-top:16px}.components-popover.components-dropdown__content.dataforms-layouts-panel__field-dropdown{z-index:159990}.dataforms-layouts-panel__summary-button:empty{min-width:160px}.dataforms-layouts-regular__field{align-items:flex-start!important;justify-content:flex-start!important;min-height:32px;width:100%}.dataforms-layouts-regular__field-label{align-items:center;display:flex;flex-shrink:0;hyphens:auto;line-height:20px;min-height:32px;width:38%}.dataforms-layouts-regular__field-label--label-position-side{align-self:center}.dataforms-layouts-regular__field-control{align-items:center;display:flex;flex-grow:1;min-height:32px}.dataforms-layouts-card__field-header-label{font-family:-apple-system,"system-ui",Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:15px;font-weight:499;line-height:20px}.dataforms-layouts-card__field{width:100%}.dataforms-layouts-card__field-description{color:#757575;display:block;font-size:13px;margin-bottom:16px}.dataforms-layouts-card__field-summary{display:flex;flex-direction:row;gap:16px}.dataforms-layouts-details__content{padding-top:12px}.dataforms-layouts-row__field-control{width:100%}.dataforms-layouts__wrapper{font-family:-apple-system,"system-ui",Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:400;line-height:20px}.clawpress-settings__actions{align-items:center;display:flex;gap:8px;margin-top:16px}.clawpress-settings__model-description,.clawpress-settings__model-meta{color:#50575e}.clawpress-abilities__header{align-items:baseline;display:flex;gap:12px;justify-content:space-between}.clawpress-abilities__header h3{font-size:24px;line-height:1.2;margin:0}.clawpress-abilities__header p{color:#50575e;margin:0}.clawpress-abilities__toolbar{align-items:flex-end;display:flex;gap:12px;justify-content:space-between;margin-bottom:20px}.clawpress-abilities__toolbar .components-base-control{margin-bottom:0;min-width:220px}.clawpress-abilities__actions{display:flex;gap:8px}.clawpress-abilities__grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(320px,1fr))}.clawpress-abilities__item{background:linear-gradient(180deg,#fff,#f6f7f7);border:1px solid #dcdcde;border-radius:10px;display:flex;flex-direction:column;gap:10px;padding:14px}.clawpress-abilities__item-header{align-items:flex-start;display:flex;gap:12px;justify-content:space-between}.clawpress-abilities__item h4{margin:0}.clawpress-abilities__item .components-base-control{margin-bottom:0}.clawpress-abilities__description{color:#1d2327;margin:0}.clawpress-abilities__annotations{display:flex;flex-wrap:wrap;gap:6px;min-height:24px}.clawpress-abilities__annotation{align-items:center;border-radius:999px;display:inline-flex;font-size:11px;font-weight:600;line-height:1.4;padding:3px 8px}.clawpress-abilities__annotation.is-readonly{background:#d6f5e3;color:#0f5132}.clawpress-abilities__annotation.is-destructive{background:#fbe6e8;color:#8a2424}.clawpress-abilities__meta{color:#50575e;font-size:12px;margin:0}.clawpress-abilities__warning{color:#b32d2e;font-size:12px;margin:0}.clawpress-abilities__empty{color:#50575e;margin:0}@media(max-width:782px){.clawpress-abilities__toolbar{align-items:stretch;flex-direction:column}.clawpress-abilities__actions{justify-content:flex-start}} +:root{--wpds-border-radius-lg:8px;--wpds-border-radius-md:4px;--wpds-border-radius-sm:2px;--wpds-border-radius-xs:1px;--wpds-border-width-focus:2px;--wpds-border-width-lg:8px;--wpds-border-width-md:4px;--wpds-border-width-sm:2px;--wpds-border-width-xs:1px;--wpds-color-bg-interactive-brand-strong:#3858e9;--wpds-color-bg-interactive-brand-strong-active:#2e49d9;--wpds-color-bg-interactive-brand-weak:#00000000;--wpds-color-bg-interactive-brand-weak-active:#e6eaf4;--wpds-color-bg-interactive-error:#00000000;--wpds-color-bg-interactive-error-active:#fff6f4;--wpds-color-bg-interactive-error-strong:#cc1818;--wpds-color-bg-interactive-error-strong-active:#b90000;--wpds-color-bg-interactive-error-weak:#00000000;--wpds-color-bg-interactive-error-weak-active:#f6e6e3;--wpds-color-bg-interactive-neutral-strong:#2d2d2d;--wpds-color-bg-interactive-neutral-strong-active:#1e1e1e;--wpds-color-bg-interactive-neutral-strong-disabled:#e2e2e2;--wpds-color-bg-interactive-neutral-weak:#00000000;--wpds-color-bg-interactive-neutral-weak-active:#eaeaea;--wpds-color-bg-interactive-neutral-weak-disabled:#00000000;--wpds-color-bg-surface-brand:#ecf0f9;--wpds-color-bg-surface-caution:#fee994;--wpds-color-bg-surface-caution-weak:#fff9c9;--wpds-color-bg-surface-error:#f6e6e3;--wpds-color-bg-surface-error-weak:#fff6f4;--wpds-color-bg-surface-info:#deebfa;--wpds-color-bg-surface-info-weak:#f2f9ff;--wpds-color-bg-surface-neutral:#f8f8f8;--wpds-color-bg-surface-neutral-strong:#fff;--wpds-color-bg-surface-neutral-weak:#f0f0f0;--wpds-color-bg-surface-success:#c5f7cc;--wpds-color-bg-surface-success-weak:#eaffed;--wpds-color-bg-surface-warning:#fde6bd;--wpds-color-bg-surface-warning-weak:#fff7e0;--wpds-color-bg-thumb-brand:#3858e9;--wpds-color-bg-thumb-brand-active:#3858e9;--wpds-color-bg-thumb-neutral-disabled:#d8d8d8;--wpds-color-bg-thumb-neutral-weak:#8a8a8a;--wpds-color-bg-thumb-neutral-weak-active:#6c6c6c;--wpds-color-bg-track-neutral:#d8d8d8;--wpds-color-bg-track-neutral-weak:#e0e0e0;--wpds-color-fg-content-caution:#281d00;--wpds-color-fg-content-caution-weak:#826a00;--wpds-color-fg-content-error:#470000;--wpds-color-fg-content-error-weak:#cc1818;--wpds-color-fg-content-info:#001b4f;--wpds-color-fg-content-info-weak:#006bd7;--wpds-color-fg-content-neutral:#1e1e1e;--wpds-color-fg-content-neutral-weak:#6d6d6d;--wpds-color-fg-content-success:#002900;--wpds-color-fg-content-success-weak:#007f30;--wpds-color-fg-content-warning:#2e1900;--wpds-color-fg-content-warning-weak:#926300;--wpds-color-fg-interactive-brand:#3858e9;--wpds-color-fg-interactive-brand-active:#3858e9;--wpds-color-fg-interactive-brand-strong:#eff0f2;--wpds-color-fg-interactive-brand-strong-active:#eff0f2;--wpds-color-fg-interactive-error:#cc1818;--wpds-color-fg-interactive-error-active:#cc1818;--wpds-color-fg-interactive-error-strong:#f2efef;--wpds-color-fg-interactive-error-strong-active:#f2efef;--wpds-color-fg-interactive-neutral:#1e1e1e;--wpds-color-fg-interactive-neutral-active:#1e1e1e;--wpds-color-fg-interactive-neutral-disabled:#8a8a8a;--wpds-color-fg-interactive-neutral-strong:#f0f0f0;--wpds-color-fg-interactive-neutral-strong-active:#f0f0f0;--wpds-color-fg-interactive-neutral-strong-disabled:#8a8a8a;--wpds-color-fg-interactive-neutral-weak:#6d6d6d;--wpds-color-fg-interactive-neutral-weak-disabled:#8a8a8a;--wpds-color-stroke-focus-brand:#3858e9;--wpds-color-stroke-interactive-brand:#3858e9;--wpds-color-stroke-interactive-brand-active:#2337c8;--wpds-color-stroke-interactive-error:#cc1818;--wpds-color-stroke-interactive-error-active:#9d0000;--wpds-color-stroke-interactive-error-strong:#cc1818;--wpds-color-stroke-interactive-neutral:#8a8a8a;--wpds-color-stroke-interactive-neutral-active:#6c6c6c;--wpds-color-stroke-interactive-neutral-disabled:#d8d8d8;--wpds-color-stroke-interactive-neutral-strong:#6c6c6c;--wpds-color-stroke-surface-brand:#a3b1d4;--wpds-color-stroke-surface-brand-strong:#3858e9;--wpds-color-stroke-surface-error:#daa39b;--wpds-color-stroke-surface-error-strong:#cc1818;--wpds-color-stroke-surface-info:#9fbcdc;--wpds-color-stroke-surface-info-strong:#006bd7;--wpds-color-stroke-surface-neutral:#d8d8d8;--wpds-color-stroke-surface-neutral-strong:#8a8a8a;--wpds-color-stroke-surface-neutral-weak:#e0e0e0;--wpds-color-stroke-surface-success:#8ac894;--wpds-color-stroke-surface-success-strong:#007f30;--wpds-color-stroke-surface-warning:#d0b381;--wpds-color-stroke-surface-warning-strong:#926300;--wpds-dimension-base:4px;--wpds-dimension-gap-2xs:4px;--wpds-dimension-gap-lg:24px;--wpds-dimension-gap-md:16px;--wpds-dimension-gap-sm:12px;--wpds-dimension-gap-xl:40px;--wpds-dimension-gap-xs:8px;--wpds-dimension-padding-surface-2xs:4px;--wpds-dimension-padding-surface-lg:32px;--wpds-dimension-padding-surface-md:24px;--wpds-dimension-padding-surface-sm:16px;--wpds-dimension-padding-surface-xs:8px;--wpds-elevation-large:0 5px 15px 0 #00000014,0 15px 27px 0 #00000012,0 30px 36px 0 #0000000a,0 50px 43px 0 #00000005;--wpds-elevation-medium:0 2px 3px 0 #0000000d,0 4px 5px 0 #0000000a,0 12px 12px 0 #00000008,0 16px 16px 0 #00000005;--wpds-elevation-small:0 1px 2px 0 #0000000d,0 2px 3px 0 #0000000a,0 6px 6px 0 #00000008,0 8px 8px 0 #00000005;--wpds-elevation-x-small:0 1px 1px 0 #00000008,0 1px 2px 0 #00000005,0 3px 3px 0 #00000005,0 4px 4px 0 #00000003;--wpds-font-family-body:-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif;--wpds-font-family-heading:-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif;--wpds-font-family-mono:"Menlo","Consolas",monaco,monospace;--wpds-font-line-height-2xl:40px;--wpds-font-line-height-lg:28px;--wpds-font-line-height-md:24px;--wpds-font-line-height-sm:20px;--wpds-font-line-height-xl:32px;--wpds-font-line-height-xs:16px;--wpds-font-size-2xl:32px;--wpds-font-size-lg:15px;--wpds-font-size-md:13px;--wpds-font-size-sm:12px;--wpds-font-size-xl:20px;--wpds-font-size-xs:11px;--wpds-font-weight-medium:499;--wpds-font-weight-regular:400}[data-wpds-theme-provider-id][data-wpds-density=default]{--wpds-dimension-base:4px;--wpds-dimension-gap-2xs:4px;--wpds-dimension-gap-lg:24px;--wpds-dimension-gap-md:16px;--wpds-dimension-gap-sm:12px;--wpds-dimension-gap-xl:40px;--wpds-dimension-gap-xs:8px;--wpds-dimension-padding-surface-2xs:4px;--wpds-dimension-padding-surface-lg:32px;--wpds-dimension-padding-surface-md:24px;--wpds-dimension-padding-surface-sm:16px;--wpds-dimension-padding-surface-xs:8px}[data-wpds-theme-provider-id][data-wpds-density=compact]{--wpds-dimension-gap-2xs:4px;--wpds-dimension-gap-lg:20px;--wpds-dimension-gap-md:12px;--wpds-dimension-gap-sm:8px;--wpds-dimension-gap-xl:32px;--wpds-dimension-gap-xs:4px;--wpds-dimension-padding-surface-2xs:4px;--wpds-dimension-padding-surface-lg:24px;--wpds-dimension-padding-surface-md:20px;--wpds-dimension-padding-surface-sm:12px;--wpds-dimension-padding-surface-xs:4px}[data-wpds-theme-provider-id][data-wpds-density=comfortable]{--wpds-dimension-gap-2xs:8px;--wpds-dimension-gap-lg:32px;--wpds-dimension-gap-md:20px;--wpds-dimension-gap-sm:16px;--wpds-dimension-gap-xl:48px;--wpds-dimension-gap-xs:12px;--wpds-dimension-padding-surface-2xs:8px;--wpds-dimension-padding-surface-lg:40px;--wpds-dimension-padding-surface-md:32px;--wpds-dimension-padding-surface-sm:20px;--wpds-dimension-padding-surface-xs:12px}@media (min-resolution:192dpi){:root{--wpds-border-width-focus:1.5px}}.dataviews-picker-wrapper,.dataviews-wrapper{background-color:var(--wp-dataviews-color-background,#fff);box-sizing:border-box;container:dataviews-wrapper/inline-size;display:flex;flex-direction:column;font-size:13px;height:100%;line-height:1.4;overflow:auto;scroll-padding-bottom:64px}.dataviews-filters__container,.dataviews__view-actions{background-color:inherit;box-sizing:border-box;flex-shrink:0;left:0;padding:16px 24px;position:sticky}@media not (prefers-reduced-motion){.dataviews-filters__container,.dataviews__view-actions{transition:padding .1s ease-out}}.dataviews-loading,.dataviews-no-results{align-items:center;display:flex;flex-grow:1;justify-content:center;padding:0 24px}@media not (prefers-reduced-motion){.dataviews-loading,.dataviews-no-results{transition:padding .1s ease-out}}.dataviews-loading-more{text-align:center}@container (max-width: 430px){.dataviews-filters__container,.dataviews__view-actions{padding:12px 24px}}.dataviews-title-field{font-size:13px;font-weight:499;width:100%}.dataviews-title-field,.dataviews-title-field a{color:#2f2f2f;text-overflow:ellipsis;white-space:nowrap}.dataviews-title-field a{display:block;flex-grow:0;overflow:hidden;text-decoration:none}.dataviews-title-field a:hover{color:var(--wp-admin-theme-color)}.dataviews-title-field a:focus{border-radius:2px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color,#007cba);color:var(--wp-admin-theme-color--rgb)}.dataviews-title-field button.components-button.is-link{color:#1e1e1e;display:block;font-weight:inherit;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;width:100%}.dataviews-title-field button.components-button.is-link:hover{color:var(--wp-admin-theme-color)}.dataviews-title-field--clickable{color:#2f2f2f;cursor:pointer}.dataviews-title-field--clickable:hover{color:var(--wp-admin-theme-color)}.dataviews-title-field--clickable:focus{border-radius:2px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color,#007cba);color:var(--wp-admin-theme-color--rgb)}.components-card__body:has(>.dataviews-picker-wrapper),.components-card__body:has(>.dataviews-wrapper){overflow:hidden;padding:8px 0 0}.dataviews-bulk-actions-footer__item-count{color:#1e1e1e}.dataviews-bulk-actions-footer__container{margin-right:auto;min-height:32px}.dataviews-filters__button{position:relative}.dataviews-filters__container{padding-top:0}.dataviews-filters__reset-button.dataviews-filters__reset-button[aria-disabled=true],.dataviews-filters__reset-button.dataviews-filters__reset-button[aria-disabled=true]:hover{opacity:0}.dataviews-filters__reset-button.dataviews-filters__reset-button[aria-disabled=true]:focus{opacity:1}.dataviews-filters__summary-popover{font-size:13px;line-height:1.4}.dataviews-filters__summary-popover .components-popover__content{border-radius:4px;max-width:250px;min-width:230px;width:100%}.dataviews-filters__summary-popover.components-dropdown__content .components-popover__content{padding:0}.dataviews-filters__summary-operators-container{padding:8px 16px}.dataviews-filters__summary-operators-container:has(+.dataviews-filters__search-widget-listbox),.dataviews-filters__summary-operators-container:has(+.dataviews-filters__search-widget-no-elements),.dataviews-filters__summary-operators-container:has(+.dataviews-filters__user-input-widget){border-bottom:1px solid #e0e0e0}.dataviews-filters__summary-operators-container:empty{display:none}.dataviews-filters__summary-operators-container .dataviews-filters__summary-operators-filter-name{color:#757575;flex-shrink:0;max-width:calc(100% - 55px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dataviews-filters__summary-operators-container .dataviews-filters__summary-operators-filter-select{overflow:hidden;white-space:nowrap;width:100%}.dataviews-filters__summary-chip-container{position:relative;white-space:pre-wrap}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip{align-items:center;background:#f0f0f0;border:1px solid transparent;border-radius:16px;box-sizing:border-box;color:#2f2f2f;cursor:pointer;display:flex;min-height:32px;padding:4px 12px;position:relative}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.is-not-clickable{cursor:default}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-reset{padding-inline-end:28px}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip:focus-visible,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip:hover:not(.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.is-not-clickable),.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip[aria-expanded=true]{background:#e0e0e0;color:#1e1e1e}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-values{background:rgba(var(--wp-admin-theme-color--rgb),.04);color:var(--wp-admin-theme-color)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-values:hover,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip.has-values[aria-expanded=true]{background:rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:none}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip .dataviews-filters-__summary-filter-text-name{font-weight:499}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove{align-items:center;background:transparent;border:0;border-radius:50%;cursor:pointer;display:flex;height:24px;justify-content:center;padding:0;position:absolute;right:4px;top:50%;transform:translateY(-50%);width:24px}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove svg{fill:#757575}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:focus,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:hover{background:#e0e0e0}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:focus svg,.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:hover svg{fill:#1e1e1e}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove.has-values svg{fill:var(--wp-admin-theme-color)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove.has-values:hover{background:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-filters__summary-chip-container .dataviews-filters__summary-chip-remove:focus-visible{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:none}.dataviews-filters__search-widget-filter-combobox-list{border-top:1px solid #e0e0e0;max-height:184px;overflow:auto;padding:4px}.dataviews-filters__search-widget-filter-combobox-list .dataviews-filters__search-widget-filter-combobox-item-value [data-user-value]{font-weight:600}.dataviews-filters__search-widget-listbox{overflow:auto;padding:4px}.dataviews-filters__search-widget-listitem{align-items:center;border-radius:2px;box-sizing:border-box;cursor:default;display:flex;font-family:-apple-system,"system-ui",Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:400;gap:8px;line-height:20px;min-height:32px;padding:4px 12px}.dataviews-filters__search-widget-listitem:last-child{margin-block-end:0}.dataviews-filters__search-widget-listitem:focus,.dataviews-filters__search-widget-listitem:hover,.dataviews-filters__search-widget-listitem[data-active-item]{background-color:var(--wp-admin-theme-color);color:#fff}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-description,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-description,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-description{color:#fff}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-single-selection,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-single-selection,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-single-selection{background:#fff;border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-single-selection.is-selected,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-single-selection.is-selected,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-single-selection.is-selected{background:var(--wp-admin-theme-color-darker-20,#183ad6);border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-multi-selection,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-multi-selection,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-multi-selection{border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem:focus .dataviews-filters__search-widget-listitem-multi-selection.is-selected,.dataviews-filters__search-widget-listitem:hover .dataviews-filters__search-widget-listitem-multi-selection.is-selected,.dataviews-filters__search-widget-listitem[data-active-item] .dataviews-filters__search-widget-listitem-multi-selection.is-selected{background:var(--wp-admin-theme-color-darker-20,#183ad6);border-color:var(--wp-admin-theme-color-darker-20,#183ad6)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-description{color:#757575;display:block;font-size:12px;line-height:16px;overflow:hidden;text-overflow:ellipsis}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{border:1px solid #1e1e1e;border-radius:50%;height:24px;margin-right:12px;max-width:24px;min-width:24px;position:relative;transition:none;width:24px}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{transition:box-shadow .1s linear}}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{height:16px;max-width:16px;min-width:16px;width:16px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:checked:before{background-color:#fff;border:4px solid #fff;box-sizing:inherit;height:12px;left:50%;margin:0;position:absolute;top:50%;transform:translate(-50%,-50%);width:12px}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:checked:before{height:8px;width:8px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection:checked{background:var(--wp-admin-theme-color);border:none}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection{margin:0;padding:0}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection.is-selected{background:var(--wp-admin-theme-color,#3858e9);border-color:var(--wp-admin-theme-color,#3858e9)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection.is-selected:before{background-color:#fff;border:4px solid #fff;border-radius:50%;box-sizing:inherit;content:"";height:12px;left:50%;margin:0;position:absolute;top:50%;transform:translate(-50%,-50%);width:12px}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-single-selection.is-selected:before{height:8px;width:8px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{--checkbox-size:24px;border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 transparent;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:normal;margin-right:12px;padding:6px 8px;transition:none}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{transition:box-shadow .1s linear}}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{font-size:13px;line-height:normal}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection::-moz-placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection::placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:checked{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:checked:before,.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{color:#fff;margin:-3px -5px}@media (min-width:782px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:checked:before,.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{margin:-4px 0 0 -5px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{content:"\f460";display:inline-block;float:left;font:normal 30px/1 dashicons;vertical-align:middle;width:16px;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (min-width:782px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-checked=mixed]:before{float:none;font-size:21px}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection:disabled,.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection[aria-disabled=true]{background:#f0f0f0;border-color:#ddd;cursor:default;opacity:1}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{background:#fff;color:#1e1e1e;height:var(--checkbox-size);margin:0;padding:0;position:relative;width:var(--checkbox-size)}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{--checkbox-size:16px}}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection{transition:border-color .1s ease-in-out}}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection.is-selected{background:var(--wp-admin-theme-color,#3858e9);border-color:var(--wp-admin-theme-color,#3858e9)}.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection.is-selected svg{--checkmark-size:var(--checkbox-size);fill:#fff;height:var(--checkmark-size);left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:var(--checkmark-size)}@media (min-width:600px){.dataviews-filters__search-widget-listitem .dataviews-filters__search-widget-listitem-multi-selection.is-selected svg{--checkmark-size:calc(var(--checkbox-size) + 4px)}}.dataviews-filters__search-widget-filter-combobox__wrapper{padding:8px;position:relative}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{border:1px solid #949494;border-radius:2px;box-shadow:0 0 0 transparent;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;line-height:normal;padding:6px 8px}@media not (prefers-reduced-motion){.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{transition:box-shadow .1s linear}}@media (min-width:600px){.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{font-size:13px;line-height:normal}}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 .5px var(--wp-admin-theme-color);outline:2px solid transparent}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-moz-placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::placeholder{color:rgba(30,30,30,.62)}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{display:block;font-size:16px;height:32px;margin-left:0;margin-right:0;padding:0 8px 0 32px;width:100%}@media (min-width:600px){.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input{font-size:13px}}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input:focus{background:#fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-moz-placeholder{color:#757575}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::placeholder{color:#757575}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-cancel-button,.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-decoration,.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-results-button,.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__input::-webkit-search-results-decoration{-webkit-appearance:none}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__icon{align-items:center;bottom:0;display:flex;inset-inline-start:12px;justify-content:center;position:absolute;top:0;width:24px}.dataviews-filters__search-widget-filter-combobox__wrapper .dataviews-filters__search-widget-filter-combobox__icon:dir(ltr){transform:scaleX(-1)}.dataviews-filters__container-visibility-toggle{flex-shrink:0;position:relative}.dataviews-filters-toggle__count{background:var(--wp-admin-theme-color,#3858e9);border-radius:8px;box-sizing:border-box;color:#fff;font-size:11px;height:16px;line-height:16px;min-width:16px;outline:var(--wp-admin-border-width-focus) solid #fff;padding:0 4px;position:absolute;right:0;text-align:center;top:0;transform:translate(50%,-50%)}.dataviews-search{width:-moz-fit-content;width:fit-content}.dataviews-filters__user-input-widget{padding:16px}.dataviews-filters__user-input-widget .components-input-control__prefix{padding-left:8px}.dataviews-filters__search-widget-no-elements{align-items:center;display:flex;justify-content:center;padding:16px}.dataviews-footer{background-color:inherit;border-top:1px solid #f0f0f0;bottom:0;flex-shrink:0;left:0;padding:12px 24px;position:sticky}@media not (prefers-reduced-motion){.dataviews-footer{transition:padding .1s ease-out}}.dataviews-footer{z-index:2}@container (max-width: 560px){.dataviews-footer{flex-direction:column!important}.dataviews-footer .dataviews-bulk-actions-footer__container{width:100%}.dataviews-footer .dataviews-bulk-actions-footer__item-count{flex-grow:1}.dataviews-footer .dataviews-pagination{justify-content:space-between;width:100%}}.dataviews-pagination__page-select{font-size:11px;font-weight:499;text-transform:uppercase}@media (min-width:600px){.dataviews-pagination__page-select .components-select-control__input{font-size:11px!important;font-weight:499}}.dataviews-action-modal{z-index:1000001}.dataviews-selection-checkbox{--checkbox-input-size:24px}@media (min-width:600px){.dataviews-selection-checkbox{--checkbox-input-size:16px}}.dataviews-selection-checkbox{flex-shrink:0;line-height:0}.dataviews-selection-checkbox .components-checkbox-control__input-container{margin:0}.dataviews-view-config{container-type:inline-size;font-size:13px;line-height:1.4;width:320px}.dataviews-config__popover.is-expanded .dataviews-config__popover-content-wrapper{height:100%;overflow-y:scroll}.dataviews-config__popover.is-expanded .dataviews-config__popover-content-wrapper .dataviews-view-config{width:auto}.dataviews-view-config__sort-direction .components-toggle-group-control-option-base{text-transform:uppercase}.dataviews-settings-section__title.dataviews-settings-section__title{font-size:15px;line-height:24px}.dataviews-settings-section__sidebar{grid-column:span 4}.dataviews-settings-section__content,.dataviews-settings-section__content>*{grid-column:span 8}.dataviews-settings-section__content .is-divided-in-two{display:contents}.dataviews-settings-section__content .is-divided-in-two>*{grid-column:span 4}.dataviews-settings-section:has(.dataviews-settings-section__content:empty){display:none}@container (max-width: 500px){.dataviews-settings-section.dataviews-settings-section{grid-template-columns:repeat(2,1fr)}.dataviews-settings-section.dataviews-settings-section .dataviews-settings-section__content,.dataviews-settings-section.dataviews-settings-section .dataviews-settings-section__sidebar{grid-column:span 2}}.dataviews-view-config__label{text-wrap:nowrap}.dataviews-view-grid-items{container-type:inline-size;display:grid;gap:32px;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));grid-template-rows:max-content;margin-bottom:auto;padding:0 24px 24px}@media not (prefers-reduced-motion){.dataviews-view-grid-items{transition:padding .1s ease-out}}.dataviews-view-grid{container-type:inline-size;display:flex;flex-direction:column;gap:32px;margin-bottom:auto;padding:0 24px 24px}@media not (prefers-reduced-motion){.dataviews-view-grid{transition:padding .1s ease-out}}.dataviews-view-grid .dataviews-view-grid__row{display:grid;gap:32px}.dataviews-view-grid .dataviews-view-grid__row .dataviews-view-grid__row__gridcell{border-radius:4px;position:relative}.dataviews-view-grid .dataviews-view-grid__row .dataviews-view-grid__row__gridcell[data-focus-visible]:after{border-radius:4px;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";height:100%;left:0;outline:2px solid transparent;pointer-events:none;position:absolute;top:0;width:100%}.dataviews-view-grid .dataviews-view-grid__card{height:100%;justify-content:flex-start;position:relative}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-actions{padding:8px 0 4px}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-field{align-content:center;min-height:24px;overflow:hidden;text-align:start}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__title-field--clickable{width:-moz-fit-content;width:fit-content}.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{color:#1e1e1e}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__media:focus:after,.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__media:after{background-color:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-view-grid .dataviews-view-grid__card.is-selected .dataviews-view-grid__media:after{box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.dataviews-view-grid .dataviews-view-grid__card .dataviews-view-grid__media:focus:after{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.dataviews-view-grid .dataviews-view-grid__media{aspect-ratio:1/1;background-color:#fff;border-radius:4px;overflow:hidden;position:relative;width:100%}.dataviews-view-grid .dataviews-view-grid__media img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-grid .dataviews-view-grid__media:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%}.dataviews-view-grid .dataviews-view-grid__fields{font-size:12px;line-height:16px;position:relative}.dataviews-view-grid .dataviews-view-grid__fields:not(:empty){padding:0 0 12px}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field-value:not(:empty){line-height:20px;min-height:24px;padding-top:2px}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field{align-items:center;min-height:24px}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-name{color:#757575;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:35%}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:65%}.dataviews-view-grid .dataviews-view-grid__fields .dataviews-view-grid__field:not(:has(.dataviews-view-grid__field-value:not(:empty))){display:none}.dataviews-view-grid .dataviews-view-grid__badge-fields:not(:empty){padding-bottom:12px}.dataviews-view-grid__field-value:empty,.dataviews-view-grid__field:empty{display:none}.dataviews-view-grid__card .dataviews-selection-checkbox{left:8px;opacity:0;position:absolute;top:-9999em;z-index:1}@media not (prefers-reduced-motion){.dataviews-view-grid__card .dataviews-selection-checkbox{transition:opacity .1s linear}}@media (hover:none){.dataviews-view-grid__card .dataviews-selection-checkbox{opacity:1;top:8px}}.dataviews-view-grid__card.is-selected .dataviews-selection-checkbox,.dataviews-view-grid__card:focus-within .dataviews-selection-checkbox,.dataviews-view-grid__card:hover .dataviews-selection-checkbox{opacity:1;top:8px}.dataviews-view-grid__card .dataviews-view-grid__media-actions{opacity:0;position:absolute;right:4px;top:4px}.dataviews-view-grid__card .dataviews-view-grid__media-actions .dataviews-all-actions-button{background-color:#fff}@media not (prefers-reduced-motion){.dataviews-view-grid__card .dataviews-view-grid__media-actions{transition:opacity .1s linear}}@media (hover:none){.dataviews-view-grid__card .dataviews-view-grid__media-actions{opacity:1;top:4px}}.dataviews-view-grid__card .dataviews-view-grid__media-actions:has(.dataviews-all-actions-button[aria-expanded=true]),.dataviews-view-grid__card:focus-within .dataviews-view-grid__media-actions,.dataviews-view-grid__card:hover .dataviews-view-grid__media-actions{opacity:1}.dataviews-view-grid__media--clickable{cursor:pointer}.dataviews-view-grid__group-header{color:#1e1e1e;container-type:inline-size;font-size:15px;font-weight:499;margin:0 0 8px;padding:0 24px}div.dataviews-view-list{list-style-type:none}.dataviews-view-list{margin:0 0 auto}.dataviews-view-list div[role=article],.dataviews-view-list div[role=row]{border-top:1px solid #f0f0f0;margin:0}.dataviews-view-list div[role=article] .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=row] .dataviews-view-list__item-wrapper{box-sizing:border-box;padding:16px 24px;position:relative}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions,.dataviews-view-list div[role=row] .dataviews-view-list__item-actions{display:flex;flex:0 0 auto;gap:4px;white-space:nowrap;width:-moz-max-content;width:max-content}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions .components-button,.dataviews-view-list div[role=row] .dataviews-view-list__item-actions .components-button{position:relative;z-index:1}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions>div,.dataviews-view-list div[role=row] .dataviews-view-list__item-actions>div{height:24px}.dataviews-view-list div[role=article] .dataviews-view-list__item-actions>:not(:last-child),.dataviews-view-list div[role=row] .dataviews-view-list__item-actions>:not(:last-child){flex:0;overflow:hidden;width:0}.dataviews-view-list div[role=article]:where(.is-selected,.is-hovered,:focus-within) .dataviews-view-list__item-actions>:not(:last-child),.dataviews-view-list div[role=row]:where(.is-selected,.is-hovered,:focus-within) .dataviews-view-list__item-actions>:not(:last-child){flex-basis:min-content;overflow:unset;width:auto}@media (hover:none){.dataviews-view-list div[role=article] .dataviews-view-list__item-actions>:not(:last-child),.dataviews-view-list div[role=row] .dataviews-view-list__item-actions>:not(:last-child){flex-basis:min-content;overflow:unset;width:auto}}.dataviews-view-list div[role=article].is-selected.is-selected,.dataviews-view-list div[role=article].is-selected.is-selected+div[role=article],.dataviews-view-list div[role=article].is-selected.is-selected+div[role=row],.dataviews-view-list div[role=row].is-selected.is-selected,.dataviews-view-list div[role=row].is-selected.is-selected+div[role=article],.dataviews-view-list div[role=row].is-selected.is-selected+div[role=row]{border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-list div[role=article]:not(.is-selected).is-hovered,.dataviews-view-list div[role=article]:not(.is-selected):focus-within,.dataviews-view-list div[role=article]:not(.is-selected):hover,.dataviews-view-list div[role=row]:not(.is-selected).is-hovered,.dataviews-view-list div[role=row]:not(.is-selected):focus-within,.dataviews-view-list div[role=row]:not(.is-selected):hover{background-color:rgba(var(--wp-admin-theme-color--rgb),.04);border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12);color:var(--wp-admin-theme-color)}.dataviews-view-list div[role=article]:not(.is-selected).is-hovered+div[role=article],.dataviews-view-list div[role=article]:not(.is-selected).is-hovered+div[role=row],.dataviews-view-list div[role=article]:not(.is-selected):focus-within+div[role=article],.dataviews-view-list div[role=article]:not(.is-selected):focus-within+div[role=row],.dataviews-view-list div[role=article]:not(.is-selected):hover+div[role=article],.dataviews-view-list div[role=article]:not(.is-selected):hover+div[role=row],.dataviews-view-list div[role=row]:not(.is-selected).is-hovered+div[role=article],.dataviews-view-list div[role=row]:not(.is-selected).is-hovered+div[role=row],.dataviews-view-list div[role=row]:not(.is-selected):focus-within+div[role=article],.dataviews-view-list div[role=row]:not(.is-selected):focus-within+div[role=row],.dataviews-view-list div[role=row]:not(.is-selected):hover+div[role=article],.dataviews-view-list div[role=row]:not(.is-selected):hover+div[role=row]{border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-list div[role=article]:not(.is-selected).is-hovered .dataviews-title-field,.dataviews-view-list div[role=article]:not(.is-selected).is-hovered .dataviews-view-list__field,.dataviews-view-list div[role=article]:not(.is-selected):focus-within .dataviews-title-field,.dataviews-view-list div[role=article]:not(.is-selected):focus-within .dataviews-view-list__field,.dataviews-view-list div[role=article]:not(.is-selected):hover .dataviews-title-field,.dataviews-view-list div[role=article]:not(.is-selected):hover .dataviews-view-list__field,.dataviews-view-list div[role=row]:not(.is-selected).is-hovered .dataviews-title-field,.dataviews-view-list div[role=row]:not(.is-selected).is-hovered .dataviews-view-list__field,.dataviews-view-list div[role=row]:not(.is-selected):focus-within .dataviews-title-field,.dataviews-view-list div[role=row]:not(.is-selected):focus-within .dataviews-view-list__field,.dataviews-view-list div[role=row]:not(.is-selected):hover .dataviews-title-field,.dataviews-view-list div[role=row]:not(.is-selected):hover .dataviews-view-list__field{color:var(--wp-admin-theme-color)}.dataviews-view-list div[role=article].is-selected .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=article].is-selected:focus-within .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=row].is-selected .dataviews-view-list__item-wrapper,.dataviews-view-list div[role=row].is-selected:focus-within .dataviews-view-list__item-wrapper{background-color:rgba(var(--wp-admin-theme-color--rgb),.08);color:#1e1e1e}.dataviews-view-list div[role=article].is-selected .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=article].is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__field,.dataviews-view-list div[role=article].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=article].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__field,.dataviews-view-list div[role=row].is-selected .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=row].is-selected .dataviews-view-list__item-wrapper .dataviews-view-list__field,.dataviews-view-list div[role=row].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-title-field,.dataviews-view-list div[role=row].is-selected:focus-within .dataviews-view-list__item-wrapper .dataviews-view-list__field{color:#1e1e1e}.dataviews-view-list .dataviews-view-list__item{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:none;cursor:pointer;inset:0;padding:0;position:absolute;scroll-margin:8px 0;z-index:1}.dataviews-view-list .dataviews-view-list__item:focus-visible{outline:none}.dataviews-view-list .dataviews-view-list__item:focus-visible:before{border-radius:2px;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";inset:var(--wp-admin-border-width-focus);outline:2px solid transparent;position:absolute}.dataviews-view-list .dataviews-view-list__title-field{flex:1;line-height:24px;min-height:24px;overflow:hidden}.dataviews-view-list .dataviews-view-list__title-field:has(a,button){z-index:1}.dataviews-view-list .dataviews-view-list__media-wrapper{background-color:#fff;border-radius:4px;flex-shrink:0;height:52px;overflow:hidden;position:relative;width:52px}.dataviews-view-list .dataviews-view-list__media-wrapper img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-list .dataviews-view-list__media-wrapper:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;left:0;position:absolute;top:0;width:100%}.dataviews-view-list .dataviews-view-list__field-wrapper{flex-grow:1;min-height:52px}.dataviews-view-list .dataviews-view-list__field{color:#757575}.dataviews-view-list .dataviews-view-list__fields{display:flex;flex-wrap:wrap;font-size:12px;gap:12px;row-gap:4px}.dataviews-view-list .dataviews-view-list__fields:empty{display:none}.dataviews-view-list .dataviews-view-list__fields .dataviews-view-list__field:has(.dataviews-view-list__field-value:empty){display:none}.dataviews-view-list .dataviews-view-list__fields .dataviews-view-list__field-value{align-items:center;display:flex;line-height:20px;min-height:24px}.dataviews-view-list+.dataviews-pagination{justify-content:space-between}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__item-wrapper{padding:8px 24px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__title-field{line-height:16px;min-height:16px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__media-wrapper{height:32px;width:32px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__field-wrapper{min-height:32px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__fields{gap:8px;row-gap:4px}.dataviews-view-list.has-compact-density div[role=row] .dataviews-view-list__fields .dataviews-view-list__field-value{line-height:16px;min-height:16px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__item-wrapper{padding:24px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__title-field{line-height:32px;min-height:32px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__media-wrapper{height:64px;width:64px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__field-wrapper{min-height:64px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__fields{gap:16px;row-gap:8px}.dataviews-view-list.has-comfortable-density div[role=row] .dataviews-view-list__fields .dataviews-view-list__field-value{line-height:24px;min-height:32px}.dataviews-view-list__group-header{color:#1e1e1e;font-size:15px;font-weight:499;margin:0 0 8px;padding:0 24px}.dataviews-view-table{background-color:inherit;border-collapse:collapse;border-color:inherit;color:#757575;margin-bottom:auto;position:relative;text-indent:0;width:100%}.dataviews-view-table th{color:#1e1e1e;font-size:13px;font-weight:400;text-align:left}.dataviews-view-table td,.dataviews-view-table th{padding:12px}.dataviews-view-table td.dataviews-view-table__actions-column,.dataviews-view-table th.dataviews-view-table__actions-column{text-align:right}.dataviews-view-table td.dataviews-view-table__actions-column--sticky,.dataviews-view-table th.dataviews-view-table__actions-column--sticky{background-color:var(--wp-dataviews-color-background,#fff);position:sticky;right:0}.dataviews-view-table td.dataviews-view-table__actions-column--stuck:after,.dataviews-view-table th.dataviews-view-table__actions-column--stuck:after{background-color:#f0f0f0;bottom:0;content:"";display:block;left:0;position:absolute;top:0;width:1px}.dataviews-view-table td.dataviews-view-table__checkbox-column,.dataviews-view-table th.dataviews-view-table__checkbox-column{padding-right:0}.dataviews-view-table td.dataviews-view-table__checkbox-column .dataviews-view-table__cell-content-wrapper,.dataviews-view-table th.dataviews-view-table__checkbox-column .dataviews-view-table__cell-content-wrapper{max-width:auto;min-width:auto}.dataviews-view-table tr{background-color:inherit;border-top:1px solid #f0f0f0}.dataviews-view-table tr td:first-child,.dataviews-view-table tr th:first-child{padding-left:24px}.dataviews-view-table tr td:last-child,.dataviews-view-table tr th:last-child{padding-right:24px}.dataviews-view-table tr:last-child{border-bottom:0}.dataviews-view-table tr .dataviews-item-actions .components-button:not(.dataviews-all-actions-button){opacity:0}@media (hover:none){.dataviews-view-table tr .dataviews-item-actions .components-button:not(.dataviews-all-actions-button){opacity:1}}.dataviews-view-table tr.is-selected{background-color:color-mix(in srgb,rgb(var(--wp-admin-theme-color--rgb)) 4%,#fff);color:#757575}.dataviews-view-table tr.is-selected,.dataviews-view-table tr.is-selected+tr{border-top:1px solid rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-table tr.is-selected .dataviews-view-table__actions-column--sticky{background-color:color-mix(in srgb,rgb(var(--wp-admin-theme-color--rgb)) 4%,#fff)}.dataviews-view-table tr.is-hovered .dataviews-item-actions .components-button:not(.dataviews-all-actions-button),.dataviews-view-table tr:focus-within .dataviews-item-actions .components-button:not(.dataviews-all-actions-button),.dataviews-view-table tr:hover .dataviews-item-actions .components-button:not(.dataviews-all-actions-button){opacity:1}.dataviews-view-table.has-bulk-actions tr:focus-within .dataviews-view-table__actions-column--sticky,.dataviews-view-table.has-bulk-actions tr:hover .dataviews-view-table__actions-column--sticky{background-color:var(--wp-dataviews-color-background,#fff)}.dataviews-view-table.has-bulk-actions tr.is-selected .dataviews-view-table__actions-column--sticky,.dataviews-view-table.has-bulk-actions tr.is-selected:hover .dataviews-view-table__actions-column--sticky{background-color:color-mix(in srgb,rgb(var(--wp-admin-theme-color--rgb)) 4%,#fff)}.dataviews-view-table thead{background-color:inherit;inset-block-start:0;position:sticky;z-index:1}.dataviews-view-table thead tr{border:0}.dataviews-view-table thead th{background-color:inherit;font-size:11px;font-weight:499;padding-bottom:8px;padding-top:8px;text-transform:uppercase}.dataviews-view-table thead th:has(.dataviews-view-table-header-button){padding-left:4px;padding-right:4px}.dataviews-view-table thead th:has(.dataviews-view-table-header-button) .dataviews-view-table-header-button{gap:4px}.dataviews-view-table thead th:has(.dataviews-view-table-header-button):first-child{padding-left:40px}.dataviews-view-table thead th:has(.dataviews-view-table-header-button):last-child{padding-right:40px}.dataviews-view-table tbody td{vertical-align:top}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper{align-items:center;display:flex;min-height:32px;white-space:nowrap}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper.dataviews-view-table__cell-align-end{justify-content:flex-end}.dataviews-view-table tbody .dataviews-view-table__cell-content-wrapper.dataviews-view-table__cell-align-center{justify-content:center}.dataviews-view-table tbody .components-v-stack>.dataviews-view-table__cell-content-wrapper:not(:first-child){min-height:0}.dataviews-view-table .dataviews-view-table-header-button{font-size:11px;font-weight:499;padding:4px 8px;text-transform:uppercase}.dataviews-view-table .dataviews-view-table-header-button:not(:hover){color:#1e1e1e}.dataviews-view-table .dataviews-view-table-header-button span{speak:none}.dataviews-view-table .dataviews-view-table-header-button span:empty{display:none}.dataviews-view-table .dataviews-view-table-header{padding-left:4px}.dataviews-view-table .dataviews-view-table__actions-column{white-space:nowrap;width:auto}.dataviews-view-table.has-compact-density thead th:has(.dataviews-view-table-header-button):not(:first-child){padding-left:0}.dataviews-view-table.has-compact-density thead th:has(.dataviews-view-table-header-button):not(:last-child){padding-right:0}.dataviews-view-table.has-compact-density td,.dataviews-view-table.has-compact-density th{padding:4px 8px}.dataviews-view-table.has-comfortable-density td,.dataviews-view-table.has-comfortable-density th{padding:16px 12px}.dataviews-view-table.has-comfortable-density td.dataviews-view-table__checkbox-column,.dataviews-view-table.has-comfortable-density th.dataviews-view-table__checkbox-column,.dataviews-view-table.has-compact-density td.dataviews-view-table__checkbox-column,.dataviews-view-table.has-compact-density th.dataviews-view-table__checkbox-column{padding-right:0}.dataviews-view-table-selection-checkbox{--checkbox-input-size:24px}@media (min-width:600px){.dataviews-view-table-selection-checkbox{--checkbox-input-size:16px}}.dataviews-column-primary__media{background-color:#fff;border-radius:4px;flex-shrink:0;max-width:60px;min-height:32px;min-width:32px;overflow:hidden;position:relative}.dataviews-column-primary__media img{height:32px;-o-object-fit:cover;object-fit:cover;width:32px}.dataviews-column-primary__media:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;left:0;position:absolute;top:0;width:100%}.dataviews-view-table__cell-content-wrapper:not(.dataviews-column-primary__media),.dataviews-view-table__primary-column-content:not(.dataviews-column-primary__media){max-width:80ch;min-width:15ch}.dataviews-view-table__group-header-row .dataviews-view-table__group-header-cell{color:#1e1e1e;font-weight:499;padding:12px 24px}.dataviews-view-table col[class^=dataviews-view-table__col-]:not(.dataviews-view-table__col-first-data){width:1%}.dataviews-view-picker-grid .dataviews-view-picker-grid__card{height:100%;justify-content:flex-start;position:relative}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__title-actions{padding:8px 0 4px}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__title-field{align-content:center;min-height:24px;overflow:hidden;text-align:start}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__title-field--clickable{width:-moz-fit-content;width:fit-content}.dataviews-view-picker-grid .dataviews-view-picker-grid__card.is-selected .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field .dataviews-view-picker-grid__field-value{color:#1e1e1e}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__media:focus:after,.dataviews-view-picker-grid .dataviews-view-picker-grid__card.is-selected .dataviews-view-picker-grid__media:after{background-color:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-view-picker-grid .dataviews-view-picker-grid__card.is-selected .dataviews-view-picker-grid__media:after{box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.dataviews-view-picker-grid .dataviews-view-picker-grid__card .dataviews-view-picker-grid__media:focus:after{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.dataviews-view-picker-grid:focus-visible[aria-activedescendant]{outline:none}.dataviews-view-picker-grid:focus-visible [data-active-item=true]{outline:2px solid var(--wp-admin-theme-color)}.dataviews-view-picker-grid .dataviews-selection-checkbox{top:8px!important}.dataviews-view-picker-grid .dataviews-selection-checkbox input{pointer-events:none}.dataviews-view-picker-grid .dataviews-view-picker-grid__media{aspect-ratio:1/1;background-color:#fff;border-radius:4px;min-height:0;position:relative;width:100%}.dataviews-view-picker-grid .dataviews-view-picker-grid__media img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-picker-grid .dataviews-view-picker-grid__media:after{border-radius:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);content:"";height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields{font-size:12px;line-height:16px;position:relative}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields:not(:empty){padding:0 0 12px}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field-value:not(:empty){line-height:20px;min-height:24px;padding-top:2px}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field{align-items:center;min-height:24px}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field .dataviews-view-picker-grid__field-name{color:#757575;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:35%}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field .dataviews-view-picker-grid__field-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:65%}.dataviews-view-picker-grid .dataviews-view-picker-grid__fields .dataviews-view-picker-grid__field:not(:has(.dataviews-view-picker-grid__field-value:not(:empty))){display:none}.dataviews-view-picker-grid .dataviews-view-picker-grid__badge-fields:not(:empty){padding-bottom:12px}.dataviews-view-picker-grid__field-value:empty,.dataviews-view-picker-grid__field:empty{display:none}.dataviews-view-picker-grid__card .dataviews-selection-checkbox{left:8px;position:absolute;top:-9999em;z-index:1}@media (hover:none){.dataviews-view-picker-grid__card .dataviews-selection-checkbox{top:8px}}.dataviews-view-picker-grid__card.is-selected .dataviews-selection-checkbox,.dataviews-view-picker-grid__card:focus-within .dataviews-selection-checkbox,.dataviews-view-picker-grid__card:hover .dataviews-selection-checkbox{top:8px}.dataviews-view-picker-grid__media--clickable{cursor:pointer}.dataviews-view-picker-grid-group__header{color:#1e1e1e;font-size:15px;font-weight:499;margin:0 0 8px;padding:0 48px}.dataviews-view-picker-table{background-color:inherit}.dataviews-view-picker-table .dataviews-view-table__checkbox-column{width:48px}.dataviews-view-picker-table tbody:focus-visible[aria-activedescendant]{outline:none}.dataviews-view-picker-table tbody:focus-visible [data-active-item=true]{outline:2px solid var(--wp-admin-theme-color)}.dataviews-view-picker-table .dataviews-selection-checkbox .components-checkbox-control__input.components-checkbox-control__input{opacity:1;pointer-events:none}.dataviews-view-picker-table .dataviews-view-table__row{cursor:pointer}.dataviews-view-picker-table .dataviews-view-table__row.is-selected{background-color:rgba(var(--wp-admin-theme-color--rgb),.04)}.dataviews-view-picker-table .dataviews-view-table__row.is-hovered{background-color:rgba(var(--wp-admin-theme-color--rgb),.08)}.dataviews-view-picker-table .dataviews-view-table__row.is-selected.is-hovered{background-color:rgba(var(--wp-admin-theme-color--rgb),.12)}.dataviews-view-activity{margin:0 0 auto;padding:8px 24px}.dataviews-view-activity .dataviews-view-activity__group-header{color:#949494;font-size:15px;font-weight:499;margin:0 0 8px;padding:0}.dataviews-view-activity .dataviews-view-activity__item-actions{min-width:24px}.dataviews-view-activity .dataviews-view-activity__item-content{flex-grow:1}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-description,.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields,.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title{min-height:16px}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title{align-items:center;display:flex;flex:1;overflow:hidden;position:relative}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title--clickable{cursor:pointer}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-title--clickable:focus-visible{border-radius:2px;outline:var(--wp-admin-border-width-focus) solid var(--wp-admin-theme-color);outline-offset:var(--wp-admin-border-width-focus)}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__primary-actions{display:flex;flex:0 0 auto;width:-moz-max-content;width:max-content}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__primary-actions .components-button{position:relative;z-index:1}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields{color:#757575;display:flex;flex-wrap:wrap;gap:12px;row-gap:4px}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields:empty{display:none}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields .dataviews-view-activity__item-field:has(.dataviews-view-activity__item-field-value:empty){display:none}.dataviews-view-activity .dataviews-view-activity__item-content .dataviews-view-activity__item-fields .dataviews-view-activity__item-field-value{align-items:center;display:flex}.dataviews-view-activity .dataviews-view-activity__item-type{align-self:stretch;flex-shrink:0}.dataviews-view-activity .dataviews-view-activity__item-type:after{background-color:#ddd;content:"";flex:1 1 auto;margin:0 auto;width:1px}.dataviews-view-activity .dataviews-view-activity__item-type:before{background-color:#ddd;content:"";flex:0 0 auto;margin:0 auto;width:1px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-type{width:8px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-type:before{height:12px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-type-icon{height:11px;width:11px}.dataviews-view-activity .dataviews-view-activity__item.is-compact .dataviews-view-activity__item-content{margin:12px 0}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-type{width:24px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-type:before{height:12px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-type-icon{height:25px;width:25px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-content{margin:12px 0;padding-top:8px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-type{width:32px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-type:before{height:8px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-type-icon{height:33px;width:33px}.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-content{margin:8px 0 16px;padding-top:12px}.dataviews-view-activity .dataviews-view-activity__item.is-balanced .dataviews-view-activity__item-bullet,.dataviews-view-activity .dataviews-view-activity__item.is-comfortable .dataviews-view-activity__item-bullet{height:9px;position:relative;top:50%;transform:translateY(-50%);width:9px}.dataviews-view-activity .dataviews-view-activity__item:first-child .dataviews-view-activity__item-type:before{visibility:hidden}.dataviews-view-activity .dataviews-view-activity__group:last-of-type>.dataviews-view-activity__item:last-of-type .dataviews-view-activity__item-type:after,.dataviews-view-activity>.dataviews-view-activity__item:last-child .dataviews-view-activity__item-type:after{background:linear-gradient(180deg,#ddd 0,hsla(0,0%,87%,.2) 60%,hsla(0,0%,87%,0))}.dataviews-view-activity .dataviews-view-activity__item-type-icon{background-color:#fff;flex-shrink:0;overflow:hidden}.dataviews-view-activity .dataviews-view-activity__item-type-icon .dataviews-view-activity__item-bullet,.dataviews-view-activity .dataviews-view-activity__item-type-icon img,.dataviews-view-activity .dataviews-view-activity__item-type-icon svg{border-radius:50%;box-shadow:inset 0 0 0 1px #ddd;box-sizing:border-box;display:block;height:100%;margin:0 auto;-o-object-fit:cover;object-fit:cover;width:100%}.dataviews-view-activity .dataviews-view-activity__item-type-icon svg{padding:4px}.dataviews-view-activity .dataviews-view-activity__item-type-icon .dataviews-view-activity__item-bullet{background-color:#ddd;content:""}.dataviews-view-activity+.dataviews-pagination{justify-content:space-between}.dataviews-picker-footer__bulk-selection{align-self:flex-start;height:32px}.dataviews-picker-footer__actions{align-self:flex-end}.dataviews-controls__datetime{border:none;padding:0}.dataviews-controls__relative-date-number,.dataviews-controls__relative-date-unit{flex:1 1 50%}.dataviews-controls__date input[type=date]::-webkit-calendar-picker-indicator,.dataviews-controls__date input[type=date]::-webkit-inner-spin-button{-webkit-appearance:none;display:none}.dataviews-controls__date-range-inputs>*{min-width:0}.dataviews-controls__date-preset{border:1px solid #ddd}.dataviews-controls__date-preset:active{background-color:#000}.dataforms-layouts-panel__field{align-items:flex-start!important;justify-content:flex-start!important;min-height:32px;width:100%}.dataforms-layouts-panel__field--label-position-none{align-items:center!important}.dataforms-layouts-panel__field-label{align-items:center;display:flex;flex-shrink:0;hyphens:auto;line-height:20px;min-height:32px;width:38%}.dataforms-layouts-panel__field-label--label-position-side{align-self:center}.dataforms-layouts-panel__field-label.has-error{color:#cc1818}.dataforms-layouts-panel__field-label-error-content{cursor:help;fill:#cc1818}.dataforms-layouts-panel__field-label-error-content svg{fill:currentColor}.dataforms-layouts-panel__field-control{align-items:center;display:flex;flex-grow:1;min-height:32px}.dataforms-layouts-panel__field-control .components-button{max-width:100%;min-height:32px;text-align:left;text-wrap:balance;text-wrap:pretty;white-space:normal}.dataforms-layouts-panel__field-control.components-button.is-link[aria-disabled=true]{text-decoration:none}.dataforms-layouts-panel__field-control .components-dropdown{max-width:100%}.dataforms-layouts-panel__field-dropdown .components-popover__content{min-width:320px;padding:16px}.dataforms-layouts-panel__dropdown-header{margin-bottom:16px}.dataforms-layouts-panel__modal-footer{margin-top:16px}.components-popover.components-dropdown__content.dataforms-layouts-panel__field-dropdown{z-index:159990}.dataforms-layouts-panel__summary-button:empty{min-width:160px}.dataforms-layouts-regular__field{align-items:flex-start!important;justify-content:flex-start!important;min-height:32px;width:100%}.dataforms-layouts-regular__field-label{align-items:center;display:flex;flex-shrink:0;hyphens:auto;line-height:20px;min-height:32px;width:38%}.dataforms-layouts-regular__field-label--label-position-side{align-self:center}.dataforms-layouts-regular__field-control{align-items:center;display:flex;flex-grow:1;min-height:32px}.dataforms-layouts-card__field-header-label{font-family:-apple-system,"system-ui",Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:15px;font-weight:499;line-height:20px}.dataforms-layouts-card__field{width:100%}.dataforms-layouts-card__field-description{color:#757575;display:block;font-size:13px;margin-bottom:16px}.dataforms-layouts-card__field-summary{display:flex;flex-direction:row;gap:16px}.dataforms-layouts-details__content{padding-top:12px}.dataforms-layouts-row__field-control{width:100%}.dataforms-layouts__wrapper{font-family:-apple-system,"system-ui",Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:400;line-height:20px}.clawpress-settings__actions{align-items:center;display:flex;gap:8px;margin-top:16px}.clawpress-settings__model-description,.clawpress-settings__model-meta{color:#50575e}.clawpress-settings__model-skipped{display:inline-block;margin-top:4px}.clawpress-abilities__header{align-items:baseline;display:flex;gap:12px;justify-content:space-between}.clawpress-abilities__header h3{font-size:24px;line-height:1.2;margin:0}.clawpress-abilities__header p{color:#50575e;margin:0}.clawpress-abilities__toolbar{align-items:flex-end;display:flex;gap:12px;justify-content:space-between;margin-bottom:20px}.clawpress-abilities__toolbar .components-base-control{margin-bottom:0;min-width:220px}.clawpress-abilities__actions{display:flex;gap:8px}.clawpress-abilities__grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(320px,1fr))}.clawpress-abilities__item{background:linear-gradient(180deg,#fff,#f6f7f7);border:1px solid #dcdcde;border-radius:10px;display:flex;flex-direction:column;gap:10px;padding:14px}.clawpress-abilities__item-header{align-items:flex-start;display:flex;gap:12px;justify-content:space-between}.clawpress-abilities__item h4{margin:0}.clawpress-abilities__item .components-base-control{margin-bottom:0}.clawpress-abilities__description{color:#1d2327;margin:0}.clawpress-abilities__annotations{display:flex;flex-wrap:wrap;gap:6px;min-height:24px}.clawpress-abilities__annotation{align-items:center;border-radius:999px;display:inline-flex;font-size:11px;font-weight:600;line-height:1.4;padding:3px 8px}.clawpress-abilities__annotation.is-readonly{background:#d6f5e3;color:#0f5132}.clawpress-abilities__annotation.is-destructive{background:#fbe6e8;color:#8a2424}.clawpress-abilities__meta{color:#50575e;font-size:12px;margin:0}.clawpress-abilities__warning{color:#b32d2e;font-size:12px;margin:0}.clawpress-abilities__empty{color:#50575e;margin:0}@media(max-width:782px){.clawpress-abilities__toolbar{align-items:stretch;flex-direction:column}.clawpress-abilities__actions{justify-content:flex-start}} diff --git a/includes/helpers/class-model-helper.php b/includes/helpers/class-model-helper.php index 02b7c2a..4a91710 100644 --- a/includes/helpers/class-model-helper.php +++ b/includes/helpers/class-model-helper.php @@ -103,10 +103,19 @@ final class Model_Helper { */ private static ?self $instance = null; + /** + * Model option helper. + * + * @var Model_Option_Helper + */ + private Model_Option_Helper $model_option_helper; + /** * Constructor. */ - private function __construct() {} + private function __construct() { + $this->model_option_helper = Model_Option_Helper::get_instance(); + } /** * Get singleton instance. @@ -123,7 +132,7 @@ public static function get_instance(): self { * Get model options for a provider. * * @param string $provider Provider ID. - * @return array + * @return array> */ public function get_options_for_provider( string $provider ): array { $provider = clawpress_sanitize_provider( $provider ); @@ -141,11 +150,13 @@ public function get_options_for_provider( string $provider ): array { } return array_map( - static function ( array $option ): array { + function ( array $option ) use ( $provider ): array { + $model_id = (string) $option['id']; + return [ - 'id' => (string) $option['id'], + 'id' => $model_id, 'label' => (string) $option['label'], - ]; + ] + $this->model_option_helper->get_generation_option_summary( $provider, $model_id ); }, self::MODEL_CATALOG[ $provider ] ); @@ -154,7 +165,7 @@ static function ( array $option ): array { /** * Get model options for all supported providers. * - * @return array> + * @return array>> */ public function get_all_options(): array { $options = []; @@ -169,7 +180,7 @@ public function get_all_options(): array { /** * Get discovered model options from registered providers only. * - * @return array> + * @return array>> */ public function get_all_discovered_options(): array { $options = []; @@ -224,7 +235,7 @@ public function get_default_model_for_provider( string $provider ): string { * Resolve text-generation models registered for a provider via the AI client registry. * * @param string $provider Provider ID. - * @return array + * @return array> */ private function get_registry_options_for_provider( string $provider ): array { try { @@ -272,7 +283,11 @@ private function get_registry_options_for_provider( string $provider ): array { $options[ $model_id ] = [ 'id' => $model_id, 'label' => $model_label, - ]; + ] + $this->model_option_helper->get_generation_option_summary_from_metadata( + $provider, + $model_id, + $model + ); } return array_values( $options ); diff --git a/includes/helpers/class-model-option-helper.php b/includes/helpers/class-model-option-helper.php index 46c1884..8f5b4fb 100644 --- a/includes/helpers/class-model-option-helper.php +++ b/includes/helpers/class-model-option-helper.php @@ -138,30 +138,7 @@ public function metadata_supports_option( string $provider, string $model, strin return null; } - $supported_options = $metadata->getSupportedOptions(); - if ( ! is_array( $supported_options ) ) { - return null; - } - - $normalized_target = $this->normalize_metadata_option_name( $option_name ); - foreach ( $supported_options as $supported_option ) { - if ( ! is_object( $supported_option ) || ! method_exists( $supported_option, 'getName' ) ) { - continue; - } - - $supported_name = $this->normalize_metadata_option_name( $supported_option->getName() ); - if ( $normalized_target !== $supported_name ) { - continue; - } - - if ( null !== $value && method_exists( $supported_option, 'isSupportedValue' ) ) { - return (bool) $supported_option->isSupportedValue( $value ); - } - - return true; - } - - return false; + return $this->metadata_object_supports_option( $metadata, $option_name, $value ); } /** @@ -176,28 +153,8 @@ public function get_supported_option_names( string $provider, string $model ): a clawpress_sanitize_provider( $provider ), trim( sanitize_text_field( $model ) ) ); - if ( null === $metadata || ! method_exists( $metadata, 'getSupportedOptions' ) ) { - return []; - } - - $supported_options = $metadata->getSupportedOptions(); - if ( ! is_array( $supported_options ) ) { - return []; - } - - $option_names = []; - foreach ( $supported_options as $supported_option ) { - if ( ! is_object( $supported_option ) || ! method_exists( $supported_option, 'getName' ) ) { - continue; - } - $option_name = $this->get_metadata_option_value( $supported_option->getName() ); - if ( '' !== $option_name ) { - $option_names[] = $option_name; - } - } - - return array_values( array_unique( $option_names ) ); + return null !== $metadata ? $this->get_supported_option_names_from_metadata( $metadata ) : []; } /** @@ -208,6 +165,23 @@ public function get_supported_option_names( string $provider, string $model ): a * @return array{supported_options:array,unsupported_generation_options:array,unsupported_generation_option_labels:array,learned_unsupported_options:array} */ public function get_generation_option_summary( string $provider, string $model ): array { + $metadata = $this->resolve_model_metadata( + clawpress_sanitize_provider( $provider ), + trim( sanitize_text_field( $model ) ) + ); + + return $this->get_generation_option_summary_from_metadata( $provider, $model, $metadata ); + } + + /** + * Get unsupported generation option metadata from an existing metadata object. + * + * @param string $provider Provider identifier. + * @param string $model Model identifier. + * @param ?object $metadata Model metadata. + * @return array{supported_options:array,unsupported_generation_options:array,unsupported_generation_option_labels:array,learned_unsupported_options:array} + */ + public function get_generation_option_summary_from_metadata( string $provider, string $model, ?object $metadata ): array { $unsupported = []; $learned = []; @@ -218,11 +192,9 @@ public function get_generation_option_summary( string $provider, string $model ) continue; } - $metadata_support = $this->metadata_supports_option( - $provider, - $model, - self::GENERATION_OPTION_NAMES[ $option_key ] - ); + $metadata_support = null !== $metadata + ? $this->metadata_object_supports_option( $metadata, self::GENERATION_OPTION_NAMES[ $option_key ] ) + : null; if ( false === $metadata_support ) { $unsupported[] = $option_key; } @@ -231,7 +203,7 @@ public function get_generation_option_summary( string $provider, string $model ) $unsupported = array_values( array_unique( $unsupported ) ); return [ - 'supported_options' => $this->get_supported_option_names( $provider, $model ), + 'supported_options' => null !== $metadata ? $this->get_supported_option_names_from_metadata( $metadata ) : [], 'unsupported_generation_options' => $unsupported, 'unsupported_generation_option_labels' => array_map( [ $this, 'get_generation_option_label' ], @@ -459,4 +431,73 @@ private function get_learned_unsupported_options(): array { $options = get_option( self::UNSUPPORTED_OPTIONS_OPTION, [] ); return is_array( $options ) ? $options : []; } + + /** + * Check whether a metadata object supports an option. + * + * @param object $metadata Model metadata. + * @param string $option_name AI client metadata option name. + * @param mixed $value Optional value to validate. + */ + private function metadata_object_supports_option( object $metadata, string $option_name, $value = null ): ?bool { + if ( ! method_exists( $metadata, 'getSupportedOptions' ) ) { + return null; + } + + $supported_options = $metadata->getSupportedOptions(); + if ( ! is_array( $supported_options ) ) { + return null; + } + + $normalized_target = $this->normalize_metadata_option_name( $option_name ); + foreach ( $supported_options as $supported_option ) { + if ( ! is_object( $supported_option ) || ! method_exists( $supported_option, 'getName' ) ) { + continue; + } + + $supported_name = $this->normalize_metadata_option_name( $supported_option->getName() ); + if ( $normalized_target !== $supported_name ) { + continue; + } + + if ( null !== $value && method_exists( $supported_option, 'isSupportedValue' ) ) { + return (bool) $supported_option->isSupportedValue( $value ); + } + + return true; + } + + return false; + } + + /** + * Get supported option names from a metadata object. + * + * @param object $metadata Model metadata. + * @return array + */ + private function get_supported_option_names_from_metadata( object $metadata ): array { + if ( ! method_exists( $metadata, 'getSupportedOptions' ) ) { + return []; + } + + $supported_options = $metadata->getSupportedOptions(); + if ( ! is_array( $supported_options ) ) { + return []; + } + + $option_names = []; + foreach ( $supported_options as $supported_option ) { + if ( ! is_object( $supported_option ) || ! method_exists( $supported_option, 'getName' ) ) { + continue; + } + + $option_name = $this->get_metadata_option_value( $supported_option->getName() ); + if ( '' !== $option_name ) { + $option_names[] = $option_name; + } + } + + return array_values( array_unique( $option_names ) ); + } } diff --git a/includes/rest/class-settings-controller.php b/includes/rest/class-settings-controller.php index 7c52cb8..df1dccd 100644 --- a/includes/rest/class-settings-controller.php +++ b/includes/rest/class-settings-controller.php @@ -10,6 +10,7 @@ namespace ClawPress\RestAPI\Controllers; use ClawPress\Helpers\Model_Helper; +use ClawPress\Helpers\Model_Option_Helper; use ClawPress\Helpers\Provider_Helper; use ClawPress\Helpers\Settings_Helper; @@ -33,6 +34,13 @@ final class Settings_Controller implements Route_Controller { */ private Model_Helper $model_helper; + /** + * Model option helper. + * + * @var Model_Option_Helper + */ + private Model_Option_Helper $model_option_helper; + /** * Provider helper. * @@ -44,9 +52,10 @@ final class Settings_Controller implements Route_Controller { * Constructor. */ public function __construct() { - $this->settings_helper = Settings_Helper::get_instance(); - $this->model_helper = Model_Helper::get_instance(); - $this->provider_helper = Provider_Helper::get_instance(); + $this->settings_helper = Settings_Helper::get_instance(); + $this->model_helper = Model_Helper::get_instance(); + $this->model_option_helper = Model_Option_Helper::get_instance(); + $this->provider_helper = Provider_Helper::get_instance(); } /** @@ -151,13 +160,18 @@ public function register_routes(): void { */ public function get_settings(): \WP_REST_Response { $settings = $this->settings_helper->get_settings(); + $provider = isset( $settings['provider'] ) ? clawpress_sanitize_provider( $settings['provider'] ) : ''; + $model = isset( $settings['model'] ) && is_string( $settings['model'] ) ? trim( $settings['model'] ) : ''; return new \WP_REST_Response( [ - 'settings' => $settings, - 'providers' => $this->provider_helper->get_provider_options(), - 'models' => $this->model_helper->get_all_discovered_options(), - 'model_catalog' => $this->model_helper->get_model_catalog(), + 'settings' => $settings, + 'providers' => $this->provider_helper->get_provider_options(), + 'models' => $this->model_helper->get_all_discovered_options(), + 'model_catalog' => $this->model_helper->get_model_catalog(), + 'model_option_summary' => '' !== $provider && '' !== $model + ? $this->model_option_helper->get_generation_option_summary( $provider, $model ) + : null, ], 200 ); diff --git a/src/js/admin/components/views/SettingsView.js b/src/js/admin/components/views/SettingsView.js index dcbdd74..e289f53 100644 --- a/src/js/admin/components/views/SettingsView.js +++ b/src/js/admin/components/views/SettingsView.js @@ -39,6 +39,15 @@ const normalizeModelKey = ( value ) => .replace( /[^a-z0-9]/g, '' ) : ''; +const normalizeStringArray = ( value ) => + Array.isArray( value ) + ? value + .map( ( item ) => + typeof item === 'string' ? item.trim() : '' + ) + .filter( Boolean ) + : []; + const normalizeDiscoveredProviderModelOptions = ( options ) => { if ( ! Array.isArray( options ) ) { return []; @@ -60,6 +69,18 @@ const normalizeDiscoveredProviderModelOptions = ( options ) => { return { id, label: label || id, + supported_options: normalizeStringArray( + option?.supported_options + ), + unsupported_generation_options: normalizeStringArray( + option?.unsupported_generation_options + ), + unsupported_generation_option_labels: normalizeStringArray( + option?.unsupported_generation_option_labels + ), + learned_unsupported_options: normalizeStringArray( + option?.learned_unsupported_options + ), }; } ) .filter( Boolean ); @@ -275,6 +296,68 @@ const normalizeModelOptions = ( models ) => { ); }; +const normalizeModelOptionSummary = ( summary ) => { + if ( + ! summary || + typeof summary !== 'object' || + Array.isArray( summary ) + ) { + return null; + } + + return { + supported_options: normalizeStringArray( summary.supported_options ), + unsupported_generation_options: normalizeStringArray( + summary.unsupported_generation_options + ), + unsupported_generation_option_labels: normalizeStringArray( + summary.unsupported_generation_option_labels + ), + learned_unsupported_options: normalizeStringArray( + summary.learned_unsupported_options + ), + }; +}; + +const mergeSelectedModelOptionSummary = ( + modelsByProvider, + provider, + model, + summary +) => { + const providerId = normalizeProviderId( provider ); + const modelId = typeof model === 'string' ? model.trim() : ''; + const normalizedSummary = normalizeModelOptionSummary( summary ); + + if ( ! providerId || ! modelId || ! normalizedSummary ) { + return modelsByProvider; + } + + const providerModels = Array.isArray( modelsByProvider?.[ providerId ] ) + ? modelsByProvider[ providerId ] + : []; + const existingIndex = providerModels.findIndex( + ( option ) => option.id === modelId + ); + const nextOption = { + ...( existingIndex >= 0 + ? providerModels[ existingIndex ] + : { id: modelId, label: modelId } ), + ...normalizedSummary, + }; + const nextProviderModels = + existingIndex >= 0 + ? providerModels.map( ( option, index ) => + index === existingIndex ? nextOption : option + ) + : [ nextOption, ...providerModels ]; + + return { + ...modelsByProvider, + [ providerId ]: nextProviderModels, + }; +}; + const normalizeModelCatalog = ( modelCatalog ) => { if ( ! modelCatalog || @@ -481,7 +564,12 @@ export default function SettingsView() { normalizeProviderOptions( data?.providers || [] ) ); setDiscoveredModelOptionsByProvider( - normalizeModelOptions( data?.models || {} ) + mergeSelectedModelOptionSummary( + normalizeModelOptions( data?.models || {} ), + data?.settings?.provider, + data?.settings?.model, + data?.model_option_summary + ) ); setModelCatalogByProvider( normalizeModelCatalog( data?.model_catalog || {} ) @@ -637,7 +725,7 @@ export default function SettingsView() { return discoveredModelOptionsByProvider[ selectedProviderId ]; }, [ selectedProviderId, discoveredModelOptionsByProvider ] ); - const selectedModelOption = useMemo( () => { + const selectedProviderModelOption = useMemo( () => { const selectedModelId = typeof settings.model === 'string' ? settings.model.trim() : ''; @@ -645,11 +733,21 @@ export default function SettingsView() { return null; } - if ( - providerModelOptions.some( + return ( + providerModelOptions.find( ( option ) => option.id === selectedModelId - ) - ) { + ) || null + ); + }, [ providerModelOptions, settings.model ] ); + const selectedModelOption = useMemo( () => { + const selectedModelId = + typeof settings.model === 'string' ? settings.model.trim() : ''; + + if ( ! selectedModelId ) { + return null; + } + + if ( selectedProviderModelOption ) { return null; } @@ -657,7 +755,7 @@ export default function SettingsView() { id: selectedModelId, label: selectedModelId, }; - }, [ providerModelOptions, settings.model ] ); + }, [ selectedProviderModelOption, settings.model ] ); useEffect( () => { if ( ! selectedProviderId ) { @@ -708,6 +806,9 @@ export default function SettingsView() { if ( modelDescriptionState.modelId ) { const modelContext = modelDescriptionState.selectedEntry?.context || ''; const modelCost = modelDescriptionState.selectedEntry?.cost || ''; + const skippedSettingLabels = + selectedProviderModelOption?.unsupported_generation_option_labels || + []; modelDescription = ( @@ -726,6 +827,13 @@ export default function SettingsView() { { modelCost } ) : null } + { skippedSettingLabels.length > 0 ? ( + + { ' ' } + { __( 'Skipped Settings :', 'clawpress' ) }{ ' ' } + { skippedSettingLabels.join( ', ' ) } + + ) : null } ); } diff --git a/src/js/admin/style.scss b/src/js/admin/style.scss index 8fe4822..f331e66 100644 --- a/src/js/admin/style.scss +++ b/src/js/admin/style.scss @@ -14,6 +14,11 @@ color: #50575e; } +.clawpress-settings__model-skipped { + display: inline-block; + margin-top: 4px; +} + .clawpress-abilities__header { display: flex; align-items: baseline; diff --git a/tests/Support/AiClientStubs.php b/tests/Support/AiClientStubs.php index af850a4..bbe7b1a 100644 --- a/tests/Support/AiClientStubs.php +++ b/tests/Support/AiClientStubs.php @@ -523,7 +523,7 @@ public function getProviderModel( string $provider, string $model, \WordPress\Ai $registered_models = \ClawPress\Tests\Support\WordPress_Stubs::$ai_provider_models[ $provider ] ?? []; $metadata = $registered_models[ $model ] ?? null; if ( ! $metadata instanceof \WordPress\AiClient\Providers\Models\DTO\ModelMetadata ) { - $metadata = new \WordPress\AiClient\Providers\Models\DTO\ModelMetadata( $model, $model ); + throw new \RuntimeException( 'Model metadata is not registered.' ); } return new class( $metadata ) { From 3196e55619a9843b77de6bc2577f98cc056ff8f4 Mon Sep 17 00:00:00 2001 From: Brad Vincent Date: Thu, 7 May 2026 13:58:57 +0100 Subject: [PATCH 5/9] Keep skipped settings visible --- build/scripts/admin.asset.php | 2 +- build/scripts/admin.js | 2 +- src/js/admin/components/views/SettingsView.js | 80 ++++++++++++++++++- 3 files changed, 78 insertions(+), 6 deletions(-) diff --git a/build/scripts/admin.asset.php b/build/scripts/admin.asset.php index 8fe9dd2..a46558a 100644 --- a/build/scripts/admin.asset.php +++ b/build/scripts/admin.asset.php @@ -1 +1 @@ - array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-core-data', 'wp-data', 'wp-date', 'wp-dom-ready', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-primitives'), 'version' => 'a6160f9fb1b0468ff485'); + array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-core-data', 'wp-data', 'wp-date', 'wp-dom-ready', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-primitives'), 'version' => '3bfc9b73efb34729fa19'); diff --git a/build/scripts/admin.js b/build/scripts/admin.js index bc02780..d15dc2e 100644 --- a/build/scripts/admin.js +++ b/build/scripts/admin.js @@ -181,4 +181,4 @@ label:(0,a.__)("Not on"),filterText:(c,l)=>eB((0,a.sprintf)( /* translators: %d: Number of fields that need attention */ /* translators: %d: Number of fields that need attention */ (0,a._n)("%d field needs attention","%d fields need attention",Z),Z)}):null,R={blockStart:"medium",blockEnd:"medium",inlineStart:"medium",inlineEnd:"medium"};if(l.children){const t=!!l.label&&n.withHeader,b={blockStart:t?"none":"medium",blockEnd:"medium",inlineStart:"medium",inlineEnd:"medium"};return(0,m.jsxs)(wC,{className:"dataforms-layouts-card__field",size:R,children:[t&&(0,m.jsxs)(u,{className:"dataforms-layouts-card__field-header",children:[(0,m.jsx)("span",{className:"dataforms-layouts-card__field-header-label",children:l.label}),H,g.length>0&&n.withHeader&&(0,m.jsx)("div",{className:"dataforms-layouts-card__field-summary",children:g.map(l=>(0,m.jsx)(l.render,{item:c,field:l},l.id))})]}),(i||!t)&&(0,m.jsxs)(_C,{size:b,className:"dataforms-layouts-card__field-control",ref:X,onBlur:s,children:[l.description&&(0,m.jsx)("div",{className:"dataforms-layouts-card__field-description",children:l.description}),(0,m.jsx)(uA,{data:c,form:G,onChange:e,validity:d?.children})]})]})}const I=b.find(c=>c.id===l.id);if(!I||!I.Edit)return null;const r=iA("regular")?.component;if(!r)return null;const B=!!I.label&&n.withHeader,y={blockStart:B?"none":"medium",blockEnd:"medium",inlineStart:"medium",inlineEnd:"medium"};return(0,m.jsxs)(wC,{className:"dataforms-layouts-card__field",size:R,children:[B&&(0,m.jsxs)(u,{className:"dataforms-layouts-card__field-header",children:[(0,m.jsx)("span",{className:"dataforms-layouts-card__field-header-label",children:I.label}),H,g.length>0&&n.withHeader&&(0,m.jsx)("div",{className:"dataforms-layouts-card__field-summary",children:g.map(l=>(0,m.jsx)(l.render,{item:c,field:l},l.id))})]}),(i||!B)&&(0,m.jsx)(_C,{size:y,className:"dataforms-layouts-card__field-control",ref:X,onBlur:s,children:(0,m.jsx)(r,{data:c,field:l,onChange:e,hideLabelFromVision:t||B,validity:d})})]})},wrapper:({children:c})=>(0,m.jsx)(xy,{direction:"column",className:"dataforms-layouts__wrapper",gap:"lg",children:c})},{type:"row",component:function({data:c,field:l,onChange:e,hideLabelFromVision:t,validity:d}){const b=l.layout;if(l.children){const n={layout:Qw,fields:l.children};return(0,m.jsxs)("div",{className:"dataforms-layouts-row__field",children:[!t&&l.label&&(0,m.jsx)(nA,{title:l.label}),(0,m.jsx)(xy,{direction:"row",align:b.alignment,gap:"md",children:(0,m.jsx)(uA,{data:c,form:n,onChange:e,validity:d?.children,as:XA,children:(l,d,n)=>(0,m.jsx)("div",{className:"dataforms-layouts-row__field-control",style:b.styles[d.id],children:(0,m.jsx)(l,{data:c,field:d,onChange:e,hideLabelFromVision:t,validity:n})},d.id)})})]})}const n=iA("regular")?.component;return n?(0,m.jsx)(m.Fragment,{children:(0,m.jsx)("div",{className:"dataforms-layouts-row__field-control",children:(0,m.jsx)(n,{data:c,field:l,onChange:e,validity:d})})}):null},wrapper:({children:c,layout:l})=>(0,m.jsx)(xy,{direction:"column",className:"dataforms-layouts__wrapper",gap:"md",children:(0,m.jsx)("div",{className:"dataforms-layouts-row__field",children:(0,m.jsx)(xy,{direction:"row",gap:"md",align:l.alignment,children:c})})})},{type:"details",component:function({data:c,field:l,onChange:e}){const{fields:t}=(0,W.useContext)(Aw),d=(0,W.useMemo)(()=>({layout:Qw,fields:l.children??[]}),[l]);if(!l.children)return null;const b=l.layout.summary??"",n=b?t.find(c=>c.id===b):void 0;let X;return X=n&&n.render?(0,m.jsx)(n.render,{item:c,field:n}):l.label||(0,a.__)("More details"),(0,m.jsxs)("details",{className:"dataforms-layouts-details__details",children:[(0,m.jsx)("summary",{className:"dataforms-layouts-details__summary",children:X}),(0,m.jsx)("div",{className:"dataforms-layouts-details__content",children:(0,m.jsx)(uA,{data:c,form:d,onChange:e})})]})}}];function iA(c){return GA.find(l=>l.type===c)}var aA=({children:c})=>(0,m.jsx)(xy,{direction:"column",className:"dataforms-layouts__wrapper",gap:"md",children:c});function uA({data:c,form:l,onChange:e,validity:t,children:d,as:b}){const{fields:n}=(0,W.useContext)(Aw),X=b??iA(l.layout.type)?.wrapper??aA;return(0,m.jsx)(X,{layout:l.layout,children:l.fields.map(l=>{const b=iA(l.layout.type)?.component;if(!b)return null;const X=l.children?void 0:(G=l,n.find(c=>c.id===G.id));var G;return X&&X.isVisible&&!X.isVisible(c)?null:d?d(b,l,t?.[l.id]):(0,m.jsx)(b,{data:c,field:l,onChange:e,validity:t?.[l.id]},l.id)})})}function xA({data:c,form:l,fields:e,onChange:t,validity:d}){const b=(0,W.useMemo)(()=>Uw(l),[l]),n=(0,W.useMemo)(()=>Bw(e),[e]);return l.fields?(0,m.jsx)(ww,{fields:n,children:(0,m.jsx)(uA,{data:c,form:b,onChange:t,validity:d})}):null}const oA=window.wp.coreData,sA=window.wp.primitives;var gA=(0,m.jsx)(sA.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,m.jsx)(sA.Path,{d:"M19.5 4.5h-7V6h4.44l-5.97 5.97 1.06 1.06L18 7.06v4.44h1.5v-7Zm-13 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-3H17v3a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h3V5.5h-3Z"})}),mA=(0,m.jsx)(sA.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,m.jsx)(sA.Path,{d:"m19 7-3-3-8.5 8.5-1 4 4-1L19 7Zm-7 11.5H5V20h7v-1.5Z"})}),ZA=(0,m.jsx)(sA.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,m.jsx)(sA.Path,{fillRule:"evenodd",clipRule:"evenodd",d:"M12 5.5A2.25 2.25 0 0 0 9.878 7h4.244A2.251 2.251 0 0 0 12 5.5ZM12 4a3.751 3.751 0 0 0-3.675 3H5v1.5h1.27l.818 8.997a2.75 2.75 0 0 0 2.739 2.501h4.347a2.75 2.75 0 0 0 2.738-2.5L17.73 8.5H19V7h-3.325A3.751 3.751 0 0 0 12 4Zm4.224 4.5H7.776l.806 8.861a1.25 1.25 0 0 0 1.245 1.137h4.347a1.25 1.25 0 0 0 1.245-1.137l.805-8.861Z"})});const HA=[{id:"title",label:(0,a.__)("Title","clawpress"),type:"text",enableHiding:!1,enableSorting:!0,enableGlobalSearch:!0,getValue:({item:c})=>c.title?.rendered||"",render:({item:c})=>(0,m.jsx)("a",{href:c.link,target:"_blank",rel:"noopener noreferrer",children:c.title?.rendered||(0,a.__)("(no title)","clawpress")})},{id:"status",label:(0,a.__)("Status","clawpress"),type:"text",enableHiding:!0,enableSorting:!1,getValue:({item:c})=>c.status,render:({item:c})=>{const l={publish:(0,a.__)("Published","clawpress"),draft:(0,a.__)("Draft","clawpress"),pending:(0,a.__)("Pending","clawpress"),private:(0,a.__)("Private","clawpress"),trash:(0,a.__)("Trash","clawpress")};return(0,m.jsx)("span",{className:`status-badge status-${c.status}`,children:l[c.status]||c.status})}},{id:"date",label:(0,a.__)("Date","clawpress"),type:"text",enableHiding:!0,enableSorting:!0,getValue:({item:c})=>c.date,render:({item:c})=>new Date(c.date).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})},{id:"modified",label:(0,a.__)("Modified","clawpress"),type:"text",enableHiding:!0,enableSorting:!1,getValue:({item:c})=>c.modified,render:({item:c})=>new Date(c.modified).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}];function RA(){const[c,l]=(0,G.useState)({type:"table",perPage:10,page:1,sort:{field:"date",direction:"desc"},search:"",filters:[],fields:["title","status","date"]}),{records:e,total:t,totalPages:d,isLoading:b}=function(c){const{records:l,totalItems:e,totalPages:t,isResolving:d,hasResolved:b}=(0,oA.useEntityRecords)("postType","clawpress_agent_file",{per_page:c.perPage,page:c.page,orderby:"title"===c.sort?.field?"title":"date",order:c.sort?.direction||"desc",search:c.search||void 0,status:"any"});return{records:l||[],total:e||0,totalPages:t||0,isLoading:d,hasResolved:b}}(c);return(0,m.jsxs)("div",{className:"clawpress-dataviews",children:[(0,m.jsx)("p",{children:(0,a.__)("Showing ClawPress Agent Files.","clawpress")}),(0,m.jsx)(Fw,{data:e,fields:HA,view:c,onChangeView:l,actions:[{id:"view",label:(0,a.__)("View","clawpress"),icon:gA,callback:c=>{window.open(c[0].link,"_blank")}},{id:"edit",label:(0,a.__)("Edit","clawpress"),icon:mA,callback:c=>{window.location.href=`/wp-admin/post.php?post=${c[0].id}&action=edit`}},{id:"trash",label:(0,a.__)("Move to Trash","clawpress"),icon:ZA,isDestructive:!0,supportsBulk:!0,RenderModal:({items:c,closeModal:l})=>{const{deleteEntityRecord:e}=(0,rW.useDispatch)(oA.store);return(0,m.jsxs)("div",{children:[(0,m.jsx)("p",{children:1===c.length?(0,a.__)("Move this agent file to trash?","clawpress"):(0,a.sprintf)(/* translators: %d: number of agent files */ /* translators: %d: number of agent files */ -(0,a.__)("Move %d agent files to trash?","clawpress"),c.length)}),(0,m.jsxs)(i.Flex,{justify:"flex-end",gap:2,children:[(0,m.jsx)(i.Button,{variant:"secondary",onClick:l,children:(0,a.__)("Cancel","clawpress")}),(0,m.jsx)(i.Button,{variant:"primary",isDestructive:!0,onClick:async()=>{for(const l of c)await e("postType","clawpress_agent_file",l.id);l()},children:(0,a.__)("Move to Trash","clawpress")})]})]})}}],paginationInfo:{totalItems:t,totalPages:d},isLoading:b,getItemId:c=>c.id,defaultLayouts:{table:{},grid:{}},search:!0})]})}var IA=(0,m.jsx)(sA.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,m.jsx)(sA.Path,{d:"m11.3 17.2-5-5c-.1-.1-.1-.3 0-.4l2.3-2.3-1.1-1-2.3 2.3c-.7.7-.7 1.8 0 2.5l5 5H7.5v1.5h5.3v-5.2h-1.5v2.6zm7.5-6.4-5-5h2.7V4.2h-5.2v5.2h1.5V6.8l5 5c.1.1.1.3 0 .4l-2.3 2.3 1.1 1.1 2.3-2.3c.6-.7.6-1.9-.1-2.5z"})});const rA={provider:"",model:"",temperature:.2,top_p:.9,max_output_tokens:1200,frequency_penalty:.2,presence_penalty:0,request_timeout:45,agent_user_id:0,memory_enabled:!1,setup_completed:!1},WA="clawpress_wp_ai_provider_models_v1",BA=c=>"string"==typeof c?c.trim().toLowerCase():"",yA=c=>"string"==typeof c?c.trim().toLowerCase().replace(/[^a-z0-9]/g,""):"",pA=c=>Array.isArray(c)?c.map(c=>"string"==typeof c?c.trim():"").filter(Boolean):[],hA=c=>Array.isArray(c)?c.map(c=>{const l="string"==typeof c?.id?c.id.trim():"";let e="";return"string"==typeof c?.label?e=c.label.trim():"string"==typeof c?.name&&(e=c.name.trim()),l?{id:l,label:e||l,supported_options:pA(c?.supported_options),unsupported_generation_options:pA(c?.unsupported_generation_options),unsupported_generation_option_labels:pA(c?.unsupported_generation_option_labels),learned_unsupported_options:pA(c?.learned_unsupported_options)}:null}).filter(Boolean):[],VA=()=>[{value:"openai",label:(0,a.__)("OpenAI","clawpress")},{value:"anthropic",label:(0,a.__)("Anthropic","clawpress")},{value:"google",label:(0,a.__)("Google","clawpress")}],YA=()=>{if("undefined"==typeof window||!window.localStorage)return{};try{const c=window.localStorage.getItem(WA);if(!c)return{};const l=JSON.parse(c);return l&&"object"==typeof l&&!Array.isArray(l)?l:{}}catch{return{}}},JA=c=>{if("undefined"!=typeof window&&window.localStorage)try{window.localStorage.setItem(WA,JSON.stringify(c))}catch{}},FA=(c,l,e)=>c.filter(c=>{const t=yA(e(c));return t&&l&&(l.startsWith(t)||t.startsWith(l))}).sort((c,l)=>yA(e(l)).length-yA(e(c)).length)[0]||null;function CA(){const[c,l]=(0,G.useState)(!0),[e,t]=(0,G.useState)(!1),[d,b]=(0,G.useState)(""),[n,X]=(0,G.useState)(""),[u,x]=(0,G.useState)(rA),[o,s]=(0,G.useState)(VA()),[Z,H]=(0,G.useState)({}),[R,I]=(0,G.useState)({}),[r,W]=(0,G.useState)({});(0,G.useEffect)(()=>{let c=!0;return(async()=>{l(!0),b("");try{const l=await g("settings");if(!c)return;x(((c={})=>({provider:"string"==typeof c.provider?c.provider:"",model:"string"==typeof c.model?c.model:"",temperature:Number.isFinite(Number(c.temperature))?Number(c.temperature):.2,top_p:Number.isFinite(Number(c.top_p))?Number(c.top_p):.9,max_output_tokens:Number.isFinite(Number(c.max_output_tokens))&&Number(c.max_output_tokens)>0?Number(c.max_output_tokens):1200,frequency_penalty:Number.isFinite(Number(c.frequency_penalty))?Number(c.frequency_penalty):.2,presence_penalty:Number.isFinite(Number(c.presence_penalty))?Number(c.presence_penalty):0,request_timeout:Number.isFinite(Number(c.request_timeout))&&Number(c.request_timeout)>0?Number(c.request_timeout):45,agent_user_id:Number.isFinite(Number(c.agent_user_id))?Number(c.agent_user_id):0,memory_enabled:Boolean(c.memory_enabled),setup_completed:Boolean(c.setup_completed)}))(l?.settings||{})),s((c=>{if(!Array.isArray(c))return VA();const l=c.map(c=>{const l=BA(c?.value),e="string"==typeof c?.label?c.label.trim():"";return l&&e?{value:l,label:e}:null}).filter(Boolean);return l.length>0?l:VA()})(l?.providers||[])),H(((c,l,e,t)=>{const d=BA(l),b="string"==typeof e?e.trim():"",n=(c=>!c||"object"!=typeof c||Array.isArray(c)?null:{supported_options:pA(c.supported_options),unsupported_generation_options:pA(c.unsupported_generation_options),unsupported_generation_option_labels:pA(c.unsupported_generation_option_labels),learned_unsupported_options:pA(c.learned_unsupported_options)})(t);if(!d||!b||!n)return c;const X=Array.isArray(c?.[d])?c[d]:[],G=X.findIndex(c=>c.id===b),i={...G>=0?X[G]:{id:b,label:b},...n},a=G>=0?X.map((c,l)=>l===G?i:c):[i,...X];return{...c,[d]:a}})(!(t=l?.models||{})||"object"!=typeof t||Array.isArray(t)?{}:Object.entries(t).reduce((c,[l,e])=>{const t=BA(l);return t&&Array.isArray(e)?(c[t]=hA(e),c):c},{}),l?.settings?.provider,l?.settings?.model,l?.model_option_summary)),I(!(e=l?.model_catalog||{})||"object"!=typeof e||Array.isArray(e)?{}:Object.entries(e).reduce((c,[l,e])=>{const t=BA(l);if(!t||!Array.isArray(e))return c;const d=e.map(c=>{const l="string"==typeof c?.id?c.id.trim():"",e="string"==typeof c?.label?c.label.trim():"",t="string"==typeof c?.context?c.context.trim():"",d="string"==typeof c?.cost?c.cost.trim():"";return l?{id:l,label:e||l,context:t,cost:d}:null}).filter(Boolean);return d.length>0&&(c[t]=d),c},{}))}catch(l){if(!c)return;b(l?.message||(0,a.__)("Unable to load settings.","clawpress"))}finally{c&&l(!1)}var e,t})(),()=>{c=!1}},[]);const B=(0,G.useCallback)(async(c,{forceRefresh:l=!1}={})=>{const e=BA(c);if(!e)return[];if(!l){const c=(c=>{const l=BA(c);if(!l)return{hasValue:!1,options:[]};const e=YA()[l];return Array.isArray(e)?{hasValue:!0,options:hA(e)}:e&&"object"==typeof e&&Array.isArray(e.models)?{hasValue:!0,options:hA(e.models)}:{hasValue:!1,options:[]}})(e);if(c.hasValue)return H(l=>({...l,[e]:c.options})),c.options}W(c=>({...c,[e]:!0}));try{const c=await(async c=>{const l=BA(c);if(!l)return[];const e=await g(`providers/${encodeURIComponent(l)}/models`);return Array.isArray(e)?hA(e):[]})(e);return H(l=>({...l,[e]:c})),((c,l)=>{const e=BA(c);if(!e)return;const t=YA();t[e]={cached_at:Date.now(),models:hA(l)},JA(t)})(e,c),c}catch{return b((0,a.__)("Unable to refresh models for the selected provider.","clawpress")),[]}finally{W(c=>({...c,[e]:!1}))}},[]),y=BA(u.provider),p=Boolean(r?.[y]),h=(0,G.useMemo)(()=>Array.isArray(Z?.[y])?Z[y]:[],[y,Z]),V=(0,G.useMemo)(()=>{const c="string"==typeof u.model?u.model.trim():"";return c&&h.find(l=>l.id===c)||null},[h,u.model]),Y=(0,G.useMemo)(()=>{const c="string"==typeof u.model?u.model.trim():"";return c?V?null:{id:c,label:c}:null},[V,u.model]);(0,G.useEffect)(()=>{y&&B(y)},[y,B]);const J=(0,G.useMemo)(()=>[{label:(0,a.__)("Select a model","clawpress"),value:""},...Y?[{label:Y.label,value:Y.id}]:[],...h.map(c=>({label:c.label,value:c.id}))],[h,Y]),F=((c,l,e,t)=>{const d="string"==typeof l?l.trim():"";if(!d)return{selectedEntry:null,modelId:d};const b=BA(c),n=b&&Array.isArray(e?.[b])?e[b]:[],X=Array.isArray(t?.[b])?t[b]:[],G=n.find(c=>c.id===d)||null;return{selectedEntry:((c,l,e="")=>{if(!Array.isArray(c)||0===c.length)return null;const t="string"==typeof l?l.trim():"",d=c.find(c=>c.id===t)||null;if(d)return d;const b=yA(t),n=c.find(c=>yA(c.id)===b)||null;if(n)return n;const X=FA(c,b,c=>c.id);if(X)return X;const G=yA(e);return G?c.find(c=>yA(c.label)===G)||FA(c,G,c=>c.label):null})(X,d,G?.label||"")||null,modelId:d}})(u.provider,u.model,Z,R);let C=null;if(F.modelId){const c=F.selectedEntry?.context||"",l=F.selectedEntry?.cost||"",e=V?.unsupported_generation_option_labels||[];C=(0,m.jsxs)("span",{className:"clawpress-settings__model-meta",children:[(0,m.jsx)("code",{children:F.modelId}),c?(0,m.jsxs)(m.Fragment,{children:[" ",(0,a.__)("Context Size :","clawpress")," ",(0,m.jsx)("code",{children:c})]}):null,l?(0,m.jsxs)(m.Fragment,{children:[" ",(0,a.__)("Cost :","clawpress")," ",(0,m.jsx)("code",{children:l})]}):null,e.length>0?(0,m.jsxs)("span",{className:"clawpress-settings__model-skipped",children:[" ",(0,a.__)("Skipped Settings :","clawpress")," ",(0,m.jsx)("code",{children:e.join(", ")})]}):null]})}const v=[{id:"provider",type:"text",label:(0,a.__)("Provider","clawpress"),description:(0,a.__)("Choose which AI service ClawPress should use.","clawpress"),Edit:"select",elements:[{label:(0,a.__)("Select a provider","clawpress"),value:""},...o]},{id:"model",type:"text",label:(0,a.__)("Model","clawpress"),description:C,Edit:"select",elements:J},{id:"temperature",type:"number",label:(0,a.__)("Temperature","clawpress"),description:(0,a.__)("Lower values make replies more focused and consistent. Higher values make replies more creative and varied.","clawpress")},{id:"top_p",type:"number",label:(0,a.__)("Top P","clawpress"),description:(0,a.__)("Lower values keep replies more predictable. Higher values allow more variety in wording and ideas.","clawpress")},{id:"max_output_tokens",type:"integer",label:(0,a.__)("Max Output Tokens","clawpress"),description:(0,a.__)("Sets the maximum reply length. Higher values allow longer answers; lower values keep answers shorter.","clawpress")},{id:"frequency_penalty",type:"number",label:(0,a.__)("Frequency Penalty","clawpress"),description:(0,a.__)("Higher values reduce repeated words and phrases. Lower values allow more repetition.","clawpress")},{id:"presence_penalty",type:"number",label:(0,a.__)("Presence Penalty","clawpress"),description:(0,a.__)("Higher values encourage fresh ideas. Lower values keep replies closer to what has already been said.","clawpress")},{id:"request_timeout",type:"integer",label:(0,a.__)("Request Timeout (seconds)","clawpress"),description:(0,a.__)("How long ClawPress waits for a reply before stopping the request.","clawpress")},{id:"agent_user_id",type:"integer",label:(0,a.__)("Agent User ID","clawpress"),description:(0,a.__)("Use 0 if this is not configured yet.","clawpress")},{id:"memory_enabled",type:"boolean",label:(0,a.__)("Enable Memory","clawpress"),description:(0,a.__)("When enabled, ClawPress can remember useful details from earlier chats.","clawpress"),Edit:"toggle"},{id:"setup_completed",type:"boolean",label:(0,a.__)("Setup Completed","clawpress"),description:(0,a.__)("Turn this on after you finish the initial setup.","clawpress"),Edit:"toggle"}],N={layout:{type:"regular",labelPosition:"top"},fields:["provider","model","request_timeout","agent_user_id","memory_enabled","setup_completed",{id:"generation_settings",label:(0,a.__)("LLM Reply Settings","clawpress"),description:(0,a.__)("Not all settings are supported by every provider or model. Unsupported settings are skipped automatically.","clawpress"),layout:{type:"card",isOpened:!0,withHeader:!0},children:["temperature","top_p","max_output_tokens","frequency_penalty","presence_penalty"]}]};return(0,m.jsx)("div",{className:"clawpress-settings",children:(0,m.jsxs)(i.Card,{children:[(0,m.jsx)(i.CardHeader,{children:(0,m.jsx)("h3",{children:(0,a.__)("Settings","clawpress")})}),(0,m.jsxs)(i.CardBody,{children:[d?(0,m.jsx)(i.Notice,{status:"error",isDismissible:!1,children:d}):null,n?(0,m.jsx)(i.Notice,{status:"success",isDismissible:!1,children:n}):null,c?(0,m.jsx)(i.Spinner,{}):(0,m.jsxs)("div",{children:[(0,m.jsx)(xA,{data:u,fields:v,form:N,onChange:c=>x(l=>{const e={...l,...c};if(Object.prototype.hasOwnProperty.call(c,"provider")){const c=BA(e.provider);(Array.isArray(Z?.[c])?Z[c]:[]).some(c=>c.id===e.model)||(e.model="")}return e})}),(0,m.jsxs)("div",{className:"clawpress-settings__actions",children:[(0,m.jsx)(i.Button,{className:"clawpress-settings__save-button",variant:"primary",onClick:async()=>{t(!0),b(""),X("");try{await g("settings",{method:"POST",body:{provider:u.provider,model:u.model,temperature:Number.isFinite(Number(u.temperature))?Number(u.temperature):.2,top_p:Number.isFinite(Number(u.top_p))?Number(u.top_p):.9,max_output_tokens:Number.isFinite(Number(u.max_output_tokens))&&Number(u.max_output_tokens)>0?Number(u.max_output_tokens):1200,frequency_penalty:Number.isFinite(Number(u.frequency_penalty))?Number(u.frequency_penalty):.2,presence_penalty:Number.isFinite(Number(u.presence_penalty))?Number(u.presence_penalty):0,request_timeout:Number.isFinite(Number(u.request_timeout))&&Number(u.request_timeout)>0?Number(u.request_timeout):45,agent_user_id:Number.isFinite(Number(u.agent_user_id))&&Number(u.agent_user_id)>0?Number(u.agent_user_id):0,memory_enabled:Boolean(u.memory_enabled),setup_completed:Boolean(u.setup_completed)}}),X((0,a.__)("Settings saved.","clawpress"))}catch(c){b(c?.message||(0,a.__)("Unable to save settings.","clawpress"))}finally{t(!1)}},isBusy:e,disabled:e,children:e?(0,a.__)("Saving…","clawpress"):(0,a.__)("Save Settings","clawpress")}),(0,m.jsx)(i.Button,{className:"clawpress-settings__refresh-models-button",variant:"secondary",icon:IA,onClick:async()=>{y&&(b(""),(c=>{const l=BA(c);if(!l)return;const e=YA();delete e[l],JA(e)})(y),await B(y,{forceRefresh:!0}))},isBusy:p,disabled:!y||p||e,children:(0,a.__)("Refresh Models","clawpress")})]})]})]})]})})}function vA(){const{currentView:c,handleTabSelect:l,VIEWS:e}=s(),t=[{name:e.PAGES,title:(0,a.__)("Agent Files","clawpress"),content:(0,m.jsx)(RA,{})},{name:e.SETTINGS,title:(0,a.__)("Settings","clawpress"),content:(0,m.jsx)(CA,{})},{name:e.ABILITIES,title:(0,a.__)("Abilities","clawpress"),content:(0,m.jsx)(r,{})}];return(0,m.jsx)("div",{className:"clawpress-app",children:(0,m.jsx)(i.TabPanel,{tabs:t,initialTabName:c,onSelect:l,children:({content:c})=>(0,m.jsx)("div",{className:"clawpress-tab-content",children:c})})})}X()(()=>{const c=document.getElementById("clawpress-admin-root");c&&(0,G.createRoot)(c).render((0,m.jsx)(vA,{}))})},744(c){"use strict";var l=function(c){return function(c){return!!c&&"object"==typeof c}(c)&&!function(c){var l=Object.prototype.toString.call(c);return"[object RegExp]"===l||"[object Date]"===l||function(c){return c.$$typeof===e}(c)}(c)},e="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function t(c,l){return!1!==l.clone&&l.isMergeableObject(c)?X((e=c,Array.isArray(e)?[]:{}),c,l):c;var e}function d(c,l,e){return c.concat(l).map(function(c){return t(c,e)})}function b(c){return Object.keys(c).concat(function(c){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(c).filter(function(l){return Object.propertyIsEnumerable.call(c,l)}):[]}(c))}function n(c,l){try{return l in c}catch(c){return!1}}function X(c,e,G){(G=G||{}).arrayMerge=G.arrayMerge||d,G.isMergeableObject=G.isMergeableObject||l,G.cloneUnlessOtherwiseSpecified=t;var i=Array.isArray(e);return i===Array.isArray(c)?i?G.arrayMerge(c,e,G):function(c,l,e){var d={};return e.isMergeableObject(c)&&b(c).forEach(function(l){d[l]=t(c[l],e)}),b(l).forEach(function(b){(function(c,l){return n(c,l)&&!(Object.hasOwnProperty.call(c,l)&&Object.propertyIsEnumerable.call(c,l))})(c,b)||(n(c,b)&&e.isMergeableObject(l[b])?d[b]=function(c,l){if(!l.customMerge)return X;var e=l.customMerge(c);return"function"==typeof e?e:X}(b,e)(c[b],l[b],e):d[b]=t(l[b],e))}),d}(c,e,G):t(e,G)}X.all=function(c,l){if(!Array.isArray(c))throw new Error("first argument should be an array");return c.reduce(function(c,e){return X(c,e,l)},{})};var G=X;c.exports=G},252(c){"use strict";c.exports=function c(l,e){if(l===e)return!0;if(l&&e&&"object"==typeof l&&"object"==typeof e){if(l.constructor!==e.constructor)return!1;var t,d,b;if(Array.isArray(l)){if((t=l.length)!=e.length)return!1;for(d=t;0!==d--;)if(!c(l[d],e[d]))return!1;return!0}if(l instanceof Map&&e instanceof Map){if(l.size!==e.size)return!1;for(d of l.entries())if(!e.has(d[0]))return!1;for(d of l.entries())if(!c(d[1],e.get(d[0])))return!1;return!0}if(l instanceof Set&&e instanceof Set){if(l.size!==e.size)return!1;for(d of l.entries())if(!e.has(d[0]))return!1;return!0}if(ArrayBuffer.isView(l)&&ArrayBuffer.isView(e)){if((t=l.length)!=e.length)return!1;for(d=t;0!==d--;)if(l[d]!==e[d])return!1;return!0}if(l.constructor===RegExp)return l.source===e.source&&l.flags===e.flags;if(l.valueOf!==Object.prototype.valueOf)return l.valueOf()===e.valueOf();if(l.toString!==Object.prototype.toString)return l.toString()===e.toString();if((t=(b=Object.keys(l)).length)!==Object.keys(e).length)return!1;for(d=t;0!==d--;)if(!Object.prototype.hasOwnProperty.call(e,b[d]))return!1;for(d=t;0!==d--;){var n=b[d];if(!c(l[n],e[n]))return!1}return!0}return l!=l&&e!=e}},542(c){c.exports=function(c){var l={};function e(t){if(l[t])return l[t].exports;var d=l[t]={exports:{},id:t,loaded:!1};return c[t].call(d.exports,d,d.exports,e),d.loaded=!0,d.exports}return e.m=c,e.c=l,e.p="",e(0)}([function(c,l,e){c.exports=e(1)},function(c,l,e){"use strict";Object.defineProperty(l,"__esModule",{value:!0});var t=e(2);Object.defineProperty(l,"combineChunks",{enumerable:!0,get:function(){return t.combineChunks}}),Object.defineProperty(l,"fillInChunks",{enumerable:!0,get:function(){return t.fillInChunks}}),Object.defineProperty(l,"findAll",{enumerable:!0,get:function(){return t.findAll}}),Object.defineProperty(l,"findChunks",{enumerable:!0,get:function(){return t.findChunks}})},function(c,l){"use strict";Object.defineProperty(l,"__esModule",{value:!0}),l.findAll=function(c){var l=c.autoEscape,b=c.caseSensitive,n=void 0!==b&&b,X=c.findChunks,G=void 0===X?t:X,i=c.sanitize,a=c.searchWords,u=c.textToHighlight;return d({chunksToHighlight:e({chunks:G({autoEscape:l,caseSensitive:n,sanitize:i,searchWords:a,textToHighlight:u})}),totalLength:u?u.length:0})};var e=l.combineChunks=function(c){var l=c.chunks;return l.sort(function(c,l){return c.start-l.start}).reduce(function(c,l){if(0===c.length)return[l];var e=c.pop();if(l.startG&&c.push({highlight:!1,start:G,end:i}),n.index===b.lastIndex&&b.lastIndex++}return c},[])};l.findChunks=t;var d=l.fillInChunks=function(c){var l=c.chunksToHighlight,e=c.totalLength,t=[],d=function(c,l,e){l-c>0&&t.push({start:c,end:l,highlight:e})};if(0===l.length)d(0,e,!1);else{var b=0;l.forEach(function(c){d(b,c.start,!1),d(c.start,c.end,!0),b=c.end}),d(b,e,!1)}return t};function b(c){return c}}])},146(c,l,e){"use strict";var t=e(363),d={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},b={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},n={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},X={};function G(c){return t.isMemo(c)?n:X[c.$$typeof]||d}X[t.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},X[t.Memo]=n;var i=Object.defineProperty,a=Object.getOwnPropertyNames,u=Object.getOwnPropertySymbols,x=Object.getOwnPropertyDescriptor,o=Object.getPrototypeOf,s=Object.prototype;c.exports=function c(l,e,t){if("string"!=typeof e){if(s){var d=o(e);d&&d!==s&&c(l,d,t)}var n=a(e);u&&(n=n.concat(u(e)));for(var X=G(l),g=G(e),m=0;m{if(!e){var n=1/0;for(a=0;a=d)&&Object.keys(b.O).every(c=>b.O[c](e[G]))?e.splice(G--,1):(X=!1,d0&&c[a-1][2]>d;a--)c[a]=c[a-1];c[a]=[e,t,d]},b.n=c=>{var l=c&&c.__esModule?()=>c.default:()=>c;return b.d(l,{a:l}),l},e=Object.getPrototypeOf?c=>Object.getPrototypeOf(c):c=>c.__proto__,b.t=function(c,t){if(1&t&&(c=this(c)),8&t)return c;if("object"==typeof c&&c){if(4&t&&c.__esModule)return c;if(16&t&&"function"==typeof c.then)return c}var d=Object.create(null);b.r(d);var n={};l=l||[null,e({}),e([]),e(e)];for(var X=2&t&&c;("object"==typeof X||"function"==typeof X)&&!~l.indexOf(X);X=e(X))Object.getOwnPropertyNames(X).forEach(l=>n[l]=()=>c[l]);return n.default=()=>c,b.d(d,n),d},b.d=(c,l)=>{for(var e in l)b.o(l,e)&&!b.o(c,e)&&Object.defineProperty(c,e,{enumerable:!0,get:l[e]})},b.o=(c,l)=>Object.prototype.hasOwnProperty.call(c,l),b.r=c=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(c,"__esModule",{value:!0})},(()=>{var c={884:0,15:0};b.O.j=l=>0===c[l];var l=(l,e)=>{var t,d,[n,X,G]=e,i=0;if(n.some(l=>0!==c[l])){for(t in X)b.o(X,t)&&(b.m[t]=X[t]);if(G)var a=G(b)}for(l&&l(e);ib(71));n=b.O(n)})(); \ No newline at end of file +(0,a.__)("Move %d agent files to trash?","clawpress"),c.length)}),(0,m.jsxs)(i.Flex,{justify:"flex-end",gap:2,children:[(0,m.jsx)(i.Button,{variant:"secondary",onClick:l,children:(0,a.__)("Cancel","clawpress")}),(0,m.jsx)(i.Button,{variant:"primary",isDestructive:!0,onClick:async()=>{for(const l of c)await e("postType","clawpress_agent_file",l.id);l()},children:(0,a.__)("Move to Trash","clawpress")})]})]})}}],paginationInfo:{totalItems:t,totalPages:d},isLoading:b,getItemId:c=>c.id,defaultLayouts:{table:{},grid:{}},search:!0})]})}var IA=(0,m.jsx)(sA.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:(0,m.jsx)(sA.Path,{d:"m11.3 17.2-5-5c-.1-.1-.1-.3 0-.4l2.3-2.3-1.1-1-2.3 2.3c-.7.7-.7 1.8 0 2.5l5 5H7.5v1.5h5.3v-5.2h-1.5v2.6zm7.5-6.4-5-5h2.7V4.2h-5.2v5.2h1.5V6.8l5 5c.1.1.1.3 0 .4l-2.3 2.3 1.1 1.1 2.3-2.3c.6-.7.6-1.9-.1-2.5z"})});const rA={provider:"",model:"",temperature:.2,top_p:.9,max_output_tokens:1200,frequency_penalty:.2,presence_penalty:0,request_timeout:45,agent_user_id:0,memory_enabled:!1,setup_completed:!1},WA="clawpress_wp_ai_provider_models_v1",BA=c=>"string"==typeof c?c.trim().toLowerCase():"",yA=c=>"string"==typeof c?c.trim().toLowerCase().replace(/[^a-z0-9]/g,""):"",pA=c=>Array.isArray(c)?c.map(c=>"string"==typeof c?c.trim():"").filter(Boolean):[],hA=c=>Array.isArray(c)?c.map(c=>{const l="string"==typeof c?.id?c.id.trim():"";let e="";return"string"==typeof c?.label?e=c.label.trim():"string"==typeof c?.name&&(e=c.name.trim()),l?{id:l,label:e||l,supported_options:pA(c?.supported_options),unsupported_generation_options:pA(c?.unsupported_generation_options),unsupported_generation_option_labels:pA(c?.unsupported_generation_option_labels),learned_unsupported_options:pA(c?.learned_unsupported_options)}:null}).filter(Boolean):[],VA=()=>[{value:"openai",label:(0,a.__)("OpenAI","clawpress")},{value:"anthropic",label:(0,a.__)("Anthropic","clawpress")},{value:"google",label:(0,a.__)("Google","clawpress")}],YA=()=>{if("undefined"==typeof window||!window.localStorage)return{};try{const c=window.localStorage.getItem(WA);if(!c)return{};const l=JSON.parse(c);return l&&"object"==typeof l&&!Array.isArray(l)?l:{}}catch{return{}}},JA=c=>{if("undefined"!=typeof window&&window.localStorage)try{window.localStorage.setItem(WA,JSON.stringify(c))}catch{}},FA=c=>!c||"object"!=typeof c||Array.isArray(c)?null:{supported_options:pA(c.supported_options),unsupported_generation_options:pA(c.unsupported_generation_options),unsupported_generation_option_labels:pA(c.unsupported_generation_option_labels),learned_unsupported_options:pA(c.learned_unsupported_options)},CA=c=>Boolean(c&&(c.supported_options.length>0||c.unsupported_generation_options.length>0||c.unsupported_generation_option_labels.length>0||c.learned_unsupported_options.length>0)),vA=(c,l,e)=>{const t=BA(l),d=hA(e);if(!t)return d;const b=Array.isArray(c?.[t])?c[t]:[],n=new Map(b.map(c=>[c.id,c])),X=new Set(d.map(c=>c.id)),G=b.filter(c=>!X.has(c.id)&&CA(FA(c)));return[...d.map(c=>((c,l)=>{const e=FA(c),t=FA(l);return!t||CA(e)?c:{...c,...t}})(c,n.get(c.id))),...G]},NA=(c,l,e)=>c.filter(c=>{const t=yA(e(c));return t&&l&&(l.startsWith(t)||t.startsWith(l))}).sort((c,l)=>yA(e(l)).length-yA(e(c)).length)[0]||null;function kA(){const[c,l]=(0,G.useState)(!0),[e,t]=(0,G.useState)(!1),[d,b]=(0,G.useState)(""),[n,X]=(0,G.useState)(""),[u,x]=(0,G.useState)(rA),[o,s]=(0,G.useState)(VA()),[Z,H]=(0,G.useState)({}),[R,I]=(0,G.useState)({}),[r,W]=(0,G.useState)({});(0,G.useEffect)(()=>{let c=!0;return(async()=>{l(!0),b("");try{const l=await g("settings");if(!c)return;x(((c={})=>({provider:"string"==typeof c.provider?c.provider:"",model:"string"==typeof c.model?c.model:"",temperature:Number.isFinite(Number(c.temperature))?Number(c.temperature):.2,top_p:Number.isFinite(Number(c.top_p))?Number(c.top_p):.9,max_output_tokens:Number.isFinite(Number(c.max_output_tokens))&&Number(c.max_output_tokens)>0?Number(c.max_output_tokens):1200,frequency_penalty:Number.isFinite(Number(c.frequency_penalty))?Number(c.frequency_penalty):.2,presence_penalty:Number.isFinite(Number(c.presence_penalty))?Number(c.presence_penalty):0,request_timeout:Number.isFinite(Number(c.request_timeout))&&Number(c.request_timeout)>0?Number(c.request_timeout):45,agent_user_id:Number.isFinite(Number(c.agent_user_id))?Number(c.agent_user_id):0,memory_enabled:Boolean(c.memory_enabled),setup_completed:Boolean(c.setup_completed)}))(l?.settings||{})),s((c=>{if(!Array.isArray(c))return VA();const l=c.map(c=>{const l=BA(c?.value),e="string"==typeof c?.label?c.label.trim():"";return l&&e?{value:l,label:e}:null}).filter(Boolean);return l.length>0?l:VA()})(l?.providers||[])),H(((c,l,e,t)=>{const d=BA(l),b="string"==typeof e?e.trim():"",n=FA(t);if(!d||!b||!n)return c;const X=Array.isArray(c?.[d])?c[d]:[],G=X.findIndex(c=>c.id===b),i={...G>=0?X[G]:{id:b,label:b},...n},a=G>=0?X.map((c,l)=>l===G?i:c):[i,...X];return{...c,[d]:a}})(!(t=l?.models||{})||"object"!=typeof t||Array.isArray(t)?{}:Object.entries(t).reduce((c,[l,e])=>{const t=BA(l);return t&&Array.isArray(e)?(c[t]=hA(e),c):c},{}),l?.settings?.provider,l?.settings?.model,l?.model_option_summary)),I(!(e=l?.model_catalog||{})||"object"!=typeof e||Array.isArray(e)?{}:Object.entries(e).reduce((c,[l,e])=>{const t=BA(l);if(!t||!Array.isArray(e))return c;const d=e.map(c=>{const l="string"==typeof c?.id?c.id.trim():"",e="string"==typeof c?.label?c.label.trim():"",t="string"==typeof c?.context?c.context.trim():"",d="string"==typeof c?.cost?c.cost.trim():"";return l?{id:l,label:e||l,context:t,cost:d}:null}).filter(Boolean);return d.length>0&&(c[t]=d),c},{}))}catch(l){if(!c)return;b(l?.message||(0,a.__)("Unable to load settings.","clawpress"))}finally{c&&l(!1)}var e,t})(),()=>{c=!1}},[]);const B=(0,G.useCallback)(async(c,{forceRefresh:l=!1}={})=>{const e=BA(c);if(!e)return[];if(!l){const c=(c=>{const l=BA(c);if(!l)return{hasValue:!1,options:[]};const e=YA()[l];return Array.isArray(e)?{hasValue:!0,options:hA(e)}:e&&"object"==typeof e&&Array.isArray(e.models)?{hasValue:!0,options:hA(e.models)}:{hasValue:!1,options:[]}})(e);if(c.hasValue)return H(l=>({...l,[e]:vA(l,e,c.options)})),c.options}W(c=>({...c,[e]:!0}));try{const c=await(async c=>{const l=BA(c);if(!l)return[];const e=await g(`providers/${encodeURIComponent(l)}/models`);return Array.isArray(e)?hA(e):[]})(e);return H(l=>({...l,[e]:vA(l,e,c)})),((c,l)=>{const e=BA(c);if(!e)return;const t=YA();t[e]={cached_at:Date.now(),models:hA(l)},JA(t)})(e,c),c}catch{return b((0,a.__)("Unable to refresh models for the selected provider.","clawpress")),[]}finally{W(c=>({...c,[e]:!1}))}},[]),y=BA(u.provider),p=Boolean(r?.[y]),h=(0,G.useMemo)(()=>Array.isArray(Z?.[y])?Z[y]:[],[y,Z]),V=(0,G.useMemo)(()=>{const c="string"==typeof u.model?u.model.trim():"";return c&&h.find(l=>l.id===c)||null},[h,u.model]),Y=(0,G.useMemo)(()=>{const c="string"==typeof u.model?u.model.trim():"";return c?V?null:{id:c,label:c}:null},[V,u.model]);(0,G.useEffect)(()=>{y&&B(y)},[y,B]);const J=(0,G.useMemo)(()=>[{label:(0,a.__)("Select a model","clawpress"),value:""},...Y?[{label:Y.label,value:Y.id}]:[],...h.map(c=>({label:c.label,value:c.id}))],[h,Y]),F=((c,l,e,t)=>{const d="string"==typeof l?l.trim():"";if(!d)return{selectedEntry:null,modelId:d};const b=BA(c),n=b&&Array.isArray(e?.[b])?e[b]:[],X=Array.isArray(t?.[b])?t[b]:[],G=n.find(c=>c.id===d)||null;return{selectedEntry:((c,l,e="")=>{if(!Array.isArray(c)||0===c.length)return null;const t="string"==typeof l?l.trim():"",d=c.find(c=>c.id===t)||null;if(d)return d;const b=yA(t),n=c.find(c=>yA(c.id)===b)||null;if(n)return n;const X=NA(c,b,c=>c.id);if(X)return X;const G=yA(e);return G?c.find(c=>yA(c.label)===G)||NA(c,G,c=>c.label):null})(X,d,G?.label||"")||null,modelId:d}})(u.provider,u.model,Z,R);let C=null;if(F.modelId){const c=F.selectedEntry?.context||"",l=F.selectedEntry?.cost||"",e=V?.unsupported_generation_option_labels||[],t=e.length>0?e.join(", "):(0,a.__)("None","clawpress");C=(0,m.jsxs)("span",{className:"clawpress-settings__model-meta",children:[(0,m.jsx)("code",{children:F.modelId}),c?(0,m.jsxs)(m.Fragment,{children:[" ",(0,a.__)("Context Size :","clawpress")," ",(0,m.jsx)("code",{children:c})]}):null,l?(0,m.jsxs)(m.Fragment,{children:[" ",(0,a.__)("Cost :","clawpress")," ",(0,m.jsx)("code",{children:l})]}):null,V?(0,m.jsxs)("span",{className:"clawpress-settings__model-skipped",children:[" ",(0,a.__)("Skipped Settings :","clawpress")," ",(0,m.jsx)("code",{children:t})]}):null]})}const v=[{id:"provider",type:"text",label:(0,a.__)("Provider","clawpress"),description:(0,a.__)("Choose which AI service ClawPress should use.","clawpress"),Edit:"select",elements:[{label:(0,a.__)("Select a provider","clawpress"),value:""},...o]},{id:"model",type:"text",label:(0,a.__)("Model","clawpress"),description:C,Edit:"select",elements:J},{id:"temperature",type:"number",label:(0,a.__)("Temperature","clawpress"),description:(0,a.__)("Lower values make replies more focused and consistent. Higher values make replies more creative and varied.","clawpress")},{id:"top_p",type:"number",label:(0,a.__)("Top P","clawpress"),description:(0,a.__)("Lower values keep replies more predictable. Higher values allow more variety in wording and ideas.","clawpress")},{id:"max_output_tokens",type:"integer",label:(0,a.__)("Max Output Tokens","clawpress"),description:(0,a.__)("Sets the maximum reply length. Higher values allow longer answers; lower values keep answers shorter.","clawpress")},{id:"frequency_penalty",type:"number",label:(0,a.__)("Frequency Penalty","clawpress"),description:(0,a.__)("Higher values reduce repeated words and phrases. Lower values allow more repetition.","clawpress")},{id:"presence_penalty",type:"number",label:(0,a.__)("Presence Penalty","clawpress"),description:(0,a.__)("Higher values encourage fresh ideas. Lower values keep replies closer to what has already been said.","clawpress")},{id:"request_timeout",type:"integer",label:(0,a.__)("Request Timeout (seconds)","clawpress"),description:(0,a.__)("How long ClawPress waits for a reply before stopping the request.","clawpress")},{id:"agent_user_id",type:"integer",label:(0,a.__)("Agent User ID","clawpress"),description:(0,a.__)("Use 0 if this is not configured yet.","clawpress")},{id:"memory_enabled",type:"boolean",label:(0,a.__)("Enable Memory","clawpress"),description:(0,a.__)("When enabled, ClawPress can remember useful details from earlier chats.","clawpress"),Edit:"toggle"},{id:"setup_completed",type:"boolean",label:(0,a.__)("Setup Completed","clawpress"),description:(0,a.__)("Turn this on after you finish the initial setup.","clawpress"),Edit:"toggle"}],N={layout:{type:"regular",labelPosition:"top"},fields:["provider","model","request_timeout","agent_user_id","memory_enabled","setup_completed",{id:"generation_settings",label:(0,a.__)("LLM Reply Settings","clawpress"),description:(0,a.__)("Not all settings are supported by every provider or model. Unsupported settings are skipped automatically.","clawpress"),layout:{type:"card",isOpened:!0,withHeader:!0},children:["temperature","top_p","max_output_tokens","frequency_penalty","presence_penalty"]}]};return(0,m.jsx)("div",{className:"clawpress-settings",children:(0,m.jsxs)(i.Card,{children:[(0,m.jsx)(i.CardHeader,{children:(0,m.jsx)("h3",{children:(0,a.__)("Settings","clawpress")})}),(0,m.jsxs)(i.CardBody,{children:[d?(0,m.jsx)(i.Notice,{status:"error",isDismissible:!1,children:d}):null,n?(0,m.jsx)(i.Notice,{status:"success",isDismissible:!1,children:n}):null,c?(0,m.jsx)(i.Spinner,{}):(0,m.jsxs)("div",{children:[(0,m.jsx)(xA,{data:u,fields:v,form:N,onChange:c=>x(l=>{const e={...l,...c};if(Object.prototype.hasOwnProperty.call(c,"provider")){const c=BA(e.provider);(Array.isArray(Z?.[c])?Z[c]:[]).some(c=>c.id===e.model)||(e.model="")}return e})}),(0,m.jsxs)("div",{className:"clawpress-settings__actions",children:[(0,m.jsx)(i.Button,{className:"clawpress-settings__save-button",variant:"primary",onClick:async()=>{t(!0),b(""),X("");try{await g("settings",{method:"POST",body:{provider:u.provider,model:u.model,temperature:Number.isFinite(Number(u.temperature))?Number(u.temperature):.2,top_p:Number.isFinite(Number(u.top_p))?Number(u.top_p):.9,max_output_tokens:Number.isFinite(Number(u.max_output_tokens))&&Number(u.max_output_tokens)>0?Number(u.max_output_tokens):1200,frequency_penalty:Number.isFinite(Number(u.frequency_penalty))?Number(u.frequency_penalty):.2,presence_penalty:Number.isFinite(Number(u.presence_penalty))?Number(u.presence_penalty):0,request_timeout:Number.isFinite(Number(u.request_timeout))&&Number(u.request_timeout)>0?Number(u.request_timeout):45,agent_user_id:Number.isFinite(Number(u.agent_user_id))&&Number(u.agent_user_id)>0?Number(u.agent_user_id):0,memory_enabled:Boolean(u.memory_enabled),setup_completed:Boolean(u.setup_completed)}}),X((0,a.__)("Settings saved.","clawpress"))}catch(c){b(c?.message||(0,a.__)("Unable to save settings.","clawpress"))}finally{t(!1)}},isBusy:e,disabled:e,children:e?(0,a.__)("Saving…","clawpress"):(0,a.__)("Save Settings","clawpress")}),(0,m.jsx)(i.Button,{className:"clawpress-settings__refresh-models-button",variant:"secondary",icon:IA,onClick:async()=>{y&&(b(""),(c=>{const l=BA(c);if(!l)return;const e=YA();delete e[l],JA(e)})(y),await B(y,{forceRefresh:!0}))},isBusy:p,disabled:!y||p||e,children:(0,a.__)("Refresh Models","clawpress")})]})]})]})]})})}function fA(){const{currentView:c,handleTabSelect:l,VIEWS:e}=s(),t=[{name:e.PAGES,title:(0,a.__)("Agent Files","clawpress"),content:(0,m.jsx)(RA,{})},{name:e.SETTINGS,title:(0,a.__)("Settings","clawpress"),content:(0,m.jsx)(kA,{})},{name:e.ABILITIES,title:(0,a.__)("Abilities","clawpress"),content:(0,m.jsx)(r,{})}];return(0,m.jsx)("div",{className:"clawpress-app",children:(0,m.jsx)(i.TabPanel,{tabs:t,initialTabName:c,onSelect:l,children:({content:c})=>(0,m.jsx)("div",{className:"clawpress-tab-content",children:c})})})}X()(()=>{const c=document.getElementById("clawpress-admin-root");c&&(0,G.createRoot)(c).render((0,m.jsx)(fA,{}))})},744(c){"use strict";var l=function(c){return function(c){return!!c&&"object"==typeof c}(c)&&!function(c){var l=Object.prototype.toString.call(c);return"[object RegExp]"===l||"[object Date]"===l||function(c){return c.$$typeof===e}(c)}(c)},e="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function t(c,l){return!1!==l.clone&&l.isMergeableObject(c)?X((e=c,Array.isArray(e)?[]:{}),c,l):c;var e}function d(c,l,e){return c.concat(l).map(function(c){return t(c,e)})}function b(c){return Object.keys(c).concat(function(c){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(c).filter(function(l){return Object.propertyIsEnumerable.call(c,l)}):[]}(c))}function n(c,l){try{return l in c}catch(c){return!1}}function X(c,e,G){(G=G||{}).arrayMerge=G.arrayMerge||d,G.isMergeableObject=G.isMergeableObject||l,G.cloneUnlessOtherwiseSpecified=t;var i=Array.isArray(e);return i===Array.isArray(c)?i?G.arrayMerge(c,e,G):function(c,l,e){var d={};return e.isMergeableObject(c)&&b(c).forEach(function(l){d[l]=t(c[l],e)}),b(l).forEach(function(b){(function(c,l){return n(c,l)&&!(Object.hasOwnProperty.call(c,l)&&Object.propertyIsEnumerable.call(c,l))})(c,b)||(n(c,b)&&e.isMergeableObject(l[b])?d[b]=function(c,l){if(!l.customMerge)return X;var e=l.customMerge(c);return"function"==typeof e?e:X}(b,e)(c[b],l[b],e):d[b]=t(l[b],e))}),d}(c,e,G):t(e,G)}X.all=function(c,l){if(!Array.isArray(c))throw new Error("first argument should be an array");return c.reduce(function(c,e){return X(c,e,l)},{})};var G=X;c.exports=G},252(c){"use strict";c.exports=function c(l,e){if(l===e)return!0;if(l&&e&&"object"==typeof l&&"object"==typeof e){if(l.constructor!==e.constructor)return!1;var t,d,b;if(Array.isArray(l)){if((t=l.length)!=e.length)return!1;for(d=t;0!==d--;)if(!c(l[d],e[d]))return!1;return!0}if(l instanceof Map&&e instanceof Map){if(l.size!==e.size)return!1;for(d of l.entries())if(!e.has(d[0]))return!1;for(d of l.entries())if(!c(d[1],e.get(d[0])))return!1;return!0}if(l instanceof Set&&e instanceof Set){if(l.size!==e.size)return!1;for(d of l.entries())if(!e.has(d[0]))return!1;return!0}if(ArrayBuffer.isView(l)&&ArrayBuffer.isView(e)){if((t=l.length)!=e.length)return!1;for(d=t;0!==d--;)if(l[d]!==e[d])return!1;return!0}if(l.constructor===RegExp)return l.source===e.source&&l.flags===e.flags;if(l.valueOf!==Object.prototype.valueOf)return l.valueOf()===e.valueOf();if(l.toString!==Object.prototype.toString)return l.toString()===e.toString();if((t=(b=Object.keys(l)).length)!==Object.keys(e).length)return!1;for(d=t;0!==d--;)if(!Object.prototype.hasOwnProperty.call(e,b[d]))return!1;for(d=t;0!==d--;){var n=b[d];if(!c(l[n],e[n]))return!1}return!0}return l!=l&&e!=e}},542(c){c.exports=function(c){var l={};function e(t){if(l[t])return l[t].exports;var d=l[t]={exports:{},id:t,loaded:!1};return c[t].call(d.exports,d,d.exports,e),d.loaded=!0,d.exports}return e.m=c,e.c=l,e.p="",e(0)}([function(c,l,e){c.exports=e(1)},function(c,l,e){"use strict";Object.defineProperty(l,"__esModule",{value:!0});var t=e(2);Object.defineProperty(l,"combineChunks",{enumerable:!0,get:function(){return t.combineChunks}}),Object.defineProperty(l,"fillInChunks",{enumerable:!0,get:function(){return t.fillInChunks}}),Object.defineProperty(l,"findAll",{enumerable:!0,get:function(){return t.findAll}}),Object.defineProperty(l,"findChunks",{enumerable:!0,get:function(){return t.findChunks}})},function(c,l){"use strict";Object.defineProperty(l,"__esModule",{value:!0}),l.findAll=function(c){var l=c.autoEscape,b=c.caseSensitive,n=void 0!==b&&b,X=c.findChunks,G=void 0===X?t:X,i=c.sanitize,a=c.searchWords,u=c.textToHighlight;return d({chunksToHighlight:e({chunks:G({autoEscape:l,caseSensitive:n,sanitize:i,searchWords:a,textToHighlight:u})}),totalLength:u?u.length:0})};var e=l.combineChunks=function(c){var l=c.chunks;return l.sort(function(c,l){return c.start-l.start}).reduce(function(c,l){if(0===c.length)return[l];var e=c.pop();if(l.startG&&c.push({highlight:!1,start:G,end:i}),n.index===b.lastIndex&&b.lastIndex++}return c},[])};l.findChunks=t;var d=l.fillInChunks=function(c){var l=c.chunksToHighlight,e=c.totalLength,t=[],d=function(c,l,e){l-c>0&&t.push({start:c,end:l,highlight:e})};if(0===l.length)d(0,e,!1);else{var b=0;l.forEach(function(c){d(b,c.start,!1),d(c.start,c.end,!0),b=c.end}),d(b,e,!1)}return t};function b(c){return c}}])},146(c,l,e){"use strict";var t=e(363),d={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},b={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},n={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},X={};function G(c){return t.isMemo(c)?n:X[c.$$typeof]||d}X[t.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},X[t.Memo]=n;var i=Object.defineProperty,a=Object.getOwnPropertyNames,u=Object.getOwnPropertySymbols,x=Object.getOwnPropertyDescriptor,o=Object.getPrototypeOf,s=Object.prototype;c.exports=function c(l,e,t){if("string"!=typeof e){if(s){var d=o(e);d&&d!==s&&c(l,d,t)}var n=a(e);u&&(n=n.concat(u(e)));for(var X=G(l),g=G(e),m=0;m{if(!e){var n=1/0;for(a=0;a=d)&&Object.keys(b.O).every(c=>b.O[c](e[G]))?e.splice(G--,1):(X=!1,d0&&c[a-1][2]>d;a--)c[a]=c[a-1];c[a]=[e,t,d]},b.n=c=>{var l=c&&c.__esModule?()=>c.default:()=>c;return b.d(l,{a:l}),l},e=Object.getPrototypeOf?c=>Object.getPrototypeOf(c):c=>c.__proto__,b.t=function(c,t){if(1&t&&(c=this(c)),8&t)return c;if("object"==typeof c&&c){if(4&t&&c.__esModule)return c;if(16&t&&"function"==typeof c.then)return c}var d=Object.create(null);b.r(d);var n={};l=l||[null,e({}),e([]),e(e)];for(var X=2&t&&c;("object"==typeof X||"function"==typeof X)&&!~l.indexOf(X);X=e(X))Object.getOwnPropertyNames(X).forEach(l=>n[l]=()=>c[l]);return n.default=()=>c,b.d(d,n),d},b.d=(c,l)=>{for(var e in l)b.o(l,e)&&!b.o(c,e)&&Object.defineProperty(c,e,{enumerable:!0,get:l[e]})},b.o=(c,l)=>Object.prototype.hasOwnProperty.call(c,l),b.r=c=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(c,"__esModule",{value:!0})},(()=>{var c={884:0,15:0};b.O.j=l=>0===c[l];var l=(l,e)=>{var t,d,[n,X,G]=e,i=0;if(n.some(l=>0!==c[l])){for(t in X)b.o(X,t)&&(b.m[t]=X[t]);if(G)var a=G(b)}for(l&&l(e);ib(71));n=b.O(n)})(); \ No newline at end of file diff --git a/src/js/admin/components/views/SettingsView.js b/src/js/admin/components/views/SettingsView.js index e289f53..b7eab64 100644 --- a/src/js/admin/components/views/SettingsView.js +++ b/src/js/admin/components/views/SettingsView.js @@ -319,6 +319,65 @@ const normalizeModelOptionSummary = ( summary ) => { }; }; +const hasModelOptionSummaryData = ( summary ) => + Boolean( + summary && + ( summary.supported_options.length > 0 || + summary.unsupported_generation_options.length > 0 || + summary.unsupported_generation_option_labels.length > 0 || + summary.learned_unsupported_options.length > 0 ) + ); + +const mergeModelOptionSummaryFields = ( option, fallbackOption ) => { + const optionSummary = normalizeModelOptionSummary( option ); + const fallbackSummary = normalizeModelOptionSummary( fallbackOption ); + + if ( ! fallbackSummary || hasModelOptionSummaryData( optionSummary ) ) { + return option; + } + + return { + ...option, + ...fallbackSummary, + }; +}; + +const mergeProviderModelOptionSummaries = ( + modelsByProvider, + provider, + options +) => { + const providerId = normalizeProviderId( provider ); + const nextOptions = normalizeDiscoveredProviderModelOptions( options ); + + if ( ! providerId ) { + return nextOptions; + } + + const currentOptions = Array.isArray( modelsByProvider?.[ providerId ] ) + ? modelsByProvider[ providerId ] + : []; + const currentOptionsById = new Map( + currentOptions.map( ( option ) => [ option.id, option ] ) + ); + const nextOptionIds = new Set( nextOptions.map( ( option ) => option.id ) ); + const currentSummaryOptions = currentOptions.filter( + ( option ) => + ! nextOptionIds.has( option.id ) && + hasModelOptionSummaryData( normalizeModelOptionSummary( option ) ) + ); + + return [ + ...nextOptions.map( ( option ) => + mergeModelOptionSummaryFields( + option, + currentOptionsById.get( option.id ) + ) + ), + ...currentSummaryOptions, + ]; +}; + const mergeSelectedModelOptionSummary = ( modelsByProvider, provider, @@ -668,7 +727,12 @@ export default function SettingsView() { if ( cached.hasValue ) { setDiscoveredModelOptionsByProvider( ( current ) => ( { ...current, - [ normalizedProviderId ]: cached.options, + [ normalizedProviderId ]: + mergeProviderModelOptionSummaries( + current, + normalizedProviderId, + cached.options + ), } ) ); return cached.options; } @@ -684,7 +748,11 @@ export default function SettingsView() { await fetchProviderModelOptions( normalizedProviderId ); setDiscoveredModelOptionsByProvider( ( current ) => ( { ...current, - [ normalizedProviderId ]: refreshedOptions, + [ normalizedProviderId ]: mergeProviderModelOptionSummaries( + current, + normalizedProviderId, + refreshedOptions + ), } ) ); setCachedProviderModelOptions( normalizedProviderId, @@ -809,6 +877,10 @@ export default function SettingsView() { const skippedSettingLabels = selectedProviderModelOption?.unsupported_generation_option_labels || []; + const skippedSettingsValue = + skippedSettingLabels.length > 0 + ? skippedSettingLabels.join( ', ' ) + : __( 'None', 'clawpress' ); modelDescription = ( @@ -827,11 +899,11 @@ export default function SettingsView() { { modelCost } ) : null } - { skippedSettingLabels.length > 0 ? ( + { selectedProviderModelOption ? ( { ' ' } { __( 'Skipped Settings :', 'clawpress' ) }{ ' ' } - { skippedSettingLabels.join( ', ' ) } + { skippedSettingsValue } ) : null } From 2a72bffd7c243d7fde7e9ed3b494b9b2fe3f1c8b Mon Sep 17 00:00:00 2001 From: Brad Vincent Date: Thu, 7 May 2026 16:32:33 +0100 Subject: [PATCH 6/9] Add plugin autoload fallback --- clawpress.php | 2 + includes/autoload.php | 96 +++++++++++++++++++++++++++++++++++++ tests/Unit/AutoloadTest.php | 33 +++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 includes/autoload.php create mode 100644 tests/Unit/AutoloadTest.php diff --git a/clawpress.php b/clawpress.php index b057b67..090e2ac 100644 --- a/clawpress.php +++ b/clawpress.php @@ -40,6 +40,8 @@ require_once CLAWPRESS_DIR . 'vendor/autoload.php'; } +require_once CLAWPRESS_DIR . 'includes/autoload.php'; + if ( function_exists( 'register_activation_hook' ) ) { register_activation_hook( CLAWPRESS_FILE, [ Plugin::class, 'activate' ] ); } diff --git a/includes/autoload.php b/includes/autoload.php new file mode 100644 index 0000000..1d1f712 --- /dev/null +++ b/includes/autoload.php @@ -0,0 +1,96 @@ + 'admin-page', + 'builtin' => 'built-in', + 'posttypes' => 'post-types', + 'restapi' => 'rest', + 'webfetch' => 'web-fetch', + ]; + + return $directory_map[ $slug ] ?? $slug; + } +} + +if ( ! function_exists( __NAMESPACE__ . '\clawpress_autoload_class_file_candidates' ) ) { + /** + * Resolve candidate class file paths for a plugin class. + * + * @param string $class_name Fully qualified class name. + * @return array + */ + function clawpress_autoload_class_file_candidates( string $class_name ): array { + $prefix = __NAMESPACE__ . '\\'; + if ( ! str_starts_with( $class_name, $prefix ) ) { + return []; + } + + $relative_class = substr( $class_name, strlen( $prefix ) ); + if ( '' === $relative_class ) { + return []; + } + + $parts = explode( '\\', $relative_class ); + $short_class_name = array_pop( $parts ); + if ( ! is_string( $short_class_name ) || '' === $short_class_name ) { + return []; + } + + $class_slug = clawpress_autoload_slug( $short_class_name ); + $candidates = [ + __DIR__ . '/class-' . $class_slug . '.php', + ]; + + if ( [] !== $parts ) { + $directories = array_map( __NAMESPACE__ . '\clawpress_autoload_slug', $parts ); + $candidates[] = __DIR__ . '/' . implode( '/', $directories ) . '/class-' . $class_slug . '.php'; + + while ( [] !== $directories && in_array( $directories[ count( $directories ) - 1 ], [ 'built-in', 'controllers' ], true ) ) { + array_pop( $directories ); + if ( [] !== $directories ) { + $candidates[] = __DIR__ . '/' . implode( '/', $directories ) . '/class-' . $class_slug . '.php'; + } + } + } + + return array_values( array_unique( $candidates ) ); + } +} + +if ( ! function_exists( __NAMESPACE__ . '\clawpress_autoload_class' ) ) { + /** + * Load a plugin class when Composer's classmap does not know about it yet. + * + * @param string $class_name Fully qualified class name. + */ + function clawpress_autoload_class( string $class_name ): void { + foreach ( clawpress_autoload_class_file_candidates( $class_name ) as $file ) { + if ( is_readable( $file ) ) { + require_once $file; + return; + } + } + } +} + +spl_autoload_register( __NAMESPACE__ . '\clawpress_autoload_class' ); diff --git a/tests/Unit/AutoloadTest.php b/tests/Unit/AutoloadTest.php new file mode 100644 index 0000000..790c6c1 --- /dev/null +++ b/tests/Unit/AutoloadTest.php @@ -0,0 +1,33 @@ +assertTrue( class_exists( Logs_Controller::class ) ); + } +} From 61a9cdb2858f884db78f9cc2004a48a99e9e5def Mon Sep 17 00:00:00 2001 From: Brad Vincent Date: Thu, 7 May 2026 17:37:16 +0100 Subject: [PATCH 7/9] Avoid Plugin Check AI client autoload conflict --- bin/plugin-check-bootstrap.php | 38 ++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/bin/plugin-check-bootstrap.php b/bin/plugin-check-bootstrap.php index 089c1a5..eed3a57 100644 --- a/bin/plugin-check-bootstrap.php +++ b/bin/plugin-check-bootstrap.php @@ -45,7 +45,24 @@ \WP_CLI::error( 'Plugin Check engine autoloader not found: ' . $autoload ); } -require_once $autoload; +if ( ! function_exists( 'clawpress_plugin_check_disable_engine_ai_client_autoload' ) ) { + /** + * Prevent Plugin Check's bundled AI client from shadowing WordPress core's scoped AI client. + * + * @param mixed $loader Composer loader returned by the standalone engine. + */ + function clawpress_plugin_check_disable_engine_ai_client_autoload( $loader ): void { + if ( ! is_object( $loader ) || ! method_exists( $loader, 'setPsr4' ) ) { + return; + } + + $loader->setPsr4( 'WordPress\\AiClient\\', array() ); + $loader->setPsr4( 'WordPress\\AI_Client\\', array() ); + } +} + +$engine_loader = require_once $autoload; +clawpress_plugin_check_disable_engine_ai_client_autoload( $engine_loader ); if ( ! class_exists( '\WordPress\Plugin_Check\CLI\Plugin_Check_Command' ) ) { \WP_CLI::error( 'Plugin Check command class could not be loaded from standalone engine.' ); @@ -108,7 +125,24 @@ function plugin_check_initialize_runner(): void { return; } - require_once $autoload; + if ( ! function_exists( 'clawpress_plugin_check_disable_engine_ai_client_autoload' ) ) { + /** + * Prevent Plugin Check's bundled AI client from shadowing WordPress core's scoped AI client. + * + * @param mixed $loader Composer loader returned by the standalone engine. + */ + function clawpress_plugin_check_disable_engine_ai_client_autoload( $loader ): void { + if ( ! is_object( $loader ) || ! method_exists( $loader, 'setPsr4' ) ) { + return; + } + + $loader->setPsr4( 'WordPress\\AiClient\\', array() ); + $loader->setPsr4( 'WordPress\\AI_Client\\', array() ); + } + } + + $engine_loader = require_once $autoload; + clawpress_plugin_check_disable_engine_ai_client_autoload( $engine_loader ); if ( class_exists( '\WordPress\Plugin_Check\Utilities\Plugin_Request_Utility' ) ) { \WordPress\Plugin_Check\Utilities\Plugin_Request_Utility::initialize_runner(); From 2eca3b07ffa58fa6274e515f6bcad4923668f02c Mon Sep 17 00:00:00 2001 From: Brad Vincent Date: Thu, 7 May 2026 17:44:16 +0100 Subject: [PATCH 8/9] Address Plugin Check findings --- .../handlers/class-setup-command-handler.php | 2 +- .../handlers/class-test-command-handler.php | 2 +- includes/helpers/class-agent-loop-helper.php | 8 +++--- includes/rest/class-chat-controller.php | 27 ++++++++++++++++--- includes/stores/class-action-log-store.php | 2 +- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/includes/commands/handlers/class-setup-command-handler.php b/includes/commands/handlers/class-setup-command-handler.php index dc303fc..dfc92eb 100644 --- a/includes/commands/handlers/class-setup-command-handler.php +++ b/includes/commands/handlers/class-setup-command-handler.php @@ -1186,7 +1186,7 @@ private function generate_text_with_explicit_model_fallback( throw $last_throwable; } - throw new \RuntimeException( __( 'AI generation failed.', 'clawpress' ) ); + throw new \RuntimeException( esc_html__( 'AI generation failed.', 'clawpress' ) ); } /** diff --git a/includes/commands/handlers/class-test-command-handler.php b/includes/commands/handlers/class-test-command-handler.php index 1c0ed82..5c6f3c9 100644 --- a/includes/commands/handlers/class-test-command-handler.php +++ b/includes/commands/handlers/class-test-command-handler.php @@ -288,7 +288,7 @@ private function generate_text_with_explicit_model_fallback( throw $last_throwable; } - throw new \RuntimeException( __( 'AI generation failed.', 'clawpress' ) ); + throw new \RuntimeException( esc_html__( 'AI generation failed.', 'clawpress' ) ); } /** diff --git a/includes/helpers/class-agent-loop-helper.php b/includes/helpers/class-agent-loop-helper.php index f10d1b5..6934898 100644 --- a/includes/helpers/class-agent-loop-helper.php +++ b/includes/helpers/class-agent-loop-helper.php @@ -1580,11 +1580,11 @@ private function normalize_stream_event_text_value( $value ): string { private function generate_result_from_streaming_builder( object $builder ): GenerativeAiResult { $result = $builder->generate_result(); if ( is_wp_error( $result ) ) { - throw new \RuntimeException( $result->get_error_message() ); + throw new \RuntimeException( esc_html( $result->get_error_message() ) ); } if ( ! $result instanceof GenerativeAiResult ) { - throw new \RuntimeException( __( 'AI client did not return a generative result.', 'clawpress' ) ); + throw new \RuntimeException( esc_html__( 'AI client did not return a generative result.', 'clawpress' ) ); } return $result; @@ -1669,7 +1669,7 @@ private function generate_result_with_explicit_model_fallback( throw $last_throwable; } - throw new \RuntimeException( __( 'AI generation failed.', 'clawpress' ) ); + throw new \RuntimeException( esc_html__( 'AI generation failed.', 'clawpress' ) ); } /** @@ -1739,7 +1739,7 @@ private function generate_streaming_result_with_explicit_model_fallback( throw $last_throwable; } - throw new \RuntimeException( __( 'AI generation failed.', 'clawpress' ) ); + throw new \RuntimeException( esc_html__( 'AI generation failed.', 'clawpress' ) ); } /** diff --git a/includes/rest/class-chat-controller.php b/includes/rest/class-chat-controller.php index 61a0c30..b124b5e 100644 --- a/includes/rest/class-chat-controller.php +++ b/includes/rest/class-chat-controller.php @@ -462,6 +462,7 @@ private function emit_stream_response_data( array $response_data, bool $saw_delt */ private function start_stream_response(): void { ignore_user_abort( true ); + // phpcs:ignore Squiz.PHP.DiscouragedFunctions.Discouraged -- SSE responses may need to outlive the default request timeout. set_time_limit( 0 ); while ( ob_get_level() ) { @@ -476,9 +477,13 @@ private function start_stream_response(): void { header( 'Content-Encoding: identity' ); header( 'X-Content-Type-Options: nosniff' ); + // phpcs:ignore Squiz.PHP.DiscouragedFunctions.Discouraged -- SSE responses need server-side compression disabled. @ini_set( 'zlib.output_compression', '0' ); + // phpcs:ignore Squiz.PHP.DiscouragedFunctions.Discouraged -- SSE responses need server-side buffering disabled. @ini_set( 'output_buffering', '0' ); + // phpcs:ignore Squiz.PHP.DiscouragedFunctions.Discouraged -- SSE responses need immediate flushing. @ini_set( 'implicit_flush', '1' ); + // phpcs:ignore Squiz.PHP.DiscouragedFunctions.Discouraged -- SSE responses should avoid configured output handlers. @ini_set( 'output_handler', '' ); if ( function_exists( 'apache_setenv' ) ) { @@ -490,7 +495,7 @@ private function start_stream_response(): void { @ob_implicit_flush( true ); } - echo ':' . str_repeat( ' ', 4096 ) . "\n\n"; + echo esc_html( ':' . str_repeat( ' ', 4096 ) . "\n\n" ); flush(); } @@ -501,6 +506,7 @@ private function start_stream_response(): void { * @param array $payload Event payload. */ private static function send_stream_frame( string $type, array $payload ): void { + $type = self::sanitize_stream_event_type( $type ); $frame = wp_json_encode( [ 'type' => $type, @@ -512,9 +518,10 @@ private static function send_stream_frame( string $type, array $payload ): void return; } - echo "event: {$type}\n"; + echo esc_html( "event: {$type}\n" ); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- SSE data is JSON encoded and must remain raw text/event-stream content. echo 'data: ' . $frame . "\n\n"; - echo ':' . str_repeat( ' ', 2048 ) . "\n\n"; + echo esc_html( ':' . str_repeat( ' ', 2048 ) . "\n\n" ); if ( function_exists( 'ob_flush' ) ) { @ob_flush(); @@ -523,6 +530,20 @@ private static function send_stream_frame( string $type, array $payload ): void flush(); } + /** + * Sanitize an SSE event type. + * + * @param string $type Event type. + */ + private static function sanitize_stream_event_type( string $type ): string { + $sanitized = preg_replace( '/[^A-Za-z0-9_.-]/', '', $type ); + if ( is_string( $sanitized ) && '' !== $sanitized ) { + return $sanitized; + } + + return 'message'; + } + /** * Write action/event log record for chat processing. * diff --git a/includes/stores/class-action-log-store.php b/includes/stores/class-action-log-store.php index e05f5a8..91c48d5 100644 --- a/includes/stores/class-action-log-store.php +++ b/includes/stores/class-action-log-store.php @@ -276,7 +276,7 @@ public function delete_all_logs(): int { return 0; } - // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery -- explicit destructive admin action to clear the action log table. + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- explicit destructive admin action to clear the action log table. $result = $wpdb->query( $prepared_query ); return false === $result ? 0 : max( 0, (int) $result ); From ba386dce43e0872c39cd351e7768c391be3d828a Mon Sep 17 00:00:00 2001 From: Brad Vincent Date: Thu, 7 May 2026 17:50:15 +0100 Subject: [PATCH 9/9] Keep SSE framing raw --- includes/rest/class-chat-controller.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/includes/rest/class-chat-controller.php b/includes/rest/class-chat-controller.php index b124b5e..f397969 100644 --- a/includes/rest/class-chat-controller.php +++ b/includes/rest/class-chat-controller.php @@ -495,7 +495,8 @@ private function start_stream_response(): void { @ob_implicit_flush( true ); } - echo esc_html( ':' . str_repeat( ' ', 4096 ) . "\n\n" ); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- SSE padding is fixed protocol framing and must remain raw text/event-stream content. + echo ':' . str_repeat( ' ', 4096 ) . "\n\n"; flush(); } @@ -518,10 +519,12 @@ private static function send_stream_frame( string $type, array $payload ): void return; } - echo esc_html( "event: {$type}\n" ); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Event type is sanitized and SSE framing must remain raw text/event-stream content. + echo "event: {$type}\n"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- SSE data is JSON encoded and must remain raw text/event-stream content. echo 'data: ' . $frame . "\n\n"; - echo esc_html( ':' . str_repeat( ' ', 2048 ) . "\n\n" ); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- SSE padding is fixed protocol framing and must remain raw text/event-stream content. + echo ':' . str_repeat( ' ', 2048 ) . "\n\n"; if ( function_exists( 'ob_flush' ) ) { @ob_flush();