+
+
+ {renderSlot('settings.onboarding', {
+ stepId: onboardingStep.id,
+ complete: () => { completeOnboardingStep(onboardingStep.id) },
+ openSection,
+ }, { only: onboardingStep.id })}
+
+
+ ), document.body)}
>
)
}
diff --git a/packages/client/ui-settings/src/client/contract/slots.ts b/packages/client/ui-settings/src/client/contract/slots.ts
index 37847832bf..4d5e48d80f 100644
--- a/packages/client/ui-settings/src/client/contract/slots.ts
+++ b/packages/client/ui-settings/src/client/contract/slots.ts
@@ -48,10 +48,10 @@ declare module '@deepseek-ai/dsh-client-ui-slots' {
*/
'settings.section': { kind: 'list'; scope: 'root'; owner: SettingsSectionOwnerProps }
/**
- * Root-scoped onboarding overlays contributed by settings features. The
- * shell supplies whether the current navigation state is the empty Hero
- * and a private callback that opens one settings section; registrants own
- * readiness, copy, and dialog behavior.
+ * Root-scoped onboarding steps contributed by settings features. The
+ * shell mounts one ordered step at a time; the active registrant either
+ * completes itself or keeps ownership until the user completes its sole
+ * path. Registrants own readiness, copy, and dialog behavior.
*/
'settings.onboarding': { kind: 'list'; scope: 'root'; owner: SettingsOnboardingOwnerProps }
}
@@ -79,10 +79,12 @@ export interface SettingsSectionOwnerProps {
children?: never
}
-/** Owner share of a settings-backed onboarding overlay. */
+/** Owner share of the currently active settings-backed onboarding step. */
export interface SettingsOnboardingOwnerProps {
- /** Whether the current UI is in its empty Hero/onboarding state. */
- active: boolean
+ /** Stable id of the step currently selected by the coordinator. */
+ stepId: string
+ /** Complete or skip this step and transfer ownership to the next entry. */
+ complete: () => void
/** Open the settings panel directly on one registered section. */
openSection: (id: string) => void
}
@@ -94,6 +96,12 @@ export interface SettingsSectionRow {
label: string
}
+/** One ordered onboarding step projected from a slot registration. */
+export interface SettingsOnboardingStep {
+ id: string
+ order: number
+}
+
/**
* Registrant-private injected share of the settings shell (assembled in
* apply): the ledger's nav-row projection as a hooks-compartment source —
@@ -103,6 +111,8 @@ export type SettingsRootInjected = {
hooks: {
/** settings.section ledger projected into ordered nav rows. */
sections: HostObservable