8889841cPK0[x6 !AddonsAdminPage.phpnu[getAddons(), [ 'assetsUrl' => GIVE_PLUGIN_URL . 'assets/dist/', 'containerId' => $this->containerId, 'siteUrl' => site_url(), 'siteName' => get_bloginfo('name'), ] ); EnqueueScript::make('give-in-plugin-upsells-addons', 'assets/dist/js/admin-upsell-addons-page.js') ->loadInFooter() ->registerTranslations() ->registerLocalizeData('GiveAddons', $data) ->enqueue(); wp_enqueue_style('givewp-admin-fonts'); } /** * Render admin page */ public function render() { echo ''; echo "
containerId}\">
"; } /** * Helper function to determine if current page is Give Add-ons admin page * * @return bool */ public static function isShowing() { return isset($_GET['page']) && $_GET['page'] === 'give-add-ons'; } } PK0[ `LegacyFormEditor.phpnu[ esc_url_raw(rest_url('give-api/v2')), 'apiNonce' => wp_create_nonce('wp_rest'), ]; EnqueueScript::make( 'give-in-plugin-upsells-legacy-form-editor', 'assets/dist/js/donation-options.js' ) ->loadInFooter() ->registerTranslations() ->registerLocalizeData('GiveLegacyFormEditor', $data) ->enqueue(); } /** * * @since 2.27.1 * */ public function renderDonationOptionsRecurringRecommendation() { $isDismissed = get_option('givewp_form_editor_donation_options_recurring_recommendation', false); $recurringAddonIsActive = Utils::isPluginActive('give-recurring/give-recurring.php'); if ($recurringAddonIsActive | $isDismissed) { return; } require_once GIVE_PLUGIN_DIR . 'src/Promotions/InPluginUpsells/resources/views/donation-options-form-editor.php'; } /** * * @since 2.27.1 * */ public static function isShowing(): bool { $queryParameters = $_GET; if (isset($queryParameters['action']) && $queryParameters['action'] === 'edit' && $queryParameters['post']) { return true; } return false; } } PK0[R}}AddonsRepository.phpnu[endpoint, [ 'headers' => [ 'Content-Type' => 'application/json', ], ]); if (is_wp_error($request)) { return []; } $body = wp_remote_retrieve_body($request); if (empty($body)) { return []; } $json = json_decode($body, true); // Sanitize JSON array_walk_recursive($json, function (&$item) { $item = wp_kses($item, [ 'strong' => [], ]); }); return $json; } /** * @return array */ public function getAddons() { $cache = get_transient($this->transient); if (false === $cache) { $addons = $this->fetchAddons(); set_transient( $this->transient, serialize($addons), DAY_IN_SECONDS ); return $addons; } return unserialize($cache); } } PK0[!Endpoints/HideSaleBannerRoute.phpnu[endpoint, [ [ 'methods' => 'POST', 'callback' => [$this, 'handleRequest'], 'permission_callback' => 'is_user_logged_in', 'args' => [ 'id' => [ 'type' => 'string', 'required' => true, ], ], ], ] ); } /** * @param WP_REST_Request $request * * @return WP_REST_Response */ public function handleRequest(WP_REST_Request $request) { give(SaleBanners::class)->hideBanner( $request->get_param('id') . get_current_user_id() ); return new WP_REST_Response(); } } PK0[S^]/ / )Endpoints/ProductRecommendationsRoute.phpnu[endpoint, [ [ 'methods' => ['POST'], 'callback' => [$this, 'handleRequest'], 'permission_callback' => [$this, 'permissionsCheck'], 'args' => [ 'option' => [ 'type' => 'string', 'required' => true, 'enum' => [ 'givewp_donations_recurring_recommendation_dismissed', 'givewp_donations_fee_recovery_recommendation_dismissed', 'givewp_donations_designated_funds_recommendation_dismissed', 'givewp_reports_recurring_recommendation_dismissed', 'givewp_reports_fee_recovery_recommendation_dismissed', 'givewp_donors_fee_recovery_recommendation_dismissed', 'givewp_form_editor_donation_options_recurring_recommendation', 'givewp_payment_gateway_fee_recovery_recommendation', ], ], ], ], ] ); } /** * @since 2.27.1 */ public function permissionsCheck() { if ( ! current_user_can('manage_options')) { return new WP_Error( 'rest_forbidden', esc_html__('You don\'t have permission to dismiss options. Only users with the "manage_options" capability can perform this action.', 'give'), ['status' => $this->authorizationStatusCode()] ); } return true; } /** * Sets up the proper HTTP status code for authorization. * @since 2.27.1 * * @return int */ public function authorizationStatusCode() { if (is_user_logged_in()) { return 403; } return 401; } /** * @since 2.27.1 * * @param WP_REST_Request $request * * @return WP_REST_Response */ public function handleRequest(WP_REST_Request $request) { update_option($request->get_param('option'), time()); return new WP_REST_Response(['option_updated' => $request->get_param('option')]); } } PK0[ ZPaymentGateways.phpnu[ esc_url_raw(rest_url('give-api/v2')), 'apiNonce' => wp_create_nonce('wp_rest'), ]; EnqueueScript::make( 'give-in-plugin-upsells-payment-gateway', 'assets/dist/js/payment-gateway.js' ) ->loadInFooter() ->registerTranslations() ->registerLocalizeData('GiveSettings', $data) ->enqueue(); } /** * * @since 2.27.1 * */ public function renderPaymentGatewayRecommendation() { $isDismissed = get_option('givewp_payment_gateway_fee_recovery_recommendation', false); $feeRecoveryIsActive = Utils::isPluginActive('give-fee-recovery/give-fee-recovery.php'); if ($feeRecoveryIsActive | $isDismissed) { return; } require_once GIVE_PLUGIN_DIR . 'src/Promotions/InPluginUpsells/resources/views/payment-gateway.php'; } /** * * @since 2.27.1 * */ public static function isShowing(): bool { $isGatewaysTab = isset($_GET['tab']) && $_GET['tab'] === 'gateways'; $isGiveFormsPostType = isset($_GET['post_type']) && $_GET['post_type'] === 'give_forms'; return $isGiveFormsPostType && $isGatewaysTab; } } PK0[CSaleBanners.phpnu[hiddenBanners = get_option($this->optionName, []); } /** * Get banners definitions * * @since 2.23.2 add Giving Tuesday 2022 banner * @since 2.17.0 * * @note id must be unique for each definition */ public function getBanners(): array { return [ [ 'id' => 'bfgt2021', 'iconURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/sale-icon.png', 'accessibleLabel' => __('Black Friday/Giving Tuesday Sale', 'give'), 'leadText' => __('Save 40% on all Plans for a limited time.', 'give'), 'contentText' => __('Black Friday through Giving Tuesday.', 'give'), 'actionText' => __('Shop Now', 'give'), 'actionURL' => 'https://go.givewp.com/bfgt21', 'startDate' => '2021-11-26 00:00', 'endDate' => '2021-11-30 23:59', ], [ 'id' => 'bfgt2022', 'iconURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/sale-icon.png', 'accessibleLabel' => __('Black Friday/Giving Tuesday Sale', 'give'), 'leadText' => __('Save 40% on all Plans for a limited time.', 'give'), 'contentText' => __('Black Friday through Giving Tuesday.', 'give'), 'actionText' => __('Shop Now', 'give'), 'actionURL' => 'https://go.givewp.com/bf22', 'startDate' => '2022-11-01 00:00', 'endDate' => '2022-11-29 23:59', ], ]; } /** * Get the banners that should be displayed. * * @since 2.17.0 */ public function getVisibleBanners(): array { $currentDateTime = current_datetime(); $currentUserId = get_current_user_id(); $giveWPWebsiteTimezone = new DateTimeZone('America/Los_Angeles'); return array_filter( $this->getBanners(), function ($banner) use ($currentDateTime, $currentUserId, $giveWPWebsiteTimezone) { $isHidden = in_array($banner['id'] . $currentUserId, $this->hiddenBanners, true); try { $isFuture = $currentDateTime < new DateTimeImmutable($banner['startDate'], $giveWPWebsiteTimezone); $isPast = $currentDateTime > new DateTimeImmutable($banner['endDate'], $giveWPWebsiteTimezone); } catch(Exception $exception) { return false; } return !($isHidden || $isFuture || $isPast); } ); } /** * Marks the given banner id as hidden for the current user so it will not display again. * * @since 2.17.0 * * @return void */ public function hideBanner(string $banner) { $this->hiddenBanners[] = $banner; update_option( $this->optionName, array_unique($this->hiddenBanners) ); } /** * Render admin page * * @since 2.17.0 */ public function render() { $banners = $this->getVisibleBanners(); if (!empty($banners)) { include __DIR__ . '/resources/views/sale-banners.php'; } } /** * Load scripts * * @since 2.17.0 */ public function loadScripts() { wp_enqueue_script( 'give-in-plugin-upsells-sale-banners', GIVE_PLUGIN_URL . 'assets/dist/js/admin-upsell-sale-banner.js', [], GIVE_VERSION, true ); wp_localize_script( 'give-in-plugin-upsells-sale-banners', 'GiveSaleBanners', [ 'apiRoot' => esc_url_raw(rest_url('give-api/v2/sale-banner')), 'apiNonce' => wp_create_nonce('wp_rest'), ] ); wp_enqueue_style('givewp-admin-fonts'); } /** * Helper function to determine if the current page Give admin page * * @since 2.17.0 */ public static function isShowing(): bool { return isset($_GET['post_type']) && $_GET['post_type'] === 'give_forms'; } } PK0[ e#resources/views/payment-gateway.phpnu[
light-bulb-icon

