Phase 3I Help System - character and location pages.

This commit is contained in:
Nick Beckley 2026-06-05 22:00:01 +01:00
parent e3ae7059d5
commit 1b70c90ebc
15 changed files with 560 additions and 76 deletions

View File

@ -0,0 +1,43 @@
---
title: Attribute History
category: Characters
tags: characters, attributes, changes, continuity
contextKey: characters.attributeHistory
micro: Track visible or story-relevant character attribute changes over time.
quickTitle: What is Attribute History?
quickSummary: Attribute History records changes such as condition, status, appearance or other traits that matter to continuity.
screenshot:
---
# Overview
Attribute History captures changes to a character that occur through the story. It is useful for injuries, disguises, emotional states, social status, possessions, abilities or any other tracked trait.
# When Should I Use This?
Use it when a change needs to remain true after the scene where it happens. If an injury, disguise or revealed trait affects later chapters, record it.
# How To Use It
Review attribute entries in scene order. Use the linked scene to check whether the change is introduced clearly and whether later scenes respect it.
# Example
If Rebecca injures her hand in Chapter 8, later scenes should not show her playing piano easily unless the story accounts for recovery. Attribute history helps catch that.
# Writer Tip
Record the first moment a change becomes true, not every scene where it remains true.
# Common Mistakes
- Tracking minor details that never affect the story.
- Forgetting to add an attribute event when a visible condition changes.
- Mixing author planning notes with in-story changes.
- Leaving recovery or reversal moments unrecorded.
# Related Guides
- [Character Details](/Help/Article/characters.details)
- [Scene Appearances](/Help/Article/characters.sceneAppearances)
- [Warnings](/Help/Article/warnings.overview)

View File

@ -0,0 +1,43 @@
---
title: Current Relationships
category: Characters
tags: characters, relationships, current-state, history
contextKey: characters.currentRelationships
micro: See the latest calculated relationship state after story events have been applied.
quickTitle: What are Current Relationships?
quickSummary: Current Relationships show where each relationship has ended up so far, based on the initial state and later relationship events.
screenshot:
---
# Overview
Current Relationships show the latest known state between this character and others. They are calculated from the initial relationship plus relationship events in story order.
# When Should I Use This?
Use this section when you need a quick answer to "Where does this relationship stand now?" It is especially useful before writing scenes with emotional tension, betrayal, reconciliation or reveal fallout.
# How To Use It
Read the current state first, then open View History when you need the sequence that led there. Use the links to open the related character or relationship evolution page for deeper checking.
# Example
Rebecca may begin as a friend, become estranged after a discovery, and later reconcile. Current Relationships should show the latest state while preserving the earlier turns in history.
# Writer Tip
If the current state surprises you, that is useful. It may reveal either an exciting story turn or a missing relationship event.
# Common Mistakes
- Expecting current state to overwrite history.
- Forgetting that current state depends on story order.
- Adding a new initial relationship when the change should be an event.
- Ignoring relationship confidence or intensity when emotion matters.
# Related Guides
- [Initial Relationships](/Help/Article/characters.initialRelationships)
- [Relationship Events](/Help/Article/characters.relationshipEvents)
- [Character Details](/Help/Article/characters.details)

View File

@ -0,0 +1,43 @@
---
title: Character Details
category: Characters
tags: characters, cast, profile, continuity
contextKey: characters.details
micro: Review one character's profile, relationships, appearances, attributes and knowledge in one place.
quickTitle: What is Character Details?
quickSummary: The Character Details page gathers the continuity record for a single character so you can see who they are, where they appear and what changes around them.
screenshot:
---
# Overview
Character Details is the working record for one character. It brings together profile information, relationships, scene appearances, attribute changes and knowledge so you can understand the character as they exists across the story rather than only inside one scene.
# When Should I Use This?
Use this page when you are checking continuity, revising a character arc, preparing a scene that features the character, or asking whether their relationships and knowledge still make sense at a particular point in the story.
# How To Use It
Start with the profile for identity details, then move through relationships, appearances, attribute history and knowledge. Open linked scenes when you need to inspect the surrounding narrative context. Use the relationship and knowledge sections as continuity checks before major revisions.
# Example
Before rewriting a reveal scene, open Beth's character record and check her recent appearances, what she already knows, and how her relationship with Rebecca has changed. This helps prevent the scene from contradicting earlier material.
# Writer Tip
Treat this page as a continuity lens, not a biography form. The most useful entries are the ones that explain how the story changes what the character knows, feels or can do.
# Common Mistakes
- Updating profile notes but forgetting scene appearances.
- Treating relationship history as static.
- Recording private author knowledge as if the character already knows it.
- Ignoring small attribute changes that matter later.
# Related Guides
- [Characters](/Help/Article/characters.overview)
- [Scene Appearances](/Help/Article/characters.sceneAppearances)
- [Knowledge](/Help/Article/characters.knowledge)

