From 0697f119f6f67aa40b1f320aa7122bfeb9cbf0b8 Mon Sep 17 00:00:00 2001 From: pyr0ball Date: Wed, 15 Apr 2026 20:45:03 -0700 Subject: [PATCH] feat(demo): add WelcomeModal with localStorage gate --- web/src/components/WelcomeModal.vue | 160 ++++++++++++++++++ .../components/__tests__/WelcomeModal.test.ts | 35 ++++ 2 files changed, 195 insertions(+) create mode 100644 web/src/components/WelcomeModal.vue create mode 100644 web/src/components/__tests__/WelcomeModal.test.ts diff --git a/web/src/components/WelcomeModal.vue b/web/src/components/WelcomeModal.vue new file mode 100644 index 0000000..dd46f52 --- /dev/null +++ b/web/src/components/WelcomeModal.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/web/src/components/__tests__/WelcomeModal.test.ts b/web/src/components/__tests__/WelcomeModal.test.ts new file mode 100644 index 0000000..b64b7da --- /dev/null +++ b/web/src/components/__tests__/WelcomeModal.test.ts @@ -0,0 +1,35 @@ +import { describe, it, expect, beforeEach } from 'vitest' +import { mount } from '@vue/test-utils' +import WelcomeModal from '../WelcomeModal.vue' + +const LS_KEY = 'peregrine_demo_visited' + +beforeEach(() => { + localStorage.clear() +}) + +describe('WelcomeModal', () => { + it('is visible when localStorage key is absent', () => { + const w = mount(WelcomeModal, { global: { stubs: { Teleport: true } } }) + expect(w.find('.welcome-modal').exists()).toBe(true) + }) + + it('is hidden when localStorage key is set', () => { + localStorage.setItem(LS_KEY, '1') + const w = mount(WelcomeModal, { global: { stubs: { Teleport: true } } }) + expect(w.find('.welcome-modal').exists()).toBe(false) + }) + + it('dismisses and sets localStorage on primary CTA click', async () => { + const w = mount(WelcomeModal, { global: { stubs: { Teleport: true } } }) + await w.find('.welcome-modal__explore').trigger('click') + expect(w.find('.welcome-modal').exists()).toBe(false) + expect(localStorage.getItem(LS_KEY)).toBe('1') + }) + + it('emits dismissed event on close', async () => { + const w = mount(WelcomeModal, { global: { stubs: { Teleport: true } } }) + await w.find('.welcome-modal__explore').trigger('click') + expect(w.emitted('dismissed')).toBeTruthy() + }) +})