/* ============================================================
   Storyline — editorial writing studio
   Warm paper, display serif, quiet depth, restrained motion.
   ============================================================ */

:root {
	color-scheme: light;
	/* Warm paper palette (OKLCH) */
	--paper:        oklch(97.5% 0.012 85);
	--paper-2:      oklch(99% 0.008 85);
	--ink:          oklch(26% 0.02 65);
	--ink-soft:     oklch(46% 0.02 65);
	--ink-faint:    oklch(64% 0.015 70);
	--line:         oklch(89% 0.012 80);
	--accent:       oklch(54% 0.13 38);   /* terracotta */
	--accent-deep:  oklch(46% 0.14 38);
	--accent-wash:  oklch(94% 0.03 45);
	--gold:         oklch(72% 0.10 80);

	--shadow-sm: 0 1px 2px oklch(40% 0.03 65 / 0.06), 0 2px 6px oklch(40% 0.03 65 / 0.05);
	--shadow-md: 0 4px 12px oklch(40% 0.03 65 / 0.08), 0 12px 32px oklch(40% 0.03 65 / 0.07);
	--shadow-lg: 0 8px 24px oklch(40% 0.03 65 / 0.10), 0 24px 60px oklch(40% 0.03 65 / 0.10);
	--bar-bg: oklch(97.5% 0.012 85 / 0.82);
	--panel-grad-a: oklch(98% 0.01 85);
	--panel-grad-b: oklch(96.8% 0.012 85);
	--panel-solid: oklch(98.3% 0.008 85);
	--muted-panel: oklch(98% 0.006 85);
	--muted-panel-2: oklch(96% 0.006 85);
	--danger: oklch(54% 0.18 25);
	--danger-deep: oklch(48% 0.19 25);
	--danger-soft: oklch(95% 0.035 25);
	--danger-line: oklch(89% 0.06 25);
	--danger-ink: oklch(43% 0.14 25);
	--info-chip-bg: oklch(93% 0.04 230);
	--info-chip-ink: oklch(42% 0.13 245);
	--event-chip-bg: oklch(93% 0.05 150);
	--event-chip-ink: oklch(40% 0.12 155);
	--summary-chip-bg: oklch(94% 0.02 80);
	--summary-chip-ink: oklch(38% 0.03 70);
	--overlay: oklch(20% 0.02 65 / 0.42);

	--radius: 14px;
	--radius-sm: 9px;

	--display: "Fraunces", Georgia, serif;
	--serif:   "Spectral", Georgia, serif;
	--sans:    "Inter", system-ui, sans-serif;

	--measure: 42rem;          /* default reading width */
	--chapter-measure: 54rem;  /* wider chapter editor width */
	--composer-clearance: 12rem;
	--ease: cubic-bezier(0.16, 1, 0.3, 1);
	--dur: 320ms;
}

:root[data-theme="dark"] {
	color-scheme: dark;
	--paper:        oklch(18% 0.018 65);
	--paper-2:      oklch(22% 0.018 65);
	--ink:          oklch(91% 0.012 82);
	--ink-soft:     oklch(76% 0.016 78);
	--ink-faint:    oklch(58% 0.018 78);
	--line:         oklch(34% 0.02 68);
	--accent:       oklch(67% 0.13 42);
	--accent-deep:  oklch(78% 0.11 50);
	--accent-wash:  oklch(31% 0.048 42);
	--gold:         oklch(78% 0.11 82);
	--shadow-sm: 0 1px 2px oklch(0% 0 0 / 0.20), 0 2px 8px oklch(0% 0 0 / 0.18);
	--shadow-md: 0 6px 16px oklch(0% 0 0 / 0.24), 0 18px 42px oklch(0% 0 0 / 0.22);
	--shadow-lg: 0 10px 28px oklch(0% 0 0 / 0.30), 0 26px 70px oklch(0% 0 0 / 0.30);
	--bar-bg: oklch(18% 0.018 65 / 0.86);
	--panel-grad-a: oklch(24% 0.018 65);
	--panel-grad-b: oklch(20% 0.018 65);
	--panel-solid: oklch(23% 0.018 65);
	--muted-panel: oklch(21% 0.018 65);
	--muted-panel-2: oklch(25% 0.018 65);
	--danger: oklch(63% 0.17 25);
	--danger-deep: oklch(69% 0.18 25);
	--danger-soft: oklch(30% 0.07 25);
	--danger-line: oklch(42% 0.09 25);
	--danger-ink: oklch(78% 0.12 28);
	--info-chip-bg: oklch(30% 0.06 240);
	--info-chip-ink: oklch(78% 0.08 235);
	--event-chip-bg: oklch(29% 0.06 155);
	--event-chip-ink: oklch(78% 0.08 155);
	--summary-chip-bg: oklch(30% 0.025 80);
	--summary-chip-ink: oklch(78% 0.035 82);
	--overlay: oklch(4% 0.01 65 / 0.62);
}

/* data-theme selalu di-set oleh script inline di <head> (stored ?? system),
   jadi satu blok [data-theme="dark"] di atas cukup — tanpa duplikasi media query. */

* { box-sizing: border-box; }

/* Ikon SVG inline: ukuran mengikuti konteks, bobot stroke seragam. */
.ic { width: 1em; height: 1em; display: block; flex: 0 0 auto; }

html { scroll-behavior: smooth; }

body {
	margin: 0;
	min-height: 100dvh;
	background:
		radial-gradient(120% 80% at 50% -10%, var(--paper-2), transparent 60%),
		var(--paper);
	color: var(--ink);
	font-family: var(--sans);
	font-size: 16px;
	line-height: 1.65;
	-webkit-font-smoothing: antialiased;
	text-rendering: optimizeLegibility;
}

/* Subtle paper grain overlay */
.grain {
	position: fixed;
	inset: 0;
	pointer-events: none;
	z-index: 0;
	opacity: 0.035;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}

button {
	font-family: var(--sans);
	cursor: pointer;
	border: none;
	background: none;
}

.theme-toggle {
	position: relative;
	display: grid;
	place-items: center;
	flex: 0 0 auto;
	width: 2.2rem;
	height: 2.2rem;
	padding: 0;
	border: 1px solid var(--line);
	border-radius: 50%;
	background: var(--paper-2);
	color: var(--ink-faint);
	box-shadow: var(--shadow-sm);
	transition: border-color var(--dur) var(--ease), color var(--dur) var(--ease), background var(--dur) var(--ease), transform 120ms var(--ease);
}
.theme-toggle:hover {
	border-color: var(--accent);
	color: var(--accent);
	transform: translateY(-1px);
}
.theme-toggle:focus-visible {
	outline: 2px solid var(--accent);
	outline-offset: 2px;
}
.theme-toggle span {
	position: relative;
	z-index: 1;
	grid-area: 1 / 1;
	display: grid;
	place-items: center;
	line-height: 1;
	font-size: 1rem;
	opacity: 0;
	transform: scale(0.72);
	transition: opacity 160ms var(--ease), transform 160ms var(--ease);
}
:root:not([data-theme="dark"]) .theme-toggle-moon,
:root[data-theme="dark"] .theme-toggle-sun {
	opacity: 1;
	transform: scale(1);
}

/* ============================================================
   Home
   ============================================================ */
.login-shell {
	position: relative;
	z-index: 1;
	min-height: 100dvh;
	display: grid;
	place-items: center;
	padding: 1.5rem;
}

.login-panel {
	width: min(100%, 22rem);
	padding: 2.2rem;
	border: 1px solid var(--line);
	border-radius: var(--radius);
	background: linear-gradient(180deg, var(--panel-grad-a), var(--panel-grad-b));
	box-shadow: var(--shadow-md);
}

.login-panel .theme-toggle { margin-bottom: 1.25rem; }
.login-panel .eyebrow { margin-bottom: 0.55rem; }

.login-panel h1 {
	font-family: var(--display);
	font-size: 2.5rem;
	line-height: 1;
	margin: 0 0 1.6rem;
	font-weight: 600;
}

.login-form {
	display: flex;
	flex-direction: column;
	gap: 0.75rem;
}

.login-form label {
	font-size: 0.86rem;
	font-weight: 600;
	color: var(--ink-soft);
}

.login-form input {
	width: 100%;
	border: 1px solid var(--line);
	background: var(--paper);
	border-radius: var(--radius-sm);
	padding: 0.8rem 0.9rem;
	font: inherit;
	color: var(--ink);
	transition: border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}

.login-form input:focus {
	outline: none;
	border-color: var(--accent);
	box-shadow: 0 0 0 3px oklch(54% 0.13 38 / 0.12);
}

.login-form button {
	margin-top: 0.35rem;
	background: var(--accent);
	color: var(--paper-2);
	border-radius: var(--radius-sm);
	padding: 0.8rem 1rem;
	font-size: 0.95rem;
	font-weight: 700;
	box-shadow: var(--shadow-sm);
	transition: background var(--dur) var(--ease), transform 120ms var(--ease);
}

.login-form button:hover { background: var(--accent-deep); }
.login-form button:active { transform: translateY(1px); }

.login-error {
	margin: -0.15rem 0 0;
	color: var(--danger-ink);
	font-size: 0.88rem;
	font-weight: 600;
}

.home {
	position: relative;
	z-index: 1;
	max-width: 46rem;
	margin: 0 auto;
	padding: clamp(3rem, 8vh, 7rem) 1.5rem 6rem;
}

.home-hero { text-align: center; margin-bottom: clamp(2.5rem, 6vh, 4.5rem); }
.home-hero .theme-toggle { margin: 0 auto 1.3rem; }

.eyebrow {
	font-size: 0.74rem;
	letter-spacing: 0.22em;
	text-transform: uppercase;
	color: var(--accent);
	font-weight: 600;
	margin: 0 0 1rem;
}

.display {
	font-family: var(--display);
	font-weight: 600;
	font-size: clamp(3.2rem, 2rem + 7vw, 6rem);
	line-height: 0.95;
	letter-spacing: -0.02em;
	margin: 0;
	color: var(--ink);
	font-variation-settings: "opsz" 144;
}

.lede {
	font-family: var(--serif);
	font-size: clamp(1.05rem, 0.98rem + 0.5vw, 1.3rem);
	color: var(--ink-soft);
	max-width: 30rem;
	margin: 1.3rem auto 0;
	font-style: italic;
}

.home-body { display: flex; flex-direction: column; gap: 1.5rem; }

.newstory {
	display: flex;
	gap: 0.5rem;
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	padding: 0.5rem;
	box-shadow: var(--shadow-sm);
	transition: box-shadow var(--dur) var(--ease), border-color var(--dur) var(--ease);
}
.newstory:focus-within {
	border-color: var(--accent);
	box-shadow: var(--shadow-md);
}
.newstory input {
	flex: 1;
	border: none;
	background: transparent;
	padding: 0.7rem 0.9rem;
	font-family: var(--serif);
	font-size: 1.1rem;
	color: var(--ink);
}
.newstory input:focus { outline: none; }
.newstory input::placeholder { color: var(--ink-faint); }

.newstory button,
.composer button[type="submit"] {
	background: var(--accent);
	color: var(--paper-2);
	padding: 0.65rem 1.25rem;
	border-radius: var(--radius-sm);
	font-weight: 600;
	font-size: 0.95rem;
	white-space: nowrap;
	box-shadow: var(--shadow-sm);
	transition: background var(--dur) var(--ease), transform 120ms var(--ease);
}
.newstory button:hover,
.composer button[type="submit"]:hover { background: var(--accent-deep); }
.newstory button:active,
.composer button[type="submit"]:active { transform: translateY(1px); }

/* Story list */
.story-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.6rem; }

.story-card {
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto;
	align-items: stretch;
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	box-shadow: var(--shadow-sm);
	transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease), border-color var(--dur) var(--ease);
}
.story-card:hover {
	transform: translateY(-2px);
	box-shadow: var(--shadow-md);
	border-color: var(--accent-wash);
}