View File

@ -0,0 +1,43 @@
---
title: Initial Relationships
category: Characters
tags: characters, relationships, starting-state, continuity
contextKey: characters.initialRelationships
micro: Define how characters relate to each other before the story changes them.
quickTitle: What are Initial Relationships?
quickSummary: Initial Relationships describe the starting state between characters before later scenes create changes, reveals or reversals.
screenshot:
---
# Overview
Initial Relationships record how characters begin. They are the baseline for later relationship events, current relationship state and future relationship map views.
# When Should I Use This?
Use initial relationships for bonds that already exist at project start or before a character first appears. Family ties, old friendships, rivalries, debts, secrets and professional roles often belong here.
# How To Use It
Choose the related character, relationship type, awareness state and confidence or intensity. Add notes for hidden history or reader knowledge, especially when the relationship is true in the world but not yet known to the reader.
# Example
Maggie and Beth may begin as strangers to the reader, while the writer knows there is a hidden family connection. The initial relationship can capture the author-facing truth while later events handle the reveal.
# Writer Tip
Initial does not mean permanent. It is the first marker on the relationship timeline.
# Common Mistakes
- Using initial relationships for changes that happen during scenes.
- Forgetting to mark whether the reader initially knows the relationship.
- Recording only romantic or family bonds and missing professional or hostile ones.
- Duplicating a relationship instead of editing the existing baseline.
# Related Guides
- [Current Relationships](/Help/Article/characters.currentRelationships)
- [Relationship Events](/Help/Article/characters.relationshipEvents)
- [Relationship Map](/Help/Article/relationshipMap.overview)

View File

@ -0,0 +1,43 @@
---
title: Character Knowledge
category: Characters
tags: characters, knowledge, secrets, continuity
contextKey: characters.knowledge
micro: Track what this character learns, knows, suspects or misunderstands.
quickTitle: What is Character Knowledge?
quickSummary: Character Knowledge helps you separate what the writer knows from what a character knows at each point in the story.
screenshot:
---
# Overview
Knowledge entries record what a character knows or believes as the story unfolds. This is vital for mysteries, secrets, betrayals, investigations and any plot where information arrives unevenly.
# When Should I Use This?
Use it when a character learns something important, misunderstands something, gains evidence, recognises an asset, or becomes aware of a plot thread.
# How To Use It
Review knowledge in story order and open linked scenes when you need to check how information was gained. Use it before writing decisions, confrontations or reveals to confirm what the character can reasonably do.
# Example
Maggie may know that a letter exists before she knows who wrote it. Those are different knowledge states and can drive different choices.
# Writer Tip
Readers forgive mystery. They notice impossible knowledge. Track the difference carefully.
# Common Mistakes
- Letting a character act on information they have not learned.
- Recording author-only secrets as character knowledge.
- Forgetting suspicion or partial knowledge.
- Treating all characters as if they know the same reveal at the same time.
# Related Guides
- [Character Details](/Help/Article/characters.details)
- [Story Assets](/Help/Article/storyAssets.overview)
- [Plot Threads](/Help/Article/plotThreads.overview)

View File

