Phase 10M: Word Companion Interface Redesign
This commit is contained in:
parent
69da86fbd6
commit
67116c3383
@ -15,8 +15,10 @@
|
||||
<body>
|
||||
<main class="word-companion-shell" data-authenticated="@Model.IsAuthenticated.ToString().ToLowerInvariant()">
|
||||
<header class="word-companion-header">
|
||||
<h1>PlotDirector Companion</h1>
|
||||
<p class="word-companion-status" data-connection-status>@statusText</p>
|
||||
<div>
|
||||
<h1>PlotDirector</h1>
|
||||
<p class="word-companion-status" data-connection-status>@statusText</p>
|
||||
</div>
|
||||
@if (Model.IsAuthenticated)
|
||||
{
|
||||
<p class="word-companion-user">Signed in as @Model.DisplayName</p>
|
||||
@ -27,296 +29,320 @@
|
||||
}
|
||||
</header>
|
||||
|
||||
<section class="word-companion-section" aria-label="Project selection">
|
||||
<label for="word-companion-project">Project</label>
|
||||
<select id="word-companion-project" data-project-select disabled>
|
||||
<option value="">Loading projects...</option>
|
||||
</select>
|
||||
<p class="word-companion-message" data-project-message></p>
|
||||
<nav class="word-companion-tabs" aria-label="Companion sections">
|
||||
<button type="button" class="is-active" data-tab-button="scene" aria-selected="true">Scene</button>
|
||||
<button type="button" data-tab-button="links" aria-selected="false">Links</button>
|
||||
<button type="button" data-tab-button="structure" aria-selected="false">Structure</button>
|
||||
<button type="button" data-tab-button="diagnostics" aria-selected="false">Diagnostics</button>
|
||||
</nav>
|
||||
|
||||
<section class="word-companion-tab-panel is-active" data-tab-panel="scene" aria-label="Scene">
|
||||
<section class="word-companion-section word-companion-connection" aria-label="Project and book selection">
|
||||
<div>
|
||||
<label for="word-companion-project">Project</label>
|
||||
<select id="word-companion-project" data-project-select disabled>
|
||||
<option value="">Loading projects...</option>
|
||||
</select>
|
||||
<p class="word-companion-message" data-project-message></p>
|
||||
</div>
|
||||
<div>
|
||||
<label for="word-companion-book">Book</label>
|
||||
<select id="word-companion-book" data-book-select disabled>
|
||||
<option value="">Select a project first</option>
|
||||
</select>
|
||||
<p class="word-companion-message" data-book-message></p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="word-companion-section word-companion-current-scene" aria-label="Current Scene">
|
||||
<div class="word-companion-actions">
|
||||
<button type="button" class="word-companion-primary-action" data-refresh-current-scene>Refresh Current Scene</button>
|
||||
<button type="button" data-sync-scene-progress disabled>Sync Progress</button>
|
||||
</div>
|
||||
<p class="word-companion-message" data-document-message></p>
|
||||
<p class="word-companion-message" data-sync-status>No resolved PlotDirector scene.</p>
|
||||
|
||||
<div class="word-companion-scene-card word-companion-scene-summary">
|
||||
<div class="word-companion-title-row">
|
||||
<span>Current Chapter</span>
|
||||
<strong data-current-chapter>Not detected</strong>
|
||||
</div>
|
||||
<div class="word-companion-title-row">
|
||||
<span>Current Scene</span>
|
||||
<strong data-current-scene>Not detected</strong>
|
||||
</div>
|
||||
<div class="word-companion-badges">
|
||||
<span class="word-companion-badge" data-plotdirector-scene-status>Not detected</span>
|
||||
<span class="word-companion-badge" data-anchor-status>Not attached</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="word-companion-metrics">
|
||||
<div>
|
||||
<span>Word Count</span>
|
||||
<strong data-current-word-count>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Actual</span>
|
||||
<strong data-plotdirector-actual-words>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Estimated</span>
|
||||
<strong data-plotdirector-estimated-words>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Revision</span>
|
||||
<strong data-plotdirector-revision-status>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Blocked</span>
|
||||
<strong data-plotdirector-blocked-status>-</strong>
|
||||
</div>
|
||||
<div data-plotdirector-blocked-reason-row hidden>
|
||||
<span>Blocked Reason</span>
|
||||
<strong data-plotdirector-blocked-reason>-</strong>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="button" data-attach-plotdirector-ids disabled>Attach PlotDirector IDs</button>
|
||||
<p class="word-companion-message" data-sync-note></p>
|
||||
</section>
|
||||
|
||||
<section class="word-companion-section word-companion-create-link" data-chapter-create-link hidden aria-label="Chapter Create Link">
|
||||
<div class="word-companion-section-header">
|
||||
<span>Chapter Create / Link</span>
|
||||
</div>
|
||||
<div class="word-companion-scene-card">
|
||||
<div>
|
||||
<span>Current Chapter</span>
|
||||
<strong data-chapter-create-link-chapter>-</strong>
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-companion-actions">
|
||||
<button type="button" data-create-plotdirector-chapter disabled>Create Chapter in PlotDirector</button>
|
||||
<button type="button" data-link-existing-chapter disabled>Link to Existing Chapter</button>
|
||||
</div>
|
||||
<p class="word-companion-message" data-chapter-create-link-status></p>
|
||||
</section>
|
||||
|
||||
<section class="word-companion-section word-companion-create-link" data-scene-create-link hidden aria-label="Scene Create Link">
|
||||
<div class="word-companion-section-header">
|
||||
<span>Scene Create / Link</span>
|
||||
</div>
|
||||
<div class="word-companion-scene-card">
|
||||
<div>
|
||||
<span>Current Chapter</span>
|
||||
<strong data-create-link-chapter>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Current Scene</span>
|
||||
<strong data-create-link-scene>-</strong>
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-companion-actions">
|
||||
<button type="button" data-create-plotdirector-scene disabled>Create Scene in PlotDirector</button>
|
||||
<button type="button" data-link-existing-scene disabled>Link to Existing Scene</button>
|
||||
</div>
|
||||
<p class="word-companion-message" data-create-link-status></p>
|
||||
</section>
|
||||
|
||||
<section class="word-companion-section word-companion-brief" data-writing-brief-block hidden aria-label="Writing Brief">
|
||||
<span>Writing Brief</span>
|
||||
<p data-writing-brief></p>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section class="word-companion-section" aria-label="Book selection">
|
||||
<label for="word-companion-book">Book</label>
|
||||
<select id="word-companion-book" data-book-select disabled>
|
||||
<option value="">Select a project first</option>
|
||||
</select>
|
||||
<p class="word-companion-message" data-book-message></p>
|
||||
<section class="word-companion-tab-panel" data-tab-panel="links" aria-label="Links" hidden>
|
||||
<section class="word-companion-section word-companion-link-groups" data-plotdirector-link-groups aria-label="Scene Links">
|
||||
<div class="word-companion-section-header">
|
||||
<span>Scene Links</span>
|
||||
<button type="button" data-save-scene-links disabled>Save Scene Links</button>
|
||||
</div>
|
||||
<p class="word-companion-message" data-scene-links-status>Link a PlotDirector scene first.</p>
|
||||
<div>
|
||||
<span>Characters</span>
|
||||
<div class="word-companion-check-list" data-character-chips></div>
|
||||
</div>
|
||||
<div>
|
||||
<span>Assets</span>
|
||||
<div class="word-companion-check-list" data-asset-chips></div>
|
||||
</div>
|
||||
<div>
|
||||
<label for="word-companion-primary-location">Primary Location</label>
|
||||
<select id="word-companion-primary-location" data-primary-location-select disabled>
|
||||
<option value="">None</option>
|
||||
</select>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section class="word-companion-section word-companion-current-scene" aria-label="Current Scene">
|
||||
<div class="word-companion-section-header">
|
||||
<span>Current Scene</span>
|
||||
</div>
|
||||
<div class="word-companion-actions">
|
||||
<button type="button" class="word-companion-primary-action" data-refresh-current-scene>Refresh Current Scene</button>
|
||||
<button type="button" data-sync-scene-progress disabled>Sync Progress</button>
|
||||
</div>
|
||||
<p class="word-companion-message" data-document-message></p>
|
||||
<p class="word-companion-message" data-sync-status>No resolved PlotDirector scene.</p>
|
||||
<div class="word-companion-scene-card">
|
||||
<div>
|
||||
<span>Current Chapter</span>
|
||||
<strong data-current-chapter>Not detected</strong>
|
||||
<section class="word-companion-tab-panel" data-tab-panel="structure" aria-label="Structure" hidden>
|
||||
<section class="word-companion-section word-companion-structure-preview" aria-label="Structure Sync Preview">
|
||||
<div class="word-companion-section-header">
|
||||
<span>Structure Sync Preview</span>
|
||||
<div class="word-companion-header-actions">
|
||||
<button type="button" data-analyse-manuscript-structure disabled>Analyse Manuscript Structure</button>
|
||||
<button type="button" data-apply-structure-sync disabled>Apply Structure Sync</button>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span>Current Scene</span>
|
||||
<strong data-current-scene>Not detected</strong>
|
||||
<p class="word-companion-message" data-structure-preview-status>Select a project and book to analyse manuscript structure.</p>
|
||||
<div class="word-companion-preview-groups" data-structure-preview-results>
|
||||
<p>No preview generated.</p>
|
||||
</div>
|
||||
<div>
|
||||
<span>Link Status</span>
|
||||
<strong data-plotdirector-scene-status>Not detected</strong>
|
||||
</section>
|
||||
|
||||
<details class="word-companion-section word-companion-collapsible">
|
||||
<summary>Document Outline</summary>
|
||||
<div class="word-companion-outline" data-document-outline>
|
||||
<p>No structure scanned.</p>
|
||||
</div>
|
||||
<div>
|
||||
<span>Anchor Status</span>
|
||||
<strong data-anchor-status>Not attached</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Book ID</span>
|
||||
<strong data-anchor-book-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Chapter ID</span>
|
||||
<strong data-anchor-chapter-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Scene ID</span>
|
||||
<strong data-anchor-scene-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Word Count in Word</span>
|
||||
<strong data-current-word-count>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>PlotDirector Actual Words</span>
|
||||
<strong data-plotdirector-actual-words>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Estimated Words</span>
|
||||
<strong data-plotdirector-estimated-words>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Revision Status</span>
|
||||
<strong data-plotdirector-revision-status>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Blocked Status</span>
|
||||
<strong data-plotdirector-blocked-status>-</strong>
|
||||
</div>
|
||||
<div data-plotdirector-blocked-reason-row hidden>
|
||||
<span>Blocked Reason</span>
|
||||
<strong data-plotdirector-blocked-reason>-</strong>
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-companion-sync-meta">
|
||||
<div>
|
||||
<span>Last Synced</span>
|
||||
<strong data-sync-last-synced>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Sync Count</span>
|
||||
<strong data-sync-plotdirector-count>-</strong>
|
||||
</div>
|
||||
</div>
|
||||
<button type="button" data-attach-plotdirector-ids disabled>Attach PlotDirector IDs</button>
|
||||
<p class="word-companion-message" data-sync-note></p>
|
||||
</details>
|
||||
</section>
|
||||
|
||||
<section class="word-companion-section word-companion-create-link" data-chapter-create-link hidden aria-label="Chapter Create Link">
|
||||
<div class="word-companion-section-header">
|
||||
<span>Chapter Create / Link</span>
|
||||
</div>
|
||||
<div class="word-companion-scene-card">
|
||||
<div>
|
||||
<span>Current Chapter</span>
|
||||
<strong data-chapter-create-link-chapter>-</strong>
|
||||
<section class="word-companion-tab-panel" data-tab-panel="diagnostics" aria-label="Diagnostics" hidden>
|
||||
<section class="word-companion-section">
|
||||
<div class="word-companion-section-header">
|
||||
<span>Diagnostics</span>
|
||||
<button type="button" data-run-diagnostics>Run Diagnostics</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-companion-actions">
|
||||
<button type="button" data-create-plotdirector-chapter disabled>Create Chapter in PlotDirector</button>
|
||||
<button type="button" data-link-existing-chapter disabled>Link to Existing Chapter</button>
|
||||
</div>
|
||||
<p class="word-companion-message" data-chapter-create-link-status></p>
|
||||
<div class="word-companion-resolve-diagnostics" aria-label="Resolve diagnostics">
|
||||
<div>
|
||||
<span>Selected Project ID</span>
|
||||
<strong data-resolve-project-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Selected Project</span>
|
||||
<strong data-resolve-project-title>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Selected Book ID</span>
|
||||
<strong data-resolve-book-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Selected Book</span>
|
||||
<strong data-resolve-book-title>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Detected Chapter</span>
|
||||
<strong data-resolve-detected-chapter>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Detected Scene</span>
|
||||
<strong data-resolve-detected-scene>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Resolve Request Chapter</span>
|
||||
<strong data-resolve-request-chapter>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Resolve Request Scene</span>
|
||||
<strong data-resolve-request-scene>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Resolve Result</span>
|
||||
<strong data-resolve-result>Not run</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Chapter ID</span>
|
||||
<strong data-resolve-chapter-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Scene ID</span>
|
||||
<strong data-resolve-scene-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Book ID</span>
|
||||
<strong data-anchor-book-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Linked Chapter ID</span>
|
||||
<strong data-anchor-chapter-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Linked Scene ID</span>
|
||||
<strong data-anchor-scene-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Last Synced</span>
|
||||
<strong data-sync-last-synced>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Sync Count</span>
|
||||
<strong data-sync-plotdirector-count>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Anchor Type</span>
|
||||
<strong data-diagnostic-anchor-type>Title Match</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Stored Scene ID</span>
|
||||
<strong data-diagnostic-stored-scene-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Stored Chapter ID</span>
|
||||
<strong data-diagnostic-stored-chapter-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Current Resolution Method</span>
|
||||
<strong data-diagnostic-resolution-method>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Office Host</span>
|
||||
<strong data-diagnostic-host>Unknown</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Office Platform</span>
|
||||
<strong data-diagnostic-platform>Unknown</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Office Ready</span>
|
||||
<strong data-diagnostic-ready>No</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Word API Available</span>
|
||||
<strong data-diagnostic-word-api>No</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Last Scan Result</span>
|
||||
<strong data-diagnostic-last-scan>Not run</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Last Error</span>
|
||||
<strong data-diagnostic-last-error>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Paragraphs Found</span>
|
||||
<strong data-diagnostic-paragraphs>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Heading 1 Found</span>
|
||||
<strong data-diagnostic-heading1>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Heading 2 Found</span>
|
||||
<strong data-diagnostic-heading2>-</strong>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section class="word-companion-section word-companion-create-link" data-scene-create-link hidden aria-label="Scene Create Link">
|
||||
<div class="word-companion-section-header">
|
||||
<span>Scene Create / Link</span>
|
||||
</div>
|
||||
<div class="word-companion-scene-card">
|
||||
<div>
|
||||
<span>Current Chapter</span>
|
||||
<strong data-create-link-chapter>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Current Scene</span>
|
||||
<strong data-create-link-scene>-</strong>
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-companion-actions">
|
||||
<button type="button" data-create-plotdirector-scene disabled>Create Scene in PlotDirector</button>
|
||||
<button type="button" data-link-existing-scene disabled>Link to Existing Scene</button>
|
||||
</div>
|
||||
<p class="word-companion-message" data-create-link-status></p>
|
||||
</section>
|
||||
|
||||
<section class="word-companion-section word-companion-brief" data-writing-brief-block hidden aria-label="Writing Brief">
|
||||
<span>Writing Brief</span>
|
||||
<p data-writing-brief></p>
|
||||
</section>
|
||||
|
||||
<section class="word-companion-section word-companion-link-groups" data-plotdirector-link-groups hidden aria-label="Scene Links">
|
||||
<div class="word-companion-section-header">
|
||||
<span>Scene Links</span>
|
||||
<button type="button" data-save-scene-links disabled>Save Scene Links</button>
|
||||
</div>
|
||||
<p class="word-companion-message" data-scene-links-status>No resolved PlotDirector scene.</p>
|
||||
<div>
|
||||
<span>Characters</span>
|
||||
<div class="word-companion-check-list" data-character-chips></div>
|
||||
</div>
|
||||
<div>
|
||||
<span>Assets</span>
|
||||
<div class="word-companion-check-list" data-asset-chips></div>
|
||||
</div>
|
||||
<div>
|
||||
<label for="word-companion-primary-location">Primary Location</label>
|
||||
<select id="word-companion-primary-location" data-primary-location-select disabled>
|
||||
<option value="">None</option>
|
||||
</select>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="word-companion-section word-companion-structure-preview" aria-label="Structure Sync Preview">
|
||||
<div class="word-companion-section-header">
|
||||
<span>Structure Sync Preview</span>
|
||||
<div class="word-companion-header-actions">
|
||||
<button type="button" data-analyse-manuscript-structure disabled>Analyse Manuscript Structure</button>
|
||||
<button type="button" data-apply-structure-sync disabled>Apply Structure Sync</button>
|
||||
</div>
|
||||
</div>
|
||||
<p class="word-companion-message" data-structure-preview-status>Select a project and book to analyse manuscript structure.</p>
|
||||
<div class="word-companion-preview-groups" data-structure-preview-results>
|
||||
<p>No preview generated.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<details class="word-companion-section word-companion-collapsible">
|
||||
<summary>Document Outline</summary>
|
||||
<div class="word-companion-outline" data-document-outline>
|
||||
<p>No structure scanned.</p>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<details class="word-companion-section word-companion-collapsible">
|
||||
<summary>Diagnostics</summary>
|
||||
<div class="word-companion-section-header">
|
||||
<span>Diagnostics</span>
|
||||
<button type="button" data-run-diagnostics>Run Diagnostics</button>
|
||||
</div>
|
||||
<div class="word-companion-resolve-diagnostics" aria-label="Resolve diagnostics">
|
||||
<div>
|
||||
<span>Selected Project ID</span>
|
||||
<strong data-resolve-project-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Selected Project</span>
|
||||
<strong data-resolve-project-title>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Selected Book ID</span>
|
||||
<strong data-resolve-book-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Selected Book</span>
|
||||
<strong data-resolve-book-title>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Detected Chapter</span>
|
||||
<strong data-resolve-detected-chapter>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Detected Scene</span>
|
||||
<strong data-resolve-detected-scene>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Resolve Request Chapter</span>
|
||||
<strong data-resolve-request-chapter>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Resolve Request Scene</span>
|
||||
<strong data-resolve-request-scene>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Resolve Result</span>
|
||||
<strong data-resolve-result>Not run</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Chapter ID</span>
|
||||
<strong data-resolve-chapter-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Scene ID</span>
|
||||
<strong data-resolve-scene-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Anchor Type</span>
|
||||
<strong data-diagnostic-anchor-type>Title Match</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Stored Scene ID</span>
|
||||
<strong data-diagnostic-stored-scene-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Stored Chapter ID</span>
|
||||
<strong data-diagnostic-stored-chapter-id>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Current Resolution Method</span>
|
||||
<strong data-diagnostic-resolution-method>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Office Host</span>
|
||||
<strong data-diagnostic-host>Unknown</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Office Platform</span>
|
||||
<strong data-diagnostic-platform>Unknown</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Office Ready</span>
|
||||
<strong data-diagnostic-ready>No</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Word API Available</span>
|
||||
<strong data-diagnostic-word-api>No</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Last Scan Result</span>
|
||||
<strong data-diagnostic-last-scan>Not run</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Last Error</span>
|
||||
<strong data-diagnostic-last-error>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Paragraphs Found</span>
|
||||
<strong data-diagnostic-paragraphs>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Heading 1 Found</span>
|
||||
<strong data-diagnostic-heading1>-</strong>
|
||||
</div>
|
||||
<div>
|
||||
<span>Heading 2 Found</span>
|
||||
<strong data-diagnostic-heading2>-</strong>
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<footer class="word-companion-footer">
|
||||
<span data-office-status>Word Companion loading</span>
|
||||
</footer>
|
||||
|
||||
<div class="word-companion-compat-hooks" hidden>
|
||||
<span data-summary-connection></span>
|
||||
<span data-summary-project></span>
|
||||
<span data-summary-book></span>
|
||||
<button type="button" data-refresh-document></button>
|
||||
<button type="button" data-refresh-plotdirector-scene></button>
|
||||
<span data-sync-word-count></span>
|
||||
<section data-plotdirector-scene-details>
|
||||
<span data-plotdirector-scene-title></span>
|
||||
</section>
|
||||
<div data-location-chips></div>
|
||||
</div>
|
||||
|
||||
<dialog class="word-companion-dialog" data-link-existing-dialog>
|
||||
<form method="dialog">
|
||||
<div class="word-companion-section-header">
|
||||
|
||||
@ -21,24 +21,26 @@ body {
|
||||
margin: 0;
|
||||
min-width: 280px;
|
||||
color: var(--companion-ink);
|
||||
background: var(--companion-paper);
|
||||
background: #f4f6f4;
|
||||
font-family: "Segoe UI", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
|
||||
}
|
||||
|
||||
.word-companion-shell {
|
||||
display: grid;
|
||||
gap: 12px;
|
||||
gap: 10px;
|
||||
width: 100%;
|
||||
max-width: 420px;
|
||||
min-height: 100vh;
|
||||
padding: 16px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.word-companion-header {
|
||||
display: grid;
|
||||
gap: 6px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 10px;
|
||||
border-bottom: 1px solid var(--companion-line);
|
||||
padding-bottom: 14px;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
.word-companion-eyebrow {
|
||||
@ -52,7 +54,7 @@ body {
|
||||
|
||||
.word-companion-header h1 {
|
||||
margin: 0;
|
||||
font-size: 1.55rem;
|
||||
font-size: 1.12rem;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
@ -62,7 +64,7 @@ body {
|
||||
.word-companion-footer {
|
||||
margin: 0;
|
||||
color: var(--companion-muted);
|
||||
font-size: 0.9rem;
|
||||
font-size: 0.82rem;
|
||||
}
|
||||
|
||||
.word-companion-status {
|
||||
@ -84,12 +86,43 @@ body {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.word-companion-section {
|
||||
.word-companion-tabs {
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 3px;
|
||||
border: 1px solid var(--companion-line);
|
||||
border-radius: 8px;
|
||||
padding: 12px;
|
||||
padding: 3px;
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
.word-companion-tabs button {
|
||||
min-height: 30px;
|
||||
border: 0;
|
||||
border-radius: 6px;
|
||||
background: transparent;
|
||||
color: var(--companion-muted);
|
||||
font: inherit;
|
||||
font-size: 0.78rem;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.word-companion-tabs button.is-active {
|
||||
background: var(--companion-accent);
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.word-companion-tab-panel {
|
||||
display: grid;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.word-companion-section {
|
||||
display: grid;
|
||||
gap: 7px;
|
||||
border: 1px solid var(--companion-line);
|
||||
border-radius: 8px;
|
||||
padding: 10px;
|
||||
background: var(--companion-panel);
|
||||
}
|
||||
|
||||
@ -108,7 +141,7 @@ body {
|
||||
|
||||
.word-companion-section select {
|
||||
width: 100%;
|
||||
min-height: 36px;
|
||||
min-height: 32px;
|
||||
border: 1px solid var(--companion-line);
|
||||
border-radius: 6px;
|
||||
padding: 6px 8px;
|
||||
@ -117,6 +150,15 @@ body {
|
||||
font: inherit;
|
||||
}
|
||||
|
||||
.word-companion-connection {
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.word-companion-connection .word-companion-message {
|
||||
grid-column: auto;
|
||||
}
|
||||
|
||||
.word-companion-section select:disabled {
|
||||
background: var(--companion-soft);
|
||||
color: var(--companion-muted);
|
||||
@ -137,7 +179,7 @@ body {
|
||||
}
|
||||
|
||||
.word-companion-section-header button {
|
||||
min-height: 32px;
|
||||
min-height: 30px;
|
||||
border: 1px solid var(--companion-accent);
|
||||
border-radius: 6px;
|
||||
padding: 5px 9px;
|
||||
@ -162,7 +204,7 @@ body {
|
||||
}
|
||||
|
||||
.word-companion-actions button {
|
||||
min-height: 36px;
|
||||
min-height: 34px;
|
||||
border: 1px solid var(--companion-accent);
|
||||
border-radius: 6px;
|
||||
padding: 6px 8px;
|
||||
@ -212,7 +254,8 @@ body {
|
||||
}
|
||||
|
||||
.word-companion-scene-card,
|
||||
.word-companion-structure-grid {
|
||||
.word-companion-structure-grid,
|
||||
.word-companion-metrics {
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
}
|
||||
@ -224,14 +267,59 @@ body {
|
||||
background: var(--companion-soft);
|
||||
}
|
||||
|
||||
.word-companion-scene-summary {
|
||||
gap: 9px;
|
||||
}
|
||||
|
||||
.word-companion-title-row strong {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.word-companion-badges {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.word-companion-badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
width: fit-content;
|
||||
min-height: 24px;
|
||||
border: 1px solid rgba(47, 111, 99, 0.24);
|
||||
border-radius: 999px;
|
||||
padding: 3px 8px;
|
||||
background: #ffffff;
|
||||
color: var(--companion-accent-dark) !important;
|
||||
font-size: 0.74rem !important;
|
||||
font-weight: 800 !important;
|
||||
text-transform: none !important;
|
||||
}
|
||||
|
||||
.word-companion-scene-card div,
|
||||
.word-companion-sync-meta div,
|
||||
.word-companion-structure-grid div,
|
||||
.word-companion-diagnostics-grid div {
|
||||
.word-companion-diagnostics-grid div,
|
||||
.word-companion-metrics div {
|
||||
display: grid;
|
||||
gap: 2px;
|
||||
}
|
||||
|
||||
.word-companion-metrics {
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.word-companion-metrics div {
|
||||
border: 1px solid rgba(47, 111, 99, 0.16);
|
||||
border-radius: 6px;
|
||||
padding: 7px;
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
.word-companion-metrics strong {
|
||||
font-size: 0.92rem;
|
||||
}
|
||||
|
||||
.word-companion-sync-meta {
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
@ -264,6 +352,7 @@ body {
|
||||
|
||||
.word-companion-resolve-diagnostics {
|
||||
padding-top: 4px;
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.word-companion-resolve-diagnostics strong {
|
||||
|
||||
@ -5,6 +5,8 @@
|
||||
};
|
||||
|
||||
const shell = document.querySelector(".word-companion-shell");
|
||||
const tabButtons = [...document.querySelectorAll("[data-tab-button]")];
|
||||
const tabPanels = [...document.querySelectorAll("[data-tab-panel]")];
|
||||
const officeStatus = document.querySelector("[data-office-status]");
|
||||
const connectionStatus = document.querySelector("[data-connection-status]");
|
||||
const summaryConnection = document.querySelector("[data-summary-connection]");
|
||||
@ -157,6 +159,20 @@
|
||||
}
|
||||
};
|
||||
|
||||
const selectTab = (tabName) => {
|
||||
for (const button of tabButtons) {
|
||||
const active = button.dataset.tabButton === tabName;
|
||||
button.classList.toggle("is-active", active);
|
||||
button.setAttribute("aria-selected", active ? "true" : "false");
|
||||
}
|
||||
|
||||
for (const panel of tabPanels) {
|
||||
const active = panel.dataset.tabPanel === tabName;
|
||||
panel.classList.toggle("is-active", active);
|
||||
panel.hidden = !active;
|
||||
}
|
||||
};
|
||||
|
||||
const setConnectionStatus = (message) => {
|
||||
if (connectionStatus) {
|
||||
connectionStatus.textContent = message;
|
||||
@ -306,7 +322,7 @@
|
||||
saveSceneLinksButton.disabled = !resolvedSceneId;
|
||||
}
|
||||
setSyncStatus(resolvedSceneId ? "Ready to sync." : "No resolved PlotDirector scene.");
|
||||
setSceneLinksStatus(resolvedSceneId ? "Ready to save." : "No resolved PlotDirector scene.");
|
||||
setSceneLinksStatus(resolvedSceneId ? "Ready to save." : "Link a PlotDirector scene first.");
|
||||
updateAnchorDisplay();
|
||||
};
|
||||
|
||||
@ -411,7 +427,7 @@
|
||||
setPlotDirectorSceneStatus(message);
|
||||
setHidden(plotDirectorSceneDetails, true);
|
||||
setHidden(writingBriefBlock, true);
|
||||
setHidden(plotDirectorLinkGroups, true);
|
||||
setHidden(plotDirectorLinkGroups, false);
|
||||
hideChapterCreateLink();
|
||||
hideSceneCreateLink();
|
||||
currentResolutionMethod = "";
|
||||
@ -1838,7 +1854,7 @@
|
||||
|
||||
const saveSceneLinks = async () => {
|
||||
if (!resolvedSceneId) {
|
||||
setSceneLinksStatus("No resolved PlotDirector scene.");
|
||||
setSceneLinksStatus("Link a PlotDirector scene first.");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2861,6 +2877,10 @@
|
||||
}
|
||||
};
|
||||
|
||||
for (const button of tabButtons) {
|
||||
button.addEventListener("click", () => selectTab(button.dataset.tabButton));
|
||||
}
|
||||
|
||||
projectSelect?.addEventListener("change", async () => {
|
||||
const projectId = Number.parseInt(projectSelect.value || "", 10);
|
||||
writeStoredId(storageKeys.projectId, Number.isInteger(projectId) && projectId > 0 ? projectId : null);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user