diff --git a/.gitignore b/.gitignore index 03846a9..4c85268 100644 --- a/.gitignore +++ b/.gitignore @@ -10,10 +10,7 @@ coverage # Webpack dev build build/runtime* -build/*.hot-update.json -build/*.hot-update.js -build/*.hot-update.js.map -build/*.hot-update.asset.php +build/*.hot-update.* # Compiled binary addons (https://nodejs.org/api/addons.html) build/Release diff --git a/.wordpress-org/screenshot-1.png b/.wordpress-org/screenshot-1.png index d076974..ea433ab 100644 Binary files a/.wordpress-org/screenshot-1.png and b/.wordpress-org/screenshot-1.png differ diff --git a/.wordpress-org/screenshot-2.png b/.wordpress-org/screenshot-2.png index 038bc86..917e474 100644 Binary files a/.wordpress-org/screenshot-2.png and b/.wordpress-org/screenshot-2.png differ diff --git a/.wordpress-org/screenshot-3.png b/.wordpress-org/screenshot-3.png index 93f720a..6146121 100644 Binary files a/.wordpress-org/screenshot-3.png and b/.wordpress-org/screenshot-3.png differ diff --git a/build/admin.asset.php b/build/admin.asset.php index 2037e88..70bd6f4 100644 --- a/build/admin.asset.php +++ b/build/admin.asset.php @@ -1 +1 @@ - array('lodash', 'react', 'react-dom', 'wp-api-fetch', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '887c0e1e533c07cd892b'); + array('lodash', 'react', 'react-dom', 'wp-api-fetch', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => 'dd1b4d7442e2f4d64e57'); diff --git a/build/admin.js b/build/admin.js index a6575f4..0a271fc 100644 --- a/build/admin.js +++ b/build/admin.js @@ -1,4 +1,4 @@ -(()=>{"use strict";var e,t={297:(e,t,n)=>{var r={};n.r(r),n.d(r,{setActivePage:()=>Q});var i={};n.r(i),n.d(i,{getActivePage:()=>Y});var s={};n.r(s),n.d(s,{updateSettings:()=>ie});var a={};n.r(a),n.d(a,{getError:()=>le,getSetting:()=>ae,getSettings:()=>se,getUpdating:()=>oe});const o=window.wp.element;function l(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t=0||(i[n]=e[n]);return i}const g=window.ReactDOM;var h=n.n(g);const E=m().createContext(null);var v=function(e){return e.scrollTop},b="unmounted",y="exited",x="entering",S="entered",_="exiting",C=function(e){function t(t,n){var r;r=e.call(this,t,n)||this;var i,s=n&&!n.isMounting?t.enter:t.appear;return r.appearStatus=null,t.in?s?(i=y,r.appearStatus=x):i=S:i=t.unmountOnExit||t.mountOnEnter?b:y,r.state={status:i},r.nextCallback=null,r}d(t,e),t.getDerivedStateFromProps=function(e,t){return e.in&&t.status===b?{status:y}:null};var n=t.prototype;return n.componentDidMount=function(){this.updateStatus(!0,this.appearStatus)},n.componentDidUpdate=function(e){var t=null;if(e!==this.props){var n=this.state.status;this.props.in?n!==x&&n!==S&&(t=x):n!==x&&n!==S||(t=_)}this.updateStatus(!1,t)},n.componentWillUnmount=function(){this.cancelNextCallback()},n.getTimeouts=function(){var e,t,n,r=this.props.timeout;return e=t=n=r,null!=r&&"number"!=typeof r&&(e=r.exit,t=r.enter,n=void 0!==r.appear?r.appear:t),{exit:e,enter:t,appear:n}},n.updateStatus=function(e,t){if(void 0===e&&(e=!1),null!==t)if(this.cancelNextCallback(),t===x){if(this.props.unmountOnExit||this.props.mountOnEnter){var n=this.props.nodeRef?this.props.nodeRef.current:h().findDOMNode(this);n&&v(n)}this.performEnter(e)}else this.performExit();else this.props.unmountOnExit&&this.state.status===y&&this.setState({status:b})},n.performEnter=function(e){var t=this,n=this.props.enter,r=this.context?this.context.isMounting:e,i=this.props.nodeRef?[r]:[h().findDOMNode(this),r],s=i[0],a=i[1],o=this.getTimeouts(),l=r?o.appear:o.enter;e||n?(this.props.onEnter(s,a),this.safeSetState({status:x},(function(){t.props.onEntering(s,a),t.onTransitionEnd(l,(function(){t.safeSetState({status:S},(function(){t.props.onEntered(s,a)}))}))}))):this.safeSetState({status:S},(function(){t.props.onEntered(s)}))},n.performExit=function(){var e=this,t=this.props.exit,n=this.getTimeouts(),r=this.props.nodeRef?void 0:h().findDOMNode(this);t?(this.props.onExit(r),this.safeSetState({status:_},(function(){e.props.onExiting(r),e.onTransitionEnd(n.exit,(function(){e.safeSetState({status:y},(function(){e.props.onExited(r)}))}))}))):this.safeSetState({status:y},(function(){e.props.onExited(r)}))},n.cancelNextCallback=function(){null!==this.nextCallback&&(this.nextCallback.cancel(),this.nextCallback=null)},n.safeSetState=function(e,t){t=this.setNextCallback(t),this.setState(e,t)},n.setNextCallback=function(e){var t=this,n=!0;return this.nextCallback=function(r){n&&(n=!1,t.nextCallback=null,e(r))},this.nextCallback.cancel=function(){n=!1},this.nextCallback},n.onTransitionEnd=function(e,t){this.setNextCallback(t);var n=this.props.nodeRef?this.props.nodeRef.current:h().findDOMNode(this),r=null==e&&!this.props.addEndListener;if(n&&!r){if(this.props.addEndListener){var i=this.props.nodeRef?[this.nextCallback]:[n,this.nextCallback],s=i[0],a=i[1];this.props.addEndListener(s,a)}null!=e&&setTimeout(this.nextCallback,e)}else setTimeout(this.nextCallback,0)},n.render=function(){var e=this.state.status;if(e===b)return null;var t=this.props,n=t.children,r=(t.in,t.mountOnEnter,t.unmountOnExit,t.appear,t.enter,t.exit,t.timeout,t.addEndListener,t.onEnter,t.onEntering,t.onEntered,t.onExit,t.onExiting,t.onExited,t.nodeRef,f(t,["children","in","mountOnEnter","unmountOnExit","appear","enter","exit","timeout","addEndListener","onEnter","onEntering","onEntered","onExit","onExiting","onExited","nodeRef"]));return m().createElement(E.Provider,{value:null},"function"==typeof n?n(e,r):m().cloneElement(m().Children.only(n),r))},t}(m().Component);function N(){}C.contextType=E,C.propTypes={},C.defaultProps={in:!1,mountOnEnter:!1,unmountOnExit:!1,appear:!1,enter:!0,exit:!0,onEnter:N,onEntering:N,onEntered:N,onExit:N,onExiting:N,onExited:N},C.UNMOUNTED=b,C.EXITED=y,C.ENTERING=x,C.ENTERED=S,C.EXITING=_;const k=C;var O,w,T="out-in",P="in-out",A=function(e,t,n){return function(){var r;e.props[t]&&(r=e.props)[t].apply(r,arguments),n()}},D=((O={})[T]=function(e){var t=e.current,n=e.changeState;return m().cloneElement(t,{in:!1,onExited:A(t,"onExited",(function(){n(x,null)}))})},O[P]=function(e){var t=e.current,n=e.changeState,r=e.children;return[t,m().cloneElement(r,{in:!0,onEntered:A(r,"onEntered",(function(){n(x)}))})]},O),M=((w={})[T]=function(e){var t=e.children,n=e.changeState;return m().cloneElement(t,{in:!0,onEntered:A(t,"onEntered",(function(){n(S,m().cloneElement(t,{in:!0}))}))})},w[P]=function(e){var t=e.current,n=e.children,r=e.changeState;return[m().cloneElement(t,{in:!1,onExited:A(t,"onExited",(function(){r(S,m().cloneElement(n,{in:!0}))}))}),m().cloneElement(n,{in:!0})]},w),I=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),i=0;i{$&&($=!1,document.body.classList.add("mind-admin-first-loading-start"),setTimeout((()=>{document.body.classList.remove("mind-admin-first-loading-start","mind-admin-first-loading")}),8e3))}),[]),null}const W=window.lodash;var H,B;function X(){return X=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const{getSettings:t}=e("mind/settings");return{settings:t()}}));return(0,o.createElement)(o.Fragment,null,(0,o.createElement)("p",{dangerouslySetInnerHTML:{__html:(0,V.sprintf)( +(()=>{"use strict";var e,t={925:(e,t,n)=>{var i={};n.r(i),n.d(i,{setActivePage:()=>Y});var a={};n.r(a),n.d(a,{getActivePage:()=>ee});var r={};n.r(r),n.d(r,{updateSettings:()=>re});var s={};n.r(s),n.d(s,{getError:()=>ce,getSetting:()=>oe,getSettings:()=>se,getUpdating:()=>le});const o=window.wp.element;function l(e){var t,n,i="";if("string"==typeof e||"number"==typeof e)i+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t=0||(a[n]=e[n]);return a}const g=window.ReactDOM;var h=n.n(g);const E=m().createContext(null);var v=function(e){return e.scrollTop},_="unmounted",y="exited",b="entering",x="entered",S="exiting",C=function(e){function t(t,n){var i;i=e.call(this,t,n)||this;var a,r=n&&!n.isMounting?t.enter:t.appear;return i.appearStatus=null,t.in?r?(a=y,i.appearStatus=b):a=x:a=t.unmountOnExit||t.mountOnEnter?_:y,i.state={status:a},i.nextCallback=null,i}u(t,e),t.getDerivedStateFromProps=function(e,t){return e.in&&t.status===_?{status:y}:null};var n=t.prototype;return n.componentDidMount=function(){this.updateStatus(!0,this.appearStatus)},n.componentDidUpdate=function(e){var t=null;if(e!==this.props){var n=this.state.status;this.props.in?n!==b&&n!==x&&(t=b):n!==b&&n!==x||(t=S)}this.updateStatus(!1,t)},n.componentWillUnmount=function(){this.cancelNextCallback()},n.getTimeouts=function(){var e,t,n,i=this.props.timeout;return e=t=n=i,null!=i&&"number"!=typeof i&&(e=i.exit,t=i.enter,n=void 0!==i.appear?i.appear:t),{exit:e,enter:t,appear:n}},n.updateStatus=function(e,t){if(void 0===e&&(e=!1),null!==t)if(this.cancelNextCallback(),t===b){if(this.props.unmountOnExit||this.props.mountOnEnter){var n=this.props.nodeRef?this.props.nodeRef.current:h().findDOMNode(this);n&&v(n)}this.performEnter(e)}else this.performExit();else this.props.unmountOnExit&&this.state.status===y&&this.setState({status:_})},n.performEnter=function(e){var t=this,n=this.props.enter,i=this.context?this.context.isMounting:e,a=this.props.nodeRef?[i]:[h().findDOMNode(this),i],r=a[0],s=a[1],o=this.getTimeouts(),l=i?o.appear:o.enter;e||n?(this.props.onEnter(r,s),this.safeSetState({status:b},(function(){t.props.onEntering(r,s),t.onTransitionEnd(l,(function(){t.safeSetState({status:x},(function(){t.props.onEntered(r,s)}))}))}))):this.safeSetState({status:x},(function(){t.props.onEntered(r)}))},n.performExit=function(){var e=this,t=this.props.exit,n=this.getTimeouts(),i=this.props.nodeRef?void 0:h().findDOMNode(this);t?(this.props.onExit(i),this.safeSetState({status:S},(function(){e.props.onExiting(i),e.onTransitionEnd(n.exit,(function(){e.safeSetState({status:y},(function(){e.props.onExited(i)}))}))}))):this.safeSetState({status:y},(function(){e.props.onExited(i)}))},n.cancelNextCallback=function(){null!==this.nextCallback&&(this.nextCallback.cancel(),this.nextCallback=null)},n.safeSetState=function(e,t){t=this.setNextCallback(t),this.setState(e,t)},n.setNextCallback=function(e){var t=this,n=!0;return this.nextCallback=function(i){n&&(n=!1,t.nextCallback=null,e(i))},this.nextCallback.cancel=function(){n=!1},this.nextCallback},n.onTransitionEnd=function(e,t){this.setNextCallback(t);var n=this.props.nodeRef?this.props.nodeRef.current:h().findDOMNode(this),i=null==e&&!this.props.addEndListener;if(n&&!i){if(this.props.addEndListener){var a=this.props.nodeRef?[this.nextCallback]:[n,this.nextCallback],r=a[0],s=a[1];this.props.addEndListener(r,s)}null!=e&&setTimeout(this.nextCallback,e)}else setTimeout(this.nextCallback,0)},n.render=function(){var e=this.state.status;if(e===_)return null;var t=this.props,n=t.children,i=(t.in,t.mountOnEnter,t.unmountOnExit,t.appear,t.enter,t.exit,t.timeout,t.addEndListener,t.onEnter,t.onEntering,t.onEntered,t.onExit,t.onExiting,t.onExited,t.nodeRef,f(t,["children","in","mountOnEnter","unmountOnExit","appear","enter","exit","timeout","addEndListener","onEnter","onEntering","onEntered","onExit","onExiting","onExited","nodeRef"]));return m().createElement(E.Provider,{value:null},"function"==typeof n?n(e,i):m().cloneElement(m().Children.only(n),i))},t}(m().Component);function k(){}C.contextType=E,C.propTypes={},C.defaultProps={in:!1,mountOnEnter:!1,unmountOnExit:!1,appear:!1,enter:!0,exit:!0,onEnter:k,onEntering:k,onEntered:k,onExit:k,onExiting:k,onExited:k},C.UNMOUNTED=_,C.EXITED=y,C.ENTERING=b,C.ENTERED=x,C.EXITING=S;const N=C;var O,w,P="out-in",T="in-out",A=function(e,t,n){return function(){var i;e.props[t]&&(i=e.props)[t].apply(i,arguments),n()}},D=((O={})[P]=function(e){var t=e.current,n=e.changeState;return m().cloneElement(t,{in:!1,onExited:A(t,"onExited",(function(){n(b,null)}))})},O[T]=function(e){var t=e.current,n=e.changeState,i=e.children;return[t,m().cloneElement(i,{in:!0,onEntered:A(i,"onEntered",(function(){n(b)}))})]},O),I=((w={})[P]=function(e){var t=e.children,n=e.changeState;return m().cloneElement(t,{in:!0,onEntered:A(t,"onEntered",(function(){n(x,m().cloneElement(t,{in:!0}))}))})},w[T]=function(e){var t=e.current,n=e.children,i=e.changeState;return[m().cloneElement(t,{in:!1,onExited:A(t,"onExited",(function(){i(x,m().cloneElement(n,{in:!0}))}))}),m().cloneElement(n,{in:!0})]},w),M=function(e){function t(){for(var t,n=arguments.length,i=new Array(n),a=0;a{Z&&(Z=!1,document.body.classList.add("mind-admin-first-loading-start"),setTimeout((()=>{document.body.classList.remove("mind-admin-first-loading-start","mind-admin-first-loading")}),8e3))}),[]),null}const B=window.lodash;var H,W;function z(){return z=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const{getSettings:t}=e("mind/settings");return{settings:t()}})),n=function(e){const t=e.ai_model||"";let n=!1;return t&&("gpt-4o"===t||"gpt-4o-mini"===t?n=!!e?.openai_api_key:e?.anthropic_api_key&&(n=!!e?.anthropic_api_key)),n}(t);return(0,p.createElement)(p.Fragment,null,(0,p.createElement)("p",{dangerouslySetInnerHTML:{__html:(0,q.sprintf)( // translators: %s - Mind logo. // translators: %s - Mind logo. -(0,V.__)("Hello, my name is %s","mind"),'')}}),(0,o.createElement)("p",null,(0,V.__)("I am an AI assistant designed to help you in writing content for your blog","mind")),t.openai_api_key?(0,o.createElement)("div",{dangerouslySetInnerHTML:{__html:(0,V.__)('To get started, open the page editor and click on the "Open Mind" button in the toolbar',"mind")}}):(0,o.createElement)("div",null,(0,V.__)("To get started, enter your","mind"),(0,o.createElement)("button",{onClick:t=>{t.preventDefault(),e("settings")}},(0,V.__)("OpenAI API key →","mind"))),(0,o.createElement)(Z,null))}},settings:{label:(0,V.__)("Settings","mind"),block:function(){const[e,t]=(0,o.useState)({}),[n,r]=(0,o.useState)(!1),[i,s]=(0,o.useState)(!1),{updateSettings:a}=(0,q.useDispatch)("mind/settings"),{settings:l,updating:u,error:d}=(0,q.useSelect)((e=>{const t=e("mind/settings");return{settings:t.getSettings(),updating:t.getUpdating(),error:t.getError()}}));return(0,o.useEffect)((()=>{t(l)}),[l]),(0,o.useEffect)((()=>{r(!(0,W.isEqual)(l,e))}),[l,e]),(0,o.createElement)(o.Fragment,null,(0,o.createElement)("div",{className:"mind-admin-settings-card"},(0,o.createElement)("div",{className:"mind-admin-settings-card-name"},(0,o.createElement)("label",{htmlFor:"mind-settings-openai-api-key"},(0,V.__)("OpenAI API Key","mind")),(0,o.createElement)("div",{className:"mind-admin-settings-card-description"},(0,V.__)("This setting is required, since our plugin works with OpenAI.","mind")," ",(0,o.createElement)("a",{href:"https://platform.openai.com/account/api-keys",target:"_blank",rel:"noreferrer"},(0,V.__)("Create API key","mind")))),(0,o.createElement)("div",{className:c("mind-admin-settings-card-input",i&&"mind-admin-settings-card-input-error")},(0,o.createElement)("input",{id:"mind-settings-openai-api-key",type:"text",placeholder:(0,V.__)("Enter API key","mind"),value:e.openai_api_key||"",onChange:n=>{n.preventDefault(),t({...e,openai_api_key:n.target.value})}}),i&&(0,o.createElement)("div",{className:"mind-admin-setting-error"},(0,V.__)("Please enter a valid API key","mind")))),d&&(0,o.createElement)("div",{className:"mind-admin-settings-error"},d),(0,o.createElement)("div",{className:"mind-admin-settings-actions"},(0,o.createElement)("button",{disabled:!n,onClick:t=>{var n;t.preventDefault(),!e.openai_api_key||(n=e.openai_api_key,/^sk-[a-zA-Z0-9]{32,}/.test(n))?(s(!1),a(e)):s(!0)}},(0,V.__)("Save Changes","mind"),u&&(0,o.createElement)(z,{viewBox:"0 0 24 24"}))))}},discussions:{label:(0,V.__)("Discussions","mind"),href:"https://github.com/nk-crew/mind/discussions"}},J=[];window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,((e,t,n)=>{J[t]=n}));function Q(e){return{type:"SET_ACTIVE_PAGE",activePage:e}}function Y(e){return e?.activePage||""}const ee=(0,q.createReduxStore)("mind/admin",{reducer:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{activePage:J.sub_page||Object.keys(K)[0]},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return"SET_ACTIVE_PAGE"===t.type&&e.activePage!==t.activePage?{...e,activePage:t.activePage}:e},actions:r,selectors:i});(0,q.register)(ee);const{settings:te}=window.mindAdminData,ne=window.wp.apiFetch;var re=n.n(ne);function ie(e){return t=>{let{dispatch:n}=t;if(!e||!Object.keys(e).length)return;n({type:"UPDATE_SETTINGS_PENDING"});const r={settings:e};re()({path:"/mind/v1/update_settings",method:"POST",data:r}).then((t=>(n({type:"UPDATE_SETTINGS_SUCCESS",settings:e}),t.response))).catch((e=>{n({type:"UPDATE_SETTINGS_ERROR",error:e?.response||e?.error_code||(0,V.__)("Something went wrong, please, try again…","mind")})}))}}function se(e){return e?.settings||{}}function ae(e,t){return e?.settings[t]||""}function oe(e){return e?.updating||!1}function le(e){return e?.error||!1}const ce=(0,q.createReduxStore)("mind/settings",{reducer:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{settings:te,updating:!1,error:""},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};switch(t.type){case"UPDATE_SETTINGS_PENDING":return{...e,updating:!0};case"UPDATE_SETTINGS_SUCCESS":return{...e,updating:!1,settings:{...e.settings,...t.settings}};case"UPDATE_SETTINGS_ERROR":return{...e,updating:!1,error:t.error||""}}return e},actions:s,selectors:a});var ue;function de(){return de=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const{getActivePage:t}=e("mind/admin");return{activePage:t()}}));(0,o.useEffect)((()=>{document.querySelectorAll(".toplevel_page_mind .current").forEach((e=>{e.classList.remove("current")}));let e=document.querySelectorAll(`.toplevel_page_mind [href="admin.php?page=mind&sub_page=${n}"]`);e&&e.length||(e=document.querySelectorAll('.toplevel_page_mind [href="admin.php?page=mind"]')),e.forEach((e=>{e.parentNode.classList.add("current")})),document.body.classList.forEach((e=>{/mind-admin-page-/.test(e)&&document.body.classList.remove(e)})),document.body.classList.add(`mind-admin-page-${n}`),e&&e.length&&window.history.pushState(document.title,document.title,e[0].href)}),[n]);const r=[];let i="";if(Object.keys(K).forEach((e=>{r.push((0,o.createElement)("li",{key:e},(0,o.createElement)("a",{href:K[e]&&K[e].href||"#",target:K[e]&&K[e].href?"_blank":null,rel:"noreferrer",className:c("mind-admin-tabs-button",n===e&&"mind-admin-tabs-button-active"),onClick:n=>{K[e]&&!K[e].href&&(n.preventDefault(),t(e))}},K[e].label)))})),n&&K[n]){const e=K[n].block;i=(0,o.createElement)(e,null)}return(0,o.createElement)(o.Fragment,null,(0,o.createElement)("div",{className:"mind-admin-head"},(0,o.createElement)("div",{className:"mind-admin-head-container"},(0,o.createElement)("div",{className:"mind-admin-head-logo"},(0,o.createElement)(pe,null),(0,o.createElement)("h1",null,(0,V.__)("Mind","mind"))),(0,o.createElement)("ul",{className:"mind-admin-tabs"},r))),(0,o.createElement)(R,{mode:"out-in"},(0,o.createElement)(F,{key:n,nodeRef:e,addEndListener:t=>{e.current.addEventListener("transitionend",t,!1)},classNames:"mind-admin-content-transition"},(0,o.createElement)("div",{ref:e,className:c("mind-admin-content",`mind-admin-content-${n}`)},i))))}window.addEventListener("load",(()=>{(0,o.render)((0,o.createElement)(me,null),document.querySelector(".mind-admin-root"))}))}},n={};function r(e){var i=n[e];if(void 0!==i)return i.exports;var s=n[e]={exports:{}};return t[e](s,s.exports,r),s.exports}r.m=t,e=[],r.O=(t,n,i,s)=>{if(!n){var a=1/0;for(u=0;u=s)&&Object.keys(r.O).every((e=>r.O[e](n[l])))?n.splice(l--,1):(o=!1,s0&&e[u-1][2]>s;u--)e[u]=e[u-1];e[u]=[n,i,s]},r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e={884:0,15:0};r.O.j=t=>0===e[t];var t=(t,n)=>{var i,s,a=n[0],o=n[1],l=n[2],c=0;if(a.some((t=>0!==e[t]))){for(i in o)r.o(o,i)&&(r.m[i]=o[i]);if(l)var u=l(r)}for(t&&t(n);cr(297)));i=r.O(i)})(); \ No newline at end of file +(0,q.__)("Hello, my name is %s","mind"),'')}}),(0,p.createElement)("p",null,(0,q.__)("I am an AI assistant designed to help you in writing content for your blog","mind")),n?(0,p.createElement)("div",{dangerouslySetInnerHTML:{__html:(0,q.__)('To get started, open the page editor and click on the
button in the toolbar',"mind")}}):(0,p.createElement)("div",null,(0,q.__)("To get started,","mind"),(0,p.createElement)("button",{onClick:t=>{t.preventDefault(),e("settings")}},(0,q.__)("select the model and API key →","mind"))),(0,p.createElement)($,null))}},settings:{label:(0,q.__)("Settings","mind"),block:function(){const[e,t]=(0,o.useState)({}),[n,i]=(0,o.useState)(!1),[a,r]=(0,o.useState)(!1),[s,l]=(0,o.useState)(!1),{updateSettings:d}=(0,V.useDispatch)("mind/settings"),{settings:u,updating:m,error:f}=(0,V.useSelect)((e=>{const t=e("mind/settings");return{settings:t.getSettings(),updating:t.getUpdating(),error:t.getError()}}));return(0,o.useEffect)((()=>{t(u)}),[u]),(0,o.useEffect)((()=>{i(!(0,B.isEqual)(u,e))}),[u,e]),(0,p.createElement)(p.Fragment,null,(0,p.createElement)("div",{className:"mind-admin-settings-card"},(0,p.createElement)("div",{className:"mind-admin-settings-card-name"},(0,p.createElement)("label",{htmlFor:"mind-settings-ai-model"},(0,q.__)("Model","mind"))),(0,p.createElement)("div",{className:"mind-admin-settings-card-button-group"},X.map((n=>(0,p.createElement)("button",{key:n.title,onClick:i=>{i.preventDefault(),t({...e,ai_model:n.name})},className:c("mind-admin-settings-card-button",e.ai_model===n.name&&"mind-admin-settings-card-button-active")},n.title,(0,p.createElement)("span",null,n.description)))))),e.ai_model?.includes("claude")&&(0,p.createElement)("div",{className:"mind-admin-settings-card"},(0,p.createElement)("div",{className:"mind-admin-settings-card-name"},(0,p.createElement)("label",{htmlFor:"mind-settings-anthropic-api-key"},(0,q.__)("Anthropic API Key","mind"))),(0,p.createElement)("div",{className:c("mind-admin-settings-card-input",a&&"mind-admin-settings-card-input-error")},(0,p.createElement)("input",{id:"mind-settings-anthropic-api-key",type:"text",placeholder:(0,q.__)("Enter API key","mind"),value:e.anthropic_api_key||"",onChange:n=>{n.preventDefault(),t({...e,anthropic_api_key:n.target.value})}}),a&&(0,p.createElement)("div",{className:"mind-admin-setting-error"},(0,q.__)("Please enter a valid API key","mind"))),(0,p.createElement)("div",{className:"mind-admin-settings-card-description"},(0,q.__)("This setting is required to use Anthropic models.","mind")," ",(0,p.createElement)("a",{href:"https://console.anthropic.com/settings/keys",target:"_blank",rel:"noreferrer"},(0,q.__)("Create API key","mind")))),e.ai_model?.includes("gpt")&&(0,p.createElement)("div",{className:"mind-admin-settings-card"},(0,p.createElement)("div",{className:"mind-admin-settings-card-name"},(0,p.createElement)("label",{htmlFor:"mind-settings-openai-api-key"},(0,q.__)("OpenAI API Key","mind"))),(0,p.createElement)("div",{className:c("mind-admin-settings-card-input",s&&"mind-admin-settings-card-input-error")},(0,p.createElement)("input",{id:"mind-settings-openai-api-key",type:"text",placeholder:(0,q.__)("Enter API key","mind"),value:e.openai_api_key||"",onChange:n=>{n.preventDefault(),t({...e,openai_api_key:n.target.value})}}),s&&(0,p.createElement)("div",{className:"mind-admin-setting-error"},(0,q.__)("Please enter a valid API key","mind"))),(0,p.createElement)("div",{className:"mind-admin-settings-card-description"},(0,q.__)("This setting is required to use OpenAI models.","mind")," ",(0,p.createElement)("a",{href:"https://platform.openai.com/account/api-keys",target:"_blank",rel:"noreferrer"},(0,q.__)("Create API key","mind")))),f&&(0,p.createElement)("div",{className:"mind-admin-settings-error"},f),(0,p.createElement)("div",{className:"mind-admin-settings-actions"},(0,p.createElement)("button",{disabled:!n,onClick:t=>{var n;t.preventDefault(),e.anthropic_api_key&&(n=e.anthropic_api_key,!/^sk-ant-[a-zA-Z0-9]/.test(n))?r(!0):e.openai_api_key&&!function(e){return/^sk-[a-zA-Z0-9]/.test(e)}(e.openai_api_key)?l(!0):(l(!1),r(!1),d(e))}},(0,q.__)("Save Changes","mind"),m&&(0,p.createElement)(K,{viewBox:"0 0 24 24"}))))}},discussions:{label:(0,q.__)("Discussions","mind"),href:"https://github.com/nk-crew/mind/discussions"}},J=[];window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,((e,t,n)=>{J[t]=n}));function Y(e){return{type:"SET_ACTIVE_PAGE",activePage:e}}function ee(e){return e?.activePage||""}const te=(0,V.createReduxStore)("mind/admin",{reducer:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{activePage:J.sub_page||Object.keys(Q)[0]},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return"SET_ACTIVE_PAGE"===t.type&&e.activePage!==t.activePage?{...e,activePage:t.activePage}:e},actions:i,selectors:a});(0,V.register)(te);const{settings:ne}=window.mindAdminData,ie=window.wp.apiFetch;var ae=n.n(ie);function re(e){return t=>{let{dispatch:n}=t;if(!e||!Object.keys(e).length)return;n({type:"UPDATE_SETTINGS_PENDING"});const i={settings:e};ae()({path:"/mind/v1/update_settings",method:"POST",data:i}).then((t=>(n({type:"UPDATE_SETTINGS_SUCCESS",settings:e}),t.response))).catch((e=>{n({type:"UPDATE_SETTINGS_ERROR",error:e?.response||e?.error_code||(0,q.__)("Something went wrong, please, try again…","mind")})}))}}function se(e){return e?.settings||{}}function oe(e,t){return e?.settings[t]||""}function le(e){return e?.updating||!1}function ce(e){return e?.error||!1}const de=(0,V.createReduxStore)("mind/settings",{reducer:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{settings:ne,updating:!1,error:""},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};switch(t.type){case"UPDATE_SETTINGS_PENDING":return{...e,updating:!0};case"UPDATE_SETTINGS_SUCCESS":return{...e,updating:!1,settings:{...e.settings,...t.settings}};case"UPDATE_SETTINGS_ERROR":return{...e,updating:!1,error:t.error||""}}return e},actions:r,selectors:s});var ue;function pe(){return pe=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const{getActivePage:t}=e("mind/admin");return{activePage:t()}}));(0,o.useEffect)((()=>{document.querySelectorAll(".toplevel_page_mind .current").forEach((e=>{e.classList.remove("current")}));let e=document.querySelectorAll(`.toplevel_page_mind [href="admin.php?page=mind&sub_page=${n}"]`);e&&e.length||(e=document.querySelectorAll('.toplevel_page_mind [href="admin.php?page=mind"]')),e.forEach((e=>{e.parentNode.classList.add("current")})),document.body.classList.forEach((e=>{/mind-admin-page-/.test(e)&&document.body.classList.remove(e)})),document.body.classList.add(`mind-admin-page-${n}`),e&&e.length&&window.history.pushState(document.title,document.title,e[0].href)}),[n]);const i=[];let a="";if(Object.keys(Q).forEach((e=>{i.push((0,o.createElement)("li",{key:e},(0,o.createElement)("a",{href:Q[e]&&Q[e].href||"#",target:Q[e]&&Q[e].href?"_blank":null,rel:"noreferrer",className:c("mind-admin-tabs-button",n===e&&"mind-admin-tabs-button-active"),onClick:n=>{Q[e]&&!Q[e].href&&(n.preventDefault(),t(e))}},Q[e].label)))})),n&&Q[n]){const e=Q[n].block;a=(0,o.createElement)(e,null)}return(0,o.createElement)(o.Fragment,null,(0,o.createElement)("div",{className:"mind-admin-head"},(0,o.createElement)("div",{className:"mind-admin-head-container"},(0,o.createElement)("div",{className:"mind-admin-head-logo"},(0,o.createElement)(me,null),(0,o.createElement)("h1",null,(0,q.__)("Mind","mind"))),(0,o.createElement)("ul",{className:"mind-admin-tabs"},i))),(0,o.createElement)(R,{mode:"out-in"},(0,o.createElement)(F,{key:n,nodeRef:e,addEndListener:t=>{e.current.addEventListener("transitionend",t,!1)},classNames:"mind-admin-content-transition"},(0,o.createElement)("div",{ref:e,className:c("mind-admin-content",`mind-admin-content-${n}`)},a))))}window.addEventListener("load",(()=>{(0,o.render)((0,o.createElement)(fe,null),document.querySelector(".mind-admin-root"))}))}},n={};function i(e){var a=n[e];if(void 0!==a)return a.exports;var r=n[e]={exports:{}};return t[e](r,r.exports,i),r.exports}i.m=t,e=[],i.O=(t,n,a,r)=>{if(!n){var s=1/0;for(d=0;d=r)&&Object.keys(i.O).every((e=>i.O[e](n[l])))?n.splice(l--,1):(o=!1,r0&&e[d-1][2]>r;d--)e[d]=e[d-1];e[d]=[n,a,r]},i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e={884:0,15:0};i.O.j=t=>0===e[t];var t=(t,n)=>{var a,r,s=n[0],o=n[1],l=n[2],c=0;if(s.some((t=>0!==e[t]))){for(a in o)i.o(o,a)&&(i.m[a]=o[a]);if(l)var d=l(i)}for(t&&t(n);ci(925)));a=i.O(a)})(); \ No newline at end of file diff --git a/build/editor.asset.php b/build/editor.asset.php index d91105d..5e18e47 100644 --- a/build/editor.asset.php +++ b/build/editor.asset.php @@ -1 +1 @@ - array('lodash', 'react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-hooks', 'wp-i18n'), 'version' => 'a127d9515a556a21769e'); + array('lodash', 'react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-hooks', 'wp-i18n'), 'version' => '3b71a70f4fdba43eb0ec'); diff --git a/build/editor.js b/build/editor.js index 26df571..dd1968d 100644 --- a/build/editor.js +++ b/build/editor.js @@ -1,7 +1,7 @@ -(()=>{"use strict";var e,t={606:(e,t,n)=>{var r={};n.r(r),n.d(r,{getSettingsPageURL:()=>p,isConnected:()=>u});var s={};n.r(s),n.d(s,{getHighlightBlocks:()=>g});var i={};n.r(i),n.d(i,{removeHighlightBlocks:()=>f,setHighlightBlocks:()=>m});var o={};n.r(o),n.d(o,{close:()=>J,open:()=>X,processStream:()=>ae,requestAI:()=>ce,reset:()=>le,setContext:()=>te,setError:()=>oe,setInput:()=>ee,setInsertionPlace:()=>ne,setLoading:()=>se,setResponse:()=>ie,setScreen:()=>re,toggle:()=>Y});var l={};n.r(l),n.d(l,{getContext:()=>he,getError:()=>we,getInput:()=>pe,getInsertionPlace:()=>de,getLoading:()=>me,getProgress:()=>ke,getRenderBuffer:()=>be,getResponse:()=>fe,getScreen:()=>ge,isOpen:()=>ue});const{connected:a,settingsPageURL:c}=window.mindData;function u(){return"1"===a}function p(){return c}const h=window.wp.data,d=(0,h.createReduxStore)("mind",{selectors:r,reducer:e=>e});(0,h.register)(d);function g(e){return e?.highlightBlocks||[]}function m(e){return{type:"SET_HIGHLIGHT_BLOCKS",highlightBlocks:e}}function f(e){return{type:"REMOVE_HIGHLIGHT_BLOCKS",removeBlocks:e}}const k=(0,h.createReduxStore)("mind/blocks",{reducer:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{highlightBlocks:[]},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};switch(t.type){case"SET_HIGHLIGHT_BLOCKS":if(t.highlightBlocks&&t.highlightBlocks.length)return{...e,highlightBlocks:[...e.highlightBlocks,...t.highlightBlocks]};break;case"REMOVE_HIGHLIGHT_BLOCKS":if(e.highlightBlocks&&e.highlightBlocks.length&&t.removeBlocks&&t.removeBlocks.length)return{...e,highlightBlocks:e.highlightBlocks.filter((e=>!t.removeBlocks.includes(e)))}}return e},selectors:s,actions:i});(0,h.register)(k);let b={async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null};function w(e){b=e}const _=/[&<>"']/,x=new RegExp(_.source,"g"),E=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,y=new RegExp(E.source,"g"),v={"&":"&","<":"<",">":">",'"':""","'":"'"},S=e=>v[e];function O(e,t){if(t){if(_.test(e))return e.replace(x,S)}else if(E.test(e))return e.replace(y,S);return e}const C=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,T=/(^|[^\[])\^/g;function I(e,t){e="string"==typeof e?e:e.source,t=t||"";const n={replace:(t,r)=>(r=(r="object"==typeof r&&"source"in r?r.source:r).replace(T,"$1"),e=e.replace(t,r),n),getRegex:()=>new RegExp(e,t)};return n}function R(e){try{e=encodeURI(e).replace(/%25/g,"%")}catch(e){return null}return e}const $={exec:()=>null};function P(e,t){const n=e.replace(/\|/g,((e,t,n)=>{let r=!1,s=t;for(;--s>=0&&"\\"===n[s];)r=!r;return r?"|":" |"})).split(/ \|/);let r=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),t)if(n.length>t)n.splice(t);else for(;n.length0)return{type:"space",raw:t[0]}}code(e){const t=this.rules.block.code.exec(e);if(t){const e=t[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?e:M(e,"\n")}}}fences(e){const t=this.rules.block.fences.exec(e);if(t){const e=t[0],n=function(e,t){const n=e.match(/^(\s+)(?:```)/);if(null===n)return t;const r=n[1];return t.split("\n").map((e=>{const t=e.match(/^\s+/);if(null===t)return e;const[n]=t;return n.length>=r.length?e.slice(r.length):e})).join("\n")}(e,t[3]||"");return{type:"code",raw:e,lang:t[2]?t[2].trim().replace(this.rules.inline._escapes,"$1"):t[2],text:n}}}heading(e){const t=this.rules.block.heading.exec(e);if(t){let e=t[2].trim();if(/#$/.test(e)){const t=M(e,"#");this.options.pedantic?e=t.trim():t&&!/ $/.test(t)||(e=t.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:e,tokens:this.lexer.inline(e)}}}hr(e){const t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:t[0]}}blockquote(e){const t=this.rules.block.blockquote.exec(e);if(t){const e=M(t[0].replace(/^ *>[ \t]?/gm,""),"\n"),n=this.lexer.state.top;this.lexer.state.top=!0;const r=this.lexer.blockTokens(e);return this.lexer.state.top=n,{type:"blockquote",raw:t[0],tokens:r,text:e}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim();const r=n.length>1,s={type:"list",raw:"",ordered:r,start:r?+n.slice(0,-1):"",loose:!1,items:[]};n=r?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=r?n:"[*+-]");const i=new RegExp(`^( {0,3}${n})((?:[\t ][^\\n]*)?(?:\\n|$))`);let o="",l="",a=!1;for(;e;){let n=!1;if(!(t=i.exec(e)))break;if(this.rules.block.hr.test(e))break;o=t[0],e=e.substring(o.length);let r=t[2].split("\n",1)[0].replace(/^\t+/,(e=>" ".repeat(3*e.length))),c=e.split("\n",1)[0],u=0;this.options.pedantic?(u=2,l=r.trimStart()):(u=t[2].search(/[^ ]/),u=u>4?1:u,l=r.slice(u),u+=t[1].length);let p=!1;if(!r&&/^ *$/.test(c)&&(o+=c+"\n",e=e.substring(c.length+1),n=!0),!n){const t=new RegExp(`^ {0,${Math.min(3,u-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`),n=new RegExp(`^ {0,${Math.min(3,u-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),s=new RegExp(`^ {0,${Math.min(3,u-1)}}(?:\`\`\`|~~~)`),i=new RegExp(`^ {0,${Math.min(3,u-1)}}#`);for(;e;){const a=e.split("\n",1)[0];if(c=a,this.options.pedantic&&(c=c.replace(/^ {1,4}(?=( {4})*[^ ])/g," ")),s.test(c))break;if(i.test(c))break;if(t.test(c))break;if(n.test(e))break;if(c.search(/[^ ]/)>=u||!c.trim())l+="\n"+c.slice(u);else{if(p)break;if(r.search(/[^ ]/)>=4)break;if(s.test(r))break;if(i.test(r))break;if(n.test(r))break;l+="\n"+c}p||c.trim()||(p=!0),o+=a+"\n",e=e.substring(a.length+1),r=c.slice(u)}}s.loose||(a?s.loose=!0:/\n *\n *$/.test(o)&&(a=!0));let h,d=null;this.options.gfm&&(d=/^\[[ xX]\] /.exec(l),d&&(h="[ ] "!==d[0],l=l.replace(/^\[[ xX]\] +/,""))),s.items.push({type:"list_item",raw:o,task:!!d,checked:h,loose:!1,text:l,tokens:[]}),s.raw+=o}s.items[s.items.length-1].raw=o.trimEnd(),s.items[s.items.length-1].text=l.trimEnd(),s.raw=s.raw.trimEnd();for(let e=0;e"space"===e.type)),n=t.length>0&&t.some((e=>/\n.*\n/.test(e.raw)));s.loose=n}if(s.loose)for(let e=0;e$/,"$1").replace(this.rules.inline._escapes,"$1"):"",r=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline._escapes,"$1"):t[3];return{type:"def",tag:e,raw:t[0],href:n,title:r}}}table(e){const t=this.rules.block.table.exec(e);if(t){if(!/[:|]/.test(t[2]))return;const e={type:"table",raw:t[0],header:P(t[1]).map((e=>({text:e,tokens:[]}))),align:t[2].replace(/^\||\| *$/g,"").split("|"),rows:t[3]&&t[3].trim()?t[3].replace(/\n[ \t]*$/,"").split("\n"):[]};if(e.header.length===e.align.length){let t,n,r,s,i=e.align.length;for(t=0;t({text:e,tokens:[]})));for(i=e.header.length,n=0;n/i.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){const t=this.rules.inline.link.exec(e);if(t){const e=t[2].trim();if(!this.options.pedantic&&/^$/.test(e))return;const t=M(e.slice(0,-1),"\\");if((e.length-t.length)%2==0)return}else{const e=function(e,t){if(-1===e.indexOf(t[1]))return-1;let n=0;for(let r=0;r-1){const n=(0===t[0].indexOf("!")?5:4)+t[1].length+e;t[2]=t[2].substring(0,e),t[0]=t[0].substring(0,n).trim(),t[3]=""}}let n=t[2],r="";if(this.options.pedantic){const e=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(n);e&&(n=e[1],r=e[3])}else r=t[3]?t[3].slice(1,-1):"";return n=n.trim(),/^$/.test(e)?n.slice(1):n.slice(1,-1)),A(t,{href:n?n.replace(this.rules.inline._escapes,"$1"):n,title:r?r.replace(this.rules.inline._escapes,"$1"):r},t[0],this.lexer)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let e=(n[2]||n[1]).replace(/\s+/g," ");if(e=t[e.toLowerCase()],!e){const e=n[0].charAt(0);return{type:"text",raw:e,text:e}}return A(n,e,n[0],this.lexer)}}emStrong(e,t,n=""){let r=this.rules.inline.emStrong.lDelim.exec(e);if(r&&(!r[3]||!n.match(/[\p{L}\p{N}]/u))&&(!r[1]&&!r[2]||!n||this.rules.inline.punctuation.exec(n))){const n=[...r[0]].length-1;let s,i,o=n,l=0;const a="*"===r[0][0]?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(a.lastIndex=0,t=t.slice(-1*e.length+n);null!=(r=a.exec(t));){if(s=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!s)continue;if(i=[...s].length,r[3]||r[4]){o+=i;continue}if((r[5]||r[6])&&n%3&&!((n+i)%3)){l+=i;continue}if(o-=i,o>0)continue;i=Math.min(i,i+o+l);const t=[...r[0]][0].length,a=e.slice(0,n+r.index+t+i);if(Math.min(n,i)%2){const e=a.slice(1,-1);return{type:"em",raw:a,text:e,tokens:this.lexer.inlineTokens(e)}}const c=a.slice(2,-2);return{type:"strong",raw:a,text:c,tokens:this.lexer.inlineTokens(c)}}}}codespan(e){const t=this.rules.inline.code.exec(e);if(t){let e=t[2].replace(/\n/g," ");const n=/[^ ]/.test(e),r=/^ /.test(e)&&/ $/.test(e);return n&&r&&(e=e.substring(1,e.length-1)),e=O(e,!0),{type:"codespan",raw:t[0],text:e}}}br(e){const t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){const t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){const t=this.rules.inline.autolink.exec(e);if(t){let e,n;return"@"===t[2]?(e=O(t[1]),n="mailto:"+e):(e=O(t[1]),n=e),{type:"link",raw:t[0],text:e,href:n,tokens:[{type:"text",raw:e,text:e}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let e,n;if("@"===t[2])e=O(t[0]),n="mailto:"+e;else{let r;do{r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])[0]}while(r!==t[0]);e=O(t[0]),n="www."===t[1]?"http://"+t[0]:t[0]}return{type:"link",raw:t[0],text:e,href:n,tokens:[{type:"text",raw:e,text:e}]}}}inlineText(e){const t=this.rules.inline.text.exec(e);if(t){let e;return e=this.lexer.state.inRawBlock?t[0]:O(t[0]),{type:"text",raw:t[0],text:e}}}}const z={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,hr:/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,html:"^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",def:/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,table:$,lheading:/^(?!bull )((?:.|\n(?!\s*?\n|bull ))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\.|[^\[\]\\])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};z.def=I(z.def).replace("label",z._label).replace("title",z._title).getRegex(),z.bullet=/(?:[*+-]|\d{1,9}[.)])/,z.listItemStart=I(/^( *)(bull) */).replace("bull",z.bullet).getRegex(),z.list=I(z.list).replace(/bull/g,z.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+z.def.source+")").getRegex(),z._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",z._comment=/|$)/,z.html=I(z.html,"i").replace("comment",z._comment).replace("tag",z._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),z.lheading=I(z.lheading).replace(/bull/g,z.bullet).getRegex(),z.paragraph=I(z._paragraph).replace("hr",z.hr).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",z._tag).getRegex(),z.blockquote=I(z.blockquote).replace("paragraph",z.paragraph).getRegex(),z.normal={...z},z.gfm={...z.normal,table:"^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"},z.gfm.table=I(z.gfm.table).replace("hr",z.hr).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",z._tag).getRegex(),z.gfm.paragraph=I(z._paragraph).replace("hr",z.hr).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",z.gfm.table).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",z._tag).getRegex(),z.pedantic={...z.normal,html:I("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",z._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:$,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:I(z.normal._paragraph).replace("hr",z.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",z.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()};const j={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:$,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(ref)\]/,nolink:/^!?\[(ref)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",emStrong:{lDelim:/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,rDelimAst:/^[^_*]*?__[^_*]*?\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\*)[punct](\*+)(?=[\s]|$)|[^punct\s](\*+)(?!\*)(?=[punct\s]|$)|(?!\*)[punct\s](\*+)(?=[^punct\s])|[\s](\*+)(?!\*)(?=[punct])|(?!\*)[punct](\*+)(?!\*)(?=[punct])|[^punct\s](\*+)(?=[^punct\s])/,rDelimUnd:/^[^_*]*?\*\*[^_*]*?_[^_*]*?(?=\*\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\s]|$)|[^punct\s](_+)(?!_)(?=[punct\s]|$)|(?!_)[punct\s](_+)(?=[^punct\s])|[\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:$,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`^|~"};j.punctuation=I(j.punctuation,"u").replace(/punctuation/g,j._punctuation).getRegex(),j.blockSkip=/\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g,j.anyPunctuation=/\\[punct]/g,j._escapes=/\\([punct])/g,j._comment=I(z._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),j.emStrong.lDelim=I(j.emStrong.lDelim,"u").replace(/punct/g,j._punctuation).getRegex(),j.emStrong.rDelimAst=I(j.emStrong.rDelimAst,"gu").replace(/punct/g,j._punctuation).getRegex(),j.emStrong.rDelimUnd=I(j.emStrong.rDelimUnd,"gu").replace(/punct/g,j._punctuation).getRegex(),j.anyPunctuation=I(j.anyPunctuation,"gu").replace(/punct/g,j._punctuation).getRegex(),j._escapes=I(j._escapes,"gu").replace(/punct/g,j._punctuation).getRegex(),j._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,j._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,j.autolink=I(j.autolink).replace("scheme",j._scheme).replace("email",j._email).getRegex(),j._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,j.tag=I(j.tag).replace("comment",j._comment).replace("attribute",j._attribute).getRegex(),j._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,j._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,j._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,j.link=I(j.link).replace("label",j._label).replace("href",j._href).replace("title",j._title).getRegex(),j.reflink=I(j.reflink).replace("label",j._label).replace("ref",z._label).getRegex(),j.nolink=I(j.nolink).replace("ref",z._label).getRegex(),j.reflinkSearch=I(j.reflinkSearch,"g").replace("reflink",j.reflink).replace("nolink",j.nolink).getRegex(),j.normal={...j},j.pedantic={...j.normal,strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:I(/^!?\[(label)\]\((.*?)\)/).replace("label",j._label).getRegex(),reflink:I(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",j._label).getRegex()},j.gfm={...j.normal,escape:I(j.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\t+" ".repeat(n.length)));e;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some((r=>!!(n=r.call({lexer:this},e,t))&&(e=e.substring(n.raw.length),t.push(n),!0)))))if(n=this.tokenizer.space(e))e=e.substring(n.raw.length),1===n.raw.length&&t.length>0?t[t.length-1].raw+="\n":t.push(n);else if(n=this.tokenizer.code(e))e=e.substring(n.raw.length),r=t[t.length-1],!r||"paragraph"!==r.type&&"text"!==r.type?t.push(n):(r.raw+="\n"+n.raw,r.text+="\n"+n.text,this.inlineQueue[this.inlineQueue.length-1].src=r.text);else if(n=this.tokenizer.fences(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.heading(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.hr(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.blockquote(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.list(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.html(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.def(e))e=e.substring(n.raw.length),r=t[t.length-1],!r||"paragraph"!==r.type&&"text"!==r.type?this.tokens.links[n.tag]||(this.tokens.links[n.tag]={href:n.href,title:n.title}):(r.raw+="\n"+n.raw,r.text+="\n"+n.raw,this.inlineQueue[this.inlineQueue.length-1].src=r.text);else if(n=this.tokenizer.table(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.lheading(e))e=e.substring(n.raw.length),t.push(n);else{if(s=e,this.options.extensions&&this.options.extensions.startBlock){let t=1/0;const n=e.slice(1);let r;this.options.extensions.startBlock.forEach((e=>{r=e.call({lexer:this},n),"number"==typeof r&&r>=0&&(t=Math.min(t,r))})),t<1/0&&t>=0&&(s=e.substring(0,t+1))}if(this.state.top&&(n=this.tokenizer.paragraph(s)))r=t[t.length-1],i&&"paragraph"===r.type?(r.raw+="\n"+n.raw,r.text+="\n"+n.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=r.text):t.push(n),i=s.length!==e.length,e=e.substring(n.raw.length);else if(n=this.tokenizer.text(e))e=e.substring(n.raw.length),r=t[t.length-1],r&&"text"===r.type?(r.raw+="\n"+n.raw,r.text+="\n"+n.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=r.text):t.push(n);else if(e){const t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n,r,s,i,o,l,a=e;if(this.tokens.links){const e=Object.keys(this.tokens.links);if(e.length>0)for(;null!=(i=this.tokenizer.rules.inline.reflinkSearch.exec(a));)e.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(a=a.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+a.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(i=this.tokenizer.rules.inline.blockSkip.exec(a));)a=a.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+a.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;null!=(i=this.tokenizer.rules.inline.anyPunctuation.exec(a));)a=a.slice(0,i.index)+"++"+a.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;e;)if(o||(l=""),o=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((r=>!!(n=r.call({lexer:this},e,t))&&(e=e.substring(n.raw.length),t.push(n),!0)))))if(n=this.tokenizer.escape(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.tag(e))e=e.substring(n.raw.length),r=t[t.length-1],r&&"text"===n.type&&"text"===r.type?(r.raw+=n.raw,r.text+=n.text):t.push(n);else if(n=this.tokenizer.link(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.reflink(e,this.tokens.links))e=e.substring(n.raw.length),r=t[t.length-1],r&&"text"===n.type&&"text"===r.type?(r.raw+=n.raw,r.text+=n.text):t.push(n);else if(n=this.tokenizer.emStrong(e,a,l))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.codespan(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.br(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.del(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.autolink(e))e=e.substring(n.raw.length),t.push(n);else if(this.state.inLink||!(n=this.tokenizer.url(e))){if(s=e,this.options.extensions&&this.options.extensions.startInline){let t=1/0;const n=e.slice(1);let r;this.options.extensions.startInline.forEach((e=>{r=e.call({lexer:this},n),"number"==typeof r&&r>=0&&(t=Math.min(t,r))})),t<1/0&&t>=0&&(s=e.substring(0,t+1))}if(n=this.tokenizer.inlineText(s))e=e.substring(n.raw.length),"_"!==n.raw.slice(-1)&&(l=n.raw.slice(-1)),o=!0,r=t[t.length-1],r&&"text"===r.type?(r.raw+=n.raw,r.text+=n.text):t.push(n);else if(e){const t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}else e=e.substring(n.raw.length),t.push(n);return t}}class N{options;constructor(e){this.options=e||b}code(e,t,n){const r=(t||"").match(/^\S*/)?.[0];return e=e.replace(/\n$/,"")+"\n",r?'
'+(n?e:O(e,!0))+"
\n":"
"+(n?e:O(e,!0))+"
\n"}blockquote(e){return`
\n${e}
\n`}html(e,t){return e}heading(e,t,n){return`${e}\n`}hr(){return"
\n"}list(e,t,n){const r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"\n"}listitem(e,t,n){return`
  • ${e}
  • \n`}checkbox(e){return"'}paragraph(e){return`

    ${e}

    \n`}table(e,t){return t&&(t=`${t}`),"\n\n"+e+"\n"+t+"
    \n"}tablerow(e){return`\n${e}\n`}tablecell(e,t){const n=t.header?"th":"td";return(t.align?`<${n} align="${t.align}">`:`<${n}>`)+e+`\n`}strong(e){return`${e}`}em(e){return`${e}`}codespan(e){return`${e}`}br(){return"
    "}del(e){return`${e}`}link(e,t,n){const r=R(e);if(null===r)return n;let s='",s}image(e,t,n){const r=R(e);if(null===r)return n;let s=`${n}"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):"")));continue}case"code":{const e=s;n+=this.renderer.code(e.text,e.lang,!!e.escaped);continue}case"table":{const e=s;let t="",r="";for(let t=0;t0&&"paragraph"===n.tokens[0].type?(n.tokens[0].text=e+" "+n.tokens[0].text,n.tokens[0].tokens&&n.tokens[0].tokens.length>0&&"text"===n.tokens[0].tokens[0].type&&(n.tokens[0].tokens[0].text=e+" "+n.tokens[0].tokens[0].text)):n.tokens.unshift({type:"text",text:e+" "}):l+=e+" "}l+=this.parse(n.tokens,i),o+=this.renderer.listitem(l,s,!!r)}n+=this.renderer.list(o,t,r);continue}case"html":{const e=s;n+=this.renderer.html(e.text,e.block);continue}case"paragraph":{const e=s;n+=this.renderer.paragraph(this.parseInline(e.tokens));continue}case"text":{let i=s,o=i.tokens?this.parseInline(i.tokens):i.text;for(;r+1{n=n.concat(this.walkTokens(e[r],t))})):e.tokens&&(n=n.concat(this.walkTokens(e.tokens,t)))}}return n}use(...e){const t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach((e=>{const n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach((e=>{if(!e.name)throw new Error("extension name required");if("renderer"in e){const n=t.renderers[e.name];t.renderers[e.name]=n?function(...t){let r=e.renderer.apply(this,t);return!1===r&&(r=n.apply(this,t)),r}:e.renderer}if("tokenizer"in e){if(!e.level||"block"!==e.level&&"inline"!==e.level)throw new Error("extension level must be 'block' or 'inline'");const n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&("block"===e.level?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:"inline"===e.level&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}"childTokens"in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)})),n.extensions=t),e.renderer){const t=this.defaults.renderer||new N(this.defaults);for(const n in e.renderer){const r=e.renderer[n],s=n,i=t[s];t[s]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n||""}}n.renderer=t}if(e.tokenizer){const t=this.defaults.tokenizer||new B(this.defaults);for(const n in e.tokenizer){const r=e.tokenizer[n],s=n,i=t[s];t[s]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){const t=this.defaults.hooks||new H;for(const n in e.hooks){const r=e.hooks[n],s=n,i=t[s];H.passThroughHooks.has(n)?t[s]=e=>{if(this.defaults.async)return Promise.resolve(r.call(t,e)).then((e=>i.call(t,e)));const n=r.call(t,e);return i.call(t,n)}:t[s]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){const t=this.defaults.walkTokens,r=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(r.call(this,e)),t&&(n=n.concat(t.call(this,e))),n}}this.defaults={...this.defaults,...n}})),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return L.lex(e,t??this.defaults)}parser(e,t){return U.parse(e,t??this.defaults)}#e(e,t){return(n,r)=>{const s={...r},i={...this.defaults,...s};!0===this.defaults.async&&!1===s.async&&(i.silent||console.warn("marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored."),i.async=!0);const o=this.#t(!!i.silent,!!i.async);if(null==n)return o(new Error("marked(): input parameter is undefined or null"));if("string"!=typeof n)return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));if(i.hooks&&(i.hooks.options=i),i.async)return Promise.resolve(i.hooks?i.hooks.preprocess(n):n).then((t=>e(t,i))).then((e=>i.walkTokens?Promise.all(this.walkTokens(e,i.walkTokens)).then((()=>e)):e)).then((e=>t(e,i))).then((e=>i.hooks?i.hooks.postprocess(e):e)).catch(o);try{i.hooks&&(n=i.hooks.preprocess(n));const r=e(n,i);i.walkTokens&&this.walkTokens(r,i.walkTokens);let s=t(r,i);return i.hooks&&(s=i.hooks.postprocess(s)),s}catch(e){return o(e)}}}#t(e,t){return n=>{if(n.message+="\nPlease report this to https://github.com/markedjs/marked.",e){const e="

    An error occurred:

    "+O(n.message+"",!0)+"
    ";return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}};function Z(e,t){return D.parse(e,t)}function Q(e){let t=Z.parse(e);return t=t.replace(/
    <\/pre>/g,"
    "),t}Z.options=Z.setOptions=function(e){return D.setOptions(e),Z.defaults=D.defaults,w(Z.defaults),Z},Z.getDefaults=function(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}},Z.defaults=b,Z.use=function(...e){return D.use(...e),Z.defaults=D.defaults,w(Z.defaults),Z},Z.walkTokens=function(e,t){return D.walkTokens(e,t)},Z.parseInline=D.parseInline,Z.Parser=U,Z.parser=U.parse,Z.Renderer=N,Z.TextRenderer=q,Z.Lexer=L,Z.lexer=L.lex,Z.Tokenizer=B,Z.Hooks=H,Z.parse=Z,Z.options,Z.setOptions,Z.use,Z.walkTokens,Z.parseInline,U.parse,L.lex,Z.use({headerIds:!1});const F={isOpen:!1,input:"",context:"",insertionPlace:"",screen:"",loading:!1,response:"",error:null,progress:{charsProcessed:0,queueSize:0,isComplete:!1},renderBuffer:{content:"",lastUpdate:0}},G=window.wp.i18n,W=window.wp.apiFetch;var K=n.n(W);class V{constructor(e){this.dispatch=e,this.buffer="",this.responseText="",this.decoder=new TextDecoder,this.lastUpdate=Date.now(),this.updateQueue=[],this.isProcessing=!1,this.CONFIG={CHUNK_DELAY:30,UPDATE_INTERVAL:50,BATCH_SIZE:3,MAX_QUEUE_SIZE:100,TYPING_SPEED:{FAST:20,MEDIUM:35,SLOW:50}}}async processStream(e){try{for(this.startQueueProcessor();;){const{value:t,done:n}=await e.read();if(n)break;await this.processChunk(t)}await this.flushQueue(),this.sendCompletion()}catch(e){this.handleError(e)}}async processChunk(e){const t=this.decoder.decode(e,{stream:!0}),n=this.parseChunks(t);for(const e of n)await this.queueUpdate(e)}parseChunks(e){const t=[],n=e.split("\n");for(const e of n)if(e.startsWith("data: "))try{const n=JSON.parse(e.slice(6));n.content&&t.push(n.content)}catch(e){console.debug("Chunk parse error:",e)}return t}async queueUpdate(e){this.updateQueue.push(e),this.updateQueue.length>this.CONFIG.MAX_QUEUE_SIZE&&await this.flushQueue()}async startQueueProcessor(){if(!this.isProcessing){for(this.isProcessing=!0;this.updateQueue.length>0;){const e=this.updateQueue.splice(0,this.CONFIG.BATCH_SIZE);await this.processBatch(e)}this.isProcessing=!1}}async processBatch(e){const t=e.join("");this.responseText+=t;const n=Date.now();n-this.lastUpdate>=this.CONFIG.UPDATE_INTERVAL&&(this.dispatch({type:"REQUEST_AI_CHUNK",payload:{content:this.responseText,progress:this.calculateProgress()}}),this.lastUpdate=n),await new Promise((e=>setTimeout(e,this.CONFIG.CHUNK_DELAY)))}calculateProgress(){return{charsProcessed:this.responseText.length,queueSize:this.updateQueue.length,isComplete:!1}}async flushQueue(){for(;this.updateQueue.length>0;)await this.startQueueProcessor()}sendCompletion(){this.dispatch({type:"REQUEST_AI_SUCCESS",payload:{content:this.responseText,progress:{isComplete:!0}}})}handleError(e){this.dispatch({type:"REQUEST_AI_ERROR",payload:e.message})}}function X(){return{type:"OPEN"}}function J(){return{type:"CLOSE"}}function Y(){return{type:"TOGGLE"}}function ee(e){return{type:"SET_INPUT",input:e}}function te(e){return{type:"SET_CONTEXT",context:e}}function ne(e){return{type:"SET_INSERTION_PLACE",insertionPlace:e}}function re(e){return{type:"SET_SCREEN",screen:e}}function se(e){return{type:"SET_LOADING",loading:e}}function ie(e){return{type:"SET_RESPONSE",response:e}}function oe(e){return{type:"SET_ERROR",error:e}}function le(){return{type:"RESET"}}function ae(e){return async({dispatch:t})=>{const n=new TextDecoder;let r="",s="";const i=e=>new Promise((t=>setTimeout(t,e)));try{for(;;){const{value:o,done:l}=await e.read();if(l)break;r+=n.decode(o,{stream:!0});const a=r.split("\n");r=a.pop()||"";for(const e of a)if(e.startsWith("data: "))try{const n=JSON.parse(e.slice(6));if(n.error)return void t({type:"REQUEST_AI_ERROR",payload:n.message});if(n.done)return void t({type:"REQUEST_AI_SUCCESS",payload:s});n.content&&(s+=n.content,t({type:"REQUEST_AI_CHUNK",payload:s}),await i(50))}catch(e){t({type:"REQUEST_AI_ERROR",payload:(0,G.__)("Failed to parse stream data","mind")})}}}catch(e){t({type:"REQUEST_AI_ERROR",payload:e.message})}}}function ce(){return async({dispatch:e,select:t})=>{if(!u)return;if(t.getLoading())return;e({type:"REQUEST_AI_PENDING"});const n=t.getContext(),r={request:t.getInput()};"selected-blocks"===n&&(r.context=function(){const{getBlock:e,getSelectedBlockClientIds:t}=wp.data.select("core/block-editor"),n=t();let r="";return n.forEach((t=>{const n=e(t);n?.attributes?.content&&(r=`${r}

    ${n.attributes.content}

    `)})),r}());try{const t=new V(e),n=await K()({path:"/mind/v1/request_ai",method:"POST",data:r,parse:!1});if(!n.ok){const e=await n.json();throw new Error(e.message||(0,G.__)("Failed to fetch AI response","mind"))}await t.processStream(n.body.getReader())}catch(t){e({type:"REQUEST_AI_ERROR",payload:t.message||(0,G.__)("Failed to fetch AI response","mind")})}}}function ue(e){return e?.isOpen||!1}function pe(e){return e?.input||""}function he(e){return e?.context||""}function de(e){return e?.insertionPlace||""}function ge(e){return e?.screen||""}function me(e){return e?.loading||!1}function fe(e){return e?.response||!1}function ke(e){return e?.progress||!1}function be(e){return e?.renderBuffer||!1}function we(e){return e?.error||!1}const _e=(0,h.createReduxStore)("mind/popup",{reducer:function(e=F,t={}){switch(t.type){case"CLOSE":if(e.isOpen)return{...e,isOpen:!1};break;case"OPEN":if(!e.isOpen)return{...e,isOpen:!0};break;case"TOGGLE":return{...e,isOpen:!e.isOpen};case"SET_INPUT":if(e.input!==t.input)return{...e,input:t.input};break;case"SET_CONTEXT":if(e.context!==t.context)return{...e,context:t.context};break;case"SET_INSERTION_PLACE":if(e.insertionPlace!==t.insertionPlace)return{...e,insertionPlace:t.insertionPlace};break;case"SET_SCREEN":if(e.screen!==t.screen)return{...e,screen:t.screen};break;case"SET_LOADING":if(e.loading!==t.loading)return{...e,loading:t.loading};break;case"SET_RESPONSE":if(e.response!==t.response)return{...e,response:t.response};break;case"SET_ERROR":if(e.error!==t.error)return{...e,error:t.error};break;case"REQUEST_AI_PENDING":return{...e,isOpen:!0,loading:!0,response:"",error:null,screen:"request",progress:F.progress,renderBuffer:F.renderBuffer};case"REQUEST_AI_CHUNK":const n=Date.now();return n-e.renderBuffer.lastUpdate>=50?{...e,loading:!0,response:!!t.payload.content&&Q(t.payload.content),progress:t.payload.progress,renderBuffer:{content:t.payload.content,lastUpdate:n}}:{...e,renderBuffer:{content:t.payload.content,lastUpdate:e.renderBuffer.lastUpdate}};case"REQUEST_AI_SUCCESS":return{...e,loading:!1,response:!!t.payload.content&&Q(t.payload.content),progress:{...t.payload.progress,isComplete:!0},renderBuffer:{content:t.payload.content,lastUpdate:Date.now()}};case"REQUEST_AI_ERROR":return{...e,loading:!1,response:!1,error:t.payload||"",progress:F.progress,renderBuffer:F.renderBuffer};case"RESET":return{...e,input:"",context:"",insertionPlace:"",screen:"",response:!1,error:!1,loading:!1}}return e},actions:o,selectors:l});(0,h.register)(_e);const xe=window.wp.element,Ee=window.wp.components,ye=window.wp.blocks,ve=window.wp.domReady;var Se=n.n(ve);function Oe(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t{const{isOpen:t,getInput:n,getContext:r,getScreen:s,getLoading:i,getResponse:o}=e("mind/popup");return{isOpen:t(),input:n(),context:r(),screen:s(),loading:i(),response:o()}}));let g=c;switch(c){case"selected-blocks":g=(0,G.__)("Selected Blocks");break;case"post-title":g=(0,G.__)("Post Title")}return(0,xe.useEffect)((()=>{l&&!p&&n?.current&&n.current.focus()}),[l,p,n]),(0,xe.useEffect)((()=>{""===u&&a&&i("request")}),[u,a,i]),(0,xe.useEffect)((()=>{if(n?.current){n.current.style.height="0px";const e=n.current.scrollHeight;n.current.style.height=e+"px"}}),[n,a]),(0,xe.createElement)("div",{className:"mind-popup-input"},(0,xe.createElement)($e,null),(0,xe.createElement)("textarea",{ref:n,placeholder:(0,G.__)("Ask AI to write anything…","mind"),value:a,onChange:e=>{s(e.target.value)},onKeyDown:function(e){""===u||"Backspace"!==e.key||e.target.value?!d||"Enter"!==e.key||e.shiftKey?"request"!==u||"Enter"!==e.key||e.shiftKey||o():t():r()},disabled:p,rows:1}),g?(0,xe.createElement)("span",{className:"mind-popup-input-context"},g):null)}function Me(){return(0,xe.createElement)("div",{className:"mind-popup-loading-line"},(0,xe.createElement)("span",null))}function Ae(e){const{type:t,children:n}=e;return(0,xe.createElement)("div",{className:"mind-popup-notice "+(t?`mind-popup-notice-${t}`:"")},n)}const Be=(0,xe.memo)((function({response:e,loading:t}){const n=(0,xe.useRef)();return(0,xe.useEffect)((()=>{if(!n.current)return;const e=n.current.closest(".mind-popup-content");if(!e)return;const{scrollHeight:t,clientHeight:r}=e;t-r<1e3&&e.scrollTo({top:t,behavior:"smooth"})}),[e]),e||t?(0,Te.createElement)("div",{ref:n,className:"mind-popup-response",style:{opacity:t?.85:1}},(0,Te.createElement)(xe.RawHTML,null,e),t&&(0,Te.createElement)("div",{className:"mind-popup-cursor"})):null}),((e,t)=>e.renderBuffer.lastUpdate===t.renderBuffer.lastUpdate&&e.loading===t.loading&&e.progress.isComplete===t.progress.isComplete));var ze,je,Le,Ne,qe,Ue,He,De,Ze,Qe,Fe;function Ge(){return Ge=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const{isOpen:t,getInput:n,getContext:r,getScreen:s,getLoading:i,getResponse:o,getProgress:l,getRenderBuffer:a,getError:c}=e("mind/popup");return{isOpen:t(),input:n(),context:r(),screen:s(),loading:i(),response:o(),progress:l(),renderBuffer:a(),error:c()}}));return(0,xe.useEffect)((()=>{r&&!o&&e?.current&&function(){if(e?.current){const t=e.current.querySelector("input");t&&t.focus()}}()}),[r,o,e]),(0,xe.useEffect)((()=>{""===i&&s&&n("request")}),[i,s,n]),(0,Te.createElement)("div",{className:"mind-popup-content"},""===i?(0,Te.createElement)("div",{className:"mind-popup-commands"},Ye.map((e=>"category"===e.type?(0,Te.createElement)("span",{key:e.type+e.label,className:"mind-popup-commands-category"},e.label):(0,Te.createElement)(Ee.Button,{key:e.type+e.label,className:"mind-popup-commands-button",onClick:()=>{t(e.request),n("request")}},e.icon||"",e.label)))):null,"request"===i&&(0,Te.createElement)("div",{className:"mind-popup-request"},l&&(0,Te.createElement)(Be,{progress:a,loading:o,response:l,renderBuffer:c}),!o&&u&&(0,Te.createElement)(Ae,{type:"error"},u)))}function tt(e){return(0,xe.createElement)("span",{className:"mind-popup-loading-text"},e.children)}function nt(e){const{onInsert:t}=e,{close:n,reset:r,setError:s,requestAI:i}=(0,h.useDispatch)("mind/popup"),{input:o,loading:l,response:a}=(0,h.useSelect)((e=>{const{getInput:t,getContext:n,getScreen:r,getLoading:s,getResponse:i}=e("mind/popup");return{input:t(),context:n(),screen:r(),loading:s(),response:i()}}));return a||l||o&&!l&&!a?(0,Te.createElement)("div",{className:"mind-popup-footer"},l&&(0,Te.createElement)(tt,null,(0,G.__)("Writing","mind")),(0,Te.createElement)("div",{className:"mind-popup-footer-actions"},o&&!l&&!a&&(0,Te.createElement)(Ee.Button,{onClick:()=>{i()}},(0,G.__)("Get Answer","mind")," ",(0,Te.createElement)("kbd",null,"⏎")),a&&!l&&(0,Te.createElement)(Te.Fragment,null,(0,Te.createElement)(Ee.Button,{onClick:()=>{s(""),i()}},(0,G.__)("Regenerate","mind")," ",(0,Te.createElement)("kbd",null,"↻")),(0,Te.createElement)(Ee.Button,{onClick:()=>{window.navigator.clipboard.writeText(a),r(),n()}},(0,G.__)("Copy","mind")),(0,Te.createElement)(Ee.Button,{onClick:t},(0,G.__)("Insert","mind")," ",(0,Te.createElement)("kbd",null,"⏎"))))):null}var rt;function st(){return st=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const{getSettingsPageURL:t}=e("mind");return{settingsPageURL:t()}}));return(0,xe.createElement)("div",{className:"mind-popup-connected-screen"},(0,xe.createElement)("h2",null,(0,xe.createElement)(it,null),(0,G.__)("OpenAI Key","mind")),(0,xe.createElement)("div",null,(0,xe.createElement)("p",null,(0,G.__)("In order to use Mind, you will need to provide your OpenAI API key. Please insert your API key in the plugin settings to get started.","mind"))),(0,xe.createElement)("div",null,(0,xe.createElement)("a",{className:"mind-popup-connected-screen-button",href:e},(0,G.__)("Go to Settings","mind"))))}const lt="mind-popup-container";function at(){const{setHighlightBlocks:e}=(0,h.useDispatch)("mind/blocks"),{close:t,reset:n}=(0,h.useDispatch)("mind/popup"),{connected:r,isOpen:s,insertionPlace:i,loading:o,response:l}=(0,h.useSelect)((e=>{const{isConnected:t}=e("mind"),{isOpen:n,getInsertionPlace:r,getLoading:s,getResponse:i}=e("mind/popup");return{connected:t(),isOpen:n(),insertionPlace:r(),loading:s(),response:i()}})),{selectedClientIds:a}=(0,h.useSelect)((e=>{const{getSelectedBlockClientIds:t}=e("core/block-editor");return{selectedClientIds:t()}}),[]),{insertBlocks:c,replaceBlocks:u}=(0,h.useDispatch)("core/block-editor");function p(){!function(){const t=(0,ye.rawHandler)({HTML:l});t.length&&("selected-blocks"===i?u(a,t):c(t),e(t.map((e=>e.clientId))))}(),n(),t()}return s?(0,xe.createElement)(Ee.Modal,{title:!1,className:Ce("mind-popup",!r&&"mind-popup-not-connected"),overlayClassName:"mind-popup-overlay",onRequestClose:()=>{n(),t()},__experimentalHideHeader:!0},r?(0,xe.createElement)(xe.Fragment,null,(0,xe.createElement)(Pe,{onInsert:p}),o&&(0,xe.createElement)(Me,null),(0,xe.createElement)(et,null),(0,xe.createElement)(nt,{onInsert:p})):(0,xe.createElement)(ot,null)):null}Se()((()=>{if(document.querySelector(`.${lt}`))return;const e=document.querySelector(".block-editor");if(!e)return;const t=document.createElement("div");t.classList.add(lt),e.appendChild(t),(0,xe.createRoot)(t).render((0,xe.createElement)(at,null))}));const ct=window.wp.hooks,ut=window.wp.blockEditor,pt=window.wp.compose;var ht;function dt(){return dt=Object.assign?Object.assign.bind():function(e){for(var t=1;t + )} + + {pendingSettings.ai_model?.includes('gpt') && ( +
    +
    + +
    +
    + { + e.preventDefault(); + setPendingSettings({ + ...pendingSettings, + openai_api_key: e.target.value, + }); + }} + /> + {isInvalidOpenAIAPIKey && ( +
    + {__('Please enter a valid API key', 'mind')} +
    + )} +
    +
    + {__( + 'This setting is required to use OpenAI models.', 'mind' )}{' '}
    -
    - { - e.preventDefault(); - setPendingSettings({ - ...pendingSettings, - openai_api_key: e.target.value, - }); - }} - /> - {isInvalidAPIKey && ( -
    - {__('Please enter a valid API key', 'mind')} -
    - )} -
    - + )} + {error &&
    {error}
    }
    )} diff --git a/src/admin/style.scss b/src/admin/style.scss index 311bea5..98c0bfc 100644 --- a/src/admin/style.scss +++ b/src/admin/style.scss @@ -8,6 +8,9 @@ .mind-admin-page { background-color: #1d2327; + #wpbody-content > .notice { + display: none; + } #wpcontent { min-height: calc(100vh - var(--wp-admin--admin-bar--height, 0) - var(--mind-admin-page-offset)); border-radius: 10px; diff --git a/src/editor/extensions/block-toolbar/index.js b/src/editor/extensions/block-toolbar/index.js index 8150bf3..588cb85 100644 --- a/src/editor/extensions/block-toolbar/index.js +++ b/src/editor/extensions/block-toolbar/index.js @@ -13,7 +13,7 @@ import { BlockControls } from '@wordpress/block-editor'; import { createHigherOrderComponent } from '@wordpress/compose'; import { useDispatch } from '@wordpress/data'; import { - ToolbarGroup, + ToolbarDropdownMenu, DropdownMenu, MenuGroup, MenuItem, @@ -27,6 +27,7 @@ import { ReactComponent as AIImproveIcon } from '../../../icons/ai-improve.svg'; import { ReactComponent as AIFixSpellingIcon } from '../../../icons/ai-fix-spelling.svg'; import { ReactComponent as AIShorterIcon } from '../../../icons/ai-shorter.svg'; import { ReactComponent as AILongerIcon } from '../../../icons/ai-longer.svg'; +import { ReactComponent as AIMessage } from '../../../icons/ai-message.svg'; import { ReactComponent as AISummarizeIcon } from '../../../icons/ai-summarize.svg'; import { ReactComponent as AIToneIcon } from '../../../icons/ai-tone.svg'; import { ReactComponent as AIParaphraseIcon } from '../../../icons/ai-paraphrase.svg'; @@ -34,8 +35,6 @@ import { ReactComponent as AITranslateIcon } from '../../../icons/ai-translate.s import { ReactComponent as MindLogoIcon } from '../../../icons/mind-logo.svg'; import wrapEmoji from '../../../utils/wrap-emoji'; -const ALLOWED_BLOCKS = ['core/paragraph', 'core/heading']; - const TONE = [ [__('professional', 'mind'), __('🧐 Professional', 'mind')], [__('friendly', 'mind'), __('😀 Friendly', 'mind')], @@ -63,220 +62,209 @@ const LANGUAGE = [ [__('vietnamese', 'mind'), __('🇻🇳 Vietnamese', 'mind')], ]; -/** - * Check if Mind allowed in block toolbar. - * - * @param {Object} data - block data. - * @return {boolean} allowed. - */ -function isToolbarAllowed(data) { - return ALLOWED_BLOCKS.includes(data.name); -} - function Toolbar() { - const { open, setInput, setContext, setInsertionPlace, requestAI } = + const { open, setInput, setInsertionPlace, requestAI } = useDispatch('mind/popup'); function openModal(prompt) { open(); setInput(prompt); - setContext('selected-blocks'); setInsertionPlace('selected-blocks'); - requestAI(); + + if (prompt) { + requestAI(); + } } return ( - - } - label={__('Mind', '@@text_domain')} - className="mind-toolbar-toggle" - popoverProps={{ className: 'mind-toolbar-dropdown' }} - > - {() => { - return ( - <> - - } - iconPosition="left" - onClick={() => { - openModal( - __( - 'Improve writing language', - 'mind' - ) - ); - }} - > - {__('Improve', 'mind')} - - } - iconPosition="left" - onClick={() => { - openModal( - __( - 'Fix spelling and grammar', - 'mind' - ) - ); - }} - > - {__('Fix Spelling & Grammar', 'mind')} - - } - iconPosition="left" - onClick={() => { - openModal(__('Make shorter', 'mind')); - }} - > - {__('Make Shorter', 'mind')} - - } - iconPosition="left" - onClick={() => { - openModal(__('Make longer', 'mind')); - }} - > - {__('Make Longer', 'mind')} - - } - iconPosition="left" - onClick={() => { - openModal(__('Summarize', 'mind')); - }} - > - {__('Summarize', 'mind')} - - } - iconPosition="left" - onClick={() => { - openModal(__('Paraphrase', 'mind')); - }} - > - {__('Paraphrase', 'mind')} - - - - } - iconPosition="left" - toggleProps={{ - children: ( - <> - {__('Adjust Tone', 'mind')} - - - ), - }} - popoverProps={{ - placement: 'right-end', - className: 'mind-toolbar-dropdown', - }} - className="mind-toolbar-dropdown-toggle" - > - {() => { - return ( - <> - - {TONE.map((data) => ( - { - openModal( - sprintf( - // translators: %s - tone. - __( - 'Change tone to %s', - 'mind' - ), - data[0] - ) - ); - }} - > - - {wrapEmoji( - data[1] - )} - - - ))} - - - ); - }} - - } - iconPosition="left" - toggleProps={{ - children: ( - <> - {__('Translate', 'mind')} - - - ), - }} - popoverProps={{ - placement: 'right-end', - className: 'mind-toolbar-dropdown', - }} - className="mind-toolbar-dropdown-toggle" - > - {() => { - return ( - <> - - {LANGUAGE.map((data) => ( - { - openModal( - sprintf( - // translators: %s - tone. - __( - 'Translate to %s', - 'mind' - ), - data[0] - ) - ); - }} - > - - {wrapEmoji( - data[1] - )} - - - ))} - - - ); - }} - - - - ); - }} - - + } + label={__('Mind', '@@text_domain')} + className="mind-toolbar-toggle" + popoverProps={{ className: 'mind-toolbar-dropdown' }} + > + {() => { + return ( + <> + + } + iconPosition="left" + onClick={() => { + openModal(); + }} + > + {__('Ask AI', 'mind')} + + } + iconPosition="left" + onClick={() => { + openModal( + __('Improve writing language', 'mind') + ); + }} + > + {__('Improve', 'mind')} + + } + iconPosition="left" + onClick={() => { + openModal( + __('Fix spelling and grammar', 'mind') + ); + }} + > + {__('Fix Spelling & Grammar', 'mind')} + + } + iconPosition="left" + onClick={() => { + openModal(__('Make shorter', 'mind')); + }} + > + {__('Make Shorter', 'mind')} + + } + iconPosition="left" + onClick={() => { + openModal(__('Make longer', 'mind')); + }} + > + {__('Make Longer', 'mind')} + + } + iconPosition="left" + onClick={() => { + openModal(__('Summarize', 'mind')); + }} + > + {__('Summarize', 'mind')} + + } + iconPosition="left" + onClick={() => { + openModal(__('Paraphrase', 'mind')); + }} + > + {__('Paraphrase', 'mind')} + + + + } + iconPosition="left" + toggleProps={{ + children: ( + <> + {__('Adjust Tone', 'mind')} + + + ), + }} + popoverProps={{ + placement: 'right-end', + className: 'mind-toolbar-dropdown', + }} + className="mind-toolbar-dropdown-toggle" + > + {() => { + return ( + <> + + {TONE.map((data) => ( + { + openModal( + sprintf( + // translators: %s - tone. + __( + 'Change tone to %s', + 'mind' + ), + data[0] + ) + ); + }} + > + + {wrapEmoji(data[1])} + + + ))} + + + ); + }} + + } + iconPosition="left" + toggleProps={{ + children: ( + <> + {__('Translate', 'mind')} + + + ), + }} + popoverProps={{ + placement: 'right-end', + className: 'mind-toolbar-dropdown', + }} + className="mind-toolbar-dropdown-toggle" + > + {() => { + return ( + <> + + {LANGUAGE.map((data) => ( + { + openModal( + sprintf( + // translators: %s - tone. + __( + 'Translate to %s', + 'mind' + ), + data[0] + ) + ); + }} + > + + {wrapEmoji(data[1])} + + + ))} + + + ); + }} + + + + ); + }} + ); } @@ -290,12 +278,6 @@ function Toolbar() { */ const withToolbarControl = createHigherOrderComponent((OriginalComponent) => { function MindToolbarToggle(props) { - const allow = isToolbarAllowed(props); - - if (!allow) { - return ; - } - return ( <> diff --git a/src/editor/extensions/editor-styles/index.js b/src/editor/extensions/editor-styles/index.js index 0e91500..e2297d4 100644 --- a/src/editor/extensions/editor-styles/index.js +++ b/src/editor/extensions/editor-styles/index.js @@ -11,15 +11,6 @@ import { useDispatch, useSelect } from '@wordpress/data'; */ import EditorStyles from '../../components/editor-styles'; -const HIGHLIGHT_BLOCKS = [ - 'core/paragraph', - 'core/list', - 'core/code', - 'core/preformatted', - 'core/quote', - 'core/blockquote', -]; - /** * Add new blocks highlight to see what exactly added by the AI. * @@ -30,7 +21,7 @@ const HIGHLIGHT_BLOCKS = [ const withMindAIEditorStyles = createHigherOrderComponent( (OriginalComponent) => { function MindHighlightInsertedBlocks(props) { - const { name, clientId } = props; + const { clientId } = props; const [animateOpacity, setAnimateOpacity] = useState(false); @@ -45,7 +36,6 @@ const withMindAIEditorStyles = createHigherOrderComponent( }); const allowHighlight = - HIGHLIGHT_BLOCKS.includes(name) && highlightBlocks && highlightBlocks.length && highlightBlocks.includes(clientId); @@ -62,8 +52,8 @@ const withMindAIEditorStyles = createHigherOrderComponent( setTimeout(() => { setAnimateOpacity(false); removeHighlightBlocks([clientId]); - }, 3000); - }, 3000); + }, 1200); + }, 200); }, [allowHighlight, clientId, removeHighlightBlocks]); // Skip this block as not needed to highlight. @@ -77,16 +67,14 @@ const withMindAIEditorStyles = createHigherOrderComponent( { const { open, setInsertionPlace } = useDispatch('mind/popup'); useEffect(() => { + // Convert content to string, because it is a RichText value. if ( name === 'core/paragraph' && - !previousContent && - content === ' ' + !`${previousContent || ''}` && + `${content || ''}` === ' ' ) { open(); setInsertionPlace('selected-blocks'); diff --git a/src/editor/extensions/post-toolbar/index.js b/src/editor/extensions/post-toolbar/index.js index 3eab3f8..0432e63 100644 --- a/src/editor/extensions/post-toolbar/index.js +++ b/src/editor/extensions/post-toolbar/index.js @@ -5,7 +5,7 @@ import './style.scss'; */ import { __ } from '@wordpress/i18n'; import { createRoot } from '@wordpress/element'; -import { subscribe, useDispatch } from '@wordpress/data'; +import { subscribe, useSelect, useDispatch } from '@wordpress/data'; import domReady from '@wordpress/dom-ready'; // eslint-disable-next-line import/no-extraneous-dependencies import { throttle } from 'lodash'; @@ -18,7 +18,14 @@ import { ReactComponent as MindLogoIcon } from '../../../icons/mind-logo.svg'; const TOOLBAR_TOGGLE_CONTAINER_CLASS = 'mind-post-toolbar-toggle'; function Toggle() { - const { toggle } = useDispatch('mind/popup'); + const { open, setInsertionPlace } = useDispatch('mind/popup'); + + const { getSelectedBlockClientIds } = useSelect((select) => { + return { + getSelectedBlockClientIds: + select('core/block-editor').getSelectedBlockClientIds, + }; + }); return ( - ); - })} - - ) : null} - {screen === 'request' && (
    - {response && ( + {response?.length > 0 && ( )} {!loading && error && {error}} diff --git a/src/editor/popup/components/content/style.scss b/src/editor/popup/components/content/style.scss index 095910c..c83e381 100644 --- a/src/editor/popup/components/content/style.scss +++ b/src/editor/popup/components/content/style.scss @@ -1,17 +1,23 @@ $padding: 10px; .mind-popup-content { + // Flex to automatically scroll to the bottom. + display: flex; + flex-direction: column-reverse; overflow: auto; flex: 1; padding: $padding $padding * 2; &:empty, - &:has(.mind-popup-request:empty) { + &:has(.mind-popup-request:empty), + &:has(.mind-popup-request iframe) { padding: 0; margin-bottom: -1px; } .mind-popup-request { + margin-bottom: auto; + ol, ul { list-style: auto; diff --git a/src/editor/popup/components/footer/index.js b/src/editor/popup/components/footer/index.js index e5a123e..36d3fb2 100644 --- a/src/editor/popup/components/footer/index.js +++ b/src/editor/popup/components/footer/index.js @@ -4,49 +4,144 @@ import './style.scss'; * WordPress dependencies */ import { __ } from '@wordpress/i18n'; -import { Button } from '@wordpress/components'; +import { Button, Tooltip } from '@wordpress/components'; import { useSelect, useDispatch } from '@wordpress/data'; +import { serialize } from '@wordpress/blocks'; +import hasNonEmptySelectedBlocks from '../../../../utils/has-non-empty-selected-blocks'; import LoadingText from '../loading-text'; export default function Input(props) { const { onInsert } = props; - const { close, reset, setError, requestAI } = useDispatch('mind/popup'); + const { close, reset, setContext, setError, requestAI } = + useDispatch('mind/popup'); - const { input, loading, response } = useSelect((select) => { - const { getInput, getContext, getScreen, getLoading, getResponse } = - select('mind/popup'); + const { input, context, loading, response, insertionPlace } = useSelect( + (select) => { + const { + getInput, + getContext, + getLoading, + getResponse, + getInsertionPlace, + } = select('mind/popup'); - return { - input: getInput(), - context: getContext(), - screen: getScreen(), - loading: getLoading(), - response: getResponse(), - }; - }); + return { + input: getInput(), + context: getContext(), + loading: getLoading(), + response: getResponse(), + insertionPlace: getInsertionPlace(), + }; + } + ); - const showFooter = response || loading || (input && !loading && !response); - - if (!showFooter) { - return null; - } + const availableContexts = [ + { + name: __('Page', 'mind'), + tooltip: __('Provide page context', 'mind'), + value: 'page', + }, + hasNonEmptySelectedBlocks() + ? { + name: __('Blocks', 'mind'), + tooltip: __('Provide selected blocks context', 'mind'), + value: 'selected-blocks', + } + : false, + ]; + const editableContexts = !loading && !response?.length; return (
    - {loading && {__('Writing', 'mind')}} +
    +
    + {availableContexts.map((item) => { + if (!item) { + return null; + } + + if ( + !editableContexts && + !context.includes(item.value) + ) { + return null; + } + + return ( + + + + ); + })} +
    +
    - {input && !loading && !response && ( - + + )} + {loading && ( + )} - {response && !loading && ( + {response?.length > 0 && !loading && ( <> - + )} + )} diff --git a/src/editor/popup/components/footer/style.scss b/src/editor/popup/components/footer/style.scss index 2bd1925..6bb46b6 100644 --- a/src/editor/popup/components/footer/style.scss +++ b/src/editor/popup/components/footer/style.scss @@ -1,23 +1,85 @@ -$padding: 10px; - .mind-popup-footer { display: flex; justify-content: space-between; align-items: center; - padding: $padding $padding * 2; - background-color: #f9f9f9; - border-top: 1px solid #e8e7e7; + padding: 20px; + padding-top: 0; + + .mind-popup-content:has(iframe) + & { + padding-top: 20px; + } +} +.mind-popup-footer-context { + display: flex; + gap: 8px; + width: 100%; + + > * { + position: relative; + display: flex; + align-items: center; + gap: 15px; + font-weight: 500; + border-radius: 5px; + padding: 5px 10px; + padding-right: 5px; + white-space: nowrap; + background: none; + cursor: pointer; + color: rgb(0, 0, 0, 40%); + border: 1px dashed rgba(0, 0, 0, 15%); + + &::after { + content: ""; + position: absolute; + top: 0; + right: 23px; + bottom: 0; + border-right: 1px dashed rgba(0, 0, 0, 15%); + } + + &:hover, + &:focus-visible { + color: rgb(0, 0, 0, 50%); + background: rgba(0, 0, 0, 3%); + border-color: rgba(0, 0, 0, 20%); + } + + &.active { + color: #121212; + border-style: solid; + + &::after { + border-right-style: solid; + } + + svg { + transform: rotate(45deg); + } + } + + &:disabled { + padding-right: 10px; + color: rgba(0, 0, 0, 20%); + border-color: rgba(0, 0, 0, 10%); + pointer-events: none; + + &::after, + svg { + display: none; + } + } + } } .mind-popup-footer-actions { display: flex; - margin: -5px -15px; margin-left: auto; gap: 5px; button { display: flex; gap: 8px; - height: 28px; + height: 27px; border-radius: 5px; font-weight: 500; @@ -32,9 +94,37 @@ $padding: 10px; font-weight: 400; border-radius: 3px; padding: 3px 4px; - margin-right: -8px; + margin-right: -9px; color: rgba(0, 0, 0, 50%); background-color: rgba(0, 0, 0, 8%); } + + &.mind-popup-footer-actions-primary { + background-color: #000; + color: #fff; + + &:hover, + &:focus-visible { + background-color: #212121; + color: #fff; + } + + kbd { + color: #fff; + background-color: #535353; + } + + &:disabled { + color: rgba(0, 0, 0, 20%); + border: 1px solid rgba(0, 0, 0, 7%); + pointer-events: none; + background-color: rgba(0, 0, 0, 2%); + } + } + &.mind-popup-footer-actions-icon { + width: 27px; + padding: 0; + justify-content: center; + } } } diff --git a/src/editor/popup/components/input/index.js b/src/editor/popup/components/input/index.js index 30a32a2..8009e6c 100644 --- a/src/editor/popup/components/input/index.js +++ b/src/editor/popup/components/input/index.js @@ -4,7 +4,7 @@ import './style.scss'; * WordPress dependencies */ import { __ } from '@wordpress/i18n'; -import { useRef, useEffect } from '@wordpress/element'; +import { useRef, useEffect, useState } from '@wordpress/element'; import { useSelect, useDispatch } from '@wordpress/data'; /** @@ -13,45 +13,33 @@ import { useSelect, useDispatch } from '@wordpress/data'; import { ReactComponent as MindLogoIcon } from '../../../../icons/mind-logo.svg'; export default function Input(props) { - const { onInsert } = props; + const { onInsert, isFullscreen } = props; const ref = useRef(); + const prevIsFullscreenRef = useRef(isFullscreen); + const [isForceResize, setIsForceResize] = useState(0); const { reset, setInput, setScreen, requestAI } = useDispatch('mind/popup'); - const { isOpen, input, context, screen, loading, response } = useSelect( - (select) => { - const { - isOpen: checkIsOpen, - getInput, - getContext, - getScreen, - getLoading, - getResponse, - } = select('mind/popup'); + const { isOpen, input, screen, loading, response } = useSelect((select) => { + const { + isOpen: checkIsOpen, + getInput, + getScreen, + getLoading, + getResponse, + } = select('mind/popup'); - return { - isOpen: checkIsOpen(), - input: getInput(), - context: getContext(), - screen: getScreen(), - loading: getLoading(), - response: getResponse(), - }; - } - ); + return { + isOpen: checkIsOpen(), + input: getInput(), + screen: getScreen(), + loading: getLoading(), + response: getResponse(), + }; + }); - let contextLabel = context; - - switch (context) { - case 'selected-blocks': - contextLabel = __('Selected Blocks'); - break; - case 'post-title': - contextLabel = __('Post Title'); - break; - // no default - } + const hasResponse = response?.length > 0; function onKeyDown(e) { // Go back to starter screen. @@ -61,14 +49,18 @@ export default function Input(props) { } // Insert request to post. - if (response && e.key === 'Enter' && !e.shiftKey) { + if (response?.length > 0 && e.key === 'Enter' && !e.shiftKey) { onInsert(); return; } // Send request to AI. if (screen === 'request' && e.key === 'Enter' && !e.shiftKey) { - requestAI(); + e.preventDefault(); + + if (input) { + requestAI(); + } } } @@ -97,14 +89,44 @@ export default function Input(props) { // Trying to set this with state or a ref will product an incorrect value. ref.current.style.height = scrollHeight + 'px'; } - }, [ref, input]); + }, [ref, input, loading, hasResponse, isForceResize]); + + // Automatic height after fullscreen transition. + // Trigger resize 3 times during fullscreen transition + useEffect(() => { + // Only run when transitioning from false to true + const allowRezise = isFullscreen && !prevIsFullscreenRef.current; + + prevIsFullscreenRef.current = isFullscreen; + + if (allowRezise) { + // Array of delays for the three resizes + const resizeDelays = [100, 200, 300]; + const timeoutIds = []; + + // Schedule the three resizes + resizeDelays.forEach((delay) => { + const timeoutId = setTimeout(() => { + // Using functional update to avoid dependency on current state + setIsForceResize((prev) => prev + 1); + }, delay); + + timeoutIds.push(timeoutId); + }); + + // Cleanup function to clear all timeouts + return () => { + timeoutIds.forEach((id) => clearTimeout(id)); + }; + } + }, [isFullscreen]); return (