diff --git a/PlotLine/Views/Characters/Details.cshtml b/PlotLine/Views/Characters/Details.cshtml index 2029c95..98adff2 100644 --- a/PlotLine/Views/Characters/Details.cshtml +++ b/PlotLine/Views/Characters/Details.cshtml @@ -1,6 +1,7 @@ @model CharacterDetailViewModel @{ ViewData["Title"] = Model.Character.CharacterName; + ViewData["ProjectSection"] = "Characters"; var firstAppearance = Model.Appearances.FirstOrDefault(); var storyImportance = Model.Character.CharacterImportance switch { @@ -18,49 +19,50 @@ @Model.Character.CharacterName -
-
- Project context - @Model.Project.ProjectName -
- -
+ -
+

Character

@Model.Character.CharacterName

@Model.Character.DefaultDescription

- Characters + Back to characters Back to timeline - View Relationship Map - Character arc - Knowledge timeline - Export character - Markdown - Edit character -
- - - -
+
+ + @if (TempData["RelationshipMessage"] is string relationshipMessage) {
@relationshipMessage
} -
+

Profile

Short name: @Model.Character.ShortName

@@ -245,7 +247,7 @@
-
+

Current Relationships

@if (!Model.CurrentRelationships.Any()) { @@ -337,7 +339,7 @@ }
-
+

Scene appearances

@if (!Model.Appearances.Any()) { diff --git a/PlotLine/Views/Characters/Index.cshtml b/PlotLine/Views/Characters/Index.cshtml index 65f3f9f..9d04a1f 100644 --- a/PlotLine/Views/Characters/Index.cshtml +++ b/PlotLine/Views/Characters/Index.cshtml @@ -1,20 +1,16 @@ @model CharacterListViewModel @{ ViewData["Title"] = "Characters"; + ViewData["ProjectSection"] = "Characters"; } -
-
Project context@Model.Project.ProjectName
- -
+ + +
@@ -22,7 +18,6 @@

@Model.Project.ProjectName

diff --git a/PlotLine/Views/Projects/Details.cshtml b/PlotLine/Views/Projects/Details.cshtml index 2d31ef1..d1f2f03 100644 --- a/PlotLine/Views/Projects/Details.cshtml +++ b/PlotLine/Views/Projects/Details.cshtml @@ -1,6 +1,7 @@ @model ProjectDetailViewModel @{ ViewData["Title"] = Model.Project.ProjectName; + ViewData["ProjectSection"] = "Overview"; } -
-
- Current project - @Model.Project.ProjectName -
- -
- -
+

Project / Series

@Model.Project.ProjectName

@@ -42,46 +18,38 @@

@Model.Project.Description

}
-
- Edit project - Activity - @if (Model.Project.IsOwner) - { - Collaborators - } - Timeline - Timeline Settings - Scene Metrics - Scenarios - Writer Workspace - Story Bible - Relationship Map - Plot lines - Plot threads - Story assets - Characters - Locations - Warnings - Story health - Story dynamics - Phase 1 Checklist - Archived Items - @if (Model.Project.IsOwner) - { - Download Project Backup - } - Restore Points - Add book - @if (Model.Project.IsOwner) - { -
- - -
- } +
+ + @if (TempData["ProjectExportMessage"] is string projectExportMessage) {
@projectExportMessage
diff --git a/PlotLine/Views/Shared/_Layout.cshtml b/PlotLine/Views/Shared/_Layout.cshtml index a21980e..3478b52 100644 --- a/PlotLine/Views/Shared/_Layout.cshtml +++ b/PlotLine/Views/Shared/_Layout.cshtml @@ -48,9 +48,6 @@ - diff --git a/PlotLine/Views/Shared/_ProjectSectionNav.cshtml b/PlotLine/Views/Shared/_ProjectSectionNav.cshtml new file mode 100644 index 0000000..45d59a0 --- /dev/null +++ b/PlotLine/Views/Shared/_ProjectSectionNav.cshtml @@ -0,0 +1,27 @@ +@model Project +@{ + var activeSection = ViewData["ProjectSection"] as string ?? "Overview"; + var projectId = Model.ProjectID; + + string ActiveClass(string section) => + string.Equals(activeSection, section, StringComparison.OrdinalIgnoreCase) ? "active" : string.Empty; +} + +
+ Project navigation + +
diff --git a/PlotLine/wwwroot/css/plotline-theme.css b/PlotLine/wwwroot/css/plotline-theme.css index 3edb1d8..4924109 100644 --- a/PlotLine/wwwroot/css/plotline-theme.css +++ b/PlotLine/wwwroot/css/plotline-theme.css @@ -288,6 +288,153 @@ a:hover { color: var(--plotline-accent-dark); } +.pw-page-heading { + align-items: center; + gap: clamp(0.85rem, 2vw, 1.35rem); + margin-bottom: 1rem; +} + +.pw-page-heading > div:first-child { + min-width: min(100%, 26rem); +} + +.pw-page-heading .lead-text { + max-width: 52rem; +} + +.pw-project-nav { + display: grid; + gap: 0.55rem; + margin: 0 0 1.1rem; + border: 1px solid var(--plotline-border-soft); + border-radius: var(--plotline-radius); + padding: 0.7rem 0.75rem; + background: + linear-gradient(135deg, rgba(255, 253, 248, 0.9), rgba(242, 226, 207, 0.55)), + var(--plotline-surface); + box-shadow: var(--plotline-shadow-subtle); +} + +.pw-project-nav__label { + color: var(--plotline-accent); + font-size: 0.68rem; + font-weight: 850; + letter-spacing: 0.1em; + line-height: 1; + text-transform: uppercase; +} + +.pw-project-nav__links, +.pw-character-nav { + display: flex; + flex-wrap: wrap; + gap: 0.42rem; + align-items: center; +} + +.pw-project-nav__link, +.pw-character-nav__link { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 2rem; + border: 1px solid rgba(84, 68, 48, 0.16); + border-radius: 999px; + padding: 0.32rem 0.68rem; + color: var(--plotline-accent-dark); + background: rgba(255, 250, 241, 0.82); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.72); + font-size: 0.8rem; + font-weight: 780; + line-height: 1.1; + text-decoration: none; + transition: background-color 0.16s ease, border-color 0.16s ease, color 0.16s ease, box-shadow 0.16s ease; +} + +.pw-project-nav__link:hover, +.pw-project-nav__link:focus, +.pw-character-nav__link:hover, +.pw-character-nav__link:focus { + color: var(--plotline-accent-dark); + border-color: rgba(122, 77, 44, 0.32); + background: rgba(122, 77, 44, 0.11); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.62), 0 5px 12px rgba(62, 45, 28, 0.06); +} + +.pw-project-nav__link.active, +.pw-character-nav__link.active { + color: #fff8ec; + border-color: var(--plotline-accent); + background: linear-gradient(180deg, var(--plotline-accent), var(--plotline-accent-dark)); + box-shadow: 0 6px 14px rgba(62, 45, 28, 0.16); +} + +.pw-character-nav { + margin: 0 0 1rem; + border-bottom: 1px solid rgba(84, 68, 48, 0.11); + padding-bottom: 0.65rem; +} + +.pw-actions { + flex: 0 0 auto; +} + +.pw-actions__toggle { + --bs-btn-color: var(--plotline-accent-dark); + --bs-btn-bg: rgba(255, 250, 241, 0.86); + --bs-btn-border-color: rgba(122, 77, 44, 0.32); + --bs-btn-hover-color: #fff8ec; + --bs-btn-hover-bg: var(--plotline-accent); + --bs-btn-hover-border-color: var(--plotline-accent); + --bs-btn-active-color: #fff8ec; + --bs-btn-active-bg: var(--plotline-accent-dark); + --bs-btn-active-border-color: var(--plotline-accent-dark); + min-height: 2.35rem; + padding-inline: 1rem; + box-shadow: var(--plotline-shadow-subtle); +} + +.pw-actions .dropdown-menu { + --bs-dropdown-bg: var(--plotline-surface-elevated); + --bs-dropdown-color: var(--plotline-text); + --bs-dropdown-border-color: var(--plotline-border-soft); + --bs-dropdown-link-color: var(--plotline-text); + --bs-dropdown-link-hover-color: var(--plotline-accent-dark); + --bs-dropdown-link-hover-bg: rgba(122, 77, 44, 0.1); + --bs-dropdown-divider-bg: rgba(84, 68, 48, 0.13); + border-radius: var(--plotline-radius-sm); + box-shadow: var(--plotline-shadow-card); +} + +.pw-actions .dropdown-item { + font-weight: 650; +} + +.pw-actions .dropdown-item.text-danger { + color: var(--plotline-danger) !important; +} + +.pw-actions .dropdown-item.text-danger:hover, +.pw-actions .dropdown-item.text-danger:focus { + color: #fff8ec !important; + background: var(--plotline-danger); +} + +@media (max-width: 767.98px) { + .pw-page-heading { + align-items: stretch; + } + + .pw-page-heading .pw-actions, + .pw-page-heading .pw-actions__toggle { + width: 100%; + } + + .pw-project-nav { + padding: 0.65rem; + } +} + .timeline-workspace { background: linear-gradient(180deg, rgba(255, 251, 244, 0.84), rgba(237, 226, 211, 0.66)), @@ -1343,6 +1490,75 @@ a:focus-visible { border-color: #ffd5a6; } +[data-theme="dark"] .pw-project-nav { + color: var(--app-text); + border-color: rgba(241, 195, 143, 0.18); + background: + linear-gradient(135deg, rgba(42, 35, 30, 0.96), rgba(58, 42, 32, 0.58)), + var(--app-surface); + box-shadow: var(--plotline-shadow-subtle); +} + +[data-theme="dark"] .pw-project-nav__label { + color: #dfc6aa; +} + +[data-theme="dark"] .pw-character-nav { + border-bottom-color: rgba(241, 195, 143, 0.16); +} + +[data-theme="dark"] .pw-project-nav__link, +[data-theme="dark"] .pw-character-nav__link { + color: #f1dcc4; + border-color: rgba(241, 195, 143, 0.26); + background: rgba(241, 195, 143, 0.1); + box-shadow: none; +} + +[data-theme="dark"] .pw-project-nav__link:hover, +[data-theme="dark"] .pw-project-nav__link:focus, +[data-theme="dark"] .pw-character-nav__link:hover, +[data-theme="dark"] .pw-character-nav__link:focus { + color: #21160f; + border-color: #ffd5a6; + background: #f1c38f; + box-shadow: 0 6px 14px rgba(0, 0, 0, 0.24); +} + +[data-theme="dark"] .pw-project-nav__link.active, +[data-theme="dark"] .pw-character-nav__link.active { + color: #21160f; + border-color: #ffd5a6; + background: linear-gradient(180deg, #f1c38f, var(--plotline-accent)); + box-shadow: 0 8px 18px rgba(0, 0, 0, 0.28); +} + +[data-theme="dark"] .pw-actions__toggle { + --bs-btn-color: #f1dcc4; + --bs-btn-bg: rgba(241, 195, 143, 0.1); + --bs-btn-border-color: rgba(241, 195, 143, 0.3); + --bs-btn-hover-color: #21160f; + --bs-btn-hover-bg: #f1c38f; + --bs-btn-hover-border-color: #ffd5a6; + --bs-btn-active-color: #21160f; + --bs-btn-active-bg: var(--plotline-accent-dark); + --bs-btn-active-border-color: #ffd5a6; +} + +[data-theme="dark"] .pw-actions .dropdown-menu { + --bs-dropdown-color: var(--app-text); + --bs-dropdown-bg: var(--app-surface-alt); + --bs-dropdown-border-color: rgba(241, 195, 143, 0.22); + --bs-dropdown-link-color: var(--app-text); + --bs-dropdown-link-hover-color: #21160f; + --bs-dropdown-link-hover-bg: #f1c38f; + --bs-dropdown-divider-bg: rgba(241, 195, 143, 0.18); +} + +[data-theme="dark"] .pw-actions .dropdown-item.text-danger { + color: #ffb2aa !important; +} + [data-theme="dark"] .timeline-filter, [data-theme="dark"] .workspace-heading .button-row, [data-theme="dark"] .timeline-control-panel {