PlotDirector Phase 18D - Card Action Placement and Final Dashboard Content Polish

This commit is contained in:
Nick Beckley 2026-06-30 20:59:54 +01:00
parent fd27074a37
commit fece540d14
6 changed files with 88 additions and 75 deletions

View File

@ -12,6 +12,21 @@
<p class="eyebrow">People</p>
<h3>Characters and relationships</h3>
</div>
<div class="scene-inspector-v2-actions">
<div class="btn-group scene-inspector-v2-action-menu">
<button type="button" class="btn btn-sm btn-outline-primary" data-scene-editor="characters" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneCharactersEditor", "Scenes", new { sceneId = Model.SceneID })">Edit People</button>
<button type="button" class="btn btn-sm btn-outline-primary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Show people editor actions</span>
</button>
<div class="dropdown-menu dropdown-menu-end">
<button type="button" class="dropdown-item" data-scene-editor="characters" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneCharactersEditor", "Scenes", new { sceneId = Model.SceneID })">Characters</button>
<button type="button" class="dropdown-item" data-scene-editor="attributes" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneCharacterAttributesEditor", "Scenes", new { sceneId = Model.SceneID })">Attributes</button>
<button type="button" class="dropdown-item" data-scene-editor="suggestions" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneSuggestionsEditor", "Scenes", new { sceneId = Model.SceneID })">Suggestions</button>
<button type="button" class="dropdown-item" data-scene-editor="knowledge" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneKnowledgeEditor", "Scenes", new { sceneId = Model.SceneID })">Knowledge</button>
<button type="button" class="dropdown-item" data-scene-editor="relationships" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneRelationshipsEditor", "Scenes", new { sceneId = Model.SceneID })">Relationships</button>
</div>
</div>
</div>
</div>
<div class="scene-inspector-v2-section">
@ -91,20 +106,4 @@
</div>
}
</div>
<div class="scene-inspector-v2-actions">
<div class="btn-group scene-inspector-v2-action-menu">
<button type="button" class="btn btn-sm btn-outline-primary" data-scene-editor="characters" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneCharactersEditor", "Scenes", new { sceneId = Model.SceneID })">Edit People</button>
<button type="button" class="btn btn-sm btn-outline-primary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Show people editor actions</span>
</button>
<div class="dropdown-menu dropdown-menu-end">
<button type="button" class="dropdown-item" data-scene-editor="characters" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneCharactersEditor", "Scenes", new { sceneId = Model.SceneID })">Characters</button>
<button type="button" class="dropdown-item" data-scene-editor="attributes" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneCharacterAttributesEditor", "Scenes", new { sceneId = Model.SceneID })">Attributes</button>
<button type="button" class="dropdown-item" data-scene-editor="suggestions" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneSuggestionsEditor", "Scenes", new { sceneId = Model.SceneID })">Suggestions</button>
<button type="button" class="dropdown-item" data-scene-editor="knowledge" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneKnowledgeEditor", "Scenes", new { sceneId = Model.SceneID })">Knowledge</button>
<button type="button" class="dropdown-item" data-scene-editor="relationships" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneRelationshipsEditor", "Scenes", new { sceneId = Model.SceneID })">Relationships</button>
</div>
</div>
</div>
</article>

View File