.story-open {
	display: grid;
	grid-template-columns: auto 1fr auto auto;
	align-items: center;
	gap: 1rem;
	padding: 1.1rem 1.3rem;
	text-decoration: none;
	color: var(--ink);
}
.story-count {
	font-family: var(--display);
	font-size: 0.85rem;
	color: var(--ink-faint);
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
}
.story-num {
	font-family: var(--display);
	font-size: 0.95rem;
	color: var(--ink-faint);
	font-variant-numeric: tabular-nums;
}
.story-title {
	font-family: var(--display);
	font-weight: 500;
	font-size: 1.3rem;
	letter-spacing: -0.01em;
}
.story-go {
	color: var(--accent);
	font-size: 1.1rem;
	opacity: 0;
	transform: translateX(-0.25rem);
	transition: opacity var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.story-card:hover .story-go,
.story-card:focus-within .story-go {
	opacity: 1;
	transform: translateX(4px);
}
.story-tools { display: flex; align-items: center; gap: 0.3rem; padding: 0 0.8rem; opacity: 0; transition: opacity var(--dur) var(--ease); }
.story-card:hover .story-tools,
.story-card:focus-within .story-tools { opacity: 1; }
.story-edit form { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 0.6rem; align-items: center; width: 100%; padding: 0.8rem 1rem; }
.story-edit input {
	width: 100%;
	font-family: var(--display);
	font-size: 1.1rem;
	padding: 0.5rem 0.7rem;
	border: 1px solid var(--accent);
	border-radius: var(--radius-sm);
	background: var(--paper);
	color: var(--ink);
}
.story-edit input:focus { outline: none; }
.story-edit-actions { display: flex; align-items: center; gap: 0.5rem; }
.story-edit .btn-ghost { border: 1px solid var(--line); }

/* Empty states */
.empty {
	text-align: center;
	padding: 3rem 1.5rem;
	color: var(--ink-faint);
	font-family: var(--serif);
	font-style: italic;
	font-size: 1.05rem;
}
.empty-mark { font-size: 1.6rem; color: var(--gold); margin: 0 0 0.5rem; font-style: normal; }
.empty-prose { border: 1px dashed var(--line); border-radius: var(--radius); }

/* ============================================================
   Editor
   ============================================================ */
.ed-bar {
	position: sticky;
	top: 0;
	z-index: 5;
	display: grid;
	grid-template-columns: auto minmax(0, 1fr) auto auto;
	grid-template-areas: "back meta nav right";
	align-items: center;
	gap: 1rem;
	padding: 0.9rem clamp(1rem, 4vw, 2rem);
	background: var(--bar-bg);
	backdrop-filter: blur(12px);
	border-bottom: 1px solid var(--line);
}
.ed-bar .back { grid-area: back; }
.ed-nav {
	grid-area: nav;
	display: flex;
	align-items: center;
	gap: 0.45rem;
	min-width: 0;
	overflow-x: auto;
	scrollbar-width: none;
}
.ed-nav::-webkit-scrollbar { display: none; }
.back {
	display: grid;
	place-items: center;
	width: 2.2rem; height: 2.2rem;
	border-radius: 50%;
	text-decoration: none;
	color: var(--ink-soft);
	font-size: 1.2rem;
	border: 1px solid var(--line);
	background: var(--paper-2);
	transition: color var(--dur) var(--ease), border-color var(--dur) var(--ease), transform 120ms;
}
.back:hover { color: var(--accent); border-color: var(--accent); transform: translateX(-2px); }
.ed-meta { grid-area: meta; min-width: 0; }
.ed-kicker {
	display: block;
	font-size: 0.66rem;
	letter-spacing: 0.2em;
	text-transform: uppercase;
	color: var(--ink-faint);
	font-weight: 600;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.ed-title {
	margin: 0;
	font-family: var(--display);
	font-weight: 600;
	font-size: 1.25rem;
	letter-spacing: -0.01em;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.ed-count {
	font-family: var(--display);
	font-size: 0.85rem;
	color: var(--ink-faint);
	font-variant-numeric: tabular-nums;
}

.page {
	position: relative;
	z-index: 1;
	max-width: var(--measure);
	margin: 0 auto;
	padding: clamp(2rem, 6vh, 4rem) 1.5rem var(--composer-clearance);
}

.editor-page {
	width: min(100%, 78rem);
	max-width: none;
	margin: 0 auto;
	padding: clamp(2rem, 6vh, 4rem) clamp(1.5rem, 4vw, 3rem) var(--composer-clearance);
	position: relative;
	display: grid;
	grid-template-columns: minmax(0, var(--chapter-measure)) 19rem;
	gap: clamp(2rem, 4vw, 4rem);
	align-items: start;
}

/* Prose */
.prose { font-family: var(--serif); font-size: 1.22rem; line-height: 1.78; color: var(--ink); }
.draft {
	margin-top: 1.2rem;
	scroll-margin-bottom: 16rem;
}
.para-pin-row {
	display: flex;
	flex-wrap: wrap;
	gap: 0.4rem;
	margin: 0 0 0.5rem;
}
.para-pin-badge {
	display: inline-flex;
	align-items: center;
	gap: 0.42rem;
	padding: 0.24rem 0.3rem 0.24rem 0.46rem;
	border: 1px solid var(--accent-wash);
	border-radius: 999px;
	background: color-mix(in oklab, var(--accent-wash) 18%, var(--paper));
	box-shadow: inset 0 1px 0 rgba(255,255,255,0.03);
	font-size: 0.72rem;
	color: var(--accent-deep);
}
.para-pin-title {
	display: inline-flex;
	align-items: center;
	gap: 0.4rem;
	max-width: 14rem;
	font-family: var(--sans);
	font-size: 0.78rem;
	font-weight: 700;
	letter-spacing: -0.01em;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.para-pin-title::before {
	content: "";
	flex: 0 0 auto;
	width: 0.4rem;
	height: 0.4rem;
	border-radius: 999px;
	background: currentColor;
	opacity: 0.9;
}
.para-pin-clear {
	display: grid;
	place-items: center;
	flex: 0 0 auto;
	width: 1.2rem;
	height: 1.2rem;
	padding: 0;
	border: 1px solid color-mix(in oklab, currentColor 24%, transparent);
	border-radius: 999px;
	background: rgba(255,255,255,0.05);
	color: var(--accent-deep);
	font-size: 0.76rem;
	font-weight: 700;
	line-height: 1;
	transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease), transform 120ms var(--ease);
}
.para-pin-clear:hover {
	background: rgba(255,255,255,0.1);
	border-color: color-mix(in oklab, currentColor 42%, transparent);
	transform: translateY(-1px);
}
.para-pin-clear:focus-visible {
	outline: 2px solid color-mix(in oklab, currentColor 55%, white);
	outline-offset: 1px;
}
.para-pin-picker {
	margin-top: 0.55rem;
	padding: 0.75rem;
	border: 1px solid var(--line);
	border-radius: var(--radius-sm);
	background: color-mix(in oklab, var(--paper-2) 92%, black);
}
.para-pin-picker-head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 0.6rem;
	margin-bottom: 0.6rem;
	font-size: 0.82rem;
}
.para-pin-cancel {
	padding: 0.35rem 0.65rem;
	font-size: 0.78rem;
}
.para-pin-options {
	display: grid;
	gap: 0.45rem;
}
.para-pin-option {
	display: grid;
	gap: 0.18rem;
	padding: 0.58rem 0.65rem;
	border: 1px solid var(--line);
	border-radius: var(--radius-sm);
	background: color-mix(in oklab, var(--paper) 92%, black);
	text-align: left;
}
.para-pin-option-title {
	font-size: 0.86rem;
	font-weight: 700;
	color: var(--ink);
}
.para-pin-option-meta {
	display: flex;
	flex-wrap: wrap;
	gap: 0.45rem;
	font-size: 0.73rem;
	color: var(--ink-faint);
}
.para-pin-empty {
	margin: 0;
	font-size: 0.84rem;
	color: var(--ink-faint);
}
.chapter-side {
	position: sticky;
	top: 5.6rem;
	width: 19rem;
	/* Cap to the viewport so a long panel (e.g. many integrity issues) scrolls
	   inside the sticky rail instead of overflowing off-screen. */
	display: flex;
	flex-direction: column;
	max-height: calc(100vh - 5.6rem - 1.5rem);
}
.side-tab-panels {
	flex: 1 1 auto;
	overflow-y: auto;
	min-height: 0;
	/* room so the last card isn't flush against the scroll edge */
	padding-bottom: 0.5rem;
}
.side-tab-bar {
	flex-shrink: 0;
	padding: 0.25rem;
	border: 1px solid var(--line);
	border-radius: 999px;
	background: color-mix(in oklab, var(--paper) 78%, black);
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 0.3rem;
	margin-bottom: 0.7rem;
}
.side-tab-chip {
	appearance: none;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 0.28rem;
	padding: 0.48rem 0.4rem;
	min-width: 0;
	white-space: nowrap;
	border: 1px solid transparent;
	border-radius: 999px;
	background: transparent;
	color: var(--ink-faint);
	font-size: 0.78rem;
	font-weight: 600;
	font-family: var(--sans);
	cursor: pointer;
	transition: border-color var(--dur) var(--ease), color var(--dur) var(--ease), background var(--dur) var(--ease);
}
.side-tab-count {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 1.05rem;
	height: 1.05rem;
	padding: 0 0.3rem;
	border-radius: 999px;
	background: color-mix(in oklab, var(--paper) 82%, black);
	font-size: 0.68rem;
	line-height: 1;
	color: var(--ink-soft);
}
.side-tab-count[hidden] { display: none; }
.side-tab-chip.is-active {
	border-color: color-mix(in oklab, var(--accent-wash) 52%, transparent);
	background: color-mix(in oklab, var(--accent-wash) 20%, var(--paper));
	color: var(--accent-deep);
	box-shadow: inset 0 1px 0 rgba(255,255,255,0.03);
}
.side-tab-chip.is-active .side-tab-count {
	background: color-mix(in oklab, var(--accent-wash) 35%, var(--paper));
	color: var(--accent-deep);
}
.side-tab-panels > .side-tab-panel[hidden] { display: none; }
.sum-card {
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	box-shadow: var(--shadow-sm);
	padding: 1rem 1rem 1.1rem;
}
.sum-head {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	gap: 0.75rem;
	margin-bottom: 0.8rem;
}
.sum-kicker {
	font-size: 0.72rem;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--ink-faint);
	font-weight: 600;
}
.sum-head h2 {
	margin: 0.1rem 0 0;
	font-family: var(--display);
	font-size: 1.2rem;
	font-weight: 500;
}
.sum-actions {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(7rem, 1fr));
	align-items: center;
	gap: 0.4rem;
	width: 100%;
}
.sum-generate {
	border: 1px solid var(--line);
	border-radius: var(--radius-sm);
	padding: 0.38rem 0.8rem;
	font-size: 0.82rem;
	color: var(--ink-soft);
	background: var(--paper);
	min-width: 0;
	width: 100%;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 0.35rem;
	white-space: nowrap;
}
.sum-clear {
	border: 1px solid var(--line);
	border-radius: var(--radius-sm);
	padding: 0.38rem 0.7rem;
	font-size: 0.82rem;
	color: var(--ink-faint);
	background: var(--paper);
	white-space: nowrap;
	width: 100%;
}
.sum-clear:hover {
	color: var(--accent-deep);
	border-color: var(--accent-wash);
}
.sum-generate-busy { display: none; align-items: center; gap: 0.35rem; }
.sum-card.htmx-request .sum-generate,
.sum-card[data-busy="true"] .sum-generate,
.sum-generate.htmx-request {
	opacity: 0.9;
	pointer-events: none;
}
.sum-card.htmx-request .sum-generate-idle,
.sum-card[data-busy="true"] .sum-generate-idle,
.sum-generate.htmx-request .sum-generate-idle { display: none; }
.sum-card.htmx-request .sum-generate-busy,
.sum-card[data-busy="true"] .sum-generate-busy,
.sum-generate.htmx-request .sum-generate-busy { display: inline-flex; }
.sum-card.htmx-request .sum-content,
.sum-card[data-busy="true"] .sum-content { opacity: 0.45; }
.sum-empty,
.sum-body {
	margin: 0;
	font-size: 0.95rem;
	line-height: 1.65;
	color: var(--ink-soft);
}
/* A long summary is hard to scan inline; clamp the panel preview and move the
   full text into a dialog opened by the "Baca selengkapnya" button. */
