diff --git a/docs/release-control/v6/internal/subsystems/frontend-primitives.md b/docs/release-control/v6/internal/subsystems/frontend-primitives.md index 98e010e3cb..242dbf2f5b 100644 --- a/docs/release-control/v6/internal/subsystems/frontend-primitives.md +++ b/docs/release-control/v6/internal/subsystems/frontend-primitives.md @@ -1308,7 +1308,7 @@ The shared what's-new modal now follows that same owner split. `frontend-modern/src/components/shared/WhatsNewModal.tsx` stays the render shell, `frontend-modern/src/components/shared/useWhatsNewModalState.ts` owns local-storage dismissal, session dismissal, step progression, spotlight target -resolution, and overlay placement/runtime behavior, and +resolution, direct stop selection, and overlay placement/runtime behavior, and `frontend-modern/src/components/shared/whatsNewModalModel.ts` owns the feature tour catalog, telemetry copy, labels, and canonical docs/privacy links. Future what's-new work should extend those owners instead of pushing dismissal state, @@ -1317,6 +1317,10 @@ The v6 welcome surface is one guided spotlight tour, not a modal plus a second dashboard-only migration hint: it must dim the live app, glow the real primary-navigation target being described, and keep route-orientation copy on the existing welcome flow instead of layering a duplicate in-product banner. +The guided stop map inside that welcome surface is interactive, not decorative: +operators must be able to jump directly to any tour step from the stop list, +and desktop layouts may widen the panel enough to keep stop labels readable +without overlapping or collapsing into clipped pills. That state owner now also owns public-demo suppression: the modal must stay closed until `sessionPresentationPolicyResolved()` is true and must fail closed when `presentationPolicyIsDemoMode()` resolves true, so the public demo does diff --git a/frontend-modern/src/components/shared/WhatsNewModal.tsx b/frontend-modern/src/components/shared/WhatsNewModal.tsx index 17baa270dd..6a095137d0 100644 --- a/frontend-modern/src/components/shared/WhatsNewModal.tsx +++ b/frontend-modern/src/components/shared/WhatsNewModal.tsx @@ -83,13 +83,16 @@ export function WhatsNewModal() { aria-modal="true" aria-labelledby="whats-new-title" tabindex="-1" - class="fixed z-[1001] max-h-[min(90vh,42rem)] overflow-y-auto rounded-2xl border border-border bg-surface shadow-2xl focus:outline-none" + class="fixed z-[1001] max-h-[min(90vh,44rem)] overflow-y-auto rounded-[1.75rem] border border-border bg-surface shadow-2xl backdrop-blur-sm focus:outline-none" style={state.panelStyle()} onClick={(event) => event.stopPropagation()} > -
+
-
+
+ Guided Welcome Tour +
+
Step {state.stepIndex() + 1} of {state.stepCount()}

@@ -107,39 +110,83 @@ export function WhatsNewModal() {

-
-
-
- - {step().title} -
-

{step().description}

-
- -
- - {(card, index) => ( -
- {card.title} +
+
+
+
+ +
+
+
+ Now showing
- )} - +
{step().title}
+

{step().description}

+
+
-
-
- - {WHATS_NEW_TELEMETRY_TITLE} +
+
+
+ Tour Stops +
+
+
+

Click any stop to jump there.

+
+ + {(card, index) => ( + + )} + +
+
+ +
+
+
+ +
+
+
+ Privacy note +
+
+ {WHATS_NEW_TELEMETRY_TITLE} +
+

+ {WHATS_NEW_TELEMETRY_COPY[0]} +

+
-

- {WHATS_NEW_TELEMETRY_COPY[0]} -

{WHATS_NEW_TELEMETRY_COPY[1]} You can disable it any time in{' '} {WHATS_NEW_TELEMETRY_SETTINGS_PATH} or by @@ -159,7 +206,7 @@ export function WhatsNewModal() {

-
+
-
+