- Update FoundryAdapter to properly detect and expose WebRTC stream access
- Modify ScryingPoolStrip to create video elements with WebRTC streams
- Add video container to roster-strip.hbs template with conditional rendering
- Add CSS to hide Foundry's AV dock (#av and .camera-view)
- Add CSS styling for video containers and elements
- Fix unused variable in FoundryAdapter.buildWebRTCSurface
- Add comprehensive test script for stream access implementation
Architecture: Full replacement mode where module hides Foundry's AV dock
and creates its own video elements using game.webrtc.client.getMediaStreamForUser()
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Remove unused StripOverlayLayer import and stripOverlayLayer variable from module.js
- Add comprehensive JSDoc annotations to FoundryAdapter.js methods (settings, socket, users, scenes, notifications, hooks)
- Add /* global Dialog */ comment to PlayerPrivacyPanel.js for ESLint
- Remove unused _force parameter from GMPlayerPrivacySelector.js render() method
- Fix PlayerPrivacyPanelMenu.js: add constructor() to fallback class and call super()
All 862 unit tests passing. All Story 4.2 acceptance criteria met.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Resolved the 'ScryingPoolStrip not found, appending to body' warning by
restructuring the initialization flow:
1. ScryingPoolStrip now creates its own StripOverlayLayer lazily via getter
2. ScryingPoolStrip.stripOverlayLayer returns the layer instance
3. ConfirmationBar accepts ScryingPoolStrip/RoleRenderer and extracts stripOverlayLayer
4. RoleRenderer exposes public .strip getter for ScryingPoolStrip access
5. All components only initialized for GM users (where ScryingPoolStrip exists)
This ensures:
- StripOverlayLayer is created AFTER ScryingPoolStrip DOM element exists
- ConfirmationBar renders correctly positioned within the strip
- No fallback to document.body needed
- Proper separation of concerns (strip owns its overlay layer)
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Moved StripOverlayLayer and ConfirmationBar initialization to occur AFTER
ScryingPoolStrip is created (via roleRenderer.openStrip()). This fixes the
console warning: 'StripOverlayLayer: ScryingPoolStrip not found, appending to body'
The issue was that StripOverlayLayer.init() was trying to find
.scrying-pool__roster-strip before it was created. ScryingPoolStrip is
created lazily when roleRenderer.openStrip() is called.
Additionally, made both components GM-only since:
- ConfirmationBar is in src/ui/gm/ and is only useful for GMs
- StripOverlayLayer is currently only used by ConfirmationBar
- ScryingPoolStrip is only created for GMs
This ensures proper positioning of ConfirmationBar relative to ScryingPoolStrip.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Delete src/ui/shared/ParticipantCard.js (duplicate of boardUtils.js with conflicting implementations)
- Delete tests/unit/ui/shared/ParticipantCard.test.js (tests for deleted file)
- Add directorsBoard to global declarations in ScryingPoolStrip.js to fix lint errors
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>