- Update build output check to look for styles/scrying-pool.css
- Change INCLUDE list from dist/ to styles/
- Provide better error message with expected file path
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Implements configurable video widget widths for small and large dock layouts:
- Add widgetWidthSm and widgetWidthMd world settings (defaults: 83px, 150px)
- Add width dropdown selectors in Director's Board UI
- Apply width settings to participant avatars via CSS custom properties
- Update strip width/height calculations to use custom widths
- Add localization strings for widget width settings
- Add CSS styling for widget width dropdown controls
- Fix Handlebars template syntax for select element selected values
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
The issue: CSS was in dist/styles/ but FoundryVTT expects module CSS
at the root level or in a standard location.
Changes:
- Build CSS to styles/scrying-pool.css (root level) instead of dist/styles/
- Update module.json to reference styles/scrying-pool.css
- Update .gitignore to track styles/scrying-pool.css
- Update build script in package.json
This ensures FoundryVTT can find and load the CSS file properly in live sessions.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Added 'postinstall': 'npm run build' to package.json
- This ensures CSS is automatically rebuilt when dependencies are installed
- Provides better developer experience and ensures CSS is always up-to-date
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Changed .gitignore to ignore dist/ but allow dist/styles/
- This allows the compiled CSS to be tracked while still ignoring other build artifacts
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Updated .gitignore to allow dist/styles/ folder
- Added dist/styles/scrying-pool.css to git tracking
- This ensures users get the compiled CSS when installing from source
Without this, the module would have NO STYLING AT ALL because:
1. dist/ was in .gitignore
2. Users need to run 'npm run build' manually (not standard practice)
3. FoundryVTT modules typically ship with compiled assets
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Fixed TypeError in PlayerPrivacyPanel._onRender: element.querySelector is not a function
- Root cause: FoundryVTT v14 ApplicationV2 passes jQuery objects to _onRender, not plain HTMLElements
- Solution: Normalize parameter to element with querySelector method:
- If HTMLElement, use directly
- If jQuery (has [0]), use html[0]
- Otherwise, use as-is (for test mocks)
- Applied fix to:
- PlayerPrivacyPanel._onRender
- PresetSaveDialog._onRender
- PresetLoadDialog._onRender
- All 900 unit tests passing
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Fixed TypeError: Cannot assign to read only property 'position' of object
- Changed _loadPosition() to use Object.assign() instead of direct assignment
- Added null check for this.options?.position to handle both Foundry and test environments
- Updated fallback _AppBase class to store options in constructor for test compatibility
- Added comprehensive tests for _loadPosition() method
The error occurred because in FoundryVTT v14, ApplicationV2 freezes the options object,
making direct assignment to this.options.position impossible. Using Object.assign()
merges the properties instead, which works with both frozen and unfrozen objects.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Mark Story 5-1 as done in sprint-status.yaml
- Update FoundryAdapter.test.js:
- Updated probeCapability tests to expect 'stream-access' (was 'css-fallback')
- Added tests for all 11 new buildWebRTCSurface methods
- Added input validation tests for userId-taking methods
- Update ScryingPoolStrip.test.js:
- Added tests for hasStreamAccess flag in buildParticipantList
- Added tests for hasStreamAccess in getData()
- Added tests for _attachVideoStream() method
- Added tests for _cleanupVideoStreams() method
All 892 unit tests passing + 7 integration tests passing
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- 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>
Modified GMPlayerPrivacySelectorMenu to extend ApplicationV2 (or fallback class)
to be compatible with FoundryVTT's registerMenu API.
FoundryVTT requires that menu types passed to registerMenu() must be a
FormApplication or ApplicationV2 instance or subclass.
Changes:
- Added conditional _AppBase class (ApplicationV2 or fallback for tests)
- Extended GMPlayerPrivacySelectorMenu from _AppBase
- Added DEFAULT_OPTIONS static property for ApplicationV2 compatibility
- Added super(options) call in constructor
This fixes: Error: You must provide a menu type that is a FormApplication or ApplicationV2 instance or subclass
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Added missing registerMenu method to the settings surface of FoundryAdapter
to support GM Player Privacy Selector menu registration.
This fixes the error: TypeError: _adapter.settings.registerMenu is not a function
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Changed selector from '.scrying-pool__roster-strip' to '.scrying-pool-strip'
to match the actual CSS class defined in ScryingPoolStrip.defaultOptions.
This was the root cause of the warning: 'StripOverlayLayer: ScryingPoolStrip not found'
The class name in ScryingPoolStrip is 'scrying-pool-strip' (set in defaultOptions),
not 'scrying-pool__roster-strip'.
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>
- Created comprehensive story file with 8 acceptance criteria from FR-23, FR-24, FR-25
- Documented PlayerPrivacyManager core logic with DI pattern
- Designed PlayerPrivacyPanel UI component extending ApplicationV2
- Added FoundryAdapter user flag access methods specification
- Integrated Reaction Cam badge into Director's Board design
- Defined all localization strings
- Mapped file structure (new and modified files)
- Specified testing requirements (12-15 new tests)
- Updated sprint-status.yaml: 4-1 from backlog to ready-for-dev, epic-4 to in-progress
- Resolved OQ-GDPR: using user flags for v1.0
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Updated epic-3 status from in-progress to done
- All stories in Epic 3 are now done:
- 3-1-save-and-load-scene-presets: done
- 3-2-scene-auto-apply-and-confirmationbar: done
- 3-3-preset-import-and-export: done
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Updated sprint-status.yaml: 3-1-save-and-load-scene-presets → done
- Updated Story 3.1 file header: Status → done
- Updated last_updated timestamp
Note: Story 3.1 (Save & Load Scene Presets) was implemented as part of
commit a1e8886 (Story 3.2 done) which created ScenePresetManager,
PresetSaveDialog, PresetLoadDialog, and related tests.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Created comprehensive story file for Scene Auto-Apply & ConfirmationBar
- Added detailed acceptance criteria covering FR-17 and FR-18
- Included exhaustive developer context with previous story intelligence
- Specified architecture compliance, file structure, and testing requirements
- Updated sprint-status.yaml to mark 3-2 as ready-for-dev
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>