/* 樂屋 — portrait scene art with a shared, blurred desktop side fill. */
.entry-login{min-height:100svh;display:grid;place-items:center;padding:20px}
.entry-login main{width:min(100%,22rem);background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:clamp(20px,6vw,32px)}
.entry-login main>img{display:block;width:9rem;height:auto;margin:0 auto 24px}
:root{color-scheme:dark;--safe-top:env(safe-area-inset-top,0px);--safe-right:env(safe-area-inset-right,0px);--safe-bottom:env(safe-area-inset-bottom,0px);--safe-left:env(safe-area-inset-left,0px);--bg:#151b24;--surface:#1e2836;--surface-raised:#2a3749;--line:#40536c;--text:#e4ebf5;--muted:#9cacc1;--accent:#a7bfdc;--link:#7dd3fc;--link-hover:#bae6fd;--brand:var(--accent);--action:#e7a4c2;--action-hover:#f2bfd5;--danger:#e3aaa2;--reader-size:19px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans TC",sans-serif;font-synthesis:none}
*{box-sizing:border-box}html{touch-action:pan-x pan-y;scroll-behavior:smooth;scroll-padding:var(--safe-top) var(--safe-right) var(--safe-bottom) var(--safe-left)}body{-webkit-user-select:none;user-select:none;margin:0;background:var(--bg);color:var(--text);font-size:15px;line-height:1.6}button,input,select,textarea{font:inherit}input,textarea,[contenteditable]:not([contenteditable="false"]){-webkit-user-select:text;user-select:text}button,a,input,select,textarea{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}a[href]:not(:where(.button,.brand,.mobile-brand,.book-cover,.reference-preview,.skip-link)){color:var(--link)}a[href]:not(:where(.button,.brand,.mobile-brand,.book-cover,.reference-preview,.skip-link)):hover{color:var(--link-hover)}summary{color:var(--link)}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.45}button,input,select,textarea{color:var(--text)}:focus{outline:none}h1,h2,h3,p{margin-top:0}h1,h2,h3{font-weight:550}h1{font-size:clamp(26px,3vw,34px);line-height:1.4;letter-spacing:.035em}h2{font-size:20px}h3{font-size:18px}small{font-size:12px}img{display:block;max-width:100%}[hidden]{display:none!important}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.skip-link{position:fixed;top:-70px;left:15px;padding:10px 15px;background:var(--accent);color:#151b24;z-index:100}.skip-link:focus{top:calc(12px + var(--safe-top));left:calc(15px + var(--safe-left))}
.sidebar{width:calc(240px + var(--safe-left));overflow-y:auto;scroll-padding:var(--safe-top) 0 var(--safe-bottom);position:fixed;inset:0 auto 0 0;background:var(--surface);border-right:1px solid var(--line);padding:calc(28px + var(--safe-top)) 22px calc(20px + var(--safe-bottom)) calc(22px + var(--safe-left));display:flex;flex-direction:column;z-index:20}.brand{display:flex;align-items:center;min-height:44px;gap:12px;font-size:19px;letter-spacing:.08em;font-weight:500}.brand-version{color:var(--muted);font-family:-apple-system,BlinkMacSystemFont,sans-serif;font-size:11px;font-weight:400;letter-spacing:.02em;white-space:nowrap}.main-nav{margin-top:32px;display:grid;gap:4px}.nav-group{display:grid;gap:4px}.nav-group+.nav-group{margin-top:12px;padding-top:16px;border-top:1px solid var(--line)}.nav-group-title{margin:0 12px 3px;color:var(--muted);font-size:11px;letter-spacing:.08em}.main-nav a{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-radius:5px;color:var(--link);font-size:14px;transition:background .2s,color .2s}.main-nav a[aria-current],.main-nav a:hover{background:var(--surface-raised);color:var(--link-hover)}.main-nav a span{color:currentColor;font-size:16px}.stage{display:flex;gap:7px;align-items:center;color:var(--accent);font-size:11px;letter-spacing:.025em;margin:0}.stage>span{width:5px;height:5px;border-radius:50%;background:var(--accent)}.main{margin-left:calc(240px + var(--safe-left));min-height:100svh;padding-top:var(--safe-top);padding-right:var(--safe-right)}.mobile-header{display:none}.page-wrap{max-width:1140px;margin:auto;padding:36px 40px 48px}.page-heading{display:flex;align-items:center;justify-content:space-between;gap:18px;margin-bottom:28px}.page-heading h1{margin-bottom:8px}.page-heading p{color:var(--muted);font-size:14px;margin-bottom:0}.heading-dot{color:var(--brand)}.page-heading>.button{flex-shrink:0}.button{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:32px;padding:5px 10px;border:1px solid transparent;border-radius:5px;font-weight:500;font-size:13px;white-space:nowrap}.primary{min-height:36px;color:#39202f}.secondary{border-color:#5a718f;background:var(--surface-raised);color:var(--text)}.secondary:hover{background:var(--line)}.subtle{background:transparent;border-color:var(--line);color:var(--muted)}.subtle:hover{border-color:var(--muted);color:var(--text)}.danger{background:#3e2b2b;border-color:#75504a;color:#f0c4ba}.wide{width:100%}.text-button{padding:4px 0;border:0;background:none;color:var(--link);font-size:12px}.text-button:not(:where(.management-trash,.danger)):hover{color:var(--link-hover)}.section-heading{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--line);padding-bottom:10px;margin-bottom:10px;gap:15px}.section-heading h2{font-size:14px;letter-spacing:.08em;margin:0}.section-heading>span{font-size:12px;color:var(--muted)}.story-list{display:grid}.story-card{display:flex;align-items:center;gap:28px;padding:30px 0;border-bottom:1px solid var(--line)}.book-cover{position:relative;flex:0 0 102px;height:139px;border:1px solid var(--line);background:var(--surface-raised);border-radius:2px 7px 7px 2px;box-shadow:inset 5px 0 0 var(--bg);padding:12px;color:var(--brand);overflow:hidden}.book-cover>span{font-size:9px;letter-spacing:.15em}.story-card:nth-child(3n+2) .book-cover{background:#29374a;border-color:#50647e}.story-card:nth-child(3n) .book-cover{background:#273344;border-color:#4c6079}.story-card-copy{min-width:0;flex:1}.story-card-copy h3{font-size:21px;letter-spacing:.04em;margin:0 0 9px}.story-card-copy p{color:var(--muted);font-size:13px;line-height:1.9;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin-bottom:18px}.quiet-note{font-size:12px;color:var(--muted);line-height:1.7;margin:16px 0}.empty-library{text-align:center;padding:40px 16px 32px}.empty-library h2{font-size:23px;font-family:"Songti TC","PMingLiU",serif;letter-spacing:.06em;margin:24px 0 14px}.empty-library p{font-size:14px;color:var(--muted);line-height:2}.empty-library .button{margin-top:14px}.empty-book{display:grid;place-items:center;width:68px;height:88px;border:1px solid var(--line);border-radius:2px 8px 8px 2px;color:var(--brand);font-family:serif;font-size:29px;margin:auto;box-shadow:inset 5px 0 0 var(--bg)}
/* primary-satin-20261030.2: shared surface for primary actions and both send buttons. */
.primary:not(.composer-send),.composer-send::before{background:linear-gradient(180deg,#f4c2d8 0%,#e3a6c0 38%,#c681a2 100%);border:1px solid #efbbd088;box-shadow:inset 0 1px 0 #fff0f6c2,inset 0 -1px 1px #88466470,0 2px 2px #060a124d,0 5px 10px #060a1259}
.primary:not(.composer-send){border-radius:7px;text-shadow:0 1px 0 #fff1f32b}
.primary:not(.composer-send):not(:disabled):not([aria-disabled="true"]):hover,.composer-send:not(:disabled):not([aria-disabled="true"]):hover::before{background:linear-gradient(180deg,#fad3e3 0%,#ecb6cd 38%,#d18dae 100%);border-color:#f7d7e699}
.primary:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
.primary:not(.composer-send):not(:disabled):not([aria-disabled="true"]):active{background:linear-gradient(180deg,#c68ba7,#dea6bf);transform:translateY(1px);filter:none;box-shadow:inset 0 2px 3px #84455f55,0 1px 2px #0003}
.composer-send:not(:disabled):not([aria-disabled="true"]):active::before{background:linear-gradient(180deg,#c68ba7,#dea6bf);box-shadow:inset 0 2px 3px #84455f55,0 1px 2px #0003}
.primary:disabled:not(.composer-send){box-shadow:inset 0 1px 0 #fff2}
input[type="checkbox"]{accent-color:var(--action)}
input,select,textarea{width:100%;border:1px solid var(--line);border-radius:5px;background:var(--bg);min-height:43px;padding:8px 10px;font-size:14px;transition:border-color .15s}textarea{resize:vertical;line-height:1.65;min-height:84px}input::placeholder,textarea::placeholder{color:var(--muted)}input:hover,select:hover,textarea:hover{border-color:var(--muted)}select{padding-right:28px}label{display:block;font-size:13px;color:var(--text)}label>input,label>select,label>textarea{margin-top:5px}.stack-form{display:grid;gap:14px}.form-row{display:flex;gap:12px}.form-row>label{flex:1;min-width:0}.form-row>.age-label{flex:0 0 110px}.field-help{color:var(--muted);font-size:13px;line-height:1.65;margin:0}.field-help{font-size:12px}.form-error{font-size:13px;color:#f0b0a4;background:#3b292a;border:1px solid #70504c;border-radius:4px;padding:11px 13px;line-height:1.8;margin:0}.form-dialog{inset:var(--safe-top) var(--safe-right) var(--safe-bottom) var(--safe-left);width:calc(100% - 32px - var(--safe-left) - var(--safe-right));max-width:580px;max-height:calc(100dvh - 48px - var(--safe-top) - var(--safe-bottom));margin:auto;padding:20px;border:1px solid var(--line);background:var(--surface);color:var(--text);border-radius:9px;box-shadow:0 24px 90px #0008;overscroll-behavior:contain}.form-dialog::backdrop{background:#0b121cbd;backdrop-filter:blur(4px)}.dialog-heading{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:16px}.dialog-heading h2{font-size:20px;margin:0}.close-button{position:relative;display:grid;place-items:center;width:32px;height:32px;padding:0;flex-shrink:0;background:none;border:1px solid var(--line);border-radius:50%;color:var(--muted);font-size:0;line-height:1}.close-button::before,.close-button::after{content:"";position:absolute;top:50%;left:50%;width:14px;height:1px;background:currentColor;transform:translate(-50%,-50%) rotate(45deg)}.close-button::after{transform:translate(-50%,-50%) rotate(-45deg)}.close-button:hover{background:var(--line)}.compact-dialog{max-width:440px}.button-row{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}.notice{position:fixed;bottom:max(24px,var(--safe-bottom));left:calc(50% + 120px + var(--safe-left)/2 - var(--safe-right)/2);transform:translateX(-50%);z-index:100;max-width:calc(100% - 40px - var(--safe-left) - var(--safe-right));padding:13px 22px;border:1px solid var(--accent);border-radius:6px;color:var(--text);background:var(--surface-raised);box-shadow:0 8px 35px #0006;font-size:13px}.notice.error{border-color:#b17c72;background:#422e2e}
/* 0.16.29: a sync notice is a native action using the existing reader scroll. */
.notice:has(.notice-action){padding:0}.notice-action{display:block;width:100%;min-height:44px;padding:13px 22px;border:0;border-radius:inherit;background:transparent;color:inherit;font:inherit;text-align:left}
.page-return-links{display:flex;flex-wrap:wrap;align-items:center;gap:8px 20px;margin-bottom:18px}.page-return-links .back-link{display:inline-flex;align-items:center;min-height:36px;margin:0}.back-link{display:inline-block;color:var(--link);font-size:12px;margin-bottom:16px}.back-link:hover{color:var(--link-hover)}

.reader-wrap{max-width:1120px;margin:auto;padding:26px 36px 44px}.reader-heading{display:flex;justify-content:space-between;align-items:center;gap:14px;margin-bottom:16px}.reader-heading h1{font-size:25px;margin:0;letter-spacing:.05em}.reader-heading .back-link{margin-bottom:9px}.reader-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.reader-actions .button{font-size:12px;padding:5px 9px}.reader-toolbar{display:flex;align-items:center;flex-wrap:wrap;gap:12px;border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:8px 0}.inline-label{display:flex;align-items:center;gap:10px;color:var(--muted);font-size:12px;min-width:0;max-width:100%;white-space:nowrap}.inline-label select{min-width:0;width:170px;max-width:100%;margin:0;background:none;border:0;min-height:34px;padding:5px 22px 5px 5px;font-size:13px}.type-controls{display:flex;gap:4px;margin-left:auto}.type-controls button{background:none;border:0;font-size:14px;color:var(--link);min-width:32px;min-height:32px}.type-controls button:hover{background:var(--surface-raised);color:var(--link-hover)}.reading-column{max-width:690px;margin:auto}.story-lead{color:var(--muted);font-family:"Songti TC","PMingLiU",serif;font-size:17px;line-height:1.75;letter-spacing:.03em;margin:24px 0 16px}.scene-note{border-left:2px solid var(--line);padding:3px 0 3px 12px;margin:16px 0;color:var(--muted);font-size:13px}.scene-note summary{cursor:pointer;color:var(--link);font-size:12px}.scene-note p{margin:8px 0 0;white-space:pre-wrap;line-height:1.7}.turn{padding:18px 0 16px}.turn-divider{display:flex;align-items:center;gap:10px;color:var(--brand);font-size:11px;letter-spacing:.15em;margin:0 0 14px}.turn-divider i{height:1px;flex:1;background:var(--line)}.turn-divider small{font-size:10px;color:var(--muted);letter-spacing:0}.player-action{width:fit-content;max-width:85%;margin:0 0 16px auto;padding:9px 12px;border:1px solid var(--line);border-radius:12px 4px 12px 12px;background:var(--surface);color:var(--text);text-align:left;overflow-wrap:anywhere}.player-action>span{font-size:10px;color:var(--muted);letter-spacing:.1em}.player-action>p{white-space:pre-wrap;overflow-wrap:anywhere;font-size:14px;line-height:1.7;margin:4px 0 0}.prose{font-family:"Songti TC","Noto Serif TC","PMingLiU",serif;font-size:var(--reader-size);line-height:1.85;letter-spacing:.025em;white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text)}.regenerate{margin-top:22px;color:var(--link);font-size:11px}.reader-empty{text-align:center;padding:38px 10px 28px}.reader-empty>div{color:var(--brand);letter-spacing:.45em;font-size:12px;margin-bottom:14px}.reader-empty h2{font-size:23px;line-height:1.7;font-family:"Songti TC","PMingLiU",serif;letter-spacing:.04em}.reader-empty p{color:var(--muted);font-size:13px}.composer{position:relative;background:color-mix(in srgb,var(--composer-fill,var(--surface)) calc(var(--visual-composer-opacity,.9)*100%),transparent);border:1px solid var(--line);border-radius:8px;padding:18px 20px;margin:18px 0}.composer>textarea{background:transparent;border:0;padding:17px 0;min-height:112px;font-size:15px;line-height:1.65;resize:vertical;outline-offset:0}.composer .form-error{margin-bottom:15px}.setup-callout{border:1px dashed var(--line);background:var(--surface);border-radius:6px;padding:18px;margin:16px 0}.setup-callout h2{font-size:17px;margin-bottom:10px}.setup-callout p{font-size:13px;color:var(--muted)}.setup-callout .button{font-size:12px}.draft-panel{background:#222d3d;border:1px solid #536a87;border-radius:6px;padding:18px;margin:18px 0}.draft-heading{display:flex;align-items:center;justify-content:space-between;gap:10px}.draft-heading h2{font-size:16px;color:var(--brand);margin-bottom:0}.draft-heading>span{font-size:10px;color:var(--muted)}.draft-help{font-size:12px;color:var(--muted);margin:10px 0 14px;line-height:1.7}
.characters-wrap>.back-link{margin-bottom:16px}.characters-wrap .page-heading h1{font-size:28px}.character-list{display:grid;gap:12px;margin-top:16px}.character-card{padding:18px 20px;border:1px solid var(--line);border-radius:7px;background:var(--surface)}.character-card-top{display:flex;align-items:center;gap:12px}.character-avatar{height:56px;width:50px;flex:0 0 50px;display:grid;place-items:center;background:var(--surface-raised);border:1px solid var(--line);border-radius:4px;overflow:hidden;color:var(--brand);font-family:serif;font-size:26px}.character-avatar img{width:100%;height:100%;object-fit:cover}.character-kind{font-size:11px;color:var(--accent)}.character-card-top h2{font-size:20px;margin:4px 0 0;letter-spacing:.04em}.character-card-top>.button{margin-left:auto;font-size:12px;padding:5px 9px}.character-persona{font-size:13px;line-height:1.7;color:var(--text);white-space:pre-wrap;overflow-wrap:anywhere;margin:14px 0 10px}.character-details{font-size:12px;color:var(--muted);margin-bottom:14px}.character-details summary{cursor:pointer}.character-details dl{padding-left:16px;border-left:1px solid var(--line);margin:12px 0 0}.character-details dt{color:var(--accent);font-size:11px;margin:10px 0 4px}.character-details dd{margin:0;white-space:pre-wrap;line-height:1.7;overflow-wrap:anywhere}.reference-heading{display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--line);padding-top:12px;margin-bottom:10px}.reference-heading h3{font-size:12px;margin:0}.reference-heading>span{font-size:11px;color:var(--muted)}.reference-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(115px,1fr));gap:10px}.reference-item{min-width:0;max-width:180px}.reference-preview{display:block;position:relative;height:145px;background:var(--bg);border-radius:5px;overflow:hidden}.reference-preview img{width:100%;height:100%;object-fit:cover}.primary-label{position:absolute;bottom:7px;left:7px;padding:1px 7px;border:1px solid #a7bfdc77;background:#1c2b40dd;color:var(--text);font-size:10px;border-radius:3px}.reference-label{font-size:11px;min-height:31px;padding:6px 7px;margin-top:7px}.reference-actions{display:flex;justify-content:space-between;gap:4px;flex-wrap:wrap;margin-top:4px}.reference-actions button{background:none;border:0;color:var(--link);font-size:10px;padding:6px 0}.reference-actions button:hover{color:var(--link-hover)}.image-upload{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:12px}.upload-label{display:inline-flex;align-items:center;position:relative;overflow:hidden;cursor:pointer;border:1px dashed var(--line);border-radius:4px;padding:5px 9px;min-height:32px;color:var(--link);font-size:12px}.upload-label>input{opacity:0;position:absolute;inset:0;width:100%;height:100%;margin:0;cursor:pointer}.image-upload .button{padding:5px 9px;font-size:12px}.upload-filename{color:var(--muted);font-size:11px}.image-upload .form-error{flex-basis:100%}.secret-fields{border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:12px 0;color:var(--muted);font-size:13px}.secret-fields summary{cursor:pointer}.scene-note>div,.secret-fields>div{display:flow-root}.secret-fields>div>label{margin-top:12px}.secret-fields .field-help{margin-top:8px}
@media(min-width:1101px){.character-list{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(min-width:1500px){.page-wrap{padding-top:44px}.reader-wrap{padding-top:32px}.reading-column{max-width:720px}}
@media(max-width:1100px){.sidebar{width:calc(210px + var(--safe-left));padding:calc(35px + var(--safe-top)) 20px calc(24px + var(--safe-bottom)) calc(20px + var(--safe-left))}.main{margin-left:calc(210px + var(--safe-left))}.page-wrap{padding:30px 26px 40px}.reader-wrap{padding:24px 26px 40px}.notice{left:calc(50% + 105px + var(--safe-left)/2 - var(--safe-right)/2)}.characters-wrap .page-heading h1{font-size:27px}}
@media(max-width:760px){.sidebar{display:none}.main{margin-left:0;min-height:calc(100svh - 60px - var(--safe-top));padding-top:0;padding-left:var(--safe-left)}.mobile-header{display:flex;justify-content:space-between;align-items:center;height:calc(60px + var(--safe-top));padding:var(--safe-top) calc(22px + var(--safe-right)) 0 calc(22px + var(--safe-left));background:var(--surface);border-bottom:1px solid var(--line)}.mobile-brand{font-family:serif;font-size:24px;color:var(--brand);display:flex;gap:10px;align-items:center}.mobile-header .stage{font-size:10px}.page-wrap{padding:22px 18px calc(28px + var(--safe-bottom))}.page-heading{align-items:flex-start;margin-bottom:22px;gap:12px;flex-wrap:wrap}.page-heading h1{font-size:26px;margin-bottom:6px}.page-heading p{font-size:12px;line-height:1.9}.page-heading>.button{padding:5px 10px;font-size:12px}.story-card{gap:18px;padding:24px 0}.book-cover{flex-basis:76px;height:108px;padding:10px}.story-card-copy h3{font-size:18px;line-height:1.6;margin-bottom:5px}.story-card-copy p{font-size:12px;margin-bottom:10px;line-height:1.8}.section-heading{padding-bottom:13px}.section-heading h2{font-size:13px}.section-heading>span{font-size:10px}.quiet-note{font-size:11px}.empty-library{padding:45px 5px}.empty-library h2{font-size:21px}.empty-library p{font-size:12px}.notice{left:calc(50% + var(--safe-left)/2 - var(--safe-right)/2);font-size:12px;bottom:max(18px,var(--safe-bottom));width:max-content}.form-dialog{padding:18px 16px;max-height:calc(100dvh - 28px - var(--safe-top) - var(--safe-bottom));width:calc(100% - 24px - var(--safe-left) - var(--safe-right))}.dialog-heading h2{font-size:20px}.stack-form{gap:14px}input,select,textarea{font-size:16px}label{font-size:12px}.form-row{gap:12px}.form-row>.age-label{flex-basis:95px}.reader-wrap{padding:18px 18px calc(26px + var(--safe-bottom))}.reader-heading{align-items:flex-start;gap:12px;flex-wrap:wrap;margin-bottom:14px}.reader-heading h1{font-size:23px}.reader-actions{gap:5px}.reader-actions .button{font-size:11px;padding:5px 8px}.reader-toolbar{gap:10px;flex-wrap:wrap}.inline-label{gap:3px;font-size:11px}.inline-label select{width:130px;font-size:16px;max-width:130px}.reader-toolbar>.text-button{font-size:11px}.type-controls{gap:0}.story-lead{font-size:16px;line-height:1.75;margin-top:20px}.reader-empty{padding:30px 0 24px}.reader-empty h2{font-size:20px}.reader-empty p{font-size:12px}.prose{line-height:1.85;letter-spacing:.025em}.turn{padding:16px 0}.turn-divider{margin-bottom:12px}.player-action>p{font-size:14px}.composer{padding:12px;margin:16px 0}.composer>textarea{font-size:16px;min-height:125px}.draft-panel{padding:16px 14px}.draft-heading h2{font-size:14px}.draft-heading>span{font-size:9px}.characters-wrap .page-heading h1{font-size:26px}.character-card{padding:14px}.character-card-top{gap:10px}.character-avatar{height:52px;width:46px;flex-basis:46px}.character-card-top h2{font-size:20px}.character-kind{font-size:10px}.character-list{gap:12px;margin-top:14px}.reference-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}.reference-preview{height:125px}.reference-label{font-size:16px;min-height:37px}.reference-actions{gap:6px;justify-content:flex-start}.reference-actions button{font-size:10px;min-height:32px}.upload-filename{font-size:10px}.character-persona{font-size:13px}.image-upload{gap:9px}.setup-callout{padding:16px 14px}}
@media(max-width:370px){.page-wrap{padding-left:17px;padding-right:17px}.reader-wrap{padding-left:16px;padding-right:16px}.reader-toolbar{gap:7px}.inline-label select{width:110px}.reference-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.character-card{padding:12px}}

.mobile-header-actions{display:flex;gap:14px;align-items:center}.mobile-header-actions .text-button{font-size:10px}.status-relations{border-top:1px solid var(--line);padding-top:14px}.status-section-heading{display:flex;align-items:center;justify-content:space-between;gap:12px}.status-section-heading h2{font-size:12px;font-weight:500;color:var(--text);margin:0}.status-section-heading .text-button{font-size:10px}.status-relation{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:14px 0;border-bottom:1px solid var(--line)}.status-relation:last-child{border-bottom:0;padding-bottom:0}.status-relation>div:first-child{min-width:0}.status-relation h3{font-size:13px;line-height:1.8;margin:0;overflow-wrap:anywhere}.status-relation h3>span{font-size:10px;color:var(--muted);margin:0 8px}.status-relation p{font-size:11px;color:var(--muted);line-height:1.8;margin:4px 0 0;overflow-wrap:anywhere}.status-affinity{flex:0 0 106px;color:var(--muted);font-size:10px;text-align:right}.status-affinity strong{font-size:16px;color:var(--text);font-weight:500;margin-left:4px}.status-affinity small{font-size:10px}.status-affinity .is-unknown{font-size:12px;color:var(--muted)}.status-affinity meter{display:block;width:100%;height:5px;margin-top:8px;border:0;background:var(--surface-raised);border-radius:4px;overflow:hidden}.status-affinity meter::-webkit-meter-bar{background:var(--surface-raised);border:0;border-radius:4px}.status-affinity meter::-webkit-meter-optimum-value{background:var(--accent)}.status-affinity meter::-moz-meter-bar{background:var(--accent)}.status-empty{font-size:11px;color:var(--muted);line-height:1.9;margin:14px 0 0}.relationship-item .relationship-affinity{font-size:11px;color:var(--text);margin-top:8px}@media(max-width:760px){.status-relation{gap:12px}.status-affinity{flex-basis:90px}.status-relation h3{font-size:12px}.status-affinity strong{font-size:15px}}
/* Dialogue paragraphs preserve canonical text; reactions stay outside speech. */
.prose-line{display:block;min-height:1lh}.prose-line-break{display:none}.dialogue-unit{display:flex;flex-direction:column;width:fit-content;max-width:100%;margin:4px 0}.dialogue-bubble{display:block;max-width:100%;padding:9px 12px;border:1px solid var(--line);border-radius:4px 12px 12px 12px;background:var(--surface);color:var(--text);line-height:1.75}.dialogue-speaker{display:inline;color:#d6e6fb;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;font-size:max(14px,.72em);font-weight:600;letter-spacing:.02em;line-height:inherit;margin:0 .2em 0 0}.dialogue-speaker[data-speaker-label]::before{content:attr(data-speaker-label)}@media(max-width:760px){.dialogue-bubble{padding:8px 10px}}
.composer-actors{min-width:0;border:0;border-bottom:1px solid var(--line);margin:0;padding:0 0 15px}.composer-actors>legend{padding:0;color:var(--text);font-size:12px}.composer-actors>legend>span{color:var(--muted);font-size:10px;margin-left:8px}.actor-choices{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:12px 0 6px}.actor-choices>label{display:flex;align-items:center;gap:9px;padding:9px 10px;border:1px solid var(--line);border-radius:4px;background:var(--surface);min-width:0;cursor:pointer}.actor-choices input{width:17px;height:17px;min-height:17px;flex:0 0 17px;margin:0;padding:0}.actor-choices span{min-width:0;overflow-wrap:anywhere;font-size:12px}.actor-choices>label:has(input:checked){border-color:var(--action);background:#3b2c37}.actor-choices>label:has(input:disabled){opacity:.6;cursor:default}.composer-player{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:14px 0 9px}.composer-player>label{display:flex;align-items:center;gap:9px;min-width:0;flex:1;font-size:11px;color:var(--muted);white-space:nowrap}.composer-player select{flex:1;width:180px;max-width:100%;min-width:0;min-height:35px;margin:0;padding:6px 25px 6px 9px;font-size:12px}.composer-player>span{font-size:10px;color:var(--accent);white-space:nowrap}.group-chat-help{font-size:11px;color:var(--muted);line-height:1.8;margin:10px 0 0}.turn-divider>span{flex-shrink:0}.turn-divider>small{max-width:65%;text-align:right;overflow-wrap:anywhere}
@media(max-width:760px){.composer-player select{font-size:16px;width:100%}.actor-choices{gap:7px}.actor-choices>label{padding:9px 8px}.group-chat-help{font-size:10px}.turn-divider>small{max-width:60%}}
.input-shortcuts{display:flex;gap:6px;margin-top:15px}.input-shortcuts button{padding:4px 8px;min-height:32px;border:1px solid var(--line);border-radius:4px;background:var(--surface-raised);color:var(--accent);font-size:12px}.input-shortcuts button:hover:not(:disabled){background:var(--line)}.story-setting-summary{margin:16px 0}.story-setting-summary .scene-note{margin:10px 0}.story-setting-summary dl{font-size:12px;line-height:1.7;margin:10px 0}.story-setting-summary dt{color:var(--brand);margin-top:10px}.story-setting-summary dd{margin:4px 0 0;white-space:pre-wrap;overflow-wrap:anywhere}.story-setting-summary .text-button{margin-top:10px}.reader-actions{flex-wrap:wrap}
.mobile-library-link{color:var(--link);font-size:12px;white-space:nowrap}.cast-picker,.cast-picker-groups fieldset{min-width:0;border:1px solid var(--line);border-radius:5px;padding:14px;margin:0}.cast-picker>legend{font-size:14px;color:var(--text);padding:0 5px}.cast-picker-groups{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:14px 0}.cast-picker-groups fieldset{padding:10px}.cast-picker-groups legend{font-size:12px;color:var(--accent);padding:0 4px}.cast-choice{display:flex;align-items:center;gap:10px;padding:9px 3px;cursor:pointer}.cast-choice>input{width:18px;height:18px;min-height:18px;flex:0 0 18px;padding:0;margin:0}.cast-choice>span{min-width:0;overflow-wrap:anywhere}.cast-choice small{display:block;color:var(--muted);font-size:10px}.character-start-story{margin:0 0 16px}.profile-origin{color:var(--muted);font-size:11px;line-height:1.9;margin:0 0 18px}.profile-origin a{color:var(--link)}.relationships-section{margin:30px 0 22px;scroll-margin-top:25px}.relationships-section .section-heading{align-items:flex-start}.relationships-section .section-heading h2{font-size:19px;letter-spacing:.03em}.relationships-section .section-heading p{color:var(--muted);font-size:12px;line-height:1.9;margin:8px 0 0}.relationships-section .section-heading>.button{flex-shrink:0}.relationship-list{display:grid;gap:10px;margin:16px 0}.relationship-item{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:14px;border:1px solid var(--line);border-radius:5px;background:var(--surface)}.relationship-item>div{min-width:0}.relationship-item h3{font-size:15px;line-height:1.8;margin:0 0 8px;overflow-wrap:anywhere}.relationship-item h3 span{color:var(--muted);font-size:12px;margin:0 6px}.relationship-item p{font-size:13px;color:var(--muted);line-height:1.7;white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.relationship-item .relationship-state{color:var(--brand);margin-bottom:7px}.relationship-item>.button{flex-shrink:0;padding:5px 9px;font-size:11px}.relationship-form{padding:18px;border:1px solid var(--line);border-radius:7px;background:var(--surface);scroll-margin-top:25px}.relationship-form h3{font-size:17px;margin:0}.relationship-form .form-row>label{min-width:0}.relationship-form>.button{justify-self:start}

.story-entry-links{display:flex;flex-wrap:wrap;gap:9px 18px;margin-top:13px}.story-entry-links :is(a,[data-story-gallery]){display:inline-flex;align-items:center;justify-content:center;font-size:12px;line-height:1.6;color:var(--link);padding:5px 0}.story-entry-links :is(a,[data-story-gallery]):hover{color:var(--link-hover)}.character-group-links{display:flex;gap:12px;margin:-8px 0 20px}.character-group-links a{color:var(--link);font-size:13px;padding:6px 2px}.persona-group{margin-bottom:28px;scroll-margin-top:25px}.persona-group .section-heading{align-items:flex-start}.persona-group .section-heading h2{font-size:19px;letter-spacing:.03em}.persona-group .section-heading p{max-width:580px;color:var(--muted);font-size:12px;line-height:1.9;margin:8px 0 0}.persona-group .section-heading>.button{flex-shrink:0}.persona-empty{border:1px dashed var(--line);border-radius:5px;padding:16px;color:var(--muted);font-size:13px;line-height:1.7;margin:0}.generation-cost{color:#eef5ff;font-size:13px;font-weight:500;line-height:1.8;margin:18px 0 5px;overflow-wrap:anywhere}.turn .regenerate{display:block;margin-top:10px}
@media(max-width:760px){.character-group-links{margin:-6px 0 16px}.persona-group .section-heading{flex-wrap:wrap;gap:14px}.persona-group .section-heading h2{font-size:18px}.persona-group .section-heading p{font-size:12px}.persona-group .section-heading .button{font-size:12px;padding:5px 9px}.character-card-top>.button{font-size:11px;padding:5px 8px}.character-kind{line-height:1.8}.character-card-top h2{font-size:19px}.story-entry-links{gap:5px 13px;margin-top:9px}.story-entry-links :is(a,[data-story-gallery]){font-size:11px;min-height:32px}}
@media(max-width:760px){.relationships-section .section-heading{flex-wrap:wrap}.relationships-section .section-heading h2{font-size:18px}.relationship-item{padding:12px;gap:10px;flex-wrap:wrap}.relationship-form{padding:14px}.relationship-form .form-row{flex-direction:column}.cast-picker{padding:12px}.cast-picker-groups{gap:8px}.cast-picker-groups fieldset{padding:8px}.cast-choice{gap:7px}.mobile-header-actions{gap:12px}}

/* 0.9.58: compact memory browsing; generation and editor remain outside tabs. */
.memory-dialog{max-width:680px}.memory-dialog .dialog-heading{align-items:flex-start;margin-bottom:14px}.memory-dialog .dialog-heading h2{font-size:18px}.memory-dialog .dialog-heading .field-help{margin:3px 0 0;font-size:12px;line-height:1.6}.memory-actions,.memory-item-actions{display:flex;flex-wrap:wrap;gap:12px;align-items:center}.memory-actions{justify-content:space-between}.memory-actions .button{min-height:32px;font-size:12px;padding:5px 12px}.memory-actions .text-button{font-size:12px}.memory-help-row{display:flex;flex-wrap:wrap;justify-content:space-between;gap:3px 12px;margin:7px 0 14px}.memory-organize-help{margin:0;font-size:11px;line-height:1.6}.memory-guide{font-size:11px;line-height:1.6;color:var(--muted)}.memory-guide summary{cursor:pointer;color:var(--link)}.memory-guide[open]{flex-basis:100%}.memory-guide p{margin:6px 0 0}.memory-progress{display:flex;flex-direction:column;gap:10px;border:1px solid var(--line);background:var(--surface);border-radius:5px;padding:10px 12px;margin:12px 0;font-size:12px;line-height:1.6}.memory-progress.error{border-color:#8d635e}.memory-progress p{margin:0}.memory-progress .generation-cost{margin:0;color:var(--muted);font-size:12px;font-weight:400}.memory-progress>p:empty,.memory-progress>.button-row:not(:has(>:not([hidden]))){display:none}.memory-progress .button-row{align-items:center;gap:8px 12px;margin:0}.memory-progress .button-row>button,.form-error .button-row>button{max-width:100%;min-height:44px;white-space:normal;overflow-wrap:anywhere;line-height:1.5}.memory-progress .button-row>.text-button,.form-error .button-row>.text-button{padding:8px 4px}.memory-edit-panel{border:1px solid var(--line);border-radius:5px;padding:12px;margin:12px 0;scroll-margin-top:12px}.memory-edit-panel .status-section-heading{margin-bottom:10px}.memory-edit-panel h3{font-size:14px;margin:0}.memory-dialog .check-label{display:flex;gap:8px;align-items:center}.memory-dialog .check-label input{width:17px;height:17px;min-height:17px;margin:0;padding:0}.memory-visibility{border:0;padding:0;margin:0;min-width:0}.memory-visibility legend{font-size:12px;color:var(--muted)}
.memory-tabs{display:flex;gap:3px;padding:3px;background:var(--surface);border:1px solid var(--line);border-radius:6px}.memory-tabs [role=tab]{flex:1;min-width:0;border:1px solid transparent;border-radius:4px;padding:6px 3px;background:transparent;color:var(--link);font-size:12px;white-space:nowrap;cursor:pointer}.memory-tabs [role=tab] span{font-size:10px;opacity:.8;margin-left:3px}.memory-tabs [aria-selected=true]{background:var(--surface-raised);color:var(--text);border-color:var(--line)}.memory-tabs [role=tab]:focus-visible{border-color:var(--link)}.memory-section{margin-top:12px}.memory-list-heading{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:2px}.memory-list-heading h3{font-size:12px;font-weight:500;margin:0}.memory-list-heading>span,.memory-panel-help{font-size:11px;color:var(--muted);line-height:1.6}.memory-panel-help{margin:0 0 5px}.memory-list-footer{display:flex;justify-content:space-between;align-items:center;gap:12px;padding-top:10px;font-size:11px;color:var(--muted)}.memory-list-footer .text-button{font-size:12px}.memory-item{padding:10px 0;border-bottom:1px solid var(--line)}.memory-item:last-child{border-bottom:0}.memory-item-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;color:var(--text);font-size:11px}.memory-item-heading small{font-size:10px;color:var(--muted)}.memory-item>p{font-size:13px;line-height:1.6;white-space:pre-wrap;overflow-wrap:anywhere;margin:7px 0}.memory-item .memory-visibility-text,.memory-source{font-size:11px;line-height:1.65;color:var(--muted)}.memory-source .text-button{font-size:11px;margin-right:10px}.memory-source>summary{cursor:pointer;color:var(--link)}.memory-item-actions{margin-top:7px;gap:12px}.memory-item-actions .button{font-size:11px;padding:4px 9px}.memory-item-actions .text-button{font-size:11px}.continuity-archive>summary{position:relative;padding-right:18px;list-style:none;cursor:pointer}.continuity-archive>summary::-webkit-details-marker{display:none}.continuity-archive>summary::after{content:'';position:absolute;right:2px;top:7px;width:5px;height:5px;border-right:1px solid var(--muted);border-bottom:1px solid var(--muted);transform:rotate(45deg);transition:transform .15s}.continuity-archive[open]>summary::after{transform:rotate(225deg)}.archive-preview{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;overflow-wrap:anywhere;color:var(--link);font-size:13px;line-height:1.55}.archive-meta{display:flex;align-items:center;gap:9px;margin-top:3px;color:var(--muted);font-size:10px;line-height:1.5}.archive-meta>time,.archive-meta>span:not(.archive-cast){flex-shrink:0}.archive-cast{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.proposal-change{border-left:2px solid var(--line);padding-left:10px;margin:10px 0;font-size:12px;line-height:1.65;color:var(--muted)}.proposal-change p{margin:5px 0;white-space:pre-wrap;overflow-wrap:anywhere}.memory-history{border-top:1px solid var(--line);padding-top:12px;margin-top:14px;font-size:11px;color:var(--muted)}.memory-history summary{cursor:pointer}.memory-history article{border-bottom:1px solid var(--line);padding:9px 0;line-height:1.65;overflow-wrap:anywhere}.memory-history article p{white-space:pre-wrap;margin:5px 0}.memory-reader-entry{display:flex;align-items:center;justify-content:space-between;gap:14px;margin:22px 0 8px;font-size:11px;color:var(--muted)}.memory-reader-entry .text-button{font-size:12px}@media(max-width:760px){.memory-edit-panel .form-row{flex-direction:column}.memory-edit-panel .status-section-heading{align-items:flex-start}.memory-reader-entry{flex-wrap:wrap;gap:6px}.memory-reader-entry>span{font-size:10px}}

.command-shortcuts{display:flex;align-items:center;gap:8px;flex:1;min-width:0}/* 0.15.3: soften the shortcut edge while keeping the final item fully visible. */
.command-shortcut-pills{display:flex;flex-wrap:nowrap;gap:3px;flex:1;min-width:0;overflow-x:auto;overscroll-behavior-x:contain;padding:2px 0;padding-inline-end:20px;scroll-padding-inline-end:20px;scrollbar-width:thin;-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 18px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 18px),transparent)}.command-shortcut-pill{flex:0 0 auto;min-width:32px;min-height:32px;white-space:nowrap;padding:4px 7px;border:1px solid var(--line);border-radius:18px;background:var(--surface);color:var(--accent);font-size:12px;text-align:left;overflow-wrap:anywhere}.command-shortcut-pill:hover:not(:disabled){background:var(--line)}.command-shortcut-manage{flex:0 0 auto;min-height:32px;padding:4px 7px;border:1px solid var(--line);border-radius:18px;background:var(--line);color:var(--accent);font-size:12px}.command-shortcut-toolbar{display:flex;justify-content:space-between;gap:12px;margin-bottom:12px}.command-shortcut-list{margin-bottom:22px}.command-shortcut-item{display:flex;align-items:center;gap:16px;border-bottom:1px solid var(--line);padding:12px 0}.command-shortcut-edit{flex:1;min-width:0;border:0;background:none;text-align:left;padding:0;overflow-wrap:anywhere}.command-shortcut-edit>span{display:block;color:var(--accent);font-size:13px}.command-shortcut-edit>small{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;color:var(--muted);font-size:11px;white-space:pre-wrap;margin-top:5px}.command-shortcut-item>.text-button{flex-shrink:0}#shortcut-editor-title{font-size:16px;margin:0}

.composer{border-radius:16px;padding:12px 14px}.composer>textarea{min-height:86px;padding:7px 0;font-size:15px}.composer-toolbar{display:flex;align-items:center;gap:10px}.composer-send{position:relative;flex:0 0 44px;width:44px;height:44px;min-height:44px;padding:0;border:0;border-radius:50%;gap:0}.composer-send,.composer-send:hover{background:transparent}.composer-send::before{content:"";position:absolute;inset:4px;border-radius:50%;transition:background .15s,border-color .18s,box-shadow .18s}.composer-send svg{display:block;pointer-events:none}.composer-send .send-icon{position:relative}
.context-preview-ring{position:absolute;inset:0;overflow:visible;fill:none;stroke:currentColor;stroke-width:2;color:var(--accent);pointer-events:none;stroke-linecap:round}
.context-preview-track{stroke:var(--line)}
#context-preview-progress{stroke-dasharray:100;stroke-dashoffset:100;transform:rotate(-90deg);transform-origin:center;transition:stroke-dashoffset .2s ease,color .2s ease}
.context-preview-ring[data-state="attention"]{color:var(--action)}
.context-preview-ring[data-state="processing"] #context-preview-progress{animation:memory-progress-turn 2.4s linear infinite}
/* 0.17.77: clip sweep endpoints while preserving the radial glow. */
.context-preview-completed-mask{mask-type:alpha}
.context-preview-completed-mask use{stroke-width:7;stroke-linecap:butt}
.context-preview-sweep{display:none;transform-origin:22px 22px}
.context-preview-ring:is([data-state="accumulating"],[data-state="attention"],[data-state="processing"]) .context-preview-sweep{display:block;animation:memory-ring-turn 2.8s linear infinite,memory-ring-breathe 4s ease-in-out infinite}
.context-preview-sweep-band{stroke:url(#context-preview-sweep-gradient);stroke-width:2.3;filter:drop-shadow(0 0 1.7px #edf6ff)}
@keyframes memory-ring-turn{to{transform:rotate(360deg)}}
@keyframes memory-progress-turn{from{transform:rotate(-90deg)}to{transform:rotate(270deg)}}
@keyframes memory-ring-breathe{0%,100%{opacity:.88}50%{opacity:1}}
.context-preview-ring:is([data-state="loading"],[data-state="unknown"],[data-state="not_needed"]) .context-preview-track{opacity:.65}
.context-preview-ring:is([data-state="loading"],[data-state="unknown"],[data-state="not_needed"]) #context-preview-progress{opacity:0}
.composer-save-state{display:block;color:var(--muted);font-size:10px;line-height:1.6}.composer-save-state:empty{display:none}.composer>.form-error:not([hidden]){margin:10px 0 0}.composer-options{margin-top:9px;color:var(--muted);font-size:11px}.jump-latest{position:fixed;right:calc(24px + var(--safe-right));bottom:max(22px,var(--safe-bottom));z-index:30;box-shadow:0 4px 20px #0005;min-height:32px}@media(max-width:760px){.composer{padding:11px 12px}.composer>textarea{font-size:16px;min-height:84px}.composer-toolbar{gap:8px}.jump-latest{right:calc(18px + var(--safe-right))}}

.composer-symbol{flex:0 0 32px;width:32px;height:32px;padding:0;border:0;border-radius:10px;background:transparent;color:var(--accent);font-size:13px}.composer-symbol:hover:not(:disabled){background:var(--line)}

.turn-status-card{margin:12px 0 0;padding:8px 0 0;border-top:1px solid var(--line);font-size:12px;line-height:1.7;overflow-wrap:anywhere}.turn-status-card h3{margin:3px 0 1px;color:#c1cede;font-size:12px;font-weight:600}.turn-status-place{display:grid;grid-template-columns:1fr 1fr;gap:4px 16px;margin:0 0 4px}.turn-status-place>div{display:flex;gap:10px;min-width:0}.turn-status-place dt{flex-shrink:0;color:#c1cede}.turn-status-place dd{margin:0;color:#eef5ff;font-weight:500}.turn-status-relation{padding:1px 0}.turn-status-row{display:flex;align-items:baseline;justify-content:space-between;gap:12px;list-style:none}.turn-status-identity{display:flex;align-items:baseline;gap:6px;min-width:0}.turn-status-actor{flex:0 0 auto;max-width:5em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#b7d4f5;font-weight:600}.turn-status-state{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#c9b9dd}.turn-status-affinity{flex:0 0 auto;white-space:nowrap;text-align:right}.turn-status-affinity-label{color:var(--muted);font-weight:400}.turn-status-affinity strong{color:var(--action);font-weight:600;font-variant-numeric:tabular-nums}.turn-status-card .is-unknown{color:var(--muted);font-weight:400}.turn-status-empty{margin:5px 0;color:var(--muted)}.turn-status-delta{color:#cfabc5;font-size:11px}

.phone-dialog{--phone-safe-top:var(--safe-top);--phone-safe-bottom:var(--safe-bottom);width:calc(100% - 24px - var(--safe-left) - var(--safe-right));max-width:540px;height:min(740px,calc(var(--phone-height,100dvh) - var(--phone-safe-top) - var(--phone-safe-bottom) - 24px));max-height:calc(var(--phone-height,100dvh) - var(--phone-safe-top) - var(--phone-safe-bottom) - 24px);inset:calc(var(--phone-top,0px) + var(--phone-safe-top)) var(--safe-right) auto var(--safe-left);margin:12px auto;padding:0;overflow:hidden;border-radius:18px}.phone-dialog[open]{display:flex;flex-direction:column}.phone-heading{display:flex;align-items:center;gap:10px;padding:14px 18px;border-bottom:1px solid #a7bfdc26;background:linear-gradient(120deg,#edf6ff08,transparent 65%)}.phone-heading-copy{flex:1;min-width:0}.phone-heading h2{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:18px;line-height:1.4}.phone-heading-copy>small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:2px;color:var(--muted);font-size:10px;line-height:1.5}.phone-heading #phone-back{width:32px;min-width:32px;height:32px;padding:0;font-size:20px}.phone-heading-avatar{display:flex;flex:0 0 34px;width:34px;height:34px}.phone-heading-avatar>.phone-avatar{flex-basis:34px;width:34px;height:34px;font-size:15px}.phone-contacts{display:flex;flex-direction:column;flex:1;min-height:0}.phone-identity{display:flex;align-items:center;gap:18px;padding:12px 18px;border-bottom:1px solid #a7bfdc1a;background:linear-gradient(110deg,#edf6ff06,transparent 70%)}.phone-self-avatar{display:flex;flex:0 0 42px;width:42px;height:42px}.phone-self-info{flex:1;min-width:0}.phone-self-info>label{margin:0;color:var(--muted);font-size:11px;line-height:1.4}.phone-identity select{display:block;width:100%;min-width:0;min-height:28px;margin:0;padding:2px 24px 2px 0;border:0;border-radius:0;background:transparent;color:#d6e6fb;font-size:16px;font-weight:600;line-height:1.5}.phone-contact-section{display:flex;align-items:baseline;justify-content:space-between;flex-shrink:0;gap:10px;padding:10px 18px 6px;color:var(--muted);font-size:11px}.phone-contact-section h3{margin:0;font-size:12px;font-weight:600;color:#c1cede}.phone-friends{overflow-y:auto;min-height:0;flex:1;padding:0 8px}.phone-friend{display:flex;align-items:center;gap:12px;width:100%;min-height:72px;padding:11px 10px;border:0;border-bottom:1px solid #a7bfdc1a;border-radius:0;background:transparent;text-align:left;color:var(--text)}.phone-friend:last-child{border-bottom:0}.phone-friend:hover:not(:disabled){background:#a7bfdc0d}.phone-avatar{display:grid;place-items:center;flex:0 0 42px;width:42px;height:42px;border-radius:50%;overflow:hidden;background:var(--surface-raised);color:var(--accent);font-size:17px}.phone-avatar img{width:100%;height:100%;object-fit:cover}.phone-friend>.phone-avatar{flex-basis:48px;width:48px;height:48px;font-size:18px}.phone-friend-content{flex:1;min-width:0}.phone-friend-top,.phone-friend-bottom{display:flex;align-items:center;gap:10px;min-width:0}.phone-friend-top{align-items:baseline}.phone-friend-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:600;line-height:1.5}.phone-friend-time{flex:0 0 auto;color:var(--muted);font-size:10px;line-height:1.5}.phone-friend-bottom{margin-top:3px}.phone-friend-preview{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:12px;line-height:1.5}.phone-chat{display:flex;flex-direction:column;flex:1;min-height:0}.phone-chat-scroll{overflow-y:auto;overscroll-behavior:contain;flex:1;min-height:0;padding:10px 12px;scroll-behavior:auto}.phone-message-pair{margin:8px 0 14px}.phone-message{width:fit-content;max-width:88%;padding:8px 11px;border:1px solid var(--line);border-radius:14px 14px 14px 4px;background:var(--surface);white-space:pre-wrap;overflow-wrap:anywhere;font-size:14px;line-height:1.6;margin:8px 0}.phone-message.mine{margin-left:auto;background:var(--line);border-color:var(--line);border-radius:14px 14px 4px 14px}.phone-message-name{color:#d6e6fb;font-size:13px;font-weight:600;line-height:1.6}.phone-message-state{color:var(--muted);font-size:10px;line-height:1.6;text-align:right}.phone-message-pair.pending{opacity:.8}.phone-form{padding:8px 12px;border-top:1px solid var(--line)}.phone-compose-row{display:flex;align-items:center;gap:8px}.phone-compose-row textarea{min-width:0;flex:1;min-height:56px;max-height:150px;padding:7px 12px;border-radius:12px;font-size:16px;line-height:1.5;resize:vertical}.phone-form .form-error{margin:8px 0 0;font-size:12px}.phone-progress{margin:0;padding:8px 18px;color:var(--muted);font-size:11px}.phone-progress:empty{display:none}.phone-notification{position:fixed;inset:calc(12px + var(--safe-top)) calc(12px + var(--safe-right)) auto calc(12px + var(--safe-left));margin:0 auto;width:min(420px,calc(100% - 24px - var(--safe-left) - var(--safe-right)));padding:10px;border:1px solid var(--line);border-radius:16px;background:#253449ed;color:var(--text);box-shadow:0 8px 32px #0007;backdrop-filter:blur(15px);align-items:center;gap:10px;z-index:1000}.phone-notification:popover-open,.phone-notification.fallback{display:flex}.phone-notification-open{display:flex;align-items:center;gap:12px;min-width:0;flex:1;text-align:left;padding:4px;border:0;background:none;color:inherit}.phone-notification-open>img{filter:brightness(0) invert(1);opacity:.8;flex-shrink:0}.phone-notification-open>span{min-width:0;flex:1}.phone-notification strong{display:block;font-size:12px;margin-bottom:3px}.phone-notification #phone-notification-text{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:13px;overflow-wrap:anywhere}.phone-notification .close-button{width:32px;height:32px;flex:0 0 32px}

.phone-notification.restored:popover-open{animation:none}

.phone-message-line{display:flex;align-items:flex-start;gap:8px;margin:8px 0;min-width:0}.phone-message-line.mine{flex-direction:row-reverse}.phone-message-line>.phone-avatar{flex:0 0 32px;width:32px;height:32px;font-size:13px}.phone-message-line>.phone-message{min-width:0;max-width:calc(100% - 40px);margin:0}.phone-message-stack{display:flex;flex-direction:column;align-items:flex-start;gap:6px;min-width:0;max-width:calc(100% - 40px)}.phone-message-stack>.phone-message{max-width:100%;margin:0}.phone-message-pair>.phone-message-name{padding-left:40px}.phone-message-pair>.phone-message-state{padding-right:40px}

.turn-status-pending{font-size:10px;margin-top:4px}.composer-toolbar{gap:6px}.command-shortcuts{gap:0}.phone-heading,.phone-identity,.phone-form{flex-shrink:0}

.reader-actions{max-width:100%;min-width:0}

/* 0.7.1: compact phone entry and persistent incoming-reply indicator. */
.composer-phone,.composer-cast,.composer-settings,.composer-image{position:absolute;top:4px;right:4px;display:grid;place-items:center;width:32px;height:32px;padding:0;border:0;border-radius:10px;background:transparent;color:var(--accent)}.composer-phone:hover:not(:disabled),.composer-cast:hover:not(:disabled),.composer-settings:hover:not(:disabled),.composer-settings[aria-expanded="true"],.chat-image-pick:hover:not(:disabled){background:var(--line)}.composer-phone svg,.composer-cast svg{display:block;width:20px;height:20px}.composer-settings{right:76px}.composer-settings-icon{display:block;width:16px;height:16px;background:currentColor;-webkit-mask:url('icons/settings.svg') center/contain no-repeat;mask:url('icons/settings.svg') center/contain no-repeat}.phone-unread{position:absolute;top:7px;right:7px;width:8px;height:8px;background:#e96568;border-radius:50%;box-shadow:0 0 0 2px var(--bg)}.phone-friend-unread{margin-left:auto;flex:0 0 auto;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:var(--action);color:#30202b;font-size:10px;font-weight:600;line-height:18px;text-align:center}/* 0.9.125: keep the quiet circular style with a larger touch target. */.jump-latest{display:grid;place-items:center;width:44px;height:44px;min-width:44px;min-height:44px;padding:0;border-radius:50%;opacity:.9}.jump-latest img{display:block;width:24px;height:24px;filter:invert(1)}

/* 0.8.0: one cast picker and one scrollable writing-tools row. */
.composer>textarea{padding-top:30px;padding-right:0}.composer-cast{right:40px}.command-shortcut-pills>.composer-symbol{flex:0 0 auto;width:auto;min-width:32px;height:32px;padding:4px 7px;border:1px solid var(--line);border-radius:18px;background:var(--surface)}.command-shortcut-pills>.command-shortcut-manage{height:32px}.cast-dialog{width:calc(100% - 24px - var(--safe-left) - var(--safe-right));max-width:480px;max-height:calc(100dvh - 24px - var(--safe-top) - var(--safe-bottom));overflow-y:auto;padding:14px}.cast-dialog .dialog-heading{margin-bottom:6px}.cast-dialog .composer-actors{padding:0 0 6px}.cast-dialog #actor-count{color:var(--muted)}.cast-dialog .actor-choices{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:6px 0 0}.cast-dialog .actor-choices:empty{display:none}.cast-dialog .group-chat-help{margin:6px 0 0;line-height:1.5;font-size:11px}.cast-library{margin:8px 0 0}.cast-library h3{font-size:13px;color:var(--muted);margin:0 0 6px}.cast-library-list{display:flex;flex-wrap:wrap;gap:8px}.cast-library-list>.button{max-width:100%;white-space:normal;overflow-wrap:anywhere;text-align:left;font-size:12px}.cast-dialog .button.wide{margin-top:8px;min-height:44px;padding:8px 10px}

.mobile-brand,.mobile-library-link{min-width:44px;min-height:44px;display:flex;align-items:center}

.resume-story{white-space:nowrap;font-size:12px}

/* Bookshelf surfaces and story management. */
.shelf-page{padding-top:28px}.shelf-heading{align-items:center;flex-wrap:nowrap;margin-bottom:10px;gap:12px}.shelf-heading h1{margin:0;white-space:nowrap}.shelf-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px}.shelf-count{flex-shrink:0;margin:0;font-size:12px;color:var(--muted);white-space:nowrap}.shelf-count strong{color:var(--text);font-weight:500}#new-story .dialog-heading{margin-bottom:8px}.story-demo{min-height:32px;margin-bottom:16px;padding:4px 0}.shelf-filters{display:flex;gap:2px;min-width:0;width:fit-content;max-width:100%;overflow-x:auto;scrollbar-width:none;padding:2px;border:1px solid var(--line);border-radius:9px;background:#0f172470;box-shadow:inset 0 1px 4px #0002}.shelf-filters button{display:flex;flex-shrink:0;align-items:center;justify-content:center;gap:4px;min-height:30px;padding:4px 8px;border:1px solid transparent;border-radius:8px;background:transparent;color:var(--muted);font-size:12px;white-space:nowrap}.shelf-filters button[aria-pressed="true"]{color:var(--accent);background:#2d4058;border-color:#9bb8dd29;box-shadow:inset 0 1px 0 #edf6ff16,0 2px 6px #0002}.shelf-filters button:hover{color:var(--text)}.shelf-filters span{font-size:10px;opacity:.75;font-variant-numeric:tabular-nums}.shelf-view-note{font-size:12px;color:var(--muted);line-height:1.8;margin:8px 0 0}.shelf-page .story-list{gap:12px;margin-top:12px}.shelf-page .story-card{position:relative;display:grid;grid-template-columns:96px minmax(0,1fr) 32px;gap:18px;padding:14px;border:1px solid #aec6e530;border-radius:12px;background:linear-gradient(125deg,#edf6ff0b,transparent 44%),linear-gradient(180deg,#26374be8,#1c293be8);box-shadow:inset 0 1px 0 #edf6ff13,0 10px 26px #0003;backdrop-filter:blur(8px);transition:border-color .2s,box-shadow .2s}.shelf-page .story-card:hover{border-color:#a7bfdc5c;box-shadow:inset 0 1px 0 #edf6ff1e,0 14px 30px #0004}.shelf-page .story-card-copy h3{overflow-wrap:anywhere;line-height:1.55;margin-bottom:6px}.shelf-page .story-card-copy p{margin-bottom:6px}.shelf-page .story-entry-links{margin-top:6px}.story-manage-button{display:grid;place-items:center;align-self:start;width:32px;height:32px;padding:0;border:1px solid #aec6e526;border-radius:10px;background:#ffffff04;color:var(--muted);box-shadow:inset 0 1px 0 #edf6ff08}.story-manage-button:hover{background:#edf6ff0a;color:var(--accent);border-color:#a7bfdc5c}.story-trash-state{font-size:11px;color:var(--muted)}
/* 0.9.113: matte paperback covers with a warm paper edge and bound spine. */
.shelf-page .book-cover{--book-face:#4a4943;isolation:isolate;width:90px;height:120px;padding:10px;border:0;border-radius:1px 2px 2px 1px;overflow:visible;background:linear-gradient(115deg,#ffffff0d,transparent 58%),var(--book-face);box-shadow:1px 2px 2px #0005,4px 6px 8px #0005,9px 11px 18px #0003;transform:perspective(600px) rotateY(-10deg) rotateZ(-1deg);transform-origin:left center}.shelf-page .story-card:nth-child(3n+2) .book-cover{--book-face:#424f58}.shelf-page .story-card:nth-child(3n) .book-cover{--book-face:#51464a}.shelf-page .book-cover::before{content:"";position:absolute;z-index:-1;top:3px;bottom:3px;left:calc(100% - 1px);width:4px;background:repeating-linear-gradient(90deg,#b9b09e 0,#c9c0ae 1px,#a89f8e 1.5px,#c4bba9 2px);clip-path:polygon(0 0,100% 2px,100% calc(100% - 2px),0 100%);box-shadow:inset -1px 0 0 #766d5e66;transform:translateX(1px) skewY(9deg);transform-origin:left center;pointer-events:none}.shelf-page .book-cover::after{content:"";position:absolute;inset:0;border-radius:inherit;background:linear-gradient(90deg,#0007 0,#fff2 1px,#0003 3px,#0006 6px,#fff3 7px,transparent 9px);box-shadow:inset 0 0 0 .5px #0003;pointer-events:none}.shelf-page .book-cover>[data-book-number]{position:relative;display:block;padding:6px 0 0 8px;color:#e5d8ba;font-family:"Songti TC","PMingLiU",serif;font-size:10px;letter-spacing:.16em}
.form-dialog{background-image:linear-gradient(125deg,#edf6ff09,transparent 50%);box-shadow:inset 0 1px 0 #edf6ff12,0 24px 90px #0008}.mobile-header,.sidebar{background-image:linear-gradient(160deg,#edf6ff08,transparent 55%)}.story-manage-dialog .dialog-heading{align-items:flex-start;margin-bottom:16px}.management-story-name{margin:7px 0 0;color:var(--muted);font-size:13px;line-height:1.7;overflow-wrap:anywhere}.management-status{margin-bottom:20px}.story-management-actions{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-top:24px;padding-top:20px;border-top:1px solid var(--line)}.story-management-actions .button{flex:1}.management-trash{color:var(--danger);min-height:32px;padding:4px}.management-refresh{width:fit-content;max-width:100%;min-height:40px;text-align:left}#story-management-action-feedback .form-error+.management-refresh,#story-trash-form .form-error+.management-refresh,#shelf-purge-cleanup .form-error{margin-top:8px}.management-progress{margin:12px 0 0;color:var(--muted);font-size:12px}.management-progress:empty{display:none}.management-latest{margin-top:18px;padding:13px 15px;border:1px solid var(--line);border-radius:8px;background:#ffffff03;max-height:190px;overflow:auto}.management-latest h3{font-size:12px;color:var(--accent);margin-bottom:9px}.management-latest p{font-size:12px;white-space:pre-wrap;overflow-wrap:anywhere;margin-bottom:8px}.management-latest p:last-child{margin-bottom:0}.trash-story-name{font-family:"Songti TC","PMingLiU",serif;font-size:21px;line-height:1.7;overflow-wrap:anywhere;margin-bottom:13px}#story-trash-form .form-error,#story-purge-form .form-error,#story-management-action-feedback .form-error{margin-top:14px}#story-trash-latest{margin-top:14px}#story-trash-form .button-row,#story-purge-form .button-row{justify-content:flex-end}
@media(max-width:760px){.shelf-page{padding-top:20px}.shelf-heading{gap:8px;margin-bottom:8px}.shelf-count{font-size:11px}.shelf-view-note{font-size:11px}.shelf-page .story-list{gap:10px}.shelf-page .story-card{grid-template-columns:82px minmax(0,1fr);gap:12px;padding:10px;border-radius:11px}.shelf-page .book-cover{width:76px;height:100px;padding:8px}.shelf-page .book-cover>[data-book-number]{font-size:9px}.shelf-page .story-card-copy h3{font-size:17px;margin-bottom:5px;padding-right:40px;min-height:32px}.shelf-page .story-card-copy p{font-size:11px;line-height:1.8;margin-bottom:4px}.shelf-page .story-entry-links{gap:1px 10px;margin-top:4px}.shelf-page .story-entry-links :is(a,[data-story-gallery]){font-size:10px;min-height:30px}.story-manage-button{position:absolute;top:10px;right:10px;border-radius:9px}.shelf-filters button{padding:4px 6px;gap:3px;font-size:11px}.management-story-name{font-size:12px}.story-management-actions .button{font-size:12px}}

/* Shared dialogue surfaces and modal opacity lifecycle. */
.player-action,.dialogue-bubble{--bubble-opacity:var(--visual-dialogue-opacity,.91)}
.player-action,.dialogue-bubble,.phone-message{border-color:#93b5de66;background:linear-gradient(125deg,#eef7ff24,#a4c9f40b 30%,transparent 62%),linear-gradient(180deg,#edf6ff08,transparent 60%),rgb(39 56 79 / var(--bubble-opacity,.9098039216));background-clip:padding-box;box-shadow:0 3px 8px #080f1b59,0 12px 26px #060c1659;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.player-action,.phone-message.mine{background-color:rgb(53 75 101 / var(--bubble-opacity,.9215686275));border-color:#a7c5e780}
dialog.form-dialog[open]:not(.is-closing){animation:dialog-enter .16s ease-out both}dialog.form-dialog[open]:not(.is-closing)::backdrop{animation:dialog-backdrop-enter .16s ease-out both}dialog.form-dialog.is-closing{pointer-events:none;animation:dialog-exit .14s ease-in both}dialog.form-dialog.is-closing::backdrop{animation:dialog-backdrop-exit .14s ease-in both}@keyframes dialog-enter{from{opacity:0}to{opacity:1}}@keyframes dialog-exit{from{opacity:1}to{opacity:0}}@keyframes dialog-backdrop-enter{from{opacity:0}to{opacity:1}}@keyframes dialog-backdrop-exit{from{opacity:1}to{opacity:0}}

input:focus-visible,textarea:focus-visible,select:focus-visible,[contenteditable]:focus-visible{background-image:linear-gradient(#a7bfdc1a,#a7bfdc1a)}

/* CSS-only press feedback, with the same motion under reduced-motion settings. */
a.text-button{display:inline-flex;align-items:center}button,summary,a:is(.button,.text-button,.brand,.mobile-brand,.mobile-library-link,.back-link,.book-cover),.main-nav a,.story-entry-links a{transition:background .18s ease,border-color .18s ease,color .18s ease,box-shadow .18s ease,filter .18s ease,transform .18s cubic-bezier(.2,.85,.3,1.15)}button:not(:disabled):not([aria-disabled="true"]):active,summary:not([aria-disabled="true"]):active,a:is(.button,.text-button,.brand,.mobile-brand,.mobile-library-link,.back-link,.book-cover)[href]:not([aria-disabled="true"]):active,.main-nav a[href]:not([aria-disabled="true"]):active,.story-entry-links a[href]:not([aria-disabled="true"]):active{transform:translateY(1px) scale(.96);filter:brightness(1.2);box-shadow:inset 0 2px 5px #07101d66,0 1px 3px #0003;transition-duration:.075s}

/* Branch-local feelings remain separate from dialogue and confirmed canon. */
.dialogue-reactions{display:flex;justify-content:flex-end;width:fit-content;gap:2px;margin:5px 0 0 auto;line-height:1;white-space:normal}.dialogue-reactions .reaction-button{display:inline-flex;align-items:center;justify-content:center;width:28px;min-width:28px;height:28px;min-height:28px;padding:0;border:1px solid transparent;border-radius:7px;background:transparent;color:var(--muted)}.dialogue-reactions .reaction-button[aria-pressed="true"]{color:var(--action)}.reaction-button svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;pointer-events:none}.reaction-button[aria-pressed="true"] svg{fill:currentColor;stroke:none}.reaction-button .thumb-down{transform:rotate(180deg)}.dialogue-unit>.dialogue-reactions{margin:2px 0 0 auto}.dialogue-unit>.dialogue-reactions .reaction-button{width:24px;min-width:24px;height:24px;min-height:24px;border-radius:5px}.archive-source-text{white-space:pre-wrap;overflow-wrap:anywhere;max-height:24rem;overflow:auto;padding:12px;margin-top:8px;border:1px solid var(--line);border-radius:8px;font-size:13px;line-height:1.8;color:var(--text);background:var(--bg)}

/* social-ui-0.17.26: current relationships share the reader's compact directed rows. */
.turn-status-caption{margin:0 0 3px;color:var(--muted);font-size:11px;font-weight:600}
.form-dialog.current-status-dialog{max-width:680px;padding:20px;border-radius:12px}
.current-status-dialog .dialog-heading{align-items:flex-start;margin-bottom:10px}
.current-status-dialog .dialog-heading h2{font-size:21px;letter-spacing:.04em}
.current-status-subtitle{margin:3px 0 0;color:var(--muted);font-size:11px;letter-spacing:.04em}
.current-status-dialog .turn-status-place{display:flex;flex-wrap:wrap;gap:2px 14px;font-size:11px;line-height:1.5;margin:0 0 6px}
.current-status-dialog .turn-status-place>div{display:flex;gap:6px;min-width:0}
.current-status-dialog .turn-status-place dt{color:var(--muted);white-space:nowrap}
.current-status-dialog .turn-status-place dd{min-width:0;color:var(--text);font-weight:400;overflow-wrap:anywhere}
.current-status-tools{display:flex;align-items:flex-start;gap:12px;justify-content:space-between;margin:2px 0 8px}
.current-status-help{flex:1;min-width:0;font-size:12px}
.current-status-help summary{display:flex;align-items:center;gap:6px;min-height:36px;width:fit-content;cursor:pointer;list-style:none;color:var(--link)}
.current-status-help summary::-webkit-details-marker{display:none}
.current-status-help summary::before{content:'＋';font-size:14px}
.current-status-help[open] summary::before{content:'−'}
.current-status-help p{margin:0 0 8px;line-height:1.65;color:var(--muted)}
.current-status-dialog #current-status-refresh{flex-shrink:0;min-height:36px;margin:0;padding:0;font-size:12px}
.current-status-dialog #current-status-progress:empty{display:none}
#current-status-relationships{display:grid;gap:22px}
.current-status-group{min-width:0}
.current-status-group-title{display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin:0 0 8px;color:var(--text);font-size:15px;line-height:1.5}
.current-status-group-title select{width:auto;max-width:100%;min-width:80px;min-height:40px;margin:0;padding:5px 24px 5px 8px;font:inherit;font-size:16px;color:var(--link);border-radius:6px}
.current-status-relation{padding:9px 0 10px;border-top:1px solid var(--line);font-size:12px}
.current-status-relation.turn-status-directed{margin:0}
.current-status-state{min-width:0;min-height:32px;margin:0;padding:3px 0;background:transparent;border:0;border-radius:3px;text-align:left;font:inherit;line-height:1.5}
.current-status-state:hover{color:var(--link)}
.current-status-relation .current-status-values{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:2px 4px;padding:2px 0 0}
.current-status-value{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;min-width:0;min-height:44px;margin:0;padding:3px 0;border:0;border-radius:5px;background:transparent;color:var(--text);line-height:1.2;font-variant-numeric:tabular-nums}
.current-status-value .turn-status-affinity-label{max-width:100%;font-size:11px;color:var(--muted);white-space:nowrap}
.current-status-value strong{font-size:17px;font-weight:600;color:var(--action)}
.current-status-value strong.is-unknown{font-weight:400;color:var(--muted)}
.current-status-value:hover{background:var(--surface-raised)}
.current-status-value[aria-expanded=true],.current-status-state[aria-expanded=true]{background:var(--surface-raised);box-shadow:0 0 0 1px var(--action),0 0 14px #df91b333}
.current-status-value:focus-visible,.current-status-state:focus-visible{outline:2px solid var(--link);outline-offset:1px}
/* 0.17.30: keep the same controls while editing so both opacity transitions can finish. */
.current-status-value{transition:opacity .2s ease,background .18s ease,box-shadow .18s ease,filter .18s ease,transform .18s ease}
.current-status-identity{color:#b7d4f5}
/* 0.17.29: the wheel saves on settle; the borderless lock is its only action. */
.current-status-editor{position:fixed;inset:auto;margin:0;width:108px;min-width:0;padding:8px;overflow:auto;border:1px solid #93b5de80;border-radius:12px;background:var(--surface);color:var(--text);box-shadow:0 8px 30px #0008,0 0 16px #9cc4ef12}
.current-status-editor[data-kind=state]{width:280px}
.current-status-editor[hidden]{display:none}
.current-status-editor h3{margin:0 0 4px;font-size:12px;line-height:1.5;text-align:center;overflow-wrap:anywhere}
.current-status-editor .stack-form{gap:0}
.current-status-editor input:not([type=hidden]){font-size:16px}
.current-status-editor .form-actions{display:flex;gap:6px;margin-top:8px}
.current-status-editor[data-kind=metric] .form-actions{display:none}
.current-status-editor .form-actions button{flex:1;min-height:40px;padding:6px;font-size:13px}
.current-status-editor .form-error{font-size:12px;overflow-wrap:anywhere}
.current-status-adjustment{display:flex;flex-direction:column;align-items:center;gap:2px}
.current-status-adjustment .desire-lock-button{flex:0 0 36px;min-width:44px;width:44px;height:36px;min-height:36px;border:0;background:transparent;box-shadow:none}
.current-status-adjustment .desire-lock-button[aria-pressed=true]{background:transparent;color:var(--action)}
.current-status-wheel{--wheel-step:32px;box-sizing:border-box;width:100%;height:calc(var(--wheel-step)*5);padding:calc(var(--wheel-step)*2) 0;overflow-y:auto;overscroll-behavior:contain;scroll-snap-type:y mandatory;scrollbar-width:none;border-radius:7px;background:var(--bg);font-variant-numeric:tabular-nums}
.current-status-wheel::-webkit-scrollbar{display:none}
.current-status-wheel:focus-visible{outline:2px solid var(--link);outline-offset:2px}
.current-status-wheel[aria-disabled=true]{overflow-y:hidden;pointer-events:none;opacity:.65}
.current-status-wheel-option{display:flex;align-items:center;justify-content:center;height:var(--wheel-step);scroll-snap-align:center;font-size:20px;color:var(--muted);opacity:.55;transform:scale(.84);transition:color .16s ease,background .16s ease,opacity .16s ease,transform .16s ease;cursor:pointer}
.current-status-wheel-option[aria-selected=true]{color:var(--action);background:var(--surface-raised);opacity:1;transform:scale(1);font-weight:600}
.current-status-wheel-option[aria-disabled=true]{opacity:.2;cursor:default}
.current-status-editor[aria-busy=true] .desire-lock-icon{animation:status-lock-saving .8s ease-in-out infinite alternate}
@keyframes status-lock-saving{to{opacity:.35}}
.current-social-status{min-width:0;padding-top:10px;margin-top:8px;border-top:1px solid var(--line);font-size:12px;line-height:1.65;overflow-wrap:anywhere}
.current-social-reason{flex-basis:100%;min-width:0;color:var(--muted);margin:4px 0}
.current-social-details{margin-top:8px;min-width:0}.current-social-details summary{cursor:pointer;color:var(--link);padding:4px 0}
/* social-status-layout-0.17.8: one native disclosure controls evidence; values stay outside. */
.turn-status-directed{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:6px;margin-top:8px}.turn-status-directed>.current-social-details{flex:0 0 auto;margin:0}.turn-status-directed>.current-social-details>summary{padding:0;color:#b7d4f5}.turn-status-directed>.turn-status-directed-state{flex:1 1 12em;color:var(--text);white-space:normal;overflow:visible;text-overflow:clip}.turn-status-directed>.turn-status-values,.turn-status-explanation{flex-basis:100%}.turn-status-explanation{min-width:0;padding-inline-start:12px}.turn-status-directed>.current-social-details:not([open])~.turn-status-explanation{display:none}
/* 0.17.26: the expanded value row shares the first row’s existing inset. */
.turn-status-explanation>.turn-status-values{padding-inline-start:0}
.current-status-relation>.current-social-details{max-width:100%;overflow-wrap:anywhere}
.current-status-relation>.turn-status-explanation{padding-inline-start:0}
.current-status-relation .current-social-status{margin-top:2px;padding-top:4px;border-top:0}
@media(max-width:520px){
  .form-dialog.current-status-dialog{padding:16px 12px;border-radius:12px}
  .current-status-dialog .dialog-heading h2{font-size:20px}
}

/* 樂屋 0.9.27 — desire is editable even when its automatic changes are locked. */
.desire-lock-icon{display:inline-block;flex:0 0 auto;width:14px;height:14px;background:currentColor;vertical-align:-2px;-webkit-mask:url('icons/desire-lock.svg') center/contain no-repeat;mask:url('icons/desire-lock.svg') center/contain no-repeat}.desire-control{display:flex;align-items:center;gap:6px;min-width:0;margin-top:7px}.desire-control input{min-width:0;flex:1;margin:0;min-height:44px;font-size:16px}.desire-lock-button{display:grid;place-items:center;flex:0 0 44px;width:44px;min-width:44px;height:44px;min-height:44px;padding:0;border:1px solid var(--line);border-radius:5px;color:var(--muted);background:var(--bg);transition:color .15s,border-color .15s,background .15s}.desire-lock-button .desire-lock-icon{width:18px;height:18px}.desire-lock-button[aria-pressed="false"] .desire-lock-icon{-webkit-mask-image:url('icons/desire-unlock.svg');mask-image:url('icons/desire-unlock.svg')}.desire-lock-button[aria-pressed="true"]{border-color:var(--action);color:var(--action);background:var(--surface-raised)}.desire-lock-button:hover{border-color:var(--accent);color:var(--accent)}.desire-lock-state{margin-top:5px;font-size:11px}.relationship-value-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));align-items:start;gap:16px}.desire-field{min-width:0}.turn-status-row{display:grid;grid-template-columns:minmax(0,1fr);align-items:baseline;gap:2px}.turn-status-values{display:flex;justify-content:flex-start;align-items:baseline;flex-wrap:wrap;min-width:0;gap:8px;padding-inline-start:12px}.turn-status-values .desire-lock-icon{width:11px;height:11px;margin-left:3px;color:var(--action)}
/* 0.9.113: a metric and its delta stay together; narrow screens wrap whole metrics. */
/* 0.16.28: current and past status share one indented two-line layout; only overflowing relationship text moves. */
.turn-status-state{text-overflow:clip}.turn-status-track{display:inline-block;position:relative;padding-right:1.5em;white-space:nowrap}.turn-status-repeat{position:absolute;left:100%;top:0;padding-right:1.5em}
@media(max-width:600px){.turn-status-card{font-size:11px;line-height:1.55}.turn-status-identity{gap:4px}.turn-status-actor{max-width:4em}.turn-status-values{gap:2px 6px}.turn-status-affinity{display:inline-flex;align-items:baseline;gap:3px}.turn-status-values .desire-lock-icon{align-self:center;margin-left:0}.turn-status-delta{font-size:10px}}
@media(max-width:760px){.relationship-value-fields{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:480px){.relationship-value-fields{grid-template-columns:minmax(0,1fr)}}


/* Wine palette: deep red surfaces, unchanged reading and system text colors. */
button.dialogue-speaker{position:relative;width:fit-content;max-width:100%;padding:0;border:0;background:none;text-align:left;white-space:pre-wrap;overflow-wrap:anywhere;touch-action:pan-y;-webkit-touch-callout:none}

.dialogue-speaker.wine-charging::after{content:"";position:absolute;left:0;right:0;bottom:-3px;height:2px;border-radius:2px;background:#f47e9b;box-shadow:0 0 9px #ed4c79;transform-origin:left;animation:wine-charge .6s linear both}
@keyframes wine-charge{from{transform:scaleX(0);opacity:.25}to{transform:scaleX(1);opacity:1}}
.reader-page{transition:background-color .45s ease,color .45s ease}
.reader-page :is(.mobile-header,.sidebar,.composer,.form-dialog,.dialogue-bubble,.player-action,.phone-message){transition:background-color .45s ease,border-color .45s ease,color .45s ease,box-shadow .45s ease}
.reader-page.wine-mode{--bg:#1d0b10;--surface:#2b1019;--surface-raised:#3b1723;--line:#6b3042}
.wine-mode .secondary{border-color:#79364d}
.wine-mode .draft-panel{background:#2e111d;border-color:#71334b}
.wine-mode .form-dialog::backdrop{background:#12060abd}
.wine-mode :is(.composer,.form-dialog,.mobile-header,.sidebar,.phone-heading,.phone-identity){background-image:none}
/* Wine bubbles: directional highlights sit behind text on the same dark red base. */
.wine-mode :is(.player-action,.dialogue-bubble,.phone-message){border-color:#a65c7466;background:linear-gradient(125deg,#ffe3ec20,#dd749409 30%,transparent 62%),linear-gradient(180deg,#ffe3ec08,transparent 60%),rgb(50 19 32 / var(--bubble-opacity,.9098039216));box-shadow:inset 0 1px 0 #ffe3ec0a,inset 0 -1px 0 #10040933,0 3px 8px #16060b59,0 12px 26px #10040959}
.wine-mode :is(.player-action,.phone-message.mine){background-color:rgb(66 26 43 / var(--bubble-opacity,.9215686275));border-color:#b66b8380}
.wine-mode :is(.phone-heading,.phone-identity,.phone-friend){border-bottom-color:#a65c7426}
.wine-mode .phone-friend:hover:not(:disabled){background:#a65c7414}
.wine-mode .phone-notification{background:#2c111bed}

.wine-mode :is(input,textarea,select,[contenteditable]):focus-visible{background-image:linear-gradient(#75243a1a,#75243a1a)}

/* 0.9.108: focus belongs to the whole composer, including its overlaid controls. */
#player-input:focus-visible{background-image:none}
.composer:has(>#player-input:focus-visible){border-color:#ffffff30;box-shadow:inset 0 1px 3px #ffffff10,inset 0 -1px 3px #ffffff18,0 4px 12px #0002}
/* Dense dark glass keeps the narrow inner reflection readable over scene art. */
@supports ((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){
  .reader-page .composer{-webkit-backdrop-filter:blur(var(--visual-composer-blur,16px)) saturate(1.1);backdrop-filter:blur(var(--visual-composer-blur,16px)) saturate(1.1)}
}

.composer-wine{position:absolute;top:0;left:4px;display:grid;place-items:center;width:44px;height:44px;padding:0;border:0;border-radius:12px;background:none;color:#ef5678}
.composer-wine:hover{background:#ef567813}

.composer-model-state{position:absolute;top:10px;left:8px;max-width:calc(100% - 160px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--accent);font-size:11px;line-height:22px;pointer-events:none}.wine-mode .composer-model-state{left:52px;max-width:calc(100% - 204px)}
.wine-lips{display:block;width:28px;height:28px;pointer-events:none;animation:wine-breathe 2.6s ease-in-out infinite}
@keyframes wine-breathe{0%,100%{opacity:.78;transform:scale(.96);filter:drop-shadow(0 0 3px #ed426277)}50%{opacity:1;transform:scale(1.08);filter:drop-shadow(0 0 7px #ed4262bb) drop-shadow(0 0 13px #ed426255)}}
/* 6KAF's charge / burst / persistent glow rhythm, softened for reading. */
.wine-mode-enter::before{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;background:radial-gradient(ellipse at var(--wine-x,50%) var(--wine-y,40%),#f17b9b33,transparent 68%),radial-gradient(ellipse at center,transparent 30%,#a7284938);animation:wine-enter .96s ease-out both}
.wine-hit{animation:wine-hit .36s ease-out}
@keyframes wine-enter{0%{opacity:0}22%{opacity:1}55%{opacity:.35}72%{opacity:.55}100%{opacity:0}}
@keyframes wine-hit{0%,100%{transform:scale(1)}35%{transform:scale(1.018)}65%{transform:scale(.996)}}

/* Disabled text actions stay distinct from available links. */
:is(button.text-button,.reference-actions button,.type-controls button):disabled,a[aria-disabled="true"]{color:var(--muted);cursor:not-allowed}

.turn-actions{display:flex;align-items:center;flex-wrap:wrap;gap:8px 20px;margin-top:10px}.turn .turn-actions .text-button{margin-top:0;font-size:11px}.retract-help{margin-top:4px}.phone-retract-actions{margin:8px 0 0 40px}.phone-retract-actions .text-button{font-size:11px}.phone-retract-actions .field-help{font-size:10px;margin-top:3px}

/* 0.9.51: persistent direction and three relationship values. */
#writing-instructions .form-actions{display:flex;align-items:center;flex-wrap:wrap;gap:12px}

.live-generation-controls{display:flex;visibility:hidden;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px;color:var(--muted);font-size:14px}.live-generation-controls:has(.generation-stop:not([hidden])){visibility:visible}.generation-stop{flex-shrink:0;min-height:28px;padding:3px 10px;border:1px solid var(--line);border-radius:999px;background:transparent;color:var(--muted);font-size:11px;line-height:1.6}.generation-stop:hover:not(:disabled){background:var(--surface);color:var(--text)}

/* 0.10.8: hairline edge and a narrow neutral reflection, not a broad inner halo. */
@property --composer-glow{syntax:"<number>";inherits:true;initial-value:0}
.reader-page .composer{--composer-fill:#15191f;--composer-rim:#b7cee5;--composer-glow:0;padding-bottom:8px;border-color:#ffffff12;border-top-color:#ffffff1c;border-bottom-color:#ffffff24;background-image:linear-gradient(180deg,#ffffff05,transparent 12px,transparent calc(100% - 8px),#ffffff03);box-shadow:inset 0 1px 2px #ffffff08,inset 0 -1px 2px #ffffff0f,0 4px 12px #0002;transition:--composer-glow .55s ease,background-color .45s ease,border-color .45s ease,color .45s ease,box-shadow .45s ease}
.reader-page.wine-mode .composer{--composer-fill:#21151b;--composer-rim:#edbacb}
.composer::before{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;box-shadow:0 0 12px color-mix(in srgb,var(--composer-rim) 65%,transparent),0 0 28px color-mix(in srgb,var(--action) 38%,transparent),0 0 44px color-mix(in srgb,var(--composer-rim) 24%,transparent);opacity:var(--composer-glow);animation:composer-pulse 3.6s ease-in-out infinite paused}
.composer::after{content:"";position:absolute;inset:-1px;border-radius:inherit;padding:1px;pointer-events:none;background:linear-gradient(105deg,color-mix(in srgb,var(--composer-rim) 35%,transparent) 15%,var(--composer-rim) 35%,#fff4fa 48%,var(--action) 55%,var(--composer-rim) 68%,color-mix(in srgb,var(--composer-rim) 35%,transparent) 85%);background-size:240% 100%;-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;opacity:var(--composer-glow);animation:composer-flow 2.8s ease-in-out infinite alternate paused}
.composer:is([data-generation-phase="waiting"],[data-generation-phase="streaming"]){--composer-glow:1}
.composer:is([data-generation-phase="waiting"],[data-generation-phase="streaming"])::before,.composer:is([data-generation-phase="waiting"],[data-generation-phase="streaming"])::after,.composer:is([data-generation-phase="waiting"],[data-generation-phase="streaming"]) .composer-send::after{animation-play-state:running}
/* composer-hud-0.15.21: one compact status slot, shared type and working animation. */
.composer-status-row{display:flex;justify-content:flex-end;align-items:center;gap:6px;min-height:18px;margin:0 0 6px}
.composer-save-state,.composer-memory-state{min-width:0;margin:0;font-size:11px;line-height:18px;letter-spacing:.02em;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .55s ease}
.composer-status-row .text-button{flex-shrink:0;font-size:11px;font-weight:400;line-height:18px;letter-spacing:.02em;color:var(--link);padding:0;min-height:18px}
.composer-status-row .text-button.working-text:disabled{opacity:1;color:var(--muted)}
.composer-status-row:has(#story-sync:not([hidden])) :is(#context-preview-status,#context-organize-memory){display:none}
.composer-save-state:empty,.composer-status-row:has(.composer-save-state:not(:empty)) .composer-memory-state{display:none}
.composer:is([data-generation-phase="waiting"],[data-generation-phase="streaming"]) .composer-save-state{color:var(--text)}
.composer-send{transition:transform .12s ease,opacity .55s ease}
.composer-send:disabled{opacity:calc(.45 + var(--composer-glow)*.55)}
.composer-send::after{content:"";position:absolute;inset:4px;border-radius:50%;pointer-events:none;background:linear-gradient(115deg,#dda6c0 10%,#c2b4ce 35%,#f5d7e4 50%,#d49ab8 70%,#c2b4ce 90%);background-size:240% 100%;box-shadow:0 0 7px #d59bb459,0 0 14px #d59bb426;opacity:var(--composer-glow);animation:composer-flow 2.8s ease-in-out infinite alternate paused,composer-pulse 3.6s ease-in-out infinite paused}
.composer-send .send-icon{z-index:1}
.composer-send:not(:disabled):not([aria-disabled="true"]):active{transform:scale(.92);filter:none;box-shadow:none}
@keyframes composer-flow{from{background-position:0% 0}to{background-position:100% 0}}
@keyframes composer-pulse{0%,100%{opacity:calc(var(--composer-glow)*.62);filter:brightness(.95)}45%{opacity:var(--composer-glow);filter:brightness(1.18)}}

/* Stream text enters normal flow immediately; the reader controls the page. */
#live-reveal{overflow-anchor:none}
#live-text{display:flow-root;overflow-anchor:none}

/* New stream characters release their light in one second without changing arrival cadence. */
.prose-glow{animation:prose-glow 1s linear both}
@keyframes prose-glow{
  0%{color:#fffdf5;text-shadow:0 0 2px #fffdf5,0 0 7px #fffdf5,0 0 17px var(--accent),0 0 29px var(--accent)}
  12%{color:#fffdf5;text-shadow:0 0 3px #fffdf5,0 0 10px var(--accent),0 0 24px var(--accent),0 0 37px color-mix(in srgb,var(--accent) 65%,transparent)}
  40%{color:color-mix(in srgb,#fffdf5 70%,var(--text));text-shadow:0 0 4px #fffdf566,0 0 13px color-mix(in srgb,var(--accent) 48%,transparent),0 0 28px color-mix(in srgb,var(--accent) 25%,transparent),0 0 44px transparent}
  100%{color:inherit;text-shadow:0 0 6px transparent,0 0 18px transparent,0 0 34px transparent,0 0 48px transparent}
}

.composer[data-generation-phase]{position:sticky;bottom:max(14px,var(--safe-bottom));z-index:3}

.jump-top{top:calc(18px + var(--safe-top));bottom:auto}.jump-top img{transform:rotate(180deg)}

/* Keep the waiting line footprint when the first token clears its text. */
#stream-status{min-height:1lh}

/* The light stays inside its own layer; content remains still and readable. */
.twist-proposal{margin:22px 0 28px;animation:dialog-enter .45s ease-out both}
.twist-surface{position:relative;isolation:isolate;overflow:hidden;border:1px solid color-mix(in srgb,var(--accent) 62%,var(--line));border-radius:18px;background:color-mix(in srgb,var(--surface) calc(var(--visual-twist-opacity,1)*100%),transparent);box-shadow:0 0 20px color-mix(in srgb,var(--action) 19%,transparent)}
.twist-surface::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;background:linear-gradient(115deg,transparent 5%,color-mix(in srgb,var(--accent) 35%,transparent) 30%,color-mix(in srgb,var(--action) 50%,transparent) 48%,color-mix(in srgb,var(--accent) 36%,transparent) 66%,transparent 90%);background-size:250% 100%;animation:composer-flow 3.5s ease-in-out infinite alternate,twist-breathe 3.2s ease-in-out infinite}
.twist-content{padding:20px 22px}.twist-caption{margin:0 0 6px;color:var(--accent);font-size:11px;letter-spacing:.08em}.twist-content h2{margin:0;font-size:17px;line-height:1.6}.twist-text{margin:12px 0 18px;white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.85}.twist-content .button-row{gap:10px}.twist-content .button{min-height:38px;font-size:13px}.twist-content .form-error{margin:12px 0 0}
@keyframes twist-breathe{0%,100%{opacity:.28;filter:brightness(.85)}48%{opacity:1;filter:brightness(1.25)}}

.composer-setting-row{display:flex;align-items:center;gap:9px;margin:9px 0}.composer-setting-row>label{flex:0 0 48px;margin:0;color:var(--muted);font-size:11px;white-space:nowrap}.composer-setting-row>select,.composer-setting-controls{flex:1;min-width:0}.composer-setting-controls{display:flex;align-items:center;gap:7px}.composer-setting-controls>select{flex:1;width:0;min-width:0}.composer-setting-row select,.composer-probability input{height:36px;min-height:36px;margin:0;font-size:13px;line-height:1.4}.composer-setting-row select{padding:6px 23px 6px 8px}.composer-setting-label,.composer-probability-label{color:var(--muted);font-size:11px;white-space:nowrap}.composer-probability{position:relative;flex:0 0 61px}.composer-probability input{width:100%;padding:6px 20px 6px 5px;text-align:right;appearance:textfield;-moz-appearance:textfield}.composer-probability input::-webkit-inner-spin-button,.composer-probability input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.composer-probability>span{position:absolute;right:7px;top:50%;transform:translateY(-50%);pointer-events:none}.composer-setting-state{flex:0 0 17px;text-align:center;color:var(--accent);font-size:15px;line-height:1}.composer-setting-hint{text-align:right;font-size:10px}.composer-options #twist-save-error{padding:6px 9px;font-size:11px;margin-top:8px}
.composer-options>.input-shortcuts{margin-top:10px}.composer-help{margin-top:8px}.composer-help>summary{cursor:pointer;font-size:11px;width:fit-content}.composer-help>div{border-top:1px solid var(--line);padding-top:8px;margin-top:8px}.composer-help p{margin:0 0 6px;font-size:11px;line-height:1.7}.composer-help p:empty{display:none}.composer-help p:last-child{margin-bottom:0}
@media(max-width:760px){.composer-setting-row select,.composer-probability input{font-size:16px}.composer-setting-controls{gap:6px}}

/* Active work only: one highlight crosses the text without changing its content or timing. */
.cover-generation-controls{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap;margin-top:12px}.cover-generation-controls>label{flex:1;min-width:150px;max-width:400px;font-size:11px;color:var(--muted)}.cover-generation-controls select{min-height:38px;font-size:16px}.cover-generation-controls .button,.story-gallery-toolbar .button{min-height:38px;padding:6px 12px;font-size:12px;white-space:nowrap}.story-gallery-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}.story-gallery-toolbar #story-cover-action{margin-left:auto}.story-gallery-toolbar .shelf-filters{margin:0}
/* 0.17.30: the whole highlight leaves the text before the next pass; both endpoints are identical. */
.working-text{background-image:linear-gradient(90deg,currentColor 35%,#fff 48%,#fff 52%,currentColor 65%);text-shadow:0 0 8px #fff2;background-size:300% 100%;background-repeat:no-repeat;background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;animation:working-text-sweep 2.4s linear infinite}
@keyframes working-text-sweep{from{background-position:100% 0}to{background-position:0% 0}}

/* 0.9.106: controls and safe memory notices fade without moving the reader. */
.jump-latest{transition:opacity .5s ease,visibility 0s}
.jump-latest:not([hidden]):not(.is-idle){animation:reader-control-in .5s ease}
.jump-latest.is-idle:not(:focus-visible){opacity:0;visibility:hidden;transition:opacity 2s ease,visibility 0s linear 2s}
#context-preview-status[data-state="not_needed"]{animation:reader-notice-in .5s ease both,reader-notice-fade 2s ease 3.5s forwards;pointer-events:none}
@keyframes reader-control-in{from{opacity:0}to{opacity:.9}}
@keyframes reader-notice-in{from{opacity:0}to{opacity:1}}
@keyframes reader-notice-fade{from{opacity:1}to{opacity:0}}

/* 0.9.107: keep the update action in the existing composer status slot. */
.composer[data-update-available] .composer-status-row>:not(#app-update){display:none}
.composer-status-row #app-update{color:var(--accent);animation:reader-notice-in .5s ease both,working-text-sweep 2.4s linear infinite}
.phone-app-update{display:block;margin:0 0 6px auto;font-size:12px;color:var(--accent);animation:reader-notice-in .5s ease both,working-text-sweep 2.4s linear infinite}


/* Shelf entry feedback keeps the existing card and reader geometry. */
.shelf-page .story-entry-links{position:relative}
.story-opening-status{position:absolute;inset:0 auto auto 0;padding:5px 0;font-size:12px;color:var(--accent);pointer-events:none}
.story-card[aria-busy="true"] .story-entry-links>a{visibility:hidden}
.shelf-page .story-card[aria-busy="true"]{border-color:var(--accent)}
/* 0.15.25: retain one loading indicator through the reader entry fade. */
.reader-entry-status,.reader-entry-error{display:none}
html.shelf-story-loading #main,html.shelf-story-loading .story-background{visibility:hidden}
html.shelf-story-loading .reader-entry-status{display:block;visibility:visible;position:fixed;z-index:20;inset:50% auto auto 0;top:50svh;width:100vw;padding-inline:16px;text-align:center;font-size:13px;color:var(--accent)}
html.shelf-story-load-error .reader-entry-progress{display:none}
html.shelf-story-load-error .reader-entry-error{display:inline}
.reader-entry-error .text-button{font-size:inherit}
/* 0.9.126: release the opacity backdrop root after entry so composer glass can sample the scene. */
.reader-page.shelf-story-entry .reader-wrap,.reader-page.shelf-story-entry .story-background{animation:shelf-story-enter .3s ease-out backwards}
@keyframes shelf-story-enter{from{opacity:0}to{opacity:1}}

/* 0.9.113: full-cover artwork follows the paperback frame; reading links stay native. */
.book-cover .story-cover-art{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;border-radius:inherit;opacity:0;pointer-events:none}
.book-cover .story-cover-art.is-loaded{opacity:1}
.book-cover.has-cover>[data-book-number]{visibility:hidden}
.book-cover.has-cover::after{z-index:1}
.shelf-page .book-cover>.story-cover-status{position:absolute;z-index:2;inset:auto 2px 4px;padding:2px;font-size:11px;line-height:1.5;letter-spacing:0;text-align:center;color:#fff;text-shadow:0 1px 3px #000}
.shelf-page .book-cover>.story-cover-status:not(.working-text){background:#182331e6;border-radius:3px}

/* White vector wordmark, with the version beside it. */
.brand-logo{display:block;width:116px;height:auto;flex:none}
.mobile-brand{gap:6px}
.mobile-brand .brand-logo{width:96px;min-width:0;flex:0 1 96px}
/* The scene and the scrolling reader share a viewport. Only the foreground scrolls. */
html:has(>.reader-page),#reader-scroll{overscroll-behavior-y:none}
.reader-page:has(>#reader-scroll){position:relative;height:100dvh;overflow:clip}
#reader-scroll{position:relative;z-index:1;height:100%;overflow:auto;scroll-behavior:smooth;scroll-padding:var(--safe-top) var(--safe-right) var(--safe-bottom) var(--safe-left)}
.reader-page>.story-background{--scene-intensity:.12;--scene-fade:1.8s;position:absolute;inset:0;z-index:0;overflow:hidden;pointer-events:none}
.story-background-layer{position:absolute;inset:0;opacity:0;transition:opacity var(--scene-fade,1.8s) ease-in-out}
.story-background-layer.is-current{opacity:var(--scene-intensity,.12)}
.story-background-layer>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center}
.story-background-fill{display:none;filter:blur(22px);transform:scale(1.08)}
/* 0.17.67: keep the centered desktop scene near the reading-column width. */
@media(min-width:761px){.reader-page>.story-background{left:calc(240px + var(--safe-left));right:var(--safe-right)}.story-background-fill{display:block}.story-background-layer>.story-background-main{inset:0 auto 0 50%;width:min(100%,820px);transform:translateX(-50%);-webkit-mask-image:linear-gradient(to right,transparent,#000 6%,#000 94%,transparent);mask-image:linear-gradient(to right,transparent,#000 6%,#000 94%,transparent)}}
@media(min-width:761px) and (max-width:1100px){.reader-page>.story-background{left:calc(210px + var(--safe-left))}}
/* 0.9.123: fixed watercolor layers change opacity only; reading geometry stays intact. */
.background-settings{padding:16px 0 20px;margin-bottom:20px;border-block:1px solid var(--line)}
.background-settings h2{font-size:15px;margin:0 0 12px}.background-settings fieldset{border:0;padding:0;margin:0;min-width:0}

.background-setting-controls{display:flex;align-items:flex-end;flex-wrap:wrap;gap:12px 20px;margin:14px 0 10px}.background-setting-controls>label{width:190px;font-size:11px;color:var(--muted)}
.background-setting-controls output{float:right;color:var(--text);font-variant-numeric:tabular-nums}.background-setting-controls input[type=range]{display:block;width:100%;min-height:30px;margin:4px 0 0;padding:0;border:0;background:none;accent-color:var(--action)}
.background-settings .button{min-height:36px;padding:6px 12px;font-size:12px}
.background-settings .field-help{font-size:11px;margin-top:4px}.background-settings .is-error{color:var(--danger)}#background-setting-status:empty{display:none}
@media(max-width:600px){.background-setting-controls{gap:10px 16px}.background-setting-controls>label{width:calc(50% - 8px)}.background-setting-controls>.button{margin-left:auto}}

/* Writing feedback is editorial; its icon contributes no text to the source line. */
.prose-feedback-button{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;width:24px;min-width:24px;height:24px;min-height:24px;padding:0;margin:0 0 0 .25em;border:1px solid transparent;border-radius:5px;background:transparent;color:var(--muted);opacity:.6;user-select:none;-webkit-user-select:none}.prose-feedback-button:hover,.prose-feedback-button:focus-visible,.prose-feedback-button[aria-pressed="true"]{opacity:1}.prose-feedback-button[aria-pressed="true"]{color:var(--action)}

/* story-gallery-0.13.10: shared controls with contained keyboard focus. */
.story-gallery-dialog{max-width:900px}.story-gallery-dialog .dialog-heading{align-items:flex-start}.story-gallery-dialog .form-error{margin:12px 0}.story-gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:20px 16px;margin-top:16px}.story-gallery-grid figure{margin:0;min-width:0}.story-gallery-preview{display:block;width:100%;padding:0;aspect-ratio:3/4;overflow:hidden;border:1px solid var(--line);border-radius:6px;background:var(--bg)}.story-gallery-preview img{display:block;width:100%;height:100%;object-fit:contain}.story-gallery-grid figcaption{display:grid;gap:4px;padding-top:9px;font-size:11px;line-height:1.6;color:var(--muted);overflow-wrap:anywhere}.story-gallery-grid figcaption strong{font-size:12px;font-weight:500;color:var(--text)}.story-gallery-grid figcaption .text-button{width:fit-content;color:var(--link);padding:4px 0}.story-gallery-grid figcaption .text-button:hover{color:var(--link-hover)}#story-gallery-more{display:block;margin:20px auto 0}@media(max-width:760px){.story-gallery-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:18px 12px}}

.story-gallery-filters{margin:4px 0 12px}.shelf-filters button:focus-visible,.story-gallery-preview:focus-visible,.close-button:focus-visible{border-color:var(--muted)}.close-button:focus-visible{background:var(--line);color:var(--text)}.story-gallery-grid .text-button:focus-visible{text-decoration:underline;text-underline-offset:3px}
.story-gallery-image-dialog{max-width:1100px;overflow:hidden}.story-gallery-image-dialog[open]{display:flex;flex-direction:column;gap:12px}.story-gallery-image-dialog::backdrop{background:#080d15ed}.story-gallery-image-dialog .dialog-heading{flex-shrink:0;align-items:flex-start;margin:0}.story-gallery-image-dialog [role="status"]:empty{display:none}.story-gallery-image-frame{display:flex;justify-content:center;align-items:center;min-height:0;overflow:auto}.story-gallery-image-frame img{width:auto;height:auto;max-width:100%;max-height:calc(100dvh - 190px - var(--safe-top) - var(--safe-bottom));object-fit:contain;-webkit-touch-callout:default;user-select:auto}

/* chat-image-ui-20261029.2: shared circle-plus controls and right-aligned outgoing photos. */
.chat-image-link{display:block;width:fit-content;max-width:100%;line-height:0}.chat-image-link img{display:block;width:auto;height:auto;max-width:min(220px,100%);max-height:180px;object-fit:contain;border-radius:8px}.player-action>.chat-image-link{margin-top:5px}.chat-image-draft{display:flex;align-items:center;gap:8px;min-width:0}.chat-image-draft:has([data-chat-image-preview]:not([hidden])){margin:5px 0}.chat-image-draft .chat-image-link img{max-width:90px;max-height:64px}.chat-image-draft .field-help{margin:0}.chat-image-draft .field-help:empty{display:none}.chat-image-pick{display:grid;place-items:center;flex:0 0 auto;width:32px;height:32px;padding:0;border:0;border-radius:10px;background:transparent;color:var(--accent)}
.chat-image-pick svg{display:block;width:20px;height:20px}
.composer-image{right:112px}
.phone-compose-row>.chat-image-pick{width:40px;height:44px}
.phone-message.mine>.chat-image-link,.phone-message.mine>.chat-image-link img{margin-left:auto}.chat-image-draft [hidden],[data-chat-image-file][hidden]{display:none}.phone-message>p{margin:0}.phone-message>.chat-image-link+p{margin-top:5px}.phone-compose-row{gap:6px}

/* ui-fades-0.15.5: phone views share one slot while their visibility changes. */
.phone-panels{display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr);flex:1;min-height:0;isolation:isolate}
.phone-panels>.phone-contacts,.phone-panels>.phone-chat{grid-area:1/1;min-width:0;overflow:hidden}
.phone-panels>[inert]{pointer-events:none}
/* Native disclosures keep their existing open/validation behavior. */
details:not(.character-details,.secret-fields,.scene-note,.composer-help,.header-menu,.account-permissions)::details-content{opacity:0;transition:opacity .14s ease-out,content-visibility .14s allow-discrete}
details:not(.character-details,.secret-fields,.scene-note,.composer-help,.header-menu,.account-permissions)[open]::details-content{opacity:1;transition-duration:.18s}

/* social-ui-0.17.0: directed values expand without hiding simultaneous reactions. */
.turn-status-card .current-social-details>summary{white-space:normal;overflow-wrap:anywhere}.soul-appraisal-text{white-space:pre-wrap;overflow-wrap:anywhere}

/* 0.17.18: compact conversation thumbnails open the shared image dialog. */
.dialogue-image-bubble{display:flex;flex-direction:column;align-items:flex-start}.inline-illustration{display:block}.illustration-description{display:inline;padding:0;border:0;background:none;color:inherit;font:inherit;line-height:inherit;text-align:inherit;white-space:inherit}.illustration-description:disabled{opacity:1;cursor:default}.illustration-description[data-status-label]::after{content:attr(data-status-label);display:block;color:var(--muted);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;font-size:max(12px,.65em);line-height:1.5;margin-top:4px}.illustration-thumbnail{display:block;width:64px;height:64px;padding:0;background:none;margin-top:8px;border:1px solid var(--line);border-radius:6px;overflow:hidden}.illustration-thumbnail img{display:block;width:100%;height:100%;object-fit:contain;background:var(--surface)}

/* 0.17.20: only a saved image has an active viewing control. */
button.illustration-description:not(:disabled)::after{width:fit-content;max-width:100%;padding:6px 10px;border:1px solid var(--link);border-radius:6px;color:var(--link);font-weight:600}

/* 0.17.50: warn before a medium-term event can fade. */
.memory-fading { border-left: 3px solid #dfb87d; padding-left: 12px; }
.memory-fade-label { color: #dfb87d; font-size: .85rem; }

/* release-notice-0.17.53: local waiting feedback keeps the reader visible. */
[data-app-update].release-wait::before{content:"";display:inline-block;width:.65em;height:.65em;margin-right:6px;vertical-align:-.05em;border:1.5px solid #a7bfdc55;border-top-color:var(--accent);border-radius:50%;animation:release-wait-spin .8s linear infinite}
@keyframes release-wait-spin{to{transform:rotate(360deg)}}

/* 0.17.57: one checkbox owns selection as its row moves between used and waiting. */
.cast-dialog .cast-choice{display:flex;align-items:stretch;min-width:0;max-width:100%;padding:0;border:1px solid var(--line);border-radius:4px;background:var(--surface)}
.cast-choice:has(input:checked){border-color:var(--action);background:#3b2c37}
.cast-choice>label,.cast-add{display:flex;align-items:center;gap:9px;flex:1;min-width:0;margin:0;padding:9px 10px;cursor:pointer;text-align:left;font-size:12px;overflow-wrap:anywhere}
.cast-add{border:0;font-size:12px;text-decoration:none;color:var(--accent)}
.cast-waiting>label{position:relative;color:var(--accent)}
.cast-waiting>label>span::before{content:"＋ "}
.cast-waiting input{position:absolute;width:1px;height:1px;min-height:1px;opacity:0;pointer-events:none}
.cast-choice:has(input:focus-visible){outline:2px solid var(--accent);outline-offset:2px}
.cast-choice:has(input:disabled){opacity:.6}
.cast-close{flex:0 0 36px;min-width:36px;margin:0;padding:0;border:0;background:transparent;color:var(--muted);font-size:20px;line-height:1;touch-action:manipulation}
.cast-close:hover,.cast-close:focus-visible{color:var(--accent)}
.cast-closed{margin-top:6px;border-top:1px solid var(--line);padding-top:6px}
.cast-closed>summary{font-size:12px;color:var(--muted);cursor:pointer}

.cast-library-source{margin-top:6px;padding-top:6px;border-top:1px solid var(--line)}.cast-library-source>summary{color:var(--accent);font-size:12px;cursor:pointer}

@media(max-width:760px){.cast-dialog .actor-choices{gap:7px}.cast-choice>label,.cast-add{padding:9px 8px}}

/* 0.17.59: only signed numeric text owns the confirmed value-change effect. */
.emotion-number[data-change]{display:inline-block;background-image:linear-gradient(180deg,var(--emotion-tone) 0%,var(--emotion-tone) 35%,var(--emotion-sheen) 49%,var(--emotion-tone) 63%,var(--emotion-tone) 100%);background-size:100% 300%;background-position:0 0;background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent}
.emotion-number[data-change=up]{--emotion-tone:#ffd16f;--emotion-sheen:#fff9d8;filter:drop-shadow(0 0 1px #ffcc5c66);animation:emotion-rise 1.6s linear infinite,emotion-breathe 2.6s ease-in-out infinite}
.emotion-number[data-change=down]{--emotion-tone:#c285aa;--emotion-sheen:#dba0c0;animation:emotion-fall 1.6s linear infinite}
@keyframes emotion-rise{from{background-position:0 0}to{background-position:0 100%}}
@keyframes emotion-fall{from{background-position:0 100%}to{background-position:0 0}}
@keyframes emotion-breathe{0%,100%{filter:drop-shadow(0 0 1px #ffcc5c66)}50%{filter:drop-shadow(0 0 3px #ffcc5cf2) drop-shadow(0 0 7px #ffcc5cf2)}}
