From 54fe41e04d1606e68710db2cf95168305585cdf8 Mon Sep 17 00:00:00 2001 From: Jaime Infante Date: Sat, 13 Jun 2026 00:21:13 -0500 Subject: [PATCH 1/5] feat: mp-2855-goal copy updates --- src/components/MyKiva/FeaturedGoalCard.vue | 9 +- .../MyKiva/GoalSetting/GoalSelector.vue | 41 ++++++--- src/components/MyKiva/GoalSettingModal.vue | 1 + .../Thanks/SingleVersion/GoalEntrypoint.vue | 1 + .../Thanks/ThanksPageSingleVersion.vue | 7 +- .../ImpactDashboard/GoalEntrypoint.vue | 91 ++++++++++++------- src/util/goalCopy.js | 39 +++++++- .../MyKiva/FeaturedGoalCard.spec.js | 25 +++-- .../components/MyKiva/GoalSelector.spec.js | 52 +++++++++-- .../SingleVersion/GoalEntrypoint.spec.js | 12 +++ .../Thanks/ThanksPageSingleVersion.spec.js | 7 +- .../ImpactDashboard/GoalEntrypoint.spec.js | 4 + test/unit/specs/util/goalCopy.spec.js | 55 ++++++++++- 13 files changed, 277 insertions(+), 67 deletions(-) diff --git a/src/components/MyKiva/FeaturedGoalCard.vue b/src/components/MyKiva/FeaturedGoalCard.vue index 470f1b0ae21..cbe34051621 100644 --- a/src/components/MyKiva/FeaturedGoalCard.vue +++ b/src/components/MyKiva/FeaturedGoalCard.vue @@ -28,8 +28,10 @@ >

-

- {{ goalCopy.TITLE_HOW_MANY_LOANS_GENERIC }} +

( VALID_STATES.includes(props.state) ? props.state : STATE_NO_GOAL )); -const noGoalTitle = computed(() => goalCopy.titleNoGoalYetWomensDefault()); +const noGoalTitle = goalCopy.titleNoGoalYetWomensDefault(); +const noGoalSubtitle = goalCopy.subtitleNoGoalYetEntrypoint(); const visibleProgress = computed(() => Math.min(props.goalProgress, props.goalTarget)); diff --git a/src/components/MyKiva/GoalSetting/GoalSelector.vue b/src/components/MyKiva/GoalSetting/GoalSelector.vue index b6908c5b1b4..29bb636269e 100644 --- a/src/components/MyKiva/GoalSetting/GoalSelector.vue +++ b/src/components/MyKiva/GoalSetting/GoalSelector.vue @@ -50,9 +50,9 @@

- How many loans will you make this year?