@ -0,0 +1,43 @@
---
title: Relationship Events
category: Characters
tags: characters, relationships, events, evolution
contextKey: characters.relationshipEvents
micro: Track scene-by-scene changes in how characters relate to each other.
quickTitle: What are Relationship Events?
quickSummary: Relationship Events record moments in scenes where a relationship changes, becomes known, intensifies or shifts direction.
screenshot:
---
# Overview
Relationship Events are the story moments that move a relationship forward or sideways. They preserve the path from initial relationship to current relationship without erasing earlier states.
# When Should I Use This?
Use a relationship event when a scene changes trust, hostility, attraction, loyalty, awareness or emotional intensity between characters.
# How To Use It
Create events from scene relationship editing, then review them here in story order. Check the scene, relationship type, awareness, intensity and notes to make sure the change is clear and placed correctly.
# Example
If Beth protects Maggie in Chapter 17, that scene may create a relationship event from suspicion to trust. A later betrayal can add another event without deleting the earlier trust.
# Writer Tip
Not every interaction needs an event. Use them for changes the reader, plot or character arc will need to remember.
# Common Mistakes
- Recording ordinary conversation as a relationship change.
- Forgetting to link the change to the scene where it happens.
- Using notes without setting the relationship state.
- Losing reciprocal meaning when both characters are affected differently.
# Related Guides
- [Current Relationships](/Help/Article/characters.currentRelationships)
- [Scene Appearances](/Help/Article/characters.sceneAppearances)
- [Relationship Map](/Help/Article/relationshipMap.overview)

View File

@ -0,0 +1,43 @@
---
title: Scene Appearances
category: Characters
tags: characters, scenes, appearances, continuity
contextKey: characters.sceneAppearances
micro: See where a character appears and what role they play in each scene.
quickTitle: What are Scene Appearances?
quickSummary: Scene Appearances show every scene linked to this character, including role, presence and useful continuity notes.
screenshot:
---
# Overview
Scene Appearances connect a character to the actual story structure. They help answer when a character appears, how long they have been absent and what physical or emotional state they carried into a scene.
# When Should I Use This?
Use this section during revision, pacing checks, continuity reviews and character arc work. It is also useful when planning whether a supporting character has enough presence to earn a later payoff.
# How To Use It
Scan the scenes in order. Open a scene from the list when you need to adjust role, presence, location, outfit, condition, emotional state or knowledge notes.
# Example
A detective may appear in five early scenes, disappear for eight chapters, then return with crucial knowledge. Scene appearances make that absence visible before it becomes confusing.
# Writer Tip
Use appearance notes for scene-specific truth. General personality belongs in the profile; what changed in this moment belongs in the scene appearance.
# Common Mistakes
- Mentioning a character in a summary but not linking them to the scene.
- Forgetting current location when validation warns about placement.
- Using appearance notes for permanent biography details.
- Ignoring long absences that weaken reader memory.
# Related Guides
- [Character Details](/Help/Article/characters.details)
- [Scenes](/Help/Article/scenes.overview)
- [Locations](/Help/Article/locations.overview)

View File

@ -0,0 +1,43 @@
---
title: Child Locations
category: Locations
tags: locations, hierarchy, rooms, setting
contextKey: locations.childLocations
micro: Organise places inside larger places, such as rooms inside a house.
quickTitle: What are Child Locations?
quickSummary: Child Locations let you build a clear setting hierarchy so broad places and specific rooms stay connected.
screenshot:
---
# Overview
Child Locations are places contained within another place. They help model story spaces such as a house with rooms, a school with corridors, or a town with important streets.
# When Should I Use This?
Use child locations when a specific sub-place matters enough to track separately. A whole mansion may be one location, but the attic, kitchen and locked nursery may each need their own record.
# How To Use It
Create the larger location first, then add child locations beneath it. Use clear names and descriptions so the hierarchy supports planning rather than becoming a maze.
# Example
Harrow House can contain the Blue Bedroom, Landing, Kitchen and Cellar. Each can appear in scenes while still belonging to the same larger setting.
# Writer Tip
Only split a location when the distinction affects story logic, mood or continuity.
# Common Mistakes
- Creating too many tiny spaces before the story needs them.
- Forgetting that child locations still belong to a larger place.
- Using child locations for unrelated places.
- Renaming a parent without checking child paths.
# Related Guides
- [Location Details](/Help/Article/locations.details)
- [Location Relationships](/Help/Article/locations.relationships)
- [Scenes](/Help/Article/scenes.overview)