@ -14,6 +14,20 @@
<p class="eyebrow">Story</p>
<h3>Purpose and structure</h3>
</div>
<div class="scene-inspector-v2-actions">
<div class="btn-group scene-inspector-v2-action-menu">
<button type="button" class="btn btn-sm btn-outline-primary" data-scene-editor="purpose" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("ScenePurposeEditor", "Scenes", new { sceneId = Model.SceneID })">Edit Story</button>
<button type="button" class="btn btn-sm btn-outline-primary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Show story editor actions</span>
</button>
<div class="dropdown-menu dropdown-menu-end">
<button type="button" class="dropdown-item" data-scene-editor="purpose" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("ScenePurposeEditor", "Scenes", new { sceneId = Model.SceneID })">Purpose</button>
<button type="button" class="dropdown-item" data-scene-editor="metrics" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneMetricsEditor", "Scenes", new { sceneId = Model.SceneID })">Metrics</button>
<button type="button" class="dropdown-item" data-scene-editor="threads" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneThreadsEditor", "Scenes", new { sceneId = Model.SceneID })">Threads</button>
<button type="button" class="dropdown-item" data-scene-editor="dependencies" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneDependenciesEditor", "Scenes", new { sceneId = Model.SceneID })">Dependencies</button>
</div>
</div>
</div>
</div>
<div class="scene-inspector-v2-section">
@ -83,19 +97,4 @@
</div>
}
</div>
<div class="scene-inspector-v2-actions">
<div class="btn-group scene-inspector-v2-action-menu">
<button type="button" class="btn btn-sm btn-outline-primary" data-scene-editor="purpose" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("ScenePurposeEditor", "Scenes", new { sceneId = Model.SceneID })">Edit Story</button>
<button type="button" class="btn btn-sm btn-outline-primary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Show story editor actions</span>
</button>
<div class="dropdown-menu dropdown-menu-end">
<button type="button" class="dropdown-item" data-scene-editor="purpose" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("ScenePurposeEditor", "Scenes", new { sceneId = Model.SceneID })">Purpose</button>
<button type="button" class="dropdown-item" data-scene-editor="metrics" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneMetricsEditor", "Scenes", new { sceneId = Model.SceneID })">Metrics</button>
<button type="button" class="dropdown-item" data-scene-editor="threads" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneThreadsEditor", "Scenes", new { sceneId = Model.SceneID })">Threads</button>
<button type="button" class="dropdown-item" data-scene-editor="dependencies" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneDependenciesEditor", "Scenes", new { sceneId = Model.SceneID })">Dependencies</button>
</div>
</div>
</div>
</article>

View File

@ -16,6 +16,19 @@
<p class="eyebrow">World</p>
<h3>Locations and assets</h3>
</div>
<div class="scene-inspector-v2-actions">
<div class="btn-group scene-inspector-v2-action-menu">
<button type="button" class="btn btn-sm btn-outline-primary" data-scene-editor="locations" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneLocationsEditor", "Scenes", new { sceneId = Model.SceneID })">Edit World</button>
<button type="button" class="btn btn-sm btn-outline-primary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Show world editor actions</span>
</button>
<div class="dropdown-menu dropdown-menu-end">
<button type="button" class="dropdown-item" data-scene-editor="locations" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneLocationsEditor", "Scenes", new { sceneId = Model.SceneID })">Locations</button>
<button type="button" class="dropdown-item" data-scene-editor="assets" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneAssetsEditor", "Scenes", new { sceneId = Model.SceneID })">Assets</button>
<button type="button" class="dropdown-item" data-scene-editor="custody" data-scene-id="@Model.SceneID">Custody</button>
</div>
</div>
</div>
</div>
<div class="scene-inspector-v2-section">
@ -52,32 +65,12 @@
}
</div>
<div class="scene-inspector-v2-counts">
<div>
<span>Asset events</span>
<strong>@Model.AssetEvents.Count</strong>
</div>
<div>
<span>Custody entries</span>
<strong>@Model.AssetCustodyEvents.Count</strong>
</div>
<div>
<span>Placed assets</span>
<strong>@Model.SceneAssetLocations.Count</strong>
</div>
</div>
<div class="scene-inspector-v2-actions">
<div class="btn-group scene-inspector-v2-action-menu">
<button type="button" class="btn btn-sm btn-outline-primary" data-scene-editor="locations" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneLocationsEditor", "Scenes", new { sceneId = Model.SceneID })">Edit World</button>
<button type="button" class="btn btn-sm btn-outline-primary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Show world editor actions</span>
</button>
<div class="dropdown-menu dropdown-menu-end">
<button type="button" class="dropdown-item" data-scene-editor="locations" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneLocationsEditor", "Scenes", new { sceneId = Model.SceneID })">Locations</button>
<button type="button" class="dropdown-item" data-scene-editor="assets" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneAssetsEditor", "Scenes", new { sceneId = Model.SceneID })">Assets</button>
<button type="button" class="dropdown-item" data-scene-editor="custody" data-scene-id="@Model.SceneID">Custody</button>
</div>
</div>
</div>
@if (Model.AssetEvents.Any() || Model.AssetCustodyEvents.Any() || Model.SceneAssetLocations.Any())
{
<p class="muted">
@Model.AssetEvents.Count asset event@(Model.AssetEvents.Count == 1 ? "" : "s"),
@Model.AssetCustodyEvents.Count custody entr@(Model.AssetCustodyEvents.Count == 1 ? "y" : "ies"),
@Model.SceneAssetLocations.Count placed asset@(Model.SceneAssetLocations.Count == 1 ? "" : "s").
</p>
}
</article>