{ }); const showLoanQuestionPrompt = computed(() => { + if (props.useDirectQuestionTitle) return false; return goalSignupCopyVariant === GOAL_SIGNUP_COPY_NO_GOAL_YET || (!props.showGoalValuePropsCopy && (loansLastYear.value > 0 || props.selectedCategoryId === ID_WOMENS_EQUALITY)); }); +const loanQuestionPrompt = computed(() => { + if (goalSignupCopyVariant === GOAL_SIGNUP_COPY_NO_GOAL_YET && !props.useDirectQuestionTitle) { + return goalCopy.titleLoanQuestionForCategory(props.selectedCategoryId, props.selectedCategoryName); + } + return goalCopy.TITLE_HOW_MANY_LOANS_GENERIC; +}); + // Use progressForCurrentYear from tieredAchievements if available (set on Thanks page), // otherwise use fetched current year data (for MyKiva goal-setting page and modal) const loansThisYear = computed(() => { @@ -485,8 +507,12 @@ const loadLoansThisYear = async () => { }; const titleText = computed(() => { + if (props.useDirectQuestionTitle) { + return goalCopy.titleLoanQuestionForCategory(props.selectedCategoryId, props.selectedCategoryName); + } + if (goalSignupCopyVariant === GOAL_SIGNUP_COPY_NO_GOAL_YET) { - return goalCopy.CARD_NO_GOAL_YET_EXPERIMENT; + return goalCopy.titleNoGoalYetSelectorEntrypoint({ compactIntro: props.compactNoGoalYetTitle }); } // Default title if no lending history and category is ID_WOMENS_EQUALITY @@ -503,14 +529,7 @@ const titleText = computed(() => { return goalCopy.titleLastYearForCategory(loansLastYear.value, props.selectedCategoryId, props.selectedCategoryName); } - // Support All is not a specific category, so use generic language - if (props.selectedCategoryId === ID_SUPPORT_ALL) { - return goalCopy.TITLE_HOW_MANY_LOANS_GENERIC; - } - if (props.selectedCategoryId === ID_US_ECONOMIC_EQUALITY) { - return goalCopy.TITLE_US_ENTREPRENEURS_HOW_MANY_LOANS; - } - return goalCopy.titleCategoryHowManyLoans(props.selectedCategoryName?.toLowerCase()); + return goalCopy.titleLoanQuestionForCategory(props.selectedCategoryId, props.selectedCategoryName); }); const subtitleText = computed(() => { diff --git a/src/components/MyKiva/GoalSettingModal.vue b/src/components/MyKiva/GoalSettingModal.vue index 2d3889fabdc..5f84a3323e6 100644 --- a/src/components/MyKiva/GoalSettingModal.vue +++ b/src/components/MyKiva/GoalSettingModal.vue @@ -204,6 +204,7 @@ :is-loading-data="isLoadingData || isLoadingRecommendedLoan" :is-goal-tile-experiment-enabled="isGoalTileExperimentEnabled" :show-goal-value-props-copy="showGoalValuePropsCopy && !isGoalTileExperimentEnabled" + use-direct-question-title @set-goal-target="setGoalTarget" @set-goal="onGoalSelectorSetGoal" @update-goal="onGoalSelectorUpdateGoal" diff --git a/src/components/Thanks/SingleVersion/GoalEntrypoint.vue b/src/components/Thanks/SingleVersion/GoalEntrypoint.vue index 4458e4b4cdb..72c93bb1612 100644 --- a/src/components/Thanks/SingleVersion/GoalEntrypoint.vue +++ b/src/components/Thanks/SingleVersion/GoalEntrypoint.vue @@ -35,6 +35,7 @@ :goal-progress="goalProgress" :goal-progress-percentage="goalProgressPercentage" :go-to-url="goToUrl" + compact-no-goal-yet-title @set-goal-target="$emit('set-goal-target', $event)" @set-goal="$emit('set-goal', $event)" @edit-goal="$emit('edit-goal')" diff --git a/src/components/Thanks/ThanksPageSingleVersion.vue b/src/components/Thanks/ThanksPageSingleVersion.vue index a7f5cbf11fa..f38759293ae 100644 --- a/src/components/Thanks/ThanksPageSingleVersion.vue +++ b/src/components/Thanks/ThanksPageSingleVersion.vue @@ -296,6 +296,7 @@ const isGoalSet = ref(false); const isEmptyGoal = ref(true); const goalTarget = ref(0); const goalSignupThanksViewCapped = ref(false); +const goalSignupThanksViewCounted = ref(false); // Basket primitives are owned by ThanksPage's borrowerProfileExpMixin and // bridged down via provide/inject so we don't duplicate addToBasket / @@ -572,8 +573,12 @@ onMounted(async () => { goalSignupThanksViewCapped.value = !props.isGuest && isEmptyGoal.value && isGoalSignupThanksViewCapped(cookieStore); - if (!props.isGuest && isEmptyGoal.value && !goalSignupThanksViewCapped.value) { + if (!props.isGuest + && isEmptyGoal.value + && !goalSignupThanksViewCapped.value + && !goalSignupThanksViewCounted.value) { incrementGoalSignupThanksViewCount(cookieStore); + goalSignupThanksViewCounted.value = true; } // Show goal in progress module when: diff --git a/src/pages/Portfolio/ImpactDashboard/GoalEntrypoint.vue b/src/pages/Portfolio/ImpactDashboard/GoalEntrypoint.vue index 9834e52d6dd..a53347a9365 100644 --- a/src/pages/Portfolio/ImpactDashboard/GoalEntrypoint.vue +++ b/src/pages/Portfolio/ImpactDashboard/GoalEntrypoint.vue @@ -1,42 +1,33 @@ @@ -50,7 +41,6 @@ import { useRouter } from 'vue-router'; import userAchievementProgressQuery from '#src/graphql/query/userAchievementProgress.graphql'; import useGoalData, { LAST_YEAR_KEY } from '#src/composables/useGoalData'; import goalCopy from '#src/util/goalCopy'; -import HandsPlant from '#src/assets/images/thanks-page/hands-plant.gif'; import AsyncPortfolioSection from './AsyncPortfolioSection'; const { getCategoryLoansLastYear } = useGoalData(); @@ -62,6 +52,7 @@ const router = useRouter(); const womenLoansLastYear = ref(0); const title = computed(() => goalCopy.titleGoalSignupWomensLastYear(womenLoansLastYear.value)); +const subtitle = goalCopy.subtitleNoGoalYetEntrypoint(); const goToGoalPage = () => { $kvTrackEvent('portfolio', 'click', 'set-goal-portfolio'); @@ -90,7 +81,43 @@ onMounted(() => { diff --git a/src/util/goalCopy.js b/src/util/goalCopy.js index 56673c2c21b..8891283826b 100644 --- a/src/util/goalCopy.js +++ b/src/util/goalCopy.js @@ -40,6 +40,14 @@ const goalCopy = { return this.titleNoHistoryWomensDefault(cssClass); }, + /** Date-aware no-goal subtitle for goal card entrypoints */ + subtitleNoGoalYetEntrypoint() { + if (this.getGoalSignupCopyVariant() === GOAL_SIGNUP_COPY_NO_GOAL_YET) { + return this.CARD_HABIT_PROMPT_SINGLE_LINE; + } + return this.TITLE_HOW_MANY_LOANS_GENERIC; + }, + /** User helped exactly 1 woman last year */ // eslint-disable-next-line max-len titleLastYearSingleWoman: (count, cssClass = 'tw-text-eco-green-3') => `Last year, you helped ${highlight(`${count} woman`, cssClass)} shape her future!`, @@ -79,10 +87,31 @@ const goalCopy = { /** US Economic Equality category */ // eslint-disable-next-line max-len - TITLE_US_ENTREPRENEURS_HOW_MANY_LOANS: `How many loans to ${ecoGreen('U.S. entrepreneurs')} will you make this year?`, + TITLE_US_ENTREPRENEURS_HOW_MANY_LOANS: `How many loans to ${ecoGreen('U.S. entrepreneurs')}
will you make this year?`, /** Specific named category */ - titleCategoryHowManyLoans: categoryName => `How many loans to ${ecoGreen(categoryName)} will you make this year?`, + titleCategoryHowManyLoans: categoryName => ( + `How many loans to ${ecoGreen(categoryName)}
will you make this year?` + ), + + /** Direct no-goal-yet title used by selector entrypoints */ + titleNoGoalYetSelectorEntrypoint({ compactIntro = false } = {}) { + const intro = compactIntro + ? `${this.CARD_NO_GOAL_YET_EXPERIMENT}` + : this.CARD_NO_GOAL_YET_EXPERIMENT; + return `${intro}
${this.CARD_HABIT_PROMPT_SHORT}`; + }, + + /** Generic category question used by direct goal-selector flows */ + titleLoanQuestionForCategory(categoryId, categoryName) { + if (categoryId === ID_SUPPORT_ALL) { + return this.TITLE_HOW_MANY_LOANS_GENERIC; + } + if (categoryId === ID_US_ECONOMIC_EQUALITY) { + return this.TITLE_US_ENTREPRENEURS_HOW_MANY_LOANS; + } + return this.titleCategoryHowManyLoans(categoryName?.toLowerCase()); + }, // ─── Goal selector subtitle ──────────────────────────────────────────────── @@ -124,6 +153,12 @@ const goalCopy = { /** Experiment: motivational subtitle in the empty goal tile */ CARD_HABIT_PROMPT_EXPERIMENT: "Make helping others a habit.
We'll help you make it happen.", + /** Single-line habit prompt used where the subtitle should not force a line break */ + CARD_HABIT_PROMPT_SINGLE_LINE: "Make helping others a habit. We'll help you make it happen.", + + /** Short habit prompt used inside the goal selector title */ + CARD_HABIT_PROMPT_SHORT: 'Make helping others a habit.', + // ─── GoalProgressRing — modal description text ─────────────────────────────── /** Modal: goal completed — "Thank you for supporting X [category]..." */ diff --git a/test/unit/specs/components/MyKiva/FeaturedGoalCard.spec.js b/test/unit/specs/components/MyKiva/FeaturedGoalCard.spec.js index 6acfe40ca34..4f89535e8b6 100644 --- a/test/unit/specs/components/MyKiva/FeaturedGoalCard.spec.js +++ b/test/unit/specs/components/MyKiva/FeaturedGoalCard.spec.js @@ -4,6 +4,8 @@ import FeaturedGoalCard from '#src/components/MyKiva/FeaturedGoalCard'; import { GOALS_CURRENT_YEAR } from '#src/composables/useGoalData'; import goalCopy from '#src/util/goalCopy'; +const stripHtml = html => html.replace(/<[^>]*>/g, ''); + vi.mock('#src/util/animation/confettiUtils', () => ({ showConfetti: vi.fn(), })); @@ -89,23 +91,27 @@ describe('FeaturedGoalCard copy', () => { vi.setSystemTime(new Date('2026-03-31T12:00:00')); const wrapper = buildNoGoal(); - expect(wrapper.html()).toContain('Lenders like you help'); - expect(wrapper.html()).toContain('3 women'); - expect(wrapper.html()).toContain('a year!'); + expect(wrapper.text()).toContain(stripHtml(goalCopy.titleNoHistoryWomensDefault())); expect(wrapper.text()).not.toContain(goalCopy.CARD_NO_GOAL_YET_EXPERIMENT); }); - it('renders the no-goal-yet title starting April 1', () => { + it('renders the no-goal-yet title and habit prompt starting April 1', () => { vi.useFakeTimers(); vi.setSystemTime(new Date('2026-04-01T12:00:00')); const wrapper = buildNoGoal(); expect(wrapper.text()).toContain(goalCopy.CARD_NO_GOAL_YET_EXPERIMENT); - expect(wrapper.html()).not.toContain('Lenders like you help'); + expect(wrapper.text()).toContain(goalCopy.CARD_HABIT_PROMPT_SINGLE_LINE); + expect(wrapper.html()).not.toContain('
'); + expect(wrapper.text()).not.toContain(stripHtml(goalCopy.titleNoHistoryWomensDefault())); + expect(wrapper.text()).not.toContain(goalCopy.TITLE_HOW_MANY_LOANS_GENERIC); }); - it('renders the generic loans-this-year subtitle', () => { - expect(buildNoGoal().text()).toContain('How many loans will you make this year?'); + it('renders the generic loans-this-year subtitle from January 1 through March 31', () => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2026-03-31T12:00:00')); + + expect(buildNoGoal().text()).toContain(goalCopy.TITLE_HOW_MANY_LOANS_GENERIC); }); it('renders the year-stamped Set Goal CTA', () => { @@ -322,8 +328,11 @@ describe('FeaturedGoalCard copy', () => { describe('state validator fallback', () => { it('renders no-goal copy when an unrecognized state value is passed', () => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2026-03-31T12:00:00')); + const wrapper = mountCard({ state: 'something-unsupported' }); - expect(wrapper.text()).toContain('How many loans will you make this year?'); + expect(wrapper.text()).toContain(goalCopy.TITLE_HOW_MANY_LOANS_GENERIC); expect(wrapper.text()).toContain(`Set ${GOALS_CURRENT_YEAR} goal`); }); }); diff --git a/test/unit/specs/components/MyKiva/GoalSelector.spec.js b/test/unit/specs/components/MyKiva/GoalSelector.spec.js index c8732bfa4c4..8548d71ce38 100644 --- a/test/unit/specs/components/MyKiva/GoalSelector.spec.js +++ b/test/unit/specs/components/MyKiva/GoalSelector.spec.js @@ -56,6 +56,14 @@ describe('GoalSelector', () => { type: Array, default: () => [], }, + useDirectQuestionTitle: { + type: Boolean, + default: false, + }, + compactNoGoalYetTitle: { + type: Boolean, + default: false, + }, }, data() { return { @@ -104,6 +112,8 @@ describe('GoalSelector', () => { :tiered-achievements="tieredAchievements" :selected-category-id="selectedCategoryId" :selected-category-name="selectedCategoryName" + :use-direct-question-title="useDirectQuestionTitle" + :compact-no-goal-yet-title="compactNoGoalYetTitle" />

`, @@ -263,11 +273,11 @@ describe('GoalSelector', () => { await vi.runAllTimersAsync(); expect(getByRole('heading', { level: 2 }).textContent) - .toContain('Last year, you helped 2 women shape their futures!'); + .toContain(stripHtml(goalCopy.titleLastYearForCategory(2, ID_WOMENS_EQUALITY, 'Women'))); expect(queryByText(goalCopy.CARD_NO_GOAL_YET_EXPERIMENT)).toBeNull(); }); - it('shows no-goal-yet copy starting April 1', async () => { + it('keeps the selector question starting April 1', async () => { vi.useFakeTimers(); vi.setSystemTime(new Date('2026-04-01T12:00:00')); @@ -287,18 +297,19 @@ describe('GoalSelector', () => { $kvTrackEvent: vi.fn(), }, }, - props: { tieredAchievements }, + props: { tieredAchievements, useDirectQuestionTitle: true }, }); await vi.runAllTimersAsync(); expect(getByRole('heading', { level: 2 }).textContent) - .toBe(goalCopy.CARD_NO_GOAL_YET_EXPERIMENT); - expect(container.textContent).toContain('How many loans will you make this year?'); + .toContain(stripHtml(goalCopy.titleLoanQuestionForCategory(ID_WOMENS_EQUALITY, 'Women'))); + expect(container.textContent).not.toContain(goalCopy.CARD_NO_GOAL_YET_EXPERIMENT); + expect(container.textContent).not.toContain(goalCopy.TITLE_HOW_MANY_LOANS_GENERIC); expect(container.textContent).toContain(stripHtml(goalCopy.subtitleLoansAlreadyMade(1))); }); - it('shows requested goal question and current-year progress copy', async () => { + it('shows no-goal-yet entrypoint title and category question starting April 1', async () => { vi.useFakeTimers(); vi.setSystemTime(new Date('2026-04-01T12:00:00')); @@ -342,11 +353,36 @@ describe('GoalSelector', () => { await vi.runAllTimersAsync(); expect(getByRole('heading', { level: 2 }).textContent) - .toBe(goalCopy.CARD_NO_GOAL_YET_EXPERIMENT); - expect(container.textContent).toContain('How many loans will you make this year?'); + .toContain(stripHtml(goalCopy.titleNoGoalYetSelectorEntrypoint())); + expect(container.textContent).toContain(stripHtml( + goalCopy.titleLoanQuestionForCategory(ID_WOMENS_EQUALITY, 'Women') + )); expect(container.textContent).toContain(stripHtml(goalCopy.subtitleLoansAlreadyMade(1))); }); + it('can render a compact no-goal-yet intro line starting April 1', async () => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2026-04-01T12:00:00')); + + const { container } = render(TestWrapper, { + global: { + ...globalOptions, + provide: { + ...globalOptions.provide, + $kvTrackEvent: vi.fn(), + }, + }, + props: { compactNoGoalYetTitle: true }, + }); + + await vi.runAllTimersAsync(); + + const heading = container.querySelector('h2'); + expect(heading.innerHTML).toContain('tw-text-base'); + expect(heading.textContent).toContain(goalCopy.CARD_NO_GOAL_YET_EXPERIMENT); + expect(heading.textContent).toContain(goalCopy.CARD_HABIT_PROMPT_SHORT); + }); + it('shows current-year progress copy after the user selects a new category', async () => { const tieredAchievements = [ { id: ID_WOMENS_EQUALITY, progressForYear: 0, progressForCurrentYear: 1 }, diff --git a/test/unit/specs/components/Thanks/SingleVersion/GoalEntrypoint.spec.js b/test/unit/specs/components/Thanks/SingleVersion/GoalEntrypoint.spec.js index 2dadb28a6aa..0a284347f71 100644 --- a/test/unit/specs/components/Thanks/SingleVersion/GoalEntrypoint.spec.js +++ b/test/unit/specs/components/Thanks/SingleVersion/GoalEntrypoint.spec.js @@ -29,6 +29,12 @@ const RecommendLoanForGoalContainerStub = { const GoalSelectorStub = { name: 'GoalSelector', + props: { + compactNoGoalYetTitle: { + type: Boolean, + default: false, + }, + }, emits: ['set-goal', 'set-goal-target', 'edit-goal'], template: '
', }; @@ -65,6 +71,12 @@ describe('GoalEntrypoint', () => { expect(wrapper.findComponent(RecommendLoanForGoalContainerStub).exists()).toBe(false); }); + it('requests compact no-goal title sizing for the thank-you page selector', () => { + const wrapper = mountComponent({ loading: false, showRecommendLoanAfterGoalView: false }); + + expect(wrapper.findComponent(GoalSelectorStub).props('compactNoGoalYetTitle')).toBe(true); + }); + it('renders the recommended loan container when the view is on and loans are available', () => { const wrapper = mountComponent({ loading: false, diff --git a/test/unit/specs/components/Thanks/ThanksPageSingleVersion.spec.js b/test/unit/specs/components/Thanks/ThanksPageSingleVersion.spec.js index 12c5f731106..73b1764588b 100644 --- a/test/unit/specs/components/Thanks/ThanksPageSingleVersion.spec.js +++ b/test/unit/specs/components/Thanks/ThanksPageSingleVersion.spec.js @@ -3,7 +3,10 @@ import { ref } from 'vue'; import { createRouter, createMemoryHistory } from 'vue-router'; import ThanksPageSingleVersion from '#src/components/Thanks/ThanksPageSingleVersion'; import { GOAL_STATUS } from '#src/composables/useGoalData'; -import { GOAL_SIGNUP_THANKS_VIEWS_COOKIE } from '#src/util/myKivaUtils'; +import { + GOAL_SIGNUP_THANKS_VIEWS_COOKIE, + incrementGoalSignupThanksViewCount, +} from '#src/util/myKivaUtils'; import { globalOptions } from '../../../specUtils'; const router = createRouter({ @@ -525,6 +528,7 @@ describe('ThanksPageSingleVersion', () => { it('increments the thank you goal signup view counter when the ask renders', async () => { mockUserGoal.value = null; + incrementGoalSignupThanksViewCount.mockClear(); const { cookieStore, getByTestId } = renderComponent({ badgesAchieved: [], @@ -532,6 +536,7 @@ describe('ThanksPageSingleVersion', () => { await vi.waitFor(() => { expect(getByTestId('goal-entrypoint')).toBeTruthy(); + expect(incrementGoalSignupThanksViewCount).toHaveBeenCalledTimes(1); expect(cookieStore.set).toHaveBeenCalledWith(GOAL_SIGNUP_THANKS_VIEWS_COOKIE, '1', { path: '/', expires: expect.any(Date), diff --git a/test/unit/specs/pages/Portfolio/ImpactDashboard/GoalEntrypoint.spec.js b/test/unit/specs/pages/Portfolio/ImpactDashboard/GoalEntrypoint.spec.js index f6b12fdda30..ab3cf7149ed 100644 --- a/test/unit/specs/pages/Portfolio/ImpactDashboard/GoalEntrypoint.spec.js +++ b/test/unit/specs/pages/Portfolio/ImpactDashboard/GoalEntrypoint.spec.js @@ -84,6 +84,7 @@ describe('Portfolio GoalEntrypoint', () => { await flushPromises(); expect(wrapper.text()).toContain('Lenders like you help 3 women a year!'); + expect(wrapper.text()).toContain(goalCopy.TITLE_HOW_MANY_LOANS_GENERIC); expect(wrapper.text()).toContain(goalCopy.BUTTON_SET_GOAL); expect(wrapper.text()).not.toContain(goalCopy.CARD_NO_GOAL_YET_EXPERIMENT); }); @@ -97,6 +98,7 @@ describe('Portfolio GoalEntrypoint', () => { await flushPromises(); expect(wrapper.text()).toContain('Last year, you helped 2 women shape their futures!'); + expect(wrapper.text()).toContain(goalCopy.TITLE_HOW_MANY_LOANS_GENERIC); expect(wrapper.text()).toContain(goalCopy.BUTTON_SET_GOAL); expect(wrapper.text()).not.toContain(goalCopy.CARD_NO_GOAL_YET_EXPERIMENT); }); @@ -110,8 +112,10 @@ describe('Portfolio GoalEntrypoint', () => { await flushPromises(); expect(wrapper.text()).toContain(goalCopy.CARD_NO_GOAL_YET_EXPERIMENT); + expect(wrapper.text()).toContain(goalCopy.CARD_HABIT_PROMPT_SINGLE_LINE); expect(wrapper.text()).toContain(goalCopy.BUTTON_SET_GOAL); expect(wrapper.text()).not.toContain('Last year, you helped'); expect(wrapper.text()).not.toContain('Lenders like you'); + expect(wrapper.text()).not.toContain(goalCopy.TITLE_HOW_MANY_LOANS_GENERIC); }); }); diff --git a/test/unit/specs/util/goalCopy.spec.js b/test/unit/specs/util/goalCopy.spec.js index 54b15fb86c9..235b34f5068 100644 --- a/test/unit/specs/util/goalCopy.spec.js +++ b/test/unit/specs/util/goalCopy.spec.js @@ -52,6 +52,26 @@ describe('goalCopy', () => { }); }); + describe('subtitleNoGoalYetEntrypoint', () => { + afterEach(() => { + vi.useRealTimers(); + }); + + it('uses the loan question from January 1 through March 31', () => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2026-03-31T12:00:00')); + + expect(goalCopy.subtitleNoGoalYetEntrypoint()).toBe(goalCopy.TITLE_HOW_MANY_LOANS_GENERIC); + }); + + it('uses the habit prompt starting April 1', () => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2026-04-01T12:00:00')); + + expect(goalCopy.subtitleNoGoalYetEntrypoint()).toBe(goalCopy.CARD_HABIT_PROMPT_SINGLE_LINE); + }); + }); + describe('getGoalSignupCopyVariant', () => { it('uses last-year copy from January 1 through March 31', () => { expect(goalCopy.getGoalSignupCopyVariant(new Date('2026-01-01T12:00:00'))).toBe(GOAL_SIGNUP_COPY_LAST_YEAR); @@ -134,7 +154,40 @@ describe('goalCopy', () => { it('wraps the category name in an eco-green span', () => { const result = goalCopy.titleCategoryHowManyLoans('refugees'); expect(result).toContain('refugees'); - expect(result).toContain('will you make this year?'); + expect(result).toContain('
will you make this year?'); + }); + }); + + describe('titleNoGoalYetSelectorEntrypoint', () => { + it('combines the no-goal-yet title with the short habit prompt', () => { + expect(stripHtml(goalCopy.titleNoGoalYetSelectorEntrypoint())) + .toBe(`${goalCopy.CARD_NO_GOAL_YET_EXPERIMENT}${goalCopy.CARD_HABIT_PROMPT_SHORT}`); + }); + + it('can render a compact intro line', () => { + const result = goalCopy.titleNoGoalYetSelectorEntrypoint({ compactIntro: true }); + + expect(result).toContain(`>${goalCopy.CARD_NO_GOAL_YET_EXPERIMENT}`); + expect(result).toContain('tw-text-base'); + expect(result).toContain(goalCopy.CARD_HABIT_PROMPT_SHORT); + }); + }); + + describe('titleLoanQuestionForCategory', () => { + it('uses generic copy for Support All', () => { + expect(goalCopy.titleLoanQuestionForCategory(ID_SUPPORT_ALL, 'Choose as I go')) + .toBe(goalCopy.TITLE_HOW_MANY_LOANS_GENERIC); + }); + + it('uses the U.S. Entrepreneurs copy for US Economic Equality', () => { + expect(goalCopy.titleLoanQuestionForCategory(ID_US_ECONOMIC_EQUALITY, 'U.S. Entrepreneurs')) + .toBe(goalCopy.TITLE_US_ENTREPRENEURS_HOW_MANY_LOANS); + expect(goalCopy.TITLE_US_ENTREPRENEURS_HOW_MANY_LOANS).toContain('
will you make this year?'); + }); + + it('uses category-specific copy for other categories', () => { + expect(stripHtml(goalCopy.titleLoanQuestionForCategory(ID_WOMENS_EQUALITY, 'Women'))) + .toBe(stripHtml(goalCopy.titleCategoryHowManyLoans('women'))); }); }); From 6b023793773e477ed2a8824620b79740bc380edd Mon Sep 17 00:00:00 2001 From: Jaime Infante Date: Tue, 16 Jun 2026 02:35:38 -0500 Subject: [PATCH 2/5] feat: mp-2855-goal copy updates --- .../images/thanks-page/hands-plant-v3.png | Bin 0 -> 11578 bytes .../GoalSetting/GoalSettingContainer.vue | 1 + .../MyKiva/GoalSetting/GoalSelector.vue | 78 +++++++++++++++--- .../MyKiva/GoalSetting/LoanNumberSelector.vue | 4 +- src/components/MyKiva/GoalSettingModal.vue | 60 +++++++++++++- src/components/MyKiva/NextYearGoalCard.vue | 2 +- .../Thanks/SingleVersion/GoalEntrypoint.vue | 3 +- src/util/goalCopy.js | 16 ++-- .../components/MyKiva/GoalSelector.spec.js | 26 +++++- .../MyKiva/GoalSettingModal.spec.js | 20 +++++ .../SingleVersion/GoalEntrypoint.spec.js | 10 ++- test/unit/specs/util/goalCopy.spec.js | 23 +++++- 12 files changed, 216 insertions(+), 27 deletions(-) create mode 100644 src/assets/images/thanks-page/hands-plant-v3.png diff --git a/src/assets/images/thanks-page/hands-plant-v3.png b/src/assets/images/thanks-page/hands-plant-v3.png new file mode 100644 index 0000000000000000000000000000000000000000..4b9d34b99b28734e29db8f9c33b1b7396b0acaaa GIT binary patch literal 11578 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 literal 0 HcmV?d00001 diff --git a/src/components/GoalSetting/GoalSettingContainer.vue b/src/components/GoalSetting/GoalSettingContainer.vue index cfc67c84e4c..f98fb47245c 100644 --- a/src/components/GoalSetting/GoalSettingContainer.vue +++ b/src/components/GoalSetting/GoalSettingContainer.vue @@ -83,6 +83,7 @@ :goal-progress="goalProgress" :is-goal-completed="isGoalCompleted" show-goal-value-props-copy + use-direct-question-title @set-goal-target="setTarget($event)" @set-goal="setGoal($event)" @update-goal="updateGoal($event)" diff --git a/src/components/MyKiva/GoalSetting/GoalSelector.vue b/src/components/MyKiva/GoalSetting/GoalSelector.vue index 29bb636269e..6693a6ac558 100644 --- a/src/components/MyKiva/GoalSetting/GoalSelector.vue +++ b/src/components/MyKiva/GoalSetting/GoalSelector.vue @@ -1,5 +1,8 @@