Story 3.2 done
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
<div class="scrying-pool__confirmation-bar {{variantClass}}"
|
||||
role="status"
|
||||
aria-live="polite"
|
||||
aria-label="{{escapedMessage}}. {{undoLabel}}">
|
||||
<span class="sp-confirmation-bar__message">{{{message}}}</span>
|
||||
<button class="sp-confirmation-bar__undo-btn"
|
||||
role="button"
|
||||
aria-label="{{undoLabel}}"
|
||||
data-action="confirmation-bar-undo">
|
||||
{{{undoLabel}}}
|
||||
</button>
|
||||
</div>
|
||||
@@ -48,4 +48,10 @@
|
||||
<button type="button" class="directors-board__footer-btn" data-action="import-presets">
|
||||
{{localize "video-view-manager.directorsBoard.footer.importPresets"}}
|
||||
</button>
|
||||
<button type="button" class="directors-board__footer-btn" data-action="toggle-preset-panel">
|
||||
{{localize "video-view-manager.directorsBoard.footer.autoApplySettings"}}
|
||||
</button>
|
||||
</footer>
|
||||
|
||||
{{!-- Scene Preset Panel - rendered via JavaScript, not Handlebars --}}
|
||||
{{!-- Panel is appended dynamically in DirectorsBoard._appendPresetPanel() --}}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
{{!-- Load Scene Preset Dialog --}}
|
||||
<div class="preset-load-dialog__content">
|
||||
<header class="preset-load-dialog__header">
|
||||
<h2 class="preset-load-dialog__title">{{title}}</h2>
|
||||
</header>
|
||||
|
||||
<div class="preset-load-dialog__body">
|
||||
{{#if hasPresets}}
|
||||
<ul class="preset-load-dialog__list" role="list">
|
||||
{{#each presets}}
|
||||
<li class="preset-load-dialog__item" role="listitem">
|
||||
<button
|
||||
type="button"
|
||||
class="preset-load-dialog__btn preset-load-dialog__btn--load"
|
||||
data-action="load"
|
||||
data-preset-name="{{name}}"
|
||||
>
|
||||
{{name}}
|
||||
</button>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{else}}
|
||||
<p class="preset-load-dialog__empty" role="status">
|
||||
{{emptyMessage}}
|
||||
</p>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
<footer class="preset-load-dialog__footer">
|
||||
<button type="button" class="preset-load-dialog__btn preset-load-dialog__btn--cancel" data-action="cancel">
|
||||
{{cancelLabel}}
|
||||
</button>
|
||||
</footer>
|
||||
</div>
|
||||
@@ -0,0 +1,34 @@
|
||||
{{!-- Save Scene Preset Dialog --}}
|
||||
<form class="preset-save-dialog__form">
|
||||
<header class="preset-save-dialog__header">
|
||||
<h2 class="preset-save-dialog__title">{{title}}</h2>
|
||||
</header>
|
||||
|
||||
<div class="preset-save-dialog__body">
|
||||
<div class="preset-save-dialog__field">
|
||||
<label class="preset-save-dialog__label" for="presetName">
|
||||
{{nameLabel}}
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
id="presetName"
|
||||
name="presetName"
|
||||
class="preset-save-dialog__input"
|
||||
value="{{defaultName}}"
|
||||
placeholder="{{namePlaceholder}}"
|
||||
aria-label="{{nameLabel}}"
|
||||
autocomplete="off"
|
||||
maxlength="100"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer class="preset-save-dialog__footer">
|
||||
<button type="button" class="preset-save-dialog__btn preset-save-dialog__btn--cancel" data-action="cancel">
|
||||
{{cancelLabel}}
|
||||
</button>
|
||||
<button type="submit" class="preset-save-dialog__btn preset-save-dialog__btn--save">
|
||||
{{saveLabel}}
|
||||
</button>
|
||||
</footer>
|
||||
</form>
|
||||
@@ -1,2 +1,68 @@
|
||||
{{!-- Roster Strip - compact inline visibility strip (outside .scrying-pool root) --}}
|
||||
<div class="scrying-pool roster-strip" role="region" aria-label="Roster Strip" data-component="roster-strip"></div>
|
||||
{{!-- ScryingPoolStrip — floating GM control strip --}}
|
||||
<div class="scrying-pool scrying-pool-strip{{#if isExpanded}} is-expanded{{/if}}"
|
||||
role="complementary"
|
||||
aria-label="Scrying Pool">
|
||||
|
||||
{{!-- First-open tip (right-click affordance) --}}
|
||||
{{#if showFirstOpenTip}}
|
||||
<p class="sp-strip__first-tip">
|
||||
<i class="fas fa-info-circle" aria-hidden="true"></i>
|
||||
Right-click a participant to hide them from the table.
|
||||
</p>
|
||||
{{/if}}
|
||||
|
||||
{{!-- Expand/collapse toggle --}}
|
||||
<button class="sp-strip__toggle" data-action="toggle-expanded"
|
||||
aria-label="{{#if isExpanded}}Collapse Scrying Pool{{else}}Expand Scrying Pool{{/if}}"
|
||||
aria-expanded="{{isExpanded}}">
|
||||
<i class="fas fa-chevron-{{#if isExpanded}}left{{else}}right{{/if}}"></i>
|
||||
</button>
|
||||
|
||||
{{!-- Director's Board CTA button (fallback when sidebar API unavailable) --}}
|
||||
<button class="sp-strip__directors-board-cta" data-action="open-directors-board"
|
||||
aria-label="Open Director's Board">
|
||||
<i class="fas fa-border-all" aria-hidden="true"></i>
|
||||
<span>Director's Board</span>
|
||||
</button>
|
||||
|
||||
{{!-- Participant list --}}
|
||||
<ul class="sp-strip__participants" role="list">
|
||||
{{#if isEmpty}}
|
||||
{{!-- EmptyStatePanel --}}
|
||||
<li class="sp-strip__empty-state" role="listitem">
|
||||
<i class="fas fa-eye sp-empty__icon" aria-hidden="true"></i>
|
||||
<span class="sp-empty__text">No participants yet</span>
|
||||
</li>
|
||||
{{else}}
|
||||
{{#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}}"
|
||||
data-user-id="{{userId}}"
|
||||
data-action="open-popover"
|
||||
role="button"
|
||||
aria-label="{{name}} — {{stateLabel}}"
|
||||
aria-pressed="false">
|
||||
|
||||
{{!-- Avatar image (32px rounded) --}}
|
||||
<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>
|
||||
|
||||
{{!-- Expanded view: name + state rows --}}
|
||||
{{#if ../isExpanded}}
|
||||
<span class="sp-avatar__name">{{name}}</span>
|
||||
<span class="sp-avatar__state-label">{{stateLabel}}</span>
|
||||
{{/if}}
|
||||
</button>
|
||||
</li>
|
||||
{{/each}}
|
||||
{{/if}}
|
||||
</ul>
|
||||
|
||||
{{!-- StripOverlayLayer — owns ActionPopover + ConfirmationBar --}}
|
||||
<div class="sp-strip__overlay-layer"
|
||||
aria-hidden="true"
|
||||
style="position: absolute; inset: 0; pointer-events: none; overflow: visible;"></div>
|
||||
</div>
|
||||
|
||||
@@ -1,2 +1,63 @@
|
||||
{{!-- Scene Preset Panel - preset save-load interface --}}
|
||||
<div class="scrying-pool scene-preset-panel" role="region" aria-label="Scene Preset Panel" data-component="scene-preset-panel"></div>
|
||||
{{!-- Scene Preset Panel - per-scene auto-apply configuration --}}
|
||||
<div class="directors-board__preset-panel-header">
|
||||
<h3 class="directors-board__preset-panel-title">{{localize "video-view-manager.scenePresetPanel.title"}}</h3>
|
||||
</div>
|
||||
|
||||
{{#if hasScene}}
|
||||
<div class="directors-board__preset-panel-body">
|
||||
<div class="directors-board__preset-panel-row">
|
||||
<label class="directors-board__preset-panel-label">
|
||||
<input type="checkbox"
|
||||
class="directors-board__preset-panel-toggle"
|
||||
data-action="toggle-auto-apply"
|
||||
{{#if enabled}}checked{{/if}}
|
||||
role="switch"
|
||||
aria-label="{{localize 'video-view-manager.scenePresetPanel.enableAutoApply'}}">
|
||||
{{localize "video-view-manager.scenePresetPanel.enableAutoApply"}}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="directors-board__preset-panel-row">
|
||||
<label class="directors-board__preset-panel-label">
|
||||
{{localize "video-view-manager.scenePresetPanel.preset"}}
|
||||
<select class="directors-board__preset-panel-select"
|
||||
data-action="select-preset"
|
||||
{{#unless hasPresets}}disabled{{/unless}}
|
||||
aria-label="{{localize 'video-view-manager.scenePresetPanel.selectPreset'}}">
|
||||
<option value="" {{#unless presetName}}selected{{/unless}}>
|
||||
{{localize "video-view-manager.scenePresetPanel.selectPreset"}}
|
||||
</option>
|
||||
{{#each presets}}
|
||||
<option value="{{this.name}}" {{#if (eq this.name ../presetName)}}selected{{/if}}>
|
||||
{{this.name}}
|
||||
</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="directors-board__preset-panel-row">
|
||||
<label class="directors-board__preset-panel-label">
|
||||
{{localize "video-view-manager.scenePresetPanel.preDelay"}}
|
||||
<span class="directors-board__preset-panel-delay-value">{{preDelay}}ms</span>
|
||||
<input type="range"
|
||||
class="directors-board__preset-panel-slider"
|
||||
data-action="change-delay"
|
||||
min="0"
|
||||
max="5000"
|
||||
value="{{preDelay}}"
|
||||
step="100"
|
||||
aria-label="{{localize 'video-view-manager.scenePresetPanel.preDelay'}}"
|
||||
aria-valuemin="0"
|
||||
aria-valuemax="5000"
|
||||
aria-valuenow="{{preDelay}}">
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="directors-board__preset-panel-row directors-board__preset-panel-row--hint">
|
||||
<span>{{localize "video-view-manager.scenePresetPanel.globalSettingsHint"}}</span>
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<p class="directors-board__preset-panel-message">{{localize "video-view-manager.scenePresetPanel.noScene"}}</p>
|
||||
{{/if}}
|
||||
|
||||
Reference in New Issue
Block a user