.party-rows-editor{display:grid;gap:12px;min-width:0;padding:0;border:0;border-radius:0;background:none;overflow-wrap:anywhere}
.party-rows-editor header{display:flex;align-items:center;justify-content:space-between;gap:12px}.party-rows-editor h3,.party-rows-editor p{margin:0}.party-rows-editor p{line-height:1.7}.party-rows-editor .eyebrow{font-size:10px}.party-rows-count{flex:none;color:#e8cf92;font-size:13px}.party-rows-status{color:#d4e8ed}.party-rows-lock,.party-rows-error{padding:10px 12px;border:1px solid #9c7545;border-radius:8px;color:#f4d4a5}.party-rows-error{border-color:#a96666;color:#ffcccc}.party-rows-presets,.party-rows-tools{display:flex;gap:10px;flex-wrap:wrap}.party-rows-presets>button{min-height:44px;flex:1;white-space:normal}.party-rows-members{display:grid;gap:10px}.party-rows-member{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px;align-items:center;padding:12px;border:1px solid rgb(101 143 154 / 25%);border-radius:10px;background:#10212a}.party-rows-member strong,.party-rows-member span{display:block}.party-rows-member span{margin-top:4px;font-size:12px;color:#c9d5d7}.party-rows-switch{display:flex;gap:4px}.party-rows-switch button{min-width:58px;min-height:44px;padding:8px;border:1px solid #5e7983;border-radius:8px;background:#172d36;color:#e3edef}.party-rows-switch button[aria-pressed=true]{border-color:#d8ba76;background:#4b3d23;color:#fff0c9}.party-rows-editor button:disabled{opacity:.5;cursor:default}.party-rows-editor button:focus-visible,.party-rows-explanation>summary:focus-visible{outline:2px solid #ecd49c;outline-offset:3px}.party-rows-tools button{min-height:44px;white-space:normal}.party-rows-help{font-size:12px;color:#bdcace}.party-rows-explanation{padding:10px 0;border-top:1px solid #3e5961}.party-rows-explanation>summary{cursor:pointer;min-height:44px;align-content:center}.party-rows-explanation p{margin-top:10px;font-size:12px}.party-rows-editor footer{display:flex;justify-content:flex-end;padding-bottom:env(safe-area-inset-bottom,0px)}.party-rows-editor footer button{min-height:46px;min-width:140px}.party-row-badge{display:inline-block;margin-left:4px;padding:2px 5px;border:1px solid #8da7a5;border-radius:5px;background:rgb(8 22 28 / 90%);font-size:9px;line-height:1.3;color:#dbe7df}.party-row-badge[data-battle-row=FRONT]{border-color:#d8ba76;color:#f2d99d}
@media(max-width:359px){.party-rows-editor{padding:0}.party-rows-member{padding:10px;gap:6px}.party-rows-switch button{min-width:50px}.party-rows-editor header{align-items:start;flex-wrap:wrap}}

.party-line.party-rows-explicit:not(.party-count-1) .formation-front-upper{top:20px;right:0;left:auto;bottom:auto;z-index:3}
.party-line.party-rows-explicit:not(.party-count-1) .formation-front-lower{top:auto;right:0;left:auto;bottom:0;z-index:4}
.party-line.party-rows-explicit:not(.party-count-1) .formation-rear-center{top:50%;right:auto;left:0;bottom:auto;transform:translateY(-50%);z-index:1}

.party-rows-explicit .party-member .party-row-badge{position:absolute;top:-13px;right:2px;margin:0;white-space:nowrap}
.party-detail-row{margin:0 0 12px;padding:8px 10px;border:1px solid #536c72;border-radius:8px;font-size:12px;color:#dbe7df}


.party-rows-diagram{min-width:0;display:grid;gap:9px}
.party-rows-direction{display:flex;align-items:center;justify-content:space-between;gap:6px;font-size:11px;color:#bdcfd2}.party-rows-direction strong{font-weight:500}.party-rows-direction b{color:#f1c38b}
.party-rows-scene{position:relative;height:330px;min-width:0;overflow:hidden;border:0;border-radius:0;background:linear-gradient(180deg,#08131c,#1a2930 28%,#29302c 29%,#17211f);isolation:isolate}
.party-rows-ground{position:absolute;inset:28% -30% -22%;border-top:1px solid #718477;transform:perspective(230px) rotateX(30deg);background:repeating-linear-gradient(0deg,transparent 0 39px,#8d9a8226 40px 41px),repeating-linear-gradient(90deg,transparent 0 45px,#8d9a8220 46px 47px);pointer-events:none;z-index:-1}
.party-rows-lane{position:absolute;top:8px;bottom:6px;width:43%;min-width:0}.party-rows-lane.is-rear{left:3%}.party-rows-lane.is-front{right:8%}.party-rows-lane-heading{display:grid;justify-items:center;color:#d3e7e6;font-size:12px}.party-rows-lane.is-front .party-rows-lane-heading strong{color:#f2d395}.party-rows-lane-floor{position:absolute;inset:24px 0 0}
.party-rows-scene-slot{position:absolute;left:0;right:0;height:132px;min-width:0}.party-rows-scene-slot.is-upper{top:0}.party-rows-scene-slot.is-center{top:calc(50% - 66px);transform:none}.party-rows-scene-slot.is-lower{bottom:0}
.party-rows-character{position:relative;z-index:1;display:grid;width:100%;height:132px;padding:0 3px;border:0;background:none;color:#f0eee4;justify-items:center;align-content:start;gap:0;touch-action:pan-y;text-align:center}.party-rows-character-image{display:grid;height:82px;width:100%;place-items:end center;pointer-events:none}.party-rows-character-image .actor-image{height:82px;width:100%;max-width:100px;object-fit:contain;pointer-events:none}.party-rows-character strong{display:block;min-width:0;max-width:100%;margin-top:24px;font-size:12px;line-height:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.party-rows-character small{font-size:10px;line-height:12px;max-width:100%;white-space:nowrap}.party-rows-image-placeholder{display:grid;place-items:center;min-height:64px;font-size:10px;color:#acbdc1}
.party-rows-place-target{position:absolute;z-index:2;top:62px;left:3%;width:94%;height:44px;min-height:44px;padding:0;border:2px dashed #aec1b7;border-radius:50%;background:#102a2240;color:#c9dacf;font-size:10px;touch-action:pan-y}.party-rows-editor .party-rows-place-target:disabled{opacity:1;cursor:default}.party-rows-place-target.has-character:disabled{z-index:0}.party-rows-place-label{pointer-events:none}.party-rows-place-target:not(:disabled){border-color:#d7ce99;background:#4d61414d;cursor:pointer}.party-rows-place-target.has-character:not(:disabled){border-color:#aec1b7;background:#102a2240;touch-action:none;cursor:grab}
.party-rows-scene-slot.is-selected .party-rows-place-target{border-color:#e0c884;background:#c4a85b30}.party-rows-scene-slot.is-drop-target .party-rows-place-target{border-color:#8de0cc;box-shadow:0 0 0 2px #91e4c540;background:#47766370}
.party-rows-grip-symbol{position:absolute;right:7px;top:10px;font-size:21px;line-height:21px;color:#e8d29a;pointer-events:none}.party-rows-place-target.is-dragging{cursor:grabbing;opacity:.4}
.party-rows-enemy-edge{position:absolute;right:0;top:40%;width:20px;font-size:11px;text-align:center;line-height:1.4;color:#f2bfa0;border-left:1px dashed #ac8c7459;padding:10px 0}
.party-rows-editor .party-rows-diagram-message{min-height:38px;font-size:12px;line-height:1.6;color:#e1ce9d}.party-rows-editor .party-rows-weight-key{padding:8px 10px;border:1px solid #536c72;border-radius:8px;font-size:12px;line-height:1.6;color:#e2e9de}.party-rows-editor .party-rows-diagram-help{font-size:11px;line-height:1.7;color:#bfcbce}
.party-rows-scene-ghost{position:fixed;left:0;top:0;z-index:2147480000;pointer-events:none;user-select:none;color:#fff}.party-rows-ghost-lift,.party-rows-ghost-sway{width:100%;height:100%;transform-origin:50% 90%}.party-rows-ghost-lift{animation:party-rows-pick-up 180ms cubic-bezier(.2,.8,.3,1.2) both;filter:drop-shadow(0 8px 5px #0007)}.party-rows-ghost-sway{animation:party-rows-carry-sway 880ms ease-in-out 180ms infinite alternate}.party-rows-scene-ghost .actor-image{display:block;width:100%;max-width:none;height:100%;object-fit:contain;margin:0}.party-rows-scene-ghost strong{display:grid;place-items:center;height:100%;font-size:12px}.party-rows-scene-slot.is-carried .party-rows-character-image{visibility:hidden}.party-rows-scene-slot.is-carried .party-rows-character strong,.party-rows-scene-slot.is-carried .party-rows-character small{opacity:.35}.party-rows-scene-slot.is-carried .party-rows-place-target{border-color:#aec1b780;background:transparent}.party-rows-character,.party-rows-character-image{user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}
@keyframes party-rows-pick-up{0%{transform:translateY(0) scale(1)}65%{transform:translateY(-24px) scale(1.12)}100%{transform:translateY(-18px) scale(1.08)}}
@keyframes party-rows-carry-sway{from{transform:rotate(-2deg) translateY(0)}to{transform:rotate(2deg) translateY(-3px)}}
.party-rows-scene-dragging{cursor:grabbing}.party-rows-editor h3:focus-visible{outline:2px solid #ecd49c;outline-offset:3px}
@media(max-width:359px){.party-rows-direction{font-size:10px}.party-rows-character strong{font-size:11px}.party-rows-character small{font-size:9px}.party-rows-lane.is-rear{left:1%}.party-rows-lane.is-front{right:8%}.party-rows-lane{width:44%}}
@media(prefers-reduced-motion:reduce){.party-rows-diagram *{scroll-behavior:auto}}

/* Fixed saved positions also retain empty middle/outer positions in the battle view. */
.battle-shell:not(.arena-duel) .combatants:has(> .party-line.party-rows-fixed){grid-template-rows:minmax(0,1fr)}
@media(max-width:700px){.battle-shell:not(.arena-duel) .combatants:has(> .party-line.party-rows-fixed){min-height:280px}}
.party-line.party-rows-fixed{min-height:0;height:100%;top:0}
.party-line.party-rows-fixed .party-member{width:90px;transform:none;bottom:auto}
.party-line.party-rows-fixed [class*="formation-front-"]{right:0;left:auto}
.party-line.party-rows-fixed [class*="formation-rear-"]{left:0;right:auto}
.party-line.party-rows-fixed .party-member.formation-front-upper,.party-line.party-rows-fixed .party-member.formation-rear-upper{top:0}
.party-line.party-rows-fixed .party-member.formation-front-center,.party-line.party-rows-fixed .party-member.formation-rear-center{top:calc(50% - 56px);transform:none}
.party-line.party-rows-fixed .party-member.formation-front-lower,.party-line.party-rows-fixed .party-member.formation-rear-lower{top:auto;bottom:12px}
.battle-shell:not(.arena-duel) .party-line.party-rows-fixed .actor-mark{width:72px;height:64px}
.battle-shell:not(.arena-duel) .party-line.party-rows-fixed .actor-image{height:64px}

.party-rows-editor header{position:relative}.party-rows-header-tools{display:flex;align-items:center;gap:8px;flex:none}.party-rows-help-popover>summary{display:grid;place-items:center;width:44px;height:44px;cursor:pointer;list-style:none;color:#e8cf92;border-radius:50%}.party-rows-help-popover>summary::-webkit-details-marker{display:none}.party-rows-help-popover>summary span{display:grid;place-items:center;width:28px;height:28px;border:1px solid #829a9c;border-radius:50%;font-size:16px;line-height:1;background:#15272f}.party-rows-help-popover>summary:focus-visible,.party-rows-help-panel button:focus-visible{outline:2px solid #ecd49c;outline-offset:2px}.party-rows-help-popover[open]>summary span{border-color:#e8cf92;background:#3d3423}.party-rows-help-panel{position:absolute;z-index:12;left:0;right:0;top:calc(100% + 8px);max-height:min(60dvh,440px);overflow:auto;overscroll-behavior:contain;padding:14px;border:1px solid #718a8d;border-radius:12px;background:#0c1b23;box-shadow:0 8px 26px #0009;color:#d4dfe0;text-align:left;scrollbar-gutter:stable}.party-rows-help-heading{display:flex;align-items:center;justify-content:space-between;gap:8px}.party-rows-help-heading>strong{font-size:15px}.party-rows-help-heading>button{display:grid;place-items:center;flex:none;width:44px;height:44px;min-height:44px;padding:0;border:1px solid #637c80;border-radius:50%;color:#dbe6e7;background:#172c34;font-size:22px}.party-rows-help-panel h4{margin:14px 0 6px;font-size:13px;color:#e8cf92}.party-rows-editor .party-rows-help-panel p{margin:6px 0;font-size:12px;line-height:1.8}.party-rows-editor .party-rows-status{font-size:12px}.party-rows-editor .party-rows-diagram-message{min-height:0}.party-rows-editor .party-rows-diagram-help{font-size:11px}

@media(prefers-reduced-motion:reduce){.party-rows-ghost-lift{animation:none;transform:translateY(-12px) scale(1.04)}.party-rows-ghost-sway{animation:none;transform:none}}

/* The carried sprite provides feedback; keep its source position still. */
.party-rows-editor .party-rows-scene .party-rows-scene-slot .party-rows-character.button-pressing,.party-rows-editor .party-rows-scene .party-rows-scene-slot .party-rows-character:active{transform:none;filter:none;box-shadow:none;border-color:transparent}

/* Let portraits overlap while keeping the six foot targets reachable. */
.party-rows-scene-slot{pointer-events:none;z-index:auto}
.party-rows-scene-slot.is-upper .party-rows-character{z-index:10}
.party-rows-scene-slot.is-center .party-rows-character{z-index:20}
.party-rows-scene-slot.is-lower .party-rows-character{z-index:30}
.party-rows-character{height:82px;overflow:visible;pointer-events:none;cursor:grab}
.party-rows-character-image .actor-image,.party-rows-image-placeholder{pointer-events:none}
/* The upper sprite grabs the character; its feet continue to operate the oval below. */
.party-rows-character::before{content:"";position:absolute;inset:0 0 22px;pointer-events:auto}
.party-rows-character.is-dragging{cursor:grabbing}
.party-rows-place-target{pointer-events:auto}
.party-rows-character strong{position:absolute;top:84px;max-width:96%;margin:0;padding:1px 4px;border-radius:5px;background:#081720e8;line-height:14px;pointer-events:none}
.party-rows-character small{display:none}

/* Keep all sprites above their foot targets and remove visible name labels. */
.party-rows-character strong{display:none}

/* Compact six-slot spacing preserves full-sized portraits and reachable ellipses. */
.party-rows-scene{height:248px}
.party-rows-scene-slot{height:106px}
.party-rows-scene-slot.is-center{top:calc(50% - 53px)}
.party-rows-character::before{left:max(8px,calc(50% - 35px));right:max(8px,calc(50% - 35px))}

/* Departure shares the existing editor and its autosave/recovery controls. */
.zone-entry-formation-preview{margin:6px 0}
.zone-entry-formation-preview .party-rows-editor{padding:0;gap:6px}
.zone-entry-formation-preview .party-rows-editor>header{display:none}
.zone-entry-formation-preview>p{margin:6px 0 0;font-size:11px}
.zone-entry-formation-preview button:disabled{opacity:1;cursor:default}
.zone-entry-party.has-formation-preview .zone-entry-party-portrait{display:none}

/* Keep departure actions visible and close the gap above saved center/lower slots. */
.zone-entry-dialog.party-confirm{display:flex;flex-direction:column;overflow:hidden}
.zone-entry-dialog.party-confirm .zone-entry-content{min-height:0;overflow:auto;overscroll-behavior:contain;scrollbar-width:thin;touch-action:pan-y}
.zone-entry-dialog.party-confirm .zone-entry-footer{flex:0 0 auto;padding-top:6px;border-top:1px solid #59676a66}
.zone-entry-dialog.party-confirm .zone-entry-footer .zone-entry-summary{padding:8px 10px}
.zone-entry-dialog.party-confirm .party-confirm-actions{margin-top:8px}
.zone-entry-dialog.party-confirm .party-confirm-actions button{min-width:0;min-height:46px}
.zone-entry-dialog.party-confirm .zone-entry-party{margin:6px 0}
.zone-entry-dialog.party-confirm .zone-entry-party-member{padding:6px 4px 5px}
.zone-entry-dialog.party-confirm .zone-entry-floor-grid{margin:6px 0}
.zone-entry-formation-preview .party-rows-scene{height:202px}
.zone-entry-formation-preview .party-rows-lane-floor{inset:22px 0 0}
/* When both upper slots are empty, crop only their unused headroom; keep every oval. */
.zone-entry-formation-preview .party-rows-scene:has(.is-rear .is-upper.is-empty):has(.is-front .is-upper.is-empty){height:178px}
.zone-entry-formation-preview .party-rows-scene:has(.is-rear .is-upper.is-empty):has(.is-front .is-upper.is-empty) .party-rows-lane{top:-16px}
.zone-entry-formation-preview .party-rows-scene:has(.is-rear .is-upper.is-empty):has(.is-front .is-upper.is-empty) .party-rows-lane-heading{transform:translateY(24px)}

/* Separate departure foot rings when viewport headroom allows it. */
.zone-entry-formation-preview .party-rows-scene{height:clamp(202px,calc(100dvh - 592px),242px)}
.zone-entry-formation-preview .party-rows-scene:has(.is-rear .is-upper.is-empty):has(.is-front .is-upper.is-empty){height:clamp(178px,calc(100dvh - 616px),218px)}


/* Anchor each character's feet to its own oval; occupied rings use the member's theme. */
.party-rows-scene-slot{--party-rows-foot-y:84px;--party-rows-image-size:82px;--party-rows-foot-inset:6px}
.party-rows-character{position:absolute;top:calc(var(--party-rows-foot-y) - var(--party-rows-image-size) + var(--party-rows-foot-inset));left:0;height:var(--party-rows-image-size)}
.party-rows-character-image{height:var(--party-rows-image-size)}
.party-rows-character-image .actor-image{width:var(--party-rows-image-size);max-width:none;height:var(--party-rows-image-size);object-position:center bottom}
.party-rows-place-target{top:calc(var(--party-rows-foot-y) - 22px)}
.party-rows-scene-slot[class*="party-color-"] .party-rows-place-target.has-character{border:2px solid var(--party-color);background:rgb(var(--party-color-rgb) / 32%);box-shadow:inset 0 0 12px rgb(var(--party-color-rgb) / 18%);color:var(--party-color)}
.party-rows-scene-slot[class*="party-color-"].is-selected .party-rows-place-target.has-character{background:rgb(var(--party-color-rgb) / 44%);box-shadow:inset 0 0 12px rgb(var(--party-color-rgb) / 25%),0 0 0 2px rgb(var(--party-color-rgb) / 28%)}
.party-rows-scene-slot[class*="party-color-"].is-drop-target .party-rows-place-target.has-character{background:rgb(var(--party-color-rgb) / 48%);box-shadow:0 0 0 2px #91e4c5}
.party-rows-scene-slot[class*="party-color-"] .party-rows-grip-symbol{color:var(--party-color)}
