4 Commits

Author SHA1 Message Date
uberwald 156f786448 Spotlight: double focused participant size (2x widget width + window)
CI / ci (push) Successful in 38s
Release Creation / build (release) Successful in 42s
- _prepareContext doubles widgetWidth when _focusedUserId is set
- _onRender multiplies strip window dimensions by 2 in spotlight mode
- --sp-widget-width CSS var uses doubled value so tile renders at 2x
2026-05-27 11:57:34 +02:00
uberwald 9e80c2c028 Add re-order, spotlight/focus, and auto-position-snapshots features
- HTML5 drag-and-drop reordering of strip participants (per-GM flag)
- Shift+click toggles spotlight focus on a participant (gold ring indicator)
- Escape exits focus mode
- Auto-save strip position on drag end + every 30s with viewport validation
- Reset strip position button in Director's Board
- French locale strings for reset button
2026-05-27 11:44:24 +02:00
uberwald 816b7951fb Various enhancements, restyling and new options
CI / ci (push) Successful in 47s
2026-05-27 11:07:12 +02:00
uberwald 069107052d Add French translation
CI / ci (push) Successful in 56s
Release Creation / build (release) Successful in 1m10s
2026-05-25 22:26:31 +02:00
88 changed files with 18682 additions and 680 deletions
@@ -0,0 +1,76 @@
name: Release Creation
on:
release:
types: [published]
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: echo "💡 The ${{ gitea.repository }} repository will be cloned to the runner."
- uses: RouxAntoine/checkout@v3.5.4
# get part of the tag after the `v`
- name: Extract tag version number
id: get_version
uses: battila7/get-version-action@v2
# Substitute the Manifest and Download URLs in the module.json
- name: Substitute Manifest and Download Links For Versioned Ones
id: sub_manifest_link_version
uses: microsoft/variable-substitution@v1
with:
files: 'module.json'
env:
version: ${{steps.get_version.outputs.version-without-v}}
url: https://www.uberwald.me/gitea/${{gitea.repository}}
manifest: https://www.uberwald.me/gitea/public/${{gitea.repository}}/releases/download/latest/module.json
download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{gitea.event.release.tag_name}}/module.zip
# Set up Node.js
- name: Setup Node.js
uses: https://github.com/actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
# Create a zip file with all files required by the module to add to the release
- run: |
apt update -y
apt install -y zip
- run: node scripts/package.mjs
- name: Upload release assets
run: |
# Upload module.zip
curl -s -X POST \
-H "Content-Type: application/octet-stream" \
-H "Authorization: token ${{secrets.ALLOW_PUSH_RELEASE}}" \
--data-binary @./module.zip \
"https://www.uberwald.me/api/v1/repos/${{gitea.repository}}/releases/${{gitea.event.release.id}}/assets?name=module.zip"
# Upload module.json
curl -s -X POST \
-H "Content-Type: application/json" \
-H "Authorization: token ${{secrets.ALLOW_PUSH_RELEASE}}" \
--data-binary @./module.json \
"https://www.uberwald.me/api/v1/repos/${{gitea.repository}}/releases/${{gitea.event.release.id}}/assets?name=module.json"
- name: Publish to Foundry server
uses: https://github.com/djlechuck/foundryvtt-publish-package-action@v1
with:
token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }}
id: 'scrying-pool'
version: ${{gitea.event.release.tag_name}}
manifest: 'https://www.uberwald.me/gitea/public/${{gitea.repository}}/releases/download/latest/module.json'
notes: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{gitea.event.release.tag_name}}/module.zip'
compatibility-minimum: '14'
compatibility-verified: '14'
@@ -0,0 +1,76 @@
name: Release Creation
on:
release:
types: [published]
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: echo "💡 The ${{ gitea.repository }} repository will be cloned to the runner."
- uses: RouxAntoine/checkout@v3.5.4
# get part of the tag after the `v`
- name: Extract tag version number
id: get_version
uses: battila7/get-version-action@v2
# Substitute the Manifest and Download URLs in the module.json
- name: Substitute Manifest and Download Links For Versioned Ones
id: sub_manifest_link_version
uses: microsoft/variable-substitution@v1
with:
files: 'module.json'
env:
version: ${{steps.get_version.outputs.version-without-v}}
url: https://www.uberwald.me/gitea/${{gitea.repository}}
manifest: https://www.uberwald.me/gitea/public/${{gitea.repository}}/releases/download/latest/module.json
download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{gitea.event.release.tag_name}}/module.zip
# Set up Node.js
- name: Setup Node.js
uses: https://github.com/actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
# Create a zip file with all files required by the module to add to the release
- run: |
apt update -y
apt install -y zip
- run: node scripts/package.mjs
- name: Upload release assets
run: |
# Upload module.zip
curl -s -X POST \
-H "Content-Type: application/octet-stream" \
-H "Authorization: token ${{secrets.RELEASE_SCRYING_POOL}}" \
--data-binary @./module.zip \
"https://www.uberwald.me/api/v1/repos/${{gitea.repository}}/releases/${{gitea.event.release.id}}/assets?name=module.zip"
# Upload module.json
curl -s -X POST \
-H "Content-Type: application/json" \
-H "Authorization: token ${{secrets.ALLOW_PUSH_RELEASE}}" \
--data-binary @./module.json \
"https://www.uberwald.me/api/v1/repos/${{gitea.repository}}/releases/${{gitea.event.release.id}}/assets?name=module.json"
- name: Publish to Foundry server
uses: https://github.com/djlechuck/foundryvtt-publish-package-action@v1
with:
token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }}
id: 'scrying-pool'
version: ${{gitea.event.release.tag_name}}
manifest: 'https://www.uberwald.me/gitea/public/${{gitea.repository}}/releases/download/latest/module.json'
notes: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{gitea.event.release.tag_name}}/module.zip'
compatibility-minimum: '14'
compatibility-verified: '14'
@@ -0,0 +1,76 @@
name: Release Creation
on:
release:
types: [published]
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: echo "💡 The ${{ gitea.repository }} repository will be cloned to the runner."
- uses: RouxAntoine/checkout@v3.5.4
# get part of the tag after the `v`
- name: Extract tag version number
id: get_version
uses: battila7/get-version-action@v2
# Substitute the Manifest and Download URLs in the module.json
- name: Substitute Manifest and Download Links For Versioned Ones
id: sub_manifest_link_version
uses: microsoft/variable-substitution@v1
with:
files: "module.json"
env:
version: ${{steps.get_version.outputs.version-without-v}}
url: https://www.uberwald.me/gitea/${{gitea.repository}}
manifest: https://www.uberwald.me/gitea/public/${{gitea.repository}}/releases/download/latest/module.json
download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{gitea.event.release.tag_name}}/module.zip
# Set up Node.js
- name: Setup Node.js
uses: https://github.com/actions/setup-node@v4
with:
node-version: "20"
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
# Create a zip file with all files required by the module to add to the release
- run: |
apt update -y
apt install -y zip
- run: node scripts/package.mjs
- name: Upload release assets
run: |
# Upload module.zip
curl -s -X POST \
-H "Content-Type: application/octet-stream" \
-H "Authorization: token ${{secrets.RELEASE_SCRYING_POOL}}" \
--data-binary @./module.zip \
"https://www.uberwald.me/api/v1/repos/${{gitea.repository}}/releases/${{gitea.event.release.id}}/assets?name=module.zip"
# Upload module.json
curl -s -X POST \
-H "Content-Type: application/json" \
-H "Authorization: token ${{secrets.RELEASE_SCRYING_POOL}}" \
--data-binary @./module.json \
"https://www.uberwald.me/api/v1/repos/${{gitea.repository}}/releases/${{gitea.event.release.id}}/assets?name=module.json"
- name: Publish to Foundry server
uses: https://github.com/djlechuck/foundryvtt-publish-package-action@v1
with:
token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }}
id: "scrying-pool"
version: ${{gitea.event.release.tag_name}}
manifest: "https://www.uberwald.me/gitea/public/${{gitea.repository}}/releases/download/latest/module.json"
notes: "https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{gitea.event.release.tag_name}}/module.zip"
compatibility-minimum: "14"
compatibility-verified: "14"
@@ -0,0 +1,76 @@
name: Release Creation
on:
release:
types: [published]
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: echo "💡 The ${{ gitea.repository }} repository will be cloned to the runner."
- uses: RouxAntoine/checkout@v3.5.4
# get part of the tag after the `v`
- name: Extract tag version number
id: get_version
uses: battila7/get-version-action@v2
# Substitute the Manifest and Download URLs in the module.json
- name: Substitute Manifest and Download Links For Versioned Ones
id: sub_manifest_link_version
uses: microsoft/variable-substitution@v1
with:
files: "module.json"
env:
version: ${{steps.get_version.outputs.version-without-v}}
url: https://www.uberwald.me/gitea/${{gitea.repository}}
manifest: https://www.uberwald.me/gitea/public/${{gitea.repository}}/releases/download/latest/module.json
download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{gitea.event.release.tag_name}}/module.zip
# Set up Node.js
- name: Setup Node.js
uses: https://github.com/actions/setup-node@v4
with:
node-version: "20"
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
# Create a zip file with all files required by the module to add to the release
- run: |
apt update -y
apt install -y zip
- run: node scripts/package.mjs
- name: Upload release assets
run: |
# Upload module.zip
curl -s -X POST \
-H "Content-Type: application/octet-stream" \
-H "Authorization: token ${{secrets.RELEASE_SCRYING_POOL}}" \
--data-binary @./module.zip \
"https://www.uberwald.me/api/v1/repos/${{gitea.repository}}/releases/${{gitea.event.release.id}}/assets?name=module.zip"
# Upload module.json
curl -s -X POST \
-H "Content-Type: application/json" \
-H "Authorization: token ${{secrets.RELEASE_SCRYING_POOL}}" \
--data-binary @./module.json \
"https://www.uberwald.me/api/v1/repos/${{gitea.repository}}/releases/${{gitea.event.release.id}}/assets?name=module.json"
- name: Publish to Foundry server
uses: https://github.com/djlechuck/foundryvtt-publish-package-action@v1
with:
token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }}
id: "scrying-pool"
version: ${{gitea.event.release.tag_name}}
manifest: "https://www.uberwald.me/gitea/public/${{gitea.repository}}/releases/download/latest/module.json"
notes: "https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{gitea.event.release.tag_name}}/module.zip"
compatibility-minimum: "14"
compatibility-verified: "14"
@@ -0,0 +1,76 @@
name: Release Creation
on:
release:
types: [published]
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: echo "💡 The ${{ gitea.repository }} repository will be cloned to the runner."
- uses: RouxAntoine/checkout@v3.5.4
# get part of the tag after the `v`
- name: Extract tag version number
id: get_version
uses: battila7/get-version-action@v2
# Substitute the Manifest and Download URLs in the module.json
- name: Substitute Manifest and Download Links For Versioned Ones
id: sub_manifest_link_version
uses: microsoft/variable-substitution@v1
with:
files: "module.json"
env:
version: ${{steps.get_version.outputs.version-without-v}}
url: https://www.uberwald.me/gitea/${{gitea.repository}}
manifest: https://www.uberwald.me/gitea/public/${{gitea.repository}}/releases/download/latest/module.json
download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{gitea.event.release.tag_name}}/module.zip
# Set up Node.js
- name: Setup Node.js
uses: https://github.com/actions/setup-node@v4
with:
node-version: "20"
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
# Create a zip file with all files required by the module to add to the release
- run: |
apt update -y
apt install -y zip
- run: node scripts/package.mjs
- name: Upload release assets
run: |
# Upload module.zip
curl -s -X POST \
-H "Content-Type: application/octet-stream" \
-H "Authorization: token ${{secrets.RELEASE_SCRYING_POOL}}" \
--data-binary @./module.zip \
"https://www.uberwald.me/api/v1/repos/${{gitea.repository}}/releases/${{gitea.event.release.id}}/assets?name=module.zip"
# Upload module.json
curl -s -X POST \
-H "Content-Type: application/json" \
-H "Authorization: token ${{secrets.RELEASE_SCRYING_POOL}}" \
--data-binary @./module.json \
"https://www.uberwald.me/api/v1/repos/${{gitea.repository}}/releases/${{gitea.event.release.id}}/assets?name=module.json"
# - name: Publish to Foundry server
# uses: https://github.com/djlechuck/foundryvtt-publish-package-action@v1
# with:
# token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }}
# id: "scrying-pool"
# version: ${{gitea.event.release.tag_name}}
# manifest: "https://www.uberwald.me/gitea/public/${{gitea.repository}}/releases/download/latest/module.json"
# notes: "https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{gitea.event.release.tag_name}}/module.zip"
# compatibility-minimum: "14"
# compatibility-verified: "14"
+32
View File
@@ -0,0 +1,32 @@
{
"id": "scrying-pool",
"title": "Scrying Pool",
"version": "0.1.0",
"description": "GM camera visibility control for FoundryVTT v14 — hide, show, and manage participant feeds in real time.",
"authors": [
{
"name": "Morr"
}
],
"compatibility": {
"minimum": "14",
"verified": "14"
},
"esmodules": [
"module.js"
],
"styles": [
"styles/scrying-pool.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
}
],
"url": "${url}",
"manifest": "${manifest}",
"download": "${download}",
"flags": {}
}
+32
View File
@@ -0,0 +1,32 @@
{
"id": "scrying-pool",
"title": "Scrying Pool",
"version": "0.1.0",
"description": "GM camera visibility control for FoundryVTT v14 — hide, show, and manage participant feeds in real time.",
"authors": [
{
"name": "Morr"
}
],
"compatibility": {
"minimum": "14",
"verified": "14"
},
"esmodules": [
"module.js"
],
"styles": [
"styles/scrying-pool.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
}
],
"url": "${url}",
"manifest": "${manifest}",
"download": "${download}",
"flags": {}
}
+34
View File
@@ -0,0 +1,34 @@
{
"id": "scrying-pool",
"title": "Scrying Pool",
"version": "0.1.0",
"description": "GM camera visibility control for FoundryVTT v14 — hide, show, and manage participant feeds in real time.",
"authors": [
{
"name": "Morr"
}
],
"compatibility": {
"minimum": "14",
"verified": "14"
},
"esmodules": [
"module.js"
],
"styles": [
"styles/scrying-pool.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
}
],
"packs": [
],
"url": "${url}",
"manifest": "${manifest}",
"download": "${download}",
"flags": {}
}
+34
View File
@@ -0,0 +1,34 @@
{
"id": "scrying-pool",
"title": "Scrying Pool",
"version": "0.1.0",
"description": "GM camera visibility control for FoundryVTT v14 — hide, show, and manage participant feeds in real time.",
"authors": [
{
"name": "Morr"
}
],
"compatibility": {
"minimum": "14",
"verified": "14"
},
"esmodules": [
"module.js"
],
"styles": [
"styles/scrying-pool.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
}
],
"packs": [
],
"url": "${url}",
"manifest": "${manifest}",
"download": "${download}",
"flags": {}
}
+34
View File
@@ -0,0 +1,34 @@
{
"id": "scrying-pool",
"title": "Scrying Pool",
"version": "0.1.0",
"description": "GM camera visibility control for FoundryVTT v14 — hide, show, and manage participant feeds in real time.",
"authors": [
{
"name": "Morr"
}
],
"compatibility": {
"minimum": "14",
"verified": "14"
},
"esmodules": [
"module.js"
],
"styles": [
"styles/scrying-pool.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
}
],
"packs": [
],
"url": "${url}",
"manifest": "${manifest}",
"download": "${download}",
"flags": {}
}
+34
View File
@@ -0,0 +1,34 @@
{
"id": "scrying-pool",
"title": "Scrying Pool",
"version": "0.1.0",
"description": "GM camera visibility control for FoundryVTT v14 — hide, show, and manage participant feeds in real time.",
"authors": [
{
"name": "Morr"
}
],
"compatibility": {
"minimum": "14",
"verified": "14"
},
"esmodules": [
"module.js"
],
"styles": [
"styles/scrying-pool.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
}
],
"packs": [
],
"url": "${url}",
"manifest": "${manifest}",
"download": "${download}",
"flags": {}
}
+34
View File
@@ -0,0 +1,34 @@
{
"id": "scrying-pool",
"title": "Scrying Pool",
"version": "0.1.0",
"description": "GM camera visibility control for FoundryVTT v14 — hide, show, and manage participant feeds in real time.",
"authors": [
{
"name": "Morr"
}
],
"compatibility": {
"minimum": "14",
"verified": "14"
},
"esmodules": [
"module.js"
],
"styles": [
"styles/scrying-pool.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
}
],
"packs": [
],
"url": "${url}",
"manifest": "${manifest}",
"download": "${download}",
"flags": {}
}
+34
View File
@@ -0,0 +1,34 @@
{
"id": "scrying-pool",
"title": "Scrying Pool",
"version": "0.1.0",
"description": "GM camera visibility control for FoundryVTT v14 — hide, show, and manage participant feeds in real time.",
"authors": [
{
"name": "Morr"
}
],
"compatibility": {
"minimum": "14",
"verified": "14"
},
"esmodules": [
"module.js"
],
"styles": [
"styles/scrying-pool.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
}
],
"packs": [
],
"url": "${url}",
"manifest": "${manifest}",
"download": "${download}",
"flags": {}
}
+34
View File
@@ -0,0 +1,34 @@
{
"id": "scrying-pool",
"title": "Scrying Pool",
"version": "0.1.0",
"description": "GM camera visibility control for FoundryVTT v14+ — hide, show, and manage participant feeds in real time.",
"authors": [
{
"name": "Morr"
}
],
"compatibility": {
"minimum": "14",
"verified": "14"
},
"esmodules": [
"module.js"
],
"styles": [
"styles/scrying-pool.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
}
],
"packs": [
],
"url": "${url}",
"manifest": "${manifest}",
"download": "${download}",
"flags": {}
}
+37
View File
@@ -0,0 +1,37 @@
{
"id": "scrying-pool",
"title": "Scrying Pool",
"version": "0.1.0",
"description": "GM camera visibility control for FoundryVTT v14+ — hide, show, and manage participant feeds in real time.",
"authors": [
{
"name": "Morr"
}
],
"compatibility": {
"minimum": "14",
"verified": "14"
},
"esmodules": [
"module.js"
],
"styles": [
"styles/scrying-pool.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
},
{
"lang": "es",
"name": "Spanish",
"path": "lang/es.json"
}
],
"url": "${url}",
"manifest": "${manifest}",
"download": "${download}",
"flags": {}
}
+37
View File
@@ -0,0 +1,37 @@
{
"id": "scrying-pool",
"title": "Scrying Pool",
"version": "0.1.0",
"description": "GM camera visibility control for FoundryVTT v14+ — hide, show, and manage participant feeds in real time.",
"authors": [
{
"name": "Morr"
}
],
"compatibility": {
"minimum": "14",
"verified": "14"
},
"esmodules": [
"module.js"
],
"styles": [
"styles/scrying-pool.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
},
{
"lang": "fr",
"name": "French",
"path": "lang/fr.json"
}
],
"url": "${url}",
"manifest": "${manifest}",
"download": "${download}",
"flags": {}
}
+37
View File
@@ -0,0 +1,37 @@
{
"id": "scrying-pool",
"title": "Scrying Pool",
"version": "0.1.0",
"description": "GM camera visibility control for FoundryVTT v14+ — hide, show, and manage participant feeds in real time.",
"authors": [
{
"name": "Morr"
}
],
"compatibility": {
"minimum": "14",
"verified": "14"
},
"esmodules": [
"module.js"
],
"styles": [
"styles/scrying-pool.css"
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
},
{
"lang": "fr",
"name": "French",
"path": "lang/fr.json"
}
],
"url": "${url}",
"manifest": "${manifest}",
"download": "${download}",
"flags": {}
}
+86
View File
@@ -0,0 +1,86 @@
# Scrying Pool Documentation Pack
**Compendium is now built and ready!**
## Structure
- `scrying-pool-docs.db` - **Pre-built SQLite compendium database** (20KB)
- `scrying-pool-guide.json` - Source JournalEntry content (English & French)
- `assets/` - Screenshot images (5 JPG files)
## What's Included
The `scrying-pool-docs.db` file contains a **JournalEntry** with:
- **2 pages**: English and French documentation
- **Professional styling** with CSS
- **5 screenshot references** (screenshot-main.jpg, screenshot-directors-board.jpg, etc.)
## Current Setup
The `module.json` defines the pack:
```json
{
"packs": [
{
"name": "scrying-pool-documentation",
"label": "Scrying Pool Documentation",
"path": "packs/scrying-pool-docs.db",
"system": "",
"type": "JournalEntry"
}
]
}
```
When the module is installed in FoundryVTT, the **"Scrying Pool Documentation"** compendium will appear under the **Modules** tab with the JournalEntry already populated.
## Updating the Documentation
To update the documentation content:
### Option 1: Using the build script (Recommended)
```bash
# Edit the JSON source
nano packs/scrying-pool-guide.json
# Rebuild the database
node scripts/build-compendium.cjs
```
### Option 2: Manual SQLite editing
```bash
sqlite3 packs/scrying-pool-docs.db
```
### Option 3: Using fvtt-cli (Alternative)
```bash
npm install -g @foundryvtt/fvtt-cli
fvtt-cli pack create \
--input packs/scrying-pool-guide.json \
--output packs/scrying-pool-docs.db \
--type JournalEntry
```
## File Structure
```
packs/
├── scrying-pool-docs.db # SQLite database (compendium)
├── scrying-pool-guide.json # Source JSON (for editing)
├── README.md # This file
└── assets/
├── README.md
├── screenshot-main.jpg
├── screenshot-directors-board.jpg
├── screenshot-player-view.jpg
├── screenshot-presets.jpg
└── screenshot-badge-states.jpg
```
## Technical Details
- **Database**: SQLite3 with WAL mode enabled
- **Table**: `JournalEntry` with FoundryVTT v14 schema
- **JournalEntry ID**: `scrying-pool-guide`
- **Name**: "Scrying Pool - User Guide / Guide de l'utilisateur"
- **Pages**: 2 (English and French)
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+55
View File
@@ -0,0 +1,55 @@
# Scrying Pool — Agent Instructions
FoundryVTT v14 module for GM camera visibility control. Ships as raw ES modules (no bundler). Entry: `module.js``module.json:esmodules`.
## Commands (run in order: lint → typecheck → test → build)
| Intent | Command |
|--------|---------|
| Lint | `npm run lint` |
| Typecheck | `npm run typecheck` |
| Test (unit) | `npm run test` |
| Test (watch) | `npm run test:watch` |
| Build CSS | `npm run build` |
| Release | `npm run release` |
| E2E test | `npm test` in `tests/e2e/` |
**Watch is broken**`npm run watch` outputs to `dist/styles/` (gitignored) instead of `styles/`. Use `npm run build` manually.
Version source of truth: `package.json`; `scripts/package.mjs` copies it to `module.json` at release.
## Architecture
- **`module.js`** — wiring diagram ONLY. Imports, constructs with DI, registers hooks. Zero business logic. Never add logic here.
- **`src/contracts/`** — data contracts/DTOs. Must not import from any other `src/` module.
- **`src/utils/`** — utilities. Must not import from any other `src/` module.
- **`src/core/`** — business logic. May import from `contracts/` and `utils/` only.
- **`src/foundry/`** — `FoundryAdapter.js` is the sole gateway to `game.*` APIs. Same import restriction as `core/`.
- **`src/core/``src/foundry/`** — never cross-import. Enforced by ESLint `import/no-restricted-paths`.
- **Constructor side-effect-free** — no hooks/socket registration in constructors; call `init()` from `Hooks.once('ready')` in `module.js`.
## Testing
- **Vitest** with `happy-dom`, `globals: false` — always import `describe`, `it`, `expect`, `vi` explicitly.
- **Path aliases** (vitest only): `@src`, `@contracts`, `@utils`, `@tests`.
- **Mock factory** — always use `createFoundryAdapterMock()` from `tests/helpers/foundryAdapterMock.js`. No ad-hoc stubs.
- **Hooks** is stubbed globally via `vi.stubGlobal('Hooks', ...)` in each test's `beforeEach`.
- **E2E tests** live in `tests/e2e/` with separate `package.json`. Need live FoundryVTT at `https://localhost:31000` (user: `gamemaster`). Not run in CI.
- **`@ts-nocheck`** is used at top of many test files — this is normal for this repo.
## FoundryVTT specifics
- Globals injected at runtime: `Hooks`, `game`, `ui`, `canvas`, `foundry`, `CONFIG`, `CONST` — listed as ESLint `readonly` globals.
- Type checking (`tsc --noEmit`) only covers `module.js`. Source files are NOT typechecked.
- Type defs from `@league-of-foundry-developers/foundry-vtt-types` (9.x) + local `src/types/foundry-globals.d.ts`.
- CSS scoped under `.scrying-pool`, token vars prefixed `--sp-*`, compiled from LESS via `npm run build`.
## CI & releases
- **Gitea** (not GitHub) at `uberwald.me/gitea/`. CI uses `RouxAntoine/checkout@v3.5.4`.
- CI: `npm ci``npm audit --production``npm run lint``npm run typecheck``npm run test``npm run build`.
- Release: triggered on tag publish, substitutes `module.json` URLs, creates `module.zip`, uploads via curl + Gitea API token.
## Design docs
Full project history in `_bmad-output/` — PRDs, architecture specs, epics, deferred work tracking. For deep context start with `_bmad-output/planning-artifacts/architecture.md` and `_bmad-output/planning-artifacts/epics.md`.
@@ -0,0 +1,121 @@
---
title: 'Strip: Reorder, Spotlight & Auto-Snapshots'
type: 'feature'
created: '2026-05-27'
status: 'done'
baseline_commit: '816b7951fb88353b43c66e7b9f898701ea65ad2b'
context: []
---
<frozen-after-approval reason="human-owned intent — do not modify unless human renegotiates">
## Intent
**Problem:** Strip participants have a fixed order, no way to focus a single participant, and position is only saved on close.
**Approach:** Add HTML5 drag-and-drop reordering (per-GM flag), Shift+click spotlight (in-memory, one-tile focus mode), and periodic auto-save of strip position (debounced + 30s interval with viewport validation).
## Boundaries & Constraints
**Always:**
- Re-order: persists to `game.user.setFlag('scrying-pool', 'participantOrder', string[])`, per-GM only
- Spotlight: in-memory `_focusedUserId` only, no socket/persistence
- Auto-snapshots: extends existing `stripState` flag (`left, top, width, height, savedAt`), backward-compatible
- All three features are strip-only (not Director's Board)
- French locale strings in `scrying-pool.lang.fr.json`
**Ask First:** None
**Never:**
- No external drag-and-drop libraries
- No socket broadcasts for re-order or spotlight
- No CSS animation framework changes
## I/O & Edge-Case Matrix
| Scenario | Input / State | Expected Output / Behavior | Error Handling |
|----------|--------------|---------------------------|----------------|
| Re-order: drag participant | Drag start on tile | Tile shows `opacity: 0.3` during drag | N/A |
| Re-order: drop between tiles | Drop at new position | Participant order updates, flag saved, strip re-renders | Save failure silently caught |
| Re-order: double-click grip | Double-click grip area | Order resets to connection order | N/A |
| Spotlight: Shift+click | Shift+click participant | Only that participant visible, others `display:none` in DOM, strip resized | N/A |
| Spotlight: exit via Escape | Press Escape | Full list restored, `_focusedUserId` cleared | N/A |
| Spotlight: exit via button | Click exit-focus button (replaces DB icon) | Same as Escape | N/A |
| Auto-snapshot: drag ends | mouseup after drag | Debounced save to `stripState` flag | Save failure silently caught |
| Auto-snapshot: 30s timer | Interval fires | Save current position to `stripState` | Save failure silently caught |
| Auto-snapshot: position off-screen | Saved position outside viewport | Fall back to default position | Silent fallback, no error |
</frozen-after-approval>
## Code Map
- `src/ui/gm/ScryingPoolStrip.js` — All three features: drag handlers, spotlight state, auto-save timer
- `styles/components/_roster-strip.less` — Drag feedback (`opacity: 0.3`), spotlight visual state
- `templates/directors-board.hbs` — Reset strip position button
- `src/ui/gm/DirectorsBoard.js` — Reset position handler
- `module.js` — (no changes needed, instantiates the class)
- `scrying-pool.lang.fr.json` — French locale strings
## Tasks & Acceptance
**Execution:**
- [x] `src/ui/gm/ScryingPoolStrip.js` — Add `_focusedUserId`, drag handlers, _savePosition, re-order in _prepareContext
- [x] `styles/components/_roster-strip.less``.sp-state-focused` gold ring, drag ghost opacity
- [x] `templates/directors-board.hbs` — Reset strip position button
- [x] `src/ui/gm/DirectorsBoard.js``_onResetStripPosition()` handler
**Acceptance Criteria:**
- Given a strip with 3+ participants, when GM drags a participant tile to a new position, then the participant order updates and persists across re-renders
- Given any layout, when GM Shift+clicks a participant, then other participants collapse and the focused tile shows gold state ring
- Given spotlight mode is active, when GM presses Escape, then all participants return to normal
- Given the strip is open, when GM drags the strip to a new position and releases, then the position is saved
- Given a saved off-screen position, when the strip re-renders, then it appears at default coordinates
## Suggested Review Order
**Re-order + Spotlight core logic**
- Entry point: participant filtering, DnD handlers, focus toggle, position save
[`ScryingPoolStrip.js:149`](../../src/ui/gm/ScryingPoolStrip.js#L149)
- Drag-drop splice with `fromIdx < toIdx` adjustment + null guard on element
[`ScryingPoolStrip.js:1013`](../../src/ui/gm/ScryingPoolStrip.js#L1013)
- Focus toggle toggles `_focusedUserId`, re-renders; Escape exits via document listener
[`ScryingPoolStrip.js:1076`](../../src/ui/gm/ScryingPoolStrip.js#L1076)
- Auto-save: called on grip mouseup + 30s interval; cleanup on teardown
[`ScryingPoolStrip.js:1094`](../../src/ui/gm/ScryingPoolStrip.js#L1094)
- Viewport-validated position restore with negative-value guard
[`ScryingPoolStrip.js:178`](../../src/ui/gm/ScryingPoolStrip.js#L178)
**Template changes**
- `isFocused` conditional class for gold ring on focused participant
[`roster-strip.hbs:54`](../../templates/roster-strip.hbs#L54)
- Reset strip position button in Director's Board footer
[`directors-board.hbs:140`](../../templates/directors-board.hbs#L140)
**CSS**
- Gold state ring for `.sp-state-focused`, drag ghost opacity, drop target indicator
[`_roster-strip.less:517`](../../styles/components/_roster-strip.less#L517)
**Director's Board**
- Reset position handler clears stripState flag
[`DirectorsBoard.js:861`](../../src/ui/gm/DirectorsBoard.js#L861)
**Locales**
- Reset strip button strings (EN + FR)
[`en.json:82`](../../lang/en.json#L82) · [`fr.json:82`](../../lang/fr.json#L82)
## Verification
**Commands:**
- `npm run lint` -- expected: 0 errors
- `npm run typecheck` -- expected: 0 errors
- `npm run test` -- expected: all tests pass
@@ -12,7 +12,12 @@ inputDocuments:
workflowType: 'architecture'
project_name: 'video-view-manager'
user_name: 'Morr'
date: '2026-05-20'
date: '2026-05-27'
extendedAt: '2026-05-27'
extendedFeatures:
- reorder-participants
- spotlight-focus
- auto-position-snapshots
---
# Architecture Decision Document: Video View Manager (Scrying Pool)
@@ -1091,3 +1096,82 @@ both critical gaps found during validation were resolved inline without reopenin
Story 0 scaffold — `module.json` + `tsconfig.json` + `vitest.config.js` + `.eslintrc.js` +
`scripts/package.mjs` + `src/contracts/` (with validators + frozen fixtures) +
`.gitea/workflows/ci.yml` — all Story 0 ACs green before any Story 1 code.
---
## Feature Addendum (2026-05-27): Re-order Participants
### Problem
Strip participant order is fixed to user connection order. GM cannot rearrange participants to match table seating, spotlight priority, or personal preference.
### Decision: Drag-and-drop via native HTML5 API
| Decision | Choice | Rationale |
|---|---|---|
| Mechanism | HTML5 Drag & Drop (`draggable`, `dragstart`/`dragover`/`drop` events) | Zero dependencies; works in Foundry's embedded Chromium; no external lib needed |
| Persistence | User flag: `game.user.setFlag('scrying-pool', 'participantOrder', string[])` | Per-GM order; does not affect other GMs or players |
| Storage format | Ordered array of user IDs | Minimal, sortable, forward-compatible |
| Visual feedback | `opacity: 0.3` on dragged tile + `box-shadow` drop indicator on target gap | Lightweight; no layout shift |
| Reset | Double-click the grip area → reset to connection order | Escape hatch if order gets confusing |
| Scope | Strip only (not Director's Board) | Strip is the primary real-estate; DB reorder adds complexity with no clear need |
### Implementation Notes
- `ScryingPoolStrip` gets `_onDragStart`, `_onDragOver`, `_onDrop`, `_onDragEnd` handlers
- Attached in `_onRender` via `el.addEventListener`
- On drop: reorder participant list in `_prepareContext`, persist to user flag
- `_prepareContext` reads flag, applies order before filtering hidden participants
- No socket broadcast — order is per-GM/local-only
---
## Feature Addendum (2026-05-27): Spotlight / Focus
### Problem
In all layouts, participants share equal visual weight. GM cannot temporarily focus on one participant's video feed (e.g., a player speaking, a dramatic reveal).
### Decision: One-tile-expand mode within the strip
| Decision | Choice | Rationale |
|---|---|---|
| Activation | Click on participant avatar while holding `Shift` (or context menu → "Focus") | Intentional action; avoids accidental triggers |
| Visual | Selected tile expands to fill strip content area; other tiles collapse to `height: 0; overflow: hidden` (preserved in DOM for instant restore) | No layout reflow on restore; preserved DOM state |
| Restore | Click `Shift+click` again, or click an "Exit focus" button that replaces the toolbar, or press `Escape` | Multiple escape hatches |
| State | In-memory only: `_focusedUserId: string|null` on `ScryingPoolStrip` | Ephemeral — no persistence needed |
| Indicator | Focused tile gets `.sp-state-focused` class → gold state ring (`--sp-urgency-director`) | Visual consistency with existing state ring system |
| Strip sizing | `setPosition` recomputed with `1` participant during focus | Window snaps to single-tile dimensions |
| Layout compatibility | Works in all layouts (vertical, horizontal, mosaic) | Tile fills available space via same CSS that handles single-participant edge case |
| Director's Board | Unaffected — spotlight is strip-only | DB maintains overview while strip focuses |
### Implementation Notes
- `_focusedUserId` field on `ScryingPoolStrip`
- `_prepareContext` filters or transforms participant list: if `_focusedUserId` set, only that participant is visible; others have `hidden: true` (but preserved in DOM)
- Restore clears `_focusedUserId` → re-render → full list visible
- CSS: `.sp-participant-avatar.sp-state-focused` inherits existing state ring pattern (green → gold via `--sp-urgency-director`)
- No socket broadcast — purely local UI state
---
## Feature Addendum (2026-05-27): Auto Position Snapshots
### Problem
Strip position is saved only on close. If the browser window is resized, display changed, or the strip is accidentally dragged off-screen, there is no way to restore a known-good position without relaunching.
### Decision: Periodic auto-save + explicit save/restore
| Decision | Choice | Rationale |
|---|---|---|
| Auto-save trigger | `debounced` save on `mouseup` after drag ends | Saves only when user finishes moving; no save storm during drag |
| Auto-save interval | Also every 30s via `setInterval` while strip is open | Safety net if drag event fails to fire |
| Storage | User flag: `game.user.setFlag('scrying-pool', 'stripState')` | Already partially used (saves on close); extend to include timestamp |
| Save payload | `{ left, top, width, height, savedAt }` | Position + dimensions + timestamp for diagnostics |
| Restore trigger | On `_onRender` — if saved position exists and strip has no explicit position yet | First render gets saved position |
| Reset | Director's Board button "Reset strip position" → clears flag + re-renders at default position | Manual escape hatch |
| Multi-monitor safety | Validate `saved.left` and `saved.top` are within available viewport (`window.screen.availWidth/Height`) before applying | Prevents strip from loading off-screen after monitor config change |
### Implementation Notes
- Extend existing `_loadPosition()` in `ScryingPoolStrip` — already reads `stripState` flag
- Add `_savePosition()` called on `mouseup` after drag + every 30s interval
- Viewport validation: `saved.left < screen.availWidth - 50 && saved.top < screen.availHeight - 50`
- On validation failure: silently fall back to default position (no error notification)
- Director's Board: add "Reset strip position" button (minor template change)
- Extends existing `stripState` flag — no new flags needed, backward-compatible with old saves
+8 -1
View File
@@ -30,6 +30,12 @@
"avConfigGMOnly": "A/V settings are managed by the GM.",
"AVDisabled": "Audio/Video is not available in this FoundryVTT instance. Scrying Pool camera control features are disabled."
},
"stream": {
"lost": "Video stream lost for {name}",
"recovering": "Attempting to recover video for {name}…",
"recovered": "Video stream recovered for {name}",
"failed": "Unable to recover video for {name}. Showing avatar fallback."
},
"settings": {
"showGMSelfFeed": {
"label": "Show GM Self Feed",
@@ -73,7 +79,8 @@
"avModeEnable": "Enable A/V",
"avModeDisable": "Disable A/V",
"avConfig": "A/V Settings…",
"avConfigTitle": "Open Foundry A/V server settings (signaling server, LiveKit, etc.)"
"avConfigTitle": "Open Foundry A/V server settings (signaling server, LiveKit, etc.)",
"resetStrip": "Reset Strip Position"
},
"bulk": {
"showAll": "Show All",
+224
View File
@@ -0,0 +1,224 @@
{
"scrying-pool": {
"badge": {
"state": {
"hidden": "Masqué de la table",
"self-muted": "Caméra en pause",
"offline": "Non connecté",
"cam-lost": "Caméra indisponible",
"reconnecting": "Rejoindre la vue",
"never-connected": "Pas encore connecté",
"ghost": "Quitte la session"
}
},
"firstEncounterPanel": {
"title": "Votre visibilité caméra a changé.",
"body": "L'audio continue normalement.",
"gotIt": "Compris"
},
"detailsPanel": {
"close": "Fermer",
"audienceSuppressed": "Les autres joueurs ne peuvent pas voir votre flux",
"staleData": "Les données peuvent être obsolètes",
"audioReassurance": "Votre audio est actif pour tous les participants."
},
"notifications": {
"gmHid": "Le MJ a masqué la caméra de {name}",
"gmShowed": "Le MJ a affiché la caméra de {name}",
"personalHidden": "Le MJ a masqué votre caméra. Votre portrait est affiché aux autres participants.",
"personalShowed": "Votre caméra est maintenant visible à la table.",
"avConfigGMOnly": "Les paramètres audio/vidéo sont gérés par le MJ.",
"AVDisabled": "L'audio/vidéo n'est pas disponible dans cette instance de FoundryVTT. Les fonctionnalités de contrôle caméra de Scrying Pool sont désactivées."
},
"stream": {
"lost": "Flux vidéo perdu pour {name}",
"recovering": "Tentative de récupération de la vidéo pour {name}…",
"recovered": "Flux vidéo rétabli pour {name}",
"failed": "Impossible de récupérer la vidéo pour {name}. Affichage du portrait de secours."
},
"settings": {
"showGMSelfFeed": {
"label": "Afficher le flux du MJ",
"hint": "Lorsque activé, le propre flux caméra du MJ est affiché dans la barre Scrying Pool."
},
"notificationVerbosity": {
"label": "Verbosité des notifications",
"hint": "Contrôle quelles notifications de changement d'état de caméra vous voyez. 'Toutes' affiche chaque changement ; 'MJ uniquement' affiche uniquement les changements pour le MJ et le participant concerné ; 'Silencieux' supprime toutes les notifications sauf vos propres changements de caméra.",
"choices": {
"all": "Toutes",
"gm-only": "MJ uniquement",
"silent": "Silencieux"
}
}
},
"directorsBoard": {
"title": "Tableau du Réalisateur",
"close": "Fermer",
"empty": "Aucun participant connecté.",
"openButton": "Ouvrir le Tableau du Réalisateur",
"dockLayout": {
"label": "Disposition de la vue",
"vertical-sm": "Verticale petite",
"vertical-md": "Verticale grande",
"horizontal-sm": "Horizontale petite",
"horizontal-md": "Horizontale grande",
"mosaic-sm": "Mosaïque petite",
"mosaic-md": "Mosaïque grande"
},
"widgetWidth": {
"label": "Largeurs des widgets vidéo",
"small": "Petite :",
"large": "Grande :"
},
"footer": {
"savePreset": "Sauvegarder la disposition",
"loadPreset": "Charger la disposition",
"exportPresets": "Exporter",
"importPresets": "Importer",
"autoApplySettings": "Application auto...",
"avModeEnable": "Activer A/V",
"avModeDisable": "Désactiver A/V",
"avConfig": "Paramètres A/V...",
"avConfigTitle": "Ouvrir les paramètres du serveur A/V de Foundry (serveur de signalisation, LiveKit, etc.)",
"resetStrip": "Réinitialiser la position de la barre"
},
"bulk": {
"showAll": "Tout afficher",
"hideAll": "Tout masquer",
"undo": "Annuler",
"restore": "Rétablir",
"spotlight": "Mettre en avant"
},
"shortcuts": {
"title": "Raccourcis clavier",
"openBoard": "Ouvrir/Fermer le tableau",
"showAll": "Afficher tous les participants",
"hideAll": "Masquer tous les participants",
"spotlight": "Mettre le participant sélectionné en avant",
"openPanel": "Ouvrir la référence des raccourcis"
}
},
"keybindings": {
"showAll": {
"name": "Afficher tous les participants",
"hint": "Définir tous les flux des participants non-fantômes sur visible"
},
"hideAll": {
"name": "Masquer tous les participants",
"hint": "Définir tous les flux des participants non-fantômes sur masqué"
},
"spotlightParticipant": {
"name": "Mettre le participant en avant",
"hint": "Affiche le participant sélectionné et masques tous les autres"
}
},
"presets": {
"save": {
"saveButton": "Sauvegarder la disposition",
"cancelButton": "Annuler",
"title": "Sauvegarder la disposition caméra",
"nameLabel": "Nom de la disposition",
"namePlaceholder": "ex. Combat, Jeu de rôle, Introduction...",
"descriptionHint": "Sauvegarde la disposition actuelle de visibilité des caméras pour tous les participants."
},
"load": {
"loadButton": "Charger",
"cancelButton": "Annuler",
"title": "Charger la disposition caméra",
"emptyMessage": "Aucune disposition sauvegardée pour l'instant. Utilisez 'Sauvegarder la disposition' pour en créer une."
},
"notifications": {
"saved": "Disposition '{name}' sauvegardée.",
"applied": "Disposition '{name}' appliquée.",
"scene-applied": "Scène changée : disposition caméra mise à jour"
}
},
"scenePresetPanel": {
"title": "Paramètres d'application automatique",
"enableAutoApply": "Activer l'application automatique",
"preset": "Disposition",
"selectPreset": "Sélectionner une disposition...",
"preDelay": "Pré-délai",
"globalSettingsHint": "L'application automatique peut aussi être activée/désactivée globalement dans les paramètres du module.",
"noScene": "Aucune scène n'est actuellement active.",
"notifications": {
"enabled": "Application automatique activée pour cette scène.",
"disabled": "Application automatique désactivée pour cette scène.",
"presetSelected": "Disposition d'application automatique définie sur : {name}"
}
},
"presetExport": {
"title": "Exporter les dispositions caméra",
"description": "Téléchargez toutes les dispositions caméra sous forme de fichier JSON pouvant être importé dans un autre monde.",
"scene": "Scène",
"presetCount": "Dispositions",
"filename": "Nom du fichier",
"export": "Exporter",
"cancel": "Annuler",
"exporting": "Exportation en cours...",
"exportSuccess": "Dispositions caméra exportées avec succès.",
"exportFailed": "Échec de l'export des dispositions"
},
"presetImport": {
"title": "Importer les dispositions caméra",
"description": "Chargez un fichier JSON contenant des dispositions caméra à ajouter à cette scène.",
"selectFile": "Sélectionner un fichier",
"chooseFile": "Choisir un fichier JSON...",
"importMode": "Mode d'import",
"importModeMerge": "Fusionner",
"importModeReplace": "Remplacer",
"importModeMergeHint": "Ajoute de nouvelles dispositions, ignore les doublons",
"importModeReplaceHint": "Supprime toutes les dispositions existantes et importe les nouvelles",
"previewTitle": "Aperçu",
"previewWillImport": "Va importer",
"previewWillSkip": "Va ignorer (déjà existe)",
"import": "Importer",
"confirmReplace": "Remplacer tout",
"cancel": "Annuler",
"importing": "Importation en cours...",
"importFailed": "Échec de l'import des dispositions",
"selectFileFirst": "Veuillez sélectionner un fichier d'abord",
"existingPresetsWarning": "Cette scène a {existingPresetCount} disposition(s) existante(s).",
"replaceConfirmation": "Cela va supprimer toutes les {existingPresetCount} disposition(s) existante(s) et les remplacer par les nouvelles. Cette action ne peut pas être annulée."
}
},
"SCRYING_POOL": {
"UnknownScene": "Scène inconnue",
"firstBadgeEncounter": "Première rencontre avec le badge",
"PrivacyPanel": {
"title": "Panneau de confidentialité du joueur",
"sectionHeader": "Consentements d'automatisation",
"sectionDescription": "Contrôlez quelles fonctionnalités d'automatisation peuvent affecter votre caméra et votre présence à l'écran.",
"reactionCamLabel": "Caméra de réaction",
"reactionCamDescription": "Affiche automatiquement votre caméra pendant les moments clés (combats, jets de dés, etc.)",
"toggleOn": "Activé",
"toggleOff": "Désactivé",
"readOnlyNotice": "Les paramètres de confidentialité de ce joueur sont en lecture seule. Vous ne pouvez pas modifier les préférences de consentement d'un autre joueur.",
"savedNotification": "Paramètres de confidentialité sauvegardés",
"saveError": "Échec de la sauvegarde des paramètres de confidentialité",
"portraitFallbackLabel": "Portrait de secours",
"portraitFallbackDescription": "Image à afficher lorsque votre caméra n'est pas disponible ou ne fonctionne pas.",
"chooseImageLabel": "Choisir une image",
"removeImageLabel": "Supprimer l'image personnalisée",
"removeImageConfirm": "Êtes-vous sûr de vouloir supprimer votre portrait personnalisé ? Votre avatar FoundryVTT sera utilisé à la place.",
"portraitSaved": "Portrait mis à jour avec succès",
"portraitRemoved": "Portrait personnalisé supprimé",
"portraitErrorUnsupported": "Format non pris en charge. Veuillez utiliser PNG, JPG, WEBP ou GIF statique.",
"portraitErrorTooLarge": "L'image est trop volumineuse. Veuillez utiliser une image de moins de 5 Mo.",
"portraitErrorInvalid": "Fichier image invalide. Veuillez en essayer un autre."
},
"Settings": {
"PlayerPrivacyPanel": "Panneau de confidentialité du joueur",
"PlayerPrivacyPanelLabel": "Contrôlez les effets d'automatisation sur votre caméra",
"PlayerPrivacyPanelHint": "Acceptez ou refusez les fonctionnalités Caméra de réaction et autres automatisations",
"GMPlayerPrivacySelector": "Voir les paramètres de confidentialité du joueur",
"GMPlayerPrivacySelectorLabel": "Voir et gérer les paramètres de consentement de confidentialité des joueurs",
"GMPlayerPrivacySelectorHint": "Sélectionnez un joueur pour voir ses préférences de consentement d'automatisation (lecture seule)",
"Title": "Paramètres Scrying Pool",
"Hint": "Configurer le comportement du module Scrying Pool",
"StripStatus": "État de la barre",
"ReopenStrip": "Ouvrir la barre",
"CloseStrip": "Fermer la barre"
}
}
}
+27
View File
@@ -163,6 +163,33 @@ Hooks.once("init", () => {
onChange: () => roleRenderer?.rerenderStrip(),
});
// Tile shape for participant avatars in the Director's Board
adapter.settings.register("tileShape", {
scope: "world",
config: false,
type: String,
default: "circle",
onChange: () => roleRenderer?.rerenderStrip(),
});
// Tile border width around video shapes (px). 0 = no border.
adapter.settings.register("tileBorderWidth", {
scope: "world",
config: false,
type: Number,
default: 0,
onChange: () => roleRenderer?.rerenderStrip(),
});
// Tile border color around video shapes.
adapter.settings.register("tileBorderColor", {
scope: "world",
config: false,
type: String,
default: "#ffffff",
onChange: () => roleRenderer?.rerenderStrip(),
});
// Story 5.2: Video widget width customization — world-scoped settings for small and large tile widths
adapter.settings.register("widgetWidthSm", {
scope: "world",
+5 -2
View File
@@ -23,10 +23,13 @@
"lang": "en",
"name": "English",
"path": "lang/en.json"
},
{
"lang": "fr",
"name": "French",
"path": "lang/fr.json"
}
],
"packs": [
],
"url": "${url}",
"manifest": "${manifest}",
"download": "${download}",
Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

File diff suppressed because it is too large Load Diff
+619
View File
@@ -0,0 +1,619 @@
uid=1_0 RootWebArea "Foundry Virtual Tabletop" url="https://localhost:31000/game"
uid=4_0 ignored
uid=4_1 generic
uid=4_2 list
uid=4_3 ignored
uid=4_4 ignored
uid=4_5 ignored
uid=4_6 ignored
uid=4_7 ignored
uid=4_8 ignored
uid=4_9 ignored
uid=4_10 ignored
uid=4_11 ignored
uid=4_12 ignored
uid=4_13 ignored
uid=4_14 ignored
uid=4_15 ignored
uid=4_16 ignored
uid=4_17 ignored
uid=4_18 ignored
uid=4_19 ignored
uid=4_20 ignored
uid=4_21 ignored
uid=4_22 ignored
uid=4_23 ignored
uid=4_24 ignored
uid=4_25 ignored
uid=4_26 ignored
uid=4_27 ignored
uid=4_28 ignored
uid=4_29 ignored
uid=4_30 ignored
uid=4_31 ignored
uid=4_32 ignored
uid=4_33 ignored
uid=4_34 ignored
uid=4_35 ignored
uid=4_36 ignored
uid=4_37 ignored
uid=4_38 ignored
uid=4_39 ignored
uid=4_40 ignored
uid=4_41 ignored
uid=4_42 generic
uid=4_43 generic
uid=4_44 generic
uid=4_45 generic
uid=4_46 list
uid=4_47 listitem level="1"
uid=1_49 tab "Outils de token" selectable
uid=4_48 listitem level="1"
uid=1_51 tab "Outils de tuile" selectable
uid=4_49 listitem level="1"
uid=1_53 tab "Outils de dessin" selectable
uid=4_50 listitem level="1"
uid=1_55 tab "Outils de mur" selectable
uid=4_51 listitem level="1"
uid=1_57 tab "Outils de lumière" selectable
uid=4_52 listitem level="1"
uid=1_59 tab "Outils de son dambiance" selectable
uid=4_53 listitem level="1"
uid=1_61 tab "Outils de région" selectable
uid=4_54 listitem level="1"
uid=1_63 tab "Notes" selectable
uid=4_55 list
uid=4_56 listitem level="1"
uid=1_66 button "Sélection de tokens" pressed
uid=4_57 listitem level="1"
uid=1_68 button "Sélection de cibles"
uid=4_58 listitem level="1"
uid=1_70 button "Règle"
uid=4_59 listitem level="1"
uid=1_72 button "Déplacement sans contrainte"
uid=4_60 generic
uid=4_61 ignored
uid=4_62 ignored
uid=4_63 generic
uid=4_64 list
uid=4_65 listitem level="1"
uid=4_66 ignored
uid=2_6 StaticText "Gamemaster [MJ]"
uid=1_81 InlineTextBox "Gamemaster [MJ]"
uid=4_67 generic
uid=4_68 generic
uid=4_69 LabelText
uid=2_10 StaticText "Latence"
uid=1_81 InlineTextBox "Latence"
uid=2_11 StaticText " "
uid=1_81 InlineTextBox " "
uid=7_0 StaticText "1ms"
uid=1_81 InlineTextBox "1ms"
uid=4_70 generic
uid=4_71 LabelText
uid=2_15 StaticText "IPS"
uid=1_81 InlineTextBox "IPS"
uid=2_16 StaticText " "
uid=1_81 InlineTextBox " "
uid=9_0 StaticText "30"
uid=1_81 InlineTextBox "30"
uid=2_18 button
uid=4_73 generic
uid=1_95 navigation
uid=4_74 generic "Développer la navigation"
uid=4_75 ignored
uid=4_76 list
uid=4_77 listitem level="1"
uid=4_78 ignored
uid=1_101 StaticText "Scène"
uid=1_81 InlineTextBox "Scène"
uid=4_79 list
uid=4_80 listitem "Gamemaster" level="2"
uid=1_104 StaticText "G"
uid=1_81 InlineTextBox "G"
uid=4_81 ignored
uid=1_81 generic
uid=1_81 StaticText ""
uid=1_81 InlineTextBox ""
uid=4_82 list
uid=4_83 ignored
uid=4_84 ignored
uid=4_85 generic
uid=4_86 sectionheader
uid=4_87 generic
uid=4_88 generic
uid=4_89 LabelText
uid=4_90 LabelText
uid=4_91 sectionfooter
uid=1_116 generic roledescription="Barre de raccourcis"
uid=4_92 generic
uid=1_118 button "Couper le son"
uid=1_119 button "Menu principal"
uid=4_93 list
uid=1_121 button "Emplacement vide"
uid=4_94 ignored
uid=4_95 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_124 button "Emplacement vide"
uid=4_96 ignored
uid=4_97 StaticText "2"
uid=1_81 InlineTextBox "2"
uid=1_127 button "Emplacement vide"
uid=4_98 ignored
uid=4_99 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=1_130 button "Emplacement vide"
uid=4_100 ignored
uid=4_101 StaticText "4"
uid=1_81 InlineTextBox "4"
uid=1_133 button "Emplacement vide"
uid=4_102 ignored
uid=4_103 StaticText "5"
uid=1_81 InlineTextBox "5"
uid=1_136 button "Emplacement vide"
uid=4_104 ignored
uid=4_105 StaticText "6"
uid=1_81 InlineTextBox "6"
uid=1_139 button "Emplacement vide"
uid=4_106 ignored
uid=4_107 StaticText "7"
uid=1_81 InlineTextBox "7"
uid=1_142 button "Emplacement vide"
uid=4_108 ignored
uid=4_109 StaticText "8"
uid=1_81 InlineTextBox "8"
uid=1_145 button "Emplacement vide"
uid=4_110 ignored
uid=4_111 StaticText "9"
uid=1_81 InlineTextBox "9"
uid=1_148 button "Emplacement vide"
uid=4_112 ignored
uid=4_113 StaticText "0"
uid=1_81 InlineTextBox "0"
uid=4_114 generic
uid=1_152 navigation
uid=1_153 button "Page suivante"
uid=4_115 ignored
uid=1_155 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_156 button "Page précédente"
uid=4_116 ignored
uid=1_158 button "Verrouiller la barre de raccourcis"
uid=1_159 button "Effacer la barre de raccourcis"
uid=4_117 generic
uid=4_118 generic
uid=4_119 generic
uid=4_120 ignored
uid=4_121 list
uid=4_122 generic "Tchat"
uid=4_123 generic
uid=1_167 generic value="
"
uid=1_168 paragraph
uid=1_169 LineBreak "
"
uid=1_81 InlineTextBox "
"
uid=4_124 ignored
uid=1_81 generic
uid=1_81 StaticText "Entrer un message"
uid=1_81 InlineTextBox "Entrer un message"
uid=4_125 generic
uid=4_126 generic
uid=1_173 button "Public en tant qu'utilisateur" pressed
uid=1_174 button "Privé pour les maîtres de jeu"
uid=1_175 button "Aveugle pour les maîtres de jeu"
uid=1_176 button "Seulement pour soi-même"
uid=1_177 button "Public en tant que personnage"
uid=4_127 generic
uid=4_128 tablist orientation="horizontal"
uid=4_129 list
uid=4_130 listitem level="1"
uid=1_182 tab "Messages du tchat" selectable
uid=4_131 listitem level="1"
uid=1_184 tab "Rencontres de combat" selectable
uid=4_132 listitem level="1"
uid=1_186 tab "Scènes" selectable
uid=4_133 listitem level="1"
uid=1_188 tab "Objets plaçables" selectable
uid=4_134 listitem level="1"
uid=1_190 tab "Acteurs" selectable
uid=4_135 listitem level="1"
uid=1_192 tab "Objets" selectable
uid=4_136 listitem level="1"
uid=1_194 tab "Journaux" selectable
uid=4_137 listitem level="1"
uid=1_196 tab "Tables aléatoires" selectable
uid=4_138 listitem level="1"
uid=1_198 tab "Jeux de cartes" selectable
uid=4_139 listitem level="1"
uid=1_200 tab "Macros" selectable
uid=4_140 listitem level="1"
uid=1_202 tab "Playlists" selectable
uid=4_141 listitem level="1"
uid=1_204 tab "Compendiums" selectable
uid=4_142 listitem level="1"
uid=1_206 tab "Dice So Nice" selectable
uid=4_143 listitem level="1"
uid=1_208 tab "Paramètres" focusable focused selectable selected
uid=4_144 listitem level="1"
uid=1_210 button "Réduire"
uid=4_145 generic
uid=4_175 ignored
uid=4_176 ignored
uid=1_258 ignored
uid=1_259 ignored
uid=4_177 ignored
uid=4_178 ignored
uid=1_262 ignored
uid=4_299 ignored
uid=4_300 ignored
uid=1_447 ignored
uid=1_448 ignored
uid=4_301 ignored
uid=4_302 ignored
uid=1_451 ignored
uid=4_366 ignored
uid=4_367 ignored
uid=1_555 ignored
uid=1_556 ignored
uid=4_368 ignored
uid=4_369 ignored
uid=1_559 ignored
uid=4_444 ignored
uid=4_445 ignored
uid=1_674 ignored
uid=1_675 ignored
uid=4_446 ignored
uid=4_447 ignored
uid=1_678 ignored
uid=4_454 ignored
uid=4_455 ignored
uid=4_456 ignored
uid=4_457 ignored
uid=4_458 ignored
uid=4_459 ignored
uid=4_460 ignored
uid=4_461 ignored
uid=4_462 ignored
uid=4_463 ignored
uid=4_464 ignored
uid=4_465 ignored
uid=4_466 ignored
uid=4_467 ignored
uid=4_468 ignored
uid=4_469 ignored
uid=4_470 ignored
uid=4_471 ignored
uid=4_472 ignored
uid=4_473 ignored
uid=4_474 ignored
uid=4_475 ignored
uid=4_476 ignored
uid=4_477 ignored
uid=4_478 ignored
uid=4_479 ignored
uid=4_480 ignored
uid=4_481 ignored
uid=4_482 ignored
uid=4_483 ignored
uid=4_484 ignored
uid=4_485 ignored
uid=4_486 ignored
uid=4_487 ignored
uid=4_488 ignored
uid=4_489 ignored
uid=4_490 ignored
uid=9_1 generic
uid=9_2 generic
uid=9_3 heading "Foundry Virtual Tabletop" level="1"
uid=9_4 StaticText "Foundry Virtual Tabletop"
uid=1_81 InlineTextBox "Foundry Virtual Tabletop"
uid=9_5 paragraph
uid=9_6 StaticText "Version 14 Stable"
uid=1_81 InlineTextBox "Version 14 Stable"
uid=9_7 ignored
uid=9_8 ignored
uid=9_9 StaticText "Version"
uid=1_81 InlineTextBox "Version"
uid=9_10 ignored
uid=9_11 StaticText "363"
uid=1_81 InlineTextBox "363"
uid=9_12 ignored
uid=9_13 ignored
uid=9_14 StaticText "Donjon & Cie"
uid=1_81 InlineTextBox "Donjon & Cie"
uid=9_15 ignored
uid=9_16 StaticText "14.0.0"
uid=1_81 InlineTextBox "14.0.0"
uid=9_17 ignored
uid=9_18 ignored
uid=9_19 StaticText "Modules actifs"
uid=1_81 InlineTextBox "Modules actifs"
uid=9_20 ignored
uid=9_21 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=9_22 generic
uid=9_23 heading "Paramètres et configuration" level="4"
uid=9_24 StaticText "Paramètres et configuration"
uid=1_81 InlineTextBox "Paramètres et configuration"
uid=9_25 button "Paramètres de la partie"
uid=9_26 ignored
uid=9_27 StaticText "Paramètres de la partie"
uid=1_81 InlineTextBox "Paramètres de la partie"
uid=9_28 button "Configuration des contrôles"
uid=9_29 ignored
uid=9_30 StaticText "Configuration des contrôles"
uid=1_81 InlineTextBox "Configuration des contrôles"
uid=9_31 button "Gestion des modules"
uid=9_32 ignored
uid=9_33 StaticText "Gestion des modules"
uid=1_81 InlineTextBox "Gestion des modules"
uid=9_34 button "Configuration du monde"
uid=9_35 ignored
uid=9_36 StaticText "Configuration du monde"
uid=1_81 InlineTextBox "Configuration du monde"
uid=9_37 button "Gestion des utilisateurs"
uid=9_38 ignored
uid=9_39 StaticText "Gestion des utilisateurs"
uid=1_81 InlineTextBox "Gestion des utilisateurs"
uid=9_40 button "Gestion des présentations"
uid=9_41 ignored
uid=9_42 StaticText "Gestion des présentations"
uid=1_81 InlineTextBox "Gestion des présentations"
uid=9_43 generic
uid=9_44 heading "Aide et documentation" level="4"
uid=9_45 StaticText "Aide et documentation"
uid=1_81 InlineTextBox "Aide et documentation"
uid=9_46 button "Support & problèmes (1)"
uid=9_47 ignored
uid=9_48 StaticText "Support & problèmes (1)"
uid=1_81 InlineTextBox "Support & problèmes (1)"
uid=9_49 link "Documentation" url="https://foundryvtt.com/kb/"
uid=9_50 ignored
uid=9_51 StaticText "Documentation"
uid=1_81 InlineTextBox "Documentation"
uid=9_52 link "Wiki de la communauté" url="https://foundryvtt.wiki/"
uid=9_53 ignored
uid=9_54 StaticText "Wiki de la communauté"
uid=1_81 InlineTextBox "Wiki de la communauté"
uid=9_55 generic
uid=9_56 heading "Accès à la partie" level="4"
uid=9_57 StaticText "Accès à la partie"
uid=1_81 InlineTextBox "Accès à la partie"
uid=9_58 button "Liens dinvitation"
uid=9_59 ignored
uid=9_60 StaticText "Liens dinvitation"
uid=1_81 InlineTextBox "Liens dinvitation"
uid=9_61 button "Déconnexion"
uid=9_62 ignored
uid=9_63 StaticText "Déconnexion"
uid=1_81 InlineTextBox "Déconnexion"
uid=9_64 button "Retour à laccueil"
uid=9_65 ignored
uid=9_66 StaticText "Retour à laccueil"
uid=1_81 InlineTextBox "Retour à laccueil"
uid=4_491 generic
uid=4_492 generic
uid=4_493 generic
uid=4_494 Canvas
uid=4_495 figure
uid=4_496 image url="https://localhost:31000/ui/pause.svg"
uid=4_497 Figcaption
uid=1_731 StaticText "JEU EN PAUSE"
uid=1_81 InlineTextBox "JEU EN PAUSE"
uid=4_498 generic
uid=4_499 ignored
uid=4_500 generic
uid=4_501 generic
uid=2_41 complementary "Scrying Pool"
uid=4_502 ignored
uid=2_43 button "Close Scrying Pool"
uid=4_503 StaticText "×"
uid=1_81 InlineTextBox "×"
uid=4_504 ignored
uid=2_46 button "Expand Scrying Pool" expandable
uid=4_505 generic
uid=2_48 button "Open Director's Board"
uid=4_506 ignored
uid=4_507 ignored
uid=4_508 StaticText "Director's Board"
uid=1_81 InlineTextBox "Director's Board"
uid=4_509 list
uid=4_510 listitem level="1"
uid=2_54 button "Gamemaster — Active"
uid=4_511 ignored
uid=4_512 ignored
uid=4_513 ignored
uid=4_514 ignored
uid=4_515 ignored
uid=4_516 ignored
uid=4_517 ignored
uid=4_518 ignored
uid=4_519 ignored
uid=4_520 ignored
uid=4_521 ignored
uid=4_522 ignored
uid=4_523 ignored
uid=4_524 ignored
uid=4_525 ignored
uid=4_526 ignored
uid=4_527 ignored
uid=4_528 ignored
uid=4_529 ignored
uid=4_530 ignored
uid=4_531 ignored
uid=4_532 ignored
uid=4_533 ignored
uid=4_534 ignored
uid=4_535 ignored
uid=4_536 ignored
uid=4_537 ignored
uid=4_538 ignored
uid=4_539 ignored
uid=4_540 ignored
uid=4_541 ignored
uid=4_542 ignored
uid=4_543 ignored
uid=4_544 ignored
uid=4_545 ignored
uid=4_546 ignored
uid=4_547 listitem level="1"
uid=2_92 button "Player2 — Active"
uid=4_548 listitem level="1"
uid=2_94 button "Player3 — Active"
uid=4_549 generic
uid=4_550 generic
uid=4_551 generic
uid=4_552 ignored
uid=2_99 button "Fermer"
uid=4_553 StaticText "×"
uid=1_81 InlineTextBox "×"
uid=4_554 list "Tableau du Réalisateur"
uid=2_102 listitem "Gamemaster" level="1"
uid=4_555 generic
uid=2_104 image "Avatar of Gamemaster" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=4_556 paragraph
uid=2_106 StaticText "Gamemaster"
uid=1_81 InlineTextBox "Gamemaster"
uid=2_107 button "Hide Gamemaster"
uid=4_557 ignored
uid=2_109 listitem "Player2" level="1"
uid=4_558 generic
uid=2_111 image "Avatar of Player2" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=2_112 status "Reaction Cam: Enabled" atomic description="Reaction Cam: Enabled" live="polite" relevant="additions text"
uid=4_559 ignored
uid=4_560 paragraph
uid=2_115 StaticText "Player2"
uid=1_81 InlineTextBox "Player2"
uid=2_116 button "Hide Player2"
uid=4_561 ignored
uid=2_118 listitem "Player3" level="1"
uid=4_562 generic
uid=2_120 image "Avatar of Player3" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=4_563 paragraph
uid=2_122 StaticText "Player3"
uid=1_81 InlineTextBox "Player3"
uid=2_123 button "Hide Player3"
uid=4_564 ignored
uid=8_18 ignored
uid=8_19 ignored
uid=8_20 ignored
uid=8_22 ignored
uid=8_23 ignored
uid=8_24 ignored
uid=8_25 ignored
uid=8_26 ignored
uid=8_27 ignored
uid=8_29 ignored
uid=8_30 ignored
uid=8_31 ignored
uid=8_32 ignored
uid=8_33 ignored
uid=4_579 ignored
uid=2_140 button "Tout afficher"
uid=4_580 ignored
uid=4_581 StaticText "Tout afficher"
uid=1_81 InlineTextBox "Tout afficher"
uid=2_143 button "Tout masquer"
uid=4_582 ignored
uid=4_583 StaticText "Tout masquer"
uid=1_81 InlineTextBox "Tout masquer"
uid=2_146 button "Ouvrir la référence des raccourcis"
uid=4_584 StaticText "?"
uid=1_81 InlineTextBox "?"
uid=4_585 toolbar "Disposition de la vue" orientation="horizontal"
uid=4_586 ignored
uid=2_150 StaticText "DISPOSITION DE LA VUE"
uid=1_81 InlineTextBox "DISPOSITION DE LA VUE"
uid=4_587 ignored
uid=2_152 button "S"
uid=4_588 ignored
uid=4_589 ignored
uid=4_590 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_156 button "L"
uid=4_591 ignored
uid=4_592 ignored
uid=4_593 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=2_160 button "S"
uid=4_594 ignored
uid=4_595 ignored
uid=4_596 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_164 button "L"
uid=4_597 ignored
uid=4_598 ignored
uid=4_599 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=2_168 button "S"
uid=4_600 ignored
uid=4_601 ignored
uid=4_602 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_172 button "L"
uid=4_603 ignored
uid=4_604 ignored
uid=4_605 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=4_606 toolbar "Largeurs des widgets vidéo" orientation="horizontal"
uid=2_177 StaticText "Largeurs des widgets vidéo"
uid=1_81 InlineTextBox "Largeurs des widgets vidéo"
uid=4_607 ignored
uid=4_608 generic
uid=2_180 StaticText "Petite :"
uid=1_81 InlineTextBox "Petite :"
uid=2_181 combobox expandable haspopup="menu" value="100px"
uid=4_609 MenuListPopup
uid=2_183 option "60px" selectable value="60px"
uid=2_184 option "80px" selectable value="80px"
uid=2_185 option "100px" selectable selected value="100px"
uid=2_186 option "120px" selectable value="120px"
uid=2_187 option "150px" selectable value="150px"
uid=2_188 option "200px" selectable value="200px"
uid=4_610 generic
uid=2_190 StaticText "Grande :"
uid=1_81 InlineTextBox "Grande :"
uid=2_191 combobox expandable haspopup="menu" value="150px"
uid=4_611 MenuListPopup
uid=2_193 option "60px" selectable value="60px"
uid=2_194 option "80px" selectable value="80px"
uid=2_195 option "100px" selectable value="100px"
uid=2_196 option "120px" selectable value="120px"
uid=2_197 option "150px" selectable selected value="150px"
uid=2_198 option "200px" selectable value="200px"
uid=4_612 sectionfooter
uid=4_613 ignored
uid=2_201 button "Sauvegarder la disposition"
uid=4_614 ignored
uid=4_615 StaticText "Sauvegarder la disposition"
uid=1_81 InlineTextBox "Sauvegarder la disposition"
uid=2_204 button "Charger la disposition" disableable disabled
uid=4_616 ignored
uid=4_617 StaticText "Charger la disposition"
uid=1_81 InlineTextBox "Charger la disposition"
uid=2_207 button "Exporter"
uid=4_618 ignored
uid=4_619 StaticText "Exporter"
uid=1_81 InlineTextBox "Exporter"
uid=2_210 button "Importer"
uid=4_620 ignored
uid=4_621 StaticText "Importer"
uid=1_81 InlineTextBox "Importer"
uid=4_622 ignored
uid=2_214 button "Application auto..."
uid=4_623 ignored
uid=4_624 StaticText "Application auto..."
uid=1_81 InlineTextBox "Application auto..."
uid=2_217 button "Désactiver A/V"
uid=4_625 ignored
uid=4_626 StaticText "Désactiver A/V"
uid=1_81 InlineTextBox "Désactiver A/V"
uid=2_220 button "Paramètres A/V..."
uid=4_627 ignored
uid=4_628 StaticText "Paramètres A/V..."
uid=1_81 InlineTextBox "Paramètres A/V..."
uid=4_629 generic
uid=4_647 ignored
uid=9_67 ignored
Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

+639
View File
@@ -0,0 +1,639 @@
uid=1_0 RootWebArea "Foundry Virtual Tabletop" url="https://localhost:31000/game"
uid=4_0 ignored
uid=4_1 generic
uid=4_2 list
uid=4_3 ignored
uid=4_4 ignored
uid=4_5 ignored
uid=4_6 ignored
uid=4_7 ignored
uid=4_8 ignored
uid=4_9 ignored
uid=4_10 ignored
uid=4_11 ignored
uid=4_12 ignored
uid=4_13 ignored
uid=4_14 ignored
uid=4_15 ignored
uid=4_16 ignored
uid=4_17 ignored
uid=4_18 ignored
uid=4_19 ignored
uid=4_20 ignored
uid=4_21 ignored
uid=4_22 ignored
uid=4_23 ignored
uid=4_24 ignored
uid=4_25 ignored
uid=4_26 ignored
uid=4_27 ignored
uid=4_28 ignored
uid=4_29 ignored
uid=4_30 ignored
uid=4_31 ignored
uid=4_32 ignored
uid=4_33 ignored
uid=4_34 ignored
uid=4_35 ignored
uid=4_36 ignored
uid=4_37 ignored
uid=4_38 ignored
uid=4_39 ignored
uid=4_40 ignored
uid=4_41 ignored
uid=4_42 generic
uid=4_43 generic
uid=4_44 generic
uid=4_45 generic
uid=4_46 list
uid=4_47 listitem level="1"
uid=1_49 tab "Outils de token" selectable
uid=4_48 listitem level="1"
uid=1_51 tab "Outils de tuile" selectable
uid=4_49 listitem level="1"
uid=1_53 tab "Outils de dessin" selectable
uid=4_50 listitem level="1"
uid=1_55 tab "Outils de mur" selectable
uid=4_51 listitem level="1"
uid=1_57 tab "Outils de lumière" selectable
uid=4_52 listitem level="1"
uid=1_59 tab "Outils de son dambiance" selectable
uid=4_53 listitem level="1"
uid=1_61 tab "Outils de région" selectable
uid=4_54 listitem level="1"
uid=1_63 tab "Notes" selectable
uid=4_55 list
uid=4_56 listitem level="1"
uid=1_66 button "Sélection de tokens" pressed
uid=4_57 listitem level="1"
uid=1_68 button "Sélection de cibles"
uid=4_58 listitem level="1"
uid=1_70 button "Règle"
uid=4_59 listitem level="1"
uid=1_72 button "Déplacement sans contrainte"
uid=4_60 generic
uid=4_61 ignored
uid=4_62 ignored
uid=4_63 generic
uid=4_64 list
uid=4_65 listitem level="1"
uid=4_66 ignored
uid=2_6 StaticText "Gamemaster [MJ]"
uid=1_81 InlineTextBox "Gamemaster [MJ]"
uid=4_67 generic
uid=4_68 generic
uid=4_69 LabelText
uid=2_10 StaticText "Latence"
uid=1_81 InlineTextBox "Latence"
uid=2_11 StaticText " "
uid=1_81 InlineTextBox " "
uid=10_0 StaticText "1ms"
uid=1_81 InlineTextBox "1ms"
uid=4_70 generic
uid=4_71 LabelText
uid=2_15 StaticText "IPS"
uid=1_81 InlineTextBox "IPS"
uid=2_16 StaticText " "
uid=1_81 InlineTextBox " "
uid=10_1 StaticText "30"
uid=1_81 InlineTextBox "30"
uid=2_18 button
uid=4_73 generic
uid=1_95 navigation
uid=4_74 generic "Développer la navigation"
uid=4_75 ignored
uid=4_76 list
uid=4_77 listitem level="1"
uid=4_78 ignored
uid=1_101 StaticText "Scène"
uid=1_81 InlineTextBox "Scène"
uid=4_79 list
uid=4_80 listitem "Gamemaster" level="2"
uid=1_104 StaticText "G"
uid=1_81 InlineTextBox "G"
uid=4_81 ignored
uid=1_81 generic
uid=1_81 StaticText ""
uid=1_81 InlineTextBox ""
uid=4_82 list
uid=4_83 ignored
uid=4_84 ignored
uid=4_85 generic
uid=4_86 sectionheader
uid=4_87 generic
uid=4_88 generic
uid=4_89 LabelText
uid=4_90 LabelText
uid=4_91 sectionfooter
uid=1_116 generic roledescription="Barre de raccourcis"
uid=4_92 generic
uid=1_118 button "Couper le son"
uid=1_119 button "Menu principal"
uid=4_93 list
uid=1_121 button "Emplacement vide"
uid=4_94 ignored
uid=4_95 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_124 button "Emplacement vide"
uid=4_96 ignored
uid=4_97 StaticText "2"
uid=1_81 InlineTextBox "2"
uid=1_127 button "Emplacement vide"
uid=4_98 ignored
uid=4_99 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=1_130 button "Emplacement vide"
uid=4_100 ignored
uid=4_101 StaticText "4"
uid=1_81 InlineTextBox "4"
uid=1_133 button "Emplacement vide"
uid=4_102 ignored
uid=4_103 StaticText "5"
uid=1_81 InlineTextBox "5"
uid=1_136 button "Emplacement vide"
uid=4_104 ignored
uid=4_105 StaticText "6"
uid=1_81 InlineTextBox "6"
uid=1_139 button "Emplacement vide"
uid=4_106 ignored
uid=4_107 StaticText "7"
uid=1_81 InlineTextBox "7"
uid=1_142 button "Emplacement vide"
uid=4_108 ignored
uid=4_109 StaticText "8"
uid=1_81 InlineTextBox "8"
uid=1_145 button "Emplacement vide"
uid=4_110 ignored
uid=4_111 StaticText "9"
uid=1_81 InlineTextBox "9"
uid=1_148 button "Emplacement vide"
uid=4_112 ignored
uid=4_113 StaticText "0"
uid=1_81 InlineTextBox "0"
uid=4_114 generic
uid=1_152 navigation
uid=1_153 button "Page suivante"
uid=4_115 ignored
uid=1_155 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_156 button "Page précédente"
uid=4_116 ignored
uid=1_158 button "Verrouiller la barre de raccourcis"
uid=1_159 button "Effacer la barre de raccourcis"
uid=4_117 generic
uid=4_118 generic
uid=4_119 generic
uid=4_120 ignored
uid=4_121 list
uid=4_122 generic "Tchat"
uid=4_123 generic
uid=1_167 generic value="
"
uid=1_168 paragraph
uid=1_169 LineBreak "
"
uid=1_81 InlineTextBox "
"
uid=4_124 ignored
uid=1_81 generic
uid=1_81 StaticText "Entrer un message"
uid=1_81 InlineTextBox "Entrer un message"
uid=4_125 generic
uid=4_126 generic
uid=1_173 button "Public en tant qu'utilisateur" pressed
uid=1_174 button "Privé pour les maîtres de jeu"
uid=1_175 button "Aveugle pour les maîtres de jeu"
uid=1_176 button "Seulement pour soi-même"
uid=1_177 button "Public en tant que personnage"
uid=4_127 generic
uid=4_128 tablist orientation="horizontal"
uid=4_129 list
uid=4_130 listitem level="1"
uid=1_182 tab "Messages du tchat" selectable
uid=4_131 listitem level="1"
uid=1_184 tab "Rencontres de combat" selectable
uid=4_132 listitem level="1"
uid=1_186 tab "Scènes" selectable
uid=4_133 listitem level="1"
uid=1_188 tab "Objets plaçables" selectable
uid=4_134 listitem level="1"
uid=1_190 tab "Acteurs" selectable
uid=4_135 listitem level="1"
uid=1_192 tab "Objets" selectable
uid=4_136 listitem level="1"
uid=1_194 tab "Journaux" selectable
uid=4_137 listitem level="1"
uid=1_196 tab "Tables aléatoires" selectable
uid=4_138 listitem level="1"
uid=1_198 tab "Jeux de cartes" selectable
uid=4_139 listitem level="1"
uid=1_200 tab "Macros" selectable
uid=4_140 listitem level="1"
uid=1_202 tab "Playlists" selectable
uid=4_141 listitem level="1"
uid=1_204 tab "Compendiums" selectable
uid=4_142 listitem level="1"
uid=1_206 tab "Dice So Nice" selectable
uid=4_143 listitem level="1"
uid=1_208 tab "Paramètres" focusable focused selectable selected
uid=4_144 listitem level="1"
uid=1_210 button "Réduire"
uid=4_145 generic
uid=4_175 ignored
uid=4_176 ignored
uid=1_258 ignored
uid=1_259 ignored
uid=4_177 ignored
uid=4_178 ignored
uid=1_262 ignored
uid=4_299 ignored
uid=4_300 ignored
uid=1_447 ignored
uid=1_448 ignored
uid=4_301 ignored
uid=4_302 ignored
uid=1_451 ignored
uid=4_366 ignored
uid=4_367 ignored
uid=1_555 ignored
uid=1_556 ignored
uid=4_368 ignored
uid=4_369 ignored
uid=1_559 ignored
uid=4_444 ignored
uid=4_445 ignored
uid=1_674 ignored
uid=1_675 ignored
uid=4_446 ignored
uid=4_447 ignored
uid=1_678 ignored
uid=4_454 ignored
uid=4_455 ignored
uid=4_456 ignored
uid=4_457 ignored
uid=4_458 ignored
uid=4_459 ignored
uid=4_460 ignored
uid=4_461 ignored
uid=4_462 ignored
uid=4_463 ignored
uid=4_464 ignored
uid=4_465 ignored
uid=4_466 ignored
uid=4_467 ignored
uid=4_468 ignored
uid=4_469 ignored
uid=4_470 ignored
uid=4_471 ignored
uid=4_472 ignored
uid=4_473 ignored
uid=4_474 ignored
uid=4_475 ignored
uid=4_476 ignored
uid=4_477 ignored
uid=4_478 ignored
uid=4_479 ignored
uid=4_480 ignored
uid=4_481 ignored
uid=4_482 ignored
uid=4_483 ignored
uid=4_484 ignored
uid=4_485 ignored
uid=4_486 ignored
uid=4_487 ignored
uid=4_488 ignored
uid=4_489 ignored
uid=4_490 ignored
uid=9_1 generic
uid=9_2 generic
uid=9_3 heading "Foundry Virtual Tabletop" level="1"
uid=9_4 StaticText "Foundry Virtual Tabletop"
uid=1_81 InlineTextBox "Foundry Virtual Tabletop"
uid=9_5 paragraph
uid=9_6 StaticText "Version 14 Stable"
uid=1_81 InlineTextBox "Version 14 Stable"
uid=9_7 ignored
uid=9_8 ignored
uid=9_9 StaticText "Version"
uid=1_81 InlineTextBox "Version"
uid=9_10 ignored
uid=9_11 StaticText "363"
uid=1_81 InlineTextBox "363"
uid=9_12 ignored
uid=9_13 ignored
uid=9_14 StaticText "Donjon & Cie"
uid=1_81 InlineTextBox "Donjon & Cie"
uid=9_15 ignored
uid=9_16 StaticText "14.0.0"
uid=1_81 InlineTextBox "14.0.0"
uid=9_17 ignored
uid=9_18 ignored
uid=9_19 StaticText "Modules actifs"
uid=1_81 InlineTextBox "Modules actifs"
uid=9_20 ignored
uid=9_21 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=9_22 generic
uid=9_23 heading "Paramètres et configuration" level="4"
uid=9_24 StaticText "Paramètres et configuration"
uid=1_81 InlineTextBox "Paramètres et configuration"
uid=9_25 button "Paramètres de la partie"
uid=9_26 ignored
uid=9_27 StaticText "Paramètres de la partie"
uid=1_81 InlineTextBox "Paramètres de la partie"
uid=9_28 button "Configuration des contrôles"
uid=9_29 ignored
uid=9_30 StaticText "Configuration des contrôles"
uid=1_81 InlineTextBox "Configuration des contrôles"
uid=9_31 button "Gestion des modules"
uid=9_32 ignored
uid=9_33 StaticText "Gestion des modules"
uid=1_81 InlineTextBox "Gestion des modules"
uid=9_34 button "Configuration du monde"
uid=9_35 ignored
uid=9_36 StaticText "Configuration du monde"
uid=1_81 InlineTextBox "Configuration du monde"
uid=9_37 button "Gestion des utilisateurs"
uid=9_38 ignored
uid=9_39 StaticText "Gestion des utilisateurs"
uid=1_81 InlineTextBox "Gestion des utilisateurs"
uid=9_40 button "Gestion des présentations"
uid=9_41 ignored
uid=9_42 StaticText "Gestion des présentations"
uid=1_81 InlineTextBox "Gestion des présentations"
uid=9_43 generic
uid=9_44 heading "Aide et documentation" level="4"
uid=9_45 StaticText "Aide et documentation"
uid=1_81 InlineTextBox "Aide et documentation"
uid=9_46 button "Support & problèmes (1)"
uid=9_47 ignored
uid=9_48 StaticText "Support & problèmes (1)"
uid=1_81 InlineTextBox "Support & problèmes (1)"
uid=9_49 link "Documentation" url="https://foundryvtt.com/kb/"
uid=9_50 ignored
uid=9_51 StaticText "Documentation"
uid=1_81 InlineTextBox "Documentation"
uid=9_52 link "Wiki de la communauté" url="https://foundryvtt.wiki/"
uid=9_53 ignored
uid=9_54 StaticText "Wiki de la communauté"
uid=1_81 InlineTextBox "Wiki de la communauté"
uid=9_55 generic
uid=9_56 heading "Accès à la partie" level="4"
uid=9_57 StaticText "Accès à la partie"
uid=1_81 InlineTextBox "Accès à la partie"
uid=9_58 button "Liens dinvitation"
uid=9_59 ignored
uid=9_60 StaticText "Liens dinvitation"
uid=1_81 InlineTextBox "Liens dinvitation"
uid=9_61 button "Déconnexion"
uid=9_62 ignored
uid=9_63 StaticText "Déconnexion"
uid=1_81 InlineTextBox "Déconnexion"
uid=9_64 button "Retour à laccueil"
uid=9_65 ignored
uid=9_66 StaticText "Retour à laccueil"
uid=1_81 InlineTextBox "Retour à laccueil"
uid=4_491 generic
uid=4_492 generic
uid=4_493 generic
uid=4_494 Canvas
uid=4_498 generic
uid=4_499 ignored
uid=4_500 generic
uid=4_501 generic
uid=2_41 complementary "Scrying Pool"
uid=4_502 ignored
uid=2_43 button "Close Scrying Pool"
uid=4_503 StaticText "×"
uid=1_81 InlineTextBox "×"
uid=4_504 ignored
uid=2_46 button "Expand Scrying Pool" expandable
uid=4_505 generic
uid=2_48 button "Open Director's Board"
uid=4_506 ignored
uid=4_507 ignored
uid=4_508 StaticText "Director's Board"
uid=1_81 InlineTextBox "Director's Board"
uid=4_509 list
uid=4_510 listitem level="1"
uid=2_54 button "Gamemaster — Active"
uid=4_511 ignored
uid=4_512 ignored
uid=4_513 ignored
uid=4_514 ignored
uid=4_515 ignored
uid=4_516 ignored
uid=4_517 ignored
uid=4_518 ignored
uid=4_519 ignored
uid=4_520 ignored
uid=4_521 ignored
uid=4_522 ignored
uid=4_523 ignored
uid=4_524 ignored
uid=4_525 ignored
uid=4_526 ignored
uid=4_527 ignored
uid=4_528 ignored
uid=4_529 ignored
uid=4_530 ignored
uid=4_531 ignored
uid=4_532 ignored
uid=4_533 ignored
uid=4_534 ignored
uid=4_535 ignored
uid=4_536 ignored
uid=4_537 ignored
uid=4_538 ignored
uid=4_539 ignored
uid=4_540 ignored
uid=4_541 ignored
uid=4_542 ignored
uid=4_543 ignored
uid=4_544 ignored
uid=4_545 ignored
uid=4_546 ignored
uid=4_547 listitem level="1"
uid=2_92 button "Player2 — Active"
uid=4_548 listitem level="1"
uid=2_94 button "Player3 — Active"
uid=4_549 generic
uid=4_550 generic
uid=4_551 generic
uid=4_552 ignored
uid=2_99 button "Fermer"
uid=4_553 StaticText "×"
uid=1_81 InlineTextBox "×"
uid=4_554 list "Tableau du Réalisateur"
uid=2_102 listitem "Gamemaster" level="1"
uid=4_555 generic
uid=2_104 image "Avatar of Gamemaster" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=4_556 paragraph
uid=2_106 StaticText "Gamemaster"
uid=1_81 InlineTextBox "Gamemaster"
uid=2_107 button "Hide Gamemaster"
uid=4_557 ignored
uid=2_109 listitem "Player2" level="1"
uid=4_558 generic
uid=2_111 image "Avatar of Player2" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=2_112 status "Reaction Cam: Enabled" atomic description="Reaction Cam: Enabled" live="polite" relevant="additions text"
uid=4_559 ignored
uid=4_560 paragraph
uid=2_115 StaticText "Player2"
uid=1_81 InlineTextBox "Player2"
uid=2_116 button "Hide Player2"
uid=4_561 ignored
uid=2_118 listitem "Player3" level="1"
uid=4_562 generic
uid=2_120 image "Avatar of Player3" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=4_563 paragraph
uid=2_122 StaticText "Player3"
uid=1_81 InlineTextBox "Player3"
uid=2_123 button "Hide Player3"
uid=4_564 ignored
uid=8_18 ignored
uid=8_19 ignored
uid=8_20 ignored
uid=8_22 ignored
uid=8_23 ignored
uid=8_24 ignored
uid=8_25 ignored
uid=8_26 ignored
uid=8_27 ignored
uid=8_29 ignored
uid=8_30 ignored
uid=8_31 ignored
uid=8_32 ignored
uid=8_33 ignored
uid=4_579 ignored
uid=2_140 button "Tout afficher"
uid=4_580 ignored
uid=4_581 StaticText "Tout afficher"
uid=1_81 InlineTextBox "Tout afficher"
uid=2_143 button "Tout masquer"
uid=4_582 ignored
uid=4_583 StaticText "Tout masquer"
uid=1_81 InlineTextBox "Tout masquer"
uid=2_146 button "Ouvrir la référence des raccourcis"
uid=4_584 StaticText "?"
uid=1_81 InlineTextBox "?"
uid=4_585 toolbar "Disposition de la vue" orientation="horizontal"
uid=4_586 ignored
uid=2_150 StaticText "DISPOSITION DE LA VUE"
uid=1_81 InlineTextBox "DISPOSITION DE LA VUE"
uid=4_587 ignored
uid=2_152 button "S"
uid=4_588 ignored
uid=4_589 ignored
uid=4_590 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_156 button "L"
uid=4_591 ignored
uid=4_592 ignored
uid=4_593 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=2_160 button "S"
uid=4_594 ignored
uid=4_595 ignored
uid=4_596 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_164 button "L"
uid=4_597 ignored
uid=4_598 ignored
uid=4_599 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=2_168 button "S"
uid=4_600 ignored
uid=4_601 ignored
uid=4_602 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_172 button "L"
uid=4_603 ignored
uid=4_604 ignored
uid=4_605 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=4_606 toolbar "Largeurs des widgets vidéo" orientation="horizontal"
uid=2_177 StaticText "Largeurs des widgets vidéo"
uid=1_81 InlineTextBox "Largeurs des widgets vidéo"
uid=4_607 ignored
uid=4_608 generic
uid=2_180 StaticText "Petite :"
uid=1_81 InlineTextBox "Petite :"
uid=2_181 combobox expandable haspopup="menu" value="100px"
uid=4_609 MenuListPopup
uid=2_183 option "60px" selectable value="60px"
uid=2_184 option "80px" selectable value="80px"
uid=2_185 option "100px" selectable selected value="100px"
uid=2_186 option "120px" selectable value="120px"
uid=2_187 option "150px" selectable value="150px"
uid=2_188 option "200px" selectable value="200px"
uid=4_610 generic
uid=2_190 StaticText "Grande :"
uid=1_81 InlineTextBox "Grande :"
uid=2_191 combobox expandable haspopup="menu" value="150px"
uid=4_611 MenuListPopup
uid=2_193 option "60px" selectable value="60px"
uid=2_194 option "80px" selectable value="80px"
uid=2_195 option "100px" selectable value="100px"
uid=2_196 option "120px" selectable value="120px"
uid=2_197 option "150px" selectable selected value="150px"
uid=2_198 option "200px" selectable value="200px"
uid=4_612 sectionfooter
uid=4_613 ignored
uid=2_201 button "Sauvegarder la disposition"
uid=4_614 ignored
uid=4_615 StaticText "Sauvegarder la disposition"
uid=1_81 InlineTextBox "Sauvegarder la disposition"
uid=2_204 button "Charger la disposition" disableable disabled
uid=4_616 ignored
uid=4_617 StaticText "Charger la disposition"
uid=1_81 InlineTextBox "Charger la disposition"
uid=2_207 button "Exporter"
uid=4_618 ignored
uid=4_619 StaticText "Exporter"
uid=1_81 InlineTextBox "Exporter"
uid=2_210 button "Importer"
uid=4_620 ignored
uid=4_621 StaticText "Importer"
uid=1_81 InlineTextBox "Importer"
uid=4_622 ignored
uid=2_214 button "Application auto..."
uid=4_623 ignored
uid=4_624 StaticText "Application auto..."
uid=1_81 InlineTextBox "Application auto..."
uid=2_217 button "Désactiver A/V"
uid=4_625 ignored
uid=4_626 StaticText "Désactiver A/V"
uid=1_81 InlineTextBox "Désactiver A/V"
uid=2_220 button "Paramètres A/V..."
uid=4_627 ignored
uid=4_628 StaticText "Paramètres A/V..."
uid=1_81 InlineTextBox "Paramètres A/V..."
uid=4_629 generic
uid=4_647 ignored
uid=9_67 ignored
uid=10_2 generic
uid=10_3 generic
uid=10_4 generic
uid=10_5 generic
uid=10_6 generic description="Drag to move"
uid=10_7 generic
uid=10_8 button
uid=10_9 generic
uid=10_10 ignored
uid=10_11 heading "Paramètres Scrying Pool" level="2"
uid=10_12 StaticText "Paramètres Scrying Pool"
uid=1_81 InlineTextBox "Paramètres Scrying Pool"
uid=10_13 paragraph
uid=10_14 StaticText "Configurer le comportement du module Scrying Pool"
uid=1_81 InlineTextBox "Configurer le comportement du module Scrying Pool"
uid=10_15 ignored
uid=10_16 ignored
uid=10_17 LabelText
uid=10_18 StaticText "État de la barre"
uid=1_81 InlineTextBox "État de la barre"
uid=10_19 button "Fermer la barre"
uid=10_20 generic
uid=10_21 StaticText "Fermer la barre"
uid=1_81 InlineTextBox "Fermer la barre"
uid=10_22 generic
+591
View File
@@ -0,0 +1,591 @@
uid=1_0 RootWebArea "Foundry Virtual Tabletop" url="https://localhost:31000/game"
uid=4_0 ignored
uid=4_1 generic
uid=4_2 list
uid=4_3 ignored
uid=4_4 ignored
uid=4_5 ignored
uid=4_6 ignored
uid=4_7 ignored
uid=4_8 ignored
uid=4_9 ignored
uid=4_10 ignored
uid=4_11 ignored
uid=4_12 ignored
uid=4_13 ignored
uid=4_14 ignored
uid=4_15 ignored
uid=4_16 ignored
uid=4_17 ignored
uid=4_18 ignored
uid=4_19 ignored
uid=4_20 ignored
uid=4_21 ignored
uid=4_22 ignored
uid=4_23 ignored
uid=4_24 ignored
uid=4_25 ignored
uid=4_26 ignored
uid=4_27 ignored
uid=4_28 ignored
uid=4_29 ignored
uid=4_30 ignored
uid=4_31 ignored
uid=4_32 ignored
uid=4_33 ignored
uid=4_34 ignored
uid=4_35 ignored
uid=4_36 ignored
uid=4_37 ignored
uid=4_38 ignored
uid=4_39 ignored
uid=4_40 ignored
uid=4_41 ignored
uid=4_42 generic
uid=4_43 generic
uid=4_44 generic
uid=4_45 generic
uid=4_46 list
uid=4_47 listitem level="1"
uid=1_49 tab "Outils de token" selectable
uid=4_48 listitem level="1"
uid=1_51 tab "Outils de tuile" selectable
uid=4_49 listitem level="1"
uid=1_53 tab "Outils de dessin" selectable
uid=4_50 listitem level="1"
uid=1_55 tab "Outils de mur" selectable
uid=4_51 listitem level="1"
uid=1_57 tab "Outils de lumière" selectable
uid=4_52 listitem level="1"
uid=1_59 tab "Outils de son dambiance" selectable
uid=4_53 listitem level="1"
uid=1_61 tab "Outils de région" selectable
uid=4_54 listitem level="1"
uid=1_63 tab "Notes" selectable
uid=4_55 list
uid=4_56 listitem level="1"
uid=1_66 button "Sélection de tokens" pressed
uid=4_57 listitem level="1"
uid=1_68 button "Sélection de cibles"
uid=4_58 listitem level="1"
uid=1_70 button "Règle"
uid=4_59 listitem level="1"
uid=1_72 button "Déplacement sans contrainte"
uid=4_60 generic
uid=11_0 ignored
uid=11_1 ignored
uid=11_2 generic
uid=11_3 list
uid=11_4 listitem level="1"
uid=11_5 ignored
uid=11_6 StaticText "Gamemaster [MJ]"
uid=1_81 InlineTextBox "Gamemaster [MJ]"
uid=11_7 generic
uid=11_8 generic
uid=11_9 LabelText
uid=11_10 StaticText "Latence"
uid=1_81 InlineTextBox "Latence"
uid=11_11 StaticText " "
uid=1_81 InlineTextBox " "
uid=11_12 StaticText "1ms"
uid=1_81 InlineTextBox "1ms"
uid=11_13 generic
uid=11_14 LabelText
uid=11_15 StaticText "IPS"
uid=1_81 InlineTextBox "IPS"
uid=11_16 StaticText " "
uid=1_81 InlineTextBox " "
uid=11_17 StaticText "30"
uid=1_81 InlineTextBox "30"
uid=11_18 button
uid=4_73 generic
uid=1_95 navigation
uid=4_74 generic "Développer la navigation"
uid=4_75 ignored
uid=4_76 list
uid=4_77 listitem level="1"
uid=4_78 ignored
uid=1_101 StaticText "Scène"
uid=1_81 InlineTextBox "Scène"
uid=4_79 list
uid=4_80 listitem "Gamemaster" level="2"
uid=1_104 StaticText "G"
uid=1_81 InlineTextBox "G"
uid=4_81 ignored
uid=1_81 generic
uid=1_81 StaticText ""
uid=1_81 InlineTextBox ""
uid=4_82 list
uid=4_83 ignored
uid=4_84 ignored
uid=4_85 generic
uid=4_86 sectionheader
uid=4_87 generic
uid=4_88 generic
uid=4_89 LabelText
uid=4_90 LabelText
uid=4_91 sectionfooter
uid=1_116 generic roledescription="Barre de raccourcis"
uid=4_92 generic
uid=1_118 button "Couper le son"
uid=1_119 button "Menu principal"
uid=4_93 list
uid=1_121 button "Emplacement vide"
uid=4_94 ignored
uid=4_95 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_124 button "Emplacement vide"
uid=4_96 ignored
uid=4_97 StaticText "2"
uid=1_81 InlineTextBox "2"
uid=1_127 button "Emplacement vide"
uid=4_98 ignored
uid=4_99 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=1_130 button "Emplacement vide"
uid=4_100 ignored
uid=4_101 StaticText "4"
uid=1_81 InlineTextBox "4"
uid=1_133 button "Emplacement vide"
uid=4_102 ignored
uid=4_103 StaticText "5"
uid=1_81 InlineTextBox "5"
uid=1_136 button "Emplacement vide"
uid=4_104 ignored
uid=4_105 StaticText "6"
uid=1_81 InlineTextBox "6"
uid=1_139 button "Emplacement vide"
uid=4_106 ignored
uid=4_107 StaticText "7"
uid=1_81 InlineTextBox "7"
uid=1_142 button "Emplacement vide"
uid=4_108 ignored
uid=4_109 StaticText "8"
uid=1_81 InlineTextBox "8"
uid=1_145 button "Emplacement vide"
uid=4_110 ignored
uid=4_111 StaticText "9"
uid=1_81 InlineTextBox "9"
uid=1_148 button "Emplacement vide"
uid=4_112 ignored
uid=4_113 StaticText "0"
uid=1_81 InlineTextBox "0"
uid=4_114 generic
uid=1_152 navigation
uid=1_153 button "Page suivante"
uid=4_115 ignored
uid=1_155 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_156 button "Page précédente"
uid=4_116 ignored
uid=1_158 button "Verrouiller la barre de raccourcis"
uid=1_159 button "Effacer la barre de raccourcis"
uid=4_117 generic
uid=4_118 generic
uid=4_119 generic
uid=4_120 ignored
uid=4_121 list
uid=4_122 generic "Tchat"
uid=4_123 generic
uid=1_167 generic value="
"
uid=1_168 paragraph
uid=1_169 LineBreak "
"
uid=1_81 InlineTextBox "
"
uid=4_124 ignored
uid=1_81 generic
uid=1_81 StaticText "Entrer un message"
uid=1_81 InlineTextBox "Entrer un message"
uid=4_125 generic
uid=4_126 generic
uid=1_173 button "Public en tant qu'utilisateur" pressed
uid=1_174 button "Privé pour les maîtres de jeu"
uid=1_175 button "Aveugle pour les maîtres de jeu"
uid=1_176 button "Seulement pour soi-même"
uid=1_177 button "Public en tant que personnage"
uid=4_127 generic
uid=4_128 tablist orientation="horizontal"
uid=4_129 list
uid=4_130 listitem level="1"
uid=1_182 tab "Messages du tchat" selectable
uid=4_131 listitem level="1"
uid=1_184 tab "Rencontres de combat" selectable
uid=4_132 listitem level="1"
uid=1_186 tab "Scènes" selectable
uid=4_133 listitem level="1"
uid=1_188 tab "Objets plaçables" selectable
uid=4_134 listitem level="1"
uid=1_190 tab "Acteurs" selectable
uid=4_135 listitem level="1"
uid=1_192 tab "Objets" selectable
uid=4_136 listitem level="1"
uid=1_194 tab "Journaux" selectable
uid=4_137 listitem level="1"
uid=1_196 tab "Tables aléatoires" selectable
uid=4_138 listitem level="1"
uid=1_198 tab "Jeux de cartes" selectable
uid=4_139 listitem level="1"
uid=1_200 tab "Macros" selectable
uid=4_140 listitem level="1"
uid=1_202 tab "Playlists" selectable
uid=4_141 listitem level="1"
uid=1_204 tab "Compendiums" selectable
uid=4_142 listitem level="1"
uid=1_206 tab "Dice So Nice" selectable
uid=4_143 listitem level="1"
uid=1_208 tab "Paramètres" selectable
uid=4_144 listitem level="1"
uid=1_210 button "Réduire"
uid=4_145 generic
uid=4_175 ignored
uid=4_176 ignored
uid=1_258 ignored
uid=1_259 ignored
uid=4_177 ignored
uid=4_178 ignored
uid=1_262 ignored
uid=4_299 ignored
uid=4_300 ignored
uid=1_447 ignored
uid=1_448 ignored
uid=4_301 ignored
uid=4_302 ignored
uid=1_451 ignored
uid=4_366 ignored
uid=4_367 ignored
uid=1_555 ignored
uid=1_556 ignored
uid=4_368 ignored
uid=4_369 ignored
uid=1_559 ignored
uid=4_444 ignored
uid=4_445 ignored
uid=1_674 ignored
uid=1_675 ignored
uid=4_446 ignored
uid=4_447 ignored
uid=1_678 ignored
uid=4_454 ignored
uid=4_455 ignored
uid=4_456 ignored
uid=4_457 ignored
uid=4_458 ignored
uid=4_459 ignored
uid=4_460 ignored
uid=4_461 ignored
uid=4_462 ignored
uid=4_463 ignored
uid=4_464 ignored
uid=4_465 ignored
uid=4_466 ignored
uid=4_467 ignored
uid=4_468 ignored
uid=4_469 ignored
uid=4_470 ignored
uid=4_471 ignored
uid=4_472 ignored
uid=4_473 ignored
uid=4_474 ignored
uid=4_475 ignored
uid=4_476 ignored
uid=4_477 ignored
uid=4_478 ignored
uid=4_479 ignored
uid=4_480 ignored
uid=4_481 ignored
uid=4_482 ignored
uid=4_483 ignored
uid=4_484 ignored
uid=4_485 ignored
uid=4_486 ignored
uid=4_487 ignored
uid=4_488 ignored
uid=4_489 ignored
uid=4_490 ignored
uid=9_1 generic
uid=9_2 generic
uid=9_3 heading "Foundry Virtual Tabletop" level="1"
uid=9_4 StaticText "Foundry Virtual Tabletop"
uid=1_81 InlineTextBox "Foundry Virtual Tabletop"
uid=9_5 paragraph
uid=9_6 StaticText "Version 14 Stable"
uid=1_81 InlineTextBox "Version 14 Stable"
uid=9_7 ignored
uid=9_8 ignored
uid=9_9 StaticText "Version"
uid=1_81 InlineTextBox "Version"
uid=9_10 ignored
uid=9_11 StaticText "363"
uid=1_81 InlineTextBox "363"
uid=9_12 ignored
uid=9_13 ignored
uid=9_14 StaticText "Donjon & Cie"
uid=1_81 InlineTextBox "Donjon & Cie"
uid=9_15 ignored
uid=9_16 StaticText "14.0.0"
uid=1_81 InlineTextBox "14.0.0"
uid=9_17 ignored
uid=9_18 ignored
uid=9_19 StaticText "Modules actifs"
uid=1_81 InlineTextBox "Modules actifs"
uid=9_20 ignored
uid=9_21 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=9_22 generic
uid=9_23 heading "Paramètres et configuration" level="4"
uid=9_24 StaticText "Paramètres et configuration"
uid=1_81 InlineTextBox "Paramètres et configuration"
uid=9_25 button "Paramètres de la partie"
uid=9_26 ignored
uid=9_27 StaticText "Paramètres de la partie"
uid=1_81 InlineTextBox "Paramètres de la partie"
uid=9_28 button "Configuration des contrôles"
uid=9_29 ignored
uid=9_30 StaticText "Configuration des contrôles"
uid=1_81 InlineTextBox "Configuration des contrôles"
uid=9_31 button "Gestion des modules"
uid=9_32 ignored
uid=9_33 StaticText "Gestion des modules"
uid=1_81 InlineTextBox "Gestion des modules"
uid=9_34 button "Configuration du monde"
uid=9_35 ignored
uid=9_36 StaticText "Configuration du monde"
uid=1_81 InlineTextBox "Configuration du monde"
uid=9_37 button "Gestion des utilisateurs"
uid=9_38 ignored
uid=9_39 StaticText "Gestion des utilisateurs"
uid=1_81 InlineTextBox "Gestion des utilisateurs"
uid=9_40 button "Gestion des présentations"
uid=9_41 ignored
uid=9_42 StaticText "Gestion des présentations"
uid=1_81 InlineTextBox "Gestion des présentations"
uid=9_43 generic
uid=9_44 heading "Aide et documentation" level="4"
uid=9_45 StaticText "Aide et documentation"
uid=1_81 InlineTextBox "Aide et documentation"
uid=9_46 button "Support & problèmes (1)"
uid=9_47 ignored
uid=9_48 StaticText "Support & problèmes (1)"
uid=1_81 InlineTextBox "Support & problèmes (1)"
uid=9_49 link "Documentation" url="https://foundryvtt.com/kb/"
uid=9_50 ignored
uid=9_51 StaticText "Documentation"
uid=1_81 InlineTextBox "Documentation"
uid=9_52 link "Wiki de la communauté" url="https://foundryvtt.wiki/"
uid=9_53 ignored
uid=9_54 StaticText "Wiki de la communauté"
uid=1_81 InlineTextBox "Wiki de la communauté"
uid=9_55 generic
uid=9_56 heading "Accès à la partie" level="4"
uid=9_57 StaticText "Accès à la partie"
uid=1_81 InlineTextBox "Accès à la partie"
uid=9_58 button "Liens dinvitation"
uid=9_59 ignored
uid=9_60 StaticText "Liens dinvitation"
uid=1_81 InlineTextBox "Liens dinvitation"
uid=9_61 button "Déconnexion"
uid=9_62 ignored
uid=9_63 StaticText "Déconnexion"
uid=1_81 InlineTextBox "Déconnexion"
uid=9_64 button "Retour à laccueil"
uid=9_65 ignored
uid=9_66 StaticText "Retour à laccueil"
uid=1_81 InlineTextBox "Retour à laccueil"
uid=4_491 generic
uid=4_492 generic
uid=4_493 generic
uid=4_494 Canvas
uid=4_498 generic
uid=4_499 ignored
uid=4_549 generic
uid=4_550 generic
uid=4_551 generic
uid=4_552 ignored
uid=2_99 button "Fermer"
uid=4_553 StaticText "×"
uid=1_81 InlineTextBox "×"
uid=4_554 list "Tableau du Réalisateur"
uid=2_102 listitem "Gamemaster" level="1"
uid=4_555 generic
uid=2_104 image "Avatar of Gamemaster" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=4_556 paragraph
uid=2_106 StaticText "Gamemaster"
uid=1_81 InlineTextBox "Gamemaster"
uid=2_107 button "Hide Gamemaster"
uid=4_557 ignored
uid=2_109 listitem "Player2" level="1"
uid=4_558 generic
uid=2_111 image "Avatar of Player2" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=2_112 status "Reaction Cam: Enabled" atomic description="Reaction Cam: Enabled" live="polite" relevant="additions text"
uid=4_559 ignored
uid=4_560 paragraph
uid=2_115 StaticText "Player2"
uid=1_81 InlineTextBox "Player2"
uid=2_116 button "Hide Player2"
uid=4_561 ignored
uid=2_118 listitem "Player3" level="1"
uid=4_562 generic
uid=2_120 image "Avatar of Player3" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=4_563 paragraph
uid=2_122 StaticText "Player3"
uid=1_81 InlineTextBox "Player3"
uid=2_123 button "Hide Player3"
uid=4_564 ignored
uid=8_18 ignored
uid=8_19 ignored
uid=8_20 ignored
uid=8_22 ignored
uid=8_23 ignored
uid=8_24 ignored
uid=8_25 ignored
uid=8_26 ignored
uid=8_27 ignored
uid=8_29 ignored
uid=8_30 ignored
uid=8_31 ignored
uid=8_32 ignored
uid=8_33 ignored
uid=4_579 ignored
uid=2_140 button "Tout afficher"
uid=4_580 ignored
uid=4_581 StaticText "Tout afficher"
uid=1_81 InlineTextBox "Tout afficher"
uid=2_143 button "Tout masquer"
uid=4_582 ignored
uid=4_583 StaticText "Tout masquer"
uid=1_81 InlineTextBox "Tout masquer"
uid=2_146 button "Ouvrir la référence des raccourcis"
uid=4_584 StaticText "?"
uid=1_81 InlineTextBox "?"
uid=4_585 toolbar "Disposition de la vue" orientation="horizontal"
uid=4_586 ignored
uid=2_150 StaticText "DISPOSITION DE LA VUE"
uid=1_81 InlineTextBox "DISPOSITION DE LA VUE"
uid=4_587 ignored
uid=2_152 button "S"
uid=4_588 ignored
uid=4_589 ignored
uid=4_590 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_156 button "L"
uid=4_591 ignored
uid=4_592 ignored
uid=4_593 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=2_160 button "S"
uid=4_594 ignored
uid=4_595 ignored
uid=4_596 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_164 button "L"
uid=4_597 ignored
uid=4_598 ignored
uid=4_599 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=2_168 button "S"
uid=4_600 ignored
uid=4_601 ignored
uid=4_602 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_172 button "L"
uid=4_603 ignored
uid=4_604 ignored
uid=4_605 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=4_606 toolbar "Largeurs des widgets vidéo" orientation="horizontal"
uid=2_177 StaticText "Largeurs des widgets vidéo"
uid=1_81 InlineTextBox "Largeurs des widgets vidéo"
uid=4_607 ignored
uid=4_608 generic
uid=2_180 StaticText "Petite :"
uid=1_81 InlineTextBox "Petite :"
uid=2_181 combobox expandable haspopup="menu" value="100px"
uid=4_609 MenuListPopup
uid=2_183 option "60px" selectable value="60px"
uid=2_184 option "80px" selectable value="80px"
uid=2_185 option "100px" selectable selected value="100px"
uid=2_186 option "120px" selectable value="120px"
uid=2_187 option "150px" selectable value="150px"
uid=2_188 option "200px" selectable value="200px"
uid=4_610 generic
uid=2_190 StaticText "Grande :"
uid=1_81 InlineTextBox "Grande :"
uid=2_191 combobox expandable haspopup="menu" value="150px"
uid=4_611 MenuListPopup
uid=2_193 option "60px" selectable value="60px"
uid=2_194 option "80px" selectable value="80px"
uid=2_195 option "100px" selectable value="100px"
uid=2_196 option "120px" selectable value="120px"
uid=2_197 option "150px" selectable selected value="150px"
uid=2_198 option "200px" selectable value="200px"
uid=4_612 sectionfooter
uid=4_613 ignored
uid=2_201 button "Sauvegarder la disposition"
uid=4_614 ignored
uid=4_615 StaticText "Sauvegarder la disposition"
uid=1_81 InlineTextBox "Sauvegarder la disposition"
uid=2_204 button "Charger la disposition" disableable disabled
uid=4_616 ignored
uid=4_617 StaticText "Charger la disposition"
uid=1_81 InlineTextBox "Charger la disposition"
uid=2_207 button "Exporter"
uid=4_618 ignored
uid=4_619 StaticText "Exporter"
uid=1_81 InlineTextBox "Exporter"
uid=2_210 button "Importer"
uid=4_620 ignored
uid=4_621 StaticText "Importer"
uid=1_81 InlineTextBox "Importer"
uid=4_622 ignored
uid=2_214 button "Application auto..."
uid=4_623 ignored
uid=4_624 StaticText "Application auto..."
uid=1_81 InlineTextBox "Application auto..."
uid=2_217 button "Désactiver A/V"
uid=4_625 ignored
uid=4_626 StaticText "Désactiver A/V"
uid=1_81 InlineTextBox "Désactiver A/V"
uid=2_220 button "Paramètres A/V..."
uid=4_627 ignored
uid=4_628 StaticText "Paramètres A/V..."
uid=1_81 InlineTextBox "Paramètres A/V..."
uid=4_629 generic
uid=11_19 generic
uid=11_20 ignored
uid=11_21 ignored
uid=11_22 heading "VOIR LES PARAMÈTRES DE CONFIDENTIALITÉ DU JOUEUR" level="2"
uid=11_23 StaticText "VOIR LES PARAMÈTRES DE CONFIDENTIALITÉ DU JOUEUR"
uid=1_81 InlineTextBox "VOIR LES PARAMÈTRES DE CONFIDENTIALITÉ DU JOUEUR"
uid=11_24 button "Close"
uid=11_25 generic
uid=11_26 paragraph
uid=11_27 StaticText "Sélectionnez un joueur pour voir ses préférences de consentement d'automatisation (lecture seule)"
uid=1_81 InlineTextBox "Sélectionnez un joueur pour voir ses préférences de consentement d'automatisation "
uid=1_81 InlineTextBox "(lecture seule)"
uid=11_28 ignored
uid=11_29 generic
uid=11_30 ignored
uid=11_31 StaticText "Gamemaster"
uid=1_81 InlineTextBox "Gamemaster"
uid=11_32 ignored
uid=11_33 StaticText "GM"
uid=1_81 InlineTextBox "GM"
uid=11_34 generic description="Player2 — Player"
uid=11_35 ignored
uid=11_36 StaticText "Player2"
uid=1_81 InlineTextBox "Player2"
uid=11_37 ignored
uid=11_38 StaticText "PLAYER"
uid=1_81 InlineTextBox "PLAYER"
uid=11_39 generic
uid=11_40 ignored
uid=11_41 StaticText "Player3"
uid=1_81 InlineTextBox "Player3"
uid=11_42 ignored
uid=11_43 StaticText "PLAYER"
uid=1_81 InlineTextBox "PLAYER"
uid=4_647 tooltip "Player2 — Player"
uid=11_44 StaticText "Player2 — Player"
uid=1_81 InlineTextBox "Player2 — Player"
Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

+641
View File
@@ -0,0 +1,641 @@
uid=1_0 RootWebArea "Foundry Virtual Tabletop" url="https://localhost:31000/game"
uid=4_0 ignored
uid=4_1 generic
uid=4_2 list
uid=4_3 ignored
uid=4_4 ignored
uid=4_5 ignored
uid=4_6 ignored
uid=4_7 ignored
uid=4_8 ignored
uid=4_9 ignored
uid=4_10 ignored
uid=4_11 ignored
uid=4_12 ignored
uid=4_13 ignored
uid=4_14 ignored
uid=4_15 ignored
uid=4_16 ignored
uid=4_17 ignored
uid=4_18 ignored
uid=4_19 ignored
uid=4_20 ignored
uid=4_21 ignored
uid=4_22 ignored
uid=4_23 ignored
uid=4_24 ignored
uid=4_25 ignored
uid=4_26 ignored
uid=4_27 ignored
uid=4_28 ignored
uid=4_29 ignored
uid=4_30 ignored
uid=4_31 ignored
uid=4_32 ignored
uid=4_33 ignored
uid=4_34 ignored
uid=4_35 ignored
uid=4_36 ignored
uid=4_37 ignored
uid=4_38 ignored
uid=4_39 ignored
uid=4_40 ignored
uid=4_41 ignored
uid=4_42 generic
uid=4_43 generic
uid=4_44 generic
uid=4_45 generic
uid=4_46 list
uid=4_47 listitem level="1"
uid=1_49 tab "Outils de token" selectable
uid=4_48 listitem level="1"
uid=1_51 tab "Outils de tuile" selectable
uid=4_49 listitem level="1"
uid=1_53 tab "Outils de dessin" selectable
uid=4_50 listitem level="1"
uid=1_55 tab "Outils de mur" selectable
uid=4_51 listitem level="1"
uid=1_57 tab "Outils de lumière" selectable
uid=4_52 listitem level="1"
uid=1_59 tab "Outils de son dambiance" selectable
uid=4_53 listitem level="1"
uid=1_61 tab "Outils de région" selectable
uid=4_54 listitem level="1"
uid=1_63 tab "Notes" selectable
uid=4_55 list
uid=4_56 listitem level="1"
uid=1_66 button "Sélection de tokens" pressed
uid=4_57 listitem level="1"
uid=1_68 button "Sélection de cibles"
uid=4_58 listitem level="1"
uid=1_70 button "Règle"
uid=4_59 listitem level="1"
uid=1_72 button "Déplacement sans contrainte"
uid=4_60 generic
uid=11_0 ignored
uid=11_1 ignored
uid=11_2 generic
uid=11_3 list
uid=11_4 listitem level="1"
uid=11_5 ignored
uid=11_6 StaticText "Gamemaster [MJ]"
uid=1_81 InlineTextBox "Gamemaster [MJ]"
uid=11_7 generic
uid=11_8 generic
uid=11_9 LabelText
uid=11_10 StaticText "Latence"
uid=1_81 InlineTextBox "Latence"
uid=11_11 StaticText " "
uid=1_81 InlineTextBox " "
uid=12_0 StaticText "1ms"
uid=1_81 InlineTextBox "1ms"
uid=11_13 generic
uid=11_14 LabelText
uid=11_15 StaticText "IPS"
uid=1_81 InlineTextBox "IPS"
uid=11_16 StaticText " "
uid=1_81 InlineTextBox " "
uid=12_1 StaticText "30"
uid=1_81 InlineTextBox "30"
uid=11_18 button
uid=4_73 generic
uid=1_95 navigation
uid=4_74 generic "Développer la navigation"
uid=4_75 ignored
uid=4_76 list
uid=4_77 listitem level="1"
uid=4_78 ignored
uid=1_101 StaticText "Scène"
uid=1_81 InlineTextBox "Scène"
uid=4_79 list
uid=4_80 listitem "Gamemaster" level="2"
uid=1_104 StaticText "G"
uid=1_81 InlineTextBox "G"
uid=4_81 ignored
uid=1_81 generic
uid=1_81 StaticText ""
uid=1_81 InlineTextBox ""
uid=4_82 list
uid=4_83 ignored
uid=4_84 ignored
uid=4_85 generic
uid=4_86 sectionheader
uid=4_87 generic
uid=4_88 generic
uid=4_89 LabelText
uid=4_90 LabelText
uid=4_91 sectionfooter
uid=1_116 generic roledescription="Barre de raccourcis"
uid=4_92 generic
uid=1_118 button "Couper le son"
uid=1_119 button "Menu principal"
uid=4_93 list
uid=1_121 button "Emplacement vide"
uid=4_94 ignored
uid=4_95 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_124 button "Emplacement vide"
uid=4_96 ignored
uid=4_97 StaticText "2"
uid=1_81 InlineTextBox "2"
uid=1_127 button "Emplacement vide"
uid=4_98 ignored
uid=4_99 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=1_130 button "Emplacement vide"
uid=4_100 ignored
uid=4_101 StaticText "4"
uid=1_81 InlineTextBox "4"
uid=1_133 button "Emplacement vide"
uid=4_102 ignored
uid=4_103 StaticText "5"
uid=1_81 InlineTextBox "5"
uid=1_136 button "Emplacement vide"
uid=4_104 ignored
uid=4_105 StaticText "6"
uid=1_81 InlineTextBox "6"
uid=1_139 button "Emplacement vide"
uid=4_106 ignored
uid=4_107 StaticText "7"
uid=1_81 InlineTextBox "7"
uid=1_142 button "Emplacement vide"
uid=4_108 ignored
uid=4_109 StaticText "8"
uid=1_81 InlineTextBox "8"
uid=1_145 button "Emplacement vide"
uid=4_110 ignored
uid=4_111 StaticText "9"
uid=1_81 InlineTextBox "9"
uid=1_148 button "Emplacement vide"
uid=4_112 ignored
uid=4_113 StaticText "0"
uid=1_81 InlineTextBox "0"
uid=4_114 generic
uid=1_152 navigation
uid=1_153 button "Page suivante"
uid=4_115 ignored
uid=1_155 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_156 button "Page précédente"
uid=4_116 ignored
uid=1_158 button "Verrouiller la barre de raccourcis"
uid=1_159 button "Effacer la barre de raccourcis"
uid=4_117 generic
uid=4_118 generic
uid=4_119 generic
uid=4_120 ignored
uid=4_121 list
uid=4_122 generic "Tchat"
uid=4_123 generic
uid=1_167 generic value="
"
uid=1_168 paragraph
uid=1_169 LineBreak "
"
uid=1_81 InlineTextBox "
"
uid=4_124 ignored
uid=1_81 generic
uid=1_81 StaticText "Entrer un message"
uid=1_81 InlineTextBox "Entrer un message"
uid=4_125 generic
uid=4_126 generic
uid=1_173 button "Public en tant qu'utilisateur" pressed
uid=1_174 button "Privé pour les maîtres de jeu"
uid=1_175 button "Aveugle pour les maîtres de jeu"
uid=1_176 button "Seulement pour soi-même"
uid=1_177 button "Public en tant que personnage"
uid=4_127 generic
uid=4_128 tablist orientation="horizontal"
uid=4_129 list
uid=4_130 listitem level="1"
uid=1_182 tab "Messages du tchat" selectable
uid=4_131 listitem level="1"
uid=1_184 tab "Rencontres de combat" selectable
uid=4_132 listitem level="1"
uid=1_186 tab "Scènes" selectable
uid=4_133 listitem level="1"
uid=1_188 tab "Objets plaçables" selectable
uid=4_134 listitem level="1"
uid=1_190 tab "Acteurs" selectable
uid=4_135 listitem level="1"
uid=1_192 tab "Objets" selectable
uid=4_136 listitem level="1"
uid=1_194 tab "Journaux" selectable
uid=4_137 listitem level="1"
uid=1_196 tab "Tables aléatoires" selectable
uid=4_138 listitem level="1"
uid=1_198 tab "Jeux de cartes" selectable
uid=4_139 listitem level="1"
uid=1_200 tab "Macros" selectable
uid=4_140 listitem level="1"
uid=1_202 tab "Playlists" selectable
uid=4_141 listitem level="1"
uid=1_204 tab "Compendiums" selectable
uid=4_142 listitem level="1"
uid=1_206 tab "Dice So Nice" selectable
uid=4_143 listitem level="1"
uid=1_208 tab "Paramètres" selectable
uid=4_144 listitem level="1"
uid=1_210 button "Réduire"
uid=4_145 generic
uid=4_175 ignored
uid=4_176 ignored
uid=1_258 ignored
uid=1_259 ignored
uid=4_177 ignored
uid=4_178 ignored
uid=1_262 ignored
uid=4_299 ignored
uid=4_300 ignored
uid=1_447 ignored
uid=1_448 ignored
uid=4_301 ignored
uid=4_302 ignored
uid=1_451 ignored
uid=4_366 ignored
uid=4_367 ignored
uid=1_555 ignored
uid=1_556 ignored
uid=4_368 ignored
uid=4_369 ignored
uid=1_559 ignored
uid=4_444 ignored
uid=4_445 ignored
uid=1_674 ignored
uid=1_675 ignored
uid=4_446 ignored
uid=4_447 ignored
uid=1_678 ignored
uid=4_454 ignored
uid=4_455 ignored
uid=4_456 ignored
uid=4_457 ignored
uid=4_458 ignored
uid=4_459 ignored
uid=4_460 ignored
uid=4_461 ignored
uid=4_462 ignored
uid=4_463 ignored
uid=4_464 ignored
uid=4_465 ignored
uid=4_466 ignored
uid=4_467 ignored
uid=4_468 ignored
uid=4_469 ignored
uid=4_470 ignored
uid=4_471 ignored
uid=4_472 ignored
uid=4_473 ignored
uid=4_474 ignored
uid=4_475 ignored
uid=4_476 ignored
uid=4_477 ignored
uid=4_478 ignored
uid=4_479 ignored
uid=4_480 ignored
uid=4_481 ignored
uid=4_482 ignored
uid=4_483 ignored
uid=4_484 ignored
uid=4_485 ignored
uid=4_486 ignored
uid=4_487 ignored
uid=4_488 ignored
uid=4_489 ignored
uid=4_490 ignored
uid=9_1 generic
uid=9_2 generic
uid=9_3 heading "Foundry Virtual Tabletop" level="1"
uid=9_4 StaticText "Foundry Virtual Tabletop"
uid=1_81 InlineTextBox "Foundry Virtual Tabletop"
uid=9_5 paragraph
uid=9_6 StaticText "Version 14 Stable"
uid=1_81 InlineTextBox "Version 14 Stable"
uid=9_7 ignored
uid=9_8 ignored
uid=9_9 StaticText "Version"
uid=1_81 InlineTextBox "Version"
uid=9_10 ignored
uid=9_11 StaticText "363"
uid=1_81 InlineTextBox "363"
uid=9_12 ignored
uid=9_13 ignored
uid=9_14 StaticText "Donjon & Cie"
uid=1_81 InlineTextBox "Donjon & Cie"
uid=9_15 ignored
uid=9_16 StaticText "14.0.0"
uid=1_81 InlineTextBox "14.0.0"
uid=9_17 ignored
uid=9_18 ignored
uid=9_19 StaticText "Modules actifs"
uid=1_81 InlineTextBox "Modules actifs"
uid=9_20 ignored
uid=9_21 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=9_22 generic
uid=9_23 heading "Paramètres et configuration" level="4"
uid=9_24 StaticText "Paramètres et configuration"
uid=1_81 InlineTextBox "Paramètres et configuration"
uid=9_25 button "Paramètres de la partie"
uid=9_26 ignored
uid=9_27 StaticText "Paramètres de la partie"
uid=1_81 InlineTextBox "Paramètres de la partie"
uid=9_28 button "Configuration des contrôles"
uid=9_29 ignored
uid=9_30 StaticText "Configuration des contrôles"
uid=1_81 InlineTextBox "Configuration des contrôles"
uid=9_31 button "Gestion des modules"
uid=9_32 ignored
uid=9_33 StaticText "Gestion des modules"
uid=1_81 InlineTextBox "Gestion des modules"
uid=9_34 button "Configuration du monde"
uid=9_35 ignored
uid=9_36 StaticText "Configuration du monde"
uid=1_81 InlineTextBox "Configuration du monde"
uid=9_37 button "Gestion des utilisateurs"
uid=9_38 ignored
uid=9_39 StaticText "Gestion des utilisateurs"
uid=1_81 InlineTextBox "Gestion des utilisateurs"
uid=9_40 button "Gestion des présentations"
uid=9_41 ignored
uid=9_42 StaticText "Gestion des présentations"
uid=1_81 InlineTextBox "Gestion des présentations"
uid=9_43 generic
uid=9_44 heading "Aide et documentation" level="4"
uid=9_45 StaticText "Aide et documentation"
uid=1_81 InlineTextBox "Aide et documentation"
uid=9_46 button "Support & problèmes (1)"
uid=9_47 ignored
uid=9_48 StaticText "Support & problèmes (1)"
uid=1_81 InlineTextBox "Support & problèmes (1)"
uid=9_49 link "Documentation" url="https://foundryvtt.com/kb/"
uid=9_50 ignored
uid=9_51 StaticText "Documentation"
uid=1_81 InlineTextBox "Documentation"
uid=9_52 link "Wiki de la communauté" url="https://foundryvtt.wiki/"
uid=9_53 ignored
uid=9_54 StaticText "Wiki de la communauté"
uid=1_81 InlineTextBox "Wiki de la communauté"
uid=9_55 generic
uid=9_56 heading "Accès à la partie" level="4"
uid=9_57 StaticText "Accès à la partie"
uid=1_81 InlineTextBox "Accès à la partie"
uid=9_58 button "Liens dinvitation"
uid=9_59 ignored
uid=9_60 StaticText "Liens dinvitation"
uid=1_81 InlineTextBox "Liens dinvitation"
uid=9_61 button "Déconnexion"
uid=9_62 ignored
uid=9_63 StaticText "Déconnexion"
uid=1_81 InlineTextBox "Déconnexion"
uid=9_64 button "Retour à laccueil"
uid=9_65 ignored
uid=9_66 StaticText "Retour à laccueil"
uid=1_81 InlineTextBox "Retour à laccueil"
uid=4_491 generic
uid=4_492 generic
uid=4_493 generic
uid=4_494 Canvas
uid=4_498 generic
uid=4_499 ignored
uid=4_549 generic
uid=4_550 generic
uid=4_551 generic
uid=4_552 ignored
uid=2_99 button "Fermer"
uid=4_553 StaticText "×"
uid=1_81 InlineTextBox "×"
uid=4_554 list "Tableau du Réalisateur"
uid=2_102 listitem "Gamemaster" level="1"
uid=4_555 generic
uid=2_104 image "Avatar of Gamemaster" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=4_556 paragraph
uid=2_106 StaticText "Gamemaster"
uid=1_81 InlineTextBox "Gamemaster"
uid=2_107 button "Hide Gamemaster"
uid=4_557 ignored
uid=2_109 listitem "Player2" level="1"
uid=4_558 generic
uid=2_111 image "Avatar of Player2" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=2_112 status "Reaction Cam: Enabled" atomic description="Reaction Cam: Enabled" live="polite" relevant="additions text"
uid=4_559 ignored
uid=4_560 paragraph
uid=2_115 StaticText "Player2"
uid=1_81 InlineTextBox "Player2"
uid=2_116 button "Hide Player2"
uid=4_561 ignored
uid=2_118 listitem "Player3" level="1"
uid=4_562 generic
uid=2_120 image "Avatar of Player3" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=4_563 paragraph
uid=2_122 StaticText "Player3"
uid=1_81 InlineTextBox "Player3"
uid=2_123 button "Hide Player3"
uid=4_564 ignored
uid=8_18 ignored
uid=8_19 ignored
uid=8_20 ignored
uid=8_22 ignored
uid=8_23 ignored
uid=8_24 ignored
uid=8_25 ignored
uid=8_26 ignored
uid=8_27 ignored
uid=8_29 ignored
uid=8_30 ignored
uid=8_31 ignored
uid=8_32 ignored
uid=8_33 ignored
uid=4_579 ignored
uid=2_140 button "Tout afficher"
uid=4_580 ignored
uid=4_581 StaticText "Tout afficher"
uid=1_81 InlineTextBox "Tout afficher"
uid=2_143 button "Tout masquer"
uid=4_582 ignored
uid=4_583 StaticText "Tout masquer"
uid=1_81 InlineTextBox "Tout masquer"
uid=2_146 button "Ouvrir la référence des raccourcis"
uid=4_584 StaticText "?"
uid=1_81 InlineTextBox "?"
uid=4_585 toolbar "Disposition de la vue" orientation="horizontal"
uid=4_586 ignored
uid=2_150 StaticText "DISPOSITION DE LA VUE"
uid=1_81 InlineTextBox "DISPOSITION DE LA VUE"
uid=4_587 ignored
uid=2_152 button "S"
uid=4_588 ignored
uid=4_589 ignored
uid=4_590 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_156 button "L"
uid=4_591 ignored
uid=4_592 ignored
uid=4_593 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=2_160 button "S"
uid=4_594 ignored
uid=4_595 ignored
uid=4_596 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_164 button "L"
uid=4_597 ignored
uid=4_598 ignored
uid=4_599 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=2_168 button "S"
uid=4_600 ignored
uid=4_601 ignored
uid=4_602 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_172 button "L"
uid=4_603 ignored
uid=4_604 ignored
uid=4_605 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=4_606 toolbar "Largeurs des widgets vidéo" orientation="horizontal"
uid=2_177 StaticText "Largeurs des widgets vidéo"
uid=1_81 InlineTextBox "Largeurs des widgets vidéo"
uid=4_607 ignored
uid=4_608 generic
uid=2_180 StaticText "Petite :"
uid=1_81 InlineTextBox "Petite :"
uid=2_181 combobox expandable haspopup="menu" value="100px"
uid=4_609 MenuListPopup
uid=2_183 option "60px" selectable value="60px"
uid=2_184 option "80px" selectable value="80px"
uid=2_185 option "100px" selectable selected value="100px"
uid=2_186 option "120px" selectable value="120px"
uid=2_187 option "150px" selectable value="150px"
uid=2_188 option "200px" selectable value="200px"
uid=4_610 generic
uid=2_190 StaticText "Grande :"
uid=1_81 InlineTextBox "Grande :"
uid=2_191 combobox expandable haspopup="menu" value="150px"
uid=4_611 MenuListPopup
uid=2_193 option "60px" selectable value="60px"
uid=2_194 option "80px" selectable value="80px"
uid=2_195 option "100px" selectable value="100px"
uid=2_196 option "120px" selectable value="120px"
uid=2_197 option "150px" selectable selected value="150px"
uid=2_198 option "200px" selectable value="200px"
uid=4_612 sectionfooter
uid=4_613 ignored
uid=2_201 button "Sauvegarder la disposition"
uid=4_614 ignored
uid=4_615 StaticText "Sauvegarder la disposition"
uid=1_81 InlineTextBox "Sauvegarder la disposition"
uid=2_204 button "Charger la disposition" disableable disabled
uid=4_616 ignored
uid=4_617 StaticText "Charger la disposition"
uid=1_81 InlineTextBox "Charger la disposition"
uid=2_207 button "Exporter"
uid=4_618 ignored
uid=4_619 StaticText "Exporter"
uid=1_81 InlineTextBox "Exporter"
uid=2_210 button "Importer"
uid=4_620 ignored
uid=4_621 StaticText "Importer"
uid=1_81 InlineTextBox "Importer"
uid=4_622 ignored
uid=2_214 button "Application auto..."
uid=4_623 ignored
uid=4_624 StaticText "Application auto..."
uid=1_81 InlineTextBox "Application auto..."
uid=2_217 button "Désactiver A/V"
uid=4_625 ignored
uid=4_626 StaticText "Désactiver A/V"
uid=1_81 InlineTextBox "Désactiver A/V"
uid=2_220 button "Paramètres A/V..."
uid=4_627 ignored
uid=4_628 StaticText "Paramètres A/V..."
uid=1_81 InlineTextBox "Paramètres A/V..."
uid=4_629 generic
uid=11_19 generic
uid=11_20 ignored
uid=11_21 ignored
uid=11_22 heading "VOIR LES PARAMÈTRES DE CONFIDENTIALITÉ DU JOUEUR" level="2"
uid=11_23 StaticText "VOIR LES PARAMÈTRES DE CONFIDENTIALITÉ DU JOUEUR"
uid=1_81 InlineTextBox "VOIR LES PARAMÈTRES DE CONFIDENTIALITÉ DU JOUEUR"
uid=11_24 button "Close"
uid=11_25 generic
uid=11_26 paragraph
uid=11_27 StaticText "Sélectionnez un joueur pour voir ses préférences de consentement d'automatisation (lecture seule)"
uid=1_81 InlineTextBox "Sélectionnez un joueur pour voir ses préférences de consentement d'automatisation "
uid=1_81 InlineTextBox "(lecture seule)"
uid=11_28 ignored
uid=11_29 generic
uid=11_30 ignored
uid=11_31 StaticText "Gamemaster"
uid=1_81 InlineTextBox "Gamemaster"
uid=11_32 ignored
uid=11_33 StaticText "GM"
uid=1_81 InlineTextBox "GM"
uid=11_34 generic
uid=11_35 ignored
uid=11_36 StaticText "Player2"
uid=1_81 InlineTextBox "Player2"
uid=11_37 ignored
uid=11_38 StaticText "PLAYER"
uid=1_81 InlineTextBox "PLAYER"
uid=11_39 generic
uid=11_40 ignored
uid=11_41 StaticText "Player3"
uid=1_81 InlineTextBox "Player3"
uid=11_42 ignored
uid=11_43 StaticText "PLAYER"
uid=1_81 InlineTextBox "PLAYER"
uid=4_647 ignored
uid=11_44 ignored
uid=12_2 generic
uid=12_3 banner
uid=12_4 heading "Player Privacy Panel" level="1"
uid=12_5 StaticText "Player Privacy Panel"
uid=1_81 InlineTextBox "Player Privacy Panel"
uid=12_6 button "Basculer les contrôles"
uid=12_7 button "Fermer la fenêtre"
uid=12_8 generic
uid=12_9 ignored
uid=12_10 ignored
uid=12_11 generic
uid=12_12 heading "CONSENTEMENTS D'AUTOMATISATION" level="3"
uid=12_13 StaticText "CONSENTEMENTS D'AUTOMATISATION"
uid=1_81 InlineTextBox "CONSENTEMENTS D'AUTOMATISATION"
uid=12_14 paragraph
uid=12_15 StaticText "Contrôlez quelles fonctionnalités d'automatisation peuvent affecter votre caméra et votre présence à l'écran."
uid=1_81 InlineTextBox "Contrôlez quelles fonctionnalités d'automatisation peuvent affecter votre "
uid=1_81 InlineTextBox "caméra et votre présence à l'écran."
uid=12_16 ignored
uid=12_17 ignored
uid=12_18 ignored
uid=12_19 heading "Caméra de réaction" level="4"
uid=12_20 StaticText "Caméra de réaction"
uid=1_81 InlineTextBox "Caméra de réaction"
uid=12_21 ignored
uid=12_22 LabelText
uid=12_23 checkbox "Caméra de réaction"
uid=12_24 ignored
uid=12_25 ignored
uid=12_26 StaticText "DÉSACTIVÉ"
uid=1_81 InlineTextBox "DÉSACTIVÉ"
uid=12_27 paragraph
uid=12_28 StaticText "Affiche automatiquement votre caméra pendant les moments clés (combats, jets de dés, etc.)"
uid=1_81 InlineTextBox "Affiche automatiquement votre caméra pendant les moments clés "
uid=1_81 InlineTextBox "(combats, jets de dés, etc.)"
uid=12_29 generic
uid=12_30 heading "PORTRAIT DE SECOURS" level="3"
uid=12_31 StaticText "PORTRAIT DE SECOURS"
uid=1_81 InlineTextBox "PORTRAIT DE SECOURS"
uid=12_32 paragraph
uid=12_33 StaticText "Image à afficher lorsque votre caméra n'est pas disponible ou ne fonctionne pas."
uid=1_81 InlineTextBox "Image à afficher lorsque votre caméra n'est pas disponible ou ne "
uid=1_81 InlineTextBox "fonctionne pas."
uid=12_34 ignored
uid=12_35 ignored
uid=12_36 image "Portrait preview" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=12_37 ignored
uid=12_38 button "Choisir une image"
uid=12_39 ignored
uid=12_40 StaticText "Choisir une image"
uid=1_81 InlineTextBox "Choisir une image"
Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

+641
View File
@@ -0,0 +1,641 @@
uid=1_0 RootWebArea "Foundry Virtual Tabletop" url="https://localhost:31000/game"
uid=4_0 ignored
uid=4_1 generic
uid=4_2 list
uid=4_3 ignored
uid=4_4 ignored
uid=4_5 ignored
uid=4_6 ignored
uid=4_7 ignored
uid=4_8 ignored
uid=4_9 ignored
uid=4_10 ignored
uid=4_11 ignored
uid=4_12 ignored
uid=4_13 ignored
uid=4_14 ignored
uid=4_15 ignored
uid=4_16 ignored
uid=4_17 ignored
uid=4_18 ignored
uid=4_19 ignored
uid=4_20 ignored
uid=4_21 ignored
uid=4_22 ignored
uid=4_23 ignored
uid=4_24 ignored
uid=4_25 ignored
uid=4_26 ignored
uid=4_27 ignored
uid=4_28 ignored
uid=4_29 ignored
uid=4_30 ignored
uid=4_31 ignored
uid=4_32 ignored
uid=4_33 ignored
uid=4_34 ignored
uid=4_35 ignored
uid=4_36 ignored
uid=4_37 ignored
uid=4_38 ignored
uid=4_39 ignored
uid=4_40 ignored
uid=4_41 ignored
uid=4_42 generic
uid=4_43 generic
uid=4_44 generic
uid=4_45 generic
uid=4_46 list
uid=4_47 listitem level="1"
uid=1_49 tab "Outils de token" selectable
uid=4_48 listitem level="1"
uid=1_51 tab "Outils de tuile" selectable
uid=4_49 listitem level="1"
uid=1_53 tab "Outils de dessin" selectable
uid=4_50 listitem level="1"
uid=1_55 tab "Outils de mur" selectable
uid=4_51 listitem level="1"
uid=1_57 tab "Outils de lumière" selectable
uid=4_52 listitem level="1"
uid=1_59 tab "Outils de son dambiance" selectable
uid=4_53 listitem level="1"
uid=1_61 tab "Outils de région" selectable
uid=4_54 listitem level="1"
uid=1_63 tab "Notes" selectable
uid=4_55 list
uid=4_56 listitem level="1"
uid=1_66 button "Sélection de tokens" pressed
uid=4_57 listitem level="1"
uid=1_68 button "Sélection de cibles"
uid=4_58 listitem level="1"
uid=1_70 button "Règle"
uid=4_59 listitem level="1"
uid=1_72 button "Déplacement sans contrainte"
uid=4_60 generic
uid=11_0 ignored
uid=11_1 ignored
uid=11_2 generic
uid=11_3 list
uid=11_4 listitem level="1"
uid=11_5 ignored
uid=11_6 StaticText "Gamemaster [MJ]"
uid=1_81 InlineTextBox "Gamemaster [MJ]"
uid=11_7 generic
uid=11_8 generic
uid=11_9 LabelText
uid=11_10 StaticText "Latence"
uid=1_81 InlineTextBox "Latence"
uid=11_11 StaticText " "
uid=1_81 InlineTextBox " "
uid=14_0 StaticText "1ms"
uid=1_81 InlineTextBox "1ms"
uid=11_13 generic
uid=11_14 LabelText
uid=11_15 StaticText "IPS"
uid=1_81 InlineTextBox "IPS"
uid=11_16 StaticText " "
uid=1_81 InlineTextBox " "
uid=14_1 StaticText "30"
uid=1_81 InlineTextBox "30"
uid=11_18 button
uid=4_73 generic
uid=1_95 navigation
uid=4_74 generic "Développer la navigation"
uid=4_75 ignored
uid=4_76 list
uid=4_77 listitem level="1"
uid=4_78 ignored
uid=1_101 StaticText "Scène"
uid=1_81 InlineTextBox "Scène"
uid=4_79 list
uid=4_80 listitem "Gamemaster" level="2"
uid=1_104 StaticText "G"
uid=1_81 InlineTextBox "G"
uid=4_81 ignored
uid=1_81 generic
uid=1_81 StaticText ""
uid=1_81 InlineTextBox ""
uid=4_82 list
uid=4_83 ignored
uid=4_84 ignored
uid=4_85 generic
uid=4_86 sectionheader
uid=4_87 generic
uid=4_88 generic
uid=4_89 LabelText
uid=4_90 LabelText
uid=4_91 sectionfooter
uid=1_116 generic roledescription="Barre de raccourcis"
uid=4_92 generic
uid=1_118 button "Couper le son"
uid=1_119 button "Menu principal"
uid=4_93 list
uid=1_121 button "Emplacement vide"
uid=4_94 ignored
uid=4_95 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_124 button "Emplacement vide"
uid=4_96 ignored
uid=4_97 StaticText "2"
uid=1_81 InlineTextBox "2"
uid=1_127 button "Emplacement vide"
uid=4_98 ignored
uid=4_99 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=1_130 button "Emplacement vide"
uid=4_100 ignored
uid=4_101 StaticText "4"
uid=1_81 InlineTextBox "4"
uid=1_133 button "Emplacement vide"
uid=4_102 ignored
uid=4_103 StaticText "5"
uid=1_81 InlineTextBox "5"
uid=1_136 button "Emplacement vide"
uid=4_104 ignored
uid=4_105 StaticText "6"
uid=1_81 InlineTextBox "6"
uid=1_139 button "Emplacement vide"
uid=4_106 ignored
uid=4_107 StaticText "7"
uid=1_81 InlineTextBox "7"
uid=1_142 button "Emplacement vide"
uid=4_108 ignored
uid=4_109 StaticText "8"
uid=1_81 InlineTextBox "8"
uid=1_145 button "Emplacement vide"
uid=4_110 ignored
uid=4_111 StaticText "9"
uid=1_81 InlineTextBox "9"
uid=1_148 button "Emplacement vide"
uid=4_112 ignored
uid=4_113 StaticText "0"
uid=1_81 InlineTextBox "0"
uid=4_114 generic
uid=1_152 navigation
uid=1_153 button "Page suivante"
uid=4_115 ignored
uid=1_155 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_156 button "Page précédente"
uid=4_116 ignored
uid=1_158 button "Verrouiller la barre de raccourcis"
uid=1_159 button "Effacer la barre de raccourcis"
uid=4_117 generic
uid=4_118 generic
uid=4_119 generic
uid=4_120 ignored
uid=4_121 list
uid=4_122 generic "Tchat"
uid=4_123 generic
uid=1_167 generic value="
"
uid=1_168 paragraph
uid=1_169 LineBreak "
"
uid=1_81 InlineTextBox "
"
uid=4_124 ignored
uid=1_81 generic
uid=1_81 StaticText "Entrer un message"
uid=1_81 InlineTextBox "Entrer un message"
uid=4_125 generic
uid=4_126 generic
uid=1_173 button "Public en tant qu'utilisateur" pressed
uid=1_174 button "Privé pour les maîtres de jeu"
uid=1_175 button "Aveugle pour les maîtres de jeu"
uid=1_176 button "Seulement pour soi-même"
uid=1_177 button "Public en tant que personnage"
uid=4_127 generic
uid=4_128 tablist orientation="horizontal"
uid=4_129 list
uid=4_130 listitem level="1"
uid=1_182 tab "Messages du tchat" selectable
uid=4_131 listitem level="1"
uid=1_184 tab "Rencontres de combat" selectable
uid=4_132 listitem level="1"
uid=1_186 tab "Scènes" selectable
uid=4_133 listitem level="1"
uid=1_188 tab "Objets plaçables" selectable
uid=4_134 listitem level="1"
uid=1_190 tab "Acteurs" selectable
uid=4_135 listitem level="1"
uid=1_192 tab "Objets" selectable
uid=4_136 listitem level="1"
uid=1_194 tab "Journaux" selectable
uid=4_137 listitem level="1"
uid=1_196 tab "Tables aléatoires" selectable
uid=4_138 listitem level="1"
uid=1_198 tab "Jeux de cartes" selectable
uid=4_139 listitem level="1"
uid=1_200 tab "Macros" selectable
uid=4_140 listitem level="1"
uid=1_202 tab "Playlists" selectable
uid=4_141 listitem level="1"
uid=1_204 tab "Compendiums" selectable
uid=4_142 listitem level="1"
uid=1_206 tab "Dice So Nice" selectable
uid=4_143 listitem level="1"
uid=1_208 tab "Paramètres" selectable
uid=4_144 listitem level="1"
uid=1_210 button "Réduire"
uid=4_145 generic
uid=4_175 ignored
uid=4_176 ignored
uid=1_258 ignored
uid=1_259 ignored
uid=4_177 ignored
uid=4_178 ignored
uid=1_262 ignored
uid=4_299 ignored
uid=4_300 ignored
uid=1_447 ignored
uid=1_448 ignored
uid=4_301 ignored
uid=4_302 ignored
uid=1_451 ignored
uid=4_366 ignored
uid=4_367 ignored
uid=1_555 ignored
uid=1_556 ignored
uid=4_368 ignored
uid=4_369 ignored
uid=1_559 ignored
uid=4_444 ignored
uid=4_445 ignored
uid=1_674 ignored
uid=1_675 ignored
uid=4_446 ignored
uid=4_447 ignored
uid=1_678 ignored
uid=4_454 ignored
uid=4_455 ignored
uid=4_456 ignored
uid=4_457 ignored
uid=4_458 ignored
uid=4_459 ignored
uid=4_460 ignored
uid=4_461 ignored
uid=4_462 ignored
uid=4_463 ignored
uid=4_464 ignored
uid=4_465 ignored
uid=4_466 ignored
uid=4_467 ignored
uid=4_468 ignored
uid=4_469 ignored
uid=4_470 ignored
uid=4_471 ignored
uid=4_472 ignored
uid=4_473 ignored
uid=4_474 ignored
uid=4_475 ignored
uid=4_476 ignored
uid=4_477 ignored
uid=4_478 ignored
uid=4_479 ignored
uid=4_480 ignored
uid=4_481 ignored
uid=4_482 ignored
uid=4_483 ignored
uid=4_484 ignored
uid=4_485 ignored
uid=4_486 ignored
uid=4_487 ignored
uid=4_488 ignored
uid=4_489 ignored
uid=4_490 ignored
uid=9_1 generic
uid=9_2 generic
uid=9_3 heading "Foundry Virtual Tabletop" level="1"
uid=9_4 StaticText "Foundry Virtual Tabletop"
uid=1_81 InlineTextBox "Foundry Virtual Tabletop"
uid=9_5 paragraph
uid=9_6 StaticText "Version 14 Stable"
uid=1_81 InlineTextBox "Version 14 Stable"
uid=9_7 ignored
uid=9_8 ignored
uid=9_9 StaticText "Version"
uid=1_81 InlineTextBox "Version"
uid=9_10 ignored
uid=9_11 StaticText "363"
uid=1_81 InlineTextBox "363"
uid=9_12 ignored
uid=9_13 ignored
uid=9_14 StaticText "Donjon & Cie"
uid=1_81 InlineTextBox "Donjon & Cie"
uid=9_15 ignored
uid=9_16 StaticText "14.0.0"
uid=1_81 InlineTextBox "14.0.0"
uid=9_17 ignored
uid=9_18 ignored
uid=9_19 StaticText "Modules actifs"
uid=1_81 InlineTextBox "Modules actifs"
uid=9_20 ignored
uid=9_21 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=9_22 generic
uid=9_23 heading "Paramètres et configuration" level="4"
uid=9_24 StaticText "Paramètres et configuration"
uid=1_81 InlineTextBox "Paramètres et configuration"
uid=9_25 button "Paramètres de la partie"
uid=9_26 ignored
uid=9_27 StaticText "Paramètres de la partie"
uid=1_81 InlineTextBox "Paramètres de la partie"
uid=9_28 button "Configuration des contrôles"
uid=9_29 ignored
uid=9_30 StaticText "Configuration des contrôles"
uid=1_81 InlineTextBox "Configuration des contrôles"
uid=9_31 button "Gestion des modules"
uid=9_32 ignored
uid=9_33 StaticText "Gestion des modules"
uid=1_81 InlineTextBox "Gestion des modules"
uid=9_34 button "Configuration du monde"
uid=9_35 ignored
uid=9_36 StaticText "Configuration du monde"
uid=1_81 InlineTextBox "Configuration du monde"
uid=9_37 button "Gestion des utilisateurs"
uid=9_38 ignored
uid=9_39 StaticText "Gestion des utilisateurs"
uid=1_81 InlineTextBox "Gestion des utilisateurs"
uid=9_40 button "Gestion des présentations"
uid=9_41 ignored
uid=9_42 StaticText "Gestion des présentations"
uid=1_81 InlineTextBox "Gestion des présentations"
uid=9_43 generic
uid=9_44 heading "Aide et documentation" level="4"
uid=9_45 StaticText "Aide et documentation"
uid=1_81 InlineTextBox "Aide et documentation"
uid=9_46 button "Support & problèmes (1)"
uid=9_47 ignored
uid=9_48 StaticText "Support & problèmes (1)"
uid=1_81 InlineTextBox "Support & problèmes (1)"
uid=9_49 link "Documentation" url="https://foundryvtt.com/kb/"
uid=9_50 ignored
uid=9_51 StaticText "Documentation"
uid=1_81 InlineTextBox "Documentation"
uid=9_52 link "Wiki de la communauté" url="https://foundryvtt.wiki/"
uid=9_53 ignored
uid=9_54 StaticText "Wiki de la communauté"
uid=1_81 InlineTextBox "Wiki de la communauté"
uid=9_55 generic
uid=9_56 heading "Accès à la partie" level="4"
uid=9_57 StaticText "Accès à la partie"
uid=1_81 InlineTextBox "Accès à la partie"
uid=9_58 button "Liens dinvitation"
uid=9_59 ignored
uid=9_60 StaticText "Liens dinvitation"
uid=1_81 InlineTextBox "Liens dinvitation"
uid=9_61 button "Déconnexion"
uid=9_62 ignored
uid=9_63 StaticText "Déconnexion"
uid=1_81 InlineTextBox "Déconnexion"
uid=9_64 button "Retour à laccueil"
uid=9_65 ignored
uid=9_66 StaticText "Retour à laccueil"
uid=1_81 InlineTextBox "Retour à laccueil"
uid=4_491 generic
uid=4_492 generic
uid=4_493 generic
uid=4_494 Canvas
uid=4_498 generic
uid=4_499 ignored
uid=4_549 generic
uid=4_550 generic
uid=4_551 generic
uid=4_552 ignored
uid=2_99 button "Fermer"
uid=4_553 StaticText "×"
uid=1_81 InlineTextBox "×"
uid=4_554 list "Tableau du Réalisateur"
uid=2_102 listitem "Gamemaster" level="1"
uid=4_555 generic
uid=2_104 image "Avatar of Gamemaster" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=4_556 paragraph
uid=2_106 StaticText "Gamemaster"
uid=1_81 InlineTextBox "Gamemaster"
uid=2_107 button "Hide Gamemaster"
uid=4_557 ignored
uid=2_109 listitem "Player2" level="1"
uid=4_558 generic
uid=2_111 image "Avatar of Player2" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=2_112 status "Reaction Cam: Enabled" atomic description="Reaction Cam: Enabled" live="polite" relevant="additions text"
uid=4_559 ignored
uid=4_560 paragraph
uid=2_115 StaticText "Player2"
uid=1_81 InlineTextBox "Player2"
uid=2_116 button "Hide Player2"
uid=4_561 ignored
uid=2_118 listitem "Player3" level="1"
uid=4_562 generic
uid=2_120 image "Avatar of Player3" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=4_563 paragraph
uid=2_122 StaticText "Player3"
uid=1_81 InlineTextBox "Player3"
uid=2_123 button "Hide Player3"
uid=4_564 ignored
uid=8_18 ignored
uid=8_19 ignored
uid=8_20 ignored
uid=8_22 ignored
uid=8_23 ignored
uid=8_24 ignored
uid=8_25 ignored
uid=8_26 ignored
uid=8_27 ignored
uid=8_29 ignored
uid=8_30 ignored
uid=8_31 ignored
uid=8_32 ignored
uid=8_33 ignored
uid=4_579 ignored
uid=2_140 button "Tout afficher"
uid=4_580 ignored
uid=4_581 StaticText "Tout afficher"
uid=1_81 InlineTextBox "Tout afficher"
uid=2_143 button "Tout masquer"
uid=4_582 ignored
uid=4_583 StaticText "Tout masquer"
uid=1_81 InlineTextBox "Tout masquer"
uid=2_146 button "Ouvrir la référence des raccourcis"
uid=4_584 StaticText "?"
uid=1_81 InlineTextBox "?"
uid=4_585 toolbar "Disposition de la vue" orientation="horizontal"
uid=4_586 ignored
uid=2_150 StaticText "DISPOSITION DE LA VUE"
uid=1_81 InlineTextBox "DISPOSITION DE LA VUE"
uid=4_587 ignored
uid=2_152 button "S"
uid=4_588 ignored
uid=4_589 ignored
uid=4_590 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_156 button "L"
uid=4_591 ignored
uid=4_592 ignored
uid=4_593 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=2_160 button "S"
uid=4_594 ignored
uid=4_595 ignored
uid=4_596 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_164 button "L"
uid=4_597 ignored
uid=4_598 ignored
uid=4_599 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=2_168 button "S"
uid=4_600 ignored
uid=4_601 ignored
uid=4_602 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_172 button "L"
uid=4_603 ignored
uid=4_604 ignored
uid=4_605 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=4_606 toolbar "Largeurs des widgets vidéo" orientation="horizontal"
uid=2_177 StaticText "Largeurs des widgets vidéo"
uid=1_81 InlineTextBox "Largeurs des widgets vidéo"
uid=4_607 ignored
uid=4_608 generic
uid=2_180 StaticText "Petite :"
uid=1_81 InlineTextBox "Petite :"
uid=2_181 combobox expandable haspopup="menu" value="100px"
uid=4_609 MenuListPopup
uid=2_183 option "60px" selectable value="60px"
uid=2_184 option "80px" selectable value="80px"
uid=2_185 option "100px" selectable selected value="100px"
uid=2_186 option "120px" selectable value="120px"
uid=2_187 option "150px" selectable value="150px"
uid=2_188 option "200px" selectable value="200px"
uid=4_610 generic
uid=2_190 StaticText "Grande :"
uid=1_81 InlineTextBox "Grande :"
uid=2_191 combobox expandable haspopup="menu" value="150px"
uid=4_611 MenuListPopup
uid=2_193 option "60px" selectable value="60px"
uid=2_194 option "80px" selectable value="80px"
uid=2_195 option "100px" selectable value="100px"
uid=2_196 option "120px" selectable value="120px"
uid=2_197 option "150px" selectable selected value="150px"
uid=2_198 option "200px" selectable value="200px"
uid=4_612 sectionfooter
uid=4_613 ignored
uid=2_201 button "Sauvegarder la disposition"
uid=4_614 ignored
uid=4_615 StaticText "Sauvegarder la disposition"
uid=1_81 InlineTextBox "Sauvegarder la disposition"
uid=2_204 button "Charger la disposition" disableable disabled
uid=4_616 ignored
uid=4_617 StaticText "Charger la disposition"
uid=1_81 InlineTextBox "Charger la disposition"
uid=2_207 button "Exporter"
uid=4_618 ignored
uid=4_619 StaticText "Exporter"
uid=1_81 InlineTextBox "Exporter"
uid=2_210 button "Importer"
uid=4_620 ignored
uid=4_621 StaticText "Importer"
uid=1_81 InlineTextBox "Importer"
uid=4_622 ignored
uid=2_214 button "Application auto..."
uid=4_623 ignored
uid=4_624 StaticText "Application auto..."
uid=1_81 InlineTextBox "Application auto..."
uid=2_217 button "Désactiver A/V"
uid=4_625 ignored
uid=4_626 StaticText "Désactiver A/V"
uid=1_81 InlineTextBox "Désactiver A/V"
uid=2_220 button "Paramètres A/V..."
uid=4_627 ignored
uid=4_628 StaticText "Paramètres A/V..."
uid=1_81 InlineTextBox "Paramètres A/V..."
uid=4_629 generic
uid=11_19 generic
uid=11_20 ignored
uid=11_21 ignored
uid=11_22 heading "VOIR LES PARAMÈTRES DE CONFIDENTIALITÉ DU JOUEUR" level="2"
uid=11_23 StaticText "VOIR LES PARAMÈTRES DE CONFIDENTIALITÉ DU JOUEUR"
uid=1_81 InlineTextBox "VOIR LES PARAMÈTRES DE CONFIDENTIALITÉ DU JOUEUR"
uid=11_24 button "Close"
uid=11_25 generic
uid=11_26 paragraph
uid=11_27 StaticText "Sélectionnez un joueur pour voir ses préférences de consentement d'automatisation (lecture seule)"
uid=1_81 InlineTextBox "Sélectionnez un joueur pour voir ses préférences de consentement d'automatisation "
uid=1_81 InlineTextBox "(lecture seule)"
uid=11_28 ignored
uid=11_29 generic
uid=11_30 ignored
uid=11_31 StaticText "Gamemaster"
uid=1_81 InlineTextBox "Gamemaster"
uid=11_32 ignored
uid=11_33 StaticText "GM"
uid=1_81 InlineTextBox "GM"
uid=11_34 generic
uid=11_35 ignored
uid=11_36 StaticText "Player2"
uid=1_81 InlineTextBox "Player2"
uid=11_37 ignored
uid=11_38 StaticText "PLAYER"
uid=1_81 InlineTextBox "PLAYER"
uid=11_39 generic
uid=11_40 ignored
uid=11_41 StaticText "Player3"
uid=1_81 InlineTextBox "Player3"
uid=11_42 ignored
uid=11_43 StaticText "PLAYER"
uid=1_81 InlineTextBox "PLAYER"
uid=4_647 ignored
uid=11_44 ignored
uid=12_2 generic
uid=12_3 banner
uid=12_4 heading "Player Privacy Panel" level="1"
uid=12_5 StaticText "Player Privacy Panel"
uid=1_81 InlineTextBox "Player Privacy Panel"
uid=12_6 button "Basculer les contrôles"
uid=12_7 button "Fermer la fenêtre"
uid=12_8 generic
uid=12_9 ignored
uid=12_10 ignored
uid=12_11 generic
uid=12_12 heading "CONSENTEMENTS D'AUTOMATISATION" level="3"
uid=12_13 StaticText "CONSENTEMENTS D'AUTOMATISATION"
uid=1_81 InlineTextBox "CONSENTEMENTS D'AUTOMATISATION"
uid=12_14 paragraph
uid=12_15 StaticText "Contrôlez quelles fonctionnalités d'automatisation peuvent affecter votre caméra et votre présence à l'écran."
uid=1_81 InlineTextBox "Contrôlez quelles fonctionnalités d'automatisation peuvent affecter votre "
uid=1_81 InlineTextBox "caméra et votre présence à l'écran."
uid=12_16 ignored
uid=12_17 ignored
uid=12_18 ignored
uid=12_19 heading "Caméra de réaction" level="4"
uid=12_20 StaticText "Caméra de réaction"
uid=1_81 InlineTextBox "Caméra de réaction"
uid=12_21 ignored
uid=12_22 LabelText
uid=12_23 checkbox "Caméra de réaction"
uid=12_24 ignored
uid=12_25 ignored
uid=12_26 StaticText "DÉSACTIVÉ"
uid=1_81 InlineTextBox "DÉSACTIVÉ"
uid=12_27 paragraph
uid=12_28 StaticText "Affiche automatiquement votre caméra pendant les moments clés (combats, jets de dés, etc.)"
uid=1_81 InlineTextBox "Affiche automatiquement votre caméra pendant les moments clés "
uid=1_81 InlineTextBox "(combats, jets de dés, etc.)"
uid=12_29 generic
uid=12_30 heading "PORTRAIT DE SECOURS" level="3"
uid=12_31 StaticText "PORTRAIT DE SECOURS"
uid=1_81 InlineTextBox "PORTRAIT DE SECOURS"
uid=12_32 paragraph
uid=12_33 StaticText "Image à afficher lorsque votre caméra n'est pas disponible ou ne fonctionne pas."
uid=1_81 InlineTextBox "Image à afficher lorsque votre caméra n'est pas disponible ou ne "
uid=1_81 InlineTextBox "fonctionne pas."
uid=12_34 ignored
uid=12_35 ignored
uid=12_36 image "Portrait preview" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=12_37 ignored
uid=12_38 button "Choisir une image"
uid=12_39 ignored
uid=12_40 StaticText "Choisir une image"
uid=1_81 InlineTextBox "Choisir une image"
+666
View File
@@ -0,0 +1,666 @@
uid=1_0 RootWebArea "Foundry Virtual Tabletop" url="https://localhost:31000/game"
uid=4_0 ignored
uid=4_1 generic
uid=4_2 list
uid=4_3 ignored
uid=4_4 ignored
uid=4_5 ignored
uid=4_6 ignored
uid=4_7 ignored
uid=4_8 ignored
uid=4_9 ignored
uid=4_10 ignored
uid=4_11 ignored
uid=4_12 ignored
uid=4_13 ignored
uid=4_14 ignored
uid=4_15 ignored
uid=4_16 ignored
uid=4_17 ignored
uid=4_18 ignored
uid=4_19 ignored
uid=4_20 ignored
uid=4_21 ignored
uid=4_22 ignored
uid=4_23 ignored
uid=4_24 ignored
uid=4_25 ignored
uid=4_26 ignored
uid=4_27 ignored
uid=4_28 ignored
uid=4_29 ignored
uid=4_30 ignored
uid=4_31 ignored
uid=4_32 ignored
uid=4_33 ignored
uid=4_34 ignored
uid=4_35 ignored
uid=4_36 ignored
uid=4_37 ignored
uid=4_38 ignored
uid=4_39 ignored
uid=4_40 ignored
uid=4_41 ignored
uid=4_42 generic
uid=4_43 generic
uid=4_44 generic
uid=4_45 generic
uid=4_46 list
uid=4_47 listitem level="1"
uid=1_49 tab "Outils de token" selectable
uid=4_48 listitem level="1"
uid=1_51 tab "Outils de tuile" selectable
uid=4_49 listitem level="1"
uid=1_53 tab "Outils de dessin" selectable
uid=4_50 listitem level="1"
uid=1_55 tab "Outils de mur" selectable
uid=4_51 listitem level="1"
uid=1_57 tab "Outils de lumière" selectable
uid=4_52 listitem level="1"
uid=1_59 tab "Outils de son dambiance" selectable
uid=4_53 listitem level="1"
uid=1_61 tab "Outils de région" selectable
uid=4_54 listitem level="1"
uid=1_63 tab "Notes" selectable
uid=4_55 list
uid=4_56 listitem level="1"
uid=1_66 button "Sélection de tokens" pressed
uid=4_57 listitem level="1"
uid=1_68 button "Sélection de cibles"
uid=4_58 listitem level="1"
uid=1_70 button "Règle"
uid=4_59 listitem level="1"
uid=1_72 button "Déplacement sans contrainte"
uid=4_60 generic
uid=11_0 ignored
uid=11_1 ignored
uid=11_2 generic
uid=11_3 list
uid=11_4 listitem level="1"
uid=11_5 ignored
uid=11_6 StaticText "Gamemaster [MJ]"
uid=1_81 InlineTextBox "Gamemaster [MJ]"
uid=11_7 generic
uid=11_8 generic
uid=11_9 LabelText
uid=11_10 StaticText "Latence"
uid=1_81 InlineTextBox "Latence"
uid=11_11 StaticText " "
uid=1_81 InlineTextBox " "
uid=14_0 StaticText "1ms"
uid=1_81 InlineTextBox "1ms"
uid=11_13 generic
uid=11_14 LabelText
uid=11_15 StaticText "IPS"
uid=1_81 InlineTextBox "IPS"
uid=11_16 StaticText " "
uid=1_81 InlineTextBox " "
uid=15_0 StaticText "31"
uid=1_81 InlineTextBox "31"
uid=11_18 button
uid=4_73 generic
uid=1_95 navigation
uid=4_74 generic "Développer la navigation"
uid=4_75 ignored
uid=4_76 list
uid=4_77 listitem level="1"
uid=4_78 ignored
uid=1_101 StaticText "Scène"
uid=1_81 InlineTextBox "Scène"
uid=4_79 list
uid=4_80 listitem "Gamemaster" level="2"
uid=1_104 StaticText "G"
uid=1_81 InlineTextBox "G"
uid=4_81 ignored
uid=1_81 generic
uid=1_81 StaticText ""
uid=1_81 InlineTextBox ""
uid=4_82 list
uid=4_83 ignored
uid=4_84 ignored
uid=4_85 generic
uid=4_86 sectionheader
uid=4_87 generic
uid=4_88 generic
uid=4_89 LabelText
uid=4_90 LabelText
uid=4_91 sectionfooter
uid=1_116 generic roledescription="Barre de raccourcis"
uid=4_92 generic
uid=1_118 button "Couper le son"
uid=1_119 button "Menu principal"
uid=4_93 list
uid=1_121 button "Emplacement vide"
uid=4_94 ignored
uid=4_95 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_124 button "Emplacement vide"
uid=4_96 ignored
uid=4_97 StaticText "2"
uid=1_81 InlineTextBox "2"
uid=1_127 button "Emplacement vide"
uid=4_98 ignored
uid=4_99 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=1_130 button "Emplacement vide"
uid=4_100 ignored
uid=4_101 StaticText "4"
uid=1_81 InlineTextBox "4"
uid=1_133 button "Emplacement vide"
uid=4_102 ignored
uid=4_103 StaticText "5"
uid=1_81 InlineTextBox "5"
uid=1_136 button "Emplacement vide"
uid=4_104 ignored
uid=4_105 StaticText "6"
uid=1_81 InlineTextBox "6"
uid=1_139 button "Emplacement vide"
uid=4_106 ignored
uid=4_107 StaticText "7"
uid=1_81 InlineTextBox "7"
uid=1_142 button "Emplacement vide"
uid=4_108 ignored
uid=4_109 StaticText "8"
uid=1_81 InlineTextBox "8"
uid=1_145 button "Emplacement vide"
uid=4_110 ignored
uid=4_111 StaticText "9"
uid=1_81 InlineTextBox "9"
uid=1_148 button "Emplacement vide"
uid=4_112 ignored
uid=4_113 StaticText "0"
uid=1_81 InlineTextBox "0"
uid=4_114 generic
uid=1_152 navigation
uid=1_153 button "Page suivante"
uid=4_115 ignored
uid=1_155 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_156 button "Page précédente"
uid=4_116 ignored
uid=1_158 button "Verrouiller la barre de raccourcis"
uid=1_159 button "Effacer la barre de raccourcis"
uid=4_117 generic
uid=4_118 generic
uid=4_119 generic
uid=4_120 ignored
uid=4_121 list
uid=4_122 generic "Tchat"
uid=4_123 generic
uid=1_167 generic value="
"
uid=1_168 paragraph
uid=1_169 LineBreak "
"
uid=1_81 InlineTextBox "
"
uid=4_124 ignored
uid=1_81 generic
uid=1_81 StaticText "Entrer un message"
uid=1_81 InlineTextBox "Entrer un message"
uid=4_125 generic
uid=4_126 generic
uid=1_173 button "Public en tant qu'utilisateur" pressed
uid=1_174 button "Privé pour les maîtres de jeu"
uid=1_175 button "Aveugle pour les maîtres de jeu"
uid=1_176 button "Seulement pour soi-même"
uid=1_177 button "Public en tant que personnage"
uid=4_127 generic
uid=4_128 tablist orientation="horizontal"
uid=4_129 list
uid=4_130 listitem level="1"
uid=1_182 tab "Messages du tchat" selectable
uid=4_131 listitem level="1"
uid=1_184 tab "Rencontres de combat" selectable
uid=4_132 listitem level="1"
uid=1_186 tab "Scènes" selectable
uid=4_133 listitem level="1"
uid=1_188 tab "Objets plaçables" selectable
uid=4_134 listitem level="1"
uid=1_190 tab "Acteurs" selectable
uid=4_135 listitem level="1"
uid=1_192 tab "Objets" selectable
uid=4_136 listitem level="1"
uid=1_194 tab "Journaux" selectable
uid=4_137 listitem level="1"
uid=1_196 tab "Tables aléatoires" selectable
uid=4_138 listitem level="1"
uid=1_198 tab "Jeux de cartes" selectable
uid=4_139 listitem level="1"
uid=1_200 tab "Macros" selectable
uid=4_140 listitem level="1"
uid=1_202 tab "Playlists" selectable
uid=4_141 listitem level="1"
uid=1_204 tab "Compendiums" selectable
uid=4_142 listitem level="1"
uid=1_206 tab "Dice So Nice" selectable
uid=4_143 listitem level="1"
uid=1_208 tab "Paramètres" selectable
uid=4_144 listitem level="1"
uid=1_210 button "Réduire"
uid=4_145 generic
uid=4_175 ignored
uid=4_176 ignored
uid=1_258 ignored
uid=1_259 ignored
uid=4_177 ignored
uid=4_178 ignored
uid=1_262 ignored
uid=4_299 ignored
uid=4_300 ignored
uid=1_447 ignored
uid=1_448 ignored
uid=4_301 ignored
uid=4_302 ignored
uid=1_451 ignored
uid=4_366 ignored
uid=4_367 ignored
uid=1_555 ignored
uid=1_556 ignored
uid=4_368 ignored
uid=4_369 ignored
uid=1_559 ignored
uid=4_444 ignored
uid=4_445 ignored
uid=1_674 ignored
uid=1_675 ignored
uid=4_446 ignored
uid=4_447 ignored
uid=1_678 ignored
uid=4_454 ignored
uid=4_455 ignored
uid=4_456 ignored
uid=4_457 ignored
uid=4_458 ignored
uid=4_459 ignored
uid=4_460 ignored
uid=4_461 ignored
uid=4_462 ignored
uid=4_463 ignored
uid=4_464 ignored
uid=4_465 ignored
uid=4_466 ignored
uid=4_467 ignored
uid=4_468 ignored
uid=4_469 ignored
uid=4_470 ignored
uid=4_471 ignored
uid=4_472 ignored
uid=4_473 ignored
uid=4_474 ignored
uid=4_475 ignored
uid=4_476 ignored
uid=4_477 ignored
uid=4_478 ignored
uid=4_479 ignored
uid=4_480 ignored
uid=4_481 ignored
uid=4_482 ignored
uid=4_483 ignored
uid=4_484 ignored
uid=4_485 ignored
uid=4_486 ignored
uid=4_487 ignored
uid=4_488 ignored
uid=4_489 ignored
uid=4_490 ignored
uid=9_1 generic
uid=9_2 generic
uid=9_3 heading "Foundry Virtual Tabletop" level="1"
uid=9_4 StaticText "Foundry Virtual Tabletop"
uid=1_81 InlineTextBox "Foundry Virtual Tabletop"
uid=9_5 paragraph
uid=9_6 StaticText "Version 14 Stable"
uid=1_81 InlineTextBox "Version 14 Stable"
uid=9_7 ignored
uid=9_8 ignored
uid=9_9 StaticText "Version"
uid=1_81 InlineTextBox "Version"
uid=9_10 ignored
uid=9_11 StaticText "363"
uid=1_81 InlineTextBox "363"
uid=9_12 ignored
uid=9_13 ignored
uid=9_14 StaticText "Donjon & Cie"
uid=1_81 InlineTextBox "Donjon & Cie"
uid=9_15 ignored
uid=9_16 StaticText "14.0.0"
uid=1_81 InlineTextBox "14.0.0"
uid=9_17 ignored
uid=9_18 ignored
uid=9_19 StaticText "Modules actifs"
uid=1_81 InlineTextBox "Modules actifs"
uid=9_20 ignored
uid=9_21 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=9_22 generic
uid=9_23 heading "Paramètres et configuration" level="4"
uid=9_24 StaticText "Paramètres et configuration"
uid=1_81 InlineTextBox "Paramètres et configuration"
uid=9_25 button "Paramètres de la partie"
uid=9_26 ignored
uid=9_27 StaticText "Paramètres de la partie"
uid=1_81 InlineTextBox "Paramètres de la partie"
uid=9_28 button "Configuration des contrôles"
uid=9_29 ignored
uid=9_30 StaticText "Configuration des contrôles"
uid=1_81 InlineTextBox "Configuration des contrôles"
uid=9_31 button "Gestion des modules"
uid=9_32 ignored
uid=9_33 StaticText "Gestion des modules"
uid=1_81 InlineTextBox "Gestion des modules"
uid=9_34 button "Configuration du monde"
uid=9_35 ignored
uid=9_36 StaticText "Configuration du monde"
uid=1_81 InlineTextBox "Configuration du monde"
uid=9_37 button "Gestion des utilisateurs"
uid=9_38 ignored
uid=9_39 StaticText "Gestion des utilisateurs"
uid=1_81 InlineTextBox "Gestion des utilisateurs"
uid=9_40 button "Gestion des présentations"
uid=9_41 ignored
uid=9_42 StaticText "Gestion des présentations"
uid=1_81 InlineTextBox "Gestion des présentations"
uid=9_43 generic
uid=9_44 heading "Aide et documentation" level="4"
uid=9_45 StaticText "Aide et documentation"
uid=1_81 InlineTextBox "Aide et documentation"
uid=9_46 button "Support & problèmes (1)"
uid=9_47 ignored
uid=9_48 StaticText "Support & problèmes (1)"
uid=1_81 InlineTextBox "Support & problèmes (1)"
uid=9_49 link "Documentation" url="https://foundryvtt.com/kb/"
uid=9_50 ignored
uid=9_51 StaticText "Documentation"
uid=1_81 InlineTextBox "Documentation"
uid=9_52 link "Wiki de la communauté" url="https://foundryvtt.wiki/"
uid=9_53 ignored
uid=9_54 StaticText "Wiki de la communauté"
uid=1_81 InlineTextBox "Wiki de la communauté"
uid=9_55 generic
uid=9_56 heading "Accès à la partie" level="4"
uid=9_57 StaticText "Accès à la partie"
uid=1_81 InlineTextBox "Accès à la partie"
uid=9_58 button "Liens dinvitation"
uid=9_59 ignored
uid=9_60 StaticText "Liens dinvitation"
uid=1_81 InlineTextBox "Liens dinvitation"
uid=9_61 button "Déconnexion"
uid=9_62 ignored
uid=9_63 StaticText "Déconnexion"
uid=1_81 InlineTextBox "Déconnexion"
uid=9_64 button "Retour à laccueil"
uid=9_65 ignored
uid=9_66 StaticText "Retour à laccueil"
uid=1_81 InlineTextBox "Retour à laccueil"
uid=4_491 generic
uid=4_492 generic
uid=4_493 generic
uid=4_494 Canvas
uid=4_498 generic
uid=4_499 ignored
uid=4_549 generic
uid=4_550 generic
uid=4_551 generic
uid=4_552 ignored
uid=2_99 button "Fermer"
uid=4_553 StaticText "×"
uid=1_81 InlineTextBox "×"
uid=4_554 list "Tableau du Réalisateur"
uid=2_102 listitem "Gamemaster" level="1"
uid=4_555 generic
uid=2_104 image "Avatar of Gamemaster" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=4_556 paragraph
uid=2_106 StaticText "Gamemaster"
uid=1_81 InlineTextBox "Gamemaster"
uid=2_107 button "Hide Gamemaster"
uid=4_557 ignored
uid=2_109 listitem "Player2" level="1"
uid=4_558 generic
uid=2_111 image "Avatar of Player2" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=2_112 status "Reaction Cam: Enabled" atomic description="Reaction Cam: Enabled" live="polite" relevant="additions text"
uid=4_559 ignored
uid=4_560 paragraph
uid=2_115 StaticText "Player2"
uid=1_81 InlineTextBox "Player2"
uid=2_116 button "Hide Player2"
uid=4_561 ignored
uid=2_118 listitem "Player3" level="1"
uid=4_562 generic
uid=2_120 image "Avatar of Player3" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=4_563 paragraph
uid=2_122 StaticText "Player3"
uid=1_81 InlineTextBox "Player3"
uid=2_123 button "Hide Player3"
uid=4_564 ignored
uid=8_18 ignored
uid=8_19 ignored
uid=8_20 ignored
uid=8_22 ignored
uid=8_23 ignored
uid=8_24 ignored
uid=8_25 ignored
uid=8_26 ignored
uid=8_27 ignored
uid=8_29 ignored
uid=8_30 ignored
uid=8_31 ignored
uid=8_32 ignored
uid=8_33 ignored
uid=4_579 ignored
uid=2_140 button "Tout afficher"
uid=4_580 ignored
uid=4_581 StaticText "Tout afficher"
uid=1_81 InlineTextBox "Tout afficher"
uid=2_143 button "Tout masquer"
uid=4_582 ignored
uid=4_583 StaticText "Tout masquer"
uid=1_81 InlineTextBox "Tout masquer"
uid=2_146 button "Ouvrir la référence des raccourcis"
uid=4_584 StaticText "?"
uid=1_81 InlineTextBox "?"
uid=4_585 toolbar "Disposition de la vue" orientation="horizontal"
uid=4_586 ignored
uid=2_150 StaticText "DISPOSITION DE LA VUE"
uid=1_81 InlineTextBox "DISPOSITION DE LA VUE"
uid=4_587 ignored
uid=2_152 button "S"
uid=4_588 ignored
uid=4_589 ignored
uid=4_590 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_156 button "L"
uid=4_591 ignored
uid=4_592 ignored
uid=4_593 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=2_160 button "S"
uid=4_594 ignored
uid=4_595 ignored
uid=4_596 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_164 button "L"
uid=4_597 ignored
uid=4_598 ignored
uid=4_599 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=2_168 button "S"
uid=4_600 ignored
uid=4_601 ignored
uid=4_602 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=2_172 button "L"
uid=4_603 ignored
uid=4_604 ignored
uid=4_605 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=4_606 toolbar "Largeurs des widgets vidéo" orientation="horizontal"
uid=2_177 StaticText "Largeurs des widgets vidéo"
uid=1_81 InlineTextBox "Largeurs des widgets vidéo"
uid=4_607 ignored
uid=4_608 generic
uid=2_180 StaticText "Petite :"
uid=1_81 InlineTextBox "Petite :"
uid=2_181 combobox expandable haspopup="menu" value="100px"
uid=4_609 MenuListPopup
uid=2_183 option "60px" selectable value="60px"
uid=2_184 option "80px" selectable value="80px"
uid=2_185 option "100px" selectable selected value="100px"
uid=2_186 option "120px" selectable value="120px"
uid=2_187 option "150px" selectable value="150px"
uid=2_188 option "200px" selectable value="200px"
uid=4_610 generic
uid=2_190 StaticText "Grande :"
uid=1_81 InlineTextBox "Grande :"
uid=2_191 combobox expandable haspopup="menu" value="150px"
uid=4_611 MenuListPopup
uid=2_193 option "60px" selectable value="60px"
uid=2_194 option "80px" selectable value="80px"
uid=2_195 option "100px" selectable value="100px"
uid=2_196 option "120px" selectable value="120px"
uid=2_197 option "150px" selectable selected value="150px"
uid=2_198 option "200px" selectable value="200px"
uid=4_612 sectionfooter
uid=4_613 ignored
uid=2_201 button "Sauvegarder la disposition"
uid=4_614 ignored
uid=4_615 StaticText "Sauvegarder la disposition"
uid=1_81 InlineTextBox "Sauvegarder la disposition"
uid=2_204 button "Charger la disposition" disableable disabled
uid=4_616 ignored
uid=4_617 StaticText "Charger la disposition"
uid=1_81 InlineTextBox "Charger la disposition"
uid=2_207 button "Exporter"
uid=4_618 ignored
uid=4_619 StaticText "Exporter"
uid=1_81 InlineTextBox "Exporter"
uid=2_210 button "Importer"
uid=4_620 ignored
uid=4_621 StaticText "Importer"
uid=1_81 InlineTextBox "Importer"
uid=4_622 ignored
uid=2_214 button "Application auto..."
uid=4_623 ignored
uid=4_624 StaticText "Application auto..."
uid=1_81 InlineTextBox "Application auto..."
uid=2_217 button "Désactiver A/V"
uid=4_625 ignored
uid=4_626 StaticText "Désactiver A/V"
uid=1_81 InlineTextBox "Désactiver A/V"
uid=2_220 button "Paramètres A/V..."
uid=4_627 ignored
uid=4_628 StaticText "Paramètres A/V..."
uid=1_81 InlineTextBox "Paramètres A/V..."
uid=4_629 generic
uid=11_19 generic
uid=11_20 ignored
uid=11_21 ignored
uid=11_22 heading "VOIR LES PARAMÈTRES DE CONFIDENTIALITÉ DU JOUEUR" level="2"
uid=11_23 StaticText "VOIR LES PARAMÈTRES DE CONFIDENTIALITÉ DU JOUEUR"
uid=1_81 InlineTextBox "VOIR LES PARAMÈTRES DE CONFIDENTIALITÉ DU JOUEUR"
uid=11_24 button "Close"
uid=11_25 generic
uid=11_26 paragraph
uid=11_27 StaticText "Sélectionnez un joueur pour voir ses préférences de consentement d'automatisation (lecture seule)"
uid=1_81 InlineTextBox "Sélectionnez un joueur pour voir ses préférences de consentement d'automatisation "
uid=1_81 InlineTextBox "(lecture seule)"
uid=11_28 ignored
uid=11_29 generic
uid=11_30 ignored
uid=11_31 StaticText "Gamemaster"
uid=1_81 InlineTextBox "Gamemaster"
uid=11_32 ignored
uid=11_33 StaticText "GM"
uid=1_81 InlineTextBox "GM"
uid=11_34 generic
uid=11_35 ignored
uid=11_36 StaticText "Player2"
uid=1_81 InlineTextBox "Player2"
uid=11_37 ignored
uid=11_38 StaticText "PLAYER"
uid=1_81 InlineTextBox "PLAYER"
uid=11_39 generic
uid=11_40 ignored
uid=11_41 StaticText "Player3"
uid=1_81 InlineTextBox "Player3"
uid=11_42 ignored
uid=11_43 StaticText "PLAYER"
uid=1_81 InlineTextBox "PLAYER"
uid=4_647 ignored
uid=11_44 ignored
uid=12_2 generic
uid=12_3 banner
uid=12_4 heading "Player Privacy Panel" level="1"
uid=12_5 StaticText "Player Privacy Panel"
uid=1_81 InlineTextBox "Player Privacy Panel"
uid=12_6 button "Basculer les contrôles"
uid=12_7 button "Fermer la fenêtre"
uid=12_8 generic
uid=12_9 ignored
uid=12_10 ignored
uid=12_11 generic
uid=12_12 heading "CONSENTEMENTS D'AUTOMATISATION" level="3"
uid=12_13 StaticText "CONSENTEMENTS D'AUTOMATISATION"
uid=1_81 InlineTextBox "CONSENTEMENTS D'AUTOMATISATION"
uid=12_14 paragraph
uid=12_15 StaticText "Contrôlez quelles fonctionnalités d'automatisation peuvent affecter votre caméra et votre présence à l'écran."
uid=1_81 InlineTextBox "Contrôlez quelles fonctionnalités d'automatisation peuvent affecter votre "
uid=1_81 InlineTextBox "caméra et votre présence à l'écran."
uid=12_16 ignored
uid=12_17 ignored
uid=12_18 ignored
uid=12_19 heading "Caméra de réaction" level="4"
uid=12_20 StaticText "Caméra de réaction"
uid=1_81 InlineTextBox "Caméra de réaction"
uid=12_21 ignored
uid=12_22 LabelText
uid=12_23 checkbox "Caméra de réaction"
uid=12_24 ignored
uid=12_25 ignored
uid=12_26 StaticText "DÉSACTIVÉ"
uid=1_81 InlineTextBox "DÉSACTIVÉ"
uid=12_27 paragraph
uid=12_28 StaticText "Affiche automatiquement votre caméra pendant les moments clés (combats, jets de dés, etc.)"
uid=1_81 InlineTextBox "Affiche automatiquement votre caméra pendant les moments clés "
uid=1_81 InlineTextBox "(combats, jets de dés, etc.)"
uid=12_29 generic
uid=12_30 heading "PORTRAIT DE SECOURS" level="3"
uid=12_31 StaticText "PORTRAIT DE SECOURS"
uid=1_81 InlineTextBox "PORTRAIT DE SECOURS"
uid=12_32 paragraph
uid=12_33 StaticText "Image à afficher lorsque votre caméra n'est pas disponible ou ne fonctionne pas."
uid=1_81 InlineTextBox "Image à afficher lorsque votre caméra n'est pas disponible ou ne "
uid=1_81 InlineTextBox "fonctionne pas."
uid=12_34 ignored
uid=12_35 ignored
uid=12_36 image "Portrait preview" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=12_37 ignored
uid=12_38 button "Choisir une image"
uid=12_39 ignored
uid=12_40 StaticText "Choisir une image"
uid=1_81 InlineTextBox "Choisir une image"
uid=15_1 generic
uid=15_2 generic
uid=15_3 generic
uid=15_4 generic
uid=15_5 generic description="Drag to move"
uid=15_6 generic
uid=15_7 button
uid=15_8 generic
uid=15_9 ignored
uid=15_10 heading "Paramètres Scrying Pool" level="2"
uid=15_11 StaticText "Paramètres Scrying Pool"
uid=1_81 InlineTextBox "Paramètres Scrying Pool"
uid=15_12 paragraph
uid=15_13 StaticText "Configurer le comportement du module Scrying Pool"
uid=1_81 InlineTextBox "Configurer le comportement du module Scrying Pool"
uid=15_14 ignored
uid=15_15 ignored
uid=15_16 LabelText
uid=15_17 StaticText "État de la barre"
uid=1_81 InlineTextBox "État de la barre"
uid=15_18 button "Ouvrir la barre"
uid=15_19 generic
uid=15_20 StaticText "Ouvrir la barre"
uid=1_81 InlineTextBox "Ouvrir la barre"
uid=15_21 generic
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+590
View File
@@ -0,0 +1,590 @@
uid=1_0 RootWebArea "Foundry Virtual Tabletop" url="https://localhost:31000/game"
uid=4_0 ignored
uid=4_1 generic
uid=4_2 list
uid=4_3 ignored
uid=4_4 ignored
uid=4_5 ignored
uid=4_6 ignored
uid=4_7 ignored
uid=4_8 ignored
uid=4_9 ignored
uid=4_10 ignored
uid=4_11 ignored
uid=4_12 ignored
uid=4_13 ignored
uid=4_14 ignored
uid=4_15 ignored
uid=4_16 ignored
uid=4_17 ignored
uid=4_18 ignored
uid=4_19 ignored
uid=4_20 ignored
uid=4_21 ignored
uid=4_22 ignored
uid=4_23 ignored
uid=4_24 ignored
uid=4_25 ignored
uid=4_26 ignored
uid=4_27 ignored
uid=4_28 ignored
uid=4_29 ignored
uid=4_30 ignored
uid=4_31 ignored
uid=4_32 ignored
uid=4_33 ignored
uid=4_34 ignored
uid=4_35 ignored
uid=4_36 ignored
uid=4_37 ignored
uid=4_38 ignored
uid=4_39 ignored
uid=4_40 ignored
uid=4_41 ignored
uid=4_42 generic
uid=4_43 generic
uid=4_44 generic
uid=4_45 generic
uid=4_46 list
uid=4_47 listitem level="1"
uid=1_49 tab "Outils de token" selectable
uid=4_48 listitem level="1"
uid=1_51 tab "Outils de tuile" selectable
uid=4_49 listitem level="1"
uid=1_53 tab "Outils de dessin" selectable
uid=4_50 listitem level="1"
uid=1_55 tab "Outils de mur" selectable
uid=4_51 listitem level="1"
uid=1_57 tab "Outils de lumière" selectable
uid=4_52 listitem level="1"
uid=1_59 tab "Outils de son dambiance" selectable
uid=4_53 listitem level="1"
uid=1_61 tab "Outils de région" selectable
uid=4_54 listitem level="1"
uid=1_63 tab "Notes" selectable
uid=4_55 list
uid=4_56 listitem level="1"
uid=1_66 button "Sélection de tokens" pressed
uid=4_57 listitem level="1"
uid=1_68 button "Sélection de cibles"
uid=4_58 listitem level="1"
uid=1_70 button "Règle"
uid=4_59 listitem level="1"
uid=1_72 button "Déplacement sans contrainte"
uid=4_60 generic
uid=19_0 ignored
uid=19_1 ignored
uid=19_2 generic
uid=19_3 list
uid=19_4 listitem level="1"
uid=19_5 ignored
uid=19_6 StaticText "Gamemaster [MJ]"
uid=1_81 InlineTextBox "Gamemaster [MJ]"
uid=19_7 generic
uid=19_8 generic
uid=19_9 LabelText
uid=19_10 StaticText "Latence"
uid=1_81 InlineTextBox "Latence"
uid=19_11 StaticText " "
uid=1_81 InlineTextBox " "
uid=19_12 StaticText "1ms"
uid=1_81 InlineTextBox "1ms"
uid=19_13 generic
uid=19_14 LabelText
uid=19_15 StaticText "IPS"
uid=1_81 InlineTextBox "IPS"
uid=19_16 StaticText " "
uid=1_81 InlineTextBox " "
uid=19_17 StaticText "30"
uid=1_81 InlineTextBox "30"
uid=19_18 button
uid=4_73 generic
uid=1_95 navigation
uid=4_74 generic "Développer la navigation"
uid=4_75 ignored
uid=4_76 list
uid=4_77 listitem level="1"
uid=4_78 ignored
uid=1_101 StaticText "Scène"
uid=1_81 InlineTextBox "Scène"
uid=4_79 list
uid=4_80 listitem "Gamemaster" level="2"
uid=1_104 StaticText "G"
uid=1_81 InlineTextBox "G"
uid=4_81 ignored
uid=1_81 generic
uid=1_81 StaticText ""
uid=1_81 InlineTextBox ""
uid=4_82 list
uid=4_83 ignored
uid=4_84 ignored
uid=4_85 generic
uid=4_86 sectionheader
uid=4_87 generic
uid=4_88 generic
uid=4_89 LabelText
uid=4_90 LabelText
uid=4_91 sectionfooter
uid=1_116 generic roledescription="Barre de raccourcis"
uid=4_92 generic
uid=1_118 button "Couper le son"
uid=1_119 button "Menu principal"
uid=4_93 list
uid=1_121 button "Emplacement vide"
uid=4_94 ignored
uid=4_95 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_124 button "Emplacement vide"
uid=4_96 ignored
uid=4_97 StaticText "2"
uid=1_81 InlineTextBox "2"
uid=1_127 button "Emplacement vide"
uid=4_98 ignored
uid=4_99 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=1_130 button "Emplacement vide"
uid=4_100 ignored
uid=4_101 StaticText "4"
uid=1_81 InlineTextBox "4"
uid=1_133 button "Emplacement vide"
uid=4_102 ignored
uid=4_103 StaticText "5"
uid=1_81 InlineTextBox "5"
uid=1_136 button "Emplacement vide"
uid=4_104 ignored
uid=4_105 StaticText "6"
uid=1_81 InlineTextBox "6"
uid=1_139 button "Emplacement vide"
uid=4_106 ignored
uid=4_107 StaticText "7"
uid=1_81 InlineTextBox "7"
uid=1_142 button "Emplacement vide"
uid=4_108 ignored
uid=4_109 StaticText "8"
uid=1_81 InlineTextBox "8"
uid=1_145 button "Emplacement vide"
uid=4_110 ignored
uid=4_111 StaticText "9"
uid=1_81 InlineTextBox "9"
uid=1_148 button "Emplacement vide"
uid=4_112 ignored
uid=4_113 StaticText "0"
uid=1_81 InlineTextBox "0"
uid=4_114 generic
uid=1_152 navigation
uid=1_153 button "Page suivante"
uid=4_115 ignored
uid=1_155 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_156 button "Page précédente"
uid=4_116 ignored
uid=1_158 button "Verrouiller la barre de raccourcis"
uid=1_159 button "Effacer la barre de raccourcis"
uid=4_117 generic
uid=4_118 generic
uid=4_119 generic
uid=4_120 ignored
uid=4_121 list
uid=4_122 generic "Tchat"
uid=4_123 generic
uid=1_167 generic value="
"
uid=1_168 paragraph
uid=1_169 LineBreak "
"
uid=1_81 InlineTextBox "
"
uid=4_124 ignored
uid=1_81 generic
uid=1_81 StaticText "Entrer un message"
uid=1_81 InlineTextBox "Entrer un message"
uid=4_125 generic
uid=4_126 generic
uid=1_173 button "Public en tant qu'utilisateur" pressed
uid=1_174 button "Privé pour les maîtres de jeu"
uid=1_175 button "Aveugle pour les maîtres de jeu"
uid=1_176 button "Seulement pour soi-même"
uid=1_177 button "Public en tant que personnage"
uid=4_127 generic
uid=4_128 tablist orientation="horizontal"
uid=4_129 list
uid=4_130 listitem level="1"
uid=1_182 tab "Messages du tchat" selectable
uid=4_131 listitem level="1"
uid=1_184 tab "Rencontres de combat" selectable
uid=4_132 listitem level="1"
uid=1_186 tab "Scènes" selectable
uid=4_133 listitem level="1"
uid=1_188 tab "Objets plaçables" selectable
uid=4_134 listitem level="1"
uid=1_190 tab "Acteurs" selectable
uid=4_135 listitem level="1"
uid=1_192 tab "Objets" selectable
uid=4_136 listitem level="1"
uid=1_194 tab "Journaux" selectable
uid=4_137 listitem level="1"
uid=1_196 tab "Tables aléatoires" selectable
uid=4_138 listitem level="1"
uid=1_198 tab "Jeux de cartes" selectable
uid=4_139 listitem level="1"
uid=1_200 tab "Macros" selectable
uid=4_140 listitem level="1"
uid=1_202 tab "Playlists" selectable
uid=4_141 listitem level="1"
uid=1_204 tab "Compendiums" selectable
uid=4_142 listitem level="1"
uid=1_206 tab "Dice So Nice" selectable
uid=4_143 listitem level="1"
uid=1_208 tab "Paramètres" selectable
uid=4_144 listitem level="1"
uid=1_210 button "Réduire"
uid=4_145 generic
uid=4_175 ignored
uid=4_176 ignored
uid=1_258 ignored
uid=1_259 ignored
uid=4_177 ignored
uid=4_178 ignored
uid=1_262 ignored
uid=4_299 ignored
uid=4_300 ignored
uid=1_447 ignored
uid=1_448 ignored
uid=4_301 ignored
uid=4_302 ignored
uid=1_451 ignored
uid=4_366 ignored
uid=4_367 ignored
uid=1_555 ignored
uid=1_556 ignored
uid=4_368 ignored
uid=4_369 ignored
uid=1_559 ignored
uid=4_444 ignored
uid=4_445 ignored
uid=1_674 ignored
uid=1_675 ignored
uid=4_446 ignored
uid=4_447 ignored
uid=1_678 ignored
uid=4_454 ignored
uid=4_455 ignored
uid=4_456 ignored
uid=4_457 ignored
uid=4_458 ignored
uid=4_459 ignored
uid=4_460 ignored
uid=4_461 ignored
uid=4_462 ignored
uid=4_463 ignored
uid=4_464 ignored
uid=4_465 ignored
uid=4_466 ignored
uid=4_467 ignored
uid=4_468 ignored
uid=4_469 ignored
uid=4_470 ignored
uid=4_471 ignored
uid=4_472 ignored
uid=4_473 ignored
uid=4_474 ignored
uid=4_475 ignored
uid=4_476 ignored
uid=4_477 ignored
uid=4_478 ignored
uid=4_479 ignored
uid=4_480 ignored
uid=4_481 ignored
uid=4_482 ignored
uid=4_483 ignored
uid=4_484 ignored
uid=4_485 ignored
uid=4_486 ignored
uid=4_487 ignored
uid=4_488 ignored
uid=4_489 ignored
uid=4_490 ignored
uid=9_1 generic
uid=9_2 generic
uid=9_3 heading "Foundry Virtual Tabletop" level="1"
uid=9_4 StaticText "Foundry Virtual Tabletop"
uid=1_81 InlineTextBox "Foundry Virtual Tabletop"
uid=9_5 paragraph
uid=9_6 StaticText "Version 14 Stable"
uid=1_81 InlineTextBox "Version 14 Stable"
uid=9_7 ignored
uid=9_8 ignored
uid=9_9 StaticText "Version"
uid=1_81 InlineTextBox "Version"
uid=9_10 ignored
uid=9_11 StaticText "363"
uid=1_81 InlineTextBox "363"
uid=9_12 ignored
uid=9_13 ignored
uid=9_14 StaticText "Donjon & Cie"
uid=1_81 InlineTextBox "Donjon & Cie"
uid=9_15 ignored
uid=9_16 StaticText "14.0.0"
uid=1_81 InlineTextBox "14.0.0"
uid=9_17 ignored
uid=9_18 ignored
uid=9_19 StaticText "Modules actifs"
uid=1_81 InlineTextBox "Modules actifs"
uid=9_20 ignored
uid=9_21 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=9_22 generic
uid=9_23 heading "Paramètres et configuration" level="4"
uid=9_24 StaticText "Paramètres et configuration"
uid=1_81 InlineTextBox "Paramètres et configuration"
uid=9_25 button "Paramètres de la partie"
uid=9_26 ignored
uid=9_27 StaticText "Paramètres de la partie"
uid=1_81 InlineTextBox "Paramètres de la partie"
uid=9_28 button "Configuration des contrôles"
uid=9_29 ignored
uid=9_30 StaticText "Configuration des contrôles"
uid=1_81 InlineTextBox "Configuration des contrôles"
uid=9_31 button "Gestion des modules"
uid=9_32 ignored
uid=9_33 StaticText "Gestion des modules"
uid=1_81 InlineTextBox "Gestion des modules"
uid=9_34 button "Configuration du monde"
uid=9_35 ignored
uid=9_36 StaticText "Configuration du monde"
uid=1_81 InlineTextBox "Configuration du monde"
uid=9_37 button "Gestion des utilisateurs"
uid=9_38 ignored
uid=9_39 StaticText "Gestion des utilisateurs"
uid=1_81 InlineTextBox "Gestion des utilisateurs"
uid=9_40 button "Gestion des présentations"
uid=9_41 ignored
uid=9_42 StaticText "Gestion des présentations"
uid=1_81 InlineTextBox "Gestion des présentations"
uid=9_43 generic
uid=9_44 heading "Aide et documentation" level="4"
uid=9_45 StaticText "Aide et documentation"
uid=1_81 InlineTextBox "Aide et documentation"
uid=9_46 button "Support & problèmes (1)"
uid=9_47 ignored
uid=9_48 StaticText "Support & problèmes (1)"
uid=1_81 InlineTextBox "Support & problèmes (1)"
uid=9_49 link "Documentation" url="https://foundryvtt.com/kb/"
uid=9_50 ignored
uid=9_51 StaticText "Documentation"
uid=1_81 InlineTextBox "Documentation"
uid=9_52 link "Wiki de la communauté" url="https://foundryvtt.wiki/"
uid=9_53 ignored
uid=9_54 StaticText "Wiki de la communauté"
uid=1_81 InlineTextBox "Wiki de la communauté"
uid=9_55 generic
uid=9_56 heading "Accès à la partie" level="4"
uid=9_57 StaticText "Accès à la partie"
uid=1_81 InlineTextBox "Accès à la partie"
uid=9_58 button "Liens dinvitation"
uid=9_59 ignored
uid=9_60 StaticText "Liens dinvitation"
uid=1_81 InlineTextBox "Liens dinvitation"
uid=9_61 button "Déconnexion"
uid=9_62 ignored
uid=9_63 StaticText "Déconnexion"
uid=1_81 InlineTextBox "Déconnexion"
uid=9_64 button "Retour à laccueil"
uid=9_65 ignored
uid=9_66 StaticText "Retour à laccueil"
uid=1_81 InlineTextBox "Retour à laccueil"
uid=4_491 generic
uid=4_492 generic
uid=4_493 generic
uid=4_494 Canvas
uid=4_498 generic
uid=4_499 ignored
uid=11_19 generic
uid=11_20 ignored
uid=11_21 ignored
uid=11_22 heading "VOIR LES PARAMÈTRES DE CONFIDENTIALITÉ DU JOUEUR" level="2"
uid=11_23 StaticText "VOIR LES PARAMÈTRES DE CONFIDENTIALITÉ DU JOUEUR"
uid=1_81 InlineTextBox "VOIR LES PARAMÈTRES DE CONFIDENTIALITÉ DU JOUEUR"
uid=11_24 button "Close"
uid=11_25 generic
uid=11_26 paragraph
uid=11_27 StaticText "Sélectionnez un joueur pour voir ses préférences de consentement d'automatisation (lecture seule)"
uid=1_81 InlineTextBox "Sélectionnez un joueur pour voir ses préférences de consentement d'automatisation "
uid=1_81 InlineTextBox "(lecture seule)"
uid=11_28 ignored
uid=11_29 generic
uid=11_30 ignored
uid=11_31 StaticText "Gamemaster"
uid=1_81 InlineTextBox "Gamemaster"
uid=11_32 ignored
uid=11_33 StaticText "GM"
uid=1_81 InlineTextBox "GM"
uid=11_34 generic
uid=11_35 ignored
uid=11_36 StaticText "Player2"
uid=1_81 InlineTextBox "Player2"
uid=11_37 ignored
uid=11_38 StaticText "PLAYER"
uid=1_81 InlineTextBox "PLAYER"
uid=11_39 generic
uid=11_40 ignored
uid=11_41 StaticText "Player3"
uid=1_81 InlineTextBox "Player3"
uid=11_42 ignored
uid=11_43 StaticText "PLAYER"
uid=1_81 InlineTextBox "PLAYER"
uid=4_647 ignored
uid=16_38 ignored
uid=19_19 generic
uid=19_20 generic
uid=19_21 generic
uid=19_22 ignored
uid=19_23 button "Fermer"
uid=19_24 StaticText "×"
uid=1_81 InlineTextBox "×"
uid=19_25 list "Tableau du Réalisateur"
uid=19_26 listitem "Gamemaster" level="1"
uid=19_27 generic
uid=19_28 image "Avatar of Gamemaster" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=19_29 paragraph
uid=19_30 StaticText "Gamemaster"
uid=1_81 InlineTextBox "Gamemaster"
uid=19_31 button "Hide Gamemaster"
uid=19_32 ignored
uid=19_33 listitem "Player2" level="1"
uid=19_34 generic
uid=19_35 image "Avatar of Player2" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=19_36 status "Reaction Cam: Enabled" atomic description="Reaction Cam: Enabled" live="polite" relevant="additions text"
uid=19_37 ignored
uid=19_38 paragraph
uid=19_39 StaticText "Player2"
uid=1_81 InlineTextBox "Player2"
uid=19_40 button "Hide Player2"
uid=19_41 ignored
uid=19_42 listitem "Player3" level="1"
uid=19_43 generic
uid=19_44 image "Avatar of Player3" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=19_45 paragraph
uid=19_46 StaticText "Player3"
uid=1_81 InlineTextBox "Player3"
uid=19_47 button "Hide Player3"
uid=19_48 ignored
uid=19_49 ignored
uid=19_50 ignored
uid=19_51 ignored
uid=19_52 ignored
uid=19_53 ignored
uid=19_54 ignored
uid=19_55 ignored
uid=19_56 ignored
uid=19_57 ignored
uid=19_58 ignored
uid=19_59 ignored
uid=19_60 ignored
uid=19_61 ignored
uid=19_62 ignored
uid=19_63 ignored
uid=19_64 button "Tout afficher"
uid=19_65 ignored
uid=19_66 StaticText "Tout afficher"
uid=1_81 InlineTextBox "Tout afficher"
uid=19_67 button "Tout masquer"
uid=19_68 ignored
uid=19_69 StaticText "Tout masquer"
uid=1_81 InlineTextBox "Tout masquer"
uid=19_70 button "Ouvrir la référence des raccourcis"
uid=19_71 StaticText "?"
uid=1_81 InlineTextBox "?"
uid=19_72 toolbar "Disposition de la vue" orientation="horizontal"
uid=19_73 ignored
uid=19_74 StaticText "DISPOSITION DE LA VUE"
uid=1_81 InlineTextBox "DISPOSITION DE LA VUE"
uid=19_75 ignored
uid=19_76 button "S"
uid=19_77 ignored
uid=19_78 ignored
uid=19_79 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=19_80 button "L"
uid=19_81 ignored
uid=19_82 ignored
uid=19_83 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=19_84 button "S"
uid=19_85 ignored
uid=19_86 ignored
uid=19_87 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=19_88 button "L"
uid=19_89 ignored
uid=19_90 ignored
uid=19_91 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=19_92 button "S"
uid=19_93 ignored
uid=19_94 ignored
uid=19_95 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=19_96 button "L"
uid=19_97 ignored
uid=19_98 ignored
uid=19_99 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=19_100 toolbar "Largeurs des widgets vidéo" orientation="horizontal"
uid=19_101 StaticText "Largeurs des widgets vidéo"
uid=1_81 InlineTextBox "Largeurs des widgets vidéo"
uid=19_102 ignored
uid=19_103 generic
uid=19_104 StaticText "Petite :"
uid=1_81 InlineTextBox "Petite :"
uid=19_105 combobox expandable haspopup="menu" value="100px"
uid=19_106 MenuListPopup
uid=19_107 option "60px" selectable value="60px"
uid=19_108 option "80px" selectable value="80px"
uid=19_109 option "100px" selectable selected value="100px"
uid=19_110 option "120px" selectable value="120px"
uid=19_111 option "150px" selectable value="150px"
uid=19_112 option "200px" selectable value="200px"
uid=19_113 generic
uid=19_114 StaticText "Grande :"
uid=1_81 InlineTextBox "Grande :"
uid=19_115 combobox expandable haspopup="menu" value="150px"
uid=19_116 MenuListPopup
uid=19_117 option "60px" selectable value="60px"
uid=19_118 option "80px" selectable value="80px"
uid=19_119 option "100px" selectable value="100px"
uid=19_120 option "120px" selectable value="120px"
uid=19_121 option "150px" selectable selected value="150px"
uid=19_122 option "200px" selectable value="200px"
uid=19_123 sectionfooter
uid=19_124 ignored
uid=19_125 button "Sauvegarder la disposition"
uid=19_126 ignored
uid=19_127 StaticText "Sauvegarder la disposition"
uid=1_81 InlineTextBox "Sauvegarder la disposition"
uid=19_128 button "Charger la disposition" disableable disabled
uid=19_129 ignored
uid=19_130 StaticText "Charger la disposition"
uid=1_81 InlineTextBox "Charger la disposition"
uid=19_131 button "Exporter"
uid=19_132 ignored
uid=19_133 StaticText "Exporter"
uid=1_81 InlineTextBox "Exporter"
uid=19_134 button "Importer"
uid=19_135 ignored
uid=19_136 StaticText "Importer"
uid=1_81 InlineTextBox "Importer"
uid=19_137 ignored
uid=19_138 button "Application auto..."
uid=19_139 ignored
uid=19_140 StaticText "Application auto..."
uid=1_81 InlineTextBox "Application auto..."
uid=19_141 button "Désactiver A/V"
uid=19_142 ignored
uid=19_143 StaticText "Désactiver A/V"
uid=1_81 InlineTextBox "Désactiver A/V"
uid=19_144 button "Paramètres A/V..."
uid=19_145 ignored
uid=19_146 StaticText "Paramètres A/V..."
uid=1_81 InlineTextBox "Paramètres A/V..."
uid=19_147 generic
+614
View File
@@ -0,0 +1,614 @@
uid=1_0 RootWebArea "Foundry Virtual Tabletop" url="https://localhost:31000/game"
uid=4_0 ignored
uid=4_1 generic
uid=4_2 list
uid=4_3 ignored
uid=4_4 ignored
uid=4_5 ignored
uid=4_6 ignored
uid=4_7 ignored
uid=4_8 ignored
uid=4_9 ignored
uid=4_10 ignored
uid=4_11 ignored
uid=4_12 ignored
uid=4_13 ignored
uid=4_14 ignored
uid=4_15 ignored
uid=4_16 ignored
uid=4_17 ignored
uid=4_18 ignored
uid=4_19 ignored
uid=4_20 ignored
uid=4_21 ignored
uid=4_22 ignored
uid=4_23 ignored
uid=4_24 ignored
uid=4_25 ignored
uid=4_26 ignored
uid=4_27 ignored
uid=4_28 ignored
uid=4_29 ignored
uid=4_30 ignored
uid=4_31 ignored
uid=4_32 ignored
uid=4_33 ignored
uid=4_34 ignored
uid=4_35 ignored
uid=4_36 ignored
uid=4_37 ignored
uid=4_38 ignored
uid=4_39 ignored
uid=4_40 ignored
uid=4_41 ignored
uid=4_42 generic
uid=4_43 generic
uid=4_44 generic
uid=4_45 generic
uid=4_46 list
uid=4_47 listitem level="1"
uid=1_49 tab "Outils de token" selectable
uid=4_48 listitem level="1"
uid=1_51 tab "Outils de tuile" selectable
uid=4_49 listitem level="1"
uid=1_53 tab "Outils de dessin" selectable
uid=4_50 listitem level="1"
uid=1_55 tab "Outils de mur" selectable
uid=4_51 listitem level="1"
uid=1_57 tab "Outils de lumière" selectable
uid=4_52 listitem level="1"
uid=1_59 tab "Outils de son dambiance" selectable
uid=4_53 listitem level="1"
uid=1_61 tab "Outils de région" selectable
uid=4_54 listitem level="1"
uid=1_63 tab "Notes" selectable
uid=4_55 list
uid=4_56 listitem level="1"
uid=1_66 button "Sélection de tokens" pressed
uid=4_57 listitem level="1"
uid=1_68 button "Sélection de cibles"
uid=4_58 listitem level="1"
uid=1_70 button "Règle"
uid=4_59 listitem level="1"
uid=1_72 button "Déplacement sans contrainte"
uid=4_60 generic
uid=20_0 ignored
uid=20_1 ignored
uid=20_2 generic
uid=20_3 list
uid=20_4 listitem level="1"
uid=20_5 ignored
uid=20_6 StaticText "Gamemaster [MJ]"
uid=1_81 InlineTextBox "Gamemaster [MJ]"
uid=20_7 generic
uid=20_8 generic
uid=20_9 LabelText
uid=20_10 StaticText "Latence"
uid=1_81 InlineTextBox "Latence"
uid=20_11 StaticText " "
uid=1_81 InlineTextBox " "
uid=20_12 StaticText "1ms"
uid=1_81 InlineTextBox "1ms"
uid=20_13 generic
uid=20_14 LabelText
uid=20_15 StaticText "IPS"
uid=1_81 InlineTextBox "IPS"
uid=20_16 StaticText " "
uid=1_81 InlineTextBox " "
uid=20_17 StaticText "30"
uid=1_81 InlineTextBox "30"
uid=20_18 button
uid=4_73 generic
uid=1_95 navigation
uid=4_74 generic "Développer la navigation"
uid=4_75 ignored
uid=4_76 list
uid=4_77 listitem level="1"
uid=4_78 ignored
uid=1_101 StaticText "Scène"
uid=1_81 InlineTextBox "Scène"
uid=4_79 list
uid=4_80 listitem "Gamemaster" level="2"
uid=1_104 StaticText "G"
uid=1_81 InlineTextBox "G"
uid=4_81 ignored
uid=1_81 generic
uid=1_81 StaticText ""
uid=1_81 InlineTextBox ""
uid=4_82 list
uid=4_83 ignored
uid=4_84 ignored
uid=4_85 generic
uid=4_86 sectionheader
uid=4_87 generic
uid=4_88 generic
uid=4_89 LabelText
uid=4_90 LabelText
uid=4_91 sectionfooter
uid=1_116 generic roledescription="Barre de raccourcis"
uid=4_92 generic
uid=1_118 button "Couper le son"
uid=1_119 button "Menu principal"
uid=4_93 list
uid=1_121 button "Emplacement vide"
uid=4_94 ignored
uid=4_95 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_124 button "Emplacement vide"
uid=4_96 ignored
uid=4_97 StaticText "2"
uid=1_81 InlineTextBox "2"
uid=1_127 button "Emplacement vide"
uid=4_98 ignored
uid=4_99 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=1_130 button "Emplacement vide"
uid=4_100 ignored
uid=4_101 StaticText "4"
uid=1_81 InlineTextBox "4"
uid=1_133 button "Emplacement vide"
uid=4_102 ignored
uid=4_103 StaticText "5"
uid=1_81 InlineTextBox "5"
uid=1_136 button "Emplacement vide"
uid=4_104 ignored
uid=4_105 StaticText "6"
uid=1_81 InlineTextBox "6"
uid=1_139 button "Emplacement vide"
uid=4_106 ignored
uid=4_107 StaticText "7"
uid=1_81 InlineTextBox "7"
uid=1_142 button "Emplacement vide"
uid=4_108 ignored
uid=4_109 StaticText "8"
uid=1_81 InlineTextBox "8"
uid=1_145 button "Emplacement vide"
uid=4_110 ignored
uid=4_111 StaticText "9"
uid=1_81 InlineTextBox "9"
uid=1_148 button "Emplacement vide"
uid=4_112 ignored
uid=4_113 StaticText "0"
uid=1_81 InlineTextBox "0"
uid=4_114 generic
uid=1_152 navigation
uid=1_153 button "Page suivante"
uid=4_115 ignored
uid=1_155 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_156 button "Page précédente"
uid=4_116 ignored
uid=1_158 button "Verrouiller la barre de raccourcis"
uid=1_159 button "Effacer la barre de raccourcis"
uid=4_117 generic
uid=4_118 generic
uid=4_119 generic
uid=4_120 ignored
uid=4_121 list
uid=4_122 generic "Tchat"
uid=4_123 generic
uid=1_167 generic value="
"
uid=1_168 paragraph
uid=1_169 LineBreak "
"
uid=1_81 InlineTextBox "
"
uid=4_124 ignored
uid=1_81 generic
uid=1_81 StaticText "Entrer un message"
uid=1_81 InlineTextBox "Entrer un message"
uid=4_125 generic
uid=4_126 generic
uid=1_173 button "Public en tant qu'utilisateur" pressed
uid=1_174 button "Privé pour les maîtres de jeu"
uid=1_175 button "Aveugle pour les maîtres de jeu"
uid=1_176 button "Seulement pour soi-même"
uid=1_177 button "Public en tant que personnage"
uid=4_127 generic
uid=4_128 tablist orientation="horizontal"
uid=4_129 list
uid=4_130 listitem level="1"
uid=1_182 tab "Messages du tchat" selectable
uid=4_131 listitem level="1"
uid=1_184 tab "Rencontres de combat" selectable
uid=4_132 listitem level="1"
uid=1_186 tab "Scènes" selectable
uid=4_133 listitem level="1"
uid=1_188 tab "Objets plaçables" selectable
uid=4_134 listitem level="1"
uid=1_190 tab "Acteurs" selectable
uid=4_135 listitem level="1"
uid=1_192 tab "Objets" selectable
uid=4_136 listitem level="1"
uid=1_194 tab "Journaux" selectable
uid=4_137 listitem level="1"
uid=1_196 tab "Tables aléatoires" selectable
uid=4_138 listitem level="1"
uid=1_198 tab "Jeux de cartes" selectable
uid=4_139 listitem level="1"
uid=1_200 tab "Macros" selectable
uid=4_140 listitem level="1"
uid=1_202 tab "Playlists" selectable
uid=4_141 listitem level="1"
uid=1_204 tab "Compendiums" selectable
uid=4_142 listitem level="1"
uid=1_206 tab "Dice So Nice" selectable
uid=4_143 listitem level="1"
uid=1_208 tab "Paramètres" selectable
uid=4_144 listitem level="1"
uid=1_210 button "Réduire"
uid=4_145 generic
uid=4_175 ignored
uid=4_176 ignored
uid=1_258 ignored
uid=1_259 ignored
uid=4_177 ignored
uid=4_178 ignored
uid=1_262 ignored
uid=4_299 ignored
uid=4_300 ignored
uid=1_447 ignored
uid=1_448 ignored
uid=4_301 ignored
uid=4_302 ignored
uid=1_451 ignored
uid=4_366 ignored
uid=4_367 ignored
uid=1_555 ignored
uid=1_556 ignored
uid=4_368 ignored
uid=4_369 ignored
uid=1_559 ignored
uid=4_444 ignored
uid=4_445 ignored
uid=1_674 ignored
uid=1_675 ignored
uid=4_446 ignored
uid=4_447 ignored
uid=1_678 ignored
uid=4_454 ignored
uid=4_455 ignored
uid=4_456 ignored
uid=4_457 ignored
uid=4_458 ignored
uid=4_459 ignored
uid=4_460 ignored
uid=4_461 ignored
uid=4_462 ignored
uid=4_463 ignored
uid=4_464 ignored
uid=4_465 ignored
uid=4_466 ignored
uid=4_467 ignored
uid=4_468 ignored
uid=4_469 ignored
uid=4_470 ignored
uid=4_471 ignored
uid=4_472 ignored
uid=4_473 ignored
uid=4_474 ignored
uid=4_475 ignored
uid=4_476 ignored
uid=4_477 ignored
uid=4_478 ignored
uid=4_479 ignored
uid=4_480 ignored
uid=4_481 ignored
uid=4_482 ignored
uid=4_483 ignored
uid=4_484 ignored
uid=4_485 ignored
uid=4_486 ignored
uid=4_487 ignored
uid=4_488 ignored
uid=4_489 ignored
uid=4_490 ignored
uid=9_1 generic
uid=9_2 generic
uid=9_3 heading "Foundry Virtual Tabletop" level="1"
uid=9_4 StaticText "Foundry Virtual Tabletop"
uid=1_81 InlineTextBox "Foundry Virtual Tabletop"
uid=9_5 paragraph
uid=9_6 StaticText "Version 14 Stable"
uid=1_81 InlineTextBox "Version 14 Stable"
uid=9_7 ignored
uid=9_8 ignored
uid=9_9 StaticText "Version"
uid=1_81 InlineTextBox "Version"
uid=9_10 ignored
uid=9_11 StaticText "363"
uid=1_81 InlineTextBox "363"
uid=9_12 ignored
uid=9_13 ignored
uid=9_14 StaticText "Donjon & Cie"
uid=1_81 InlineTextBox "Donjon & Cie"
uid=9_15 ignored
uid=9_16 StaticText "14.0.0"
uid=1_81 InlineTextBox "14.0.0"
uid=9_17 ignored
uid=9_18 ignored
uid=9_19 StaticText "Modules actifs"
uid=1_81 InlineTextBox "Modules actifs"
uid=9_20 ignored
uid=9_21 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=9_22 generic
uid=9_23 heading "Paramètres et configuration" level="4"
uid=9_24 StaticText "Paramètres et configuration"
uid=1_81 InlineTextBox "Paramètres et configuration"
uid=9_25 button "Paramètres de la partie"
uid=9_26 ignored
uid=9_27 StaticText "Paramètres de la partie"
uid=1_81 InlineTextBox "Paramètres de la partie"
uid=9_28 button "Configuration des contrôles"
uid=9_29 ignored
uid=9_30 StaticText "Configuration des contrôles"
uid=1_81 InlineTextBox "Configuration des contrôles"
uid=9_31 button "Gestion des modules"
uid=9_32 ignored
uid=9_33 StaticText "Gestion des modules"
uid=1_81 InlineTextBox "Gestion des modules"
uid=9_34 button "Configuration du monde"
uid=9_35 ignored
uid=9_36 StaticText "Configuration du monde"
uid=1_81 InlineTextBox "Configuration du monde"
uid=9_37 button "Gestion des utilisateurs"
uid=9_38 ignored
uid=9_39 StaticText "Gestion des utilisateurs"
uid=1_81 InlineTextBox "Gestion des utilisateurs"
uid=9_40 button "Gestion des présentations"
uid=9_41 ignored
uid=9_42 StaticText "Gestion des présentations"
uid=1_81 InlineTextBox "Gestion des présentations"
uid=9_43 generic
uid=9_44 heading "Aide et documentation" level="4"
uid=9_45 StaticText "Aide et documentation"
uid=1_81 InlineTextBox "Aide et documentation"
uid=9_46 button "Support & problèmes (1)"
uid=9_47 ignored
uid=9_48 StaticText "Support & problèmes (1)"
uid=1_81 InlineTextBox "Support & problèmes (1)"
uid=9_49 link "Documentation" url="https://foundryvtt.com/kb/"
uid=9_50 ignored
uid=9_51 StaticText "Documentation"
uid=1_81 InlineTextBox "Documentation"
uid=9_52 link "Wiki de la communauté" url="https://foundryvtt.wiki/"
uid=9_53 ignored
uid=9_54 StaticText "Wiki de la communauté"
uid=1_81 InlineTextBox "Wiki de la communauté"
uid=9_55 generic
uid=9_56 heading "Accès à la partie" level="4"
uid=9_57 StaticText "Accès à la partie"
uid=1_81 InlineTextBox "Accès à la partie"
uid=9_58 button "Liens dinvitation"
uid=9_59 ignored
uid=9_60 StaticText "Liens dinvitation"
uid=1_81 InlineTextBox "Liens dinvitation"
uid=9_61 button "Déconnexion"
uid=9_62 ignored
uid=9_63 StaticText "Déconnexion"
uid=1_81 InlineTextBox "Déconnexion"
uid=9_64 button "Retour à laccueil"
uid=9_65 ignored
uid=9_66 StaticText "Retour à laccueil"
uid=1_81 InlineTextBox "Retour à laccueil"
uid=4_491 generic
uid=4_492 generic
uid=4_493 generic
uid=4_494 Canvas
uid=4_498 generic
uid=4_499 ignored
uid=4_647 ignored
uid=16_38 ignored
uid=20_19 generic
uid=20_20 generic
uid=20_21 generic
uid=20_22 ignored
uid=20_23 button "Fermer"
uid=20_24 StaticText "×"
uid=1_81 InlineTextBox "×"
uid=20_25 list "Tableau du Réalisateur"
uid=20_26 listitem "Gamemaster" level="1"
uid=20_27 generic
uid=20_28 image "Avatar of Gamemaster" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=20_29 paragraph
uid=20_30 StaticText "Gamemaster"
uid=1_81 InlineTextBox "Gamemaster"
uid=20_31 button "Hide Gamemaster"
uid=20_32 ignored
uid=20_33 listitem "Player2" level="1"
uid=20_34 generic
uid=20_35 image "Avatar of Player2" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=20_36 status "Reaction Cam: Enabled" atomic description="Reaction Cam: Enabled" live="polite" relevant="additions text"
uid=20_37 ignored
uid=20_38 paragraph
uid=20_39 StaticText "Player2"
uid=1_81 InlineTextBox "Player2"
uid=20_40 button "Hide Player2"
uid=20_41 ignored
uid=20_42 listitem "Player3" level="1"
uid=20_43 generic
uid=20_44 image "Avatar of Player3" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=20_45 paragraph
uid=20_46 StaticText "Player3"
uid=1_81 InlineTextBox "Player3"
uid=20_47 button "Hide Player3"
uid=20_48 ignored
uid=20_49 ignored
uid=20_50 ignored
uid=20_51 ignored
uid=20_52 ignored
uid=20_53 ignored
uid=20_54 ignored
uid=20_55 ignored
uid=20_56 ignored
uid=20_57 ignored
uid=20_58 ignored
uid=20_59 ignored
uid=20_60 ignored
uid=20_61 ignored
uid=20_62 ignored
uid=20_63 ignored
uid=20_64 button "Tout afficher"
uid=20_65 ignored
uid=20_66 StaticText "Tout afficher"
uid=1_81 InlineTextBox "Tout afficher"
uid=20_67 button "Tout masquer"
uid=20_68 ignored
uid=20_69 StaticText "Tout masquer"
uid=1_81 InlineTextBox "Tout masquer"
uid=20_70 button "Ouvrir la référence des raccourcis"
uid=20_71 StaticText "?"
uid=1_81 InlineTextBox "?"
uid=20_72 toolbar "Disposition de la vue" orientation="horizontal"
uid=20_73 ignored
uid=20_74 StaticText "DISPOSITION DE LA VUE"
uid=1_81 InlineTextBox "DISPOSITION DE LA VUE"
uid=20_75 ignored
uid=20_76 button "S"
uid=20_77 ignored
uid=20_78 ignored
uid=20_79 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=20_80 button "L"
uid=20_81 ignored
uid=20_82 ignored
uid=20_83 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=20_84 button "S"
uid=20_85 ignored
uid=20_86 ignored
uid=20_87 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=20_88 button "L"
uid=20_89 ignored
uid=20_90 ignored
uid=20_91 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=20_92 button "S"
uid=20_93 ignored
uid=20_94 ignored
uid=20_95 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=20_96 button "L"
uid=20_97 ignored
uid=20_98 ignored
uid=20_99 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=20_100 toolbar "Largeurs des widgets vidéo" orientation="horizontal"
uid=20_101 StaticText "Largeurs des widgets vidéo"
uid=1_81 InlineTextBox "Largeurs des widgets vidéo"
uid=20_102 ignored
uid=20_103 generic
uid=20_104 StaticText "Petite :"
uid=1_81 InlineTextBox "Petite :"
uid=20_105 combobox expandable haspopup="menu" value="100px"
uid=20_106 MenuListPopup
uid=20_107 option "60px" selectable value="60px"
uid=20_108 option "80px" selectable value="80px"
uid=20_109 option "100px" selectable selected value="100px"
uid=20_110 option "120px" selectable value="120px"
uid=20_111 option "150px" selectable value="150px"
uid=20_112 option "200px" selectable value="200px"
uid=20_113 generic
uid=20_114 StaticText "Grande :"
uid=1_81 InlineTextBox "Grande :"
uid=20_115 combobox expandable haspopup="menu" value="150px"
uid=20_116 MenuListPopup
uid=20_117 option "60px" selectable value="60px"
uid=20_118 option "80px" selectable value="80px"
uid=20_119 option "100px" selectable value="100px"
uid=20_120 option "120px" selectable value="120px"
uid=20_121 option "150px" selectable selected value="150px"
uid=20_122 option "200px" selectable value="200px"
uid=20_123 sectionfooter
uid=20_124 ignored
uid=20_125 button "Sauvegarder la disposition"
uid=20_126 ignored
uid=20_127 StaticText "Sauvegarder la disposition"
uid=1_81 InlineTextBox "Sauvegarder la disposition"
uid=20_128 button "Charger la disposition" disableable disabled
uid=20_129 ignored
uid=20_130 StaticText "Charger la disposition"
uid=1_81 InlineTextBox "Charger la disposition"
uid=20_131 button "Exporter"
uid=20_132 ignored
uid=20_133 StaticText "Exporter"
uid=1_81 InlineTextBox "Exporter"
uid=20_134 button "Importer"
uid=20_135 ignored
uid=20_136 StaticText "Importer"
uid=1_81 InlineTextBox "Importer"
uid=20_137 ignored
uid=20_138 button "Application auto..."
uid=20_139 ignored
uid=20_140 StaticText "Application auto..."
uid=1_81 InlineTextBox "Application auto..."
uid=20_141 button "Désactiver A/V"
uid=20_142 ignored
uid=20_143 StaticText "Désactiver A/V"
uid=1_81 InlineTextBox "Désactiver A/V"
uid=20_144 button "Paramètres A/V..."
uid=20_145 ignored
uid=20_146 StaticText "Paramètres A/V..."
uid=1_81 InlineTextBox "Paramètres A/V..."
uid=20_147 generic
uid=20_148 generic
uid=20_149 generic
uid=20_150 complementary "Scrying Pool"
uid=20_151 ignored
uid=20_152 button "Close Scrying Pool"
uid=20_153 StaticText "×"
uid=1_81 InlineTextBox "×"
uid=20_154 ignored
uid=20_155 button "Expand Scrying Pool" expandable
uid=20_156 generic
uid=20_157 button "Open Director's Board"
uid=20_158 ignored
uid=20_159 ignored
uid=20_160 StaticText "Director's Board"
uid=1_81 InlineTextBox "Director's Board"
uid=20_161 list
uid=20_162 listitem level="1"
uid=20_163 button "Gamemaster — Active"
uid=20_164 ignored
uid=20_165 ignored
uid=20_166 ignored
uid=20_167 ignored
uid=20_168 ignored
uid=20_169 ignored
uid=20_170 ignored
uid=20_171 ignored
uid=20_172 ignored
uid=20_173 ignored
uid=20_174 ignored
uid=20_175 ignored
uid=20_176 ignored
uid=20_177 ignored
uid=20_178 ignored
uid=20_179 ignored
uid=20_180 ignored
uid=20_181 ignored
uid=20_182 ignored
uid=20_183 ignored
uid=20_184 ignored
uid=20_185 ignored
uid=20_186 ignored
uid=20_187 ignored
uid=20_188 ignored
uid=20_189 ignored
uid=20_190 ignored
uid=20_191 ignored
uid=20_192 ignored
uid=20_193 ignored
uid=20_194 ignored
uid=20_195 ignored
uid=20_196 ignored
uid=20_197 ignored
uid=20_198 ignored
uid=20_199 ignored
uid=20_200 listitem level="1"
uid=20_201 button "Player2 — Active"
uid=20_202 listitem level="1"
uid=20_203 button "Player3 — Active"
+556
View File
@@ -0,0 +1,556 @@
uid=1_0 RootWebArea "Foundry Virtual Tabletop" url="https://localhost:31000/game"
uid=26_0 ignored
uid=26_1 generic
uid=26_2 list
uid=26_3 ignored
uid=26_4 ignored
uid=26_5 ignored
uid=26_6 ignored
uid=26_7 ignored
uid=26_8 ignored
uid=26_9 ignored
uid=26_10 ignored
uid=26_11 ignored
uid=26_12 ignored
uid=26_13 ignored
uid=26_14 ignored
uid=26_15 ignored
uid=26_16 ignored
uid=26_17 ignored
uid=26_18 ignored
uid=26_19 ignored
uid=26_20 ignored
uid=26_21 ignored
uid=26_22 ignored
uid=26_23 ignored
uid=26_24 ignored
uid=26_25 ignored
uid=26_26 ignored
uid=26_27 ignored
uid=26_28 ignored
uid=26_29 ignored
uid=26_30 ignored
uid=26_31 ignored
uid=26_32 ignored
uid=26_33 ignored
uid=26_34 ignored
uid=26_35 ignored
uid=26_36 ignored
uid=26_37 ignored
uid=26_38 ignored
uid=26_39 ignored
uid=26_40 ignored
uid=26_41 ignored
uid=26_42 generic
uid=26_43 generic
uid=26_44 generic
uid=26_45 generic
uid=26_46 list
uid=26_47 listitem level="1"
uid=1_49 tab "Outils de token" selectable
uid=26_48 listitem level="1"
uid=1_51 tab "Outils de tuile" selectable
uid=26_49 listitem level="1"
uid=1_53 tab "Outils de dessin" selectable
uid=26_50 listitem level="1"
uid=1_55 tab "Outils de mur" selectable
uid=26_51 listitem level="1"
uid=1_57 tab "Outils de lumière" selectable
uid=26_52 listitem level="1"
uid=1_59 tab "Outils de son dambiance" selectable
uid=26_53 listitem level="1"
uid=1_61 tab "Outils de région" selectable
uid=26_54 listitem level="1"
uid=1_63 tab "Notes" selectable
uid=26_55 list
uid=26_56 listitem level="1"
uid=1_66 button "Sélection de tokens" pressed
uid=26_57 listitem level="1"
uid=1_68 button "Sélection de cibles"
uid=26_58 listitem level="1"
uid=1_70 button "Règle"
uid=26_59 listitem level="1"
uid=1_72 button "Déplacement sans contrainte"
uid=26_60 generic
uid=26_61 ignored
uid=26_62 ignored
uid=26_63 generic
uid=26_64 list
uid=26_65 listitem level="1"
uid=26_66 ignored
uid=26_67 StaticText "Gamemaster [MJ]"
uid=1_81 InlineTextBox "Gamemaster [MJ]"
uid=26_68 generic
uid=26_69 generic
uid=26_70 LabelText
uid=26_71 StaticText "Latence"
uid=1_81 InlineTextBox "Latence"
uid=26_72 StaticText " "
uid=1_81 InlineTextBox " "
uid=26_73 StaticText "1ms"
uid=1_81 InlineTextBox "1ms"
uid=26_74 generic
uid=26_75 LabelText
uid=26_76 StaticText "IPS"
uid=1_81 InlineTextBox "IPS"
uid=26_77 StaticText " "
uid=1_81 InlineTextBox " "
uid=26_78 StaticText "30"
uid=1_81 InlineTextBox "30"
uid=26_79 button
uid=26_80 generic
uid=1_95 navigation
uid=26_81 generic "Développer la navigation"
uid=26_82 ignored
uid=26_83 list
uid=26_84 listitem level="1"
uid=26_85 ignored
uid=1_101 StaticText "Scène"
uid=1_81 InlineTextBox "Scène"
uid=26_86 list
uid=26_87 listitem "Gamemaster" level="2"
uid=1_104 StaticText "G"
uid=1_81 InlineTextBox "G"
uid=26_88 ignored
uid=1_81 generic
uid=1_81 StaticText ""
uid=1_81 InlineTextBox ""
uid=26_89 list
uid=26_90 ignored
uid=26_91 ignored
uid=26_92 generic
uid=26_93 sectionheader
uid=26_94 generic
uid=26_95 generic
uid=26_96 LabelText
uid=26_97 LabelText
uid=26_98 sectionfooter
uid=1_116 generic roledescription="Barre de raccourcis"
uid=26_99 generic
uid=1_118 button "Couper le son"
uid=1_119 button "Menu principal"
uid=26_100 list
uid=1_121 button "Emplacement vide"
uid=26_101 ignored
uid=26_102 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_124 button "Emplacement vide"
uid=26_103 ignored
uid=26_104 StaticText "2"
uid=1_81 InlineTextBox "2"
uid=1_127 button "Emplacement vide"
uid=26_105 ignored
uid=26_106 StaticText "3"
uid=1_81 InlineTextBox "3"
uid=1_130 button "Emplacement vide"
uid=26_107 ignored
uid=26_108 StaticText "4"
uid=1_81 InlineTextBox "4"
uid=1_133 button "Emplacement vide"
uid=26_109 ignored
uid=26_110 StaticText "5"
uid=1_81 InlineTextBox "5"
uid=1_136 button "Emplacement vide"
uid=26_111 ignored
uid=26_112 StaticText "6"
uid=1_81 InlineTextBox "6"
uid=1_139 button "Emplacement vide"
uid=26_113 ignored
uid=26_114 StaticText "7"
uid=1_81 InlineTextBox "7"
uid=1_142 button "Emplacement vide"
uid=26_115 ignored
uid=26_116 StaticText "8"
uid=1_81 InlineTextBox "8"
uid=1_145 button "Emplacement vide"
uid=26_117 ignored
uid=26_118 StaticText "9"
uid=1_81 InlineTextBox "9"
uid=1_148 button "Emplacement vide"
uid=26_119 ignored
uid=26_120 StaticText "0"
uid=1_81 InlineTextBox "0"
uid=26_121 generic
uid=1_152 navigation
uid=1_153 button "Page suivante"
uid=26_122 ignored
uid=1_155 StaticText "1"
uid=1_81 InlineTextBox "1"
uid=1_156 button "Page précédente"
uid=26_123 ignored
uid=1_158 button "Verrouiller la barre de raccourcis"
uid=1_159 button "Effacer la barre de raccourcis"
uid=26_124 generic
uid=26_125 generic
uid=26_126 generic
uid=26_127 ignored
uid=26_128 list
uid=26_129 generic "Tchat"
uid=26_130 generic
uid=1_167 generic value="
"
uid=1_168 paragraph
uid=1_169 LineBreak "
"
uid=1_81 InlineTextBox "
"
uid=26_131 ignored
uid=1_81 generic
uid=1_81 StaticText "Entrer un message"
uid=1_81 InlineTextBox "Entrer un message"
uid=26_132 generic
uid=26_133 generic
uid=1_173 button "Public en tant qu'utilisateur" pressed
uid=1_174 button "Privé pour les maîtres de jeu"
uid=1_175 button "Aveugle pour les maîtres de jeu"
uid=1_176 button "Seulement pour soi-même"
uid=1_177 button "Public en tant que personnage"
uid=26_134 generic
uid=26_135 tablist orientation="horizontal"
uid=26_136 list
uid=26_137 listitem level="1"
uid=1_182 tab "Messages du tchat" selectable
uid=26_138 listitem level="1"
uid=1_184 tab "Rencontres de combat" selectable
uid=26_139 listitem level="1"
uid=1_186 tab "Scènes" selectable
uid=26_140 listitem level="1"
uid=1_188 tab "Objets plaçables" selectable
uid=26_141 listitem level="1"
uid=1_190 tab "Acteurs" selectable
uid=26_142 listitem level="1"
uid=1_192 tab "Objets" selectable
uid=26_143 listitem level="1"
uid=1_194 tab "Journaux" selectable
uid=26_144 listitem level="1"
uid=1_196 tab "Tables aléatoires" selectable
uid=26_145 listitem level="1"
uid=1_198 tab "Jeux de cartes" selectable
uid=26_146 listitem level="1"
uid=1_200 tab "Macros" selectable
uid=26_147 listitem level="1"
uid=1_202 tab "Playlists" selectable
uid=26_148 listitem level="1"
uid=1_204 tab "Compendiums" selectable
uid=26_149 listitem level="1"
uid=1_206 tab "Dice So Nice" selectable
uid=26_150 listitem level="1"
uid=1_208 tab "Paramètres" selectable
uid=26_151 listitem level="1"
uid=1_210 button "Réduire"
uid=26_152 generic
uid=26_153 ignored
uid=26_154 ignored
uid=26_155 ignored
uid=26_156 ignored
uid=26_157 ignored
uid=26_158 ignored
uid=26_159 ignored
uid=26_160 ignored
uid=26_161 ignored
uid=26_162 ignored
uid=26_163 ignored
uid=26_164 ignored
uid=26_165 ignored
uid=26_166 ignored
uid=26_167 ignored
uid=26_168 ignored
uid=26_169 ignored
uid=26_170 ignored
uid=26_171 ignored
uid=26_172 ignored
uid=26_173 ignored
uid=26_174 ignored
uid=26_175 ignored
uid=26_176 ignored
uid=26_177 ignored
uid=26_178 ignored
uid=26_179 ignored
uid=26_180 ignored
uid=26_181 ignored
uid=26_182 ignored
uid=26_183 generic
uid=26_184 sectionheader
uid=26_185 ignored
uid=22_2 button "Créer une scène"
uid=26_186 ignored
uid=26_187 ignored
uid=26_188 StaticText "Créer une scène"
uid=1_81 InlineTextBox "Créer une scène"
uid=22_3 button "Créer un dossier"
uid=26_189 ignored
uid=26_190 ignored
uid=26_191 StaticText "Créer un dossier"
uid=1_81 InlineTextBox "Créer un dossier"
uid=22_4 search
uid=22_5 button "Recherche par nom uniquement"
uid=22_6 searchbox "Chercher dans les Scènes"
uid=26_192 ignored
uid=26_193 ignored
uid=26_194 generic
uid=22_7 button "Trier par ordre alphabétique"
uid=22_8 button "Réduire tous les dossiers"
uid=26_195 list
uid=26_196 listitem level="1"
uid=22_9 image "QA Damage Scene" url="https://localhost:31000/worlds/donjon-and-cie/assets/scenes/thumb-4xIQfUVf79BjHXUW_cf8Sg.webp"
uid=26_197 generic
uid=22_10 StaticText "QA Damage Scene"
uid=1_81 InlineTextBox "QA Damage Scene"
uid=26_198 listitem level="1"
uid=22_11 image "Scène" url="https://localhost:31000/worlds/donjon-and-cie/assets/scenes/thumb-nFrkZVHAR3SgvCv8RhSyCg.webp"
uid=26_199 generic
uid=22_12 StaticText "Scène"
uid=1_81 InlineTextBox "Scène"
uid=26_200 sectionfooter
uid=26_201 ignored
uid=26_202 ignored
uid=26_203 ignored
uid=26_204 ignored
uid=26_205 ignored
uid=26_206 ignored
uid=26_207 ignored
uid=26_208 ignored
uid=26_209 ignored
uid=26_210 ignored
uid=26_211 ignored
uid=26_212 ignored
uid=26_213 ignored
uid=26_214 ignored
uid=26_215 ignored
uid=26_216 ignored
uid=26_217 ignored
uid=26_218 ignored
uid=26_219 ignored
uid=26_220 ignored
uid=26_221 ignored
uid=26_222 ignored
uid=26_223 ignored
uid=26_224 ignored
uid=26_225 ignored
uid=26_226 ignored
uid=26_227 ignored
uid=26_228 ignored
uid=26_229 ignored
uid=26_230 ignored
uid=26_231 ignored
uid=26_232 ignored
uid=26_233 ignored
uid=26_234 generic
uid=26_235 generic
uid=26_236 generic
uid=26_237 Canvas
uid=26_238 generic
uid=26_239 generic
uid=26_240 complementary "Scrying Pool"
uid=26_241 ignored
uid=26_242 button "Close Scrying Pool"
uid=26_243 StaticText "×"
uid=1_81 InlineTextBox "×"
uid=26_244 ignored
uid=26_245 button "Expand Scrying Pool" expandable
uid=26_246 generic
uid=26_247 button "Open Director's Board"
uid=26_248 ignored
uid=26_249 ignored
uid=26_250 StaticText "Director's Board"
uid=1_81 InlineTextBox "Director's Board"
uid=26_251 list
uid=26_252 listitem level="1"
uid=26_253 button "Gamemaster — Active"
uid=26_254 ignored
uid=26_255 ignored
uid=26_256 ignored
uid=26_257 ignored
uid=26_258 ignored
uid=26_259 ignored
uid=26_260 ignored
uid=26_261 ignored
uid=26_262 ignored
uid=26_263 ignored
uid=26_264 ignored
uid=26_265 ignored
uid=26_266 ignored
uid=26_267 ignored
uid=26_268 ignored
uid=26_269 ignored
uid=26_270 ignored
uid=26_271 ignored
uid=26_272 ignored
uid=26_273 ignored
uid=26_274 ignored
uid=26_275 ignored
uid=26_276 ignored
uid=26_277 ignored
uid=26_278 ignored
uid=26_279 ignored
uid=26_280 ignored
uid=26_281 ignored
uid=26_282 ignored
uid=26_283 ignored
uid=26_284 ignored
uid=26_285 ignored
uid=26_286 ignored
uid=26_287 ignored
uid=26_288 ignored
uid=26_289 ignored
uid=26_290 listitem level="1"
uid=26_291 button "Player2 — Active"
uid=26_292 listitem level="1"
uid=26_293 button "Player3 — Active"
uid=26_294 generic
uid=26_295 generic
uid=26_296 generic
uid=26_297 ignored
uid=21_15 button "Fermer"
uid=26_298 StaticText "×"
uid=1_81 InlineTextBox "×"
uid=26_299 list "Tableau du Réalisateur"
uid=21_16 listitem "Gamemaster" level="1"
uid=26_300 generic
uid=21_17 image "Avatar of Gamemaster" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=26_301 paragraph
uid=21_18 StaticText "Gamemaster"
uid=1_81 InlineTextBox "Gamemaster"
uid=21_19 button "Hide Gamemaster"
uid=26_302 ignored
uid=21_20 listitem "Player2" level="1"
uid=26_303 generic
uid=21_21 image "Avatar of Player2" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=21_22 status "Reaction Cam: Enabled" atomic description="Reaction Cam: Enabled" live="polite" relevant="additions text"
uid=26_304 ignored
uid=26_305 paragraph
uid=21_23 StaticText "Player2"
uid=1_81 InlineTextBox "Player2"
uid=21_24 button "Hide Player2"
uid=26_306 ignored
uid=21_25 listitem "Player3" level="1"
uid=26_307 generic
uid=21_26 image "Avatar of Player3" url="https://localhost:31000/icons/svg/mystery-man.svg"
uid=26_308 paragraph
uid=21_27 StaticText "Player3"
uid=1_81 InlineTextBox "Player3"
uid=21_28 button "Hide Player3"
uid=26_309 ignored
uid=26_310 ignored
uid=26_311 ignored
uid=26_312 ignored
uid=26_313 ignored
uid=26_314 ignored
uid=26_315 ignored
uid=26_316 ignored
uid=26_317 ignored
uid=26_318 ignored
uid=26_319 ignored
uid=26_320 ignored
uid=26_321 ignored
uid=26_322 ignored
uid=26_323 ignored
uid=26_324 ignored
uid=21_29 button "Tout afficher"
uid=26_325 ignored
uid=26_326 StaticText "Tout afficher"
uid=1_81 InlineTextBox "Tout afficher"
uid=21_30 button "Tout masquer"
uid=26_327 ignored
uid=26_328 StaticText "Tout masquer"
uid=1_81 InlineTextBox "Tout masquer"
uid=21_31 button "Ouvrir la référence des raccourcis"
uid=26_329 StaticText "?"
uid=1_81 InlineTextBox "?"
uid=26_330 toolbar "Disposition de la vue" orientation="horizontal"
uid=26_331 ignored
uid=21_32 StaticText "DISPOSITION DE LA VUE"
uid=1_81 InlineTextBox "DISPOSITION DE LA VUE"
uid=26_332 ignored
uid=21_33 button "S"
uid=26_333 ignored
uid=26_334 ignored
uid=26_335 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=21_34 button "L"
uid=26_336 ignored
uid=26_337 ignored
uid=26_338 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=21_35 button "S"
uid=26_339 ignored
uid=26_340 ignored
uid=26_341 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=21_36 button "L"
uid=26_342 ignored
uid=26_343 ignored
uid=26_344 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=21_37 button "S"
uid=26_345 ignored
uid=26_346 ignored
uid=26_347 StaticText "S"
uid=1_81 InlineTextBox "S"
uid=21_38 button "L"
uid=26_348 ignored
uid=26_349 ignored
uid=26_350 StaticText "L"
uid=1_81 InlineTextBox "L"
uid=26_351 toolbar "Largeurs des widgets vidéo" orientation="horizontal"
uid=21_39 StaticText "Largeurs des widgets vidéo"
uid=1_81 InlineTextBox "Largeurs des widgets vidéo"
uid=26_352 ignored
uid=26_353 generic
uid=21_40 StaticText "Petite :"
uid=1_81 InlineTextBox "Petite :"
uid=21_41 combobox expandable haspopup="menu" value="100px"
uid=26_354 MenuListPopup
uid=21_42 option "60px" selectable value="60px"
uid=21_43 option "80px" selectable value="80px"
uid=21_44 option "100px" selectable selected value="100px"
uid=21_45 option "120px" selectable value="120px"
uid=21_46 option "150px" selectable value="150px"
uid=21_47 option "200px" selectable value="200px"
uid=26_355 generic
uid=21_48 StaticText "Grande :"
uid=1_81 InlineTextBox "Grande :"
uid=21_49 combobox expandable haspopup="menu" value="150px"
uid=26_356 MenuListPopup
uid=21_50 option "60px" selectable value="60px"
uid=21_51 option "80px" selectable value="80px"
uid=21_52 option "100px" selectable value="100px"
uid=21_53 option "120px" selectable value="120px"
uid=21_54 option "150px" selectable selected value="150px"
uid=21_55 option "200px" selectable value="200px"
uid=26_357 sectionfooter
uid=26_358 ignored
uid=21_56 button "Sauvegarder la disposition"
uid=26_359 ignored
uid=26_360 StaticText "Sauvegarder la disposition"
uid=1_81 InlineTextBox "Sauvegarder la disposition"
uid=21_57 button "Charger la disposition" disableable disabled
uid=26_361 ignored
uid=26_362 StaticText "Charger la disposition"
uid=1_81 InlineTextBox "Charger la disposition"
uid=21_58 button "Exporter"
uid=26_363 ignored
uid=26_364 StaticText "Exporter"
uid=1_81 InlineTextBox "Exporter"
uid=21_59 button "Importer"
uid=26_365 ignored
uid=26_366 StaticText "Importer"
uid=1_81 InlineTextBox "Importer"
uid=26_367 ignored
uid=21_60 button "Application auto..."
uid=26_368 ignored
uid=26_369 StaticText "Application auto..."
uid=1_81 InlineTextBox "Application auto..."
uid=21_61 button "Désactiver A/V"
uid=26_370 ignored
uid=26_371 StaticText "Désactiver A/V"
uid=1_81 InlineTextBox "Désactiver A/V"
uid=21_62 button "Paramètres A/V..."
uid=26_372 ignored
uid=26_373 StaticText "Paramètres A/V..."
uid=1_81 InlineTextBox "Paramètres A/V..."
uid=26_374 generic
uid=26_375 ignored
uid=26_376 ignored
uid=26_377 generic
uid=26_378 ignored
+112 -3
View File
@@ -382,13 +382,48 @@ export class DirectorsBoard extends _AppBase {
// Defaults match the settings registration in module.js
const widgetWidthSm = this._adapter.settings?.get?.('widgetWidthSm') ?? '83';
const widgetWidthMd = this._adapter.settings?.get?.('widgetWidthMd') ?? '150';
const WIDTH_OPTIONS = [
const SM_WIDTH_OPTIONS = [
{ value: '60', label: '60px' },
{ value: '70', label: '70px' },
{ value: '80', label: '80px' },
{ value: '90', label: '90px' },
{ value: '100', label: '100px' },
{ value: '120', label: '120px' },
{ value: '140', label: '140px' },
{ value: '160', label: '160px' },
{ value: '180', label: '180px' },
{ value: '200', label: '200px' },
];
const MD_WIDTH_OPTIONS = [
{ value: '60', label: '60px' },
{ value: '80', label: '80px' },
{ value: '100', label: '100px' },
{ value: '120', label: '120px' },
{ value: '150', label: '150px' },
{ value: '200', label: '200px' },
{ value: '250', label: '250px' },
{ value: '300', label: '300px' },
{ value: '350', label: '350px' },
{ value: '400', label: '400px' },
];
// Tile shape selector
const currentTileShape = this._adapter.settings?.get?.('tileShape') ?? 'circle';
const TILE_SHAPES = [
{ key: 'rounded', icon: 'fa-square', isActive: currentTileShape === 'rounded', label: 'Rounded' },
{ key: 'circle', icon: 'fa-circle', isActive: currentTileShape === 'circle', label: 'Circle' },
{ key: 'hexagon', icon: 'fa-hexagon', isActive: currentTileShape === 'hexagon', label: 'Hexagon' },
{ key: 'octagon', icon: 'fa-shapes', isActive: currentTileShape === 'octagon', label: 'Octagon' },
];
// Tile border around video shapes
const currentTileBorderWidth = this._adapter.settings?.get?.('tileBorderWidth') ?? 0;
const currentTileBorderColor = this._adapter.settings?.get?.('tileBorderColor') ?? '#ffffff';
const TILE_BORDER_WIDTHS = [
{ value: 0, label: 'None', isActive: currentTileBorderWidth === 0 },
{ value: 1, label: '1px', isActive: currentTileBorderWidth === 1 },
{ value: 2, label: '2px', isActive: currentTileBorderWidth === 2 },
{ value: 4, label: '4px', isActive: currentTileBorderWidth === 4 },
];
return {
@@ -397,7 +432,6 @@ export class DirectorsBoard extends _AppBase {
hasRestore: this._spotlightSnapshot !== null,
presetCount,
hasPresets: presetCount > 0,
// Story 3.2: Auto-apply configuration
hasScene: !!this._adapter.scenes?.current?.(),
autoApplyEnabled: autoApplyConfig.enabled,
autoApplyPresetName: autoApplyConfig.presetName,
@@ -407,8 +441,16 @@ export class DirectorsBoard extends _AppBase {
avModeEnabled: (game.webrtc?.settings?.world?.mode ?? 0) !== 0,
// Dock layout selector
dockLayouts,
// Tile shape selector
tileShape: currentTileShape,
tileShapes: TILE_SHAPES,
// Tile border
tileBorderWidth: currentTileBorderWidth,
tileBorderColor: currentTileBorderColor,
tileBorderWidths: TILE_BORDER_WIDTHS,
// Story 5.2: Video widget width customization
widthOptions: WIDTH_OPTIONS,
smWidthOptions: SM_WIDTH_OPTIONS,
mdWidthOptions: MD_WIDTH_OPTIONS,
widgetWidthSm,
widgetWidthMd,
};
@@ -469,6 +511,9 @@ export class DirectorsBoard extends _AppBase {
case 'toggle-av-mode': this._onToggleAVMode(); break;
case 'open-av-config': this._onOpenAVConfig(); break;
case 'set-dock-layout': this._onSetDockLayout(btn.dataset.layout); break;
case 'set-tile-shape': this._onSetTileShape(btn.dataset.shape); break;
case 'set-tile-border-width': this._onSetTileBorderWidth(parseInt(btn.dataset.width, 10)); break;
case 'reset-strip-position': this._onResetStripPosition(); break;
case 'close': this.close(); break;
}
};
@@ -501,6 +546,15 @@ export class DirectorsBoard extends _AppBase {
mdSelect.addEventListener('change', () => this._onSetWidgetWidth(mdSelect.value, 'md'));
}
// Tile border color picker — Foundry overwrites inline template styles via setPosition,
// but the color input's value attribute IS preserved. However, click fires when opening
// the picker (before the user chooses), so listen for 'change' instead.
const borderColorInput = root.querySelector('input[data-action="set-tile-border-color"]');
if (borderColorInput) {
borderColorInput.value = this._adapter.settings?.get?.('tileBorderColor') ?? '#ffffff';
borderColorInput.addEventListener('change', () => this._onSetTileBorderColor(borderColorInput.value));
}
// Drag grip — custom drag (ApplicationV2 header is hidden)
const grip = root.querySelector('[data-action="drag-grip"]');
if (grip) {
@@ -737,6 +791,8 @@ export class DirectorsBoard extends _AppBase {
if (!layoutKey) return;
try {
await this._adapter.settings?.set?.('dockLayout', layoutKey);
// Reset per-user size override so the world layout takes effect
await this._adapter.settings?.set?.('dockLayoutExpanded', '');
} catch (err) {
console.error('[ScryingPool] Failed to set dockLayout:', err);
}
@@ -760,6 +816,59 @@ export class DirectorsBoard extends _AppBase {
if (this.rendered) this.render({ force: true });
}
/**
* Sets the tile shape for participant avatars.
* @param {string} shape - 'rounded', 'circle', 'hexagon', or 'octagon'
*/
async _onSetTileShape(shape) {
if (!shape) return;
try {
await this._adapter.settings?.set?.('tileShape', shape);
} catch (err) {
console.error('[ScryingPool] Failed to set tile shape:', err);
}
if (this.rendered) this.render({ force: true });
}
/**
* Sets the border width around video shapes.
* @param {number} width - 0, 1, 2, or 4
*/
async _onSetTileBorderWidth(width) {
if (width == null) return;
try {
await this._adapter.settings?.set?.('tileBorderWidth', width);
} catch (err) {
console.error('[ScryingPool] Failed to set tile border width:', err);
}
if (this.rendered) this.render({ force: true });
}
/**
* Sets the border color around video shapes.
* @param {string} color - hex color string e.g. '#ff0000'
*/
async _onSetTileBorderColor(color) {
if (!color) return;
try {
await this._adapter.settings?.set?.('tileBorderColor', color);
} catch (err) {
console.error('[ScryingPool] Failed to set tile border color:', err);
}
if (this.rendered) this.render({ force: true });
}
/**
* Clears the saved strip position flag so the strip defaults to its original position.
*/
_onResetStripPosition() {
try {
game.user?.setFlag?.('scrying-pool', 'stripState', null);
} catch (err) {
console.error('[ScryingPool] Failed to reset strip position:', err);
}
}
/**
* Opens the PresetSaveDialog for saving the current visibility matrix as a preset.
*/
+541 -15
View File
@@ -143,8 +143,32 @@ export class ScryingPoolStrip extends _AppBase {
/** @type {StripOverlayLayer|null} */
this._stripOverlayLayer = null;
/** @type {Map<string, {retryCount: number, retryTimer: number|null}>} */
this._videoStreamRetries = new Map();
/** @type {number|null} */
this._healthCheckInterval = null;
/** @type {number|string|null} */
this._userConnectedHookId = null;
/** @type {string|null} */
this._focusedUserId = null;
/** @type {number|null} */
this._positionSaveTimer = null;
// Load saved position from user flags
this._loadPosition();
/** Bound keydown handler for Escape-to-exit-focus */
this._onDocumentKeydown = (e) => {
if (e.key === 'Escape' && this._focusedUserId) {
this._focusedUserId = null;
if (typeof this.render === 'function') {
this.render({ force: false });
}
}
};
if (typeof document?.addEventListener === 'function') {
document.addEventListener('keydown', this._onDocumentKeydown);
}
}
/** Loads saved window position from GM user flag. */
@@ -152,8 +176,13 @@ export class ScryingPoolStrip extends _AppBase {
try {
const saved = game.user?.getFlag?.('scrying-pool', 'stripState');
if (saved?.left != null && saved?.top != null) {
if (this.options?.position) {
Object.assign(this.options.position, { left: saved.left, top: saved.top });
if (saved.left < 0 || saved.top < 0) return;
const screenW = typeof window !== 'undefined' ? (window.screen?.availWidth ?? Infinity) : Infinity;
const screenH = typeof window !== 'undefined' ? (window.screen?.availHeight ?? Infinity) : Infinity;
if (saved.left < screenW - 50 && saved.top < screenH - 50) {
if (this.options?.position) {
Object.assign(this.options.position, { left: saved.left, top: saved.top });
}
}
}
} catch (_e) { /* no-op in test environment */ }
@@ -188,6 +217,22 @@ export class ScryingPoolStrip extends _AppBase {
? userIds
: userIds.filter(id => id !== currentUserId);
// Re-order participants per GM's saved order (drag-and-drop)
try {
const savedOrder = game.user?.getFlag?.('scrying-pool', 'participantOrder');
if (Array.isArray(savedOrder) && savedOrder.length > 0) {
const orderMap = new Map(savedOrder.map((id, idx) => [id, idx]));
filteredUserIds.sort((a, b) => {
const ai = orderMap.get(a);
const bi = orderMap.get(b);
if (ai !== undefined && bi !== undefined) return ai - bi;
if (ai !== undefined) return -1;
if (bi !== undefined) return 1;
return 0;
});
}
} catch (_e) { /* no-op in test environment */ }
// Check if we have stream access for video replacement (full AV replacement mode)
const hasStreamAccess = this._adapter.webrtc?.getMediaStreamForUser !== undefined;
@@ -200,8 +245,16 @@ export class ScryingPoolStrip extends _AppBase {
this._portraitFallbackHandler
);
// Mark focused participant for gold ring visual
participants.forEach(p => { p.isFocused = this._focusedUserId === p.userId; });
// Remove hidden participants from the strip — they are managed via the Directors Board.
const visibleParticipants = participants.filter(p => p.state !== 'hidden');
let visibleParticipants = participants.filter(p => p.state !== 'hidden');
// Spotlight: if a participant is focused, only show that one
if (this._focusedUserId) {
visibleParticipants = visibleParticipants.filter(p => p.userId === this._focusedUserId);
}
// Dock layout: world setting gives direction+canonical size; client override only applies if user toggled
const rawLayout = this._adapter.settings?.get?.('dockLayout');
@@ -221,9 +274,18 @@ export class ScryingPoolStrip extends _AppBase {
const widgetWidthMd = this._adapter.settings?.get?.('widgetWidthMd') ?? '150';
const isLarge = effectiveSize === 'md';
const effectiveWidth = isLarge ? widgetWidthMd : widgetWidthSm;
const isSpotlightActive = !!this._focusedUserId;
const widgetWidth = isSpotlightActive ? String(parseInt(effectiveWidth, 10) * 2) : effectiveWidth;
const isGM = this._adapter.users.isGM?.() ?? false;
// Tile shape for participant avatars
const tileShape = this._adapter.settings?.get?.('tileShape') ?? 'circle';
// Tile border around video shapes
const tileBorderWidth = this._adapter.settings?.get?.('tileBorderWidth') ?? 0;
const tileBorderColor = this._adapter.settings?.get?.('tileBorderColor') ?? '#ffffff';
return {
participants: visibleParticipants,
isExpanded,
@@ -234,7 +296,13 @@ export class ScryingPoolStrip extends _AppBase {
hasStreamAccess,
isGM,
// Story 5.2: Video widget width customization
widgetWidth: effectiveWidth,
isSpotlightActive,
widgetWidth,
// Tile shape
tileShape,
// Tile border
tileBorderWidth,
tileBorderColor,
};
}
@@ -247,6 +315,11 @@ export class ScryingPoolStrip extends _AppBase {
el.querySelectorAll('[data-action="open-popover"]').forEach(btn => {
const userId = btn.dataset.userId;
btn.addEventListener('click', e => {
if (e.shiftKey) {
e.stopPropagation();
this._toggleFocus(userId);
return;
}
e.stopPropagation();
this._openPopover(userId, btn);
});
@@ -257,6 +330,33 @@ export class ScryingPoolStrip extends _AppBase {
});
});
// Drag-and-drop reordering of participants
// Remove old DnD listeners first to prevent duplicates on re-render
el.querySelectorAll('.sp-strip__participant-item').forEach(item => {
const existing = item._dndHandlers;
if (existing) {
item.removeEventListener('dragstart', existing.dragstart);
item.removeEventListener('dragover', existing.dragover);
item.removeEventListener('drop', existing.drop);
item.removeEventListener('dragend', existing.dragend);
item.removeEventListener('dragleave', existing.dragleave);
}
const handlers = {
dragstart: e => this._onDragStart(e),
dragover: e => this._onDragOver(e),
drop: e => this._onDrop(e),
dragend: e => this._onDragEnd(e),
dragleave: e => this._onDragLeave(e),
};
item._dndHandlers = handlers;
item.draggable = true;
item.addEventListener('dragstart', handlers.dragstart);
item.addEventListener('dragover', handlers.dragover);
item.addEventListener('drop', handlers.drop);
item.addEventListener('dragend', handlers.dragend);
item.addEventListener('dragleave', handlers.dragleave);
});
const toggle = el.querySelector('[data-action="toggle-expanded"]');
if (toggle) {
toggle.addEventListener('click', () => this._toggleExpanded());
@@ -279,8 +379,13 @@ export class ScryingPoolStrip extends _AppBase {
}
// Drag grip — custom drag implementation (Foundry v14 ApplicationV1 does not expose its drag handler)
// Double-click grip resets participant order to connection order
const grip = el.querySelector('[data-action="drag-grip"]');
if (grip) {
grip.addEventListener('dblclick', e => {
e.preventDefault();
this._resetParticipantOrder();
});
grip.addEventListener('mousedown', e => {
if (e.button !== 0) return;
e.preventDefault();
@@ -297,6 +402,7 @@ export class ScryingPoolStrip extends _AppBase {
const onUp = () => {
document.removeEventListener('mousemove', onMove);
document.removeEventListener('mouseup', onUp);
this._savePosition();
};
document.addEventListener('mousemove', onMove);
document.addEventListener('mouseup', onUp);
@@ -316,13 +422,32 @@ export class ScryingPoolStrip extends _AppBase {
this._attachVideoStreams(el);
}
// Start stream monitoring on first render
if (this._healthCheckInterval === null) {
this._initStreamMonitoring();
}
// Set CSS custom properties — Foundry's setPosition() overwrites inline template styles
const setVar = (name, value) => {
if (value !== undefined && value !== null) el.style.setProperty(name, value);
};
const widgetWidth = context?.widgetWidth ?? '150';
setVar('--sp-widget-width', `${widgetWidth}px`);
const bw = context?.tileBorderWidth ?? 0;
setVar('--sp-tile-border-width', `${bw}px`);
setVar('--sp-tile-border-color', context?.tileBorderColor ?? '#ffffff');
setVar('--sp-tile-border-active', bw > 0 ? '1' : '0');
// Sync the outer Application window width with the selected dock layout.
// Spotlight mode doubles the strip window to fit the enlarged tile.
if (typeof this.setPosition === 'function') {
const layout = context?.dockLayout ?? 'vertical-sm';
const n = context?.participants?.length ?? 0;
const width = this._computeStripWidth(layout, n);
const spotlightMultiplier = context?.isSpotlightActive ? 2 : 1;
const width = this._computeStripWidth(layout, n) * spotlightMultiplier;
const height = this._computeStripHeight(layout, n);
this.setPosition(height === 'auto' ? { width, height: 'auto' } : { width, height });
const adjustedHeight = height === 'auto' ? 'auto' : height * spotlightMultiplier;
this.setPosition(adjustedHeight === 'auto' ? { width, height: 'auto' } : { width, height: adjustedHeight });
}
}
@@ -355,8 +480,8 @@ export class ScryingPoolStrip extends _AppBase {
const mdWidth = this._getWidgetWidth('md');
switch (layout) {
case 'vertical-sm': return smWidth + 2; // widget + 2px border
case 'vertical-md': return 242; // 240px strip + 2px border (expanded view has fixed width)
case 'vertical-sm': return rowWidth(smWidth, 1);
case 'vertical-md': return rowWidth(mdWidth, 1);
case 'horizontal-sm': return rowWidth(smWidth, Math.min(maxCols, n));
case 'horizontal-md': return rowWidth(mdWidth, Math.min(maxCols, n));
case 'mosaic-sm': return rowWidth(smWidth, Math.min(maxCols, Math.ceil(Math.sqrt(n))));
@@ -410,6 +535,14 @@ export class ScryingPoolStrip extends _AppBase {
this._activePopover = null;
}
// Remove document-level keydown listener
if (typeof document?.removeEventListener === 'function') {
document.removeEventListener('keydown', this._onDocumentKeydown);
}
// Tear down stream monitoring
this._teardownStreamMonitoring();
// Clean up video elements and streams when closing
this._cleanupVideoStreams();
@@ -424,18 +557,24 @@ export class ScryingPoolStrip extends _AppBase {
}
/**
* Cleans up all video elements and their associated streams.
* Called when the strip is closed to prevent memory leaks.
* Removes video elements from the DOM when the strip closes.
* Does NOT stop the underlying MediaStream tracks — those belong to
* FoundryVTT's WebRTC system (`game.webrtc.client`) and must stay alive
* so they can be re-attached if the strip re-opens later.
*/
_cleanupVideoStreams() {
if (typeof document === 'undefined') return;
const videoElements = document.querySelectorAll?.('.sp-participant-video__element') ?? [];
videoElements.forEach(videoEl => {
// Stop all tracks in the stream
if (videoEl.srcObject instanceof MediaStream) {
videoEl.srcObject.getTracks().forEach(track => track.stop());
// Clear all retry timers
for (const [, retryInfo] of this._videoStreamRetries) {
if (retryInfo.retryTimer !== null) {
clearTimeout(retryInfo.retryTimer);
}
}
this._videoStreamRetries.clear();
const videoElements = this.element?.querySelectorAll?.('.sp-participant-video__element') ?? [];
videoElements.forEach(videoEl => {
videoEl.srcObject = null;
videoEl.remove();
});
@@ -626,9 +765,13 @@ export class ScryingPoolStrip extends _AppBase {
// Set up error handling
videoElement.addEventListener('error', () => {
console.warn('[ScryingPool] Video element error for user:', userId);
this._onStreamError(userId);
});
videoContainer.appendChild(videoElement);
// Monitor this stream for loss/failure
this._monitorStream(userId, videoElement, stream);
}
/**
@@ -649,6 +792,389 @@ export class ScryingPoolStrip extends _AppBase {
this.render({ force: false });
}
}
// ── Stream monitoring and recovery ─────────────────────────────────────────
/**
* Initialises periodic stream health checks and hooks for user connection changes.
* Safe to call multiple times — guards against double-init via _healthCheckInterval.
*/
_initStreamMonitoring() {
// Periodic health check every 15 seconds
this._healthCheckInterval = setInterval(() => this._checkVideoStreamHealth(), 15000);
// Auto-save strip position every 30 seconds
this._positionSaveTimer = setInterval(() => this._savePosition(), 30000);
// Watch for user connection changes to refresh streams
if (typeof Hooks !== 'undefined') {
this._userConnectedHookId = Hooks.on('userConnected', (userId, connected) => {
if (connected) {
setTimeout(() => this._refreshVideoStreams(), 1500);
}
});
}
}
/**
* Tears down stream monitoring: clears interval, removes hooks, cancels retries.
*/
_teardownStreamMonitoring() {
// Clear health check interval
if (this._healthCheckInterval !== null) {
clearInterval(this._healthCheckInterval);
this._healthCheckInterval = null;
}
// Clear position save timer
if (this._positionSaveTimer !== null) {
clearInterval(this._positionSaveTimer);
this._positionSaveTimer = null;
}
// Remove userConnected hook
if (this._userConnectedHookId !== null && typeof Hooks !== 'undefined') {
Hooks.off('userConnected', this._userConnectedHookId);
this._userConnectedHookId = null;
}
// Cancel all pending retries
for (const [, retryInfo] of this._videoStreamRetries) {
if (retryInfo.retryTimer !== null) {
clearTimeout(retryInfo.retryTimer);
}
}
this._videoStreamRetries.clear();
}
/**
* Monitors a video stream for loss or failure events.
* Sets up listeners on the track lifecycle and starts health tracking.
* @param {string} userId
* @param {HTMLVideoElement} videoEl
* @param {MediaStream} stream
*/
_monitorStream(userId, videoEl, stream) {
// Watch for video track ended (stream truly lost)
const videoTracks = stream.getVideoTracks();
for (const track of videoTracks) {
track.addEventListener('ended', () => this._onVideoTrackEnded(userId), { once: true });
}
// Watch for track removal (mute event may indicate transient issue)
for (const track of videoTracks) {
track.addEventListener('mute', () => {
// Brief delay to see if unmute fires naturally
setTimeout(() => {
if (track.readyState === 'ended') {
this._onVideoTrackEnded(userId);
}
}, 2000);
}, { once: true });
}
// Watch for playback stall
videoEl.addEventListener('stalled', () => {
setTimeout(() => {
if (videoEl.readyState < HTMLMediaElement.HAVE_CURRENT_DATA) {
this._scheduleStreamRetry(userId);
}
}, 3000);
}, { once: true });
}
/**
* Called when a video track is ended (stream disconnected).
* Shows a warning and schedules a retry.
* @param {string} userId
*/
_onVideoTrackEnded(userId) {
this._notify('warn', 'scrying-pool.stream.lost', userId);
this._scheduleStreamRetry(userId);
}
/**
* Called when a video element fires an error event.
* @param {string} userId
*/
_onStreamError(userId) {
this._scheduleStreamRetry(userId);
}
/**
* Schedules a retry for a user's video stream with exponential backoff.
* @param {string} userId
* @param {number} [delay=2000] - Initial delay in ms
*/
_scheduleStreamRetry(userId, delay = 2000) {
// Cancel any existing retry for this user
this._clearStreamRetry(userId);
const retryInfo = this._videoStreamRetries.get(userId) ?? { retryCount: 0, retryTimer: null };
if (retryInfo.retryCount >= 3) {
this._notify('error', 'scrying-pool.stream.failed', userId);
return;
}
this._notify('info', 'scrying-pool.stream.recovering', userId);
retryInfo.retryTimer = setTimeout(() => {
this._retryStream(userId);
}, delay);
retryInfo.retryCount++;
this._videoStreamRetries.set(userId, retryInfo);
}
/**
* Attempts to re-acquire and re-attach a user's video stream.
* On success, clears retry state and notifies. On failure, schedules next backoff.
* @param {string} userId
*/
_retryStream(userId) {
const stream = this._adapter.webrtc?.getMediaStreamForUser?.(userId);
const avatar = this.element?.querySelector(`[data-user-id="${userId}"]`);
if (stream instanceof MediaStream && avatar) {
// Clean up the old video container state
const videoContainer = avatar.querySelector('.sp-participant-video');
if (videoContainer) {
const oldVideo = videoContainer.querySelector('video');
if (oldVideo) {
oldVideo.srcObject = null;
oldVideo.remove();
}
}
// Re-attach with the (possibly new) stream
this._attachVideoStream(userId, avatar);
this._clearStreamRetry(userId);
this._notify('info', 'scrying-pool.stream.recovered', userId);
} else {
// Exponential backoff: 2s, 4s, 8s
const retryInfo = this._videoStreamRetries.get(userId);
const nextDelay = Math.pow(2, (retryInfo?.retryCount ?? 1)) * 1000;
this._scheduleStreamRetry(userId, nextDelay);
}
}
/**
* Cancels any pending retry timer for a user and resets retry state.
* @param {string} userId
*/
_clearStreamRetry(userId) {
const retryInfo = this._videoStreamRetries.get(userId);
if (retryInfo) {
if (retryInfo.retryTimer !== null) {
clearTimeout(retryInfo.retryTimer);
}
this._videoStreamRetries.delete(userId);
}
}
/**
* Periodic health check — inspects all participant video elements and
* triggers retries for any that are in a failed or stuck state.
*/
_checkVideoStreamHealth() {
if (!this.element) return;
this.element.querySelectorAll('.sp-participant-avatar').forEach(avatar => {
const userId = avatar.dataset.userId;
if (!userId) return;
const videoContainer = avatar.querySelector('.sp-participant-video');
const videoEl = avatar.querySelector('.sp-participant-video__element');
// Expected video container but no video element → needs attach
if (videoContainer && !videoEl) {
const stream = this._adapter.webrtc?.getMediaStreamForUser?.(userId);
if (stream instanceof MediaStream) {
this._attachVideoStream(userId, avatar);
}
return;
}
// Video element exists but has no stream or ended tracks → trigger retry
if (videoEl) {
const stream = videoEl.srcObject;
if (stream instanceof MediaStream) {
const hasEndedTrack = stream.getVideoTracks().some(t => t.readyState === 'ended');
if (hasEndedTrack && !this._videoStreamRetries.has(userId)) {
this._onVideoTrackEnded(userId);
}
}
}
});
}
// ── Re-order participants (Drag & Drop) ─────────────────────────────────
/**
* Handles drag start on a participant item.
* @param {DragEvent} e
*/
_onDragStart(e) {
const item = e.target.closest('.sp-strip__participant-item');
if (!item) return;
const userId = item.querySelector('[data-user-id]')?.dataset?.userId;
if (!userId) return;
e.dataTransfer.setData('text/plain', userId);
e.dataTransfer.effectAllowed = 'move';
item.classList.add('sp-dragging');
}
/**
* Handles drag over on a participant item — shows drop indicator.
* @param {DragEvent} e
*/
_onDragOver(e) {
e.preventDefault();
e.dataTransfer.dropEffect = 'move';
const item = e.target.closest('.sp-strip__participant-item');
if (!item) return;
item.classList.add('sp-drag-over');
}
/**
* Handles drop — reorders participants and persists the order.
* @param {DragEvent} e
*/
_onDrop(e) {
e.preventDefault();
const fromUserId = e.dataTransfer.getData('text/plain');
const toItem = e.target.closest('.sp-strip__participant-item');
if (!toItem || !fromUserId) return;
const toUserId = toItem.querySelector('[data-user-id]')?.dataset?.userId;
if (!toUserId || fromUserId === toUserId) return;
const el = this.element;
if (!el) return;
const items = [...el.querySelectorAll('.sp-strip__participant-item')];
const userIds = items.map(item => item.querySelector('[data-user-id]')?.dataset?.userId).filter(Boolean);
const fromIdx = userIds.indexOf(fromUserId);
const toIdx = userIds.indexOf(toUserId);
if (fromIdx === -1 || toIdx === -1) return;
userIds.splice(fromIdx, 1);
const adjustedTo = fromIdx < toIdx ? toIdx - 1 : toIdx;
userIds.splice(adjustedTo, 0, fromUserId);
this._saveParticipantOrder(userIds);
if (typeof this.render === 'function') {
this.render({ force: false });
}
}
/**
* Handles drag end — removes visual indicators.
*/
_onDragEnd() {
this.element?.querySelectorAll('.sp-strip__participant-item')?.forEach(item => {
item.classList.remove('sp-dragging', 'sp-drag-over');
});
}
/**
* Handles drag leave — removes drop indicator from the exited item.
* @param {DragEvent} e
*/
_onDragLeave(e) {
const item = e.target.closest('.sp-strip__participant-item');
if (item) item.classList.remove('sp-drag-over');
}
/**
* Persists participant order to GM user flag.
* @param {string[]} orderedUserIds
*/
_saveParticipantOrder(orderedUserIds) {
if (typeof game === 'undefined') return;
try {
game.user?.setFlag?.('scrying-pool', 'participantOrder', orderedUserIds);
} catch (_e) { /* no-op */ }
}
/**
* Clears saved order — next render uses connection order.
*/
_resetParticipantOrder() {
if (typeof game === 'undefined') return;
try {
game.user?.unsetFlag?.('scrying-pool', 'participantOrder');
} catch (_e) { /* no-op */ }
if (typeof this.render === 'function') {
this.render({ force: false });
}
}
// ── Spotlight / Focus ────────────────────────────────────────────────────
/**
* Toggles focus on a participant. If already focused, exits focus mode.
* @param {string} userId
*/
_toggleFocus(userId) {
if (this._focusedUserId === userId) {
this._focusedUserId = null;
} else {
this._focusedUserId = userId;
}
if (typeof this.render === 'function') {
this.render({ force: false });
}
}
// ── Auto-save position ───────────────────────────────────────────────────
/**
* Saves current strip position to GM user flag.
*/
_savePosition() {
if (typeof game === 'undefined') return;
try {
const pos = this.position;
if (pos?.left == null || pos?.top == null) return;
game.user?.setFlag?.('scrying-pool', 'stripState', {
left: pos.left,
top: pos.top,
width: pos.width ?? 240,
height: pos.height ?? 'auto',
savedAt: Date.now(),
});
} catch (_e) { /* no-op */ }
}
/**
* Shows a notification with i18n support and safe fallback for test environments.
* @param {'info'|'warn'|'error'} level
* @param {string} i18nKey
* @param {string} userId
*/
_notify(level, i18nKey, userId) {
const userName = this._getUserName(userId);
let msg;
try {
msg = game.i18n?.format?.(i18nKey, { name: userName }) ?? `${i18nKey}: ${userName}`;
} catch {
msg = `${i18nKey}: ${userName}`;
}
this._adapter.notifications?.[level]?.(msg);
}
/**
* Resolves a display name for a user ID.
* @param {string} userId
* @returns {string}
*/
_getUserName(userId) {
try {
return this._adapter.users.get?.(userId)?.name ?? userId;
} catch {
return userId;
}
}
}
/**
+91
View File
@@ -0,0 +1,91 @@
/**
* styles/components/_buttons.less
*
* Shared SP button component — single source of truth for all dialog buttons.
* Imported by each dialog that needs buttons; all selectors scoped under
* the dialog's own namespace.
*/
// Base button — every dialog button should extend this
.sp-btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--sp-btn-gap, 6px);
padding: var(--sp-btn-padding, 7px 14px);
font-family: var(--font-primary, ui-sans-serif, system-ui, sans-serif);
font-size: var(--sp-btn-font-size, 12px);
font-weight: 600;
border: 1px solid transparent;
border-radius: var(--sp-btn-radius, 5px);
cursor: pointer;
transition: background 0.15s, border-color 0.15s, color 0.15s, opacity 0.15s;
line-height: 1.2;
user-select: none;
i { font-size: 0.9em; pointer-events: none; }
&:disabled {
opacity: 0.45;
cursor: not-allowed;
pointer-events: none;
}
// Primary action — green accent
&--primary {
background: var(--sp-btn-primary-bg, var(--sp-accent));
color: var(--sp-btn-primary-text, #fff);
letter-spacing: 0.02em;
&:hover:not(:disabled) {
background: var(--sp-btn-primary-hover, var(--sp-accent-hover));
color: var(--sp-btn-primary-text, #fff);
}
&:active:not(:disabled) {
background: var(--sp-btn-primary-active, var(--sp-accent-active));
}
}
// Secondary — subtle, neutral
&--secondary {
background: var(--sp-btn-secondary-bg, rgba(255,255,255,0.05));
color: var(--sp-btn-secondary-text, var(--sp-text-secondary));
border-color: var(--sp-btn-secondary-border, rgba(255,255,255,0.12));
font-weight: 500;
&:hover:not(:disabled) {
background: var(--sp-btn-secondary-hover-bg, rgba(255,255,255,0.1));
color: var(--sp-btn-secondary-hover-text, var(--sp-text-primary));
}
}
// Danger — red
&--danger {
background: var(--sp-btn-danger-bg, var(--sp-color-red));
color: var(--sp-btn-danger-text, #fff);
&:hover:not(:disabled) {
background: var(--sp-btn-danger-hover, var(--sp-color-red-dark));
}
}
// Sizes
&--sm {
padding: var(--sp-btn-padding-sm, 4px 10px);
font-size: var(--sp-btn-font-size-sm, 11px);
}
&--lg {
padding: var(--sp-btn-padding-lg, 9px 18px);
font-size: var(--sp-btn-font-size-lg, 13px);
}
// Icon-only
&--icon {
width: 28px;
height: 28px;
padding: 0;
font-size: 13px;
justify-content: center;
}
}
+3 -3
View File
@@ -94,13 +94,13 @@
// Hover state
&:hover {
background-color: rgba(0, 0, 0, 0.1);
color: var(--sp-accent-emphasis, var(--sp-accent));
background-color: rgba(255, 255, 255, 0.06);
color: var(--sp-accent-hover);
}
// Active state
&:active {
background-color: rgba(0, 0, 0, 0.2);
background-color: rgba(255, 255, 255, 0.1);
}
// Focus state
+228 -62
View File
@@ -10,14 +10,13 @@
// via DEFAULT_OPTIONS.classes. The content section and footer live inside PARTS.
.scrying-pool.directors-board {
background: linear-gradient(175deg, hsl(220, 18%, 13%) 0%, hsl(220, 15%, 10%) 100%);
background: var(--sp-dialog-bg);
color: var(--sp-text-primary);
border: 1px solid rgba(255, 255, 255, 0.08);
border-top: 2px solid hsl(200, 55%, 40%);
border-radius: 8px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.55), 0 2px 8px rgba(0, 0, 0, 0.35),
inset 0 1px 0 rgba(255, 255, 255, 0.04);
border: var(--sp-dialog-border);
border-top: 2px solid var(--sp-accent);
border-radius: var(--sp-dialog-radius);
box-shadow: var(--sp-dialog-shadow);
/* Ensure Director's Board appears above the video strip */
z-index: 100;
@@ -40,13 +39,13 @@
align-items: center;
justify-content: center;
cursor: grab;
color: var(--sp-text-muted, hsl(0, 0%, 70%));
color: var(--sp-text-muted);
opacity: 0.35;
font-size: 10px;
flex-shrink: 0;
transition: opacity 0.15s, background 0.15s;
user-select: none;
border-radius: 8px 8px 0 0;
border-radius: var(--sp-dialog-radius) var(--sp-dialog-radius) 0 0;
&:hover { opacity: 0.8; background: rgba(255, 255, 255, 0.03); }
&:active { cursor: grabbing; opacity: 1; }
@@ -67,7 +66,7 @@
background: transparent;
color: var(--sp-text-muted);
border: none;
border-radius: var(--sp-radius-sm, 3px);
border-radius: var(--sp-radius-sm);
cursor: pointer;
opacity: 0.5;
transition: opacity 0.15s, background 0.15s, color 0.15s;
@@ -107,7 +106,7 @@
display: flex;
align-items: center;
gap: 4px;
padding: 4px 8px;
padding: 5px 8px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
flex-shrink: 0;
flex-wrap: wrap;
@@ -117,31 +116,43 @@
.directors-board__bulk-btn {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 11px;
background: rgba(74, 111, 156, 0.7);
color: #e8edf2;
border: 1px solid rgba(74, 111, 156, 0.4);
border-radius: 3px;
padding: 3px 8px;
gap: var(--sp-btn-gap, 6px);
padding: var(--sp-btn-padding-sm, 4px 10px);
font-size: var(--sp-btn-font-size-sm, 11px);
font-weight: 600;
border-radius: var(--sp-btn-radius, 5px);
cursor: pointer;
transition: background 0.15s, opacity 0.15s;
transition: background 0.15s, border-color 0.15s, color 0.15s;
line-height: 1.2;
border: 1px solid transparent;
i { font-size: 10px; }
i { font-size: 10px; pointer-events: none; }
&:hover { background: rgba(74, 111, 156, 0.95); }
// Primary (show/hide) — green
background: rgba(74, 158, 107, 0.75);
color: #e8f0ea;
border-color: rgba(74, 158, 107, 0.4);
&:hover { background: rgba(74, 158, 107, 0.95); }
&:active { opacity: 0.8; }
// Undo — neutral
&--undo {
background: transparent;
color: var(--sp-text-muted);
border: 1px solid rgba(255, 255, 255, 0.12);
background: var(--sp-btn-secondary-bg, rgba(255,255,255,0.05));
color: var(--sp-btn-secondary-text, var(--sp-text-secondary));
border-color: var(--sp-btn-secondary-border, rgba(255,255,255,0.12));
font-weight: 500;
&:hover { color: var(--sp-text-primary, #dde2e8); border-color: rgba(255,255,255,0.25); background: rgba(255,255,255,0.05); }
&:hover {
background: var(--sp-btn-secondary-hover-bg, rgba(255,255,255,0.1));
color: var(--sp-btn-secondary-hover-text, var(--sp-text-primary));
border-color: rgba(255, 255, 255, 0.25);
}
}
// Restore spotlight — purple (distinct semantic)
&--restore {
background: rgba(123, 79, 166, 0.7);
background: rgba(123, 79, 166, 0.75);
border-color: rgba(123, 79, 166, 0.4);
&:hover { background: rgba(123, 79, 166, 0.95); }
}
@@ -150,8 +161,8 @@
// ── Help / shortcut-panel button ───────────────────────────────────────────
.directors-board__help-btn {
margin-left: auto;
width: 20px;
height: 20px;
width: 22px;
height: 22px;
border-radius: 50%;
border: 1px solid rgba(255, 255, 255, 0.15);
background: transparent;
@@ -164,31 +175,36 @@
display: flex;
align-items: center;
justify-content: center;
transition: background 0.15s, color 0.15s, border-color 0.15s;
&:hover { background: rgba(74, 111, 156, 0.8); color: #fff; border-color: transparent; }
&:hover {
background: rgba(74, 158, 107, 0.8);
color: #fff;
border-color: transparent;
}
}
// ── Footer (preset actions) ────────────────────────────────────────────────
.directors-board__footer {
display: flex;
flex-direction: column;
gap: 3px;
padding: 5px 8px 6px;
gap: 4px;
padding: 6px 8px 8px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
flex-shrink: 0;
background: rgba(0, 0, 0, 0.2);
border-radius: 0 0 8px 8px;
border-radius: 0 0 var(--sp-dialog-radius) var(--sp-dialog-radius);
}
.directors-board__footer-group {
display: flex;
align-items: center;
gap: 3px;
gap: 4px;
&--presets { flex-wrap: wrap; }
&--controls {
padding-top: 3px;
padding-top: 4px;
border-top: 1px solid rgba(255, 255, 255, 0.05);
}
}
@@ -206,21 +222,26 @@
display: inline-flex;
align-items: center;
justify-content: center;
gap: 4px;
font-size: 10px;
background: rgba(74, 111, 156, 0.65);
color: #d8e4f0;
border: 1px solid rgba(74, 111, 156, 0.35);
border-radius: 3px;
padding: 4px 6px;
gap: var(--sp-btn-gap, 6px);
padding: var(--sp-btn-padding-sm, 4px 10px);
font-size: var(--sp-btn-font-size-sm, 11px);
font-weight: 600;
border-radius: var(--sp-btn-radius, 5px);
cursor: pointer;
transition: background 0.15s, opacity 0.15s;
transition: background 0.15s, border-color 0.15s, color 0.15s;
white-space: nowrap;
line-height: 1.2;
border: 1px solid transparent;
i { font-size: 0.9em; }
i { font-size: 0.9em; pointer-events: none; }
&:hover { background: rgba(74, 111, 156, 0.9); }
&:active { opacity: 0.75; }
// Default — green primary
background: rgba(74, 158, 107, 0.7);
color: #e8f0ea;
border-color: rgba(74, 158, 107, 0.35);
&:hover { background: rgba(74, 158, 107, 0.9); color: #fff; }
&:active { opacity: 0.8; }
&[disabled] {
cursor: not-allowed;
@@ -230,39 +251,57 @@
border: 1px solid rgba(255, 255, 255, 0.08);
}
// Secondary — neutral
&--secondary {
background: rgba(255, 255, 255, 0.05);
color: var(--sp-text-secondary, #9aa4b0);
border: 1px solid rgba(255, 255, 255, 0.08);
&:hover { background: rgba(255, 255, 255, 0.1); color: #dde2e8; }
background: var(--sp-btn-secondary-bg, rgba(255,255,255,0.05));
color: var(--sp-btn-secondary-text, var(--sp-text-secondary));
border-color: var(--sp-btn-secondary-border, rgba(255,255,255,0.12));
font-weight: 500;
&:hover {
background: var(--sp-btn-secondary-hover-bg, rgba(255,255,255,0.1));
color: var(--sp-btn-secondary-hover-text, var(--sp-text-primary));
}
}
// Auto-apply toggle — neutral (same as secondary)
&--auto-apply {
background: rgba(255, 255, 255, 0.05);
color: var(--sp-text-secondary, #9aa4b0);
border: 1px solid rgba(255, 255, 255, 0.08);
&:hover { background: rgba(255, 255, 255, 0.1); color: #dde2e8; }
background: var(--sp-btn-secondary-bg, rgba(255,255,255,0.05));
color: var(--sp-btn-secondary-text, var(--sp-text-secondary));
border-color: var(--sp-btn-secondary-border, rgba(255,255,255,0.12));
font-weight: 500;
&:hover {
background: var(--sp-btn-secondary-hover-bg, rgba(255,255,255,0.1));
color: var(--sp-btn-secondary-hover-text, var(--sp-text-primary));
}
}
// AV mode — neutral-muted
&--av {
background: rgba(30, 35, 45, 0.8);
border: 1px solid rgba(255, 255, 255, 0.1);
color: var(--sp-text-muted, #aaa);
color: var(--sp-text-muted);
font-weight: 500;
&:hover { background: rgba(50, 55, 70, 0.9); }
}
// AV mode active — red tone
&--av-active {
background: rgba(90, 42, 42, 0.85);
border-color: rgba(160, 64, 64, 0.6);
color: #f0a0a0;
font-weight: 500;
&:hover { background: rgba(110, 50, 50, 0.95); }
}
// AV config — icon-only
&--av-config {
background: rgba(30, 35, 45, 0.8);
border: 1px solid rgba(255, 255, 255, 0.1);
color: var(--sp-text-muted, #aaa);
color: var(--sp-text-muted);
flex: 0 0 auto;
font-weight: 500;
&:hover { background: rgba(50, 55, 70, 0.9); }
}
}
@@ -280,7 +319,7 @@
.directors-board__dock-layout-label {
font-size: 10px;
color: var(--sp-text-muted, hsl(0, 0%, 60%));
color: var(--sp-text-muted);
text-transform: uppercase;
letter-spacing: 0.04em;
flex-shrink: 0;
@@ -312,9 +351,9 @@
gap: 1px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 3px;
border-radius: var(--sp-btn-radius, 5px);
cursor: pointer;
color: var(--sp-text-muted, hsl(0, 0%, 65%));
color: var(--sp-text-muted);
padding: 0;
transition: background 0.15s, border-color 0.15s, color 0.15s;
@@ -322,14 +361,14 @@
&:hover {
background: rgba(255, 255, 255, 0.1);
color: var(--sp-text-primary, #dde2e8);
color: var(--sp-text-primary);
border-color: rgba(255, 255, 255, 0.2);
}
&.is-active {
background: hsl(200, 50%, 25%);
border-color: hsl(200, 55%, 45%);
color: hsl(200, 80%, 75%);
background: rgba(74, 158, 107, 0.2);
border-color: var(--sp-accent);
color: var(--sp-accent);
}
}
@@ -340,4 +379,131 @@
letter-spacing: 0.02em;
pointer-events: none;
}
// ── Tile shape selector bar ──────────────────────────────────────────────
.directors-board__tile-shape-bar {
display: flex;
align-items: center;
gap: 6px;
padding: 5px 8px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
flex-shrink: 0;
background: rgba(0, 0, 0, 0.12);
}
.directors-board__tile-shape-label {
font-size: 10px;
color: var(--sp-text-muted);
text-transform: uppercase;
letter-spacing: 0.04em;
flex-shrink: 0;
margin-right: 2px;
}
.directors-board__tile-shape-group {
display: flex;
align-items: center;
gap: 2px;
}
.directors-board__tile-border-bar {
display: flex;
align-items: center;
gap: 6px;
padding: 5px 8px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
flex-shrink: 0;
background: rgba(0, 0, 0, 0.12);
}
.directors-board__tile-border-label {
font-size: 10px;
color: var(--sp-text-muted);
text-transform: uppercase;
letter-spacing: 0.04em;
flex-shrink: 0;
margin-right: 2px;
}
.directors-board__tile-border-group {
display: flex;
align-items: center;
gap: 2px;
}
.directors-board__tile-border-btn {
height: 24px;
min-width: 34px;
display: flex;
align-items: center;
justify-content: center;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: var(--sp-btn-radius, 5px);
cursor: pointer;
color: var(--sp-text-secondary, #7a8390);
font-size: 10px;
padding: 0 6px;
transition: background 0.15s, color 0.15s, border-color 0.15s;
&.is-active {
background: hsla(200, 70%, 55%, 0.2);
border-color: hsla(200, 70%, 55%, 0.6);
color: var(--sp-text-primary, #dde2e8);
}
&:hover:not(.is-active) {
background: rgba(255, 255, 255, 0.08);
color: var(--sp-text-primary, #dde2e8);
}
}
.directors-board__tile-border-color {
width: 24px;
height: 24px;
padding: 0;
border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: var(--sp-btn-radius, 5px);
cursor: pointer;
background: none;
flex-shrink: 0;
&::-webkit-color-swatch-wrapper {
padding: 2px;
}
&::-webkit-color-swatch {
border: none;
border-radius: 3px;
}
}
.directors-board__tile-shape-btn {
width: 28px;
height: 28px;
display: flex;
align-items: center;
justify-content: center;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: var(--sp-btn-radius, 5px);
cursor: pointer;
color: var(--sp-text-muted);
padding: 0;
transition: background 0.15s, border-color 0.15s, color 0.15s;
i { font-size: 11px; pointer-events: none; }
&:hover {
background: rgba(255, 255, 255, 0.1);
color: var(--sp-text-primary);
border-color: rgba(255, 255, 255, 0.2);
}
&.is-active {
background: rgba(74, 158, 107, 0.2);
border-color: var(--sp-accent);
color: var(--sp-accent);
}
}
}
+23
View File
@@ -130,6 +130,29 @@
}
}
// ── Shape variants (applied via .sp-shape-* on .participant-card) ─────────
.scrying-pool .participant-card {
&.sp-shape-rounded {
--sp-shape-clip: inset(0 round 6px);
}
&.sp-shape-circle {
--sp-shape-clip: circle(50%);
}
&.sp-shape-hexagon {
--sp-shape-clip: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);
}
&.sp-shape-octagon {
--sp-shape-clip: polygon(29% 0%, 71% 0%, 100% 29%, 100% 71%, 71% 100%, 29% 100%, 0% 71%, 0% 29%);
}
.participant-card__avatar img {
clip-path: var(--sp-shape-clip, none);
}
}
// ── Reduced motion ────────────────────────────────────────────────────────
@media (prefers-reduced-motion: reduce) {
.scrying-pool .participant-card {
+61 -34
View File
@@ -11,9 +11,13 @@
.scrying-pool {
// Dialog root element
&.player-privacy-panel {
background: var(--sp-surface);
background: var(--sp-dialog-bg);
color: var(--sp-text-primary);
font-family: var(--font-primary, inherit);
border: var(--sp-dialog-border);
border-top: 2px solid var(--sp-accent);
border-radius: var(--sp-dialog-radius);
box-shadow: var(--sp-dialog-shadow);
}
// Container
@@ -43,9 +47,9 @@
}
.player-privacy-panel__notice--readonly {
background: hsla(48, 88%, 55%, 0.10);
color: hsl(48, 88%, 60%);
border: 1px solid hsla(48, 88%, 55%, 0.25);
background: var(--sp-color-yellow-subtle);
color: var(--sp-color-yellow);
border: 1px solid var(--sp-color-yellow-subtle);
}
// Section
@@ -82,13 +86,13 @@
// Individual effect card
.player-privacy-panel__effect {
padding: 8px 10px;
border: 1px solid var(--sp-border);
border-radius: 5px;
background: linear-gradient(135deg, hsl(215,25%,11%) 0%, hsl(215,22%,9%) 100%);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: var(--sp-btn-radius, 5px);
background: rgba(0, 0, 0, 0.15);
transition: border-color 120ms ease;
&:hover {
border-color: var(--sp-border-hover, rgba(255,255,255,0.15));
border-color: rgba(255, 255, 255, 0.2);
}
}
@@ -173,11 +177,11 @@
i { font-size: 9px; opacity: 0.7; }
// Enabled state
// Enabled state — using accent green from SP tokens
.player-privacy-panel__toggle-input:checked + & {
background: rgba(46, 160, 67, 0.18);
color: hsl(134, 61%, 60%);
border-color: rgba(46, 160, 67, 0.4);
background: var(--sp-color-green-subtle);
color: var(--sp-color-green);
border-color: color-mix(in srgb, var(--sp-accent) 40%, transparent);
i { opacity: 1; }
}
@@ -188,7 +192,7 @@
}
.player-privacy-panel__toggle-input:checked + &:hover,
.player-privacy-panel__toggle-label:hover .player-privacy-panel__toggle-input:checked + & {
background: rgba(46, 160, 67, 0.25);
background: color-mix(in srgb, var(--sp-accent) 25%, transparent);
}
}
@@ -203,10 +207,10 @@
flex-shrink: 0;
width: 80px;
height: 80px;
border: 2px solid var(--sp-border);
border: 2px solid rgba(255, 255, 255, 0.12);
border-radius: 6px;
overflow: hidden;
background: hsl(215,25%,11%);
background: rgba(0, 0, 0, 0.2);
display: flex;
align-items: center;
justify-content: center;
@@ -227,19 +231,45 @@
.player-privacy-panel__portrait-choose,
.player-privacy-panel__portrait-remove {
font-size: 12px;
padding: 5px 10px;
font-size: var(--sp-btn-font-size, 12px);
padding: var(--sp-btn-padding-sm, 5px 10px);
display: inline-flex;
align-items: center;
gap: 5px;
gap: var(--sp-btn-gap, 6px);
border: 1px solid transparent;
border-radius: var(--sp-btn-radius, 5px);
cursor: pointer;
font-weight: 600;
transition: background 0.15s, border-color 0.15s, color 0.15s;
line-height: 1.2;
}
.player-privacy-panel__portrait-choose {
background: var(--sp-btn-primary-bg, var(--sp-accent));
color: var(--sp-btn-primary-text, #fff);
&:hover { background: var(--sp-btn-primary-hover, var(--sp-accent-hover)); }
}
.player-privacy-panel__portrait-remove {
background: var(--sp-btn-secondary-bg, rgba(255,255,255,0.05));
color: var(--sp-btn-secondary-text, var(--sp-text-secondary));
border-color: var(--sp-btn-secondary-border, rgba(255,255,255,0.12));
font-weight: 500;
&:hover {
background: var(--sp-btn-secondary-hover-bg, rgba(255,255,255,0.1));
color: var(--sp-btn-secondary-hover-text, var(--sp-text-primary));
}
}
// GM Privacy Selector dialog
&.gm-privacy-selector-dialog {
background: var(--sp-surface);
border: 1px solid var(--sp-border);
border-radius: 6px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.6);
background: var(--sp-dialog-bg);
border: var(--sp-dialog-border);
border-top: 2px solid var(--sp-accent);
border-radius: var(--sp-dialog-radius);
box-shadow: var(--sp-dialog-shadow);
min-width: 320px;
max-width: 480px;
overflow: hidden;
@@ -248,7 +278,6 @@
.sp-gm-privacy-selector {
display: flex;
flex-direction: column;
background: var(--sp-surface);
}
.sp-dialog-header {
@@ -256,8 +285,8 @@
align-items: center;
justify-content: space-between;
padding: 10px 14px;
border-bottom: 1px solid var(--sp-border);
background: var(--sp-surface-raised);
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(0, 0, 0, 0.15);
h2 {
margin: 0;
@@ -292,8 +321,7 @@
margin: 0;
font-size: 12px;
color: var(--sp-text-secondary);
background: var(--sp-surface);
border-bottom: 1px solid var(--sp-border);
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.sp-user-list {
@@ -301,7 +329,6 @@
flex-direction: column;
padding: 8px;
gap: 4px;
background: var(--sp-surface);
}
.sp-user-item {
@@ -309,14 +336,14 @@
align-items: center;
justify-content: space-between;
padding: 7px 12px;
border: 1px solid var(--sp-border);
border-radius: 4px;
background: linear-gradient(135deg, hsl(215,25%,11%) 0%, hsl(215,22%,9%) 100%);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: var(--sp-btn-radius, 5px);
background: rgba(0, 0, 0, 0.15);
cursor: pointer;
transition: background 120ms ease, border-color 120ms ease;
&:hover {
background: hsl(215,25%,14%);
background: rgba(0, 0, 0, 0.25);
border-color: var(--sp-accent);
}
}
@@ -332,9 +359,9 @@
font-size: 11px;
color: var(--sp-text-secondary);
padding: 2px 6px;
border: 1px solid var(--sp-border);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 3px;
background: rgba(255,255,255,0.04);
background: rgba(255, 255, 255, 0.04);
text-transform: uppercase;
letter-spacing: 0.03em;
}
+43 -33
View File
@@ -16,8 +16,12 @@
.scrying-pool.dialog.preset-export,
.scrying-pool.dialog.preset-import {
background: var(--sp-surface);
background: var(--sp-dialog-bg);
color: var(--sp-text-primary);
border: var(--sp-dialog-border);
border-top: 2px solid var(--sp-accent);
border-radius: var(--sp-dialog-radius);
box-shadow: var(--sp-dialog-shadow);
.sp-dialog-content {
padding: var(--sp-space-m);
@@ -29,8 +33,9 @@
justify-content: flex-end;
gap: var(--sp-space-xs);
padding: var(--sp-space-m);
border-top: 1px solid var(--sp-border);
background: var(--sp-surface);
border-top: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(0, 0, 0, 0.15);
border-radius: 0 0 var(--sp-dialog-radius) var(--sp-dialog-radius);
}
// Description text
@@ -89,61 +94,66 @@
}
// ---------------------------------------------------------------------------
// Buttons
// Buttons — using shared SP button tokens
// ---------------------------------------------------------------------------
.sp-btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--sp-space-xs);
padding: var(--sp-space-xs) var(--sp-space-m);
border: none;
border-radius: var(--sp-radius-sm);
font-size: var(--sp-font-size-sm);
font-weight: 500;
gap: var(--sp-btn-gap, 6px);
padding: var(--sp-btn-padding, 7px 14px);
border: 1px solid transparent;
border-radius: var(--sp-btn-radius, 5px);
font-size: var(--sp-btn-font-size, 12px);
font-weight: 600;
cursor: pointer;
transition: all 0.15s ease;
transition: background 0.15s, border-color 0.15s, color 0.15s, opacity 0.15s;
line-height: 1.2;
&:disabled {
opacity: 0.5;
opacity: 0.45;
cursor: not-allowed;
pointer-events: none;
}
i {
font-size: 0.9em;
pointer-events: none;
}
}
.sp-btn-primary {
background: var(--sp-accent);
color: var(--sp-accent-text);
background: var(--sp-btn-primary-bg, var(--sp-accent));
color: var(--sp-btn-primary-text, #fff);
&:hover:not(:disabled) {
background: var(--sp-accent-hover);
background: var(--sp-btn-primary-hover, var(--sp-accent-hover));
}
&:active:not(:disabled) {
background: var(--sp-accent-active);
background: var(--sp-btn-primary-active, var(--sp-accent-active));
}
}
.sp-btn-secondary {
background: var(--sp-surface-subtle);
color: var(--sp-text-primary);
border: 1px solid var(--sp-border);
background: var(--sp-btn-secondary-bg, rgba(255,255,255,0.05));
color: var(--sp-btn-secondary-text, var(--sp-text-secondary));
border-color: var(--sp-btn-secondary-border, rgba(255,255,255,0.12));
font-weight: 500;
&:hover:not(:disabled) {
background: var(--sp-surface);
background: var(--sp-btn-secondary-hover-bg, rgba(255,255,255,0.1));
color: var(--sp-btn-secondary-hover-text, var(--sp-text-primary));
}
}
.sp-btn-danger {
background: var(--sp-color-red);
color: white;
background: var(--sp-btn-danger-bg, var(--sp-color-red));
color: var(--sp-btn-danger-text, #fff);
&:hover:not(:disabled) {
background: var(--sp-color-red-dark);
background: var(--sp-btn-danger-hover, var(--sp-color-red-dark));
}
}
@@ -173,17 +183,17 @@
align-items: center;
gap: var(--sp-space-xs);
padding: var(--sp-space-sm) var(--sp-space-m);
background: var(--sp-surface-subtle);
border: 1px dashed var(--sp-border);
border-radius: var(--sp-radius-sm);
background: rgba(255, 255, 255, 0.04);
border: 1px dashed rgba(255, 255, 255, 0.2);
border-radius: var(--sp-btn-radius, 5px);
cursor: pointer;
color: var(--sp-text-secondary);
transition: all 0.15s ease;
transition: background 0.15s, border-color 0.15s, color 0.15s;
&:hover {
border-color: var(--sp-accent);
color: var(--sp-accent);
background: var(--sp-surface);
background: rgba(255, 255, 255, 0.06);
}
i {
@@ -222,12 +232,12 @@
align-items: flex-start;
gap: var(--sp-space-sm);
padding: var(--sp-space-xs) var(--sp-space-sm);
border-radius: var(--sp-radius-sm);
border-radius: var(--sp-btn-radius, 5px);
cursor: pointer;
transition: background 0.15s ease;
&:hover {
background: var(--sp-surface-subtle);
background: rgba(255, 255, 255, 0.04);
}
input[type="radio"] {
@@ -273,9 +283,9 @@
padding: 0;
max-height: 200px;
overflow-y: auto;
border: 1px solid var(--sp-border);
border-radius: var(--sp-radius-sm);
background: var(--sp-surface);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: var(--sp-btn-radius, 5px);
background: rgba(0, 0, 0, 0.2);
}
.sp-preview-item {
+20 -11
View File
@@ -1,6 +1,10 @@
.scrying-pool.preset-load-dialog {
background: var(--sp-surface);
background: var(--sp-dialog-bg);
color: var(--sp-text-primary);
border: var(--sp-dialog-border);
border-top: 2px solid var(--sp-accent);
border-radius: var(--sp-dialog-radius);
box-shadow: var(--sp-dialog-shadow);
// ── Content wrapper ────────────────────────────────────────────────────
.preset-load-dialog__content {
@@ -47,24 +51,26 @@
text-align: left;
font-size: 13px;
padding: 8px 12px;
border-radius: 4px;
border-radius: var(--sp-btn-radius);
cursor: pointer;
transition: background-color 0.15s, border-color 0.15s;
transition: background-color 0.15s, border-color 0.15s, color 0.15s;
display: inline-flex;
align-items: center;
gap: 8px;
line-height: 1.2;
i { font-size: 0.85em; opacity: 0.7; flex-shrink: 0; }
// Load button — styled as a row item, not a loud primary button
// Load button — green accent on hover
&--load {
background: var(--sp-surface-elevated, rgba(255,255,255,0.06));
background: rgba(255, 255, 255, 0.04);
color: var(--sp-text-primary);
border: 1px solid var(--sp-border);
border: 1px solid rgba(255, 255, 255, 0.1);
font-weight: 500;
&:hover {
background: var(--sp-accent, #4a6f9c);
border-color: var(--sp-accent, #4a6f9c);
background: rgba(74, 158, 107, 0.85);
border-color: var(--sp-accent);
color: #fff;
i { opacity: 1; }
}
@@ -75,8 +81,9 @@
&--cancel {
background: transparent;
color: var(--sp-text-muted);
border: 1px solid var(--sp-border);
&:hover { color: var(--sp-text, inherit); border-color: currentColor; }
border: 1px solid rgba(255, 255, 255, 0.1);
font-weight: 500;
&:hover { color: var(--sp-text-primary); border-color: rgba(255,255,255,0.25); background: rgba(255,255,255,0.05); }
}
}
@@ -86,7 +93,9 @@
justify-content: flex-end;
gap: 8px;
padding: 10px 12px;
border-top: 1px solid var(--sp-border);
border-top: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(0, 0, 0, 0.15);
flex-shrink: 0;
border-radius: 0 0 var(--sp-dialog-radius) var(--sp-dialog-radius);
}
}
+28 -27
View File
@@ -6,13 +6,12 @@
@import "../tokens/_base.less";
.scrying-pool.preset-save-dialog {
background: linear-gradient(175deg, hsl(220, 18%, 13%) 0%, hsl(220, 15%, 10%) 100%);
background: var(--sp-dialog-bg);
color: var(--sp-text-primary);
border: 1px solid rgba(255, 255, 255, 0.08);
border: var(--sp-dialog-border);
border-top: 2px solid var(--sp-accent);
border-radius: 8px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.55), 0 2px 8px rgba(0, 0, 0, 0.35),
inset 0 1px 0 rgba(255, 255, 255, 0.04);
border-radius: var(--sp-dialog-radius);
box-shadow: var(--sp-dialog-shadow);
// ── Form wrapper ──────────────────────────────────────────────────────────
.preset-save-dialog__form {
@@ -77,7 +76,7 @@
font-size: 14px;
padding: 9px 12px;
border: 1px solid var(--sp-border);
border-radius: 5px;
border-radius: var(--sp-btn-radius);
background: var(--sp-control-bg, #1a1d20);
color: var(--sp-text-primary);
outline: none;
@@ -103,47 +102,49 @@
align-items: center;
gap: 8px;
padding: 10px 16px;
border-top: 1px solid var(--sp-border);
border-top: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(0, 0, 0, 0.15);
flex-shrink: 0;
border-radius: 0 0 var(--sp-dialog-radius) var(--sp-dialog-radius);
}
// Button styles — using shared SP tokens
.preset-save-dialog__btn {
font-family: var(--font-primary, ui-sans-serif, system-ui, sans-serif);
font-size: 12px;
font-weight: 600;
padding: 7px 14px;
border-radius: 5px;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 6px;
transition: background 0.15s, border-color 0.15s, opacity 0.15s;
gap: var(--sp-btn-gap, 6px);
padding: var(--sp-btn-padding, 7px 14px);
font-family: var(--font-primary, ui-sans-serif, system-ui, sans-serif);
font-size: var(--sp-btn-font-size, 12px);
font-weight: 600;
border: 1px solid transparent;
border-radius: var(--sp-btn-radius, 5px);
cursor: pointer;
transition: background 0.15s, border-color 0.15s, color 0.15s, opacity 0.15s;
line-height: 1.2;
i { font-size: 10px; opacity: 0.85; }
i { font-size: 10px; pointer-events: none; }
&--save {
background: var(--sp-accent);
color: var(--sp-accent-text, #fff);
border: 1px solid transparent;
background: var(--sp-btn-primary-bg, var(--sp-accent));
color: var(--sp-btn-primary-text, #fff);
letter-spacing: 0.02em;
&:hover { background: var(--sp-accent-hover); }
&:active { background: var(--sp-accent-active); }
&:hover { background: var(--sp-btn-primary-hover, var(--sp-accent-hover)); }
&:active { background: var(--sp-btn-primary-active, var(--sp-accent-active)); }
i { opacity: 1; }
}
&--cancel {
background: transparent;
color: var(--sp-text-secondary);
border: 1px solid var(--sp-border);
background: var(--sp-btn-secondary-bg, rgba(255,255,255,0.05));
color: var(--sp-btn-secondary-text, var(--sp-text-secondary));
border-color: var(--sp-btn-secondary-border, rgba(255,255,255,0.12));
font-weight: 500;
&:hover {
color: var(--sp-text-primary);
border-color: rgba(255, 255, 255, 0.2);
background: rgba(255, 255, 255, 0.05);
background: var(--sp-btn-secondary-hover-bg, rgba(255,255,255,0.1));
color: var(--sp-btn-secondary-hover-text, var(--sp-text-primary));
}
}
}
+259 -134
View File
@@ -23,9 +23,17 @@
// WARNING: do NOT add max-width or overflow here; the outer window also carries this class
// and would clip the expanded inner content.
.scrying-pool-strip {
background: var(--sp-bg, hsl(220, 15%, 12%));
background: rgba(0, 0, 0, 0.01);
border-radius: 8px;
transition: background 0.25s ease;
&:hover {
background: rgba(0, 0, 0, 0.3);
}
/* Override FoundryVTT v14's .application min-width: 200px — strip sizing is controlled by JS */
min-width: unset;
/* Ensure strip appears below Director's Board (z-index: 100) */
z-index: 50;
@@ -46,14 +54,10 @@
display: flex;
flex-direction: column;
align-items: center;
max-width: 83px;
max-width: calc(var(--sp-widget-width, 83px) + 11px);
overflow: hidden;
transition: max-width 200ms ease-in-out;
&.is-expanded {
max-width: 240px;
}
// Horizontal and mosaic layouts: width is controlled by JS setPosition
&.sp-layout-horizontal-sm,
&.sp-layout-horizontal-md,
@@ -100,18 +104,16 @@
.scrying-pool.scrying-pool-strip.sp-layout-horizontal-md,
.scrying-pool.scrying-pool-strip.sp-layout-mosaic-md {
.sp-participant-avatar {
width: 150px;
height: 150px;
width: var(--sp-widget-width, 150px);
height: var(--sp-widget-width, 150px);
flex-direction: column;
align-items: center;
padding: 8px 4px 4px;
gap: 4px;
.sp-avatar__img {
width: 91px;
height: 91px;
border-radius: 6px;
flex-shrink: 0;
.sp-avatar__shell {
width: calc(var(--sp-widget-width, 150px) - 59px);
height: calc(var(--sp-widget-width, 150px) - 59px);
}
.sp-avatar__name {
@@ -134,66 +136,63 @@
}
}
// ── Drag grip (top bar, replaces window header drag affordance) ────────────────
.sp-strip__grip {
width: 100%;
height: 16px;
display: flex;
align-items: center;
justify-content: center;
cursor: grab;
color: var(--sp-text, hsl(0, 0%, 80%));
opacity: 0.35;
font-size: 10px;
flex-shrink: 0;
transition: opacity 0.15s;
user-select: none;
&:hover { opacity: 0.75; }
&:active { cursor: grabbing; opacity: 1; }
}
// ── Lightweight close button (replaces window header) ─────────────────────────
.sp-strip__close-btn {
position: absolute;
top: 4px;
right: 4px;
z-index: 10;
width: 18px;
height: 18px;
padding: 0;
line-height: 18px;
font-size: 13px;
font-weight: 400;
background: transparent;
color: var(--sp-text, hsl(0, 0%, 80%));
border: none;
border-radius: 3px;
cursor: pointer;
opacity: 0.45;
transition: opacity 0.15s, background 0.15s;
&:hover {
opacity: 1;
background: rgba(255, 255, 255, 0.1);
// ── Small tile shell sizing (all S layouts) ─────────────────────────────────
// Base .sp-avatar__shell is 60×60 fixed — override to follow --sp-widget-width
.scrying-pool.scrying-pool-strip.sp-layout-vertical-sm,
.scrying-pool.scrying-pool-strip.sp-layout-horizontal-sm,
.scrying-pool.scrying-pool-strip.sp-layout-mosaic-sm {
.sp-participant-avatar .sp-avatar__shell {
width: calc(var(--sp-widget-width) - 12px);
height: calc(var(--sp-widget-width) - 12px);
}
&:active { opacity: 0.75; }
}
// ── Toolbar row: toggle + Director's Board on the same line ───────────────────
// ── Toolbar: grip + toggle + DB + close on one line ─────────────────────────
// All chrome lives here; hidden at rest, revealed on strip hover.
.sp-strip__toolbar {
display: flex;
flex-direction: row;
align-items: center;
width: 100%;
height: 24px;
flex-shrink: 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
opacity: 0;
pointer-events: none;
transition: opacity 0.2s;
.scrying-pool-strip:hover & {
opacity: 1;
pointer-events: auto;
}
}
// Drag grip — compact icon handle
.sp-strip__grip {
width: 20px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
cursor: grab;
color: var(--sp-text, hsl(0, 0%, 80%));
font-size: 10px;
flex-shrink: 0;
user-select: none;
&:active { cursor: grabbing; }
.scrying-pool-strip:hover & {
opacity: 0.45;
&:hover { opacity: 0.75; }
&:active { opacity: 1; }
}
}
// Toggle (expand/collapse)
.sp-strip__toggle {
width: 83px;
min-width: 83px;
height: 28px;
height: 24px;
min-width: 22px;
width: 22px;
display: flex;
align-items: center;
justify-content: center;
@@ -201,34 +200,27 @@
border: none;
cursor: pointer;
color: var(--sp-text, hsl(0, 0%, 80%));
font-size: 11px;
font-size: 10px;
flex-shrink: 0;
opacity: 0.6;
&:hover { opacity: 1; }
}
// ── Director's Board CTA button (shown when sidebar injection not available) ──
// Director's Board CTA button
.sp-strip__directors-board-cta {
flex: 1;
min-width: 0;
height: 28px;
width: 22px;
height: 24px;
display: flex;
align-items: center;
gap: 6px;
padding: 0 8px;
justify-content: center;
flex-shrink: 0;
background: none;
border: none;
border-left: 1px solid rgba(255, 255, 255, 0.06);
cursor: pointer;
color: var(--sp-text-secondary, #7a8390);
font-size: 11px;
text-align: left;
transition: background 0.15s, color 0.15s;
flex-shrink: 0;
i { font-size: 12px; flex-shrink: 0; }
span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
&:hover {
background: rgba(255, 255, 255, 0.06);
@@ -236,6 +228,35 @@
}
}
// Spacer — pushes close button to the right
.sp-strip__toolbar-spacer {
flex: 1;
}
// Close button — in-toolbar, no longer absolutely positioned
.sp-strip__close-btn {
width: 20px;
height: 24px;
padding: 0;
line-height: 24px;
text-align: center;
font-size: 13px;
font-weight: 400;
background: transparent;
color: var(--sp-text, hsl(0, 0%, 80%));
border: none;
cursor: pointer;
flex-shrink: 0;
opacity: 0.45;
transition: opacity 0.2s, background 0.15s;
&:hover {
opacity: 1;
background: rgba(255, 255, 255, 0.1);
}
&:active { opacity: 0.75; }
}
.sp-strip__participants {
list-style: none;
margin: 0;
@@ -255,6 +276,12 @@
color: var(--sp-text-muted, hsl(0, 0%, 60%));
padding: 4px 8px;
margin: 0;
opacity: 0;
transition: opacity 0.2s;
.scrying-pool-strip:hover & {
opacity: 1;
}
}
// ============================================================
@@ -263,7 +290,7 @@
.sp-participant-avatar {
position: relative;
width: 83px;
height: 83px;
height: var(--sp-widget-width, 83px);
display: flex;
align-items: center;
justify-content: flex-start;
@@ -281,52 +308,30 @@
}
.is-expanded & {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 135px; // 16:9 at 240 px strip width
padding: 0;
align-items: flex-end;
background: hsl(220, 15%, 14%);
height: auto;
padding: 5px;
background: transparent;
// Gradient scrim so name text is legible over any video
&::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 48px;
background: linear-gradient(transparent, hsla(0, 0%, 0%, 0.72));
z-index: 2;
pointer-events: none;
border-radius: 0 0 4px 4px;
&:hover {
background: hsl(220, 15%, 14%);
}
.sp-avatar__img {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 1;
width: 48px;
height: 48px;
border-radius: 6px; // card view — rectangular
}
.sp-avatar__name {
position: absolute;
bottom: 20px;
left: 8px;
right: 8px;
z-index: 3;
color: hsl(0, 0%, 95%);
&::after { display: none; }
// Shell: sized to widget width, centered in the card
.sp-avatar__shell {
width: calc(var(--sp-widget-width) - 59px);
height: calc(var(--sp-widget-width) - 59px);
}
// No names displayed in vertical mode
.sp-avatar__name,
.sp-avatar__state-label {
position: absolute;
bottom: 6px;
left: 8px;
z-index: 3;
color: hsla(0, 0%, 85%, 0.85);
display: none;
}
.sp-avatar__corner-badge {
@@ -339,23 +344,86 @@
}
}
// Video container for WebRTC stream (full AV replacement mode)
.sp-participant-video {
// Border shell — no clip-path, no background. Serves only as the positioning
// parent for ::before (border), ::after (state ring), and .sp-avatar__shape (content).
// Border and ring use the SAME clip-path as the shape but are scaled up via
// negative inset, creating a genuine border/ring around the clipped shape.
.sp-avatar__shell {
position: relative;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
// Default sm size — overridden by layout-specific CSS
width: 60px;
height: 60px;
}
// Tile border — ::before with same clip-path as shape, scaled up by border-width.
// Hidden via opacity when --sp-tile-border-active is 0 (border-width = 0)
// so the border background doesn't bleed through transparent avatar areas.
.sp-avatar__shell::before {
content: '';
position: absolute;
inset: 0;
inset: calc(var(--sp-tile-border-width, 0px) * -1);
background: var(--sp-tile-border-color, transparent);
clip-path: var(--sp-shape-clip, none);
opacity: var(--sp-tile-border-active, 1);
z-index: -3;
pointer-events: none;
}
// State ring — ::after with same clip-path, scaled up same as border.
// Uses inset box-shadow so the ring appears INSIDE the clipped area,
// overlaying either the border (via ::before behind) or the avatar content.
// At z-index 1 it renders above .sp-avatar__shape so the ring is visible
// on top of the avatar video/img.
// Gated by --sp-tile-border-active alongside the border ::before so that
// "None" border truly removes ALL colored rings.
.sp-avatar__shell::after {
content: '';
position: absolute;
inset: calc(var(--sp-tile-border-width, 0px) * -1);
background: transparent;
box-shadow: inset 0 0 0 2px transparent;
clip-path: var(--sp-shape-clip, none);
opacity: var(--sp-tile-border-active, 1);
z-index: 1;
pointer-events: none;
transition: box-shadow 200ms ease, opacity 200ms ease;
}
// Shape wrapper inside the shell — carries clip-path for shapes.
.sp-avatar__shape {
position: relative;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
z-index: 1;
clip-path: var(--sp-shape-clip, none);
}
// Inner content (img and video) fill the shape
.sp-avatar__shape .sp-avatar__img,
.sp-avatar__shape .sp-participant-video {
width: 100%;
height: 100%;
}
// Video container for WebRTC stream (full AV replacement mode)
// Regular flow child inside .sp-avatar__shell — contributes to shell sizing
.sp-participant-video {
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
.sp-avatar__img {
width: 60px;
height: 60px;
border-radius: 6px;
object-fit: cover;
flex-shrink: 0;
}
@@ -365,7 +433,6 @@
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 6px;
background: hsl(220, 15%, 18%);
.is-expanded & {
@@ -398,48 +465,79 @@
overflow: hidden;
text-overflow: ellipsis;
color: var(--sp-text, hsl(0, 0%, 85%));
opacity: 0;
transition: opacity 0.2s;
.sp-participant-avatar:hover & {
opacity: 1;
}
}
.sp-avatar__state-label {
font-size: 0.7rem;
color: var(--sp-text-muted, hsl(0, 0%, 60%));
opacity: 0;
transition: opacity 0.2s;
.sp-participant-avatar:hover & {
opacity: 1;
}
}
// ============================================================
// StateRing variants (applied as class on .sp-participant-avatar)
// ============================================================
// State ring via ::after on the shell — uses inset box-shadow so the ring
// follows the same clip-path as the shape, overlaying the border's inner edge.
// When there's no border (width=0), the ring overlays the avatar content edge.
.sp-participant-avatar.sp-state-active,
.sp-participant-avatar.sp-state-self-muted {
--sp-state-color: var(--sp-state-active);
.sp-avatar__img {
box-shadow: 0 0 0 2px var(--sp-state-color);
.sp-avatar__shell::after {
box-shadow: inset 0 0 0 2px var(--sp-state-color);
}
}
.sp-participant-avatar.sp-state-hidden,
.sp-participant-avatar.sp-state-cam-lost {
--sp-state-color: var(--sp-state-hidden);
.sp-avatar__img {
outline: 2px dashed var(--sp-state-color);
outline-offset: 2px;
}
}
.sp-participant-avatar.sp-state-pending {
--sp-state-color: var(--sp-state-pending);
.sp-avatar__img {
box-shadow: 0 0 0 2px var(--sp-state-color);
.sp-avatar__shell::after {
box-shadow: inset 0 0 0 2px var(--sp-state-color);
}
}
// ============================================================
// Spotlight focus state — gold ring (uses urgency-director token)
// ============================================================
.sp-participant-avatar.sp-state-focused {
.sp-avatar__shell::after {
box-shadow: inset 0 0 0 2px var(--sp-urgency-director);
}
}
// ============================================================
// Drag-and-drop reorder feedback
// ============================================================
.sp-strip__participant-item.sp-dragging {
opacity: 0.3;
}
.sp-strip__participant-item.sp-drag-over {
box-shadow: inset 0 0 0 2px var(--sp-urgency-director);
border-radius: 4px;
}
// ============================================================
// StateRing animations — gated under no-preference (AC-16)
// ============================================================
@media (prefers-reduced-motion: no-preference) {
.sp-participant-avatar.sp-state-pending .sp-avatar__img {
.sp-participant-avatar.sp-state-pending .sp-avatar__shell::after {
animation: sp-pulse 2s ease-in-out infinite;
}
@@ -449,13 +547,13 @@
}
// Revert flash (200ms amber, then restore)
.sp-participant-avatar.sp-state-revert .sp-avatar__img {
.sp-participant-avatar.sp-state-revert .sp-avatar__shell::after {
animation: sp-revert-flash 200ms ease-out forwards;
}
@keyframes sp-revert-flash {
0% { box-shadow: 0 0 0 3px var(--sp-urgency-director); }
100% { box-shadow: 0 0 0 2px var(--sp-state-color); }
0% { box-shadow: inset 0 0 0 3px var(--sp-urgency-director); }
100% { box-shadow: inset 0 0 0 2px var(--sp-state-color); }
}
}
@@ -591,3 +689,30 @@
}
}
}
// ============================================================
// Tile shape variants (applied as .sp-shape-* on .sp-participant-avatar)
// ============================================================
// Defines --sp-shape-clip which is consumed by:
// - .sp-avatar__shape (content clip)
// - .sp-avatar__shell::before (border)
// - .sp-avatar__shell::after (state ring)
// All three use the same clip-path, but ::before and ::after are scaled up
// via negative inset to create the border/ring around the clipped shape.
.sp-participant-avatar {
&.sp-shape-rounded {
--sp-shape-clip: inset(0 round 6px);
}
&.sp-shape-circle {
--sp-shape-clip: circle(50%);
}
&.sp-shape-hexagon {
--sp-shape-clip: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);
}
&.sp-shape-octagon {
--sp-shape-clip: polygon(29% 0%, 71% 0%, 100% 29%, 100% 71%, 71% 100%, 29% 100%, 0% 71%, 0% 29%);
}
}
+5 -5
View File
@@ -6,9 +6,9 @@
// Panel container
.directors-board__preset-panel {
background: linear-gradient(160deg, hsl(215,28%,13%) 0%, hsl(215,25%,10%) 100%);
border: 1px solid var(--sp-border);
border-radius: 6px;
background: rgba(0, 0, 0, 0.2);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: var(--sp-dialog-radius);
padding: 10px 12px 12px;
margin-top: 8px;
@@ -116,8 +116,8 @@
.directors-board__preset-panel-select {
flex: 1;
min-width: 0;
background: var(--sp-surface);
border: 1px solid var(--sp-border);
background: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 4px;
padding: 4px 6px;
font-family: inherit;
+651 -306
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -15,6 +15,7 @@
@import "tokens/_focus.less";
// ── Component styles ──────────────────────────────────────────────────────────
@import "components/_buttons.less";
@import "components/_participant-card.less";
@import "components/_roster-strip.less";
@import "components/_directors-board.less";
+37
View File
@@ -54,6 +54,39 @@
--sp-radius-sm: 3px;
--sp-radius-md: 4px;
/* Dialog surface */
--sp-dialog-bg: linear-gradient(175deg, hsl(220, 18%, 13%) 0%, hsl(220, 15%, 10%) 100%);
--sp-dialog-border: 1px solid rgba(255, 255, 255, 0.08);
--sp-dialog-shadow: 0 8px 32px rgba(0, 0, 0, 0.55), 0 2px 8px rgba(0, 0, 0, 0.35),
inset 0 1px 0 rgba(255, 255, 255, 0.04);
--sp-dialog-radius: 8px;
--sp-dialog-grip-color: rgba(255, 255, 255, 0.07);
/* Buttons */
--sp-btn-font-size: 12px;
--sp-btn-font-size-sm: 11px;
--sp-btn-font-size-lg: 13px;
--sp-btn-padding: 7px 14px;
--sp-btn-padding-sm: 4px 10px;
--sp-btn-padding-lg: 9px 18px;
--sp-btn-radius: 5px;
--sp-btn-gap: 6px;
--sp-btn-primary-bg: var(--sp-accent);
--sp-btn-primary-text: #fff;
--sp-btn-primary-hover: var(--sp-accent-hover);
--sp-btn-primary-active: var(--sp-accent-active);
--sp-btn-secondary-bg: rgba(255, 255, 255, 0.05);
--sp-btn-secondary-text: var(--sp-text-secondary);
--sp-btn-secondary-border: rgba(255, 255, 255, 0.12);
--sp-btn-secondary-hover-bg: rgba(255, 255, 255, 0.1);
--sp-btn-secondary-hover-text: var(--sp-text-primary);
--sp-btn-danger-bg: var(--sp-color-red);
--sp-btn-danger-text: #fff;
--sp-btn-danger-hover: var(--sp-color-red-dark);
/* Focus ring — module-wide keyboard navigation anchor */
--sp-focus: var(--sp-theme-focus, var(--color-focus-outline, #63c287));
--sp-focus-ring: 0 0 0 2px var(--sp-focus);
@@ -86,4 +119,8 @@
--sp-theme-control: #1a1d20;
--sp-theme-focus: #63c287;
--sp-theme-urgency: #c8982a;
--sp-btn-primary-bg: var(--sp-theme-accent, #4a9e6b);
--sp-btn-primary-text: #fff;
--sp-btn-primary-hover: var(--sp-theme-accent-hover, #3d8f5e);
--sp-btn-primary-active: var(--sp-theme-accent-active, #2d7a4f);
}
+45 -3
View File
@@ -18,7 +18,7 @@
{{#unless isEmpty}}
{{#each participants}}
{{> "modules/scrying-pool/templates/participant-card.hbs"}}
{{> "modules/scrying-pool/templates/participant-card.hbs" shape=../tileShape}}
{{/each}}
{{else}}
<p class="directors-board__empty" role="listitem">
@@ -78,6 +78,41 @@
</div>
</div>
{{!-- Tile shape selector --}}
<div class="directors-board__tile-shape-bar" role="toolbar" aria-label="Tile shape">
<span class="directors-board__tile-shape-label">Shape</span>
<div class="directors-board__tile-shape-group">
{{#each tileShapes}}
<button type="button"
class="directors-board__tile-shape-btn{{#if isActive}} is-active{{/if}}"
data-action="set-tile-shape"
data-shape="{{key}}"
data-tooltip="{{label}}">
<i class="fas {{icon}}" aria-hidden="true"></i>
</button>
{{/each}}
</div>
</div>
{{!-- Tile border controls --}}
<div class="directors-board__tile-border-bar" role="toolbar" aria-label="Tile border">
<span class="directors-board__tile-border-label">Border</span>
<div class="directors-board__tile-border-group">
{{#each tileBorderWidths}}
<button type="button"
class="directors-board__tile-border-btn{{#if isActive}} is-active{{/if}}"
data-action="set-tile-border-width"
data-width="{{value}}"
data-tooltip="{{label}}">{{label}}</button>
{{/each}}
</div>
<input type="color"
class="directors-board__tile-border-color"
data-action="set-tile-border-color"
value="{{tileBorderColor}}"
data-tooltip="Border color" />
</div>
{{!-- Story 5.2: Video widget width customization --}}
<div class="directors-board__widget-width-bar" role="toolbar" aria-label="{{localize 'scrying-pool.directorsBoard.widgetWidth.label'}}">
<span class="directors-board__widget-width-label">{{localize "scrying-pool.directorsBoard.widgetWidth.label"}}</span>
@@ -85,7 +120,7 @@
<div class="directors-board__widget-width-row">
<span>{{localize "scrying-pool.directorsBoard.widgetWidth.small"}}</span>
<select class="directors-board__widget-width-select" data-action="set-widget-width-sm" data-selected="{{widgetWidthSm}}">
{{#each widthOptions}}
{{#each smWidthOptions}}
<option value="{{this.value}}">{{this.label}}</option>
{{/each}}
</select>
@@ -93,7 +128,7 @@
<div class="directors-board__widget-width-row">
<span>{{localize "scrying-pool.directorsBoard.widgetWidth.large"}}</span>
<select class="directors-board__widget-width-select" data-action="set-widget-width-md" data-selected="{{widgetWidthMd}}">
{{#each widthOptions}}
{{#each mdWidthOptions}}
<option value="{{this.value}}">{{this.label}}</option>
{{/each}}
</select>
@@ -102,6 +137,13 @@
</div>
<footer class="directors-board__footer">
<div class="directors-board__footer-group directors-board__footer-group--strip">
<button type="button" class="directors-board__footer-btn directors-board__footer-btn--secondary" data-action="reset-strip-position"
data-tooltip="{{localize "scrying-pool.directorsBoard.footer.resetStrip"}}">
<i class="fas fa-undo-alt" aria-hidden="true"></i>
{{localize "scrying-pool.directorsBoard.footer.resetStrip"}}
</button>
</div>
<div class="directors-board__footer-group directors-board__footer-group--presets">
<button type="button" class="directors-board__footer-btn" data-action="save-preset"
data-tooltip="{{localize "scrying-pool.directorsBoard.footer.savePreset"}}">
+1 -1
View File
@@ -1,5 +1,5 @@
{{!-- Participant Card — single participant tile in the Director's Board --}}
<div class="scrying-pool participant-card sp-state-{{state}}{{#if hasPendingOp}} sp-state-pending{{/if}}"
<div class="scrying-pool participant-card sp-state-{{state}}{{#if hasPendingOp}} sp-state-pending{{/if}} sp-shape-{{shape}}"
role="listitem"
aria-label="{{cardAriaLabel}}"
data-user-id="{{userId}}"
+26 -23
View File
@@ -3,16 +3,6 @@
role="complementary"
aria-label="Scrying Pool">
{{!-- Drag grip (top bar, replaces window header drag affordance) --}}
<div class="sp-strip__grip" data-action="drag-grip" aria-hidden="true">
<i class="fas fa-grip-lines"></i>
</div>
{{!-- Lightweight close button (top-right corner, replaces window header) --}}
<button class="sp-strip__close-btn" data-action="close-strip"
aria-label="Close Scrying Pool"
data-tooltip="Close">×</button>
{{!-- First-open tip (right-click affordance) --}}
{{#if showFirstOpenTip}}
<p class="sp-strip__first-tip">
@@ -21,8 +11,12 @@
</p>
{{/if}}
{{!-- Toolbar row: toggle + Director's Board side by side --}}
{{!-- Toolbar: grip + toggle + Director's Board + close on one line --}}
<div class="sp-strip__toolbar">
<div class="sp-strip__grip" data-action="drag-grip" aria-hidden="true">
<i class="fas fa-grip-lines"></i>
</div>
<button class="sp-strip__toggle" data-action="toggle-expanded"
aria-label="{{#if isExpanded}}Collapse Scrying Pool{{else}}Expand Scrying Pool{{/if}}"
aria-expanded="{{isExpanded}}"
@@ -33,15 +27,20 @@
{{#if isGM}}
<button class="sp-strip__directors-board-cta" data-action="open-directors-board"
aria-label="Open Director's Board"
data-tooltip="Director's Board">
data-tooltip="{{localize "scrying-pool.directorsBoard.openButton"}}">
<i class="fas fa-border-all" aria-hidden="true"></i>
<span>Director's Board</span>
</button>
{{/if}}
<span class="sp-strip__toolbar-spacer"></span>
<button class="sp-strip__close-btn" data-action="close-strip"
aria-label="Close Scrying Pool"
data-tooltip="Close">×</button>
</div>
{{!-- Participant list --}}
<ul class="sp-strip__participants" role="list" style="--sp-widget-width: {{widgetWidth}}px;">
<ul class="sp-strip__participants" role="list">
{{#if isEmpty}}
{{!-- EmptyStatePanel --}}
<li class="sp-strip__empty-state" role="listitem">
@@ -52,7 +51,7 @@
{{#each participants}}
<li class="sp-strip__participant-item" role="listitem">
{{!-- ParticipantAvatar (44×44px container) --}}
<button class="sp-participant-avatar sp-state-{{state}}{{#if hasPendingOp}} sp-state-pending{{/if}}"
<button class="sp-participant-avatar sp-state-{{state}}{{#if hasPendingOp}} sp-state-pending{{/if}}{{#if isFocused}} sp-state-focused{{/if}} sp-shape-{{../tileShape}}"
data-user-id="{{userId}}"
data-action="open-popover"
role="button"
@@ -60,16 +59,20 @@
data-tooltip="{{name}}{{stateLabel}}"
aria-pressed="false" style="width: {{../widgetWidth}}px; min-width: {{../widgetWidth}}px;">
{{!-- Video container for stream-access mode (full AV replacement) --}}
{{#if hasStreamAccess}}
<div class="sp-participant-video" aria-hidden="true"></div>
{{/if}}
<div class="sp-avatar__shell">
<div class="sp-avatar__shape">
{{!-- Video container for stream-access mode (full AV replacement) --}}
{{#if hasStreamAccess}}
<div class="sp-participant-video" aria-hidden="true"></div>
{{/if}}
{{!-- Avatar image (32px rounded) - shown as fallback when no video --}}
<img class="sp-avatar__img" src="{{avatarSrc}}" alt="" aria-hidden="true" />
{{!-- Avatar image (32px rounded) - shown as fallback when no video --}}
<img class="sp-avatar__img" src="{{avatarSrc}}" alt="" aria-hidden="true" />
{{!-- Corner badge (12px bottom-right) --}}
<span class="sp-avatar__corner-badge" aria-hidden="true"></span>
{{!-- Corner badge (12px bottom-right) --}}
<span class="sp-avatar__corner-badge" aria-hidden="true"></span>
</div>
</div>
{{!-- Expanded view: name + state rows (vertical-md) --}}
{{#if ../isExpanded}}
+12 -16
View File
@@ -315,12 +315,12 @@ describe('ScryingPoolStrip', () => {
});
describe('_computeStripWidth()', () => {
it('returns 85 for vertical-sm', () => {
expect(strip._computeStripWidth('vertical-sm', 3)).toBe(85);
it('returns tileWidth + 11 for vertical-sm', () => {
expect(strip._computeStripWidth('vertical-sm', 3)).toBe(83 + 8 + 3);
});
it('returns 242 for vertical-md', () => {
expect(strip._computeStripWidth('vertical-md', 3)).toBe(242);
it('returns tileWidth + 11 for vertical-md', () => {
expect(strip._computeStripWidth('vertical-md', 3)).toBe(150 + 8 + 3);
});
it('returns 85 for unknown layout', () => {
@@ -465,24 +465,20 @@ describe('ScryingPoolStrip', () => {
vi.stubGlobal('document', originalDocument);
});
it('removes video elements and cleans up streams', () => {
it('removes video elements without stopping tracks', () => {
const mockStream = new MediaStream();
const mockTrack = { stop: vi.fn() };
const mockVideoElement = {
srcObject: mockStream,
remove: vi.fn(),
};
// Add getTracks method to the mock stream
mockStream.getTracks = vi.fn().mockReturnValue([mockTrack]);
vi.stubGlobal('document', {
strip.element = {
querySelectorAll: vi.fn().mockReturnValue([mockVideoElement]),
});
};
strip._cleanupVideoStreams();
expect(mockStream.getTracks).toHaveBeenCalled();
expect(mockTrack.stop).toHaveBeenCalled();
// Tracks are NOT stopped — they belong to FoundryVTT's WebRTC system
expect(mockVideoElement.srcObject).toBe(null);
expect(mockVideoElement.remove).toHaveBeenCalled();
});
@@ -493,18 +489,18 @@ describe('ScryingPoolStrip', () => {
remove: vi.fn(),
};
vi.stubGlobal('document', {
strip.element = {
querySelectorAll: vi.fn().mockReturnValue([mockVideoElement]),
});
};
expect(() => strip._cleanupVideoStreams()).not.toThrow();
expect(mockVideoElement.remove).toHaveBeenCalled();
});
it('handles empty video element list', () => {
vi.stubGlobal('document', {
strip.element = {
querySelectorAll: vi.fn().mockReturnValue([]),
});
};
expect(() => strip._cleanupVideoStreams()).not.toThrow();
});