.sum-body-clamp {
	display: -webkit-box;
	-webkit-line-clamp: 5;
	-webkit-box-orient: vertical;
	overflow: hidden;
}
.sum-expand {
	margin-top: 0.5rem;
	padding: 0;
	font-family: var(--sans);
	font-size: 0.82rem;
	font-weight: 600;
	color: var(--accent-deep);
	background: none;
	border: none;
	cursor: pointer;
}
.sum-expand:hover { text-decoration: underline; }
.sum-dialog {
	width: min(38rem, calc(100vw - 2rem));
	max-height: min(80vh, 42rem);
	padding: 0;
	color: var(--ink);
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: calc(var(--radius) + 0.2rem);
	box-shadow: var(--shadow-lg);
	animation: pop 200ms var(--ease);
}
.sum-dialog::backdrop {
	background: var(--overlay);
	backdrop-filter: blur(4px);
}
.sum-dialog-head {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 1rem;
	padding: 1rem 1.15rem 0.75rem;
	border-bottom: 1px solid var(--line);
}
.sum-dialog-head h3 {
	margin: 0.1rem 0 0;
	font-family: var(--display);
	font-size: 1.1rem;
	font-weight: 600;
}
.sum-dialog-x {
	flex: none;
	width: 2rem;
	height: 2rem;
	font-size: 1.1rem;
	line-height: 1;
	color: var(--ink-faint);
	background: var(--paper);
	border: 1px solid var(--line);
	border-radius: 999px;
	cursor: pointer;
}
.sum-dialog-x:hover { background: var(--accent-wash); color: var(--ink); }
.sum-dialog-body {
	padding: 1rem 1.15rem 1.25rem;
	overflow-y: auto;
}
.sum-dialog-body p {
	margin: 0;
	font-size: 0.95rem;
	line-height: 1.7;
	color: var(--ink-soft);
	white-space: pre-wrap;
}
.sum-notice {
	margin: 0 0 0.65rem;
	padding: 0.5rem 0.65rem;
	font-size: 0.85rem;
	line-height: 1.5;
	color: var(--danger-ink);
	background: var(--danger-soft);
	border: 1px solid var(--danger-line);
	border-radius: var(--radius);
}
.plot-panel-card {
	display: flex;
	flex-direction: column;
	gap: 0;
	padding: 0.72rem 0.72rem 0.7rem;
	max-height: min(62vh, 36rem);
	overflow: hidden;
}
.plot-point-topbar {
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto;
	grid-template-areas:
		"heading action"
		"meta action";
	column-gap: 0.5rem;
	row-gap: 0.35rem;
	align-items: center;
	margin-bottom: 0.45rem;
	flex: 0 0 auto;
}
.plot-point-heading {
	grid-area: heading;
	min-width: 0;
}
.plot-point-heading .sum-kicker {
	margin-bottom: 0.08rem;
}
.plot-point-heading h2 {
	margin: 0;
	font-size: 0.92rem;
	line-height: 1.15;
	font-family: var(--display);
	font-weight: 600;
}
.plot-point-meta {
	grid-area: meta;
	display: flex;
	flex-wrap: wrap;
	gap: 0.28rem;
	font-size: 0.68rem;
	color: var(--ink-faint);
}
.plot-point-meta span {
	padding: 0.12rem 0.36rem;
	border: 1px solid var(--line);
	border-radius: 999px;
	background: color-mix(in oklab, var(--paper) 88%, black);
}
.plot-point-toolbar {
	grid-area: action;
	margin: 0;
	flex: 0 0 auto;
}
.plot-point-open {
	width: auto;
	min-width: 0;
	padding: 0.42rem 0.68rem;
	font-size: 0.74rem;
	border-radius: 999px;
	white-space: nowrap;
}
.plot-point-modal {
	position: fixed;
	inset: 0;
	z-index: 60;
	display: grid;
	place-items: center;
	padding: 1rem;
}
.plot-point-modal[hidden] { display: none; }
.plot-point-modal-backdrop {
	position: absolute;
	inset: 0;
	background: var(--overlay);
	backdrop-filter: blur(4px);
	animation: fade 160ms var(--ease);
}
.plot-point-modal-box {
	position: relative;
	z-index: 1;
	width: min(100%, 31rem);
	padding: 1rem;
	border: 1px solid var(--line);
	border-radius: calc(var(--radius) + 0.2rem);
	background: var(--paper-2);
	box-shadow: var(--shadow-lg);
	animation: pop 200ms var(--ease);
}
.plot-point-modal-head {
	display: flex;
	align-items: start;
	justify-content: space-between;
	gap: 0.75rem;
	margin-bottom: 0.75rem;
}
.plot-point-modal-head h3 {
	margin: 0.1rem 0 0;
	font-family: var(--display);
	font-size: 1.1rem;
	font-weight: 600;
}
.plot-point-modal-x {
	width: 2rem;
	height: 2rem;
	border: 1px solid var(--line);
	border-radius: 999px;
	background: var(--paper);
	color: var(--ink-faint);
	font-size: 1.1rem;
	line-height: 1;
}
.plot-point-modal-actions {
	display: flex;
	justify-content: flex-end;
	gap: 0.5rem;
	margin-top: 0.15rem;
}
.plot-point-new {
	display: grid;
	gap: 0.45rem;
}
.plot-point-new input,
.plot-point-new textarea,
.plot-point-select {
	box-sizing: border-box;
	width: 100%;
	border: 1px solid var(--line);
	border-radius: var(--radius-sm);
	background: color-mix(in oklab, var(--paper) 90%, black);
	color: var(--ink);
	padding: 0.58rem 0.66rem;
	font: inherit;
	transition: border-color var(--dur) var(--ease), background var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.plot-point-new textarea,
.plot-point-select {
	font-size: 0.86rem;
}
.plot-point-new input::placeholder,
.plot-point-new textarea::placeholder {
	color: color-mix(in oklab, var(--ink-faint) 80%, transparent);
}
.plot-point-new input:focus,
.plot-point-new textarea:focus,
.plot-point-select:focus {
	outline: none;
	border-color: color-mix(in oklab, var(--accent) 55%, var(--line));
	box-shadow: 0 0 0 3px color-mix(in oklab, var(--accent-wash) 35%, transparent);
	background: color-mix(in oklab, var(--paper) 94%, black);
}
.plot-point-new textarea {
	min-height: 4rem;
	resize: vertical;
}
.plot-point-list {
	flex: 1 1 auto;
	min-height: 0;
	overflow: auto;
	overscroll-behavior: contain;
	padding-right: 0.2rem;
	gap: 0.45rem;
}
.plot-point-list::-webkit-scrollbar {
	width: 8px;
}
.plot-point-list::-webkit-scrollbar-track {
	background: transparent;
}
.plot-point-list::-webkit-scrollbar-thumb {
	background: color-mix(in oklab, var(--line) 82%, transparent);
	border-radius: 999px;
}
.plot-point-empty {
	padding: 0.9rem 0.85rem;
	border: 1px dashed color-mix(in oklab, var(--line) 82%, transparent);
	border-radius: calc(var(--radius) - 0.1rem);
	background:
		linear-gradient(180deg, color-mix(in oklab, var(--paper) 94%, black), transparent 140%);
	text-align: left;
}
.plot-point-empty-mark {
	margin: 0 0 0.4rem;
	font-size: 1.1rem;
	color: var(--gold);
}
.plot-point-empty-title {
	margin: 0;
	font-family: var(--display);
	font-size: 1rem;
	font-weight: 600;
	color: var(--ink-soft);
}
.plot-point-empty-note {
	margin: 0.25rem 0 0;
	font-size: 0.84rem;
	line-height: 1.5;
	color: var(--ink-faint);
}
.plot-point-card {
	padding: 0.58rem 0.62rem;
}
.plot-point-tone-ember {
	border-color: color-mix(in oklab, #8b4a2f 45%, var(--line));
	background: linear-gradient(180deg, color-mix(in oklab, #8b4a2f 10%, var(--paper-2)), var(--paper-2) 42%);
}
.plot-point-tone-moss {
	border-color: color-mix(in oklab, #4f6a46 42%, var(--line));
	background: linear-gradient(180deg, color-mix(in oklab, #4f6a46 10%, var(--paper-2)), var(--paper-2) 42%);
}
.plot-point-tone-ocean {
	border-color: color-mix(in oklab, #3f5e78 42%, var(--line));
	background: linear-gradient(180deg, color-mix(in oklab, #3f5e78 11%, var(--paper-2)), var(--paper-2) 42%);
}
.plot-point-tone-plum {
	border-color: color-mix(in oklab, #70506b 40%, var(--line));
	background: linear-gradient(180deg, color-mix(in oklab, #70506b 10%, var(--paper-2)), var(--paper-2) 42%);
}
.para-pin-badge.plot-point-tone-ember {
	border-color: color-mix(in oklab, #8b4a2f 55%, var(--line));
	background: color-mix(in oklab, #8b4a2f 20%, var(--paper));
	color: #f1b18d;
}
.para-pin-badge.plot-point-tone-moss {
	border-color: color-mix(in oklab, #4f6a46 55%, var(--line));
	background: color-mix(in oklab, #4f6a46 20%, var(--paper));
	color: #b9d5b0;
}
.para-pin-badge.plot-point-tone-ocean {
	border-color: color-mix(in oklab, #3f5e78 55%, var(--line));
	background: color-mix(in oklab, #3f5e78 20%, var(--paper));
	color: #b7d0ea;
}
.para-pin-badge.plot-point-tone-plum {
	border-color: color-mix(in oklab, #70506b 55%, var(--line));
	background: color-mix(in oklab, #70506b 20%, var(--paper));
	color: #e0bfd8;
}
.plot-point-head {
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto;
	gap: 0.35rem;
	align-items: start;
}
.plot-point-title-block {
	display: grid;
	grid-template-columns: 1.55rem minmax(0, 1fr);
	gap: 0.38rem;
	align-items: start;
	min-width: 0;
}
.plot-point-copy {
	display: flex;
	flex-direction: column;
	gap: 0.2rem;
	min-width: 0;
}
.plot-point-title {
	margin: 0;
	font-family: var(--sans);
	font-size: 0.84rem;
	line-height: 1.22;
	font-weight: 700;
	letter-spacing: -0.01em;
	color: var(--ink);
	word-break: break-word;
}
.plot-point-subline {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 0.4rem;
	min-width: 0;
}
.plot-point-seq {
	flex: 0 0 auto;
	font-family: var(--sans);
	font-size: 0.62rem;
	font-weight: 700;
	letter-spacing: 0.04em;
	color: var(--ink-faint);
}
.plot-point-status {
	display: inline-flex;
	align-items: center;
	width: fit-content;
	padding: 0.15rem 0.42rem;
	border-radius: 999px;
	font-size: 0.66rem;
	font-weight: 700;
	letter-spacing: 0.03em;
	text-transform: uppercase;
}
.plot-point-start {
	font-size: 0.62rem;
	color: var(--ink-faint);
}
.plot-point-tools {
	display: flex;
	gap: 0.28rem;
	flex: 0 0 auto;
}
.plot-point-tools .ptool,
.plot-point-head .tl-drag {
	width: 1.45rem;
	height: 1.45rem;
	padding: 0;
	border-radius: 0.5rem;
}
.plot-point-status-planned {
	background: color-mix(in oklab, var(--paper) 60%, var(--accent-wash));
	color: var(--accent-deep);
}
.plot-point-status-done {
	background: color-mix(in oklab, var(--paper) 46%, #b8d9bd);
	color: #295c34;
}
.plot-point-status-cut {
	background: color-mix(in oklab, var(--paper) 52%, #e4c0c0);
	color: #7b4040;
}
.plot-point-detail {
	margin: 0.4rem 0 0;
	font-family: var(--serif);
	font-size: 0.78rem;
	line-height: 1.32;
	color: var(--ink-soft);
	word-break: break-word;
}
.plot-point-actions {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 0.28rem;
	margin-top: 0.45rem;
}
.plot-point-status-btn {
	border: 1px solid var(--line);
	border-radius: 999px;
	background: var(--paper);
	color: var(--ink-faint);
	padding: 0.18rem 0.1rem;
	font-size: 0.58rem;
}
.plot-point-status-btn.is-active {
	border-color: var(--accent-wash);
	background: color-mix(in oklab, var(--accent-wash) 15%, var(--paper));
	color: var(--accent-deep);
}
.plot-point-edit {
	display: grid;
	gap: 0.45rem;
}
body.plot-point-modal-open {
	overflow: hidden;
}

.para-wrap { position: relative; margin: 0 0 1.4rem; transition: opacity var(--dur) var(--ease); }
.para { margin: 0; animation: rise var(--dur) var(--ease); }

/* Drop cap on the very first paragraph */
.prose > .para-wrap:first-of-type .para::first-letter {
	font-family: var(--display);
	font-weight: 600;
	font-size: 3.4em;
	line-height: 0.78;
	float: left;
	padding: 0.05em 0.12em 0 0;
	color: var(--accent);
}

@keyframes rise {
	from { opacity: 0; transform: translateY(6px); }
	to   { opacity: 1; transform: none; }
}

.para-tools {
	position: absolute;
	top: -0.2rem;
	right: -0.4rem;
	display: flex;
	gap: 0.3rem;
	opacity: 0;
	transform: translateY(-2px);
	transition: opacity var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.para-wrap:hover .para-tools { opacity: 1; transform: none; }

/* "+ tulis di sini" insertion divider between paragraphs */
.para-insert {
	display: flex;
	align-items: center;
	gap: 0.6rem;
	width: 100%;
	margin: 0.35rem 0 -0.5rem;
	padding: 0.2rem 0;
	background: none;
	cursor: pointer;
	opacity: 0;
	transition: opacity var(--dur) var(--ease);
}
.para-wrap:hover .para-insert,
.para-insert:focus-visible { opacity: 1; }
.para-insert-line { flex: 1; height: 1px; background: var(--accent-wash); }
.para-insert-label {
	font-family: var(--sans);
	font-size: 0.72rem;
	font-weight: 600;
	letter-spacing: 0.04em;
	color: var(--accent);
	white-space: nowrap;
}
.para-insert:hover .para-insert-line { background: var(--accent); }

/* Composer banner showing the active insertion point */
.insert-banner {
	pointer-events: auto;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 0.6rem;
	padding: 0.45rem 0.8rem;
	background: var(--accent-wash);
	border: 1px solid var(--accent);
	border-radius: var(--radius-sm);
	font-size: 0.85rem;
	color: var(--accent-deep);
	animation: rise 200ms var(--ease);
}
.insert-banner[hidden] { display: none; }
.insert-banner-text em { font-style: italic; opacity: 0.85; }
.insert-banner-actions {
	display: flex;
	align-items: center;
	gap: 0.45rem;
}
.insert-divider-form { margin: 0; }
.insert-divider-btn {
	padding: 0.35rem 0.7rem;
	border: 1px solid var(--accent);
	border-radius: 999px;
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.03em;
	color: var(--accent-deep);
	background: var(--paper-2);
}
.insert-divider-btn:hover { background: var(--accent-wash); }
.insert-banner-clear {
	pointer-events: auto;
	display: grid;
	place-items: center;
	width: 1.5rem; height: 1.5rem;
	border-radius: 50%;
	color: var(--accent-deep);
	font-size: 1.1rem;
	line-height: 1;
	transition: background 120ms;
}
.insert-banner-clear:hover { background: var(--accent-wash); }

.divider-wrap {
	padding: 1rem 0 0.2rem;
}
.story-divider {
	position: relative;
	height: 1px;
	margin: 0.4rem 0 0.7rem;
	background: linear-gradient(90deg, transparent, var(--accent), transparent);
	opacity: 0.9;
}
.story-divider::after {
	content: "§";
	position: absolute;
	left: 50%;
	top: 50%;
	transform: translate(-50%, -50%);
	display: grid;
	place-items: center;
	width: 1.8rem;
	height: 1.8rem;
	border: 1px solid var(--accent-wash);
	border-radius: 999px;
	background: var(--paper);
	color: var(--accent);
	font-family: var(--display);
	font-size: 0.95rem;
	box-shadow: var(--shadow-sm);
}

.ptool {
	display: grid;
	place-items: center;
	width: 1.9rem; height: 1.9rem;
	background: var(--paper-2);
	color: var(--ink-faint);
	border: 1px solid var(--line);
	border-radius: 8px;
	font-size: 0.85rem;
	box-shadow: var(--shadow-sm);
	transition: color var(--dur) var(--ease), border-color var(--dur) var(--ease), transform 120ms;
}
.ptool:hover { color: var(--accent); border-color: var(--accent); transform: translateY(-1px); }

/* Inline edit */
.para-edit { display: flex; flex-direction: column; gap: 0.7rem; }
.para-edit .para-tools { position: static; opacity: 1; transform: none; justify-content: flex-end; }
.para-edit textarea {
	width: 100%;
	font-family: var(--serif);
	font-size: 1.22rem;
	line-height: 1.78;
	color: var(--ink);
	padding: 0.9rem 1.1rem;
	background: var(--paper-2);
	border: 1px solid var(--accent);
	border-radius: var(--radius);
	box-shadow: var(--shadow-sm);
	resize: vertical;
}
.para-edit textarea:focus { outline: 2px solid var(--accent-wash); }

/* ============================================================
   Inline AI rewrite (tulis ulang paragraf yang sudah diterima)
   ============================================================ */
.ptool-rewrite { font-size: 0.95rem; font-weight: 600; }
.rw-form {
	display: flex;
	flex-direction: column;
	gap: 0.7rem;
	padding: 1rem 1.1rem;
	background: var(--paper-2);
	border: 1px solid var(--accent-wash);
	border-left: 3px solid var(--accent);
	border-radius: var(--radius);
	box-shadow: var(--shadow-sm);
}
.rw-form .para-tools { position: static; opacity: 1; transform: none; justify-content: flex-end; }
.rw-current {
	margin: 0;
	font-family: var(--serif);
	font-size: 1.02rem;
	line-height: 1.65;
	color: var(--ink-soft);
	max-height: 9rem;
	overflow: auto;
	padding-bottom: 0.5rem;
	border-bottom: 1px dashed var(--line);
	white-space: pre-wrap;
}
.rw-groups { display: flex; flex-direction: column; gap: 0.5rem; }
.rw-done {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 0.6rem;
	margin-top: 1rem;
}
.rw-done .draft-error-text { flex-basis: 100%; }

/* ============================================================
   Draft (streaming)
   ============================================================ */
.draft-card {
	/* Bleed horizontally so the inner text aligns with paragraph text,
	   not inset by the card padding. */
	margin: 0 calc(-1.4rem - 1px) 1rem calc(-1.4rem - 3px);
	padding: 1.3rem 1.4rem;
	background: var(--paper-2);
	border: 1px solid var(--accent-wash);
	border-left: 3px solid var(--accent);
	border-radius: var(--radius);
	box-shadow: var(--shadow-md);
	animation: rise var(--dur) var(--ease);
}
.draft-badge {
	display: inline-flex;
	align-items: center;
	gap: 0.45rem;
	font-family: var(--sans);
	font-size: 0.72rem;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	font-weight: 600;
	color: var(--accent);
	margin-bottom: 0.7rem;
}
.dots { display: inline-flex; gap: 3px; }
.dots i {
	width: 4px; height: 4px; border-radius: 50%;
	background: var(--accent);
	animation: blink 1.2s infinite ease-in-out;
}
.dots i:nth-child(2) { animation-delay: 0.2s; }
.dots i:nth-child(3) { animation-delay: 0.4s; }
@keyframes blink { 0%, 60%, 100% { opacity: 0.25; } 30% { opacity: 1; } }

.draft-text {
	font-family: var(--serif);
	font-size: 1.22rem;
	line-height: 1.78;
	color: var(--ink);
	white-space: pre-wrap;
}

/* Agentic mode: an activity transcript. Inline (draft prose) or in the modal. */
.draft-steps:not(:empty) {
	display: flex;
	flex-direction: column;
	gap: 0.5rem;
	margin: 0 0 0.7rem;
	font-family: var(--sans);
}
/* Each step is a card with a rail marking its role. */
.draft-step {
	position: relative;
	display: flex;
	align-items: baseline;
	gap: 0.55rem;
	padding: 0.5rem 0.7rem 0.5rem 0.85rem;
	font-size: 0.78rem;
	line-height: 1.55;
	color: var(--ink-soft);
	background: var(--paper);
	border: 1px solid var(--line);
	border-radius: 9px;
	animation: rise var(--dur) var(--ease);
}
.draft-step::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.55rem;
	bottom: 0.55rem;
	width: 3px;
	border-radius: 3px;
	background: var(--line);
}
.step-note::before, .step-plan::before { background: var(--accent); }
.step-call::before { background: color-mix(in oklab, var(--accent) 55%, transparent); }
.step-think::before { background: var(--ink-faint); }
.step-result::before { background: color-mix(in oklab, var(--ink-faint) 45%, transparent); }
.step-icon {
	flex: none;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 1.35rem;
	height: 1.35rem;
	font-size: 0.78rem;
	border-radius: 6px;
	background: var(--accent-wash);
	opacity: 0.9;
}
.step-label {
	flex: none;
	font-family: var(--mono, monospace);
	font-weight: 700;
	font-size: 0.64rem;
	letter-spacing: 0.07em;
	text-transform: uppercase;
	color: var(--accent-deep);
	align-self: center;
}
.step-arg {
	min-width: 0;
	font-family: var(--mono, monospace);
	font-size: 0.7rem;
	color: var(--ink-soft);
	background: var(--accent-wash);
	padding: 0.06rem 0.4rem;
	border-radius: 5px;
	word-break: break-word;
}
.step-body { min-width: 0; word-break: break-word; align-self: center; }
.step-note .step-body { color: var(--ink); }
.step-think .step-body { font-style: italic; }
.step-result { background: transparent; border-style: dashed; }
.step-result .step-body { color: var(--ink-faint); }
/* The Starlark the agent ran, shown as a full-width block inside its card. */
.step-code {
	flex-basis: 100%;
	margin: 0.35rem 0 0.05rem;
	padding: 0.55rem 0.7rem;
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-left: 2px solid var(--accent);
	border-radius: 0 7px 7px 0;
	font-family: var(--mono, monospace);
	font-size: 0.7rem;
	line-height: 1.5;
	color: var(--ink);
	white-space: pre-wrap;
	word-break: break-word;
	overflow-x: auto;
}
/* execute step's label row wraps so the code block sits below it. */
.step-call { flex-wrap: wrap; }

/* Agent transcript modal (summary / integrity live runs). */
.agent-dialog[open] {
	display: flex;
	flex-direction: column;
}
.agent-dialog {
	width: min(44rem, calc(100vw - 2rem));
	max-height: min(82vh, 46rem);
	padding: 0;
	color: var(--ink);
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: calc(var(--radius) + 0.2rem);
	box-shadow: var(--shadow-lg);
	animation: pop 200ms var(--ease);
	overflow: hidden;
}
.agent-dialog::backdrop {
	background: var(--overlay);
	backdrop-filter: blur(4px);
}
.agent-dialog-head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1rem;
	flex: none;
	padding: 1rem 1.25rem 0.85rem;
	border-bottom: 1px solid var(--line);
	background: color-mix(in oklab, var(--accent) 5%, var(--paper-2));
}
.agent-dialog-head .draft-badge { margin-bottom: 0; }
.agent-dialog-hint {
	font-family: var(--sans);
	font-size: 0.74rem;
	color: var(--ink-faint);
}
.agent-dialog-body {
	flex: 1 1 auto;
	min-height: 0;
	padding: 1rem 1.25rem 1.25rem;
	overflow-y: auto;
}
.agent-dialog-body .draft-steps { margin-bottom: 0; }
.agent-dialog-body .draft-text { margin-top: 0.85rem; }

/* Agentic opt-in: pill toggles that fill with accent when engaged. */
.agentic-seg label { min-width: 0; padding-inline: 0.7rem; }
.agentic-seg input:checked + label { background: var(--accent); color: var(--paper); }
.agentic-seg input:checked + label:hover { background: var(--accent-deep); }
/* Thinking only matters when Agentik is on — dim it otherwise as a hint.
   Class-based so it works for every mode-pill instance (composer + rewrite). */
.agentic-seg:has(.agentic-input:not(:checked)) .thinking-label,
.agentic-seg:has(.agentic-input:not(:checked)) .bestof-label {
	opacity: 0.35;
}
/* Sequential-thinking plan steps in the transcript. */
.step-plan .step-body { color: var(--ink-soft); }
.step-plan-badge {
	flex: none;
	font-family: var(--mono, monospace);
	font-size: 0.62rem;
	font-weight: 700;
	color: var(--accent-deep);
	background: var(--accent-wash);
	padding: 0.02rem 0.34rem;
	border-radius: 4px;
	white-space: nowrap;
}

/* Undo toast: floats above the composer dock after a paragraph delete */
#undo-slot { position: fixed; bottom: 9.5rem; left: 50%; transform: translateX(-50%); z-index: 40; }
.undo-toast {
	display: flex;
	align-items: center;
	gap: 0.75rem;
	padding: 0.6rem 0.7rem 0.6rem 1rem;
	background: var(--paper-2);
	border: 1px solid var(--accent-wash);
	border-left: 3px solid var(--accent);
	border-radius: var(--radius);
	box-shadow: var(--shadow-md);
	animation: rise var(--dur) var(--ease);
}
.undo-toast-text {
	font-family: var(--sans);
	font-size: 0.88rem;
	color: var(--ink-soft);
	white-space: nowrap;
}
.undo-toast-btn {
	font-family: var(--sans);
	font-size: 0.85rem;
	font-weight: 600;
	color: var(--accent-deep);
	background: var(--accent-wash);
	border: none;
	border-radius: calc(var(--radius) - 2px);
	padding: 0.35rem 0.75rem;
	cursor: pointer;
}
.undo-toast-btn:hover { background: var(--accent); color: var(--paper); }
.undo-toast-x {
	font-size: 1rem;
	line-height: 1;
	color: var(--ink-soft);
	background: none;
	border: none;
	padding: 0.25rem 0.4rem;
	cursor: pointer;
}
.undo-toast-x:hover { color: var(--ink); }

.draft-error {
	border-color: var(--danger-line);
	border-left-color: var(--danger);
	background: var(--danger-soft);
}
.draft-badge-error { color: var(--danger-ink); }
.draft-error-text {
	font-family: var(--sans);
	font-size: 0.95rem;
	color: var(--danger-ink);
	margin: 0;
}
.draft-error-actions {
	display: flex;
	align-items: center;
	gap: 0.6rem;
	margin-top: 0.9rem;
}
.btn-retry {
	padding: 0.6rem 1.1rem;
	border-radius: var(--radius-sm);
	font-weight: 600;
	font-size: 0.9rem;
	background: var(--danger);
	color: var(--paper-2);
	box-shadow: var(--shadow-sm);
	transition: all 160ms var(--ease);
}
.btn-retry:hover { background: var(--danger-deep); transform: translateY(-1px); }
.draft-error .btn-ghost { color: var(--danger-ink); border-color: var(--danger-line); }
.draft-error .btn-ghost:hover { border-color: var(--danger); background: transparent; }

.draft-actions {
	display: grid;
	grid-template-columns: minmax(12rem, 15rem) minmax(0, 1fr);
	gap: 1rem;
	margin-top: 1.15rem;
	align-items: start;
}
.draft-primary {
	display: flex;
	flex-direction: column;
	gap: 0.8rem;
	padding: 0.95rem 1rem;
	background: linear-gradient(180deg, var(--panel-grad-a), var(--panel-grad-b));
	border: 1px solid var(--line);
	border-radius: calc(var(--radius) + 2px);
}
.draft-primary-actions {
	display: flex;
	flex-wrap: wrap;
	gap: 0.55rem;
	align-items: center;
}
.draft-primary-note {
	margin: 0;
	font-size: 0.82rem;
	line-height: 1.5;
	color: var(--ink-faint);
}
.btn-accept, .btn-ghost {
	padding: 0.6rem 1.1rem;
	border-radius: var(--radius-sm);
	font-weight: 600;
	font-size: 0.9rem;
	transition: all 160ms var(--ease);
}
.btn-accept {
	background: var(--accent);
	color: var(--paper-2);
	box-shadow: var(--shadow-sm);
}
.btn-accept:hover { background: var(--accent-deep); transform: translateY(-1px); }
.btn-ghost {
	background: transparent;
	color: var(--accent);
	border: 1px solid var(--accent-wash);
}
.btn-ghost:hover { border-color: var(--accent); background: var(--accent-wash); }

/* Regenerate row: structured controls */
.regen-form {
	display: grid;
	gap: 0.7rem;
	padding: 0.95rem 1rem;
	background: var(--panel-solid);
	border: 1px solid var(--line);
	border-radius: calc(var(--radius) + 2px);
	box-shadow: var(--shadow-sm);
}
.regen-hidden { display: contents; }
.regen-head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 0.9rem;
}
.regen-copy { min-width: 0; }
.regen-title {
	font-family: var(--display);
	font-size: 1rem;
	font-weight: 600;
	letter-spacing: -0.01em;
}
.regen-subtitle {
	font-size: 0.78rem;
	color: var(--ink-faint);
	margin-top: 0.12rem;
}
.regen-submit {
	flex-shrink: 0;
	padding-inline: 1.2rem;
}
.regen-input {
	width: 100%;
	padding: 0.75rem 0.9rem;
	border-radius: var(--radius-sm);
	border: 1px solid var(--line);
	background: var(--paper);
	color: var(--ink);
	font: inherit;
	font-size: 0.95rem;
}
.regen-input:focus {
	outline: none;
	border-color: var(--accent);
	box-shadow: 0 0 0 3px var(--accent-wash);
}
.regen-groups {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: 0.75rem 0.9rem;
	align-items: start;
}
.regen-group {
	display: flex;
	flex-direction: column;
	gap: 0.35rem;
	min-width: 0;
}
.regen-label {
	font-size: 0.66rem;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	font-weight: 700;
	color: var(--ink-faint);
}
.regen-options {
	display: flex;
	flex-wrap: wrap;
	gap: 0.42rem;
}
.regen-options-choice .tone-chip {
	min-width: 0;
	justify-content: center;
}
.tone-chip {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 0.28rem 0.64rem;
	border-radius: 999px;
	font-size: 0.76rem;
	font-weight: 500;
	color: var(--ink-soft);
	background: var(--paper);
	border: 1px solid var(--line);
	transition: all 150ms var(--ease);
}
.tone-chip:hover {
	color: var(--accent-deep);
	border-color: var(--accent);
	background: var(--accent-wash);
	transform: translateY(-1px);
}
.tone-chip.is-active {
	color: var(--paper-2);
	border-color: var(--accent);
	background: var(--accent);
	box-shadow: var(--shadow-sm);
}

@media (max-width: 980px) {
	.draft-actions {
		grid-template-columns: 1fr;
	}
	.regen-groups {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

@media (max-width: 640px) {
	.regen-head {
		flex-direction: column;
		align-items: stretch;
	}
	.regen-submit {
		width: 100%;
	}
	.regen-options-choice .tone-chip {
		min-width: 0;
		flex: 1 1 calc(50% - 0.3rem);
	}
	.regen-groups {
		grid-template-columns: 1fr;
	}
}

/* ============================================================
   Composer (bottom dock)
   ============================================================ */
.composer {
	position: fixed;
	bottom: 0; left: 0; right: 0;
	z-index: 5;
	padding: 1.5rem 1.5rem 1.6rem;
	background: linear-gradient(transparent, var(--paper) 38%);
	pointer-events: none;
}
.composer-dock {
	max-width: var(--chapter-measure);
	margin: 0 auto;
	display: flex;
	flex-direction: column;
	gap: 0.45rem;
}
.composer-mode-input {
	position: absolute;
	opacity: 0;
	width: 0;
	height: 0;
	pointer-events: none;
}
.composer-mode {
	pointer-events: auto;
	display: inline-flex;
	align-self: center;
	overflow: hidden;
	background: var(--paper);
	border: 1px solid var(--line);
	border-radius: 10px;
	box-shadow: none;
}
.composer-mode label {
	display: grid;
	place-items: center;
	min-width: 4.65rem;
	min-height: 2.55rem;
	padding: 0 0.7rem;
	font-size: 0.78rem;
	font-weight: 700;
	color: var(--ink-faint);
	cursor: pointer;
	transition: background 120ms var(--ease), color 120ms var(--ease);
}
.composer-mode label + label { border-left: 1px solid var(--line); }
#mode-generate:checked ~ .composer-generate .composer-mode label[for="mode-generate"],
#mode-manual:checked ~ .composer-manual .composer-mode label[for="mode-manual"] {
	background: var(--accent-wash);
	color: var(--accent-deep);
}
.composer-form {
	display: flex;
	flex-direction: column;
	gap: 0.45rem;
	width: 100%;
}
.composer-manual { display: none; }
#mode-manual:checked ~ .composer-generate { display: none; }
#mode-manual:checked ~ .composer-manual { display: flex; }

/* ---- Context picker: baris chip ringkas di atas composer ---- */
.context-row {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	align-items: center;
	gap: 0.4rem;
	pointer-events: auto;
	max-width: var(--chapter-measure);
	width: 100%;
	margin: 0 auto;
}
.cp {
	position: relative;
	pointer-events: auto;
	min-width: 0;
}
.cp-trigger {
	display: inline-flex;
	align-items: center;
	gap: 0.4rem;
	min-height: 2.15rem;
	padding: 0.3rem 0.85rem 0.3rem 0.65rem;
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: 999px;
	box-shadow: var(--shadow-sm);
	font-size: 0.8rem;
	font-weight: 600;
	color: var(--ink-soft);
	transition: border-color 150ms var(--ease), box-shadow 150ms var(--ease), transform 120ms var(--ease);
}
.cp-trigger:hover {
	border-color: var(--accent-wash);
	box-shadow: var(--shadow-md);
	transform: translateY(-1px);
}
.cp-trigger-icon {
	display: grid;
	place-items: center;
	flex: 0 0 auto;
	width: 0.95rem;
	height: 0.95rem;
	color: var(--accent);
	line-height: 1;
}
.cp-trigger-icon .ic { width: 100%; height: 100%; }
.cp-summary {
	display: inline-flex;
	align-items: center;
	gap: 0.3rem;
	min-width: 0;
	max-width: 12rem;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cp-summary.cp-empty { color: var(--ink-faint); }
.cp-chip {
	display: inline-flex;
	align-items: center;
	padding: 0.1rem 0.55rem;
	border-radius: 999px;
	font-size: 0.8rem;
	font-weight: 500;
	background: var(--accent-wash);
	color: var(--accent-deep);
}
.cp-chip-world { background: var(--info-chip-bg); color: var(--info-chip-ink); }
.cp-chip-event { background: var(--event-chip-bg); color: var(--event-chip-ink); }
.cp-chip-summary { background: var(--summary-chip-bg); color: var(--summary-chip-ink); }
.cp-chip-fact { background: var(--accent-wash); color: var(--accent-deep); }
.cp-count {
	font-size: 0.78rem;
	font-weight: 600;
	color: var(--ink-faint);
	background: var(--paper);
	border: 1px solid var(--line);
	border-radius: 999px;
	padding: 0.05rem 0.4rem;
}

.cp-pop {
	position: absolute;
	bottom: calc(100% + 0.5rem);
	left: 50%;
	transform: translateX(-50%);
	width: min(22rem, 86vw);
	max-height: 22rem;
	display: flex;
	flex-direction: column;
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	box-shadow: var(--shadow-lg);
	z-index: 30;
	overflow: hidden;
}
.cp-pop[hidden] { display: none; }
.cp-search {
	border: none;
	border-bottom: 1px solid var(--line);
	background: var(--paper);
	padding: 0.7rem 0.9rem;
	font-family: var(--serif);
	font-size: 1rem;
	color: var(--ink);
}
.cp-search:focus { outline: none; border-bottom-color: var(--accent); }
.cp-list { overflow-y: auto; padding: 0.35rem; flex: 1; }
.cp-group + .cp-group { margin-top: 0.3rem; }
.cp-group[hidden] { display: none; }
.cp-group-head {
	display: flex;
	align-items: center;
	gap: 0.35rem;
	font-size: 0.7rem;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--ink-faint);
	font-weight: 600;
	padding: 0.4rem 0.5rem 0.25rem;
}
.cp-group-head .ic { width: 0.8rem; height: 0.8rem; color: var(--accent); }
.cp-opt {
	display: grid;
	grid-template-columns: auto 1fr;
	grid-template-areas: "check name" "check sub";
	align-items: center;
	gap: 0 0.55rem;
	padding: 0.45rem 0.5rem;
	border-radius: 8px;
	cursor: pointer;
	transition: background 120ms;
}
.cp-opt[hidden] { display: none; }
.cp-opt:hover { background: var(--accent-wash); }
.cp-opt input { position: absolute; opacity: 0; width: 0; height: 0; }
.cp-check {
	grid-area: check;
	width: 1.1rem; height: 1.1rem;
	border: 1.5px solid var(--line);
	border-radius: 5px;
	display: grid;
	place-items: center;
	transition: all 120ms var(--ease);
}
.cp-check::after { content: "✓"; color: #fff; font-size: 0.75rem; opacity: 0; transform: scale(0.5); transition: all 120ms var(--ease); }
.cp-opt input:checked + .cp-check { background: var(--accent); border-color: var(--accent); }
.cp-opt-world input:checked + .cp-check { background: oklch(55% 0.13 245); border-color: oklch(55% 0.13 245); }
.cp-opt-event input:checked + .cp-check { background: oklch(52% 0.12 155); border-color: oklch(52% 0.12 155); }
.cp-opt-summary input:checked + .cp-check { background: oklch(52% 0.03 70); border-color: oklch(52% 0.03 70); }
.cp-opt-fact input:checked + .cp-check { background: var(--accent); border-color: var(--accent); }
.cp-opt input:checked + .cp-check::after { opacity: 1; transform: scale(1); }
.cp-opt input:focus-visible + .cp-check { outline: 2px solid var(--accent); outline-offset: 1px; }
.cp-opt-name { grid-area: name; font-family: var(--display); font-weight: 500; font-size: 0.98rem; color: var(--ink); }
.cp-opt-sub {
	grid-area: sub;
	font-size: 0.8rem;
	color: var(--ink-faint);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	max-width: 16rem;
}
.cp-noresult { padding: 1rem; text-align: center; color: var(--ink-faint); font-style: italic; font-size: 0.9rem; }
.cp-noresult[hidden] { display: none; }
.cp-foot {
	display: flex;
	gap: 1rem;
	padding: 0.6rem 0.8rem;
	border-top: 1px solid var(--line);
	background: var(--paper);
}
.cp-manage { font-size: 0.82rem; color: var(--accent); text-decoration: none; }
.cp-manage:hover { text-decoration: underline; }
.summary-picker .cp-trigger,
.fact-picker .cp-trigger {
	border-color: var(--line);
	color: var(--ink-soft);
	background: var(--paper-2);
}
.summary-picker .cp-trigger:hover,
.fact-picker .cp-trigger:hover { border-color: var(--accent-wash); }
.summary-picker .cp-trigger-icon,
.fact-picker .cp-trigger-icon { color: var(--accent); }
.summary-picker .cp-summary,
.fact-picker .cp-summary {
	max-width: none;
	font-weight: 700;
}
.fact-pop {
	left: auto;
	right: 0;
	transform: none;
	width: min(24rem, 88vw);
}
.summary-pop {
	width: min(24rem, 88vw);
}
.summary-pop .cp-opt-sub {
	max-width: 19rem;
}
.fact-empty {
	border: none;
	padding: 1rem;
	font-size: 0.9rem;
}

.composer-inner {
	pointer-events: auto;
	display: grid;
	grid-template-columns: auto minmax(0, 1fr) auto auto;
	grid-template-areas:
		"mode prompt opts submit"
		"controls controls controls controls";
	align-items: center;
	gap: 0.5rem;
	width: 100%;
	max-width: var(--chapter-measure);
	margin: 0 auto;
	padding: 0.42rem;
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	box-shadow: var(--shadow-lg);
	transition: border-color var(--dur) var(--ease);
}
.composer-inner:focus-within { border-color: var(--accent); }
.composer-mode { grid-area: mode; }
.composer input[name="prompt"] {
	grid-area: prompt;
	width: 100%;
	min-width: 0;
	border: none;
	background: transparent;
	padding: 0.65rem 0.9rem;
	font-family: var(--serif);
	font-size: 1.08rem;
	color: var(--ink);
}
.composer input[name="prompt"]:focus { outline: none; }
.composer input[name="prompt"]::placeholder { color: var(--ink-faint); }
.composer-inner > button[type="submit"] {
	grid-area: submit;
	align-self: stretch;
}
/* Opsi generate tersembunyi secara default (progressive disclosure);
   tombol "Opsi" (checkbox hack) membukanya tanpa JS. */
.composer-controls {
	grid-area: controls;
	display: none;
	align-items: flex-start;
	flex-wrap: wrap;
	gap: 0.42rem 0.55rem;
	padding: 0.12rem 0 0;
	min-width: 0;
}
#composer-opts:checked ~ .composer-generate .composer-controls { display: flex; }
.composer-opts-toggle {
	grid-area: opts;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 0.35rem;
	align-self: stretch;
	padding: 0 0.8rem;
	border: 1px solid var(--line);
	border-radius: 10px;
	background: var(--paper);
	color: var(--ink-faint);
	font-size: 0.78rem;
	font-weight: 700;
	white-space: nowrap;
	cursor: pointer;
	transition: background 120ms var(--ease), color 120ms var(--ease), border-color 120ms var(--ease);
}
.composer-opts-toggle .ic { width: 0.9rem; height: 0.9rem; }
.composer-opts-toggle:hover { color: var(--accent); border-color: var(--accent-wash); }
#composer-opts:checked ~ .composer-generate .composer-opts-toggle {
	background: var(--accent-wash);
	color: var(--accent-deep);
	border-color: color-mix(in oklab, var(--accent) 40%, var(--line));
}
#composer-opts:focus-visible ~ .composer-generate .composer-opts-toggle {
	outline: 2px solid var(--accent);
	outline-offset: -2px;
}
.composer-tuning {
	display: contents;
}
.composer-choice {
	display: grid;
	grid-template-rows: auto 1fr;
	gap: 0.16rem;
	min-width: 0;
	width: max-content;
	max-width: 100%;
}
.composer-choice-label {
	font-size: 0.6rem;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	font-weight: 700;
	color: var(--ink-faint);
	padding-left: 0.1rem;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.composer-choice-seg {
	display: inline-flex;
	min-width: 0;
	background: var(--paper);
	border: 1px solid var(--line);
	border-radius: 10px;
	overflow: hidden;
	min-height: 2rem;
	width: max-content;
}
.composer-choice-seg input {
	position: absolute;
	opacity: 0;
	width: 0;
	height: 0;
}
.composer-choice-seg label {
	display: grid;
	place-items: center;
	flex: 0 0 auto;
	min-width: 2.75rem;
	padding: 0.28rem 0.54rem;
	font-size: 0.74rem;
	line-height: 1;
	font-weight: 600;
	text-align: center;
	white-space: nowrap;
	color: var(--ink-faint);
	cursor: pointer;
	transition: background 120ms, color 120ms;
}
.composer-choice-seg .composer-choice-clear {
	flex: 0 0 auto;
	min-width: 2rem;
	font-size: 0.9rem;
	font-weight: 700;
}
.composer-choice-seg input + label,
.composer-choice-seg label + input + label {
	border-left: 1px solid var(--line);
}
.composer-choice-seg input:first-of-type + label {
	border-left: none;
}
.composer-choice-seg input:checked + label {
	background: var(--accent-wash);
	color: var(--accent-deep);
}
.composer-choice-seg input:focus-visible + label {
	outline: 2px solid var(--accent);
	outline-offset: -2px;
}
.manual-inner {
	grid-template-columns: auto minmax(0, 1fr) auto;
}
.composer textarea[name="content"] {
	width: 100%;
	min-width: 0;
	height: 2.65rem;
	min-height: 2.65rem;
	max-height: 8rem;
	border: none;
	background: transparent;
	padding: 0.58rem 0.9rem;
	resize: vertical;
	font-family: var(--serif);
	font-size: 1.03rem;
	line-height: 1.45;
	color: var(--ink);
}
.composer textarea[name="content"]:focus { outline: none; }
.composer textarea[name="content"]::placeholder { color: var(--ink-faint); }
.kbd {
	font-family: var(--display);
	opacity: 0.8;
	margin-left: 0.15rem;
}

@media (max-width: 980px) {
	.editor-page {
		display: block;
		width: auto;
		max-width: var(--measure);
		padding-inline: 1.5rem;
	}
	.chapter-side {
		position: static;
		width: auto;
		margin: 0 0 1.75rem;
		order: -1;
		/* Stacked layout: let it grow with the page, no internal scroll. */
		max-height: none;
	}
	.side-tab-panels {
		overflow-y: visible;
	}
}

@media (max-width: 44rem) {
	:root {
		--composer-clearance: 14rem;
	}
	.composer {
		padding-inline: 0.8rem;
	}
	.context-row {
		gap: 0.35rem;
	}
	.side-tab-bar {
		gap: 0.35rem;
	}
	.side-tab-chip {
		padding: 0.45rem 0.6rem;
		font-size: 0.78rem;
	}
	.side-tab-count {
		min-width: 1.1rem;
		height: 1.1rem;
		font-size: 0.68rem;
	}
	.plot-point-new .btn-accept {
		width: 100%;
	}
	.plot-panel-card {
		max-height: min(54vh, 28rem);
	}
	.plot-point-topbar {
		grid-template-columns: 1fr;
		grid-template-areas:
			"heading"
			"meta"
			"action";
	}
	.plot-point-open {
		width: 100%;
	}
	.plot-point-modal {
		padding: 0.75rem;
	}
	.plot-point-modal-box {
		padding: 0.9rem;
	}
	.plot-point-modal-actions {
		flex-direction: column-reverse;
	}
	.plot-point-modal-actions .btn-ghost,
	.plot-point-modal-actions .btn-accept {
		width: 100%;
	}
	.cp-trigger {
		min-height: 2.3rem;
	}
	.composer-inner {
		grid-template-columns: auto minmax(0, 1fr);
		grid-template-areas:
			"mode mode"
			"prompt prompt"
			"controls controls"
			"opts submit";
	}
	.composer-opts-toggle {
		min-height: 2.55rem;
	}
	.composer-controls {
		grid-template-columns: 1fr;
	}
	#composer-opts:checked ~ .composer-generate .composer-controls {
		display: grid;
	}
	.composer-tuning,
	.composer-choice {
		width: 100%;
	}
	.composer-tuning {
		display: contents;
	}
	.composer-choice {
		grid-template-columns: 5.8rem minmax(0, 1fr);
		grid-template-rows: auto;
		align-items: center;
		gap: 0.45rem;
		width: 100%;
	}
	.composer-choice-seg { width: 100%; }
	.composer-choice-seg label { flex: 1 1 0; min-width: 0; }
	.manual-inner {
		grid-template-columns: 1fr;
	}
	.composer-mode label {
		flex: 1;
	}
	.count-seg {
		width: 100%;
	}
	.count-seg label {
		flex: 1;
		width: auto;
		min-height: 2.2rem;
	}
	.composer button[type="submit"] {
		width: 100%;
	}
}

/* Paragraph-count segmented control */
.count-seg {
	display: inline-flex;
	min-width: 0;
	background: var(--paper);
	border: 1px solid var(--line);
	border-radius: 10px;
	overflow: hidden;
	min-height: 2rem;
	width: max-content;
}
.count-seg input { position: absolute; opacity: 0; width: 0; height: 0; }
.count-seg label {
	display: grid;
	place-items: center;
	flex: 0 0 auto;
	min-width: 2.35rem;
	padding: 0.28rem 0.54rem;
	font-size: 0.82rem;
	font-weight: 600;
	color: var(--ink-faint);
	cursor: pointer;
	transition: background 120ms, color 120ms;
}
.count-seg label + input + label,
.count-seg input + label { border-left: 1px solid var(--line); }
.count-seg input:checked + label { background: var(--accent-wash); color: var(--accent-deep); }
.count-seg input:focus-visible + label { outline: 2px solid var(--accent); outline-offset: -2px; }

/* Editor header right cluster */
.ed-right {
	grid-area: right;
	display: flex;
	align-items: center;
	justify-content: flex-end;
	gap: 0.45rem;
}
.ed-rules {
	display: inline-flex;
	align-items: center;
	gap: 0.35rem;
	flex: 0 0 auto;
	font-size: 0.82rem;
	font-weight: 600;
	white-space: nowrap;
	color: var(--ink-soft);
	text-decoration: none;
	padding: 0.35rem 0.7rem;
	border: 1px solid var(--line);
	border-radius: var(--radius-sm);
	background: var(--paper-2);
	transition: color var(--dur) var(--ease), border-color var(--dur) var(--ease), background var(--dur) var(--ease);
}
.ed-rules .ic { width: 0.9rem; height: 0.9rem; color: var(--ink-faint); transition: color var(--dur) var(--ease); }
.ed-rules:hover { color: var(--accent); border-color: var(--accent); }
.ed-rules:hover .ic { color: var(--accent); }
.ed-rules.is-active {
	color: var(--accent-deep);
	border-color: color-mix(in oklab, var(--accent) 40%, var(--line));
	background: var(--accent-wash);
}
.ed-rules.is-active .ic { color: var(--accent-deep); }

/* Mobile: baris kedua untuk nav pill yang bisa digeser, judul di-ellipsis. */
@media (max-width: 52rem) {
	.ed-bar {
		grid-template-columns: auto minmax(0, 1fr) auto;
		grid-template-areas:
			"back meta right"
			"nav nav nav";
		row-gap: 0.55rem;
		padding: 0.6rem 0.9rem 0.55rem;
	}
	.ed-count { display: none; }
}

/* ============================================================
   Rules page
   ============================================================ */
.rules-page { max-width: 52rem; }
.rules-intro {
	font-family: var(--serif);
	font-style: italic;
	color: var(--ink-soft);
	margin: 0 0 2rem;
	font-size: 1.05rem;
}
.rules-form { display: flex; flex-direction: column; gap: 1.25rem; }
.rules-section-title {
	margin: 1.1rem 0 -0.35rem;
	padding-bottom: 0.4rem;
	border-bottom: 1px solid var(--line);
	font-family: var(--display);
	font-size: 1.18rem;
	font-weight: 600;
	letter-spacing: -0.01em;
	color: var(--ink);
}
.rules-form .rules-section-title:first-child { margin-top: 0; }
.field { display: flex; flex-direction: column; gap: 0.3rem; }
.preset-card {
	padding: 1rem;
	background: linear-gradient(180deg, var(--panel-grad-a), var(--panel-grad-b));
	border: 1px solid var(--line);
	border-radius: var(--radius);
	box-shadow: var(--shadow-sm);
}
.preset-head {
	display: flex;
	align-items: start;
	justify-content: space-between;
	gap: 1rem;
	margin-bottom: 0.8rem;
}
.preset-default {
	min-width: 13rem;
}
.preset-grid {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 0.9rem;
}
.preset-grid-compact {
	grid-template-columns: repeat(2, minmax(0, 1fr));
}
.field-label {
	font-family: var(--sans);
	font-weight: 600;
	font-size: 0.95rem;
	color: var(--ink);
}
.field-pos { color: var(--accent-deep); }
.field-neg { color: var(--danger-ink); }
.field-ban { color: oklch(50% 0.10 300); }
.field-hint { font-size: 0.82rem; color: var(--ink-faint); margin-bottom: 0.2rem; }
.field input,
.field textarea {
	font-family: var(--serif);
	font-size: 1.05rem;
	line-height: 1.6;
	color: var(--ink);
	padding: 0.7rem 0.9rem;
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: var(--radius-sm);
	box-shadow: var(--shadow-sm);
	transition: border-color var(--dur) var(--ease);
	resize: vertical;
}
.field input:focus,
.field textarea:focus { outline: none; border-color: var(--accent); }
.field input::placeholder,
.field textarea::placeholder { color: var(--ink-faint); }

.rules-actions { display: flex; gap: 0.6rem; align-items: center; margin-top: 0.5rem; }
.rules-actions .btn-ghost { text-decoration: none; display: inline-flex; align-items: center; }

/* Row of single-choice dropdowns */
.field-row {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 1rem;
}
@media (max-width: 34rem) {
	.field-row { grid-template-columns: 1fr; }
	.preset-grid { grid-template-columns: 1fr; }
	.preset-head {
		display: block;
	}
	.preset-default {
		min-width: 0;
		margin-top: 0.8rem;
	}
	.fact-filter-row,
	.fact-time-edit { grid-template-columns: 1fr; }
	.fact-tabs { align-self: stretch; }
	.fact-tab { flex: 1; }
	.fact-bulkbar,
	.fact-group-actions {
		align-items: stretch;
		flex-direction: column;
	}
}
.select-wrap { position: relative; }
.select-wrap::after {
	content: "▾";
	position: absolute;
	right: 0.8rem; top: 50%;
	transform: translateY(-50%);
	color: var(--ink-faint);
	pointer-events: none;
	font-size: 0.8rem;
}
.select-wrap select {
	width: 100%;
	appearance: none;
	-webkit-appearance: none;
	font-family: var(--serif);
	font-size: 1.02rem;
	color: var(--ink);
	padding: 0.65rem 2rem 0.65rem 0.9rem;
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: var(--radius-sm);
	box-shadow: var(--shadow-sm);
	cursor: pointer;
	transition: border-color var(--dur) var(--ease);
}
.select-wrap select:focus { outline: none; border-color: var(--accent); }

/* ============================================================
   Chapter list (story page)
   ============================================================ */
.chapter-list { list-style: none; margin: 1.5rem 0 0; padding: 0; display: flex; flex-direction: column; gap: 0.6rem; }
.chapter-card {
	display: flex;
	align-items: stretch;
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	box-shadow: var(--shadow-sm);
	overflow: hidden;
	transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease), border-color var(--dur) var(--ease);
	animation: rise var(--dur) var(--ease);
}
.chapter-card:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); border-color: var(--accent-wash); }
.chapter-open {
	flex: 1;
	display: grid;
	grid-template-columns: auto 1fr auto;
	align-items: center;
	gap: 1rem;
	padding: 1.1rem 1.3rem;
	text-decoration: none;
	color: var(--ink);
}
.chapter-num { font-family: var(--display); color: var(--ink-faint); font-variant-numeric: tabular-nums; }
.chapter-title { font-family: var(--display); font-weight: 500; font-size: 1.25rem; letter-spacing: -0.01em; }
.chapter-count { font-family: var(--display); font-size: 0.85rem; color: var(--ink-faint); }
.chapter-tools { display: flex; align-items: center; gap: 0.3rem; padding: 0 0.8rem; opacity: 0; transition: opacity var(--dur) var(--ease); }
.chapter-card:hover .chapter-tools { opacity: 1; }
.chapter-edit form { display: flex; gap: 0.5rem; align-items: center; padding: 0.8rem 1rem; width: 100%; }
.chapter-edit input {
	flex: 1;
	font-family: var(--display);
	font-size: 1.1rem;
	padding: 0.5rem 0.7rem;
	border: 1px solid var(--accent);
	border-radius: var(--radius-sm);
	background: var(--paper);
	color: var(--ink);
}
.chapter-edit input:focus { outline: none; }
.chapter-edit .btn-ghost { border: 1px solid var(--line); }

/* ============================================================
   Characters
   ============================================================ */
/* Intro + "Karakter baru" trigger. The full form lives in .char-dialog. */
.char-intro-bar {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 1rem;
	margin-bottom: 1.5rem;
}
.char-intro-bar .rules-intro { margin: 0; }
.char-add-btn { flex: none; white-space: nowrap; }
.char-edit input,
.char-edit textarea {
	font-family: var(--serif);
	font-size: 1.02rem;
	color: var(--ink);
	padding: 0.6rem 0.8rem;
	background: var(--paper);
	border: 1px solid var(--line);
	border-radius: var(--radius-sm);
	resize: vertical;
}
.char-edit input:focus,
.char-edit textarea:focus { outline: none; border-color: var(--accent); }

/* Masonry via multi-column: kartu dengan tinggi berbeda saling mengisi,
   tanpa lubang di bawah kartu pendek (kelemahan grid row-based). */
.char-list {
	column-width: 19rem;
	column-gap: 0.8rem;
}
.char-list > * {
	break-inside: avoid;
	margin-bottom: 0.8rem;
}
.char-list > .empty { column-span: all; }

.char-card {
	padding: 1.1rem 1.3rem;
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	box-shadow: var(--shadow-sm);
	animation: rise var(--dur) var(--ease);
	transition: box-shadow var(--dur) var(--ease), border-color var(--dur) var(--ease);
}
.char-card:hover { box-shadow: var(--shadow-md); }
.char-head { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; }
.char-name {
	margin: 0;
	font-family: var(--display);
	font-weight: 600;
	font-size: 1.2rem;
	letter-spacing: -0.01em;
}
.char-tools { display: flex; gap: 0.3rem; }
.char-card:hover .char-tools .ptool { opacity: 1; }
.char-profile {
	font-family: var(--serif);
	font-size: 1.05rem;
	line-height: 1.6;
	color: var(--ink-soft);
	margin: 0.5rem 0 0;
}
.char-empty-note { font-style: italic; color: var(--ink-faint); }
.char-edit { display: flex; flex-direction: column; gap: 0.6rem; }
.char-edit .char-tools { justify-content: flex-end; margin-top: 0.2rem; }

/* Add-character modal — mirrors .sum-dialog mechanics/shell. */
.char-dialog {
	width: min(44rem, calc(100vw - 2rem));
	max-height: min(88vh, 50rem);
	padding: 0;
	color: var(--ink);
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: calc(var(--radius) + 0.2rem);
	box-shadow: var(--shadow-lg);
	animation: pop 200ms var(--ease);
	overflow: hidden;
}
.char-dialog::backdrop {
	background: var(--overlay);
	backdrop-filter: blur(4px);
}
.char-dialog-head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1rem;
	padding: 1rem 1.15rem 0.75rem;
	border-bottom: 1px solid var(--line);
}
.char-dialog-head h3 {
	margin: 0;
	font-family: var(--display);
	font-size: 1.15rem;
	font-weight: 600;
}
.char-dialog-form { display: flex; flex-direction: column; min-height: 0; }
.char-dialog-body {
	display: flex;
	flex-direction: column;
	gap: 0.9rem;
	padding: 1.1rem 1.15rem;
	overflow-y: auto;
}
.char-dialog-foot {
	display: flex;
	justify-content: flex-end;
	gap: 0.6rem;
	padding: 0.85rem 1.15rem;
	border-top: 1px solid var(--line);
	background: var(--paper);
}

/* Labeled field — shared by the dialog, the edit card, and the field grid. */
.char-field-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr));
	gap: 0.9rem;
}
.char-field { display: flex; flex-direction: column; gap: 0.3rem; }
.char-field > span {
	font-family: var(--sans);
	font-size: 0.72rem;
	font-weight: 600;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	color: var(--ink-faint);
}
.char-req {
	font-style: normal;
	font-size: 0.62rem;
	color: var(--accent);
	margin-left: 0.35rem;
}
.char-field input,
.char-field textarea {
	font-family: var(--serif);
	font-size: 0.98rem;
	color: var(--ink);
	padding: 0.55rem 0.75rem;
	background: var(--paper);
	border: 1px solid var(--line);
	border-radius: var(--radius-sm);
	resize: vertical;
	width: 100%;
	box-sizing: border-box;
}
.char-field input:focus,
.char-field textarea:focus { outline: none; border-color: var(--accent); }

/* Structured traits on the read-only card. */
.char-attrs {
	margin: 0.7rem 0 0;
	display: flex;
	flex-direction: column;
	gap: 0.5rem;
}
.char-attr { display: flex; flex-direction: column; gap: 0.1rem; }
.char-attr dt {
	font-family: var(--sans);
	font-size: 0.68rem;
	font-weight: 600;
	letter-spacing: 0.05em;
	text-transform: uppercase;
	color: var(--ink-faint);
}
.char-attr dd {
	margin: 0;
	font-family: var(--serif);
	font-size: 1rem;
	line-height: 1.5;
	color: var(--ink-soft);
}

.fact-controls {
	display: flex;
	flex-direction: column;
	gap: 0.7rem;
	margin: 0 0 1rem;
}
.facts-page,
.rules-page:has(#facts-workspace) {
	max-width: min(78rem, 100%);
	padding-top: clamp(1.35rem, 3vh, 2.2rem);
}
.facts-page .rules-intro,
.rules-page:has(#facts-workspace) .rules-intro {
	max-width: 43rem;
	margin: 0 auto 1rem;
	font-size: 1rem;
	line-height: 1.55;
}
.facts-workspace,
#facts-workspace {
	max-width: 60rem;
	margin: 0 auto;
}
/* Dua baris eksplisit: snapshot + tab status + bulk di atas,
   pencarian + filter bab melebar penuh di bawah. Kolom fleksibel
   memakai minmax(0, 1fr) supaya tidak pernah meluber keluar container. */
.facts-workspace .fact-controls,
#facts-workspace .fact-controls {
	position: sticky;
	top: 4.1rem;
	z-index: 3;
	display: grid;
	grid-template-columns: auto minmax(0, 1fr) auto;
	grid-template-areas:
		"snapshot tabs bulk"
		"filter filter filter";
	align-items: center;
	gap: 0.4rem;
	margin-bottom: 0.55rem;
	padding: 0.38rem;
	background: var(--bar-bg);
	backdrop-filter: blur(12px);
	border: 1px solid var(--line);
	border-radius: var(--radius-sm);
	box-shadow: var(--shadow-sm);
}
.fact-snapshot { grid-area: snapshot; min-width: 0; }
.fact-snapshot .fact-chapter-filter { max-width: 14rem; }
.fact-controls .fact-tabs { grid-area: tabs; justify-self: start; }
.fact-controls > .fact-filter-row { grid-area: filter; }
.fact-controls .fact-bulkbar { grid-area: bulk; }
.fact-tabs {
	display: inline-flex;
	align-self: flex-start;
	border: 1px solid var(--line);
	border-radius: 8px;
	background: var(--paper-2);
	overflow: hidden;
	height: 2rem;
}
.fact-tab {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 3.25rem;
	padding: 0 0.55rem;
	font-size: 0.76rem;
	line-height: 1;
	font-weight: 700;
	color: var(--ink-soft);
	border-right: 1px solid var(--line);
}
.fact-tab:last-child { border-right: none; }
.fact-tab.is-active {
	background: var(--accent-wash);
	color: var(--accent-deep);
}
.fact-filter-row {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(9rem, 13rem);
	gap: 0.38rem;
	min-width: 0;
}
.fact-bulkbar {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 0.5rem;
	padding: 0;
	background: transparent;
	border: none;
	border-radius: 0;
}
.fact-selected-count {
	font-size: 0.82rem;
	font-weight: 700;
	color: var(--ink-faint);
}
.fact-bulk-delete {
	padding: 0.43rem 0.65rem;
	font-size: 0.82rem;
	border-radius: 8px;
	white-space: nowrap;
}
.fact-bulk-delete:disabled {
	background: var(--paper);
	color: var(--ink-faint);
	border: 1px solid var(--line);
	opacity: 1;
	cursor: not-allowed;
	box-shadow: none;
}
.fact-search,
.fact-chapter-filter {
	width: 100%;
	font-family: var(--serif);
	font-size: 0.88rem;
	color: var(--ink);
	padding: 0.41rem 0.6rem;
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: 8px;
}
.fact-search:focus,
.fact-chapter-filter:focus { outline: none; border-color: var(--accent); }
.fact-list { display: flex; flex-direction: column; gap: 0.65rem; }
.fact-group {
	border: 1px solid var(--line);
	border-radius: var(--radius-sm);
	background: var(--muted-panel);
	box-shadow: var(--shadow-sm);
	overflow: hidden;
}
.fact-group[hidden] { display: none; }
.fact-group-head {
	display: flex;
	align-items: center;
	gap: 0.55rem;
	padding: 0.55rem 0.7rem;
	cursor: pointer;
	font-family: var(--display);
	font-weight: 700;
	color: var(--ink);
}
.fact-group-title {
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.fact-group-spacer { flex: 1; }
.fact-group-count {
	font-family: var(--sans);
	font-size: 0.78rem;
	color: var(--ink-faint);
	font-weight: 700;
	white-space: nowrap;
}
.fact-group-actions {
	display: flex;
	align-items: center;
	gap: 0.35rem;
}
.fact-mini-action {
	padding: 0.3rem 0.5rem;
	border-radius: 8px;
	font-size: 0.76rem;
	font-weight: 700;
	color: var(--accent-deep);
	background: transparent;
	border: 1px solid var(--accent-wash);
	white-space: nowrap;
}
.fact-mini-action:hover { background: var(--accent-wash); }
.fact-mini-danger {
	color: var(--danger-ink);
	border-color: var(--danger-line);
}
.fact-mini-danger:hover {
	background: var(--danger-soft);
}
.fact-group-body {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 0.55rem;
	padding: 0 0.6rem 0.6rem;
}
.fact-group .fact-card {
	padding: 0.72rem 0.85rem;
	border-radius: var(--radius-sm);
	box-shadow: none;
}
.fact-card[hidden] { display: none; }
.fact-pick {
	display: inline-grid;
	place-items: center;
	flex: 0 0 auto;
	cursor: pointer;
}
.fact-pick input {
	position: absolute;
	opacity: 0;
	width: 0;
	height: 0;
}
.fact-pick span {
	width: 0.9rem;
	height: 0.9rem;
	border-radius: 5px;
	border: 1.5px solid var(--line);
	background: var(--paper);
	display: grid;
	place-items: center;
	transition: all 120ms var(--ease);
}
.fact-pick span::after {
	content: "✓";
	color: var(--paper-2);
	font-size: 0.75rem;
	opacity: 0;
	transform: scale(0.5);
	transition: all 120ms var(--ease);
}
.fact-pick input:checked + span {
	background: var(--accent);
	border-color: var(--accent);
}
.fact-pick input:checked + span::after {
	opacity: 1;
	transform: scale(1);
}
.fact-pick input:focus-visible + span {
	outline: 2px solid var(--accent);
	outline-offset: 2px;
}
.fact-card-active { border-color: var(--line); }
.fact-card-old {
	opacity: 0.72;
	background: var(--muted-panel-2);
}
.fact-card .char-head {
	align-items: flex-start;
	gap: 0.55rem;
}
.fact-card .char-head > div:not(.char-tools) {
	min-width: 0;
	flex: 1;
}
.fact-card .char-name {
	font-size: 1.02rem;
	line-height: 1.25;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.fact-card .char-tools {
	flex: 0 0 auto;
	gap: 0.25rem;
}
.fact-card .char-tools .ptool {
	width: 1.85rem;
	height: 1.85rem;
	font-size: 0.78rem;
}
.fact-meta {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 0.35rem;
	margin-bottom: 0.2rem;
	font-size: 0.66rem;
	text-transform: uppercase;
	letter-spacing: 0.1em;
	font-weight: 700;
	color: var(--ink-faint);
}
.fact-status {
	padding: 0.08rem 0.38rem;
	border-radius: 999px;
	letter-spacing: 0.06em;
}
.fact-status-active {
	background: var(--accent-wash);
	color: var(--accent-deep);
}
.fact-status-old {
	background: var(--accent-wash);
	color: var(--accent-deep);
}
.fact-object {
	margin-top: 0.45rem;
	font-size: 0.98rem;
	line-height: 1.42;
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	overflow: hidden;
}
.fact-replaced {
	margin: 0.45rem 0 0;
	padding: 0.38rem 0.5rem;
	border-left: 3px solid oklch(67% 0.13 35);
	background: var(--muted-panel);
	border-radius: 0.35rem;
	color: var(--ink-soft);
	font-size: 0.78rem;
	line-height: 1.35;
}
.fact-replaced strong {
	color: var(--ink);
	font-weight: 700;
}
.fact-time {
	display: flex;
	flex-wrap: wrap;
	gap: 0.35rem;
	margin: 0.4rem 0 0;
	font-size: 0.76rem;
	color: var(--ink-faint);
}
.fact-time span {
	border: 1px solid var(--line);
	border-radius: 999px;
	padding: 0.1rem 0.42rem;
	background: var(--paper);
}
.fact-source {
	margin: 0.5rem 0 0;
	padding-left: 0.6rem;
	border-left: 2px solid var(--line);
	font-family: var(--serif);
	font-size: 0.88rem;
	line-height: 1.45;
	font-style: italic;
	color: var(--ink-faint);
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	overflow: hidden;
}
.fact-field {
	display: flex;
	flex-direction: column;
	gap: 0.3rem;
}
.fact-field span {
	font-size: 0.72rem;
	text-transform: uppercase;
	letter-spacing: 0.12em;
	font-weight: 700;
	color: var(--ink-faint);
}
.fact-card .fact-field input,
.fact-card .fact-field textarea {
	width: 100%;
}
/* Fact fields inside the shared edit dialog have no .fact-card ancestor, so
   they take their input chrome from .char-field's dialog treatment. */
.char-dialog .fact-field input,
.char-dialog .fact-field textarea {
	font-family: var(--serif);
	font-size: 0.98rem;
	color: var(--ink);
	padding: 0.55rem 0.75rem;
	background: var(--paper);
	border: 1px solid var(--line);
	border-radius: var(--radius-sm);
	resize: vertical;
	width: 100%;
	box-sizing: border-box;
}
.char-dialog .fact-field input:focus,
.char-dialog .fact-field textarea:focus { outline: none; border-color: var(--accent); }
.fact-time-edit {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 0.5rem;
}
.fact-noresult {
	margin: 1rem 0 0;
	text-align: center;
	font-family: var(--serif);
	font-style: italic;
	color: var(--ink-faint);
}
.fact-picker-note {
	margin: 0;
	padding: 0.55rem 0.8rem 0;
	font-size: 0.78rem;
	color: var(--ink-faint);
}
.fact-cp-group {
	border: 1px solid var(--line);
	border-radius: 9px;
	overflow: hidden;
}
.fact-cp-group + .fact-cp-group { margin-top: 0.4rem; }
.fact-cp-head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 0.5rem;
	cursor: pointer;
	background: var(--paper);
}
.fact-select-group {
	padding: 0.25rem 0.45rem;
	border-radius: 999px;
	font-size: 0.72rem;
	font-weight: 700;
	color: var(--accent-deep);
	background: var(--accent-wash);
	white-space: nowrap;
}
.fact-select-group:hover { background: var(--accent-wash); }

@media (max-width: 62rem) {
	.facts-workspace,
	#facts-workspace {
		max-width: 43rem;
	}
	.facts-workspace .fact-controls,
	#facts-workspace .fact-controls {
		position: static;
		grid-template-columns: 1fr;
		grid-template-areas:
			"snapshot"
			"tabs"
			"filter"
			"bulk";
	}
	.fact-snapshot .fact-chapter-filter { max-width: none; }
	.fact-controls .fact-tabs { justify-self: stretch; }
	.fact-tabs {
		width: 100%;
	}
	.fact-tab {
		flex: 1;
	}
	.fact-bulkbar {
		justify-content: space-between;
	}
	.fact-group-body {
		grid-template-columns: 1fr;
	}
}

@media (max-width: 34rem) {
	.facts-page {
		padding-inline: 0.8rem;
	}
	.facts-page .rules-intro {
		margin-bottom: 0.75rem;
		font-size: 0.92rem;
	}
	.fact-filter-row {
		grid-template-columns: 1fr;
	}
	.fact-group-head,
	.fact-bulkbar,
	.fact-group-actions {
		align-items: stretch;
		flex-direction: column;
	}
	.fact-group-head {
		gap: 0.45rem;
	}
	.fact-group-spacer {
		display: none;
	}
	.fact-card .char-name {
		white-space: normal;
	}
}

.timeline {
	display: flex;
	flex-direction: column;
	gap: 0.8rem;
}

.tl-card {
	position: relative;
	transition: box-shadow var(--dur) var(--ease), border-color var(--dur) var(--ease), opacity 140ms var(--ease);
}

.tl-card[data-dragging="true"] {
	opacity: 0.45;
}

.tl-card[data-drop="before"] {
	box-shadow: inset 0 3px 0 var(--accent);
	border-top-color: var(--accent);
}

.tl-card[data-drop="after"] {
	box-shadow: inset 0 -3px 0 var(--accent);
	border-bottom-color: var(--accent);
}

.tl-title {
	display: flex;
	align-items: center;
	gap: 0.65rem;
	min-width: 0;
}

.tl-drag {
	display: grid;
	place-items: center;
	width: 1.9rem;
	height: 1.9rem;
	border-radius: 8px;
	border: 1px solid var(--line);
	background: var(--paper);
	color: var(--ink-faint);
	font-size: 1rem;
	font-weight: 700;
	letter-spacing: 0.08em;
	cursor: grab;
	flex: 0 0 auto;
	transition: color var(--dur) var(--ease), border-color var(--dur) var(--ease), background var(--dur) var(--ease);
}
.tl-drag .ic { width: 0.95rem; height: 0.95rem; }

.tl-drag:hover {
	color: var(--accent);
	border-color: var(--accent);
	background: var(--accent-wash);
}

.tl-drag:active {
	cursor: grabbing;
}

/* ---- Searchable style multi-select ---- */
.style-select { position: relative; }
.ss-control {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0.4rem;
	padding: 0.5rem 0.6rem;
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: var(--radius-sm);
	box-shadow: var(--shadow-sm);
	transition: border-color var(--dur) var(--ease);
	cursor: text;
}
.style-select:focus-within .ss-control { border-color: var(--accent); }

.ss-chips { display: contents; }
.ss-chip {
	display: inline-flex;
	align-items: center;
	gap: 0.35rem;
	padding: 0.25rem 0.3rem 0.25rem 0.65rem;
	background: var(--accent-wash);
	color: var(--accent-deep);
	border-radius: 999px;
	font-family: var(--sans);
	font-size: 0.85rem;
	font-weight: 500;
	animation: rise 200ms var(--ease);
}
.ss-x {
	display: grid;
	place-items: center;
	width: 1.15rem; height: 1.15rem;
	border-radius: 50%;
	color: var(--accent-deep);
	font-size: 1rem;
	line-height: 1;
	opacity: 0.6;
	transition: opacity 120ms, background 120ms;
}
.ss-x:hover { opacity: 1; background: var(--accent-wash); }

.ss-input {
	flex: 1;
	min-width: 8rem;
	border: none;
	background: transparent;
	font-family: var(--serif);
	font-size: 1.05rem;
	color: var(--ink);
	padding: 0.2rem;
}
.ss-input:focus { outline: none; }
.ss-input::placeholder { color: var(--ink-faint); }

.ss-menu[hidden] { display: none; }
.ss-menu {
	position: absolute;
	z-index: 20;
	left: 0; right: 0;
	top: calc(100% + 0.35rem);
	max-height: 16rem;
	overflow-y: auto;
	padding: 0.35rem;
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: var(--radius-sm);
	box-shadow: var(--shadow-lg);
	display: flex;
	flex-direction: column;
	gap: 1px;
	animation: rise 160ms var(--ease);
}
.ss-opt {
	text-align: left;
	padding: 0.5rem 0.7rem;
	border-radius: 7px;
	font-family: var(--sans);
	font-size: 0.92rem;
	color: var(--ink);
	transition: background 120ms;
}
.ss-opt:hover { background: var(--accent-wash); }
.ss-opt mark { background: var(--gold); color: var(--ink); border-radius: 3px; padding: 0 1px; }
.ss-custom { color: var(--accent-deep); font-weight: 600; }

/* ============================================================
   Global confirm modal
   ============================================================ */
.modal {
	position: fixed;
	inset: 0;
	z-index: 100;
	display: grid;
	place-items: center;
	padding: 1.5rem;
}
.modal[hidden] { display: none; }
.modal-backdrop {
	position: absolute;
	inset: 0;
	background: var(--overlay);
	backdrop-filter: blur(2px);
	animation: fade 160ms var(--ease);
}
.modal-box {
	position: relative;
	width: min(26rem, 100%);
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	box-shadow: var(--shadow-lg);
	padding: 1.6rem;
	animation: pop 200ms var(--ease);
}
.modal-text {
	font-family: var(--serif);
	font-size: 1.1rem;
	line-height: 1.5;
	color: var(--ink);
	margin: 0 0 1.4rem;
}
.modal-actions { display: flex; justify-content: flex-end; gap: 0.6rem; }
.modal-actions .btn-ghost {
	padding: 0.55rem 1.1rem;
	border-radius: var(--radius-sm);
	font-weight: 600;
	font-size: 0.9rem;
	background: transparent;
	color: var(--ink-soft);
	border: 1px solid var(--line);
	transition: all 150ms var(--ease);
}
.modal-actions .btn-ghost:hover { border-color: var(--ink-faint); color: var(--ink); }
.btn-danger {
	padding: 0.55rem 1.2rem;
	border-radius: var(--radius-sm);
	font-weight: 600;
	font-size: 0.9rem;
	background: var(--danger);
	color: var(--paper-2);
	box-shadow: var(--shadow-sm);
	transition: background 150ms var(--ease), transform 120ms var(--ease);
}
.btn-danger:hover { background: var(--danger-deep); }
.btn-danger:active { transform: translateY(1px); }

@keyframes fade { from { opacity: 0; } to { opacity: 1; } }
@keyframes pop {
	from { opacity: 0; transform: translateY(8px) scale(0.98); }
	to   { opacity: 1; transform: none; }
}

/* htmx in-flight feedback */
.htmx-request .draft-badge,
button.htmx-request { opacity: 0.7; }

/* ============================================================
   Terjemahan per paragraf (Indo → English)
   ============================================================ */

/* Segmented language view toggle in the ed-bar */
.lang-toggle {
	display: flex;
	border: 1px solid var(--line);
	border-radius: 999px;
	overflow: hidden;
	background: var(--paper-2);
	box-shadow: var(--shadow-sm);
}
.lang-toggle button {
	padding: 0.32rem 0.68rem;
	font-family: var(--sans);
	font-size: 0.72rem;
	font-weight: 600;
	letter-spacing: 0.04em;
	color: var(--ink-faint);
	background: none;
	cursor: pointer;
	transition: background 150ms var(--ease), color 150ms var(--ease);
}
.lang-toggle button + button { border-left: 1px solid var(--line); }
.lang-toggle button:hover { color: var(--accent); }
.lang-toggle button.is-active { background: var(--accent-wash); color: var(--accent-deep); }

/* English slot under each paragraph. In "both" mode it reads as a quiet
   parallel text: thin accent rule, slightly muted ink. */
.para-tr {
	margin: 0.55rem 0 0;
	padding: 0.1rem 0 0.1rem 0.95rem;
	border-left: 2px solid var(--accent-wash);
}
.para-tr-text { margin: 0; color: var(--ink-soft); animation: rise var(--dur) var(--ease); }
.para-tr-hint {
	display: flex;
	align-items: center;
	gap: 0.6rem;
	font-family: var(--sans);
	font-size: 0.76rem;
	color: var(--ink-faint);
}
.para-tr-stale { margin-top: 0.35rem; }
.para-tr-actions { margin-top: 0.4rem; flex-wrap: wrap; }
.para-tr-stale-mark::before { content: "⟳ "; color: var(--gold); }
.para-tr-del {
	padding: 0.2rem 0.6rem;
	border: 1px solid var(--line);
	border-radius: 999px;
	font-family: var(--sans);
	font-size: 0.7rem;
	font-weight: 600;
	color: var(--ink-faint);
	background: transparent;
	cursor: pointer;
	transition: color 150ms var(--ease), border-color 150ms var(--ease);
}
.para-tr-del:hover { color: var(--danger-ink); border-color: var(--danger-ink); }
.para-tr-btn {
	padding: 0.24rem 0.7rem;
	border: 1px solid var(--accent);
	border-radius: 999px;
	font-family: var(--sans);
	font-size: 0.72rem;
	font-weight: 700;
	letter-spacing: 0.03em;
	color: var(--accent-deep);
	background: var(--paper-2);
	cursor: pointer;
	transition: background 150ms var(--ease);
}
.para-tr-btn:hover { background: var(--accent-wash); }
.para-tr-notice {
	margin: 0.3rem 0 0;
	font-family: var(--sans);
	font-size: 0.74rem;
	color: var(--danger-ink);
}
.para-tr-loading {
	display: none;
	font-family: var(--sans);
	font-size: 0.76rem;
	font-weight: 600;
	color: var(--accent);
	animation: fade 600ms var(--ease) infinite alternate;
}
.para-tr.htmx-request .para-tr-loading { display: inline-block; }
.para-tr.htmx-request .para-tr-hint { display: none; }
/* Live agentic translation: the transcript + streamed English prose share the
   slot while the agent works, matching the draft-card treatment. */
.para-tr-stream .draft-badge { margin-bottom: 0.5rem; }
.para-tr-draft:not(:empty) {
	margin-top: 0.55rem;
	color: var(--ink-soft);
	white-space: pre-wrap;
}

/* ---------- Gambar referensi (generate & regenerate) ---------- */
.img-attach {
	display: inline-flex;
	align-items: center;
	gap: 0.45rem;
}
.img-attach-btn[hidden] { display: none; }
/* Match the muted "empty" label of the sibling context pickers */
.img-attach-btn .img-attach-label { color: var(--ink-faint); }
.img-attach-chip {
	display: inline-flex;
	align-items: center;
	gap: 0.4rem;
	min-height: 2.15rem;
	padding: 0.25rem 0.35rem 0.25rem 0.6rem;
	background: var(--accent-wash);
	border: 1px solid var(--accent);
	border-radius: 999px;
	font-family: var(--sans);
	font-size: 0.76rem;
	font-weight: 600;
	color: var(--accent-deep);
	animation: rise 200ms var(--ease);
}
.img-attach-chip[hidden] { display: none; }
.img-attach-thumb {
	width: 1.6rem;
	height: 1.6rem;
	object-fit: cover;
	border-radius: 50%;
	border: 1px solid var(--accent);
}
.img-attach-name {
	max-width: 10rem;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.img-attach-clear {
	display: grid;
	place-items: center;
	width: 1.4rem;
	height: 1.4rem;
	border-radius: 50%;
	color: var(--accent-deep);
	font-size: 1rem;
	line-height: 1;
	transition: background 120ms;
}
.img-attach-clear:hover { background: var(--paper-2); }
.regen-image { display: flex; }
.regen-image .cp-trigger { min-height: 1.9rem; padding: 0.2rem 0.7rem 0.2rem 0.55rem; font-size: 0.74rem; }

/* View modes — data-lang on #prose, set by lang-toggle.js */
.prose[data-lang="id"] .para-tr { display: none; }
.prose[data-lang="en"] .para-wrap > .para { display: none; }
.prose[data-lang="en"] .para-tr {
	margin-top: 0;
	padding-left: 0;
	border-left: none;
}
.prose[data-lang="en"] .para-tr-text { color: var(--ink); }
.prose[data-lang="en"] > .para-wrap:first-of-type .para-tr-text::first-letter {
	font-family: var(--display);
	font-weight: 600;
	font-size: 3.4em;
	line-height: 0.78;
	float: left;
	padding: 0.05em 0.12em 0 0;
	color: var(--accent);
}

@media (prefers-reduced-motion: reduce) {
	*, *::before, *::after { animation: none !important; transition: none !important; scroll-behavior: auto; }
}

/* ---- Prompt inspector ---- */
.prompt-preview-btn {
	border: 1px solid var(--line);
	background: none;
	color: var(--ink-faint);
	border-radius: 0.5rem;
	padding: 0.35rem 0.6rem;
	font-size: 0.78rem;
	cursor: pointer;
	white-space: nowrap;
}
.prompt-preview-btn:hover { border-color: var(--ink-faint); color: var(--ink); }
.prompt-preview-box {
	max-width: min(48rem, 92vw);
	width: 100%;
	max-height: 82vh;
	display: flex;
	flex-direction: column;
}
.prompt-preview-head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1rem;
	margin-bottom: 0.6rem;
}
.prompt-preview-body { overflow-y: auto; min-height: 6rem; }
.prompt-preview-meta {
	display: flex;
	gap: 1rem;
	font-size: 0.78rem;
	color: var(--ink-faint);
	margin-bottom: 0.7rem;
}
.prompt-preview-msg { margin-bottom: 0.9rem; }
.prompt-preview-role {
	font-size: 0.7rem;
	text-transform: uppercase;
	letter-spacing: 0.08em;
	color: var(--ink-faint);
	margin-bottom: 0.25rem;
}
.prompt-preview-role-system { color: var(--accent, #c96f4a); }
.prompt-preview-content {
	white-space: pre-wrap;
	word-break: break-word;
	font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
	font-size: 0.78rem;
	line-height: 1.55;
	background: color-mix(in oklab, var(--ink) 4%, transparent);
	border: 1px solid var(--line);
	border-radius: 0.5rem;
	padding: 0.7rem 0.8rem;
	margin: 0;
}

/* ============================================================
   Chapter integrity checker — sidebar panel + result report
   ============================================================ */
.intg-card { display: flex; flex-direction: column; gap: 0.9rem; }
.intg-panel-head {
	display: flex;
	flex-direction: column;
	gap: 0.5rem;
}
.intg-head-top {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 0.5rem 0.75rem;
	flex-wrap: wrap;
}
.intg-hint {
	margin: 0;
	font-size: 0.85rem;
	line-height: 1.5;
	color: var(--ink-soft);
}
.intg-actions { display: flex; align-items: center; gap: 0.35rem; flex-shrink: 0; }
.intg-clear { white-space: nowrap; }
.intg-clear:hover { color: var(--accent-deep); border-color: var(--accent-wash); }
.intg-stale {
	margin: 0 0 0.6rem;
	padding: 0.4rem 0.55rem;
	border-radius: var(--radius-sm);
	background: var(--danger-soft);
	border: 1px solid var(--danger-line);
	color: var(--danger-ink);
	font-size: 0.82rem;
	line-height: 1.45;
}
.intg-run { white-space: nowrap; }
.intg-run-busy { display: none; align-items: center; gap: 0.35rem; }
.intg-card.htmx-request .intg-run { opacity: 0.9; pointer-events: none; }
.intg-card.htmx-request .intg-run-idle { display: none; }
.intg-card.htmx-request .intg-run-busy { display: inline-flex; }

/* Reference-fact picker (Grouped: chapter → facts) */
.intg-refs { font-size: 0.85rem; }
.intg-refs > summary {
	cursor: pointer;
	color: var(--ink-soft);
	font-weight: 500;
	padding: 0.3rem 0;
}
.intg-ref-groups { display: flex; flex-direction: column; gap: 0.35rem; margin-top: 0.4rem; }
.intg-ref-chapter { border-left: 2px solid var(--line); padding-left: 0.6rem; }
.intg-ref-chapter > summary {
	cursor: pointer;
	color: var(--ink);
	font-size: 0.82rem;
	padding: 0.2rem 0;
}
.intg-ref-list { list-style: none; margin: 0.25rem 0 0.4rem; padding: 0; display: flex; flex-direction: column; gap: 0.25rem; }
.intg-ref-item { display: flex; gap: 0.45rem; align-items: flex-start; line-height: 1.4; color: var(--ink-soft); cursor: pointer; }
.intg-ref-item input { margin-top: 0.2rem; }

/* Result report */
.intg-result:empty { display: none; }
.intg-report { display: flex; flex-direction: column; gap: 0.85rem; }
.intg-head { display: flex; align-items: center; gap: 0.9rem; }
.intg-score {
	display: flex;
	align-items: baseline;
	gap: 0.1rem;
	padding: 0.4rem 0.7rem;
	border-radius: var(--radius-sm);
	background: var(--muted-panel);
	border: 1px solid var(--line);
	font-family: var(--display);
}
.intg-score-num { font-size: 1.9rem; line-height: 1; font-weight: 600; }
.intg-score-max { font-size: 0.85rem; color: var(--ink-faint); }
.intg-score[data-band="good"] { color: var(--event-chip-ink); border-color: var(--event-chip-bg); }
.intg-score[data-band="warn"] { color: var(--accent-deep); border-color: var(--accent-wash); }
.intg-score[data-band="bad"]  { color: var(--danger-ink); border-color: var(--danger-line); background: var(--danger-soft); }
.intg-clean { margin: 0; font-size: 0.9rem; color: var(--ink-soft); line-height: 1.5; }
.intg-count { margin: 0; font-size: 0.9rem; color: var(--ink); font-weight: 500; }

.intg-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.6rem; }
.intg-issue {
	border: 1px solid var(--line);
	border-left-width: 3px;
	border-radius: var(--radius-sm);
	background: var(--paper-2);
	padding: 0.6rem 0.75rem;
}
.intg-issue[data-severity="high"]   { border-left-color: var(--danger); }
.intg-issue[data-severity="medium"] { border-left-color: var(--accent); }
.intg-issue[data-severity="low"]    { border-left-color: var(--gold); }
.intg-issue-top { display: flex; align-items: center; gap: 0.4rem; flex-wrap: wrap; margin-bottom: 0.35rem; }
.intg-badge {
	font-size: 0.68rem;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	padding: 0.1rem 0.4rem;
	border-radius: 999px;
	background: var(--muted-panel-2);
	color: var(--ink-soft);
}
.intg-type { font-size: 0.78rem; color: var(--ink-faint); }
.intg-badge-fp {
	background: color-mix(in oklab, var(--paper) 82%, black);
	color: var(--ink-faint);
}
/* A dismissed issue is muted and its reason struck, but stays visible so it can
   be un-dismissed. Its left accent goes neutral. */
.intg-issue[data-fp="true"] { opacity: 0.55; border-left-color: var(--ink-faint) !important; }
.intg-issue[data-fp="true"] .intg-reason { text-decoration: line-through; }
.intg-fp-toggle {
	appearance: none;
	margin-top: 0.5rem;
	padding: 0.2rem 0.5rem;
	border: 1px solid var(--line);
	border-radius: 999px;
	background: transparent;
	color: var(--ink-soft);
	font-size: 0.74rem;
	font-family: var(--sans);
	cursor: pointer;
	transition: border-color var(--dur) var(--ease), color var(--dur) var(--ease);
}
.intg-fp-toggle:hover { color: var(--ink); border-color: var(--ink-faint); }
.intg-anchor {
	margin-left: auto;
	text-decoration: none;
	color: var(--accent);
	font-weight: 600;
	padding: 0 0.2rem;
}
.intg-anchor:hover { color: var(--accent-deep); }
.intg-reason { margin: 0; font-size: 0.9rem; line-height: 1.55; color: var(--ink); }
.intg-excerpt { margin: 0.3rem 0 0; font-size: 0.85rem; font-style: italic; color: var(--ink-soft); }
.intg-suggestion {
	margin: 0.4rem 0 0;
	font-size: 0.85rem;
	line-height: 1.5;
	color: var(--ink-soft);
	padding-left: 0.6rem;
	border-left: 2px solid var(--accent-wash);
}

/* Referenced-paragraph highlight while the Integritas tab is open (JS-driven). */
.para-wrap.intg-ref {
	background: color-mix(in oklab, var(--accent-wash) 32%, transparent);
	border-radius: var(--radius-sm);
	transition: background var(--duration-normal, 300ms) var(--ease), box-shadow var(--duration-normal, 300ms) var(--ease);
}
.para-wrap.intg-ref-active {
	background: var(--accent-wash);
	box-shadow: 0 0 0 3px var(--accent-wash);
}

/* Obsolete / changed markers inside the report. */
.intg-badge-obsolete {
	background: color-mix(in oklab, var(--paper) 82%, black);
	color: var(--ink-faint);
}
.intg-issue[data-obsolete="true"] {
	opacity: 0.5;
	border-left-color: var(--ink-faint) !important;
}
.intg-issue[data-obsolete="true"] .intg-reason { text-decoration: line-through; }
.intg-anchor-changed {
	color: var(--ink-faint);
	text-decoration: line-through;
}
.intg-changed-note {
	margin: 0.4rem 0 0;
	font-size: 0.78rem;
	line-height: 1.45;
	color: var(--accent-deep);
}
.intg-issue[data-obsolete="true"] .intg-changed-note { color: var(--ink-faint); }

/* Highlight a paragraph when an integrity anchor scrolls to it (pure CSS). */
.para-wrap:target {
	animation: intg-flash 1.8s var(--ease);
	border-radius: var(--radius-sm);
}
@keyframes intg-flash {
	0%, 30% { background: var(--accent-wash); box-shadow: 0 0 0 4px var(--accent-wash); }
	100% { background: transparent; box-shadow: 0 0 0 0 transparent; }
}
@media (prefers-reduced-motion: reduce) {
	.para-wrap:target { animation: none; background: var(--accent-wash); }
}

/* Import chapter form: a styled dropzone + title row, not native controls. */
.import-card {
	margin-top: 0.7rem;
	display: flex;
	flex-direction: column;
	gap: 0.6rem;
	padding: 0.7rem;
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	box-shadow: var(--shadow-sm);
}
.dropzone {
	position: relative;
	display: flex;
	align-items: center;
	gap: 0.7rem;
	padding: 0.9rem 1.1rem;
	border: 1.5px dashed var(--line);
	border-radius: var(--radius-sm);
	cursor: pointer;
	color: var(--ink-soft);
	transition: border-color var(--dur) var(--ease), background var(--dur) var(--ease), color var(--dur) var(--ease);
}
.dropzone:hover { border-color: var(--accent); color: var(--ink); }
.dropzone input[type="file"] {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	opacity: 0;
	cursor: pointer;
}
.dropzone-icon {
	font-size: 1.2rem;
	line-height: 1;
	color: var(--accent);
}
.dropzone-name {
	font-size: 0.95rem;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.dropzone.has-file {
	border-style: solid;
	border-color: var(--accent);
	background: var(--accent-wash);
}
.dropzone.has-file .dropzone-name { color: var(--ink); font-weight: 600; }
.import-row {
	display: flex;
	gap: 0.5rem;
}
.import-row input {
	flex: 1;
	border: 1px solid var(--line);
	background: var(--paper);
	border-radius: var(--radius-sm);
	padding: 0.7rem 0.9rem;
	font-family: var(--serif);
	font-size: 1.05rem;
	color: var(--ink);
	transition: border-color var(--dur) var(--ease);
}
.import-row input:focus { outline: none; border-color: var(--accent); }
.import-row input::placeholder { color: var(--ink-faint); }
.import-row button {
	background: var(--accent);
	color: var(--paper-2);
	padding: 0.65rem 1.4rem;
	border-radius: var(--radius-sm);
	font-weight: 600;
	font-size: 0.95rem;
	white-space: nowrap;
	box-shadow: var(--shadow-sm);
	transition: background var(--dur) var(--ease), transform 120ms var(--ease);
}
.import-row button:hover { background: var(--accent-deep); }
.import-row button:active { transform: translateY(1px); }

/* Import preview: parsed draft shown before writing the chapter to DB. */
.import-preview {
	margin-top: 0.9rem;
	padding: 1.1rem 1.2rem;
	background: var(--paper-2);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	animation: intg-flash 0.9s var(--ease);
}
.import-head {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 1rem;
	margin-bottom: 0.9rem;
	padding-bottom: 0.7rem;
	border-bottom: 1px solid var(--line);
}
.import-title { margin: 0.15rem 0 0; font-size: 1.15rem; }
.import-body {
	max-height: 45vh;
	overflow-y: auto;
	display: flex;
	flex-direction: column;
	gap: 0.65rem;
}
.import-para { margin: 0; line-height: 1.7; color: var(--ink); }
.import-divider {
	align-self: center;
	letter-spacing: 0.5em;
	color: var(--ink-soft);
	font-size: 0.8rem;
	padding: 0.2rem 0;
}
.import-actions {
	display: flex;
	gap: 0.6rem;
	margin-top: 1rem;
	padding-top: 0.8rem;
	border-top: 1px solid var(--line);
}
@media (prefers-reduced-motion: reduce) {
	.import-preview { animation: none; }
}
