Feat/uxcore cybersecurity#145
Conversation
The per-navigation "you're on X" landing line fires a paid Claude call on every page hop, even when the pill is closed and the visitor never interacts — so cost scaled with raw visitor count. Now the organic greeting only spends when the panel is open AND the visitor has already engaged (asked a question / clicked a card / picked a suggestion) this session. Curated landings stay local/free; card-click landings already imply both signals and are unchanged. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…cache Tighten the organic greeting cost gate per product decision: - Engagement is now set ONLY on a manually typed message. Card and suggestion clicks no longer count — clicking existing buttons is navigation, not a conversation, and must not incur paid greetings. - Engagement expires after 30 min of no typed input (timestamp + TTL), so a long-idle tab starts neutral again. - Never pay twice for the same page in a session: the organic greeting is cached per canonical path; revisits and back/forth are free. Curated (local) landings and the chat answer path are unchanged. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…+ bot filter Remember the widget's open/closed panel in sessionStorage so it follows the visitor across page loads (incl. hard reloads into UX Core), instead of always booting closed. Switch the paid organic-greeting gate from "typed within 30 min" to simply "panel open" — opening the pill is a deliberate human gesture — and add a known-bot user-agent backstop on /api/concierge-landing so we never pay a crawler that reaches the route. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…eOSS into feat/uxcore-cybersecurity
…c case rework - bias modal on mobile is a full-height bottom sheet (dvh-safe on iOS), header icons aligned, vertical use-case switcher - restore swipe left/right bias navigation directly in UXCoreModal (legacy UXCoreModalMobile stopped rendering after repo merge) - rating block moved inside the scrollable body instead of a sticky footer - Ask widget pill: dark surface in dark theme, no pulse on touch devices - offsec cases #2-#4 reworked for distinct scenarios; left/right wording replaced with first/second for stacked mobile layout
…e, bias popup, route loaders Revive the orphaned uxcore useMobile hook (dead since the UXCoreOSS fold-in, so phones got desktop layout) and pin slug pages to the new modals. UXCG question modal goes fullscreen on mobile with sticky rating row and nav pills; add theme toggle to its header; restyle the mobile bias popup as a centered card with dark-theme support and same-tab bias links. Route loading overlay on UXCG/Table navigation, tooltip viewport clamp, dark widget pill, UXCAT guest-profile clipping fixes. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Page-element highlighting fired on every new answer regardless of widget state, so a returning visitor with a collapsed pill saw host elements glow with no obvious cause. Highlight is now allowed only while the panel is open (active); collapsing clears it, reopening re-applies it. Same path on mobile and desktop. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The "how useful…" NPS row sat outside the scrollable modal body and stayed pinned above the nav controls. Moved it inside the body so it scrolls with the answer; only Previous/Next stay sticky at the bottom. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The Cybersecurity (OffSec) layer is still work-in-progress. Surface its switcher and view only when NEXT_PUBLIC_ENV is dev, and treat a persisted isOffsecView flag as inactive off-dev so a prior dev session can't leak the half-baked layer onto staging or prod. Building continues on dev as before. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
@claude, review this PR. |
|
Claude finished @MaryWylde's task in 3m 12s —— View job PR Review: Feat/uxcore cybersecurity
39 files, +1112/−368 lines across 5 commits. The core change is adding a Mere Exposure Effect OffSec scenario, retiring the mobile/desktop modal split in UX Core, and introducing a New OffSec content:
|
| Area | Status |
|---|---|
| New OffSec content (Mere Exposure Effect) | ✅ Clean |
| RouteLoadingOverlay component | ✅ Good |
| UXCoreModal mobile unification | ✅ Good, minor issue |
| UXCGModal loading integration | ✅ Good |
| LanguageSwitcher touch fix | ✅ Logic correct, import order wrong |
| MobileView loading overlay | ✅ Good |
| Widget host-highlight gate | ✅ Correct fix |
| Bot filter on concierge-landing | ✅ Good |
| OffSec env gating | ✅ Solid |
Must fix before merge:
isLoadingeffect inUXCoreModalhas empty deps[]— will not update ifdataarrives after mount- Import order violation in
LanguageSwitcher.tsx - Agent memory reference in
mereExposureEffect.tscomment
Nice-to-have:
- Unify
isClosinginUXCoreModalwithuseRouteLoading(same as UXCGModal) - Fill in the PR description (currently just the template placeholder)
Description
Briefly describe the changes.
🔗 Related Issue
Closes #123 or relates to #456
*(Optional: You can also open a pull request directly from an issue — GitHub will auto-link it.)
✅ Checklist