diff --git a/build/content-helper/dashboard-page-rtl.css b/build/content-helper/dashboard-page-rtl.css index 9ab8a9a5ed..6fb22aeae2 100644 --- a/build/content-helper/dashboard-page-rtl.css +++ b/build/content-helper/dashboard-page-rtl.css @@ -3,4 +3,4 @@ #wp-parsely-dashboard-widget,.components-button[aria-controls="wp-parsely-block-editor-sidebar:wp-parsely-content-helper"],.editor-post-excerpt,.parsely-dashboard-container,.settings_page_parsely,.wp-parsely-block-overlay,.wp-parsely-content-helper,.wp-parsely-excerpt-generator,.wp-parsely-panel,.wp-parsely-popover,.wp-parsely-preview-editor,.wp-parsely-smart-linking-close-dialog,.wp-parsely-smart-linking-review-modal,.wp-parsely-suggested-title-modal,.wp-parsely-traffic-boost-add-new-link-popover,.wp-parsely-traffic-boost-preview-settings-popover{--base-font:"source-sans-pro",arial,sans-serif;--numeric-font:"ff-din-round-web",sans-serif;--parsely-green-components:107,42%,46%;--parsely-green:hsl(var(--parsely-green-components));--parsely-green-10:#c7ecb1;--parsely-green-65:#2a691b;--gray-200:#f7f8f9;--gray-300:#edeeef;--gray-400:#d7dbdf;--gray-500:#959da5;--gray-600:#586069;--gray-700:#444d56;--gray-900:#24292e;--blue-500:#44a8e5;--blue-550:#2596db;--green-500:#7bc01b;--green-900:#3d6307;--ref-direct:205,13%,52%;--ref-internal:161,91%,41%;--ref-social:210,72%,41%;--ref-search:42,100%,50%;--ref-other:3,76%,58%;--base-text:var(--gray-900);--base-text-2:var(--gray-600);--base-3:var(--gray-400);--border:var(--gray-400);--data:var(--green-500);--control:var(--blue-500);--grid-unit-5:0.25rem;--grid-unit-10:0.5rem;--grid-unit-15:0.75rem;--grid-unit-20:1rem;--grid-unit-25:1.25rem;--grid-unit-30:1.5rem;--grid-unit-40:2rem;--grid-unit-50:2.5rem;--grid-unit-60:3rem;--font-size--smaller:0.688rem;--font-size--small:0.75rem;--font-size--medium:0.875rem;--font-size--large:1rem;--font-size--extra-large:1.2rem;--font-size--bigger:2rem;--dashboard-width:64rem;--black:#000;--dashboard-accent:#b9f16b;--gray-350:#e1e3e5;--sidebar-black:#1e1e1e;--sidebar-white:#f0f0f0;--traffic-boost-header-background:rgba(56,88,233,.08);--white:#fff}.traffic-boost-preview{align-self:stretch;background-color:var(--sidebar-white);border-radius:.5rem;display:flex;flex:1 0 0;flex-direction:column;min-width:18.75rem;overflow:hidden;padding:0}.traffic-boost-preview .wp-parsely-preview{background:var(--sidebar-white);display:flex;flex:1;height:100%;overflow:hidden}.traffic-boost-preview .wp-parsely-preview .preview-iframe-wrapper{height:100%;overflow:hidden;position:relative;width:100%}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-iframe{background:var(--sidebar-white);border:none;height:100%;right:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;transition:all .5s ease;width:100%;z-index:0}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-iframe.is-loading{filter:blur(4px);opacity:.7}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-loading{align-items:center;background-color:var(--sidebar-white);display:flex;inset:0;justify-content:center;opacity:0;pointer-events:none;position:absolute;transition:opacity .1s ease-in-out,visibility .1s ease-in-out;visibility:hidden;z-index:3}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-loading.is-loading{align-items:center;display:flex;flex-direction:column;font-size:var(--font-size--extra-large);font-weight:500;gap:var(--grid-unit-30);justify-content:center;line-height:var(--font-size--extra-large);opacity:1;visibility:visible}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-loading.is-loading .wp-parsely-loading{width:90%}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-loading.is-loading .wp-parsely-loading .wp-parsely-loading-message{max-width:37.5rem;text-align:center}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-loading .components-spinner{height:var(--grid-unit-40);margin:0;width:var(--grid-unit-40)}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-generating-placement{align-items:center;display:flex;inset:0;justify-content:center;pointer-events:none;position:absolute;z-index:3}.traffic-boost-preview-header{align-items:center;background:var(--white);border-bottom:1px solid var(--gray-400);display:flex;justify-content:space-between;padding:var(--grid-unit-15) var(--grid-unit-20);z-index:5}.traffic-boost-preview-header .traffic-boost-preview-actions{display:flex;gap:var(--grid-unit-10)}.traffic-boost-preview-header .traffic-boost-preview-actions button{border-radius:.25rem;height:1.875rem;min-width:1.875rem;padding:var(--grid-unit-5)}.traffic-boost-preview-header .traffic-boost-preview-actions button:hover{color:var(--wp-admin-theme-color)}.traffic-boost-preview-header .traffic-boost-preview-actions .components-button.is-pressed:focus:not(:disabled){box-shadow:none}.traffic-boost-preview-header .traffic-boost-preview-info{align-items:flex-start;display:flex;flex:1 0 0;flex-direction:column;gap:var(--grid-unit-5);min-width:0}.traffic-boost-preview-header .traffic-boost-preview-info .traffic-boost-preview-info-title{color:var(--gray-900);font-size:var(--font-size--large);font-weight:500;line-height:var(--font-size--extra-large);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.traffic-boost-preview-header .traffic-boost-preview-info .traffic-boost-preview-info-links{align-items:center;align-self:stretch;display:flex;font-size:var(--font-size--medium);font-weight:400;gap:var(--grid-unit-10);line-height:var(--font-size--extra-large);min-height:var(--grid-unit-30)}.traffic-boost-preview-header .traffic-boost-preview-info .traffic-boost-preview-info-links .traffic-boost-preview-info-links-counter{align-items:center;align-self:stretch;display:flex;gap:var(--grid-unit-10)}.traffic-boost-preview-header .traffic-boost-preview-info .traffic-boost-preview-info-links .traffic-boost-preview-info-links-counter button{height:1.375rem;padding:var(--grid-unit-5) var(--grid-unit-10)}.traffic-boost-preview-header .traffic-boost-preview-info .traffic-boost-preview-info-links .traffic-boost-preview-info-links-counter button.is-pressed,.traffic-boost-preview-header .traffic-boost-preview-info .traffic-boost-preview-info-links .traffic-boost-preview-info-links-counter button:focus{box-shadow:0 0 0 1px var(--black);outline:none}.traffic-boost-preview-header .traffic-boost-preview-info .traffic-boost-preview-info-links .traffic-boost-preview-info-links-counter button:not(.is-pressed):focus{box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);color:var(--wp-admin-theme-color)}.wp-parsely-traffic-boost-preview-settings-popover{margin-top:var(--grid-unit-20);width:17.1875rem}.wp-parsely-traffic-boost-preview-settings-popover-content{min-width:13.75rem;padding:var(--grid-unit-20);width:17.1875rem}.traffic-boost-preview-footer{align-items:center;background:var(--white);border-top:1px solid var(--gray-400);display:flex;justify-content:space-between;padding:var(--grid-unit-10) var(--grid-unit-20)}.traffic-boost-preview-footer .traffic-boost-preview-footer-next,.traffic-boost-preview-footer .traffic-boost-preview-footer-previous{min-width:2.25rem}.traffic-boost-preview-footer .traffic-boost-preview-footer-actions{align-items:center;display:flex;gap:var(--grid-unit-10)}.traffic-boost-preview-footer .traffic-boost-preview-footer-actions .components-button{height:2.25rem;padding:var(--grid-unit-10) var(--grid-unit-20)}.traffic-boost-preview-footer .traffic-boost-preview-footer-actions .traffic-boost-preview-footer-navigation{align-items:center;display:flex;font-size:var(--font-size--small);font-weight:500;gap:var(--grid-unit-5);line-height:var(--font-size--medium);text-transform:uppercase}.traffic-boost-preview-footer .traffic-boost-preview-footer-actions .traffic-boost-preview-footer-navigation select{border:none;font-size:var(--font-size--small);font-weight:500;line-height:var(--font-size--medium);margin-bottom:2px} .traffic-boost-links{display:flex;flex:1;flex-direction:column;height:100%;min-height:0}.traffic-boost-links .traffic-boost-links-list{display:flex;flex:1 1 auto;flex-direction:column;height:0;min-height:0;overflow-y:auto;overscroll-behavior:contain}.traffic-boost-links .traffic-boost-links-list .traffic-boost-single-link{align-items:center;border-bottom:1px solid var(--gray-350);cursor:pointer;display:flex;flex:0 0 auto;gap:var(--grid-unit-15);padding:var(--grid-unit-20) var(--grid-unit-30)}.traffic-boost-links .traffic-boost-links-list .traffic-boost-single-link.active{background:var(--Scales-Theme-theme-alpha-04,rgba(56,88,233,.04));border-bottom:1px solid var(--traffic-boost-header-background)}.traffic-boost-links .traffic-boost-links-list .traffic-boost-single-link .single-link-title{color:var(--sidebar-black);font-size:var(--font-size--medium);font-style:normal;font-weight:400;line-height:var(--grid-unit-30);overflow:hidden;text-overflow:ellipsis}.traffic-boost-links .links-pagination{align-items:center;color:var(--sidebar-black);display:flex;flex:0 0 auto;font-size:var(--font-size--smaller);font-style:normal;font-weight:500;justify-content:space-between;line-height:var(--grid-unit-20);margin-top:auto;padding:var(--grid-unit-15) var(--grid-unit-30);text-transform:uppercase}.traffic-boost-links .links-pagination .links-pagination-children{margin-left:auto}.traffic-boost-links .links-pagination .links-pagination-children .traffic-boost-add-suggestion{box-shadow:none}.traffic-boost-links .links-pagination .page-selector{align-items:center;display:flex;gap:var(--grid-unit-5)}.traffic-boost-links .links-pagination .page-selector select{background-color:transparent;border:none;cursor:pointer;font-size:var(--font-size--smaller);font-weight:500}.traffic-boost-links .links-pagination .page-selector select:focus{outline:none}.traffic-boost-links .links-pagination .page-navigation{display:flex;gap:var(--grid-unit-5);margin-right:var(--grid-unit-30)}.traffic-boost-links .traffic-boost-links-list-loading{align-items:center;display:flex;gap:var(--grid-unit-10);height:100%;justify-content:center;padding:var(--grid-unit-20)} #wp-parsely-dashboard-widget,.components-button[aria-controls="wp-parsely-block-editor-sidebar:wp-parsely-content-helper"],.editor-post-excerpt,.parsely-dashboard-container,.settings_page_parsely,.wp-parsely-block-overlay,.wp-parsely-content-helper,.wp-parsely-excerpt-generator,.wp-parsely-panel,.wp-parsely-popover,.wp-parsely-preview-editor,.wp-parsely-smart-linking-close-dialog,.wp-parsely-smart-linking-review-modal,.wp-parsely-suggested-title-modal,.wp-parsely-traffic-boost-add-new-link-popover,.wp-parsely-traffic-boost-preview-settings-popover{--base-font:"source-sans-pro",arial,sans-serif;--numeric-font:"ff-din-round-web",sans-serif;--parsely-green-components:107,42%,46%;--parsely-green:hsl(var(--parsely-green-components));--parsely-green-10:#c7ecb1;--parsely-green-65:#2a691b;--gray-200:#f7f8f9;--gray-300:#edeeef;--gray-400:#d7dbdf;--gray-500:#959da5;--gray-600:#586069;--gray-700:#444d56;--gray-900:#24292e;--blue-500:#44a8e5;--blue-550:#2596db;--green-500:#7bc01b;--green-900:#3d6307;--ref-direct:205,13%,52%;--ref-internal:161,91%,41%;--ref-social:210,72%,41%;--ref-search:42,100%,50%;--ref-other:3,76%,58%;--base-text:var(--gray-900);--base-text-2:var(--gray-600);--base-3:var(--gray-400);--border:var(--gray-400);--data:var(--green-500);--control:var(--blue-500);--grid-unit-5:0.25rem;--grid-unit-10:0.5rem;--grid-unit-15:0.75rem;--grid-unit-20:1rem;--grid-unit-25:1.25rem;--grid-unit-30:1.5rem;--grid-unit-40:2rem;--grid-unit-50:2.5rem;--grid-unit-60:3rem;--font-size--smaller:0.688rem;--font-size--small:0.75rem;--font-size--medium:0.875rem;--font-size--large:1rem;--font-size--extra-large:1.2rem;--font-size--bigger:2rem;--dashboard-width:64rem;--black:#000;--dashboard-accent:#b9f16b;--gray-350:#e1e3e5;--sidebar-black:#1e1e1e;--sidebar-white:#f0f0f0;--traffic-boost-header-background:rgba(56,88,233,.08);--white:#fff}.traffic-boost-sidebar{align-items:flex-start;background:var(--white);border-bottom:1px solid var(--gray-200);border-radius:var(--grid-unit-10);box-shadow:0 1px 1px 0 rgba(0,0,0,.03),0 1px 2px 0 rgba(0,0,0,.02),0 .1875rem .1875rem 0 rgba(0,0,0,.02),0 .25rem .25rem 0 rgba(0,0,0,.01);display:flex;flex-direction:column;height:calc(100vh - 4.0625rem);max-width:28.125rem;min-width:20rem}.traffic-boost-sidebar .traffic-boost-sidebar-header{align-items:center;align-self:stretch;background:var(--traffic-boost-header-background);display:flex;flex-direction:column;gap:var(--grid-unit-20);min-height:var(--grid-unit-50);padding:var(--grid-unit-20) var(--grid-unit-30)}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-sidebar-header-nav{align-items:center;align-self:stretch;display:flex;justify-content:space-between}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-sidebar-header-nav .components-button{font-size:var(--font-size--medium);font-weight:400;line-height:var(--grid-unit-25);padding-right:0;padding-left:0}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-post-details{align-items:flex-start;align-self:stretch;display:flex;flex-direction:column;gap:var(--grid-unit-10);justify-content:flex-end}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-post-details .traffic-boost-post-details-label{color:var(--gray-900);font-size:var(--font-size--small);font-style:normal;font-weight:500;line-height:var(--grid-unit-20);overflow:hidden;text-transform:uppercase}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-post-details .traffic-boost-post-details-content{align-items:center;align-self:stretch;display:flex;gap:var(--grid-unit-10)}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-post-details .traffic-boost-post-details-content .post-title{color:var(--gray-900);font-size:var(--font-size--medium);font-style:normal;font-weight:500;line-height:var(--grid-unit-25)}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-post-details .traffic-boost-post-details-divider{background:var(--gray-400);height:1px;margin:var(--grid-unit-10) 0;width:100%}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-post-details .traffic-boost-post-details-description{font-size:var(--font-size--medium);font-style:normal;font-weight:400;line-height:var(--grid-unit-20)}.traffic-boost-sidebar .traffic-boost-sidebar-content{display:flex;flex:1;flex-direction:column;gap:var(--grid-unit-20);min-height:0;width:100%}.traffic-boost-sidebar .traffic-boost-sidebar-content .traffic-boost-suggestions-settings .components-panel__body{border-bottom:0;border-top:0}.traffic-boost-sidebar .traffic-boost-sidebar-content .traffic-boost-suggestions-empty-state{align-items:center;display:flex;flex-direction:column;gap:var(--grid-unit-20);padding:var(--grid-unit-20)}.traffic-boost-sidebar .traffic-boost-sidebar-content .traffic-boost-suggestions-generating-footer{align-items:center;display:flex;gap:var(--grid-unit-10);justify-content:center;min-height:2.25rem;width:100%}.traffic-boost-sidebar .traffic-boost-sidebar-content .traffic-boost-suggestions-generating-footer span{margin-top:.3125rem}.traffic-boost-sidebar .traffic-boost-sidebar-tabs{display:flex;flex:1;flex-direction:column;width:100%}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tab-content{display:flex;flex:1;flex-direction:column;min-height:0;overflow:hidden}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs{border-bottom:1px solid var(--gray-400);border-top:1px solid var(--gray-400);display:flex;margin:0;padding:0;position:relative;width:100%}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs .components-tab-panel__tabs-item{flex:1;height:var(--grid-unit-60);justify-content:center;margin:0;padding:var(--grid-unit-15) var(--grid-unit-40)}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) transparent,inset 0 -1.5px 0 0 var(--wp-admin-theme-color)}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs .components-tab-panel__tabs-item .tab-count{align-items:center;background:var(--gray-400);border-radius:2px;display:inline-flex;gap:var(--grid-unit-10);justify-content:center;margin-right:var(--grid-unit-20);padding:var(--grid-unit-5) var(--grid-unit-10)}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.icon-only-tab{flex:0 0 var(--grid-unit-50);justify-content:center!important;min-width:var(--grid-unit-60)!important;padding:var(--grid-unit-10)!important;width:var(--grid-unit-60)!important}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.icon-only-tab .icon{color:var(--gray-600);height:var(--grid-unit-30)!important;width:var(--grid-unit-30)!important}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.icon-only-tab .icon svg{height:var(--grid-unit-30)!important;width:var(--grid-unit-30)!important}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.icon-only-tab:hover .icon{color:var(--gray-900)}.traffic-boost-sidebar .traffic-boost-suggestions-loading-generating{align-items:center;display:flex;flex-direction:column;gap:var(--grid-unit-15);height:100%;justify-content:center;padding:var(--grid-unit-20)}.wp-parsely-traffic-boost-add-new-link-popover{width:25rem}.wp-parsely-traffic-boost-add-new-link-popover .components-popover__content{display:flex;flex-direction:column;gap:var(--grid-unit-20);padding:var(--grid-unit-20);width:100%}.wp-parsely-traffic-boost-add-new-link-popover .traffic-boost-add-link-table.no-results{text-align:right} -.parsely-tone-selector-dropdown{align-items:center;align-self:stretch;background:var(--Gutenberg-White,#fff);border:1px solid var(--Gutenberg-Gray-600,#949494);border-radius:2px;height:2.25rem;overflow-wrap:break-word;width:100%;word-break:break-word}.parsely-tone-selector-dropdown button{height:2.0625rem}.parsely-tone-selector-dropdown .components-dropdown-menu__toggle.has-icon svg:first-child{display:none}.parsely-tone-selector-dropdown.is-disabled{opacity:.5;pointer-events:none}.parsely-tone-selector-dropdown .components-dropdown-menu__toggle{display:flex;gap:.625rem;width:100%}.parsely-tone-selector-dropdown .components-dropdown-menu__toggle svg:first-of-type path{transform:scale(1.4);transform-origin:center}.parsely-tone-selector-dropdown .parsely-tone-selector-label{flex-grow:2;padding:0 var(--grid-unit-10);text-align:right}.parsely-tone-selector-dropdown .parsely-tone-selector-label:first-letter{text-transform:uppercase}.parsely-persona-selector-custom{width:100%}.parsely-persona-selector-custom .components-base-control__field input{display:flex;height:2.5rem;padding:var(--grid-unit-15) var(--grid-unit-20)}.parsely-persona-selector-custom .components-base-control__field input,.parsely-persona-selector-dropdown{align-items:center;align-self:stretch;border:1px solid var(--Gutenberg-Gray-600,#949494);border-radius:2px}.parsely-persona-selector-dropdown{background:var(--Gutenberg-White,#fff);height:2.25rem;overflow-wrap:break-word;width:100%;word-break:break-word}.parsely-persona-selector-dropdown .components-dropdown-menu__toggle.has-icon svg:first-child{display:none}.parsely-persona-selector-dropdown button{height:2.0625rem}.parsely-persona-selector-dropdown.is-disabled{opacity:.5;pointer-events:none}.parsely-persona-selector-dropdown .components-dropdown-menu__toggle{display:flex;gap:.625rem;width:100%}.parsely-persona-selector-dropdown .parsely-persona-selector-label{flex-grow:2;padding:0 var(--grid-unit-10);text-align:right}.parsely-persona-selector-dropdown .parsely-persona-selector-label:first-letter{text-transform:uppercase}.parsely-tone-selector-custom{width:100%}.parsely-tone-selector-custom .components-base-control__field input{align-items:center;align-self:stretch;border:1px solid var(--Gutenberg-Gray-600,#949494);border-radius:2px;display:flex;height:2.5rem;padding:var(--grid-unit-15) var(--grid-unit-20)}.parsely-inputrange-control{align-items:flex-start;align-self:stretch;display:flex;flex-direction:column;gap:var(--grid-unit-10)}.parsely-inputrange-control .parsely-inputrange-control__label{margin:0}.parsely-inputrange-control .parsely-inputrange-control__controls{align-items:center;align-self:stretch;display:flex;gap:var(--grid-unit-20);height:2.5rem}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control{display:flex;flex:1 0 0}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control input[type=number]::-webkit-inner-spin-button,.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control input[type=number]{-moz-appearance:textfield}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control .components-base-control__field{flex-grow:1}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control .components-input-control__suffix{color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.parsely-inputrange-control .parsely-inputrange-control__controls .components-range-control{flex:1 0 0;height:36px}.parsely-inputrange-control .parsely-inputrange-control__controls .components-range-control .components-range-control__root{height:2.5rem}#wp-parsely-dashboard-widget,.components-button[aria-controls="wp-parsely-block-editor-sidebar:wp-parsely-content-helper"],.editor-post-excerpt,.parsely-dashboard-container,.settings_page_parsely,.wp-parsely-block-overlay,.wp-parsely-content-helper,.wp-parsely-excerpt-generator,.wp-parsely-panel,.wp-parsely-popover,.wp-parsely-preview-editor,.wp-parsely-smart-linking-close-dialog,.wp-parsely-smart-linking-review-modal,.wp-parsely-suggested-title-modal,.wp-parsely-traffic-boost-add-new-link-popover,.wp-parsely-traffic-boost-preview-settings-popover{--base-font:"source-sans-pro",arial,sans-serif;--numeric-font:"ff-din-round-web",sans-serif;--parsely-green-components:107,42%,46%;--parsely-green:hsl(var(--parsely-green-components));--parsely-green-10:#c7ecb1;--parsely-green-65:#2a691b;--gray-200:#f7f8f9;--gray-300:#edeeef;--gray-400:#d7dbdf;--gray-500:#959da5;--gray-600:#586069;--gray-700:#444d56;--gray-900:#24292e;--blue-500:#44a8e5;--blue-550:#2596db;--green-500:#7bc01b;--green-900:#3d6307;--ref-direct:205,13%,52%;--ref-internal:161,91%,41%;--ref-social:210,72%,41%;--ref-search:42,100%,50%;--ref-other:3,76%,58%;--base-text:var(--gray-900);--base-text-2:var(--gray-600);--base-3:var(--gray-400);--border:var(--gray-400);--data:var(--green-500);--control:var(--blue-500);--grid-unit-5:0.25rem;--grid-unit-10:0.5rem;--grid-unit-15:0.75rem;--grid-unit-20:1rem;--grid-unit-25:1.25rem;--grid-unit-30:1.5rem;--grid-unit-40:2rem;--grid-unit-50:2.5rem;--grid-unit-60:3rem;--font-size--smaller:0.688rem;--font-size--small:0.75rem;--font-size--medium:0.875rem;--font-size--large:1rem;--font-size--extra-large:1.2rem;--font-size--bigger:2rem;--dashboard-width:64rem;--black:#000;--dashboard-accent:#b9f16b;--gray-350:#e1e3e5;--sidebar-black:#1e1e1e;--sidebar-white:#f0f0f0;--traffic-boost-header-background:rgba(56,88,233,.08);--white:#fff}.parsely-thumbnail{border-radius:3px;flex-shrink:0;overflow:hidden}.parsely-thumbnail img{border-radius:3px;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.parsely-thumbnail .parsely-thumbnail-icon-container{align-items:center;background:var(--gray-500);border-radius:3px;display:flex;height:100%;justify-content:center;width:100%}.parsely-thumbnail .parsely-thumbnail-icon-container svg{fill:var(--sidebar-white);height:60%;width:60%}.wp-parsely-snackbar-notices{bottom:4rem;display:flex;flex-direction:column-reverse;gap:.375rem;padding:1rem;position:fixed;width:100%;z-index:999999}.wp-parsely-snackbar-notices svg{fill:currentcolor}.wp-parsely-loading{align-items:center;border-radius:.25rem;color:var(--sidebar-black);display:flex;gap:var(--grid-unit-20);justify-content:center;min-height:1.5rem;min-width:25rem;padding:var(--grid-unit-10) var(--grid-unit-15)}.wp-parsely-loading .components-spinner{flex-shrink:0;margin:0}.wp-parsely-loading .wp-parsely-loading-message{flex-grow:1;font-size:var(--font-size--medium);line-height:1.4;margin:0;max-width:25rem}.wp-parsely-loading .wp-parsely-typewriter-text{display:inline-block;min-height:1.4em;min-width:1ch}.wp-parsely-loading .wp-parsely-typewriter-cursor{animation:blink 1s step-end infinite;display:inline-block;font-weight:400;margin-right:2px;opacity:.7}@keyframes blink{0%,to{opacity:0}50%{opacity:1}}.parsely-panel-settings{width:100%}.parsely-panel-settings .parsely-panel-settings-header{display:flex;margin:.625rem 0;width:100%}.parsely-panel-settings .parsely-panel-settings-header .parsely-panel-settings-header-label{flex-grow:2;margin:0 .3125rem 0 0;text-align:right}.parsely-panel-settings .parsely-panel-settings-header .parsely-panel-settings-header-label .components-base-control__field{align-items:center;display:flex;justify-content:space-between}.parsely-panel-settings .parsely-panel-settings-header .parsely-panel-settings-header-label .components-base-control__field .components-base-control__label{margin-bottom:0}.parsely-panel-settings .parsely-panel-settings-body{align-self:stretch;display:flex;flex-direction:column;gap:.625rem;padding:.375rem 0 var(--grid-unit-20) 0}.wp-parsely-dropdown-label{align-self:stretch;color:var(--sidebar-black);font-size:var(--font-size--smaller);font-style:normal;font-weight:600;line-height:var(--grid-unit-20);text-transform:uppercase}.wp-parsely-content-helper-error{align-self:flex-start;margin:0}.wp-parsely-content-helper-error p{margin:0}.wp-parsely-content-helper-error .content-helper-error-message{margin:0!important}.wp-parsely-collapsible-panel{align-items:flex-start;align-self:stretch;border-bottom:none;border-radius:2px;border-top:none;display:flex;flex-direction:column;gap:var(--grid-unit-20);margin:0 0 .5rem;padding:0}.wp-parsely-collapsible-panel .components-panel__body-title{align-items:center;align-self:stretch;display:flex;margin:0 -1rem .375rem;padding:0}.wp-parsely-collapsible-panel .components-panel__body-title .components-panel__icon,.wp-parsely-collapsible-panel .components-panel__body-title svg{margin-right:0;margin-left:var(--grid-unit-10);order:-1}.wp-parsely-collapsible-panel .components-panel__body-title:hover{background-color:transparent}.wp-parsely-collapsible-panel.is-opened{padding:0}.wp-parsely-collapsible-panel.is-opened>div:first-of-type{margin-top:calc(var(--grid-unit-20)*-1)}.wp-parsely-collapsible-panel.is-opened .components-panel__body-title{margin:0 calc(var(--grid-unit-20)*-1) .375rem;padding-bottom:0}.wp-parsely-collapsible-panel .components-panel__body-toggle.components-button{color:var(--Gutenberg-Gray-900,#1e1e1e);font-size:.6875rem;font-style:normal;font-weight:600;line-height:1rem;padding:var(--grid-unit-20) var(--grid-unit-20);text-transform:uppercase}.wp-parsely-collapsible-panel .components-panel__body-toggle.components-button .components-panel__arrow{margin-left:0}.wp-parsely-collapsible-panel .components-panel__body.is-opened{padding:0}.parsely-table-container.is-loading{align-items:center;display:flex;justify-content:center;padding:var(--grid-unit-20)}.parsely-table-container table{border-collapse:collapse;border-spacing:0;width:100%}.parsely-table-container table tr{display:flex;gap:var(--grid-unit-20);padding:var(--grid-unit-15) 0;position:relative}.parsely-table-container table tr:after{background-color:var(--border);bottom:0;content:"";height:1px;right:50%;position:absolute;transform:translateX(50%);width:100vw}.parsely-table-container table tr td,.parsely-table-container table tr th{align-self:center;text-align:right}.parsely-table-container table tr td.post-info,.parsely-table-container table tr th.post-info-header{width:70%}.parsely-table-container table tr th.boost-perf-header{overflow:visible;position:relative;white-space:nowrap;z-index:1}.parsely-table-container table tr td.actions{align-items:center;display:flex;flex:1;gap:var(--grid-unit-10);justify-content:flex-end;min-height:2.5rem;padding-left:var(--grid-unit-20);width:11.25rem}.parsely-table-container table tr td.actions a{text-decoration:none}.parsely-table-container table tr th{color:var(--sidebar-black);font-size:var(--font-size--small);font-style:normal;font-weight:600;line-height:var(--font-size--large);text-transform:uppercase}.parsely-table-container.no-results{color:#757575;font-style:italic;padding:var(--grid-unit-15);text-align:center}.parsely-table-container.hide-pagination table tr:last-child:after{display:none}.parsely-table-container.compact table tr td.post-info{width:100%}.parsely-table-container.compact .post-title{display:-webkit-box!important;overflow:hidden;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.posts-table-post-info{align-items:flex-start;display:flex;flex:1 0 0;gap:var(--grid-unit-20);min-height:2.5rem}.posts-table-post-info .posts-table-thumbnail{align-self:center}.posts-table-post-info .post-details{align-items:flex-start;display:flex;flex:1 0 0;flex-direction:column;gap:var(--grid-unit-05,4px);justify-content:center;min-height:var(--grid-unit-40)}.posts-table-post-info .post-details .post-title{align-items:center;align-self:stretch;display:flex;font-size:var(--font-size--medium);font-style:normal;font-weight:600;gap:var(--grid-unit-5);line-height:1.25rem;overflow:hidden;text-overflow:ellipsis}.posts-table-post-info .post-details .post-meta{align-content:center;align-items:center;align-self:stretch;color:var(--gray-500);display:flex;flex-wrap:wrap;gap:var(--grid-unit-5) var(--grid-unit-10)}.posts-table-post-info .post-details .post-categories{display:flex;gap:var(--grid-unit-5)}.posts-table-post-info .post-details .post-categories span{background:var(--gray-400);border-radius:.375rem;color:var(--sidebar-black);font-size:var(--font-size--smaller);font-weight:500;line-height:var(--font-size--large);padding:2px var(--grid-unit-10)}.posts-table-pagination-controls{align-items:center;align-self:stretch;display:flex;font-size:var(--font-size--smaller);font-style:normal;font-weight:600;gap:var(--grid-unit-30);justify-content:flex-end;line-height:var(--font-size--large);padding:var(--grid-unit-15);text-transform:uppercase}.posts-table-pagination-controls .page-selector{align-items:center;display:flex;gap:var(--grid-unit-10)}.posts-table-pagination-controls .page-navigation{align-items:center;display:flex;gap:var(--grid-unit-5);justify-content:flex-end}body{background:#fff}.parsely-dashboard-container{margin-right:-1.25rem;overflow:hidden}.parsely-dashboard-page-body,.parsely-dashboard-page-header{margin:0 auto;max-width:var(--dashboard-width);padding:var(--grid-unit-30)} +.parsely-tone-selector-dropdown{align-items:center;align-self:stretch;background:var(--Gutenberg-White,#fff);border:1px solid var(--Gutenberg-Gray-600,#949494);border-radius:2px;height:2.25rem;overflow-wrap:break-word;width:100%;word-break:break-word}.parsely-tone-selector-dropdown button{height:2.0625rem}.parsely-tone-selector-dropdown .components-dropdown-menu__toggle.has-icon svg:first-child{display:none}.parsely-tone-selector-dropdown.is-disabled{opacity:.5;pointer-events:none}.parsely-tone-selector-dropdown .components-dropdown-menu__toggle{display:flex;gap:.625rem;width:100%}.parsely-tone-selector-dropdown .components-dropdown-menu__toggle svg:first-of-type path{transform:scale(1.4);transform-origin:center}.parsely-tone-selector-dropdown .parsely-tone-selector-label{flex-grow:2;padding:0 var(--grid-unit-10);text-align:right}.parsely-tone-selector-dropdown .parsely-tone-selector-label:first-letter{text-transform:uppercase}.parsely-persona-selector-custom{width:100%}.parsely-persona-selector-custom .components-base-control__field input{display:flex;height:2.5rem;padding:var(--grid-unit-15) var(--grid-unit-20)}.parsely-persona-selector-custom .components-base-control__field input,.parsely-persona-selector-dropdown{align-items:center;align-self:stretch;border:1px solid var(--Gutenberg-Gray-600,#949494);border-radius:2px}.parsely-persona-selector-dropdown{background:var(--Gutenberg-White,#fff);height:2.25rem;overflow-wrap:break-word;width:100%;word-break:break-word}.parsely-persona-selector-dropdown .components-dropdown-menu__toggle.has-icon svg:first-child{display:none}.parsely-persona-selector-dropdown button{height:2.0625rem}.parsely-persona-selector-dropdown.is-disabled{opacity:.5;pointer-events:none}.parsely-persona-selector-dropdown .components-dropdown-menu__toggle{display:flex;gap:.625rem;width:100%}.parsely-persona-selector-dropdown .parsely-persona-selector-label{flex-grow:2;padding:0 var(--grid-unit-10);text-align:right}.parsely-persona-selector-dropdown .parsely-persona-selector-label:first-letter{text-transform:uppercase}.parsely-tone-selector-custom{width:100%}.parsely-tone-selector-custom .components-base-control__field input{align-items:center;align-self:stretch;border:1px solid var(--Gutenberg-Gray-600,#949494);border-radius:2px;display:flex;height:2.5rem;padding:var(--grid-unit-15) var(--grid-unit-20)}.parsely-inputrange-control{align-items:flex-start;align-self:stretch;display:flex;flex-direction:column;gap:var(--grid-unit-10)}.parsely-inputrange-control .parsely-inputrange-control__label{margin:0}.parsely-inputrange-control .parsely-inputrange-control__controls{align-items:center;align-self:stretch;display:flex;gap:var(--grid-unit-20);height:2.5rem}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control{display:flex;flex:1 0 0}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control input[type=number]::-webkit-inner-spin-button,.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control input[type=number]{-moz-appearance:textfield}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control .components-base-control__field{flex-grow:1}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control .components-input-control__suffix{color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.parsely-inputrange-control .parsely-inputrange-control__controls .components-range-control{flex:1 0 0;height:36px}.parsely-inputrange-control .parsely-inputrange-control__controls .components-range-control .components-range-control__root{height:2.5rem}#wp-parsely-dashboard-widget,.components-button[aria-controls="wp-parsely-block-editor-sidebar:wp-parsely-content-helper"],.editor-post-excerpt,.parsely-dashboard-container,.settings_page_parsely,.wp-parsely-block-overlay,.wp-parsely-content-helper,.wp-parsely-excerpt-generator,.wp-parsely-panel,.wp-parsely-popover,.wp-parsely-preview-editor,.wp-parsely-smart-linking-close-dialog,.wp-parsely-smart-linking-review-modal,.wp-parsely-suggested-title-modal,.wp-parsely-traffic-boost-add-new-link-popover,.wp-parsely-traffic-boost-preview-settings-popover{--base-font:"source-sans-pro",arial,sans-serif;--numeric-font:"ff-din-round-web",sans-serif;--parsely-green-components:107,42%,46%;--parsely-green:hsl(var(--parsely-green-components));--parsely-green-10:#c7ecb1;--parsely-green-65:#2a691b;--gray-200:#f7f8f9;--gray-300:#edeeef;--gray-400:#d7dbdf;--gray-500:#959da5;--gray-600:#586069;--gray-700:#444d56;--gray-900:#24292e;--blue-500:#44a8e5;--blue-550:#2596db;--green-500:#7bc01b;--green-900:#3d6307;--ref-direct:205,13%,52%;--ref-internal:161,91%,41%;--ref-social:210,72%,41%;--ref-search:42,100%,50%;--ref-other:3,76%,58%;--base-text:var(--gray-900);--base-text-2:var(--gray-600);--base-3:var(--gray-400);--border:var(--gray-400);--data:var(--green-500);--control:var(--blue-500);--grid-unit-5:0.25rem;--grid-unit-10:0.5rem;--grid-unit-15:0.75rem;--grid-unit-20:1rem;--grid-unit-25:1.25rem;--grid-unit-30:1.5rem;--grid-unit-40:2rem;--grid-unit-50:2.5rem;--grid-unit-60:3rem;--font-size--smaller:0.688rem;--font-size--small:0.75rem;--font-size--medium:0.875rem;--font-size--large:1rem;--font-size--extra-large:1.2rem;--font-size--bigger:2rem;--dashboard-width:64rem;--black:#000;--dashboard-accent:#b9f16b;--gray-350:#e1e3e5;--sidebar-black:#1e1e1e;--sidebar-white:#f0f0f0;--traffic-boost-header-background:rgba(56,88,233,.08);--white:#fff}.parsely-thumbnail{border-radius:3px;flex-shrink:0;overflow:hidden}.parsely-thumbnail img{border-radius:3px;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.parsely-thumbnail .parsely-thumbnail-icon-container{align-items:center;background:var(--gray-500);border-radius:3px;display:flex;height:100%;justify-content:center;width:100%}.parsely-thumbnail .parsely-thumbnail-icon-container svg{fill:var(--sidebar-white);height:60%;width:60%}.wp-parsely-snackbar-notices{bottom:4rem;display:flex;flex-direction:column-reverse;gap:.375rem;padding:1rem;position:fixed;width:100%;z-index:999999}.wp-parsely-snackbar-notices svg{fill:currentcolor}.wp-parsely-loading{align-items:center;border-radius:.25rem;color:var(--sidebar-black);display:flex;gap:var(--grid-unit-20);justify-content:center;min-height:1.5rem;min-width:25rem;padding:var(--grid-unit-10) var(--grid-unit-15)}.wp-parsely-loading .components-spinner{flex-shrink:0;margin:0}.wp-parsely-loading .wp-parsely-loading-message{flex-grow:1;font-size:var(--font-size--medium);line-height:1.4;margin:0;max-width:25rem}.wp-parsely-loading .wp-parsely-typewriter-text{display:inline-block;min-height:1.4em;min-width:1ch}.wp-parsely-loading .wp-parsely-typewriter-cursor{animation:blink 1s step-end infinite;display:inline-block;font-weight:400;margin-right:2px;opacity:.7}@keyframes blink{0%,to{opacity:0}50%{opacity:1}}.parsely-panel-settings{width:100%}.parsely-panel-settings .parsely-panel-settings-header{display:flex;margin:.625rem 0;width:100%}.parsely-panel-settings .parsely-panel-settings-header .parsely-panel-settings-header-label{flex-grow:2;margin:0 .3125rem 0 0;text-align:right}.parsely-panel-settings .parsely-panel-settings-header .parsely-panel-settings-header-label .components-base-control__field{align-items:center;display:flex;justify-content:space-between}.parsely-panel-settings .parsely-panel-settings-header .parsely-panel-settings-header-label .components-base-control__field .components-base-control__label{margin-bottom:0}.parsely-panel-settings .parsely-panel-settings-body{align-self:stretch;display:flex;flex-direction:column;gap:.625rem;padding:.375rem 0 var(--grid-unit-20) 0}.wp-parsely-dropdown-label{align-self:stretch;color:var(--sidebar-black);font-size:var(--font-size--smaller);font-style:normal;font-weight:600;line-height:var(--grid-unit-20);text-transform:uppercase}.wp-parsely-content-helper-error{align-self:flex-start;margin:0}.wp-parsely-content-helper-error p{margin:0}.wp-parsely-content-helper-error .content-helper-error-message{margin:0!important}.wp-parsely-collapsible-panel{align-items:flex-start;align-self:stretch;border-bottom:none;border-radius:2px;border-top:none;display:flex;flex-direction:column;gap:var(--grid-unit-20);margin:0 0 .5rem;padding:0}.wp-parsely-collapsible-panel .components-panel__body-title{align-items:center;align-self:stretch;display:flex;margin:0 -1rem .375rem;padding:0}.wp-parsely-collapsible-panel .components-panel__body-title .components-panel__icon,.wp-parsely-collapsible-panel .components-panel__body-title svg{margin-right:0;margin-left:var(--grid-unit-10);order:-1}.wp-parsely-collapsible-panel .components-panel__body-title:hover{background-color:transparent}.wp-parsely-collapsible-panel.is-opened{padding:0}.wp-parsely-collapsible-panel.is-opened>div:first-of-type{margin-top:calc(var(--grid-unit-20)*-1)}.wp-parsely-collapsible-panel.is-opened .components-panel__body-title{margin:0 calc(var(--grid-unit-20)*-1) .375rem;padding-bottom:0}.wp-parsely-collapsible-panel .components-panel__body-toggle.components-button{color:var(--Gutenberg-Gray-900,#1e1e1e);font-size:.6875rem;font-style:normal;font-weight:600;line-height:1rem;padding:var(--grid-unit-20) var(--grid-unit-20);text-transform:uppercase}.wp-parsely-collapsible-panel .components-panel__body-toggle.components-button .components-panel__arrow{margin-left:0}.wp-parsely-collapsible-panel .components-panel__body.is-opened{padding:0}.parsely-table-container.is-loading{align-items:center;display:flex;justify-content:center;padding:var(--grid-unit-20)}.parsely-table-container table{border-collapse:collapse;border-spacing:0;width:100%}.parsely-table-container table tr{position:relative}.parsely-table-container table tr:after{background-color:var(--border);bottom:0;content:"";height:1px;right:50%;position:absolute;transform:translateX(50%);width:100vw}.parsely-table-container table tr td,.parsely-table-container table tr th{padding:var(--grid-unit-15) 0}.parsely-table-container table tr td.post-info,.parsely-table-container table tr th.post-info-header{text-align:right}.parsely-table-container table tr th{color:var(--sidebar-black);font-size:var(--font-size--small);font-style:normal;font-weight:600;line-height:var(--font-size--large);text-transform:uppercase}.parsely-table-container table tr th.views-header{min-width:3.75rem;text-align:center}.parsely-table-container table tr th.views-header .views-header-period{color:var(--gray-500);font-size:var(--font-size--smaller);font-weight:400;margin-right:var(--grid-unit-5)}.parsely-table-container table tr td.metrics{min-width:100px}.parsely-table-container table tr td.metrics .metrics-container{align-items:center;display:flex;flex-direction:column;gap:var(--grid-unit-5)}.parsely-table-container table tr td.metrics .metrics-container .metric-change{font-size:var(--font-size--small);font-weight:600;line-height:var(--font-size--large);margin-right:var(--grid-unit-5)}.parsely-table-container table tr td.metrics .metrics-container .metric-change-positive{color:var(--parsely-green)}.parsely-table-container table tr td.metrics .metrics-container .metric-change-negative{color:#900000}.parsely-table-container table tr td.metrics .metrics-container .metric-change-neutral{color:var(--gray-500)}.parsely-table-container table tr td.metrics .metrics-container .metric-boost-percentage{color:var(--parsely-green);font-size:var(--font-size--small);font-weight:600}.parsely-table-container table tr td.actions{align-items:center;display:flex;gap:var(--grid-unit-10);justify-content:flex-end;margin-right:var(--grid-unit-10);max-width:8.4375rem;min-height:2.5rem}.parsely-table-container table tr td.actions a{text-decoration:none}.parsely-table-container table tr td.actions .boost-link-container{display:flex;flex-direction:column;gap:.25rem;height:100%;text-align:center;width:100%}.parsely-table-container table tr td.actions .boost-link-container .boost-link-status{display:flex;gap:.25rem;justify-content:center}.parsely-table-container table tr td.actions .boost-link-container .boost-link-status .hidden{opacity:0}.parsely-table-container table tr td.actions .boost-link-container .boost-link-status .boost-inbound,.parsely-table-container table tr td.actions .boost-link-container .boost-link-status .boost-outbound{align-items:center;background-color:var(--gray-300);border-radius:.375rem;color:var(--sidebar-black);display:flex;flex-grow:1;font-size:var(--font-size--small);justify-content:center;line-height:var(--font-size--medium);padding:.25rem .5625rem}.parsely-table-container table tr td.actions .boost-link-container .boost-link-status .boost-link-status-icon-inbound{transform:rotate(-180deg)}.parsely-table-container.no-results{color:#757575;font-style:italic;padding:var(--grid-unit-15);text-align:center}.parsely-table-container .suggestion-bubble{background:var(--parsely-green);border:none;border-radius:1.25rem;box-shadow:none;color:var(--sidebar-white);cursor:pointer;display:inline-block;font-size:.8125rem;line-height:.875rem;margin-right:.375rem;min-width:1.75rem;padding:3px .375rem;text-align:center}.parsely-table-container.compact table tr td.post-info{max-width:100px}.parsely-table-container.compact tr:after{width:100%}.parsely-table-container.compact .post-title{display:-webkit-box!important;overflow:hidden;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.parsely-table-container.compact .post-title>span{white-space:normal!important}.parsely-table-container.hide-pagination table tr:last-child:after{display:none}.posts-table-post-info{align-items:flex-start;display:flex;flex:1 0 0;gap:var(--grid-unit-20);min-height:2.5rem}.posts-table-post-info .posts-table-thumbnail{align-self:center}.posts-table-post-info .post-details{align-items:flex-start;display:flex;flex:1 0 0;flex-direction:column;gap:var(--grid-unit-05,4px);justify-content:center;min-height:var(--grid-unit-40);min-width:0}.posts-table-post-info .post-details .post-title{align-items:center;align-self:stretch;display:flex;font-size:var(--font-size--medium);font-style:normal;font-weight:600;gap:var(--grid-unit-5);line-height:1.25rem;overflow:hidden;text-overflow:ellipsis}.posts-table-post-info .post-details .post-title>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.posts-table-post-info .post-details .post-meta{align-content:center;align-items:center;align-self:stretch;color:var(--gray-500);display:flex;flex-wrap:wrap;gap:var(--grid-unit-5) var(--grid-unit-10)}.posts-table-post-info .post-details .post-categories{display:flex;gap:var(--grid-unit-5)}.posts-table-post-info .post-details .post-categories span{background:var(--gray-400);border-radius:.375rem;color:var(--sidebar-black);font-size:var(--font-size--smaller);font-weight:500;line-height:var(--font-size--large);padding:2px var(--grid-unit-10)}.posts-table-pagination-controls{align-items:center;align-self:stretch;display:flex;font-size:var(--font-size--smaller);font-style:normal;font-weight:600;gap:var(--grid-unit-30);justify-content:flex-end;line-height:var(--font-size--large);padding:var(--grid-unit-15);text-transform:uppercase}.posts-table-pagination-controls .page-selector{align-items:center;display:flex;gap:var(--grid-unit-10)}.posts-table-pagination-controls .page-navigation{align-items:center;display:flex;gap:var(--grid-unit-5);justify-content:flex-end}body{background:#fff}.parsely-dashboard-container{margin-right:-1.25rem;overflow:hidden}.parsely-dashboard-page-body,.parsely-dashboard-page-header{margin:0 auto;max-width:var(--dashboard-width);padding:var(--grid-unit-30)} diff --git a/build/content-helper/dashboard-page.asset.php b/build/content-helper/dashboard-page.asset.php index 65688b88c7..65d01ab811 100644 --- a/build/content-helper/dashboard-page.asset.php +++ b/build/content-helper/dashboard-page.asset.php @@ -1 +1 @@ - array('react', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-url'), 'version' => '077f9e4111341245162f'); + array('react', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-url'), 'version' => '2091307856d92e7e9ea0'); diff --git a/build/content-helper/dashboard-page.css b/build/content-helper/dashboard-page.css index 36f6fcd97d..3eca2b3db3 100644 --- a/build/content-helper/dashboard-page.css +++ b/build/content-helper/dashboard-page.css @@ -3,4 +3,4 @@ #wp-parsely-dashboard-widget,.components-button[aria-controls="wp-parsely-block-editor-sidebar:wp-parsely-content-helper"],.editor-post-excerpt,.parsely-dashboard-container,.settings_page_parsely,.wp-parsely-block-overlay,.wp-parsely-content-helper,.wp-parsely-excerpt-generator,.wp-parsely-panel,.wp-parsely-popover,.wp-parsely-preview-editor,.wp-parsely-smart-linking-close-dialog,.wp-parsely-smart-linking-review-modal,.wp-parsely-suggested-title-modal,.wp-parsely-traffic-boost-add-new-link-popover,.wp-parsely-traffic-boost-preview-settings-popover{--base-font:"source-sans-pro",arial,sans-serif;--numeric-font:"ff-din-round-web",sans-serif;--parsely-green-components:107,42%,46%;--parsely-green:hsl(var(--parsely-green-components));--parsely-green-10:#c7ecb1;--parsely-green-65:#2a691b;--gray-200:#f7f8f9;--gray-300:#edeeef;--gray-400:#d7dbdf;--gray-500:#959da5;--gray-600:#586069;--gray-700:#444d56;--gray-900:#24292e;--blue-500:#44a8e5;--blue-550:#2596db;--green-500:#7bc01b;--green-900:#3d6307;--ref-direct:205,13%,52%;--ref-internal:161,91%,41%;--ref-social:210,72%,41%;--ref-search:42,100%,50%;--ref-other:3,76%,58%;--base-text:var(--gray-900);--base-text-2:var(--gray-600);--base-3:var(--gray-400);--border:var(--gray-400);--data:var(--green-500);--control:var(--blue-500);--grid-unit-5:0.25rem;--grid-unit-10:0.5rem;--grid-unit-15:0.75rem;--grid-unit-20:1rem;--grid-unit-25:1.25rem;--grid-unit-30:1.5rem;--grid-unit-40:2rem;--grid-unit-50:2.5rem;--grid-unit-60:3rem;--font-size--smaller:0.688rem;--font-size--small:0.75rem;--font-size--medium:0.875rem;--font-size--large:1rem;--font-size--extra-large:1.2rem;--font-size--bigger:2rem;--dashboard-width:64rem;--black:#000;--dashboard-accent:#b9f16b;--gray-350:#e1e3e5;--sidebar-black:#1e1e1e;--sidebar-white:#f0f0f0;--traffic-boost-header-background:rgba(56,88,233,.08);--white:#fff}.traffic-boost-preview{align-self:stretch;background-color:var(--sidebar-white);border-radius:.5rem;display:flex;flex:1 0 0;flex-direction:column;min-width:18.75rem;overflow:hidden;padding:0}.traffic-boost-preview .wp-parsely-preview{background:var(--sidebar-white);display:flex;flex:1;height:100%;overflow:hidden}.traffic-boost-preview .wp-parsely-preview .preview-iframe-wrapper{height:100%;overflow:hidden;position:relative;width:100%}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-iframe{background:var(--sidebar-white);border:none;height:100%;left:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;transition:all .5s ease;width:100%;z-index:0}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-iframe.is-loading{filter:blur(4px);opacity:.7}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-loading{align-items:center;background-color:var(--sidebar-white);display:flex;inset:0;justify-content:center;opacity:0;pointer-events:none;position:absolute;transition:opacity .1s ease-in-out,visibility .1s ease-in-out;visibility:hidden;z-index:3}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-loading.is-loading{align-items:center;display:flex;flex-direction:column;font-size:var(--font-size--extra-large);font-weight:500;gap:var(--grid-unit-30);justify-content:center;line-height:var(--font-size--extra-large);opacity:1;visibility:visible}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-loading.is-loading .wp-parsely-loading{width:90%}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-loading.is-loading .wp-parsely-loading .wp-parsely-loading-message{max-width:37.5rem;text-align:center}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-loading .components-spinner{height:var(--grid-unit-40);margin:0;width:var(--grid-unit-40)}.traffic-boost-preview .wp-parsely-preview .wp-parsely-preview-generating-placement{align-items:center;display:flex;inset:0;justify-content:center;pointer-events:none;position:absolute;z-index:3}.traffic-boost-preview-header{align-items:center;background:var(--white);border-bottom:1px solid var(--gray-400);display:flex;justify-content:space-between;padding:var(--grid-unit-15) var(--grid-unit-20);z-index:5}.traffic-boost-preview-header .traffic-boost-preview-actions{display:flex;gap:var(--grid-unit-10)}.traffic-boost-preview-header .traffic-boost-preview-actions button{border-radius:.25rem;height:1.875rem;min-width:1.875rem;padding:var(--grid-unit-5)}.traffic-boost-preview-header .traffic-boost-preview-actions button:hover{color:var(--wp-admin-theme-color)}.traffic-boost-preview-header .traffic-boost-preview-actions .components-button.is-pressed:focus:not(:disabled){box-shadow:none}.traffic-boost-preview-header .traffic-boost-preview-info{align-items:flex-start;display:flex;flex:1 0 0;flex-direction:column;gap:var(--grid-unit-5);min-width:0}.traffic-boost-preview-header .traffic-boost-preview-info .traffic-boost-preview-info-title{color:var(--gray-900);font-size:var(--font-size--large);font-weight:500;line-height:var(--font-size--extra-large);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.traffic-boost-preview-header .traffic-boost-preview-info .traffic-boost-preview-info-links{align-items:center;align-self:stretch;display:flex;font-size:var(--font-size--medium);font-weight:400;gap:var(--grid-unit-10);line-height:var(--font-size--extra-large);min-height:var(--grid-unit-30)}.traffic-boost-preview-header .traffic-boost-preview-info .traffic-boost-preview-info-links .traffic-boost-preview-info-links-counter{align-items:center;align-self:stretch;display:flex;gap:var(--grid-unit-10)}.traffic-boost-preview-header .traffic-boost-preview-info .traffic-boost-preview-info-links .traffic-boost-preview-info-links-counter button{height:1.375rem;padding:var(--grid-unit-5) var(--grid-unit-10)}.traffic-boost-preview-header .traffic-boost-preview-info .traffic-boost-preview-info-links .traffic-boost-preview-info-links-counter button.is-pressed,.traffic-boost-preview-header .traffic-boost-preview-info .traffic-boost-preview-info-links .traffic-boost-preview-info-links-counter button:focus{box-shadow:0 0 0 1px var(--black);outline:none}.traffic-boost-preview-header .traffic-boost-preview-info .traffic-boost-preview-info-links .traffic-boost-preview-info-links-counter button:not(.is-pressed):focus{box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);color:var(--wp-admin-theme-color)}.wp-parsely-traffic-boost-preview-settings-popover{margin-top:var(--grid-unit-20);width:17.1875rem}.wp-parsely-traffic-boost-preview-settings-popover-content{min-width:13.75rem;padding:var(--grid-unit-20);width:17.1875rem}.traffic-boost-preview-footer{align-items:center;background:var(--white);border-top:1px solid var(--gray-400);display:flex;justify-content:space-between;padding:var(--grid-unit-10) var(--grid-unit-20)}.traffic-boost-preview-footer .traffic-boost-preview-footer-next,.traffic-boost-preview-footer .traffic-boost-preview-footer-previous{min-width:2.25rem}.traffic-boost-preview-footer .traffic-boost-preview-footer-actions{align-items:center;display:flex;gap:var(--grid-unit-10)}.traffic-boost-preview-footer .traffic-boost-preview-footer-actions .components-button{height:2.25rem;padding:var(--grid-unit-10) var(--grid-unit-20)}.traffic-boost-preview-footer .traffic-boost-preview-footer-actions .traffic-boost-preview-footer-navigation{align-items:center;display:flex;font-size:var(--font-size--small);font-weight:500;gap:var(--grid-unit-5);line-height:var(--font-size--medium);text-transform:uppercase}.traffic-boost-preview-footer .traffic-boost-preview-footer-actions .traffic-boost-preview-footer-navigation select{border:none;font-size:var(--font-size--small);font-weight:500;line-height:var(--font-size--medium);margin-bottom:2px} .traffic-boost-links{display:flex;flex:1;flex-direction:column;height:100%;min-height:0}.traffic-boost-links .traffic-boost-links-list{display:flex;flex:1 1 auto;flex-direction:column;height:0;min-height:0;overflow-y:auto;overscroll-behavior:contain}.traffic-boost-links .traffic-boost-links-list .traffic-boost-single-link{align-items:center;border-bottom:1px solid var(--gray-350);cursor:pointer;display:flex;flex:0 0 auto;gap:var(--grid-unit-15);padding:var(--grid-unit-20) var(--grid-unit-30)}.traffic-boost-links .traffic-boost-links-list .traffic-boost-single-link.active{background:var(--Scales-Theme-theme-alpha-04,rgba(56,88,233,.04));border-bottom:1px solid var(--traffic-boost-header-background)}.traffic-boost-links .traffic-boost-links-list .traffic-boost-single-link .single-link-title{color:var(--sidebar-black);font-size:var(--font-size--medium);font-style:normal;font-weight:400;line-height:var(--grid-unit-30);overflow:hidden;text-overflow:ellipsis}.traffic-boost-links .links-pagination{align-items:center;color:var(--sidebar-black);display:flex;flex:0 0 auto;font-size:var(--font-size--smaller);font-style:normal;font-weight:500;justify-content:space-between;line-height:var(--grid-unit-20);margin-top:auto;padding:var(--grid-unit-15) var(--grid-unit-30);text-transform:uppercase}.traffic-boost-links .links-pagination .links-pagination-children{margin-right:auto}.traffic-boost-links .links-pagination .links-pagination-children .traffic-boost-add-suggestion{box-shadow:none}.traffic-boost-links .links-pagination .page-selector{align-items:center;display:flex;gap:var(--grid-unit-5)}.traffic-boost-links .links-pagination .page-selector select{background-color:transparent;border:none;cursor:pointer;font-size:var(--font-size--smaller);font-weight:500}.traffic-boost-links .links-pagination .page-selector select:focus{outline:none}.traffic-boost-links .links-pagination .page-navigation{display:flex;gap:var(--grid-unit-5);margin-left:var(--grid-unit-30)}.traffic-boost-links .traffic-boost-links-list-loading{align-items:center;display:flex;gap:var(--grid-unit-10);height:100%;justify-content:center;padding:var(--grid-unit-20)} #wp-parsely-dashboard-widget,.components-button[aria-controls="wp-parsely-block-editor-sidebar:wp-parsely-content-helper"],.editor-post-excerpt,.parsely-dashboard-container,.settings_page_parsely,.wp-parsely-block-overlay,.wp-parsely-content-helper,.wp-parsely-excerpt-generator,.wp-parsely-panel,.wp-parsely-popover,.wp-parsely-preview-editor,.wp-parsely-smart-linking-close-dialog,.wp-parsely-smart-linking-review-modal,.wp-parsely-suggested-title-modal,.wp-parsely-traffic-boost-add-new-link-popover,.wp-parsely-traffic-boost-preview-settings-popover{--base-font:"source-sans-pro",arial,sans-serif;--numeric-font:"ff-din-round-web",sans-serif;--parsely-green-components:107,42%,46%;--parsely-green:hsl(var(--parsely-green-components));--parsely-green-10:#c7ecb1;--parsely-green-65:#2a691b;--gray-200:#f7f8f9;--gray-300:#edeeef;--gray-400:#d7dbdf;--gray-500:#959da5;--gray-600:#586069;--gray-700:#444d56;--gray-900:#24292e;--blue-500:#44a8e5;--blue-550:#2596db;--green-500:#7bc01b;--green-900:#3d6307;--ref-direct:205,13%,52%;--ref-internal:161,91%,41%;--ref-social:210,72%,41%;--ref-search:42,100%,50%;--ref-other:3,76%,58%;--base-text:var(--gray-900);--base-text-2:var(--gray-600);--base-3:var(--gray-400);--border:var(--gray-400);--data:var(--green-500);--control:var(--blue-500);--grid-unit-5:0.25rem;--grid-unit-10:0.5rem;--grid-unit-15:0.75rem;--grid-unit-20:1rem;--grid-unit-25:1.25rem;--grid-unit-30:1.5rem;--grid-unit-40:2rem;--grid-unit-50:2.5rem;--grid-unit-60:3rem;--font-size--smaller:0.688rem;--font-size--small:0.75rem;--font-size--medium:0.875rem;--font-size--large:1rem;--font-size--extra-large:1.2rem;--font-size--bigger:2rem;--dashboard-width:64rem;--black:#000;--dashboard-accent:#b9f16b;--gray-350:#e1e3e5;--sidebar-black:#1e1e1e;--sidebar-white:#f0f0f0;--traffic-boost-header-background:rgba(56,88,233,.08);--white:#fff}.traffic-boost-sidebar{align-items:flex-start;background:var(--white);border-bottom:1px solid var(--gray-200);border-radius:var(--grid-unit-10);box-shadow:0 1px 1px 0 rgba(0,0,0,.03),0 1px 2px 0 rgba(0,0,0,.02),0 .1875rem .1875rem 0 rgba(0,0,0,.02),0 .25rem .25rem 0 rgba(0,0,0,.01);display:flex;flex-direction:column;height:calc(100vh - 4.0625rem);max-width:28.125rem;min-width:20rem}.traffic-boost-sidebar .traffic-boost-sidebar-header{align-items:center;align-self:stretch;background:var(--traffic-boost-header-background);display:flex;flex-direction:column;gap:var(--grid-unit-20);min-height:var(--grid-unit-50);padding:var(--grid-unit-20) var(--grid-unit-30)}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-sidebar-header-nav{align-items:center;align-self:stretch;display:flex;justify-content:space-between}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-sidebar-header-nav .components-button{font-size:var(--font-size--medium);font-weight:400;line-height:var(--grid-unit-25);padding-left:0;padding-right:0}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-post-details{align-items:flex-start;align-self:stretch;display:flex;flex-direction:column;gap:var(--grid-unit-10);justify-content:flex-end}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-post-details .traffic-boost-post-details-label{color:var(--gray-900);font-size:var(--font-size--small);font-style:normal;font-weight:500;line-height:var(--grid-unit-20);overflow:hidden;text-transform:uppercase}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-post-details .traffic-boost-post-details-content{align-items:center;align-self:stretch;display:flex;gap:var(--grid-unit-10)}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-post-details .traffic-boost-post-details-content .post-title{color:var(--gray-900);font-size:var(--font-size--medium);font-style:normal;font-weight:500;line-height:var(--grid-unit-25)}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-post-details .traffic-boost-post-details-divider{background:var(--gray-400);height:1px;margin:var(--grid-unit-10) 0;width:100%}.traffic-boost-sidebar .traffic-boost-sidebar-header .traffic-boost-post-details .traffic-boost-post-details-description{font-size:var(--font-size--medium);font-style:normal;font-weight:400;line-height:var(--grid-unit-20)}.traffic-boost-sidebar .traffic-boost-sidebar-content{display:flex;flex:1;flex-direction:column;gap:var(--grid-unit-20);min-height:0;width:100%}.traffic-boost-sidebar .traffic-boost-sidebar-content .traffic-boost-suggestions-settings .components-panel__body{border-bottom:0;border-top:0}.traffic-boost-sidebar .traffic-boost-sidebar-content .traffic-boost-suggestions-empty-state{align-items:center;display:flex;flex-direction:column;gap:var(--grid-unit-20);padding:var(--grid-unit-20)}.traffic-boost-sidebar .traffic-boost-sidebar-content .traffic-boost-suggestions-generating-footer{align-items:center;display:flex;gap:var(--grid-unit-10);justify-content:center;min-height:2.25rem;width:100%}.traffic-boost-sidebar .traffic-boost-sidebar-content .traffic-boost-suggestions-generating-footer span{margin-top:.3125rem}.traffic-boost-sidebar .traffic-boost-sidebar-tabs{display:flex;flex:1;flex-direction:column;width:100%}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tab-content{display:flex;flex:1;flex-direction:column;min-height:0;overflow:hidden}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs{border-bottom:1px solid var(--gray-400);border-top:1px solid var(--gray-400);display:flex;margin:0;padding:0;position:relative;width:100%}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs .components-tab-panel__tabs-item{flex:1;height:var(--grid-unit-60);justify-content:center;margin:0;padding:var(--grid-unit-15) var(--grid-unit-40)}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) transparent,inset 0 -1.5px 0 0 var(--wp-admin-theme-color)}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs .components-tab-panel__tabs-item .tab-count{align-items:center;background:var(--gray-400);border-radius:2px;display:inline-flex;gap:var(--grid-unit-10);justify-content:center;margin-left:var(--grid-unit-20);padding:var(--grid-unit-5) var(--grid-unit-10)}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.icon-only-tab{flex:0 0 var(--grid-unit-50);justify-content:center!important;min-width:var(--grid-unit-60)!important;padding:var(--grid-unit-10)!important;width:var(--grid-unit-60)!important}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.icon-only-tab .icon{color:var(--gray-600);height:var(--grid-unit-30)!important;width:var(--grid-unit-30)!important}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.icon-only-tab .icon svg{height:var(--grid-unit-30)!important;width:var(--grid-unit-30)!important}.traffic-boost-sidebar .traffic-boost-sidebar-tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.icon-only-tab:hover .icon{color:var(--gray-900)}.traffic-boost-sidebar .traffic-boost-suggestions-loading-generating{align-items:center;display:flex;flex-direction:column;gap:var(--grid-unit-15);height:100%;justify-content:center;padding:var(--grid-unit-20)}.wp-parsely-traffic-boost-add-new-link-popover{width:25rem}.wp-parsely-traffic-boost-add-new-link-popover .components-popover__content{display:flex;flex-direction:column;gap:var(--grid-unit-20);padding:var(--grid-unit-20);width:100%}.wp-parsely-traffic-boost-add-new-link-popover .traffic-boost-add-link-table.no-results{text-align:left} -.parsely-tone-selector-dropdown{align-items:center;align-self:stretch;background:var(--Gutenberg-White,#fff);border:1px solid var(--Gutenberg-Gray-600,#949494);border-radius:2px;height:2.25rem;overflow-wrap:break-word;width:100%;word-break:break-word}.parsely-tone-selector-dropdown button{height:2.0625rem}.parsely-tone-selector-dropdown .components-dropdown-menu__toggle.has-icon svg:first-child{display:none}.parsely-tone-selector-dropdown.is-disabled{opacity:.5;pointer-events:none}.parsely-tone-selector-dropdown .components-dropdown-menu__toggle{display:flex;gap:.625rem;width:100%}.parsely-tone-selector-dropdown .components-dropdown-menu__toggle svg:first-of-type path{transform:scale(1.4);transform-origin:center}.parsely-tone-selector-dropdown .parsely-tone-selector-label{flex-grow:2;padding:0 var(--grid-unit-10);text-align:left}.parsely-tone-selector-dropdown .parsely-tone-selector-label:first-letter{text-transform:uppercase}.parsely-persona-selector-custom{width:100%}.parsely-persona-selector-custom .components-base-control__field input{display:flex;height:2.5rem;padding:var(--grid-unit-15) var(--grid-unit-20)}.parsely-persona-selector-custom .components-base-control__field input,.parsely-persona-selector-dropdown{align-items:center;align-self:stretch;border:1px solid var(--Gutenberg-Gray-600,#949494);border-radius:2px}.parsely-persona-selector-dropdown{background:var(--Gutenberg-White,#fff);height:2.25rem;overflow-wrap:break-word;width:100%;word-break:break-word}.parsely-persona-selector-dropdown .components-dropdown-menu__toggle.has-icon svg:first-child{display:none}.parsely-persona-selector-dropdown button{height:2.0625rem}.parsely-persona-selector-dropdown.is-disabled{opacity:.5;pointer-events:none}.parsely-persona-selector-dropdown .components-dropdown-menu__toggle{display:flex;gap:.625rem;width:100%}.parsely-persona-selector-dropdown .parsely-persona-selector-label{flex-grow:2;padding:0 var(--grid-unit-10);text-align:left}.parsely-persona-selector-dropdown .parsely-persona-selector-label:first-letter{text-transform:uppercase}.parsely-tone-selector-custom{width:100%}.parsely-tone-selector-custom .components-base-control__field input{align-items:center;align-self:stretch;border:1px solid var(--Gutenberg-Gray-600,#949494);border-radius:2px;display:flex;height:2.5rem;padding:var(--grid-unit-15) var(--grid-unit-20)}.parsely-inputrange-control{align-items:flex-start;align-self:stretch;display:flex;flex-direction:column;gap:var(--grid-unit-10)}.parsely-inputrange-control .parsely-inputrange-control__label{margin:0}.parsely-inputrange-control .parsely-inputrange-control__controls{align-items:center;align-self:stretch;display:flex;gap:var(--grid-unit-20);height:2.5rem}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control{display:flex;flex:1 0 0}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control input[type=number]::-webkit-inner-spin-button,.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control input[type=number]{-moz-appearance:textfield}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control .components-base-control__field{flex-grow:1}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control .components-input-control__suffix{color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.parsely-inputrange-control .parsely-inputrange-control__controls .components-range-control{flex:1 0 0;height:36px}.parsely-inputrange-control .parsely-inputrange-control__controls .components-range-control .components-range-control__root{height:2.5rem}#wp-parsely-dashboard-widget,.components-button[aria-controls="wp-parsely-block-editor-sidebar:wp-parsely-content-helper"],.editor-post-excerpt,.parsely-dashboard-container,.settings_page_parsely,.wp-parsely-block-overlay,.wp-parsely-content-helper,.wp-parsely-excerpt-generator,.wp-parsely-panel,.wp-parsely-popover,.wp-parsely-preview-editor,.wp-parsely-smart-linking-close-dialog,.wp-parsely-smart-linking-review-modal,.wp-parsely-suggested-title-modal,.wp-parsely-traffic-boost-add-new-link-popover,.wp-parsely-traffic-boost-preview-settings-popover{--base-font:"source-sans-pro",arial,sans-serif;--numeric-font:"ff-din-round-web",sans-serif;--parsely-green-components:107,42%,46%;--parsely-green:hsl(var(--parsely-green-components));--parsely-green-10:#c7ecb1;--parsely-green-65:#2a691b;--gray-200:#f7f8f9;--gray-300:#edeeef;--gray-400:#d7dbdf;--gray-500:#959da5;--gray-600:#586069;--gray-700:#444d56;--gray-900:#24292e;--blue-500:#44a8e5;--blue-550:#2596db;--green-500:#7bc01b;--green-900:#3d6307;--ref-direct:205,13%,52%;--ref-internal:161,91%,41%;--ref-social:210,72%,41%;--ref-search:42,100%,50%;--ref-other:3,76%,58%;--base-text:var(--gray-900);--base-text-2:var(--gray-600);--base-3:var(--gray-400);--border:var(--gray-400);--data:var(--green-500);--control:var(--blue-500);--grid-unit-5:0.25rem;--grid-unit-10:0.5rem;--grid-unit-15:0.75rem;--grid-unit-20:1rem;--grid-unit-25:1.25rem;--grid-unit-30:1.5rem;--grid-unit-40:2rem;--grid-unit-50:2.5rem;--grid-unit-60:3rem;--font-size--smaller:0.688rem;--font-size--small:0.75rem;--font-size--medium:0.875rem;--font-size--large:1rem;--font-size--extra-large:1.2rem;--font-size--bigger:2rem;--dashboard-width:64rem;--black:#000;--dashboard-accent:#b9f16b;--gray-350:#e1e3e5;--sidebar-black:#1e1e1e;--sidebar-white:#f0f0f0;--traffic-boost-header-background:rgba(56,88,233,.08);--white:#fff}.parsely-thumbnail{border-radius:3px;flex-shrink:0;overflow:hidden}.parsely-thumbnail img{border-radius:3px;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.parsely-thumbnail .parsely-thumbnail-icon-container{align-items:center;background:var(--gray-500);border-radius:3px;display:flex;height:100%;justify-content:center;width:100%}.parsely-thumbnail .parsely-thumbnail-icon-container svg{fill:var(--sidebar-white);height:60%;width:60%}.wp-parsely-snackbar-notices{bottom:4rem;display:flex;flex-direction:column-reverse;gap:.375rem;padding:1rem;position:fixed;width:100%;z-index:999999}.wp-parsely-snackbar-notices svg{fill:currentcolor}.wp-parsely-loading{align-items:center;border-radius:.25rem;color:var(--sidebar-black);display:flex;gap:var(--grid-unit-20);justify-content:center;min-height:1.5rem;min-width:25rem;padding:var(--grid-unit-10) var(--grid-unit-15)}.wp-parsely-loading .components-spinner{flex-shrink:0;margin:0}.wp-parsely-loading .wp-parsely-loading-message{flex-grow:1;font-size:var(--font-size--medium);line-height:1.4;margin:0;max-width:25rem}.wp-parsely-loading .wp-parsely-typewriter-text{display:inline-block;min-height:1.4em;min-width:1ch}.wp-parsely-loading .wp-parsely-typewriter-cursor{animation:blink 1s step-end infinite;display:inline-block;font-weight:400;margin-left:2px;opacity:.7}@keyframes blink{0%,to{opacity:0}50%{opacity:1}}.parsely-panel-settings{width:100%}.parsely-panel-settings .parsely-panel-settings-header{display:flex;margin:.625rem 0;width:100%}.parsely-panel-settings .parsely-panel-settings-header .parsely-panel-settings-header-label{flex-grow:2;margin:0 0 0 .3125rem;text-align:left}.parsely-panel-settings .parsely-panel-settings-header .parsely-panel-settings-header-label .components-base-control__field{align-items:center;display:flex;justify-content:space-between}.parsely-panel-settings .parsely-panel-settings-header .parsely-panel-settings-header-label .components-base-control__field .components-base-control__label{margin-bottom:0}.parsely-panel-settings .parsely-panel-settings-body{align-self:stretch;display:flex;flex-direction:column;gap:.625rem;padding:.375rem 0 var(--grid-unit-20) 0}.wp-parsely-dropdown-label{align-self:stretch;color:var(--sidebar-black);font-size:var(--font-size--smaller);font-style:normal;font-weight:600;line-height:var(--grid-unit-20);text-transform:uppercase}.wp-parsely-content-helper-error{align-self:flex-start;margin:0}.wp-parsely-content-helper-error p{margin:0}.wp-parsely-content-helper-error .content-helper-error-message{margin:0!important}.wp-parsely-collapsible-panel{align-items:flex-start;align-self:stretch;border-bottom:none;border-radius:2px;border-top:none;display:flex;flex-direction:column;gap:var(--grid-unit-20);margin:0 0 .5rem;padding:0}.wp-parsely-collapsible-panel .components-panel__body-title{align-items:center;align-self:stretch;display:flex;margin:0 -1rem .375rem;padding:0}.wp-parsely-collapsible-panel .components-panel__body-title .components-panel__icon,.wp-parsely-collapsible-panel .components-panel__body-title svg{margin-left:0;margin-right:var(--grid-unit-10);order:-1}.wp-parsely-collapsible-panel .components-panel__body-title:hover{background-color:transparent}.wp-parsely-collapsible-panel.is-opened{padding:0}.wp-parsely-collapsible-panel.is-opened>div:first-of-type{margin-top:calc(var(--grid-unit-20)*-1)}.wp-parsely-collapsible-panel.is-opened .components-panel__body-title{margin:0 calc(var(--grid-unit-20)*-1) .375rem;padding-bottom:0}.wp-parsely-collapsible-panel .components-panel__body-toggle.components-button{color:var(--Gutenberg-Gray-900,#1e1e1e);font-size:.6875rem;font-style:normal;font-weight:600;line-height:1rem;padding:var(--grid-unit-20) var(--grid-unit-20);text-transform:uppercase}.wp-parsely-collapsible-panel .components-panel__body-toggle.components-button .components-panel__arrow{margin-right:0}.wp-parsely-collapsible-panel .components-panel__body.is-opened{padding:0}.parsely-table-container.is-loading{align-items:center;display:flex;justify-content:center;padding:var(--grid-unit-20)}.parsely-table-container table{border-collapse:collapse;border-spacing:0;width:100%}.parsely-table-container table tr{display:flex;gap:var(--grid-unit-20);padding:var(--grid-unit-15) 0;position:relative}.parsely-table-container table tr:after{background-color:var(--border);bottom:0;content:"";height:1px;left:50%;position:absolute;transform:translateX(-50%);width:100vw}.parsely-table-container table tr td,.parsely-table-container table tr th{align-self:center;text-align:left}.parsely-table-container table tr td.post-info,.parsely-table-container table tr th.post-info-header{width:70%}.parsely-table-container table tr th.boost-perf-header{overflow:visible;position:relative;white-space:nowrap;z-index:1}.parsely-table-container table tr td.actions{align-items:center;display:flex;flex:1;gap:var(--grid-unit-10);justify-content:flex-end;min-height:2.5rem;padding-right:var(--grid-unit-20);width:11.25rem}.parsely-table-container table tr td.actions a{text-decoration:none}.parsely-table-container table tr th{color:var(--sidebar-black);font-size:var(--font-size--small);font-style:normal;font-weight:600;line-height:var(--font-size--large);text-transform:uppercase}.parsely-table-container.no-results{color:#757575;font-style:italic;padding:var(--grid-unit-15);text-align:center}.parsely-table-container.hide-pagination table tr:last-child:after{display:none}.parsely-table-container.compact table tr td.post-info{width:100%}.parsely-table-container.compact .post-title{display:-webkit-box!important;overflow:hidden;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.posts-table-post-info{align-items:flex-start;display:flex;flex:1 0 0;gap:var(--grid-unit-20);min-height:2.5rem}.posts-table-post-info .posts-table-thumbnail{align-self:center}.posts-table-post-info .post-details{align-items:flex-start;display:flex;flex:1 0 0;flex-direction:column;gap:var(--grid-unit-05,4px);justify-content:center;min-height:var(--grid-unit-40)}.posts-table-post-info .post-details .post-title{align-items:center;align-self:stretch;display:flex;font-size:var(--font-size--medium);font-style:normal;font-weight:600;gap:var(--grid-unit-5);line-height:1.25rem;overflow:hidden;text-overflow:ellipsis}.posts-table-post-info .post-details .post-meta{align-content:center;align-items:center;align-self:stretch;color:var(--gray-500);display:flex;flex-wrap:wrap;gap:var(--grid-unit-5) var(--grid-unit-10)}.posts-table-post-info .post-details .post-categories{display:flex;gap:var(--grid-unit-5)}.posts-table-post-info .post-details .post-categories span{background:var(--gray-400);border-radius:.375rem;color:var(--sidebar-black);font-size:var(--font-size--smaller);font-weight:500;line-height:var(--font-size--large);padding:2px var(--grid-unit-10)}.posts-table-pagination-controls{align-items:center;align-self:stretch;display:flex;font-size:var(--font-size--smaller);font-style:normal;font-weight:600;gap:var(--grid-unit-30);justify-content:flex-end;line-height:var(--font-size--large);padding:var(--grid-unit-15);text-transform:uppercase}.posts-table-pagination-controls .page-selector{align-items:center;display:flex;gap:var(--grid-unit-10)}.posts-table-pagination-controls .page-navigation{align-items:center;display:flex;gap:var(--grid-unit-5);justify-content:flex-end}body{background:#fff}.parsely-dashboard-container{margin-left:-1.25rem;overflow:hidden}.parsely-dashboard-page-body,.parsely-dashboard-page-header{margin:0 auto;max-width:var(--dashboard-width);padding:var(--grid-unit-30)} +.parsely-tone-selector-dropdown{align-items:center;align-self:stretch;background:var(--Gutenberg-White,#fff);border:1px solid var(--Gutenberg-Gray-600,#949494);border-radius:2px;height:2.25rem;overflow-wrap:break-word;width:100%;word-break:break-word}.parsely-tone-selector-dropdown button{height:2.0625rem}.parsely-tone-selector-dropdown .components-dropdown-menu__toggle.has-icon svg:first-child{display:none}.parsely-tone-selector-dropdown.is-disabled{opacity:.5;pointer-events:none}.parsely-tone-selector-dropdown .components-dropdown-menu__toggle{display:flex;gap:.625rem;width:100%}.parsely-tone-selector-dropdown .components-dropdown-menu__toggle svg:first-of-type path{transform:scale(1.4);transform-origin:center}.parsely-tone-selector-dropdown .parsely-tone-selector-label{flex-grow:2;padding:0 var(--grid-unit-10);text-align:left}.parsely-tone-selector-dropdown .parsely-tone-selector-label:first-letter{text-transform:uppercase}.parsely-persona-selector-custom{width:100%}.parsely-persona-selector-custom .components-base-control__field input{display:flex;height:2.5rem;padding:var(--grid-unit-15) var(--grid-unit-20)}.parsely-persona-selector-custom .components-base-control__field input,.parsely-persona-selector-dropdown{align-items:center;align-self:stretch;border:1px solid var(--Gutenberg-Gray-600,#949494);border-radius:2px}.parsely-persona-selector-dropdown{background:var(--Gutenberg-White,#fff);height:2.25rem;overflow-wrap:break-word;width:100%;word-break:break-word}.parsely-persona-selector-dropdown .components-dropdown-menu__toggle.has-icon svg:first-child{display:none}.parsely-persona-selector-dropdown button{height:2.0625rem}.parsely-persona-selector-dropdown.is-disabled{opacity:.5;pointer-events:none}.parsely-persona-selector-dropdown .components-dropdown-menu__toggle{display:flex;gap:.625rem;width:100%}.parsely-persona-selector-dropdown .parsely-persona-selector-label{flex-grow:2;padding:0 var(--grid-unit-10);text-align:left}.parsely-persona-selector-dropdown .parsely-persona-selector-label:first-letter{text-transform:uppercase}.parsely-tone-selector-custom{width:100%}.parsely-tone-selector-custom .components-base-control__field input{align-items:center;align-self:stretch;border:1px solid var(--Gutenberg-Gray-600,#949494);border-radius:2px;display:flex;height:2.5rem;padding:var(--grid-unit-15) var(--grid-unit-20)}.parsely-inputrange-control{align-items:flex-start;align-self:stretch;display:flex;flex-direction:column;gap:var(--grid-unit-10)}.parsely-inputrange-control .parsely-inputrange-control__label{margin:0}.parsely-inputrange-control .parsely-inputrange-control__controls{align-items:center;align-self:stretch;display:flex;gap:var(--grid-unit-20);height:2.5rem}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control{display:flex;flex:1 0 0}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control input[type=number]::-webkit-inner-spin-button,.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control input[type=number]{-moz-appearance:textfield}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control .components-base-control__field{flex-grow:1}.parsely-inputrange-control .parsely-inputrange-control__controls .components-input-control .components-input-control__suffix{color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#3858e9))}.parsely-inputrange-control .parsely-inputrange-control__controls .components-range-control{flex:1 0 0;height:36px}.parsely-inputrange-control .parsely-inputrange-control__controls .components-range-control .components-range-control__root{height:2.5rem}#wp-parsely-dashboard-widget,.components-button[aria-controls="wp-parsely-block-editor-sidebar:wp-parsely-content-helper"],.editor-post-excerpt,.parsely-dashboard-container,.settings_page_parsely,.wp-parsely-block-overlay,.wp-parsely-content-helper,.wp-parsely-excerpt-generator,.wp-parsely-panel,.wp-parsely-popover,.wp-parsely-preview-editor,.wp-parsely-smart-linking-close-dialog,.wp-parsely-smart-linking-review-modal,.wp-parsely-suggested-title-modal,.wp-parsely-traffic-boost-add-new-link-popover,.wp-parsely-traffic-boost-preview-settings-popover{--base-font:"source-sans-pro",arial,sans-serif;--numeric-font:"ff-din-round-web",sans-serif;--parsely-green-components:107,42%,46%;--parsely-green:hsl(var(--parsely-green-components));--parsely-green-10:#c7ecb1;--parsely-green-65:#2a691b;--gray-200:#f7f8f9;--gray-300:#edeeef;--gray-400:#d7dbdf;--gray-500:#959da5;--gray-600:#586069;--gray-700:#444d56;--gray-900:#24292e;--blue-500:#44a8e5;--blue-550:#2596db;--green-500:#7bc01b;--green-900:#3d6307;--ref-direct:205,13%,52%;--ref-internal:161,91%,41%;--ref-social:210,72%,41%;--ref-search:42,100%,50%;--ref-other:3,76%,58%;--base-text:var(--gray-900);--base-text-2:var(--gray-600);--base-3:var(--gray-400);--border:var(--gray-400);--data:var(--green-500);--control:var(--blue-500);--grid-unit-5:0.25rem;--grid-unit-10:0.5rem;--grid-unit-15:0.75rem;--grid-unit-20:1rem;--grid-unit-25:1.25rem;--grid-unit-30:1.5rem;--grid-unit-40:2rem;--grid-unit-50:2.5rem;--grid-unit-60:3rem;--font-size--smaller:0.688rem;--font-size--small:0.75rem;--font-size--medium:0.875rem;--font-size--large:1rem;--font-size--extra-large:1.2rem;--font-size--bigger:2rem;--dashboard-width:64rem;--black:#000;--dashboard-accent:#b9f16b;--gray-350:#e1e3e5;--sidebar-black:#1e1e1e;--sidebar-white:#f0f0f0;--traffic-boost-header-background:rgba(56,88,233,.08);--white:#fff}.parsely-thumbnail{border-radius:3px;flex-shrink:0;overflow:hidden}.parsely-thumbnail img{border-radius:3px;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.parsely-thumbnail .parsely-thumbnail-icon-container{align-items:center;background:var(--gray-500);border-radius:3px;display:flex;height:100%;justify-content:center;width:100%}.parsely-thumbnail .parsely-thumbnail-icon-container svg{fill:var(--sidebar-white);height:60%;width:60%}.wp-parsely-snackbar-notices{bottom:4rem;display:flex;flex-direction:column-reverse;gap:.375rem;padding:1rem;position:fixed;width:100%;z-index:999999}.wp-parsely-snackbar-notices svg{fill:currentcolor}.wp-parsely-loading{align-items:center;border-radius:.25rem;color:var(--sidebar-black);display:flex;gap:var(--grid-unit-20);justify-content:center;min-height:1.5rem;min-width:25rem;padding:var(--grid-unit-10) var(--grid-unit-15)}.wp-parsely-loading .components-spinner{flex-shrink:0;margin:0}.wp-parsely-loading .wp-parsely-loading-message{flex-grow:1;font-size:var(--font-size--medium);line-height:1.4;margin:0;max-width:25rem}.wp-parsely-loading .wp-parsely-typewriter-text{display:inline-block;min-height:1.4em;min-width:1ch}.wp-parsely-loading .wp-parsely-typewriter-cursor{animation:blink 1s step-end infinite;display:inline-block;font-weight:400;margin-left:2px;opacity:.7}@keyframes blink{0%,to{opacity:0}50%{opacity:1}}.parsely-panel-settings{width:100%}.parsely-panel-settings .parsely-panel-settings-header{display:flex;margin:.625rem 0;width:100%}.parsely-panel-settings .parsely-panel-settings-header .parsely-panel-settings-header-label{flex-grow:2;margin:0 0 0 .3125rem;text-align:left}.parsely-panel-settings .parsely-panel-settings-header .parsely-panel-settings-header-label .components-base-control__field{align-items:center;display:flex;justify-content:space-between}.parsely-panel-settings .parsely-panel-settings-header .parsely-panel-settings-header-label .components-base-control__field .components-base-control__label{margin-bottom:0}.parsely-panel-settings .parsely-panel-settings-body{align-self:stretch;display:flex;flex-direction:column;gap:.625rem;padding:.375rem 0 var(--grid-unit-20) 0}.wp-parsely-dropdown-label{align-self:stretch;color:var(--sidebar-black);font-size:var(--font-size--smaller);font-style:normal;font-weight:600;line-height:var(--grid-unit-20);text-transform:uppercase}.wp-parsely-content-helper-error{align-self:flex-start;margin:0}.wp-parsely-content-helper-error p{margin:0}.wp-parsely-content-helper-error .content-helper-error-message{margin:0!important}.wp-parsely-collapsible-panel{align-items:flex-start;align-self:stretch;border-bottom:none;border-radius:2px;border-top:none;display:flex;flex-direction:column;gap:var(--grid-unit-20);margin:0 0 .5rem;padding:0}.wp-parsely-collapsible-panel .components-panel__body-title{align-items:center;align-self:stretch;display:flex;margin:0 -1rem .375rem;padding:0}.wp-parsely-collapsible-panel .components-panel__body-title .components-panel__icon,.wp-parsely-collapsible-panel .components-panel__body-title svg{margin-left:0;margin-right:var(--grid-unit-10);order:-1}.wp-parsely-collapsible-panel .components-panel__body-title:hover{background-color:transparent}.wp-parsely-collapsible-panel.is-opened{padding:0}.wp-parsely-collapsible-panel.is-opened>div:first-of-type{margin-top:calc(var(--grid-unit-20)*-1)}.wp-parsely-collapsible-panel.is-opened .components-panel__body-title{margin:0 calc(var(--grid-unit-20)*-1) .375rem;padding-bottom:0}.wp-parsely-collapsible-panel .components-panel__body-toggle.components-button{color:var(--Gutenberg-Gray-900,#1e1e1e);font-size:.6875rem;font-style:normal;font-weight:600;line-height:1rem;padding:var(--grid-unit-20) var(--grid-unit-20);text-transform:uppercase}.wp-parsely-collapsible-panel .components-panel__body-toggle.components-button .components-panel__arrow{margin-right:0}.wp-parsely-collapsible-panel .components-panel__body.is-opened{padding:0}.parsely-table-container.is-loading{align-items:center;display:flex;justify-content:center;padding:var(--grid-unit-20)}.parsely-table-container table{border-collapse:collapse;border-spacing:0;width:100%}.parsely-table-container table tr{position:relative}.parsely-table-container table tr:after{background-color:var(--border);bottom:0;content:"";height:1px;left:50%;position:absolute;transform:translateX(-50%);width:100vw}.parsely-table-container table tr td,.parsely-table-container table tr th{padding:var(--grid-unit-15) 0}.parsely-table-container table tr td.post-info,.parsely-table-container table tr th.post-info-header{text-align:left}.parsely-table-container table tr th{color:var(--sidebar-black);font-size:var(--font-size--small);font-style:normal;font-weight:600;line-height:var(--font-size--large);text-transform:uppercase}.parsely-table-container table tr th.views-header{min-width:3.75rem;text-align:center}.parsely-table-container table tr th.views-header .views-header-period{color:var(--gray-500);font-size:var(--font-size--smaller);font-weight:400;margin-left:var(--grid-unit-5)}.parsely-table-container table tr td.metrics{min-width:100px}.parsely-table-container table tr td.metrics .metrics-container{align-items:center;display:flex;flex-direction:column;gap:var(--grid-unit-5)}.parsely-table-container table tr td.metrics .metrics-container .metric-change{font-size:var(--font-size--small);font-weight:600;line-height:var(--font-size--large);margin-left:var(--grid-unit-5)}.parsely-table-container table tr td.metrics .metrics-container .metric-change-positive{color:var(--parsely-green)}.parsely-table-container table tr td.metrics .metrics-container .metric-change-negative{color:#900000}.parsely-table-container table tr td.metrics .metrics-container .metric-change-neutral{color:var(--gray-500)}.parsely-table-container table tr td.metrics .metrics-container .metric-boost-percentage{color:var(--parsely-green);font-size:var(--font-size--small);font-weight:600}.parsely-table-container table tr td.actions{align-items:center;display:flex;gap:var(--grid-unit-10);justify-content:flex-end;margin-left:var(--grid-unit-10);max-width:8.4375rem;min-height:2.5rem}.parsely-table-container table tr td.actions a{text-decoration:none}.parsely-table-container table tr td.actions .boost-link-container{display:flex;flex-direction:column;gap:.25rem;height:100%;text-align:center;width:100%}.parsely-table-container table tr td.actions .boost-link-container .boost-link-status{display:flex;gap:.25rem;justify-content:center}.parsely-table-container table tr td.actions .boost-link-container .boost-link-status .hidden{opacity:0}.parsely-table-container table tr td.actions .boost-link-container .boost-link-status .boost-inbound,.parsely-table-container table tr td.actions .boost-link-container .boost-link-status .boost-outbound{align-items:center;background-color:var(--gray-300);border-radius:.375rem;color:var(--sidebar-black);display:flex;flex-grow:1;font-size:var(--font-size--small);justify-content:center;line-height:var(--font-size--medium);padding:.25rem .5625rem}.parsely-table-container table tr td.actions .boost-link-container .boost-link-status .boost-link-status-icon-inbound{transform:rotate(180deg)}.parsely-table-container.no-results{color:#757575;font-style:italic;padding:var(--grid-unit-15);text-align:center}.parsely-table-container .suggestion-bubble{background:var(--parsely-green);border:none;border-radius:1.25rem;box-shadow:none;color:var(--sidebar-white);cursor:pointer;display:inline-block;font-size:.8125rem;line-height:.875rem;margin-left:.375rem;min-width:1.75rem;padding:3px .375rem;text-align:center}.parsely-table-container.compact table tr td.post-info{max-width:100px}.parsely-table-container.compact tr:after{width:100%}.parsely-table-container.compact .post-title{display:-webkit-box!important;overflow:hidden;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.parsely-table-container.compact .post-title>span{white-space:normal!important}.parsely-table-container.hide-pagination table tr:last-child:after{display:none}.posts-table-post-info{align-items:flex-start;display:flex;flex:1 0 0;gap:var(--grid-unit-20);min-height:2.5rem}.posts-table-post-info .posts-table-thumbnail{align-self:center}.posts-table-post-info .post-details{align-items:flex-start;display:flex;flex:1 0 0;flex-direction:column;gap:var(--grid-unit-05,4px);justify-content:center;min-height:var(--grid-unit-40);min-width:0}.posts-table-post-info .post-details .post-title{align-items:center;align-self:stretch;display:flex;font-size:var(--font-size--medium);font-style:normal;font-weight:600;gap:var(--grid-unit-5);line-height:1.25rem;overflow:hidden;text-overflow:ellipsis}.posts-table-post-info .post-details .post-title>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.posts-table-post-info .post-details .post-meta{align-content:center;align-items:center;align-self:stretch;color:var(--gray-500);display:flex;flex-wrap:wrap;gap:var(--grid-unit-5) var(--grid-unit-10)}.posts-table-post-info .post-details .post-categories{display:flex;gap:var(--grid-unit-5)}.posts-table-post-info .post-details .post-categories span{background:var(--gray-400);border-radius:.375rem;color:var(--sidebar-black);font-size:var(--font-size--smaller);font-weight:500;line-height:var(--font-size--large);padding:2px var(--grid-unit-10)}.posts-table-pagination-controls{align-items:center;align-self:stretch;display:flex;font-size:var(--font-size--smaller);font-style:normal;font-weight:600;gap:var(--grid-unit-30);justify-content:flex-end;line-height:var(--font-size--large);padding:var(--grid-unit-15);text-transform:uppercase}.posts-table-pagination-controls .page-selector{align-items:center;display:flex;gap:var(--grid-unit-10)}.posts-table-pagination-controls .page-navigation{align-items:center;display:flex;gap:var(--grid-unit-5);justify-content:flex-end}body{background:#fff}.parsely-dashboard-container{margin-left:-1.25rem;overflow:hidden}.parsely-dashboard-page-body,.parsely-dashboard-page-header{margin:0 auto;max-width:var(--dashboard-width);padding:var(--grid-unit-30)} diff --git a/build/content-helper/dashboard-page.js b/build/content-helper/dashboard-page.js index a450487ade..66d081c2d0 100644 --- a/build/content-helper/dashboard-page.js +++ b/build/content-helper/dashboard-page.js @@ -1,7 +1,8 @@ -!function(){"use strict";var e={69:function(e,t){Object.prototype.toString},20:function(e,t,n){var r=n(609),o=Symbol.for("react.element"),i=Symbol.for("react.fragment"),a=Object.prototype.hasOwnProperty,s=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,i={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)a.call(t,r)&&!l.hasOwnProperty(r)&&(i[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===i[r]&&(i[r]=t[r]);return{$$typeof:o,type:e,key:c,ref:u,props:i,_owner:s.current}}t.Fragment=i,t.jsx=c,t.jsxs=c},848:function(e,t,n){e.exports=n(20)},609:function(e){e.exports=window.React}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r](i,i.exports,n),i.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},function(){var e=n(848),t=n(609),r=(n(69),"popstate");function o(e={}){return function(e,t,n,o={}){let{window:a=document.defaultView,v5Compat:u=!1}=o,d=a.history,p="POP",f=null,h=g();function g(){return(d.state||{idx:null}).idx}function v(){p="POP";let e=g(),t=null==e?null:e-h;h=e,f&&f({action:p,location:y.location,delta:t})}function m(e){let t="null"!==a.location.origin?a.location.origin:a.location.href,n="string"==typeof e?e:c(e);return n=n.replace(/ $/,"%20"),i(t,`No window.location.(origin|href) available to create URL for href: ${n}`),new URL(n,t)}null==h&&(h=0,d.replaceState({...d.state,idx:h},""));let y={get action(){return p},get location(){return e(a,d)},listen(e){if(f)throw new Error("A history only accepts one active listener");return a.addEventListener(r,v),f=e,()=>{a.removeEventListener(r,v),f=null}},createHref(e){return t(a,e)},createURL:m,encodeLocation(e){let t=m(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:function(e,t){p="PUSH";let r=l(y.location,e,t);n&&n(r,e),h=g()+1;let o=s(r,h),i=y.createHref(r);try{d.pushState(o,"",i)}catch(e){if(e instanceof DOMException&&"DataCloneError"===e.name)throw e;a.location.assign(i)}u&&f&&f({action:p,location:y.location,delta:1})},replace:function(e,t){p="REPLACE";let r=l(y.location,e,t);n&&n(r,e),h=g();let o=s(r,h),i=y.createHref(r);d.replaceState(o,"",i),u&&f&&f({action:p,location:y.location,delta:0})},go(e){return d.go(e)}};return y}((function(e,t){let{pathname:n="/",search:r="",hash:o=""}=u(e.location.hash.substring(1));return n.startsWith("/")||n.startsWith(".")||(n="/"+n),l("",{pathname:n,search:r,hash:o},t.state&&t.state.usr||null,t.state&&t.state.key||"default")}),(function(e,t){let n=e.document.querySelector("base"),r="";if(n&&n.getAttribute("href")){let t=e.location.href,n=t.indexOf("#");r=-1===n?t:t.slice(0,n)}return r+"#"+("string"==typeof t?t:c(t))}),(function(e,t){a("/"===e.pathname.charAt(0),`relative pathnames are not supported in hash history.push(${JSON.stringify(t)})`)}),e)}function i(e,t){if(!1===e||null==e)throw new Error(t)}function a(e,t){if(!e){"undefined"!=typeof console&&console.warn(t);try{throw new Error(t)}catch(e){}}}function s(e,t){return{usr:e.state,key:e.key,idx:t}}function l(e,t,n=null,r){return{pathname:"string"==typeof e?e:e.pathname,search:"",hash:"",..."string"==typeof t?u(t):t,state:n,key:t&&t.key||r||Math.random().toString(36).substring(2,10)}}function c({pathname:e="/",search:t="",hash:n=""}){return t&&"?"!==t&&(e+="?"===t.charAt(0)?t:"?"+t),n&&"#"!==n&&(e+="#"===n.charAt(0)?n:"#"+n),e}function u(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function d(e,t,n="/"){return function(e,t,n,r){let o=E(("string"==typeof t?u(t):t).pathname||"/",n);if(null==o)return null;let i=p(e);!function(e){e.sort(((e,t)=>e.score!==t.score?t.score-e.score:function(e,t){return e.length===t.length&&e.slice(0,-1).every(((e,n)=>e===t[n]))?e[e.length-1]-t[t.length-1]:0}(e.routesMeta.map((e=>e.childrenIndex)),t.routesMeta.map((e=>e.childrenIndex)))))}(i);let a=null;for(let e=0;null==a&&e{let s={relativePath:void 0===a?e.path||"":a,caseSensitive:!0===e.caseSensitive,childrenIndex:o,route:e};s.relativePath.startsWith("/")&&(i(s.relativePath.startsWith(r),`Absolute route path "${s.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),s.relativePath=s.relativePath.slice(r.length));let l=N([r,s.relativePath]),c=n.concat(s);e.children&&e.children.length>0&&(i(!0!==e.index,`Index routes must not have child routes. Please remove all child routes from route path "${l}".`),p(e.children,t,c,l)),(null!=e.path||e.index)&&t.push({path:l,score:x(l,e.index),routesMeta:c})};return e.forEach(((e,t)=>{if(""!==e.path&&e.path?.includes("?"))for(let n of f(e.path))o(e,t,n);else o(e,t)})),t}function f(e){let t=e.split("/");if(0===t.length)return[];let[n,...r]=t,o=n.endsWith("?"),i=n.replace(/\?$/,"");if(0===r.length)return o?[i,""]:[i];let a=f(r.join("/")),s=[];return s.push(...a.map((e=>""===e?i:[i,e].join("/")))),o&&s.push(...a),s.map((t=>e.startsWith("/")&&""===t?"/":t))}new WeakMap;var h=/^:[\w-]+$/,g=3,v=2,m=1,y=10,b=-2,w=e=>"*"===e;function x(e,t){let n=e.split("/"),r=n.length;return n.some(w)&&(r+=b),t&&(r+=v),n.filter((e=>!w(e))).reduce(((e,t)=>e+(h.test(t)?g:""===t?m:y)),r)}function k(e,t,n=!1){let{routesMeta:r}=e,o={},i="/",a=[];for(let e=0;e(r.push({paramName:t,isOptional:null!=n}),n?"/?([^\\/]+)?":"/([^\\/]+)")));return e.endsWith("*")?(r.push({paramName:"*"}),o+="*"===e||"/*"===e?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?o+="\\/*$":""!==e&&"/"!==e&&(o+="(?:(?=\\/|$))"),[new RegExp(o,t?void 0:"i"),r]}(e.path,e.caseSensitive,e.end),o=t.match(n);if(!o)return null;let i=o[0],s=i.replace(/(.)\/+$/,"$1"),l=o.slice(1);return{params:r.reduce(((e,{paramName:t,isOptional:n},r)=>{if("*"===t){let e=l[r]||"";s=i.slice(0,i.length-e.length).replace(/(.)\/+$/,"$1")}const o=l[r];return e[t]=n&&!o?void 0:(o||"").replace(/%2F/g,"/"),e}),{}),pathname:i,pathnameBase:s,pattern:e}}function _(e){try{return e.split("/").map((e=>decodeURIComponent(e).replace(/\//g,"%2F"))).join("/")}catch(t){return a(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function E(e,t){if("/"===t)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&"/"!==r?null:e.slice(n)||"/"}function P(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function L(e){let t=function(e){return e.filter(((e,t)=>0===t||e.route.path&&e.route.path.length>0))}(e);return t.map(((e,n)=>n===t.length-1?e.pathname:e.pathnameBase))}function j(e,t,n,r=!1){let o;"string"==typeof e?o=u(e):(o={...e},i(!o.pathname||!o.pathname.includes("?"),P("?","pathname","search",o)),i(!o.pathname||!o.pathname.includes("#"),P("#","pathname","hash",o)),i(!o.search||!o.search.includes("#"),P("#","search","hash",o)));let a,s=""===e||""===o.pathname,l=s?"/":o.pathname;if(null==l)a=n;else{let e=t.length-1;if(!r&&l.startsWith("..")){let t=l.split("/");for(;".."===t[0];)t.shift(),e-=1;o.pathname=t.join("/")}a=e>=0?t[e]:"/"}let c=function(e,t="/"){let{pathname:n,search:r="",hash:o=""}="string"==typeof e?u(e):e,i=n?n.startsWith("/")?n:function(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach((e=>{".."===e?n.length>1&&n.pop():"."!==e&&n.push(e)})),n.length>1?n.join("/"):"/"}(n,t):t;return{pathname:i,search:C(r),hash:I(o)}}(o,a),d=l&&"/"!==l&&l.endsWith("/"),p=(s||"."===l)&&n.endsWith("/");return c.pathname.endsWith("/")||!d&&!p||(c.pathname+="/"),c}var N=e=>e.join("/").replace(/\/\/+/g,"/"),T=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),C=e=>e&&"?"!==e?e.startsWith("?")?e:"?"+e:"",I=e=>e&&"#"!==e?e.startsWith("#")?e:"#"+e:"";function R(e){return null!=e&&"number"==typeof e.status&&"string"==typeof e.statusText&&"boolean"==typeof e.internal&&"data"in e}var A=["POST","PUT","PATCH","DELETE"],O=(new Set(A),["GET",...A]);new Set(O),Symbol("ResetLoaderData");var D=t.createContext(null);D.displayName="DataRouter";var G=t.createContext(null);G.displayName="DataRouterState";var B=t.createContext({isTransitioning:!1});B.displayName="ViewTransition",t.createContext(new Map).displayName="Fetchers",t.createContext(null).displayName="Await";var M=t.createContext(null);M.displayName="Navigation";var F=t.createContext(null);F.displayName="Location";var U=t.createContext({outlet:null,matches:[],isDataRoute:!1});U.displayName="Route";var H=t.createContext(null);function V(){return null!=t.useContext(F)}function $(){return i(V(),"useLocation() may be used only in the context of a component."),t.useContext(F).location}H.displayName="RouteError";var W="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function z(e){t.useContext(M).static||t.useLayoutEffect(e)}function q(){let{isDataRoute:e}=t.useContext(U);return e?function(){let{router:e}=function(e){let n=t.useContext(D);return i(n,ee(e)),n}("useNavigate"),n=te("useNavigate"),r=t.useRef(!1);return z((()=>{r.current=!0})),t.useCallback((async(t,o={})=>{a(r.current,W),r.current&&("number"==typeof t?e.navigate(t):await e.navigate(t,{fromRouteId:n,...o}))}),[e,n])}():function(){i(V(),"useNavigate() may be used only in the context of a component.");let e=t.useContext(D),{basename:n,navigator:r}=t.useContext(M),{matches:o}=t.useContext(U),{pathname:s}=$(),l=JSON.stringify(L(o)),c=t.useRef(!1);return z((()=>{c.current=!0})),t.useCallback(((t,o={})=>{if(a(c.current,W),!c.current)return;if("number"==typeof t)return void r.go(t);let i=j(t,JSON.parse(l),s,"path"===o.relative);null==e&&"/"!==n&&(i.pathname="/"===i.pathname?n:N([n,i.pathname])),(o.replace?r.replace:r.push)(i,o.state,o)}),[n,r,l,s,e])}()}function K(e,{relative:n}={}){let{matches:r}=t.useContext(U),{pathname:o}=$(),i=JSON.stringify(L(r));return t.useMemo((()=>j(e,JSON.parse(i),o,"path"===n)),[e,i,o,n])}function Z(e,n,r,o){i(V(),"useRoutes() may be used only in the context of a component.");let{navigator:s,static:l}=t.useContext(M),{matches:c}=t.useContext(U),p=c[c.length-1],f=p?p.params:{},h=p?p.pathname:"/",g=p?p.pathnameBase:"/",v=p&&p.route;{let e=v&&v.path||"";re(h,!v||e.endsWith("*")||e.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${h}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render.\n\nPlease change the parent to .`)}let m,y=$();if(n){let e="string"==typeof n?u(n):n;i("/"===g||e.pathname?.startsWith(g),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${g}" but pathname "${e.pathname}" was given in the \`location\` prop.`),m=e}else m=y;let b=m.pathname||"/",w=b;if("/"!==g){let e=g.replace(/^\//,"").split("/");w="/"+b.replace(/^\//,"").split("/").slice(e.length).join("/")}let x=!l&&r&&r.matches&&r.matches.length>0?r.matches:d(e,{pathname:w});a(v||null!=x,`No routes matched location "${m.pathname}${m.search}${m.hash}" `),a(null==x||void 0!==x[x.length-1].route.element||void 0!==x[x.length-1].route.Component||void 0!==x[x.length-1].route.lazy,`Matched leaf route at location "${m.pathname}${m.search}${m.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let k=function(e,n=[],r=null){if(null==e){if(!r)return null;if(r.errors)e=r.matches;else{if(0!==n.length||r.initialized||!(r.matches.length>0))return null;e=r.matches}}let o=e,a=r?.errors;if(null!=a){let e=o.findIndex((e=>e.route.id&&void 0!==a?.[e.route.id]));i(e>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(a).join(",")}`),o=o.slice(0,Math.min(o.length,e+1))}let s=!1,l=-1;if(r)for(let e=0;e=0?o.slice(0,l+1):[o[0]];break}}}return o.reduceRight(((e,i,c)=>{let u,d=!1,p=null,f=null;r&&(u=a&&i.route.id?a[i.route.id]:void 0,p=i.route.errorElement||J,s&&(l<0&&0===c?(re("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),d=!0,f=null):l===c&&(d=!0,f=i.route.hydrateFallbackElement||null)));let h=n.concat(o.slice(0,c+1)),g=()=>{let n;return n=u?p:d?f:i.route.Component?t.createElement(i.route.Component,null):i.route.element?i.route.element:e,t.createElement(Q,{match:i,routeContext:{outlet:e,matches:h,isDataRoute:null!=r},children:n})};return r&&(i.route.ErrorBoundary||i.route.errorElement||0===c)?t.createElement(X,{location:r.location,revalidation:r.revalidation,component:p,error:u,children:g(),routeContext:{outlet:null,matches:h,isDataRoute:!0}}):g()}),null)}(x&&x.map((e=>Object.assign({},e,{params:Object.assign({},f,e.params),pathname:N([g,s.encodeLocation?s.encodeLocation(e.pathname).pathname:e.pathname]),pathnameBase:"/"===e.pathnameBase?g:N([g,s.encodeLocation?s.encodeLocation(e.pathnameBase).pathname:e.pathnameBase])}))),c,r,o);return n&&k?t.createElement(F.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...m},navigationType:"POP"}},k):k}function Y(){let e=function(){let e=t.useContext(H),n=function(e){let n=t.useContext(G);return i(n,ee(e)),n}("useRouteError"),r=te("useRouteError");return void 0!==e?e:n.errors?.[r]}(),n=R(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),r=e instanceof Error?e.stack:null,o="rgba(200,200,200, 0.5)",a={padding:"0.5rem",backgroundColor:o},s={padding:"2px 4px",backgroundColor:o},l=null;return console.error("Error handled by React Router default ErrorBoundary:",e),l=t.createElement(t.Fragment,null,t.createElement("p",null,"💿 Hey developer 👋"),t.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",t.createElement("code",{style:s},"ErrorBoundary")," or"," ",t.createElement("code",{style:s},"errorElement")," prop on your route.")),t.createElement(t.Fragment,null,t.createElement("h2",null,"Unexpected Application Error!"),t.createElement("h3",{style:{fontStyle:"italic"}},n),r?t.createElement("pre",{style:a},r):null,l)}t.createContext(null);var J=t.createElement(Y,null),X=class extends t.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||"idle"!==t.revalidation&&"idle"===e.revalidation?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:void 0!==e.error?e.error:t.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){console.error("React Router caught the following error during render",e,t)}render(){return void 0!==this.state.error?t.createElement(U.Provider,{value:this.props.routeContext},t.createElement(H.Provider,{value:this.state.error,children:this.props.component})):this.props.children}};function Q({routeContext:e,match:n,children:r}){let o=t.useContext(D);return o&&o.static&&o.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(o.staticContext._deepestRenderedBoundaryId=n.route.id),t.createElement(U.Provider,{value:e},r)}function ee(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function te(e){let n=function(e){let n=t.useContext(U);return i(n,ee(e)),n}(e),r=n.matches[n.matches.length-1];return i(r.route.id,`${e} can only be used on routes that contain a unique "id"`),r.route.id}var ne={};function re(e,t,n){t||ne[e]||(ne[e]=!0,a(!1,n))}function oe(e){i(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function ie({basename:e="/",children:n=null,location:r,navigationType:o="POP",navigator:s,static:l=!1}){i(!V(),"You cannot render a inside another . You should never have more than one in your app.");let c=e.replace(/^\/*/,"/"),d=t.useMemo((()=>({basename:c,navigator:s,static:l,future:{}})),[c,s,l]);"string"==typeof r&&(r=u(r));let{pathname:p="/",search:f="",hash:h="",state:g=null,key:v="default"}=r,m=t.useMemo((()=>{let e=E(p,c);return null==e?null:{location:{pathname:e,search:f,hash:h,state:g,key:v},navigationType:o}}),[c,p,f,h,g,v,o]);return a(null!=m,` is not able to match the URL "${p}${f}${h}" because it does not start with the basename, so the won't render anything.`),null==m?null:t.createElement(M.Provider,{value:d},t.createElement(F.Provider,{children:n,value:m}))}function ae({children:e,location:t}){return Z(se(e),t)}function se(e,n=[]){let r=[];return t.Children.forEach(e,((e,o)=>{if(!t.isValidElement(e))return;let a=[...n,o];if(e.type===t.Fragment)return void r.push.apply(r,se(e.props.children,a));i(e.type===oe,`[${"string"==typeof e.type?e.type:e.type.name}] is not a component. All component children of must be a or `),i(!e.props.index||!e.props.children,"An index route cannot have child routes.");let s={id:e.props.id||a.join("-"),caseSensitive:e.props.caseSensitive,element:e.props.element,Component:e.props.Component,index:e.props.index,path:e.props.path,loader:e.props.loader,action:e.props.action,hydrateFallbackElement:e.props.hydrateFallbackElement,HydrateFallback:e.props.HydrateFallback,errorElement:e.props.errorElement,ErrorBoundary:e.props.ErrorBoundary,hasErrorBoundary:!0===e.props.hasErrorBoundary||null!=e.props.ErrorBoundary||null!=e.props.errorElement,shouldRevalidate:e.props.shouldRevalidate,handle:e.props.handle,lazy:e.props.lazy};e.props.children&&(s.children=se(e.props.children,a)),r.push(s)})),r}t.memo((function({routes:e,future:t,state:n}){return Z(e,void 0,n,t)})),t.Component;var le="get",ce="application/x-www-form-urlencoded";function ue(e){return null!=e&&"string"==typeof e.tagName}var de=null,pe=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function fe(e){return null==e||pe.has(e)?e:(a(!1,`"${e}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${ce}"`),null)}function he(e,t){if(!1===e||null==e)throw new Error(t)}function ge(e){return null!=e&&(null==e.href?"preload"===e.rel&&"string"==typeof e.imageSrcSet&&"string"==typeof e.imageSizes:"string"==typeof e.rel&&"string"==typeof e.href)}function ve(e,t,n,r,o,i){let a=(e,t)=>!n[t]||e.route.id!==n[t].route.id,s=(e,t)=>n[t].pathname!==e.pathname||n[t].route.path?.endsWith("*")&&n[t].params["*"]!==e.params["*"];return"assets"===i?t.filter(((e,t)=>a(e,t)||s(e,t))):"data"===i?t.filter(((t,i)=>{let l=r.routes[t.route.id];if(!l||!l.hasLoader)return!1;if(a(t,i)||s(t,i))return!0;if(t.route.shouldRevalidate){let r=t.route.shouldRevalidate({currentUrl:new URL(o.pathname+o.search+o.hash,window.origin),currentParams:n[0]?.params||{},nextUrl:new URL(e,window.origin),nextParams:t.params,defaultShouldRevalidate:!0});if("boolean"==typeof r)return r}return!0})):[]}function me(e,t,{includeHydrateFallback:n}={}){return r=e.map((e=>{let r=t.routes[e.route.id];if(!r)return[];let o=[r.module];return r.clientActionModule&&(o=o.concat(r.clientActionModule)),r.clientLoaderModule&&(o=o.concat(r.clientLoaderModule)),n&&r.hydrateFallbackModule&&(o=o.concat(r.hydrateFallbackModule)),r.imports&&(o=o.concat(r.imports)),o})).flat(1),[...new Set(r)];var r}function ye(){let e=t.useContext(D);return he(e,"You must render this element inside a element"),e}function be(){let e=t.useContext(G);return he(e,"You must render this element inside a element"),e}Symbol("SingleFetchRedirect"),t.Component;var we=t.createContext(void 0);function xe(){let e=t.useContext(we);return he(e,"You must render this element inside a element"),e}function ke(e,t){return n=>{e&&e(n),n.defaultPrevented||t(n)}}function Se({page:e,...n}){let{router:r}=ye(),o=t.useMemo((()=>d(r.routes,e,r.basename)),[r.routes,e,r.basename]);return o?t.createElement(Ee,{page:e,matches:o,...n}):null}function _e(e){let{manifest:n,routeModules:r}=xe(),[o,i]=t.useState([]);return t.useEffect((()=>{let t=!1;return async function(e,t,n){return function(e,t){let n=new Set,r=new Set(t);return e.reduce(((e,o)=>{if(t&&(null==(i=o)||"string"!=typeof i.page)&&"script"===o.as&&o.href&&r.has(o.href))return e;var i;let a=JSON.stringify(function(e){let t={},n=Object.keys(e).sort();for(let r of n)t[r]=e[r];return t}(o));return n.has(a)||(n.add(a),e.push({key:a,link:o})),e}),[])}((await Promise.all(e.map((async e=>{let r=t.routes[e.route.id];if(r){let e=await async function(e,t){if(e.id in t)return t[e.id];try{let n=await import(e.module);return t[e.id]=n,n}catch(t){return console.error(`Error loading route module \`${e.module}\`, reloading page...`),console.error(t),window.__reactRouterContext&&window.__reactRouterContext.isSpaMode,window.location.reload(),new Promise((()=>{}))}}(r,n);return e.links?e.links():[]}return[]})))).flat(1).filter(ge).filter((e=>"stylesheet"===e.rel||"preload"===e.rel)).map((e=>"stylesheet"===e.rel?{...e,rel:"prefetch",as:"style"}:{...e,rel:"prefetch"})))}(e,n,r).then((e=>{t||i(e)})),()=>{t=!0}}),[e,n,r]),o}function Ee({page:e,matches:n,...r}){let o=$(),{manifest:i,routeModules:a}=xe(),{basename:s}=ye(),{loaderData:l,matches:c}=be(),u=t.useMemo((()=>ve(e,n,c,i,o,"data")),[e,n,c,i,o]),d=t.useMemo((()=>ve(e,n,c,i,o,"assets")),[e,n,c,i,o]),p=t.useMemo((()=>{if(e===o.pathname+o.search+o.hash)return[];let t=new Set,r=!1;if(n.forEach((e=>{let n=i.routes[e.route.id];n&&n.hasLoader&&(!u.some((t=>t.route.id===e.route.id))&&e.route.id in l&&a[e.route.id]?.shouldRevalidate||n.hasClientLoader?r=!0:t.add(e.route.id))})),0===t.size)return[];let c=function(e,t){let n="string"==typeof e?new URL(e,"undefined"==typeof window?"server://singlefetch/":window.location.origin):e;return"/"===n.pathname?n.pathname="_root.data":t&&"/"===E(n.pathname,t)?n.pathname=`${t.replace(/\/$/,"")}/_root.data`:n.pathname=`${n.pathname.replace(/\/$/,"")}.data`,n}(e,s);return r&&t.size>0&&c.searchParams.set("_routes",n.filter((e=>t.has(e.route.id))).map((e=>e.route.id)).join(",")),[c.pathname+c.search]}),[s,l,o,i,u,n,e,a]),f=t.useMemo((()=>me(d,i)),[d,i]),h=_e(d);return t.createElement(t.Fragment,null,p.map((e=>t.createElement("link",{key:e,rel:"prefetch",as:"fetch",href:e,...r}))),f.map((e=>t.createElement("link",{key:e,rel:"modulepreload",href:e,...r}))),h.map((({key:e,link:n})=>t.createElement("link",{key:e,...n}))))}we.displayName="FrameworkContext";function Pe(...e){return t=>{e.forEach((e=>{"function"==typeof e?e(t):null!=e&&(e.current=t)}))}}var Le="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement;try{Le&&(window.__reactRouterVersion="7.4.0")}catch(e){}function je({basename:e,children:n,window:r}){let i=t.useRef();null==i.current&&(i.current=o({window:r,v5Compat:!0}));let a=i.current,[s,l]=t.useState({action:a.action,location:a.location}),c=t.useCallback((e=>{t.startTransition((()=>l(e)))}),[l]);return t.useLayoutEffect((()=>a.listen(c)),[a,c]),t.createElement(ie,{basename:e,children:n,location:s.location,navigationType:s.action,navigator:a})}var Ne=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Te=t.forwardRef((function({onClick:e,discover:n="render",prefetch:r="none",relative:o,reloadDocument:s,replace:l,state:u,target:d,to:p,preventScrollReset:f,viewTransition:h,...g},v){let m,{basename:y}=t.useContext(M),b="string"==typeof p&&Ne.test(p),w=!1;if("string"==typeof p&&b&&(m=p,Le))try{let e=new URL(window.location.href),t=p.startsWith("//")?new URL(e.protocol+p):new URL(p),n=E(t.pathname,y);t.origin===e.origin&&null!=n?p=n+t.search+t.hash:w=!0}catch(e){a(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}let x=function(e,{relative:n}={}){i(V(),"useHref() may be used only in the context of a component.");let{basename:r,navigator:o}=t.useContext(M),{hash:a,pathname:s,search:l}=K(e,{relative:n}),c=s;return"/"!==r&&(c="/"===s?r:N([r,s])),o.createHref({pathname:c,search:l,hash:a})}(p,{relative:o}),[k,S,_]=function(e,n){let r=t.useContext(we),[o,i]=t.useState(!1),[a,s]=t.useState(!1),{onFocus:l,onBlur:c,onMouseEnter:u,onMouseLeave:d,onTouchStart:p}=n,f=t.useRef(null);t.useEffect((()=>{if("render"===e&&s(!0),"viewport"===e){let e=new IntersectionObserver((e=>{e.forEach((e=>{s(e.isIntersecting)}))}),{threshold:.5});return f.current&&e.observe(f.current),()=>{e.disconnect()}}}),[e]),t.useEffect((()=>{if(o){let e=setTimeout((()=>{s(!0)}),100);return()=>{clearTimeout(e)}}}),[o]);let h=()=>{i(!0)},g=()=>{i(!1),s(!1)};return r?"intent"!==e?[a,f,{}]:[a,f,{onFocus:ke(l,h),onBlur:ke(c,g),onMouseEnter:ke(u,h),onMouseLeave:ke(d,g),onTouchStart:ke(p,h)}]:[!1,f,{}]}(r,g),P=function(e,{target:n,replace:r,state:o,preventScrollReset:i,relative:a,viewTransition:s}={}){let l=q(),u=$(),d=K(e,{relative:a});return t.useCallback((t=>{if(function(e,t){return!(0!==e.button||t&&"_self"!==t||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e))}(t,n)){t.preventDefault();let n=void 0!==r?r:c(u)===c(d);l(e,{replace:n,state:o,preventScrollReset:i,relative:a,viewTransition:s})}}),[u,l,d,r,o,n,e,i,a,s])}(p,{replace:l,state:u,target:d,preventScrollReset:f,relative:o,viewTransition:h}),L=t.createElement("a",{...g,..._,href:m||x,onClick:w||s?e:function(t){e&&e(t),t.defaultPrevented||P(t)},ref:Pe(v,S),target:d,"data-discover":b||"render"!==n?void 0:"true"});return k&&!b?t.createElement(t.Fragment,null,L,t.createElement(Se,{page:x})):L}));function Ce(e){let n=t.useContext(D);return i(n,function(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}(e)),n}Te.displayName="Link",t.forwardRef((function({"aria-current":e="page",caseSensitive:n=!1,className:r="",end:o=!1,style:a,to:s,viewTransition:l,children:c,...u},d){let p=K(s,{relative:u.relative}),f=$(),h=t.useContext(G),{navigator:g,basename:v}=t.useContext(M),m=null!=h&&function(e,n={}){let r=t.useContext(B);i(null!=r,"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?");let{basename:o}=Ce("useViewTransitionState"),a=K(e,{relative:n.relative});if(!r.isTransitioning)return!1;let s=E(r.currentLocation.pathname,o)||r.currentLocation.pathname,l=E(r.nextLocation.pathname,o)||r.nextLocation.pathname;return null!=S(a.pathname,l)||null!=S(a.pathname,s)}(p)&&!0===l,y=g.encodeLocation?g.encodeLocation(p).pathname:p.pathname,b=f.pathname,w=h&&h.navigation&&h.navigation.location?h.navigation.location.pathname:null;n||(b=b.toLowerCase(),w=w?w.toLowerCase():null,y=y.toLowerCase()),w&&v&&(w=E(w,v)||w);const x="/"!==y&&y.endsWith("/")?y.length-1:y.length;let k,_=b===y||!o&&b.startsWith(y)&&"/"===b.charAt(x),P=null!=w&&(w===y||!o&&w.startsWith(y)&&"/"===w.charAt(y.length)),L={isActive:_,isPending:P,isTransitioning:m},j=_?e:void 0;k="function"==typeof r?r(L):[r,_?"active":null,P?"pending":null,m?"transitioning":null].filter(Boolean).join(" ");let N="function"==typeof a?a(L):a;return t.createElement(Te,{...u,"aria-current":j,className:k,ref:d,style:N,to:s,viewTransition:l},"function"==typeof c?c(L):c)})).displayName="NavLink",t.forwardRef((({discover:e="render",fetcherKey:n,navigate:r,reloadDocument:o,replace:a,state:s,method:l=le,action:u,onSubmit:d,relative:p,preventScrollReset:f,viewTransition:h,...g},v)=>{let m=function(){let{router:e}=Ce("useSubmit"),{basename:n}=t.useContext(M),r=te("useRouteId");return t.useCallback((async(t,o={})=>{let{action:i,method:a,encType:s,formData:l,body:c}=function(e,t){let n,r,o,i,a;if(ue(s=e)&&"form"===s.tagName.toLowerCase()){let a=e.getAttribute("action");r=a?E(a,t):null,n=e.getAttribute("method")||le,o=fe(e.getAttribute("enctype"))||ce,i=new FormData(e)}else if(function(e){return ue(e)&&"button"===e.tagName.toLowerCase()}(e)||function(e){return ue(e)&&"input"===e.tagName.toLowerCase()}(e)&&("submit"===e.type||"image"===e.type)){let a=e.form;if(null==a)throw new Error('Cannot submit a + + ); +}; diff --git a/src/content-helper/dashboard-page/components/posts-table/style.scss b/src/content-helper/dashboard-page/components/posts-table/style.scss index db083027a8..c2769bdafc 100644 --- a/src/content-helper/dashboard-page/components/posts-table/style.scss +++ b/src/content-helper/dashboard-page/components/posts-table/style.scss @@ -12,9 +12,6 @@ border-spacing: 0; tr { - padding: var(--grid-unit-15) 0; - display: flex; - gap: var(--grid-unit-20); position: relative; &::after { @@ -30,44 +27,120 @@ th, td { - text-align: left; - align-self: center; + padding: var(--grid-unit-15) 0; } td.post-info, th.post-info-header { - width: 70%; + text-align: left; } - th.boost-perf-header { - position: relative; - overflow: visible; - white-space: nowrap; - z-index: 1; + th { + font-size: var(--font-size--small); + font-weight: 600; + color: var(--sidebar-black); + font-style: normal; + line-height: var(--font-size--large); + text-transform: uppercase; + } + + th.views-header { + text-align: center; + min-width: to_rem(60px); + + .views-header-period { + font-size: var(--font-size--smaller); + font-weight: 400; + color: var(--gray-500); + margin-left: var(--grid-unit-5); + } + } + + td.metrics { + min-width: 100px; + + .metrics-container { + display: flex; + flex-direction: column; + gap: var(--grid-unit-5); + align-items: center; + + .metric-change { + font-size: var(--font-size--small); + font-weight: 600; + line-height: var(--font-size--large); + margin-left: var(--grid-unit-5); + } + + .metric-change-positive { + color: var(--parsely-green); + } + + .metric-change-negative { + color: #900000; + } + + .metric-change-neutral { + color: var(--gray-500); + } + + .metric-boost-percentage { + font-size: var(--font-size--small); + font-weight: 600; + color: var(--parsely-green); + } + } } td.actions { display: flex; - flex: 1; - width: to_rem(180px); + max-width: to_rem(135px); min-height: to_rem(40px); - padding-right: var(--grid-unit-20); justify-content: flex-end; align-items: center; gap: var(--grid-unit-10); + margin-left: var(--grid-unit-10); a { text-decoration: none; } - } - th { - font-size: var(--font-size--small); - font-weight: 600; - color: var(--sidebar-black); - font-style: normal; - line-height: var(--font-size--large); - text-transform: uppercase; + .boost-link-container { + display: flex; + flex-direction: column; + height: 100%; + gap: to_rem(4px); + text-align: center; + width: 100%; + + .boost-link-status { + display: flex; + justify-content: center; + gap: to_rem(4px); + + .hidden { + opacity: 0; + } + + .boost-inbound, + .boost-outbound { + flex-grow: 1; + display: flex; + align-items: center; + justify-content: center; + padding: to_rem(4px) to_rem(9px); + border-radius: to_rem(6px); + background-color: var(--gray-300); + font-size: var(--font-size--small); + line-height: var(--font-size--medium); + color: var(--sidebar-black); + } + + .boost-link-status-icon-inbound { + transform: rotate(180deg); + } + } + } } } } @@ -78,16 +151,30 @@ color: #757575; font-style: italic; } -} -.parsely-table-container.hide-pagination { - table tr:last-child::after { - display: none; + .suggestion-bubble { + background: var(--parsely-green); + border-radius: to_rem(20px); + display: inline-block; + text-align: center; + padding: 3px to_rem(6px); + color: var(--sidebar-white); + cursor: pointer; + margin-left: to_rem(6px); + box-shadow: none; + border: none; + line-height: to_rem(14px); + min-width: to_rem(28px); + font-size: to_rem(13px); } } .parsely-table-container.compact { table tr td.post-info { + max-width: 100px; + } + + tr::after { width: 100%; } @@ -97,6 +184,16 @@ -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical; + + > span { + white-space: normal !important; + } + } +} + +.parsely-table-container.hide-pagination { + table tr:last-child::after { + display: none; } } @@ -114,6 +211,7 @@ .post-details { display: flex; min-height: var(--grid-unit-40); + min-width: 0; flex-direction: column; justify-content: center; align-items: flex-start; @@ -131,6 +229,12 @@ font-style: normal; font-weight: 600; line-height: to_rem(20px); + + > span { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + } } .post-meta { diff --git a/src/content-helper/dashboard-page/pages/dashboard/page-component.tsx b/src/content-helper/dashboard-page/pages/dashboard/page-component.tsx index 624b58550a..affb0e1cc7 100644 --- a/src/content-helper/dashboard-page/pages/dashboard/page-component.tsx +++ b/src/content-helper/dashboard-page/pages/dashboard/page-component.tsx @@ -1,6 +1,7 @@ /** * WordPress dependencies */ +import { useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; /** @@ -10,8 +11,8 @@ import { SettingsProvider, TrafficBoostSettings } from '../../../common/settings import { VerifyCredentials } from '../../../common/verify-credentials'; import { PageBody, PageContainer, PostsTable } from '../../components'; import { DashboardHeading } from '../../components/typography-components'; -import { DashboardHeader } from './header-component'; import './dashboard.scss'; +import { DashboardHeader } from './header-component'; /** * Gets the settings from the passed JSON. @@ -62,6 +63,7 @@ const getSettingsFromJson = ( settingsJson: string ): TrafficBoostSettings => { * @since 3.18.0 */ export const DashboardPage = (): React.JSX.Element => { + const [ currentPage, setCurrentPage ] = useState( 1 ); return ( { 'wp-parsely' ) }

