diff --git a/modules/crowdsurf/landing.ts b/modules/crowdsurf/landing.ts index df5f9ba..a098ad6 100644 --- a/modules/crowdsurf/landing.ts +++ b/modules/crowdsurf/landing.ts @@ -15,6 +15,11 @@ export function renderLanding(): string { Start Swiping Create a Space +

+ + Start Guided Tour → + +

diff --git a/modules/rbnb/components/folk-bnb-view.ts b/modules/rbnb/components/folk-bnb-view.ts index 7e92501..c74e427 100644 --- a/modules/rbnb/components/folk-bnb-view.ts +++ b/modules/rbnb/components/folk-bnb-view.ts @@ -450,6 +450,8 @@ class FolkBnbView extends HTMLElement { el.textContent = s || ''; return el.innerHTML; } + + startTour() { this.#tour?.start(); } } if (!customElements.get('folk-bnb-view')) { diff --git a/modules/rbnb/landing.ts b/modules/rbnb/landing.ts index b470348..7904e1d 100644 --- a/modules/rbnb/landing.ts +++ b/modules/rbnb/landing.ts @@ -27,6 +27,11 @@ export function renderLanding(): string { Learn More +

+ + Start Guided Tour → + +

diff --git a/modules/rdata/landing.ts b/modules/rdata/landing.ts index e3c4bf3..b813173 100644 --- a/modules/rdata/landing.ts +++ b/modules/rdata/landing.ts @@ -19,6 +19,11 @@ export function renderLanding(): string { View Dashboard Create a Space +

+ + Start Guided Tour → + +

diff --git a/modules/rmeets/components/folk-jitsi-room.ts b/modules/rmeets/components/folk-jitsi-room.ts index 8aac782..d00727f 100644 --- a/modules/rmeets/components/folk-jitsi-room.ts +++ b/modules/rmeets/components/folk-jitsi-room.ts @@ -390,6 +390,24 @@ class FolkJitsiRoom extends HTMLElement { this.directorCanvas = null; this.destroyDirectorHls(); } + + /* ── Guided Tour ── */ + + private _tour: import('../../../shared/tour-engine').TourEngine | null = null; + + private async _initTour() { + if (this._tour) return; + const { TourEngine } = await import('../../../shared/tour-engine'); + this._tour = new TourEngine(this.shadow as unknown as ShadowRoot, [ + { target: '#jitsi-meet', title: 'Video Meeting', message: 'Your self-hosted Jitsi Meet room. All video and audio stays on your own infrastructure.' }, + { target: '.jitsi-container', title: 'Full-Screen Controls', message: 'Use the Jitsi toolbar for mute, camera, screen share, chat, and more — all built in.' }, + ], 'rmeets_tour_done', () => this.shadow.querySelector('.jitsi-container') as HTMLElement); + } + + async startTour() { + await this._initTour(); + this._tour?.start(); + } } customElements.define("folk-jitsi-room", FolkJitsiRoom); diff --git a/modules/rmeets/landing.ts b/modules/rmeets/landing.ts index 4a15718..3e6cb20 100644 --- a/modules/rmeets/landing.ts +++ b/modules/rmeets/landing.ts @@ -18,6 +18,11 @@ export function renderLanding(): string { Start a Meeting Create a Space +

+ + Start Guided Tour → + +

diff --git a/modules/rsplat/components/folk-splat-viewer.ts b/modules/rsplat/components/folk-splat-viewer.ts index 26b5e86..81e3336 100644 --- a/modules/rsplat/components/folk-splat-viewer.ts +++ b/modules/rsplat/components/folk-splat-viewer.ts @@ -1160,6 +1160,8 @@ export class FolkSplatViewer extends HTMLElement { renderer.dispose(); }; } + + startTour() { this._tour?.start(); } } // ── Helpers ── diff --git a/modules/rsplat/landing.ts b/modules/rsplat/landing.ts index af57859..325560e 100644 --- a/modules/rsplat/landing.ts +++ b/modules/rsplat/landing.ts @@ -17,6 +17,11 @@ export function renderLanding(): string { Open Canvas Create a Space +

+ + Start Guided Tour → + +

diff --git a/modules/rtime/components/folk-timebank-app.ts b/modules/rtime/components/folk-timebank-app.ts index af7a826..e72876f 100644 --- a/modules/rtime/components/folk-timebank-app.ts +++ b/modules/rtime/components/folk-timebank-app.ts @@ -1270,6 +1270,26 @@ class FolkTimebankApp extends HTMLElement { this.shadow.getElementById('taskEditOverlay')!.classList.remove('visible'); this.editingTaskNode = null; } + + /* ── Guided Tour ── */ + + private _tour: import('../../../shared/tour-engine').TourEngine | null = null; + + private async _initTour() { + if (this._tour) return; + const { TourEngine } = await import('../../../shared/tour-engine'); + this._tour = new TourEngine(this.shadow as unknown as ShadowRoot, [ + { target: '.tab-bar', title: 'Pool & Weave Views', message: 'Switch between the Commitment Pool (visual orbs) and the Weaving Dashboard (SVG node editor).' }, + { target: '#pool-canvas', title: 'Commitment Pool', message: 'Each floating orb represents a time commitment — sized by hours, colored by skill category.' }, + { target: '#addBtn', title: 'Add a Commitment', message: 'Pledge your hours with a skill category. Your commitment joins the pool for others to see.', advanceOnClick: true }, + { target: '.stats-bar', title: 'Community Stats', message: 'See total hours available and how many contributors are in the pool at a glance.' }, + ], 'rtime_tour_done', () => this.shadow.querySelector('.main') as HTMLElement); + } + + async startTour() { + await this._initTour(); + this._tour?.start(); + } } // ── CSS ── diff --git a/modules/rtime/landing.ts b/modules/rtime/landing.ts index 3af1a80..4f383bd 100644 --- a/modules/rtime/landing.ts +++ b/modules/rtime/landing.ts @@ -27,6 +27,11 @@ export function renderLanding(): string { Create a Space +

+ + Start Guided Tour → + +

diff --git a/modules/rvnb/components/folk-vnb-view.ts b/modules/rvnb/components/folk-vnb-view.ts index 31c182c..33029ff 100644 --- a/modules/rvnb/components/folk-vnb-view.ts +++ b/modules/rvnb/components/folk-vnb-view.ts @@ -503,6 +503,8 @@ class FolkVnbView extends HTMLElement { el.textContent = s || ''; return el.innerHTML; } + + startTour() { this.#tour?.start(); } } if (!customElements.get('folk-vnb-view')) { diff --git a/modules/rvnb/landing.ts b/modules/rvnb/landing.ts index d781cd0..f2206f2 100644 --- a/modules/rvnb/landing.ts +++ b/modules/rvnb/landing.ts @@ -28,6 +28,11 @@ export function renderLanding(): string { Learn More +

+ + Start Guided Tour → + +