diff --git a/.gitignore b/.gitignore index 5439639..90d18fd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Dependencies node_modules/ +package-lock.json # Build artifacts (keep build/ for distribution) # build/ diff --git a/build/.gitkeep b/build/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/build/settings-rtl.css b/build/settings-rtl.css new file mode 100644 index 0000000..ab59822 --- /dev/null +++ b/build/settings-rtl.css @@ -0,0 +1 @@ +.press-this-extended-settings{margin-top:20px;max-width:800px}.press-this-extended-settings .components-notice{margin-bottom:20px}.press-this-extended-settings .components-panel{margin-bottom:16px}.press-this-extended-settings .components-panel__body{background:#fff;border:1px solid #e0e0e0}.press-this-extended-settings .settings-section{margin-bottom:24px}.press-this-extended-settings .settings-section__description{color:#757575;font-size:13px;margin-bottom:16px}.press-this-extended-settings .setting-row{border-bottom:1px solid #f0f0f0;margin-bottom:20px;padding-bottom:20px}.press-this-extended-settings .setting-row:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0}.press-this-extended-settings .setting-row .components-base-control__help{color:#757575;margin-top:4px}.press-this-extended-settings .block-picker__categories,.press-this-extended-settings .block-picker__search{margin-bottom:16px}.press-this-extended-settings .block-picker__category-buttons{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}.press-this-extended-settings .block-picker__list{background:#f9f9f9;border:1px solid #e0e0e0;border-radius:4px;max-height:400px;overflow-y:auto;padding:8px}.press-this-extended-settings .block-picker__category{margin-bottom:16px}.press-this-extended-settings .block-picker__category:last-child{margin-bottom:0}.press-this-extended-settings .block-picker__category-title{color:#1e1e1e;font-size:13px;font-weight:600;margin-bottom:8px;text-transform:capitalize}.press-this-extended-settings .block-picker__blocks{display:grid;gap:8px;grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.press-this-extended-settings .block-picker__block{align-items:center;background:#fff;border:1px solid #e0e0e0;border-radius:4px;cursor:pointer;display:flex;padding:8px 12px;transition:all .15s ease}.press-this-extended-settings .block-picker__block:hover{border-color:#007cba}.press-this-extended-settings .block-picker__block--selected{background:#f0f7fc;border-color:#007cba}.press-this-extended-settings .block-picker__block .components-checkbox-control{margin-bottom:0}.press-this-extended-settings .block-picker__block .components-checkbox-control__input-container{margin-left:8px}.press-this-extended-settings .block-picker__block-name{color:#1e1e1e;font-size:13px}.press-this-extended-settings .block-picker__selected-count{background:#f0f7fc;border-radius:4px;color:#007cba;font-size:13px;margin-top:12px;padding:8px 12px}.press-this-extended-settings .block-picker__actions{display:flex;gap:8px;margin-top:12px}.press-this-extended-settings .save-button-wrapper{align-items:center;display:flex;gap:12px;margin-top:24px}.press-this-extended-settings .save-button-wrapper .save-notice{color:#00a32a;font-size:13px}.press-this-extended-settings .version-notice{background:#fff8e5;border-right:4px solid #dba617;border-radius:4px;margin-bottom:24px;padding:16px}.press-this-extended-settings .version-notice__title{font-weight:600;margin-bottom:4px}.press-this-extended-settings .version-notice__text{color:#50575e;margin:0}.press-this-extended-settings .not-installed-notice{background:#fcf0f1;border-right:4px solid #d63638;border-radius:4px;margin-bottom:24px;padding:16px}.press-this-extended-settings .not-installed-notice__title{color:#d63638;font-weight:600;margin-bottom:4px}.press-this-extended-settings .not-installed-notice__text{color:#50575e;margin:0}.press-this-extended-settings .formatting-textarea .components-textarea-control__input{font-family:monospace;font-size:13px}.press-this-extended-settings .advanced-warning{background:#fff8e5;border-radius:4px;color:#50575e;font-size:13px;margin-bottom:16px;padding:12px} diff --git a/build/settings.asset.php b/build/settings.asset.php new file mode 100644 index 0000000..06c41a8 --- /dev/null +++ b/build/settings.asset.php @@ -0,0 +1 @@ + array('react', 'wp-api-fetch', 'wp-components', 'wp-element', 'wp-i18n'), 'version' => 'c413be9b53a7aaf016d5'); diff --git a/build/settings.css b/build/settings.css new file mode 100644 index 0000000..48248f8 --- /dev/null +++ b/build/settings.css @@ -0,0 +1 @@ +.press-this-extended-settings{margin-top:20px;max-width:800px}.press-this-extended-settings .components-notice{margin-bottom:20px}.press-this-extended-settings .components-panel{margin-bottom:16px}.press-this-extended-settings .components-panel__body{background:#fff;border:1px solid #e0e0e0}.press-this-extended-settings .settings-section{margin-bottom:24px}.press-this-extended-settings .settings-section__description{color:#757575;font-size:13px;margin-bottom:16px}.press-this-extended-settings .setting-row{border-bottom:1px solid #f0f0f0;margin-bottom:20px;padding-bottom:20px}.press-this-extended-settings .setting-row:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0}.press-this-extended-settings .setting-row .components-base-control__help{color:#757575;margin-top:4px}.press-this-extended-settings .block-picker__categories,.press-this-extended-settings .block-picker__search{margin-bottom:16px}.press-this-extended-settings .block-picker__category-buttons{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}.press-this-extended-settings .block-picker__list{background:#f9f9f9;border:1px solid #e0e0e0;border-radius:4px;max-height:400px;overflow-y:auto;padding:8px}.press-this-extended-settings .block-picker__category{margin-bottom:16px}.press-this-extended-settings .block-picker__category:last-child{margin-bottom:0}.press-this-extended-settings .block-picker__category-title{color:#1e1e1e;font-size:13px;font-weight:600;margin-bottom:8px;text-transform:capitalize}.press-this-extended-settings .block-picker__blocks{display:grid;gap:8px;grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.press-this-extended-settings .block-picker__block{align-items:center;background:#fff;border:1px solid #e0e0e0;border-radius:4px;cursor:pointer;display:flex;padding:8px 12px;transition:all .15s ease}.press-this-extended-settings .block-picker__block:hover{border-color:#007cba}.press-this-extended-settings .block-picker__block--selected{background:#f0f7fc;border-color:#007cba}.press-this-extended-settings .block-picker__block .components-checkbox-control{margin-bottom:0}.press-this-extended-settings .block-picker__block .components-checkbox-control__input-container{margin-right:8px}.press-this-extended-settings .block-picker__block-name{color:#1e1e1e;font-size:13px}.press-this-extended-settings .block-picker__selected-count{background:#f0f7fc;border-radius:4px;color:#007cba;font-size:13px;margin-top:12px;padding:8px 12px}.press-this-extended-settings .block-picker__actions{display:flex;gap:8px;margin-top:12px}.press-this-extended-settings .save-button-wrapper{align-items:center;display:flex;gap:12px;margin-top:24px}.press-this-extended-settings .save-button-wrapper .save-notice{color:#00a32a;font-size:13px}.press-this-extended-settings .version-notice{background:#fff8e5;border-left:4px solid #dba617;border-radius:4px;margin-bottom:24px;padding:16px}.press-this-extended-settings .version-notice__title{font-weight:600;margin-bottom:4px}.press-this-extended-settings .version-notice__text{color:#50575e;margin:0}.press-this-extended-settings .not-installed-notice{background:#fcf0f1;border-left:4px solid #d63638;border-radius:4px;margin-bottom:24px;padding:16px}.press-this-extended-settings .not-installed-notice__title{color:#d63638;font-weight:600;margin-bottom:4px}.press-this-extended-settings .not-installed-notice__text{color:#50575e;margin:0}.press-this-extended-settings .formatting-textarea .components-textarea-control__input{font-family:monospace;font-size:13px}.press-this-extended-settings .advanced-warning{background:#fff8e5;border-radius:4px;color:#50575e;font-size:13px;margin-bottom:16px;padding:12px} diff --git a/build/settings.js b/build/settings.js new file mode 100644 index 0000000..0fdca1c --- /dev/null +++ b/build/settings.js @@ -0,0 +1 @@ +(()=>{"use strict";var e={n:t=>{var s=t&&t.__esModule?()=>t.default:()=>t;return e.d(s,{a:s}),s},d:(t,s)=>{for(var n in s)e.o(s,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:s[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.React,s=window.wp.element,n=window.wp.components,a=window.wp.i18n,l=window.wp.apiFetch;var r=e.n(l);const i=["core/paragraph","core/heading","core/image","core/quote","core/list","core/list-item","core/embed","core/post-featured-image"],o=[...i,"core/video","core/audio","core/gallery","core/separator","core/spacer"],c={text:(0,a.__)("Text","press-this-extended"),media:(0,a.__)("Media","press-this-extended"),design:(0,a.__)("Design","press-this-extended"),widgets:(0,a.__)("Widgets","press-this-extended"),theme:(0,a.__)("Theme","press-this-extended"),embed:(0,a.__)("Embeds","press-this-extended"),common:(0,a.__)("Common","press-this-extended"),formatting:(0,a.__)("Formatting","press-this-extended"),layout:(0,a.__)("Layout","press-this-extended"),reusable:(0,a.__)("Reusable","press-this-extended")},d=({blocks:e,selectedBlocks:l,onChange:r})=>{const[d,m]=(0,s.useState)(""),[p,u]=(0,s.useState)(new Set(["text","media"])),{filteredBlocks:_,groupedBlocks:h,categories:g}=(0,s.useMemo)(()=>{const t=d.toLowerCase().trim(),s=t?e.filter(e=>e.name.toLowerCase().includes(t)||e.title.toLowerCase().includes(t)||(e.keywords||[]).some(e=>e.toLowerCase().includes(t))):e,n={},a=new Set;return s.forEach(e=>{const t=e.category||"common";a.add(t),n[t]||(n[t]=[]),n[t].push(e)}),Object.values(n).forEach(e=>{e.sort((e,t)=>e.title.localeCompare(t.title))}),{filteredBlocks:s,groupedBlocks:n,categories:Array.from(a).sort()}},[e,d]),b=(0,s.useCallback)(e=>l.includes(e),[l]),k=(0,s.useCallback)(e=>{const t=b(e)?l.filter(t=>t!==e):[...l,e];r(t)},[l,b,r]),v=(0,s.useCallback)(e=>{const t=(h[e]||[]).map(e=>e.name);let s;if(t.every(e=>l.includes(e)))s=l.filter(e=>!t.includes(e));else{const e=t.filter(e=>!l.includes(e));s=[...l,...e]}r(s)},[h,l,r]),x=(0,s.useCallback)(()=>{const e=_.map(e=>e.name),t=[...new Set([...l,...e])];r(t)},[_,l,r]),E=(0,s.useCallback)(()=>{const e=new Set(_.map(e=>e.name)),t=l.filter(t=>!e.has(t));r(t)},[_,l,r]),f=(0,s.useCallback)(()=>{r([...i])},[r]),y=(0,s.useCallback)(()=>{r([...o])},[r]),C=(0,s.useCallback)(e=>{u(t=>{const s=new Set(t);return s.has(e)?s.delete(e):s.add(e),s})},[]),w=(0,s.useCallback)(e=>(h[e]||[]).filter(e=>b(e.name)).length,[h,b]);return(0,t.createElement)("div",{className:"block-picker"},(0,t.createElement)("label",{className:"components-base-control__label"},(0,a.__)("Allowed Blocks","press-this-extended")),(0,t.createElement)("p",{className:"components-base-control__help"},(0,a.__)("Select which blocks are available in the Press This editor.","press-this-extended")),(0,t.createElement)("div",{className:"block-picker__search"},(0,t.createElement)(n.SearchControl,{value:d,onChange:m,placeholder:(0,a.__)("Search blocks...","press-this-extended")})),(0,t.createElement)("div",{className:"block-picker__actions"},(0,t.createElement)(n.Button,{variant:"secondary",size:"small",onClick:x},(0,a.__)("Select All","press-this-extended")),(0,t.createElement)(n.Button,{variant:"secondary",size:"small",onClick:E},(0,a.__)("Deselect All","press-this-extended")),(0,t.createElement)(n.Button,{variant:"tertiary",size:"small",onClick:f},(0,a.__)("Reset to Defaults","press-this-extended")),(0,t.createElement)(n.Button,{variant:"tertiary",size:"small",onClick:y},(0,a.__)("Recommended","press-this-extended"))),(0,t.createElement)("div",{className:"block-picker__list"},0===g.length?(0,t.createElement)("p",null,(0,a.__)("No blocks found.","press-this-extended")):g.map(e=>{const s=h[e]||[],l=w(e),r=s.length,i=p.has(e)||d;return(0,t.createElement)("div",{className:"block-picker__category",key:e},(0,t.createElement)("button",{type:"button",className:"block-picker__category-header",onClick:()=>C(e),"aria-expanded":!!i,style:{display:"flex",justifyContent:"space-between",alignItems:"center",cursor:"pointer",padding:"8px 0",background:"none",border:"none",borderBottom:"1px solid #e0e0e0",width:"100%",font:"inherit",textAlign:"left"}},(0,t.createElement)("span",{className:"block-picker__category-title"},c[e]||e,(0,t.createElement)("span",{style:{marginLeft:"8px",color:"#757575",fontSize:"0.9em"}},"(",l,"/",r,")")),(0,t.createElement)("div",{style:{display:"flex",alignItems:"center",gap:"8px"}},(0,t.createElement)(n.Button,{variant:"tertiary",size:"small",onClick:t=>{t.stopPropagation(),v(e)}},l===r?(0,a.__)("Deselect all","press-this-extended"):(0,a.__)("Select all","press-this-extended")),(0,t.createElement)("span",{style:{fontSize:"12px"}},i?"▼":"▶"))),i&&(0,t.createElement)("div",{className:"block-picker__blocks"},s.map(e=>(0,t.createElement)("label",{key:e.name,className:"block-picker__block "+(b(e.name)?"block-picker__block--selected":"")},(0,t.createElement)(n.CheckboxControl,{checked:b(e.name),onChange:()=>k(e.name)}),(0,t.createElement)("span",{className:"block-picker__block-name"},e.title)))))})),(0,t.createElement)("div",{className:"block-picker__selected-count"},(0,a.__)("Selected:","press-this-extended")," ",l.length," ",(0,a.__)("blocks","press-this-extended")))},{restUrl:m,nonce:p,version:u,postFormats:_}=window.pressThisExtendedSettings||{};void 0!==p&&p&&r().use(r().createNonceMiddleware(p));const h=()=>{const[e,l]=(0,s.useState)(!0),[i,o]=(0,s.useState)(!1),[c,p]=(0,s.useState)(!1),[h,g]=(0,s.useState)(null),[b,k]=(0,s.useState)({}),[v,x]=(0,s.useState)({}),[E,f]=(0,s.useState)([]),[y]=(0,s.useState)(u||{}),[C,w]=(0,s.useState)([]),[N,S]=(0,s.useState)([]),T=(0,s.useRef)(null);(0,s.useEffect)(()=>{(async()=>{try{l(!0),g(null);const[e,t,s]=await Promise.all([r()({url:`${m}/settings`}),r()({url:`${m}/post-types`}),r()({url:`${m}/blocks`})]);k(e.values||{}),x(e.definitions||{}),f(e.available||[]),w(t||[]),S(s||[])}catch(e){g(e.message||(0,a.__)("Failed to load settings","press-this-extended"))}finally{l(!1)}})()},[]),(0,s.useEffect)(()=>()=>{T.current&&clearTimeout(T.current)},[]);const P=(0,s.useCallback)((e,t)=>{k(s=>({...s,[e]:t})),p(!1)},[]),B=(0,s.useCallback)(async()=>{try{o(!0),g(null);const e=await r()({url:`${m}/settings`,method:"POST",data:b});k(e.values||{}),p(!0),T.current&&clearTimeout(T.current),T.current=setTimeout(()=>p(!1),3e3)}catch(e){g(e.message||(0,a.__)("Failed to save settings","press-this-extended"))}finally{o(!1)}},[b]),O=(0,s.useCallback)(e=>E.includes(e),[E]),j={};Object.entries(v).forEach(([e,t])=>{const s=t.section||"general";j[s]||(j[s]=[]),j[s].push({key:e,def:t})});const L={content:{title:(0,a.__)("Content Discovery","press-this-extended"),description:(0,a.__)("Control how Press This discovers and suggests content from source pages.","press-this-extended")},formatting:{title:(0,a.__)("Content Formatting","press-this-extended"),description:(0,a.__)("Customize the HTML templates used for blockquotes and citations.","press-this-extended")},redirection:{title:(0,a.__)("Redirection","press-this-extended"),description:(0,a.__)("Control where users are redirected after saving or publishing.","press-this-extended")},blocks:{title:(0,a.__)("Block Editor","press-this-extended"),description:(0,a.__)("Configure which blocks are available in the Press This block editor.","press-this-extended")},post:{title:(0,a.__)("Post Settings","press-this-extended"),description:(0,a.__)("Configure post type and format settings for new Press This posts.","press-this-extended")},media:{title:(0,a.__)("Media Settings","press-this-extended"),description:(0,a.__)("Configure media sideloading limits and allowed file types.","press-this-extended")},advanced:{title:(0,a.__)("Advanced Settings","press-this-extended"),description:(0,a.__)("Advanced configuration options. Change these only if you know what you are doing.","press-this-extended")}};return e?(0,t.createElement)("div",{className:"press-this-extended-settings"},(0,t.createElement)(n.Spinner,null),(0,t.createElement)("p",null,(0,a.__)("Loading settings...","press-this-extended"))):(0,t.createElement)("div",{className:"press-this-extended-settings"},h&&(0,t.createElement)(n.Notice,{status:"error",isDismissible:!0,onRemove:()=>g(null)},h),y.installed?1===y.major_version?(0,t.createElement)("div",{className:"version-notice"},(0,t.createElement)("div",{className:"version-notice__title"},(0,a.__)("Press This 1.x Detected","press-this-extended")),(0,t.createElement)("p",{className:"version-notice__text"},(0,a.__)("You are using Press This version 1.x. Some advanced features like block selection are only available in Press This 2.x.","press-this-extended"))):null:(0,t.createElement)("div",{className:"not-installed-notice"},(0,t.createElement)("div",{className:"not-installed-notice__title"},(0,a.__)("Press This Not Detected","press-this-extended")),(0,t.createElement)("p",{className:"not-installed-notice__text"},(0,a.__)("The Press This plugin does not appear to be installed. Please install and activate Press This to use these settings.","press-this-extended"))),(0,t.createElement)(n.Panel,null,Object.entries(L).map(([e,s])=>{const l=(j[e]||[]).filter(({key:e})=>O(e));return 0===l.length?null:(0,t.createElement)(n.PanelBody,{key:e,title:s.title,initialOpen:"content"===e},(0,t.createElement)("div",{className:"settings-section"},(0,t.createElement)("p",{className:"settings-section__description"},s.description),"advanced"===e&&(0,t.createElement)("div",{className:"advanced-warning"},(0,a.__)("These settings can affect security and performance. Only modify them if you understand the implications.","press-this-extended")),l.map(({key:e,def:s})=>((e,s)=>{var a;if(!O(e))return null;const l=null!==(a=b[e])&&void 0!==a?a:s.default;switch(s.type){case"boolean":return(0,t.createElement)("div",{className:"setting-row",key:e},(0,t.createElement)(n.ToggleControl,{label:s.label,help:s.description,checked:!!l,onChange:t=>P(e,t)}));case"string":if("post_type"===e&&C.length>0){const a=C.map(e=>({value:e.name,label:e.label}));return(0,t.createElement)("div",{className:"setting-row",key:e},(0,t.createElement)(n.SelectControl,{label:s.label,help:s.description,value:l||"",options:a,onChange:t=>P(e,t)}))}if(s.options){let a=[];return a="post_formats"===s.options?Object.entries(_||{}).map(([e,t])=>({value:e,label:t})):Object.entries(s.options).map(([e,t])=>({value:e,label:t})),(0,t.createElement)("div",{className:"setting-row",key:e},(0,t.createElement)(n.SelectControl,{label:s.label,help:s.description,value:l||"",options:a,onChange:t=>P(e,t)}))}return(0,t.createElement)("div",{className:"setting-row formatting-textarea",key:e},(0,t.createElement)(n.TextareaControl,{label:s.label,help:s.description,value:l||"",onChange:t=>P(e,t),rows:3}));case"integer":return(0,t.createElement)("div",{className:"setting-row",key:e},(0,t.createElement)(n.RangeControl,{label:s.label,help:s.description,value:l||s.default,onChange:t=>P(e,t),min:s.min||1,max:s.max||100}));case"array":return"allowed_blocks"===e?(0,t.createElement)("div",{className:"setting-row",key:e},(0,t.createElement)(d,{blocks:N,selectedBlocks:l||[],onChange:t=>P(e,t)})):s.options?(0,t.createElement)("div",{className:"setting-row",key:e},(0,t.createElement)("fieldset",null,(0,t.createElement)("legend",{className:"components-base-control__label"},s.label),s.description&&(0,t.createElement)("p",{className:"components-base-control__help"},s.description),Object.entries(s.options).map(([s,a])=>(0,t.createElement)(n.CheckboxControl,{key:s,label:a,checked:(l||[]).includes(s),onChange:t=>{const n=l||[],a=t?[...n,s]:n.filter(e=>e!==s);P(e,a)}})))):null;default:return null}})(e,s))))})),(0,t.createElement)("div",{className:"save-button-wrapper"},(0,t.createElement)(n.Button,{variant:"primary",onClick:B,disabled:i,isBusy:i},i?(0,a.__)("Saving...","press-this-extended"):(0,a.__)("Save Settings","press-this-extended")),c&&(0,t.createElement)("span",{className:"save-notice"},(0,a.__)("Settings saved!","press-this-extended"))))};document.addEventListener("DOMContentLoaded",()=>{const e=document.getElementById("press-this-extended-settings");e&&(0,s.createRoot)(e).render((0,t.createElement)(h,null))})})(); \ No newline at end of file diff --git a/includes/class-settings.php b/includes/class-settings.php index 26fe3a9..6afd7c2 100644 --- a/includes/class-settings.php +++ b/includes/class-settings.php @@ -427,6 +427,14 @@ public function get_settings() { public function update_settings( $request ) { $params = $request->get_json_params(); + if ( ! is_array( $params ) ) { + return new \WP_Error( + 'press_this_extended_invalid_request', + __( 'Invalid request body', 'press-this-extended' ), + array( 'status' => 400 ) + ); + } + foreach ( $params as $key => $value ) { if ( ! isset( $this->settings[ $key ] ) ) { continue; diff --git a/includes/class-version-detector.php b/includes/class-version-detector.php index 262c534..b61394b 100644 --- a/includes/class-version-detector.php +++ b/includes/class-version-detector.php @@ -121,13 +121,9 @@ private static function get_capabilities_for_version( $major_version ) { 'post_type', 'post_format_override', 'default_post_format', - 'post_format_suggestion', 'sideload_allowed_types', 'sideload_max_size', 'enable_url_proxy', - 'validate_proxy_url', - 'validate_request_ip', - 'press_this_data', ); if ( $major_version >= 2 ) { diff --git a/package.json b/package.json index ae5de56..a3f1fb3 100644 --- a/package.json +++ b/package.json @@ -13,11 +13,8 @@ }, "dependencies": { "@wordpress/api-fetch": "^6.0.0", - "@wordpress/block-editor": "^12.0.0", "@wordpress/components": "^25.0.0", - "@wordpress/data": "^9.0.0", "@wordpress/element": "^5.0.0", - "@wordpress/i18n": "^4.0.0", - "@wordpress/icons": "^9.0.0" + "@wordpress/i18n": "^4.0.0" } } diff --git a/src/settings/components/BlockPicker.js b/src/settings/components/BlockPicker.js index c639b2c..7c6c155 100644 --- a/src/settings/components/BlockPicker.js +++ b/src/settings/components/BlockPicker.js @@ -9,7 +9,6 @@ import { Button, CheckboxControl, SearchControl, - __experimentalText as Text, } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; @@ -49,6 +48,9 @@ const CATEGORY_NAMES = { reusable: __( 'Reusable', 'press-this-extended' ), }; +// UI Constants +const MUTED_TEXT_COLOR = '#757575'; + const BlockPicker = ( { blocks, selectedBlocks, onChange } ) => { const [ searchQuery, setSearchQuery ] = useState( '' ); const [ expandedCategories, setExpandedCategories ] = useState( new Set( [ 'text', 'media' ] ) ); @@ -232,13 +234,15 @@ const BlockPicker = ( { blocks, selectedBlocks, onChange } ) => { > { CATEGORY_NAMES[ category ] || category } - ({ selectedCount }/{ totalCount }) - +