View File

@ -0,0 +1,43 @@
---
title: Location Details
category: Locations
tags: locations, setting, continuity, scenes
contextKey: locations.details
micro: Review one location's description, child places, relationships and story usage.
quickTitle: What is Location Details?
quickSummary: Location Details gathers the continuity record for a single place so you can track layout, relationships and where it appears in the story.
screenshot:
---
# Overview
Location Details is the working page for one story place. It shows the location's description, parent or child locations, relationships to other places, and where it is used by scenes, characters and assets.
# When Should I Use This?
Use it when spatial continuity matters, when revising scenes set in the same place, or when checking whether a setting is carrying the right story pressure.
# How To Use It
Start with the description and location path, then inspect child locations and relationships. Use the Used here section to open scenes that take place in or refer to the location.
# Example
The Blue Bedroom may have a child location such as a wardrobe and a relationship to the landing. Its detail page helps you see which scenes happen there and whether character movement still makes sense.
# Writer Tip
A location page is most valuable when it records what affects story action: access, sightlines, sound, mood, secrets and changes over time.
# Common Mistakes
- Treating locations as decorative labels only.
- Forgetting to update child spaces after changing a layout.
- Losing track of which scenes use an important setting.
- Keeping movement logic in private notes instead of visible location relationships.
# Related Guides
- [Locations](/Help/Article/locations.overview)
- [Child Locations](/Help/Article/locations.childLocations)
- [Used Here](/Help/Article/locations.usedHere)

View File

@ -0,0 +1,43 @@
---
title: Location Relationships
category: Locations
tags: locations, relationships, movement, sightlines
contextKey: locations.relationships
micro: Describe how places connect, whether characters can move, see or hear between them.
quickTitle: What are Location Relationships?
quickSummary: Location Relationships capture useful spatial connections such as nearby rooms, routes, sightlines and sound paths.
screenshot:
---
# Overview
Location Relationships describe how places connect to each other. They can represent direct travel, visibility, sound, adjacency or other spatial logic that affects what can happen in a scene.
# When Should I Use This?
Use them when the physical relationship between places affects plot or continuity. They are especially helpful for overheard conversations, locked rooms, chase sequences and hidden movement.
# How To Use It
Choose the related location, relationship type and any relevant flags such as bidirectional travel, hearing or visibility. Add notes for exceptions, barriers or story-specific constraints.
# Example
The Landing may connect to the Blue Bedroom and allow loud noise to be heard through the door, but not normal speech. That detail can matter during a suspense scene.
# Writer Tip
Think like a reader reconstructing the space. If a later twist depends on where someone could go or what they could hear, record it.
# Common Mistakes
- Assuming every relationship works both ways.
- Forgetting sound and sightline differences.
- Recording atmosphere when the relationship should describe physical logic.
- Leaving notes vague when a clue depends on the layout.
# Related Guides
- [Location Details](/Help/Article/locations.details)
- [Child Locations](/Help/Article/locations.childLocations)
- [Warnings](/Help/Article/warnings.overview)

View File

@ -0,0 +1,43 @@
---
title: Used Here
category: Locations
tags: locations, scenes, characters, assets
contextKey: locations.usedHere
micro: See which scenes, characters and assets are connected to this location.
quickTitle: What is Used Here?
quickSummary: Used Here shows where a location appears across the story, including linked scenes, character placements and story assets.
screenshot:
---
# Overview
Used Here shows the story material connected to a location. It helps you understand how often the place appears, who is associated with it, and which assets are present there.
# When Should I Use This?
Use it while revising setting continuity, checking repeated locations, preparing a scene return, or finding all moments tied to a place before changing it.
# How To Use It
Scan the scene list first, then check characters and assets. Open linked scenes when you need to adjust placement, timing, props or continuity notes.
# Example
Before changing the cellar layout, use Used Here to find every scene set there and every asset stored there. That prevents a later clue from becoming impossible.
# Writer Tip
Repeated locations build memory in the reader. Use this section to see whether a place has become important enough to carry emotional or plot meaning.
# Common Mistakes
- Changing a location description without checking scenes that already use it.
- Forgetting assets that are stored or discovered there.
- Missing character placement issues when a scene has several rooms.
- Treating one important location as several unrelated names.
# Related Guides
- [Location Details](/Help/Article/locations.details)
- [Scenes](/Help/Article/scenes.overview)
- [Story Assets](/Help/Article/storyAssets.overview)