- + diff --git a/src/content-helper/dashboard-page/pages/traffic-boost/page-component.tsx b/src/content-helper/dashboard-page/pages/traffic-boost/page-component.tsx index 2d1fe8b29b..e0e0021217 100644 --- a/src/content-helper/dashboard-page/pages/traffic-boost/page-component.tsx +++ b/src/content-helper/dashboard-page/pages/traffic-boost/page-component.tsx @@ -3,8 +3,8 @@ */ import { SearchControl } from '@wordpress/components'; import { useDebounce } from '@wordpress/compose'; -import { __ } from '@wordpress/i18n'; import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; /** * Internal dependencies @@ -19,7 +19,12 @@ import './traffic-boost.scss'; */ export const TrafficBoostPage = (): React.JSX.Element => { const [ searchQuery, setSearchQuery ] = useState( '' ); - const debouncedSetSearchQuery = useDebounce( setSearchQuery, 300 ); + const debouncedSetSearchQuery = useDebounce( ( value: string ) => { + setSearchQuery( value ); + setCurrentPage( 1 ); + }, 300 ); + + const [ currentPage, setCurrentPage ] = useState( 1 ); return ( @@ -37,10 +42,13 @@ export const TrafficBoostPage = (): React.JSX.Element => { /> diff --git a/src/content-helper/dashboard-page/pages/traffic-boost/preview/components/link-counter.tsx b/src/content-helper/dashboard-page/pages/traffic-boost/preview/components/link-counter.tsx index 0f7b47b0a8..c8c2e5a755 100644 --- a/src/content-helper/dashboard-page/pages/traffic-boost/preview/components/link-counter.tsx +++ b/src/content-helper/dashboard-page/pages/traffic-boost/preview/components/link-counter.tsx @@ -9,8 +9,8 @@ import { __, sprintf } from '@wordpress/i18n'; /** * Internal dependencies */ +import { HydratedPost } from '../../../../../common/providers/base-wordpress-provider'; import { TrafficBoostStore } from '../../store'; -import { HydratedPost } from '../../../../../common/base-wordpress-provider'; /** * Represents the type of link. diff --git a/src/content-helper/dashboard-page/pages/traffic-boost/preview/components/link-options-panel.tsx b/src/content-helper/dashboard-page/pages/traffic-boost/preview/components/link-options-panel.tsx index 8c3125078a..fc1ff38440 100644 --- a/src/content-helper/dashboard-page/pages/traffic-boost/preview/components/link-options-panel.tsx +++ b/src/content-helper/dashboard-page/pages/traffic-boost/preview/components/link-options-panel.tsx @@ -13,7 +13,7 @@ import { __ } from '@wordpress/i18n'; /** * Internal imports */ -import { HydratedPost } from '../../../../../common/base-wordpress-provider'; +import { HydratedPost } from '../../../../../common/providers/base-wordpress-provider'; import { TrafficBoostLink } from '../../provider'; /** diff --git a/src/content-helper/dashboard-page/pages/traffic-boost/preview/components/preview-header.tsx b/src/content-helper/dashboard-page/pages/traffic-boost/preview/components/preview-header.tsx index 2d369b9d29..96754ad527 100644 --- a/src/content-helper/dashboard-page/pages/traffic-boost/preview/components/preview-header.tsx +++ b/src/content-helper/dashboard-page/pages/traffic-boost/preview/components/preview-header.tsx @@ -9,8 +9,8 @@ import { desktop, edit, external, moreVertical, update } from '@wordpress/icons' /** * Internal imports */ -import { HydratedPost } from '../../../../../common/base-wordpress-provider'; import { LeafIcon } from '../../../../../common/icons/leaf-icon'; +import { HydratedPost } from '../../../../../common/providers/base-wordpress-provider'; import { TrafficBoostLink } from '../../provider'; import { isExternalURL } from '../utils'; import { LinkCounter } from './link-counter'; diff --git a/src/content-helper/dashboard-page/pages/traffic-boost/preview/preview.tsx b/src/content-helper/dashboard-page/pages/traffic-boost/preview/preview.tsx index 0ee2cab0b5..c52861eca3 100644 --- a/src/content-helper/dashboard-page/pages/traffic-boost/preview/preview.tsx +++ b/src/content-helper/dashboard-page/pages/traffic-boost/preview/preview.tsx @@ -11,8 +11,8 @@ import { addQueryArgs } from '@wordpress/url'; /** * Internal dependencies */ -import { HydratedPost } from '../../../../common/base-wordpress-provider'; import { ContentHelperError, ContentHelperErrorCode } from '../../../../common/content-helper-error'; +import { HydratedPost } from '../../../../common/providers/base-wordpress-provider'; import { TRAFFIC_BOOST_DEFAULT_PERFORMANCE_BLENDING_WEIGHT, TrafficBoostLink, diff --git a/src/content-helper/dashboard-page/pages/traffic-boost/provider.ts b/src/content-helper/dashboard-page/pages/traffic-boost/provider.ts index 8170681921..7a074c48aa 100644 --- a/src/content-helper/dashboard-page/pages/traffic-boost/provider.ts +++ b/src/content-helper/dashboard-page/pages/traffic-boost/provider.ts @@ -1,9 +1,13 @@ /** - * Internal dependencies + * WordPress dependencies */ import { __ } from '@wordpress/i18n'; -import { BaseWordPressProvider, HydratedPost } from '../../../common/base-wordpress-provider'; + +/** + * Internal dependencies + */ import { ContentHelperError, ContentHelperErrorCode } from '../../../common/content-helper-error'; +import { BaseWordPressProvider, HydratedPost } from '../../../common/providers/base-wordpress-provider'; import { InboundSmartLink } from '../../../editor-sidebar/smart-linking/provider'; /** @@ -264,6 +268,14 @@ export class TrafficBoostProvider extends BaseWordPressProvider { generatedSuggestions = [ ...generatedSuggestions, ...filteredGeneratedSuggestions ]; totalSuggestions += filteredGeneratedSuggestions.length; } catch ( error ) { + // If the error is an AbortError, we need to throw it. + if ( + ( error instanceof DOMException && error.name === 'AbortError' ) || + ( error instanceof ContentHelperError && error.code === ContentHelperErrorCode.ParselyAborted ) + ) { + throw error; + } + // eslint-disable-next-line no-console console.error( error ); maxRetries--; @@ -602,6 +614,7 @@ export class TrafficBoostProvider extends BaseWordPressProvider { include: postIds, posts_per_page: 100, status: 'any', + context: 'edit', rest_endpoint: postRestEndpoint, } ); diff --git a/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/add-new-link-button.tsx b/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/add-new-link-button.tsx index 7eb0a5b382..eac9c74c29 100644 --- a/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/add-new-link-button.tsx +++ b/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/add-new-link-button.tsx @@ -11,7 +11,7 @@ import { plus } from '@wordpress/icons'; /** * Internal dependencies */ -import { HydratedPost } from '../../../../../common/base-wordpress-provider'; +import { HydratedPost } from '../../../../../common/providers/base-wordpress-provider'; import { PostsTable } from '../../../../components/posts-table/component'; import { TrafficBoostLink } from '../../provider'; import { TrafficBoostStore } from '../../store'; @@ -95,6 +95,8 @@ export const AddNewLinkButton = ( { { searchInput && ( {} } className="traffic-boost-add-link-table" query={ { status: 'publish', @@ -102,6 +104,7 @@ export const AddNewLinkButton = ( { search: searchInput, search_columns: [ 'post_title', 'post_excerpt' ], exclude: suggestionsPostIds, + context: 'edit', } } hideHeader={ true } hidePagination={ true } diff --git a/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/header.tsx b/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/header.tsx index 3df4844936..8fef0d8b92 100644 --- a/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/header.tsx +++ b/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/header.tsx @@ -8,7 +8,7 @@ import { chevronLeft } from '@wordpress/icons'; /** * Internal dependencies */ -import { HydratedPost } from '../../../../../common/base-wordpress-provider'; +import { HydratedPost } from '../../../../../common/providers/base-wordpress-provider'; import { PostDetailsSidebar } from './post-details'; /** diff --git a/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/post-details.tsx b/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/post-details.tsx index e2000d945d..f0abcd4e7e 100644 --- a/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/post-details.tsx +++ b/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/post-details.tsx @@ -7,8 +7,8 @@ import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ -import { HydratedPost } from '../../../../../common/base-wordpress-provider'; import { Thumbnail } from '../../../../../common/components/thumbnail'; +import { HydratedPost } from '../../../../../common/providers/base-wordpress-provider'; /** * Defines the props structure for PostDetailsSidebar. diff --git a/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/tabs/suggestions-tab.tsx b/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/tabs/suggestions-tab.tsx index 0f3bcb1b15..590967048e 100644 --- a/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/tabs/suggestions-tab.tsx +++ b/src/content-helper/dashboard-page/pages/traffic-boost/sidebar/components/tabs/suggestions-tab.tsx @@ -9,9 +9,9 @@ import { error, update } from '@wordpress/icons'; /** * Internal dependencies */ -import { HydratedPost } from '../../../../../../common/base-wordpress-provider'; import { Loading as LoadingComponent } from '../../../../../../common/components/loading'; import { ContentHelperError, ContentHelperErrorCode } from '../../../../../../common/content-helper-error'; +import { HydratedPost } from '../../../../../../common/providers/base-wordpress-provider'; import { TRAFFIC_BOOST_LOADING_MESSAGES, TrafficBoostLink, TrafficBoostProvider } from '../../../provider'; import { TrafficBoostStore } from '../../../store'; import { AddNewLinkButton } from '../add-new-link-button'; diff --git a/src/content-helper/dashboard-page/pages/traffic-boost/store.ts b/src/content-helper/dashboard-page/pages/traffic-boost/store.ts index a6662f7b25..f31a9e86fa 100644 --- a/src/content-helper/dashboard-page/pages/traffic-boost/store.ts +++ b/src/content-helper/dashboard-page/pages/traffic-boost/store.ts @@ -6,10 +6,10 @@ import { createReduxStore, register } from '@wordpress/data'; /** * Internal dependencies */ -import { HydratedPost } from '../../../common/base-wordpress-provider'; import { ContentHelperError } from '../../../common/content-helper-error'; -import { TrafficBoostLink } from './provider'; +import { HydratedPost } from '../../../common/providers/base-wordpress-provider'; import { LinkType } from './preview/components/link-counter'; +import { TrafficBoostLink } from './provider'; /** * Available tab names in the Traffic Boost sidebar. diff --git a/src/content-helper/dashboard-page/provider.tsx b/src/content-helper/dashboard-page/provider.tsx index f3c0fdacaf..fa9bdfc187 100644 --- a/src/content-helper/dashboard-page/provider.tsx +++ b/src/content-helper/dashboard-page/provider.tsx @@ -1,7 +1,7 @@ /** * Internal dependencies */ -import { BaseWordPressProvider } from '../common/base-wordpress-provider'; +import { BaseWordPressProvider } from '../common/providers/base-wordpress-provider'; /** * DashboardProvider class for the plugin's dashboard. diff --git a/src/content-helper/dashboard-widget/provider.ts b/src/content-helper/dashboard-widget/provider.ts index 0338e490ac..e5791fde31 100644 --- a/src/content-helper/dashboard-widget/provider.ts +++ b/src/content-helper/dashboard-widget/provider.ts @@ -7,14 +7,14 @@ import { addQueryArgs } from '@wordpress/url'; /** * Internal dependencies */ -import { BaseProvider } from '../common/base-provider'; import { ContentHelperError, ContentHelperErrorCode, } from '../common/content-helper-error'; +import { BaseProvider } from '../common/providers/base-provider'; +import { TopPostsSettings } from '../common/settings'; import { getApiPeriodParams } from '../common/utils/api'; import { PostData } from '../common/utils/post'; -import { TopPostsSettings } from '../common/settings'; export const TOP_POSTS_DEFAULT_LIMIT = 5; diff --git a/src/content-helper/editor-sidebar/excerpt-suggestions/provider.ts b/src/content-helper/editor-sidebar/excerpt-suggestions/provider.ts index 29b50d8084..aa11d74110 100644 --- a/src/content-helper/editor-sidebar/excerpt-suggestions/provider.ts +++ b/src/content-helper/editor-sidebar/excerpt-suggestions/provider.ts @@ -6,7 +6,7 @@ import { addQueryArgs } from '@wordpress/url'; /** * Internal dependencies */ -import { BaseProvider } from '../../common/base-provider'; +import { BaseProvider } from '../../common/providers/base-provider'; /** * Provides the generate excerpt functionality to be used in other components. diff --git a/src/content-helper/editor-sidebar/performance-stats/provider.ts b/src/content-helper/editor-sidebar/performance-stats/provider.ts index 7219385e6b..95a1d6229f 100644 --- a/src/content-helper/editor-sidebar/performance-stats/provider.ts +++ b/src/content-helper/editor-sidebar/performance-stats/provider.ts @@ -8,11 +8,11 @@ import { addQueryArgs } from '@wordpress/url'; /** * Internal dependencies */ -import { BaseProvider } from '../../common/base-provider'; import { ContentHelperError, ContentHelperErrorCode, } from '../../common/content-helper-error'; +import { BaseProvider } from '../../common/providers/base-provider'; import { getApiPeriodParams } from '../../common/utils/api'; import { Period } from '../../common/utils/constants'; import { diff --git a/src/content-helper/editor-sidebar/related-posts/provider.ts b/src/content-helper/editor-sidebar/related-posts/provider.ts index ebaa7cd732..210898fec7 100644 --- a/src/content-helper/editor-sidebar/related-posts/provider.ts +++ b/src/content-helper/editor-sidebar/related-posts/provider.ts @@ -6,7 +6,7 @@ import { addQueryArgs } from '@wordpress/url'; /** * Internal dependencies */ -import { BaseProvider } from '../../common/base-provider'; +import { BaseProvider } from '../../common/providers/base-provider'; import { getApiPeriodParams } from '../../common/utils/api'; import { Metric, diff --git a/src/content-helper/editor-sidebar/smart-linking/provider.ts b/src/content-helper/editor-sidebar/smart-linking/provider.ts index 3cf58ee7a1..f9676a8be7 100644 --- a/src/content-helper/editor-sidebar/smart-linking/provider.ts +++ b/src/content-helper/editor-sidebar/smart-linking/provider.ts @@ -7,8 +7,8 @@ import { addQueryArgs } from '@wordpress/url'; /** * Internal dependencies */ -import { BaseProvider } from '../../common/base-provider'; import { ContentHelperError, ContentHelperErrorCode } from '../../common/content-helper-error'; +import { BaseProvider } from '../../common/providers/base-provider'; import { getApiPeriodParams } from '../../common/utils/api'; import { Metric, Period } from '../../common/utils/constants'; import { PerformanceData } from '../performance-stats/model'; diff --git a/src/content-helper/editor-sidebar/title-suggestions/provider.ts b/src/content-helper/editor-sidebar/title-suggestions/provider.ts index 9b85f4767f..1b5333eb0f 100644 --- a/src/content-helper/editor-sidebar/title-suggestions/provider.ts +++ b/src/content-helper/editor-sidebar/title-suggestions/provider.ts @@ -6,9 +6,9 @@ import { addQueryArgs } from '@wordpress/url'; /** * Internal dependencies */ -import { BaseProvider } from '../../common/base-provider'; -import { getToneLabel, ToneProp } from '../../common/components/tone-selector'; import { getPersonaLabel, PersonaProp } from '../../common/components/persona-selector'; +import { getToneLabel, ToneProp } from '../../common/components/tone-selector'; +import { BaseProvider } from '../../common/providers/base-provider'; /** * Returns data from the `content-suggestions/suggest-headline` WordPress REST API diff --git a/src/rest-api/content-helper/class-endpoint-smart-linking.php b/src/rest-api/content-helper/class-endpoint-smart-linking.php index dea5fe9bf1..f49918f90e 100644 --- a/src/rest-api/content-helper/class-endpoint-smart-linking.php +++ b/src/rest-api/content-helper/class-endpoint-smart-linking.php @@ -343,6 +343,9 @@ public function add_smart_link( WP_REST_Request $request ): WP_REST_Response { ); } + // Clear the cache for the smart link. + $smart_link->flush_all_cache(); + return new WP_REST_Response( array( 'data' => json_decode( $smart_link->serialize() ), @@ -398,6 +401,9 @@ public function add_multiple_smart_links( WP_REST_Request $request ): WP_REST_Re } else { $added_links[] = $smart_link; } + + // Clear the cache for the smart link. + $smart_link->flush_all_cache(); } // If no link was added, return an error response. @@ -468,6 +474,9 @@ public function set_smart_links( WP_REST_Request $request ): WP_REST_Response { if ( ! $found ) { $removed_links[] = $existing_link; $existing_link->delete(); + + // Clear the cache for the smart link. + $existing_link->flush_all_cache(); } } @@ -487,6 +496,9 @@ public function set_smart_links( WP_REST_Request $request ): WP_REST_Response { } $saved_links[] = $smart_link; + + // Clear the cache for the smart link. + $smart_link->flush_all_cache(); } $response = array( diff --git a/src/rest-api/content-helper/class-endpoint-traffic-boost.php b/src/rest-api/content-helper/class-endpoint-traffic-boost.php index df19a388c3..96090e8f49 100644 --- a/src/rest-api/content-helper/class-endpoint-traffic-boost.php +++ b/src/rest-api/content-helper/class-endpoint-traffic-boost.php @@ -824,6 +824,9 @@ public function accept_suggestion( WP_REST_Request $request ) { ); } + // Clear the cache for the smart link. + $inbound_link->flush_all_cache(); + return new WP_REST_Response( array( 'data' => array( diff --git a/src/rest-api/stats/class-endpoint-posts.php b/src/rest-api/stats/class-endpoint-posts.php index 37eb4459e1..0bd0ed0029 100644 --- a/src/rest-api/stats/class-endpoint-posts.php +++ b/src/rest-api/stats/class-endpoint-posts.php @@ -109,78 +109,110 @@ public function register_routes(): void { array( $this, 'get_posts' ), array_merge( array( - 'period_start' => array( + 'use_wp_permalink' => array( + 'description' => 'Whether to use the WordPress permalink.', + 'type' => 'boolean', + 'required' => false, + 'default' => false, + ), + 'period_start' => array( 'description' => 'The start of the period to query.', 'type' => 'string', 'required' => false, ), - 'period_end' => array( + 'period_end' => array( 'description' => 'The end of the period to query.', 'type' => 'string', 'required' => false, ), - 'pub_date_start' => array( + 'pub_date_start' => array( 'description' => 'The start of the publication date range to query.', 'type' => 'string', 'required' => false, ), - 'pub_date_end' => array( + 'pub_date_end' => array( 'description' => 'The end of the publication date range to query.', 'type' => 'string', 'required' => false, ), - 'limit' => array( + 'limit' => array( 'description' => 'The number of posts to return.', 'type' => 'integer', 'required' => false, 'default' => self::TOP_POSTS_DEFAULT_LIMIT, ), - 'sort' => array( + 'sort' => array( 'description' => 'The sort order of the posts.', 'type' => 'string', 'enum' => self::SORT_METRICS, 'default' => self::SORT_DEFAULT, 'required' => false, ), - 'page' => array( + 'page' => array( 'description' => 'The page to fetch.', 'type' => 'integer', 'required' => false, 'default' => 1, ), - 'author' => array( + 'author' => array( 'description' => 'Comma-separated list of authors to filter by.', 'type' => 'string', 'required' => false, 'validate_callback' => array( $this, 'validate_max_length_is_5' ), 'sanitize_callback' => array( $this, 'sanitize_string_to_array' ), ), - 'section' => array( + 'section' => array( 'description' => 'Comma-separated list of sections to filter by.', 'type' => 'string', 'required' => false, 'validate_callback' => array( $this, 'validate_max_length_is_5' ), 'sanitize_callback' => array( $this, 'sanitize_string_to_array' ), ), - 'tag' => array( + 'tag' => array( 'description' => 'Comma-separated list of tags to filter by.', 'type' => 'string', 'required' => false, 'validate_callback' => array( $this, 'validate_max_length_is_5' ), 'sanitize_callback' => array( $this, 'sanitize_string_to_array' ), ), - 'segment' => array( + 'segment' => array( 'description' => 'The segment to filter by.', 'type' => 'string', 'required' => false, ), - 'urls' => array( + 'urls' => array( 'description' => 'The URLs to fetch data for.', 'type' => 'array', 'sanitize_callback' => array( $this, 'sanitize_urls' ), 'validate_callback' => array( $this, 'validate_urls' ), 'required' => false, ), + // Optional Campaign Parameters. + 'campaign_id' => array( + 'description' => 'The campaign to filter by.', + 'type' => 'string', + 'required' => false, + ), + 'campaign_medium' => array( + 'description' => 'The medium to filter by.', + 'type' => 'string', + 'required' => false, + ), + 'campaign_source' => array( + 'description' => 'The source to filter by.', + 'type' => 'string', + 'required' => false, + ), + 'campaign_content' => array( + 'description' => 'The content to filter by.', + 'type' => 'string', + 'required' => false, + ), + 'campaign_term' => array( + 'description' => 'The term to filter by.', + 'type' => 'string', + 'required' => false, + ), ), $this->get_itm_source_param_args() ) @@ -269,33 +301,68 @@ public function get_posts( WP_REST_Request $request ) { // Setup the itm_source if it is provided. $this->set_itm_source_from_request( $request ); + // Determine if we should use the campaign parameters. + $use_campaign_params = false; + if ( isset( $params['campaign_id'] ) || + isset( $params['campaign_medium'] ) || + isset( $params['campaign_source'] ) || + isset( $params['campaign_content'] ) || + isset( $params['campaign_term'] ) ) { + $use_campaign_params = true; + } + + // If we are using the WordPress permalink, generate a canonical URL for each URL. + if ( isset( $params['use_wp_permalink'] ) && $params['use_wp_permalink'] && isset( $params['urls'] ) && is_array( $params['urls'] ) ) { + $new_urls = array(); + + foreach ( $params['urls'] as $url ) { + // Generate a canonical URL for the WordPress permalink. + $new_urls[] = \Parsely\Parsely::get_canonical_url( $url ); + + // Also append the WordPress permalink to the new URLs as a fallback. + $new_urls[] = $url; + } + + $params['urls'] = $new_urls; + } + + // Build the request params. + $request_params = array( + 'period_start' => $params['period_start'] ?? null, + 'period_end' => $params['period_end'] ?? null, + 'pub_date_start' => $params['pub_date_start'] ?? null, + 'pub_date_end' => $params['pub_date_end'] ?? null, + 'limit' => $params['limit'] ?? self::TOP_POSTS_DEFAULT_LIMIT, + 'sort' => $params['sort'] ?? self::SORT_DEFAULT, + 'page' => $params['page'] ?? 1, + 'author' => $params['author'] ?? null, + 'section' => $params['section'] ?? null, + 'tag' => $params['tag'] ?? null, + 'segment' => $params['segment'] ?? null, + 'itm_source' => $params['itm_source'] ?? null, + 'urls' => $params['urls'] ?? null, + ); + /** * The raw analytics data, received by the API. * - * @var array|WP_Error $analytics_request + * @var array>|WP_Error $analytics_request */ - $analytics_request = $this->content_api->get_posts( - array( - 'period_start' => $params['period_start'] ?? null, - 'period_end' => $params['period_end'] ?? null, - 'pub_date_start' => $params['pub_date_start'] ?? null, - 'pub_date_end' => $params['pub_date_end'] ?? null, - 'limit' => $params['limit'] ?? self::TOP_POSTS_DEFAULT_LIMIT, - 'sort' => $params['sort'] ?? self::SORT_DEFAULT, - 'page' => $params['page'] ?? 1, - 'author' => $params['author'] ?? null, - 'section' => $params['section'] ?? null, - 'tag' => $params['tag'] ?? null, - 'segment' => $params['segment'] ?? null, - 'itm_source' => $params['itm_source'] ?? null, - 'urls' => $params['urls'] ?? null, - ) - ); + $analytics_request = $this->content_api->get_posts( $request_params ); if ( is_wp_error( $analytics_request ) ) { return $analytics_request; } + // If we are using campaign parameters, fetch the additional campaign data. + if ( $use_campaign_params ) { + $analytics_request = $this->fetch_campaign_data( $analytics_request, $params, $request_params ); + + if ( is_wp_error( $analytics_request ) ) { + return $analytics_request; + } + } + // Process the data. $posts = array(); @@ -315,4 +382,101 @@ public function get_posts( WP_REST_Request $request ) { return new WP_REST_Response( $response_data, 200 ); } + + /** + * Fetches the campaign data for the posts. + * + * @since 3.18.0 + * + * @param array, array> $posts The posts. + * @param array $params The parameters. + * @param array $request_params The request parameters. + * @return array, array>|WP_Error The posts with the campaign parameters added. + */ + public function fetch_campaign_data( array $posts, array $params, array $request_params = array() ) { + $campaign_params = array(); + + // Build the campaign params for the request. + if ( isset( $params['campaign_id'] ) ) { + $campaign_params['campaign_id'] = $params['campaign_id']; + } + if ( isset( $params['campaign_medium'] ) ) { + $campaign_params['campaign_medium'] = $params['campaign_medium']; + } + if ( isset( $params['campaign_source'] ) ) { + $campaign_params['campaign_source'] = $params['campaign_source']; + } + if ( isset( $params['campaign_content'] ) ) { + $campaign_params['campaign_content'] = $params['campaign_content']; + } + if ( isset( $params['campaign_term'] ) ) { + $campaign_params['campaign_term'] = $params['campaign_term']; + } + + // Merge the campaign params with the request params. + /** @var array> $request_params_with_campaign */ + $request_params_with_campaign = array_merge( $campaign_params, $request_params ); + + $post_urls = array(); + foreach ( $posts as $post ) { + if ( ! is_string( $post['link'] ) ) { + continue; + } + + /** + * Post URL without ITM parameters. + * + * @var string $post_url + */ + $post_url = \Parsely\Parsely::get_url_with_itm_source( $post['link'], null ); + $post_urls[] = $post_url; + } + + // Fill the URLs with the campaign params. + /** @var array> $request_params_with_campaign */ + $request_params_with_campaign['urls'] = $post_urls; + + /** + * The raw analytics data, received by the API. + * + * @var array>|WP_Error $campaign_request + */ + $campaign_request = $this->content_api->get_posts( $request_params_with_campaign ); + + if ( is_wp_error( $campaign_request ) ) { + /** @var WP_Error $campaign_request */ + return $campaign_request; + } + + $posts_with_campaign_data = array(); + foreach ( $posts as $post ) { + // Find the post by URL in the campaign request. + $campaign_post = array_filter( + $campaign_request, + function ( array $item ) use ( $post ) { + return $item['link'] === $post['link']; + } + ); + + if ( array() === $campaign_post ) { + // If there are no campaign metrics available, skip this one. + $posts_with_campaign_data[] = $post; + continue; + } + + /** @var array> $campaign_post */ + $campaign_post = $campaign_post[0]; + + $post['campaign_metrics'] = array( + 'views' => $campaign_post['metrics']['views'], + 'visitors' => $campaign_post['metrics']['visitors'], + 'recirculation_rate' => $campaign_post['metrics']['recirculation_rate'], + 'avg_engaged' => $campaign_post['metrics']['avg_engaged'], + ); + + $posts_with_campaign_data[] = $post; + } + + return $posts_with_campaign_data; + } } diff --git a/src/rest-api/stats/trait-post-data.php b/src/rest-api/stats/trait-post-data.php index 374333c632..b57e78f010 100644 --- a/src/rest-api/stats/trait-post-data.php +++ b/src/rest-api/stats/trait-post-data.php @@ -101,6 +101,10 @@ protected function extract_post_data( array $item ): array { $data['visitors'] = number_format_i18n( $item['metrics']['visitors'] ); } + if ( isset( $item['metrics']['recirculation_rate'] ) ) { + $data['recirculationRate'] = number_format_i18n( $item['metrics']['recirculation_rate'], 3 ); + } + // The avg_engaged metric can be in different locations depending on the // endpoint and passed sort/url parameters. $avg_engaged = $item['metrics']['avg_engaged'] ?? $item['avg_engaged'] ?? null; @@ -116,12 +120,37 @@ protected function extract_post_data( array $item ): array { $data['title'] = $item['title']; } - if ( isset( $item['url'] ) ) { - $site_id = $this->parsely->get_site_id(); - // phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.url_to_postid_url_to_postid - $post_id = url_to_postid( $item['url'] ); // 0 if the post cannot be found. + // Handle the campaign metrics, if they exist. + if ( isset( $item['campaign_metrics'] ) && is_array( $item['campaign_metrics'] ) ) { + $data['campaign'] = array(); + + if ( isset( $item['campaign_metrics']['views'] ) ) { + $data['campaign']['views'] = number_format_i18n( $item['campaign_metrics']['views'] ); + } + + if ( isset( $item['campaign_metrics']['visitors'] ) ) { + $data['campaign']['visitors'] = number_format_i18n( $item['campaign_metrics']['visitors'] ); + } + + if ( isset( $item['campaign_metrics']['recirculation_rate'] ) ) { + $data['campaign']['recirculationRate'] = number_format_i18n( $item['campaign_metrics']['recirculation_rate'], 3 ); + } + + if ( isset( $item['campaign_metrics']['avg_engaged'] ) ) { + $data['campaign']['avgEngaged'] = Utils::get_formatted_duration( (float) $item['campaign_metrics']['avg_engaged'] ); + } + } + if ( isset( $item['url'] ) ) { + $site_id = $this->parsely->get_site_id(); + $post_id = Utils::get_post_id_by_url( $item['url'] ); $post_url = Parsely::get_url_with_itm_source( $item['url'], null ); + + // If we have a post ID, update the post canonical URL. + if ( 0 !== $post_id ) { + Parsely::set_canonical_url( $post_id, $post_url ); + } + if ( Utils::parsely_is_https_supported() ) { $post_url = str_replace( 'http://', 'https://', $post_url ); } diff --git a/src/services/class-cached-service-endpoint.php b/src/services/class-cached-service-endpoint.php index debdb63d9b..2c04510dd1 100644 --- a/src/services/class-cached-service-endpoint.php +++ b/src/services/class-cached-service-endpoint.php @@ -12,6 +12,8 @@ use WP_Error; +use const Parsely\PARSELY_CACHE_GROUP; + /** * Cached Service Endpoint class. * @@ -23,15 +25,6 @@ * @phpstan-import-type WP_HTTP_Request_Args from Base_Service_Endpoint */ class Cached_Service_Endpoint extends Base_Service_Endpoint { - /** - * The cache group for the API requests. - * - * @since 3.17.0 - * - * @var string - */ - private const CACHE_GROUP = 'wp-parsely'; - /** * The service endpoint object. * @@ -75,13 +68,9 @@ public function __construct( Base_Service_Endpoint $service_endpoint, int $cache */ private function get_cache_key( array $args ): string { $api_service = $this->service_endpoint->api_service; + $identifier = sprintf( '%s-%s-%s', $api_service->get_api_url(), $this->get_endpoint(), (string) wp_json_encode( $args ) ); - $cache_key = 'parsely_api_' . - wp_hash( $api_service->get_api_url() ) . '_' . - wp_hash( $this->get_endpoint() ) . '_' . - wp_hash( (string) wp_json_encode( $args ) ); - - return $cache_key; + return sprintf( 'parsely-api-%s', hash( 'sha256', $identifier ) ); } /** @@ -97,7 +86,7 @@ private function get_cache_key( array $args ): string { */ public function call( array $args = array() ) { $cache_key = $this->get_cache_key( $args ); - $cache = wp_cache_get( $cache_key, self::CACHE_GROUP ); + $cache = wp_cache_get( $cache_key, PARSELY_CACHE_GROUP ); if ( false !== $cache ) { // @phpstan-ignore-next-line @@ -107,7 +96,7 @@ public function call( array $args = array() ) { $response = $this->service_endpoint->call( $args ); if ( ! is_wp_error( $response ) ) { - wp_cache_set( $cache_key, $response, self::CACHE_GROUP, $this->cache_ttl ); // phpcs:ignore + wp_cache_set( $cache_key, $response, PARSELY_CACHE_GROUP, $this->cache_ttl ); // phpcs:ignore } return $response; diff --git a/src/services/content-api/class-content-api-service.php b/src/services/content-api/class-content-api-service.php index 7ca866c4fd..bcc1f4f117 100644 --- a/src/services/content-api/class-content-api-service.php +++ b/src/services/content-api/class-content-api-service.php @@ -188,7 +188,7 @@ public function get_related_posts_with_uuid( string $uuid, array $params = array * * @link https://docs.parse.ly/api-analytics-endpoint/#1-get-analytics-posts * - * @param array $params The parameters to pass to the API request. + * @param array> $params The parameters to pass to the API request. * @return array|WP_Error Returns the posts analytics or a WP_Error object in case of an error. */ public function get_posts( array $params = array() ) { diff --git a/tests/Integration/Endpoints/RestMetadataTest.php b/tests/Integration/Endpoints/RestMetadataTest.php index e369adbbf0..150c95b985 100644 --- a/tests/Integration/Endpoints/RestMetadataTest.php +++ b/tests/Integration/Endpoints/RestMetadataTest.php @@ -195,15 +195,24 @@ public function test_get_callback(): void { $post_id = self::factory()->post->create(); // Go to current post to update WP_Query with correct data. - $this->go_to( (string) $this->get_permalink( $post_id ) ); - - $meta_object = self::$rest->get_callback( $this->get_post_in_array( $post_id ) ); - $metadata = new Metadata( self::$parsely ); - $expected = array( - 'version' => '1.1.0', - 'meta' => $metadata->construct_metadata( $this->get_post( $post_id ) ), - 'rendered' => self::$rest->get_rendered_meta( 'json_ld' ), - 'tracker_url' => 'https://cdn.parsely.com/keys/testkey/p.js', + $permalink = (string) $this->get_permalink( $post_id ); + $this->go_to( $permalink ); + + $meta_object = self::$rest->get_callback( $this->get_post_in_array( $post_id ) ); + $metadata = new Metadata( self::$parsely ); + $canonical_url = \Parsely\Parsely::get_canonical_url( $permalink ); + + $expected = array( + 'version' => '1.1.0', + 'canonical_url' => $canonical_url, + 'smart_links' => array( + 'inbound' => 0, + 'outbound' => 0, + ), + 'traffic_boost_suggestions_count' => 0, + 'meta' => $metadata->construct_metadata( $this->get_post( $post_id ) ), + 'rendered' => self::$rest->get_rendered_meta( 'json_ld' ), + 'tracker_url' => 'https://cdn.parsely.com/keys/testkey/p.js', ); self::assertSame( $expected, $meta_object ); @@ -252,12 +261,20 @@ public function test_get_callback_with_filter(): void { self::set_options( array( 'apikey' => 'testkey' ) ); $post_id = self::factory()->post->create(); - $meta_object = self::$rest->get_callback( $this->get_post_in_array( $post_id ) ); - $metadata = new Metadata( self::$parsely ); - $expected = array( - 'version' => '1.1.0', - 'meta' => $metadata->construct_metadata( $this->get_post( $post_id ) ), - 'tracker_url' => 'https://cdn.parsely.com/keys/testkey/p.js', + $meta_object = self::$rest->get_callback( $this->get_post_in_array( $post_id ) ); + $metadata = new Metadata( self::$parsely ); + $canonical_url = \Parsely\Parsely::get_canonical_url( (string) $this->get_permalink( $post_id ) ); + + $expected = array( + 'version' => '1.1.0', + 'canonical_url' => $canonical_url, + 'smart_links' => array( + 'inbound' => 0, + 'outbound' => 0, + ), + 'traffic_boost_suggestions_count' => 0, + 'meta' => $metadata->construct_metadata( $this->get_post( $post_id ) ), + 'tracker_url' => 'https://cdn.parsely.com/keys/testkey/p.js', ); self::assertSame( $expected, $meta_object ); @@ -307,14 +324,23 @@ public function test_get_callback_with_url_filter(): void { $post_id = self::factory()->post->create(); // Go to current post to update WP_Query with correct data. - $this->go_to( (string) $this->get_permalink( $post_id ) ); - - $meta_object = self::$rest->get_callback( $this->get_post_in_array( $post_id ) ); - $metadata = new Metadata( self::$parsely ); - $expected = array( - 'version' => '1.1.0', - 'meta' => $metadata->construct_metadata( $this->get_post( $post_id ) ), - 'rendered' => self::$rest->get_rendered_meta( 'json_ld' ), + $permalink = (string) $this->get_permalink( $post_id ); + $this->go_to( $permalink ); + + $meta_object = self::$rest->get_callback( $this->get_post_in_array( $post_id ) ); + $metadata = new Metadata( self::$parsely ); + $canonical_url = \Parsely\Parsely::get_canonical_url( $permalink ); + + $expected = array( + 'version' => '1.1.0', + 'canonical_url' => $canonical_url, + 'smart_links' => array( + 'inbound' => 0, + 'outbound' => 0, + ), + 'traffic_boost_suggestions_count' => 0, + 'meta' => $metadata->construct_metadata( $this->get_post( $post_id ) ), + 'rendered' => self::$rest->get_rendered_meta( 'json_ld' ), ); self::assertSame( $expected, $meta_object ); @@ -337,10 +363,13 @@ public function test_get_callback_with_url_filter(): void { public function test_get_callback_with_non_existent_post(): void { $meta_object = self::$rest->get_callback( array() ); $expected = array( - 'version' => '1.1.0', - 'meta' => '', - 'rendered' => '', - 'tracker_url' => '', + 'version' => '1.1.0', + 'canonical_url' => 'no permalink', + 'smart_links' => array( + 'inbound' => 0, + 'outbound' => 0, + ), + 'traffic_boost_suggestions_count' => 0, ); self::assertSame( $expected, $meta_object ); @@ -388,7 +417,11 @@ public function test_get_rendered_meta_json_ld(): void { TestCase::set_options(); global $post; - /** @var int $post_id */ + /** + * Post ID for test. + * + * @var int $post_id + */ $post_id = self::factory()->post->create( array( 'post_title' => 'My test_get_rendered_meta_json_ld title', @@ -452,7 +485,11 @@ public function test_get_rendered_repeated_metas(): void { self::set_options( array( 'apikey' => 'testkey' ) ); - /** @var int $post_id */ + /** + * Post ID for test. + * + * @var int $post_id + */ $post_id = self::factory()->post->create( array( 'post_title' => 'My test_get_rendered_repeated_metas title', diff --git a/tests/Integration/RestAPI/Stats/EndpointPostsTest.php b/tests/Integration/RestAPI/Stats/EndpointPostsTest.php index 0cde8e31f9..de9f235a32 100644 --- a/tests/Integration/RestAPI/Stats/EndpointPostsTest.php +++ b/tests/Integration/RestAPI/Stats/EndpointPostsTest.php @@ -324,10 +324,11 @@ function () use ( &$dispatched ): array { self::assertEquals( array( - 'limit' => 5, - 'sort' => 'views', - 'page' => 1, - 'itm_source' => 'wp-parsely-content-helper', + 'limit' => 5, + 'sort' => 'views', + 'page' => 1, + 'itm_source' => 'wp-parsely-content-helper', + 'use_wp_permalink' => false, ), $response_data['params'] ); diff --git a/tests/Integration/bootstrap.php b/tests/Integration/bootstrap.php index 5c373d015e..3a5e300abd 100644 --- a/tests/Integration/bootstrap.php +++ b/tests/Integration/bootstrap.php @@ -51,6 +51,7 @@ // constants here. // phpcs:ignore Universal.Namespaces.DisallowCurlyBraceSyntax.Forbidden, Universal.Namespaces.OneDeclarationPerFile.MultipleFound namespace Parsely { - const PARSELY_VERSION = '123456.78.9'; - const PARSELY_FILE = __DIR__ . '/../../wp-parsely.php'; + const PARSELY_VERSION = '123456.78.9'; + const PARSELY_FILE = __DIR__ . '/../../wp-parsely.php'; + const PARSELY_CACHE_GROUP = 'wp-parsely'; } diff --git a/wp-parsely.php b/wp-parsely.php index 752ea3593c..ff613ed3b2 100644 --- a/wp-parsely.php +++ b/wp-parsely.php @@ -52,6 +52,7 @@ const PARSELY_VERSION = '3.18.1'; const PARSELY_FILE = __FILE__; const PARSELY_DATA_SCHEMA_VERSION = '1'; +const PARSELY_CACHE_GROUP = 'wp-parsely'; if ( file_exists( __DIR__ . '/vendor/autoload.php' ) ) { require_once __DIR__ . '/vendor/autoload.php';