'; _e( 'Dramatically reduce the impact of gateway credit card processing fees by providing donors the option to cover that cost regardless of the gateway selected.', 'give' ); echo '

'; _e('Recover your fees'); echo 'external-link
'; ?> PK0[ resources/views/sale-banners.phpnu[ PK0[dVV0resources/views/donation-options-form-editor.phpnu[
light-bulb-icon

'; _e( 'Did you know? You can provide donors with flexible recurring donation options! Recurring donors give up to 30% more.', 'give' ); echo '

'; _e('Get more donations'); echo 'external-link
'; ?> PK0[kOO!resources/js/addons-admin-page.jsnu[import {render} from 'react-dom'; import {AddonsAdminPage} from './components/AddonsAdminPage'; const searchParams = new URLSearchParams(window.location.search); const startingTab = parseInt(searchParams.get('tab')) || 0; render(, document.getElementById(window.GiveAddons.containerId)); PK0[ad!resources/js/components/Button.jsnu[import cx from 'classnames'; import styles from './Button.module.css'; export const Button = ({as: Element = 'button', className, ...props}) => ( ); PK0[e;::resources/js/components/Hero.jsnu[import cx from 'classnames'; import styles from './Hero.module.css'; export const Hero = ({heading, description, className = null}) => (

{heading}

