From d5e11987c291379b6051ac0b76c5818a4d04da13 Mon Sep 17 00:00:00 2001 From: Nick Beckley Date: Mon, 7 Sep 2026 20:37:31 +0000 Subject: [PATCH] Align timeline metric points with rendered scene geometry --- PlotLine.Tests/Browser/README.md | 17 ++ PlotLine.Tests/Browser/package-lock.json | 80 +++++++ PlotLine.Tests/Browser/package.json | 5 + .../Browser/timeline-metric-layout.cjs | 198 ++++++++++++++++++ PlotLine/wwwroot/css/site.css | 15 +- PlotLine/wwwroot/css/site.min.css | 2 +- PlotLine/wwwroot/js/site.js | 133 ++++++++++-- PlotLine/wwwroot/js/site.min.js | 2 +- 8 files changed, 429 insertions(+), 23 deletions(-) create mode 100644 PlotLine.Tests/Browser/README.md create mode 100644 PlotLine.Tests/Browser/package-lock.json create mode 100644 PlotLine.Tests/Browser/package.json create mode 100644 PlotLine.Tests/Browser/timeline-metric-layout.cjs diff --git a/PlotLine.Tests/Browser/README.md b/PlotLine.Tests/Browser/README.md new file mode 100644 index 0000000..816a6a7 --- /dev/null +++ b/PlotLine.Tests/Browser/README.md @@ -0,0 +1,17 @@ +# Timeline metric browser regressions + +Run from this directory: + +```sh +npm ci +npx playwright install chromium +npm test +``` + +Set `CHROMIUM_PATH` to use an existing Chromium executable. The tests load the production metric-chart initializer, repository CSS, and the same Chart.js version referenced by `_Layout.cshtml`. They use isolated DOM fixtures; no database, login, or running application is required. Keep the pinned Chart.js dependency in step with the layout's CDN version. + +Coverage includes all four timeline views and three densities, one and three books, headers consuming different horizontal widths, unequal scene widths, timelines exceeding 30,000 CSS pixels, start/middle/end scrolling, viewport resizing, section collapse/expand, and device pixel ratios 1 and 2. Assertions compare every scene centre with its chart coordinate, and visible rendered point positions, with a tolerance below half a CSS pixel. Tooltips, metric toggles, point navigation, and drag-save scene identity are exercised; saves are mocked. + +The chart derives coordinates from rendered scene rectangles. A sticky, viewport-sized canvas lives inside the full-width frame in the existing timeline scroll container. The custom Chart.js linear scale uses CSS pixel positions directly, including axis and frame padding, without scaling scene positions to the chart area. ResizeObserver and the timeline layout event invalidate measurements; scroll events only update the visible chart window. + +When scene cards are collapsed after measurement, the last measured geometry remains available. If scene cards are disabled or initially collapsed, the chart retains the standalone ordinal layout until rendered scene geometry becomes available. Analytics and character charts retain their standalone layouts. Raw metric rows remain on their existing CSS grid; they are not part of this chart fix. diff --git a/PlotLine.Tests/Browser/package-lock.json b/PlotLine.Tests/Browser/package-lock.json new file mode 100644 index 0000000..e809ecb --- /dev/null +++ b/PlotLine.Tests/Browser/package-lock.json @@ -0,0 +1,80 @@ +{ + "name": "Browser", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "chart.js": "4.4.9", + "playwright": "1.58.2" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/chart.js": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz", + "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + } + } +} diff --git a/PlotLine.Tests/Browser/package.json b/PlotLine.Tests/Browser/package.json new file mode 100644 index 0000000..1ebc861 --- /dev/null +++ b/PlotLine.Tests/Browser/package.json @@ -0,0 +1,5 @@ +{ + "private": true, + "scripts": { "test": "node timeline-metric-layout.cjs" }, + "devDependencies": { "chart.js": "4.4.9", "playwright": "1.58.2" } +} diff --git a/PlotLine.Tests/Browser/timeline-metric-layout.cjs b/PlotLine.Tests/Browser/timeline-metric-layout.cjs new file mode 100644 index 0000000..2d3ae38 --- /dev/null +++ b/PlotLine.Tests/Browser/timeline-metric-layout.cjs @@ -0,0 +1,198 @@ +// npm install && npx playwright install chromium && npm test +// Optional: CHROMIUM_PATH=/path/to/chrome npm test +const { chromium } = require('playwright'); +const fs = require('node:fs'); +const path = require('node:path'); +const assert = require('node:assert/strict'); +const repo = path.resolve(__dirname, '../..'); +const source = fs.readFileSync(path.join(repo, 'PlotLine/wwwroot/js/site.js'), 'utf8'); +const start = source.indexOf('(() => {\n const chartRoots ='); +const chartScript = source.slice(start, source.indexOf('\n})();', start) + 6); +const css = fs.readFileSync(path.join(repo, 'PlotLine/wwwroot/css/site.css'), 'utf8'); +const chartJs = path.join(path.dirname(require.resolve('chart.js')), 'chart.umd.js'); +const settle = async page => { + await page.evaluate(() => new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)))); + await page.waitForTimeout(100); +}; + +async function fixture(page, bookCount, sceneCount, variedHeaders = false, mode = "visible") { + const scenes = []; + let books = ''; + for (let book = 0; book < bookCount; book++) { + let chapters = ''; + for (let chapter = 0; chapter < 3; chapter++) { + let cards = ''; + for (let n = 0; n < sceneCount; n++) { + const id = scenes.length + 1; + scenes.push({ sceneId: id, sceneNumber: id, chapterLabel: `Chapter ${chapter + 1}`, + sceneTitle: `Scene ${id}`, axisLabel: `S${id}`, bookTitle: `Book ${book + 1}`, timelineUrl: `https://plotdirector.test/Timeline?selectedSceneId=${id}` }); + cards += `Scene ${id}`; + } + chapters += `
Chapter ${chapter + 1}
${cards}
`; + } + books += `
Book ${book + 1}
${chapters}
`; + } + const payload = { scenes, metrics: ['Tension', 'Action'].map((metricName, i) => ({ metricName, metricTypeId: i + 1, + points: scenes.map(s => ({ sceneId: s.sceneId, value: 3 + s.sceneId % 5 })) })) }; + await page.setContent(`
+
Project
${books}
+
+
+
Metric Shape
+
`); + if (mode !== "visible") { + await page.evaluate(mode => { + const body = document.querySelector('[data-collapse-body="scene-cards"]'); + if (mode === "disabled") body.remove(); + else body.classList.add('timeline-section-collapsed'); + }, mode); + } + await page.addScriptTag({ path: chartJs }); + await page.addScriptTag({ content: chartScript }); + await settle(page); +} + +async function checkAlignment(page, label) { + const result = await page.evaluate(() => { + const chart = Chart.getChart(document.querySelector('canvas')); + const left = chart.canvas.getBoundingClientRect().left; + const points = chart.data.datasets[0].data; + const errors = points.filter(p => p.sceneId).map(p => { + const rect = document.querySelector(`[data-scene-id="${p.sceneId}"]`).getBoundingClientRect(); + return Math.abs(left + chart.scales.x.getPixelForValue(p.x) - rect.left - rect.width / 2); + }); + const drawnErrors = chart.getDatasetMeta(0).data.flatMap((point, i) => { + if (point.skip || point.x < chart.chartArea.left || point.x > chart.chartArea.right) return []; + const rect = document.querySelector(`[data-scene-id="${points[i].sceneId}"]`).getBoundingClientRect(); + return [Math.abs(left + point.x - rect.left - rect.width / 2)]; + }); + return { max: Math.max(...errors), drawnMax: Math.max(0, ...drawnErrors), bitmap: chart.canvas.width, + limit: document.querySelector('.timeline-shell').clientWidth * devicePixelRatio + 1 }; + }); + assert.ok(result.max < 0.5, `${label}: scale drift ${JSON.stringify(result)}`); + assert.ok(result.drawnMax < 0.5, `${label}: rendered drift ${JSON.stringify(result)}`); + assert.ok(result.bitmap <= result.limit, `${label}: canvas exceeds viewport`); +} + +async function checkInteractions(page) { + await page.evaluate(() => { + const canvas = document.querySelector('canvas'); + canvas.scrollIntoView({ block: 'center' }); + const shell = document.querySelector('.timeline-shell'); + shell.scrollLeft = (shell.scrollWidth - shell.clientWidth) / 2; + }); + await settle(page); + const point = await page.evaluate(() => { + const chart = Chart.getChart(document.querySelector('canvas')); + const index = chart.getDatasetMeta(0).data.findIndex(p => !p.skip && p.x > chart.width / 2 && p.x < chart.chartArea.right - 20); + const p = chart.getDatasetMeta(0).data[index]; + const rect = chart.canvas.getBoundingClientRect(); + return { index, sceneId: chart.data.datasets[0].data[index].sceneId, x: rect.left + p.x, y: rect.top + p.y }; + }); + assert.ok(point.index > 0, 'exercise a scene well beyond the first'); + await page.mouse.move(point.x, point.y); + await settle(page); + assert.ok(await page.evaluate(id => { + const chart = Chart.getChart(document.querySelector('canvas')); + return chart.tooltip.title[0].endsWith(`Scene ${id}`); + }, point.sceneId), 'tooltip must resolve scene identity from dataset index'); + + await page.evaluate(() => { + const checkboxes = document.querySelectorAll('[data-metric-toggles] input'); + checkboxes[1].click(); + window.savedMetric = null; + window.fetch = async (_, options) => { + window.savedMetric = JSON.parse(options.body); + return { ok: true, json: async () => ({ success: true, value: window.savedMetric.value }) }; + }; + }); + await page.mouse.move(point.x, point.y); + await page.mouse.down(); + await page.mouse.move(point.x, point.y - 25, { steps: 3 }); + await page.mouse.up(); + await settle(page); + const saved = await page.evaluate(() => window.savedMetric); + assert.equal(saved.sceneId, point.sceneId, 'drag saves the correct scene'); + assert.equal(saved.metricId, 1); + await checkAlignment(page, 'after metric editing'); + await page.evaluate(() => document.querySelectorAll('[data-metric-toggles] input')[1].click()); + assert.equal(await page.evaluate(() => Chart.getChart(document.querySelector('canvas')).isDatasetVisible(1)), true); + + const navigation = page.waitForRequest(request => request.url().includes('selectedSceneId=')); + await page.route('https://plotdirector.test/**', route => route.abort()); + await page.evaluate(index => { + const chart = Chart.getChart(document.querySelector('canvas')); + const p = chart.getDatasetMeta(0).data[index]; + const rect = chart.canvas.getBoundingClientRect(); + chart.canvas.dispatchEvent(new MouseEvent('click', { bubbles: true, clientX: rect.left + p.x, clientY: rect.top + p.y })); + }, point.index); + assert.ok((await navigation).url().endsWith(`selectedSceneId=${point.sceneId}`), 'point click targets its scene'); +} + +(async () => { + const browser = await chromium.launch({ headless: true, executablePath: process.env.CHROMIUM_PATH }); + try { + for (const dpr of [1, 2]) { + const page = await browser.newPage({ viewport: { width: 1100, height: 900 }, deviceScaleFactor: dpr }); + const errors = []; + page.on('pageerror', error => errors.push(error.message)); + for (const [books, count, headers] of [[1, 12, false], [3, 18, true]]) { + await fixture(page, books, count, headers); + for (const density of ['compact', 'comfortable', 'expanded']) { + for (const zoom of ['book', 'chapter', 'scene-detail', 'scene-overview']) { + await page.evaluate(({ density, zoom }) => { + document.querySelector('[data-timeline-root]').className = `timeline-filtered-root density-${density} zoom-${zoom}`; + }, { density, zoom }); + await settle(page); + for (const fraction of [0, 0.5, 1]) { + await page.evaluate(f => { + const shell = document.querySelector('.timeline-shell'); + shell.scrollLeft = (shell.scrollWidth - shell.clientWidth) * f; + }, fraction); + await settle(page); + await checkAlignment(page, `${books} books ${density}/${zoom} scroll=${fraction} dpr=${dpr}`); + } + } + } + await page.setViewportSize({ width: 760, height: 900 }); + await settle(page); + await checkAlignment(page, 'resize'); + // Width changes without an application event must trigger ResizeObserver. + await page.evaluate(() => { + document.querySelectorAll('.timeline-scene-card').forEach((el, i) => el.style.width = `${120 + i % 4 * 73}px`); + document.querySelectorAll('.timeline-chapter,.timeline-book').forEach(el => el.style.width = 'max-content'); + }); + await settle(page); + await checkAlignment(page, 'unequal scene widths'); + for (const section of ['metrics', 'scene-cards']) { + await page.evaluate(section => document.querySelector(`[data-collapse-body="${section}"]`).classList.add('timeline-section-collapsed'), section); + await settle(page); + await page.evaluate(section => { + document.querySelector(`[data-collapse-body="${section}"]`).classList.remove('timeline-section-collapsed'); + window.dispatchEvent(new Event('plotline:timeline-layout-changed')); + }, section); + await settle(page); + await checkAlignment(page, `expand ${section}`); + } + await page.setViewportSize({ width: 1100, height: 900 }); + } + await fixture(page, 1, 6, false, 'collapsed'); + await page.evaluate(() => { + document.querySelector('[data-collapse-body="scene-cards"]').classList.remove('timeline-section-collapsed'); + window.dispatchEvent(new Event('plotline:timeline-layout-changed')); + }); + await settle(page); + await checkAlignment(page, 'initially collapsed scene cards'); + await fixture(page, 1, 6, false, 'disabled'); + assert.equal(await page.evaluate(() => Chart.getChart(document.querySelector('canvas')).scales.x.type), 'linear', 'standalone layout remains supported'); + await fixture(page, 3, 18, true); + await checkInteractions(page); + assert.deepEqual(errors, []); + await page.close(); + } + console.log('PASS: timeline metric geometry and interactions (views/densities, single/multi-book, unequal widths, scrolling, resize, collapse/disabled cards, DPR 1/2, long timelines, tooltips, toggles, click, drag-save)'); + } finally { await browser.close(); } +})().catch(error => { console.error(error); process.exitCode = 1; }); diff --git a/PlotLine/wwwroot/css/site.css b/PlotLine/wwwroot/css/site.css index a8aabbe..9280a93 100644 --- a/PlotLine/wwwroot/css/site.css +++ b/PlotLine/wwwroot/css/site.css @@ -1747,7 +1747,7 @@ body.timeline-inspector-resizing { .metric-timeline-row { display: grid; - grid-template-columns: var(--timeline-label-width) calc((var(--scene-count) * var(--timeline-scene-width)) + ((var(--scene-count) - 1) * var(--timeline-grid-gap))); + grid-template-columns: var(--timeline-label-width) var(--metric-layout-width, calc((var(--scene-count) * var(--timeline-scene-width)) + ((var(--scene-count) - 1) * var(--timeline-grid-gap)))); gap: var(--timeline-grid-gap); align-items: stretch; } @@ -3004,6 +3004,19 @@ body.timeline-inspector-resizing { width: calc((var(--scene-count) * var(--timeline-scene-width)) + ((var(--scene-count) - 1) * var(--timeline-grid-gap))); } +/* The full frame shares the scene scroll space; only its bitmap is viewport sized. */ +.metric-timeline-measured { + padding-left: 0; + padding-right: 0; +} + +.metric-timeline-viewport { + position: sticky; + left: 0; + height: 300px; + min-width: 0; +} + .metric-chart-frame canvas { width: 100%; height: 300px; diff --git a/PlotLine/wwwroot/css/site.min.css b/PlotLine/wwwroot/css/site.min.css index c8aa924..48e2812 100644 --- a/PlotLine/wwwroot/css/site.min.css +++ b/PlotLine/wwwroot/css/site.min.css @@ -1 +1 @@ -html{font-size:15px;min-height:100%}.writing-context-page{min-height:calc(100vh - 8rem);color:var(--plotline-ink)}.writing-context-scene-header,.writing-context-shell-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1.5rem;margin-bottom:1rem}.writing-context-scene-header h2,.writing-context-shell-header h1{margin:0}.writing-context-status{display:inline-flex;align-items:center;gap:.5rem;padding:.4rem .65rem;border:1px solid var(--plotline-line);border-radius:999px;background:var(--plotline-panel);color:var(--plotline-muted);font-size:.9rem;white-space:nowrap}.writing-context-status-dot{width:.55rem;height:.55rem;border-radius:50%;background:#2f8f63;box-shadow:0 0 0 .18rem rgba(47,143,99,.15)}.writing-context-empty{min-height:42vh;display:grid;align-content:center;justify-items:start;padding:3rem;border:1px solid var(--plotline-line);border-radius:.5rem;background:var(--plotline-panel)}.writing-context-scene-header{padding:1rem 0 1.2rem;border-bottom:1px solid var(--plotline-line)}.writing-context-scene-header p{margin:.35rem 0 0;color:var(--plotline-muted)}.writing-context-scene-actions{display:grid;grid-template-columns:minmax(18rem,28rem) auto;gap:.5rem;align-items:end}.writing-context-scene-actions label{grid-column:1/-1;margin:0;color:var(--plotline-muted);font-size:.82rem;font-weight:700}.writing-context-tabs{display:flex;flex-wrap:wrap;gap:.35rem;margin:1rem 0}.writing-context-tabs button{border:1px solid var(--plotline-line);border-radius:.4rem;background:var(--plotline-panel);color:var(--plotline-ink);padding:.55rem .85rem;font-weight:700}.writing-context-tabs button.active{background:var(--plotline-accent);border-color:var(--plotline-accent);color:#fff}.writing-context-tab-panel[hidden]{display:none}.writing-context-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem}.writing-context-grid--overview{grid-template-columns:minmax(0,1.35fr) minmax(20rem,.65fr)}.writing-context-grid--place{grid-template-columns:minmax(18rem,.7fr) minmax(0,1.3fr)}.writing-context-card{min-width:0;padding:1rem;border:1px solid var(--plotline-line);border-radius:.5rem;background:var(--plotline-panel)}.writing-context-card--hero,.writing-context-card--wide{grid-column:span 2}.writing-context-card h3{margin:0 0 .65rem;font-size:1.2rem}.writing-context-facts{display:grid;grid-template-columns:minmax(7rem,.45fr) minmax(0,1fr);gap:.45rem .75rem;margin:0}.writing-context-facts dt{color:var(--plotline-muted);font-weight:700}.writing-context-facts dd{margin:0}.writing-context-chip-row{display:flex;flex-wrap:wrap;gap:.4rem;margin-bottom:.65rem}.writing-context-chip-row span,.writing-context-relationship-list span{display:inline-flex;align-items:center;border:1px solid var(--plotline-line);border-radius:999px;padding:.2rem .55rem;background:var(--plotline-paper);color:var(--plotline-muted);font-size:.82rem}.writing-context-list{display:grid;gap:.7rem;padding:0;margin:0;list-style:none}.writing-context-list li{min-width:0}.writing-context-list p{margin:.2rem 0 0;color:var(--plotline-muted)}.writing-intent-status-label{display:inline-flex;align-items:center;margin-left:.35rem;padding:.1rem .45rem;border:1px solid var(--plotline-line);border-radius:999px;background:var(--plotline-paper);color:var(--plotline-muted);font-size:.78rem;font-weight:700}.writing-intent-checklist li{display:grid;grid-template-columns:4.5rem minmax(0,1fr);gap:.5rem;align-items:start}.writing-intent-checklist li>span:first-child{color:var(--plotline-muted);font-size:.78rem;font-weight:800;text-transform:uppercase}.writing-intent-checklist li.is-complete>span:last-child{color:var(--plotline-muted);text-decoration:line-through}.writing-context-people-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(18rem,1fr));gap:1rem}.writing-context-person-heading{display:flex;align-items:center;gap:.75rem;margin-bottom:.9rem}.writing-context-person-heading h3,.writing-context-person-heading p{margin:0}.writing-context-mini-section,.writing-context-person-heading p{color:var(--plotline-muted)}.writing-context-mini-section{margin-top:.8rem;padding-top:.8rem;border-top:1px solid var(--plotline-line)}.writing-context-mini-section p{margin:0 0 .35rem}.writing-context-relationship-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(16rem,1fr));gap:.7rem}.writing-context-relationship-list>div{display:grid;gap:.35rem;padding:.75rem;border:1px solid var(--plotline-line);border-radius:.4rem;background:var(--plotline-paper)}.writing-context-floor{display:grid;grid-template-columns:repeat(var(--floor-cols),minmax(0,1fr));grid-template-rows:repeat(var(--floor-rows),minmax(1.2rem,1fr));gap:.18rem;min-height:34rem;padding:.5rem;border:1px solid var(--plotline-line);border-radius:.45rem;background:color-mix(in srgb,var(--plotline-paper) 88%,var(--plotline-line));overflow:auto}.writing-context-floor-block{display:grid;align-content:start;gap:.2rem;min-width:0;min-height:2.2rem;padding:.35rem;border:1px solid color-mix(in srgb,var(--plotline-accent) 35%,var(--plotline-line));border-radius:.3rem;background:color-mix(in srgb,var(--plotline-panel) 92%,var(--plotline-accent));font-size:.82rem}.writing-context-floor-block span{color:var(--plotline-muted);overflow-wrap:anywhere}@media (max-width:900px){.writing-context-scene-header,.writing-context-shell-header{display:grid}.writing-context-grid,.writing-context-grid--overview,.writing-context-grid--place,.writing-context-scene-actions{grid-template-columns:1fr}.writing-context-card--hero,.writing-context-card--wide{grid-column:auto}}@media (min-width:768px){html{font-size:16px}}:root{--plotline-ink:#1e252b;--plotline-muted:#66717b;--plotline-paper:#fbfaf7;--plotline-panel:#ffffff;--plotline-line:#d8ddd8;--plotline-accent:#2f6f63;--plotline-accent-dark:#22534a;--plotline-soft:#eef5f2;--timeline-label-width:180px;--timeline-scene-width:220px;--timeline-grid-gap:10px}body{min-height:100%;margin-bottom:0;color:var(--plotline-ink);background:var(--plotline-paper)}a{color:var(--plotline-accent-dark)}.btn-primary{--bs-btn-bg:var(--plotline-accent);--bs-btn-border-color:var(--plotline-accent);--bs-btn-hover-bg:var(--plotline-accent-dark);--bs-btn-hover-border-color:var(--plotline-accent-dark)}.btn-outline-primary{--bs-btn-color:var(--plotline-accent-dark);--bs-btn-border-color:var(--plotline-accent);--bs-btn-hover-bg:var(--plotline-accent);--bs-btn-hover-border-color:var(--plotline-accent)}.plotline-nav{background:rgba(255,255,255,.94);backdrop-filter:blur(8px)}.plotline-shell{max-width:1480px;padding-left:24px;padding-right:24px}.plotline-shell-wide{max-width:none;padding-left:clamp(18px,2vw,32px);padding-right:clamp(18px,2vw,32px)}.page-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:24px;margin:18px 0 24px}.workspace-heading{display:flex;align-items:flex-end;justify-content:space-between;gap:18px;margin:14px 0 18px}.workspace-heading h1{margin:0;font-size:clamp(1.8rem, 3vw, 2.7rem);line-height:1.05}.page-heading.compact{max-width:980px}.page-heading h1{margin:0;font-size:clamp(2rem, 4vw, 3.2rem);line-height:1.05;letter-spacing:0}.eyebrow{margin:0 0 6px;color:var(--plotline-accent-dark);font-size:.78rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.lead-text{max-width:760px;margin:10px 0 0;color:var(--plotline-muted);font-size:1.05rem}.button-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.asset-card-footer form,.button-row form,.compact-buttons form,form[data-confirm-message],td.text-end form{display:inline-flex;align-items:center;margin:0}td.text-end{white-space:nowrap}.content-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px}.edit-panel,.empty-panel,.list-section,.plain-card{background:var(--plotline-panel);border:1px solid var(--plotline-line);border-radius:8px;padding:20px;box-shadow:0 10px 24px rgba(30,37,43,.04)}.empty-panel h2,.list-section h2,.plain-card h2{margin-top:0;font-size:1.35rem}.empty-panel p,.muted,.plain-card p{color:var(--plotline-muted)}.edit-panel{max-width:980px}.feature-request-admin-page .edit-panel,.feature-request-admin-page .page-heading.compact{max-width:none}.names-library-panel{max-width:none}.names-library-panel--search{margin-bottom:20px}.names-library-panel--results{margin-top:0}.feature-request-admin-table{table-layout:fixed}.feature-request-admin-table td,.feature-request-admin-table th{vertical-align:middle}.feature-request-admin-table__preview{max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feature-request-admin-table__action{width:78px}@media (max-width:1100px){.feature-request-admin-table{table-layout:auto}.feature-request-admin-table__preview{max-width:160px}}.trial-dashboard-banner,.trial-status-panel{border:1px solid var(--plotline-line);border-radius:8px;padding:18px 20px;background:var(--plotline-panel)}.trial-status-panel{display:grid;gap:12px;margin-bottom:18px}.trial-status-panel--signup{grid-template-columns:minmax(0,1fr) auto;align-items:center;max-width:980px}.trial-dashboard-banner h2,.trial-status-panel h2,.trial-status-panel h3{margin:0}.trial-dashboard-banner p,.trial-status-panel p{margin-bottom:0}.trial-dashboard-banner,.trial-status-panel__heading{display:flex;gap:16px;align-items:center;justify-content:space-between}.trial-dashboard-banner{margin-bottom:18px}.trial-dashboard-banner__body{min-width:0}.trial-dashboard-banner__actions{display:flex;flex:0 0 auto;flex-wrap:wrap;gap:8px}.trial-progress{height:10px;overflow:hidden;border-radius:999px;background:rgba(84,68,48,.12)}.trial-progress__bar{height:100%;border-radius:inherit}.trial-dashboard-banner[hidden],.trial-status-panel[hidden]{display:none}.location-page .drag-drop-panel,.location-page .edit-panel,.location-page .empty-panel,.location-page .page-heading.compact{max-width:none}.import-panel,.import-preview-section{max-width:none}.import-json-input{font-family:Consolas,"Liberation Mono",Menlo,monospace;font-size:.88rem;line-height:1.45;min-height:34rem;max-height:64vh;overflow:auto;resize:vertical;white-space:pre}.import-counts,.import-preview-heading{display:flex;align-items:flex-start;gap:12px}.import-preview-heading{justify-content:space-between;margin-bottom:16px}.import-counts{flex-wrap:wrap}.import-counts span{display:inline-flex;align-items:baseline;gap:5px;border:1px solid var(--plotline-line);border-radius:999px;padding:5px 11px;background:var(--plotline-soft);color:var(--plotline-muted);font-weight:700}.import-counts strong{color:var(--plotline-ink)}.import-tree{display:grid;gap:12px}.import-tree-book{border:1px solid var(--plotline-line);border-radius:8px;padding:14px;background:rgba(255,255,255,.54)}.import-tree-book>summary,.import-tree-chapter>summary{display:flex;align-items:center;justify-content:space-between;gap:12px;cursor:pointer}.import-tree-book>summary span,.import-tree-chapter>summary span{color:var(--plotline-muted);font-size:.84rem;font-weight:700;white-space:nowrap}.import-tree-book h3{margin:0 0 10px;font-size:1.08rem}.import-tree-chapter{border-top:1px solid var(--plotline-line);padding:10px 0 0;margin-top:10px}.import-tree-chapter ul{margin:8px 0 0;color:var(--plotline-muted)}.import-scene-meta{display:block;margin-top:2px;color:var(--plotline-muted);font-size:.82rem}.import-mapping-summary{display:grid;gap:6px;border:1px solid rgba(184,118,43,.28);border-radius:8px;padding:10px 12px;margin-bottom:14px;background:rgba(251,236,211,.5);color:var(--plotline-muted);font-size:.9rem}.import-duplicate-confirm{border:1px solid rgba(184,118,43,.34);border-radius:8px;padding:12px 12px 12px 38px;background:rgba(251,236,211,.72)}.import-confirmation,.import-docs details{border:1px solid var(--plotline-line);border-radius:8px;padding:16px;background:rgba(255,255,255,.42)}.import-confirmation h3,.import-doc-grid h3{margin-top:0;font-size:1.05rem}.import-docs summary{cursor:pointer;font-weight:800}.import-doc-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;margin-top:14px}.import-message-list ul{max-height:16rem;overflow:auto}.scene-editor{max-width:1180px}.table{margin-bottom:0}.table th{color:var(--plotline-muted);font-size:.78rem;letter-spacing:.06em;text-transform:uppercase}.narrow{width:90px;white-space:nowrap}.status-pill{display:inline-flex;align-items:center;width:fit-content;border:1px solid #c8d8d2;border-radius:999px;padding:2px 8px;color:var(--plotline-accent-dark);background:var(--plotline-soft);font-size:.78rem;font-weight:700;white-space:nowrap}.dashboard-summary-card{border-color:var(--plotline-line)}.dashboard-summary-grid{display:grid;grid-template-columns:repeat(9,minmax(0,1fr));gap:8px}.dashboard-summary-body{padding:8px 9px}.dashboard-summary-label{margin-bottom:3px;font-size:.64rem;line-height:1.15}.dashboard-summary-value{display:block;font-size:1.25rem;line-height:1;overflow-wrap:anywhere}.dashboard-summary-calm{border-color:rgba(47,111,99,.28);background:rgba(238,245,242,.62)}.dashboard-summary-mild{border-color:rgba(197,139,43,.32);background:rgba(255,248,232,.68)}.dashboard-summary-attention{border-color:rgba(142,80,103,.32);background:rgba(252,241,246,.7)}@media (max-width:1199.98px){.dashboard-summary-grid{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (max-width:767.98px){.dashboard-summary-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:420px){.dashboard-summary-grid{grid-template-columns:1fr}}.dashboard-progress-card{border-color:rgba(47,111,99,.18);background:linear-gradient(180deg,#fff 0,rgba(238,245,242,.64) 100%)}.dashboard-progress-body{padding:12px 14px}.dashboard-progress-heading{margin-bottom:8px}.dashboard-progress-title{margin:0 0 2px;font-size:1.05rem;line-height:1.2}.dashboard-series-progress{height:7px;background:rgba(47,111,99,.1)}.dashboard-series-progress .progress-bar{background:linear-gradient(90deg,var(--plotline-accent),#6fa99b)}.dashboard-progress-source{border-color:rgba(47,111,99,.2);color:var(--plotline-accent-dark);background:rgba(238,245,242,.9)}.dashboard-book-title-block h3{line-height:1.16}.dashboard-book-title-block a{color:var(--plotline-ink);text-decoration-color:rgba(47,111,99,0.35)}.dashboard-book-subtitle{color:var(--plotline-muted);font-size:.95rem;line-height:1.25}.dashboard-status-pill{border-color:var(--dashboard-status-border,#c8d8d2);color:var(--dashboard-status-ink,var(--plotline-accent-dark));background:var(--dashboard-status-bg,var(--plotline-soft))}.dashboard-status-published{--dashboard-status-border:rgba(47, 111, 99, 0.32);--dashboard-status-bg:#e7f2ed;--dashboard-status-ink:#22534a}.dashboard-status-drafting{--dashboard-status-border:rgba(184, 118, 43, 0.35);--dashboard-status-bg:#fff2dd;--dashboard-status-ink:#7b4b12}.dashboard-status-planning{--dashboard-status-border:rgba(51, 117, 155, 0.3);--dashboard-status-bg:#e9f3f8;--dashboard-status-ink:#245b78}.dashboard-status-outlining,.dashboard-status-research{--dashboard-status-border:rgba(103, 80, 164, 0.26);--dashboard-status-bg:#f0edf8;--dashboard-status-ink:#51417c}.dashboard-status-revising{--dashboard-status-border:rgba(123, 82, 148, 0.3);--dashboard-status-bg:#f4eefa;--dashboard-status-ink:#5f3e73}.dashboard-status-editing{--dashboard-status-border:rgba(68, 75, 130, 0.3);--dashboard-status-bg:#eceef8;--dashboard-status-ink:#343b72}.dashboard-status-proofreading{--dashboard-status-border:rgba(43, 130, 123, 0.3);--dashboard-status-bg:#e6f5f2;--dashboard-status-ink:#23625d}.dashboard-status-ready{--dashboard-status-border:rgba(185, 142, 30, 0.34);--dashboard-status-bg:#fff6d8;--dashboard-status-ink:#765a0f}.dashboard-status-paused{--dashboard-status-border:rgba(102, 113, 123, 0.28);--dashboard-status-bg:#f0f2f1;--dashboard-status-ink:#56616b}.dashboard-status-archived{--dashboard-status-border:rgba(139, 80, 86, 0.28);--dashboard-status-bg:#f3eded;--dashboard-status-ink:#76474d}.dashboard-attention-soft{border-color:rgba(102,113,123,.24);color:#56616b;background:#f3f4f2}.word-companion-follow-toggle[aria-pressed=true]{border-color:rgba(47,111,99,.36);color:var(--plotline-accent-dark);background:var(--plotline-soft);font-weight:700}.word-companion-follow-toggle[aria-pressed=true]::after{content:" On"}.word-companion-follow-toggle[aria-pressed=false]::after{content:" Off"}.order-buttons{display:flex;gap:6px}.purpose-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:8px;max-height:260px;overflow:auto;padding:10px;border:1px solid var(--plotline-line);border-radius:8px;background:#fcfcfb}.purpose-check{display:flex;align-items:center;gap:8px;font-size:.92rem}.timeline-filter{display:flex;align-items:center;gap:8px;min-width:min(420px,100%)}.workspace-layout{display:grid;grid-template-columns:minmax(0,1fr);gap:0;align-items:start;--timeline-inspector-width:min(40vw, 560px)}.workspace-layout.inspector-drawer-open{grid-template-columns:minmax(420px,1fr) 10px minmax(420px,var(--timeline-inspector-width));gap:12px}.timeline-workspace{min-width:0;max-width:100%}.timeline-inspector-resizer{position:sticky;top:76px;z-index:25;width:10px;height:calc(100vh - 96px);border-radius:999px;cursor:col-resize;background:linear-gradient(180deg,rgba(47,111,99,.16),rgba(47,111,99,.04))}.timeline-inspector-resizer::before{content:"";display:block;width:2px;height:48px;margin:18px auto;border-radius:999px;background:var(--plotline-accent);opacity:.55}.timeline-inspector-resizer:focus-visible,.timeline-inspector-resizer:hover{background:rgba(47,111,99,.16)}body.timeline-inspector-resizing{cursor:col-resize;user-select:none}.pacing-panel{margin-top:14px;margin-bottom:0;border:1px solid var(--plotline-line);border-radius:8px;padding:14px;background:#fff;box-shadow:0 10px 24px rgba(30,37,43,.04)}.pacing-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:10px}.pacing-heading h2{margin:0;font-size:1.1rem}.metric-graph-stack{display:grid;gap:10px;max-width:100%;overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;padding-bottom:4px}.metric-graph-row{display:grid;grid-template-columns:150px minmax(260px,1fr);gap:10px;align-items:center;min-width:max(100%,calc(150px + (var(--scene-count,1) * 34px)))}.metric-graph-label{color:var(--plotline-muted);font-size:.84rem;font-weight:700}.metric-graph-points{display:grid;grid-template-columns:repeat(var(--scene-count),minmax(28px,1fr));gap:5px;align-items:end;min-height:52px;border-radius:8px;padding:6px;background:linear-gradient(180deg,#f6faf8 0,#edf4f1 100%);min-width:calc(var(--scene-count) * 34px)}.metric-point{display:flex;align-items:flex-end;justify-content:center;height:48px;min-width:28px;color:var(--plotline-accent-dark);text-decoration:none}.metric-point::before{content:"";display:block;width:100%;height:max(8px,var(--metric-height));border-radius:5px 5px 2px 2px;background:linear-gradient(180deg,#6fa99b,var(--plotline-accent-dark));box-shadow:inset 0 1px 0 rgba(255,255,255,.35)}.metric-point span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}.timeline-shell{overflow-x:auto;padding:16px;border:1px solid var(--plotline-line);border-radius:8px;background:linear-gradient(180deg,#fff 0,#f7faf8 100%)}.workspace-timeline{min-height:420px}.timeline-series-row{display:grid;grid-template-columns:var(--timeline-label-width) max-content;gap:var(--timeline-grid-gap);align-items:stretch;width:max-content;min-width:100%}.timeline-project-title{position:sticky;left:0;z-index:20;display:grid;align-content:start;gap:4px;width:var(--timeline-label-width);min-height:100%;border-radius:8px;padding:12px;color:#fff;background:var(--plotline-accent-dark);font-weight:700;box-shadow:8px 0 18px rgba(30,37,43,.08)}.timeline-book-title span,.timeline-project-title span{color:rgba(255,255,255,.78);font-size:.72rem;letter-spacing:.08em;text-transform:uppercase}.timeline-book-title strong,.timeline-project-title strong{line-height:1.15}.timeline-books{display:flex;gap:var(--timeline-grid-gap);align-items:stretch}.timeline-book{flex:0 0 auto;width:calc((var(--book-scene-count) * var(--timeline-scene-width)) + ((var(--book-scene-count) - 1) * var(--timeline-grid-gap)));min-width:var(--timeline-scene-width)}.timeline-book-title{display:grid;gap:2px;margin-bottom:var(--timeline-grid-gap);border-radius:8px;padding:10px 12px;color:#fff;background:var(--plotline-accent-dark);font-weight:700}.timeline-chapters{display:flex;gap:var(--timeline-grid-gap);align-items:flex-start}.timeline-chapter{flex:0 0 auto;width:calc((var(--chapter-scene-count) * var(--timeline-scene-width)) + ((var(--chapter-scene-count) - 1) * var(--timeline-grid-gap)));min-width:var(--timeline-scene-width);box-sizing:border-box;border-radius:8px;background:rgba(238,245,242,.7);outline:1px solid #d4ded8;outline-offset:0;overflow:visible}.timeline-chapter-title{display:grid;gap:2px;border-bottom:1px solid #d4ded8;padding:10px 12px;color:var(--plotline-accent-dark);font-weight:700}.timeline-chapter-title span{color:var(--plotline-muted);font-size:.76rem;text-transform:uppercase}.timeline-scenes{display:grid;grid-template-columns:repeat(var(--chapter-scene-count),minmax(0,1fr));gap:var(--timeline-grid-gap);width:100%;box-sizing:border-box;min-height:190px;padding:0}.timeline-empty-scene,.timeline-scene-card{display:flex;flex-direction:column;gap:6px;width:100%;min-width:0;box-sizing:border-box;border:1px solid var(--plotline-line);border-radius:8px;padding:12px;background:#fff;color:var(--plotline-ink);text-decoration:none;box-shadow:0 8px 18px rgba(30,37,43,.05)}.timeline-scene-card:hover{border-color:var(--plotline-accent);color:var(--plotline-ink)}.metric-point-placeholder,.timeline-placeholder-cell,.timeline-placeholder-scene{cursor:default;opacity:.72}.timeline-placeholder-scene{align-items:center;justify-content:center;border-style:dashed;color:var(--plotline-muted);background:rgba(255,255,255,.38);font-size:.86rem;font-weight:800;text-align:center}.timeline-placeholder-cell{border-style:dashed;background:repeating-linear-gradient(-45deg,rgba(216,221,216,.18) 0,rgba(216,221,216,.18) 7px,rgba(255,255,255,.18) 7px,rgba(255,255,255,.18) 14px)}.story-calendar-heading{gap:1rem}.story-calendar-stats{display:flex;flex-wrap:wrap;gap:.5rem;justify-content:flex-end}.story-calendar-stats span{display:inline-flex;gap:.35rem;align-items:baseline;border:1px solid var(--plotline-line);border-radius:999px;padding:.35rem .7rem;background:var(--plotline-panel);color:var(--plotline-muted);font-size:.88rem}.story-calendar-stats strong{color:var(--plotline-ink)}.story-calendar-filter .form-label{font-size:.82rem;font-weight:800;color:var(--plotline-muted)}.story-calendar-shell{display:grid;gap:.85rem}.story-calendar-detail,.story-calendar-layout,.story-calendar-month,.story-calendar-toolbar{border:1px solid var(--plotline-line);border-radius:8px;background:var(--plotline-panel)}.story-calendar-toolbar{display:flex;gap:.75rem;align-items:center;justify-content:space-between;padding:.75rem}.story-calendar-story-months{display:flex;flex-wrap:wrap;gap:.75rem;font-size:.9rem;font-weight:700}.story-calendar-layout{display:grid;grid-template-columns:minmax(0,1fr) minmax(280px,360px);gap:0;overflow:hidden}.story-calendar-grid-wrap{min-width:0;overflow-x:auto}.story-calendar-month{min-width:860px;border:0;border-radius:0}.story-calendar-month-title{padding:.85rem 1rem;border-bottom:1px solid var(--plotline-line);color:var(--plotline-ink);font-size:1.15rem;font-weight:850}.story-calendar-grid,.story-calendar-weekdays{display:grid;grid-template-columns:repeat(7,minmax(0,1fr))}.story-calendar-weekdays{border-bottom:1px solid var(--plotline-line);background:var(--plotline-soft)}.story-calendar-weekdays div{padding:.55rem .65rem;border-right:1px solid var(--plotline-line);color:var(--plotline-muted);font-size:.76rem;font-weight:850;text-transform:uppercase}.story-calendar-weekdays div:last-child{border-right:0}.story-calendar-day{display:grid;grid-template-rows:auto 1fr;gap:.35rem;min-height:132px;border-right:1px solid var(--plotline-line);border-bottom:1px solid var(--plotline-line);padding:.55rem;background:var(--plotline-panel);color:var(--plotline-ink);text-decoration:none}.story-calendar-day:nth-child(7n){border-right:0}.story-calendar-day:focus,.story-calendar-day:hover{background:color-mix(in srgb,var(--plotline-soft) 72%,var(--plotline-panel));color:var(--plotline-ink)}.story-calendar-day.is-overflow{background:color-mix(in srgb,var(--plotline-paper) 82%,var(--plotline-line));color:var(--plotline-muted)}.story-calendar-day.is-selected{outline:3px solid color-mix(in srgb,var(--plotline-accent) 34%,transparent);outline-offset:-3px;background:color-mix(in srgb,var(--plotline-soft) 86%,var(--plotline-panel))}.story-calendar-day-number{font-size:.95rem;font-weight:850}.story-calendar-day-scenes{display:grid;align-content:start;gap:.3rem;min-width:0}.story-calendar-scene-chip{display:grid;gap:.08rem;border:1px solid color-mix(in srgb,var(--plotline-accent) 28%,var(--plotline-line));border-radius:6px;padding:.3rem .4rem;background:color-mix(in srgb,var(--plotline-panel) 88%,var(--plotline-soft));color:var(--plotline-muted);font-size:.72rem;line-height:1.18}.story-calendar-scene-chip strong{overflow:hidden;color:var(--plotline-ink);font-size:.78rem;font-weight:800;text-overflow:ellipsis;white-space:nowrap}.story-calendar-book,.story-calendar-more{color:var(--plotline-accent-dark);font-weight:850}.story-calendar-more{font-size:.76rem}.story-calendar-detail{display:grid;align-content:start;gap:.8rem;height:100%;max-height:none;min-height:0;overflow:auto;border-top:0;border-right:0;border-bottom:0;border-radius:0;padding:1rem}.story-calendar-detail h2{margin:0;color:var(--plotline-ink);font-size:1.1rem}.story-calendar-detail-notice{margin:0;border:1px solid var(--plotline-line);border-radius:6px;padding:.45rem .6rem;background:var(--plotline-soft);color:var(--plotline-muted);font-size:.86rem;font-weight:700}.story-calendar-detail-notice.is-error{border-color:color-mix(in srgb,var(--bs-danger) 34%,var(--plotline-line));background:color-mix(in srgb,var(--bs-danger) 8%,var(--plotline-panel));color:var(--bs-danger)}.story-calendar-detail-list{display:grid;gap:.75rem}.story-calendar-detail-scene{display:grid;gap:.55rem;border:1px solid var(--plotline-line);border-radius:8px;padding:.75rem;background:color-mix(in srgb,var(--plotline-panel) 94%,var(--plotline-paper))}.story-calendar-detail-scene h3{margin:0;color:var(--plotline-ink);font-size:1rem}.story-calendar-detail-scene dl,.story-calendar-detail-scene p{margin:0}.story-calendar-detail-scene dl{display:grid;grid-template-columns:auto 1fr;gap:.15rem .45rem;font-size:.86rem}.story-calendar-detail-meta,.story-calendar-detail-scene dt{color:var(--plotline-muted);font-weight:800}.story-calendar-detail-meta{display:flex;flex-wrap:wrap;gap:.45rem;font-size:.76rem}.story-calendar-unplaced{margin-top:1rem}.story-calendar-unplaced-list{display:grid;gap:.55rem}.story-calendar-unplaced-list article{display:flex;gap:.75rem;align-items:center;justify-content:space-between;border:1px solid var(--plotline-line);border-radius:8px;padding:.65rem .75rem;background:var(--plotline-panel)}.story-calendar-unplaced-list article div{display:grid;gap:.15rem}.story-calendar-unplaced-list small,.story-calendar-unplaced-list span{color:var(--plotline-muted)}@media (max-width:960px){.story-calendar-layout,.story-calendar-toolbar{display:grid}.story-calendar-layout{grid-template-columns:1fr}.story-calendar-detail{max-height:none;border-top:1px solid var(--plotline-line);border-left:0}.story-calendar-stats{justify-content:flex-start}}.metric-point-placeholder::before{height:4px;background:rgba(102,113,123,.2);box-shadow:none}.timeline-scene-card.selected{border-color:var(--plotline-accent-dark);box-shadow:0 0 0 3px rgba(47,111,99,.16),0 10px 22px rgba(30,37,43,.08)}.purpose-chip-row,.scene-badge-row{display:flex;flex-wrap:wrap;gap:5px;align-items:center}.warning-placeholder{display:inline-flex;width:fit-content;border:1px dashed #d6b25e;border-radius:999px;padding:2px 8px;color:#755715;background:#fff8e8;font-size:.74rem;font-weight:700}.warning-placeholder.active{border-color:rgba(159,69,69,.36);color:#8a3434;background:rgba(255,232,232,.9);gap:5px;font-weight:800}.dependency-placeholder{display:inline-flex;width:fit-content;border:1px solid rgba(47,111,99,.2);border-radius:999px;padding:2px 8px;color:var(--plotline-accent-dark);background:rgba(47,111,99,.08);font-size:.74rem;font-weight:700}.purpose-chip{display:inline-flex;width:fit-content;border-radius:999px;padding:2px 7px;color:#38453e;background:#edf0eb;font-size:.72rem;font-weight:700}.future-lane-placeholder{border-top:1px dashed #cbd8d2;padding:8px 12px;color:var(--plotline-muted);font-size:.78rem;background:rgba(255,255,255,.45)}.metric-timeline-board{display:grid;gap:8px;width:max-content;min-width:100%;margin-top:14px;border-top:1px solid var(--plotline-line);padding-top:14px}.metric-shape-controls{position:sticky;left:0;z-index:6;display:grid;gap:8px;width:calc(var(--timeline-label-width) + (var(--scene-count) * var(--timeline-scene-width)) + (var(--scene-count) * var(--timeline-grid-gap)));min-width:100%;border-radius:8px;padding:10px;background:rgba(255,255,255,.88)}.metric-timeline-row{display:grid;grid-template-columns:var(--timeline-label-width) calc((var(--scene-count) * var(--timeline-scene-width)) + ((var(--scene-count) - 1) * var(--timeline-grid-gap)));gap:var(--timeline-grid-gap);align-items:stretch}.metric-lane-label{position:sticky;left:0;z-index:12;display:grid;align-content:start;gap:4px;min-height:320px;border:1px solid rgba(47,111,99,.18);border-radius:8px;padding:10px;color:var(--plotline-accent-dark);background:#fff;box-shadow:0 6px 14px rgba(30,37,43,.04)}.metric-lane-label span{color:var(--plotline-muted);font-size:.78rem;font-weight:600}.colour-swatch{display:inline-block;width:18px;height:18px;border:1px solid rgba(30,37,43,.18);border-radius:999px;vertical-align:middle}.plot-lane-board{position:relative;display:grid;gap:8px;width:max-content;min-width:100%;margin-top:14px;border-top:1px solid var(--plotline-line);padding-top:14px}.plot-lane-svg-overlay{position:absolute;inset:0 auto auto 0;z-index:4;pointer-events:none;overflow:visible}.plot-lane-svg-health-overlay{z-index:8}.plot-line-svg-path{fill:none;stroke-width:3.5;stroke-linecap:round;opacity:.72}.plot-line-svg-segment-dormant{stroke-dasharray:9 8;opacity:.48}.plot-line-svg-connector{fill:none;stroke-width:3;stroke-linecap:round;opacity:.58}.plot-line-svg-path.plotline-state-questionable,.plot-line-svg-path.plotline-state-resolved{stroke:#8c9491;opacity:.42}.plot-line-svg-path.plotline-state-abandoned{stroke:#9b2f36;opacity:.5}.plot-event-svg-node.plotline-state-questionable,.plot-event-svg-node.plotline-state-resolved{opacity:.88}.plot-event-svg-node.plotline-state-abandoned{opacity:.9}.plot-event-svg-node.plotline-state-abandoned line{stroke:#ffffff}.plotline-health-marker circle,.plotline-health-marker path{fill:#f4c430;stroke:#8a6712;stroke-width:1.5}.plotline-health-marker{pointer-events:visiblePainted}.plotline-health-marker line,.plotline-health-marker text{stroke:#5e4710;fill:#5e4710;stroke-width:1.6;stroke-linecap:round}.plotline-health-marker text{font-size:11px;font-weight:800;stroke-width:0;pointer-events:none}.plotline-health-count{fill:#ffffff;stroke:#8a6712;stroke-width:2;paint-order:stroke}.plotline-health-marker-dangling circle,.plotline-health-marker-dangling path{fill:#f8df8f}.plotline-health-marker-abandoned circle,.plotline-health-marker-abandoned path{fill:#d85c63;stroke:#8b1e2d}.plotline-health-marker-abandoned line{stroke:#ffffff}.plot-event-svg-node circle,.plot-event-svg-node ellipse,.plot-event-svg-node path{stroke:#ffffff;stroke-width:2}.plot-event-svg-node line,.plot-event-svg-node path[fill=none]{stroke:#8b1e2d;stroke-width:3.4;stroke-linecap:round;stroke-linejoin:round}.plot-event-svg-node-reveal ellipse{stroke-width:2.4}.plot-event-svg-label{font-size:9.5px;font-weight:900;font-family:system-ui,-apple-system,"Segoe UI",sans-serif;paint-order:stroke;stroke:rgba(30,37,43,0.22);stroke-width:.8px;pointer-events:none}.plot-event-svg-node-resolve path[fill=none]{stroke:#ffffff}.lane-board-heading,.metric-lane-board-heading,.plot-lane-board-heading{position:sticky;left:0;z-index:6;display:flex;align-items:center;justify-content:space-between;gap:14px;width:calc(var(--timeline-label-width) + (var(--scene-count) * var(--timeline-scene-width)) + (var(--scene-count) * var(--timeline-grid-gap)));min-width:100%;margin-bottom:2px;border-radius:8px;padding:8px 10px;color:var(--plotline-accent-dark);background:rgba(255,255,255,.92);font-weight:700;box-shadow:0 8px 16px rgba(30,37,43,.05)}.lane-board-heading small,.metric-lane-board-heading small,.plot-lane-board-heading small{color:var(--plotline-muted);font-weight:500;white-space:nowrap}.timeline-heading-with-help{display:inline-flex;align-items:center;gap:6px;min-width:0}.plot-lane-row{display:grid;grid-template-columns:var(--timeline-label-width) repeat(var(--scene-count),var(--timeline-scene-width));gap:var(--timeline-grid-gap);align-items:stretch}.plot-lane-label{position:sticky;left:0;z-index:12;display:flex;align-items:center;gap:8px;min-height:46px;border:1px solid color-mix(in srgb,var(--plot-colour),#fff 55%);border-left:5px solid var(--plot-colour);border-radius:8px;padding:8px 10px;background:#fff;color:var(--plotline-ink);text-decoration:none;box-shadow:0 6px 14px rgba(30,37,43,.04)}.plot-lane-label:hover{color:var(--plotline-ink);border-color:var(--plot-colour)}.plot-lane-slots{display:contents}.plot-lane-slot{display:flex;flex-wrap:wrap;align-content:center;align-items:center;justify-content:center;gap:5px;min-height:46px;border:1px dashed #d8ddd8;border-radius:8px;padding:7px;background:rgba(255,255,255,.62)}.thread-marker{position:relative;z-index:5;display:inline-flex;align-items:center;justify-content:center;gap:4px;min-width:34px;height:30px;border:2px solid color-mix(in srgb,var(--plot-colour),#000 20%);border-radius:999px;padding:0 8px;color:var(--plotline-ink);background:color-mix(in srgb,var(--plot-colour),#fff 66%);font-size:.74rem;font-weight:900;text-decoration:none;box-shadow:0 3px 8px rgba(30,37,43,.14)}.plot-lane-board [data-plot-event-node]{opacity:1}.thread-marker:focus-visible,.thread-marker:hover{color:var(--plotline-ink);background:color-mix(in srgb,var(--plot-colour),#fff 48%);outline:3px solid rgba(47,111,99,.22);outline-offset:2px}.thread-marker.resolved{border-color:#5a8c60;background:#e6f4e7;color:#24512b}.thread-marker.contradicted{border-color:#b45c5c;background:#fff0f0;color:#7a2222}.thread-events-section{margin-top:16px}.thread-event-list{display:grid;gap:8px;margin-bottom:12px}.thread-event-item{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;border:1px solid color-mix(in srgb,var(--plot-colour),#fff 55%);border-left:4px solid var(--plot-colour);border-radius:8px;padding:8px;background:#fff}.thread-event-item>div{display:grid;gap:3px}.thread-event-marker{display:inline-flex;align-items:center;justify-content:center;width:fit-content;min-width:24px;height:22px;border-radius:999px;padding:0 7px;background:color-mix(in srgb,var(--plot-colour),#fff 72%);font-size:.72rem;font-weight:800}.thread-event-create{border-top:1px solid var(--plotline-line);padding-top:12px}.asset-lane-board{display:grid;gap:8px;width:max-content;min-width:100%;margin-top:14px;border-top:1px solid var(--plotline-line);padding-top:14px}.asset-lane-row{display:grid;grid-template-columns:var(--timeline-label-width) repeat(var(--scene-count),var(--timeline-scene-width));gap:var(--timeline-grid-gap);align-items:stretch}.asset-lane-label{position:sticky;left:0;z-index:12;display:grid;gap:2px;min-height:46px;border:1px solid #d4d7df;border-left:5px solid #6b5b95;border-radius:8px;padding:8px 10px;background:#fff;color:var(--plotline-ink);text-decoration:none;box-shadow:0 6px 14px rgba(30,37,43,.04)}.asset-lane-label span{color:var(--plotline-muted);font-size:.75rem}.asset-lane-slots{display:contents}.asset-lane-slot{display:flex;flex-wrap:wrap;align-content:flex-start;gap:5px;min-height:46px;border:1px dashed #d8ddd8;border-radius:8px;padding:7px;background:rgba(250,249,255,.72)}.asset-event-marker,.asset-marker{display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:24px;border:1px solid #7f70aa;border-radius:7px;padding:0 7px;color:#33284e;background:#eee9fb;font-size:.72rem;font-weight:800;text-decoration:none}.asset-marker:hover{color:#33284e;background:#dfd6f7}.asset-marker.timeline-marker-story-turn,.character-marker.timeline-marker-story-turn{border-width:2px}.asset-marker.timeline-marker-important,.character-marker.timeline-marker-important{box-shadow:inset 0 -3px 0 rgba(197,139,43,.36)}.asset-marker.timeline-marker-state-change,.character-marker.timeline-marker-state-change{border-style:double}.asset-marker.timeline-marker-transfer{box-shadow:inset 3px 0 0 rgba(47,111,99,.32)}.character-marker.timeline-marker-exit{opacity:.86;border-style:dashed}.asset-marker.timeline-marker-has-warning,.character-marker.timeline-marker-has-warning{box-shadow:0 0 0 2px rgba(179,95,59,.22)}.asset-events-section{margin-top:16px}.asset-event-list,.asset-mini-list{display:grid;gap:8px;margin-bottom:12px}.asset-event-item,.asset-mini-item{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;border:1px solid #ded9ea;border-left:4px solid #6b5b95;border-radius:8px;padding:8px;background:#fff}.asset-event-item>div,.asset-mini-item>div{display:grid;gap:3px}.asset-create-form{border-top:1px solid var(--plotline-line);padding-top:12px}.asset-card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}.asset-card{display:grid;gap:12px;border:1px solid var(--plotline-line);border-radius:8px;padding:14px;background:#fff;box-shadow:0 8px 18px rgba(30,37,43,.04)}.asset-card h2{margin:0;font-size:1.1rem}.asset-card-footer{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.asset-detail-grid{display:grid;grid-template-columns:minmax(260px,0.8fr) minmax(320px,1.2fr);gap:14px}.character-lane-board{display:grid;gap:8px;width:max-content;min-width:100%;margin-top:14px;border-top:1px solid var(--plotline-line);padding-top:14px}.character-lane-row{display:grid;grid-template-columns:var(--timeline-label-width) repeat(var(--scene-count),var(--timeline-scene-width));gap:var(--timeline-grid-gap);align-items:stretch}.character-lane-label{position:sticky;left:0;z-index:12;display:grid;gap:2px;min-height:46px;border:1px solid #d7d4ce;border-left:5px solid #8a6f3d;border-radius:8px;padding:8px 10px;background:#fff;color:var(--plotline-ink);text-decoration:none;box-shadow:0 6px 14px rgba(30,37,43,.04)}.character-lane-label span{color:var(--plotline-muted);font-size:.75rem}.character-lane-slots{display:contents}.character-lane-slot{display:flex;flex-wrap:wrap;align-content:flex-start;gap:5px;min-height:46px;border:1px dashed #d8ddd8;border-radius:8px;padding:7px;background:rgba(255,252,246,.72)}.character-marker{display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:24px;border:1px solid #9a7a3f;border-radius:999px;padding:0 7px;color:#4f3810;background:#fff2d7;font-size:.72rem;font-weight:800;text-decoration:none}.character-card{border-left:4px solid #8a6f3d}.character-section{margin-top:16px}.character-item{border-left-color:#8a6f3d}.character-appearance-card{display:grid;gap:8px;border:1px solid #d7d4ce;border-left:4px solid #8a6f3d;border-radius:8px;padding:10px;background:#fff}.character-appearance-summary{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.character-appearance-summary>div:first-child{display:grid;gap:3px}.character-appearance-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:6px}.character-appearance-edit .asset-create-form{margin-top:8px;border-top:1px solid var(--plotline-line)}.word-companion-suggestion-panel{display:grid;gap:8px;margin-bottom:12px;border:1px solid rgba(138,111,61,.24);border-radius:8px;padding:10px;background:rgba(255,248,232,.72)}.word-companion-suggestion-list{display:grid;gap:8px}.word-companion-suggestion-item{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;border:1px solid #ded9ea;border-left:4px solid #8a6f3d;border-radius:8px;padding:8px;background:#fff}.word-companion-suggestion-item>div:first-child{display:grid;gap:3px}.word-companion-suggestion-pill{margin-left:6px}.form-helper-message{margin:0 0 8px;font-size:.86rem;font-weight:700}.scene-number,.time-label{color:var(--plotline-muted);font-size:.82rem}.location-badge,.location-pill{display:inline-flex;align-items:center;width:fit-content;border:1px solid rgba(47,111,99,.18);border-radius:999px;padding:2px 7px;color:var(--plotline-accent-dark);background:rgba(47,111,99,.08);font-size:.74rem;font-weight:700}.scene-summary{display:-webkit-box;overflow:hidden;color:var(--plotline-muted);font-size:.88rem;-webkit-box-orient:vertical;-webkit-line-clamp:4}.timeline-empty-scene{justify-content:center;color:var(--plotline-muted);background:rgba(255,255,255,.58)}.form-check-input:focus,.form-control:focus,.form-select:focus{border-color:var(--plotline-accent);box-shadow:0 0 0 .2rem rgba(47,111,99,.16)}.scene-inspector-panel{position:sticky;top:76px;display:flex;flex-direction:column;max-height:calc(100vh - 96px);min-width:0;overflow:hidden;border:1px solid var(--plotline-line);border-radius:8px;background:#fff;box-shadow:0 14px 32px rgba(30,37,43,.08)}.inspector-header{position:sticky;top:0;z-index:5;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;border-bottom:1px solid var(--plotline-line);padding:16px;background:#fff}.scene-inspector-body{flex:1 1 auto;min-height:0;overflow:auto;padding:16px}.inspector-header h2{margin:0;font-size:1.25rem}.location-helper{border:1px solid rgba(138,111,61,.22);border-radius:8px;padding:10px;background:rgba(255,248,232,.74)}.location-warning-list{margin:0;padding-left:18px;color:#6f5526;font-size:.86rem}.location-tree{display:grid;gap:8px}.location-tree-row{display:flex;align-items:center;justify-content:space-between;gap:12px;border-bottom:1px solid var(--plotline-line);padding:10px 0 10px calc(var(--location-depth,0) * 22px)}.location-tree-row:last-child{border-bottom:0}.location-tree-row>div:first-child{display:grid;gap:3px}.compact-buttons{flex-wrap:nowrap}.location-chip-list{display:flex;flex-wrap:wrap;gap:8px}.location-chip{border:1px solid var(--plotline-line);border-radius:8px;padding:7px 10px;background:#fff;text-decoration:none}.location-relationship-list{display:grid;gap:8px}.location-relationship-card{display:flex;justify-content:space-between;gap:12px;border:1px solid var(--plotline-line);border-radius:8px;padding:10px;background:#fff}.location-flags{display:flex;flex-wrap:wrap;gap:10px 16px;color:var(--plotline-muted);font-size:.86rem}.validation-summary,.warning-filter-panel{border:1px solid var(--plotline-line);border-radius:8px;margin-bottom:16px;padding:12px;background:#fff}.validation-summary{display:flex;flex-wrap:wrap;gap:12px;color:var(--plotline-muted)}.warning-dashboard-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin-bottom:18px}.inspector-section-heading,.warning-card-title,.warning-count-row{display:flex;align-items:center;justify-content:space-between;gap:10px}.warning-list,.warning-mini-list{display:grid;gap:10px}.warning-card,.warning-mini-card{border:1px solid var(--plotline-line);border-radius:8px;padding:12px;background:#fff}.warning-card{display:grid;grid-template-columns:1fr auto;gap:12px}.warning-card p,.warning-mini-card p{margin:6px 0}.warning-actions{display:flex;align-items:flex-start;flex-wrap:wrap;gap:6px}.severity-pill{display:inline-flex;align-items:center;border-radius:999px;padding:2px 8px;font-size:.74rem;font-weight:800}.severity-pill.info{color:#365f7c;background:rgba(107,153,184,.14)}.severity-pill.warning{color:#7a5527;background:rgba(205,154,72,.17)}.severity-pill.error{color:#8a3434;background:rgba(190,83,83,.15)}.warning-mini-card{background:rgba(255,255,255,.76)}.dependency-columns{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.dependency-card{display:grid;gap:3px;border:1px solid var(--plotline-line);border-radius:8px;margin-bottom:8px;padding:9px;background:rgba(255,255,255,.78)}.move-preview-panel{max-width:900px}.focused-validation-summary{display:flex;flex-wrap:wrap;gap:10px;border:1px solid rgba(47,111,99,.16);border-radius:8px;margin-top:12px;padding:10px;color:var(--plotline-muted);background:rgba(47,111,99,.05)}.inspector-purpose-list{grid-template-columns:1fr;max-height:210px}.metric-slider-stack{display:grid;gap:12px}.metric-slider{display:grid;gap:4px}.metric-slider-label{display:flex;justify-content:space-between;gap:10px;color:var(--plotline-muted);font-size:.86rem;font-weight:700}.metric-slider-label output{color:var(--plotline-accent-dark)}.metric-slider .form-range{accent-color:var(--plotline-accent)}.asset-importance-slider{border:1px solid var(--plotline-line);border-radius:8px;padding:10px 12px;background:rgba(47,111,99,.05)}.story-asset-checkbox-field{margin-top:1.95rem}.story-asset-event-item{justify-content:flex-start;gap:8px}.story-asset-event-item .asset-event-marker{flex:0 0 auto;min-width:1.55rem;width:auto}.story-asset-event-details{min-width:0}.breadcrumb-trail,.context-nav,.overview-chip-grid{display:flex;flex-wrap:wrap;gap:7px}.breadcrumb-trail a,.breadcrumb-trail span,.context-nav a,.overview-chip{display:inline-flex;align-items:center;border:1px solid var(--plotline-line);border-radius:999px;padding:4px 9px;color:var(--plotline-muted);font-size:.78rem;font-weight:800;text-decoration:none;background:rgba(255,255,255,.72)}.overview-chip.attention{color:#7a5527;border-color:rgba(205,154,72,.35);background:rgba(205,154,72,.14)}.overview-outcome{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;margin:0;color:var(--plotline-muted)}.breadcrumb-trail{margin-bottom:12px}.breadcrumb-trail a:hover,.context-nav a:hover{color:var(--plotline-accent-dark);border-color:rgba(47,111,99,.35);background:rgba(47,111,99,.08)}.context-header,.working-context-banner{display:flex;align-items:center;justify-content:space-between;gap:14px;border:1px solid var(--plotline-line);border-radius:10px;margin-bottom:16px;padding:10px 12px;background:rgba(255,255,255,.84);box-shadow:0 10px 24px rgba(55,48,39,.05)}.context-title{display:grid;gap:2px}.context-title strong{color:var(--plotline-ink)}.analytics-grid-three,.analytics-grid-two,.health-kpi-grid{display:grid;gap:14px;margin:18px 0}.health-kpi-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.health-kpi-grid .plain-card{display:grid;gap:4px}.health-kpi-grid strong{color:var(--plotline-ink);font-size:2rem;line-height:1}.analytics-grid-two{grid-template-columns:repeat(2,minmax(0,1fr))}.analytics-grid-three{grid-template-columns:repeat(3,minmax(0,1fr))}.analytics-section{border:1px solid var(--plotline-line);border-radius:10px;margin:18px 0;padding:16px;background:rgba(255,255,255,.84);box-shadow:0 14px 34px rgba(55,48,39,.07)}.analytics-section-heading{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:14px}.analytics-section-heading h2,.plain-card h3{margin:0}.analytics-metric-stack{display:grid;gap:12px;overflow-x:auto;padding-bottom:4px}.metric-shape-chart{display:grid;gap:12px}.metric-shape-intro{max-width:760px;margin:0;color:var(--plotline-muted)}.metric-toggle-row{display:flex;flex-wrap:wrap;gap:8px}.metric-toggle-pill{display:inline-flex;align-items:center;gap:6px;border:1px solid rgba(82,75,65,.16);border-radius:999px;padding:5px 9px;color:var(--plotline-muted);font-size:.78rem;font-weight:800;background:rgba(255,255,255,.78);cursor:pointer}.metric-toggle-pill::before{content:"";width:10px;height:10px;border-radius:999px;background:var(--metric-colour)}.metric-toggle-pill input{margin:0;accent-color:var(--metric-colour)}.timeline-metric-edit-toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:end}.timeline-metric-edit-select{display:grid;gap:3px;min-width:180px;color:var(--plotline-muted);font-size:.78rem;font-weight:800}.timeline-metric-edit-status{align-self:center;border:1px solid rgba(47,111,99,.18);border-radius:999px;padding:5px 9px;color:var(--plotline-muted);font-size:.78rem;font-weight:800;background:rgba(255,255,255,.72)}.timeline-metric-edit-hint{font-size:.82rem}.metric-chart-frame canvas.metric-curve-editing{cursor:ns-resize}.metric-chart-frame{position:relative;min-height:320px;border:1px solid var(--plotline-line);border-radius:10px;padding:14px 12px 32px;background:linear-gradient(180deg,rgba(255,255,255,.92),rgba(247,245,240,.76))}.metric-timeline-frame{width:calc((var(--scene-count) * var(--timeline-scene-width)) + ((var(--scene-count) - 1) * var(--timeline-grid-gap)))}.metric-chart-frame canvas{width:100%;height:300px}.metric-timeline-board .metric-graph-stack{width:max-content;min-width:100%}.metric-timeline-board .metric-graph-row{grid-template-columns:var(--timeline-label-width) repeat(var(--scene-count),var(--timeline-scene-width));gap:var(--timeline-grid-gap);min-width:100%}.metric-timeline-board .metric-graph-points{display:contents}.metric-timeline-board .metric-point{border:1px solid rgba(47,111,99,.12);border-radius:8px;background:rgba(255,255,255,.62)}.metric-raw-details{border-top:1px solid var(--plotline-line);padding-top:8px}.metric-raw-details summary{color:var(--plotline-muted);font-size:.82rem;font-weight:800;cursor:pointer}.timeline-control-panel{display:grid;gap:12px;border:1px solid var(--plotline-line);border-radius:10px;margin-bottom:16px;padding:12px;background:rgba(255,255,255,.84);box-shadow:0 10px 24px rgba(55,48,39,.05)}.timeline-filter-drawer summary{color:var(--plotline-ink);font-weight:900;cursor:pointer}.timeline-filter-grid{display:grid;grid-template-columns:repeat(6,minmax(130px,1fr));gap:10px;margin-top:12px}.preset-chip-row,.timeline-filter-actions,.timeline-filter-checks,.timeline-preset-panel,.timeline-visibility-panel{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.timeline-filter-checks{grid-column:span 3;color:var(--plotline-muted);font-size:.82rem;font-weight:700}.timeline-filter-actions{grid-column:span 3;justify-content:flex-end}.preset-chip,.timeline-visibility-panel label{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--plotline-line);border-radius:999px;padding:4px 8px;color:var(--plotline-muted);font-size:.78rem;font-weight:800;background:rgba(255,255,255,.76)}.timeline-preset-panel form{display:inline-flex;align-items:center;gap:6px}.preset-chip a{color:var(--plotline-accent-dark);text-decoration:none}.preset-chip button{border:0;color:var(--plotline-muted);background:0 0;font-weight:900}.timeline-focus-banner{display:flex;align-items:center;justify-content:space-between;gap:12px;border:1px solid rgba(47,111,99,.22);border-radius:10px;margin-bottom:16px;padding:10px 12px;background:rgba(47,111,99,.08)}.thread-marker-icon{display:inline-flex;align-items:center;justify-content:center;min-width:16px;font-size:.78rem;font-weight:900}.thread-marker-type-abandon .thread-marker-icon,.thread-marker-type-resolve .thread-marker-icon,.thread-marker-type-start .thread-marker-icon,.thread-marker-type-twist .thread-marker-icon{font-size:.9rem}.thread-marker-type-start{border-radius:8px 999px 999px 8px}.thread-marker-type-twist{border-color:#b8762b;background:#fff4dc}.thread-marker-type-branch,.thread-marker-type-merge,.thread-marker-type-split{border-color:#6750a4;background:#f0ebff}.thread-marker-type-reveal .thread-marker-icon{border:1px solid currentColor;border-radius:999px;font-size:0}.thread-marker-type-reveal .thread-marker-icon::after{content:"";width:4px;height:4px;border-radius:999px;background:currentColor}.timeline-navigation-card{display:grid;grid-template-areas:"icon copy" "icon actions";grid-template-columns:auto minmax(0,620px);gap:8px 14px;align-items:center;justify-content:center;border:1px solid rgba(47,111,99,.42);border-left:5px solid var(--plotline-accent);border-radius:8px;margin:0 0 12px;padding:14px 16px;max-height:280px;overflow:hidden;color:var(--plotline-ink);background:linear-gradient(135deg,rgba(238,245,242,.98),rgba(255,255,255,.94));box-shadow:0 10px 26px rgba(30,37,43,.08);opacity:1;transform:translateY(0);transition:opacity 1.15s ease,max-height 1.2s ease,margin 1.2s ease,padding 1.2s ease,transform 1.15s ease}.timeline-navigation-card[hidden]{display:none}.timeline-navigation-card.is-dismissing{margin-bottom:0;padding-top:0;padding-bottom:0;max-height:0;opacity:0;transform:translateY(-6px)}.timeline-navigation-card-icon{grid-area:icon;display:grid;place-items:center;width:42px;height:42px;border-radius:50%;color:#fff;background:var(--plotline-accent);font-size:1.25rem;font-weight:900}.timeline-navigation-card-copy{grid-area:copy;text-align:center}.timeline-navigation-card-copy h2{margin:0 0 6px;color:var(--plotline-accent-dark);font-size:1rem;font-weight:900}.timeline-navigation-card-copy p{margin:2px 0;color:var(--plotline-ink);font-size:.9rem}.timeline-navigation-card-actions{grid-area:actions;display:flex;flex-wrap:wrap;gap:8px;justify-content:center}.timeline-horizontal-overflow{transition:box-shadow .18s ease}.timeline-horizontal-overflow.has-scroll-left{box-shadow:inset 18px 0 18px -20px rgba(30,37,43,.55)}.timeline-horizontal-overflow.has-scroll-right{box-shadow:inset -18px 0 18px -20px rgba(30,37,43,.55)}.timeline-horizontal-overflow.has-scroll-left.has-scroll-right{box-shadow:inset 18px 0 18px -20px rgba(30,37,43,.55),inset -18px 0 18px -20px rgba(30,37,43,.55)}[data-theme=dark] .timeline-navigation-card{border-color:rgba(111,169,155,.52);border-left-color:#6fa99b;color:#f4eadc;background:linear-gradient(135deg,rgba(34,83,74,.72),rgba(32,31,34,.96));box-shadow:0 12px 28px rgba(0,0,0,.28)}[data-theme=dark] .timeline-navigation-card-copy h2,[data-theme=dark] .timeline-navigation-card-copy p{color:#f4eadc}[data-theme=dark] .timeline-horizontal-overflow.has-scroll-left{box-shadow:inset 18px 0 18px -20px rgba(244,234,220,.55)}[data-theme=dark] .timeline-horizontal-overflow.has-scroll-right{box-shadow:inset -18px 0 18px -20px rgba(244,234,220,.55)}[data-theme=dark] .timeline-horizontal-overflow.has-scroll-left.has-scroll-right{box-shadow:inset 18px 0 18px -20px rgba(244,234,220,.55),inset -18px 0 18px -20px rgba(244,234,220,.55)}@media (prefers-reduced-motion:reduce){.timeline-navigation-card{transition:opacity .12s ease}}.lane-dim,.timeline-scene-card.filter-dim,.timeline-scene-card.focus-dim{opacity:.35}.timeline-scene-card.filter-match.focus-match,.timeline-scene-card.focus-match{outline:3px solid rgba(47,111,99,.32);box-shadow:0 12px 26px rgba(47,111,99,.16)}.timeline-section-hidden{display:none!important}.hide-scene-cards .timeline-scene-card{display:none}.timeline-control-panel{position:sticky;top:56px;z-index:18}.timeline-control-select{padding-right:6px}.timeline-control-select .form-select{width:auto;min-width:132px;border:0;padding-top:2px;padding-bottom:2px;background-color:transparent;color:var(--plotline-accent-dark);font-weight:800}.timeline-jump-panel{display:grid;grid-template-columns:auto minmax(180px,1.2fr) minmax(180px,1fr) minmax(170px,0.9fr) minmax(180px,1fr) auto;gap:8px;align-items:center;width:100%}.timeline-shortcut-hint{color:var(--plotline-muted);font-size:.76rem;font-weight:700;white-space:nowrap}.timeline-minimap{display:flex;align-items:stretch;gap:4px;margin:0 0 12px;padding:8px;max-width:100%;min-width:0;overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;scrollbar-gutter:stable;border:1px solid rgba(47,111,99,.18);border-radius:8px;background:rgba(255,255,255,.72)}.timeline-minimap button{position:relative;flex:0 0 max(42px,calc(var(--chapter-scenes) * 18px));min-width:42px;min-height:34px;border:1px solid rgba(47,111,99,.18);border-radius:7px;color:var(--plotline-accent-dark);background:linear-gradient(180deg,#f8fbf9 0,#edf4f1 100%);font-size:.72rem;font-weight:800}.timeline-minimap button.is-active{border-color:var(--plotline-accent);color:#fff;background:linear-gradient(180deg,var(--plotline-accent) 0,var(--plotline-accent-dark) 100%);box-shadow:0 0 0 2px rgba(47,111,99,.14)}.timeline-minimap button::after{content:"";position:absolute;right:5px;bottom:5px;width:calc(var(--chapter-warnings) * 4px);max-width:28px;height:4px;border-radius:999px;background:#b45c5c;opacity:.75}.drag-drop-panel,.timeline-drag-palette{border:1px solid rgba(47,111,99,.18);border-radius:10px;margin-bottom:12px;padding:12px;background:rgba(255,255,255,.84);box-shadow:0 10px 24px rgba(55,48,39,.05)}.timeline-drag-palette{display:grid;grid-template-columns:minmax(220px,0.35fr) minmax(0,1fr);gap:12px;align-items:center}.drag-chip-group{display:flex;flex-wrap:wrap;gap:6px;max-height:104px;overflow:auto;padding-right:4px}.drag-chip{display:inline-flex;align-items:center;border:1px solid var(--plotline-line);border-radius:999px;padding:4px 9px;background:#fff;color:var(--plotline-ink);font-size:.78rem;font-weight:800;cursor:grab}.drag-chip.character{border-color:#dacb9e;background:#fff8e8}.drag-chip.asset{border-color:#ded9ea;background:#f4f0ff}.drag-chip.location{border-color:rgba(47,111,99,.18);background:#eef8f4}.is-dragging{opacity:.55}.drop-target-active{outline:3px solid rgba(47,111,99,.28);outline-offset:2px}.timeline-chapter.chapter-drop-active,.timeline-scenes.drop-chapter-end{background:rgba(47,111,99,.06)}.timeline-scenes.drop-chapter-end::after{content:"Drop scene at end of chapter";display:flex;align-items:center;justify-content:center;min-width:var(--timeline-scene-width);min-height:74px;border:2px dashed rgba(197,139,43,.48);border-radius:12px;color:#7a5527;background:rgba(255,248,232,.82);font-size:.8rem;font-weight:900}.timeline-scene-card.drop-before{box-shadow:inset 5px 0 0 #c58b2b,0 12px 26px rgba(197,139,43,.16)}.timeline-scene-card.drop-after{box-shadow:inset -5px 0 0 #c58b2b,0 12px 26px rgba(197,139,43,.16)}.drag-drop-panel{position:sticky;top:132px;z-index:19}.drag-drop-panel-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.drag-drop-panel h2{margin:0;font-size:1.08rem}.drag-drop-form{border-top:1px solid var(--plotline-line);margin-top:10px;padding-top:10px}.scene-move-modal-content{border:1px solid rgba(47,111,99,.18);border-radius:14px;background:var(--plotline-surface);color:var(--plotline-ink);box-shadow:0 24px 70px rgba(55,48,39,.22)}.scene-move-modal-content .modal-footer,.scene-move-modal-content .modal-header{border-color:var(--plotline-line)}.scene-move-modal-content .modal-title{margin:0;color:var(--plotline-ink);font-size:1.2rem;font-weight:900}.scene-move-summary{margin:0 0 12px;color:var(--plotline-ink);font-size:1rem;font-weight:800}[data-theme=dark] .scene-move-modal-content{background:#201f22;color:#f4eadc;border-color:rgba(244,234,220,.16);box-shadow:0 24px 70px rgba(0,0,0,.55)}[data-theme=dark] .scene-move-modal-content .modal-title,[data-theme=dark] .scene-move-summary{color:#f4eadc}[data-theme=dark] .scene-move-modal-content .modal-footer,[data-theme=dark] .scene-move-modal-content .modal-header{border-color:rgba(244,234,220,.14)}[data-theme=dark] .scene-move-modal-content .btn-close{filter:invert(1) grayscale(100%)}.plain-preview{border:1px solid rgba(197,139,43,.28);border-radius:8px;margin:10px 0 0;padding:8px 10px;color:#5e4518;background:#fff8e8;font-size:.86rem;font-weight:800}.drag-check-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 10px;color:var(--plotline-muted);font-size:.82rem;font-weight:700}.lane-board-heading,.pacing-heading,.timeline-section-header{position:sticky;left:0;z-index:6}.timeline-section-header{display:flex;align-items:center;justify-content:space-between;gap:10px;width:calc(var(--timeline-label-width) + (var(--scene-count) * var(--timeline-scene-width)) + (var(--scene-count) * var(--timeline-grid-gap)));min-width:100%;margin-bottom:10px;border-radius:8px;padding:8px 10px;background:rgba(255,255,255,.92);box-shadow:0 8px 16px rgba(30,37,43,.05)}.lane-board-heading button,.lane-group-heading,.pacing-heading button,.plot-lane-board-heading button,.timeline-section-header button{border:0;padding:0;color:var(--plotline-accent-dark);background:0 0;font:inherit;font-weight:900;text-align:left}.lane-board-heading button::before,.lane-group-heading::before,.pacing-heading button::before,.plot-lane-board-heading button::before,.timeline-section-header button::before{content:"v";display:inline-block;margin-right:6px;color:var(--plotline-muted);font-size:.72rem}.lane-board-heading button.is-collapsed::before,.lane-group-heading.is-collapsed::before,.pacing-heading button.is-collapsed::before,.plot-lane-board-heading button.is-collapsed::before,.timeline-section-header button.is-collapsed::before{content:">"}.lane-group{display:grid;gap:7px}.character-lane-group-body{display:grid;gap:7px}.lane-group-heading{position:sticky;left:0;z-index:6;width:var(--timeline-label-width);border-top:1px solid rgba(47,111,99,.12);padding:7px 8px 2px;color:var(--plotline-muted);background:rgba(247,250,248,.96);font-size:.78rem;text-transform:uppercase}.timeline-section-collapsed{display:none!important}.timeline-chapter-title{position:sticky;top:0;z-index:5;background:rgba(238,245,242,.96);backdrop-filter:blur(6px)}.metric-mini-summary,.scene-pov-label{display:inline-flex;width:fit-content;border-radius:999px;padding:2px 7px;font-size:.72rem;font-weight:800}.scene-pov-label{color:#514018;background:#fff3d3}.metric-mini-summary{color:var(--plotline-accent-dark);background:rgba(47,111,99,.08)}.scene-overview-panel{display:none;gap:8px;margin-top:4px}.scene-overview-section{display:grid;gap:4px}.scene-overview-label{color:var(--plotline-muted);font-size:.68rem;font-weight:900;letter-spacing:.06em;text-transform:uppercase}.scene-overview-chip-row{display:flex;flex-wrap:wrap;gap:5px;min-width:0}.scene-overview-brief,.scene-overview-chip,.scene-overview-empty{display:inline-flex;width:fit-content;max-width:100%;border-radius:999px;padding:3px 8px;background:rgba(47,111,99,.08);color:var(--plotline-ink);font-size:.72rem;font-weight:750;line-height:1.25;overflow-wrap:anywhere}.scene-overview-chip.is-pov{border:1px solid rgba(197,139,43,.38);background:#fff3d3}.scene-overview-chip.is-important{border:1px solid rgba(103,80,164,.3);background:#f0edf8}.scene-overview-chip.is-more,.scene-overview-empty{color:var(--plotline-muted);background:rgba(102,113,123,.08)}.scene-overview-brief{display:block;width:auto;border-radius:8px;background:rgba(255,255,255,.62);color:var(--plotline-muted);font-weight:600}.timeline-scene-card.keyboard-focus,.timeline-scene-card.search-hit{outline:3px solid rgba(197,139,43,.34);box-shadow:0 12px 26px rgba(197,139,43,.16)}.timeline-scene-card.search-dim{opacity:.28}.asset-marker,.character-marker,.thread-marker{transition:transform .12s ease,box-shadow .12s ease}.asset-marker:hover,.character-marker:hover,.thread-marker:hover{transform:translateY(-1px);box-shadow:0 6px 12px rgba(30,37,43,.12)}.timeline-filtered-root.density-compact{--timeline-scene-width:170px;--timeline-grid-gap:6px}.timeline-filtered-root.density-expanded{--timeline-scene-width:280px;--timeline-grid-gap:14px}.timeline-filtered-root.density-compact .timeline-scene-card,.timeline-filtered-root.zoom-book .timeline-scene-card{gap:4px;padding:9px}.timeline-filtered-root.density-compact .metric-mini-summary,.timeline-filtered-root.density-compact .purpose-chip-row,.timeline-filtered-root.density-compact .scene-summary,.timeline-filtered-root.zoom-book .location-pill,.timeline-filtered-root.zoom-book .metric-mini-summary,.timeline-filtered-root.zoom-book .purpose-chip-row,.timeline-filtered-root.zoom-book .scene-pov-label,.timeline-filtered-root.zoom-book .scene-summary{display:none}.timeline-filtered-root.zoom-book{--timeline-scene-width:150px;--timeline-grid-gap:6px}.timeline-filtered-root.zoom-scene-detail{--timeline-scene-width:300px}.timeline-filtered-root.zoom-scene-detail .scene-summary{-webkit-line-clamp:7}.timeline-filtered-root.zoom-scene-overview{--timeline-scene-width:380px}.timeline-filtered-root.zoom-scene-overview .timeline-scenes{min-height:320px}.timeline-filtered-root.zoom-scene-overview .timeline-scene-card{gap:8px;padding:14px}.timeline-filtered-root.zoom-scene-overview .scene-summary{display:none}.timeline-filtered-root.zoom-scene-overview .scene-overview-panel{display:grid}.timeline-filtered-root.density-expanded .timeline-scenes{min-height:230px}.timeline-control-panel{position:relative;top:auto;z-index:4;display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:10px;padding:8px;box-shadow:none}.timeline-control-group,.timeline-filter-drawer{border:1px solid var(--plotline-line);border-radius:999px;background:rgba(255,255,255,.82)}.timeline-control-group[open],.timeline-filter-drawer[open]{border-radius:10px;flex-basis:100%}.timeline-control-group summary,.timeline-filter-drawer summary{min-width:max-content;padding:5px 10px;color:var(--plotline-accent-dark);font-size:.82rem;font-weight:900;cursor:pointer;list-style:none}.timeline-control-group summary::-webkit-details-marker,.timeline-drag-palette summary::-webkit-details-marker,.timeline-filter-drawer summary::-webkit-details-marker{display:none}.timeline-control-group summary::after,.timeline-drag-palette summary::after,.timeline-filter-drawer summary::after{content:" v";color:var(--plotline-muted);font-size:.72rem}.timeline-control-group[open] summary::after,.timeline-drag-palette[open] summary::after,.timeline-filter-drawer[open] summary::after{content:" ^"}.timeline-filter-grid{grid-template-columns:repeat(auto-fit,minmax(145px,1fr));gap:8px;max-height:min(48vh,430px);overflow:auto;padding:0 10px 10px}.timeline-filter-grid .form-label{margin-bottom:2px;font-size:.72rem;font-weight:800}.timeline-filter-actions,.timeline-filter-checks{grid-column:1/-1}.timeline-jump-panel,.timeline-preset-panel,.timeline-visibility-panel{padding:0 10px 10px}.timeline-jump-panel{grid-template-columns:minmax(180px,1.5fr) repeat(3,minmax(150px,1fr))}.timeline-shortcut-hint{grid-column:1/-1}.timeline-preset-panel form{flex-wrap:nowrap}.timeline-preset-panel .form-control{width:150px}.timeline-filter-actions .btn,.timeline-preset-panel .btn{white-space:nowrap}.timeline-drag-palette{display:block;margin-bottom:8px;padding:7px 9px;box-shadow:none}.timeline-drag-palette summary{color:var(--plotline-accent-dark);font-size:.82rem;font-weight:900;cursor:pointer}.timeline-drag-palette .drag-chip-group{margin-top:8px}.drag-drop-panel{position:relative;top:auto;z-index:9;box-shadow:0 12px 28px rgba(30,37,43,.08)}.timeline-filtered-root,.timeline-filtered-root.density-compact,.timeline-filtered-root.zoom-book{--timeline-scene-width:220px;--timeline-grid-gap:10px}.timeline-filtered-root.density-expanded,.timeline-filtered-root.zoom-scene-detail{--timeline-scene-width:290px}.timeline-filtered-root.density-compact.zoom-book{--timeline-scene-width:200px}.timeline-chapter,.timeline-empty-scene,.timeline-scene-card{overflow-wrap:normal;word-break:normal}.asset-lane-label strong,.character-lane-label strong,.plot-lane-label strong,.timeline-chapter-title strong,.timeline-scene-card strong{min-width:0;white-space:normal;word-break:normal;overflow-wrap:break-word}.timeline-scene-card{cursor:grab}.drag-chip:active,.timeline-scene-card:active,[draggable=true]:active{cursor:grabbing}body.drag-active .timeline-scene-card,body.dragging-asset [data-asset-drop-target],body.dragging-location [data-drag-type=location]{transition:outline-color .12s ease,box-shadow .12s ease,opacity .12s ease}body.dragging-asset .timeline-scene-card,body.dragging-asset [data-asset-drop-target],body.dragging-character .timeline-scene-card,body.dragging-location [data-drag-type=location],body.dragging-scene .timeline-scene-card,body.dragging-scene .timeline-scenes[data-chapter-drop-target]{outline:1px dashed rgba(47,111,99,.22);outline-offset:2px}.is-dragging{opacity:.42;transform:scale(.98)}.drop-target-active{outline:3px solid rgba(47,111,99,.42)!important;outline-offset:3px}.analytics-metric-row{display:grid;grid-template-columns:170px minmax(560px,1fr);gap:12px;align-items:stretch}.analytics-metric-label{display:flex;align-items:center;border-right:1px solid var(--plotline-line);color:var(--plotline-muted);font-weight:800}.analytics-sparkline{display:grid;grid-template-columns:repeat(var(--point-count),minmax(28px,1fr));align-items:end;gap:5px;min-height:88px;border-bottom:1px solid rgba(47,111,99,.25);padding-top:10px}.analytics-bar{position:relative;display:flex;align-items:end;justify-content:center;min-height:12px;height:max(12px,var(--bar-height));border-radius:6px 6px 2px 2px;color:var(--plotline-accent-dark);text-decoration:none;background:linear-gradient(180deg,rgba(47,111,99,.58),rgba(47,111,99,.18))}.analytics-bar:hover{background:linear-gradient(180deg,rgba(47,111,99,.82),rgba(47,111,99,.28))}.analytics-bar span{position:absolute;bottom:calc(100% + 3px);color:var(--plotline-muted);font-size:.68rem;font-weight:800}.analytics-count-row,.analytics-link-row,.analytics-list-item,.purpose-stat-row{border-top:1px solid var(--plotline-line);padding:9px 0}.analytics-list-item{display:grid;gap:3px}.analytics-list-item p{margin:0}.analytics-count-row,.analytics-link-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.analytics-link-row{color:inherit;text-decoration:none}.analytics-link-row:hover{color:var(--plotline-accent-dark)}.analytics-link-row span,.analytics-link-row strong{min-width:0}.purpose-stat-row{display:grid;grid-template-columns:minmax(120px,1fr) minmax(90px,1.5fr) 42px;align-items:center;gap:10px}.purpose-stat-bar{overflow:hidden;height:8px;border-radius:999px;background:rgba(47,111,99,.08)}.purpose-stat-bar span{display:block;height:100%;border-radius:inherit;background:var(--plotline-accent)}.story-bible-heading{align-items:end}.story-bible-search{display:flex;gap:8px;min-width:min(100%,420px)}.story-bible-search .form-control{min-width:0}.story-bible-nav{position:sticky;top:72px;z-index:4;display:flex;flex-wrap:wrap;gap:8px;margin:0 0 18px;padding:10px;border:1px solid var(--plotline-line);border-radius:12px;background:rgba(250,249,246,.92);backdrop-filter:blur(10px)}.story-bible-actions a,.story-bible-nav a{display:inline-flex;align-items:center;border-radius:999px;padding:6px 10px;background:rgba(47,111,99,.08);color:var(--plotline-ink);font-size:.86rem;font-weight:650;text-decoration:none}.story-bible-actions a:hover,.story-bible-nav a:hover{background:rgba(47,111,99,.16)}.story-bible-section{margin:0 0 28px}.story-bible-section-heading{display:flex;align-items:end;justify-content:space-between;gap:16px;margin-bottom:12px}.story-bible-section-heading h2{margin:0}.soft-count{color:var(--plotline-muted);font-size:.9rem;font-weight:650;white-space:nowrap}.story-bible-grid,.story-bible-search-results{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:14px}.story-bible-grid-compact{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.story-bible-card{border:1px solid var(--plotline-line);border-radius:14px;padding:14px;background:rgba(255,255,255,.86);box-shadow:0 14px 34px rgba(36,32,26,.06)}.story-bible-card h3{margin:0 0 8px;font-size:1.05rem}.story-bible-card h4{margin:14px 0 8px;font-size:.96rem}.story-bible-card p{color:var(--plotline-muted)}.story-bible-card-title{display:flex;align-items:start;justify-content:space-between;gap:10px}.story-bible-card-title span{border:1px solid var(--plotline-line);border-radius:999px;padding:3px 8px;background:rgba(250,249,246,.9);color:var(--plotline-muted);font-size:.78rem;font-weight:700;white-space:nowrap}.story-bible-meta{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}.story-bible-meta span{border-radius:999px;padding:4px 8px;background:rgba(36,32,26,.05);color:var(--plotline-muted);font-size:.78rem;font-weight:650}.story-bible-facts{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:6px 10px;margin:12px 0}.story-bible-facts dt{color:var(--plotline-muted);font-size:.78rem;font-weight:800;text-transform:uppercase}.story-bible-facts dd{margin:0;min-width:0;overflow-wrap:anywhere}.story-bible-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.story-bible-link-list{display:grid;gap:8px;margin:0;padding:0;list-style:none}.story-bible-link-list li{display:grid;gap:2px;padding:8px 0;border-bottom:1px solid rgba(36,32,26,.08)}.story-bible-link-list li:last-child{border-bottom:0}.story-bible-link-list span{color:var(--plotline-muted);font-size:.88rem}.story-bible-timeline-summary{display:grid;gap:14px}.story-bible-wide-card{max-width:none}.story-bible-chapter-summary{border-top:1px solid var(--plotline-line);padding-top:8px}.story-bible-scene-summary{display:grid;grid-template-columns:minmax(220px,1.5fr) repeat(3,minmax(120px,0.8fr));gap:8px;padding:9px 0;border-top:1px solid rgba(36,32,26,.08)}.story-bible-scene-summary p{grid-column:1/-1;margin:0}.story-bible-scene-summary span{color:var(--plotline-muted);font-size:.88rem}.attention-list{display:grid;gap:10px}.attention-list article{display:grid;grid-template-columns:max-content minmax(0,1fr) auto;align-items:center;gap:10px;border:1px solid var(--plotline-line);border-radius:12px;padding:10px 12px;background:rgba(255,255,255,.82)}.attention-list p{grid-column:2/-1;margin:0;color:var(--plotline-muted)}.chapter-goal-form,.writer-add-form,.writer-edit-form,.writer-workspace-form{display:grid;gap:10px}.writer-checkbox-grid{display:flex;flex-wrap:wrap;gap:8px 14px}.writer-checkbox-grid label{display:inline-flex;align-items:center;gap:6px;color:var(--plotline-muted);font-size:.86rem;font-weight:650}.writer-priority-control{display:grid;grid-template-columns:minmax(0,1fr) max-content;align-items:center;gap:12px}.writer-priority-control .form-range{min-width:0}.writer-note-list,.writer-queue-list{display:grid;gap:10px}.writer-mini-card{border:1px solid var(--plotline-line);border-radius:12px;padding:10px;background:rgba(255,255,255,.72)}.writer-mini-card summary{display:flex;align-items:center;gap:8px;cursor:pointer}.writer-mini-card summary strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.attachment-card-list{display:grid;gap:10px}.attachment-summary{align-items:center}.attachment-kind{border-radius:999px;padding:3px 8px;background:rgba(47,111,99,.1);color:var(--plotline-accent);font-size:.76rem;font-weight:800;text-transform:uppercase}.attachment-card-body{display:grid;gap:6px;margin-top:10px}.attachment-card-body p{margin:0}.attachment-add-card{margin-top:10px}.writer-checklist{display:grid;gap:6px}.writer-add-inline,.writer-checklist-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px}.writer-remove-inline{display:flex;justify-content:end;margin:-2px 0 4px}.writer-dashboard-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin-bottom:26px}.writer-dashboard-panel{border:1px solid var(--plotline-line);border-radius:14px;padding:14px;background:rgba(255,255,255,.7);box-shadow:0 14px 34px rgba(36,32,26,.05)}.writing-workspace-launcher{border-color:rgba(47,111,99,.22);background:linear-gradient(180deg,#fff 0,rgba(238,245,242,.68) 100%)}.writing-workspace-status-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-bottom:10px}.writing-workspace-status-grid div{display:grid;gap:2px;border:1px solid var(--plotline-line);border-radius:8px;padding:10px 12px;background:var(--plotline-panel)}.writing-workspace-status-grid span{color:var(--plotline-muted);font-size:.76rem;font-weight:800;text-transform:uppercase}.writing-workspace-status-grid strong{color:var(--plotline-ink);font-size:1rem}.writing-workspace-message{min-height:1.35rem}.writing-workspace-display-controls{display:grid;grid-template-columns:repeat(2,minmax(12rem,1fr)) auto;gap:8px;align-items:end;margin:10px 0 12px}.writing-workspace-display-controls label{display:grid;gap:4px;margin:0;color:var(--plotline-muted);font-size:.82rem;font-weight:700}.writing-workspace-role-indicator{display:inline-flex;align-items:center;gap:.5rem;padding:.4rem .65rem;border:1px solid rgba(47,111,99,.22);border-radius:999px;background:var(--plotline-soft);color:var(--plotline-accent-dark);font-size:.9rem;font-weight:700;white-space:nowrap}.writer-queue-card{border:1px solid var(--plotline-line);border-radius:12px;padding:12px;background:rgba(255,255,255,.9)}.writer-queue-card h3{margin:0;font-size:1rem}.writer-queue-card p{margin:8px 0 0;color:var(--plotline-muted)}.writer-queue-title{display:flex;align-items:start;justify-content:space-between;gap:12px}.writer-kpi{display:block;color:var(--plotline-accent);font-size:2.2rem;line-height:1}.export-action-row{margin:-8px 0 18px}.dynamics-timeline{position:relative;min-height:128px;border:1px solid var(--plotline-line);border-radius:14px;background:linear-gradient(180deg,rgba(47,111,99,.07),rgba(255,255,255,.84));overflow:hidden}.dynamics-timeline::before{content:"";position:absolute;left:12px;right:12px;top:64px;height:1px;background:rgba(36,32,26,.18)}.dynamics-marker{position:absolute;bottom:18px;width:12px;height:86px;transform:translateX(-50%);display:flex;align-items:end;justify-content:center}.dynamics-marker span{display:block;width:8px;min-height:12px;max-height:82px;border-radius:999px;background:var(--plotline-accent);box-shadow:0 8px 20px rgba(47,111,99,.22)}.dynamics-marker.pov span{background:#8a4b2f}.dynamics-timeline.relationship .dynamics-marker span{background:#7c5fb0}.scenario-banner{display:flex;justify-content:space-between;gap:18px;align-items:flex-start;border:1px solid rgba(103,80,164,.22);border-radius:12px;padding:16px;margin-bottom:16px;background:linear-gradient(135deg,rgba(103,80,164,.1),rgba(255,255,255,.86));box-shadow:0 12px 28px rgba(36,32,26,.08)}.scenario-banner h1{margin:0 0 4px}.scenario-banner p{margin:0;color:var(--plotline-muted)}.scenario-card{border-color:rgba(103,80,164,.18)}.scenario-warning-strip{display:flex;gap:10px;align-items:center;border:1px solid var(--plotline-line);border-radius:10px;padding:10px 12px;margin-bottom:14px;background:rgba(255,255,255,.76);color:var(--plotline-muted)}.scenario-warning-strip strong{color:var(--plotline-ink)}.scenario-board{border:1px solid var(--plotline-line);border-radius:12px;padding:12px;background:rgba(247,245,240,.74);overflow:hidden;margin-bottom:18px}.scenario-scroll{display:flex;gap:14px;overflow-x:auto;padding-bottom:8px}.scenario-chapter{min-width:360px;max-width:520px;border:1px solid rgba(82,75,65,.14);border-radius:10px;background:rgba(255,255,255,.86)}.scenario-chapter header{display:grid;gap:2px;border-bottom:1px solid var(--plotline-line);padding:10px 12px}.scenario-chapter header span{color:var(--plotline-muted);font-size:.78rem;font-weight:800;text-transform:uppercase}.scenario-scene-row{display:grid;gap:10px;padding:10px}.scenario-scene-card{display:grid;gap:8px;border:1px solid rgba(82,75,65,.12);border-radius:9px;padding:10px;background:#fff}.scenario-scene-title{display:grid;gap:2px}.scenario-mini-data,.scenario-scene-title span{color:var(--plotline-muted);font-size:.78rem}.scenario-mini-data{display:grid;gap:2px}.scenario-chapter-form,.scenario-compare-list article,.scenario-move-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.scenario-chapter-form select{min-width:160px;width:auto}.scenario-compare-list{display:grid;gap:10px}.scenario-compare-list article{justify-content:space-between;border:1px solid var(--plotline-line);border-radius:9px;padding:10px;background:rgba(255,255,255,.82)}.danger-zone{border-color:rgba(163,61,61,.24)}.archive-filter-form{align-items:end}.archive-item-list{display:grid;gap:10px}.archive-item-card{display:flex;justify-content:space-between;gap:14px;align-items:center;border:1px solid var(--plotline-line);border-radius:10px;padding:12px;background:rgba(255,255,255,.82)}.archive-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-items:end}.delete-forever-form{display:inline-flex;margin:0}.archive-item-card h3{margin:4px 0}.archived-badge{display:inline-flex;border:1px solid rgba(82,75,65,.16);border-radius:999px;padding:2px 8px;color:var(--plotline-muted);font-size:.72rem;font-weight:800;text-transform:uppercase;background:rgba(247,245,240,.86)}.restore-button{white-space:nowrap}.archive-button-form{display:inline-flex;align-items:center;margin:0}.acceptance-summary-grid{display:grid;grid-template-columns:repeat(3,minmax(160px,1fr));gap:12px;margin-bottom:16px}.acceptance-summary{display:grid;gap:4px;padding:16px}.acceptance-summary strong{font-size:2rem;line-height:1}.acceptance-summary.pass{border-left:5px solid #4d7654}.acceptance-summary.review{border-left:5px solid #b8762b}.acceptance-summary.blocked{border-left:5px solid #963f36}.acceptance-check-list{display:grid;gap:14px}.acceptance-area{border:1px solid var(--plotline-line);border-radius:10px;padding:12px;background:rgba(255,255,255,.62)}.acceptance-area h3{margin:0 0 10px;font-size:1.05rem}.acceptance-check-items{display:grid;gap:8px}.acceptance-check-item{display:grid;grid-template-columns:92px minmax(0,1fr);gap:10px;align-items:start;border:1px solid rgba(82,75,65,.12);border-radius:8px;padding:10px;background:rgba(255,255,255,.74)}.acceptance-check-item p{margin:2px 0 0;color:var(--plotline-muted)}.acceptance-status{display:inline-flex;justify-content:center;width:fit-content;min-width:74px;border-radius:999px;padding:3px 9px;font-size:.72rem;font-weight:900;text-transform:uppercase}.acceptance-check-item.pass .acceptance-status{color:#24512b;background:#e6f4e7}.acceptance-check-item.review .acceptance-status{color:#7b4b13;background:#fbecd3}.acceptance-check-item.blocked .acceptance-status{color:#7a2222;background:#fff0f0}.plotline-confirm-modal .modal-title{color:var(--plotline-ink)}.plotline-confirm-modal .modal-body p{white-space:pre-line}.delete-confirm-field{border:1px solid rgba(163,61,61,.22);border-radius:8px;padding:12px;background:rgba(255,247,244,.7)}@media print{.breadcrumb-trail,.button-row,.context-header,.story-bible-nav,header{display:none!important}.plotline-shell{max-width:none;padding:0}}@media (max-width:760px){.plotline-shell{padding-left:14px;padding-right:14px}.page-heading{display:block}.page-heading .button-row,.timeline-filter{margin-top:14px}.timeline-filter{align-items:stretch;flex-direction:column}.timeline-navigation-card{grid-template-areas:"copy" "actions";grid-template-columns:1fr}.timeline-navigation-card-icon{display:none}.timeline-navigation-card-actions{justify-content:center}.story-bible-search,.story-bible-section-heading{align-items:stretch;flex-direction:column}.attention-list article,.story-bible-scene-summary{grid-template-columns:1fr}.writer-dashboard-grid{grid-template-columns:1fr}.writing-workspace-status-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.writing-workspace-display-controls{grid-template-columns:1fr}.writer-add-inline,.writer-checklist-row{grid-template-columns:1fr}.trial-dashboard-banner,.trial-status-panel--signup,.trial-status-panel__heading{align-items:stretch;flex-direction:column}.trial-dashboard-banner__actions,.trial-dashboard-banner__actions .btn,.trial-status-panel--signup .btn{width:100%}.attention-list p{grid-column:auto}}@media (max-width:900px){.workspace-layout,.workspace-layout.inspector-drawer-open{grid-template-columns:1fr;gap:14px}.timeline-inspector-resizer{display:none}.scene-inspector-panel{position:static;max-height:none;overflow:visible}.scene-inspector-body{max-height:none;overflow:visible}}@media (max-width:1100px){.metric-graph-row{grid-template-columns:1fr}.analytics-grid-three,.analytics-grid-two,.health-kpi-grid{grid-template-columns:1fr}.analytics-metric-row{grid-template-columns:1fr}.analytics-metric-label{border-right:0}}.floor-plan-list{display:grid;gap:12px}.floor-plan-list-item{align-items:center;border:1px solid var(--border-color,#d8ded9);border-radius:8px;display:flex;justify-content:space-between;gap:16px;padding:14px}.floor-plan-list-item h2{font-size:1.05rem;margin:0 0 4px}.floor-plan-list-item p{margin:0}.floor-plan-tools{display:grid;gap:14px}.floor-plan-meta-wide{max-width:none}.floor-plan-tabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}.floor-plan-tab{background:var(--panel-bg,#fff);border:1px solid var(--border-color,#d8ded9);border-radius:999px;color:inherit;padding:6px 12px}.floor-plan-tab.active{background:var(--bs-primary,#2f6f63);border-color:var(--bs-primary,#2f6f63);color:#fff}.floor-plan-layout{display:grid;gap:16px;grid-template-columns:minmax(0,1fr) minmax(320px,360px)}.floor-plan-editor--occupancy .floor-plan-layout{grid-template-columns:minmax(0,1fr)}.floor-plan-editor-toolbar{background:rgba(255,255,255,.92);border:1px solid var(--border-color,#d8ded9);border-radius:8px;display:grid;gap:10px;margin-bottom:12px;padding:10px 12px;position:sticky;top:10px;z-index:20}.floor-plan-occupancy-scene-row,.floor-plan-toolbar-action-group,.floor-plan-toolbar-control-group,.floor-plan-toolbar-floor-group,.floor-plan-toolbar-main{align-items:center;display:flex;flex-wrap:wrap;gap:10px}.floor-plan-toolbar-main{justify-content:space-between}.scene-editor-v2-workspace{max-width:none;width:100%;padding:0;border:0;background:0 0;box-shadow:none}.scene-inspector-v2{position:relative;display:grid;gap:14px;color:var(--plotline-ink)}.scene-inspector-v2-edit{--scene-editor-width:520px;padding-bottom:16px}.scene-inspector-v2-edit.editor-overlay-open{display:grid;grid-template-columns:minmax(0,1fr) 10px minmax(400px,min(var(--scene-editor-width),46%));align-items:stretch;gap:12px;height:clamp(480px,calc(100vh - 240px),820px);min-height:0}.scene-inspector-v2-summary-pane{display:grid;gap:12px;min-width:0}.scene-inspector-v2-edit.editor-overlay-open .scene-inspector-v2-summary-pane{min-height:0;overflow:auto;padding-right:2px}.scene-inspector-v2-edit.editor-overlay-open .scene-inspector-v2-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.scene-inspector-v2-timeline{min-height:100%}.scene-inspector-v2-timeline.editor-overlay-open{height:clamp(380px,calc(100vh - 190px),680px);min-height:0;overflow:hidden}.scene-inspector-v2-grid{display:grid;align-items:stretch;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.scene-inspector-v2-edit .scene-inspector-v2-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.scene-inspector-v2-stack{display:grid;gap:12px}.scene-inspector-v2-health{display:grid;grid-template-columns:repeat(7,minmax(110px,1fr));gap:8px}.scene-inspector-editor-overlay,.scene-inspector-v2-card,.scene-inspector-v2-health>div{border:1px solid var(--plotline-line);background:var(--plotline-panel);border-radius:8px;box-shadow:0 8px 24px rgba(30,37,43,.06)}.scene-inspector-v2-health>div{min-width:0;padding:10px 12px}.scene-inspector-v2-counts span,.scene-inspector-v2-facts dt,.scene-inspector-v2-health span,.scene-inspector-v2-section>span,.scene-inspector-v2-summary>span{display:block;color:var(--plotline-muted);font-size:.72rem;font-weight:800;text-transform:uppercase}.scene-inspector-v2-health strong{display:block;overflow:hidden;color:var(--plotline-ink);font-size:.94rem;text-overflow:ellipsis;white-space:nowrap}.scene-inspector-v2-counts .attention strong,.scene-inspector-v2-health .attention strong{color:var(--plotline-danger,#b35f3b)}.scene-inspector-v2-card{display:grid;align-content:start;gap:14px;height:100%;min-width:0;padding:16px}.scene-inspector-v2-edit .scene-inspector-v2-card{gap:10px;padding:14px}.scene-inspector-v2-card-header{display:flex;align-items:flex-start;justify-content:space-between;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;line-height:1.25}.scene-inspector-editor-title-row,.scene-inspector-v2-heading{display:flex;align-items:center;gap:6px;min-width:0}.scene-inspector-editor-title-row h3,.scene-inspector-v2-heading h3{min-width:0}.scene-inspector-v2-heading .plotline-help-icon-wrapper{flex:0 0 auto}.scene-inspector-v2-edit .scene-inspector-v2-card-header{gap:10px}.scene-inspector-v2-edit .scene-inspector-v2-card-header h3{font-size:1rem}.scene-inspector-v2-card p{margin:0}.scene-inspector-v2-facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:0}.scene-inspector-v2-facts div{min-width:0}.scene-inspector-v2-facts dd{margin:2px 0 0;overflow-wrap:anywhere}.scene-inspector-v2-section,.scene-inspector-v2-summary{display:grid;gap:6px}.scene-inspector-v2-edit .scene-inspector-v2-section,.scene-inspector-v2-edit .scene-inspector-v2-summary{gap:5px}.scene-inspector-v2-actions,.scene-inspector-v2-chip-row{display:flex;flex-wrap:wrap;gap:7px}.scene-inspector-v2-edit .scene-inspector-v2-actions{gap:6px}.scene-inspector-v2-edit .scene-inspector-v2-actions .btn{padding:.22rem .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}.scene-inspector-v2-action-menu .dropdown-item{font-size:.86rem}.scene-inspector-v2-chip-row span{border:1px solid rgba(47,111,99,.18);border-radius:999px;background:rgba(47,111,99,.08);padding:3px 9px;color:var(--plotline-accent-dark);font-size:.82rem;font-weight:800}.scene-inspector-v2-counts,.scene-inspector-v2-metrics{display:grid;gap:8px}.scene-inspector-v2-metrics{grid-template-columns:1fr}.scene-inspector-v2-counts{grid-template-columns:repeat(auto-fit,minmax(72px,1fr))}.scene-inspector-v2-counts>div,.scene-inspector-v2-metrics>div{min-width:0;border:1px solid rgba(47,111,99,.12);border-radius:8px;background:rgba(47,111,99,.05);padding:9px 10px}.scene-inspector-v2-edit .scene-inspector-v2-counts>div,.scene-inspector-v2-edit .scene-inspector-v2-metrics>div{padding:7px 8px}.scene-inspector-v2-metrics span{display:block;overflow:hidden;color:var(--plotline-muted);font-size:.78rem;text-overflow:ellipsis;white-space:nowrap}.scene-inspector-v2-counts strong,.scene-inspector-v2-metrics strong{display:block;color:var(--plotline-ink);font-size:1rem}.scene-inspector-v2-list{display:grid;gap:7px;margin:0;padding:0;list-style:none}.scene-inspector-v2-edit .scene-inspector-v2-list{gap:5px}.scene-inspector-v2-list li{display:flex;align-items:baseline;justify-content:space-between;gap:10px;border-bottom:1px solid rgba(47,111,99,.1);padding-bottom:6px}.scene-inspector-v2-edit .scene-inspector-v2-list li{padding-bottom:5px}.scene-inspector-v2-list li:last-child{border-bottom:0;padding-bottom:0}.scene-inspector-v2-list span{color:var(--plotline-muted);font-size:.82rem;text-align:right}.scene-inspector-v2-character-list,.scene-inspector-v2-compact-list{display:grid;gap:7px;margin:0;padding:0;list-style:none}.scene-inspector-v2-character-list li{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:9px;min-width:0}.scene-inspector-v2-character-list span,.scene-inspector-v2-character-list strong{display:block}.scene-inspector-v2-character-list div{min-width:0}.scene-inspector-v2-character-list div span{color:var(--plotline-muted);font-size:.8rem}.scene-inspector-v2-character-list .visual-avatar{width:34px}.scene-inspector-v2-character-list .visual-avatar>span{display:flex;align-items:center;justify-content:center;width:100%;height:100%;line-height:1}.scene-inspector-v2-avatar-pov{box-shadow:0 0 0 2px rgba(47,111,99,.24)}.scene-inspector-v2-mini-badge{border:1px solid rgba(47,111,99,.2);border-radius:999px;background:var(--plotline-soft);color:var(--plotline-accent-dark);padding:2px 7px;font-size:.7rem;font-weight:800}.scene-inspector-v2-preview-stack{display:grid;gap:8px}.scene-inspector-v2-preview-group{border:1px solid rgba(47,111,99,.12);border-radius:8px;background:rgba(47,111,99,.04);padding:8px 10px}.scene-inspector-v2-preview-group summary{display:flex;align-items:center;justify-content:space-between;gap:10px;color:var(--plotline-accent-dark);cursor:pointer;font-size:.82rem;font-weight:800}.scene-inspector-v2-preview-group summary span{color:var(--plotline-muted);font-size:.76rem}.scene-inspector-v2-preview-group[open] summary{margin-bottom:7px}.scene-inspector-v2-compact-list li{min-width:0;color:var(--plotline-ink);font-size:.88rem;overflow-wrap:anywhere}.scene-inspector-v2-compact-list li::before{content:"";display:inline-block;width:5px;height:5px;margin-right:7px;border-radius:999px;background:rgba(47,111,99,.42);vertical-align:middle}.scene-inspector-v2-compact-list a{color:var(--plotline-accent-dark);font-weight:700}.scene-inspector-v2-good-state,.scene-inspector-v2-suggestion-strip,.scene-inspector-v2-warning-state{border-radius:8px;padding:8px 10px}.scene-inspector-v2-suggestion-strip{display:flex;align-items:center;gap:8px;border:1px solid rgba(197,139,43,.24);background:rgba(197,139,43,.1)}.scene-inspector-v2-suggestion-strip strong{color:#805815;font-size:1rem}.scene-inspector-v2-suggestion-strip span{color:var(--plotline-muted);font-size:.86rem;font-weight:700}.scene-inspector-v2-good-state{border:1px solid rgba(47,111,99,.16);background:rgba(47,111,99,.07);color:var(--plotline-accent-dark);font-weight:800}.scene-inspector-v2-good-state::before{content:"\2713";margin-right:7px}.scene-inspector-v2-warning-state{border:1px solid rgba(179,95,59,.22);background:rgba(179,95,59,.1);color:var(--plotline-danger,#b35f3b);font-weight:800}.scene-inspector-v2-metric-row{display:grid;grid-template-columns:minmax(130px,180px) minmax(0,1fr) auto;align-items:center;gap:6px}.scene-inspector-v2-metric-row>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.scene-inspector-v2-metric-track{display:flex;align-items:stretch;width:100%;height:8px;overflow:hidden;border:0;border-radius:999px;background:rgba(47,111,99,.12);padding:0}.scene-inspector-v2-metric-track i{display:block;width:var(--metric-percent);min-width:4px;border-radius:inherit;background:linear-gradient(90deg,#6fa99b,var(--plotline-accent-dark))}.scene-inspector-v2-callout{border-left:4px solid var(--plotline-warning,#c58b2b);border-radius:8px;background:rgba(197,139,43,.1);padding:10px 12px}.scene-overview-v2-header{align-items:flex-start}.scene-overview-v2-controls{display:flex;flex:0 0 auto;flex-wrap:wrap;justify-content:flex-end;gap:6px}.scene-overview-v2-facts{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 10px}.scene-overview-v2-facts div:nth-child(3),.scene-overview-v2-summary{grid-column:1/-1}.scene-overview-v2-summary p{display:-webkit-box;overflow:hidden;-webkit-line-clamp:3;-webkit-box-orient:vertical}.manuscript-balance{display:grid;gap:6px;min-width:0;border:1px solid rgba(47,111,99,.13);border-radius:8px;background:rgba(47,111,99,.045);padding:10px 12px}.manuscript-balance__heading,.manuscript-balance__scale{display:flex;align-items:center;justify-content:space-between;gap:10px;min-width:0}.manuscript-balance__heading span{color:var(--plotline-accent-dark);font-size:.84rem;font-weight:800}.manuscript-balance__heading strong{color:var(--plotline-ink);font-size:.92rem;font-weight:900;white-space:nowrap}.manuscript-balance__scale span{flex:0 0 auto;color:var(--plotline-muted);font-size:.75rem;font-weight:800}.manuscript-balance__track{position:relative;flex:1 1 auto;min-width:72px;height:8px;border-radius:999px;background:linear-gradient(90deg,rgba(97,107,88,.55),rgba(47,111,99,.66))}.manuscript-balance__track i{position:absolute;top:50%;width:14px;height:14px;border:2px solid var(--plotline-surface-elevated);border-radius:999px;background:var(--plotline-accent-dark);box-shadow:0 2px 5px rgba(36,31,27,.2);transform:translate(-50%,-50%)}.manuscript-balance p{margin:0;color:var(--plotline-muted);font-size:.84rem;font-weight:700}.scene-inspector-editor-overlay{position:absolute;inset:0;z-index:4;display:grid;grid-template-rows:auto minmax(0,1fr);gap:12px;max-height:100%;padding:16px;overflow:hidden;background:var(--plotline-panel)}.scene-inspector-editor-overlay[hidden]{display:none}.scene-inspector-v2-edit .scene-inspector-editor-overlay{position:static;inset:auto;z-index:1;min-width:0;height:100%;max-height:none}.scene-inspector-editor-resizer{display:none}.scene-inspector-v2-edit.editor-overlay-open .scene-inspector-editor-resizer{display:block;align-self:stretch;min-height:100%;border-radius:999px;cursor:col-resize;background:linear-gradient(180deg,rgba(47,111,99,.16),rgba(47,111,99,.04))}.scene-inspector-v2-edit.editor-overlay-open .scene-inspector-editor-resizer::before{content:"";display:block;width:2px;height:48px;margin:18px auto;border-radius:999px;background:var(--plotline-accent);opacity:.55}.scene-inspector-v2-edit.editor-overlay-open .scene-inspector-editor-resizer:focus-visible,.scene-inspector-v2-edit.editor-overlay-open .scene-inspector-editor-resizer:hover{background:rgba(47,111,99,.16)}body.scene-inspector-editor-resizing{cursor:col-resize;user-select:none}.scene-inspector-editor-shell{position:sticky;top:0;z-index:2;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;border-bottom:1px solid var(--plotline-line);background:var(--plotline-panel);padding-bottom:12px}.scene-inspector-editor-shell h3{margin:0;font-size:1.1rem}.scene-inspector-editor-help{flex:0 0 auto}.scene-inspector-editor-empty{min-height:0;overflow:auto}.scene-inspector-editor-form{display:grid;grid-template-rows:minmax(0,1fr) auto;min-height:100%;gap:14px}.scene-inspector-editor-fields{display:grid;align-content:start;gap:14px;padding-right:4px}.scene-inspector-editor-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.scene-inspector-editor-fieldset{display:grid;gap:10px;min-width:0;margin:0;border:1px solid var(--plotline-line);border-radius:8px;padding:12px}.scene-inspector-editor-fieldset legend{float:none;width:auto;margin:0;padding:0 4px;color:var(--plotline-muted);font-size:.76rem;font-weight:800;text-transform:uppercase}.scene-inspector-editor-checks{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.scene-inspector-editor-checks label{display:flex;align-items:center;gap:8px;min-width:0;margin:0;border:1px solid rgba(47,111,99,.12);border-radius:8px;background:rgba(47,111,99,.05);padding:8px 10px}.scene-inspector-editor-checks span{overflow-wrap:anywhere}.scene-inspector-editor-footer{position:sticky;bottom:0;z-index:2;display:flex;justify-content:flex-end;gap:8px;border-top:1px solid var(--plotline-line);background:var(--plotline-panel);padding-top:12px}.scene-inspector-editor-error{border:1px solid rgba(179,95,59,.28);border-radius:8px;background:rgba(179,95,59,.1);padding:10px 12px;color:var(--plotline-danger,#b35f3b);font-weight:700}.scene-inspector-editor-loading,.scene-inspector-editor-pending{border:1px dashed rgba(47,111,99,.24);border-radius:8px;background:rgba(47,111,99,.04);padding:16px;color:var(--plotline-muted)}.scene-inspector-editor-metric{display:grid;gap:10px;border:1px solid var(--plotline-line);border-radius:8px;background:rgba(47,111,99,.04);padding:12px}.scene-inspector-editor-metric-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.scene-inspector-editor-metric-heading h4{margin:0;font-size:.98rem}.scene-inspector-editor-metric-heading p{margin:3px 0 0;color:var(--plotline-muted);font-size:.88rem}.scene-inspector-editor-metric-heading output{min-width:42px;border-radius:8px;background:var(--plotline-accent);padding:5px 8px;color:#fff;font-weight:800;text-align:center}.scene-inspector-editor-range-labels{display:flex;justify-content:space-between;color:var(--plotline-muted);font-size:.78rem}.scene-character-editor-section{display:grid;gap:10px}.scene-character-editor-heading{display:flex;align-items:center;justify-content:space-between;gap:10px;color:var(--plotline-muted);font-size:.76rem;font-weight:800;text-transform:uppercase}.scene-character-editor-heading strong{border-radius:999px;background:rgba(47,111,99,.1);padding:2px 8px;color:var(--plotline-accent-dark)}.scene-character-pov-options{display:grid;gap:7px}.scene-character-pov-options label{display:flex;align-items:center;gap:8px;margin:0;font-weight:700}.scene-character-editor-list{display:grid;gap:10px}.scene-character-editor-card{display:grid;gap:10px;border:1px solid var(--plotline-line);border-radius:8px;background:rgba(47,111,99,.04);padding:12px}.scene-character-editor-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.scene-character-editor-card-header h4{margin:0;font-size:1rem}.scene-character-editor-card-header p{margin:2px 0 0;color:var(--plotline-muted);font-size:.86rem}.scene-character-remove{display:inline-flex;align-items:center;gap:6px;margin:0;color:var(--plotline-muted);font-size:.82rem;font-weight:800;white-space:nowrap}.scene-world-editor-section{display:grid;gap:10px}.scene-world-editor-heading{display:flex;align-items:center;justify-content:space-between;gap:10px;color:var(--plotline-muted);font-size:.76rem;font-weight:800;text-transform:uppercase}.scene-world-editor-heading strong{border-radius:999px;background:rgba(47,111,99,.1);padding:2px 8px;color:var(--plotline-accent-dark)}.scene-world-editor-list{display:grid;gap:10px}.scene-world-editor-card{display:grid;gap:10px;border:1px solid var(--plotline-line);border-radius:8px;background:rgba(47,111,99,.04);padding:12px}.scene-world-editor-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.scene-world-editor-card-header h4{margin:0;font-size:1rem}.scene-world-editor-card-header p{margin:2px 0 0;color:var(--plotline-muted);font-size:.86rem}.scene-world-remove{display:inline-flex;align-items:center;gap:6px;margin:0;color:var(--plotline-muted);font-size:.82rem;font-weight:800;white-space:nowrap}.scene-writer-editor-section{display:grid;gap:10px}.scene-writer-editor-heading{display:flex;align-items:center;justify-content:space-between;gap:10px;color:var(--plotline-muted);font-size:.76rem;font-weight:800;text-transform:uppercase}.scene-writer-editor-heading strong{border-radius:999px;background:rgba(47,111,99,.1);padding:2px 8px;color:var(--plotline-accent-dark)}.scene-writer-editor-list{display:grid;gap:10px}.scene-writer-checklist-row,.scene-writer-editor-card{display:grid;gap:10px;border:1px solid var(--plotline-line);border-radius:8px;background:rgba(47,111,99,.04);padding:12px}.scene-writer-editor-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.scene-writer-editor-card-header h4{margin:0;font-size:1rem}.scene-writer-editor-card-header p{margin:2px 0 0;color:var(--plotline-muted);font-size:.86rem}.scene-writer-checklist-row{grid-template-columns:auto minmax(0,1fr) auto;align-items:center}.scene-writer-checklist-complete,.scene-writer-inline-check,.scene-writer-remove{display:inline-flex;align-items:center;gap:6px;margin:0;color:var(--plotline-muted);font-size:.82rem;font-weight:800;white-space:nowrap}.scene-attachment-editor-card{align-items:stretch}.scene-attachment-preview-row{display:grid;grid-template-columns:72px minmax(0,1fr);gap:12px;align-items:start}.scene-attachment-thumb{display:grid;place-items:center;width:72px;height:72px;overflow:hidden;border:1px solid var(--plotline-line);border-radius:8px;background:rgba(47,111,99,.06);color:var(--plotline-muted);font-size:.78rem;font-weight:800;text-align:center}.scene-attachment-thumb img{width:100%;height:100%;object-fit:cover}.scene-attachment-preview-copy{display:grid;gap:8px;min-width:0}.scene-attachment-preview-copy p{margin:0}.scene-attachment-delete-form,.scene-attachment-editor-form{display:grid;gap:10px}.scene-attachment-action-row{display:flex;justify-content:flex-end;gap:8px}.scene-structure-editor-section{display:grid;gap:10px}.scene-structure-editor-heading{display:flex;align-items:center;justify-content:space-between;gap:10px;color:var(--plotline-muted);font-size:.76rem;font-weight:800;text-transform:uppercase}.scene-structure-editor-heading strong{border-radius:999px;background:rgba(47,111,99,.1);padding:2px 8px;color:var(--plotline-accent-dark)}.scene-structure-delete-form,.scene-structure-editor-form,.scene-structure-editor-list{display:grid;gap:10px}.scene-structure-editor-card{display:grid;gap:10px;border:1px solid var(--plotline-line);border-radius:8px;background:rgba(47,111,99,.04);padding:12px}.scene-structure-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.scene-structure-card-header h4{margin:0;font-size:1rem}.scene-structure-card-header p,.scene-structure-editor-card p{margin:2px 0 0}.scene-structure-marker{flex:0 0 auto;border-radius:999px;background:var(--plot-colour,var(--plotline-accent));padding:3px 8px;color:#fff;font-size:.78rem;font-weight:800}.scene-structure-action-row{display:flex;justify-content:flex-end;gap:8px}.scene-structure-dependency-columns{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.scene-structure-inline-check{display:inline-flex;align-items:center;align-self:end;gap:6px;margin:0;color:var(--plotline-muted);font-size:.82rem;font-weight:800;white-space:nowrap}.scene-inspector-v2-timeline .scene-inspector-v2-health{grid-template-columns:repeat(2,minmax(0,1fr))}.scene-inspector-v2-timeline .scene-inspector-v2-card{padding:14px}.scene-inspector-v2-timeline .scene-inspector-v2-card-header,.scene-inspector-v2-timeline .scene-inspector-v2-list li{align-items:stretch;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-counts,.scene-inspector-v2-timeline .scene-inspector-v2-facts,.scene-inspector-v2-timeline .scene-inspector-v2-metrics{grid-template-columns:1fr}.scene-inspector-v2-timeline .scene-inspector-v2-metrics{grid-template-columns:1fr}.scene-inspector-v2-timeline .scene-inspector-v2-metric-track{height:7px}.scene-inspector-v2-timeline .scene-inspector-v2-metric-row{grid-template-columns:minmax(118px,150px) minmax(0,1fr) auto}@media (max-width:1100px){.scene-inspector-v2-edit.editor-overlay-open{grid-template-columns:minmax(0,1fr) 10px minmax(360px,min(var(--scene-editor-width),52%))}.scene-inspector-v2-grid,.scene-inspector-v2-health{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:1180px){.scene-inspector-v2-edit .scene-inspector-v2-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:720px){.scene-inspector-v2-counts,.scene-inspector-v2-facts,.scene-inspector-v2-grid,.scene-inspector-v2-health,.scene-inspector-v2-metrics{grid-template-columns:1fr}.scene-inspector-v2-card-header{flex-direction:column}.scene-inspector-editor-checks,.scene-inspector-editor-grid{grid-template-columns:1fr}.scene-writer-checklist-row{grid-template-columns:1fr;align-items:stretch}.scene-attachment-preview-row{grid-template-columns:1fr}.scene-structure-dependency-columns{grid-template-columns:1fr}}.floor-plan-toolbar-floor-group{flex:1 1 420px;min-width:min(100%,320px)}.floor-plan-active-floor{display:grid;gap:2px}.floor-plan-toolbar-control-group{flex:0 1 auto}.floor-plan-toolbar-action-group{flex:1 1 360px;justify-content:flex-end}.floor-plan-occupancy-scene-row{border-top:1px solid rgba(47,111,99,.12);padding-top:9px}.floor-plan-occupancy-scene-row[hidden]{display:none}.floor-plan-occupancy-scene-row .floor-plan-reference-control{flex:1 1 320px;min-width:min(100%,320px)}.floor-plan-occupancy-scene-row .form-select{width:100%}.floor-plan-occupancy-warning-panel{background:rgba(47,111,99,.05);border:1px solid rgba(47,111,99,.16);border-radius:8px;color:var(--plotline-ink,#1e252b);flex:1 1 100%;font-size:.82rem;padding:.55rem .7rem}.floor-plan-occupancy-warning-panel strong{display:block;font-size:.78rem;margin-bottom:.25rem;text-transform:uppercase}.floor-plan-occupancy-warning-panel p,.floor-plan-occupancy-warning-panel ul{margin:0}.floor-plan-occupancy-warning-panel ul{display:grid;gap:.25rem;list-style:none;padding:0}.floor-plan-occupancy-warning,.floor-plan-occupancy-warning-empty{border-radius:6px;font-weight:700;padding:.32rem .45rem}.floor-plan-occupancy-warning-empty{background:rgba(47,111,99,.08);color:var(--plotline-accent-dark,#22534a)}.floor-plan-occupancy-warning--warning{background:rgba(251,236,211,.78);color:#7b4b12}.floor-plan-occupancy-warning--info{background:rgba(233,243,248,.86);color:#245b78}.floor-plan-occupancy-warning-empty[hidden],.floor-plan-occupancy-warning[hidden]{display:none}.floor-plan-editor-toolbar .muted{display:block;font-size:.76rem;line-height:1.1}.floor-plan-reference-control,.floor-plan-toolbar-check{align-items:center;color:var(--muted-color,#6b756f);display:inline-flex;font-size:.82rem;font-weight:700;gap:6px}.floor-plan-reference-control{align-items:flex-start;flex-direction:column;gap:2px}.floor-plan-reference-control .form-select{min-width:180px}.floor-plan-save-status{border:1px solid rgba(47,111,99,.2);border-radius:999px;color:var(--plotline-accent-dark,#22534a);background:rgba(47,111,99,.08);font-size:.78rem;font-weight:800;padding:4px 9px}.floor-plan-save-status[data-save-state=dirty]{border-color:rgba(184,118,43,.32);color:#7b4b12;background:rgba(251,236,211,.72)}.floor-plan-save-status[data-save-state=saving]{border-color:rgba(51,117,155,.3);color:#245b78;background:rgba(233,243,248,.82)}.floor-plan-save-status[data-save-state=failed]{border-color:rgba(163,61,61,.32);color:#8a3434;background:rgba(255,232,232,.9)}.floor-plan-floor{display:none}.floor-plan-floor.active{display:block}.floor-plan-stage{min-width:0}.floor-plan-grid-wrap{max-width:100%;max-height:calc(100vh - 250px);min-height:min(58vh,520px);overflow:auto;padding-bottom:8px}.floor-plan-grid{--cell-size:34px;background:linear-gradient(to right,rgba(93,111,101,.18) 1px,transparent 1px),linear-gradient(to bottom,rgba(93,111,101,.18) 1px,transparent 1px),var(--panel-bg,#fff);background-size:var(--cell-size) var(--cell-size),var(--cell-size) var(--cell-size),auto;border:1px solid var(--border-color,#d8ded9);border-radius:8px;height:calc(var(--grid-height) * var(--cell-size));min-width:calc(var(--grid-width) * var(--cell-size));position:relative;width:calc(var(--grid-width) * var(--cell-size))}.floor-plan-coordinate-label{color:rgba(33,61,55,.42);font-size:.62rem;font-weight:800;line-height:1;pointer-events:none;position:absolute;text-shadow:0 1px 0 rgba(255,255,255,.7);user-select:none;z-index:5}.floor-plan-coordinate-label--column{left:calc(var(--coord-x) * var(--cell-size) + 4px);top:3px}.floor-plan-coordinate-label--row{left:4px;top:calc(var(--coord-y) * var(--cell-size) + 4px)}.floor-plan-reference-overlay{inset:0;pointer-events:none;position:absolute;z-index:1}.floor-plan-reference-block{align-items:center;background:rgba(47,111,99,.08);border:1px dashed rgba(47,111,99,.34);border-radius:2px;color:rgba(27,55,49,.46);display:flex;font-size:.62rem;font-weight:800;height:calc(var(--h) * var(--cell-size));justify-content:center;left:calc(var(--x) * var(--cell-size));line-height:1.05;overflow:hidden;padding:3px;position:absolute;text-align:center;top:calc(var(--y) * var(--cell-size));width:calc(var(--w) * var(--cell-size))}.floor-plan-reference-warning{background:rgba(251,236,211,.92);border:1px solid rgba(184,118,43,.34);border-radius:999px;color:#7b4b12;font-size:.76rem;font-weight:800;left:10px;padding:4px 10px;pointer-events:none;position:absolute;top:10px;z-index:6}.floor-plan-background-image{height:auto;left:0;max-width:none;opacity:var(--bg-opacity, .35);pointer-events:none;position:absolute;top:0;transform:translate(var(--bg-offset-x,0),var(--bg-offset-y,0)) scale(var(--bg-scale,1));transform-origin:top left;user-select:none;width:100%;z-index:0}.floor-plan-background-image.is-locked{pointer-events:none}.floor-plan-block{align-items:center;--floor-plan-wall-color:rgba(44, 84, 75, .55);border:2px solid transparent;border-radius:2px;color:#12332c;cursor:grab;display:flex;font-size:.72rem;font-weight:700;height:calc(var(--h) * var(--cell-size));justify-content:center;left:calc(var(--x) * var(--cell-size));line-height:1.08;overflow:hidden;padding:4px;position:absolute;text-align:center;top:calc(var(--y) * var(--cell-size));touch-action:none;width:calc(var(--w) * var(--cell-size));z-index:2}.floor-plan-wall-segment{background:var(--floor-plan-wall-color);pointer-events:none;position:absolute;z-index:2}.floor-plan-wall-segment--north,.floor-plan-wall-segment--south{height:2px;left:var(--wall-start);width:var(--wall-length)}.floor-plan-wall-segment--north{top:0}.floor-plan-wall-segment--south{bottom:0}.floor-plan-wall-segment--east,.floor-plan-wall-segment--west{height:var(--wall-length);top:var(--wall-start);width:2px}.floor-plan-wall-segment--east{right:0}.floor-plan-wall-segment--west{left:0}.floor-plan-block-label{display:-webkit-box;max-width:100%;overflow:hidden;overflow-wrap:normal;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:1}.floor-plan-block[style*="--h:2"] .floor-plan-block-label,.floor-plan-block[style*="--h:3"] .floor-plan-block-label,.floor-plan-block[style*="--h:4"] .floor-plan-block-label,.floor-plan-block[style*="--h:5"] .floor-plan-block-label,.floor-plan-block[style*="--h:6"] .floor-plan-block-label,.floor-plan-block[style*="--h:7"] .floor-plan-block-label,.floor-plan-block[style*="--h:8"] .floor-plan-block-label{-webkit-line-clamp:2}.floor-plan-block.selected{box-shadow:0 0 0 3px rgba(47,111,99,.28);outline:2px solid var(--bs-primary,#2f6f63);z-index:3}.floor-plan-block.overlap{border-color:#b45544;box-shadow:inset 0 0 0 2px rgba(180,85,68,.18)}.floor-plan-block.is-hidden-location{background-image:repeating-linear-gradient(135deg,rgba(18,51,44,.08) 0,rgba(18,51,44,.08) 3px,transparent 3px,transparent 9px);box-shadow:inset 0 0 0 1px rgba(43,54,49,.18)}.floor-plan-block.is-hidden-location.selected{box-shadow:inset 0 0 0 1px rgba(43,54,49,.18),0 0 0 3px rgba(47,111,99,.28)}.floor-plan-block.is-hidden-location.overlap{box-shadow:inset 0 0 0 2px rgba(180,85,68,.18),inset 0 0 0 1px rgba(43,54,49,.18)}.floor-plan-secret-route{border-top:2px dashed rgba(69,55,42,.58);height:0;left:calc(var(--route-x,0) * var(--cell-size));opacity:.72;pointer-events:none;position:absolute;top:calc(var(--route-y,0) * var(--cell-size));transform:rotate(var(--route-angle,0));transform-origin:0 50%;width:calc(var(--route-length,0) * var(--cell-size));z-index:3}.floor-plan-secret-route::after{background:rgba(255,250,242,.9);border:1px solid rgba(69,55,42,.5);border-radius:50%;content:"";height:7px;left:50%;position:absolute;top:-5px;transform:translateX(-50%);width:7px}.floor-plan-transition-marker{align-items:center;--transition-marker-ink:#12332c;--transition-marker-window:#246f9f;--transition-marker-blocked:#9b342b;background:rgba(255,250,242,.98);border:1px solid rgba(47,111,99,.55);border-radius:50%;box-shadow:0 2px 6px rgba(31,37,34,.16);color:var(--transition-marker-ink);display:flex;font-size:.72rem;font-weight:900;height:21px;justify-content:center;left:calc(var(--transition-x,0) * var(--cell-size));line-height:1;pointer-events:none;position:absolute;top:calc(var(--transition-y,0) * var(--cell-size));transform:translate(-50%,-50%);width:21px;z-index:4}.floor-plan-transition-marker svg{display:block;height:21px;overflow:visible;width:21px}.floor-plan-transition-marker.is-vertical svg{transform:rotate(90deg)}.floor-plan-transition-marker .marker-arc,.floor-plan-transition-marker .marker-blocked,.floor-plan-transition-marker .marker-line,.floor-plan-transition-marker .marker-window{fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.7}.floor-plan-transition-marker .marker-arc{stroke-width:1.35}.floor-plan-transition-marker .marker-window{stroke:var(--transition-marker-window)}.floor-plan-transition-marker .marker-dotted{opacity:.72;stroke-dasharray:1.4 2}.floor-plan-transition-marker .marker-blocked{stroke:var(--transition-marker-blocked);stroke-width:1.8}.floor-plan-transition-marker .marker-strong{stroke-width:2}.floor-plan-transition-marker .marker-track{opacity:.72}.floor-plan-transition-marker--window{background:rgba(239,249,255,.98);border-color:rgba(36,111,159,.48)}.floor-plan-transition-marker--sliding-door{background:rgba(248,252,249,.98);border-color:rgba(47,111,99,.58)}.floor-plan-transition-marker--french-door{background:rgba(255,252,246,.98);border-color:rgba(119,86,45,.5)}.floor-plan-transition-marker--secret-door{background:rgba(255,250,242,.88);border-style:dashed}.floor-plan-transition-marker--ladder{background:rgba(246,248,245,.98);border-color:rgba(77,91,67,.55)}.floor-plan-transition-marker--blocked-door{background:rgba(255,244,241,.98);border-color:rgba(155,52,43,.52)}.floor-plan-transition-marker--exterior-door{border-width:2px}.floor-plan-transition-marker.is-shared-edge{background:rgba(255,255,255,.98);border-color:rgba(47,111,99,.72)}.floor-plan-transition-marker--window.is-shared-edge{background:rgba(239,249,255,.98);border-color:rgba(36,111,159,.58)}.floor-plan-transition-marker--blocked-door.is-shared-edge{background:rgba(255,244,241,.98);border-color:rgba(155,52,43,.6)}.visual-card-heading{align-items:flex-start;display:flex;gap:12px}.visual-card-heading>div{min-width:0}.visual-avatar{align-items:center;aspect-ratio:1;background:linear-gradient(135deg,rgba(47,111,99,.16),rgba(212,154,98,.16));border:1px solid rgba(47,111,99,.22);border-radius:999px;color:var(--plotline-accent-dark,#22534a);display:inline-flex;flex:0 0 auto;font-weight:900;justify-content:center;letter-spacing:.02em;overflow:hidden;text-transform:uppercase}.visual-avatar img{height:100%;object-fit:cover;width:100%}.visual-avatar--sm{font-size:.72rem;width:32px}.visual-avatar--md{font-size:.9rem;width:48px}.visual-avatar--lg{font-size:1.3rem;width:96px}.visual-avatar--xl{font-size:1.6rem;width:128px}.visual-image-editor{align-items:center;background:rgba(47,111,99,.05);border:1px solid rgba(47,111,99,.14);border-radius:8px;display:flex;gap:18px;padding:14px}.visual-image-editor__controls{flex:1 1 auto;min-width:220px}.floor-plan-block--room{background:#d9eee7}.floor-plan-block--corridor{background:#e7e2f4}.floor-plan-block--openspace{background:#e5efd4}.floor-plan-block--exterior{background:#d9ecf3}.floor-plan-block--other{background:#ece9e1}.floor-plan-resize-handle{border-bottom:10px solid rgba(18,51,44,.45);border-left:10px solid transparent;bottom:4px;height:0;position:absolute;right:4px;width:0}.floor-plan-side-panel{align-self:start;position:sticky;top:82px}.floor-plan-side-panel h2{font-size:1.05rem;margin-bottom:8px}.floor-plan-side-panel h3{font-size:.92rem;margin:0 0 8px}.floor-plan-toolbox{background:var(--panel-bg,#fff);border:1px solid var(--border-color,#d8ded9);border-radius:8px;display:grid;grid-template-rows:auto minmax(0,1fr);max-height:calc(100vh - 250px);min-height:min(58vh,520px);overflow:hidden}.floor-plan-toolbox-tabs{border-bottom:1px solid var(--border-color,#d8ded9);display:flex;flex-wrap:wrap;gap:0}.floor-plan-toolbox-tab{background:0 0;border:0;border-right:1px solid var(--border-color,#d8ded9);border-bottom:1px solid var(--border-color,#d8ded9);color:inherit;flex:1 1 118px;font-size:.82rem;font-weight:800;min-width:112px;padding:10px 8px}.floor-plan-toolbox-tab.active:last-child,.floor-plan-toolbox-tab:last-child{border-right:0}.floor-plan-toolbox-tab.active{background:rgba(47,111,99,.1);border-bottom-color:var(--plotline-accent,#2f6f63);color:var(--plotline-accent-dark,#22534a)}.floor-plan-toolbox-body{min-height:0;overflow:auto}.floor-plan-tool-card{background:var(--panel-bg,#fff);border:1px solid var(--border-color,#d8ded9);border-radius:8px;padding:14px}.floor-plan-toolbox .floor-plan-tool-card{background:0 0;border:0;border-radius:0}.floor-plan-tool-card[hidden]{display:none}.floor-plan-tool-card p{margin-bottom:10px}.floor-plan-tool-subsection{border-top:1px solid var(--border-color,#d8ded9);margin-top:12px;padding-top:12px}.floor-plan-tool-subsection:first-of-type{border-top:0;margin-top:0;padding-top:0}.floor-plan-background-file{border:1px solid rgba(47,111,99,.16);border-radius:6px;font-size:.86rem;padding:8px 10px}.floor-plan-background-range{align-items:center;display:grid;gap:10px;grid-template-columns:minmax(0,1fr) 44px}.floor-plan-background-range span{color:var(--muted-text,#5d6f65);font-size:.8rem;font-variant-numeric:tabular-nums;text-align:right}.floor-plan-transition-list{display:grid;gap:8px}.floor-plan-transition-item{border:1px solid rgba(47,111,99,.14);border-radius:6px;display:grid;gap:8px;padding:8px}.floor-plan-transition-item span,.floor-plan-transition-item strong{display:block;font-size:.84rem}.floor-plan-transition-item span{color:var(--muted-text,#5d6f65)}.floor-plan-editor--occupancy .floor-plan-block{cursor:default;touch-action:auto}.floor-plan-editor--occupancy .floor-plan-resize-handle{display:none}.floor-plan-editor--occupancy .floor-plan-side-panel{display:none}.floor-plan-occupancy-tray{position:absolute;z-index:14;height:calc(var(--h) * var(--cell-size));left:calc(var(--x) * var(--cell-size));top:calc(var(--y) * var(--cell-size));width:calc(var(--w) * var(--cell-size));display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:.18rem;padding:0 0 .25rem;pointer-events:auto}.floor-plan-occupancy-tray[hidden]{display:none}.floor-plan-occupancy-token{display:grid;place-items:center;width:1.8rem;height:1.8rem;overflow:hidden;border:2px solid #fff;border-radius:999px;color:#fff;background:var(--plotline-accent);box-shadow:0 4px 12px rgba(30,37,43,.18);font-size:.68rem;font-weight:800}.floor-plan-occupancy-token img{width:100%;height:100%;object-fit:cover}.floor-plan-occupancy-token--asset{width:1.45rem;height:1.45rem;background:#805c15;font-size:.58rem}.floor-plan-occupancy-more{border-radius:999px;padding:.15rem .36rem;color:var(--plotline-ink);background:rgba(255,255,255,.92);box-shadow:0 4px 12px rgba(30,37,43,.12);font-size:.72rem;font-weight:800}.floor-plan-occupancy-message{align-self:start;background:rgba(255,255,255,.94);border:1px solid rgba(47,111,99,.18);border-radius:8px;box-shadow:0 6px 16px rgba(30,37,43,.08);color:var(--muted-color,#6b756f);font-size:.82rem;font-weight:700;grid-column:1/-1;grid-row:1;justify-self:center;margin-top:.55rem;max-width:min(92%,520px);padding:.45rem .7rem;position:relative;z-index:16}.floor-plan-occupancy-message[hidden]{display:none}.floor-plan-transition-accordion .accordion-item{background:0 0;border-color:var(--border-color,#d8ded9)}.floor-plan-transition-accordion .accordion-button{background:rgba(47,111,99,.06);color:inherit;font-size:.88rem;font-weight:800;padding:10px 12px}.floor-plan-transition-accordion .accordion-button:not(.collapsed){background:rgba(47,111,99,.12);color:var(--plotline-accent-dark,#22534a);box-shadow:inset 0 -1px 0 var(--border-color,#d8ded9)}.floor-plan-transition-accordion .accordion-body{padding:12px}.floor-plan-checkbox{align-items:center;display:inline-flex;gap:6px;font-weight:700;margin-bottom:4px}.floor-plan-choice-row{display:grid;gap:4px;margin-bottom:10px}.floor-plan-choice-row label{align-items:center;display:flex;gap:6px;font-size:.88rem}.floor-plan-overlap-warning{background:rgba(180,85,68,.12);border:1px solid rgba(180,85,68,.35);border-radius:6px;color:#8f3f31;margin-bottom:10px;padding:8px 10px}.dark .floor-plan-grid,[data-bs-theme=dark] .floor-plan-grid{background:linear-gradient(to right,rgba(214,224,218,.12) 1px,transparent 1px),linear-gradient(to bottom,rgba(214,224,218,.12) 1px,transparent 1px),#15201d;background-size:var(--cell-size) var(--cell-size),var(--cell-size) var(--cell-size),auto}.dark .floor-plan-editor-toolbar,.dark .floor-plan-tool-card,.dark .floor-plan-toolbox,[data-bs-theme=dark] .floor-plan-editor-toolbar,[data-bs-theme=dark] .floor-plan-tool-card,[data-bs-theme=dark] .floor-plan-toolbox{background:var(--panel-bg,#1f2522)}.dark .floor-plan-toolbox .floor-plan-tool-card,[data-bs-theme=dark] .floor-plan-toolbox .floor-plan-tool-card{background:0 0}.dark .floor-plan-toolbox-tab.active,[data-bs-theme=dark] .floor-plan-toolbox-tab.active{background:rgba(212,154,98,.16);color:var(--plotline-accent-dark,#f0c99d)}.dark .floor-plan-block,[data-bs-theme=dark] .floor-plan-block{--floor-plan-wall-color:rgba(212, 154, 98, .6);color:#f1f6f3}.dark .floor-plan-block.is-hidden-location,[data-bs-theme=dark] .floor-plan-block.is-hidden-location{background-image:repeating-linear-gradient(135deg,rgba(244,234,220,.09) 0,rgba(244,234,220,.09) 3px,transparent 3px,transparent 9px);box-shadow:inset 0 0 0 1px rgba(244,234,220,.2)}.dark .floor-plan-secret-route,[data-bs-theme=dark] .floor-plan-secret-route{border-top-color:rgba(244,204,160,.58);opacity:.76}.dark .floor-plan-secret-route::after,[data-bs-theme=dark] .floor-plan-secret-route::after{background:rgba(42,35,30,.95);border-color:rgba(244,204,160,.55)}.dark .floor-plan-coordinate-label,[data-bs-theme=dark] .floor-plan-coordinate-label{color:rgba(244,234,220,.46);text-shadow:0 1px 0 rgba(0,0,0,.55)}.dark .floor-plan-reference-block,[data-bs-theme=dark] .floor-plan-reference-block{background:rgba(131,199,242,.08);border-color:rgba(131,199,242,.32);color:rgba(244,234,220,.46)}.dark .floor-plan-reference-warning,[data-bs-theme=dark] .floor-plan-reference-warning{background:rgba(84,57,25,.92);border-color:rgba(244,177,100,.32);color:#ffd9a5}.dark .floor-plan-transition-marker,[data-bs-theme=dark] .floor-plan-transition-marker{--transition-marker-ink:#f4eadc;--transition-marker-window:#83c7f2;--transition-marker-blocked:#f08a78;background:rgba(42,35,30,.98);border-color:rgba(212,154,98,.6)}.dark .floor-plan-transition-marker.is-shared-edge,[data-bs-theme=dark] .floor-plan-transition-marker.is-shared-edge{background:rgba(48,39,32,.98);border-color:rgba(212,154,98,.78)}.dark .floor-plan-transition-marker--window,.dark .floor-plan-transition-marker--window.is-shared-edge,[data-bs-theme=dark] .floor-plan-transition-marker--window,[data-bs-theme=dark] .floor-plan-transition-marker--window.is-shared-edge{background:rgba(24,45,58,.98);border-color:rgba(131,199,242,.66)}.dark .floor-plan-transition-marker--french-door,.dark .floor-plan-transition-marker--ladder,.dark .floor-plan-transition-marker--sliding-door,[data-bs-theme=dark] .floor-plan-transition-marker--french-door,[data-bs-theme=dark] .floor-plan-transition-marker--ladder,[data-bs-theme=dark] .floor-plan-transition-marker--sliding-door{background:rgba(39,43,37,.98);border-color:rgba(212,154,98,.58)}.dark .floor-plan-transition-marker--blocked-door,.dark .floor-plan-transition-marker--blocked-door.is-shared-edge,[data-bs-theme=dark] .floor-plan-transition-marker--blocked-door,[data-bs-theme=dark] .floor-plan-transition-marker--blocked-door.is-shared-edge{background:rgba(58,33,28,.98);border-color:rgba(240,138,120,.66)}.dark .visual-avatar,[data-bs-theme=dark] .visual-avatar{background:linear-gradient(135deg,rgba(131,199,242,.14),rgba(212,154,98,.18));border-color:rgba(244,234,220,.18);color:#f4eadc}.dark .visual-image-editor,[data-bs-theme=dark] .visual-image-editor{background:rgba(244,234,220,.04);border-color:rgba(244,234,220,.12)}.dark .floor-plan-transition-item,[data-bs-theme=dark] .floor-plan-transition-item{border-color:rgba(212,154,98,.22)}.dark .floor-plan-occupancy-token,[data-bs-theme=dark] .floor-plan-occupancy-token{border-color:#1f2630;box-shadow:0 4px 12px rgba(0,0,0,.28)}.dark .floor-plan-occupancy-more,[data-bs-theme=dark] .floor-plan-occupancy-more{color:#f1e7dd;background:rgba(31,38,48,.92)}.dark .floor-plan-occupancy-message,[data-bs-theme=dark] .floor-plan-occupancy-message{background:rgba(31,38,48,.94);border-color:rgba(212,154,98,.24);color:#d9c8b8}.dark .floor-plan-occupancy-warning-panel,[data-bs-theme=dark] .floor-plan-occupancy-warning-panel{background:rgba(244,234,220,.04);border-color:rgba(212,154,98,.2);color:#f1e7dd}.dark .floor-plan-occupancy-warning-empty,[data-bs-theme=dark] .floor-plan-occupancy-warning-empty{background:rgba(47,111,99,.18);color:#b8e2d7}.dark .floor-plan-occupancy-warning--warning,[data-bs-theme=dark] .floor-plan-occupancy-warning--warning{background:rgba(84,57,25,.92);color:#ffd9a5}.dark .floor-plan-occupancy-warning--info,[data-bs-theme=dark] .floor-plan-occupancy-warning--info{background:rgba(24,45,58,.92);color:#b9dcf3}.dark .floor-plan-transition-accordion .accordion-item,[data-bs-theme=dark] .floor-plan-transition-accordion .accordion-item{border-color:rgba(212,154,98,.22)}.dark .floor-plan-transition-accordion .accordion-button,[data-bs-theme=dark] .floor-plan-transition-accordion .accordion-button{background:rgba(212,154,98,.08);color:#f4eadc}.dark .floor-plan-transition-accordion .accordion-button:not(.collapsed),[data-bs-theme=dark] .floor-plan-transition-accordion .accordion-button:not(.collapsed){background:rgba(212,154,98,.16);color:var(--plotline-accent-dark,#f0c99d);box-shadow:inset 0 -1px 0 rgba(212,154,98,.22)}.dark .floor-plan-block--room,[data-bs-theme=dark] .floor-plan-block--room{background:#29584f}.dark .floor-plan-block--corridor,[data-bs-theme=dark] .floor-plan-block--corridor{background:#514876}.dark .floor-plan-block--openspace,[data-bs-theme=dark] .floor-plan-block--openspace{background:#4f6133}.dark .floor-plan-block--exterior,[data-bs-theme=dark] .floor-plan-block--exterior{background:#315d6f}.dark .floor-plan-block--other,[data-bs-theme=dark] .floor-plan-block--other{background:#5b564c}@media (max-width:1100px){.floor-plan-editor-toolbar,.floor-plan-layout{grid-template-columns:1fr}.floor-plan-grid-wrap{max-height:62vh}.floor-plan-side-panel{position:static}.floor-plan-toolbox{max-height:none}} \ No newline at end of file +html{font-size:15px;min-height:100%}.writing-context-page{min-height:calc(100vh - 8rem);color:var(--plotline-ink)}.writing-context-scene-header,.writing-context-shell-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1.5rem;margin-bottom:1rem}.writing-context-scene-header h2,.writing-context-shell-header h1{margin:0}.writing-context-status{display:inline-flex;align-items:center;gap:.5rem;padding:.4rem .65rem;border:1px solid var(--plotline-line);border-radius:999px;background:var(--plotline-panel);color:var(--plotline-muted);font-size:.9rem;white-space:nowrap}.writing-context-status-dot{width:.55rem;height:.55rem;border-radius:50%;background:#2f8f63;box-shadow:0 0 0 .18rem rgba(47,143,99,.15)}.writing-context-empty{min-height:42vh;display:grid;align-content:center;justify-items:start;padding:3rem;border:1px solid var(--plotline-line);border-radius:.5rem;background:var(--plotline-panel)}.writing-context-scene-header{padding:1rem 0 1.2rem;border-bottom:1px solid var(--plotline-line)}.writing-context-scene-header p{margin:.35rem 0 0;color:var(--plotline-muted)}.writing-context-scene-actions{display:grid;grid-template-columns:minmax(18rem,28rem) auto;gap:.5rem;align-items:end}.writing-context-scene-actions label{grid-column:1/-1;margin:0;color:var(--plotline-muted);font-size:.82rem;font-weight:700}.writing-context-tabs{display:flex;flex-wrap:wrap;gap:.35rem;margin:1rem 0}.writing-context-tabs button{border:1px solid var(--plotline-line);border-radius:.4rem;background:var(--plotline-panel);color:var(--plotline-ink);padding:.55rem .85rem;font-weight:700}.writing-context-tabs button.active{background:var(--plotline-accent);border-color:var(--plotline-accent);color:#fff}.writing-context-tab-panel[hidden]{display:none}.writing-context-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem}.writing-context-grid--overview{grid-template-columns:minmax(0,1.35fr) minmax(20rem,.65fr)}.writing-context-grid--place{grid-template-columns:minmax(18rem,.7fr) minmax(0,1.3fr)}.writing-context-card{min-width:0;padding:1rem;border:1px solid var(--plotline-line);border-radius:.5rem;background:var(--plotline-panel)}.writing-context-card--hero,.writing-context-card--wide{grid-column:span 2}.writing-context-card h3{margin:0 0 .65rem;font-size:1.2rem}.writing-context-facts{display:grid;grid-template-columns:minmax(7rem,.45fr) minmax(0,1fr);gap:.45rem .75rem;margin:0}.writing-context-facts dt{color:var(--plotline-muted);font-weight:700}.writing-context-facts dd{margin:0}.writing-context-chip-row{display:flex;flex-wrap:wrap;gap:.4rem;margin-bottom:.65rem}.writing-context-chip-row span,.writing-context-relationship-list span{display:inline-flex;align-items:center;border:1px solid var(--plotline-line);border-radius:999px;padding:.2rem .55rem;background:var(--plotline-paper);color:var(--plotline-muted);font-size:.82rem}.writing-context-list{display:grid;gap:.7rem;padding:0;margin:0;list-style:none}.writing-context-list li{min-width:0}.writing-context-list p{margin:.2rem 0 0;color:var(--plotline-muted)}.writing-intent-status-label{display:inline-flex;align-items:center;margin-left:.35rem;padding:.1rem .45rem;border:1px solid var(--plotline-line);border-radius:999px;background:var(--plotline-paper);color:var(--plotline-muted);font-size:.78rem;font-weight:700}.writing-intent-checklist li{display:grid;grid-template-columns:4.5rem minmax(0,1fr);gap:.5rem;align-items:start}.writing-intent-checklist li>span:first-child{color:var(--plotline-muted);font-size:.78rem;font-weight:800;text-transform:uppercase}.writing-intent-checklist li.is-complete>span:last-child{color:var(--plotline-muted);text-decoration:line-through}.writing-context-people-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(18rem,1fr));gap:1rem}.writing-context-person-heading{display:flex;align-items:center;gap:.75rem;margin-bottom:.9rem}.writing-context-person-heading h3,.writing-context-person-heading p{margin:0}.writing-context-mini-section,.writing-context-person-heading p{color:var(--plotline-muted)}.writing-context-mini-section{margin-top:.8rem;padding-top:.8rem;border-top:1px solid var(--plotline-line)}.writing-context-mini-section p{margin:0 0 .35rem}.writing-context-relationship-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(16rem,1fr));gap:.7rem}.writing-context-relationship-list>div{display:grid;gap:.35rem;padding:.75rem;border:1px solid var(--plotline-line);border-radius:.4rem;background:var(--plotline-paper)}.writing-context-floor{display:grid;grid-template-columns:repeat(var(--floor-cols),minmax(0,1fr));grid-template-rows:repeat(var(--floor-rows),minmax(1.2rem,1fr));gap:.18rem;min-height:34rem;padding:.5rem;border:1px solid var(--plotline-line);border-radius:.45rem;background:color-mix(in srgb,var(--plotline-paper) 88%,var(--plotline-line));overflow:auto}.writing-context-floor-block{display:grid;align-content:start;gap:.2rem;min-width:0;min-height:2.2rem;padding:.35rem;border:1px solid color-mix(in srgb,var(--plotline-accent) 35%,var(--plotline-line));border-radius:.3rem;background:color-mix(in srgb,var(--plotline-panel) 92%,var(--plotline-accent));font-size:.82rem}.writing-context-floor-block span{color:var(--plotline-muted);overflow-wrap:anywhere}@media (max-width:900px){.writing-context-scene-header,.writing-context-shell-header{display:grid}.writing-context-grid,.writing-context-grid--overview,.writing-context-grid--place,.writing-context-scene-actions{grid-template-columns:1fr}.writing-context-card--hero,.writing-context-card--wide{grid-column:auto}}@media (min-width:768px){html{font-size:16px}}:root{--plotline-ink:#1e252b;--plotline-muted:#66717b;--plotline-paper:#fbfaf7;--plotline-panel:#ffffff;--plotline-line:#d8ddd8;--plotline-accent:#2f6f63;--plotline-accent-dark:#22534a;--plotline-soft:#eef5f2;--timeline-label-width:180px;--timeline-scene-width:220px;--timeline-grid-gap:10px}body{min-height:100%;margin-bottom:0;color:var(--plotline-ink);background:var(--plotline-paper)}a{color:var(--plotline-accent-dark)}.btn-primary{--bs-btn-bg:var(--plotline-accent);--bs-btn-border-color:var(--plotline-accent);--bs-btn-hover-bg:var(--plotline-accent-dark);--bs-btn-hover-border-color:var(--plotline-accent-dark)}.btn-outline-primary{--bs-btn-color:var(--plotline-accent-dark);--bs-btn-border-color:var(--plotline-accent);--bs-btn-hover-bg:var(--plotline-accent);--bs-btn-hover-border-color:var(--plotline-accent)}.plotline-nav{background:rgba(255,255,255,.94);backdrop-filter:blur(8px)}.plotline-shell{max-width:1480px;padding-left:24px;padding-right:24px}.plotline-shell-wide{max-width:none;padding-left:clamp(18px,2vw,32px);padding-right:clamp(18px,2vw,32px)}.page-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:24px;margin:18px 0 24px}.workspace-heading{display:flex;align-items:flex-end;justify-content:space-between;gap:18px;margin:14px 0 18px}.workspace-heading h1{margin:0;font-size:clamp(1.8rem, 3vw, 2.7rem);line-height:1.05}.page-heading.compact{max-width:980px}.page-heading h1{margin:0;font-size:clamp(2rem, 4vw, 3.2rem);line-height:1.05;letter-spacing:0}.eyebrow{margin:0 0 6px;color:var(--plotline-accent-dark);font-size:.78rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.lead-text{max-width:760px;margin:10px 0 0;color:var(--plotline-muted);font-size:1.05rem}.button-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.asset-card-footer form,.button-row form,.compact-buttons form,form[data-confirm-message],td.text-end form{display:inline-flex;align-items:center;margin:0}td.text-end{white-space:nowrap}.content-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px}.edit-panel,.empty-panel,.list-section,.plain-card{background:var(--plotline-panel);border:1px solid var(--plotline-line);border-radius:8px;padding:20px;box-shadow:0 10px 24px rgba(30,37,43,.04)}.empty-panel h2,.list-section h2,.plain-card h2{margin-top:0;font-size:1.35rem}.empty-panel p,.muted,.plain-card p{color:var(--plotline-muted)}.edit-panel{max-width:980px}.feature-request-admin-page .edit-panel,.feature-request-admin-page .page-heading.compact{max-width:none}.names-library-panel{max-width:none}.names-library-panel--search{margin-bottom:20px}.names-library-panel--results{margin-top:0}.feature-request-admin-table{table-layout:fixed}.feature-request-admin-table td,.feature-request-admin-table th{vertical-align:middle}.feature-request-admin-table__preview{max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feature-request-admin-table__action{width:78px}@media (max-width:1100px){.feature-request-admin-table{table-layout:auto}.feature-request-admin-table__preview{max-width:160px}}.trial-dashboard-banner,.trial-status-panel{border:1px solid var(--plotline-line);border-radius:8px;padding:18px 20px;background:var(--plotline-panel)}.trial-status-panel{display:grid;gap:12px;margin-bottom:18px}.trial-status-panel--signup{grid-template-columns:minmax(0,1fr) auto;align-items:center;max-width:980px}.trial-dashboard-banner h2,.trial-status-panel h2,.trial-status-panel h3{margin:0}.trial-dashboard-banner p,.trial-status-panel p{margin-bottom:0}.trial-dashboard-banner,.trial-status-panel__heading{display:flex;gap:16px;align-items:center;justify-content:space-between}.trial-dashboard-banner{margin-bottom:18px}.trial-dashboard-banner__body{min-width:0}.trial-dashboard-banner__actions{display:flex;flex:0 0 auto;flex-wrap:wrap;gap:8px}.trial-progress{height:10px;overflow:hidden;border-radius:999px;background:rgba(84,68,48,.12)}.trial-progress__bar{height:100%;border-radius:inherit}.trial-dashboard-banner[hidden],.trial-status-panel[hidden]{display:none}.location-page .drag-drop-panel,.location-page .edit-panel,.location-page .empty-panel,.location-page .page-heading.compact{max-width:none}.import-panel,.import-preview-section{max-width:none}.import-json-input{font-family:Consolas,"Liberation Mono",Menlo,monospace;font-size:.88rem;line-height:1.45;min-height:34rem;max-height:64vh;overflow:auto;resize:vertical;white-space:pre}.import-counts,.import-preview-heading{display:flex;align-items:flex-start;gap:12px}.import-preview-heading{justify-content:space-between;margin-bottom:16px}.import-counts{flex-wrap:wrap}.import-counts span{display:inline-flex;align-items:baseline;gap:5px;border:1px solid var(--plotline-line);border-radius:999px;padding:5px 11px;background:var(--plotline-soft);color:var(--plotline-muted);font-weight:700}.import-counts strong{color:var(--plotline-ink)}.import-tree{display:grid;gap:12px}.import-tree-book{border:1px solid var(--plotline-line);border-radius:8px;padding:14px;background:rgba(255,255,255,.54)}.import-tree-book>summary,.import-tree-chapter>summary{display:flex;align-items:center;justify-content:space-between;gap:12px;cursor:pointer}.import-tree-book>summary span,.import-tree-chapter>summary span{color:var(--plotline-muted);font-size:.84rem;font-weight:700;white-space:nowrap}.import-tree-book h3{margin:0 0 10px;font-size:1.08rem}.import-tree-chapter{border-top:1px solid var(--plotline-line);padding:10px 0 0;margin-top:10px}.import-tree-chapter ul{margin:8px 0 0;color:var(--plotline-muted)}.import-scene-meta{display:block;margin-top:2px;color:var(--plotline-muted);font-size:.82rem}.import-mapping-summary{display:grid;gap:6px;border:1px solid rgba(184,118,43,.28);border-radius:8px;padding:10px 12px;margin-bottom:14px;background:rgba(251,236,211,.5);color:var(--plotline-muted);font-size:.9rem}.import-duplicate-confirm{border:1px solid rgba(184,118,43,.34);border-radius:8px;padding:12px 12px 12px 38px;background:rgba(251,236,211,.72)}.import-confirmation,.import-docs details{border:1px solid var(--plotline-line);border-radius:8px;padding:16px;background:rgba(255,255,255,.42)}.import-confirmation h3,.import-doc-grid h3{margin-top:0;font-size:1.05rem}.import-docs summary{cursor:pointer;font-weight:800}.import-doc-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;margin-top:14px}.import-message-list ul{max-height:16rem;overflow:auto}.scene-editor{max-width:1180px}.table{margin-bottom:0}.table th{color:var(--plotline-muted);font-size:.78rem;letter-spacing:.06em;text-transform:uppercase}.narrow{width:90px;white-space:nowrap}.status-pill{display:inline-flex;align-items:center;width:fit-content;border:1px solid #c8d8d2;border-radius:999px;padding:2px 8px;color:var(--plotline-accent-dark);background:var(--plotline-soft);font-size:.78rem;font-weight:700;white-space:nowrap}.dashboard-summary-card{border-color:var(--plotline-line)}.dashboard-summary-grid{display:grid;grid-template-columns:repeat(9,minmax(0,1fr));gap:8px}.dashboard-summary-body{padding:8px 9px}.dashboard-summary-label{margin-bottom:3px;font-size:.64rem;line-height:1.15}.dashboard-summary-value{display:block;font-size:1.25rem;line-height:1;overflow-wrap:anywhere}.dashboard-summary-calm{border-color:rgba(47,111,99,.28);background:rgba(238,245,242,.62)}.dashboard-summary-mild{border-color:rgba(197,139,43,.32);background:rgba(255,248,232,.68)}.dashboard-summary-attention{border-color:rgba(142,80,103,.32);background:rgba(252,241,246,.7)}@media (max-width:1199.98px){.dashboard-summary-grid{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (max-width:767.98px){.dashboard-summary-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:420px){.dashboard-summary-grid{grid-template-columns:1fr}}.dashboard-progress-card{border-color:rgba(47,111,99,.18);background:linear-gradient(180deg,#fff 0,rgba(238,245,242,.64) 100%)}.dashboard-progress-body{padding:12px 14px}.dashboard-progress-heading{margin-bottom:8px}.dashboard-progress-title{margin:0 0 2px;font-size:1.05rem;line-height:1.2}.dashboard-series-progress{height:7px;background:rgba(47,111,99,.1)}.dashboard-series-progress .progress-bar{background:linear-gradient(90deg,var(--plotline-accent),#6fa99b)}.dashboard-progress-source{border-color:rgba(47,111,99,.2);color:var(--plotline-accent-dark);background:rgba(238,245,242,.9)}.dashboard-book-title-block h3{line-height:1.16}.dashboard-book-title-block a{color:var(--plotline-ink);text-decoration-color:rgba(47,111,99,0.35)}.dashboard-book-subtitle{color:var(--plotline-muted);font-size:.95rem;line-height:1.25}.dashboard-status-pill{border-color:var(--dashboard-status-border,#c8d8d2);color:var(--dashboard-status-ink,var(--plotline-accent-dark));background:var(--dashboard-status-bg,var(--plotline-soft))}.dashboard-status-published{--dashboard-status-border:rgba(47, 111, 99, 0.32);--dashboard-status-bg:#e7f2ed;--dashboard-status-ink:#22534a}.dashboard-status-drafting{--dashboard-status-border:rgba(184, 118, 43, 0.35);--dashboard-status-bg:#fff2dd;--dashboard-status-ink:#7b4b12}.dashboard-status-planning{--dashboard-status-border:rgba(51, 117, 155, 0.3);--dashboard-status-bg:#e9f3f8;--dashboard-status-ink:#245b78}.dashboard-status-outlining,.dashboard-status-research{--dashboard-status-border:rgba(103, 80, 164, 0.26);--dashboard-status-bg:#f0edf8;--dashboard-status-ink:#51417c}.dashboard-status-revising{--dashboard-status-border:rgba(123, 82, 148, 0.3);--dashboard-status-bg:#f4eefa;--dashboard-status-ink:#5f3e73}.dashboard-status-editing{--dashboard-status-border:rgba(68, 75, 130, 0.3);--dashboard-status-bg:#eceef8;--dashboard-status-ink:#343b72}.dashboard-status-proofreading{--dashboard-status-border:rgba(43, 130, 123, 0.3);--dashboard-status-bg:#e6f5f2;--dashboard-status-ink:#23625d}.dashboard-status-ready{--dashboard-status-border:rgba(185, 142, 30, 0.34);--dashboard-status-bg:#fff6d8;--dashboard-status-ink:#765a0f}.dashboard-status-paused{--dashboard-status-border:rgba(102, 113, 123, 0.28);--dashboard-status-bg:#f0f2f1;--dashboard-status-ink:#56616b}.dashboard-status-archived{--dashboard-status-border:rgba(139, 80, 86, 0.28);--dashboard-status-bg:#f3eded;--dashboard-status-ink:#76474d}.dashboard-attention-soft{border-color:rgba(102,113,123,.24);color:#56616b;background:#f3f4f2}.word-companion-follow-toggle[aria-pressed=true]{border-color:rgba(47,111,99,.36);color:var(--plotline-accent-dark);background:var(--plotline-soft);font-weight:700}.word-companion-follow-toggle[aria-pressed=true]::after{content:" On"}.word-companion-follow-toggle[aria-pressed=false]::after{content:" Off"}.order-buttons{display:flex;gap:6px}.purpose-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:8px;max-height:260px;overflow:auto;padding:10px;border:1px solid var(--plotline-line);border-radius:8px;background:#fcfcfb}.purpose-check{display:flex;align-items:center;gap:8px;font-size:.92rem}.timeline-filter{display:flex;align-items:center;gap:8px;min-width:min(420px,100%)}.workspace-layout{display:grid;grid-template-columns:minmax(0,1fr);gap:0;align-items:start;--timeline-inspector-width:min(40vw, 560px)}.workspace-layout.inspector-drawer-open{grid-template-columns:minmax(420px,1fr) 10px minmax(420px,var(--timeline-inspector-width));gap:12px}.timeline-workspace{min-width:0;max-width:100%}.timeline-inspector-resizer{position:sticky;top:76px;z-index:25;width:10px;height:calc(100vh - 96px);border-radius:999px;cursor:col-resize;background:linear-gradient(180deg,rgba(47,111,99,.16),rgba(47,111,99,.04))}.timeline-inspector-resizer::before{content:"";display:block;width:2px;height:48px;margin:18px auto;border-radius:999px;background:var(--plotline-accent);opacity:.55}.timeline-inspector-resizer:focus-visible,.timeline-inspector-resizer:hover{background:rgba(47,111,99,.16)}body.timeline-inspector-resizing{cursor:col-resize;user-select:none}.pacing-panel{margin-top:14px;margin-bottom:0;border:1px solid var(--plotline-line);border-radius:8px;padding:14px;background:#fff;box-shadow:0 10px 24px rgba(30,37,43,.04)}.pacing-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:10px}.pacing-heading h2{margin:0;font-size:1.1rem}.metric-graph-stack{display:grid;gap:10px;max-width:100%;overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;padding-bottom:4px}.metric-graph-row{display:grid;grid-template-columns:150px minmax(260px,1fr);gap:10px;align-items:center;min-width:max(100%,calc(150px + (var(--scene-count,1) * 34px)))}.metric-graph-label{color:var(--plotline-muted);font-size:.84rem;font-weight:700}.metric-graph-points{display:grid;grid-template-columns:repeat(var(--scene-count),minmax(28px,1fr));gap:5px;align-items:end;min-height:52px;border-radius:8px;padding:6px;background:linear-gradient(180deg,#f6faf8 0,#edf4f1 100%);min-width:calc(var(--scene-count) * 34px)}.metric-point{display:flex;align-items:flex-end;justify-content:center;height:48px;min-width:28px;color:var(--plotline-accent-dark);text-decoration:none}.metric-point::before{content:"";display:block;width:100%;height:max(8px,var(--metric-height));border-radius:5px 5px 2px 2px;background:linear-gradient(180deg,#6fa99b,var(--plotline-accent-dark));box-shadow:inset 0 1px 0 rgba(255,255,255,.35)}.metric-point span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}.timeline-shell{overflow-x:auto;padding:16px;border:1px solid var(--plotline-line);border-radius:8px;background:linear-gradient(180deg,#fff 0,#f7faf8 100%)}.workspace-timeline{min-height:420px}.timeline-series-row{display:grid;grid-template-columns:var(--timeline-label-width) max-content;gap:var(--timeline-grid-gap);align-items:stretch;width:max-content;min-width:100%}.timeline-project-title{position:sticky;left:0;z-index:20;display:grid;align-content:start;gap:4px;width:var(--timeline-label-width);min-height:100%;border-radius:8px;padding:12px;color:#fff;background:var(--plotline-accent-dark);font-weight:700;box-shadow:8px 0 18px rgba(30,37,43,.08)}.timeline-book-title span,.timeline-project-title span{color:rgba(255,255,255,.78);font-size:.72rem;letter-spacing:.08em;text-transform:uppercase}.timeline-book-title strong,.timeline-project-title strong{line-height:1.15}.timeline-books{display:flex;gap:var(--timeline-grid-gap);align-items:stretch}.timeline-book{flex:0 0 auto;width:calc((var(--book-scene-count) * var(--timeline-scene-width)) + ((var(--book-scene-count) - 1) * var(--timeline-grid-gap)));min-width:var(--timeline-scene-width)}.timeline-book-title{display:grid;gap:2px;margin-bottom:var(--timeline-grid-gap);border-radius:8px;padding:10px 12px;color:#fff;background:var(--plotline-accent-dark);font-weight:700}.timeline-chapters{display:flex;gap:var(--timeline-grid-gap);align-items:flex-start}.timeline-chapter{flex:0 0 auto;width:calc((var(--chapter-scene-count) * var(--timeline-scene-width)) + ((var(--chapter-scene-count) - 1) * var(--timeline-grid-gap)));min-width:var(--timeline-scene-width);box-sizing:border-box;border-radius:8px;background:rgba(238,245,242,.7);outline:1px solid #d4ded8;outline-offset:0;overflow:visible}.timeline-chapter-title{display:grid;gap:2px;border-bottom:1px solid #d4ded8;padding:10px 12px;color:var(--plotline-accent-dark);font-weight:700}.timeline-chapter-title span{color:var(--plotline-muted);font-size:.76rem;text-transform:uppercase}.timeline-scenes{display:grid;grid-template-columns:repeat(var(--chapter-scene-count),minmax(0,1fr));gap:var(--timeline-grid-gap);width:100%;box-sizing:border-box;min-height:190px;padding:0}.timeline-empty-scene,.timeline-scene-card{display:flex;flex-direction:column;gap:6px;width:100%;min-width:0;box-sizing:border-box;border:1px solid var(--plotline-line);border-radius:8px;padding:12px;background:#fff;color:var(--plotline-ink);text-decoration:none;box-shadow:0 8px 18px rgba(30,37,43,.05)}.timeline-scene-card:hover{border-color:var(--plotline-accent);color:var(--plotline-ink)}.metric-point-placeholder,.timeline-placeholder-cell,.timeline-placeholder-scene{cursor:default;opacity:.72}.timeline-placeholder-scene{align-items:center;justify-content:center;border-style:dashed;color:var(--plotline-muted);background:rgba(255,255,255,.38);font-size:.86rem;font-weight:800;text-align:center}.timeline-placeholder-cell{border-style:dashed;background:repeating-linear-gradient(-45deg,rgba(216,221,216,.18) 0,rgba(216,221,216,.18) 7px,rgba(255,255,255,.18) 7px,rgba(255,255,255,.18) 14px)}.story-calendar-heading{gap:1rem}.story-calendar-stats{display:flex;flex-wrap:wrap;gap:.5rem;justify-content:flex-end}.story-calendar-stats span{display:inline-flex;gap:.35rem;align-items:baseline;border:1px solid var(--plotline-line);border-radius:999px;padding:.35rem .7rem;background:var(--plotline-panel);color:var(--plotline-muted);font-size:.88rem}.story-calendar-stats strong{color:var(--plotline-ink)}.story-calendar-filter .form-label{font-size:.82rem;font-weight:800;color:var(--plotline-muted)}.story-calendar-shell{display:grid;gap:.85rem}.story-calendar-detail,.story-calendar-layout,.story-calendar-month,.story-calendar-toolbar{border:1px solid var(--plotline-line);border-radius:8px;background:var(--plotline-panel)}.story-calendar-toolbar{display:flex;gap:.75rem;align-items:center;justify-content:space-between;padding:.75rem}.story-calendar-story-months{display:flex;flex-wrap:wrap;gap:.75rem;font-size:.9rem;font-weight:700}.story-calendar-layout{display:grid;grid-template-columns:minmax(0,1fr) minmax(280px,360px);gap:0;overflow:hidden}.story-calendar-grid-wrap{min-width:0;overflow-x:auto}.story-calendar-month{min-width:860px;border:0;border-radius:0}.story-calendar-month-title{padding:.85rem 1rem;border-bottom:1px solid var(--plotline-line);color:var(--plotline-ink);font-size:1.15rem;font-weight:850}.story-calendar-grid,.story-calendar-weekdays{display:grid;grid-template-columns:repeat(7,minmax(0,1fr))}.story-calendar-weekdays{border-bottom:1px solid var(--plotline-line);background:var(--plotline-soft)}.story-calendar-weekdays div{padding:.55rem .65rem;border-right:1px solid var(--plotline-line);color:var(--plotline-muted);font-size:.76rem;font-weight:850;text-transform:uppercase}.story-calendar-weekdays div:last-child{border-right:0}.story-calendar-day{display:grid;grid-template-rows:auto 1fr;gap:.35rem;min-height:132px;border-right:1px solid var(--plotline-line);border-bottom:1px solid var(--plotline-line);padding:.55rem;background:var(--plotline-panel);color:var(--plotline-ink);text-decoration:none}.story-calendar-day:nth-child(7n){border-right:0}.story-calendar-day:focus,.story-calendar-day:hover{background:color-mix(in srgb,var(--plotline-soft) 72%,var(--plotline-panel));color:var(--plotline-ink)}.story-calendar-day.is-overflow{background:color-mix(in srgb,var(--plotline-paper) 82%,var(--plotline-line));color:var(--plotline-muted)}.story-calendar-day.is-selected{outline:3px solid color-mix(in srgb,var(--plotline-accent) 34%,transparent);outline-offset:-3px;background:color-mix(in srgb,var(--plotline-soft) 86%,var(--plotline-panel))}.story-calendar-day-number{font-size:.95rem;font-weight:850}.story-calendar-day-scenes{display:grid;align-content:start;gap:.3rem;min-width:0}.story-calendar-scene-chip{display:grid;gap:.08rem;border:1px solid color-mix(in srgb,var(--plotline-accent) 28%,var(--plotline-line));border-radius:6px;padding:.3rem .4rem;background:color-mix(in srgb,var(--plotline-panel) 88%,var(--plotline-soft));color:var(--plotline-muted);font-size:.72rem;line-height:1.18}.story-calendar-scene-chip strong{overflow:hidden;color:var(--plotline-ink);font-size:.78rem;font-weight:800;text-overflow:ellipsis;white-space:nowrap}.story-calendar-book,.story-calendar-more{color:var(--plotline-accent-dark);font-weight:850}.story-calendar-more{font-size:.76rem}.story-calendar-detail{display:grid;align-content:start;gap:.8rem;height:100%;max-height:none;min-height:0;overflow:auto;border-top:0;border-right:0;border-bottom:0;border-radius:0;padding:1rem}.story-calendar-detail h2{margin:0;color:var(--plotline-ink);font-size:1.1rem}.story-calendar-detail-notice{margin:0;border:1px solid var(--plotline-line);border-radius:6px;padding:.45rem .6rem;background:var(--plotline-soft);color:var(--plotline-muted);font-size:.86rem;font-weight:700}.story-calendar-detail-notice.is-error{border-color:color-mix(in srgb,var(--bs-danger) 34%,var(--plotline-line));background:color-mix(in srgb,var(--bs-danger) 8%,var(--plotline-panel));color:var(--bs-danger)}.story-calendar-detail-list{display:grid;gap:.75rem}.story-calendar-detail-scene{display:grid;gap:.55rem;border:1px solid var(--plotline-line);border-radius:8px;padding:.75rem;background:color-mix(in srgb,var(--plotline-panel) 94%,var(--plotline-paper))}.story-calendar-detail-scene h3{margin:0;color:var(--plotline-ink);font-size:1rem}.story-calendar-detail-scene dl,.story-calendar-detail-scene p{margin:0}.story-calendar-detail-scene dl{display:grid;grid-template-columns:auto 1fr;gap:.15rem .45rem;font-size:.86rem}.story-calendar-detail-meta,.story-calendar-detail-scene dt{color:var(--plotline-muted);font-weight:800}.story-calendar-detail-meta{display:flex;flex-wrap:wrap;gap:.45rem;font-size:.76rem}.story-calendar-unplaced{margin-top:1rem}.story-calendar-unplaced-list{display:grid;gap:.55rem}.story-calendar-unplaced-list article{display:flex;gap:.75rem;align-items:center;justify-content:space-between;border:1px solid var(--plotline-line);border-radius:8px;padding:.65rem .75rem;background:var(--plotline-panel)}.story-calendar-unplaced-list article div{display:grid;gap:.15rem}.story-calendar-unplaced-list small,.story-calendar-unplaced-list span{color:var(--plotline-muted)}@media (max-width:960px){.story-calendar-layout,.story-calendar-toolbar{display:grid}.story-calendar-layout{grid-template-columns:1fr}.story-calendar-detail{max-height:none;border-top:1px solid var(--plotline-line);border-left:0}.story-calendar-stats{justify-content:flex-start}}.metric-point-placeholder::before{height:4px;background:rgba(102,113,123,.2);box-shadow:none}.timeline-scene-card.selected{border-color:var(--plotline-accent-dark);box-shadow:0 0 0 3px rgba(47,111,99,.16),0 10px 22px rgba(30,37,43,.08)}.purpose-chip-row,.scene-badge-row{display:flex;flex-wrap:wrap;gap:5px;align-items:center}.warning-placeholder{display:inline-flex;width:fit-content;border:1px dashed #d6b25e;border-radius:999px;padding:2px 8px;color:#755715;background:#fff8e8;font-size:.74rem;font-weight:700}.warning-placeholder.active{border-color:rgba(159,69,69,.36);color:#8a3434;background:rgba(255,232,232,.9);gap:5px;font-weight:800}.dependency-placeholder{display:inline-flex;width:fit-content;border:1px solid rgba(47,111,99,.2);border-radius:999px;padding:2px 8px;color:var(--plotline-accent-dark);background:rgba(47,111,99,.08);font-size:.74rem;font-weight:700}.purpose-chip{display:inline-flex;width:fit-content;border-radius:999px;padding:2px 7px;color:#38453e;background:#edf0eb;font-size:.72rem;font-weight:700}.future-lane-placeholder{border-top:1px dashed #cbd8d2;padding:8px 12px;color:var(--plotline-muted);font-size:.78rem;background:rgba(255,255,255,.45)}.metric-timeline-board{display:grid;gap:8px;width:max-content;min-width:100%;margin-top:14px;border-top:1px solid var(--plotline-line);padding-top:14px}.metric-shape-controls{position:sticky;left:0;z-index:6;display:grid;gap:8px;width:calc(var(--timeline-label-width) + (var(--scene-count) * var(--timeline-scene-width)) + (var(--scene-count) * var(--timeline-grid-gap)));min-width:100%;border-radius:8px;padding:10px;background:rgba(255,255,255,.88)}.metric-timeline-row{display:grid;grid-template-columns:var(--timeline-label-width) var(--metric-layout-width,calc((var(--scene-count) * var(--timeline-scene-width)) + ((var(--scene-count) - 1) * var(--timeline-grid-gap))));gap:var(--timeline-grid-gap);align-items:stretch}.metric-lane-label{position:sticky;left:0;z-index:12;display:grid;align-content:start;gap:4px;min-height:320px;border:1px solid rgba(47,111,99,.18);border-radius:8px;padding:10px;color:var(--plotline-accent-dark);background:#fff;box-shadow:0 6px 14px rgba(30,37,43,.04)}.metric-lane-label span{color:var(--plotline-muted);font-size:.78rem;font-weight:600}.colour-swatch{display:inline-block;width:18px;height:18px;border:1px solid rgba(30,37,43,.18);border-radius:999px;vertical-align:middle}.plot-lane-board{position:relative;display:grid;gap:8px;width:max-content;min-width:100%;margin-top:14px;border-top:1px solid var(--plotline-line);padding-top:14px}.plot-lane-svg-overlay{position:absolute;inset:0 auto auto 0;z-index:4;pointer-events:none;overflow:visible}.plot-lane-svg-health-overlay{z-index:8}.plot-line-svg-path{fill:none;stroke-width:3.5;stroke-linecap:round;opacity:.72}.plot-line-svg-segment-dormant{stroke-dasharray:9 8;opacity:.48}.plot-line-svg-connector{fill:none;stroke-width:3;stroke-linecap:round;opacity:.58}.plot-line-svg-path.plotline-state-questionable,.plot-line-svg-path.plotline-state-resolved{stroke:#8c9491;opacity:.42}.plot-line-svg-path.plotline-state-abandoned{stroke:#9b2f36;opacity:.5}.plot-event-svg-node.plotline-state-questionable,.plot-event-svg-node.plotline-state-resolved{opacity:.88}.plot-event-svg-node.plotline-state-abandoned{opacity:.9}.plot-event-svg-node.plotline-state-abandoned line{stroke:#ffffff}.plotline-health-marker circle,.plotline-health-marker path{fill:#f4c430;stroke:#8a6712;stroke-width:1.5}.plotline-health-marker{pointer-events:visiblePainted}.plotline-health-marker line,.plotline-health-marker text{stroke:#5e4710;fill:#5e4710;stroke-width:1.6;stroke-linecap:round}.plotline-health-marker text{font-size:11px;font-weight:800;stroke-width:0;pointer-events:none}.plotline-health-count{fill:#ffffff;stroke:#8a6712;stroke-width:2;paint-order:stroke}.plotline-health-marker-dangling circle,.plotline-health-marker-dangling path{fill:#f8df8f}.plotline-health-marker-abandoned circle,.plotline-health-marker-abandoned path{fill:#d85c63;stroke:#8b1e2d}.plotline-health-marker-abandoned line{stroke:#ffffff}.plot-event-svg-node circle,.plot-event-svg-node ellipse,.plot-event-svg-node path{stroke:#ffffff;stroke-width:2}.plot-event-svg-node line,.plot-event-svg-node path[fill=none]{stroke:#8b1e2d;stroke-width:3.4;stroke-linecap:round;stroke-linejoin:round}.plot-event-svg-node-reveal ellipse{stroke-width:2.4}.plot-event-svg-label{font-size:9.5px;font-weight:900;font-family:system-ui,-apple-system,"Segoe UI",sans-serif;paint-order:stroke;stroke:rgba(30,37,43,0.22);stroke-width:.8px;pointer-events:none}.plot-event-svg-node-resolve path[fill=none]{stroke:#ffffff}.lane-board-heading,.metric-lane-board-heading,.plot-lane-board-heading{position:sticky;left:0;z-index:6;display:flex;align-items:center;justify-content:space-between;gap:14px;width:calc(var(--timeline-label-width) + (var(--scene-count) * var(--timeline-scene-width)) + (var(--scene-count) * var(--timeline-grid-gap)));min-width:100%;margin-bottom:2px;border-radius:8px;padding:8px 10px;color:var(--plotline-accent-dark);background:rgba(255,255,255,.92);font-weight:700;box-shadow:0 8px 16px rgba(30,37,43,.05)}.lane-board-heading small,.metric-lane-board-heading small,.plot-lane-board-heading small{color:var(--plotline-muted);font-weight:500;white-space:nowrap}.timeline-heading-with-help{display:inline-flex;align-items:center;gap:6px;min-width:0}.plot-lane-row{display:grid;grid-template-columns:var(--timeline-label-width) repeat(var(--scene-count),var(--timeline-scene-width));gap:var(--timeline-grid-gap);align-items:stretch}.plot-lane-label{position:sticky;left:0;z-index:12;display:flex;align-items:center;gap:8px;min-height:46px;border:1px solid color-mix(in srgb,var(--plot-colour),#fff 55%);border-left:5px solid var(--plot-colour);border-radius:8px;padding:8px 10px;background:#fff;color:var(--plotline-ink);text-decoration:none;box-shadow:0 6px 14px rgba(30,37,43,.04)}.plot-lane-label:hover{color:var(--plotline-ink);border-color:var(--plot-colour)}.plot-lane-slots{display:contents}.plot-lane-slot{display:flex;flex-wrap:wrap;align-content:center;align-items:center;justify-content:center;gap:5px;min-height:46px;border:1px dashed #d8ddd8;border-radius:8px;padding:7px;background:rgba(255,255,255,.62)}.thread-marker{position:relative;z-index:5;display:inline-flex;align-items:center;justify-content:center;gap:4px;min-width:34px;height:30px;border:2px solid color-mix(in srgb,var(--plot-colour),#000 20%);border-radius:999px;padding:0 8px;color:var(--plotline-ink);background:color-mix(in srgb,var(--plot-colour),#fff 66%);font-size:.74rem;font-weight:900;text-decoration:none;box-shadow:0 3px 8px rgba(30,37,43,.14)}.plot-lane-board [data-plot-event-node]{opacity:1}.thread-marker:focus-visible,.thread-marker:hover{color:var(--plotline-ink);background:color-mix(in srgb,var(--plot-colour),#fff 48%);outline:3px solid rgba(47,111,99,.22);outline-offset:2px}.thread-marker.resolved{border-color:#5a8c60;background:#e6f4e7;color:#24512b}.thread-marker.contradicted{border-color:#b45c5c;background:#fff0f0;color:#7a2222}.thread-events-section{margin-top:16px}.thread-event-list{display:grid;gap:8px;margin-bottom:12px}.thread-event-item{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;border:1px solid color-mix(in srgb,var(--plot-colour),#fff 55%);border-left:4px solid var(--plot-colour);border-radius:8px;padding:8px;background:#fff}.thread-event-item>div{display:grid;gap:3px}.thread-event-marker{display:inline-flex;align-items:center;justify-content:center;width:fit-content;min-width:24px;height:22px;border-radius:999px;padding:0 7px;background:color-mix(in srgb,var(--plot-colour),#fff 72%);font-size:.72rem;font-weight:800}.thread-event-create{border-top:1px solid var(--plotline-line);padding-top:12px}.asset-lane-board{display:grid;gap:8px;width:max-content;min-width:100%;margin-top:14px;border-top:1px solid var(--plotline-line);padding-top:14px}.asset-lane-row{display:grid;grid-template-columns:var(--timeline-label-width) repeat(var(--scene-count),var(--timeline-scene-width));gap:var(--timeline-grid-gap);align-items:stretch}.asset-lane-label{position:sticky;left:0;z-index:12;display:grid;gap:2px;min-height:46px;border:1px solid #d4d7df;border-left:5px solid #6b5b95;border-radius:8px;padding:8px 10px;background:#fff;color:var(--plotline-ink);text-decoration:none;box-shadow:0 6px 14px rgba(30,37,43,.04)}.asset-lane-label span{color:var(--plotline-muted);font-size:.75rem}.asset-lane-slots{display:contents}.asset-lane-slot{display:flex;flex-wrap:wrap;align-content:flex-start;gap:5px;min-height:46px;border:1px dashed #d8ddd8;border-radius:8px;padding:7px;background:rgba(250,249,255,.72)}.asset-event-marker,.asset-marker{display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:24px;border:1px solid #7f70aa;border-radius:7px;padding:0 7px;color:#33284e;background:#eee9fb;font-size:.72rem;font-weight:800;text-decoration:none}.asset-marker:hover{color:#33284e;background:#dfd6f7}.asset-marker.timeline-marker-story-turn,.character-marker.timeline-marker-story-turn{border-width:2px}.asset-marker.timeline-marker-important,.character-marker.timeline-marker-important{box-shadow:inset 0 -3px 0 rgba(197,139,43,.36)}.asset-marker.timeline-marker-state-change,.character-marker.timeline-marker-state-change{border-style:double}.asset-marker.timeline-marker-transfer{box-shadow:inset 3px 0 0 rgba(47,111,99,.32)}.character-marker.timeline-marker-exit{opacity:.86;border-style:dashed}.asset-marker.timeline-marker-has-warning,.character-marker.timeline-marker-has-warning{box-shadow:0 0 0 2px rgba(179,95,59,.22)}.asset-events-section{margin-top:16px}.asset-event-list,.asset-mini-list{display:grid;gap:8px;margin-bottom:12px}.asset-event-item,.asset-mini-item{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;border:1px solid #ded9ea;border-left:4px solid #6b5b95;border-radius:8px;padding:8px;background:#fff}.asset-event-item>div,.asset-mini-item>div{display:grid;gap:3px}.asset-create-form{border-top:1px solid var(--plotline-line);padding-top:12px}.asset-card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}.asset-card{display:grid;gap:12px;border:1px solid var(--plotline-line);border-radius:8px;padding:14px;background:#fff;box-shadow:0 8px 18px rgba(30,37,43,.04)}.asset-card h2{margin:0;font-size:1.1rem}.asset-card-footer{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.asset-detail-grid{display:grid;grid-template-columns:minmax(260px,0.8fr) minmax(320px,1.2fr);gap:14px}.character-lane-board{display:grid;gap:8px;width:max-content;min-width:100%;margin-top:14px;border-top:1px solid var(--plotline-line);padding-top:14px}.character-lane-row{display:grid;grid-template-columns:var(--timeline-label-width) repeat(var(--scene-count),var(--timeline-scene-width));gap:var(--timeline-grid-gap);align-items:stretch}.character-lane-label{position:sticky;left:0;z-index:12;display:grid;gap:2px;min-height:46px;border:1px solid #d7d4ce;border-left:5px solid #8a6f3d;border-radius:8px;padding:8px 10px;background:#fff;color:var(--plotline-ink);text-decoration:none;box-shadow:0 6px 14px rgba(30,37,43,.04)}.character-lane-label span{color:var(--plotline-muted);font-size:.75rem}.character-lane-slots{display:contents}.character-lane-slot{display:flex;flex-wrap:wrap;align-content:flex-start;gap:5px;min-height:46px;border:1px dashed #d8ddd8;border-radius:8px;padding:7px;background:rgba(255,252,246,.72)}.character-marker{display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:24px;border:1px solid #9a7a3f;border-radius:999px;padding:0 7px;color:#4f3810;background:#fff2d7;font-size:.72rem;font-weight:800;text-decoration:none}.character-card{border-left:4px solid #8a6f3d}.character-section{margin-top:16px}.character-item{border-left-color:#8a6f3d}.character-appearance-card{display:grid;gap:8px;border:1px solid #d7d4ce;border-left:4px solid #8a6f3d;border-radius:8px;padding:10px;background:#fff}.character-appearance-summary{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.character-appearance-summary>div:first-child{display:grid;gap:3px}.character-appearance-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:6px}.character-appearance-edit .asset-create-form{margin-top:8px;border-top:1px solid var(--plotline-line)}.word-companion-suggestion-panel{display:grid;gap:8px;margin-bottom:12px;border:1px solid rgba(138,111,61,.24);border-radius:8px;padding:10px;background:rgba(255,248,232,.72)}.word-companion-suggestion-list{display:grid;gap:8px}.word-companion-suggestion-item{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;border:1px solid #ded9ea;border-left:4px solid #8a6f3d;border-radius:8px;padding:8px;background:#fff}.word-companion-suggestion-item>div:first-child{display:grid;gap:3px}.word-companion-suggestion-pill{margin-left:6px}.form-helper-message{margin:0 0 8px;font-size:.86rem;font-weight:700}.scene-number,.time-label{color:var(--plotline-muted);font-size:.82rem}.location-badge,.location-pill{display:inline-flex;align-items:center;width:fit-content;border:1px solid rgba(47,111,99,.18);border-radius:999px;padding:2px 7px;color:var(--plotline-accent-dark);background:rgba(47,111,99,.08);font-size:.74rem;font-weight:700}.scene-summary{display:-webkit-box;overflow:hidden;color:var(--plotline-muted);font-size:.88rem;-webkit-box-orient:vertical;-webkit-line-clamp:4}.timeline-empty-scene{justify-content:center;color:var(--plotline-muted);background:rgba(255,255,255,.58)}.form-check-input:focus,.form-control:focus,.form-select:focus{border-color:var(--plotline-accent);box-shadow:0 0 0 .2rem rgba(47,111,99,.16)}.scene-inspector-panel{position:sticky;top:76px;display:flex;flex-direction:column;max-height:calc(100vh - 96px);min-width:0;overflow:hidden;border:1px solid var(--plotline-line);border-radius:8px;background:#fff;box-shadow:0 14px 32px rgba(30,37,43,.08)}.inspector-header{position:sticky;top:0;z-index:5;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;border-bottom:1px solid var(--plotline-line);padding:16px;background:#fff}.scene-inspector-body{flex:1 1 auto;min-height:0;overflow:auto;padding:16px}.inspector-header h2{margin:0;font-size:1.25rem}.location-helper{border:1px solid rgba(138,111,61,.22);border-radius:8px;padding:10px;background:rgba(255,248,232,.74)}.location-warning-list{margin:0;padding-left:18px;color:#6f5526;font-size:.86rem}.location-tree{display:grid;gap:8px}.location-tree-row{display:flex;align-items:center;justify-content:space-between;gap:12px;border-bottom:1px solid var(--plotline-line);padding:10px 0 10px calc(var(--location-depth,0) * 22px)}.location-tree-row:last-child{border-bottom:0}.location-tree-row>div:first-child{display:grid;gap:3px}.compact-buttons{flex-wrap:nowrap}.location-chip-list{display:flex;flex-wrap:wrap;gap:8px}.location-chip{border:1px solid var(--plotline-line);border-radius:8px;padding:7px 10px;background:#fff;text-decoration:none}.location-relationship-list{display:grid;gap:8px}.location-relationship-card{display:flex;justify-content:space-between;gap:12px;border:1px solid var(--plotline-line);border-radius:8px;padding:10px;background:#fff}.location-flags{display:flex;flex-wrap:wrap;gap:10px 16px;color:var(--plotline-muted);font-size:.86rem}.validation-summary,.warning-filter-panel{border:1px solid var(--plotline-line);border-radius:8px;margin-bottom:16px;padding:12px;background:#fff}.validation-summary{display:flex;flex-wrap:wrap;gap:12px;color:var(--plotline-muted)}.warning-dashboard-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin-bottom:18px}.inspector-section-heading,.warning-card-title,.warning-count-row{display:flex;align-items:center;justify-content:space-between;gap:10px}.warning-list,.warning-mini-list{display:grid;gap:10px}.warning-card,.warning-mini-card{border:1px solid var(--plotline-line);border-radius:8px;padding:12px;background:#fff}.warning-card{display:grid;grid-template-columns:1fr auto;gap:12px}.warning-card p,.warning-mini-card p{margin:6px 0}.warning-actions{display:flex;align-items:flex-start;flex-wrap:wrap;gap:6px}.severity-pill{display:inline-flex;align-items:center;border-radius:999px;padding:2px 8px;font-size:.74rem;font-weight:800}.severity-pill.info{color:#365f7c;background:rgba(107,153,184,.14)}.severity-pill.warning{color:#7a5527;background:rgba(205,154,72,.17)}.severity-pill.error{color:#8a3434;background:rgba(190,83,83,.15)}.warning-mini-card{background:rgba(255,255,255,.76)}.dependency-columns{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.dependency-card{display:grid;gap:3px;border:1px solid var(--plotline-line);border-radius:8px;margin-bottom:8px;padding:9px;background:rgba(255,255,255,.78)}.move-preview-panel{max-width:900px}.focused-validation-summary{display:flex;flex-wrap:wrap;gap:10px;border:1px solid rgba(47,111,99,.16);border-radius:8px;margin-top:12px;padding:10px;color:var(--plotline-muted);background:rgba(47,111,99,.05)}.inspector-purpose-list{grid-template-columns:1fr;max-height:210px}.metric-slider-stack{display:grid;gap:12px}.metric-slider{display:grid;gap:4px}.metric-slider-label{display:flex;justify-content:space-between;gap:10px;color:var(--plotline-muted);font-size:.86rem;font-weight:700}.metric-slider-label output{color:var(--plotline-accent-dark)}.metric-slider .form-range{accent-color:var(--plotline-accent)}.asset-importance-slider{border:1px solid var(--plotline-line);border-radius:8px;padding:10px 12px;background:rgba(47,111,99,.05)}.story-asset-checkbox-field{margin-top:1.95rem}.story-asset-event-item{justify-content:flex-start;gap:8px}.story-asset-event-item .asset-event-marker{flex:0 0 auto;min-width:1.55rem;width:auto}.story-asset-event-details{min-width:0}.breadcrumb-trail,.context-nav,.overview-chip-grid{display:flex;flex-wrap:wrap;gap:7px}.breadcrumb-trail a,.breadcrumb-trail span,.context-nav a,.overview-chip{display:inline-flex;align-items:center;border:1px solid var(--plotline-line);border-radius:999px;padding:4px 9px;color:var(--plotline-muted);font-size:.78rem;font-weight:800;text-decoration:none;background:rgba(255,255,255,.72)}.overview-chip.attention{color:#7a5527;border-color:rgba(205,154,72,.35);background:rgba(205,154,72,.14)}.overview-outcome{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;margin:0;color:var(--plotline-muted)}.breadcrumb-trail{margin-bottom:12px}.breadcrumb-trail a:hover,.context-nav a:hover{color:var(--plotline-accent-dark);border-color:rgba(47,111,99,.35);background:rgba(47,111,99,.08)}.context-header,.working-context-banner{display:flex;align-items:center;justify-content:space-between;gap:14px;border:1px solid var(--plotline-line);border-radius:10px;margin-bottom:16px;padding:10px 12px;background:rgba(255,255,255,.84);box-shadow:0 10px 24px rgba(55,48,39,.05)}.context-title{display:grid;gap:2px}.context-title strong{color:var(--plotline-ink)}.analytics-grid-three,.analytics-grid-two,.health-kpi-grid{display:grid;gap:14px;margin:18px 0}.health-kpi-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.health-kpi-grid .plain-card{display:grid;gap:4px}.health-kpi-grid strong{color:var(--plotline-ink);font-size:2rem;line-height:1}.analytics-grid-two{grid-template-columns:repeat(2,minmax(0,1fr))}.analytics-grid-three{grid-template-columns:repeat(3,minmax(0,1fr))}.analytics-section{border:1px solid var(--plotline-line);border-radius:10px;margin:18px 0;padding:16px;background:rgba(255,255,255,.84);box-shadow:0 14px 34px rgba(55,48,39,.07)}.analytics-section-heading{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:14px}.analytics-section-heading h2,.plain-card h3{margin:0}.analytics-metric-stack{display:grid;gap:12px;overflow-x:auto;padding-bottom:4px}.metric-shape-chart{display:grid;gap:12px}.metric-shape-intro{max-width:760px;margin:0;color:var(--plotline-muted)}.metric-toggle-row{display:flex;flex-wrap:wrap;gap:8px}.metric-toggle-pill{display:inline-flex;align-items:center;gap:6px;border:1px solid rgba(82,75,65,.16);border-radius:999px;padding:5px 9px;color:var(--plotline-muted);font-size:.78rem;font-weight:800;background:rgba(255,255,255,.78);cursor:pointer}.metric-toggle-pill::before{content:"";width:10px;height:10px;border-radius:999px;background:var(--metric-colour)}.metric-toggle-pill input{margin:0;accent-color:var(--metric-colour)}.timeline-metric-edit-toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:end}.timeline-metric-edit-select{display:grid;gap:3px;min-width:180px;color:var(--plotline-muted);font-size:.78rem;font-weight:800}.timeline-metric-edit-status{align-self:center;border:1px solid rgba(47,111,99,.18);border-radius:999px;padding:5px 9px;color:var(--plotline-muted);font-size:.78rem;font-weight:800;background:rgba(255,255,255,.72)}.timeline-metric-edit-hint{font-size:.82rem}.metric-chart-frame canvas.metric-curve-editing{cursor:ns-resize}.metric-chart-frame{position:relative;min-height:320px;border:1px solid var(--plotline-line);border-radius:10px;padding:14px 12px 32px;background:linear-gradient(180deg,rgba(255,255,255,.92),rgba(247,245,240,.76))}.metric-timeline-frame{width:calc((var(--scene-count) * var(--timeline-scene-width)) + ((var(--scene-count) - 1) * var(--timeline-grid-gap)))}.metric-timeline-measured{padding-left:0;padding-right:0}.metric-timeline-viewport{position:sticky;left:0;height:300px;min-width:0}.metric-chart-frame canvas{width:100%;height:300px}.metric-timeline-board .metric-graph-stack{width:max-content;min-width:100%}.metric-timeline-board .metric-graph-row{grid-template-columns:var(--timeline-label-width) repeat(var(--scene-count),var(--timeline-scene-width));gap:var(--timeline-grid-gap);min-width:100%}.metric-timeline-board .metric-graph-points{display:contents}.metric-timeline-board .metric-point{border:1px solid rgba(47,111,99,.12);border-radius:8px;background:rgba(255,255,255,.62)}.metric-raw-details{border-top:1px solid var(--plotline-line);padding-top:8px}.metric-raw-details summary{color:var(--plotline-muted);font-size:.82rem;font-weight:800;cursor:pointer}.timeline-control-panel{display:grid;gap:12px;border:1px solid var(--plotline-line);border-radius:10px;margin-bottom:16px;padding:12px;background:rgba(255,255,255,.84);box-shadow:0 10px 24px rgba(55,48,39,.05)}.timeline-filter-drawer summary{color:var(--plotline-ink);font-weight:900;cursor:pointer}.timeline-filter-grid{display:grid;grid-template-columns:repeat(6,minmax(130px,1fr));gap:10px;margin-top:12px}.preset-chip-row,.timeline-filter-actions,.timeline-filter-checks,.timeline-preset-panel,.timeline-visibility-panel{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.timeline-filter-checks{grid-column:span 3;color:var(--plotline-muted);font-size:.82rem;font-weight:700}.timeline-filter-actions{grid-column:span 3;justify-content:flex-end}.preset-chip,.timeline-visibility-panel label{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--plotline-line);border-radius:999px;padding:4px 8px;color:var(--plotline-muted);font-size:.78rem;font-weight:800;background:rgba(255,255,255,.76)}.timeline-preset-panel form{display:inline-flex;align-items:center;gap:6px}.preset-chip a{color:var(--plotline-accent-dark);text-decoration:none}.preset-chip button{border:0;color:var(--plotline-muted);background:0 0;font-weight:900}.timeline-focus-banner{display:flex;align-items:center;justify-content:space-between;gap:12px;border:1px solid rgba(47,111,99,.22);border-radius:10px;margin-bottom:16px;padding:10px 12px;background:rgba(47,111,99,.08)}.thread-marker-icon{display:inline-flex;align-items:center;justify-content:center;min-width:16px;font-size:.78rem;font-weight:900}.thread-marker-type-abandon .thread-marker-icon,.thread-marker-type-resolve .thread-marker-icon,.thread-marker-type-start .thread-marker-icon,.thread-marker-type-twist .thread-marker-icon{font-size:.9rem}.thread-marker-type-start{border-radius:8px 999px 999px 8px}.thread-marker-type-twist{border-color:#b8762b;background:#fff4dc}.thread-marker-type-branch,.thread-marker-type-merge,.thread-marker-type-split{border-color:#6750a4;background:#f0ebff}.thread-marker-type-reveal .thread-marker-icon{border:1px solid currentColor;border-radius:999px;font-size:0}.thread-marker-type-reveal .thread-marker-icon::after{content:"";width:4px;height:4px;border-radius:999px;background:currentColor}.timeline-navigation-card{display:grid;grid-template-areas:"icon copy" "icon actions";grid-template-columns:auto minmax(0,620px);gap:8px 14px;align-items:center;justify-content:center;border:1px solid rgba(47,111,99,.42);border-left:5px solid var(--plotline-accent);border-radius:8px;margin:0 0 12px;padding:14px 16px;max-height:280px;overflow:hidden;color:var(--plotline-ink);background:linear-gradient(135deg,rgba(238,245,242,.98),rgba(255,255,255,.94));box-shadow:0 10px 26px rgba(30,37,43,.08);opacity:1;transform:translateY(0);transition:opacity 1.15s ease,max-height 1.2s ease,margin 1.2s ease,padding 1.2s ease,transform 1.15s ease}.timeline-navigation-card[hidden]{display:none}.timeline-navigation-card.is-dismissing{margin-bottom:0;padding-top:0;padding-bottom:0;max-height:0;opacity:0;transform:translateY(-6px)}.timeline-navigation-card-icon{grid-area:icon;display:grid;place-items:center;width:42px;height:42px;border-radius:50%;color:#fff;background:var(--plotline-accent);font-size:1.25rem;font-weight:900}.timeline-navigation-card-copy{grid-area:copy;text-align:center}.timeline-navigation-card-copy h2{margin:0 0 6px;color:var(--plotline-accent-dark);font-size:1rem;font-weight:900}.timeline-navigation-card-copy p{margin:2px 0;color:var(--plotline-ink);font-size:.9rem}.timeline-navigation-card-actions{grid-area:actions;display:flex;flex-wrap:wrap;gap:8px;justify-content:center}.timeline-horizontal-overflow{transition:box-shadow .18s ease}.timeline-horizontal-overflow.has-scroll-left{box-shadow:inset 18px 0 18px -20px rgba(30,37,43,.55)}.timeline-horizontal-overflow.has-scroll-right{box-shadow:inset -18px 0 18px -20px rgba(30,37,43,.55)}.timeline-horizontal-overflow.has-scroll-left.has-scroll-right{box-shadow:inset 18px 0 18px -20px rgba(30,37,43,.55),inset -18px 0 18px -20px rgba(30,37,43,.55)}[data-theme=dark] .timeline-navigation-card{border-color:rgba(111,169,155,.52);border-left-color:#6fa99b;color:#f4eadc;background:linear-gradient(135deg,rgba(34,83,74,.72),rgba(32,31,34,.96));box-shadow:0 12px 28px rgba(0,0,0,.28)}[data-theme=dark] .timeline-navigation-card-copy h2,[data-theme=dark] .timeline-navigation-card-copy p{color:#f4eadc}[data-theme=dark] .timeline-horizontal-overflow.has-scroll-left{box-shadow:inset 18px 0 18px -20px rgba(244,234,220,.55)}[data-theme=dark] .timeline-horizontal-overflow.has-scroll-right{box-shadow:inset -18px 0 18px -20px rgba(244,234,220,.55)}[data-theme=dark] .timeline-horizontal-overflow.has-scroll-left.has-scroll-right{box-shadow:inset 18px 0 18px -20px rgba(244,234,220,.55),inset -18px 0 18px -20px rgba(244,234,220,.55)}@media (prefers-reduced-motion:reduce){.timeline-navigation-card{transition:opacity .12s ease}}.lane-dim,.timeline-scene-card.filter-dim,.timeline-scene-card.focus-dim{opacity:.35}.timeline-scene-card.filter-match.focus-match,.timeline-scene-card.focus-match{outline:3px solid rgba(47,111,99,.32);box-shadow:0 12px 26px rgba(47,111,99,.16)}.timeline-section-hidden{display:none!important}.hide-scene-cards .timeline-scene-card{display:none}.timeline-control-panel{position:sticky;top:56px;z-index:18}.timeline-control-select{padding-right:6px}.timeline-control-select .form-select{width:auto;min-width:132px;border:0;padding-top:2px;padding-bottom:2px;background-color:transparent;color:var(--plotline-accent-dark);font-weight:800}.timeline-jump-panel{display:grid;grid-template-columns:auto minmax(180px,1.2fr) minmax(180px,1fr) minmax(170px,0.9fr) minmax(180px,1fr) auto;gap:8px;align-items:center;width:100%}.timeline-shortcut-hint{color:var(--plotline-muted);font-size:.76rem;font-weight:700;white-space:nowrap}.timeline-minimap{display:flex;align-items:stretch;gap:4px;margin:0 0 12px;padding:8px;max-width:100%;min-width:0;overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;scrollbar-gutter:stable;border:1px solid rgba(47,111,99,.18);border-radius:8px;background:rgba(255,255,255,.72)}.timeline-minimap button{position:relative;flex:0 0 max(42px,calc(var(--chapter-scenes) * 18px));min-width:42px;min-height:34px;border:1px solid rgba(47,111,99,.18);border-radius:7px;color:var(--plotline-accent-dark);background:linear-gradient(180deg,#f8fbf9 0,#edf4f1 100%);font-size:.72rem;font-weight:800}.timeline-minimap button.is-active{border-color:var(--plotline-accent);color:#fff;background:linear-gradient(180deg,var(--plotline-accent) 0,var(--plotline-accent-dark) 100%);box-shadow:0 0 0 2px rgba(47,111,99,.14)}.timeline-minimap button::after{content:"";position:absolute;right:5px;bottom:5px;width:calc(var(--chapter-warnings) * 4px);max-width:28px;height:4px;border-radius:999px;background:#b45c5c;opacity:.75}.drag-drop-panel,.timeline-drag-palette{border:1px solid rgba(47,111,99,.18);border-radius:10px;margin-bottom:12px;padding:12px;background:rgba(255,255,255,.84);box-shadow:0 10px 24px rgba(55,48,39,.05)}.timeline-drag-palette{display:grid;grid-template-columns:minmax(220px,0.35fr) minmax(0,1fr);gap:12px;align-items:center}.drag-chip-group{display:flex;flex-wrap:wrap;gap:6px;max-height:104px;overflow:auto;padding-right:4px}.drag-chip{display:inline-flex;align-items:center;border:1px solid var(--plotline-line);border-radius:999px;padding:4px 9px;background:#fff;color:var(--plotline-ink);font-size:.78rem;font-weight:800;cursor:grab}.drag-chip.character{border-color:#dacb9e;background:#fff8e8}.drag-chip.asset{border-color:#ded9ea;background:#f4f0ff}.drag-chip.location{border-color:rgba(47,111,99,.18);background:#eef8f4}.is-dragging{opacity:.55}.drop-target-active{outline:3px solid rgba(47,111,99,.28);outline-offset:2px}.timeline-chapter.chapter-drop-active,.timeline-scenes.drop-chapter-end{background:rgba(47,111,99,.06)}.timeline-scenes.drop-chapter-end::after{content:"Drop scene at end of chapter";display:flex;align-items:center;justify-content:center;min-width:var(--timeline-scene-width);min-height:74px;border:2px dashed rgba(197,139,43,.48);border-radius:12px;color:#7a5527;background:rgba(255,248,232,.82);font-size:.8rem;font-weight:900}.timeline-scene-card.drop-before{box-shadow:inset 5px 0 0 #c58b2b,0 12px 26px rgba(197,139,43,.16)}.timeline-scene-card.drop-after{box-shadow:inset -5px 0 0 #c58b2b,0 12px 26px rgba(197,139,43,.16)}.drag-drop-panel{position:sticky;top:132px;z-index:19}.drag-drop-panel-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.drag-drop-panel h2{margin:0;font-size:1.08rem}.drag-drop-form{border-top:1px solid var(--plotline-line);margin-top:10px;padding-top:10px}.scene-move-modal-content{border:1px solid rgba(47,111,99,.18);border-radius:14px;background:var(--plotline-surface);color:var(--plotline-ink);box-shadow:0 24px 70px rgba(55,48,39,.22)}.scene-move-modal-content .modal-footer,.scene-move-modal-content .modal-header{border-color:var(--plotline-line)}.scene-move-modal-content .modal-title{margin:0;color:var(--plotline-ink);font-size:1.2rem;font-weight:900}.scene-move-summary{margin:0 0 12px;color:var(--plotline-ink);font-size:1rem;font-weight:800}[data-theme=dark] .scene-move-modal-content{background:#201f22;color:#f4eadc;border-color:rgba(244,234,220,.16);box-shadow:0 24px 70px rgba(0,0,0,.55)}[data-theme=dark] .scene-move-modal-content .modal-title,[data-theme=dark] .scene-move-summary{color:#f4eadc}[data-theme=dark] .scene-move-modal-content .modal-footer,[data-theme=dark] .scene-move-modal-content .modal-header{border-color:rgba(244,234,220,.14)}[data-theme=dark] .scene-move-modal-content .btn-close{filter:invert(1) grayscale(100%)}.plain-preview{border:1px solid rgba(197,139,43,.28);border-radius:8px;margin:10px 0 0;padding:8px 10px;color:#5e4518;background:#fff8e8;font-size:.86rem;font-weight:800}.drag-check-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 10px;color:var(--plotline-muted);font-size:.82rem;font-weight:700}.lane-board-heading,.pacing-heading,.timeline-section-header{position:sticky;left:0;z-index:6}.timeline-section-header{display:flex;align-items:center;justify-content:space-between;gap:10px;width:calc(var(--timeline-label-width) + (var(--scene-count) * var(--timeline-scene-width)) + (var(--scene-count) * var(--timeline-grid-gap)));min-width:100%;margin-bottom:10px;border-radius:8px;padding:8px 10px;background:rgba(255,255,255,.92);box-shadow:0 8px 16px rgba(30,37,43,.05)}.lane-board-heading button,.lane-group-heading,.pacing-heading button,.plot-lane-board-heading button,.timeline-section-header button{border:0;padding:0;color:var(--plotline-accent-dark);background:0 0;font:inherit;font-weight:900;text-align:left}.lane-board-heading button::before,.lane-group-heading::before,.pacing-heading button::before,.plot-lane-board-heading button::before,.timeline-section-header button::before{content:"v";display:inline-block;margin-right:6px;color:var(--plotline-muted);font-size:.72rem}.lane-board-heading button.is-collapsed::before,.lane-group-heading.is-collapsed::before,.pacing-heading button.is-collapsed::before,.plot-lane-board-heading button.is-collapsed::before,.timeline-section-header button.is-collapsed::before{content:">"}.lane-group{display:grid;gap:7px}.character-lane-group-body{display:grid;gap:7px}.lane-group-heading{position:sticky;left:0;z-index:6;width:var(--timeline-label-width);border-top:1px solid rgba(47,111,99,.12);padding:7px 8px 2px;color:var(--plotline-muted);background:rgba(247,250,248,.96);font-size:.78rem;text-transform:uppercase}.timeline-section-collapsed{display:none!important}.timeline-chapter-title{position:sticky;top:0;z-index:5;background:rgba(238,245,242,.96);backdrop-filter:blur(6px)}.metric-mini-summary,.scene-pov-label{display:inline-flex;width:fit-content;border-radius:999px;padding:2px 7px;font-size:.72rem;font-weight:800}.scene-pov-label{color:#514018;background:#fff3d3}.metric-mini-summary{color:var(--plotline-accent-dark);background:rgba(47,111,99,.08)}.scene-overview-panel{display:none;gap:8px;margin-top:4px}.scene-overview-section{display:grid;gap:4px}.scene-overview-label{color:var(--plotline-muted);font-size:.68rem;font-weight:900;letter-spacing:.06em;text-transform:uppercase}.scene-overview-chip-row{display:flex;flex-wrap:wrap;gap:5px;min-width:0}.scene-overview-brief,.scene-overview-chip,.scene-overview-empty{display:inline-flex;width:fit-content;max-width:100%;border-radius:999px;padding:3px 8px;background:rgba(47,111,99,.08);color:var(--plotline-ink);font-size:.72rem;font-weight:750;line-height:1.25;overflow-wrap:anywhere}.scene-overview-chip.is-pov{border:1px solid rgba(197,139,43,.38);background:#fff3d3}.scene-overview-chip.is-important{border:1px solid rgba(103,80,164,.3);background:#f0edf8}.scene-overview-chip.is-more,.scene-overview-empty{color:var(--plotline-muted);background:rgba(102,113,123,.08)}.scene-overview-brief{display:block;width:auto;border-radius:8px;background:rgba(255,255,255,.62);color:var(--plotline-muted);font-weight:600}.timeline-scene-card.keyboard-focus,.timeline-scene-card.search-hit{outline:3px solid rgba(197,139,43,.34);box-shadow:0 12px 26px rgba(197,139,43,.16)}.timeline-scene-card.search-dim{opacity:.28}.asset-marker,.character-marker,.thread-marker{transition:transform .12s ease,box-shadow .12s ease}.asset-marker:hover,.character-marker:hover,.thread-marker:hover{transform:translateY(-1px);box-shadow:0 6px 12px rgba(30,37,43,.12)}.timeline-filtered-root.density-compact{--timeline-scene-width:170px;--timeline-grid-gap:6px}.timeline-filtered-root.density-expanded{--timeline-scene-width:280px;--timeline-grid-gap:14px}.timeline-filtered-root.density-compact .timeline-scene-card,.timeline-filtered-root.zoom-book .timeline-scene-card{gap:4px;padding:9px}.timeline-filtered-root.density-compact .metric-mini-summary,.timeline-filtered-root.density-compact .purpose-chip-row,.timeline-filtered-root.density-compact .scene-summary,.timeline-filtered-root.zoom-book .location-pill,.timeline-filtered-root.zoom-book .metric-mini-summary,.timeline-filtered-root.zoom-book .purpose-chip-row,.timeline-filtered-root.zoom-book .scene-pov-label,.timeline-filtered-root.zoom-book .scene-summary{display:none}.timeline-filtered-root.zoom-book{--timeline-scene-width:150px;--timeline-grid-gap:6px}.timeline-filtered-root.zoom-scene-detail{--timeline-scene-width:300px}.timeline-filtered-root.zoom-scene-detail .scene-summary{-webkit-line-clamp:7}.timeline-filtered-root.zoom-scene-overview{--timeline-scene-width:380px}.timeline-filtered-root.zoom-scene-overview .timeline-scenes{min-height:320px}.timeline-filtered-root.zoom-scene-overview .timeline-scene-card{gap:8px;padding:14px}.timeline-filtered-root.zoom-scene-overview .scene-summary{display:none}.timeline-filtered-root.zoom-scene-overview .scene-overview-panel{display:grid}.timeline-filtered-root.density-expanded .timeline-scenes{min-height:230px}.timeline-control-panel{position:relative;top:auto;z-index:4;display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:10px;padding:8px;box-shadow:none}.timeline-control-group,.timeline-filter-drawer{border:1px solid var(--plotline-line);border-radius:999px;background:rgba(255,255,255,.82)}.timeline-control-group[open],.timeline-filter-drawer[open]{border-radius:10px;flex-basis:100%}.timeline-control-group summary,.timeline-filter-drawer summary{min-width:max-content;padding:5px 10px;color:var(--plotline-accent-dark);font-size:.82rem;font-weight:900;cursor:pointer;list-style:none}.timeline-control-group summary::-webkit-details-marker,.timeline-drag-palette summary::-webkit-details-marker,.timeline-filter-drawer summary::-webkit-details-marker{display:none}.timeline-control-group summary::after,.timeline-drag-palette summary::after,.timeline-filter-drawer summary::after{content:" v";color:var(--plotline-muted);font-size:.72rem}.timeline-control-group[open] summary::after,.timeline-drag-palette[open] summary::after,.timeline-filter-drawer[open] summary::after{content:" ^"}.timeline-filter-grid{grid-template-columns:repeat(auto-fit,minmax(145px,1fr));gap:8px;max-height:min(48vh,430px);overflow:auto;padding:0 10px 10px}.timeline-filter-grid .form-label{margin-bottom:2px;font-size:.72rem;font-weight:800}.timeline-filter-actions,.timeline-filter-checks{grid-column:1/-1}.timeline-jump-panel,.timeline-preset-panel,.timeline-visibility-panel{padding:0 10px 10px}.timeline-jump-panel{grid-template-columns:minmax(180px,1.5fr) repeat(3,minmax(150px,1fr))}.timeline-shortcut-hint{grid-column:1/-1}.timeline-preset-panel form{flex-wrap:nowrap}.timeline-preset-panel .form-control{width:150px}.timeline-filter-actions .btn,.timeline-preset-panel .btn{white-space:nowrap}.timeline-drag-palette{display:block;margin-bottom:8px;padding:7px 9px;box-shadow:none}.timeline-drag-palette summary{color:var(--plotline-accent-dark);font-size:.82rem;font-weight:900;cursor:pointer}.timeline-drag-palette .drag-chip-group{margin-top:8px}.drag-drop-panel{position:relative;top:auto;z-index:9;box-shadow:0 12px 28px rgba(30,37,43,.08)}.timeline-filtered-root,.timeline-filtered-root.density-compact,.timeline-filtered-root.zoom-book{--timeline-scene-width:220px;--timeline-grid-gap:10px}.timeline-filtered-root.density-expanded,.timeline-filtered-root.zoom-scene-detail{--timeline-scene-width:290px}.timeline-filtered-root.density-compact.zoom-book{--timeline-scene-width:200px}.timeline-chapter,.timeline-empty-scene,.timeline-scene-card{overflow-wrap:normal;word-break:normal}.asset-lane-label strong,.character-lane-label strong,.plot-lane-label strong,.timeline-chapter-title strong,.timeline-scene-card strong{min-width:0;white-space:normal;word-break:normal;overflow-wrap:break-word}.timeline-scene-card{cursor:grab}.drag-chip:active,.timeline-scene-card:active,[draggable=true]:active{cursor:grabbing}body.drag-active .timeline-scene-card,body.dragging-asset [data-asset-drop-target],body.dragging-location [data-drag-type=location]{transition:outline-color .12s ease,box-shadow .12s ease,opacity .12s ease}body.dragging-asset .timeline-scene-card,body.dragging-asset [data-asset-drop-target],body.dragging-character .timeline-scene-card,body.dragging-location [data-drag-type=location],body.dragging-scene .timeline-scene-card,body.dragging-scene .timeline-scenes[data-chapter-drop-target]{outline:1px dashed rgba(47,111,99,.22);outline-offset:2px}.is-dragging{opacity:.42;transform:scale(.98)}.drop-target-active{outline:3px solid rgba(47,111,99,.42)!important;outline-offset:3px}.analytics-metric-row{display:grid;grid-template-columns:170px minmax(560px,1fr);gap:12px;align-items:stretch}.analytics-metric-label{display:flex;align-items:center;border-right:1px solid var(--plotline-line);color:var(--plotline-muted);font-weight:800}.analytics-sparkline{display:grid;grid-template-columns:repeat(var(--point-count),minmax(28px,1fr));align-items:end;gap:5px;min-height:88px;border-bottom:1px solid rgba(47,111,99,.25);padding-top:10px}.analytics-bar{position:relative;display:flex;align-items:end;justify-content:center;min-height:12px;height:max(12px,var(--bar-height));border-radius:6px 6px 2px 2px;color:var(--plotline-accent-dark);text-decoration:none;background:linear-gradient(180deg,rgba(47,111,99,.58),rgba(47,111,99,.18))}.analytics-bar:hover{background:linear-gradient(180deg,rgba(47,111,99,.82),rgba(47,111,99,.28))}.analytics-bar span{position:absolute;bottom:calc(100% + 3px);color:var(--plotline-muted);font-size:.68rem;font-weight:800}.analytics-count-row,.analytics-link-row,.analytics-list-item,.purpose-stat-row{border-top:1px solid var(--plotline-line);padding:9px 0}.analytics-list-item{display:grid;gap:3px}.analytics-list-item p{margin:0}.analytics-count-row,.analytics-link-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.analytics-link-row{color:inherit;text-decoration:none}.analytics-link-row:hover{color:var(--plotline-accent-dark)}.analytics-link-row span,.analytics-link-row strong{min-width:0}.purpose-stat-row{display:grid;grid-template-columns:minmax(120px,1fr) minmax(90px,1.5fr) 42px;align-items:center;gap:10px}.purpose-stat-bar{overflow:hidden;height:8px;border-radius:999px;background:rgba(47,111,99,.08)}.purpose-stat-bar span{display:block;height:100%;border-radius:inherit;background:var(--plotline-accent)}.story-bible-heading{align-items:end}.story-bible-search{display:flex;gap:8px;min-width:min(100%,420px)}.story-bible-search .form-control{min-width:0}.story-bible-nav{position:sticky;top:72px;z-index:4;display:flex;flex-wrap:wrap;gap:8px;margin:0 0 18px;padding:10px;border:1px solid var(--plotline-line);border-radius:12px;background:rgba(250,249,246,.92);backdrop-filter:blur(10px)}.story-bible-actions a,.story-bible-nav a{display:inline-flex;align-items:center;border-radius:999px;padding:6px 10px;background:rgba(47,111,99,.08);color:var(--plotline-ink);font-size:.86rem;font-weight:650;text-decoration:none}.story-bible-actions a:hover,.story-bible-nav a:hover{background:rgba(47,111,99,.16)}.story-bible-section{margin:0 0 28px}.story-bible-section-heading{display:flex;align-items:end;justify-content:space-between;gap:16px;margin-bottom:12px}.story-bible-section-heading h2{margin:0}.soft-count{color:var(--plotline-muted);font-size:.9rem;font-weight:650;white-space:nowrap}.story-bible-grid,.story-bible-search-results{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:14px}.story-bible-grid-compact{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.story-bible-card{border:1px solid var(--plotline-line);border-radius:14px;padding:14px;background:rgba(255,255,255,.86);box-shadow:0 14px 34px rgba(36,32,26,.06)}.story-bible-card h3{margin:0 0 8px;font-size:1.05rem}.story-bible-card h4{margin:14px 0 8px;font-size:.96rem}.story-bible-card p{color:var(--plotline-muted)}.story-bible-card-title{display:flex;align-items:start;justify-content:space-between;gap:10px}.story-bible-card-title span{border:1px solid var(--plotline-line);border-radius:999px;padding:3px 8px;background:rgba(250,249,246,.9);color:var(--plotline-muted);font-size:.78rem;font-weight:700;white-space:nowrap}.story-bible-meta{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}.story-bible-meta span{border-radius:999px;padding:4px 8px;background:rgba(36,32,26,.05);color:var(--plotline-muted);font-size:.78rem;font-weight:650}.story-bible-facts{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:6px 10px;margin:12px 0}.story-bible-facts dt{color:var(--plotline-muted);font-size:.78rem;font-weight:800;text-transform:uppercase}.story-bible-facts dd{margin:0;min-width:0;overflow-wrap:anywhere}.story-bible-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.story-bible-link-list{display:grid;gap:8px;margin:0;padding:0;list-style:none}.story-bible-link-list li{display:grid;gap:2px;padding:8px 0;border-bottom:1px solid rgba(36,32,26,.08)}.story-bible-link-list li:last-child{border-bottom:0}.story-bible-link-list span{color:var(--plotline-muted);font-size:.88rem}.story-bible-timeline-summary{display:grid;gap:14px}.story-bible-wide-card{max-width:none}.story-bible-chapter-summary{border-top:1px solid var(--plotline-line);padding-top:8px}.story-bible-scene-summary{display:grid;grid-template-columns:minmax(220px,1.5fr) repeat(3,minmax(120px,0.8fr));gap:8px;padding:9px 0;border-top:1px solid rgba(36,32,26,.08)}.story-bible-scene-summary p{grid-column:1/-1;margin:0}.story-bible-scene-summary span{color:var(--plotline-muted);font-size:.88rem}.attention-list{display:grid;gap:10px}.attention-list article{display:grid;grid-template-columns:max-content minmax(0,1fr) auto;align-items:center;gap:10px;border:1px solid var(--plotline-line);border-radius:12px;padding:10px 12px;background:rgba(255,255,255,.82)}.attention-list p{grid-column:2/-1;margin:0;color:var(--plotline-muted)}.chapter-goal-form,.writer-add-form,.writer-edit-form,.writer-workspace-form{display:grid;gap:10px}.writer-checkbox-grid{display:flex;flex-wrap:wrap;gap:8px 14px}.writer-checkbox-grid label{display:inline-flex;align-items:center;gap:6px;color:var(--plotline-muted);font-size:.86rem;font-weight:650}.writer-priority-control{display:grid;grid-template-columns:minmax(0,1fr) max-content;align-items:center;gap:12px}.writer-priority-control .form-range{min-width:0}.writer-note-list,.writer-queue-list{display:grid;gap:10px}.writer-mini-card{border:1px solid var(--plotline-line);border-radius:12px;padding:10px;background:rgba(255,255,255,.72)}.writer-mini-card summary{display:flex;align-items:center;gap:8px;cursor:pointer}.writer-mini-card summary strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.attachment-card-list{display:grid;gap:10px}.attachment-summary{align-items:center}.attachment-kind{border-radius:999px;padding:3px 8px;background:rgba(47,111,99,.1);color:var(--plotline-accent);font-size:.76rem;font-weight:800;text-transform:uppercase}.attachment-card-body{display:grid;gap:6px;margin-top:10px}.attachment-card-body p{margin:0}.attachment-add-card{margin-top:10px}.writer-checklist{display:grid;gap:6px}.writer-add-inline,.writer-checklist-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px}.writer-remove-inline{display:flex;justify-content:end;margin:-2px 0 4px}.writer-dashboard-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin-bottom:26px}.writer-dashboard-panel{border:1px solid var(--plotline-line);border-radius:14px;padding:14px;background:rgba(255,255,255,.7);box-shadow:0 14px 34px rgba(36,32,26,.05)}.writing-workspace-launcher{border-color:rgba(47,111,99,.22);background:linear-gradient(180deg,#fff 0,rgba(238,245,242,.68) 100%)}.writing-workspace-status-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-bottom:10px}.writing-workspace-status-grid div{display:grid;gap:2px;border:1px solid var(--plotline-line);border-radius:8px;padding:10px 12px;background:var(--plotline-panel)}.writing-workspace-status-grid span{color:var(--plotline-muted);font-size:.76rem;font-weight:800;text-transform:uppercase}.writing-workspace-status-grid strong{color:var(--plotline-ink);font-size:1rem}.writing-workspace-message{min-height:1.35rem}.writing-workspace-display-controls{display:grid;grid-template-columns:repeat(2,minmax(12rem,1fr)) auto;gap:8px;align-items:end;margin:10px 0 12px}.writing-workspace-display-controls label{display:grid;gap:4px;margin:0;color:var(--plotline-muted);font-size:.82rem;font-weight:700}.writing-workspace-role-indicator{display:inline-flex;align-items:center;gap:.5rem;padding:.4rem .65rem;border:1px solid rgba(47,111,99,.22);border-radius:999px;background:var(--plotline-soft);color:var(--plotline-accent-dark);font-size:.9rem;font-weight:700;white-space:nowrap}.writer-queue-card{border:1px solid var(--plotline-line);border-radius:12px;padding:12px;background:rgba(255,255,255,.9)}.writer-queue-card h3{margin:0;font-size:1rem}.writer-queue-card p{margin:8px 0 0;color:var(--plotline-muted)}.writer-queue-title{display:flex;align-items:start;justify-content:space-between;gap:12px}.writer-kpi{display:block;color:var(--plotline-accent);font-size:2.2rem;line-height:1}.export-action-row{margin:-8px 0 18px}.dynamics-timeline{position:relative;min-height:128px;border:1px solid var(--plotline-line);border-radius:14px;background:linear-gradient(180deg,rgba(47,111,99,.07),rgba(255,255,255,.84));overflow:hidden}.dynamics-timeline::before{content:"";position:absolute;left:12px;right:12px;top:64px;height:1px;background:rgba(36,32,26,.18)}.dynamics-marker{position:absolute;bottom:18px;width:12px;height:86px;transform:translateX(-50%);display:flex;align-items:end;justify-content:center}.dynamics-marker span{display:block;width:8px;min-height:12px;max-height:82px;border-radius:999px;background:var(--plotline-accent);box-shadow:0 8px 20px rgba(47,111,99,.22)}.dynamics-marker.pov span{background:#8a4b2f}.dynamics-timeline.relationship .dynamics-marker span{background:#7c5fb0}.scenario-banner{display:flex;justify-content:space-between;gap:18px;align-items:flex-start;border:1px solid rgba(103,80,164,.22);border-radius:12px;padding:16px;margin-bottom:16px;background:linear-gradient(135deg,rgba(103,80,164,.1),rgba(255,255,255,.86));box-shadow:0 12px 28px rgba(36,32,26,.08)}.scenario-banner h1{margin:0 0 4px}.scenario-banner p{margin:0;color:var(--plotline-muted)}.scenario-card{border-color:rgba(103,80,164,.18)}.scenario-warning-strip{display:flex;gap:10px;align-items:center;border:1px solid var(--plotline-line);border-radius:10px;padding:10px 12px;margin-bottom:14px;background:rgba(255,255,255,.76);color:var(--plotline-muted)}.scenario-warning-strip strong{color:var(--plotline-ink)}.scenario-board{border:1px solid var(--plotline-line);border-radius:12px;padding:12px;background:rgba(247,245,240,.74);overflow:hidden;margin-bottom:18px}.scenario-scroll{display:flex;gap:14px;overflow-x:auto;padding-bottom:8px}.scenario-chapter{min-width:360px;max-width:520px;border:1px solid rgba(82,75,65,.14);border-radius:10px;background:rgba(255,255,255,.86)}.scenario-chapter header{display:grid;gap:2px;border-bottom:1px solid var(--plotline-line);padding:10px 12px}.scenario-chapter header span{color:var(--plotline-muted);font-size:.78rem;font-weight:800;text-transform:uppercase}.scenario-scene-row{display:grid;gap:10px;padding:10px}.scenario-scene-card{display:grid;gap:8px;border:1px solid rgba(82,75,65,.12);border-radius:9px;padding:10px;background:#fff}.scenario-scene-title{display:grid;gap:2px}.scenario-mini-data,.scenario-scene-title span{color:var(--plotline-muted);font-size:.78rem}.scenario-mini-data{display:grid;gap:2px}.scenario-chapter-form,.scenario-compare-list article,.scenario-move-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.scenario-chapter-form select{min-width:160px;width:auto}.scenario-compare-list{display:grid;gap:10px}.scenario-compare-list article{justify-content:space-between;border:1px solid var(--plotline-line);border-radius:9px;padding:10px;background:rgba(255,255,255,.82)}.danger-zone{border-color:rgba(163,61,61,.24)}.archive-filter-form{align-items:end}.archive-item-list{display:grid;gap:10px}.archive-item-card{display:flex;justify-content:space-between;gap:14px;align-items:center;border:1px solid var(--plotline-line);border-radius:10px;padding:12px;background:rgba(255,255,255,.82)}.archive-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-items:end}.delete-forever-form{display:inline-flex;margin:0}.archive-item-card h3{margin:4px 0}.archived-badge{display:inline-flex;border:1px solid rgba(82,75,65,.16);border-radius:999px;padding:2px 8px;color:var(--plotline-muted);font-size:.72rem;font-weight:800;text-transform:uppercase;background:rgba(247,245,240,.86)}.restore-button{white-space:nowrap}.archive-button-form{display:inline-flex;align-items:center;margin:0}.acceptance-summary-grid{display:grid;grid-template-columns:repeat(3,minmax(160px,1fr));gap:12px;margin-bottom:16px}.acceptance-summary{display:grid;gap:4px;padding:16px}.acceptance-summary strong{font-size:2rem;line-height:1}.acceptance-summary.pass{border-left:5px solid #4d7654}.acceptance-summary.review{border-left:5px solid #b8762b}.acceptance-summary.blocked{border-left:5px solid #963f36}.acceptance-check-list{display:grid;gap:14px}.acceptance-area{border:1px solid var(--plotline-line);border-radius:10px;padding:12px;background:rgba(255,255,255,.62)}.acceptance-area h3{margin:0 0 10px;font-size:1.05rem}.acceptance-check-items{display:grid;gap:8px}.acceptance-check-item{display:grid;grid-template-columns:92px minmax(0,1fr);gap:10px;align-items:start;border:1px solid rgba(82,75,65,.12);border-radius:8px;padding:10px;background:rgba(255,255,255,.74)}.acceptance-check-item p{margin:2px 0 0;color:var(--plotline-muted)}.acceptance-status{display:inline-flex;justify-content:center;width:fit-content;min-width:74px;border-radius:999px;padding:3px 9px;font-size:.72rem;font-weight:900;text-transform:uppercase}.acceptance-check-item.pass .acceptance-status{color:#24512b;background:#e6f4e7}.acceptance-check-item.review .acceptance-status{color:#7b4b13;background:#fbecd3}.acceptance-check-item.blocked .acceptance-status{color:#7a2222;background:#fff0f0}.plotline-confirm-modal .modal-title{color:var(--plotline-ink)}.plotline-confirm-modal .modal-body p{white-space:pre-line}.delete-confirm-field{border:1px solid rgba(163,61,61,.22);border-radius:8px;padding:12px;background:rgba(255,247,244,.7)}@media print{.breadcrumb-trail,.button-row,.context-header,.story-bible-nav,header{display:none!important}.plotline-shell{max-width:none;padding:0}}@media (max-width:760px){.plotline-shell{padding-left:14px;padding-right:14px}.page-heading{display:block}.page-heading .button-row,.timeline-filter{margin-top:14px}.timeline-filter{align-items:stretch;flex-direction:column}.timeline-navigation-card{grid-template-areas:"copy" "actions";grid-template-columns:1fr}.timeline-navigation-card-icon{display:none}.timeline-navigation-card-actions{justify-content:center}.story-bible-search,.story-bible-section-heading{align-items:stretch;flex-direction:column}.attention-list article,.story-bible-scene-summary{grid-template-columns:1fr}.writer-dashboard-grid{grid-template-columns:1fr}.writing-workspace-status-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.writing-workspace-display-controls{grid-template-columns:1fr}.writer-add-inline,.writer-checklist-row{grid-template-columns:1fr}.trial-dashboard-banner,.trial-status-panel--signup,.trial-status-panel__heading{align-items:stretch;flex-direction:column}.trial-dashboard-banner__actions,.trial-dashboard-banner__actions .btn,.trial-status-panel--signup .btn{width:100%}.attention-list p{grid-column:auto}}@media (max-width:900px){.workspace-layout,.workspace-layout.inspector-drawer-open{grid-template-columns:1fr;gap:14px}.timeline-inspector-resizer{display:none}.scene-inspector-panel{position:static;max-height:none;overflow:visible}.scene-inspector-body{max-height:none;overflow:visible}}@media (max-width:1100px){.metric-graph-row{grid-template-columns:1fr}.analytics-grid-three,.analytics-grid-two,.health-kpi-grid{grid-template-columns:1fr}.analytics-metric-row{grid-template-columns:1fr}.analytics-metric-label{border-right:0}}.floor-plan-list{display:grid;gap:12px}.floor-plan-list-item{align-items:center;border:1px solid var(--border-color,#d8ded9);border-radius:8px;display:flex;justify-content:space-between;gap:16px;padding:14px}.floor-plan-list-item h2{font-size:1.05rem;margin:0 0 4px}.floor-plan-list-item p{margin:0}.floor-plan-tools{display:grid;gap:14px}.floor-plan-meta-wide{max-width:none}.floor-plan-tabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}.floor-plan-tab{background:var(--panel-bg,#fff);border:1px solid var(--border-color,#d8ded9);border-radius:999px;color:inherit;padding:6px 12px}.floor-plan-tab.active{background:var(--bs-primary,#2f6f63);border-color:var(--bs-primary,#2f6f63);color:#fff}.floor-plan-layout{display:grid;gap:16px;grid-template-columns:minmax(0,1fr) minmax(320px,360px)}.floor-plan-editor--occupancy .floor-plan-layout{grid-template-columns:minmax(0,1fr)}.floor-plan-editor-toolbar{background:rgba(255,255,255,.92);border:1px solid var(--border-color,#d8ded9);border-radius:8px;display:grid;gap:10px;margin-bottom:12px;padding:10px 12px;position:sticky;top:10px;z-index:20}.floor-plan-occupancy-scene-row,.floor-plan-toolbar-action-group,.floor-plan-toolbar-control-group,.floor-plan-toolbar-floor-group,.floor-plan-toolbar-main{align-items:center;display:flex;flex-wrap:wrap;gap:10px}.floor-plan-toolbar-main{justify-content:space-between}.scene-editor-v2-workspace{max-width:none;width:100%;padding:0;border:0;background:0 0;box-shadow:none}.scene-inspector-v2{position:relative;display:grid;gap:14px;color:var(--plotline-ink)}.scene-inspector-v2-edit{--scene-editor-width:520px;padding-bottom:16px}.scene-inspector-v2-edit.editor-overlay-open{display:grid;grid-template-columns:minmax(0,1fr) 10px minmax(400px,min(var(--scene-editor-width),46%));align-items:stretch;gap:12px;height:clamp(480px,calc(100vh - 240px),820px);min-height:0}.scene-inspector-v2-summary-pane{display:grid;gap:12px;min-width:0}.scene-inspector-v2-edit.editor-overlay-open .scene-inspector-v2-summary-pane{min-height:0;overflow:auto;padding-right:2px}.scene-inspector-v2-edit.editor-overlay-open .scene-inspector-v2-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.scene-inspector-v2-timeline{min-height:100%}.scene-inspector-v2-timeline.editor-overlay-open{height:clamp(380px,calc(100vh - 190px),680px);min-height:0;overflow:hidden}.scene-inspector-v2-grid{display:grid;align-items:stretch;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.scene-inspector-v2-edit .scene-inspector-v2-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.scene-inspector-v2-stack{display:grid;gap:12px}.scene-inspector-v2-health{display:grid;grid-template-columns:repeat(7,minmax(110px,1fr));gap:8px}.scene-inspector-editor-overlay,.scene-inspector-v2-card,.scene-inspector-v2-health>div{border:1px solid var(--plotline-line);background:var(--plotline-panel);border-radius:8px;box-shadow:0 8px 24px rgba(30,37,43,.06)}.scene-inspector-v2-health>div{min-width:0;padding:10px 12px}.scene-inspector-v2-counts span,.scene-inspector-v2-facts dt,.scene-inspector-v2-health span,.scene-inspector-v2-section>span,.scene-inspector-v2-summary>span{display:block;color:var(--plotline-muted);font-size:.72rem;font-weight:800;text-transform:uppercase}.scene-inspector-v2-health strong{display:block;overflow:hidden;color:var(--plotline-ink);font-size:.94rem;text-overflow:ellipsis;white-space:nowrap}.scene-inspector-v2-counts .attention strong,.scene-inspector-v2-health .attention strong{color:var(--plotline-danger,#b35f3b)}.scene-inspector-v2-card{display:grid;align-content:start;gap:14px;height:100%;min-width:0;padding:16px}.scene-inspector-v2-edit .scene-inspector-v2-card{gap:10px;padding:14px}.scene-inspector-v2-card-header{display:flex;align-items:flex-start;justify-content:space-between;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;line-height:1.25}.scene-inspector-editor-title-row,.scene-inspector-v2-heading{display:flex;align-items:center;gap:6px;min-width:0}.scene-inspector-editor-title-row h3,.scene-inspector-v2-heading h3{min-width:0}.scene-inspector-v2-heading .plotline-help-icon-wrapper{flex:0 0 auto}.scene-inspector-v2-edit .scene-inspector-v2-card-header{gap:10px}.scene-inspector-v2-edit .scene-inspector-v2-card-header h3{font-size:1rem}.scene-inspector-v2-card p{margin:0}.scene-inspector-v2-facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:0}.scene-inspector-v2-facts div{min-width:0}.scene-inspector-v2-facts dd{margin:2px 0 0;overflow-wrap:anywhere}.scene-inspector-v2-section,.scene-inspector-v2-summary{display:grid;gap:6px}.scene-inspector-v2-edit .scene-inspector-v2-section,.scene-inspector-v2-edit .scene-inspector-v2-summary{gap:5px}.scene-inspector-v2-actions,.scene-inspector-v2-chip-row{display:flex;flex-wrap:wrap;gap:7px}.scene-inspector-v2-edit .scene-inspector-v2-actions{gap:6px}.scene-inspector-v2-edit .scene-inspector-v2-actions .btn{padding:.22rem .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}.scene-inspector-v2-action-menu .dropdown-item{font-size:.86rem}.scene-inspector-v2-chip-row span{border:1px solid rgba(47,111,99,.18);border-radius:999px;background:rgba(47,111,99,.08);padding:3px 9px;color:var(--plotline-accent-dark);font-size:.82rem;font-weight:800}.scene-inspector-v2-counts,.scene-inspector-v2-metrics{display:grid;gap:8px}.scene-inspector-v2-metrics{grid-template-columns:1fr}.scene-inspector-v2-counts{grid-template-columns:repeat(auto-fit,minmax(72px,1fr))}.scene-inspector-v2-counts>div,.scene-inspector-v2-metrics>div{min-width:0;border:1px solid rgba(47,111,99,.12);border-radius:8px;background:rgba(47,111,99,.05);padding:9px 10px}.scene-inspector-v2-edit .scene-inspector-v2-counts>div,.scene-inspector-v2-edit .scene-inspector-v2-metrics>div{padding:7px 8px}.scene-inspector-v2-metrics span{display:block;overflow:hidden;color:var(--plotline-muted);font-size:.78rem;text-overflow:ellipsis;white-space:nowrap}.scene-inspector-v2-counts strong,.scene-inspector-v2-metrics strong{display:block;color:var(--plotline-ink);font-size:1rem}.scene-inspector-v2-list{display:grid;gap:7px;margin:0;padding:0;list-style:none}.scene-inspector-v2-edit .scene-inspector-v2-list{gap:5px}.scene-inspector-v2-list li{display:flex;align-items:baseline;justify-content:space-between;gap:10px;border-bottom:1px solid rgba(47,111,99,.1);padding-bottom:6px}.scene-inspector-v2-edit .scene-inspector-v2-list li{padding-bottom:5px}.scene-inspector-v2-list li:last-child{border-bottom:0;padding-bottom:0}.scene-inspector-v2-list span{color:var(--plotline-muted);font-size:.82rem;text-align:right}.scene-inspector-v2-character-list,.scene-inspector-v2-compact-list{display:grid;gap:7px;margin:0;padding:0;list-style:none}.scene-inspector-v2-character-list li{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:9px;min-width:0}.scene-inspector-v2-character-list span,.scene-inspector-v2-character-list strong{display:block}.scene-inspector-v2-character-list div{min-width:0}.scene-inspector-v2-character-list div span{color:var(--plotline-muted);font-size:.8rem}.scene-inspector-v2-character-list .visual-avatar{width:34px}.scene-inspector-v2-character-list .visual-avatar>span{display:flex;align-items:center;justify-content:center;width:100%;height:100%;line-height:1}.scene-inspector-v2-avatar-pov{box-shadow:0 0 0 2px rgba(47,111,99,.24)}.scene-inspector-v2-mini-badge{border:1px solid rgba(47,111,99,.2);border-radius:999px;background:var(--plotline-soft);color:var(--plotline-accent-dark);padding:2px 7px;font-size:.7rem;font-weight:800}.scene-inspector-v2-preview-stack{display:grid;gap:8px}.scene-inspector-v2-preview-group{border:1px solid rgba(47,111,99,.12);border-radius:8px;background:rgba(47,111,99,.04);padding:8px 10px}.scene-inspector-v2-preview-group summary{display:flex;align-items:center;justify-content:space-between;gap:10px;color:var(--plotline-accent-dark);cursor:pointer;font-size:.82rem;font-weight:800}.scene-inspector-v2-preview-group summary span{color:var(--plotline-muted);font-size:.76rem}.scene-inspector-v2-preview-group[open] summary{margin-bottom:7px}.scene-inspector-v2-compact-list li{min-width:0;color:var(--plotline-ink);font-size:.88rem;overflow-wrap:anywhere}.scene-inspector-v2-compact-list li::before{content:"";display:inline-block;width:5px;height:5px;margin-right:7px;border-radius:999px;background:rgba(47,111,99,.42);vertical-align:middle}.scene-inspector-v2-compact-list a{color:var(--plotline-accent-dark);font-weight:700}.scene-inspector-v2-good-state,.scene-inspector-v2-suggestion-strip,.scene-inspector-v2-warning-state{border-radius:8px;padding:8px 10px}.scene-inspector-v2-suggestion-strip{display:flex;align-items:center;gap:8px;border:1px solid rgba(197,139,43,.24);background:rgba(197,139,43,.1)}.scene-inspector-v2-suggestion-strip strong{color:#805815;font-size:1rem}.scene-inspector-v2-suggestion-strip span{color:var(--plotline-muted);font-size:.86rem;font-weight:700}.scene-inspector-v2-good-state{border:1px solid rgba(47,111,99,.16);background:rgba(47,111,99,.07);color:var(--plotline-accent-dark);font-weight:800}.scene-inspector-v2-good-state::before{content:"\2713";margin-right:7px}.scene-inspector-v2-warning-state{border:1px solid rgba(179,95,59,.22);background:rgba(179,95,59,.1);color:var(--plotline-danger,#b35f3b);font-weight:800}.scene-inspector-v2-metric-row{display:grid;grid-template-columns:minmax(130px,180px) minmax(0,1fr) auto;align-items:center;gap:6px}.scene-inspector-v2-metric-row>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.scene-inspector-v2-metric-track{display:flex;align-items:stretch;width:100%;height:8px;overflow:hidden;border:0;border-radius:999px;background:rgba(47,111,99,.12);padding:0}.scene-inspector-v2-metric-track i{display:block;width:var(--metric-percent);min-width:4px;border-radius:inherit;background:linear-gradient(90deg,#6fa99b,var(--plotline-accent-dark))}.scene-inspector-v2-callout{border-left:4px solid var(--plotline-warning,#c58b2b);border-radius:8px;background:rgba(197,139,43,.1);padding:10px 12px}.scene-overview-v2-header{align-items:flex-start}.scene-overview-v2-controls{display:flex;flex:0 0 auto;flex-wrap:wrap;justify-content:flex-end;gap:6px}.scene-overview-v2-facts{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 10px}.scene-overview-v2-facts div:nth-child(3),.scene-overview-v2-summary{grid-column:1/-1}.scene-overview-v2-summary p{display:-webkit-box;overflow:hidden;-webkit-line-clamp:3;-webkit-box-orient:vertical}.manuscript-balance{display:grid;gap:6px;min-width:0;border:1px solid rgba(47,111,99,.13);border-radius:8px;background:rgba(47,111,99,.045);padding:10px 12px}.manuscript-balance__heading,.manuscript-balance__scale{display:flex;align-items:center;justify-content:space-between;gap:10px;min-width:0}.manuscript-balance__heading span{color:var(--plotline-accent-dark);font-size:.84rem;font-weight:800}.manuscript-balance__heading strong{color:var(--plotline-ink);font-size:.92rem;font-weight:900;white-space:nowrap}.manuscript-balance__scale span{flex:0 0 auto;color:var(--plotline-muted);font-size:.75rem;font-weight:800}.manuscript-balance__track{position:relative;flex:1 1 auto;min-width:72px;height:8px;border-radius:999px;background:linear-gradient(90deg,rgba(97,107,88,.55),rgba(47,111,99,.66))}.manuscript-balance__track i{position:absolute;top:50%;width:14px;height:14px;border:2px solid var(--plotline-surface-elevated);border-radius:999px;background:var(--plotline-accent-dark);box-shadow:0 2px 5px rgba(36,31,27,.2);transform:translate(-50%,-50%)}.manuscript-balance p{margin:0;color:var(--plotline-muted);font-size:.84rem;font-weight:700}.scene-inspector-editor-overlay{position:absolute;inset:0;z-index:4;display:grid;grid-template-rows:auto minmax(0,1fr);gap:12px;max-height:100%;padding:16px;overflow:hidden;background:var(--plotline-panel)}.scene-inspector-editor-overlay[hidden]{display:none}.scene-inspector-v2-edit .scene-inspector-editor-overlay{position:static;inset:auto;z-index:1;min-width:0;height:100%;max-height:none}.scene-inspector-editor-resizer{display:none}.scene-inspector-v2-edit.editor-overlay-open .scene-inspector-editor-resizer{display:block;align-self:stretch;min-height:100%;border-radius:999px;cursor:col-resize;background:linear-gradient(180deg,rgba(47,111,99,.16),rgba(47,111,99,.04))}.scene-inspector-v2-edit.editor-overlay-open .scene-inspector-editor-resizer::before{content:"";display:block;width:2px;height:48px;margin:18px auto;border-radius:999px;background:var(--plotline-accent);opacity:.55}.scene-inspector-v2-edit.editor-overlay-open .scene-inspector-editor-resizer:focus-visible,.scene-inspector-v2-edit.editor-overlay-open .scene-inspector-editor-resizer:hover{background:rgba(47,111,99,.16)}body.scene-inspector-editor-resizing{cursor:col-resize;user-select:none}.scene-inspector-editor-shell{position:sticky;top:0;z-index:2;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;border-bottom:1px solid var(--plotline-line);background:var(--plotline-panel);padding-bottom:12px}.scene-inspector-editor-shell h3{margin:0;font-size:1.1rem}.scene-inspector-editor-help{flex:0 0 auto}.scene-inspector-editor-empty{min-height:0;overflow:auto}.scene-inspector-editor-form{display:grid;grid-template-rows:minmax(0,1fr) auto;min-height:100%;gap:14px}.scene-inspector-editor-fields{display:grid;align-content:start;gap:14px;padding-right:4px}.scene-inspector-editor-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.scene-inspector-editor-fieldset{display:grid;gap:10px;min-width:0;margin:0;border:1px solid var(--plotline-line);border-radius:8px;padding:12px}.scene-inspector-editor-fieldset legend{float:none;width:auto;margin:0;padding:0 4px;color:var(--plotline-muted);font-size:.76rem;font-weight:800;text-transform:uppercase}.scene-inspector-editor-checks{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.scene-inspector-editor-checks label{display:flex;align-items:center;gap:8px;min-width:0;margin:0;border:1px solid rgba(47,111,99,.12);border-radius:8px;background:rgba(47,111,99,.05);padding:8px 10px}.scene-inspector-editor-checks span{overflow-wrap:anywhere}.scene-inspector-editor-footer{position:sticky;bottom:0;z-index:2;display:flex;justify-content:flex-end;gap:8px;border-top:1px solid var(--plotline-line);background:var(--plotline-panel);padding-top:12px}.scene-inspector-editor-error{border:1px solid rgba(179,95,59,.28);border-radius:8px;background:rgba(179,95,59,.1);padding:10px 12px;color:var(--plotline-danger,#b35f3b);font-weight:700}.scene-inspector-editor-loading,.scene-inspector-editor-pending{border:1px dashed rgba(47,111,99,.24);border-radius:8px;background:rgba(47,111,99,.04);padding:16px;color:var(--plotline-muted)}.scene-inspector-editor-metric{display:grid;gap:10px;border:1px solid var(--plotline-line);border-radius:8px;background:rgba(47,111,99,.04);padding:12px}.scene-inspector-editor-metric-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.scene-inspector-editor-metric-heading h4{margin:0;font-size:.98rem}.scene-inspector-editor-metric-heading p{margin:3px 0 0;color:var(--plotline-muted);font-size:.88rem}.scene-inspector-editor-metric-heading output{min-width:42px;border-radius:8px;background:var(--plotline-accent);padding:5px 8px;color:#fff;font-weight:800;text-align:center}.scene-inspector-editor-range-labels{display:flex;justify-content:space-between;color:var(--plotline-muted);font-size:.78rem}.scene-character-editor-section{display:grid;gap:10px}.scene-character-editor-heading{display:flex;align-items:center;justify-content:space-between;gap:10px;color:var(--plotline-muted);font-size:.76rem;font-weight:800;text-transform:uppercase}.scene-character-editor-heading strong{border-radius:999px;background:rgba(47,111,99,.1);padding:2px 8px;color:var(--plotline-accent-dark)}.scene-character-pov-options{display:grid;gap:7px}.scene-character-pov-options label{display:flex;align-items:center;gap:8px;margin:0;font-weight:700}.scene-character-editor-list{display:grid;gap:10px}.scene-character-editor-card{display:grid;gap:10px;border:1px solid var(--plotline-line);border-radius:8px;background:rgba(47,111,99,.04);padding:12px}.scene-character-editor-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.scene-character-editor-card-header h4{margin:0;font-size:1rem}.scene-character-editor-card-header p{margin:2px 0 0;color:var(--plotline-muted);font-size:.86rem}.scene-character-remove{display:inline-flex;align-items:center;gap:6px;margin:0;color:var(--plotline-muted);font-size:.82rem;font-weight:800;white-space:nowrap}.scene-world-editor-section{display:grid;gap:10px}.scene-world-editor-heading{display:flex;align-items:center;justify-content:space-between;gap:10px;color:var(--plotline-muted);font-size:.76rem;font-weight:800;text-transform:uppercase}.scene-world-editor-heading strong{border-radius:999px;background:rgba(47,111,99,.1);padding:2px 8px;color:var(--plotline-accent-dark)}.scene-world-editor-list{display:grid;gap:10px}.scene-world-editor-card{display:grid;gap:10px;border:1px solid var(--plotline-line);border-radius:8px;background:rgba(47,111,99,.04);padding:12px}.scene-world-editor-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.scene-world-editor-card-header h4{margin:0;font-size:1rem}.scene-world-editor-card-header p{margin:2px 0 0;color:var(--plotline-muted);font-size:.86rem}.scene-world-remove{display:inline-flex;align-items:center;gap:6px;margin:0;color:var(--plotline-muted);font-size:.82rem;font-weight:800;white-space:nowrap}.scene-writer-editor-section{display:grid;gap:10px}.scene-writer-editor-heading{display:flex;align-items:center;justify-content:space-between;gap:10px;color:var(--plotline-muted);font-size:.76rem;font-weight:800;text-transform:uppercase}.scene-writer-editor-heading strong{border-radius:999px;background:rgba(47,111,99,.1);padding:2px 8px;color:var(--plotline-accent-dark)}.scene-writer-editor-list{display:grid;gap:10px}.scene-writer-checklist-row,.scene-writer-editor-card{display:grid;gap:10px;border:1px solid var(--plotline-line);border-radius:8px;background:rgba(47,111,99,.04);padding:12px}.scene-writer-editor-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.scene-writer-editor-card-header h4{margin:0;font-size:1rem}.scene-writer-editor-card-header p{margin:2px 0 0;color:var(--plotline-muted);font-size:.86rem}.scene-writer-checklist-row{grid-template-columns:auto minmax(0,1fr) auto;align-items:center}.scene-writer-checklist-complete,.scene-writer-inline-check,.scene-writer-remove{display:inline-flex;align-items:center;gap:6px;margin:0;color:var(--plotline-muted);font-size:.82rem;font-weight:800;white-space:nowrap}.scene-attachment-editor-card{align-items:stretch}.scene-attachment-preview-row{display:grid;grid-template-columns:72px minmax(0,1fr);gap:12px;align-items:start}.scene-attachment-thumb{display:grid;place-items:center;width:72px;height:72px;overflow:hidden;border:1px solid var(--plotline-line);border-radius:8px;background:rgba(47,111,99,.06);color:var(--plotline-muted);font-size:.78rem;font-weight:800;text-align:center}.scene-attachment-thumb img{width:100%;height:100%;object-fit:cover}.scene-attachment-preview-copy{display:grid;gap:8px;min-width:0}.scene-attachment-preview-copy p{margin:0}.scene-attachment-delete-form,.scene-attachment-editor-form{display:grid;gap:10px}.scene-attachment-action-row{display:flex;justify-content:flex-end;gap:8px}.scene-structure-editor-section{display:grid;gap:10px}.scene-structure-editor-heading{display:flex;align-items:center;justify-content:space-between;gap:10px;color:var(--plotline-muted);font-size:.76rem;font-weight:800;text-transform:uppercase}.scene-structure-editor-heading strong{border-radius:999px;background:rgba(47,111,99,.1);padding:2px 8px;color:var(--plotline-accent-dark)}.scene-structure-delete-form,.scene-structure-editor-form,.scene-structure-editor-list{display:grid;gap:10px}.scene-structure-editor-card{display:grid;gap:10px;border:1px solid var(--plotline-line);border-radius:8px;background:rgba(47,111,99,.04);padding:12px}.scene-structure-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.scene-structure-card-header h4{margin:0;font-size:1rem}.scene-structure-card-header p,.scene-structure-editor-card p{margin:2px 0 0}.scene-structure-marker{flex:0 0 auto;border-radius:999px;background:var(--plot-colour,var(--plotline-accent));padding:3px 8px;color:#fff;font-size:.78rem;font-weight:800}.scene-structure-action-row{display:flex;justify-content:flex-end;gap:8px}.scene-structure-dependency-columns{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.scene-structure-inline-check{display:inline-flex;align-items:center;align-self:end;gap:6px;margin:0;color:var(--plotline-muted);font-size:.82rem;font-weight:800;white-space:nowrap}.scene-inspector-v2-timeline .scene-inspector-v2-health{grid-template-columns:repeat(2,minmax(0,1fr))}.scene-inspector-v2-timeline .scene-inspector-v2-card{padding:14px}.scene-inspector-v2-timeline .scene-inspector-v2-card-header,.scene-inspector-v2-timeline .scene-inspector-v2-list li{align-items:stretch;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-counts,.scene-inspector-v2-timeline .scene-inspector-v2-facts,.scene-inspector-v2-timeline .scene-inspector-v2-metrics{grid-template-columns:1fr}.scene-inspector-v2-timeline .scene-inspector-v2-metrics{grid-template-columns:1fr}.scene-inspector-v2-timeline .scene-inspector-v2-metric-track{height:7px}.scene-inspector-v2-timeline .scene-inspector-v2-metric-row{grid-template-columns:minmax(118px,150px) minmax(0,1fr) auto}@media (max-width:1100px){.scene-inspector-v2-edit.editor-overlay-open{grid-template-columns:minmax(0,1fr) 10px minmax(360px,min(var(--scene-editor-width),52%))}.scene-inspector-v2-grid,.scene-inspector-v2-health{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:1180px){.scene-inspector-v2-edit .scene-inspector-v2-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:720px){.scene-inspector-v2-counts,.scene-inspector-v2-facts,.scene-inspector-v2-grid,.scene-inspector-v2-health,.scene-inspector-v2-metrics{grid-template-columns:1fr}.scene-inspector-v2-card-header{flex-direction:column}.scene-inspector-editor-checks,.scene-inspector-editor-grid{grid-template-columns:1fr}.scene-writer-checklist-row{grid-template-columns:1fr;align-items:stretch}.scene-attachment-preview-row{grid-template-columns:1fr}.scene-structure-dependency-columns{grid-template-columns:1fr}}.floor-plan-toolbar-floor-group{flex:1 1 420px;min-width:min(100%,320px)}.floor-plan-active-floor{display:grid;gap:2px}.floor-plan-toolbar-control-group{flex:0 1 auto}.floor-plan-toolbar-action-group{flex:1 1 360px;justify-content:flex-end}.floor-plan-occupancy-scene-row{border-top:1px solid rgba(47,111,99,.12);padding-top:9px}.floor-plan-occupancy-scene-row[hidden]{display:none}.floor-plan-occupancy-scene-row .floor-plan-reference-control{flex:1 1 320px;min-width:min(100%,320px)}.floor-plan-occupancy-scene-row .form-select{width:100%}.floor-plan-occupancy-warning-panel{background:rgba(47,111,99,.05);border:1px solid rgba(47,111,99,.16);border-radius:8px;color:var(--plotline-ink,#1e252b);flex:1 1 100%;font-size:.82rem;padding:.55rem .7rem}.floor-plan-occupancy-warning-panel strong{display:block;font-size:.78rem;margin-bottom:.25rem;text-transform:uppercase}.floor-plan-occupancy-warning-panel p,.floor-plan-occupancy-warning-panel ul{margin:0}.floor-plan-occupancy-warning-panel ul{display:grid;gap:.25rem;list-style:none;padding:0}.floor-plan-occupancy-warning,.floor-plan-occupancy-warning-empty{border-radius:6px;font-weight:700;padding:.32rem .45rem}.floor-plan-occupancy-warning-empty{background:rgba(47,111,99,.08);color:var(--plotline-accent-dark,#22534a)}.floor-plan-occupancy-warning--warning{background:rgba(251,236,211,.78);color:#7b4b12}.floor-plan-occupancy-warning--info{background:rgba(233,243,248,.86);color:#245b78}.floor-plan-occupancy-warning-empty[hidden],.floor-plan-occupancy-warning[hidden]{display:none}.floor-plan-editor-toolbar .muted{display:block;font-size:.76rem;line-height:1.1}.floor-plan-reference-control,.floor-plan-toolbar-check{align-items:center;color:var(--muted-color,#6b756f);display:inline-flex;font-size:.82rem;font-weight:700;gap:6px}.floor-plan-reference-control{align-items:flex-start;flex-direction:column;gap:2px}.floor-plan-reference-control .form-select{min-width:180px}.floor-plan-save-status{border:1px solid rgba(47,111,99,.2);border-radius:999px;color:var(--plotline-accent-dark,#22534a);background:rgba(47,111,99,.08);font-size:.78rem;font-weight:800;padding:4px 9px}.floor-plan-save-status[data-save-state=dirty]{border-color:rgba(184,118,43,.32);color:#7b4b12;background:rgba(251,236,211,.72)}.floor-plan-save-status[data-save-state=saving]{border-color:rgba(51,117,155,.3);color:#245b78;background:rgba(233,243,248,.82)}.floor-plan-save-status[data-save-state=failed]{border-color:rgba(163,61,61,.32);color:#8a3434;background:rgba(255,232,232,.9)}.floor-plan-floor{display:none}.floor-plan-floor.active{display:block}.floor-plan-stage{min-width:0}.floor-plan-grid-wrap{max-width:100%;max-height:calc(100vh - 250px);min-height:min(58vh,520px);overflow:auto;padding-bottom:8px}.floor-plan-grid{--cell-size:34px;background:linear-gradient(to right,rgba(93,111,101,.18) 1px,transparent 1px),linear-gradient(to bottom,rgba(93,111,101,.18) 1px,transparent 1px),var(--panel-bg,#fff);background-size:var(--cell-size) var(--cell-size),var(--cell-size) var(--cell-size),auto;border:1px solid var(--border-color,#d8ded9);border-radius:8px;height:calc(var(--grid-height) * var(--cell-size));min-width:calc(var(--grid-width) * var(--cell-size));position:relative;width:calc(var(--grid-width) * var(--cell-size))}.floor-plan-coordinate-label{color:rgba(33,61,55,.42);font-size:.62rem;font-weight:800;line-height:1;pointer-events:none;position:absolute;text-shadow:0 1px 0 rgba(255,255,255,.7);user-select:none;z-index:5}.floor-plan-coordinate-label--column{left:calc(var(--coord-x) * var(--cell-size) + 4px);top:3px}.floor-plan-coordinate-label--row{left:4px;top:calc(var(--coord-y) * var(--cell-size) + 4px)}.floor-plan-reference-overlay{inset:0;pointer-events:none;position:absolute;z-index:1}.floor-plan-reference-block{align-items:center;background:rgba(47,111,99,.08);border:1px dashed rgba(47,111,99,.34);border-radius:2px;color:rgba(27,55,49,.46);display:flex;font-size:.62rem;font-weight:800;height:calc(var(--h) * var(--cell-size));justify-content:center;left:calc(var(--x) * var(--cell-size));line-height:1.05;overflow:hidden;padding:3px;position:absolute;text-align:center;top:calc(var(--y) * var(--cell-size));width:calc(var(--w) * var(--cell-size))}.floor-plan-reference-warning{background:rgba(251,236,211,.92);border:1px solid rgba(184,118,43,.34);border-radius:999px;color:#7b4b12;font-size:.76rem;font-weight:800;left:10px;padding:4px 10px;pointer-events:none;position:absolute;top:10px;z-index:6}.floor-plan-background-image{height:auto;left:0;max-width:none;opacity:var(--bg-opacity, .35);pointer-events:none;position:absolute;top:0;transform:translate(var(--bg-offset-x,0),var(--bg-offset-y,0)) scale(var(--bg-scale,1));transform-origin:top left;user-select:none;width:100%;z-index:0}.floor-plan-background-image.is-locked{pointer-events:none}.floor-plan-block{align-items:center;--floor-plan-wall-color:rgba(44, 84, 75, .55);border:2px solid transparent;border-radius:2px;color:#12332c;cursor:grab;display:flex;font-size:.72rem;font-weight:700;height:calc(var(--h) * var(--cell-size));justify-content:center;left:calc(var(--x) * var(--cell-size));line-height:1.08;overflow:hidden;padding:4px;position:absolute;text-align:center;top:calc(var(--y) * var(--cell-size));touch-action:none;width:calc(var(--w) * var(--cell-size));z-index:2}.floor-plan-wall-segment{background:var(--floor-plan-wall-color);pointer-events:none;position:absolute;z-index:2}.floor-plan-wall-segment--north,.floor-plan-wall-segment--south{height:2px;left:var(--wall-start);width:var(--wall-length)}.floor-plan-wall-segment--north{top:0}.floor-plan-wall-segment--south{bottom:0}.floor-plan-wall-segment--east,.floor-plan-wall-segment--west{height:var(--wall-length);top:var(--wall-start);width:2px}.floor-plan-wall-segment--east{right:0}.floor-plan-wall-segment--west{left:0}.floor-plan-block-label{display:-webkit-box;max-width:100%;overflow:hidden;overflow-wrap:normal;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:1}.floor-plan-block[style*="--h:2"] .floor-plan-block-label,.floor-plan-block[style*="--h:3"] .floor-plan-block-label,.floor-plan-block[style*="--h:4"] .floor-plan-block-label,.floor-plan-block[style*="--h:5"] .floor-plan-block-label,.floor-plan-block[style*="--h:6"] .floor-plan-block-label,.floor-plan-block[style*="--h:7"] .floor-plan-block-label,.floor-plan-block[style*="--h:8"] .floor-plan-block-label{-webkit-line-clamp:2}.floor-plan-block.selected{box-shadow:0 0 0 3px rgba(47,111,99,.28);outline:2px solid var(--bs-primary,#2f6f63);z-index:3}.floor-plan-block.overlap{border-color:#b45544;box-shadow:inset 0 0 0 2px rgba(180,85,68,.18)}.floor-plan-block.is-hidden-location{background-image:repeating-linear-gradient(135deg,rgba(18,51,44,.08) 0,rgba(18,51,44,.08) 3px,transparent 3px,transparent 9px);box-shadow:inset 0 0 0 1px rgba(43,54,49,.18)}.floor-plan-block.is-hidden-location.selected{box-shadow:inset 0 0 0 1px rgba(43,54,49,.18),0 0 0 3px rgba(47,111,99,.28)}.floor-plan-block.is-hidden-location.overlap{box-shadow:inset 0 0 0 2px rgba(180,85,68,.18),inset 0 0 0 1px rgba(43,54,49,.18)}.floor-plan-secret-route{border-top:2px dashed rgba(69,55,42,.58);height:0;left:calc(var(--route-x,0) * var(--cell-size));opacity:.72;pointer-events:none;position:absolute;top:calc(var(--route-y,0) * var(--cell-size));transform:rotate(var(--route-angle,0));transform-origin:0 50%;width:calc(var(--route-length,0) * var(--cell-size));z-index:3}.floor-plan-secret-route::after{background:rgba(255,250,242,.9);border:1px solid rgba(69,55,42,.5);border-radius:50%;content:"";height:7px;left:50%;position:absolute;top:-5px;transform:translateX(-50%);width:7px}.floor-plan-transition-marker{align-items:center;--transition-marker-ink:#12332c;--transition-marker-window:#246f9f;--transition-marker-blocked:#9b342b;background:rgba(255,250,242,.98);border:1px solid rgba(47,111,99,.55);border-radius:50%;box-shadow:0 2px 6px rgba(31,37,34,.16);color:var(--transition-marker-ink);display:flex;font-size:.72rem;font-weight:900;height:21px;justify-content:center;left:calc(var(--transition-x,0) * var(--cell-size));line-height:1;pointer-events:none;position:absolute;top:calc(var(--transition-y,0) * var(--cell-size));transform:translate(-50%,-50%);width:21px;z-index:4}.floor-plan-transition-marker svg{display:block;height:21px;overflow:visible;width:21px}.floor-plan-transition-marker.is-vertical svg{transform:rotate(90deg)}.floor-plan-transition-marker .marker-arc,.floor-plan-transition-marker .marker-blocked,.floor-plan-transition-marker .marker-line,.floor-plan-transition-marker .marker-window{fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.7}.floor-plan-transition-marker .marker-arc{stroke-width:1.35}.floor-plan-transition-marker .marker-window{stroke:var(--transition-marker-window)}.floor-plan-transition-marker .marker-dotted{opacity:.72;stroke-dasharray:1.4 2}.floor-plan-transition-marker .marker-blocked{stroke:var(--transition-marker-blocked);stroke-width:1.8}.floor-plan-transition-marker .marker-strong{stroke-width:2}.floor-plan-transition-marker .marker-track{opacity:.72}.floor-plan-transition-marker--window{background:rgba(239,249,255,.98);border-color:rgba(36,111,159,.48)}.floor-plan-transition-marker--sliding-door{background:rgba(248,252,249,.98);border-color:rgba(47,111,99,.58)}.floor-plan-transition-marker--french-door{background:rgba(255,252,246,.98);border-color:rgba(119,86,45,.5)}.floor-plan-transition-marker--secret-door{background:rgba(255,250,242,.88);border-style:dashed}.floor-plan-transition-marker--ladder{background:rgba(246,248,245,.98);border-color:rgba(77,91,67,.55)}.floor-plan-transition-marker--blocked-door{background:rgba(255,244,241,.98);border-color:rgba(155,52,43,.52)}.floor-plan-transition-marker--exterior-door{border-width:2px}.floor-plan-transition-marker.is-shared-edge{background:rgba(255,255,255,.98);border-color:rgba(47,111,99,.72)}.floor-plan-transition-marker--window.is-shared-edge{background:rgba(239,249,255,.98);border-color:rgba(36,111,159,.58)}.floor-plan-transition-marker--blocked-door.is-shared-edge{background:rgba(255,244,241,.98);border-color:rgba(155,52,43,.6)}.visual-card-heading{align-items:flex-start;display:flex;gap:12px}.visual-card-heading>div{min-width:0}.visual-avatar{align-items:center;aspect-ratio:1;background:linear-gradient(135deg,rgba(47,111,99,.16),rgba(212,154,98,.16));border:1px solid rgba(47,111,99,.22);border-radius:999px;color:var(--plotline-accent-dark,#22534a);display:inline-flex;flex:0 0 auto;font-weight:900;justify-content:center;letter-spacing:.02em;overflow:hidden;text-transform:uppercase}.visual-avatar img{height:100%;object-fit:cover;width:100%}.visual-avatar--sm{font-size:.72rem;width:32px}.visual-avatar--md{font-size:.9rem;width:48px}.visual-avatar--lg{font-size:1.3rem;width:96px}.visual-avatar--xl{font-size:1.6rem;width:128px}.visual-image-editor{align-items:center;background:rgba(47,111,99,.05);border:1px solid rgba(47,111,99,.14);border-radius:8px;display:flex;gap:18px;padding:14px}.visual-image-editor__controls{flex:1 1 auto;min-width:220px}.floor-plan-block--room{background:#d9eee7}.floor-plan-block--corridor{background:#e7e2f4}.floor-plan-block--openspace{background:#e5efd4}.floor-plan-block--exterior{background:#d9ecf3}.floor-plan-block--other{background:#ece9e1}.floor-plan-resize-handle{border-bottom:10px solid rgba(18,51,44,.45);border-left:10px solid transparent;bottom:4px;height:0;position:absolute;right:4px;width:0}.floor-plan-side-panel{align-self:start;position:sticky;top:82px}.floor-plan-side-panel h2{font-size:1.05rem;margin-bottom:8px}.floor-plan-side-panel h3{font-size:.92rem;margin:0 0 8px}.floor-plan-toolbox{background:var(--panel-bg,#fff);border:1px solid var(--border-color,#d8ded9);border-radius:8px;display:grid;grid-template-rows:auto minmax(0,1fr);max-height:calc(100vh - 250px);min-height:min(58vh,520px);overflow:hidden}.floor-plan-toolbox-tabs{border-bottom:1px solid var(--border-color,#d8ded9);display:flex;flex-wrap:wrap;gap:0}.floor-plan-toolbox-tab{background:0 0;border:0;border-right:1px solid var(--border-color,#d8ded9);border-bottom:1px solid var(--border-color,#d8ded9);color:inherit;flex:1 1 118px;font-size:.82rem;font-weight:800;min-width:112px;padding:10px 8px}.floor-plan-toolbox-tab.active:last-child,.floor-plan-toolbox-tab:last-child{border-right:0}.floor-plan-toolbox-tab.active{background:rgba(47,111,99,.1);border-bottom-color:var(--plotline-accent,#2f6f63);color:var(--plotline-accent-dark,#22534a)}.floor-plan-toolbox-body{min-height:0;overflow:auto}.floor-plan-tool-card{background:var(--panel-bg,#fff);border:1px solid var(--border-color,#d8ded9);border-radius:8px;padding:14px}.floor-plan-toolbox .floor-plan-tool-card{background:0 0;border:0;border-radius:0}.floor-plan-tool-card[hidden]{display:none}.floor-plan-tool-card p{margin-bottom:10px}.floor-plan-tool-subsection{border-top:1px solid var(--border-color,#d8ded9);margin-top:12px;padding-top:12px}.floor-plan-tool-subsection:first-of-type{border-top:0;margin-top:0;padding-top:0}.floor-plan-background-file{border:1px solid rgba(47,111,99,.16);border-radius:6px;font-size:.86rem;padding:8px 10px}.floor-plan-background-range{align-items:center;display:grid;gap:10px;grid-template-columns:minmax(0,1fr) 44px}.floor-plan-background-range span{color:var(--muted-text,#5d6f65);font-size:.8rem;font-variant-numeric:tabular-nums;text-align:right}.floor-plan-transition-list{display:grid;gap:8px}.floor-plan-transition-item{border:1px solid rgba(47,111,99,.14);border-radius:6px;display:grid;gap:8px;padding:8px}.floor-plan-transition-item span,.floor-plan-transition-item strong{display:block;font-size:.84rem}.floor-plan-transition-item span{color:var(--muted-text,#5d6f65)}.floor-plan-editor--occupancy .floor-plan-block{cursor:default;touch-action:auto}.floor-plan-editor--occupancy .floor-plan-resize-handle{display:none}.floor-plan-editor--occupancy .floor-plan-side-panel{display:none}.floor-plan-occupancy-tray{position:absolute;z-index:14;height:calc(var(--h) * var(--cell-size));left:calc(var(--x) * var(--cell-size));top:calc(var(--y) * var(--cell-size));width:calc(var(--w) * var(--cell-size));display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:.18rem;padding:0 0 .25rem;pointer-events:auto}.floor-plan-occupancy-tray[hidden]{display:none}.floor-plan-occupancy-token{display:grid;place-items:center;width:1.8rem;height:1.8rem;overflow:hidden;border:2px solid #fff;border-radius:999px;color:#fff;background:var(--plotline-accent);box-shadow:0 4px 12px rgba(30,37,43,.18);font-size:.68rem;font-weight:800}.floor-plan-occupancy-token img{width:100%;height:100%;object-fit:cover}.floor-plan-occupancy-token--asset{width:1.45rem;height:1.45rem;background:#805c15;font-size:.58rem}.floor-plan-occupancy-more{border-radius:999px;padding:.15rem .36rem;color:var(--plotline-ink);background:rgba(255,255,255,.92);box-shadow:0 4px 12px rgba(30,37,43,.12);font-size:.72rem;font-weight:800}.floor-plan-occupancy-message{align-self:start;background:rgba(255,255,255,.94);border:1px solid rgba(47,111,99,.18);border-radius:8px;box-shadow:0 6px 16px rgba(30,37,43,.08);color:var(--muted-color,#6b756f);font-size:.82rem;font-weight:700;grid-column:1/-1;grid-row:1;justify-self:center;margin-top:.55rem;max-width:min(92%,520px);padding:.45rem .7rem;position:relative;z-index:16}.floor-plan-occupancy-message[hidden]{display:none}.floor-plan-transition-accordion .accordion-item{background:0 0;border-color:var(--border-color,#d8ded9)}.floor-plan-transition-accordion .accordion-button{background:rgba(47,111,99,.06);color:inherit;font-size:.88rem;font-weight:800;padding:10px 12px}.floor-plan-transition-accordion .accordion-button:not(.collapsed){background:rgba(47,111,99,.12);color:var(--plotline-accent-dark,#22534a);box-shadow:inset 0 -1px 0 var(--border-color,#d8ded9)}.floor-plan-transition-accordion .accordion-body{padding:12px}.floor-plan-checkbox{align-items:center;display:inline-flex;gap:6px;font-weight:700;margin-bottom:4px}.floor-plan-choice-row{display:grid;gap:4px;margin-bottom:10px}.floor-plan-choice-row label{align-items:center;display:flex;gap:6px;font-size:.88rem}.floor-plan-overlap-warning{background:rgba(180,85,68,.12);border:1px solid rgba(180,85,68,.35);border-radius:6px;color:#8f3f31;margin-bottom:10px;padding:8px 10px}.dark .floor-plan-grid,[data-bs-theme=dark] .floor-plan-grid{background:linear-gradient(to right,rgba(214,224,218,.12) 1px,transparent 1px),linear-gradient(to bottom,rgba(214,224,218,.12) 1px,transparent 1px),#15201d;background-size:var(--cell-size) var(--cell-size),var(--cell-size) var(--cell-size),auto}.dark .floor-plan-editor-toolbar,.dark .floor-plan-tool-card,.dark .floor-plan-toolbox,[data-bs-theme=dark] .floor-plan-editor-toolbar,[data-bs-theme=dark] .floor-plan-tool-card,[data-bs-theme=dark] .floor-plan-toolbox{background:var(--panel-bg,#1f2522)}.dark .floor-plan-toolbox .floor-plan-tool-card,[data-bs-theme=dark] .floor-plan-toolbox .floor-plan-tool-card{background:0 0}.dark .floor-plan-toolbox-tab.active,[data-bs-theme=dark] .floor-plan-toolbox-tab.active{background:rgba(212,154,98,.16);color:var(--plotline-accent-dark,#f0c99d)}.dark .floor-plan-block,[data-bs-theme=dark] .floor-plan-block{--floor-plan-wall-color:rgba(212, 154, 98, .6);color:#f1f6f3}.dark .floor-plan-block.is-hidden-location,[data-bs-theme=dark] .floor-plan-block.is-hidden-location{background-image:repeating-linear-gradient(135deg,rgba(244,234,220,.09) 0,rgba(244,234,220,.09) 3px,transparent 3px,transparent 9px);box-shadow:inset 0 0 0 1px rgba(244,234,220,.2)}.dark .floor-plan-secret-route,[data-bs-theme=dark] .floor-plan-secret-route{border-top-color:rgba(244,204,160,.58);opacity:.76}.dark .floor-plan-secret-route::after,[data-bs-theme=dark] .floor-plan-secret-route::after{background:rgba(42,35,30,.95);border-color:rgba(244,204,160,.55)}.dark .floor-plan-coordinate-label,[data-bs-theme=dark] .floor-plan-coordinate-label{color:rgba(244,234,220,.46);text-shadow:0 1px 0 rgba(0,0,0,.55)}.dark .floor-plan-reference-block,[data-bs-theme=dark] .floor-plan-reference-block{background:rgba(131,199,242,.08);border-color:rgba(131,199,242,.32);color:rgba(244,234,220,.46)}.dark .floor-plan-reference-warning,[data-bs-theme=dark] .floor-plan-reference-warning{background:rgba(84,57,25,.92);border-color:rgba(244,177,100,.32);color:#ffd9a5}.dark .floor-plan-transition-marker,[data-bs-theme=dark] .floor-plan-transition-marker{--transition-marker-ink:#f4eadc;--transition-marker-window:#83c7f2;--transition-marker-blocked:#f08a78;background:rgba(42,35,30,.98);border-color:rgba(212,154,98,.6)}.dark .floor-plan-transition-marker.is-shared-edge,[data-bs-theme=dark] .floor-plan-transition-marker.is-shared-edge{background:rgba(48,39,32,.98);border-color:rgba(212,154,98,.78)}.dark .floor-plan-transition-marker--window,.dark .floor-plan-transition-marker--window.is-shared-edge,[data-bs-theme=dark] .floor-plan-transition-marker--window,[data-bs-theme=dark] .floor-plan-transition-marker--window.is-shared-edge{background:rgba(24,45,58,.98);border-color:rgba(131,199,242,.66)}.dark .floor-plan-transition-marker--french-door,.dark .floor-plan-transition-marker--ladder,.dark .floor-plan-transition-marker--sliding-door,[data-bs-theme=dark] .floor-plan-transition-marker--french-door,[data-bs-theme=dark] .floor-plan-transition-marker--ladder,[data-bs-theme=dark] .floor-plan-transition-marker--sliding-door{background:rgba(39,43,37,.98);border-color:rgba(212,154,98,.58)}.dark .floor-plan-transition-marker--blocked-door,.dark .floor-plan-transition-marker--blocked-door.is-shared-edge,[data-bs-theme=dark] .floor-plan-transition-marker--blocked-door,[data-bs-theme=dark] .floor-plan-transition-marker--blocked-door.is-shared-edge{background:rgba(58,33,28,.98);border-color:rgba(240,138,120,.66)}.dark .visual-avatar,[data-bs-theme=dark] .visual-avatar{background:linear-gradient(135deg,rgba(131,199,242,.14),rgba(212,154,98,.18));border-color:rgba(244,234,220,.18);color:#f4eadc}.dark .visual-image-editor,[data-bs-theme=dark] .visual-image-editor{background:rgba(244,234,220,.04);border-color:rgba(244,234,220,.12)}.dark .floor-plan-transition-item,[data-bs-theme=dark] .floor-plan-transition-item{border-color:rgba(212,154,98,.22)}.dark .floor-plan-occupancy-token,[data-bs-theme=dark] .floor-plan-occupancy-token{border-color:#1f2630;box-shadow:0 4px 12px rgba(0,0,0,.28)}.dark .floor-plan-occupancy-more,[data-bs-theme=dark] .floor-plan-occupancy-more{color:#f1e7dd;background:rgba(31,38,48,.92)}.dark .floor-plan-occupancy-message,[data-bs-theme=dark] .floor-plan-occupancy-message{background:rgba(31,38,48,.94);border-color:rgba(212,154,98,.24);color:#d9c8b8}.dark .floor-plan-occupancy-warning-panel,[data-bs-theme=dark] .floor-plan-occupancy-warning-panel{background:rgba(244,234,220,.04);border-color:rgba(212,154,98,.2);color:#f1e7dd}.dark .floor-plan-occupancy-warning-empty,[data-bs-theme=dark] .floor-plan-occupancy-warning-empty{background:rgba(47,111,99,.18);color:#b8e2d7}.dark .floor-plan-occupancy-warning--warning,[data-bs-theme=dark] .floor-plan-occupancy-warning--warning{background:rgba(84,57,25,.92);color:#ffd9a5}.dark .floor-plan-occupancy-warning--info,[data-bs-theme=dark] .floor-plan-occupancy-warning--info{background:rgba(24,45,58,.92);color:#b9dcf3}.dark .floor-plan-transition-accordion .accordion-item,[data-bs-theme=dark] .floor-plan-transition-accordion .accordion-item{border-color:rgba(212,154,98,.22)}.dark .floor-plan-transition-accordion .accordion-button,[data-bs-theme=dark] .floor-plan-transition-accordion .accordion-button{background:rgba(212,154,98,.08);color:#f4eadc}.dark .floor-plan-transition-accordion .accordion-button:not(.collapsed),[data-bs-theme=dark] .floor-plan-transition-accordion .accordion-button:not(.collapsed){background:rgba(212,154,98,.16);color:var(--plotline-accent-dark,#f0c99d);box-shadow:inset 0 -1px 0 rgba(212,154,98,.22)}.dark .floor-plan-block--room,[data-bs-theme=dark] .floor-plan-block--room{background:#29584f}.dark .floor-plan-block--corridor,[data-bs-theme=dark] .floor-plan-block--corridor{background:#514876}.dark .floor-plan-block--openspace,[data-bs-theme=dark] .floor-plan-block--openspace{background:#4f6133}.dark .floor-plan-block--exterior,[data-bs-theme=dark] .floor-plan-block--exterior{background:#315d6f}.dark .floor-plan-block--other,[data-bs-theme=dark] .floor-plan-block--other{background:#5b564c}@media (max-width:1100px){.floor-plan-editor-toolbar,.floor-plan-layout{grid-template-columns:1fr}.floor-plan-grid-wrap{max-height:62vh}.floor-plan-side-panel{position:static}.floor-plan-toolbox{max-height:none}} \ No newline at end of file diff --git a/PlotLine/wwwroot/js/site.js b/PlotLine/wwwroot/js/site.js index 3bd37fe..a254388 100644 --- a/PlotLine/wwwroot/js/site.js +++ b/PlotLine/wwwroot/js/site.js @@ -743,7 +743,11 @@ }; const resizeMetricCharts = () => { window.requestAnimationFrame(() => { - metricCharts.forEach(({ chart, root }) => { + metricCharts.forEach(({ chart, root, timelineLayout }) => { + if (timelineLayout) { + timelineLayout.schedule(true); + return; + } syncMetricCanvasSize(root); chart.resize(); }); @@ -769,7 +773,7 @@ const chapterStarts = []; scenes.forEach((scene, index) => { - if (!index || scene.chapterLabel !== scenes[index - 1].chapterLabel) { + if (!index || scene.chapterLabel !== scenes[index - 1].chapterLabel || scene.bookTitle !== scenes[index - 1].bookTitle) { chapterStarts.push({ scene, index }); } }); @@ -778,7 +782,8 @@ realChapterStarts.forEach((entry, chapterIndex) => { const { scene, index } = entry; - const x = scales.x.getPixelForValue(index + 0.5); + const x = scales.x.getPixelForValue(chart.data.datasets[0].data[index].x); + if (!Number.isFinite(x) || x < chartArea.left || x > chartArea.right) return; ctx.beginPath(); ctx.moveTo(x, chartArea.top); ctx.lineTo(x, chartArea.bottom); @@ -800,6 +805,18 @@ if (window.Chart) { Chart.register(chapterGuidePlugin); + // A timeline unit is one CSS pixel, independent of Chart.js axis/padding layout. + // The canvas is a moving window onto the existing scrollable scene layout. + class TimelinePositionScale extends Chart.LinearScale { + static id = "timelinePosition"; + getPixelForValue(value) { + return Number(value) - (this.chart.$timelineViewportLeft || 0); + } + getValueForPixel(pixel) { + return pixel + (this.chart.$timelineViewportLeft || 0); + } + } + Chart.register(TimelinePositionScale); } chartRoots.forEach((root) => { @@ -827,6 +844,19 @@ return; } + const timelineShell = root.closest(".timeline-shell"); + const sceneRow = timelineShell?.querySelector(".timeline-series-row"); + const frame = root.querySelector(".metric-chart-frame"); + const sceneElements = new Map(Array.from(sceneRow?.querySelectorAll(".timeline-scene-card[data-scene-id]") || [], + (element) => [Number(element.dataset.sceneId), element])); + const viewport = timelineShell && sceneRow && sceneElements.size ? document.createElement("div") : null; + let timelineLayout = null; + let hasSceneGeometry = false; + if (viewport) { + viewport.className = "metric-timeline-viewport"; + canvas.before(viewport); + viewport.append(canvas); + } const defaultMetrics = new Set(payload.defaultMetrics?.length ? payload.defaultMetrics : globalDefaultMetrics); const columnCount = payload.scenes.length; const tickLabelInterval = columnCount > 80 ? 10 : columnCount > 40 ? 5 : columnCount > 24 ? 4 : columnCount > 14 ? 2 : 1; @@ -922,6 +952,7 @@ data: { datasets }, options: { responsive: true, + animation: viewport ? false : undefined, maintainAspectRatio: false, interaction: { mode: "nearest", intersect: false }, scales: { @@ -941,7 +972,7 @@ autoSkip: false, maxTicksLimit: 16, callback(value) { - const columnIndex = Math.floor(Number(value)); + const columnIndex = datasets[0].data.findIndex((point) => point.x === Number(value)); if (columnIndex < 0 || columnIndex >= columnCount) { return ""; } @@ -954,7 +985,9 @@ } }, afterBuildTicks(scale) { - scale.ticks = payload.scenes.map((_, columnIndex) => ({ value: columnIndex + 0.5 })); + scale.ticks = datasets[0].data + .filter((point) => Number.isFinite(point.x) && (!hasSceneGeometry || (point.x >= scale.min && point.x <= scale.max))) + .map((point) => ({ value: point.x })); }, grid: { display: false } } @@ -965,7 +998,7 @@ tooltip: { callbacks: { title(items) { - const columnIndex = Math.floor(items[0].parsed.x); + const columnIndex = items[0].dataIndex; const scene = payload.scenes[columnIndex]; if (scene.isPlaceholder) { return scene.sceneTitle || "No scene"; @@ -976,7 +1009,7 @@ return `${item.dataset.label}: ${item.formattedValue}`; }, afterBody(items) { - const columnIndex = Math.floor(items[0].parsed.x); + const columnIndex = items[0].dataIndex; const scene = payload.scenes[columnIndex]; const lines = []; if (scene.characterPresence) { @@ -1142,8 +1175,7 @@ return; } - const point = chart.data.datasets[points[0].datasetIndex]?.data?.[points[0].index]; - const columnIndex = point ? Math.floor(point.x) : points[0].index; + const columnIndex = points[0].index; const scene = payload.scenes[columnIndex]; if (scene?.timelineUrl) { window.PlotLineTimelineScroll?.save(); @@ -1151,17 +1183,78 @@ } }); - metricCharts.push({ chart, root }); - const resizeObserver = window.ResizeObserver - ? new ResizeObserver(() => { + if (viewport) { + let pendingFrame = 0; + let needsMeasurement = false; + const refresh = () => { + pendingFrame = 0; + if (!root.getBoundingClientRect().width) return; + if (needsMeasurement) { + needsMeasurement = false; + const rowRect = sceneRow.getBoundingClientRect(); + if (rowRect.width) { + const origin = frame.getBoundingClientRect().left; + const centres = new Map(); + let width = rowRect.right - origin; + sceneElements.forEach((element, sceneId) => { + const rect = element.getBoundingClientRect(); + if (rect.width) { + centres.set(sceneId, rect.left + rect.width / 2 - origin); + width = Math.max(width, rect.right - origin); + } + }); + if (centres.size) { + root.style.setProperty("--metric-layout-width", `${width}px`); + frame.style.width = `${width}px`; + frame.classList.add("metric-timeline-measured"); + datasets.forEach((dataset) => dataset.data.forEach((point) => { + // Missing/placeholder scenes have no rendered centre and no plotted point. + point.x = centres.get(point.sceneId) ?? NaN; + })); + hasSceneGeometry = true; + chart.options.scales.x.type = "timelinePosition"; + } + } + } + if (hasSceneGeometry) { + // Bound the bitmap to the viewport, never compress the timeline to a canvas limit. + viewport.style.width = `${Math.min(timelineShell.clientWidth, frame.clientWidth, + Math.floor(maxMetricCanvasDimension / Math.max(window.devicePixelRatio || 1, 1)))}px`; + chart.$timelineViewportLeft = canvas.getBoundingClientRect().left - frame.getBoundingClientRect().left; + chart.options.scales.x.min = chart.$timelineViewportLeft; + chart.options.scales.x.max = chart.$timelineViewportLeft + viewport.clientWidth; + } else { syncMetricCanvasSize(root); - chart.resize(); - }) - : null; - if (resizeObserver) { - resizeObserver.observe(root); - resizeObserver.observe(root.querySelector(".metric-chart-frame") || root); + } + chart.resize(); + chart.update("none"); + }; + const schedule = (measure = false) => { + needsMeasurement ||= measure; + if (!pendingFrame) pendingFrame = window.requestAnimationFrame(refresh); + }; + timelineLayout = { schedule }; + // Scrolling only moves the viewport; scene measurements are cached until layout changes. + timelineShell.addEventListener("scroll", () => schedule(), { passive: true }); + window.addEventListener("resize", () => schedule(true)); + const observer = window.ResizeObserver ? new ResizeObserver(() => schedule(true)) : null; + observer?.observe(timelineShell); + observer?.observe(sceneRow); + observer?.observe(root); + sceneRow.querySelectorAll(".timeline-book, .timeline-book-title, .timeline-chapter, .timeline-scenes, .timeline-scene-card") + .forEach((element) => observer?.observe(element)); + schedule(true); + } else { + const resizeObserver = window.ResizeObserver + ? new ResizeObserver(() => { + syncMetricCanvasSize(root); + chart.resize(); + }) + : null; + resizeObserver?.observe(root); + resizeObserver?.observe(frame || root); } + metricCharts.push({ chart, root, timelineLayout }); }); })(); @@ -1576,7 +1669,7 @@ densitySelect.value = nextValue; } localStorage.setItem(densityKey, nextValue); - window.requestAnimationFrame(renderPlotLineSvg); + window.dispatchEvent(new Event("plotline:timeline-layout-changed")); }; const applyZoom = (value) => { @@ -1586,7 +1679,7 @@ zoomSelect.value = nextValue; } localStorage.setItem(zoomKey, nextValue); - window.requestAnimationFrame(renderPlotLineSvg); + window.dispatchEvent(new Event("plotline:timeline-layout-changed")); }; const getScene = (sceneId) => root.querySelector(`[data-scene-id='${CSS.escape(String(sceneId))}']`); diff --git a/PlotLine/wwwroot/js/site.min.js b/PlotLine/wwwroot/js/site.min.js index c843786..15a60b1 100644 --- a/PlotLine/wwwroot/js/site.min.js +++ b/PlotLine/wwwroot/js/site.min.js @@ -1 +1 @@ -(()=>{const e="plotline.theme",t=document.querySelectorAll("[data-theme-choice]"),n=n=>{const a="dark"===n?"dark":"light";document.documentElement.dataset.theme=a,document.documentElement.dataset.bsTheme=a,(t=>{try{localStorage.setItem(e,t)}catch{}})(a),t.forEach(e=>{const t=e.dataset.themeChoice===a;e.classList.toggle("active",t),e.setAttribute("aria-pressed",String(t))})};t.forEach(e=>{e.addEventListener("click",()=>n(e.dataset.themeChoice))}),n((()=>{try{return localStorage.getItem(e)}catch{return null}})()||"light")})(),(()=>{const e=document.querySelector("[data-trial-banner]");if(!e)return;const t=`plotline.trialBanner.dismissed.${e.dataset.trialBannerKey||"current"}`;try{if("true"===localStorage.getItem(t))return void(e.hidden=!0)}catch{}e.querySelector("[data-trial-banner-dismiss]")?.addEventListener("click",()=>{e.hidden=!0;try{localStorage.setItem(t,"true")}catch{}})})(),(()=>{const e="plotdirector:story-position-changed",t=(e,t)=>{const n=e?.position||e?.Position||e||{},a=(...e)=>{for(const t of e){const e=Number.parseInt(t||"",10);if(Number.isInteger(e)&&e>0)return e}return null};return{source:t||e?.source||e?.Source||"Navigation",projectId:a(n.projectId,n.ProjectId,e?.projectId,e?.ProjectId),bookId:a(n.bookId,n.BookId,e?.bookId,e?.BookId),chapterId:a(n.chapterId,n.ChapterId,e?.chapterId,e?.ChapterId),sceneId:a(n.sceneId,n.SceneId,e?.sceneId,e?.SceneId),canonicalUrl:e?.canonicalUrl||e?.CanonicalUrl||e?.sceneUrl||e?.SceneUrl||""}};window.PlotDirectorStoryPosition={eventName:e,normalise:t,publishChanged:(n,a)=>{const o=t(n,a);return o.projectId?(document.dispatchEvent(new CustomEvent(e,{bubbles:!0,detail:o})),o):o}}})(),(()=>{const e=document.querySelector("[data-word-companion-follow-toggle]");if(!e||!window.signalR)return;const t="plotdirector.followWordCompanion",n=["/pricing","/about","/contact","/privacy","/terms","/admin","/billing","/account","/login","/register","/feature-requests/admin","/featurerequests/admin","/manageaccount"];let a=null,o=null;const r=()=>{try{return"true"===localStorage.getItem(t)}catch{return!1}},i=t=>{e.setAttribute("aria-pressed",String(t)),e.classList.toggle("active",t),e.title=t?"PlotDirector will follow the current Word Companion scene.":"Enable this to let PlotDirector follow the current Word Companion scene."},s=(e,t)=>{if("string"!=typeof e||!e.startsWith(t))return"";try{const t=new URL(e,window.location.origin);return t.origin===window.location.origin?`${t.pathname}${t.search}${t.hash}`:""}catch{return""}},l=e=>{if(!r()||!(()=>{const e=window.location.pathname.toLowerCase();return!("/"===e||""===e||document.querySelector("[data-writing-mode]")||"/writing/context"===e||e.startsWith("/writing/context/")||"/writing/intent"===e||e.startsWith("/writing/intent/")||n.some(t=>e===t||e.startsWith(`${t}/`)))})()||!e)return;`${window.location.pathname}${window.location.search}${window.location.hash}`!==e&&window.location.assign(e)};i(r()),e.addEventListener("click",()=>{const e=!r();(e=>{try{localStorage.setItem(t,e?"true":"false")}catch{}})(e),i(e)});const c=(new signalR.HubConnectionBuilder).withUrl("/hubs/word-companion-follow").withAutomaticReconnect().build();c.on("wordCompanionSceneChanged",e=>{const t=(window.PlotDirectorStoryPosition?.publishChanged(e,"WordCompanion")||{sceneId:Number.parseInt(e?.sceneId||e?.SceneId||"",10)}).sceneId;if(!Number.isInteger(t)||t<=0||t===a)return;a=t;const n=s(e?.sceneUrl||e?.SceneUrl||"","/Scenes/Edit/");l(n)}),c.on("storyPositionChanged",e=>{window.PlotDirectorStoryPosition?.publishChanged(e,e?.source||e?.Source||"WordCompanion")}),c.on("wordCompanionCharactersCreated",e=>{const t=Number.parseInt(e?.projectId||e?.ProjectId||"",10);if(!Number.isInteger(t)||t<=0||t===o)return;o=t;const n=s(e?.charactersUrl||e?.CharactersUrl||"","/Characters");l(n)}),c.start().catch(e=>{console.debug("Word Companion follow connection unavailable.",e)})})(),(()=>{const e=document.getElementById("plotlineConfirmModal"),t=e&&window.bootstrap?new bootstrap.Modal(e):null,n=e?.querySelector("#plotlineConfirmModalTitle"),a=e?.querySelector("#plotlineConfirmModalMessage"),o=e?.querySelector("[data-confirm-submit]"),r=e?.querySelector("[data-delete-confirm-field]"),i=e?.querySelector("[data-delete-confirm-input]");let s=null,l=null;e?.addEventListener("hidden.bs.modal",()=>{s=null,l=null,i&&(i.value=""),r?.classList.add("d-none"),o?.removeAttribute("disabled")}),i?.addEventListener("input",()=>{"true"===s?.dataset.requireDeleteText&&o&&(o.disabled="DELETE"!==i.value.trim())}),o?.addEventListener("click",()=>{if(s){if("true"===s.dataset.requireDeleteText){const e=s.querySelector("[data-delete-confirm-target], [name='confirmationText']");e&&(e.value=i?.value.trim()||"")}s.dataset.confirmed="true",t?.hide(),s.requestSubmit&&l?s.requestSubmit(l):s.requestSubmit?s.requestSubmit():s.submit()}}),document.addEventListener("submit",c=>{const d=c.target;if(!(d instanceof HTMLFormElement)||"true"===d.dataset.confirmed||"true"===d.dataset.confirmSkip||"true"===d.dataset.noDeleteConfirm)return;const p=d.dataset.confirmMessage,u=c.submitter instanceof HTMLElement?c.submitter:d.querySelector("button[type='submit']"),h=u?.textContent||"",m=d.getAttribute("action")||"",g=/restore/i.test(h)||/\/restore\b/i.test(m),f=/delete forever/i.test(h)||/\/deleteforever\b/i.test(m),v=!g&&!f&&(/archive/i.test(h)||/\/archive\b/i.test(m)),y=!f&&/(delete|remove)/i.test(h);if(!(p||v||g||y||f))return;const w=p||(v?"Archive this item?\n\nThis will hide it from active lists and timelines, but the data will be kept and can be restored later.":g?"Restore this item?\n\nThis will return it to active lists and timelines where applicable.":f?"Permanently delete this item?\n\nThis cannot be undone. Any linked planning data may also be removed or become unavailable. Only continue if you are certain.":"Remove this item?\n\nThis removes the link or supporting record. Major story items are archived instead of permanently deleted.");if(!(t&&e&&n&&a&&o))return;c.preventDefault();const b=(e=>{const t=e.split(/\n\s*\n/);return{title:t.shift()?.trim()||"Confirm action",body:t.join("\n\n").trim()}})(w);s=d,l=u,n.textContent=d.dataset.confirmTitle||b.title,a.textContent=d.dataset.confirmBody||b.body,o.textContent=d.dataset.confirmButtonText||h.trim()||"Confirm",o.className=`btn ${d.dataset.confirmButtonClass||(g?"btn-primary":"btn-danger")}`;const L="true"===d.dataset.requireDeleteText||f;r?.classList.toggle("d-none",!L),L&&o&&(o.disabled=!0,i?.focus()),t.show(),L&&window.setTimeout(()=>i?.focus(),200)})})(),(()=>{if(!window.bootstrap)return;const e=new Map;let t=null;const n=new WeakSet,a=e=>e.querySelector("[data-help-tooltip]")||e,o=e=>bootstrap.Tooltip.getInstance(a(e))?.hide(),r=(e=null)=>{t&&t!==e&&bootstrap.Popover.getInstance(t)?.hide()},i=()=>document.querySelectorAll("[data-help-icon]").forEach(e=>o(e)),s=(s=document)=>{(e=>{if(!e)return[];const t=[];return e.matches?.("[data-help-icon]")&&t.push(e),e.querySelectorAll?.("[data-help-icon]").forEach(e=>t.push(e)),t})(s).forEach(s=>{if(n.has(s))return;n.add(s);const l=a(s),c=l.dataset.helpMicro||"Help article not found.",d=s.dataset.helpTitle||"Help unavailable",p=s.dataset.helpSummary||"Help content has not yet been written for this feature.";bootstrap.Tooltip.getOrCreateInstance(l,{title:c,trigger:"hover focus",placement:"top",container:"body"});const u=bootstrap.Popover.getOrCreateInstance(s,{title:d,trigger:"click",placement:"auto",container:"body",html:!0,customClass:"plotline-help-popover",content(){const e=document.createElement("div"),t=document.createElement("p");t.className="mb-2",t.textContent=p;const n=document.createElement("a");return n.href=s.dataset.helpUrl||"#",n.textContent="More...",n.className="plotline-help-more",n.addEventListener("click",e=>{e.preventDefault(),r(),i(),s.dispatchEvent(new CustomEvent("plotline:help-more",{bubbles:!0,detail:{key:s.dataset.helpKey||""}}))}),e.append(t,n),e}});e.set(s,u),s.addEventListener("click",e=>{window.PlotLineHelpDrawer?.isActive?.()&&(e.preventDefault(),e.stopPropagation(),r(),o(s),window.PlotLineHelpPopovers?.hideAll(),window.PlotLineHelpDrawer.open(s.dataset.helpKey||""))}),s.addEventListener("show.bs.popover",e=>{window.PlotLineHelpDrawer?.isActive?.()?e.preventDefault():(r(s),o(s))}),s.addEventListener("shown.bs.popover",()=>{t=s,o(s)}),s.addEventListener("hidden.bs.popover",()=>{t===s&&(t=null)})})};document.addEventListener("click",e=>{const n=e.target instanceof Element?e.target:null;if(!n||!t)return;if(n.closest("[data-help-icon]"))return;const a=document.querySelector(`#${t.getAttribute("aria-describedby")}`);a?.contains(n)||r()}),document.addEventListener("keydown",e=>{"Escape"===e.key&&r()}),window.PlotLineHelpPopovers={hideAll(){e.forEach(e=>e.hide()),i(),t=null}},window.PlotLineHelpIcons={init:s},s()})(),(()=>{const e=document.querySelector("[data-help-layout]"),t=document.querySelector("[data-help-drawer]"),n=document.querySelector("[data-help-content]"),a=document.querySelector("[data-help-splitter]"),o=document.querySelector("[data-help-close]"),r=document.querySelector("[data-help-collapse]"),i=document.querySelector("[data-help-expand]"),s=document.querySelector("[data-help-pin]"),l=document.querySelector("[data-help-drawer-heading]");if(!e||!t||!n)return;const c="plotline.helpDrawer.width",d="plotline.helpDrawer.pinned",p="plotline.helpDrawer.key",u="plotline.helpDrawer.collapsed",h=e=>{try{return"true"===localStorage.getItem(e)}catch{return!1}},m=(e,t)=>{try{localStorage.setItem(e,t)}catch{}},g=t=>{const n=`${((e,t,n)=>Math.min(n,Math.max(t,e)))(Number.parseFloat(t)||25,20,50)}%`;e.style.setProperty("--help-drawer-width",n),m(c,n)},f=e=>{m(d,String(e)),s?.setAttribute("aria-pressed",String(e)),s&&(s.textContent=e?"Unpin":"Pin")},v=t=>{e.classList.toggle("help-collapsed",t),m(u,String(t)),r&&(r.textContent=t?"Expand":"Collapse")},y=async(t,a={})=>{const o=t||"";e.classList.add("help-open"),a.keepCollapsed||v(!1),m(p,o),l&&(l.textContent=o||"Help"),n.innerHTML='

Loading help...

';try{const e=await fetch(`/HelpDrawer/Article?key=${encodeURIComponent(o)}`,{headers:{"X-Requested-With":"XMLHttpRequest"}});n.innerHTML=e.ok?await e.text():'

Help for this feature has not yet been written.

';const t=n.querySelector(".help-drawer-article h2")?.textContent?.trim();l&&t&&(l.textContent=t)}catch{n.innerHTML='

Help for this feature has not yet been written.

'}};window.PlotLineHelpDrawer={isActive:()=>e.classList.contains("help-open"),open:e=>y(e)},g(localStorage.getItem(c)||"25%"),f(h(d)),v(h(u)),document.addEventListener("plotline:help-more",e=>{const t=e.detail?.key||e.target?.dataset?.helpKey||"";window.PlotLineHelpPopovers?.hideAll(),y(t)}),document.addEventListener("click",e=>{const t=e.target instanceof Element?e.target.closest("[data-help-open]"):null;t&&(e.preventDefault(),window.PlotLineHelpPopovers?.hideAll(),y(t.dataset.helpOpen||""))}),o?.addEventListener("click",()=>{e.classList.remove("help-open","help-collapsed"),f(!1)}),r?.addEventListener("click",()=>v(!e.classList.contains("help-collapsed"))),i?.addEventListener("click",()=>v(!1)),i?.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),v(!1))}),s?.addEventListener("click",()=>f(!h(d))),a?.addEventListener("pointerdown",t=>{if(!e.classList.contains("help-open")||e.classList.contains("help-collapsed"))return;t.preventDefault(),document.body.classList.add("help-resizing"),a.setPointerCapture?.(t.pointerId);const n=t=>{const n=e.getBoundingClientRect(),a=(n.right-t.clientX)/n.width*100;g(a)},o=()=>{document.body.classList.remove("help-resizing"),document.removeEventListener("pointermove",n),document.removeEventListener("pointerup",o)};document.addEventListener("pointermove",n),document.addEventListener("pointerup",o)});const w=(()=>{try{return localStorage.getItem(p)||""}catch{return""}})();h(d)&&w&&y(w,{keepCollapsed:!0})})(),(()=>{const e=document.querySelectorAll("[data-metric-shape-chart]");if(!e.length)return;const t=["#2f6f63","#b35f3b","#6750a4","#c58b2b","#7d3f52","#33759b","#9c4d8f","#a33d3d","#6f8f3d","#d08a2f","#444b57"],n=new Set(["Overall Intensity","Tension","Emotional Weight","Action"]),a=[],o=e=>{const t=e.querySelector(".metric-chart-frame");if(!t)return;let n=Number(t.dataset.metricNaturalWidth||0);if(n&&"true"===t.dataset.metricCanvasConstrained||(t.style.width="",n=t.getBoundingClientRect().width,n&&(t.dataset.metricNaturalWidth=String(n))),!n)return;const a=Math.max(window.devicePixelRatio||1,1),o=Math.floor(3e4/a);n>o?(t.style.width=`${o}px`,t.dataset.metricCanvasConstrained="true"):(t.style.width="",t.dataset.metricCanvasConstrained="false")},r=()=>{window.requestAnimationFrame(()=>{a.forEach(({chart:e,root:t})=>{o(t),e.resize()})})};window.PlotLineMetricCharts={resizeAll:r},window.addEventListener("plotline:timeline-layout-changed",r);const i={id:"plotlineChapterGuides",afterDraw(e){const t=e.config.options.plugins.plotlineScenes||[],{ctx:n,chartArea:a,scales:o}=e;if(!t.length||!o.x)return;n.save(),n.strokeStyle="rgba(47, 111, 99, 0.16)",n.fillStyle="rgba(82, 75, 65, 0.58)",n.lineWidth=1,n.font="700 10px system-ui, -apple-system, Segoe UI, sans-serif";const r=[];t.forEach((e,n)=>{n&&e.chapterLabel===t[n-1].chapterLabel||r.push({scene:e,index:n})});const i=r.filter(e=>!e.scene.isPlaceholder),s=i.length>40?5:i.length>24?4:i.length>14?2:1;i.forEach((e,t)=>{const{scene:r,index:l}=e,c=o.x.getPixelForValue(l+.5);n.beginPath(),n.moveTo(c,a.top),n.lineTo(c,a.bottom),n.stroke();const d=Number.parseInt(String(r.chapterLabel).replace(/[^0-9]/g,""),10);(0===t||t===i.length-1||1===s||Number.isFinite(d)&&d%s===0)&&n.fillText(r.chapterLabel,Math.min(c+4,a.right-70),a.bottom+22)}),n.restore()}};window.Chart&&Chart.register(i),e.forEach(e=>{const r=e.querySelector("script[type='application/json']"),i=e.querySelector("canvas"),s=e.querySelector("[data-metric-toggles]"),l=e.querySelector("[data-chart-fallback]"),c=e.querySelector("[data-timeline-metric-edit-toolbar]"),d=e.querySelector("[data-edit-metric-status]"),p=e.hasAttribute("data-timeline-metric-editor")&&c&&d;if(!r||!i)return;let u;try{u=JSON.parse(r.textContent||"{}")}catch{return void l?.classList.remove("d-none")}if(!window.Chart||!u.scenes?.length||!u.metrics?.length)return void l?.classList.remove("d-none");const h=new Set(u.defaultMetrics?.length?u.defaultMetrics:n),m=u.scenes.length,g=m>80?10:m>40?5:m>24?4:m>14?2:1,f=u.metrics.map((e,n)=>{const a=new Map(e.points.map(e=>[e.sceneId,e.value])),o=t[n%t.length];return{label:e.metricName,metricTypeId:e.metricTypeId,minValue:Number.isFinite(e.minValue)?e.minValue:1,maxValue:Number.isFinite(e.maxValue)?e.maxValue:10,data:u.scenes.map((e,t)=>{const n=a.get(e.sceneId);return null==n?{x:t+.5,y:null,sceneId:e.sceneId}:{x:t+.5,y:n,sceneId:e.sceneId}}),borderColor:o,backgroundColor:o,pointBackgroundColor:o,pointBorderColor:"#fff",pointBorderWidth:1.5,pointRadius:3,pointHoverRadius:5,borderWidth:2,tension:.35,spanGaps:!0,hidden:!h.has(e.metricName)}});let v=null,y=!1;o(e);const w=e=>{d&&(d.textContent=e)},b=()=>f.map((e,t)=>t).filter(e=>E?.isDatasetVisible(e)),L=()=>{const e=b();return 1===e.length?e[0]:-1},S=()=>{if(!p)return;const e=L();f.forEach((t,n)=>{t.pointRadius=n===e?5:3,t.pointHoverRadius=n===e?7:5,t.borderWidth=n===e?3:2});const t=b(),n=e>=0;i.classList.toggle("metric-curve-editing",n),d.classList.toggle("d-none",0===t.length),0===t.length?w(""):w(n?"Drag points up or down to edit this metric.":"Show only one metric line to edit its curve."),E?.update()};s.innerHTML="",f.forEach((e,t)=>{const n=`metric-toggle-${Math.random().toString(36).slice(2)}-${t}`,a=document.createElement("label");a.className="metric-toggle-pill",a.style.setProperty("--metric-colour",e.borderColor),a.innerHTML=`${e.label}`,s.appendChild(a),a.querySelector("input").addEventListener("change",e=>{E.setDatasetVisibility(t,e.target.checked),S(),E.update()})});const E=new Chart(i,{type:"line",data:{datasets:f},options:{responsive:!0,maintainAspectRatio:!1,interaction:{mode:"nearest",intersect:!1},scales:{y:{min:1,max:10,ticks:{stepSize:1},grid:{color:"rgba(82, 75, 65, 0.10)"}},x:{type:"linear",min:0,max:m,bounds:"ticks",ticks:{maxRotation:0,autoSkip:!1,maxTicksLimit:16,callback(e){const t=Math.floor(Number(e));if(t<0||t>=m)return"";const n=u.scenes[t];return 0!==t&&t!==m-1&&t%g!==0||n?.isPlaceholder?"":n?.axisLabel||""}},afterBuildTicks(e){e.ticks=u.scenes.map((e,t)=>({value:t+.5}))},grid:{display:!1}}},plugins:{legend:{display:!1},plotlineScenes:u.scenes,tooltip:{callbacks:{title(e){const t=Math.floor(e[0].parsed.x),n=u.scenes[t];return n.isPlaceholder?n.sceneTitle||"No scene":`${n.chapterLabel}, Scene ${n.sceneNumber}: ${n.sceneTitle}`},label:e=>`${e.dataset.label}: ${e.formattedValue}`,afterBody(e){const t=Math.floor(e[0].parsed.x),n=u.scenes[t],a=[];return n.characterPresence?a.push(n.characterPresence):void 0!==n.characterAppears&&a.push(n.characterAppears?"Character appears":"Character does not appear"),n.bookTitle&&a.push(n.bookTitle),a}}}}}});p&&(S(),i.addEventListener("pointerdown",e=>{v=(e=>{if(!p)return null;const t=L();if(t<0)return null;const n=E.getElementsAtEventForMode(e,"nearest",{intersect:!0},!0).find(e=>e.datasetIndex===t);if(!n)return null;const a=E.data.datasets[n.datasetIndex],o=a?.data?.[n.index];return o?.sceneId&&null!=o.y?{datasetIndex:n.datasetIndex,pointIndex:n.index,previousValue:o.y}:null})(e),v&&(e.preventDefault(),i.setPointerCapture?.(e.pointerId),y=!0)}),i.addEventListener("pointermove",e=>{if(!v)return;const t=E.data.datasets[v.datasetIndex],n=t?.data?.[v.pointIndex];t&&n&&(n.y=((e,t)=>{const n=E.scales.y.getValueForPixel(e.offsetY),a=Math.round(n);return Math.max(t.minValue,Math.min(t.maxValue,a))})(e,t),E.update("none"))}),i.addEventListener("pointerup",async t=>{if(!v)return;const n=v;v=null,i.releasePointerCapture?.(t.pointerId),await(async t=>{const n=E.data.datasets[t.datasetIndex],a=n?.data?.[t.pointIndex];if(!n||!a?.sceneId)return;const o=c?.querySelector("input[name='__RequestVerificationToken']")?.value||"";w("Saving...");try{const t=await fetch(e.dataset.updateUrl||"/SceneMetrics/UpdateSceneMetricValue",{method:"POST",headers:{"Content-Type":"application/json",RequestVerificationToken:o},body:JSON.stringify({sceneId:Number(a.sceneId),metricId:Number(n.metricTypeId),value:Number(a.y)})}),r=await t.json().catch(()=>({}));if(!t.ok||!r.success)throw new Error(r.message||"Save failed");a.y=r.value,w("Saved"),E.update()}catch{a.y=t.previousValue,w("Save failed"),E.update()}})(n),window.setTimeout(()=>{y=!1},0)}),i.addEventListener("pointercancel",e=>{if(!v)return;const t=E.data.datasets[v.datasetIndex],n=t?.data?.[v.pointIndex];n&&(n.y=v.previousValue),v=null,i.releasePointerCapture?.(e.pointerId),y=!1,E.update()})),i.addEventListener("click",e=>{if(y)return void e.preventDefault();const t=E.getElementsAtEventForMode(e,"nearest",{intersect:!0},!0);if(!t.length)return;const n=E.data.datasets[t[0].datasetIndex]?.data?.[t[0].index],a=n?Math.floor(n.x):t[0].index,o=u.scenes[a];o?.timelineUrl&&(window.PlotLineTimelineScroll?.save(),window.location.href=o.timelineUrl)}),a.push({chart:E,root:e});const I=window.ResizeObserver?new ResizeObserver(()=>{o(e),E.resize()}):null;I&&(I.observe(e),I.observe(e.querySelector(".metric-chart-frame")||e))})})(),(()=>{const e=document.querySelector("[data-timeline-root]"),t=document.querySelector("[data-timeline-controls]");if(!e||!t)return;const n="plotline.timeline.visibility",a={"scene-cards":!0,"plot-lines":!0,assets:!0,characters:!0,locations:!0,warnings:!0,metrics:!0},o=t=>{Object.entries(t).forEach(([t,n])=>{e.classList.toggle(`hide-${t}`,!n),document.querySelectorAll(`[data-timeline-section='${t}']`).forEach(e=>{e.classList.toggle("timeline-section-hidden",!n)})}),document.querySelectorAll("[data-location-marker]").forEach(e=>{e.classList.toggle("timeline-section-hidden",!t.locations)}),document.querySelectorAll("[data-warning-marker]").forEach(e=>{e.classList.toggle("timeline-section-hidden",!t.warnings)}),document.querySelector("[data-visibility-json]")?.setAttribute("value",JSON.stringify(t))},r=(()=>{try{return{...a,...JSON.parse(localStorage.getItem(n)||"{}")}}catch{return{...a}}})();t.querySelectorAll("[data-timeline-toggle]").forEach(e=>{const t=e.dataset.timelineToggle;e.checked=r[t]??!0,e.addEventListener("change",()=>{r[t]=e.checked,localStorage.setItem(n,JSON.stringify(r)),o(r)})}),t.querySelector("[data-timeline-preset-form]")?.addEventListener("submit",()=>{document.querySelector("[data-visibility-json]")?.setAttribute("value",JSON.stringify(r))}),o(r)})(),(()=>{const e=document.querySelector("[data-timeline-root]");if(!e)return;const t=e.querySelector(".timeline-workspace")||e,n=document.querySelector("[data-timeline-density]"),a=document.querySelector("[data-timeline-zoom]"),o=document.querySelector("[data-timeline-search]"),r=e.querySelector("[data-timeline-minimap]"),i=document.querySelectorAll("[data-timeline-jump], [data-timeline-warning-jump], [data-timeline-entity-jump]"),s=[...e.querySelectorAll(".timeline-scene-card[data-scene-id]")],l="plotline.timeline.collapsed",c="plotline.timeline.density",d="plotline.timeline.zoom",p="plotline.timeline.pending-scroll",u="plotdirector.timelineNavigationDiscovered",h="plotline.timeline.inspectorWidth",m=[".timeline-shell",".plot-lane-board",".asset-lane-board",".character-lane-board",".metric-graph-stack","[data-timeline-minimap]"].join(","),g=["compact","comfortable","expanded"],f=["book","chapter","scene-detail","scene-overview"],v=e.querySelector("[data-inspector-drawer]"),y=e.querySelector("[data-inspector-resizer]"),w=e.querySelector("[data-inspector-close]"),b=null!==localStorage.getItem(l),L=(e=>{try{return new Set(JSON.parse(localStorage.getItem(e)||"[]"))}catch{return new Set}})(l),S=()=>[...e.querySelectorAll(m)],E=t=>{if(!v)return;const{minimum:n,maximum:a,defaultWidth:o}=(()=>{const t=e.getBoundingClientRect().width||window.innerWidth,n=Math.min(420,Math.max(320,t-360)),a=Math.max(n,Math.min(.65*t,t-420));return{minimum:n,maximum:a,defaultWidth:Math.max(n,Math.min(a,.4*t))}})(),r=Math.max(n,Math.min(a,Number(t)||o));e.style.setProperty("--timeline-inspector-width",`${Math.round(r)}px`)};v&&(E(localStorage.getItem(h)),window.addEventListener("resize",()=>E(localStorage.getItem(h)))),(()=>{const o=e.querySelector("[data-timeline-navigation-card]");if(!o)return;const r=o.querySelector("[data-timeline-navigation-dismiss]"),i=o.querySelector("[data-timeline-navigation-demo]"),s=()=>e.querySelector(".timeline-shell"),l=e=>Boolean(e&&e.scrollWidth>e.clientWidth+8),c=e=>Math.max(0,e.scrollWidth-e.clientWidth),d=()=>[t,...S()].filter((e,t,n)=>e&&n.indexOf(e)===t);let p=!1,h=!1,m=!1,g=null;const f=new WeakMap,v=e=>f.set(e,e.scrollLeft),y=(e=!1)=>{if(window.clearTimeout(g),!e||window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches||o.hidden)return o.classList.remove("is-dismissing"),void(o.hidden=!0);o.classList.add("is-dismissing"),g=window.setTimeout(()=>{o.hidden=!0,o.classList.remove("is-dismissing")},1300)},w=e=>{const t=l(e),n=c(e);e.classList.toggle("timeline-horizontal-overflow",t),e.classList.toggle("has-scroll-left",t&&e.scrollLeft>8),e.classList.toggle("has-scroll-right",t&&e.scrollLeft{l(s())&&!(()=>{try{return"true"===localStorage.getItem(u)}catch{return!1}})()&&!p?(window.clearTimeout(g),o.hidden=!1,o.classList.remove("is-dismissing")):o.classList.contains("is-dismissing")||y(!1),d().forEach(w)},L=()=>{p=!0,y(!0);try{localStorage.setItem(u,"true")}catch{}};d().forEach(e=>{v(e),e.addEventListener("wheel",t=>{if(!t.defaultPrevented&&t.shiftKey&&Math.abs(t.deltaY)>Math.abs(t.deltaX)&&l(e)){const n=e.scrollLeft;t.preventDefault(),e.scrollLeft+=t.deltaY,window.requestAnimationFrame(()=>{w(e),!h&&Math.abs(e.scrollLeft-n)>4&&L(),v(e)})}},{passive:!1}),e.addEventListener("scroll",()=>(e=>{if(w(e),!m||h)return void v(e);const t=f.get(e)??e.scrollLeft;Math.abs(e.scrollLeft-t)>4&&l(e)?L():v(e)})(e),{passive:!0})}),r?.addEventListener("click",L),i?.addEventListener("click",()=>{const e=s();if(!l(e))return void b();const t=e.scrollLeft,n=c(e)-t;let a=Math.min(220,n),o=1;a<24&&t>0&&(a=Math.min(220,t),o=-1),a<4||(h=!0,e.scrollTo({left:t+a*o,behavior:"smooth"}),window.setTimeout(()=>{e.scrollTo({left:t,behavior:"smooth"})},420),window.setTimeout(()=>{h=!1,d().forEach(e=>{v(e),w(e)}),b()},950))}),window.setTimeout(()=>{m=!0,d().forEach(v)},800),window.requestAnimationFrame(b),window.addEventListener("resize",b),window.addEventListener("plotline:timeline-layout-changed",b),n?.addEventListener("change",()=>window.requestAnimationFrame(b)),a?.addEventListener("change",()=>window.requestAnimationFrame(b))})(),y?.addEventListener("pointerdown",t=>{t.preventDefault(),document.body.classList.add("timeline-inspector-resizing"),y.setPointerCapture(t.pointerId);const n=t=>{const n=e.getBoundingClientRect().right-t.clientX;E(n)},a=()=>{document.body.classList.remove("timeline-inspector-resizing");const e=Math.round(v?.getBoundingClientRect().width||0);e>0&&localStorage.setItem(h,String(e)),window.dispatchEvent(new Event("plotline:timeline-layout-changed")),y.removeEventListener("pointermove",n),y.removeEventListener("pointerup",a),y.removeEventListener("pointercancel",a)};y.addEventListener("pointermove",n),y.addEventListener("pointerup",a),y.addEventListener("pointercancel",a)}),w?.addEventListener("click",e=>{e.preventDefault();const t=new URL(window.location.href),n=t.searchParams.get("FocusType")||t.searchParams.get("focusType");t.searchParams.delete("SelectedSceneID"),t.searchParams.delete("selectedSceneId"),t.searchParams.delete("selectedsceneid"),n&&"scene"!==n.toLowerCase()||(t.searchParams.delete("FocusType"),t.searchParams.delete("focusType"),t.searchParams.delete("FocusID"),t.searchParams.delete("focusId")),I(),window.location.href=t.toString()});const I=()=>{try{sessionStorage.setItem(p,JSON.stringify({path:window.location.pathname,top:window.scrollY,left:window.scrollX,workspaceLeft:t.scrollLeft,workspaceTop:t.scrollTop,containers:S().map((e,t)=>({index:t,left:e.scrollLeft,top:e.scrollTop}))}))}catch{}};window.PlotLineTimelineScroll={save:I};const x=(t,n,a)=>{a.forEach(n=>e.classList.remove(`${t}-${n}`)),e.classList.add(`${t}-${n}`)},C=e=>{const t=g.includes(e)?e:"comfortable";x("density",t,g),n&&(n.value=t),localStorage.setItem(c,t),window.requestAnimationFrame(A)},q=e=>{const t=f.includes(e)?e:"chapter";x("zoom",t,f),a&&(a.value=t),localStorage.setItem(d,t),window.requestAnimationFrame(A)},k=(t,n=!0)=>{const a=(t=>e.querySelector(`[data-scene-id='${CSS.escape(String(t))}']`))(t);a&&(a.classList.add("keyboard-focus"),a.scrollIntoView({behavior:"smooth",block:"center",inline:"center"}),n&&a.focus({preventScroll:!0}),window.setTimeout(()=>a.classList.remove("keyboard-focus"),1800))},A=()=>{e.querySelectorAll("[data-plot-line-svg-board]").forEach(e=>{const t=e.querySelector("[data-plot-line-svg]");if(!t)return;let n=e.querySelector("[data-plot-line-health-svg]");n||(n=document.createElementNS("http://www.w3.org/2000/svg","svg"),n.setAttribute("class","plot-lane-svg-overlay plot-lane-svg-health-overlay"),n.setAttribute("data-plot-line-health-svg",""),n.setAttribute("aria-hidden","true"),t.after(n)),t.replaceChildren(),n.replaceChildren();const a=e.getBoundingClientRect(),o=Math.max(e.scrollWidth,a.width),r=Math.max(e.scrollHeight,a.height);[t,n].forEach(e=>{e.setAttribute("viewBox",`0 0 ${o} ${r}`),e.setAttribute("width",String(o)),e.setAttribute("height",String(r))});const i=(e,t={})=>{const n=document.createElementNS("http://www.w3.org/2000/svg",e);return Object.entries(t).forEach(([e,t])=>n.setAttribute(e,String(t))),n},s=[...new Set([...e.querySelectorAll("[data-plot-line-slot]")].map(e=>{const t=e.getBoundingClientRect();return Math.round(t.left-a.left+t.width/2)}))].sort((e,t)=>e-t),l=Math.max(s.length-1,0),c=new Map;e.querySelectorAll("[data-plot-line-row]").forEach(e=>{e.dataset.plotLineId&&c.set(e.dataset.plotLineId,e)});const d=[...c.values()].map(e=>({row:e,plotLineId:e.dataset.plotLineId,colour:e.dataset.plotColour||"#2f6f63",points:[...e.querySelectorAll("[data-plot-event-node]")].map(e=>((e,t)=>{const n=t.closest("[data-plot-line-slot]");if(!n)return null;const o=n.getBoundingClientRect(),r=t.getBoundingClientRect();return{x:r.left-a.left+r.width/2,y:r.top-a.top+r.height/2,sceneX:o.left-a.left+o.width/2,radius:Math.max(r.width,r.height)/2,sceneIndex:0,type:(t.dataset.plotEventType||"Progress").toLowerCase(),targetPlotLineId:t.dataset.targetPlotLineId||"",targetPlotLineIds:(t.dataset.targetPlotLineIds||"").split(",").map(e=>e.trim()).filter(Boolean)}})(0,e)).filter(Boolean).map(e=>({...e,sceneIndex:Math.max(0,s.findIndex(t=>t===Math.round(e.sceneX)))})).sort((e,t)=>e.x-t.x),incomingStartXs:[]})),p=new Map(d.map(e=>[e.plotLineId,e])),u=(e,n,o,r)=>{if(!n)return void(window.console?.warn&&window.console.warn(`Plot line ${r} connector skipped because target plot line data is missing.`));e.x;const s=(e=>{const t=e.getBoundingClientRect();return t.top-a.top+t.height/2})(n),l=Math.max(28,Math.min(46,.28*Math.abs(s-e.y))),c=Math.max(8,e.radius||12),d=e.x+c,p=d+l,u=d+l/2;t.append(i("path",{class:`plot-line-svg-connector plot-line-svg-connector-${r}`,d:`M ${d} ${e.y} C ${u} ${e.y}, ${u} ${s}, ${p} ${s}`,stroke:o}))};d.forEach(e=>{e.points.forEach(e=>{"branch"===e.type&&e.targetPlotLineId&&p.get(e.targetPlotLineId)?.incomingStartXs.push(e.x),"split"===e.type&&e.targetPlotLineIds.forEach(t=>{p.get(t)?.incomingStartXs.push(e.x)})})}),d.forEach(e=>{e.health=(e=>{const t=e.some(e=>"resolve"===e.type),n=e.some(e=>"abandon"===e.type),a=e.find(e=>"resolve"===e.type),o=e.find(e=>"abandon"===e.type),r=e.some(e=>"merge"===e.type&&e.targetPlotLineId),i=e.some(e=>"split"===e.type&&e.targetPlotLineIds.length>=2),s=Boolean(a)&&e.some(e=>"branch"===e.type&&e.targetPlotLineId&&e.sceneIndex>=a.sceneIndex),c=e.reduce((e,t)=>Math.max(e,t.sceneIndex),0),d=!t&&!n&&l-c>=10,p=t&&!r&&!i&&!s;let u="active";return n?u="abandoned":t?u=p?"questionable":"resolved":d&&(u="neglected"),{state:u,isNeglected:d,isDangling:!t&&!n&&!r&&!i&&l>=c,isQuestionable:p,isAbandoned:n,resolvePoint:a,abandonPoint:o}})(e.points),e.state=e.health.state}),d.forEach(e=>{const{colour:n,points:a,incomingStartXs:o,state:r}=e;if(a.length>0){const s=a.find(e=>"start"===e.type),l=o.length?Math.min(...o):null,c=a.find(e=>"split"===e.type||"merge"===e.type),d=a[0],p=a[a.length-1],u=((null===l||s&&s.xe.x-t.x),m=c?h.indexOf(c):-1,g=m>=0?h.slice(0,m+1):h;null!==l&&l{const o=g[a+1];if(!o||o.x<=e.x)return;const s=Math.abs(o.sceneIndex-e.sceneIndex)>=f;t.append(i("path",{class:`plot-line-svg-path plot-line-svg-segment ${s?"plot-line-svg-segment-dormant":""} plotline-state-${r}`,d:`M ${e.x} ${e.y} L ${o.x} ${o.y}`,stroke:n}))})}}),d.forEach(({points:e,colour:t})=>{e.forEach(e=>{"branch"!==e.type&&"merge"!==e.type||u(e,c.get(e.targetPlotLineId),t,e.type),"split"===e.type&&e.targetPlotLineIds.length>=2?e.targetPlotLineIds.forEach(n=>{u(e,c.get(n),t,e.type)}):"split"===e.type&&e.targetPlotLineIds.length>0&&window.console?.warn&&window.console.warn("Plot line split connector skipped because fewer than two targets are available.")})}),d.forEach(e=>{const t=e.lineEndPoint||e.points[e.points.length-1],a=[];e.health?.isNeglected&&t&&a.push({point:t,kind:"neglected",label:"Dormant Thread",reason:"No activity for 10+ scenes.",action:"Add a Progress, Reveal or Resolve event."}),e.health?.isDangling&&t&&a.push({point:t,kind:"dangling",label:"Unresolved Thread",reason:"Thread contains no Resolve or Abandon event by the end of the current timeline.",action:"Review ending scenes and add Resolve or Abandon where appropriate."}),e.health?.isQuestionable&&e.health.resolvePoint&&a.push({point:e.health.resolvePoint,kind:"questionable",label:"Missing Closure",reason:"Resolved without merge, split, or branch.",action:"Verify this thread has sufficient payoff."}),e.health?.isAbandoned&&e.health.abandonPoint&&a.push({point:e.health.abandonPoint,kind:"abandoned",label:"Abandoned Thread",reason:"This plot line was abandoned.",action:"Check this is intentional."});const o=new Map;a.forEach(e=>{const t=`${Math.round(e.point.x)}:${Math.round(e.point.y)}`;o.has(t)||o.set(t,{point:e.point,warnings:[]}),o.get(t).warnings.push(e)}),o.forEach(({point:e,warnings:t})=>((e,t)=>{const a=Math.max(18,(e.radius||12)+8),o=t[0]?.kind||"warning",r=i("g",{class:`plotline-health-marker plotline-health-marker-${o}`}),s=i("title");s.textContent=(e=>e.map(e=>[`Warning: ${e.label}`,`Reason: ${e.reason}`,`Suggested Action: ${e.action}`].join("\n")).join("\n\n"))(t),r.append(s);const l=e.x+a,c=e.y-13;if("questionable"===o){r.append(i("circle",{cx:l,cy:c,r:9}));const e=i("text",{x:l,y:c+4,"text-anchor":"middle"});e.textContent=t.length>1?String(t.length):"?",r.append(e)}else if(r.append(i("circle",{cx:l,cy:c,r:10})),r.append(i("path",{d:`M ${l} ${c-6} L ${l+6} ${c+5} L ${l-6} ${c+5} Z`})),r.append(i("line",{x1:l,y1:c-2,x2:l,y2:c+2.5})),r.append(i("circle",{cx:l,cy:c+5.3,r:1.2})),t.length>1){const e=i("text",{x:l+11,y:c-6,"text-anchor":"middle",class:"plotline-health-count"});e.textContent=String(t.length),r.append(e)}n.append(r)})(e,t))})})},P=(e,t)=>{document.querySelectorAll(`[data-collapse-body='${CSS.escape(e)}']`).forEach(e=>{e.classList.toggle("timeline-section-collapsed",t)}),document.querySelectorAll(`[data-collapse-toggle='${CSS.escape(e)}']`).forEach(e=>{e.classList.toggle("is-collapsed",t),e.setAttribute("aria-expanded",String(!t))})};document.querySelectorAll("[data-collapse-toggle]").forEach(e=>{const t=e.dataset.collapseToggle;b||"collapsed"!==e.dataset.collapseDefault||L.add(t);const n=L.has(t);P(t,n),e.addEventListener("click",()=>{const e=!L.has(t);e?L.add(t):L.delete(t),P(t,e),localStorage.setItem(l,JSON.stringify([...L])),A(),window.dispatchEvent(new Event("plotline:timeline-layout-changed"))})}),n?.addEventListener("change",()=>C(n.value)),a?.addEventListener("change",()=>q(a.value)),C(localStorage.getItem(c)||"comfortable"),q(localStorage.getItem(d)||"chapter");const $=(()=>{try{return null!==sessionStorage.getItem(p)}catch{return!1}})();window.requestAnimationFrame(()=>{A(),((e="auto")=>{const t=r?.querySelector("[data-active-chapter='true']");if(!r||!t)return;const n=r.getBoundingClientRect(),a=t.getBoundingClientRect(),o=a.left+a.width/2,i=n.left+n.width/2;(a.leftn.right)&&r.scrollBy({left:o-i,behavior:e})})("auto"),$&&(()=>{let e=null;try{e=JSON.parse(sessionStorage.getItem(p)||"null"),sessionStorage.removeItem(p)}catch{try{sessionStorage.removeItem(p)}catch{}return}e&&e.path===window.location.pathname&&window.requestAnimationFrame(()=>{t.scrollLeft=Number(e.workspaceLeft)||0,t.scrollTop=Number(e.workspaceTop)||0;const n=S();(e.containers||[]).forEach(e=>{const t=n[e.index];t&&(t.scrollLeft=Number(e.left)||0,t.scrollTop=Number(e.top)||0)}),window.scrollTo(Number(e.left)||0,Number(e.top)||0)})})()}),window.addEventListener("resize",A),window.addEventListener("plotline:timeline-layout-changed",A);e.addEventListener("click",t=>{if(0!==t.button||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey)return;const n=t.target instanceof Element?t.target:null,a=n?.closest("a[href]");if(!a||!e.contains(a))return;[...new URL(a.href,window.location.href).searchParams.keys()].some(e=>"selectedsceneid"===e.toLowerCase())&&I()},{capture:!0});const M=()=>{const e=o?.value.trim().toLowerCase()||"";let t=null;return s.forEach(n=>{const a=!e||(n.dataset.timelineSearchText||"").toLowerCase().includes(e);n.classList.toggle("search-hit",Boolean(e&&a)),n.classList.toggle("search-dim",Boolean(e&&!a)),!t&&e&&a&&(t=n)}),t};o?.addEventListener("input",M),o?.addEventListener("keydown",e=>{if("Enter"!==e.key)return;const t=M();t&&(e.preventDefault(),k(t.dataset.sceneId))}),i.forEach(e=>{e.addEventListener("change",()=>{e.value&&k(e.value)})}),document.querySelectorAll("[data-jump-scene]").forEach(e=>{e.addEventListener("click",()=>{e.dataset.jumpScene&&k(e.dataset.jumpScene)})}),document.addEventListener("keydown",e=>{const n=document.activeElement?.tagName?.toLowerCase(),r=["input","select","textarea"].includes(n)||document.activeElement?.isContentEditable;if((e.ctrlKey||e.metaKey)&&"f"===e.key.toLowerCase()&&o)return e.preventDefault(),o.focus(),void o.select();if("Escape"===e.key){const e=new URL(window.location.href),t=e.searchParams.has("FocusType")||e.searchParams.has("FocusID");return e.searchParams.delete("FocusType"),e.searchParams.delete("FocusID"),void(t?window.location.href=e.toString():o?.value&&(o.value="",M()))}if(!r){if("ArrowLeft"===e.key||"ArrowRight"===e.key)return e.preventDefault(),void t.scrollBy({left:"ArrowLeft"===e.key?-260:260,behavior:"smooth"});if("+"===e.key||"="===e.key||"-"===e.key){const t=f.indexOf(a?.value||"chapter"),n="-"===e.key?-1:1,o=Math.min(f.length-1,Math.max(0,t+n));q(f[o])}}})})(),(()=>{const e=document.querySelector("[data-timeline-root]"),t=document.querySelector("[data-drag-drop-panel]");if(!t)return;const n=new Map([...document.querySelectorAll("[data-drag-form]")].map(e=>[e.dataset.dragForm,e])),a=t.querySelector("[data-drag-panel-title]"),o=t.querySelector("[data-drag-panel-kicker]"),r=t.querySelector("[data-drag-panel-summary]"),i=document.querySelector("[data-scene-move-modal]"),s=i&&window.bootstrap?.Modal?window.bootstrap.Modal.getOrCreateInstance(i):null,l=i?.querySelector("[data-scene-move-title]"),c=i?.querySelector("[data-scene-move-summary]"),d=i?.querySelector("[data-scene-move-submit]"),p="plotline.timeline.scroll";let u=null,h=0;const m=(e,t,n)=>{const a=e?.querySelector(`[name='${CSS.escape(t)}']`);a&&(a.value=n??"")},g=e=>e?.selectedOptions?.[0]?.textContent?.trim()||"",f=e=>`“${e||"this scene"}”`,v=(e,t,n,a,o)=>t&&n&&t===n?`Move ${f(e.label)} to this new position within ${n}?`:t&&n?`Move ${f(e.label)} from ${t} to ${n}?`:`Move ${f(e.label)} ${a.toLowerCase()} ${o}?`,y=(e,i,p,u)=>{if("scene"===e)return t.classList.add("d-none"),t.querySelectorAll("[data-drag-form]").forEach(e=>e.classList.add("d-none")),n.get("scene")?.classList.remove("d-none"),l&&(l.textContent=i),c&&(c.textContent=p),d&&d.classList.toggle("d-none",i.toLowerCase().startsWith("cannot")||i.toLowerCase().startsWith("scene already")),void(s?s.show():t.classList.remove("d-none"));n.forEach((t,n)=>t.classList.toggle("d-none",n!==e)),t.classList.remove("d-none"),a.textContent=i,o.textContent=u,r.textContent=p,t.scrollIntoView({behavior:"smooth",block:"center"})},w=()=>{t.classList.add("d-none"),n.forEach(e=>e.classList.add("d-none"))},b=()=>{document.querySelectorAll(".drop-target-active, .drop-before, .drop-after, .chapter-drop-active, .drop-chapter-end").forEach(e=>e.classList.remove("drop-target-active","drop-before","drop-after","chapter-drop-active","drop-chapter-end"))};try{const t=JSON.parse(sessionStorage.getItem(p)||"null");t&&(sessionStorage.removeItem(p),requestAnimationFrame(()=>{const n=e?.querySelector(".timeline-shell");n&&(n.scrollLeft=t.left||0),window.scrollTo({top:t.top||0})}))}catch{sessionStorage.removeItem(p)}const L=e=>{try{const t=JSON.parse(e.dataTransfer.getData("application/json")||"{}");return t.type?t:u||{}}catch{return u||{}}};document.querySelectorAll("[data-drag-type][draggable='true']").forEach(e=>{e.addEventListener("dragstart",t=>((e,t)=>{const n={type:t.dataset.dragType,id:t.dataset.dragId,label:t.dataset.dragLabel||t.textContent.trim()};e.dataTransfer.effectAllowed="copyMove",e.dataTransfer.setData("application/json",JSON.stringify(n)),e.dataTransfer.setData("text/plain",`${n.type}:${n.id}`),u=n,document.body.classList.add("drag-active",`dragging-${n.type}`),t.classList.add("is-dragging")})(t,e)),e.addEventListener("dragend",()=>{e.classList.remove("is-dragging"),document.body.classList.remove("drag-active","dragging-scene","dragging-character","dragging-asset","dragging-location"),u=null,b()})}),t.querySelectorAll("[data-drag-cancel]").forEach(e=>e.addEventListener("click",w)),n.get("scene")?.addEventListener("submit",()=>{const t=e?.querySelector(".timeline-shell");try{sessionStorage.setItem(p,JSON.stringify({left:t?.scrollLeft||0,top:window.scrollY||0}))}catch{}}),e?.querySelectorAll(".timeline-scene-card[data-scene-id]").forEach(t=>{t.addEventListener("click",e=>{Date.now(){const n=L(e);["scene","character","asset"].includes(n.type)&&(e.preventDefault(),e.stopPropagation(),e.dataTransfer.dropEffect="scene"===n.type?"move":"copy",t.classList.add("drop-target-active"),t.classList.toggle("drop-before","scene"===n.type&&e.offsetX=t.clientWidth/2))}),t.addEventListener("dragleave",()=>t.classList.remove("drop-target-active","drop-before","drop-after")),t.addEventListener("drop",a=>{const o=L(a);if(!["scene","character","asset"].includes(o.type))return;a.preventDefault(),a.stopPropagation(),h=Date.now()+800,t.classList.remove("drop-target-active","drop-before","drop-after");const r=t.dataset.sceneId;if("scene"===o.type){if(o.id===r)return void y("scene","Cannot move scene","Drop a scene before or after a different scene.","Scene move");const i=n.get("scene"),s=a.offsetX{const a=t.closest("[data-chapter-drop-target]"),o=t.dataset.chapterId||a?.dataset.chapterId,r=t.dataset.chapterLabel||a?.dataset.chapterLabel||"this chapter";t.addEventListener("dragover",e=>{"scene"===L(e).type&&o&&(e.target.closest(".timeline-scene-card[data-scene-id]")||(e.preventDefault(),e.dataTransfer.dropEffect="move",t.classList.add("drop-target-active","drop-chapter-end"),a?.classList.add("chapter-drop-active")))}),t.addEventListener("dragleave",e=>{t.contains(e.relatedTarget)||(t.classList.remove("drop-target-active","drop-chapter-end"),a?.classList.remove("chapter-drop-active"))}),t.addEventListener("drop",a=>{const i=L(a);if("scene"!==i.type||!o)return;if(a.target.closest(".timeline-scene-card[data-scene-id]"))return;a.preventDefault(),a.stopPropagation(),h=Date.now()+800,b();const s=e.querySelector(`.timeline-scene-card[data-scene-id='${CSS.escape(i.id)}']`);if(s?.dataset.chapterId===o&&t.lastElementChild?.dataset?.sceneId===i.id)return void y("scene","Scene already here",`${i.label} is already at the end of ${r}.`,"Scene move");const l=n.get("scene");m(l,"SceneID",i.id),m(l,"AnchorSceneID",""),m(l,"TargetChapterID",o),m(l,"Position","End"),y("scene","Move Scene?",v(i,s?.dataset.chapterLabel||"",r,"After",r),"Scene move")})});const S=n.get("asset-dependency"),E=()=>{const e=S?.dataset.sourceLabel||"Source asset",n=S?.dataset.targetLabel||"Target asset",a=g(S?.querySelector("[name='AssetDependencyTypeID']"))||"Requires",o=g(S?.querySelector("[name='SourceRequiredStateID']"))||"the required state",r=g(S?.querySelector("[name='TargetBlockedStateID']"))||"the blocked state",i=t.querySelector("[data-asset-dependency-preview]");i&&(i.textContent=`${e} ${a.toLowerCase()} ${n}. ${e} should be ${o} before ${n} can be ${r}.`)};S?.querySelectorAll("select").forEach(e=>e.addEventListener("change",E)),document.querySelectorAll("[data-asset-drop-target], .drag-chip.asset").forEach(e=>{e.addEventListener("dragover",t=>{"asset"===L(t).type&&(t.preventDefault(),t.dataTransfer.dropEffect="copy",e.classList.add("drop-target-active"))}),e.addEventListener("dragleave",()=>e.classList.remove("drop-target-active")),e.addEventListener("drop",t=>{const n=L(t),a=e.dataset.assetId||e.dataset.dragId,o=e.dataset.assetLabel||e.dataset.dragLabel||e.textContent.trim();"asset"===n.type&&a&&(t.preventDefault(),e.classList.remove("drop-target-active"),n.id!==a?(m(S,"SourceAssetID",n.id),m(S,"TargetAssetID",a),S.dataset.sourceLabel=n.label,S.dataset.targetLabel=o,E(),y("asset-dependency","Create asset dependency",`${n.label} -> ${o}`,"Asset dependency")):y("asset-dependency","Cannot create dependency","Drop one asset onto a different asset.","Asset dependency"))})}),document.querySelectorAll("[data-drag-type='location']").forEach(e=>{e.addEventListener("dragover",t=>{"location"===L(t).type&&(t.preventDefault(),t.dataTransfer.dropEffect="copy",e.classList.add("drop-target-active"))}),e.addEventListener("dragleave",()=>e.classList.remove("drop-target-active")),e.addEventListener("drop",t=>{const a=L(t),o=e.dataset.dragId,r=e.dataset.dragLabel||e.textContent.trim();if("location"!==a.type)return;if(t.preventDefault(),e.classList.remove("drop-target-active"),a.id===o)return void y("location-relationship","Cannot create relationship","Drop one location onto a different location.","Location relationship");const i=n.get("location-relationship");m(i,"FromLocationID",a.id),m(i,"ToLocationID",o),y("location-relationship","Create location relationship",`${a.label} -> ${r}`,"Location drop")})})})(); \ No newline at end of file +(()=>{const e="plotline.theme",t=document.querySelectorAll("[data-theme-choice]"),n=n=>{const a="dark"===n?"dark":"light";document.documentElement.dataset.theme=a,document.documentElement.dataset.bsTheme=a,(t=>{try{localStorage.setItem(e,t)}catch{}})(a),t.forEach(e=>{const t=e.dataset.themeChoice===a;e.classList.toggle("active",t),e.setAttribute("aria-pressed",String(t))})};t.forEach(e=>{e.addEventListener("click",()=>n(e.dataset.themeChoice))}),n((()=>{try{return localStorage.getItem(e)}catch{return null}})()||"light")})(),(()=>{const e=document.querySelector("[data-trial-banner]");if(!e)return;const t=`plotline.trialBanner.dismissed.${e.dataset.trialBannerKey||"current"}`;try{if("true"===localStorage.getItem(t))return void(e.hidden=!0)}catch{}e.querySelector("[data-trial-banner-dismiss]")?.addEventListener("click",()=>{e.hidden=!0;try{localStorage.setItem(t,"true")}catch{}})})(),(()=>{const e="plotdirector:story-position-changed",t=(e,t)=>{const n=e?.position||e?.Position||e||{},a=(...e)=>{for(const t of e){const e=Number.parseInt(t||"",10);if(Number.isInteger(e)&&e>0)return e}return null};return{source:t||e?.source||e?.Source||"Navigation",projectId:a(n.projectId,n.ProjectId,e?.projectId,e?.ProjectId),bookId:a(n.bookId,n.BookId,e?.bookId,e?.BookId),chapterId:a(n.chapterId,n.ChapterId,e?.chapterId,e?.ChapterId),sceneId:a(n.sceneId,n.SceneId,e?.sceneId,e?.SceneId),canonicalUrl:e?.canonicalUrl||e?.CanonicalUrl||e?.sceneUrl||e?.SceneUrl||""}};window.PlotDirectorStoryPosition={eventName:e,normalise:t,publishChanged:(n,a)=>{const o=t(n,a);return o.projectId?(document.dispatchEvent(new CustomEvent(e,{bubbles:!0,detail:o})),o):o}}})(),(()=>{const e=document.querySelector("[data-word-companion-follow-toggle]");if(!e||!window.signalR)return;const t="plotdirector.followWordCompanion",n=["/pricing","/about","/contact","/privacy","/terms","/admin","/billing","/account","/login","/register","/feature-requests/admin","/featurerequests/admin","/manageaccount"];let a=null,o=null;const r=()=>{try{return"true"===localStorage.getItem(t)}catch{return!1}},i=t=>{e.setAttribute("aria-pressed",String(t)),e.classList.toggle("active",t),e.title=t?"PlotDirector will follow the current Word Companion scene.":"Enable this to let PlotDirector follow the current Word Companion scene."},s=(e,t)=>{if("string"!=typeof e||!e.startsWith(t))return"";try{const t=new URL(e,window.location.origin);return t.origin===window.location.origin?`${t.pathname}${t.search}${t.hash}`:""}catch{return""}},l=e=>{if(!r()||!(()=>{const e=window.location.pathname.toLowerCase();return!("/"===e||""===e||document.querySelector("[data-writing-mode]")||"/writing/context"===e||e.startsWith("/writing/context/")||"/writing/intent"===e||e.startsWith("/writing/intent/")||n.some(t=>e===t||e.startsWith(`${t}/`)))})()||!e)return;`${window.location.pathname}${window.location.search}${window.location.hash}`!==e&&window.location.assign(e)};i(r()),e.addEventListener("click",()=>{const e=!r();(e=>{try{localStorage.setItem(t,e?"true":"false")}catch{}})(e),i(e)});const c=(new signalR.HubConnectionBuilder).withUrl("/hubs/word-companion-follow").withAutomaticReconnect().build();c.on("wordCompanionSceneChanged",e=>{const t=(window.PlotDirectorStoryPosition?.publishChanged(e,"WordCompanion")||{sceneId:Number.parseInt(e?.sceneId||e?.SceneId||"",10)}).sceneId;if(!Number.isInteger(t)||t<=0||t===a)return;a=t;const n=s(e?.sceneUrl||e?.SceneUrl||"","/Scenes/Edit/");l(n)}),c.on("storyPositionChanged",e=>{window.PlotDirectorStoryPosition?.publishChanged(e,e?.source||e?.Source||"WordCompanion")}),c.on("wordCompanionCharactersCreated",e=>{const t=Number.parseInt(e?.projectId||e?.ProjectId||"",10);if(!Number.isInteger(t)||t<=0||t===o)return;o=t;const n=s(e?.charactersUrl||e?.CharactersUrl||"","/Characters");l(n)}),c.start().catch(e=>{console.debug("Word Companion follow connection unavailable.",e)})})(),(()=>{const e=document.getElementById("plotlineConfirmModal"),t=e&&window.bootstrap?new bootstrap.Modal(e):null,n=e?.querySelector("#plotlineConfirmModalTitle"),a=e?.querySelector("#plotlineConfirmModalMessage"),o=e?.querySelector("[data-confirm-submit]"),r=e?.querySelector("[data-delete-confirm-field]"),i=e?.querySelector("[data-delete-confirm-input]");let s=null,l=null;e?.addEventListener("hidden.bs.modal",()=>{s=null,l=null,i&&(i.value=""),r?.classList.add("d-none"),o?.removeAttribute("disabled")}),i?.addEventListener("input",()=>{"true"===s?.dataset.requireDeleteText&&o&&(o.disabled="DELETE"!==i.value.trim())}),o?.addEventListener("click",()=>{if(s){if("true"===s.dataset.requireDeleteText){const e=s.querySelector("[data-delete-confirm-target], [name='confirmationText']");e&&(e.value=i?.value.trim()||"")}s.dataset.confirmed="true",t?.hide(),s.requestSubmit&&l?s.requestSubmit(l):s.requestSubmit?s.requestSubmit():s.submit()}}),document.addEventListener("submit",c=>{const d=c.target;if(!(d instanceof HTMLFormElement)||"true"===d.dataset.confirmed||"true"===d.dataset.confirmSkip||"true"===d.dataset.noDeleteConfirm)return;const p=d.dataset.confirmMessage,u=c.submitter instanceof HTMLElement?c.submitter:d.querySelector("button[type='submit']"),h=u?.textContent||"",m=d.getAttribute("action")||"",g=/restore/i.test(h)||/\/restore\b/i.test(m),f=/delete forever/i.test(h)||/\/deleteforever\b/i.test(m),v=!g&&!f&&(/archive/i.test(h)||/\/archive\b/i.test(m)),y=!f&&/(delete|remove)/i.test(h);if(!(p||v||g||y||f))return;const w=p||(v?"Archive this item?\n\nThis will hide it from active lists and timelines, but the data will be kept and can be restored later.":g?"Restore this item?\n\nThis will return it to active lists and timelines where applicable.":f?"Permanently delete this item?\n\nThis cannot be undone. Any linked planning data may also be removed or become unavailable. Only continue if you are certain.":"Remove this item?\n\nThis removes the link or supporting record. Major story items are archived instead of permanently deleted.");if(!(t&&e&&n&&a&&o))return;c.preventDefault();const b=(e=>{const t=e.split(/\n\s*\n/);return{title:t.shift()?.trim()||"Confirm action",body:t.join("\n\n").trim()}})(w);s=d,l=u,n.textContent=d.dataset.confirmTitle||b.title,a.textContent=d.dataset.confirmBody||b.body,o.textContent=d.dataset.confirmButtonText||h.trim()||"Confirm",o.className=`btn ${d.dataset.confirmButtonClass||(g?"btn-primary":"btn-danger")}`;const L="true"===d.dataset.requireDeleteText||f;r?.classList.toggle("d-none",!L),L&&o&&(o.disabled=!0,i?.focus()),t.show(),L&&window.setTimeout(()=>i?.focus(),200)})})(),(()=>{if(!window.bootstrap)return;const e=new Map;let t=null;const n=new WeakSet,a=e=>e.querySelector("[data-help-tooltip]")||e,o=e=>bootstrap.Tooltip.getInstance(a(e))?.hide(),r=(e=null)=>{t&&t!==e&&bootstrap.Popover.getInstance(t)?.hide()},i=()=>document.querySelectorAll("[data-help-icon]").forEach(e=>o(e)),s=(s=document)=>{(e=>{if(!e)return[];const t=[];return e.matches?.("[data-help-icon]")&&t.push(e),e.querySelectorAll?.("[data-help-icon]").forEach(e=>t.push(e)),t})(s).forEach(s=>{if(n.has(s))return;n.add(s);const l=a(s),c=l.dataset.helpMicro||"Help article not found.",d=s.dataset.helpTitle||"Help unavailable",p=s.dataset.helpSummary||"Help content has not yet been written for this feature.";bootstrap.Tooltip.getOrCreateInstance(l,{title:c,trigger:"hover focus",placement:"top",container:"body"});const u=bootstrap.Popover.getOrCreateInstance(s,{title:d,trigger:"click",placement:"auto",container:"body",html:!0,customClass:"plotline-help-popover",content(){const e=document.createElement("div"),t=document.createElement("p");t.className="mb-2",t.textContent=p;const n=document.createElement("a");return n.href=s.dataset.helpUrl||"#",n.textContent="More...",n.className="plotline-help-more",n.addEventListener("click",e=>{e.preventDefault(),r(),i(),s.dispatchEvent(new CustomEvent("plotline:help-more",{bubbles:!0,detail:{key:s.dataset.helpKey||""}}))}),e.append(t,n),e}});e.set(s,u),s.addEventListener("click",e=>{window.PlotLineHelpDrawer?.isActive?.()&&(e.preventDefault(),e.stopPropagation(),r(),o(s),window.PlotLineHelpPopovers?.hideAll(),window.PlotLineHelpDrawer.open(s.dataset.helpKey||""))}),s.addEventListener("show.bs.popover",e=>{window.PlotLineHelpDrawer?.isActive?.()?e.preventDefault():(r(s),o(s))}),s.addEventListener("shown.bs.popover",()=>{t=s,o(s)}),s.addEventListener("hidden.bs.popover",()=>{t===s&&(t=null)})})};document.addEventListener("click",e=>{const n=e.target instanceof Element?e.target:null;if(!n||!t)return;if(n.closest("[data-help-icon]"))return;const a=document.querySelector(`#${t.getAttribute("aria-describedby")}`);a?.contains(n)||r()}),document.addEventListener("keydown",e=>{"Escape"===e.key&&r()}),window.PlotLineHelpPopovers={hideAll(){e.forEach(e=>e.hide()),i(),t=null}},window.PlotLineHelpIcons={init:s},s()})(),(()=>{const e=document.querySelector("[data-help-layout]"),t=document.querySelector("[data-help-drawer]"),n=document.querySelector("[data-help-content]"),a=document.querySelector("[data-help-splitter]"),o=document.querySelector("[data-help-close]"),r=document.querySelector("[data-help-collapse]"),i=document.querySelector("[data-help-expand]"),s=document.querySelector("[data-help-pin]"),l=document.querySelector("[data-help-drawer-heading]");if(!e||!t||!n)return;const c="plotline.helpDrawer.width",d="plotline.helpDrawer.pinned",p="plotline.helpDrawer.key",u="plotline.helpDrawer.collapsed",h=e=>{try{return"true"===localStorage.getItem(e)}catch{return!1}},m=(e,t)=>{try{localStorage.setItem(e,t)}catch{}},g=t=>{const n=`${((e,t,n)=>Math.min(n,Math.max(t,e)))(Number.parseFloat(t)||25,20,50)}%`;e.style.setProperty("--help-drawer-width",n),m(c,n)},f=e=>{m(d,String(e)),s?.setAttribute("aria-pressed",String(e)),s&&(s.textContent=e?"Unpin":"Pin")},v=t=>{e.classList.toggle("help-collapsed",t),m(u,String(t)),r&&(r.textContent=t?"Expand":"Collapse")},y=async(t,a={})=>{const o=t||"";e.classList.add("help-open"),a.keepCollapsed||v(!1),m(p,o),l&&(l.textContent=o||"Help"),n.innerHTML='

Loading help...

';try{const e=await fetch(`/HelpDrawer/Article?key=${encodeURIComponent(o)}`,{headers:{"X-Requested-With":"XMLHttpRequest"}});n.innerHTML=e.ok?await e.text():'

Help for this feature has not yet been written.

';const t=n.querySelector(".help-drawer-article h2")?.textContent?.trim();l&&t&&(l.textContent=t)}catch{n.innerHTML='

Help for this feature has not yet been written.

'}};window.PlotLineHelpDrawer={isActive:()=>e.classList.contains("help-open"),open:e=>y(e)},g(localStorage.getItem(c)||"25%"),f(h(d)),v(h(u)),document.addEventListener("plotline:help-more",e=>{const t=e.detail?.key||e.target?.dataset?.helpKey||"";window.PlotLineHelpPopovers?.hideAll(),y(t)}),document.addEventListener("click",e=>{const t=e.target instanceof Element?e.target.closest("[data-help-open]"):null;t&&(e.preventDefault(),window.PlotLineHelpPopovers?.hideAll(),y(t.dataset.helpOpen||""))}),o?.addEventListener("click",()=>{e.classList.remove("help-open","help-collapsed"),f(!1)}),r?.addEventListener("click",()=>v(!e.classList.contains("help-collapsed"))),i?.addEventListener("click",()=>v(!1)),i?.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),v(!1))}),s?.addEventListener("click",()=>f(!h(d))),a?.addEventListener("pointerdown",t=>{if(!e.classList.contains("help-open")||e.classList.contains("help-collapsed"))return;t.preventDefault(),document.body.classList.add("help-resizing"),a.setPointerCapture?.(t.pointerId);const n=t=>{const n=e.getBoundingClientRect(),a=(n.right-t.clientX)/n.width*100;g(a)},o=()=>{document.body.classList.remove("help-resizing"),document.removeEventListener("pointermove",n),document.removeEventListener("pointerup",o)};document.addEventListener("pointermove",n),document.addEventListener("pointerup",o)});const w=(()=>{try{return localStorage.getItem(p)||""}catch{return""}})();h(d)&&w&&y(w,{keepCollapsed:!0})})(),(()=>{const e=document.querySelectorAll("[data-metric-shape-chart]");if(!e.length)return;const t=["#2f6f63","#b35f3b","#6750a4","#c58b2b","#7d3f52","#33759b","#9c4d8f","#a33d3d","#6f8f3d","#d08a2f","#444b57"],n=new Set(["Overall Intensity","Tension","Emotional Weight","Action"]),a=[],o=e=>{const t=e.querySelector(".metric-chart-frame");if(!t)return;let n=Number(t.dataset.metricNaturalWidth||0);if(n&&"true"===t.dataset.metricCanvasConstrained||(t.style.width="",n=t.getBoundingClientRect().width,n&&(t.dataset.metricNaturalWidth=String(n))),!n)return;const a=Math.max(window.devicePixelRatio||1,1),o=Math.floor(3e4/a);n>o?(t.style.width=`${o}px`,t.dataset.metricCanvasConstrained="true"):(t.style.width="",t.dataset.metricCanvasConstrained="false")},r=()=>{window.requestAnimationFrame(()=>{a.forEach(({chart:e,root:t,timelineLayout:n})=>{n?n.schedule(!0):(o(t),e.resize())})})};window.PlotLineMetricCharts={resizeAll:r},window.addEventListener("plotline:timeline-layout-changed",r);const i={id:"plotlineChapterGuides",afterDraw(e){const t=e.config.options.plugins.plotlineScenes||[],{ctx:n,chartArea:a,scales:o}=e;if(!t.length||!o.x)return;n.save(),n.strokeStyle="rgba(47, 111, 99, 0.16)",n.fillStyle="rgba(82, 75, 65, 0.58)",n.lineWidth=1,n.font="700 10px system-ui, -apple-system, Segoe UI, sans-serif";const r=[];t.forEach((e,n)=>{n&&e.chapterLabel===t[n-1].chapterLabel&&e.bookTitle===t[n-1].bookTitle||r.push({scene:e,index:n})});const i=r.filter(e=>!e.scene.isPlaceholder),s=i.length>40?5:i.length>24?4:i.length>14?2:1;i.forEach((t,r)=>{const{scene:l,index:c}=t,d=o.x.getPixelForValue(e.data.datasets[0].data[c].x);if(!Number.isFinite(d)||da.right)return;n.beginPath(),n.moveTo(d,a.top),n.lineTo(d,a.bottom),n.stroke();const p=Number.parseInt(String(l.chapterLabel).replace(/[^0-9]/g,""),10);(0===r||r===i.length-1||1===s||Number.isFinite(p)&&p%s===0)&&n.fillText(l.chapterLabel,Math.min(d+4,a.right-70),a.bottom+22)}),n.restore()}};if(window.Chart){Chart.register(i);class e extends Chart.LinearScale{static id="timelinePosition";getPixelForValue(e){return Number(e)-(this.chart.$timelineViewportLeft||0)}getValueForPixel(e){return e+(this.chart.$timelineViewportLeft||0)}}Chart.register(e)}e.forEach(e=>{const r=e.querySelector("script[type='application/json']"),i=e.querySelector("canvas"),s=e.querySelector("[data-metric-toggles]"),l=e.querySelector("[data-chart-fallback]"),c=e.querySelector("[data-timeline-metric-edit-toolbar]"),d=e.querySelector("[data-edit-metric-status]"),p=e.hasAttribute("data-timeline-metric-editor")&&c&&d;if(!r||!i)return;let u;try{u=JSON.parse(r.textContent||"{}")}catch{return void l?.classList.remove("d-none")}if(!window.Chart||!u.scenes?.length||!u.metrics?.length)return void l?.classList.remove("d-none");const h=e.closest(".timeline-shell"),m=h?.querySelector(".timeline-series-row"),g=e.querySelector(".metric-chart-frame"),f=new Map(Array.from(m?.querySelectorAll(".timeline-scene-card[data-scene-id]")||[],e=>[Number(e.dataset.sceneId),e])),v=h&&m&&f.size?document.createElement("div"):null;let y=null,w=!1;v&&(v.className="metric-timeline-viewport",i.before(v),v.append(i));const b=new Set(u.defaultMetrics?.length?u.defaultMetrics:n),L=u.scenes.length,S=L>80?10:L>40?5:L>24?4:L>14?2:1,E=u.metrics.map((e,n)=>{const a=new Map(e.points.map(e=>[e.sceneId,e.value])),o=t[n%t.length];return{label:e.metricName,metricTypeId:e.metricTypeId,minValue:Number.isFinite(e.minValue)?e.minValue:1,maxValue:Number.isFinite(e.maxValue)?e.maxValue:10,data:u.scenes.map((e,t)=>{const n=a.get(e.sceneId);return null==n?{x:t+.5,y:null,sceneId:e.sceneId}:{x:t+.5,y:n,sceneId:e.sceneId}}),borderColor:o,backgroundColor:o,pointBackgroundColor:o,pointBorderColor:"#fff",pointBorderWidth:1.5,pointRadius:3,pointHoverRadius:5,borderWidth:2,tension:.35,spanGaps:!0,hidden:!b.has(e.metricName)}});let I=null,x=!1;o(e);const C=e=>{d&&(d.textContent=e)},q=()=>E.map((e,t)=>t).filter(e=>$?.isDatasetVisible(e)),k=()=>{const e=q();return 1===e.length?e[0]:-1},P=()=>{if(!p)return;const e=k();E.forEach((t,n)=>{t.pointRadius=n===e?5:3,t.pointHoverRadius=n===e?7:5,t.borderWidth=n===e?3:2});const t=q(),n=e>=0;i.classList.toggle("metric-curve-editing",n),d.classList.toggle("d-none",0===t.length),0===t.length?C(""):C(n?"Drag points up or down to edit this metric.":"Show only one metric line to edit its curve."),$?.update()};s.innerHTML="",E.forEach((e,t)=>{const n=`metric-toggle-${Math.random().toString(36).slice(2)}-${t}`,a=document.createElement("label");a.className="metric-toggle-pill",a.style.setProperty("--metric-colour",e.borderColor),a.innerHTML=`${e.label}`,s.appendChild(a),a.querySelector("input").addEventListener("change",e=>{$.setDatasetVisibility(t,e.target.checked),P(),$.update()})});const $=new Chart(i,{type:"line",data:{datasets:E},options:{responsive:!0,animation:!v&&void 0,maintainAspectRatio:!1,interaction:{mode:"nearest",intersect:!1},scales:{y:{min:1,max:10,ticks:{stepSize:1},grid:{color:"rgba(82, 75, 65, 0.10)"}},x:{type:"linear",min:0,max:L,bounds:"ticks",ticks:{maxRotation:0,autoSkip:!1,maxTicksLimit:16,callback(e){const t=E[0].data.findIndex(t=>t.x===Number(e));if(t<0||t>=L)return"";const n=u.scenes[t];return 0!==t&&t!==L-1&&t%S!==0||n?.isPlaceholder?"":n?.axisLabel||""}},afterBuildTicks(e){e.ticks=E[0].data.filter(t=>Number.isFinite(t.x)&&(!w||t.x>=e.min&&t.x<=e.max)).map(e=>({value:e.x}))},grid:{display:!1}}},plugins:{legend:{display:!1},plotlineScenes:u.scenes,tooltip:{callbacks:{title(e){const t=e[0].dataIndex,n=u.scenes[t];return n.isPlaceholder?n.sceneTitle||"No scene":`${n.chapterLabel}, Scene ${n.sceneNumber}: ${n.sceneTitle}`},label:e=>`${e.dataset.label}: ${e.formattedValue}`,afterBody(e){const t=e[0].dataIndex,n=u.scenes[t],a=[];return n.characterPresence?a.push(n.characterPresence):void 0!==n.characterAppears&&a.push(n.characterAppears?"Character appears":"Character does not appear"),n.bookTitle&&a.push(n.bookTitle),a}}}}}});if(p&&(P(),i.addEventListener("pointerdown",e=>{I=(e=>{if(!p)return null;const t=k();if(t<0)return null;const n=$.getElementsAtEventForMode(e,"nearest",{intersect:!0},!0).find(e=>e.datasetIndex===t);if(!n)return null;const a=$.data.datasets[n.datasetIndex],o=a?.data?.[n.index];return o?.sceneId&&null!=o.y?{datasetIndex:n.datasetIndex,pointIndex:n.index,previousValue:o.y}:null})(e),I&&(e.preventDefault(),i.setPointerCapture?.(e.pointerId),x=!0)}),i.addEventListener("pointermove",e=>{if(!I)return;const t=$.data.datasets[I.datasetIndex],n=t?.data?.[I.pointIndex];t&&n&&(n.y=((e,t)=>{const n=$.scales.y.getValueForPixel(e.offsetY),a=Math.round(n);return Math.max(t.minValue,Math.min(t.maxValue,a))})(e,t),$.update("none"))}),i.addEventListener("pointerup",async t=>{if(!I)return;const n=I;I=null,i.releasePointerCapture?.(t.pointerId),await(async t=>{const n=$.data.datasets[t.datasetIndex],a=n?.data?.[t.pointIndex];if(!n||!a?.sceneId)return;const o=c?.querySelector("input[name='__RequestVerificationToken']")?.value||"";C("Saving...");try{const t=await fetch(e.dataset.updateUrl||"/SceneMetrics/UpdateSceneMetricValue",{method:"POST",headers:{"Content-Type":"application/json",RequestVerificationToken:o},body:JSON.stringify({sceneId:Number(a.sceneId),metricId:Number(n.metricTypeId),value:Number(a.y)})}),r=await t.json().catch(()=>({}));if(!t.ok||!r.success)throw new Error(r.message||"Save failed");a.y=r.value,C("Saved"),$.update()}catch{a.y=t.previousValue,C("Save failed"),$.update()}})(n),window.setTimeout(()=>{x=!1},0)}),i.addEventListener("pointercancel",e=>{if(!I)return;const t=$.data.datasets[I.datasetIndex],n=t?.data?.[I.pointIndex];n&&(n.y=I.previousValue),I=null,i.releasePointerCapture?.(e.pointerId),x=!1,$.update()})),i.addEventListener("click",e=>{if(x)return void e.preventDefault();const t=$.getElementsAtEventForMode(e,"nearest",{intersect:!0},!0);if(!t.length)return;const n=t[0].index,a=u.scenes[n];a?.timelineUrl&&(window.PlotLineTimelineScroll?.save(),window.location.href=a.timelineUrl)}),v){let t=0,n=!1;const a=()=>{if(t=0,e.getBoundingClientRect().width){if(n){n=!1;const t=m.getBoundingClientRect();if(t.width){const n=g.getBoundingClientRect().left,a=new Map;let o=t.right-n;f.forEach((e,t)=>{const r=e.getBoundingClientRect();r.width&&(a.set(t,r.left+r.width/2-n),o=Math.max(o,r.right-n))}),a.size&&(e.style.setProperty("--metric-layout-width",`${o}px`),g.style.width=`${o}px`,g.classList.add("metric-timeline-measured"),E.forEach(e=>e.data.forEach(e=>{e.x=a.get(e.sceneId)??NaN})),w=!0,$.options.scales.x.type="timelinePosition")}}w?(v.style.width=`${Math.min(h.clientWidth,g.clientWidth,Math.floor(3e4/Math.max(window.devicePixelRatio||1,1)))}px`,$.$timelineViewportLeft=i.getBoundingClientRect().left-g.getBoundingClientRect().left,$.options.scales.x.min=$.$timelineViewportLeft,$.options.scales.x.max=$.$timelineViewportLeft+v.clientWidth):o(e),$.resize(),$.update("none")}},r=(e=!1)=>{n||=e,t||(t=window.requestAnimationFrame(a))};y={schedule:r},h.addEventListener("scroll",()=>r(),{passive:!0}),window.addEventListener("resize",()=>r(!0));const s=window.ResizeObserver?new ResizeObserver(()=>r(!0)):null;s?.observe(h),s?.observe(m),s?.observe(e),m.querySelectorAll(".timeline-book, .timeline-book-title, .timeline-chapter, .timeline-scenes, .timeline-scene-card").forEach(e=>s?.observe(e)),r(!0)}else{const t=window.ResizeObserver?new ResizeObserver(()=>{o(e),$.resize()}):null;t?.observe(e),t?.observe(g||e)}a.push({chart:$,root:e,timelineLayout:y})})})(),(()=>{const e=document.querySelector("[data-timeline-root]"),t=document.querySelector("[data-timeline-controls]");if(!e||!t)return;const n="plotline.timeline.visibility",a={"scene-cards":!0,"plot-lines":!0,assets:!0,characters:!0,locations:!0,warnings:!0,metrics:!0},o=t=>{Object.entries(t).forEach(([t,n])=>{e.classList.toggle(`hide-${t}`,!n),document.querySelectorAll(`[data-timeline-section='${t}']`).forEach(e=>{e.classList.toggle("timeline-section-hidden",!n)})}),document.querySelectorAll("[data-location-marker]").forEach(e=>{e.classList.toggle("timeline-section-hidden",!t.locations)}),document.querySelectorAll("[data-warning-marker]").forEach(e=>{e.classList.toggle("timeline-section-hidden",!t.warnings)}),document.querySelector("[data-visibility-json]")?.setAttribute("value",JSON.stringify(t))},r=(()=>{try{return{...a,...JSON.parse(localStorage.getItem(n)||"{}")}}catch{return{...a}}})();t.querySelectorAll("[data-timeline-toggle]").forEach(e=>{const t=e.dataset.timelineToggle;e.checked=r[t]??!0,e.addEventListener("change",()=>{r[t]=e.checked,localStorage.setItem(n,JSON.stringify(r)),o(r)})}),t.querySelector("[data-timeline-preset-form]")?.addEventListener("submit",()=>{document.querySelector("[data-visibility-json]")?.setAttribute("value",JSON.stringify(r))}),o(r)})(),(()=>{const e=document.querySelector("[data-timeline-root]");if(!e)return;const t=e.querySelector(".timeline-workspace")||e,n=document.querySelector("[data-timeline-density]"),a=document.querySelector("[data-timeline-zoom]"),o=document.querySelector("[data-timeline-search]"),r=e.querySelector("[data-timeline-minimap]"),i=document.querySelectorAll("[data-timeline-jump], [data-timeline-warning-jump], [data-timeline-entity-jump]"),s=[...e.querySelectorAll(".timeline-scene-card[data-scene-id]")],l="plotline.timeline.collapsed",c="plotline.timeline.density",d="plotline.timeline.zoom",p="plotline.timeline.pending-scroll",u="plotdirector.timelineNavigationDiscovered",h="plotline.timeline.inspectorWidth",m=[".timeline-shell",".plot-lane-board",".asset-lane-board",".character-lane-board",".metric-graph-stack","[data-timeline-minimap]"].join(","),g=["compact","comfortable","expanded"],f=["book","chapter","scene-detail","scene-overview"],v=e.querySelector("[data-inspector-drawer]"),y=e.querySelector("[data-inspector-resizer]"),w=e.querySelector("[data-inspector-close]"),b=null!==localStorage.getItem(l),L=(e=>{try{return new Set(JSON.parse(localStorage.getItem(e)||"[]"))}catch{return new Set}})(l),S=()=>[...e.querySelectorAll(m)],E=t=>{if(!v)return;const{minimum:n,maximum:a,defaultWidth:o}=(()=>{const t=e.getBoundingClientRect().width||window.innerWidth,n=Math.min(420,Math.max(320,t-360)),a=Math.max(n,Math.min(.65*t,t-420));return{minimum:n,maximum:a,defaultWidth:Math.max(n,Math.min(a,.4*t))}})(),r=Math.max(n,Math.min(a,Number(t)||o));e.style.setProperty("--timeline-inspector-width",`${Math.round(r)}px`)};v&&(E(localStorage.getItem(h)),window.addEventListener("resize",()=>E(localStorage.getItem(h)))),(()=>{const o=e.querySelector("[data-timeline-navigation-card]");if(!o)return;const r=o.querySelector("[data-timeline-navigation-dismiss]"),i=o.querySelector("[data-timeline-navigation-demo]"),s=()=>e.querySelector(".timeline-shell"),l=e=>Boolean(e&&e.scrollWidth>e.clientWidth+8),c=e=>Math.max(0,e.scrollWidth-e.clientWidth),d=()=>[t,...S()].filter((e,t,n)=>e&&n.indexOf(e)===t);let p=!1,h=!1,m=!1,g=null;const f=new WeakMap,v=e=>f.set(e,e.scrollLeft),y=(e=!1)=>{if(window.clearTimeout(g),!e||window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches||o.hidden)return o.classList.remove("is-dismissing"),void(o.hidden=!0);o.classList.add("is-dismissing"),g=window.setTimeout(()=>{o.hidden=!0,o.classList.remove("is-dismissing")},1300)},w=e=>{const t=l(e),n=c(e);e.classList.toggle("timeline-horizontal-overflow",t),e.classList.toggle("has-scroll-left",t&&e.scrollLeft>8),e.classList.toggle("has-scroll-right",t&&e.scrollLeft{l(s())&&!(()=>{try{return"true"===localStorage.getItem(u)}catch{return!1}})()&&!p?(window.clearTimeout(g),o.hidden=!1,o.classList.remove("is-dismissing")):o.classList.contains("is-dismissing")||y(!1),d().forEach(w)},L=()=>{p=!0,y(!0);try{localStorage.setItem(u,"true")}catch{}};d().forEach(e=>{v(e),e.addEventListener("wheel",t=>{if(!t.defaultPrevented&&t.shiftKey&&Math.abs(t.deltaY)>Math.abs(t.deltaX)&&l(e)){const n=e.scrollLeft;t.preventDefault(),e.scrollLeft+=t.deltaY,window.requestAnimationFrame(()=>{w(e),!h&&Math.abs(e.scrollLeft-n)>4&&L(),v(e)})}},{passive:!1}),e.addEventListener("scroll",()=>(e=>{if(w(e),!m||h)return void v(e);const t=f.get(e)??e.scrollLeft;Math.abs(e.scrollLeft-t)>4&&l(e)?L():v(e)})(e),{passive:!0})}),r?.addEventListener("click",L),i?.addEventListener("click",()=>{const e=s();if(!l(e))return void b();const t=e.scrollLeft,n=c(e)-t;let a=Math.min(220,n),o=1;a<24&&t>0&&(a=Math.min(220,t),o=-1),a<4||(h=!0,e.scrollTo({left:t+a*o,behavior:"smooth"}),window.setTimeout(()=>{e.scrollTo({left:t,behavior:"smooth"})},420),window.setTimeout(()=>{h=!1,d().forEach(e=>{v(e),w(e)}),b()},950))}),window.setTimeout(()=>{m=!0,d().forEach(v)},800),window.requestAnimationFrame(b),window.addEventListener("resize",b),window.addEventListener("plotline:timeline-layout-changed",b),n?.addEventListener("change",()=>window.requestAnimationFrame(b)),a?.addEventListener("change",()=>window.requestAnimationFrame(b))})(),y?.addEventListener("pointerdown",t=>{t.preventDefault(),document.body.classList.add("timeline-inspector-resizing"),y.setPointerCapture(t.pointerId);const n=t=>{const n=e.getBoundingClientRect().right-t.clientX;E(n)},a=()=>{document.body.classList.remove("timeline-inspector-resizing");const e=Math.round(v?.getBoundingClientRect().width||0);e>0&&localStorage.setItem(h,String(e)),window.dispatchEvent(new Event("plotline:timeline-layout-changed")),y.removeEventListener("pointermove",n),y.removeEventListener("pointerup",a),y.removeEventListener("pointercancel",a)};y.addEventListener("pointermove",n),y.addEventListener("pointerup",a),y.addEventListener("pointercancel",a)}),w?.addEventListener("click",e=>{e.preventDefault();const t=new URL(window.location.href),n=t.searchParams.get("FocusType")||t.searchParams.get("focusType");t.searchParams.delete("SelectedSceneID"),t.searchParams.delete("selectedSceneId"),t.searchParams.delete("selectedsceneid"),n&&"scene"!==n.toLowerCase()||(t.searchParams.delete("FocusType"),t.searchParams.delete("focusType"),t.searchParams.delete("FocusID"),t.searchParams.delete("focusId")),I(),window.location.href=t.toString()});const I=()=>{try{sessionStorage.setItem(p,JSON.stringify({path:window.location.pathname,top:window.scrollY,left:window.scrollX,workspaceLeft:t.scrollLeft,workspaceTop:t.scrollTop,containers:S().map((e,t)=>({index:t,left:e.scrollLeft,top:e.scrollTop}))}))}catch{}};window.PlotLineTimelineScroll={save:I};const x=(t,n,a)=>{a.forEach(n=>e.classList.remove(`${t}-${n}`)),e.classList.add(`${t}-${n}`)},C=e=>{const t=g.includes(e)?e:"comfortable";x("density",t,g),n&&(n.value=t),localStorage.setItem(c,t),window.dispatchEvent(new Event("plotline:timeline-layout-changed"))},q=e=>{const t=f.includes(e)?e:"chapter";x("zoom",t,f),a&&(a.value=t),localStorage.setItem(d,t),window.dispatchEvent(new Event("plotline:timeline-layout-changed"))},k=(t,n=!0)=>{const a=(t=>e.querySelector(`[data-scene-id='${CSS.escape(String(t))}']`))(t);a&&(a.classList.add("keyboard-focus"),a.scrollIntoView({behavior:"smooth",block:"center",inline:"center"}),n&&a.focus({preventScroll:!0}),window.setTimeout(()=>a.classList.remove("keyboard-focus"),1800))},P=()=>{e.querySelectorAll("[data-plot-line-svg-board]").forEach(e=>{const t=e.querySelector("[data-plot-line-svg]");if(!t)return;let n=e.querySelector("[data-plot-line-health-svg]");n||(n=document.createElementNS("http://www.w3.org/2000/svg","svg"),n.setAttribute("class","plot-lane-svg-overlay plot-lane-svg-health-overlay"),n.setAttribute("data-plot-line-health-svg",""),n.setAttribute("aria-hidden","true"),t.after(n)),t.replaceChildren(),n.replaceChildren();const a=e.getBoundingClientRect(),o=Math.max(e.scrollWidth,a.width),r=Math.max(e.scrollHeight,a.height);[t,n].forEach(e=>{e.setAttribute("viewBox",`0 0 ${o} ${r}`),e.setAttribute("width",String(o)),e.setAttribute("height",String(r))});const i=(e,t={})=>{const n=document.createElementNS("http://www.w3.org/2000/svg",e);return Object.entries(t).forEach(([e,t])=>n.setAttribute(e,String(t))),n},s=[...new Set([...e.querySelectorAll("[data-plot-line-slot]")].map(e=>{const t=e.getBoundingClientRect();return Math.round(t.left-a.left+t.width/2)}))].sort((e,t)=>e-t),l=Math.max(s.length-1,0),c=new Map;e.querySelectorAll("[data-plot-line-row]").forEach(e=>{e.dataset.plotLineId&&c.set(e.dataset.plotLineId,e)});const d=[...c.values()].map(e=>({row:e,plotLineId:e.dataset.plotLineId,colour:e.dataset.plotColour||"#2f6f63",points:[...e.querySelectorAll("[data-plot-event-node]")].map(e=>((e,t)=>{const n=t.closest("[data-plot-line-slot]");if(!n)return null;const o=n.getBoundingClientRect(),r=t.getBoundingClientRect();return{x:r.left-a.left+r.width/2,y:r.top-a.top+r.height/2,sceneX:o.left-a.left+o.width/2,radius:Math.max(r.width,r.height)/2,sceneIndex:0,type:(t.dataset.plotEventType||"Progress").toLowerCase(),targetPlotLineId:t.dataset.targetPlotLineId||"",targetPlotLineIds:(t.dataset.targetPlotLineIds||"").split(",").map(e=>e.trim()).filter(Boolean)}})(0,e)).filter(Boolean).map(e=>({...e,sceneIndex:Math.max(0,s.findIndex(t=>t===Math.round(e.sceneX)))})).sort((e,t)=>e.x-t.x),incomingStartXs:[]})),p=new Map(d.map(e=>[e.plotLineId,e])),u=(e,n,o,r)=>{if(!n)return void(window.console?.warn&&window.console.warn(`Plot line ${r} connector skipped because target plot line data is missing.`));e.x;const s=(e=>{const t=e.getBoundingClientRect();return t.top-a.top+t.height/2})(n),l=Math.max(28,Math.min(46,.28*Math.abs(s-e.y))),c=Math.max(8,e.radius||12),d=e.x+c,p=d+l,u=d+l/2;t.append(i("path",{class:`plot-line-svg-connector plot-line-svg-connector-${r}`,d:`M ${d} ${e.y} C ${u} ${e.y}, ${u} ${s}, ${p} ${s}`,stroke:o}))};d.forEach(e=>{e.points.forEach(e=>{"branch"===e.type&&e.targetPlotLineId&&p.get(e.targetPlotLineId)?.incomingStartXs.push(e.x),"split"===e.type&&e.targetPlotLineIds.forEach(t=>{p.get(t)?.incomingStartXs.push(e.x)})})}),d.forEach(e=>{e.health=(e=>{const t=e.some(e=>"resolve"===e.type),n=e.some(e=>"abandon"===e.type),a=e.find(e=>"resolve"===e.type),o=e.find(e=>"abandon"===e.type),r=e.some(e=>"merge"===e.type&&e.targetPlotLineId),i=e.some(e=>"split"===e.type&&e.targetPlotLineIds.length>=2),s=Boolean(a)&&e.some(e=>"branch"===e.type&&e.targetPlotLineId&&e.sceneIndex>=a.sceneIndex),c=e.reduce((e,t)=>Math.max(e,t.sceneIndex),0),d=!t&&!n&&l-c>=10,p=t&&!r&&!i&&!s;let u="active";return n?u="abandoned":t?u=p?"questionable":"resolved":d&&(u="neglected"),{state:u,isNeglected:d,isDangling:!t&&!n&&!r&&!i&&l>=c,isQuestionable:p,isAbandoned:n,resolvePoint:a,abandonPoint:o}})(e.points),e.state=e.health.state}),d.forEach(e=>{const{colour:n,points:a,incomingStartXs:o,state:r}=e;if(a.length>0){const s=a.find(e=>"start"===e.type),l=o.length?Math.min(...o):null,c=a.find(e=>"split"===e.type||"merge"===e.type),d=a[0],p=a[a.length-1],u=((null===l||s&&s.xe.x-t.x),m=c?h.indexOf(c):-1,g=m>=0?h.slice(0,m+1):h;null!==l&&l{const o=g[a+1];if(!o||o.x<=e.x)return;const s=Math.abs(o.sceneIndex-e.sceneIndex)>=f;t.append(i("path",{class:`plot-line-svg-path plot-line-svg-segment ${s?"plot-line-svg-segment-dormant":""} plotline-state-${r}`,d:`M ${e.x} ${e.y} L ${o.x} ${o.y}`,stroke:n}))})}}),d.forEach(({points:e,colour:t})=>{e.forEach(e=>{"branch"!==e.type&&"merge"!==e.type||u(e,c.get(e.targetPlotLineId),t,e.type),"split"===e.type&&e.targetPlotLineIds.length>=2?e.targetPlotLineIds.forEach(n=>{u(e,c.get(n),t,e.type)}):"split"===e.type&&e.targetPlotLineIds.length>0&&window.console?.warn&&window.console.warn("Plot line split connector skipped because fewer than two targets are available.")})}),d.forEach(e=>{const t=e.lineEndPoint||e.points[e.points.length-1],a=[];e.health?.isNeglected&&t&&a.push({point:t,kind:"neglected",label:"Dormant Thread",reason:"No activity for 10+ scenes.",action:"Add a Progress, Reveal or Resolve event."}),e.health?.isDangling&&t&&a.push({point:t,kind:"dangling",label:"Unresolved Thread",reason:"Thread contains no Resolve or Abandon event by the end of the current timeline.",action:"Review ending scenes and add Resolve or Abandon where appropriate."}),e.health?.isQuestionable&&e.health.resolvePoint&&a.push({point:e.health.resolvePoint,kind:"questionable",label:"Missing Closure",reason:"Resolved without merge, split, or branch.",action:"Verify this thread has sufficient payoff."}),e.health?.isAbandoned&&e.health.abandonPoint&&a.push({point:e.health.abandonPoint,kind:"abandoned",label:"Abandoned Thread",reason:"This plot line was abandoned.",action:"Check this is intentional."});const o=new Map;a.forEach(e=>{const t=`${Math.round(e.point.x)}:${Math.round(e.point.y)}`;o.has(t)||o.set(t,{point:e.point,warnings:[]}),o.get(t).warnings.push(e)}),o.forEach(({point:e,warnings:t})=>((e,t)=>{const a=Math.max(18,(e.radius||12)+8),o=t[0]?.kind||"warning",r=i("g",{class:`plotline-health-marker plotline-health-marker-${o}`}),s=i("title");s.textContent=(e=>e.map(e=>[`Warning: ${e.label}`,`Reason: ${e.reason}`,`Suggested Action: ${e.action}`].join("\n")).join("\n\n"))(t),r.append(s);const l=e.x+a,c=e.y-13;if("questionable"===o){r.append(i("circle",{cx:l,cy:c,r:9}));const e=i("text",{x:l,y:c+4,"text-anchor":"middle"});e.textContent=t.length>1?String(t.length):"?",r.append(e)}else if(r.append(i("circle",{cx:l,cy:c,r:10})),r.append(i("path",{d:`M ${l} ${c-6} L ${l+6} ${c+5} L ${l-6} ${c+5} Z`})),r.append(i("line",{x1:l,y1:c-2,x2:l,y2:c+2.5})),r.append(i("circle",{cx:l,cy:c+5.3,r:1.2})),t.length>1){const e=i("text",{x:l+11,y:c-6,"text-anchor":"middle",class:"plotline-health-count"});e.textContent=String(t.length),r.append(e)}n.append(r)})(e,t))})})},$=(e,t)=>{document.querySelectorAll(`[data-collapse-body='${CSS.escape(e)}']`).forEach(e=>{e.classList.toggle("timeline-section-collapsed",t)}),document.querySelectorAll(`[data-collapse-toggle='${CSS.escape(e)}']`).forEach(e=>{e.classList.toggle("is-collapsed",t),e.setAttribute("aria-expanded",String(!t))})};document.querySelectorAll("[data-collapse-toggle]").forEach(e=>{const t=e.dataset.collapseToggle;b||"collapsed"!==e.dataset.collapseDefault||L.add(t);const n=L.has(t);$(t,n),e.addEventListener("click",()=>{const e=!L.has(t);e?L.add(t):L.delete(t),$(t,e),localStorage.setItem(l,JSON.stringify([...L])),P(),window.dispatchEvent(new Event("plotline:timeline-layout-changed"))})}),n?.addEventListener("change",()=>C(n.value)),a?.addEventListener("change",()=>q(a.value)),C(localStorage.getItem(c)||"comfortable"),q(localStorage.getItem(d)||"chapter");const A=(()=>{try{return null!==sessionStorage.getItem(p)}catch{return!1}})();window.requestAnimationFrame(()=>{P(),((e="auto")=>{const t=r?.querySelector("[data-active-chapter='true']");if(!r||!t)return;const n=r.getBoundingClientRect(),a=t.getBoundingClientRect(),o=a.left+a.width/2,i=n.left+n.width/2;(a.leftn.right)&&r.scrollBy({left:o-i,behavior:e})})("auto"),A&&(()=>{let e=null;try{e=JSON.parse(sessionStorage.getItem(p)||"null"),sessionStorage.removeItem(p)}catch{try{sessionStorage.removeItem(p)}catch{}return}e&&e.path===window.location.pathname&&window.requestAnimationFrame(()=>{t.scrollLeft=Number(e.workspaceLeft)||0,t.scrollTop=Number(e.workspaceTop)||0;const n=S();(e.containers||[]).forEach(e=>{const t=n[e.index];t&&(t.scrollLeft=Number(e.left)||0,t.scrollTop=Number(e.top)||0)}),window.scrollTo(Number(e.left)||0,Number(e.top)||0)})})()}),window.addEventListener("resize",P),window.addEventListener("plotline:timeline-layout-changed",P);e.addEventListener("click",t=>{if(0!==t.button||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey)return;const n=t.target instanceof Element?t.target:null,a=n?.closest("a[href]");if(!a||!e.contains(a))return;[...new URL(a.href,window.location.href).searchParams.keys()].some(e=>"selectedsceneid"===e.toLowerCase())&&I()},{capture:!0});const M=()=>{const e=o?.value.trim().toLowerCase()||"";let t=null;return s.forEach(n=>{const a=!e||(n.dataset.timelineSearchText||"").toLowerCase().includes(e);n.classList.toggle("search-hit",Boolean(e&&a)),n.classList.toggle("search-dim",Boolean(e&&!a)),!t&&e&&a&&(t=n)}),t};o?.addEventListener("input",M),o?.addEventListener("keydown",e=>{if("Enter"!==e.key)return;const t=M();t&&(e.preventDefault(),k(t.dataset.sceneId))}),i.forEach(e=>{e.addEventListener("change",()=>{e.value&&k(e.value)})}),document.querySelectorAll("[data-jump-scene]").forEach(e=>{e.addEventListener("click",()=>{e.dataset.jumpScene&&k(e.dataset.jumpScene)})}),document.addEventListener("keydown",e=>{const n=document.activeElement?.tagName?.toLowerCase(),r=["input","select","textarea"].includes(n)||document.activeElement?.isContentEditable;if((e.ctrlKey||e.metaKey)&&"f"===e.key.toLowerCase()&&o)return e.preventDefault(),o.focus(),void o.select();if("Escape"===e.key){const e=new URL(window.location.href),t=e.searchParams.has("FocusType")||e.searchParams.has("FocusID");return e.searchParams.delete("FocusType"),e.searchParams.delete("FocusID"),void(t?window.location.href=e.toString():o?.value&&(o.value="",M()))}if(!r){if("ArrowLeft"===e.key||"ArrowRight"===e.key)return e.preventDefault(),void t.scrollBy({left:"ArrowLeft"===e.key?-260:260,behavior:"smooth"});if("+"===e.key||"="===e.key||"-"===e.key){const t=f.indexOf(a?.value||"chapter"),n="-"===e.key?-1:1,o=Math.min(f.length-1,Math.max(0,t+n));q(f[o])}}})})(),(()=>{const e=document.querySelector("[data-timeline-root]"),t=document.querySelector("[data-drag-drop-panel]");if(!t)return;const n=new Map([...document.querySelectorAll("[data-drag-form]")].map(e=>[e.dataset.dragForm,e])),a=t.querySelector("[data-drag-panel-title]"),o=t.querySelector("[data-drag-panel-kicker]"),r=t.querySelector("[data-drag-panel-summary]"),i=document.querySelector("[data-scene-move-modal]"),s=i&&window.bootstrap?.Modal?window.bootstrap.Modal.getOrCreateInstance(i):null,l=i?.querySelector("[data-scene-move-title]"),c=i?.querySelector("[data-scene-move-summary]"),d=i?.querySelector("[data-scene-move-submit]"),p="plotline.timeline.scroll";let u=null,h=0;const m=(e,t,n)=>{const a=e?.querySelector(`[name='${CSS.escape(t)}']`);a&&(a.value=n??"")},g=e=>e?.selectedOptions?.[0]?.textContent?.trim()||"",f=e=>`“${e||"this scene"}”`,v=(e,t,n,a,o)=>t&&n&&t===n?`Move ${f(e.label)} to this new position within ${n}?`:t&&n?`Move ${f(e.label)} from ${t} to ${n}?`:`Move ${f(e.label)} ${a.toLowerCase()} ${o}?`,y=(e,i,p,u)=>{if("scene"===e)return t.classList.add("d-none"),t.querySelectorAll("[data-drag-form]").forEach(e=>e.classList.add("d-none")),n.get("scene")?.classList.remove("d-none"),l&&(l.textContent=i),c&&(c.textContent=p),d&&d.classList.toggle("d-none",i.toLowerCase().startsWith("cannot")||i.toLowerCase().startsWith("scene already")),void(s?s.show():t.classList.remove("d-none"));n.forEach((t,n)=>t.classList.toggle("d-none",n!==e)),t.classList.remove("d-none"),a.textContent=i,o.textContent=u,r.textContent=p,t.scrollIntoView({behavior:"smooth",block:"center"})},w=()=>{t.classList.add("d-none"),n.forEach(e=>e.classList.add("d-none"))},b=()=>{document.querySelectorAll(".drop-target-active, .drop-before, .drop-after, .chapter-drop-active, .drop-chapter-end").forEach(e=>e.classList.remove("drop-target-active","drop-before","drop-after","chapter-drop-active","drop-chapter-end"))};try{const t=JSON.parse(sessionStorage.getItem(p)||"null");t&&(sessionStorage.removeItem(p),requestAnimationFrame(()=>{const n=e?.querySelector(".timeline-shell");n&&(n.scrollLeft=t.left||0),window.scrollTo({top:t.top||0})}))}catch{sessionStorage.removeItem(p)}const L=e=>{try{const t=JSON.parse(e.dataTransfer.getData("application/json")||"{}");return t.type?t:u||{}}catch{return u||{}}};document.querySelectorAll("[data-drag-type][draggable='true']").forEach(e=>{e.addEventListener("dragstart",t=>((e,t)=>{const n={type:t.dataset.dragType,id:t.dataset.dragId,label:t.dataset.dragLabel||t.textContent.trim()};e.dataTransfer.effectAllowed="copyMove",e.dataTransfer.setData("application/json",JSON.stringify(n)),e.dataTransfer.setData("text/plain",`${n.type}:${n.id}`),u=n,document.body.classList.add("drag-active",`dragging-${n.type}`),t.classList.add("is-dragging")})(t,e)),e.addEventListener("dragend",()=>{e.classList.remove("is-dragging"),document.body.classList.remove("drag-active","dragging-scene","dragging-character","dragging-asset","dragging-location"),u=null,b()})}),t.querySelectorAll("[data-drag-cancel]").forEach(e=>e.addEventListener("click",w)),n.get("scene")?.addEventListener("submit",()=>{const t=e?.querySelector(".timeline-shell");try{sessionStorage.setItem(p,JSON.stringify({left:t?.scrollLeft||0,top:window.scrollY||0}))}catch{}}),e?.querySelectorAll(".timeline-scene-card[data-scene-id]").forEach(t=>{t.addEventListener("click",e=>{Date.now(){const n=L(e);["scene","character","asset"].includes(n.type)&&(e.preventDefault(),e.stopPropagation(),e.dataTransfer.dropEffect="scene"===n.type?"move":"copy",t.classList.add("drop-target-active"),t.classList.toggle("drop-before","scene"===n.type&&e.offsetX=t.clientWidth/2))}),t.addEventListener("dragleave",()=>t.classList.remove("drop-target-active","drop-before","drop-after")),t.addEventListener("drop",a=>{const o=L(a);if(!["scene","character","asset"].includes(o.type))return;a.preventDefault(),a.stopPropagation(),h=Date.now()+800,t.classList.remove("drop-target-active","drop-before","drop-after");const r=t.dataset.sceneId;if("scene"===o.type){if(o.id===r)return void y("scene","Cannot move scene","Drop a scene before or after a different scene.","Scene move");const i=n.get("scene"),s=a.offsetX{const a=t.closest("[data-chapter-drop-target]"),o=t.dataset.chapterId||a?.dataset.chapterId,r=t.dataset.chapterLabel||a?.dataset.chapterLabel||"this chapter";t.addEventListener("dragover",e=>{"scene"===L(e).type&&o&&(e.target.closest(".timeline-scene-card[data-scene-id]")||(e.preventDefault(),e.dataTransfer.dropEffect="move",t.classList.add("drop-target-active","drop-chapter-end"),a?.classList.add("chapter-drop-active")))}),t.addEventListener("dragleave",e=>{t.contains(e.relatedTarget)||(t.classList.remove("drop-target-active","drop-chapter-end"),a?.classList.remove("chapter-drop-active"))}),t.addEventListener("drop",a=>{const i=L(a);if("scene"!==i.type||!o)return;if(a.target.closest(".timeline-scene-card[data-scene-id]"))return;a.preventDefault(),a.stopPropagation(),h=Date.now()+800,b();const s=e.querySelector(`.timeline-scene-card[data-scene-id='${CSS.escape(i.id)}']`);if(s?.dataset.chapterId===o&&t.lastElementChild?.dataset?.sceneId===i.id)return void y("scene","Scene already here",`${i.label} is already at the end of ${r}.`,"Scene move");const l=n.get("scene");m(l,"SceneID",i.id),m(l,"AnchorSceneID",""),m(l,"TargetChapterID",o),m(l,"Position","End"),y("scene","Move Scene?",v(i,s?.dataset.chapterLabel||"",r,"After",r),"Scene move")})});const S=n.get("asset-dependency"),E=()=>{const e=S?.dataset.sourceLabel||"Source asset",n=S?.dataset.targetLabel||"Target asset",a=g(S?.querySelector("[name='AssetDependencyTypeID']"))||"Requires",o=g(S?.querySelector("[name='SourceRequiredStateID']"))||"the required state",r=g(S?.querySelector("[name='TargetBlockedStateID']"))||"the blocked state",i=t.querySelector("[data-asset-dependency-preview]");i&&(i.textContent=`${e} ${a.toLowerCase()} ${n}. ${e} should be ${o} before ${n} can be ${r}.`)};S?.querySelectorAll("select").forEach(e=>e.addEventListener("change",E)),document.querySelectorAll("[data-asset-drop-target], .drag-chip.asset").forEach(e=>{e.addEventListener("dragover",t=>{"asset"===L(t).type&&(t.preventDefault(),t.dataTransfer.dropEffect="copy",e.classList.add("drop-target-active"))}),e.addEventListener("dragleave",()=>e.classList.remove("drop-target-active")),e.addEventListener("drop",t=>{const n=L(t),a=e.dataset.assetId||e.dataset.dragId,o=e.dataset.assetLabel||e.dataset.dragLabel||e.textContent.trim();"asset"===n.type&&a&&(t.preventDefault(),e.classList.remove("drop-target-active"),n.id!==a?(m(S,"SourceAssetID",n.id),m(S,"TargetAssetID",a),S.dataset.sourceLabel=n.label,S.dataset.targetLabel=o,E(),y("asset-dependency","Create asset dependency",`${n.label} -> ${o}`,"Asset dependency")):y("asset-dependency","Cannot create dependency","Drop one asset onto a different asset.","Asset dependency"))})}),document.querySelectorAll("[data-drag-type='location']").forEach(e=>{e.addEventListener("dragover",t=>{"location"===L(t).type&&(t.preventDefault(),t.dataTransfer.dropEffect="copy",e.classList.add("drop-target-active"))}),e.addEventListener("dragleave",()=>e.classList.remove("drop-target-active")),e.addEventListener("drop",t=>{const a=L(t),o=e.dataset.dragId,r=e.dataset.dragLabel||e.textContent.trim();if("location"!==a.type)return;if(t.preventDefault(),e.classList.remove("drop-target-active"),a.id===o)return void y("location-relationship","Cannot create relationship","Drop one location onto a different location.","Location relationship");const i=n.get("location-relationship");m(i,"FromLocationID",a.id),m(i,"ToLocationID",o),y("location-relationship","Create location relationship",`${a.label} -> ${r}`,"Location drop")})})})(); \ No newline at end of file