

:root{--purple:#663086;--violet:#522273;--violet2:#321742;--ink:#282134;--muted:#8e8698;--lime:#93cf3c;--bg:#f7f6f9;--white:#fff;--border:#eae6ef;--soft:#f0edf5;--green:#21986e;--amber:#db9a24;--red:#d96977;--shadow:0 10px 36px rgba(44,24,62,.045)}
*{box-sizing:border-box}html,body{margin:0;min-height:100%;font-family:'DM Sans',system-ui,-apple-system,sans-serif;color:var(--ink);background:var(--bg)}body{overflow-x:hidden}button,input,textarea,select{font:inherit}button{cursor:pointer}button:disabled{opacity:.42;cursor:not-allowed}a{color:inherit;text-decoration:none}button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:3px solid #a1d657;outline-offset:2px}svg{flex-shrink:0}h1,h2,h3,p{margin:0}.condensed{font-family:'Barlow Condensed','Arial Narrow',Impact,sans-serif;text-transform:uppercase;letter-spacing:.01em}.hidden{display:none!important}.app{min-height:100vh;display:flex}.sidebar{width:250px;position:fixed;z-index:10;inset:0 auto 0 0;background:#281832;color:#fff;display:flex;flex-direction:column;padding:28px 15px 20px}.brand{display:flex;align-items:center;gap:11px;padding:3px 11px 30px}.brand-mark{height:46px;width:46px;border-radius:13px;background:#fff;display:grid;place-items:center;flex-shrink:0;overflow:hidden}.brand-mark img{width:43px;height:43px;object-fit:contain}.brand-name{font-family:'Barlow Condensed','Liberation Sans Narrow','Arial Narrow',Impact,sans-serif;font-size:26px;font-weight:900;line-height:.86;letter-spacing:.025em}.brand-name span{display:block;color:var(--lime);letter-spacing:.13em;font-size:20px;margin-top:5px}.sidebar-kicker{color:#8e7d9c;font-size:9px;letter-spacing:.17em;font-weight:800;padding:0 15px 10px}.navlink{border:0;text-align:left;background:transparent;color:#c9bdce;border-radius:12px;padding:13px 14px;display:flex;gap:13px;align-items:center;width:100%;font-weight:700;font-size:13px;margin-bottom:4px;transition:.2s}.navlink svg{opacity:.82}.navlink:hover{background:#392448;color:white}.navlink.active{background:var(--lime);color:#203013}.navlink.active svg{opacity:1}.nav-end{margin-top:auto;padding:20px 7px 0}.sidebar-note{background:#382548;border:1px solid #4b345a;padding:15px;border-radius:14px;margin-bottom:14px}.sidebar-note .note-title{display:flex;align-items:center;gap:7px;color:var(--lime);font-weight:800;font-size:11px}.sidebar-note p{font-size:11px;color:#b4a6be;line-height:1.55;margin-top:7px}.account-mini{display:flex;align-items:center;gap:9px;padding:10px 8px;border-top:1px solid #4c3a56}.account-mini strong{font-size:12px;display:block}.account-mini small{font-size:10px;color:#b6a9bf}.account-mini .avatar{width:35px;height:35px;font-size:12px}.main{width:calc(100% - 250px);margin-left:250px;min-height:100vh}.topbar{height:84px;display:flex;align-items:center;justify-content:space-between;gap:15px;padding:0 42px;background:rgba(255,255,255,.8);border-bottom:1px solid #eeeaf1}.crumb{color:#97909d;font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.crumb strong{color:var(--violet)}.top-actions{display:flex;align-items:center;gap:13px}.role-switch{background:#f1edf5;display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #e9e2ed;border-radius:11px;color:var(--violet)}.role-switch select{border:0;background:transparent;color:var(--ink);font-size:12px;font-weight:800;max-width:185px;outline:0;cursor:pointer}.icon-button{border:1px solid var(--border);background:white;width:40px;height:40px;border-radius:12px;display:grid;place-items:center;position:relative;color:var(--violet)}.notification-dot{position:absolute;right:8px;top:7px;width:7px;height:7px;border-radius:50%;background:var(--lime);border:1px solid white}.content{max-width:1560px;margin:auto;padding:34px 42px 70px}.page-head{display:flex;align-items:flex-end;justify-content:space-between;gap:14px;margin-bottom:24px}.eyebrow{color:var(--violet);font-weight:900;font-size:10px;letter-spacing:.16em;text-transform:uppercase;margin-bottom:6px}.page-title{font-family:'Barlow Condensed','Liberation Sans Narrow','Arial Narrow',Impact,sans-serif;font-size:clamp(34px,4.4vw,54px);text-transform:uppercase;font-weight:800;line-height:.95;letter-spacing:.01em}.page-sub{color:#8e8795;font-size:12px;margin-top:9px;line-height:1.6}.actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.btn{border-radius:11px;display:inline-flex;align-items:center;justify-content:center;gap:8px;font-weight:800;font-size:12px;padding:12px 16px;border:1px solid transparent;white-space:nowrap;transition:background .15s,transform .15s}.btn:hover{transform:translateY(-1px)}.btn-primary{background:var(--violet);color:#fff}.btn-primary:hover{background:#733d97}.btn-lime{background:var(--lime);color:#283b1d}.btn-lime:hover{background:#a4df56}.btn-ghost{background:white;border-color:var(--border);color:var(--violet)}.btn-danger{background:#fff0f2;color:#c75164}.btn-sm{padding:8px 11px;font-size:11px;border-radius:9px}.btn-icon{width:36px;padding:8px}.card{background:#fff;border:1px solid var(--border);border-radius:18px;box-shadow:var(--shadow)}.card-pad{padding:23px}.card-title{font-size:15px;font-weight:900}.card-heading{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:20px}.minor-link{color:var(--violet);font-weight:800;font-size:11px;border:0;background:none;display:inline-flex;gap:6px;align-items:center;padding:3px}.hero{min-height:258px;border-radius:20px;padding:34px 38px;color:#fff;background-image:linear-gradient(91deg,rgba(36,15,48,.98) 0%,rgba(53,20,77,.88) 48%,rgba(30,11,44,.20) 100%),url('/assets/ebc02870963dd1b21a.jpg');background-size:cover;background-position:center 48%;position:relative;overflow:hidden;display:flex;align-items:center;margin-bottom:22px}.hero:after{content:'';height:180px;width:180px;border:33px solid rgba(146,207,60,.13);border-radius:50%;position:absolute;right:-56px;bottom:-116px}.hero-content{z-index:1;max-width:620px}.hero .eyebrow{color:var(--lime)}.hero h2{font-family:'Barlow Condensed','Liberation Sans Narrow','Arial Narrow',Impact,sans-serif;text-transform:uppercase;font-weight:900;line-height:.96;font-size:clamp(42px,5vw,65px);letter-spacing:.006em;margin:9px 0 13px}.hero h2 em{font-style:normal;color:var(--lime)}.hero p{font-size:12px;line-height:1.7;max-width:435px;color:#e3dce8}.hero .btn{margin-top:18px}.hero-small{min-height:160px}.hero-small h2{font-size:48px}.stat-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin-bottom:24px}.stat-card{padding:19px 20px;position:relative;overflow:hidden}.stat-label{color:var(--muted);font-size:11px;font-weight:700}.stat-num{font-family:'Barlow Condensed','Liberation Sans Narrow','Arial Narrow',Impact,sans-serif;font-size:42px;line-height:1.1;font-weight:800;margin-top:8px}.stat-foot{font-size:10px;color:#92909a;margin-top:4px}.stat-icon{width:39px;height:39px;border-radius:12px;display:grid;place-items:center;position:absolute;right:17px;top:17px;background:#f4f0f8;color:var(--violet)}.stat-icon.lime{background:#edf8df;color:#6e9d21}.stat-icon.amber{background:#fff5dc;color:#be8b2b}.stat-icon.red{background:#fff0f0;color:#d35d70}.dash-grid{display:grid;grid-template-columns:minmax(0,1.68fr) minmax(280px,1fr);gap:20px}.stack{display:flex;flex-direction:column;gap:20px}.event-list{display:flex;flex-direction:column}.event-row{display:flex;align-items:center;gap:14px;padding:15px 0;border-top:1px solid #f0ecf3}.event-row:first-child{border-top:0;padding-top:0}.date-badge{width:54px;min-width:54px;border-radius:12px;background:#f2eef7;text-align:center;padding:7px 4px;color:var(--violet)}.date-badge strong{display:block;font:800 28px/.95 'Barlow Condensed','Arial Narrow',Impact,sans-serif}.date-badge span{display:block;font-size:9px;text-transform:uppercase;font-weight:900;letter-spacing:.08em;margin-top:4px}.event-info{min-width:0;flex:1}.event-info strong{font-size:13px;font-weight:900;display:block;margin-bottom:5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.event-info span{display:flex;align-items:center;gap:4px;color:#89828e;font-size:11px}.pill{display:inline-flex;gap:5px;align-items:center;border-radius:100px;padding:6px 10px;font-weight:900;font-size:10px;white-space:nowrap}.pill-yes{background:#e6f7ef;color:#198457}.pill-no{background:#fff0f1;color:#cd6170}.pill-maybe{background:#fff5e0;color:#a47a29}.pill-pending{background:#f1eef5;color:#82778a}.posterbox{border-radius:16px;min-height:175px;background:#ede8f0;display:flex;align-items:stretch;gap:13px;overflow:hidden}.posterbox img{height:172px;width:127px;object-fit:cover}.posterbox>div{padding:19px 14px 17px 0;flex:1;min-width:0}.posterbox .poster-tag{font-size:10px;color:var(--purple);font-weight:900;letter-spacing:.13em}.posterbox h3{font:800 27px/.92 'Barlow Condensed','Arial Narrow',Impact,sans-serif;text-transform:uppercase;margin:9px 0;color:#432154}.posterbox p{font-size:11px;color:#74687d;line-height:1.5}.coverage-row{margin-bottom:16px}.coverage-row:last-child{margin-bottom:0}.coverage-label{display:flex;align-items:center;justify-content:space-between;font-size:11px;margin-bottom:8px}.coverage-label strong{font-weight:900}.coverage-label span{font-weight:900;color:var(--violet)}.bar{height:7px;background:#efebf3;border-radius:30px;overflow:hidden}.bar>i{display:block;height:100%;border-radius:30px;background:var(--lime);transition:width .2s}.bar.warn>i{background:#f4b65e}.calendar-header{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:18px}.month-control{display:flex;align-items:center;gap:14px}.month-control strong{font-family:'Barlow Condensed','Liberation Sans Narrow','Arial Narrow',Impact,sans-serif;text-transform:uppercase;font-size:29px;font-weight:800;min-width:185px}.segmented{display:flex;background:#eeeaf3;border:1px solid #e7e2ea;padding:4px;border-radius:11px}.segment{border:0;background:transparent;font-weight:800;font-size:11px;color:#887993;padding:8px 15px;border-radius:8px}.segment.active{background:white;color:var(--violet);box-shadow:0 2px 5px #34203d14}.calendar-month{border:1px solid var(--border);background:#fff;border-radius:17px;overflow:hidden}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);background:#faf9fb;border-bottom:1px solid var(--border)}.weekday{text-align:center;padding:13px 0;font-size:10px;text-transform:uppercase;letter-spacing:.09em;color:#a39ba9;font-weight:900}.cal-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr))}.day{min-height:112px;text-align:left;position:relative;padding:11px 8px;border:0;border-right:1px solid #f0ecf1;border-bottom:1px solid #f0ecf1;background:#fff;min-width:0;overflow:hidden}.day:hover{background:#faf8fc}.day.other{background:#fbfafb}.day.other .day-num{color:#c9c3cd}.day.today .day-num{background:var(--violet);color:#fff;border-radius:100px;display:inline-grid;place-items:center;width:25px;height:25px}.day-num{display:inline-block;color:#55505e;font-size:11px;font-weight:900;min-width:25px;text-align:center;line-height:25px}.cal-chip{display:block;margin-top:7px;background:#f0e8f4;border-left:3px solid var(--purple);border-radius:4px;padding:5px 6px;font-size:9px;font-weight:800;color:var(--violet);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cal-chip.green{background:#eaf5dc;border-color:var(--lime);color:#577e27}.chip-more{font-size:9px;color:#98909f;font-weight:800;padding:3px 2px}.year-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:15px}.mini-month{padding:16px;border:1px solid var(--border);border-radius:15px;background:white;text-align:left;width:100%;transition:.2s}.mini-month:hover{border-color:var(--purple);transform:translateY(-2px)}.mini-name{font-weight:900;font-family:'Barlow Condensed','Liberation Sans Narrow','Arial Narrow',Impact,sans-serif;text-transform:uppercase;font-size:23px;margin-bottom:10px}.mini-week,.mini-days{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;gap:3px}.mini-week span{font-size:9px;color:#aaa1b0;font-weight:900}.mini-days span{font-size:10px;padding:5px 0;border-radius:50%;color:#82798a;position:relative}.mini-days .busy{background:#eee4f4;color:#59267c;font-weight:900}.mini-days .today-mini{box-shadow:inset 0 0 0 2px var(--lime)}.mini-foot{margin-top:10px;font-size:10px;font-weight:800;color:var(--purple)}.day-strip{padding:16px;background:#f6f3f8;border-radius:13px;display:flex;align-items:center;justify-content:space-between;gap:10px}.day-events{display:grid;gap:10px;margin-top:14px}.day-event{border:1px solid var(--border);border-radius:12px;padding:14px;display:flex;align-items:center;gap:14px;justify-content:space-between;background:white}.day-event strong{font-size:13px}.day-event p{color:#8d8394;font-size:11px;margin-top:5px}.detail-grid{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(295px,1fr);gap:20px}.detail-main{display:flex;flex-direction:column;gap:20px}.detail-banner{position:relative;border-radius:18px;overflow:hidden;background-image:linear-gradient(91deg,#341941f5,#572b70c4),url('/assets/ebc02870963dd1b21a.jpg');background-size:cover;background-position:center;min-height:178px;padding:26px;color:white}.detail-banner h2{font:800 41px/.95 'Barlow Condensed','Arial Narrow',Impact,sans-serif;text-transform:uppercase;max-width:650px}.detail-banner .detail-kicker{font-size:10px;color:var(--lime);letter-spacing:.12em;font-weight:900;text-transform:uppercase;margin-bottom:8px}.detail-info-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:11px;margin-top:17px}.detail-fact{background:#ffffff1f;border:1px solid #ffffff2e;border-radius:10px;padding:12px;display:flex;gap:7px;align-items:center;font-size:11px;font-weight:700}.detail-description{color:#77707d;font-size:12px;line-height:1.75}.rsvp-controls{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}.rsvp-option{border:1.5px solid #ece8f0;background:white;border-radius:12px;padding:17px 9px;display:flex;flex-direction:column;align-items:center;gap:8px;color:#706878;font-size:11px;font-weight:900}.rsvp-option svg{width:23px;height:23px}.rsvp-option.selected.yes{border-color:#53b98c;background:#effaf4;color:#138455}.rsvp-option.selected.no{border-color:#e08b98;background:#fff2f3;color:#b84c60}.rsvp-option.selected.maybe{border-color:#e6c174;background:#fff8e7;color:#b17d24}.rsvp-option:disabled{opacity:.6}.callout{padding:12px 14px;background:#f8f6fb;border-radius:11px;font-size:11px;color:#817689;display:flex;align-items:center;gap:9px;line-height:1.5}.callout.lime{background:#f0f9e6;color:#527e27}.form-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}.field{display:flex;flex-direction:column;gap:6px}.field label{font-size:11px;color:#635769;font-weight:900}.input{border:1px solid #e5dfeb;border-radius:10px;padding:12px 13px;background:#fff;width:100%;color:var(--ink);font-size:12px;min-width:0}.input:focus{outline:2px solid #afe279;outline-offset:1px}.field textarea{min-height:86px;resize:vertical}.form-help{font-size:10px;color:#a096a5;line-height:1.6}.member-table{width:100%;border-collapse:collapse}.member-table th{color:#a298aa;font-size:10px;font-weight:900;text-transform:uppercase;letter-spacing:.07em;text-align:left;padding:0 12px 12px;border-bottom:1px solid var(--border)}.member-table td{border-bottom:1px solid #f1edf3;padding:12px;font-size:12px}.member-table tr:last-child td{border-bottom:0}.person{display:flex;align-items:center;gap:10px}.avatar{width:37px;height:37px;display:grid;place-items:center;border-radius:12px;background:#ece4f4;color:var(--violet);font-weight:900;font-size:11px;flex-shrink:0}.avatar.green{background:#eaf6dd;color:#689e29}.avatar.orange{background:#fff2df;color:#b37a27}.avatar.pink{background:#fff0f2;color:#bd6378}.person strong{display:block;font-size:11px;font-weight:900}.person small{display:block;color:#a59dac;font-size:10px;margin-top:3px}.inline-select{border:1px solid #e5dfeb;background:#fff;border-radius:9px;font-weight:800;font-size:11px;padding:9px 7px;max-width:150px;color:var(--violet)}.responsive-table{overflow-x:auto}.filter-pills{display:flex;gap:8px;flex-wrap:wrap}.filter-chip{padding:8px 13px;border-radius:99px;background:#f4f1f6;border:1px solid #eeebf0;color:#8b8192;font-weight:800;font-size:11px}.filter-chip.active{background:#522273;color:white;border-color:#522273}.lineup-board{position:relative;background:radial-gradient(circle at 50% 25%,#fbfdf6,#f5f8ef 78%);border:1px solid #e2e9db;border-radius:18px;min-height:350px;padding:22px 18px;margin-top:10px}.board-top{text-align:center;color:#729343;font-weight:900;font-size:10px;letter-spacing:.13em}.lineup-row{margin-top:21px;position:relative}.lineup-row .board-label{font-size:10px;text-transform:uppercase;letter-spacing:.1em;font-weight:900;color:#677e56;display:flex;justify-content:center;align-items:center;gap:9px}.board-label span{color:#a5b09e;font-weight:800}.player-flow{display:flex;align-items:stretch;flex-wrap:wrap;justify-content:center;gap:10px;margin-top:11px;min-height:82px;padding:5px;border:1px dashed transparent;border-radius:12px}.player-flow.drag-over{border-color:var(--lime);background:#eaf6dc}.player-card{position:relative;text-align:center;background:#fff;border:1.5px solid #dce6d3;border-radius:13px;padding:11px 8px 9px;width:102px;min-height:90px;box-shadow:0 6px 13px #344e1310;display:flex;flex-direction:column;align-items:center;gap:4px;cursor:grab;user-select:none}.player-card:active{cursor:grabbing}.player-card.maybe{border-style:dashed;border-color:#e3b45e;background:#fffcf2;opacity:.84}.player-card.dragging{opacity:.3}.player-card .player-icon{width:29px;height:29px;border-radius:50%;display:grid;place-items:center;background:#f0e8f6;color:var(--purple)}.player-card.maybe .player-icon{background:#fff0cc;color:#ad873f}.player-card .player-name{font-size:10px;font-weight:900;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.player-card small{font-size:9px;color:#928b97}.comment-flag{position:absolute;right:-6px;top:-7px;height:21px;width:21px;border-radius:50%;border:2px solid white;background:var(--lime);color:#2e4216;display:grid;place-items:center}.empty-slot{width:84px;min-height:84px;border:2px dashed #d6e5c6;border-radius:13px;display:grid;place-items:center;color:#a3bd88;font-size:24px}.board-legend{display:flex;gap:18px;justify-content:center;flex-wrap:wrap;margin-top:16px;font-size:10px;font-weight:800;color:#918994}.legend-dot{width:9px;height:9px;border-radius:50%;display:inline-block;margin-right:5px}.legend-dot.yes{background:#71c9a0}.legend-dot.maybe{background:#e5bb6b}.legend-dot.empty{background:#d9dfd2}.board-notice{font-size:10px;color:#958c9f;margin-top:13px;line-height:1.6}.coverage-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}.coverage-tile{padding:15px;border-radius:12px;background:#f8f6fa}.coverage-tile strong{font:800 31px 'Barlow Condensed','Arial Narrow',Impact,sans-serif;color:var(--violet)}.coverage-tile span{display:block;color:#938a9a;font-size:10px;font-weight:800}.noti-item{display:flex;align-items:flex-start;gap:13px;border:1px solid var(--border);padding:15px;border-radius:13px;margin-bottom:10px;background:#fff}.noti-item.unread{border-color:#dfd3e9;background:#fbf8fe}.noti-icon{width:39px;height:39px;border-radius:12px;background:#ede5f4;color:var(--violet);display:grid;place-items:center}.noti-item strong{font-size:12px}.noti-item p{font-size:11px;color:#898090;margin-top:6px;line-height:1.6}.noti-item small{font-size:10px;color:#aaa0af}.profile-hero{display:flex;gap:18px;align-items:center}.profile-hero .avatar{width:78px;height:78px;border-radius:22px;font-size:24px}.profile-hero h2{font-size:22px}.profile-hero p{margin-top:6px;color:#91899a;font-size:11px}.alert-banner{padding:14px;border:1px solid #f4e4bb;background:#fffaee;border-radius:12px;font-size:11px;color:#98762f;line-height:1.6}.empty-state{text-align:center;color:#978f9e;padding:35px 10px}.empty-state svg{margin-bottom:10px;color:#aea3ba}.empty-state h3{color:var(--ink);font-size:15px;margin-bottom:7px}.empty-state p{font-size:11px;line-height:1.6}.modal-backdrop{position:fixed;inset:0;background:rgba(26,14,36,.66);backdrop-filter:blur(4px);z-index:70;display:flex;align-items:center;justify-content:center;padding:18px}.modal{background:#fff;border-radius:19px;width:min(620px,100%);max-height:min(92vh,920px);overflow-y:auto;box-shadow:0 30px 90px #190e2b50}.modal-head{display:flex;justify-content:space-between;align-items:flex-start;padding:23px 25px;border-bottom:1px solid var(--border);gap:12px}.modal-head h2{font:800 33px/.98 'Barlow Condensed','Arial Narrow',Impact,sans-serif;text-transform:uppercase}.modal-body{padding:23px 25px}.modal-foot{padding:17px 25px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:8px}.toast-holder{position:fixed;right:24px;bottom:22px;z-index:99;pointer-events:none}.toast{background:#24172f;color:#fff;border-radius:13px;padding:14px 17px;box-shadow:0 9px 35px #180c2c50;font-size:12px;font-weight:800;display:flex;align-items:center;gap:9px;max-width:350px;animation:pop .18s ease}.toast svg{color:var(--lime)}@keyframes pop{from{transform:translateY(10px);opacity:0}to{transform:none;opacity:1}}.mobile-nav{display:none}.top-logo{display:none}.space-between{display:flex;justify-content:space-between;align-items:center;gap:10px}.gap10{display:flex;align-items:center;gap:10px}.divider{height:1px;background:var(--border);margin:18px 0}.mt12{margin-top:12px}.mt20{margin-top:20px}.mb12{margin-bottom:12px}.nowrap{white-space:nowrap}.mobile-only{display:none}.comment-list{margin-top:15px;display:grid;gap:9px}.comment-item{display:flex;gap:10px;padding:12px;background:#f9f7fb;border-radius:10px}.comment-item p{font-size:11px;line-height:1.6;color:#6f6677}.tiny{font-size:10px;color:#948a9c}.color-success{color:var(--green)}.color-amber{color:var(--amber)}.color-danger{color:var(--red)}
@media(max-width:1130px){.sidebar{width:220px}.main{width:calc(100% - 220px);margin-left:220px}.content{padding:28px 25px 80px}.topbar{padding:0 25px}.stat-grid{grid-template-columns:repeat(2,1fr)}.dash-grid,.detail-grid{grid-template-columns:minmax(0,1fr)}.year-grid{grid-template-columns:repeat(3,1fr)}}
@media(max-width:740px){.sidebar{display:none}.main{margin-left:0;width:100%;padding-bottom:74px}.topbar{height:68px;padding:0 16px}.top-logo{display:flex;align-items:center;gap:7px;color:var(--violet);font:900 21px 'Barlow Condensed','Arial Narrow',Impact,sans-serif}.top-logo img{height:30px;width:30px;object-fit:contain}.crumb{display:none}.top-actions{gap:7px}.role-switch{padding:6px}.role-switch select{max-width:120px;font-size:10px}.role-switch svg{display:none}.icon-button{width:35px;height:35px}.content{padding:22px 15px 35px}.page-head{align-items:flex-start;flex-wrap:wrap;gap:14px}.page-title{font-size:40px}.hero{padding:28px 23px;min-height:265px;background-image:linear-gradient(91deg,rgba(36,15,48,.96),rgba(53,20,77,.77)),url('/assets/ebc02870963dd1b21a.jpg')}.hero h2{font-size:49px}.stat-grid{gap:10px}.stat-card{padding:14px}.stat-num{font-size:34px}.stat-icon{position:static;margin-bottom:12px;width:34px;height:34px}.card-pad{padding:17px}.mobile-nav{position:fixed;z-index:50;bottom:0;left:0;right:0;display:flex;background:#fff;box-shadow:0 -4px 20px #25103516;border-top:1px solid #eee9f0;justify-content:space-around;padding:8px max(8px,env(safe-area-inset-right)) calc(9px + env(safe-area-inset-bottom));gap:1px}.mob-item{border:0;background:none;color:#978c9e;display:flex;flex-direction:column;align-items:center;gap:3px;min-width:44px;flex:1;font-size:9px;font-weight:800;padding:3px}.mob-item.active{color:var(--violet)}.mob-item.active svg{stroke-width:2.5}.year-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.calendar-header{align-items:flex-start}.month-control strong{font-size:25px;min-width:140px}.day{min-height:79px;padding:5px 3px}.day-num{font-size:10px}.cal-chip{font-size:0;width:7px;height:7px;border-radius:99px;border:0;margin:5px 2px 0;display:inline-block;padding:0;vertical-align:top;background:var(--purple)}.cal-chip.green{background:var(--lime)}.chip-more{font-size:8px;padding:1px}.weekday{font-size:9px;padding:10px 0}.detail-info-grid{grid-template-columns:1fr;gap:7px}.detail-banner{padding:22px}.detail-banner h2{font-size:35px}.detail-fact{padding:9px}.rsvp-option{padding:13px 4px;font-size:10px}.form-row{grid-template-columns:1fr}.coverage-grid{grid-template-columns:repeat(2,1fr)}.player-card{width:87px;min-height:80px}.empty-slot{width:70px;min-height:77px}.posterbox img{width:100px}.modal-head,.modal-body{padding:17px}.modal-foot{padding:13px 17px}.responsive-table{overflow-x:auto}.member-table{min-width:650px}.mobile-only{display:block}.toast-holder{right:13px;left:13px;bottom:87px}.toast{max-width:none}.btn{font-size:11px;padding:11px}.month-control{gap:7px}.year-grid .mini-month{padding:10px}.mini-days span{font-size:9px;padding:4px 0}}
@media(max-width:370px){.stat-grid{grid-template-columns:1fr 1fr}.year-grid{grid-template-columns:1fr 1fr}.role-switch select{max-width:90px}.player-card{width:76px}.hero h2{font-size:43px}}

/* Formació contextual: només capità, dins de cada actuació. */
.captain-formation{margin-bottom:25px;display:block;min-width:0}
.captain-formation-head{display:flex;align-items:end;justify-content:space-between;gap:18px;margin:0 0 16px}
.captain-formation-head h2{font:900 33px/1.03 'Barlow Condensed','Arial Narrow',Impact,sans-serif;text-transform:uppercase;color:#392148;margin:7px 0 7px}
.captain-formation-head p{font-size:12px;color:#8c8193;line-height:1.55;max-width:620px}
.captain-private{font-size:10px;letter-spacing:.085em;color:#693389;font-weight:900;display:flex;align-items:center}
.captain-formation-actions{display:flex;flex-wrap:wrap;gap:9px;justify-content:flex-end}
.captain-counts{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:11px;margin-bottom:16px}
.captain-counts>div{background:#fff;border:1px solid var(--border);border-radius:13px;padding:15px 18px;display:flex;flex-direction:column;gap:5px}
.captain-counts strong{font-size:27px;line-height:1;font-weight:900;color:#3a244b}
.captain-counts span{font-size:11px;color:#988da0;font-weight:700}
.captain-counts .caption-alert{background:#fffaf1;border-color:#f2dcad}.captain-counts .caption-alert strong{color:#cc8a1a}
.captain-counts .caption-ok{background:#f6fbef;border-color:#ddedc4}.captain-counts .caption-ok strong{color:#438c41}
.captain-formation-layout{display:grid;grid-template-columns:minmax(0,1.85fr) minmax(290px,.82fr);gap:17px;align-items:start}
.captain-board-wrap{min-width:0;background:#fff;border:1px solid var(--border);border-radius:16px;overflow:hidden}
.stage-top{font-size:10px;letter-spacing:.13em;font-weight:900;text-align:center;color:#fff;background:#532571;padding:12px 10px;display:flex;justify-content:center;gap:8px;align-items:center}
.captain-board{padding:16px;background:linear-gradient(170deg,#fbfcf8 0%,#f7f9f2 60%,#f9f7fb 100%)}
.formation-zone{padding:12px 12px 15px;border-radius:13px;border:1px solid #e6e8df;background:#ffffffbb;margin-bottom:12px;transition:border-color .15s,background .15s;min-width:0}
.formation-zone:last-child{margin-bottom:0}.formation-zone.drag-over,.formation-lane.drag-over,.lane-roster.drag-over{border-color:#91c943;background:#f0f8e5}
.formation-zone-title{display:flex;align-items:baseline;gap:10px;border-bottom:1px solid #e9e9e6;padding-bottom:8px;margin-bottom:8px}
.formation-zone-title>span{font-size:12px;text-transform:uppercase;font-weight:900;color:#542876;letter-spacing:.055em}
.formation-zone-title>small{font-size:10px;color:#908699}
.formation-lane{display:flex;flex-direction:column;min-height:62px;gap:7px;padding:8px;border-radius:9px}
.formation-lane+.formation-lane{border-top:1px dashed #eae5ec}
.lane-info{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:5px;font-size:11px}
.lane-info strong{color:#4f405b;font-size:11px}.lane-info span{color:#998e9f;font-size:10px;font-weight:700}
.lane-info .under{color:#ca8520}.lane-info .covered{color:#539049}
.lane-roster{display:flex;flex-wrap:wrap;align-items:stretch;gap:8px;min-height:65px;min-width:0;border:1px dashed transparent;border-radius:10px;padding:3px;transition:background .15s}
.captain-player{width:99px;min-height:91px;max-width:calc(50% - 7px);padding:10px 6px 7px;border:1.5px solid #cadbb6;border-radius:11px;box-shadow:0 4px 11px #3552170b;background:#fff}
.captain-player .player-name{white-space:normal;font-size:10px;line-height:1.15;max-height:25px;overflow:hidden}.captain-player small{font-size:9px}
.captain-player.maybe{background:#fff9ec;border-color:#d49a31;border-style:dashed;opacity:1}
.captain-player.maybe .player-icon{color:#ac731d;background:#ffefc9}
.player-state{font-size:8px;font-weight:900;letter-spacing:.06em;color:#b17d26;margin-top:auto}
.captain-empty{width:78px;min-height:87px;border:2px dashed #c9cfbc;border-radius:11px;display:flex;flex-direction:column;gap:5px;justify-content:center;align-items:center;color:#9ca58d;background:#fafbf7}
.captain-empty span{font-size:9px;font-weight:800}.captain-more{display:grid;align-items:center;color:#9c819e;font-size:11px;font-weight:800}
.lane-none{font-size:10px;color:#a99fae;padding:13px 6px}
.captain-board-footer{display:flex;gap:16px;justify-content:center;flex-wrap:wrap;padding:15px 14px 8px;font-size:10px;font-weight:750;color:#887c92}
.captain-board-footer span{display:flex;align-items:center;gap:6px}.captain-mobile-help{font-size:10px;line-height:1.6;color:#93899a;padding:8px 18px 17px;display:flex;align-items:flex-start;gap:7px}
.captain-side{display:flex;flex-direction:column;gap:14px;min-width:0}
.captain-side-card{background:#fff;border:1px solid var(--border);border-radius:15px;padding:18px 17px;min-width:0}
.captain-side-head{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:17px}
.captain-side-head strong{font-size:13px;color:#37283e}.captain-side-head .pill{white-space:nowrap}
.captain-hint{font-size:10px;color:#8c8194;background:#f7f5f9;border-radius:10px;padding:11px;line-height:1.65;display:flex;align-items:flex-start;gap:7px}
.captain-small-total{font-size:10px;color:#917b9d;font-weight:800}
.captain-side-help{font-size:10px;color:#96899d;line-height:1.55;margin-top:-7px;margin-bottom:10px}
.captain-roster{max-height:570px;overflow:auto;overscroll-behavior:contain;padding-right:2px}
.captain-roster-person{display:flex;align-items:center;gap:8px;padding:9px 1px;text-align:left;border:0;background:#fff;width:100%;border-bottom:1px solid #f2eef4;min-width:0}
.captain-roster-person:hover{background:#faf8fc}.captain-roster-person .avatar{width:31px;height:31px;flex:none;font-size:9px}
.captain-roster-meta{display:flex;flex-direction:column;gap:4px;min-width:0;flex:1}
.captain-roster-meta strong{font-size:10px;color:#3b3044;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.captain-roster-meta small{font-size:9px;color:#9a8ca0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.captain-roster-person .pill{font-size:9px;padding:5px 7px;white-space:nowrap}
@media(max-width:1150px){.captain-formation-layout{grid-template-columns:minmax(0,1fr)}.captain-side{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}.captain-roster{max-height:350px}}
@media(max-width:740px){.captain-formation-head{display:block}.captain-formation-head h2{font-size:29px}.captain-formation-actions{justify-content:flex-start;margin-top:13px}.captain-counts{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.captain-counts>div{padding:13px}.captain-counts strong{font-size:25px}.captain-board{padding:9px}.formation-zone{padding:9px}.captain-side{grid-template-columns:minmax(0,1fr)}.captain-roster{max-height:330px}.captain-player{width:85px;min-height:88px}.captain-empty{width:72px;min-height:83px}}


.quick-manage-link{display:flex;gap:9px;flex-wrap:wrap;margin:0 0 16px}
/* V3 · Compact full-width captain view and event/member administration. */
.content{max-width:1740px;padding-left:clamp(18px,2.5vw,44px);padding-right:clamp(18px,2.5vw,44px)}
.compact-formation{margin-top:0;margin-bottom:24px}.compact-header{display:flex;align-items:center;justify-content:space-between;gap:15px;margin-bottom:11px;flex-wrap:wrap}
.compact-header h2{font:900 30px/.97 'Barlow Condensed','Arial Narrow',Impact,sans-serif;text-transform:uppercase;color:var(--violet);margin:4px 0}
.compact-header p{font-size:11px;color:#8d8199}.compact-header .eyebrow{display:flex;gap:4px;align-items:center;font-size:9px;margin:0}
.compact-actions{display:flex;align-items:center;gap:7px;flex-wrap:wrap}.compact-count{display:inline-flex;align-items:center;gap:5px;background:#fff;padding:10px 12px;border:1px solid #eee7f2;border-radius:9px;font-size:10px;font-weight:800;white-space:nowrap}.compact-count b{font-size:18px;line-height:1}.status-positive{color:#348451}.status-uncertain{color:#b9801e}.status-missing{color:#bc6742}
.compact-board{border:1px solid #e8e4ec;background:#fff;border-radius:15px;overflow:hidden;box-shadow:var(--shadow)}
.compact-board-bar{background:#532370;color:#fff;font-size:10px;letter-spacing:.105em;font-weight:900;text-transform:uppercase;padding:10px 16px;display:flex;gap:9px;align-items:center}.compact-board-bar span{margin-left:auto;font-size:9px;letter-spacing:0;text-transform:none;opacity:.66;font-weight:600}
.compact-lane{display:grid;grid-template-columns:132px minmax(0,1fr) 100px;align-items:center;min-height:61px;gap:10px;padding:7px 13px;border-bottom:1px solid #eae7ed;transition:background .15s}
.compact-lane:nth-child(odd){background:#fbfafc}.compact-lane:last-of-type{border-bottom:0}.compact-lane.drag-over,.compact-lane-people.drag-over{background:#f0f9e7;outline:1px dashed #91c943;outline-offset:-2px}
.compact-lane-label{display:flex;flex-direction:column;gap:4px;border-right:1px solid #ede8ee;padding-right:8px}.compact-lane-label strong{font:900 18px 'Barlow Condensed','Arial Narrow',Impact,sans-serif;color:#5e2b7b;text-transform:uppercase}.compact-lane-label small{font-size:10px;font-weight:800}.covered{color:#378b55!important}.caution{color:#c08223!important}.compact-lane-people{display:flex;align-items:center;gap:5px;min-width:0;min-height:45px;overflow-x:auto;padding:3px 0;scrollbar-width:thin;scrollbar-color:#ddd2e4 transparent}.compact-lane-help{color:#b48438;font-size:10px;font-weight:750;text-align:right;white-space:nowrap}.compact-empty{font-size:10px;color:#aaa1b0}
.mini-person{height:43px;min-width:101px;max-width:122px;flex:0 0 auto;position:relative;display:flex;align-items:center;gap:5px;border:1px solid #bdd4bd;background:#f5fbf4;border-radius:9px;padding:4px 7px;cursor:grab;text-align:left;color:#3e3842}.mini-person:hover{border-color:#8fb94f;box-shadow:0 2px 10px #284b1622}.mini-person.uncertain{border:1px dashed #dea340;background:#fff8eb}.mini-person.dragging{opacity:.4}.mini-avatar{width:23px;height:23px;flex:0 0 auto;border-radius:7px;display:grid;place-items:center;background:#e0f0d6;color:#2c7242;font-size:9px;font-weight:900}.uncertain .mini-avatar{background:#f9e9ca;color:#a16d1c}.mini-name{font-size:10px;line-height:1.2;font-weight:850;overflow:hidden;text-overflow:ellipsis;max-height:27px}.mini-note{position:absolute;right:-1px;top:-5px;display:grid;place-items:center;background:var(--lime);color:var(--violet);width:17px;height:17px;border-radius:50%;border:1px solid white}.mini-question{position:absolute;bottom:0;right:2px;color:#d69a22;font-size:10px;font-weight:900}.mini-blank{border:1px dashed #cdd3c8;background:#f7f8f5;border-radius:8px;min-width:34px;height:39px;display:grid;place-items:center;color:#abb4a3;flex-shrink:0}.mini-overflow{font-size:10px;color:#b0a6b4}
.compact-board-foot{background:#fdfcfe;border-top:1px solid #eee9f0;display:flex;align-items:center;gap:15px;flex-wrap:wrap;padding:9px 15px;font-size:10px;font-weight:750;color:#867d90}.compact-board-foot>span{display:flex;align-items:center;gap:5px}.compact-board-foot small{margin-left:auto;display:flex;align-items:center;gap:4px;font-size:9px}
.status-lists{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:12px}.status-list-card{border:1px solid #e8e3eb;border-radius:12px;background:#fff;overflow:hidden;min-width:0}.status-list-title{display:flex;align-items:center;justify-content:space-between;padding:11px 13px;background:#faf9fb;border-bottom:1px solid #efeaf1}.status-list-title strong{display:flex;align-items:center;gap:7px;font-size:12px;color:#5c3b70}.status-list-title span{font-size:11px;font-weight:900;color:#856b95;background:#f0e9f4;padding:4px 8px;border-radius:30px}.status-list-body{max-height:210px;overflow:auto}.pending-person{display:flex;align-items:center;gap:7px;padding:8px 11px;border-bottom:1px solid #f1eef2}.pending-person:last-child{border-bottom:0}.mini-id{width:27px;height:27px;flex:none;border-radius:9px;background:#eee6f3;color:#67358a;display:grid;place-items:center;font-size:9px;font-weight:900}.pending-person-name{min-width:0;flex:1;display:flex;flex-direction:column;gap:2px}.pending-person-name strong{font-size:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pending-person-name small{font-size:9px;color:#98909f}.small-status{font-size:10px;background:#fff;border:1px solid #e7e0eb;border-radius:7px;padding:7px 3px;max-width:110px;width:95px}.note-link{padding:3px;background:#eff9d9;border:0;border-radius:6px;display:flex;color:#6b8b22}.no-items{padding:16px;color:#9b90a1;font-size:11px}.board-under-actions{background:white;padding:10px 12px 0}.board-under-actions .full-list-collapse{margin-top:12px;padding:10px;border:1px solid #eee8f1;border-radius:10px}
.management-summary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-bottom:23px}.management-summary>div{border:1px solid var(--border);background:#fff;border-radius:12px;padding:16px 18px;display:flex;align-items:center;gap:12px}.management-summary strong{font-size:28px;color:var(--violet)}.management-summary span{font-size:12px;color:#94899c;font-weight:700}.managelist-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:13px}.managelist-header h2{font-size:16px}.managelist-header span{font-size:11px;color:#968b9d}.manage-event-list{display:flex;flex-direction:column;gap:12px}.event-manage-card{display:grid;grid-template-columns:minmax(0,.9fr) minmax(320px,1.1fr);gap:17px;border:1px solid #e8e3ed;border-radius:15px;background:#fff;padding:16px;align-items:center}.event-manage-info{display:flex;align-items:flex-start;gap:13px;min-width:0}.event-manage-date{display:flex;flex-direction:column;align-items:center;gap:8px;flex:0 0 auto}.event-manage-date>.date-badge{min-width:51px}.event-manage-date>span{font-size:9px;color:#907b97;font-weight:800}.event-manage-detail{min-width:0;flex:1}.event-manage-detail h3{font-size:16px;margin:6px 0;font-weight:900}.event-manage-detail p{font-size:11px;color:#9990a0;display:flex;align-items:center;gap:4px}.event-manage-stats{display:flex;gap:12px;flex-wrap:wrap;font-size:10px;font-weight:800;margin-top:11px;color:#918599}.event-manage-buttons{display:flex;gap:7px;margin-top:13px;flex-wrap:wrap}.flag-warn,.flag-ok{display:inline-flex;font-size:9px;font-weight:900;border-radius:16px;padding:5px 8px}.flag-warn{background:#fff3e3;color:#ad6e17}.flag-ok{background:#ecf8e8;color:#428c41}.event-manage-mini{border:1px solid #eee9f0;border-radius:12px;padding:10px 12px;background:#fcfbfd}.mini-map-head{display:flex;justify-content:space-between;align-items:center;font-size:11px;margin-bottom:8px}.mini-map-head span{font-size:10px;font-weight:850}.event-mini-map{display:flex;flex-direction:column;gap:5px}.event-mini-lane{display:grid;grid-template-columns:66px minmax(0,1fr) 36px;align-items:center;gap:6px}.event-mini-label{font-size:9px;font-weight:800;color:#673780}.event-mini-dots{display:flex;gap:3px;align-items:center;min-height:10px;flex-wrap:wrap}.map-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.map-dot.yes{background:#68b98a}.map-dot.maybe{background:#e9b85a}.map-dot.lacking{border:1px dashed #acb7a6;background:#e8ebe6}.event-mini-dots b{font-size:8px;color:#7b6985}.event-mini-lane small{font-weight:850;font-size:9px;text-align:right}.member-row-actions{display:flex;gap:5px;flex-wrap:wrap}
@media(max-width:1150px){.event-manage-card{grid-template-columns:minmax(0,1fr)}.compact-lane{grid-template-columns:108px minmax(0,1fr) 75px}.compact-lane-label strong{font-size:16px}.status-lists{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:740px){.content{padding:20px 13px 88px}.compact-header h2{font-size:27px}.compact-count{padding:7px 8px;font-size:9px}.compact-count b{font-size:15px}.compact-board-bar{padding:9px 10px;font-size:9px}.compact-board-bar span{display:none}.compact-lane{grid-template-columns:75px minmax(0,1fr);padding:5px 8px;gap:7px;min-height:56px}.compact-lane-help{display:none}.compact-lane-label strong{font-size:15px}.compact-lane-label small{font-size:9px}.mini-person{min-width:86px;max-width:95px;height:39px}.mini-name{font-size:9px}.mini-avatar{height:21px;width:21px}.mini-blank{height:34px;min-width:27px}.compact-board-foot small{margin-left:0}.status-lists{grid-template-columns:1fr}.status-list-body{max-height:175px}.event-manage-card{padding:12px;gap:12px}.management-summary{gap:6px}.management-summary>div{padding:9px;display:block}.management-summary strong{display:block;font-size:21px}.management-summary span{font-size:9px}.event-mini-lane{grid-template-columns:55px minmax(0,1fr) 32px}.small-status{width:110px;max-width:120px}.topbar .role-switch{max-width:170px}}


/* --- ORIS Xàldiga V4 — formació horitzontal i estadístiques --- */
.v4-formation{margin:10px 0 24px}
.parade-board{border:1px solid #e6dfeb;background:#fff;border-radius:17px;overflow:hidden;box-shadow:0 12px 36px #3c1e4e0a}
.parade-heading{background:#542573;color:white;padding:12px 18px;display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:11px;letter-spacing:.055em}
.parade-heading>div{display:flex;align-items:center;gap:11px}.parade-heading b{font-weight:900}.parade-heading small{font-size:10px;color:#dfc8eb;letter-spacing:0;font-weight:500}.parade-heading>span{font-size:10px;color:#dfc8eb;letter-spacing:0}
.parade-scroll{overflow-x:auto;scrollbar-width:thin;scrollbar-color:#dbccdf transparent}
.parade-columns{display:grid;grid-template-columns:repeat(5,minmax(174px,1fr));align-items:stretch;min-width:900px;min-height:325px}
.parade-column{display:flex;flex-direction:column;min-width:0;border-right:1px solid #ece5ef;padding:12px 9px 11px;transition:background .15s}
.parade-column:last-child{border-right:0}.parade-column:nth-child(even){background:#fcfafc}.parade-column.drag-over,.parade-people.drag-over{background:#eef9e9;outline:1px dashed #9ad050;outline-offset:-1px}
.parade-col-head{display:flex;align-items:center;justify-content:space-between;gap:3px;padding:3px 0 10px;border-bottom:1px solid #eee9f1}
.parade-col-head strong{font:900 22px/1 'Barlow Condensed',Impact,'Arial Narrow',sans-serif;text-transform:uppercase;color:#532573}
.parade-col-head small{display:block;font-size:8px;letter-spacing:.025em;color:#938a9c;margin-top:5px;font-weight:750}
.parade-mark{font-size:13px;font-weight:900;background:#e9f7e4;color:#348c57;display:grid;place-items:center;min-width:25px;height:25px;border-radius:7px}.parade-mark.needs{background:#fff1e3;color:#bd752b}
.parade-people{flex:1;align-content:start;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;padding:10px 0 12px;min-height:168px}
.parade-tile{display:flex;align-items:center;gap:4px;position:relative;padding:5px 5px;min-width:0;height:46px;border:1px solid #b9d6b9;background:#f3fbf3;border-radius:9px;text-align:left;cursor:grab;color:#35303a}
.parade-tile.is-maybe{background:#fff8ee;border:1px dashed #dbaa44}.parade-tile:hover{box-shadow:0 2px 9px #603b7c22;border-color:#8fce43}
.parade-avatar{flex-shrink:0;width:21px;height:24px;display:grid;place-items:center;background:#e0f0d8;color:#397c49;border-radius:6px;font-weight:900;font-size:9px}
.is-maybe .parade-avatar{background:#fae9ca;color:#a97c2b}.parade-tile-name{font-size:9px;line-height:1.15;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word;font-weight:800}
.parade-comment{position:absolute;right:-3px;top:-8px;background:var(--lime);border:1px solid #fff;color:#4e2769;display:grid;place-items:center;border-radius:10px;width:22px;height:22px;cursor:pointer;z-index:2}
.parade-unknown{position:absolute;right:1px;bottom:0;color:#ca942d;font-size:12px}.parade-gap{height:46px;display:grid;place-items:center;background:#f5f6f3;border:1px dashed #bec8bc;color:#a9b3a5;border-radius:8px}
.parade-nope{grid-column:1/-1;font-size:10px;color:#aaa1af}.parade-col-footer{font-size:10px;color:#786c81;border-top:1px solid #eee9f1;padding-top:9px;font-weight:800}
.parade-legend{display:flex;gap:18px;align-items:center;flex-wrap:wrap;padding:11px 15px;background:#faf8fb;border-top:1px solid #eee7f0;color:#8a8093;font-size:10px;font-weight:800}
.parade-legend span{display:flex;gap:6px;align-items:center}.parade-legend small{margin-left:auto;display:flex;align-items:center;gap:5px}
.v4-lists{margin-top:14px}.v4-lists .status-list-title strong{width:100%;justify-content:space-between}.v4-lists .status-list-title strong>svg{margin-right:4px}.v4-lists .status-list-title span{margin-left:auto}
.insight-cover{min-height:165px;border-radius:17px;position:relative;overflow:hidden;background:#302041 url('/assets/ea5da02f2671fe6606.jpg') center 43% /cover no-repeat;margin-bottom:14px}
.insight-cover:before{content:'';position:absolute;inset:0;background:linear-gradient(90deg,#301547ed 0%,#371552bb 47%,#2c203820 100%)}
.insight-cover-content{position:relative;color:#fff;padding:21px 29px}.insight-cover-content span{font-size:9px;letter-spacing:.16em;font-weight:900;color:#b4e371}.insight-cover-content h2{font:900 32px/.97 'Barlow Condensed',Impact,'Arial Narrow',sans-serif;text-transform:uppercase;margin:8px 0 9px}.insight-cover-content h2 em{font-style:normal;color:#b2e469}.insight-cover-content p{max-width:390px;font-size:10px;color:#e6dfea}
.insight-kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-bottom:13px}.insight-kpi{border:1px solid #e9e3ee;border-radius:13px;background:#fff;padding:15px 17px;display:flex;flex-direction:column;gap:6px}.insight-kpi>span{font-size:10px;color:#8b8094;display:flex;align-items:center;gap:6px;font-weight:800}.insight-kpi>strong{font:900 33px 'Barlow Condensed',Impact,'Arial Narrow',sans-serif;color:#602c7b}.insight-kpi>small{font-size:10px;color:#afa3b4}
.insight-explain{border:1px solid #e4deea;border-radius:10px;background:#f3eff7;padding:12px 15px;color:#665775;font-size:11px;line-height:1.6;margin-bottom:19px}.insight-explain svg{vertical-align:middle;margin-right:7px}
.insight-toolbar{display:flex;justify-content:space-between;align-items:end;gap:18px;flex-wrap:wrap;margin:16px 0}.insight-toolbar h2{font:900 25px 'Barlow Condensed',Impact,'Arial Narrow',sans-serif;text-transform:uppercase;color:#5a2776}.insight-toolbar p{font-size:11px;color:#988b9f;margin-top:3px}.insight-filters{display:flex;align-items:center;gap:7px;flex-wrap:wrap}.insight-filters>.input{width:auto;max-width:190px;font-size:11px;padding:9px 11px}
.insight-people{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.insight-person{padding:16px;background:#fff;border:1px solid #e9e3ed;border-radius:13px;text-align:left;cursor:pointer;display:flex;flex-direction:column;min-width:0;transition:box-shadow .2s,border-color .2s}.insight-person:hover{box-shadow:0 7px 20px #44245c13;border-color:#cbb1da}
.ip-top{display:flex;align-items:center;gap:10px}.ip-name{min-width:0;flex:1}.ip-name strong{display:block;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ip-name small{font-size:10px;color:#92869c}.ip-score{display:flex;flex-direction:column;text-align:right;color:#6c387f}.ip-score strong{font:900 29px/1 'Barlow Condensed',Impact,'Arial Narrow',sans-serif}.ip-score span{font-size:9px;color:#9c90a4}.ip-score.good{color:#358c54}.ip-score.low{color:#c68130}.ip-label{font-size:10px;font-weight:800;color:#8f8597;margin:8px 0}.person-stack{width:100%;height:9px;border-radius:6px;background:#eee9f1;display:flex;overflow:hidden}.person-stack i{display:block;height:100%}.ip-metrics{display:grid;grid-template-columns:repeat(4,1fr);margin:13px 0 10px;gap:4px}.ip-metrics>div{text-align:center;display:flex;flex-direction:column;gap:3px}.ip-metrics b{font-size:15px;color:#392844}.ip-metrics span{font-size:9px;color:#948b9d}.ip-foot{display:flex;justify-content:flex-end;align-items:center;gap:4px;border-top:1px solid #f0ecf3;padding-top:10px;font-size:10px;font-weight:800;color:#673586;margin-top:auto}
.capacity-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px}.capacity-box{border:1px solid #ede6f0;border-radius:9px;padding:12px}.capacity-box>div:first-child{display:flex;justify-content:space-between;gap:5px;font-size:11px;color:#6c4085}.capacity-box .bar{margin-top:10px;height:7px}
.insight-modal-intro{display:flex;align-items:center;gap:10px}.insight-modal-intro>div:nth-child(2){flex:1}.insight-modal-intro strong{display:block}.insight-modal-intro small{display:block;font-size:10px;color:#92859a;margin-top:3px}.insight-modal-intro>b{font:900 30px 'Barlow Condensed',Impact,sans-serif;color:#5e287a}.insight-modal-intro>b small{display:inline;font:700 11px system-ui}
.history-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin:16px 0}.history-stats>div{background:#f6f3f8;border-radius:8px;padding:10px 5px;text-align:center;display:flex;flex-direction:column;gap:3px}.history-stats b{font-size:18px;color:#61327d}.history-stats span{font-size:9px;color:#8b7a95}.history-title{color:#5e267a;margin:19px 0 11px;font-size:15px}.history-lines{max-height:270px;overflow:auto}.history-line{display:grid;grid-template-columns:58px minmax(0,1fr) 95px;gap:6px;align-items:center;border-bottom:1px solid #eee7f2;padding:9px 0}.history-line strong{font-size:11px;display:block}.history-line small{font-size:10px;display:block;color:#9d8ea3;margin-top:3px}.history-date{font-size:10px;color:#957ca1;font-weight:800}.history-att{font-size:9px;color:#a398ad;text-align:right}.history-att.ok{color:#37864f;font-weight:850}.history-att.no{color:#be6b47;font-weight:850}
.actual-attendance{margin:0 0 16px}.actual-attendance .card-heading{align-items:start}.actual-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px}.actual-person{display:flex;gap:7px;align-items:center;padding:7px;border:1px solid #ede7f2;border-radius:8px;min-width:0}.actual-person .avatar{width:28px;height:28px;font-size:9px;flex-shrink:0}.actual-person-name{flex:1;min-width:0}.actual-person-name strong{font-size:10px;display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.actual-person-name small{font-size:9px;color:#94849c}.actual-person .inline-select{font-size:10px;max-width:124px}
@media(max-width:1180px){.parade-columns{min-width:980px}.insight-people{grid-template-columns:repeat(2,minmax(0,1fr))}.actual-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:750px){.parade-columns{min-width:900px}.parade-heading{padding:10px 12px}.parade-heading small,.parade-heading>span{display:none}.parade-scroll{position:relative}.parade-legend{gap:10px}.parade-legend small{margin-left:0}.insight-cover{min-height:154px}.insight-cover-content{padding:19px}.insight-cover-content h2{font-size:27px}.insight-kpis{grid-template-columns:repeat(2,minmax(0,1fr));gap:7px}.insight-kpi{padding:11px}.insight-kpi>strong{font-size:28px}.insight-people{grid-template-columns:1fr}.insight-filters{width:100%}.insight-filters>.input{flex:1;max-width:none;min-width:105px}.capacity-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.actual-grid{grid-template-columns:1fr}.history-line{grid-template-columns:48px minmax(0,1fr) 81px}}


@media(min-width:751px){.mobile-menu-sheet{display:none!important}.parade-mobile-hint{display:none}}
.parade-mobile-hint{display:none}
.mobile-menu-sheet{display:none}
@media(max-width:750px){.parade-mobile-hint{display:flex;align-items:center;gap:5px;color:#805792;background:#faf5fc;font-size:10px;padding:7px 11px;font-weight:800}.mobile-menu-sheet:not(.hidden){display:grid;position:fixed;z-index:75;bottom:65px;left:12px;right:12px;max-height:65vh;overflow:auto;background:white;border:1px solid #e6dcea;border-radius:15px;box-shadow:0 12px 48px #2f1b3f40;padding:12px;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.mobile-sheet-title{grid-column:1/-1;color:#6b377f;font-weight:900;font-size:12px;margin-bottom:3px}.mobile-menu-sheet button{background:#faf8fb;border:1px solid #e8e2ee;border-radius:10px;text-align:left;padding:13px 9px;color:#5c3b71;font-weight:800;font-size:11px;display:flex;align-items:center;gap:8px}}

/* ORIS V5 · MANTENIMENT I INVENTARI */
.maint-intro{border-radius:17px;padding:22px 24px;margin-bottom:20px;background:linear-gradient(115deg,#522273,#713b91);color:#fff;display:flex;align-items:center;justify-content:space-between;gap:15px;flex-wrap:wrap}
.maint-intro strong{display:block;font:800 29px 'Barlow Condensed',Impact,sans-serif;letter-spacing:.025em;text-transform:uppercase}.maint-intro p{margin-top:6px;color:#e0d6e7;font-size:12px;line-height:1.5;max-width:680px}.maint-intro .btn{background:#98d14a;color:#243012}
.maint-tabs{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 20px}.maint-tab{border:1px solid #e4ddeb;background:#fff;border-radius:12px;padding:11px 17px;color:#746780;font-size:12px;font-weight:800;display:flex;align-items:center;gap:8px}.maint-tab.active{background:#efe6f5;color:#522273;border-color:#b79bce}.maint-tab .pill-count{font-size:10px;background:#f4f0f8;padding:3px 6px;border-radius:999px}
.maint-stats{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px;margin-bottom:18px}.maint-kpi{border:1px solid var(--border);background:#fff;border-radius:15px;padding:16px 15px;min-width:0}.maint-kpi strong{font-size:27px;font-weight:900;color:#522273;display:block;line-height:1.1}.maint-kpi span{font-size:10px;color:#8f8499;font-weight:800;display:block;margin-top:5px}.maint-kpi.good strong{color:#278652}.maint-kpi.warn strong{color:#b77c13}.maint-kpi.bad strong{color:#b75461}
.maint-panel{background:white;border:1px solid var(--border);border-radius:17px;padding:18px 18px 8px;margin-bottom:19px}.maint-panel-head{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;margin-bottom:15px}.maint-panel h3{font-size:15px;color:#4b295f;font-weight:900}.maint-panel p{color:#958b9e;font-size:11px;line-height:1.5;margin-top:5px}.maint-controls{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.maint-controls .input{min-height:39px;font-size:12px;padding:8px 10px;min-width:130px}
.maint-scroll{overflow:auto;max-width:100%;border-radius:11px;border:1px solid #eee9f1}.maint-table{width:100%;border-collapse:collapse;min-width:850px;text-align:left}.maint-table th{font-size:10px;letter-spacing:.07em;text-transform:uppercase;color:#96889f;padding:11px 12px;background:#f9f7fa;border-bottom:1px solid #ede8ef;white-space:nowrap}.maint-table td{padding:11px 12px;font-size:12px;border-bottom:1px solid #f0ebf3;color:#50465a;vertical-align:middle}.maint-table tr:last-child td{border-bottom:0}.maint-table tr:hover td{background:#fbf9fd}.maint-table .code{font-weight:900;color:#522273;font-size:12px;white-space:nowrap}.maint-table select{max-width:185px;font-size:11px;font-weight:800;border-radius:8px;padding:7px;background:#fff;border:1px solid #e4dfeb;color:#3d3450}.maint-table .note-preview{max-width:245px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#82778d}.maint-table .note-preview.empty{color:#c1b8ca;font-style:italic}.maint-pill{display:inline-flex;align-items:center;gap:5px;font-weight:900;font-size:10px;padding:6px 8px;border-radius:999px;white-space:nowrap}.maint-pill.ok{background:#e9f7ec;color:#29804a}.maint-pill.repair{background:#fff3df;color:#a87919}.maint-pill.retired{background:#feecee;color:#ad4356}.maint-pill.neutral{background:#f2edf6;color:#724887}
.maint-actions{display:flex;gap:5px}.maint-actions button{border:1px solid #e9dfee;background:#faf8fc;padding:7px;color:#5d3478;border-radius:8px}.maint-actions button:hover{background:#f0e4f7}.maint-inventory-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px;margin:16px 0 24px}.maint-instrument{background:#fff;border:1px solid var(--border);border-radius:15px;padding:16px}.maint-instrument h4{font:850 24px 'Barlow Condensed',Impact,sans-serif;color:#51246c;text-transform:uppercase}.maint-instrument .asset-big{font-size:29px;font-weight:900;color:#2f813f;line-height:1.2}.maint-instrument p{font-size:11px;color:#91869a;line-height:1.55;margin:0}.maint-progress{height:7px;background:#f1ecf3;border-radius:7px;overflow:hidden;margin:12px 0}.maint-progress span{display:block;height:100%;background:#93cf3c;border-radius:7px}.maint-demo-hint{font-size:11px;color:#8f8398;padding:12px 15px;background:#f8f5fa;border:1px dashed #e6dfed;border-radius:11px;margin:13px 0}.maint-empty{padding:28px;text-align:center;color:#9a90a4;font-size:12px}
@media(max-width:1130px){.maint-stats{grid-template-columns:repeat(3,minmax(0,1fr))}.maint-inventory-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:740px){.maint-intro{padding:19px}.maint-stats{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.maint-kpi{padding:13px}.maint-kpi strong{font-size:23px}.maint-panel{padding:13px 11px}.maint-controls,.maint-controls .input{width:100%}.maint-inventory-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.maint-intro strong{font-size:26px}.maint-tab{padding:9px 11px}}


.eco-tabs{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:22px}.eco-tabs .btn{padding:11px 13px}.eco-filters{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:18px}.eco-kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin:18px 0}.eco-number{font-size:clamp(20px,2.5vw,30px);font-weight:900;color:var(--violet);margin-top:10px;overflow-wrap:anywhere}.eco-kpis .stat-foot{line-height:1.6}.eco-chart-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px}.eco-chart-grid>section{min-width:0}.eco-chart{display:flex;gap:10px;overflow-x:auto;align-items:flex-start;padding:15px 0;min-height:220px}.eco-month{flex:1;min-width:42px;text-align:center;font-size:11px}.eco-bars{height:135px;display:flex;justify-content:center;gap:3px;align-items:flex-end;border-bottom:1px solid #ddd}.eco-bars>div{width:13px;border-radius:4px 4px 0 0;min-width:8px}.eco-month b{display:block;margin:9px 0 5px;color:var(--violet)}.eco-month small{font-size:9px;line-height:1.7;color:#7c7284}.eco-chart-legend{display:flex;gap:15px;font-size:11px;margin-top:15px}.eco-chart-legend span{display:flex;align-items:center;gap:5px}.eco-chart-legend i{width:10px;height:10px;border-radius:3px}.eco-wide{max-width:1040px!important;width:calc(100vw - 40px)}.eco-client-info{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:18px}.eco-client-info small{display:block;color:var(--muted);font-size:11px;margin-bottom:6px}.eco-client-info strong{display:block;font-size:13px;overflow-wrap:anywhere}.eco-client-info p{font-size:12px;color:var(--muted);margin:7px 0}.eco-small{display:block;margin-top:5px;color:var(--muted);font-size:11px}.eco-quote-head{display:flex;align-items:center;justify-content:space-between;gap:12px}.eco-quote-head h2{font-size:24px}.eco-warning{background:#fff6e1;color:#84621f;border:1px solid #f1dfac;border-radius:12px;padding:15px;font-size:12px;line-height:1.6;margin:15px 0}.eco-warning ul{padding-left:20px}.eco-warning p{margin-top:7px}.eco-totals{max-width:480px;margin-left:auto;background:#f7f4fa;border-radius:14px;padding:18px;font-size:12px}.eco-totals>div{display:flex;align-items:center;justify-content:space-between;gap:15px;padding:7px 0}.eco-totals>div b{white-space:nowrap}.eco-total-final{border-top:1px solid #d8c9e5;margin-top:7px;color:var(--violet);font-size:19px}.eco-rate-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.eco-rate-grid .field+.field{margin-top:10px}#eco-rates-form fieldset{border:0;padding:0;min-width:0}#eco-rates-form textarea{margin-bottom:15px}.eco-check{display:flex;align-items:flex-start;gap:10px;font-size:12px;line-height:1.6}.eco-check input{accent-color:var(--purple);width:18px;height:18px}.eco-line .card-heading{margin-bottom:12px}.eco-line{background:#fbfafc}.eco-live-total{border-top:1px solid var(--border);padding-top:15px}.modal-foot{flex-wrap:wrap}.modal-body{overflow-x:hidden}#eco-offer{background:#e8e5eb;padding:18px;overflow:auto}.eco-offer-page{background:#fff;color:#282134;padding:35px;max-width:800px;margin:0 auto 25px;font:12px/1.6 system-ui,sans-serif}.eco-offer-page p{margin:6px 0;overflow-wrap:anywhere}.eco-offer-page h3{font-size:12px;color:#663086;margin:16px 0 7px}.eco-offer-page h1{font-size:29px;color:#663086;line-height:1.2}.eco-offer-brand{display:flex;gap:20px;align-items:center;border-bottom:4px solid #93cf3c;padding-bottom:18px}.eco-offer-brand img{width:74px;height:74px;object-fit:contain}.eco-offer-brand h2{color:#663086;margin:0;font-size:22px}.eco-offer-brand p{font-size:10px;line-height:1.4;margin:3px 0}.eco-offer-title{display:flex;justify-content:space-between;align-items:center;gap:15px;margin:22px 0}.eco-offer-title p{font-size:10px}.eco-offer-parties{display:grid;grid-template-columns:1fr 1fr;gap:25px;margin-bottom:25px}.eco-offer-table{width:100%;border-collapse:collapse;font-size:11px}.eco-offer-table th{background:#663086;color:#fff;text-align:left;padding:9px}.eco-offer-table td{border-bottom:1px solid #eae6ef;padding:10px;vertical-align:top}.eco-offer-table td:last-child{text-align:right;white-space:nowrap}.eco-offer-breakdown{margin-top:18px}.eco-offer-page .eco-totals{background:#f6f3f8;max-width:330px}.eco-offer-page .eco-total-final{font-size:19px}.eco-signatures{display:grid;grid-template-columns:1fr 1fr;gap:25px;margin:25px 0 35px;padding-top:15px;border-top:1px solid #eae6ef}.eco-signatures p{min-height:25px}.eco-conditions section{break-inside:avoid}.eco-conditions p{font-size:12px}.eco-offer-foot{border-top:2px solid #93cf3c;padding-top:10px;margin-top:25px!important}.eco-print{margin:0;font-family:system-ui,sans-serif}.eco-print .eco-offer-page{max-width:none;margin:0;padding:0}.eco-print .eco-conditions{break-before:page}.eco-print .eco-totals{padding:12px}.eco-print .eco-totals>div{padding:4px 0}.eco-print .eco-conditions section h3{margin-top:12px}.eco-print .eco-conditions p{font-size:12px;line-height:1.5}@page{size:A4;margin:16mm}@media print{body{background:white!important}.eco-offer-page{box-shadow:none}.eco-offer-brand img{print-color-adjust:exact}.eco-offer-table th,.eco-totals,.eco-warning{-webkit-print-color-adjust:exact;print-color-adjust:exact}.eco-signatures{break-inside:avoid}.eco-offer-table tr{break-inside:avoid}.eco-conditions{break-before:page}}@media(max-width:1100px){.eco-kpis{grid-template-columns:repeat(2,minmax(0,1fr))}.eco-chart-grid{grid-template-columns:1fr}.sidebar{overflow-y:auto}.sidebar .navlink{padding-top:10px;padding-bottom:10px}.sidebar .brand{padding-bottom:18px}.sidebar .sidebar-note{display:none}}@media(max-width:600px){.eco-kpis{gap:8px}.eco-kpis .stat-card{padding:14px}.eco-tabs{flex-wrap:nowrap;overflow-x:auto;padding-bottom:7px}.eco-tabs .btn{flex-shrink:0}.eco-filters{grid-template-columns:repeat(2,minmax(0,1fr));padding:14px}.eco-rate-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.eco-wide{width:calc(100vw - 16px)}.eco-quote-head{display:block}.eco-quote-head .pill{margin-top:10px}#eco-offer{padding:8px}.eco-offer-page{padding:18px;min-width:560px}.eco-kpis .stat-label{font-size:10px}.eco-client-info{grid-template-columns:1fr 1fr}.eco-offer-title{align-items:flex-start}}
/* V6.1: compact editor, focused clients, editorial statistics */
[hidden]{display:none!important}.modal{display:flex;flex-direction:column;max-height:calc(100dvh - 36px);overflow:hidden}.modal-head{flex-shrink:0;padding:18px 22px;align-items:center}.modal-head h2{font-size:24px!important;line-height:1.2;margin:0}.modal-head .eyebrow{font-size:9px}.modal-body{min-height:0;flex:1 1 auto;overflow:auto;padding:20px 22px;overscroll-behavior:contain}.modal-foot{flex-shrink:0;padding:13px 22px;background:#fff}.modal-head .icon-button{width:34px;height:34px}.eco-editor-modal{width:min(1180px,calc(100vw - 36px));max-width:none!important;max-height:min(92dvh,880px)}.eco-editor-modal .modal-head{background:#fff}.eco-editor-steps{display:flex;gap:8px;padding:12px 22px;border-bottom:1px solid var(--border);flex-shrink:0;background:#fcfbfd}.eco-editor-steps button{display:flex;align-items:center;justify-content:center;gap:8px;flex:1;border:1px solid transparent;background:transparent;padding:9px 12px;color:#8b7a94;font-size:12px;font-weight:800;border-radius:9px}.eco-editor-steps button b{display:grid;place-items:center;background:#eee8f2;color:#8d7c96;width:23px;height:23px;border-radius:50%;font-size:10px}.eco-editor-steps button.active{background:#efe7f5;color:#5a2679;border-color:#e5d8ed}.eco-editor-steps button.active b{background:#663086;color:white}.eco-quote-layout{display:grid;grid-template-columns:minmax(0,1fr) 290px;gap:24px;align-items:start}.eco-editor-main{min-width:0}.eco-editor-aside{position:sticky;top:0;border-left:1px solid var(--border);padding-left:20px}.eco-editor-aside>.eyebrow{font-size:9px;margin:3px 0 14px}.eco-editor-aside .eco-totals{padding:14px;font-size:11px;border-radius:10px}.eco-editor-aside .eco-totals>div{padding:6px 0}.eco-editor-aside .eco-total-final{font-size:20px}.eco-editor-checklist{margin-top:16px;font-size:11px;color:#8a7a95;line-height:1.5}.eco-editor-checklist strong{display:block;color:#594264;margin-bottom:7px}.eco-editor-checklist button{display:block;background:none;border:0;color:#663086;text-align:left;font-size:11px;font-weight:800;padding:5px 0}.eco-section-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:18px;flex-wrap:wrap}.eco-section-heading h3{font-size:16px;font-weight:850;margin:0;color:#35253f}.eco-section-heading span,.eco-section-heading p{font-size:11px;color:#93859d;line-height:1.5}.eco-section-heading p{margin-top:6px}.eco-input-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:13px}.eco-input-grid .field,.eco-line .field{min-width:0}.eco-input-grid .input{font-size:12px;padding:10px 11px;min-height:40px}.eco-input-grid .field label,.eco-line .field label{font-size:10px}.eco-line{margin-top:20px;border:1px solid #e9e2ee;border-radius:12px;padding:16px;background:#fcfbfd}.eco-line-title{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:14px;font-size:13px}.eco-line-title>span{font-size:9px;color:#9b8ba5}.eco-line-prices{border-top:1px solid #e9e2ee;margin-top:16px;padding-top:12px}.eco-line-prices summary,.eco-notes summary,.eco-review-check summary{cursor:pointer;color:#663086;font-size:11px;font-weight:800;line-height:1.5}.eco-line-prices summary span{float:right;color:#a697af;font-size:10px;font-weight:500}.eco-notes{border-top:1px solid var(--border);padding-top:13px}.eco-step-next{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:7px;margin-top:24px;padding-top:16px;border-top:1px solid var(--border)}.eco-vat-box{background:#f4eef8;border:1px solid #dfcce9;border-radius:12px;padding:18px}.eco-vat-box .eyebrow{font-size:9px;margin-bottom:15px}.eco-review-check{margin-top:16px;padding:14px;background:#f8f6fa;border-radius:10px;font-size:12px;line-height:1.6}.eco-review-check label{display:flex;align-items:flex-start;gap:9px}.eco-review-check input{accent-color:#663086}.eco-review-check details{margin-top:10px}.eco-review-check p{font-size:11px;color:#8e7c99;margin-top:7px}.eco-editor-modal h4{font-size:13px}.eco-footer-amount{margin-right:auto;display:flex;gap:12px;align-items:center}.eco-footer-amount small{color:#95839f;font-size:11px}.eco-footer-amount strong{font-size:21px;color:#663086}.eco-validation-callout{background:#fbf6ea;border:1px solid #ebdfc0;border-radius:11px;margin:16px 0;padding:14px;display:flex;align-items:center;flex-wrap:wrap;justify-content:space-between;gap:12px;font-size:12px;color:#846526}.eco-validation-callout p{font-size:11px;margin-top:5px}.eco-validation-callout details{width:100%;font-size:11px}.eco-validation-callout summary{cursor:pointer}.eco-validation-callout ul{line-height:1.7;padding-left:20px}.eco-breadcrumb{display:flex;align-items:center;gap:12px;font-size:11px;color:#9e8eaa;margin-bottom:24px}.eco-breadcrumb strong{font-weight:600;color:#7a6688}.eco-client-heading{display:flex;align-items:center;justify-content:space-between;gap:20px;margin-bottom:26px}.eco-client-heading .page-title{font-size:42px;text-transform:none}.eco-client-detail-layout{display:grid;grid-template-columns:minmax(230px,.65fr) minmax(0,1.7fr);gap:24px;align-items:start}.eco-contact-list{margin:0;font-size:12px}.eco-contact-list>div{padding:11px 0;border-bottom:1px solid #f2edf5}.eco-contact-list>div:last-child{border-bottom:0}.eco-contact-list dt{font-size:10px;color:#9a8ba4;margin-bottom:5px}.eco-contact-list dd{margin:0;color:#4b3a57;font-weight:650;line-height:1.5;overflow-wrap:anywhere}.eco-client-notes{margin-top:20px;padding-top:16px;border-top:1px solid var(--border);font-size:11px}.eco-client-notes p{margin-top:7px;line-height:1.6;color:#8f7f99}.eco-inline-metrics{display:flex;flex-wrap:wrap;gap:0;border-bottom:1px solid #e6dfec;padding:5px 0 21px}.eco-inline-metrics>div{flex:1;min-width:130px;padding:4px 16px;border-right:1px solid #e7deed}.eco-inline-metrics>div:first-child{padding-left:0}.eco-inline-metrics>div:last-child{border:0}.eco-inline-metrics small{display:block;color:#998aa4;font-size:10px;margin-bottom:8px}.eco-inline-metrics b{font-size:21px;color:#663086}.eco-summary-strip{display:flex;gap:28px;align-items:center;flex-wrap:wrap;margin:6px 0 26px;padding:18px 0;border-bottom:1px solid #e7e0ed}.eco-summary-strip>div{display:flex;align-items:center;gap:8px;font-size:12px;color:#94819e}.eco-summary-strip b{font-size:20px;color:#533065}.eco-summary-dot{width:7px;height:7px;border-radius:50%;background:#93cf3c}.eco-summary-layout{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:20px;align-items:start}.eco-summary-divider{height:1px;background:#eee8f3;margin:22px 0}.eco-task-list{display:flex;flex-direction:column}.eco-task{display:flex;align-items:center;gap:11px;border:0;border-bottom:1px solid #f0ebf4;background:none;padding:14px 0;text-align:left;color:var(--ink);width:100%;min-width:0}.eco-task:last-child{border-bottom:0}.eco-task:hover{background:#faf8fc}.eco-task>div:nth-child(2){flex:1;min-width:0}.eco-task strong{font-size:12px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.eco-task small{display:block;font-size:10px;color:#9a8ba4;margin-top:5px;line-height:1.5}.eco-task-icon{width:34px;height:34px;border-radius:10px;background:#f0e8f5;display:grid;place-items:center;color:#6c3c85;flex-shrink:0}.eco-task-right{text-align:right;flex-shrink:0}.eco-task-right b{font-size:12px;color:#663086}.eco-quiet-empty{color:#9a8ba4;font-size:12px;padding:24px 0;line-height:1.7}.eco-summary-bottom{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-top:25px;font-size:11px;color:#9c8ba7}.eco-data-mode{display:flex;justify-content:space-between;align-items:center;gap:15px;padding:13px 16px;background:#eee8f5;border:1px solid #e2d6ed;border-radius:11px;margin-bottom:18px}.eco-data-mode b{display:block;font-size:12px;color:#663086}.eco-data-mode span{display:block;font-size:10px;color:#947ea3;margin-top:4px;line-height:1.5}.eco-data-mode .segment{white-space:nowrap}.eco-stats-sheet{background:#fff;border:1px solid #ebe5f0;border-radius:18px;overflow:hidden}.eco-stats-primary,.eco-stats-secondary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));padding:27px 28px;gap:0}.eco-stats-primary>div,.eco-stats-secondary>div{padding:0 22px;border-right:1px solid #ece6f1;min-width:0}.eco-stats-primary>div:first-child,.eco-stats-secondary>div:first-child{padding-left:0}.eco-stats-primary>div:last-child,.eco-stats-secondary>div:last-child{border:0}.eco-stats-primary small,.eco-stats-secondary small{display:block;color:#998aa4;font-size:10px;font-weight:700;margin-bottom:10px}.eco-stats-primary strong{font-size:clamp(20px,2.4vw,31px);letter-spacing:-.04em;color:#49245f;display:block;overflow-wrap:anywhere}.eco-stats-primary span{display:block;color:#84a747;font-size:10px;margin-top:8px}.eco-chart-section{padding:27px 28px;border-top:1px solid #eee8f3;min-width:0}.eco-fluid-chart{display:block;width:100%;height:auto;max-height:350px;overflow:visible}.eco-stats-two{display:grid;grid-template-columns:1fr 1fr}.eco-stats-two>section+section{border-left:1px solid #eee8f3}.eco-stats-sheet .eco-chart-legend{margin-top:0;font-size:10px;flex-wrap:wrap;gap:10px}.eco-stats-sheet .eco-chart-legend i{width:7px;height:7px}.eco-stats-sheet .eco-section-heading h3{font-size:14px}.eco-stats-sheet .eco-section-heading b{font-size:12px;color:#663086}.eco-donut-layout{display:grid;grid-template-columns:minmax(0,180px) minmax(0,1fr);align-items:center;gap:15px;min-height:200px}.eco-donut-layout svg{width:100%;max-height:190px}.eco-donut-legend>div{display:flex;gap:8px;align-items:center;margin:14px 0;font-size:11px;color:#9b8ba5}.eco-donut-legend b{margin-left:auto;color:#584060}.eco-donut-legend i{width:7px;height:7px;border-radius:50%;flex-shrink:0}.eco-activity-bars{display:flex;height:200px;gap:10px;align-items:flex-end;padding-top:15px}.eco-activity-bars>div{flex:1;min-width:0;text-align:center}.eco-activity-track{height:153px;display:flex;align-items:flex-end;justify-content:center;border-bottom:1px solid #ece5f1}.eco-activity-track i{display:block;background:#d7c6e3;border-radius:5px 5px 0 0;width:70%;max-width:27px;min-height:2px;position:relative}.eco-activity-track i span{position:absolute;top:-18px;left:0;right:0;font-size:10px;font-style:normal;color:#8a729b}.eco-activity-bars small{font-size:9px;color:#a08eaa;display:block;margin-top:10px}.eco-stat-rank>div{display:flex;gap:14px;margin:20px 0;align-items:center}.eco-stat-rank>div>span{font-size:11px;color:#c0b2cb}.eco-stat-rank>div>div{flex:1;min-width:0}.eco-rank-caption{display:flex;justify-content:space-between;gap:14px;font-size:11px;align-items:flex-start;margin-bottom:8px}.eco-rank-caption b{font-weight:650;color:#897492;overflow-wrap:anywhere}.eco-rank-caption strong{white-space:nowrap;font-size:11px;color:#663086}.eco-rank-track{height:4px;background:#f4f0f7;border-radius:4px}.eco-rank-track i{height:4px;display:block;background:#ad8abe;border-radius:4px}.eco-stats-secondary{border-top:1px solid #eee8f3;background:#fcfbfd}.eco-stats-secondary strong{font-size:19px;color:#776082;display:block}.eco-stats-note{margin:0;padding:0 28px 22px;font-size:10px;line-height:1.7;color:#a18eac;background:#fcfbfd}.eco-stat-emphasis{font-size:23px!important}.eco-stats-sheet .eco-filters{background:none}.eco-task svg:last-child{flex-shrink:0}@media(min-width:1500px){.eco-editor-modal{width:1180px}}@media(max-width:1100px){.eco-client-detail-layout{grid-template-columns:minmax(210px,.65fr) minmax(0,1.3fr)}.eco-inline-metrics b{font-size:18px}.eco-inline-metrics>div{min-width:110px;padding:7px 12px}.eco-summary-layout{grid-template-columns:1fr}.eco-summary-layout>.stack{display:grid;grid-template-columns:1fr 1fr;gap:16px}.eco-stats-primary,.eco-stats-secondary{padding:22px 20px}.eco-stats-primary>div,.eco-stats-secondary>div{padding:0 13px}.eco-chart-section{padding:22px 20px}.eco-donut-layout{grid-template-columns:135px 1fr;gap:8px}}@media(max-width:800px){.eco-quote-layout{grid-template-columns:minmax(0,1fr) 245px;gap:17px}.eco-editor-aside{padding-left:15px}.eco-client-detail-layout{grid-template-columns:1fr}.eco-contact-list{display:grid;grid-template-columns:1fr 1fr;gap:0 18px}.eco-client-heading{align-items:flex-start}.eco-client-heading .page-title{font-size:34px}.eco-stats-primary{grid-template-columns:1fr 1fr;gap:22px 0}.eco-stats-primary>div:nth-child(3){padding-left:0}.eco-stats-primary>div:nth-child(2){border:0}.eco-stats-two{grid-template-columns:1fr}.eco-stats-two>section+section{border-left:0}.eco-donut-layout{grid-template-columns:minmax(0,180px) 1fr}.eco-summary-layout>.stack{display:flex}}@media(max-width:640px){.modal-backdrop{padding:8px}.modal{max-height:calc(100dvh - 16px);border-radius:14px;width:100%}.modal-head{padding:14px 15px}.modal-head h2{font-size:20px!important}.modal-body{padding:16px 15px}.modal-foot{padding:12px 15px}.eco-editor-modal{width:100%;max-height:calc(100dvh - 16px)}.eco-editor-steps{padding:9px 12px;gap:3px}.eco-editor-steps button{padding:8px 5px;gap:5px;font-size:10px}.eco-editor-steps button b{width:18px;height:18px;font-size:9px}.eco-quote-layout{display:block}.eco-editor-aside{position:static;border-left:0;border-top:1px solid #ece4f2;padding:17px 0 0;margin-top:18px}.eco-editor-aside>.eyebrow{margin-bottom:9px}.eco-editor-aside .eco-totals{max-width:none}.eco-editor-aside .eco-totals>div{padding:4px 0}.eco-editor-checklist{display:none}.eco-input-grid{gap:11px}.eco-line{padding:12px}.eco-line-title>span{display:none}.eco-step-next{margin-top:17px}.eco-vat-box{padding:13px}.eco-footer-amount{display:block}.eco-footer-amount small{font-size:9px}.eco-footer-amount strong{display:block;font-size:18px;margin-top:3px}.eco-editor-modal .modal-foot .btn{padding:10px 11px;font-size:11px}.eco-editor-modal .modal-foot .actions{gap:5px}.eco-line-prices summary{font-size:10px}.eco-line-prices summary span{float:none;margin-left:6px}.eco-validation-callout .btn{width:100%}.eco-client-heading{display:block}.eco-client-heading .actions{margin-top:16px}.eco-contact-list{grid-template-columns:1fr 1fr}.eco-inline-metrics{display:grid;grid-template-columns:1fr 1fr;gap:17px 0}.eco-inline-metrics>div:nth-child(3){padding-left:0}.eco-inline-metrics>div:nth-child(2){border:0}.eco-summary-strip{gap:18px;padding:14px 0;margin-bottom:18px}.eco-summary-strip>div{font-size:10px;gap:5px}.eco-summary-strip b{font-size:17px}.eco-summary-bottom{display:block;line-height:1.7}.eco-summary-bottom .btn{margin-top:10px}.eco-task-icon{display:none}.eco-task{gap:7px}.eco-task strong{font-size:11px}.eco-task-right b{font-size:11px}.eco-task small{font-size:9px}.eco-data-mode{display:block;padding:12px}.eco-data-mode .segmented{margin-top:12px;width:fit-content}.eco-data-mode span{font-size:10px}.eco-stats-primary,.eco-stats-secondary{grid-template-columns:1fr 1fr;padding:20px 16px;gap:20px 0}.eco-stats-secondary>div:nth-child(3){padding-left:0}.eco-stats-secondary>div:nth-child(2){border:0}.eco-stats-primary strong{font-size:25px}.eco-chart-section{padding:20px 16px}.eco-section-heading{gap:9px}.eco-stats-sheet .eco-section-heading h3{font-size:13px}.eco-fluid-chart{min-height:170px}.eco-stats-note{padding:0 16px 18px}.eco-stat-rank>div{margin:17px 0}.eco-rank-caption{font-size:10px}.eco-rank-caption strong{font-size:10px}.eco-donut-layout{grid-template-columns:145px 1fr}.eco-task-right small{max-width:100px}.eco-chart-legend{font-size:9px!important}.eco-activity-bars{gap:7px}.eco-activity-bars small{font-size:8px}.eco-client-detail-layout .card-pad{padding:17px}}@media(max-width:370px){.eco-input-grid{grid-template-columns:1fr}.eco-editor-steps button{font-size:9px}.eco-editor-steps button b{display:none}.eco-contact-list{grid-template-columns:1fr}.eco-donut-layout{grid-template-columns:120px 1fr}.eco-footer-amount strong{font-size:16px}}

/* Interactive instrument collection */
.material-studio{margin:0 0 24px;padding:24px;border-radius:22px;background:#191224;color:#fff;overflow:hidden;box-shadow:0 14px 35px #26123816}.studio-head{display:flex;justify-content:space-between;align-items:start;gap:14px}.studio-head h2{font:800 32px 'Barlow Condensed',sans-serif;margin:3px 0 6px;color:#fff}.studio-head p{font-size:12px;color:#c6b9d6;line-height:1.6;max-width:570px}.studio-eyebrow{color:#b4e578;font-size:10px;font-weight:800;letter-spacing:.15em}.studio-toggle{border:1px solid #706080;background:#ffffff0a;color:#eee4f7;border-radius:20px;padding:9px 12px;font-size:11px;white-space:nowrap}.studio-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px;margin-top:22px}.studio-item{position:relative;text-align:left;border:1px solid #ffffff1c;background:linear-gradient(155deg,#352744,#20182b);color:white;border-radius:16px;padding:13px;min-width:0;transition:transform .25s,border-color .25s;cursor:pointer;overflow:hidden}.studio-item:hover,.studio-item:focus-visible{transform:translateY(-5px);border-color:#b4e578;outline:2px solid #b4e578;outline-offset:2px}.studio-id{display:flex;justify-content:space-between;font:700 10px sans-serif;letter-spacing:.07em;color:#a99bb9}.studio-live{color:#b4e578}.studio-model{height:175px;width:100%;position:relative}.studio-model canvas{display:block;width:100%;height:100%}.studio-fallback{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#b4e578;font-size:28px}.studio-model.ready .studio-fallback{display:none}.studio-item h3{font:800 27px 'Barlow Condensed',sans-serif;margin:0 0 4px;color:white}.studio-count{font-size:11px;color:#bdb0ca;line-height:1.6}.studio-count b{color:#b4e578;font-size:19px}.studio-open{display:flex;justify-content:space-between;border-top:1px solid #ffffff18;margin-top:12px;padding-top:10px;font-size:10px;font-weight:700;color:#ddcdeb}.studio-note{font-size:10px;color:#aa9bb9;margin:15px 0 0;line-height:1.6}.instrument-numbers{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px;margin:16px 0}.instrument-number{padding:15px;background:#f6f2fa;border-radius:12px;font-size:11px;color:#766582}.instrument-number b{display:block;font-size:29px;line-height:1.25;color:#502470}.instrument-unit{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid #eee8f2}.instrument-unit>div{flex:1;min-width:0}.instrument-unit strong{display:block;font-size:12px}.instrument-unit p{font-size:11px;color:#81728d;margin:5px 0;overflow-wrap:anywhere}.studio-modal .modal-body{max-height:70vh;overflow:auto}.studio-modal .modal-head .eyebrow{color:#9c7db0}
@media(max-width:1100px){.studio-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(max-width:600px){.material-studio{padding:17px 12px}.studio-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.studio-model{height:145px}.studio-head{flex-direction:column}.studio-head h2{font-size:29px}.studio-item{padding:11px}.instrument-unit{flex-wrap:wrap}}
@media(prefers-reduced-motion:reduce){.studio-item{transition:none}.studio-item:hover{transform:none}}

.navigation-group{color:#8e7d9c;font-size:8px;letter-spacing:.16em;font-weight:850;padding:16px 14px 7px}.navigation-group:first-child{padding-top:0}.sidebar nav>.navlink{font-size:12px;padding:11px 13px;gap:11px;margin-bottom:3px}.sidebar nav>.navlink span{line-height:1.4}.sidebar{overflow-y:auto}.sidebar .brand{padding-bottom:24px}.sidebar .sidebar-note{display:none}.nav-end{padding-top:18px}.people-mode-toggle{display:flex;align-items:center;gap:7px;background:#f3eef7;border:1px solid #e7ddef;color:#786485;padding:8px 11px;border-radius:9px;font-size:10px;font-weight:800}.people-mode-toggle.is-preview{color:#663086;background:#eee2f7;border-color:#d8bee8}.people-preview-banner{display:flex;align-items:center;justify-content:space-between;gap:20px;background:#eee6f5;border:1px solid #dcc9e9;border-left:4px solid #8bbf37;padding:14px 17px;border-radius:12px;margin-bottom:24px;color:#765b86}.people-preview-banner strong{display:flex;align-items:center;gap:7px;font-size:10px;letter-spacing:.06em;color:#663086}.people-preview-banner p{font-size:11px;line-height:1.6;margin-top:5px;max-width:810px}.people-preview-banner>.btn{flex-shrink:0}.material-studio{background:radial-gradient(ellipse at 65% -40%,#5e3a70 0,transparent 65%),#21172d}.studio-model{background:radial-gradient(ellipse at 50% 78%,#b7e76a15 0,transparent 60%)}.studio-modal .modal-body{max-height:none}.studio-modal .modal-footer{padding:13px 22px;border-top:1px solid var(--border);flex-shrink:0}.instrument-unit .btn{flex-shrink:0}.studio-head h2{line-height:1.15}.studio-item:focus-visible{outline-offset:-3px}@media(max-height:850px) and (min-width:741px){.sidebar{padding-top:18px;padding-bottom:12px}.sidebar .brand{padding-bottom:17px}.navigation-group{padding-top:12px;padding-bottom:5px}.sidebar nav>.navlink{padding-top:9px;padding-bottom:9px;font-size:11px}.account-mini strong{font-size:10px}.account-mini small{font-size:9px}}@media(max-width:1000px){.people-mode-toggle span{max-width:105px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.topbar{padding-left:24px;padding-right:24px}.top-actions{gap:7px}.people-preview-banner{gap:12px}.people-preview-banner p{font-size:10px}}@media(max-width:740px){.people-mode-toggle{padding:8px}.people-mode-toggle span{display:none}.people-preview-banner{display:block;padding:12px}.people-preview-banner .btn{margin-top:10px}.topbar{padding-left:16px;padding-right:16px}.role-switch select{max-width:145px}.studio-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.studio-item:last-child{grid-column:1 / -1;display:grid;grid-template-columns:1fr 1fr;align-items:center;gap:0 20px}.studio-item:last-child .studio-model{grid-row:1 / 5;grid-column:1}.studio-item:last-child .studio-id,.studio-item:last-child h3,.studio-item:last-child .studio-count,.studio-item:last-child .studio-open{grid-column:2}.studio-item:last-child .studio-id{grid-row:1}.studio-item:last-child h3{grid-row:2}.studio-item:last-child .studio-count{grid-row:3}.studio-item:last-child .studio-open{grid-row:4}}@media(max-width:370px){.role-switch select{max-width:110px}.studio-item{padding:9px}.studio-item h3{font-size:24px}.studio-open{font-size:8px}.studio-item:last-child{gap:0 10px}}
/* Consistent spacing for every dialog, including legacy maintenance footers. */
.modal .modal-head>button[data-action="close-modal"]{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;padding:8px;margin:0;border:1px solid #e8e0ed;border-radius:11px;background:#faf8fc;color:#663086;line-height:1;transition:background .15s}.modal .modal-head>button[data-action="close-modal"]:hover{background:#eee5f5}.modal .modal-footer,.modal .modal-foot{display:flex;justify-content:flex-end;align-items:center;gap:10px;flex-wrap:wrap;flex-shrink:0;padding:16px 24px;margin:0;border-top:1px solid #eee7f3;background:#fff;border-radius:0 0 18px 18px}.modal .modal-footer .btn,.modal .modal-foot>.btn{min-height:41px;padding:11px 17px;line-height:1.25;margin:0;white-space:normal;text-align:center}.modal .modal-body{padding:22px 24px}.modal .modal-head{padding:19px 24px;min-height:76px}.modal .form-hint{font-size:11px;line-height:1.6;color:#95859f;margin-top:14px}.modal #asset-form,.modal #stock-form{margin:0}.modal #asset-form>.field+.field{margin-top:14px}.modal #asset-form textarea{min-height:90px}.modal #asset-form .input{min-height:42px;font-size:12px;padding:11px 12px}.modal #asset-form .field label{font-size:11px;line-height:1.5}.instrument-unit{padding:14px 0;gap:16px}.instrument-unit .btn{padding:9px 13px;min-height:35px}.maint-actions{gap:8px}.maint-controls{gap:12px}.studio-toggle{padding:10px 15px;min-height:37px}.studio-open{padding-top:13px;margin-top:14px}.studio-item{padding:15px}.studio-model[data-model="instru"]{background:radial-gradient(ellipse at 50% 60%,#b9c7d820 0,transparent 68%)}
@media(max-width:640px){.modal .modal-head{padding:16px 17px;min-height:68px}.modal .modal-body{padding:18px 17px}.modal .modal-footer,.modal .modal-foot{padding:14px 17px;gap:9px}.modal .modal-footer .btn{flex:1;min-width:100px;padding:11px 12px}.modal .modal-head>button[data-action="close-modal"]{width:34px;height:34px;padding:7px}.modal .form-hint{font-size:10px;line-height:1.6}.studio-item{padding:12px}.studio-open{font-size:9px;line-height:1.5}.studio-toggle{padding:9px 13px}.instrument-unit .btn{margin-left:auto}.eco-editor-modal .modal-foot{padding:12px 15px}.eco-editor-modal .modal-body{padding:16px 15px}}

<fonts count="3"><font><sz val="11"/><name val="Aptos"/></font><font><b/><sz val="16"/><color rgb="FFFFFFFF"/><name val="Aptos"/></font><font><b/><sz val="10"/><color rgb="FFFFFFFF"/><name val="Aptos"/></font></fonts><fills count="7"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill><fill><patternFill patternType="solid"><fgColor rgb="FF522273"/><bgColor indexed="64"/></patternFill></fill><fill><patternFill patternType="solid"><fgColor rgb="FFFAF6FC"/><bgColor indexed="64"/></patternFill></fill><fill><patternFill patternType="solid"><fgColor rgb="FFE6F4E4"/><bgColor indexed="64"/></patternFill></fill><fill><patternFill patternType="solid"><fgColor rgb="FFFFF0D7"/><bgColor indexed="64"/></patternFill></fill><fill><patternFill patternType="solid"><fgColor rgb="FFFCE7EA"/><bgColor indexed="64"/></patternFill></fill></fills><borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders><cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs><cellXfs count="7"><xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/><xf numFmtId="0" fontId="1" fillId="2" borderId="0" xfId="0" applyFill="1" applyFont="1"/><xf numFmtId="0" fontId="0" fillId="3" borderId="0" xfId="0" applyFill="1"/><xf numFmtId="0" fontId="2" fillId="2" borderId="0" xfId="0" applyFill="1" applyFont="1"/><xf numFmtId="0" fontId="0" fillId="4" borderId="0" xfId="0" applyFill="1"/><xf numFmtId="0" fontId="0" fillId="5" borderId="0" xfId="0" applyFill="1"/><xf numFmtId="0" fontId="0" fillId="6" borderId="0" xfId="0" applyFill="1"/></cellXfs><cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles></styleSheet>',
 'xl/worksheets/sheet1.xml':xSheet(rows1,[16,21,23,23,50,20],['A1:F1','A2:F2']),
 'xl/worksheets/sheet2.xml':xSheet(rows2,[34,24,20,22,24,48],['A1:F1','A2:F2','A12:F12'])
 };
 const file=byteZip(files),url=URL.createObjectURL(file),link=document.createElement('a');link.href=url;link.download='Xaldiga_Manteniment_Inventari_'+d+'.xlsx';document.body.appendChild(link);link.click();link.remove();setTimeout(()=>URL.revokeObjectURL(url),5000);toast('Excel descarregat: Manteniment + Inventari');
}

initAssets();
let dragMember=null;
document.addEventListener('click',ev=>{const el=ev.target.closest('[data-action]');if(!el)return;const a=el.dataset.action;const id=el.dataset.id;const match=e=>data.events.find(x=>x.id===e);if(a==='mobile-more'){document.getElementById('mobile-more-panel')?.classList.toggle('hidden');return}if(a==='backdrop'){if(ev.target===el)showModal(null);return}if(a==='close-modal'){showModal(null);return}if(a==='nav'){navigate(el.dataset.view);return}if(a==='event'){navigate('event',id);return}if(a==='insight-person'){if(captain())showModal({type:'insight-person',id});return}if(a==='maint-tab'){ui.maintenanceTab=el.dataset.tab;render();return}if(a==='maint-edit'){if(manager())showModal({type:'asset-edit',id});return}if(a==='maint-new'){if(manager())showModal({type:'asset-edit'});return}if(a==='stock-edit'){if(manager())showModal({type:'stock-edit',id});return}if(a==='stock-new'){if(manager())showModal({type:'stock-edit'});return}if(a==='asset-save'){saveAssetForm();return}if(a==='stock-save'){saveStockForm();return}if(a==='asset-export'){if(manager())exportInventoryWorkbook();return}if(a==='new-event'){if(manager())showModal({type:'editor',date:el.dataset.date||ui.modal?.date});return}if(a==='edit-event'){if(manager())showModal({type:'editor',id});return}if(a==='delete-event'){if(manager())showModal({type:'confirm-delete',id});return}if(a==='confirm-delete'){if(!manager())return;data.events=data.events.filter(e=>e.id!==id);data.alerts=data.alerts.filter(n=>n.eventId!==id);save();navigate('calendar');toast('Actuació eliminada');return}if(a==='day'){showModal({type:'day',date:el.dataset.date});return}if(a==='go-month'){ui.month=Number(el.dataset.month);ui.calendarMode='month';render();return}if(a==='calendar-mode'){ui.calendarMode=el.dataset.mode;render();return}if(a==='prev-month'||a==='next-month'){let n=a==='prev-month'?-1:1;if(ui.calendarMode==='year')ui.year+=n;else{const d=new Date(ui.year,ui.month+n,1);ui.year=d.getFullYear();ui.month=d.getMonth()}render();return}if(a==='rsvp'){const e=match(id),currentStatus=e.responses[current().id]?.status;if(!currentStatus||manager()){let comment=document.getElementById('response-comment')?.value||'';e.responses[current().id]={status:el.dataset.status,comment,respondedAt:Date.now()};save();render();toast('Assistència registrada correctament')}return}if(a==='save-comment'){let e=match(id);if(e.responses[current().id]?.status&& !manager())return;e.responses[current().id]??={status:null,comment:''};e.responses[current().id].comment=document.getElementById('response-comment')?.value||'';save();render();toast('Comentari privat desat');return}if(a==='remind'){if(!manager())return;notify(match(id),'remind');save();render();toast('Recordatori simulat enviat a les notificacions');return}if(a==='board-member'){if(captain()){const e=match(el.dataset.event),m=e&&data.members.find(x=>x.id===el.dataset.member);if(e&&m&&['yes','maybe'].includes(e.responses[m.id]?.status))showModal({type:'player',eventId:e.id,memberId:m.id})}return}if(a==='board-response'){if(captain())document.querySelector('.member-table')?.scrollIntoView({behavior:'smooth',block:'center'});return}if(a==='toggle-full-list'){const panel=document.getElementById('full-response-table');panel?.classList.toggle('hidden');return}if(a==='new-member'){if(manager())showModal({type:'member-editor'});return}if(a==='edit-member'){if(manager())showModal({type:'member-editor',id});return}if(a==='delete-member'){const m=data.members.find(x=>x.id===id);if(!m||!manager()||m.role==='captain'||m.role==='assistant'&&!captain())return;showModal({type:'delete-member',id});return}if(a==='confirm-delete-member'){const m=data.members.find(x=>x.id===id);if(!m||!manager()||m.role==='captain'||m.role==='assistant'&&!captain())return;data.members=data.members.filter(x=>x.id!==id);data.events.forEach(e=>{delete e.responses[id];delete e.zoneOverrides?.[id];e.formation=(e.formation||[]).filter(x=>x!==id)});data.selectedUser=data.members.some(m=>m.id===data.selectedUser)?data.selectedUser:'m1';save();ui.modal=null;render();toast('Membre eliminat');return}if(a==='save-member'){if(!manager())return;const form=document.getElementById('member-form');if(!form?.reportValidity())return;const fd=new FormData(form),name=String(fd.get('name')||'').trim(),instrument=String(fd.get('instrument')||'');if(!name||(instrument&&!INSTRUMENTS.some(i=>i.id===instrument)))return;const old=data.members.find(m=>m.id===form.dataset.id);if(!old&&data.members.length>=capacityTotal()){toast('La plantilla ja té 28 places.');return}if(instrument&&capacityUsed(instrument)-(old?.instrument===instrument?1:0)>=CAPACITY[instrument]){toast('No hi ha places disponibles per a '+inst(instrument).plural);return}if(old){old.name=name;old.instrument=instrument}else{const id='m'+Date.now();data.members.push({id,name,instrument,role:'member'})}save();ui.modal=null;render();toast(old?'Membre actualitzat':'Nou tabaler afegit');return}if(a==='filter-member'){ui.memberFilter=el.dataset.filter;render();return}if(a==='view-comment'){if(captain())showModal({type:'comment',eventId:el.dataset.event,memberId:el.dataset.member});return}if(a==='reset-lineup'){if(!captain())return;const e=match(id);e.formation=[];e.zoneOverrides={};save();render();toast('Distribució automàtica restaurada');return}if(a==='open-alert'){const n=data.alerts.find(x=>x.id===id);if(n){if(!n.readBy.includes(current().id))n.readBy.push(current().id);save();navigate('event',n.eventId)}return}if(a==='read-alert'){const n=data.alerts.find(x=>x.id===id);if(n&&!n.readBy.includes(current().id))n.readBy.push(current().id);save();render();return}if(a==='read-all'){data.alerts.filter(alertVisible).forEach(n=>{if(!n.readBy.includes(current().id))n.readBy.push(current().id)});save();render();toast('Notificacions marcades com a llegides');return}if(a==='reset-demo'){showModal({type:'confirm-reset'});return}if(a==='confirm-reset'){if(!captain())return;downloadJSON(data,'Xaldiga_abans_reinici.json');data=seed();initAssets();initEconomy();ui={maintenanceTab:'assets',maintenanceSearch:'',maintenanceStatus:'all',maintenanceType:'all',route:'dashboard',calendarMode:'month',year:today().getFullYear(),month:today().getMonth(),eventId:null,day:null,memberFilter:'all',insightFilter:'all',insightSort:'score',insightQuery:'',lineupEvent:null,modal:null};save();render();toast('Dades d’exemple restaurades');return}if(a==='submit-event'){if(!manager())return;let form=document.getElementById('event-form');if(!form.reportValidity())return;let fd=new FormData(form);const title=String(fd.get('title')||'').trim(),place=String(fd.get('place')||'').trim();if(!title||!place){toast('Revisa els camps obligatoris');return}const mins={};INSTRUMENTS.forEach(i=>mins[i.id]=Math.max(0,Math.min(CAPACITY[i.id],Number(fd.get('min_'+i.id))||0)));let id=form.dataset.id;let old=match(id);if(old){Object.assign(old,{title,place,date:fd.get('date'),time:fd.get('time'),desc:fd.get('desc')||'',mins});ui.eventId=id}else{let e={id:'e'+Date.now(),title,place,date:fd.get('date'),time:fd.get('time'),desc:fd.get('desc')||'',mins,responses:{},formation:[],zoneOverrides:{},createdAt:Date.now()};data.events.push(e);notify(e);ui.eventId=e.id}save();navigate('event',ui.eventId);toast(old?'Actuació actualitzada':'Nova actuació creada!');return}if(a==='move-player'){if(!captain())return;let e=match(el.dataset.event),mId=el.dataset.member;let zone=document.getElementById('move-zone')?.value;if(!zone)return;e.zoneOverrides??={};e.zoneOverrides[mId]=zone;e.formation=(e.formation||[]).filter(x=>x!==mId);e.formation.push(mId);save();ui.modal=null;render();toast('Posició actualitzada');return}});
document.addEventListener('input',ev=>{if(ev.target.id==='maint-search'){ui.maintenanceSearch=ev.target.value;const body=document.getElementById('asset-list');if(body)body.innerHTML=renderAssetRows();return}if(ev.target.id==='insight-search'){ui.insightQuery=ev.target.value;const temp=document.createElement('div');temp.innerHTML=renderInsights();const next=temp.querySelector('#insight-results');const here=document.getElementById('insight-results');if(next&&here)here.innerHTML=next.innerHTML}});
document.addEventListener('change',ev=>{let el=ev.target;if(el.id==='maint-type'){ui.maintenanceType=el.value;render();return}if(el.id==='maint-status'){ui.maintenanceStatus=el.value;render();return}if(el.dataset.assetStatus&&manager()){const asset=data.assets.find(x=>x.code===el.dataset.assetStatus);if(asset){asset.status=el.value;asset.updated=ds(today());save();render();toast('Estat de '+asset.code+' actualitzat')}return}if(el.dataset.assetLed&&manager()){const asset=data.assets.find(x=>x.code===el.dataset.assetLed);if(asset){asset.led=el.value;asset.updated=ds(today());save();render();toast('LEDs de '+asset.code+' actualitzats')}return}if(el.id==='insight-inst'){ui.insightFilter=el.value;render();return}if(el.id==='insight-sort'){ui.insightSort=el.value;render();return}if(el.dataset.actualMember&&manager()){const e=data.events.find(x=>x.id===el.dataset.actualEvent);e.attendance??={};if(el.value)e.attendance[el.dataset.actualMember]=el.value;else delete e.attendance[el.dataset.actualMember];save();render();toast('Assistència real actualitzada');return}if(el.id==='role-picker'){data.selectedUser=el.value;save();ui.route='dashboard';ui.modal=null;render();toast('Ara estàs navegant com a '+roleName(current().role));return}if(el.id==='lineup-event'){ui.lineupEvent=el.value;render();return}if(el.dataset.responseMember&&manager()){let e=data.events.find(x=>x.id===el.dataset.event);setResponse(e,el.dataset.responseMember,el.value);toast('Assistència modificada');return}if(el.dataset.instrumentMember&&manager()){let m=data.members.find(x=>x.id===el.dataset.instrumentMember);if(capacityUsed(el.value)>=CAPACITY[el.value]){toast('No hi ha places per a aquest instrument');render();return}m.instrument=el.value;save();render();toast('Instrument de '+m.name+' actualitzat');return}if(el.dataset.roleMember&&captain()){let m=data.members.find(x=>x.id===el.dataset.roleMember);if(m?.role==='captain')return;m.role=el.value;save();render();toast('Permisos de '+m.name+' actualitzats');return}});
document.addEventListener('dragstart',ev=>{const p=ev.target.closest('[data-player]');if(!p||!captain())return;dragMember={eventId:p.dataset.event,memberId:p.dataset.player};ev.dataTransfer.setData('text/plain',p.dataset.player);ev.dataTransfer.effectAllowed='move';p.classList.add('dragging')});
document.addEventListener('dragend',()=>{dragMember=null;document.querySelectorAll('.drag-over,.dragging').forEach(el=>el.classList.remove('drag-over','dragging'))});
document.addEventListener('dragover',ev=>{let zone=ev.target.closest('[data-zone]');if(zone&&dragMember){ev.preventDefault();zone.classList.add('drag-over')}});
document.addEventListener('dragleave',ev=>{const zone=ev.target.closest('[data-zone]');if(zone&&!zone.contains(ev.relatedTarget))zone.classList.remove('drag-over')});
document.addEventListener('drop',ev=>{const zone=ev.target.closest('[data-zone]');if(!zone||!dragMember||!captain())return;ev.preventDefault();const e=data.events.find(x=>x.id===dragMember.eventId);if(!e)return;const target=ev.target.closest('[data-player]');e.zoneOverrides??={};e.zoneOverrides[dragMember.memberId]=zone.dataset.zone;e.formation=(e.formation||[]).filter(x=>x!==dragMember.memberId);const idx=target?(e.formation||[]).indexOf(target.dataset.player):-1;if(idx>=0)e.formation.splice(idx,0,dragMember.memberId);else e.formation.push(dragMember.memberId);dragMember=null;save();render();toast('Nova posició guardada')});
document.addEventListener('keydown',ev=>{if(ev.key==='Escape'&&ui.modal)showModal(null)});

/* ORIS V6 · clients, pressupostos i economia */
const RATE_DEFAULTS={"bands": [{"minutes": 30, "price": 150.0}, {"minutes": 60, "price": 250.0}, {"minutes": 90, "price": 350.0}, {"minutes": 120, "price": 440.0}, {"minutes": 150, "price": 520.0}, {"minutes": 180, "price": 600.0}], "blockMinutes": 30, "blockPrice": 80, "maxMinutes": 480, "km": 0.26, "discountScope": "performance", "discounts": {"General": 0.0, "Membre del grup (tabaler/a)": 50.0, "Membre de l'entitat (Xàldiga)": 30.0}, "vatMode": "pending", "vat": 21, "validDays": 30, "legal": {"group": "Tabalers de Xàldiga", "entity": "Associació Xàldiga Taller de Festes", "nif": "G-58186784", "address": "C/ Josep Comas i Solà, 8 · 08243 Manresa", "phone": "717 707 671", "email": "tresoreria@xaldiga.cat", "iban": "ES55 0081 0049 5300 0176 3577", "insurance": "[Asseguradora · núm. pòlissa]", "signer": "[Nom i càrrec]"}, "types": ["Actuació estàtica", "Cercavila", "Baixada de torxes", "Acompanyament de correfoc", "Casament", "Festa / aniversari", "Altres"], "conditions": [{"title": "Objecte i acceptació", "text": "L'emet l'Associació Xàldiga Taller de Festes per a l'actuació de la seva secció Tabalers de Xàldiga (el grup). Detalla l'actuació, l'horari, el lloc i el preu. Un cop acceptat per escrit (signatura, correu electrònic o missatge), té valor de contracte entre les parts. Qualsevol canvi d'horari, durada o lloc s'ha d'acordar per escrit i es valorarà segons la tarifa vigent."}, {"title": "Preu i pagament", "text": "Els imports són en euros i inclouen el desplaçament indicat; el tractament de l'IVA consta al resum. El pagament es farà per transferència bancària al compte indicat, en un termini màxim de 15 dies des de l'actuació, contra factura o rebut. Si s'ha pagat una bestreta, es descomptarà de l'import final."}, {"title": "Puntualitat i retards", "text": "L'actuació començarà a l'hora confirmada. Si el retard és imputable a l'organització, cada 30 minuts d'espera o fracció es facturaran a 50 €; si l'espera supera els 60 minuts, el grup podrà donar l'actuació per finalitzada i es cobrarà l'import íntegre. Si el retard és imputable al grup, l'import es reduirà proporcionalment."}, {"title": "Pluja i força major", "text": "Si la pluja o una altra causa aliena a les parts posa en risc la seguretat de les persones o dels instruments, el responsable del grup, d'acord amb l'organització, podrà ajornar, reduir o suspendre l'actuació. Es buscarà una data alternativa sense cost. Si no és possible, només es cobrarà el desplaçament i, si l'actuació ja havia començat, la part feta."}, {"title": "Cancel·lació", "text": "El contractant pot cancel·lar per escrit sense cost fins a 15 dies abans de l'actuació; entre 14 i 7 dies abans es cobrarà el 25 % de l'import de l'actuació, i amb menys de 7 dies, el 50 %. Si l'actuació no es pot fer per causa imputable al grup, es retornarà qualsevol import avançat sense cap cost per al contractant."}, {"title": "Organització i seguretat", "text": "L'organització s'encarrega dels permisos municipals, de l'assegurança de responsabilitat civil de l'acte i de la seguretat del recorregut, especialment en actes amb foc o pirotècnia. També facilitarà un espai per deixar els instruments i, si és possible, aparcament proper per als vehicles del grup."}, {"title": "Assegurança del grup", "text": "Pendent de validar: fórmula de text truncada al fitxer original. Completa aquesta clàusula abans d’emetre una oferta."}, {"title": "Imatge", "text": "El grup podrà fer fotografies i vídeos de l'actuació per difondre-la als seus canals, sense finalitat comercial. Si el contractant no ho vol, només cal indicar-ho a les observacions."}, {"title": "Protecció de dades", "text": "Pendent de validar: fórmula de text truncada al fitxer original. Completa aquesta clàusula abans d’emetre una oferta."}, {"title": "Llei aplicable", "text": "Aquest acord es regeix per la legislació civil vigent. Les parts intentaran resoldre de manera amistosa qualsevol discrepància abans d'acudir a altres vies."}], "conditionsValidated": false, "formulaValidated": false, "version": 1};
const REAL_NAMES=["Abel Solervicens Saladich", "Agnès Prat Bou", "Anna Fenoy Hurtado", "Anna Purtí Bonachea", "Arnau Espigares Magrí", "Astrid Mora Herrera", "Cèlia Navarro i Lupón", "Dàmaris Panduro Bravo", "Gemma Galobart Perramon", "Griselda Pintó Vila", "Joel Muñoz Martín", "Jordi Santamaria Gámez", "Judit Solervicens Saladich", "Leyre Tovar Fernandez", "Marc Olucha Tarrés", "Marçal Castelló Vilaseca", "Maria Cortina Andreu", "Maria Vaz Navarrete", "Martí Roset Pujol", "Mireia Espinalt Sánchez", "Moises Navarro Bacardit", "Mònica Viñas Toro", "Montserrat Creus Lleonart", "Oriol Descarrega Alsina", "Oriol Jódar Sarret", "Roger Franco Jàndula", "Roser Mora Herraiz"];
const uid=p=>p+'-'+(crypto.randomUUID?crypto.randomUUID():Date.now()+'-'+Math.random().toString(36).slice(2));
const clone=x=>JSON.parse(JSON.stringify(x));
const cents=n=>Math.round((Number(n)+Number.EPSILON)*100);
const eur=n=>new Intl.NumberFormat('ca-ES',{style:'currency',currency:'EUR'}).format((n||0)/100);
const sum=a=>a.reduce((s,x)=>s+x,0);
const economyAccess=()=>captain()||(current().role==='assistant'&&current().economyAllowed===true);
const STATUS={draft:'Esborrany',pending:'Pendent d’acceptació',accepted:'Acceptat',rejected:'Rebutjat',cancelled:'Cancel·lat',finished:'Finalitzat'};
const MODES={pending:'Pendent de confirmar',included:'IVA inclòs',added:'IVA no inclòs (s’afegeix)',exempt:'Exempt d’IVA'};
glyph.wallet='<rect x="3" y="5" width="18" height="16" rx="3"/><path d="M3 9h18m-5 4h5v5h-5zM6 5V3h11"/>';
let eco={tab:'summary',query:'',clientType:'',client:null,year:String(today().getFullYear()),month:'',filterClient:'',status:'',type:'',draft:null,compare:false};
function initEconomy(){
 if(data.schemaVersion!==6){
  const legacy=!data.members.every(m=>m.id.startsWith('xaldiga-'));
  if(legacy){
   try{if(!localStorage.getItem('oris_xaldiga_pre_v6_backup'))localStorage.setItem('oris_xaldiga_pre_v6_backup',JSON.stringify(data))}catch(e){console.warn(e)}
   data.members=REAL_NAMES.map((name,i)=>({id:'xaldiga-'+String(i+1).padStart(4,'0'),name,instrument:'',role:'member',economyAllowed:false}));
   data.events.forEach(e=>{e.responses={};e.attendance={};e.formation=[];e.zoneOverrides={};e.demo=true});
   data.alerts.forEach(a=>{a.readBy=[]});
  }
  data.selectedUser='demo-admin';data.schemaVersion=6;
  data.migrationNote='V6: membres reals sense instruments ni càrrecs assignats. Les actuacions heretades són exemples; no computen com a historial personal. La còpia anterior es conserva al navegador.';
 }
 data.clients??=[];data.quotes??=[];data.rates??=clone(RATE_DEFAULTS);data.ledger??=[];data.quoteCounter??={};
 data.events.forEach(e=>{e.attendance??={}});
}
function tariff(duration,r){
 const n=Number(duration);if(!(n>0&&n<=r.maxMinutes))throw Error('Durada fora de rang (1–'+r.maxMinutes+' minuts)');
 const b=r.bands.find(x=>n<=x.minutes);const last=r.bands[r.bands.length-1];
 return cents(b?b.price:last.price+Math.ceil((n-last.minutes)/r.blockMinutes)*r.blockPrice);
}
function allocate(total,weights){const denom=sum(weights);if(!denom)return weights.map(()=>0);let values=weights.map(w=>Math.floor(total*w/denom)),left=total-sum(values);const order=weights.map((w,i)=>({i,remainder:total*w/denom-values[i]})).sort((a,b)=>b.remainder-a.remainder||a.i-b.i);for(let i=0;i<left;i++)values[order[i%order.length].i]++;return values}
function calculate(q){
 const r=q.rates,discount=Number(q.discount||0)/100;
 const lines=q.lines.map(l=>{let performance=l.agreed!==''&&l.agreed!=null?cents(l.agreed):tariff(l.duration,r);let travel=cents(Number(l.km||0)*Number(l.cars||0)*r.km),extra=cents(l.extra||0);return {performance,travel,extra,subtotal:performance+travel+extra}});
 const weights=lines.map(l=>r.discountScope==='performance'?l.performance:l.subtotal),discountTotal=Math.round(sum(weights)*discount),discounts=allocate(discountTotal,weights);
 const bases=lines.map((l,i)=>l.subtotal-discounts[i]),base=sum(bases),vatTotal=r.vatMode==='added'?Math.round(base*r.vat/100):r.vatMode==='included'?base-Math.round(base/(1+r.vat/100)):0,vats=allocate(vatTotal,bases);
 lines.forEach((l,i)=>Object.assign(l,{discount:discounts[i],vat:vats[i],total:bases[i]+(r.vatMode==='added'?vats[i]:0),net:r.vatMode==='included'?bases[i]-vats[i]:bases[i]}));
 const totals={};for(const k of ['performance','travel','extra','subtotal','discount','vat','total','net'])totals[k]=sum(lines.map(l=>l[k]));return {...totals,lines};
}
const qClient=q=>data.clients.find(c=>c.id===q.clientId);
const clientName=q=>qClient(q)?.name||q.clientSnapshot?.name||'Client no disponible';
const records=q=>data.ledger.filter(x=>x.quoteId===q.id);
const recordSum=(q,kind,eventId)=>sum(records(q).filter(x=>x.kind===kind&&(!eventId||x.eventId===eventId)).map(x=>x.amount));
const paid=(q,e)=>recordSum(q,'payment',e)+recordSum(q,'advance',e);
const live=q=>['accepted','finished'].includes(q.status);
const pill=s=>`<span class="pill ${['accepted','finished'].includes(s)?'pill-yes':s==='pending'?'pill-maybe':['cancelled','rejected'].includes(s)?'pill-no':'pill-pending'}">${STATUS[s]}</span>`;
const action=(label,a,id='',cls='btn btn-ghost btn-sm',extra='')=>btn(label,'eco-'+a,cls,`data-id="${esc(id)}" ${extra}`);
function field(label,name,value='',type='text',extra=''){return `<div class="field"><label>${label}</label><input class="input" name="${name}" type="${type}" value="${esc(value)}" ${extra}/></div>`}
function selectField(label,name,options,value,extra=''){return `<div class="field"><label>${label}</label><select class="input" name="${name}" ${extra}>${options.map(x=>{let [k,v]=Array.isArray(x)?x:[x,x];return `<option value="${esc(k)}" ${String(value)===String(k)?'selected':''}>${esc(v)}</option>`}).join('')}</select></div>`}
function textField(label,name,value='',extra=''){return `<div class="field"><label>${label}</label><textarea class="input" name="${name}" ${extra}>${esc(value)}</textarea></div>`}
function dialog(title,body,footer='',wide=false){return `<div class="modal-backdrop" data-action="backdrop"><div class="modal ${wide?'eco-wide':''}" role="dialog" aria-modal="true" aria-label="${esc(title)}"><div class="modal-head"><div><div class="eyebrow">XÀLDIGA · ECONOMIA PRIVADA</div><h2>${title}</h2></div>${btn(ic('x',18),'close-modal','icon-button','aria-label="Tancar"')}</div><div class="modal-body">${body}</div><div class="modal-foot">${footer||btn('Tancar','close-modal','btn btn-ghost')}</div></div></div>`}
function lineMatches(l,year=eco.year){return (!year||l.date.startsWith(year))&&(!eco.month||l.date.slice(5,7)===eco.month)&&(!eco.type||l.type===eco.type)}
function filteredQuotes(year=eco.year){return data.quotes.filter(q=>q.lines.some(l=>lineMatches(l,year))&&(!eco.filterClient||q.clientId===eco.filterClient)&&(!eco.status||q.status===eco.status))}
function filteredLedger(year=eco.year){return data.ledger.filter(x=>{const q=data.quotes.find(q=>q.id===x.quoteId),l=q?.lines.find(l=>l.eventId===x.eventId);return q&&(!eco.filterClient||q.clientId===eco.filterClient)&&(!eco.status||q.status===eco.status)&&(!eco.type||l?.type===eco.type)&&(!year||x.date.startsWith(year))&&(!eco.month||x.date.slice(5,7)===eco.month)})}
function selectedAmount(q,key,year=eco.year){const calc=calculate(q);return sum(q.lines.map((l,i)=>lineMatches(l,year)?calc.lines[i][key]:0))}
function indicators(year=eco.year){
 const qs=filteredQuotes(year),lg=filteredLedger(year),accepted=qs.filter(live),contracted=sum(accepted.map(q=>selectedAmount(q,'total',year))),income=sum(lg.filter(x=>['payment','advance'].includes(x.kind)).map(x=>x.amount)),tips=sum(lg.filter(x=>x.kind==='tip').map(x=>x.amount)),expenses=sum(lg.filter(x=>x.kind==='expense').map(x=>x.amount));
 return {qs,lg,accepted,contracted,income,tips,expenses,invoice:sum(lg.filter(x=>x.kind==='invoice').map(x=>x.amount)),quoted:sum(qs.map(q=>selectedAmount(q,'total',year))),pending:sum(accepted.flatMap(q=>{const calc=calculate(q);return q.lines.map((l,i)=>lineMatches(l,year)?Math.max(0,calc.lines[i].total-paid(q,l.eventId)):0)})),cashNet:income+tips-expenses,estimated:sum(accepted.map(q=>selectedAmount(q,'net',year)))+tips-expenses,conversion:qs.filter(q=>['accepted','finished','rejected'].includes(q.status)).length?Math.round(accepted.length/qs.filter(q=>['accepted','finished','rejected'].includes(q.status)).length*100):null};
}
function filters(){const years=[...new Set([String(today().getFullYear()),String(today().getFullYear()-1),...data.quotes.flatMap(q=>q.lines.map(l=>l.date.slice(0,4))),...data.ledger.map(x=>x.date.slice(0,4))])].sort().reverse();return `<div class="eco-filters card card-pad">${selectField('Any','year',[['','Tots els anys'],...years],eco.year,'data-eco-filter="year"')}${selectField('Mes','month',[['','Tots els mesos'],...MONTHS.map((m,i)=>[String(i+1).padStart(2,'0'),m])],eco.month,'data-eco-filter="month"')}${selectField('Client','filterClient',[['','Tots els clients'],...data.clients.map(c=>[c.id,c.name])],eco.filterClient,'data-eco-filter="filterClient"')}${selectField('Estat','status',[['','Tots els estats'],...Object.entries(STATUS)],eco.status,'data-eco-filter="status"')}${selectField('Actuació','type',[['','Tots els tipus'],...data.rates.types],eco.type,'data-eco-filter="type"')}</div>`}
function kpis(items){return `<div class="eco-kpis">${items.map(([label,value,note])=>`<div class="card stat-card"><div class="stat-label">${label}</div><div class="eco-number">${value}</div><div class="stat-foot">${note||''}</div></div>`).join('')}</div>`}
function renderEconomy(){
 if(!economyAccess())return '';
 let content=eco.tab==='clients'?renderClients():eco.tab==='quotes'?renderQuotes():eco.tab==='settings'?renderSettings():renderEconomicSummary(eco.tab==='stats');
 return `${head('GESTIÓ COMERCIAL I ECONÒMICA','Economia','Del primer contacte al cobrament. Imports i dades de clients reservats a gestors autoritzats.',action(ic('plus',15)+' Nou client','client-new','','btn btn-primary')+action('Còpia de seguretat','backup')+action('Importar còpia','import'))}<div class="eco-tabs">${[['summary','Resum econòmic'],['clients','Clients'],['quotes','Pressupostos i esdeveniments'],['stats','Estadístiques'],['settings','Tarifes i configuració']].map(([k,v])=>action(v,'tab',k,'btn '+(eco.tab===k?'btn-primary':'btn-ghost'))).join('')}</div>${content}<input hidden type="file" id="eco-import-file" accept="application/json,.json"/>`;
}
function renderEconomicSummary(full=false){
 const s=indicators(),pending=s.qs.filter(q=>q.status==='pending');
 return filters()+kpis([['Contractat',eur(s.contracted),'Acceptats i finalitzats · data d’actuació'],['Cobrat',eur(s.income),'Cobraments i bestretes · data de moviment'],['Pendent de cobrar',eur(s.pending),'Saldo dels contractes seleccionats'],['Propines',eur(s.tips),'Separades de l’import contractat'],['Pressupostat',eur(s.quoted),'Inclou esborranys i ofertes no acceptades'],['Facturat',eur(s.invoice),'Només factures registrades manualment'],['Despeses',eur(s.expenses),'Despeses reals registrades'],['Resultat de caixa',eur(s.cashNet),'Cobrat + propines − despeses; inclou IVA'],['Resultat net estimat',eur(s.estimated),'Contractat sense IVA + propines − despeses']])+`<div class="callout mb12">Imports amb IVA quan correspon. La data de l’actuació filtra els contractes; la data del moviment filtra cobraments, factures, despeses i propines. No es consideren ingressos les ofertes pendents.</div>`+kpis([['Actuacions contractades',String(sum(s.accepted.map(q=>q.lines.filter(l=>lineMatches(l)).length))),''],['Esperant resposta',String(pending.length),'Pressupostos pendents'],['Pressupostos rebutjats',String(s.qs.filter(q=>q.status==='rejected').length),''],['Conversió',s.conversion==null?'—':s.conversion+'%','Acceptats ÷ (acceptats + rebutjats)']])+`<section class="card card-pad mb12"><div class="card-heading"><h3 class="card-title">Esperant resposta del client</h3>${action('Tots els pressupostos','tab','quotes')}</div>${pending.length?quoteTable(pending):'<div class="empty-state">Cap oferta pendent. Crea un client i prepara el primer pressupost.</div>'}</section>`+(full?renderCharts(s):`<section class="card card-pad"><h3 class="card-title mb12">Activitat mensual</h3>${monthlyChart(s)}${action('Veure totes les estadístiques','tab','stats')}</section>`);
}
function monthlyData(s,year=eco.year){return MONTHS.map((m,i)=>{const ix=String(i+1).padStart(2,'0'),lg=s.lg.filter(x=>x.date.slice(5,7)===ix),qs=s.accepted;return {label:m.slice(0,3),income:sum(lg.filter(x=>['payment','advance'].includes(x.kind)).map(x=>x.amount)),invoice:sum(lg.filter(x=>x.kind==='invoice').map(x=>x.amount)),expenses:sum(lg.filter(x=>x.kind==='expense').map(x=>x.amount)),tips:sum(lg.filter(x=>x.kind==='tip').map(x=>x.amount)),acts:sum(qs.map(q=>q.lines.filter(l=>l.date.slice(5,7)===ix&&lineMatches(l,year)).length))}})}
function monthlyChart(s,keys=['income','expenses'],labels=['Cobrat','Despeses']){const rows=monthlyData(s),max=Math.max(1,...rows.flatMap(r=>keys.map(k=>r[k])));return `<div class="eco-chart-legend">${keys.map((k,i)=>`<span><i style="background:${['var(--purple)','var(--lime)','#e5ae4b'][i]}"></i>${labels[i]}</span>`).join('')}</div><div class="eco-chart" role="img" aria-label="Gràfic mensual. Els valors exactes es mostren sota cada mes.">${rows.map(r=>`<div class="eco-month"><div class="eco-bars">${keys.map((k,i)=>`<div title="${r.label} · ${labels[i]}: ${k==='acts'?r[k]:eur(r[k])}" style="height:${r[k]?Math.max(2,r[k]/max*130):0}px;background:${['var(--purple)','var(--lime)','#e5ae4b'][i]}"></div>`).join('')}</div><b>${r.label}</b><small>${keys.map(k=>k==='acts'?r[k]:eur(r[k])).join('<br>')}</small></div>`).join('')}</div>`}
function ranking(title,entries,count=false){let pairs=Object.entries(entries).sort((a,b)=>b[1]-a[1]),max=Math.max(1,...pairs.map(x=>x[1]));return `<section class="card card-pad"><h3 class="card-title mb12">${title}</h3>${pairs.length?pairs.slice(0,8).map(([name,value])=>`<div class="coverage-row"><div class="coverage-label"><strong>${esc(name)}</strong><span>${count?value:eur(value)}</span></div><div class="bar"><i style="width:${value/max*100}%"></i></div></div>`).join(''):'<div class="empty-state">Encara no hi ha dades.</div>'}</section>`}
function renderCharts(s){let clients={},types={};s.accepted.forEach(q=>{clients[clientName(q)]=(clients[clientName(q)]||0)+q.lines.filter(l=>lineMatches(l)).length;q.lines.forEach((l,i)=>{if(lineMatches(l))types[l.type]=(types[l.type]||0)+calculate(q).lines[i].total})});let prev=eco.year?indicators(String(Number(eco.year)-1)):null;return `<div class="eco-chart-grid"><section class="card card-pad"><h3 class="card-title">Evolució dels cobraments</h3>${monthlyChart(s,['income'],['Cobrat'])}</section><section class="card card-pad"><h3 class="card-title">Facturació i despeses</h3>${monthlyChart(s,['invoice','expenses'],['Facturat','Despeses'])}</section><section class="card card-pad"><h3 class="card-title">Propines per mes</h3>${monthlyChart(s,['tips'],['Propines'])}</section><section class="card card-pad"><h3 class="card-title">Actuacions per mes</h3>${monthlyChart(s,['acts'],['Actuacions'])}</section>${ranking('Clients que més contracten',clients,true)}${ranking('Import contractat per tipus d’actuació',types)}${ranking('Pressupostos acceptats i rebutjats',{'Acceptats / finalitzats':s.accepted.length,'Rebutjats':s.qs.filter(q=>q.status==='rejected').length},true)}<section class="card card-pad"><h3 class="card-title mb12">Comparativa amb l’any anterior</h3>${!prev?'<p>Selecciona un any concret.</p>':!prev.lg.length&&!prev.qs.length?'<div class="empty-state">Encara no hi ha dades de l’any anterior.</div>':`<p>${eco.year}: <b>${eur(s.income)}</b> cobrats</p><p class="mt12">${Number(eco.year)-1}: <b>${eur(prev.income)}</b> cobrats</p><p class="mt12">Variació: ${prev.income?Math.round((s.income/prev.income-1)*100)+'%':'Sense base comparable'}</p>`}</section></div>`}
function clientTotals(c){const qs=data.quotes.filter(q=>q.clientId===c.id),accepted=qs.filter(live);return {qs,accepted,quoted:sum(qs.map(q=>calculate(q).total)),contracted:sum(accepted.map(q=>calculate(q).total)),pending:sum(accepted.map(q=>Math.max(0,calculate(q).total-paid(q)))),invoice:sum(qs.map(q=>recordSum(q,'invoice'))),last:accepted.flatMap(q=>q.lines.map(l=>l.date)).sort().reverse()[0]}}
function renderClients(){const c=data.clients.find(c=>c.id===eco.client);if(c){let s=clientTotals(c);return `<section class="card card-pad mb12"><div class="card-heading"><div><div class="eyebrow">FITXA DEL CLIENT</div><h2>${esc(c.name)}</h2></div><div class="actions">${action('Tornar a clients','client-back')}${action('Editar client','client-edit',c.id)}${action('+ Nou pressupost / Esdeveniment','quote-new',c.id,'btn btn-primary')}</div></div><div class="eco-client-info">${[['Contacte',c.contact],['Telèfon',c.phone],['Correu',c.email],['Adreça',c.address],['Municipi',c.town],['NIF/CIF',c.nif],['Tipus',c.type],['Observacions',c.notes]].map(([k,v])=>`<div><small>${k}</small><strong>${esc(v||'—')}</strong></div>`).join('')}</div></section>${kpis([['Pressupostat',eur(s.quoted),''],['Acceptat',eur(s.contracted),''],['Pendent',eur(s.pending),''],['Facturació acumulada',eur(s.invoice),''],['Última actuació contractada',s.last?shortDate(s.last):'—','']])}<section class="card card-pad"><h3 class="card-title mb12">Historial de pressupostos i actuacions</h3>${quoteTable(s.qs)}</section>`}
 let list=data.clients.filter(c=>(!eco.query||c.name.toLocaleLowerCase('ca').includes(eco.query.toLocaleLowerCase('ca')))&&(!eco.clientType||c.type===eco.clientType));return `<section class="card card-pad"><div class="card-heading"><h3 class="card-title">Clients de la colla · ${data.clients.length}</h3>${action('+ Nou client','client-new','','btn btn-primary')}</div><div class="eco-filters"><div class="field"><label>Cerca pel nom</label><input class="input" id="eco-client-query" placeholder="Client, empresa o entitat" value="${esc(eco.query)}"/></div>${selectField('Tipus de client','clientType',[['','Tots els tipus'],...Object.keys(data.rates.discounts)],eco.clientType,'data-eco-filter="clientType"')}</div><div class="responsive-table"><table class="member-table"><thead><tr><th>Client / entitat</th><th>Contacte</th><th>Tipus</th><th>Historial</th><th>Accions</th></tr></thead><tbody id="eco-client-list">${clientRows(list)}</tbody></table></div></section>`}
function clientRows(list){return list.map(c=>`<tr><td><strong>${esc(c.name)}</strong><small class="eco-small">${esc(c.town||'')}</small></td><td>${esc(c.contact||'—')}<small class="eco-small">${esc(c.email||c.phone||'')}</small></td><td>${esc(c.type)}</td><td>${clientTotals(c).qs.length} pressupostos</td><td><div class="actions">${action('Obrir fitxa','client-open',c.id)}${action('Editar','client-edit',c.id)}${action('+ Pressupost','quote-new',c.id,'btn btn-primary btn-sm')}</div></td></tr>`).join('')||'<tr><td colspan="5"><div class="empty-state">Crea el primer client per començar.</div></td></tr>'}
function quoteTable(qs){if(!qs.length)return '<div class="empty-state">Sense pressupostos. Obre un client i prem «Nou pressupost / Esdeveniment».</div>';let order={pending:0,draft:1,accepted:2,finished:3,rejected:4,cancelled:5};return `<div class="responsive-table"><table class="member-table"><thead><tr><th>Referència / Client</th><th>Actuació</th><th>Data</th><th>Estat</th><th>Total</th><th>Accions</th></tr></thead><tbody>${[...qs].sort((a,b)=>order[a.status]-order[b.status]||b.createdAt-a.createdAt).map(q=>`<tr><td><strong>${esc(q.number)}</strong><small class="eco-small">${esc(clientName(q))}</small></td><td>${esc(q.title)}${q.lines.length>1?`<small class="eco-small">${q.lines.length} actuacions</small>`:''}</td><td>${shortDate(q.lines[0].date)}</td><td>${pill(q.status)}</td><td><b>${eur(calculate(q).total)}</b></td><td>${action('Obrir','quote-open',q.id,'btn btn-primary btn-sm')}${action('Duplicar','quote-duplicate',q.id)}</td></tr>`).join('')}</tbody></table></div>`}
function renderQuotes(){return filters()+`<section class="card card-pad"><div class="card-heading"><h3 class="card-title">Pressupostos i esdeveniments</h3>${action('Seleccionar client','tab','clients','btn btn-primary')}</div>${quoteTable(filteredQuotes())}</section>`}
function blankLine(){return {id:uid('line'),date:ds(addDays(today(),7)),time:'18:00',type:data.rates.types[0],place:'',town:'',duration:30,km:0,cars:0,extra:0,agreed:''}}
function newQuote(c,source){let year=today().getFullYear();data.quoteCounter[year]=(data.quoteCounter[year]||0)+1;let q=source?clone(source):{title:'',clientId:c.id,discount:data.rates.discounts[c.type]??0,rates:clone(data.rates),lines:[blankLine()],notes:'',specific:'',advanceExpected:0,musicians:'',managedBy:''};Object.assign(q,{id:uid('quote'),number:'XAL-'+year+'-'+String(data.quoteCounter[year]).padStart(4,'0'),issued:ds(today()),createdAt:Date.now(),status:'draft',history:[{status:'draft',at:Date.now(),by:current().id}],clientSnapshot:null,generatedAt:null});q.lines.forEach(l=>{l.id=uid('line');delete l.eventId});data.quotes.push(q);save();return q}
function quoteEditor(q){let c=qClient(q);return `<form id="eco-quote-form" data-id="${q.id}"><div class="callout mb12">${esc(q.number)} · ${esc(c?.name)} · Tarifa conservada v${q.rates.version}. La generació del PDF no marca l’oferta com a enviada.</div><div class="form-row">${field('Nom de l’esdeveniment *','title',q.title,'text','required maxlength="150"')}${field('Data d’emissió *','issued',q.issued,'date','required')}${field('Gestionat per','managedBy',q.managedBy)}${field('Nombre de músics (informatiu)','musicians',q.musicians,'number','min="0" max="28"')}${field('Descompte (%)','discount',q.discount,'number','min="0" max="100" step="0.01" required')}${field('Bestreta prevista (€) · no és un cobrament','advanceExpected',q.advanceExpected,'number','min="0" step="0.01"')}</div><div id="eco-lines">${q.lines.map((l,i)=>lineEditor(l,i,q.rates)).join('')}</div><div class="actions mt12">${q.lines.length<6?action('+ Afegir actuació','line-add',q.id):''}</div><div class="form-row mt12">${textField('Observacions','notes',q.notes)}${textField('Condicions específiques','specific',q.specific)}</div><div id="eco-live-total" class="eco-live-total mt12">${budgetBreakdown(q)}</div></form>`}
function lineEditor(l,i,r){return `<section class="eco-line card card-pad mt12" data-line="${l.id}"><div class="card-heading"><strong>Actuació ${i+1}</strong>${i?action('Eliminar línia','line-remove',l.id):''}</div><div class="form-row">${field('Data *','date',l.date,'date','required')}${field('Hora *','time',l.time,'time','required')}${selectField('Tipus d’actuació','type',r.types,l.type)}${field('Ubicació *','place',l.place,'text','required')}${field('Municipi','town',l.town)}${field('Durada (min) *','duration',l.duration,'number',`required min="1" max="${r.maxMinutes}" step="1"`)}${field('Km totals · anada i tornada','km',l.km,'number','min="0" step="0.01" required')}${field('Nombre de cotxes','cars',l.cars,'number','min="0" max="99" step="1" required')}${field('Preu pactat (€) · opcional','agreed',l.agreed,'number','min="0" step="0.01"')}${field('Altres imports (€)','extra',l.extra,'number','min="0" step="0.01" required')}</div></section>`}
function readQuoteForm(validate=true){let f=document.getElementById('eco-quote-form');if(!f)return null;if(validate&&!f.reportValidity())return null;let old=data.quotes.find(q=>q.id===f.dataset.id),q=clone(old),val=n=>f.querySelector(`[name="${n}"]`).value;for(const k of ['title','issued','managedBy','musicians','notes','specific'])q[k]=val(k);for(const k of ['discount','advanceExpected'])q[k]=Number(val(k));q.lines=[...f.querySelectorAll('[data-line]')].map(el=>{const v=n=>el.querySelector(`[name="${n}"]`).value;let l={id:el.dataset.line};for(const k of ['date','time','type','place','town','agreed'])l[k]=v(k);for(const k of ['duration','km','cars','extra'])l[k]=Number(v(k));return l});if(validate){if(!q.title.trim()){toast('Indica el nom de l’esdeveniment');return null}for(const l of q.lines){if((l.km>0)!==(l.cars>0)){toast('Indica tant els quilòmetres com els cotxes per al desplaçament');return null}}try{let calc=calculate(q);if(cents(q.advanceExpected)>calc.total){toast('La bestreta prevista supera el pressupost');return null}}catch(e){toast(e.message);return null}}return q}
function budgetBreakdown(q){try{let c=calculate(q);return `<div class="eco-totals">${[['Actuacions',c.performance],['Desplaçament',c.travel],['Altres imports',c.extra],['Subtotal',c.subtotal],['Descompte',-c.discount],[q.rates.vatMode==='included'?'IVA inclòs':q.rates.vatMode==='added'?'IVA afegit':'IVA · '+MODES[q.rates.vatMode],c.vat]].map(([k,v])=>`<div><span>${k}</span><b>${eur(v)}</b></div>`).join('')}<div class="eco-total-final"><span>TOTAL</span><b>${eur(c.total)}</b></div><div><span>Bestreta prevista</span><b>${eur(cents(q.advanceExpected||0))}</b></div><div><span>A abonar després de la bestreta prevista</span><b>${eur(c.total-cents(q.advanceExpected||0))}</b></div></div>`}catch(e){return `<div class="callout">${esc(e.message)}</div>`}}
function pendingValidation(r){let out=[];if(!r.formulaValidated)out.push('Validar la interpretació dels trams: el simulador original conté resultats incoherents');if(r.vatMode==='pending')out.push('Confirmar el tractament de l’IVA');for(const k of ['group','entity','nif','address','phone','email','iban','insurance','signer'])if(!r.legal[k]||r.legal[k].includes('['))out.push('Completar '+({insurance:'assegurança RC',signer:'responsable signant'}[k]||k));if(!r.conditionsValidated||r.conditions.some(c=>!c.text.trim()||c.text.includes('Pendent de validar')))out.push('Validar les condicions amb la junta i completar les clàusules 7 i 9');return out}
function quoteDetail(q){let c=calculate(q),warnings=pendingValidation(q.rates);return `<div class="eco-quote-head"><div><div class="eyebrow">${esc(q.number)}</div><h2>${esc(q.title)}</h2><p class="page-sub">${esc(clientName(q))} · ${shortDate(q.issued)}</p></div>${pill(q.status)}</div>${warnings.length?`<div class="eco-warning"><strong>Esborrany de condicions · pendent de validar</strong><ul>${warnings.map(w=>`<li>${esc(w)}</li>`).join('')}</ul><p>La vista prèvia està disponible. Resol aquests punts a Tarifes i aplica la configuració al pressupost abans de marcar-lo presentat.</p></div>`:''}<div class="actions mt12">${['draft','pending'].includes(q.status)?action('Editar pressupost','quote-edit',q.id):''}${action('Duplicar','quote-duplicate',q.id)}${action('Vista prèvia / PDF','preview',q.id,'btn btn-primary')}${q.status==='draft'?action('Marcar presentat · enviament manual','pending',q.id,'btn btn-lime'):''}${q.status==='pending'?action('Acceptar / Confirmar actuació','accept',q.id,'btn btn-lime')+action('Rebutjar','reject',q.id,'btn btn-danger'):''}${q.status==='accepted'?action('Finalitzar','finish',q.id):''}${['draft','pending','accepted','finished'].includes(q.status)?action('Cancel·lar pressupost','cancel-confirm',q.id,'btn btn-danger'):''}${['draft','pending'].includes(q.status)?action('Aplicar configuració actual','refresh-confirm',q.id):''}</div><div class="eco-client-info mt20">${q.lines.map(l=>`<div><small>${esc(l.type)} · ${l.duration} min</small><strong>${shortDate(l.date)} · ${esc(l.time)}</strong><p>${esc(l.place)} · ${esc(l.town)}</p>${l.eventId&&data.events.some(e=>e.id===l.eventId)?btn('Obrir convocatòria','event','btn btn-ghost btn-sm','data-id="'+l.eventId+'"'):''}</div>`).join('')}</div><div class="mt20">${budgetBreakdown(q)}</div>${q.notes?`<p class="detail-description mt12">${esc(q.notes)}</p>`:''}${q.specific?`<p class="detail-description mt12">Condicions específiques: ${esc(q.specific)}</p>`:''}${live(q)||q.status==='cancelled'?ledgerPanel(q):''}<details class="mt20"><summary>Historial dels canvis d’estat</summary>${q.history.map(h=>`<p class="page-sub">${new Date(h.at).toLocaleString('ca-ES')} · ${STATUS[h.status]||esc(h.status)} · ${esc(data.members.find(m=>m.id===h.by)?.name||'Gestor de configuració · DEMO')}</p>`).join('')}</details>`}
function ledgerPanel(q,eventId){const c=calculate(q),lineIndex=q.lines.findIndex(l=>l.eventId===eventId),total=eventId&&lineIndex>=0?c.lines[lineIndex].total:c.total,ps=paid(q,eventId),expenses=recordSum(q,'expense',eventId),tips=recordSum(q,'tip',eventId),lg=records(q).filter(x=>!eventId||x.eventId===eventId);return `<section class="card card-pad mt20"><div class="card-heading"><div><div class="eyebrow">ECONOMIA PRIVADA</div><h3 class="card-title">Cobraments, despeses i propines</h3></div>${action('+ Nou moviment','entry-new',q.id,'btn btn-primary',`data-event="${eventId||''}"`)}</div><p class="page-sub">${esc(clientName(q))} · ${esc(q.number)} · ${ps>=total?'Cobrat':ps?'Cobrament parcial':'Pendent de cobrament'}</p>${kpis([['Import contractat',eur(total),''],['Bestretes cobrades',eur(recordSum(q,'advance',eventId)),'Ja incloses als diners cobrats'],['Diners cobrats',eur(ps),''],['Pendent de cobrar',eur(Math.max(0,total-ps)),''],['Saldo a retornar',eur(Math.max(0,ps-total)),'Si hi ha sobrepagament'],['Propines',eur(tips),''],['Despeses',eur(expenses),''],['Resultat de caixa',eur(ps+tips-expenses),'Cobrat + propines − despeses'],['Resultat net estimat',eur((eventId&&lineIndex>=0?c.lines[lineIndex].net:c.net)+tips-expenses),'Contractat sense IVA + propines − despeses']])}<div class="responsive-table"><table class="member-table"><thead><tr><th>Data</th><th>Concepte</th><th>Actuació / nota</th><th>Import</th><th>Accions</th></tr></thead><tbody>${lg.map(x=>`<tr><td>${shortDate(x.date)}</td><td>${ENTRY_KINDS[x.kind]}</td><td>${esc(q.lines.find(l=>l.eventId===x.eventId)?.type||'Actuació')}<small class="eco-small">${esc(x.note||'')}</small></td><td>${eur(x.amount)}</td><td>${action('Editar','entry-edit',x.id)}${action('Eliminar','entry-delete-confirm',x.id,'btn btn-danger btn-sm')}</td></tr>`).join('')||'<tr><td colspan="5"><div class="empty-state">Cap moviment registrat.</div></td></tr>'}</tbody></table></div><p class="form-help mt12">Registrar una factura no genera una factura fiscal. Les despeses de transport només es compten quan les registres com a despesa real.</p></section>`}
const ENTRY_KINDS={advance:'Bestreta cobrada',payment:'Cobrament',expense:'Despesa',tip:'Propina',invoice:'Factura emesa (registre)'};
function renderSettings(){let r=data.rates;return `${captain()?'': '<div class="callout mb12">Només el capità principal pot modificar les tarifes.</div>'}<form id="eco-rates-form"><section class="card card-pad mb12"><div class="card-heading"><div><div class="eyebrow">FONT: NUMBERS DE ROGER · TARIFES ACTUALS</div><h3 class="card-title">Tarifes v${r.version}</h3></div>${captain()?action('Desar configuració','rates-save','','btn btn-primary'):''}</div><details class="card card-pad mb12"><summary><strong>Fórmules aplicades i fonts del document</strong></summary><div class="detail-description mt12"><p>Tarifes · D8:D13 i G8:G13: primer tram amb durada màxima ≥ minuts. Per sobre de l’últim tram: preu de l’últim tram + arrodoniment a l’alça dels blocs addicionals × preu del bloc. El preu pactat substitueix el preu de tarifa.</p><p>Desplaçament = km totals d’anada i tornada × cotxes × €/km. La cel·la M23 conté 16,64 € sense fórmula conservada; aquesta regla es dedueix de 16 km × 4 cotxes × 0,26 €, les instruccions i els paràmetres del full.</p><p>Subtotal = actuacions + desplaçament + altres imports. Descompte = base seleccionada × percentatge del client, arrodonit globalment a cèntims (Pressupost O9:O10).</p><p>IVA afegit = (subtotal − descompte) × tipus; IVA inclòs = total − total ÷ (1 + tipus), arrodonits a cèntims. Total = subtotal − descompte + IVA afegit (O11:O13). El mode pendent no afegeix IVA i bloqueja presentar l’oferta.</p><p>Saldo = contractat − bestretes cobrades − altres cobraments. Propines separades. Resultat net estimat = contractat sense IVA + propines − despeses reals. La despesa del transport no es duplica automàticament.</p><p>En pressupostos de diverses actuacions, descompte i IVA s’arrodoneixen sobre el total i es reparteixen a cèntims entre les línies. Les condicions de retards i cancel·lació són clàusules del document; no s’apliquen automàticament com a recàrrecs.</p></div></details><div class="eco-warning"><strong>Incidències detectades al document</strong><p>Els resultats guardats del simulador per 45–180 minuts són 150 €, però la taula i la descripció estableixen trams diferents. Hi ha fórmules de text truncades (#NAME?), sobretot a les clàusules 7 i 9. Aquesta demo aplica els trams de la taula, no els resultats incoherents del simulador. Cal validar aquesta interpretació.</p></div><fieldset ${captain()?'':'disabled'}><div class="eco-rate-grid mt12">${r.bands.map((b,i)=>`<div class="card card-pad">${field('Tram '+(i+1)+' · fins a (min)','minutes-'+i,b.minutes,'number','min="1" required')}${field('Preu (€)','price-'+i,b.price,'number','min="0" step="0.01" required')}</div>`).join('')}</div><div class="form-row mt12">${field('Bloc addicional (min)','blockMinutes',r.blockMinutes,'number','min="1" required')}${field('Preu per bloc addicional (€)','blockPrice',r.blockPrice,'number','min="0" step="0.01" required')}${field('Durada màxima (min)','maxMinutes',r.maxMinutes,'number','min="1" required')}${field('€/km i cotxe','km',r.km,'number','min="0" step="0.001" required')}${selectField('Base del descompte','discountScope',[['performance','Només actuació'],['all','Tot el pressupost']],r.discountScope)}${selectField('Tractament de l’IVA','vatMode',Object.entries(MODES),r.vatMode)}${field('IVA (%)','vat',r.vat,'number','min="0" max="100" step="0.01" required')}${field('Validesa de l’oferta (dies)','validDays',r.validDays,'number','min="1" required')}</div><h3 class="card-title mt20 mb12">Descomptes per tipus de client</h3><div class="form-row">${Object.entries(r.discounts).map(([k,v],i)=>field(k+' (%)','discount-'+i,v,'number','min="0" max="100" step="0.01" required')).join('')}</div><h3 class="card-title mt20 mb12">Dades de l’entitat emissora</h3><div class="form-row">${Object.entries(r.legal).map(([k,v])=>field(({group:'Nom del grup',entity:'Entitat · nom legal',nif:'NIF',address:'Domicili',phone:'Telèfon',email:'Correu',iban:'IBAN',insurance:'Assegurança RC',signer:'Nom i càrrec del signant'})[k],'legal-'+k,v)).join('')}</div><h3 class="card-title mt20 mb12">Condicions generals · contingut del document original</h3><p class="form-help mb12">El document mateix indica que terminis, imports i percentatges són propostes pendents de validar amb la junta. Edita els textos i completa les dues fórmules que no s’han pogut recuperar íntegrament.</p>${r.conditions.map((c,i)=>textField((i+1)+'. '+c.title,'condition-'+i,c.text,'rows="4"')).join('')}<label class="eco-check mt12"><input type="checkbox" name="formulaValidated" ${r.formulaValidated?'checked':''}/> He validat els trams i les fórmules del pressupostador.</label><label class="eco-check mt12"><input type="checkbox" name="conditionsValidated" ${r.conditionsValidated?'checked':''}/> La junta ha validat les condicions i he completat les clàusules pendents.</label></fieldset><div class="callout mt20">Canviar les tarifes no modifica els pressupostos existents. En un esborrany o una oferta pendent pots aplicar expressament aquesta configuració.</div></section></form>`}
function saveRates(){if(!captain())return;let f=document.getElementById('eco-rates-form');if(!f.reportValidity())return;let fd=new FormData(f),r=clone(data.rates),n=k=>Number(fd.get(k));r.bands=r.bands.map((b,i)=>({minutes:n('minutes-'+i),price:n('price-'+i)}));for(let i=1;i<r.bands.length;i++)if(r.bands[i].minutes<=r.bands[i-1].minutes||r.bands[i].price<=r.bands[i-1].price){toast('Els minuts i els preus dels trams han de ser creixents');return}for(const k of ['blockMinutes','blockPrice','maxMinutes','km','vat','validDays'])r[k]=n(k);if(r.maxMinutes<r.bands.at(-1).minutes){toast('La durada màxima no pot ser menor que l’últim tram');return}for(const k of ['discountScope','vatMode'])r[k]=fd.get(k);Object.keys(r.discounts).forEach((k,i)=>r.discounts[k]=n('discount-'+i));Object.keys(r.legal).forEach(k=>r.legal[k]=String(fd.get('legal-'+k)||'').trim());r.conditions.forEach((c,i)=>c.text=String(fd.get('condition-'+i)||'').trim());r.conditionsValidated=fd.has('conditionsValidated');r.formulaValidated=fd.has('formulaValidated');r.version++;data.rates=r;save();render();toast('Tarifes desades. Les ofertes existents mantenen la seva versió.')}
function renderEconomyModal(q){if(!economyAccess())return '';let c=data.clients.find(c=>c.id===q.id),quote=data.quotes.find(x=>x.id===q.id),entry=data.ledger.find(x=>x.id===q.id);
 if(q.type==='eco-client')return dialog(c?'Editar client':'Nou client',`<form id="eco-client-form" data-id="${c?.id||''}"><div class="form-row">${field('Client, empresa o entitat *','name',c?.name,'text','required maxlength="150"')}${field('Persona de contacte','contact',c?.contact)}${field('Telèfon','phone',c?.phone,'tel')}${field('Correu electrònic','email',c?.email,'email')}${field('Adreça','address',c?.address)}${field('Municipi','town',c?.town)}${field('NIF/CIF','nif',c?.nif)}${selectField('Tipus de client','type',Object.keys(data.rates.discounts),c?.type||'General')}</div><div class="mt12">${textField('Observacions','notes',c?.notes)}</div></form>`,btn('Cancel·lar','close-modal','btn btn-ghost')+action('Desar client','client-save','','btn btn-primary'));
 if(q.type==='eco-quote-editor'&&quote)return dialog('Preparar pressupost',quoteEditor(quote),btn('Cancel·lar','close-modal','btn btn-ghost')+action('Desar esborrany','quote-save',quote.id,'btn btn-primary'),true);
 if(q.type==='eco-quote'&&quote)return dialog('Pressupost i esdeveniment',quoteDetail(quote),'',true);
 if(q.type==='eco-preview'&&quote)return dialog('Vista prèvia de l’oferta',`<div class="callout mb12">${pendingValidation(quote.rates).length?'Document de treball amb punts pendents de validar. ':''}El botó obre el diàleg d’impressió: tria «Desa com a PDF». No s’envia cap correu.</div><div id="eco-offer">${offerHTML(quote)}</div>`,btn('Tancar','close-modal','btn btn-ghost')+action('Imprimir / Desar com a PDF','print',quote.id,'btn btn-primary'),true);
 if(q.type==='eco-entry'){let x=entry||{quoteId:q.quoteId,kind:'tip',date:ds(today()),amount:0,note:'',eventId:q.eventId||''},qt=data.quotes.find(v=>v.id===x.quoteId);if(!qt||!['accepted','finished','cancelled'].includes(qt.status))return '';return dialog(entry?'Editar moviment':'Registrar moviment',`<form id="eco-entry-form" data-id="${entry?.id||''}" data-quote="${qt.id}"><div class="form-row">${selectField('Tipus de moviment','kind',Object.entries(ENTRY_KINDS),x.kind)}${field('Data *','date',x.date,'date','required')}${field('Import (€) *','amount',x.amount/100,'number','required min="0.01" step="0.01"')}${selectField('Actuació vinculada *','eventId',qt.lines.map(l=>[l.eventId,l.date+' · '+l.type+' · '+l.place]),x.eventId||qt.lines[0].eventId)}</div><div class="mt12">${textField('Concepte / anotació / número factura','note',x.note)}</div><p class="form-help mt12">Per al pressupost ${esc(qt.number)}. La bestreta prevista no compta com a cobrada fins que la registres aquí.</p></form>`,btn('Cancel·lar','close-modal','btn btn-ghost')+action('Desar moviment','entry-save','','btn btn-primary'))}
 if(q.type==='eco-confirm')return dialog(q.title,`<p class="detail-description">${esc(q.message)}</p>`,btn('Tornar','close-modal','btn btn-ghost')+action('Confirmar','confirm',q.id,'btn btn-primary',`data-operation="${q.operation}"`));
 return '';
}
function offerHTML(q){let r=q.rates,c=q.clientSnapshot||qClient(q)||{},calc=calculate(q),warnings=pendingValidation(r),valid=ds(addDays(D(q.issued),r.validDays));return `<article class="eco-offer-page"><header class="eco-offer-brand"><img src="${BRAND.logo}" alt="Xàldiga"/><div><h2>${esc(r.legal.group)}</h2><p>Secció de ${esc(r.legal.entity)}</p><p>${esc(r.legal.nif)} · ${esc(r.legal.address)}</p><p>${esc(r.legal.phone)} · ${esc(r.legal.email)}</p></div></header><div class="eco-offer-title"><h1>PRESSUPOST</h1><div><strong>${esc(q.number)}</strong><p>Emès: ${shortDate(q.issued)} · Vàlid fins: ${shortDate(valid)}</p></div></div>${warnings.length?'<div class="eco-warning"><b>DOCUMENT DE TREBALL · PENDENT DE VALIDACIÓ</b><p>'+warnings.map(esc).join(' · ')+'</p></div>':''}<div class="eco-offer-parties"><section><h3>CONTRACTANT</h3><strong>${esc(c.name||'')}</strong><p>${esc(c.nif||'')}</p><p>${esc(c.address||'')} · ${esc(c.town||'')}</p><p>${esc(c.contact||'')}</p><p>${esc(c.email||'')} · ${esc(c.phone||'')}</p></section><section><h3>ESDEVENIMENT</h3><strong>${esc(q.title)}</strong><p>${q.lines.length} actuació${q.lines.length>1?'ns':''}</p><p>${esc(q.managedBy||'')}</p></section></div><table class="eco-offer-table"><thead><tr><th>Data / hora</th><th>Actuació i ubicació</th><th>Durada</th><th>Import</th></tr></thead><tbody>${q.lines.map((l,i)=>`<tr><td>${shortDate(l.date)}<br>${esc(l.time)}</td><td><b>${esc(l.type)}</b><br>${esc(l.place)} · ${esc(l.town)}</td><td>${l.duration} min</td><td>${eur(calc.lines[i].performance)}</td></tr>`).join('')}</tbody></table><div class="eco-offer-breakdown">${budgetBreakdown(q)}</div><p class="eco-tax">${r.vatMode==='pending'?'Tractament de l’IVA pendent de confirmar.':r.vatMode==='exempt'?'Operació exempta d’IVA: tractament seleccionat per l’entitat.':MODES[r.vatMode]+' ('+r.vat+'%).'}</p><h3>FORMA DE PAGAMENT</h3><p>Transferència bancària al compte ${esc(r.legal.iban)} (concepte: pressupost ${esc(q.number)}). Termini de pagament i resta de condicions: pàgina següent.</p>${q.notes?'<p><b>Observacions:</b> '+esc(q.notes)+'</p>':''}${q.specific?'<p><b>Condicions específiques:</b> '+esc(q.specific)+'</p>':''}<div class="eco-signatures"><div><h3>ACCEPTACIÓ DEL CONTRACTANT</h3><p>Accepto el pressupost i les condicions generals.</p><p>Nom i cognoms:</p><p>DNI / En representació de:</p><p>Data i signatura:</p></div><div><h3>PER ${esc(r.legal.entity).toUpperCase()}</h3><p>Nom: ${esc(r.legal.signer)}</p><p>Data:</p><p>Signatura i segell:</p></div></div></article><article class="eco-offer-page eco-conditions"><h1>CONDICIONS GENERALS</h1><p>${esc(q.number)} · ${esc(r.legal.entity)}</p>${r.conditions.map((c,i)=>`<section><h3>${i+1}. ${esc(c.title)}</h3><p>${esc(c.text)}</p></section>`).join('')}<p class="eco-offer-foot">Aquestes condicions formen part del pressupost i s’accepten amb la seva signatura.</p></article>`}
function downloadJSON(value,name){const a=document.createElement('a');a.href=URL.createObjectURL(new Blob([JSON.stringify(value,null,2)],{type:'application/json'}));a.download=name;a.click();setTimeout(()=>URL.revokeObjectURL(a.href),1000)}
function setQuoteStatus(q,status){const allowed={draft:['pending','cancelled'],pending:['accepted','rejected','cancelled'],accepted:['finished','cancelled'],finished:['cancelled'],rejected:[],cancelled:[]};if(q.status===status)return false;if(!allowed[q.status]?.includes(status))throw Error('Aquest canvi d’estat no està permès');
 if(status==='pending'){let warnings=pendingValidation(q.rates);if(warnings.length)throw Error('Completa els apartats «Imports i IVA» i «Condicions» dins d’aquest pressupost.');if(!q.generatedAt)throw Error('Genera primer la vista prèvia del pressupost.');q.clientSnapshot=clone(qClient(q));}
 if(status==='accepted'){
  q.lines.forEach((l,i)=>{let eventId='commercial-'+q.id+'-'+l.id;l.eventId=eventId;if(data.events.some(e=>e.id===eventId))return;const event={id:eventId,quoteId:q.id,clientId:q.clientId,lineId:l.id,title:q.title+(q.lines.length>1?' · '+l.type:''),date:l.date,time:l.time,place:[l.place,l.town].filter(Boolean).join(' · '),desc:q.notes||'Actuació confirmada. Respon la teva disponibilitat.',mins:Object.fromEntries(INSTRUMENTS.map(x=>[x.id,0])),responses:{},attendance:{},formation:[],zoneOverrides:{},createdAt:Date.now(),deadlineAt:+addDays(D(l.date),-2),demo:false};data.events.push(event);notify(event)});
 }
 if(status==='cancelled'){
  const ids=q.lines.map(l=>l.eventId).filter(Boolean);q.cancelledEvents=data.events.filter(e=>ids.includes(e.id));data.events=data.events.filter(e=>!ids.includes(e.id));data.alerts=data.alerts.filter(a=>!ids.includes(a.eventId));data.alerts.unshift({id:uid('alert'),title:'Actuació cancel·lada',body:'S’ha cancel·lat '+q.title+'. Avís simulat dins de la demo.',target:'all',readBy:[],createdAt:Date.now()});
 }
 q.status=status;q.history.push({status,at:Date.now(),by:current().id});save();return true;
}
function saveClient(){let f=document.getElementById('eco-client-form');if(!f?.reportValidity())return;let fd=new FormData(f),old=data.clients.find(c=>c.id===f.dataset.id),c=old||{id:uid('client'),createdAt:Date.now()};for(const k of ['name','contact','phone','email','address','town','nif','type','notes'])c[k]=String(fd.get(k)||'').trim();if(!c.name){toast('Indica el nom del client');return}if(!old)data.clients.push(c);save();eco.client=c.id;eco.tab='clients';ui.modal=null;render();toast('Client desat')}
function saveEntry(){let f=document.getElementById('eco-entry-form');if(!f?.reportValidity())return;let fd=new FormData(f),q=data.quotes.find(q=>q.id===f.dataset.quote),old=data.ledger.find(x=>x.id===f.dataset.id);if(!q||!['accepted','finished','cancelled'].includes(q.status))return;let x={id:old?.id||uid('entry'),quoteId:q.id,eventId:fd.get('eventId'),kind:fd.get('kind'),date:fd.get('date'),amount:cents(fd.get('amount')),note:String(fd.get('note')||'').trim()};if(!ENTRY_KINDS[x.kind]||!q.lines.some(l=>l.eventId===x.eventId)||!Number.isFinite(x.amount)||x.amount<=0)return;if(old)Object.assign(old,x);else data.ledger.push(x);save();ui.modal={type:'eco-quote',id:q.id};render();toast('Moviment desat · estadístiques actualitzades')}
// V6 member editor: no assignment is implied until a manager explicitly selects it.
renderMembers=function(){if(!manager())return '';let f=ui.memberFilter,list=data.members.filter(m=>f==='all'||f==='pending'&&!m.instrument||m.instrument===f||f==='managers'&&['captain','assistant'].includes(m.role));return head('PERSONES I INSTRUMENTS','Gestió de membres','27 membres reals. Instruments i càrrecs pendents de configurar.',btn('+ Afegir tabaler','new-member','btn btn-primary'))+`<div class="callout mb12">${esc(data.migrationNote||'Els instruments i els càrrecs s’assignen expressament.')} El compte «Configuració · DEMO» permet fer la preparació inicial i no representa cap membre.</div>${kpis([['Membres',String(data.members.length),'Màxim 28'],['Instrument pendent',String(data.members.filter(m=>!m.instrument).length),''],['Capità',data.members.find(m=>m.role==='captain')?.name||'Pendent',''],['Ajudants',String(data.members.filter(m=>m.role==='assistant').length),'']])}<div class="filter-pills mb12">${[['all','Tots'],['pending','Sense instrument'],...INSTRUMENTS.map(i=>[i.id,i.plural]),['managers','Capità i ajudants']].map(([k,v])=>btn(v,'filter-member','filter-chip '+(f===k?'active':''),'data-filter="'+k+'"')).join('')}</div><section class="card card-pad"><div class="responsive-table"><table class="member-table"><thead><tr><th>Nom</th><th>Instrument</th><th>Rol</th><th>Economia</th><th>Accions</th></tr></thead><tbody>${list.map(m=>`<tr><td><strong>${esc(m.name)}</strong><small class="eco-small">${esc(m.id)}</small></td><td><select class="inline-select" aria-label="Instrument ${esc(m.name)}" data-instrument-member="${m.id}"><option value="" ${!m.instrument?'selected':''}>Pendent d’assignar</option>${INSTRUMENTS.map(i=>`<option value="${i.id}" ${m.instrument===i.id?'selected':''}>${i.name} · ${capacityUsed(i.id)}/${CAPACITY[i.id]}</option>`).join('')}</select></td><td>${captain()?`<select class="inline-select" data-eco-role="${m.id}" aria-label="Rol de ${esc(m.name)}">${Object.entries({member:'Tabaler',assistant:'Ajudant',captain:'Capità principal'}).map(([k,v])=>`<option value="${k}" ${m.role===k?'selected':''}>${v}</option>`).join('')}</select>`:esc(roleName(m.role))}</td><td>${m.role==='captain'?'Autoritzat':m.role==='assistant'&&captain()?`<label><input aria-label="Autoritzar Economia a ${esc(m.name)}" type="checkbox" data-eco-permission="${m.id}" ${m.economyAllowed?'checked':''}/> Autoritzar</label>`:m.role==='assistant'&&m.economyAllowed?'Autoritzat':'Sense accés'}</td><td>${btn('Editar','edit-member','btn btn-ghost btn-sm','data-id="'+m.id+'"')}${m.role!=='captain'&&(captain()||m.role!=='assistant')?btn(ic('trash',13),'delete-member','btn btn-danger btn-sm','data-id="'+m.id+'" aria-label="Eliminar membre"'):''}</td></tr>`).join('')}</tbody></table></div></section>`};
const originalEventView=renderEvent;
renderEvent=function(){const e=currentEvent();return originalEventView()+(economyAccess()&&e?.quoteId&&data.quotes.some(q=>q.id===e.quoteId)?ledgerPanel(data.quotes.find(q=>q.id===e.quoteId),e.id):e?.demo?'<div class="callout mt20">Actuació heretada de demostració. No compta com a historial real dels membres.</div>':'')};
const originalBoard=renderCaptainFormation;
renderCaptainFormation=function(e){return originalBoard(e)+(captain()&&data.members.some(m=>!m.instrument&&['yes','maybe'].includes(e.responses[m.id]?.status))?`<section class="card card-pad mb12"><h3 class="card-title mb12">Participants sense instrument assignat</h3><p class="form-help">Aquests participants encara no es distribueixen entre els cinc instruments.</p>${data.members.filter(m=>!m.instrument&&['yes','maybe'].includes(e.responses[m.id]?.status)).map(m=>`<p class="mt12">${esc(m.name)} · ${e.responses[m.id].status==='yes'?'Confirmat':'Indecís'}</p>`).join('')}</section>`:'')};
const originalSave=save;
save=function(){try{localStorage.setItem(LS,JSON.stringify(data));return true}catch(e){setTimeout(()=>toast('No s’han pogut desar les dades. Exporta una còpia de seguretat.'),0);return false}};

document.addEventListener('click',ev=>{const el=ev.target.closest('[data-action]');if(!el)return;const action=el.dataset.action;if(action==='people-preview-toggle'){ev.preventDefault();ev.stopImmediatePropagation();if(peoplePreview){disablePeoplePreview();localStorage.setItem('oris_xaldiga_people_preview','off')}else{enablePeoplePreview();localStorage.setItem('oris_xaldiga_people_preview','on')}render();toast(peoplePreview?'Vista simulada activada':'Has tornat a les dades reals');return}
 if(peoplePreview&&['eco-backup','eco-import','confirm-reset'].includes(action)){ev.preventDefault();ev.stopImmediatePropagation();toast('Torna a dades reals per importar, exportar una còpia o reiniciar les dades.');return}
 if(action==='nav'&&el.dataset.view==='economy'&&peoplePreview){disablePeoplePreview()}
},true);

// Handle V6.1 actions before V6's delegated handler.
document.addEventListener('click',ev=>{const el=ev.target.closest('[data-action]');if(!el)return;const a=el.dataset.action,id=el.dataset.id;if(!economyAccess()&&!['nav','close-modal'].includes(a))return;
 if(a==='eco-editor-step'||a==='eco-editor-next'){ev.preventDefault();ev.stopImmediatePropagation();quoteStep(el.dataset.quoteStep||id);return}
 if(a==='eco-quote-complete'){ev.preventDefault();ev.stopImmediatePropagation();const q=data.quotes.find(q=>q.id===id);eco.quoteStep=q.rates.vatMode==='pending'?'money':'conditions';showModal({type:'eco-quote-editor',id});return}
 if(a==='eco-stats-mode'){ev.preventDefault();ev.stopImmediatePropagation();eco.statsDemo=id==='demo';eco.filterClient='';eco.status='';eco.type='';eco.month='';render();return}
 if(['eco-quote-new','eco-quote-edit','eco-quote-duplicate'].includes(a))eco.quoteStep='event';
 if(a==='eco-client-open'){setTimeout(()=>window.scrollTo(0,0),0)}
 if(a==='eco-quote-save'){// The existing handler saves the enriched snapshot returned by readQuoteForm.
  const q=readQuoteForm(true);if(!q){ev.preventDefault();ev.stopImmediatePropagation();return}
 }
},true);
document.addEventListener('change',ev=>{if(ev.target.closest('#eco-quote-form'))updateQuoteTotal()});
document.addEventListener('submit',ev=>{if(ev.target.closest('#eco-quote-form,#eco-client-form,#eco-rates-form,#eco-entry-form,#eco-logistics-form'))ev.preventDefault()});

// Capture only V6 controls and guarded legacy actions; all other interactions stay in V5.
document.addEventListener('click',ev=>{
 const el=ev.target.closest('[data-action]');if(!el)return;let a=el.dataset.action,id=el.dataset.id;
 if(['edit-event','delete-event','confirm-delete','submit-event'].includes(a)){
  const f=document.getElementById('event-form'),event=data.events.find(e=>e.id===(id||f?.dataset.id));
  if(event?.quoteId){ev.preventDefault();ev.stopImmediatePropagation();if(!economyAccess()){toast('Aquesta actuació té un pressupost vinculat. Contacta amb un gestor d’Economia.');return}const q=data.quotes.find(q=>q.id===event.quoteId);if(a==='edit-event'){showModal({type:'eco-logistics',id:event.id});return}if(a==='delete-event'||a==='confirm-delete'){showModal({type:'eco-confirm',title:'Cancel·lar l’actuació comercial',message:'La cancel·lació es gestiona des del pressupost i retirarà les seves convocatòries del calendari. Es conserven els imports i l’historial.',operation:'cancel',id:q.id});return}}
 }
 if(a==='confirm-reset'&&!captain()){ev.preventDefault();ev.stopImmediatePropagation();return}
 if(!a.startsWith('eco-'))return;ev.preventDefault();ev.stopImmediatePropagation();if(!economyAccess())return;a=a.slice(4);
 let q=data.quotes.find(q=>q.id===id);
 try{
 if(a==='tab'){eco.tab=id;eco.client=null;render()}
 else if(a==='client-new')showModal({type:'eco-client'});
 else if(a==='client-edit')showModal({type:'eco-client',id});
 else if(a==='client-save')saveClient();
 else if(a==='client-open'){eco.tab='clients';eco.client=id;render()}
 else if(a==='client-back'){eco.client=null;render()}
 else if(a==='quote-new'){q=newQuote(data.clients.find(c=>c.id===id));showModal({type:'eco-quote-editor',id:q.id})}
 else if(a==='quote-open')showModal({type:'eco-quote',id});
 else if(a==='quote-edit'&&['draft','pending'].includes(q.status))showModal({type:'eco-quote-editor',id});
 else if(a==='quote-duplicate'){let n=newQuote(qClient(q),q);showModal({type:'eco-quote-editor',id:n.id})}
 else if(a==='quote-save'){let draft=readQuoteForm();if(!draft)return;draft.status='draft';draft.generatedAt=null;draft.clientSnapshot=null;draft.history.push({status:'draft',at:Date.now(),by:current().id});Object.assign(data.quotes.find(q=>q.id===draft.id),draft);save();showModal({type:'eco-quote',id:draft.id});toast('Pressupost desat. Encara no apareix al calendari.')}
 else if(a==='line-add'||a==='line-remove'){let draft=readQuoteForm(false);if(!draft)return;if(a==='line-add'&&draft.lines.length<6)draft.lines.push(blankLine());if(a==='line-remove')draft.lines=draft.lines.filter(l=>l.id!==id);eco.draft=draft;document.querySelector('#eco-lines').innerHTML=draft.lines.map((l,i)=>lineEditor(l,i,draft.rates)).join('');updateQuoteTotal()}
 else if(a==='preview'){q.generatedAt=Date.now();save();showModal({type:'eco-preview',id})}
 else if(a==='print')printOffer(q);
 else if(a==='pending'){setQuoteStatus(q,'pending');showModal({type:'eco-quote',id});toast('Oferta pendent d’acceptació. Enviament manual registrat.')}
 else if(a==='accept'){setQuoteStatus(q,'accepted');showModal({type:'eco-quote',id});toast('Actuació confirmada al calendari · notificació simulada')}
 else if(a==='reject'){setQuoteStatus(q,'rejected');showModal({type:'eco-quote',id})}
 else if(a==='finish'){if(q.lines.some(l=>l.date>ds(today())))throw Error('Finalitza l’actuació després de la seva data.');setQuoteStatus(q,'finished');showModal({type:'eco-quote',id})}
 else if(a==='cancel-confirm')showModal({type:'eco-confirm',title:'Cancel·lar pressupost',message:'Es conservaran pressupost, moviments i historial. Si estava acceptat, les convocatòries es retiraran del calendari.',operation:'cancel',id});
 else if(a==='refresh-confirm')showModal({type:'eco-confirm',title:'Aplicar tarifes actuals',message:'Es recalcularà aquesta oferta amb la configuració actual. Tornarà a esborrany i caldrà presentar-la de nou al client.',operation:'refresh',id});
 else if(a==='confirm'){
  let op=el.dataset.operation;if(op==='cancel')setQuoteStatus(q,'cancelled');
  if(op==='refresh'&&['draft','pending'].includes(q.status)){q.rates=clone(data.rates);q.discount=data.rates.discounts[qClient(q)?.type]??q.discount;q.status='draft';q.generatedAt=null;q.clientSnapshot=null;q.history.push({status:'draft',at:Date.now(),by:current().id});save()}
  if(op==='entry-delete'){let x=data.ledger.find(x=>x.id===id);let qid=x?.quoteId;data.ledger=data.ledger.filter(x=>x.id!==id);save();showModal({type:'eco-quote',id:qid})}else showModal({type:'eco-quote',id});
 }
 else if(a==='entry-new')showModal({type:'eco-entry',quoteId:id,eventId:el.dataset.event});
 else if(a==='entry-edit')showModal({type:'eco-entry',id});
 else if(a==='entry-save')saveEntry();
 else if(a==='entry-delete-confirm')showModal({type:'eco-confirm',title:'Eliminar moviment',message:'S’eliminarà aquest moviment i es recalcularan els saldos.',operation:'entry-delete',id});
 else if(a==='rates-save')saveRates();
 else if(a==='backup')downloadJSON({format:'oris-xaldiga-v6',exportedAt:new Date().toISOString(),data},'Xaldiga_V6_copia_'+ds(today())+'.json');
 else if(a==='import')document.getElementById('eco-import-file').click();
 else if(a==='logistics-save')saveLogistics();
 }catch(e){toast(e.message)}
},true);
function updateQuoteTotal(){try{let draft=readQuoteForm(false);if(draft)document.getElementById('eco-live-total').innerHTML=budgetBreakdown(draft)}catch(e){}}
document.addEventListener('input',ev=>{if(ev.target.closest('#eco-quote-form'))updateQuoteTotal();if(ev.target.id==='eco-client-query'){eco.query=ev.target.value;let list=data.clients.filter(c=>(!eco.clientType||c.type===eco.clientType)&&c.name.toLocaleLowerCase('ca').includes(eco.query.toLocaleLowerCase('ca')));document.getElementById('eco-client-list').innerHTML=clientRows(list)}});
document.addEventListener('change',ev=>{
 const el=ev.target;
 if(el.dataset.ecoFilter){eco[el.dataset.ecoFilter]=el.value;render();return}
 if(el.dataset.ecoRole&&captain()){let m=data.members.find(m=>m.id===el.dataset.ecoRole);if(!['member','assistant','captain'].includes(el.value))return;if(el.value==='captain')data.members.filter(x=>x.role==='captain').forEach(x=>x.role='member');m.role=el.value;if(m.role!=='assistant')m.economyAllowed=false;save();render();return}
 if(el.dataset.ecoPermission&&captain()){let m=data.members.find(m=>m.id===el.dataset.ecoPermission);if(m.role==='assistant'){m.economyAllowed=el.checked;save()}return}
 if(el.id==='eco-import-file'&&economyAccess()&&el.files[0]){el.files[0].text().then(s=>{let payload=JSON.parse(s),next=payload.data;if(payload.format!=='oris-xaldiga-v6'||!validBackup(next))throw Error('Còpia no vàlida o amb referències incompletes');downloadJSON({format:'oris-xaldiga-v6',data},'Xaldiga_abans_importacio.json');data=next;initEconomy();initAssets();data.selectedUser='demo-admin';save();ui.modal=null;render();toast('Còpia importada. S’ha descarregat una còpia prèvia.')}).catch(e=>toast('No s’ha importat: '+e.message))}
},true);
function validBackup(d){if(d?.schemaVersion!==6||!Array.isArray(d.members)||!d.members.length||!Array.isArray(d.events)||!Array.isArray(d.clients)||!Array.isArray(d.quotes)||!Array.isArray(d.ledger)||!d.rates?.bands?.length)return false;try{const cs=new Set(d.clients.map(c=>c.id)),qs=new Set(d.quotes.map(q=>q.id));if(cs.size!==d.clients.length||qs.size!==d.quotes.length)return false;d.quotes.forEach(q=>{if(!cs.has(q.clientId)||!STATUS[q.status]||!q.lines.length)throw Error();calculate(q)});return d.ledger.every(x=>qs.has(x.quoteId)&&ENTRY_KINDS[x.kind]&&Number.isInteger(x.amount)&&x.amount>0)}catch{return false}}
function printOffer(q){let frame=document.createElement('iframe');frame.style.cssText='position:fixed;width:0;height:0;border:0;right:0;bottom:0';document.body.appendChild(frame);let doc=frame.contentDocument;doc.open();doc.write('<!doctype html><html lang="ca"><head><meta charset="utf-8"><title>'+esc(q.number)+'</title><style>'+document.getElementById('eco-style').textContent+'