{description}

); PK0[@+resources/js/components/AdditionalAddons.jsnu[import {__} from '@wordpress/i18n'; import {AdditionalAddonCard} from './AdditionalAddonCard'; import {Button} from './Button'; import {Hero} from './Hero'; import styles from './AdditionalAddons.module.css'; const {heading, description, addons, addonButtonCaption, allAddonsUrl} = window.GiveAddons.additionalAddons; export const AdditionalAddons = () => (
    {addons.map(({name, image, description, url}) => (
  • ))}

View the entire catalog!', 'give'), }} />

); PK0[8)resources/js/components/Button.module.cssnu[.button { appearance: none; display: block; padding: 0.888em; border-radius: 9999px; border-width: 0.125rem; border-style: solid; border-color: #66bb6a; background-color: #66bb6a; color: #fff; font-weight: 700; font-size: 1.125rem; text-align: center; text-decoration: none; line-height: 1; letter-spacing: -0.0278em; transition-duration: 200ms; transition-property: filter, color, background-color, text-shadow, box-shadow; transition-timing-function: ease; } .button:hover, .button:active, .button:focus { text-shadow: 0 0 0.125em rgba(0, 0, 0, 0.3); filter: brightness(115%); color: #fff; } .button:focus { box-shadow: 0 0 0.0625em 0.25em rgba(102, 187, 106, 0.4); } PK0[j 'resources/js/components/PricingPlans.jsnu[import {PricingPlanCard} from './PricingPlanCard'; import {Hero} from './Hero'; import styles from './PricingPlans.module.css'; const {heading, description, plansButtonCaption, plans} = window.GiveAddons.pricingPlans; export const PricingPlans = () => (
    {plans.map((plan) => (
  • ))}
); PK0[c *resources/js/components/AddonsAdminPage.jsnu[import {useMemo, useState} from 'react'; import {Tabs, TabList, Tab, TabPanels, TabPanel} from '@reach/tabs'; import {__, sprintf} from '@wordpress/i18n'; import {MustHaveAddons} from './MustHaveAddons'; import {AdditionalAddons} from './AdditionalAddons'; import {PricingPlans} from './PricingPlans'; import {FreeAddOnTab} from './FreeAddOnTab'; import {assetUrl} from '../utils'; import styles from './AddonsAdminPage.module.css'; export function AddonsAdminPage({startingTab = 0}) { // We control the tabs only so we can use `tabIndex` to change the decor. const [tabIndex, setTabIndex] = useState(startingTab); const addonDecorAssets = useMemo( () => [ 'images/addons-admin-page-decor-1.png', 'images/addons-admin-page-decor-2.png', 'images/addons-admin-page-decor-3.png', 'images/addons-admin-page-decor-4.png', ].map(assetUrl), [] ); return (

{__('GiveWP',

); } PK0[zresources/js/components/Card.jsnu[import cx from 'classnames'; import styles from './Card.module.css'; export const Card = ({as: Element = 'div', className, ...props}) => ( ); PK0[Xh 1resources/js/components/MustHaveAddons.module.cssnu[.grid { box-sizing: border-box; display: grid; gap: 2.75rem; grid-template-columns: 1fr; grid-auto-rows: 1fr; margin: 0; } @media screen and (min-width: 48rem) { .grid { grid-template-columns: repeat(2, 1fr); } } @media screen and (min-width: 64rem) { .grid { grid-template-columns: repeat(3, 1fr); } } .grid > li, .grid > li > * { height: 100%; } PK0[)T~4resources/js/components/MustHaveAddonCard.module.cssnu[.card { display: flex; flex-direction: column; gap: 1rem; padding: 1.5rem; } .header { display: flex; align-items: center; gap: 0.8125rem; } .header svg { flex: none; } .title { margin: 0; font-size: 0.9375rem; font-weight: 700; } .description { margin: 0; font-weight: 600; font-size: 0.9375rem; } .image { margin-left: -1.5rem; margin-right: -1.5rem; width: calc(100% + 3rem); height: auto; } .features { flex-grow: 1; } .feature { display: flex; gap: 0.5em; font-size: 0.9375rem; line-height: 1.5; } .checkmark { flex-shrink: 0; display: inline; /* Make it square */ width: 1em; height: 1em; /* Offset the top half-leading of line-height to (almost) align with the top of the text. */ position: relative; top: 0.25em; color: #66bb6a; } .button { align-self: center; width: 93.75%; } PK0[dd'resources/js/components/Card.module.cssnu[.card { border-radius: 1rem; border: 0.0625rem solid #e2e2e2; background-color: #fff; } PK0[u'resources/js/components/FreeAddOnTab.jsnu[import {useRef} from 'react'; import cx from 'classnames'; import GreenButton from '@givewp/promotions/components/GreenButton'; import useFreeAddonSubscription from '@givewp/promotions/hooks/useFreeAddonSubscription'; import styles from './FreeAddOnTab.module.css'; import {Hero} from './Hero'; import {Card} from './Card'; import {transformStrong} from '../utils'; const {heading, description, reports, form} = window.GiveAddons.freeAddon; const {siteUrl, siteName} = window.GiveAddons; export const FreeAddOnTab = () => { const {userSubscribed, hasSubscriptionError, subscribeUser} = useFreeAddonSubscription(); const firstNameInput = useRef(); const emailInput = useRef(); const handleSubscribe = async (event) => { event.preventDefault(); await subscribeUser(firstNameInput.current.value, emailInput.current.value, siteUrl, siteName); }; return (

{reports.heading} {reports.heading}

{reports.description.map((text, index) => (

))}
{userSubscribed ? ( {form.submissionConfirmation} ) : ( <> {hasSubscriptionError && (
There was an issue submitting your information. Please try again. If the problem persists, try refreshing the page. If it still doesn't work, please{' '} contact support.
)}
{form.disclaimer} )}
); }; PK0[jc c 2resources/js/components/PricingPlanCard.module.cssnu[.card { display: grid; row-gap: 1.25rem; max-width: 51rem; padding: 2rem 5.75rem 2rem 2rem; } @media screen and (min-width: 64rem) { .card { column-gap: 5.25rem; grid-auto-flow: column; grid-template-columns: 5fr 3fr; } } .icon { width: 2.625rem; height: 2.625rem; } .title { display: inline-flex; gap: 0.6em; align-items: center; margin: 0; font-weight: 700; font-size: 1.4375rem; line-height: 1.36; } .description { font-size: 1rem; line-height: 1.5; } .description strong { color: #69b86b; font-weight: 700; } .actionAndSavings { display: flex; column-gap: 1rem; margin-top: 1.75rem; align-items: center; } .button { flex-basis: 16rem; } .savings { color: #fdb244; font-size: 0.875rem; font-weight: 700; line-height: 1.7; } .includes { font-size: 0.875rem; font-weight: 700; line-height: 1.36; } .includesLabel { margin-top: 0.9rem; letter-spacing: 0.05em; text-transform: uppercase; font-weight: inherit; } .includesList { display: grid; gap: 1em; margin: 0; padding: 0; } .includesMoreText { margin-top: 0.5em; margin-bottom: 0; text-decoration: underline; } .include { display: flex; gap: 1em; align-items: center; } .include a { color: inherit; text-decoration: underline; } .include a:hover { text-decoration: none; } .include a:focus { box-shadow: none; outline: 0.25em solid rgba(102, 187, 106, 0.7); outline-offset: 0.5em; } .include em { color: #69b86b; } .includeIcon { width: 2.5rem; height: 2.5rem; } .nameAndFlag { display: flex; gap: 2rem; align-items: center; margin-bottom: 1.75rem; } .mostPopularFlag { flex-grow: 0; display: flex-inline; padding: 0.5em 1em 0.5em 2em; background-image: linear-gradient(225.34deg, #ff7f7f 0%, #ddcd13 101.17%); mask-image: url("data:image/svg+xml;utf-8,"); mask-position: top left; mask-repeat: no-repeat; mask-size: auto 100%; box-shadow: 0 0 0.333em rgba(0, 0, 0, 0.15); color: white; font-weight: 700; font-size: 0.75rem; line-height: 1.33; text-transform: uppercase; text-shadow: 0 0 0.333em rgba(0, 0, 0, 0.25); } PK0[bJJ.resources/js/components/AdditionalAddonCard.jsnu[import {Button} from './Button'; import {Card} from './Card'; import styles from './AdditionalAddonCard.module.css'; export const AdditionalAddonCard = ({name, description, image, actionLink, actionText}) => (

{name}

{description}

); PK0[dOII6resources/js/components/AdditionalAddonCard.module.cssnu[.card { display: grid; gap: 1rem; padding: 2.25rem 1.5rem; } .image { justify-self: center; width: 6.8125rem; height: 6.8125rem; } .title { margin: 0; font-size: 1.125rem; font-weight: 700; line-height: 1.36; text-align: center; } .image + .title { margin-top: 0.7rem; } .description { margin: 0; font-size: 0.9375rem; line-height: 1.6; text-align: center; } .title + .description { margin-top: 0.25rem; } .button { margin-top: 3.3125rem; align-self: end; justify-self: center; width: 93.75%; } PK0[$^kk,resources/js/components/MustHaveAddonCard.jsnu[import {Button} from './Button'; import {Card} from './Card'; import styles from './MustHaveAddonCard.module.css'; export const MustHaveAddonCard = ({name, description, icon, image, features, actionLink, actionText}) => (

{name}

{description}

    {features.map((feature) => (
  • {feature}
  • ))}
); PK0[h)resources/js/components/MustHaveAddons.jsnu[import {__} from '@wordpress/i18n'; import {MustHaveAddonCard} from './MustHaveAddonCard'; import {Hero} from './Hero'; import styles from './MustHaveAddons.module.css'; const {addonButtonCaption, addons, description, heading} = window.GiveAddons.mustHaveAddons; export const MustHaveAddons = () => (
    {addons.map(({name, description, url, icon, image, features}) => (
  • ))}
); PK0[o 2resources/js/components/AddonsAdminPage.module.cssnu[:global(.post-type-give_forms #wpbody) { padding-left: 0; } :global(.post-type-give_forms #wpbody:after) { all: unset !important; } :global(#wpbody-content) { padding-bottom: 0; } .root, .root *, .root ::before, .root ::after { box-sizing: border-box; } .root { height: 100%; padding-bottom: 6rem; background-color: #fff; background-image: var(--decor); background-position: top right; background-repeat: no-repeat; background-size: 22.875rem 10.3125rem; color: #333; font-family: 'Open Sans', system-ui, sans-serif; transition-property: background-image; /* This delay (ideally) reduces the flicker from the first time a new decor image loads */ transition-delay: 50ms; transition-duration: 500ms; transition-timing-function: ease-in-out; } .header { display: grid; gap: 1.5rem; padding-top: 1.5rem; border-bottom: 0.0625rem solid #eaeaea; position: relative; } .container { padding-left: 2rem; padding-right: 2rem; max-width: 64.875rem; width: 100%; margin: 0 auto; } .logo { height: 3.75rem; } .sourceNotice { position: absolute; top: 0.75rem; color: #556e79; font-weight: 600; font-size: 0.8125rem; line-height: 1.36; } @media screen and (min-width: 48rem) { .sourceNotice { right: 15.625rem; } } .sourceNotice a { color: #69b86b; text-decoration: none; } .sourceNotice a::after { position: relative; top: 0.2em; display: inline-block; content: ''; height: 1em; width: 1em; margin-left: 0.3125rem; background-repeat: no-repeat; background-image: url("data:image/svg+xml,%3Csvg width='10' height='10' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8.438 6.25h-.626a.312.312 0 0 0-.312.313V8.75H1.25V2.5h2.813a.312.312 0 0 0 .312-.313v-.624a.312.312 0 0 0-.313-.313H.938A.937.937 0 0 0 0 2.188v6.874A.937.937 0 0 0 .938 10h6.875a.937.937 0 0 0 .937-.938v-2.5a.312.312 0 0 0-.313-.312ZM9.53 0h-2.5A.47.47 0 0 0 6.7.8l.698.699-4.76 4.758a.469.469 0 0 0 0 .664l.442.442a.469.469 0 0 0 .665 0l4.758-4.76.697.698A.47.47 0 0 0 10 2.969v-2.5A.469.469 0 0 0 9.531 0Z' fill='%2369b86b'/%3E%3C/svg%3E"); } .tabs { display: flex; gap: 2.25rem; } .tabs [data-reach-tab] { position: relative; appearance: none; padding: 1em; border: 0; background-color: transparent; color: inherit; font-weight: 600; font-size: 0.8rem; cursor: pointer; } @media screen and (min-width: 48rem) { .tabs [data-reach-tab] { font-size: 1rem; } } .tabs [data-reach-tab]::after { content: ''; display: block; position: absolute; top: calc(100% - 0.1875em); width: calc(100% - 2em); height: 0.1875em; background-color: transparent; transition: background-color 100ms ease-in-out; } .tabs [data-reach-tab][aria-selected='true']::after { background-color: #66bb6a; } PK0[M==3resources/js/components/AdditionalAddons.module.cssnu[.addons { display: grid; grid-template-columns: 1fr; grid-template-rows: 1fr; gap: 2.5625rem; } @media screen and (min-width: 48rem) { .addons { grid-template-columns: repeat(2, 1fr); } } @media screen and (min-width: 64rem) { .addons { grid-template-columns: repeat(3, 1fr); } } .addons > li, .addons > li > * { height: 100%; } .viewAll { margin-top: 4.625rem; display: grid; gap: 2rem; justify-items: center; text-align: center; } .viewAllText { margin: 0; font-size: 1.125rem; line-height: 1.444; } .viewAllButton { width: min(17.75rem, 100%); border-color: #444; background-color: #fff; color: #444; } .viewAllButton:hover, .viewAllButton:active, .viewAllButton:focus { filter: none; background-color: #444; } PK0[`ԍ /resources/js/components/FreeAddOnTab.module.cssnu[.freeAddonSection { display: flex; flex-direction: column; align-items: center; } .card { display: grid; row-gap: 1.25rem; max-width: 51rem; padding: 1.5rem 2rem; } @media screen and (min-width: 64rem) { .card { column-gap: 5.25rem; grid-auto-flow: column; grid-template-columns: 5fr 4fr; } } .emailReports { background-color: #F6F9FC; } .description p { font-size: 1rem; } .description strong { color: #D75A4B; font-style: italic; font-weight: 800; } .icon { width: 2.5rem; height: 2.5rem; } .title { display: inline-flex; gap: 1.1em; align-items: flex-end; margin: 0; font-weight: 700; font-size: 1.4375rem; line-height: 1.36; } .nameAndFlag { display: flex; gap: 1rem; align-items: center; margin-bottom: 0.875rem; } .includes { font-size: 0.875rem; font-weight: 700; line-height: 1.36; } .includes > h4 { text-transform: uppercase; } .informationHero { display: block; padding-top: 3rem; padding-bottom: 1.5rem; } .informationHero h2 { font-size: 1.65rem; } .formCard { background-color: #F3F2EC; display: flex; flex-direction: column; row-gap: 2.75rem; padding: 3rem 4rem; width: 100%; max-width: 50.875rem; } .formCard form { display: flex; flex-direction: column; align-items: center; row-gap: 2rem; } .formCard__thankYou { font-size: 1rem; text-align: center; } .formCard__inputs { width: 100%; display: flex; flex-direction: row; justify-content: space-between; } .formCard label { display: flex; flex-direction: column; font-size: 1rem; font-weight: 400; } .formCard label span { padding-left: 0.3rem; margin-bottom: 0.2rem; } .formCard input:where([type="text"], [type="email"]) { width: 20rem; height: 3.1rem; border: 0; background-color: white; box-shadow: inset 0 4px 4px rgba(0, 0, 0, 0.1); padding: 0 0.5rem; } .formCard input[type="submit"] { padding: 1rem 0; width: 100%; text-transform: uppercase; } @media screen and (max-width: 64rem) { .formCard__inputs { flex-direction: column; row-gap: 2rem; } .formCard input:where([type="text"], [type="email"]) { width: 100%; } } .disclosure { font-size: 0.73rem; } .submissionError { color: red; font-size: 1rem; } PK0[HJJ/resources/js/components/PricingPlans.module.cssnu[.plans { display: grid; gap: 2rem; justify-content: center; } PK0[ A'resources/js/components/Hero.module.cssnu[.hero { display: grid; gap: 0.95rem; padding: 4.125rem 2rem 3.5rem; text-align: center; } .title { margin: 0; color: #333; font-size: 1.875rem; font-weight: 600; line-height: 1.4; } .description { margin: 0; font-size: 1.125rem; } PK0[X X *resources/js/components/PricingPlanCard.jsnu[import {useMemo} from 'react'; import {kebabCase} from 'lodash'; import {Button} from './Button'; import {Card} from './Card'; import {transformEmphasis, transformStrong} from '../utils'; import styles from './PricingPlanCard.module.css'; export const PricingPlanCard = ({ name, description, actionText, actionLink, icon, includes, savingsPercentage, isMostPopular, }) => { const includesLabelId = useMemo(() => `${kebabCase(name)}-includes-label`, [name]); return (

{name}

{isMostPopular &&
Most Popular
}

Save over {savingsPercentage}%

); }; PK0[3j99resources/js/payment-gateway.tsnu[import dismissRecommendation from '@givewp/promotions/requests/dismissRecommendation'; /** * * @since 2.27.1 * */ declare global { interface Window { GiveSettings: GiveSettingsData; } } export interface GiveSettingsData { apiRoot: string; apiNonce: string; } /** * * @since 2.27.1 * */ const feeRecoveryProductRecommendation = document.querySelector( '.givewp-payment-gateway-fee-recovery-recommendation-row' ); if (feeRecoveryProductRecommendation) { const dismissAction = document.querySelector('.givewp-payment-gateway-fee-recovery-recommendation_close'); const table = document.querySelector('.give-setting-tab-body-gateways'); const preceedingContent = table.querySelector('tr'); preceedingContent.insertAdjacentElement('afterend', feeRecoveryProductRecommendation); dismissAction.addEventListener('click', async function (event) { feeRecoveryProductRecommendation.remove(); await dismissRecommendation('givewp_payment_gateway_fee_recovery_recommendation', window.GiveSettings.apiNonce); }); } PK0[9Zd755resources/js/sale-banner.jsnu[const bannersContainer = document.querySelector('.give-sale-banners-container'); const dismissActions = document.querySelectorAll('.give-sale-banner-dismiss'); const pageTitle = document.querySelector('.page-title-action, .wp-heading-inline, #give-in-plugin-upsells h1'); const hideBanner = ({target: dismissAction}) => { const formData = new FormData(); formData.append('id', dismissAction.dataset.id); document.getElementById(dismissAction.getAttribute('aria-controls')).remove(); fetch(`${window.GiveSaleBanners.apiRoot}/hide`, { method: 'POST', headers: { 'X-WP-Nonce': window.GiveSaleBanners.apiNonce, }, body: formData, }); if (bannersContainer.querySelectorAll('.give-sale-banner').length === 0) { bannersContainer.remove(); } }; if (pageTitle && bannersContainer) { pageTitle.parentNode.insertBefore(bannersContainer, pageTitle.nextSibling); bannersContainer.style.display = null; } dismissActions.forEach((action) => { action.addEventListener('click', hideBanner); }); PK0[1resources/js/utils.jsnu[/** * Replaces double asterisks with `` tags. * * @param {string} text * @returns {string} */ export function transformStrong(text) { // Keep track of whether we're inside a tag. let startingTag = false; return text.replaceAll('**', () => { // Reverse the starting tag state to determine the current state. startingTag = !startingTag; // Return the appropriate tag. return startingTag ? '' : ''; }); } /** * Replaces double asterisks with `` tags. * * @param {string} text * @returns {string} */ export function transformEmphasis(text) { // Keep track of whether we're inside an tag. let startingTag = false; return text.replaceAll('**', () => { // Reverse the starting tag state to determine the current state. startingTag = !startingTag; // Return the appropriate tag. return startingTag ? '' : ''; }); } /** * Get an asset URL. * * @param {string} filename (without leading slash). * @returns {string} asset URL */ export const assetUrl = (filename) => `${window.GiveAddons.assetsUrl}${filename}`; PK0[:e resources/js/donation-options.tsnu[import dismissRecommendation from '@givewp/promotions/requests/dismissRecommendation'; /** * * @since 2.27.1 * */ declare global { interface Window { GiveLegacyFormEditor: GiveLegacyFormEditorData; } } export interface GiveLegacyFormEditorData { apiRoot: string; apiNonce: string; } /** * * @since 2.27.1 * */ const recurringProductRecommendation = document.querySelector('.givewp-donation-options'); const dismissAction = document.querySelector('.givewp-donation-options_close'); const preceedingContent = document.querySelector('._give_custom_amount_text_field'); if (recurringProductRecommendation && preceedingContent) { preceedingContent.insertAdjacentElement('afterend', recurringProductRecommendation); dismissAction.addEventListener('click', async function (event) { recurringProductRecommendation.remove(); await dismissRecommendation( 'givewp_form_editor_donation_options_recurring_recommendation', window.GiveLegacyFormEditor.apiNonce ); }); } PK0[x6 !AddonsAdminPage.phpnu[PK0[ `LegacyFormEditor.phpnu[PK0[R}}7AddonsRepository.phpnu[PK0[!Endpoints/HideSaleBannerRoute.phpnu[PK0[S^]/ / )OEndpoints/ProductRecommendationsRoute.phpnu[PK0[ Z$PaymentGateways.phpnu[PK0[C+SaleBanners.phpnu[PK0[ e#T=resources/views/payment-gateway.phpnu[PK0[ wCresources/views/sale-banners.phpnu[PK0[dVV0gKresources/views/donation-options-form-editor.phpnu[PK0[kOO!Oresources/js/addons-admin-page.jsnu[PK0[ad!Presources/js/components/Button.jsnu[PK0[e;::Qresources/js/components/Hero.jsnu[PK0[@+qSresources/js/components/AdditionalAddons.jsnu[PK0[8)TYresources/js/components/Button.module.cssnu[PK0[j '\resources/js/components/PricingPlans.jsnu[PK0[c *`resources/js/components/AddonsAdminPage.jsnu[PK0[znresources/js/components/Card.jsnu[PK0[Xh 19oresources/js/components/MustHaveAddons.module.cssnu[PK0[)T~45qresources/js/components/MustHaveAddonCard.module.cssnu[PK0[dd'@uresources/js/components/Card.module.cssnu[PK0[u'uresources/js/components/FreeAddOnTab.jsnu[PK0[jc c 2Dresources/js/components/PricingPlanCard.module.cssnu[PK0[bJJ. resources/js/components/AdditionalAddonCard.jsnu[PK0[dOII6resources/js/components/AdditionalAddonCard.module.cssnu[PK0[$^kk,`resources/js/components/MustHaveAddonCard.jsnu[PK0[h)'resources/js/components/MustHaveAddons.jsnu[PK0[o 2@resources/js/components/AddonsAdminPage.module.cssnu[PK0[M==3-resources/js/components/AdditionalAddons.module.cssnu[PK0[`ԍ /ͭresources/js/components/FreeAddOnTab.module.cssnu[PK0[HJJ/resources/js/components/PricingPlans.module.cssnu[PK0[ A'bresources/js/components/Hero.module.cssnu[PK0[X X *ιresources/js/components/PricingPlanCard.jsnu[PK0[3j99resources/js/payment-gateway.tsnu[PK0[9Zd755resources/js/sale-banner.jsnu[PK0[1resources/js/utils.jsnu[PK0[:e ]resources/js/donation-options.tsnu[PK%%