View File

@ -35,7 +35,7 @@
<div class="page-heading">
<div>
<p class="eyebrow">Character</p>
<h1>@Model.Character.CharacterName</h1>
<h1>@Model.Character.CharacterName <help-icon key="characters.details" /></h1>
<p class="lead-text">@Model.Character.DefaultDescription</p>
</div>
<div class="button-row">
@ -71,7 +71,7 @@
<p><strong>Story importance:</strong> @storyImportance</p>
</article>
<article class="plain-card">
<h2>Initial Relationships</h2>
<h2>Initial Relationships <help-icon key="characters.initialRelationships" /></h2>
@if (!Model.InitialRelationships.Any())
{
<p class="muted">No initial relationships yet.</p>
@ -175,10 +175,10 @@
</div>
</form>
</details>
<form asp-action="ArchiveRelationship" method="post" class="archive-button-form" data-confirm-message="Archive this relationship?&#10;&#10;This will hide it from active lists and timelines, but the data will be kept and can be restored later.">
<form asp-action="ArchiveRelationship" method="post" class="archive-button-form" data-confirm-message="Remove this relationship?&#10;&#10;This will hide it from active lists and timelines, but the data will be kept and can be restored later.">
<input type="hidden" name="id" value="@relationship.CharacterRelationshipID" />
<input type="hidden" name="characterId" value="@Model.Character.CharacterID" />
<button class="btn btn-outline-danger btn-sm" type="submit">Archive / Remove</button>
<button class="btn btn-outline-danger btn-sm" type="submit">Remove</button>
</form>
</div>
}
@ -246,7 +246,7 @@
</section>
<section class="list-section mt-3">
<h2>Current Relationships</h2>
<h2>Current Relationships <help-icon key="characters.currentRelationships" /></h2>
@if (!Model.CurrentRelationships.Any())
{
<p class="muted">No current relationship state yet.</p>
@ -310,7 +310,7 @@
}
</section>
<section class="list-section mt-3">
<h2>Relationship Events</h2>
<h2>Relationship Events <help-icon key="characters.relationshipEvents" /></h2>
@if (!Model.RelationshipEvents.Any())
{
<p class="muted">No relationship events yet.</p>
@ -338,7 +338,7 @@
</section>
<section class="list-section mt-3">
<h2>Scene appearances</h2>
<h2>Scene appearances <help-icon key="characters.sceneAppearances" /></h2>
@if (!Model.Appearances.Any())
{
<p class="muted">No scene appearances yet.</p>
@ -360,7 +360,7 @@
</section>
<section class="list-section mt-3">
<h2>Attribute history</h2>
<h2>Attribute history <help-icon key="characters.attributeHistory" /></h2>
@if (!Model.AttributeEvents.Any())
{
<p class="muted">No attribute events yet.</p>
@ -382,7 +382,7 @@
</section>
<section class="list-section mt-3">
<h2>Knowledge</h2>
<h2>Knowledge <help-icon key="characters.knowledge" /></h2>
@if (!Model.KnowledgeItems.Any())
{
<p class="muted">No knowledge entries yet.</p>

View File

@ -24,25 +24,26 @@
</nav>
</section>
<div class="page-heading compact">
<div>
<p class="eyebrow">Location detail</p>
<h1>@Model.Location.LocationName</h1>
<p class="muted">@Model.Location.LocationPath</p>
<div class="location-page">
<div class="page-heading compact">
<div>
<p class="eyebrow">Location detail</p>
<h1>@Model.Location.LocationName <help-icon key="locations.details" /></h1>
<p class="muted">@Model.Location.LocationPath</p>
</div>
<div class="button-row">
<a class="btn btn-outline-secondary" asp-action="Edit" asp-route-id="@Model.Location.LocationID">Edit</a>
<a class="btn btn-outline-secondary" asp-controller="Timeline" asp-action="Index" asp-route-ProjectID="@Model.Project.ProjectID" asp-route-SelectedSceneID="@firstScene?.SceneID" asp-route-FocusType="location" asp-route-FocusID="@Model.Location.LocationID">Back to timeline</a>
<a class="btn btn-outline-primary" asp-action="Index" asp-route-projectId="@Model.Project.ProjectID">All locations</a>
<form asp-action="Archive" method="post" class="archive-button-form" data-confirm-message="Archive this location?&#10;&#10;This will hide it from active lists and timelines, but the data will be kept and can be restored later.">
<input type="hidden" name="id" value="@Model.Location.LocationID" />
<input type="hidden" name="projectId" value="@Model.Project.ProjectID" />
<button class="btn btn-outline-danger" type="submit">Archive Location</button>
</form>
</div>
</div>
<div class="button-row">
<a class="btn btn-outline-secondary" asp-action="Edit" asp-route-id="@Model.Location.LocationID">Edit</a>
<a class="btn btn-outline-secondary" asp-controller="Timeline" asp-action="Index" asp-route-ProjectID="@Model.Project.ProjectID" asp-route-SelectedSceneID="@firstScene?.SceneID" asp-route-FocusType="location" asp-route-FocusID="@Model.Location.LocationID">Back to timeline</a>
<a class="btn btn-outline-primary" asp-action="Index" asp-route-projectId="@Model.Project.ProjectID">All locations</a>
<form asp-action="Archive" method="post" class="archive-button-form" data-confirm-message="Archive this location?&#10;&#10;This will hide it from active lists and timelines, but the data will be kept and can be restored later.">
<input type="hidden" name="id" value="@Model.Location.LocationID" />
<input type="hidden" name="projectId" value="@Model.Project.ProjectID" />
<button class="btn btn-outline-danger" type="submit">Archive Location</button>
</form>
</div>
</div>
<section class="edit-panel">
<section class="edit-panel">
<div class="row g-3">
<div class="col-md-4">
<p class="eyebrow">Type</p>
@ -57,10 +58,10 @@
<p>@(Model.Location.Description ?? "No description yet.")</p>
</div>
</div>
</section>
</section>
<section class="edit-panel">
<h2>Child locations</h2>
<section class="edit-panel">
<h2>Child locations <help-icon key="locations.childLocations" /></h2>
@if (!Model.ChildLocations.Any())
{
<p class="muted">No child locations yet.</p>
@ -74,10 +75,10 @@
}
</div>
}
</section>
</section>
<section class="edit-panel">
<h2>Relationships</h2>
<section class="edit-panel">
<h2>Relationships <help-icon key="locations.relationships" /></h2>
@if (!Model.Relationships.Any())
{
<p class="muted">No relationships defined yet.</p>
@ -138,10 +139,10 @@
</div>
<button class="btn btn-outline-primary btn-sm mt-2" type="submit">Add relationship</button>
</form>
</section>
</section>
<section class="edit-panel">
<h2>Used here</h2>
<section class="edit-panel">
<h2>Used here <help-icon key="locations.usedHere" /></h2>
<div class="row g-3">
<div class="col-md-4">
<h3>Scenes</h3>
@ -168,4 +169,5 @@
@if (!Model.Assets.Any()) { <p class="muted">No asset placements yet.</p> }
</div>
</div>
</section>
</section>
</div>

View File

@ -16,15 +16,16 @@
</nav>
</section>
<div class="page-heading compact">
<div>
<p class="eyebrow">Locations</p>
<h1>@Model.Project.ProjectName <help-icon key="locations.overview" /></h1>
<div class="location-page">
<div class="page-heading compact">
<div>
<p class="eyebrow">Locations</p>
<h1>@Model.Project.ProjectName <help-icon key="locations.overview" /></h1>
</div>
<a class="btn btn-primary" asp-action="Create" asp-route-projectId="@Model.Project.ProjectID">New location</a>
</div>
<a class="btn btn-primary" asp-action="Create" asp-route-projectId="@Model.Project.ProjectID">New location</a>
</div>
<section class="drag-drop-panel d-none" data-drag-drop-panel>
<section class="drag-drop-panel d-none" data-drag-drop-panel>
<div class="drag-drop-panel-header">
<div>
<p class="eyebrow" data-drag-panel-kicker>Location relationship</p>
@ -54,38 +55,39 @@
<button class="btn btn-outline-secondary btn-sm" type="button" data-drag-cancel>Cancel</button>
</div>
</form>
</section>
</section>
@if (!Model.Locations.Any())
{
<section class="empty-panel">
<h2>No locations yet</h2>
<p>Add buildings, floors, rooms, streets, and other places that matter to the story.</p>
</section>
}
else
{
<section class="edit-panel location-tree">
@foreach (var location in Model.Locations)
{
<div class="location-tree-row" draggable="true" data-drag-type="location" data-drag-id="@location.LocationID" data-drag-label="@location.LocationName" style="--location-depth:@location.Depth">
<div>
<a asp-action="Details" asp-route-id="@location.LocationID"><strong>@location.LocationName</strong></a>
@if (!string.IsNullOrWhiteSpace(location.LocationTypeName))
{
<span class="location-badge">@location.LocationTypeName</span>
}
<span class="muted">@location.LocationPath</span>
@if (!Model.Locations.Any())
{
<section class="empty-panel">
<h2>No locations yet</h2>
<p>Add buildings, floors, rooms, streets, and other places that matter to the story.</p>
</section>
}
else
{
<section class="edit-panel location-tree">
@foreach (var location in Model.Locations)
{
<div class="location-tree-row" draggable="true" data-drag-type="location" data-drag-id="@location.LocationID" data-drag-label="@location.LocationName" style="--location-depth:@location.Depth">
<div>
<a asp-action="Details" asp-route-id="@location.LocationID"><strong>@location.LocationName</strong></a>
@if (!string.IsNullOrWhiteSpace(location.LocationTypeName))
{
<span class="location-badge">@location.LocationTypeName</span>
}
<span class="muted">@location.LocationPath</span>
</div>
<div class="button-row compact-buttons">
<a class="btn btn-outline-secondary btn-sm" asp-action="Edit" asp-route-id="@location.LocationID">Edit</a>
<form asp-action="Archive" method="post" data-confirm-message="Archive this location?&#10;&#10;This will hide it from active lists and timelines, but the data will be kept and can be restored later.">
<input type="hidden" name="id" value="@location.LocationID" />
<input type="hidden" name="projectId" value="@Model.Project.ProjectID" />
<button class="btn btn-outline-danger btn-sm" type="submit">Archive</button>
</form>
</div>
</div>
<div class="button-row compact-buttons">
<a class="btn btn-outline-secondary btn-sm" asp-action="Edit" asp-route-id="@location.LocationID">Edit</a>
<form asp-action="Archive" method="post" data-confirm-message="Archive this location?&#10;&#10;This will hide it from active lists and timelines, but the data will be kept and can be restored later.">
<input type="hidden" name="id" value="@location.LocationID" />
<input type="hidden" name="projectId" value="@Model.Project.ProjectID" />
<button class="btn btn-outline-danger btn-sm" type="submit">Archive</button>
</form>
</div>
</div>
}
</section>
}
}
</section>
}
</div>

View File

@ -169,6 +169,13 @@ td.text-end {
max-width: 980px;
}
.location-page .page-heading.compact,
.location-page .edit-panel,
.location-page .empty-panel,
.location-page .drag-drop-panel {
max-width: none;
}
.import-panel,
.import-preview-section {
max-width: none;