View File

@ -28,6 +28,20 @@
<p class="eyebrow">Writer</p>
<h3>Drafting support</h3>
</div>
<div class="scene-inspector-v2-actions">
<div class="btn-group scene-inspector-v2-action-menu">
<button type="button" class="btn btn-sm btn-outline-primary" data-scene-editor="notes" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneNotesEditor", "Scenes", new { sceneId = Model.SceneID })">Edit Writer</button>
<button type="button" class="btn btn-sm btn-outline-primary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Show writer editor actions</span>
</button>
<div class="dropdown-menu dropdown-menu-end">
<button type="button" class="dropdown-item" data-scene-editor="notes" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneNotesEditor", "Scenes", new { sceneId = Model.SceneID })">Notes</button>
<button type="button" class="dropdown-item" data-scene-editor="checklist" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneChecklistEditor", "Scenes", new { sceneId = Model.SceneID })">Checklist</button>
<button type="button" class="dropdown-item" data-scene-editor="workflow" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneWorkflowEditor", "Scenes", new { sceneId = Model.SceneID })">Workflow</button>
<button type="button" class="dropdown-item" data-scene-editor="attachments" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneAttachmentsEditor", "Scenes", new { sceneId = Model.SceneID })">Attachments</button>
</div>
</div>
</div>
</div>
@if (Model.Workflow.IsBlocked)
@ -109,19 +123,4 @@
}
</div>
</div>
<div class="scene-inspector-v2-actions">
<div class="btn-group scene-inspector-v2-action-menu">
<button type="button" class="btn btn-sm btn-outline-primary" data-scene-editor="notes" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneNotesEditor", "Scenes", new { sceneId = Model.SceneID })">Edit Writer</button>
<button type="button" class="btn btn-sm btn-outline-primary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Show writer editor actions</span>
</button>
<div class="dropdown-menu dropdown-menu-end">
<button type="button" class="dropdown-item" data-scene-editor="notes" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneNotesEditor", "Scenes", new { sceneId = Model.SceneID })">Notes</button>
<button type="button" class="dropdown-item" data-scene-editor="checklist" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneChecklistEditor", "Scenes", new { sceneId = Model.SceneID })">Checklist</button>
<button type="button" class="dropdown-item" data-scene-editor="workflow" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneWorkflowEditor", "Scenes", new { sceneId = Model.SceneID })">Workflow</button>
<button type="button" class="dropdown-item" data-scene-editor="attachments" data-scene-id="@Model.SceneID" data-scene-editor-url="@Url.Action("SceneAttachmentsEditor", "Scenes", new { sceneId = Model.SceneID })">Attachments</button>
</div>
</div>
</div>
</article>

View File

@ -4617,6 +4617,10 @@ body.dragging-location [data-drag-type="location"] {
gap: 12px;
}
.scene-inspector-v2-card-header > div:first-child {
min-width: 0;
}
.scene-inspector-v2-card-header h3 {
margin: 0;
font-size: 1.08rem;
@ -4677,6 +4681,21 @@ body.dragging-location [data-drag-type="location"] {
padding: 0.22rem 0.5rem;
}
.scene-inspector-v2-card-header .scene-inspector-v2-actions {
flex: 0 0 auto;
justify-content: flex-end;
max-width: 100%;
}
.scene-inspector-v2-card-header .scene-inspector-v2-action-menu {
flex-wrap: nowrap;
max-width: 100%;
}
.scene-inspector-v2-card-header .scene-inspector-v2-action-menu .btn {
white-space: nowrap;
}
.scene-inspector-v2-action-menu .dropdown-menu {
min-width: 11rem;
}
@ -5600,6 +5619,10 @@ body.scene-inspector-editor-resizing {
flex-direction: column;
}
.scene-inspector-v2-timeline .scene-inspector-v2-card-header .scene-inspector-v2-actions {
justify-content: flex-start;
}
.scene-inspector-v2-timeline .scene-inspector-v2-facts,
.scene-inspector-v2-timeline .scene-inspector-v2-metrics,
.scene-inspector-v2-timeline .scene-inspector-v2-counts {

File diff suppressed because one or more lines are too long