:root{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;color:#102235;background:#f2f5f8;font-synthesis:none;text-rendering:optimizeLegibility}*{box-sizing:border-box}body{margin:0;min-width:320px;min-height:100vh}button,input{font:inherit}button,a{-webkit-tap-highlight-color:transparent}.login-screen{min-height:100vh;display:grid;grid-template-columns:minmax(420px,.9fr) minmax(480px,1.1fr);background:#fff}.login-panel{padding:clamp(32px,7vw,96px);display:flex;flex-direction:column;justify-content:center;max-width:680px;width:100%;margin:0 auto}.login-brand{display:flex;align-items:flex-start;gap:20px;margin-bottom:42px}.brand-mark{width:44px;height:44px;border-radius:12px;display:grid;place-items:center;flex:0 0 auto;background:#0b2a4a;color:#fff;font-weight:900;letter-spacing:-.05em}.brand-mark.large{width:58px;height:58px;border-radius:16px;font-size:24px}.brand-mark.small{width:38px;height:38px}.eyebrow{margin:0 0 7px;text-transform:uppercase;letter-spacing:.12em;font-size:.72rem;font-weight:800;color:#587087}.login-brand h1{margin:0;font-size:clamp(2.4rem,6vw,4rem);line-height:.95;letter-spacing:-.05em;color:#0b2a4a}.login-subtitle{max-width:500px;line-height:1.6;color:#5d6b78;margin:18px 0 0}.login-form{display:grid;gap:18px}.login-form label{display:grid;gap:8px;font-size:.88rem;font-weight:750;color:#253b50}.login-form input{width:100%;border:1px solid #cad5df;border-radius:12px;padding:14px 15px;outline:none;background:#fff;color:#102235;transition:border-color .16s ease,box-shadow .16s ease}.login-form input:focus{border-color:#315f86;box-shadow:0 0 0 4px #315f861c}.primary-button,.secondary-button{border:0;cursor:pointer;border-radius:11px;font-weight:800;transition:transform .14s ease,opacity .14s ease,background .14s ease}.primary-button{padding:14px 18px;background:#0b2a4a;color:#fff}.primary-button:hover,.secondary-button:hover{transform:translateY(-1px)}.primary-button:disabled{opacity:.65;cursor:wait}.secondary-button{padding:10px 14px;background:#edf2f6;color:#17334d}.login-footer{margin-top:24px;color:#8190a0;font-size:.82rem}.login-side{padding:36px;display:grid;place-items:center;background:radial-gradient(circle at 70% 20%,rgba(82,139,184,.4),transparent 33%),linear-gradient(145deg,#071d32,#0b2a4a 58%,#154b72);color:#fff}.side-content{width:min(640px,100%)}.side-pill{display:inline-flex;padding:7px 11px;border:1px solid rgba(255,255,255,.22);border-radius:999px;font-size:.78rem;font-weight:800;letter-spacing:.08em}.side-content h2{margin:28px 0 18px;font-size:clamp(2rem,4vw,4.2rem);line-height:1.03;letter-spacing:-.045em}.side-content>p{max-width:570px;color:#ffffffbf;line-height:1.7}.side-grid{margin-top:42px;display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.side-grid div{min-height:110px;padding:20px;border-radius:15px;border:1px solid rgba(255,255,255,.14);background:#ffffff0f;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);display:grid;align-content:center;gap:6px}.side-grid strong{font-size:1.35rem}.side-grid span{color:#ffffffab;font-size:.82rem}.error-box{border:1px solid #e6b1b1;background:#fff4f4;color:#8c2b2b;padding:12px 14px;border-radius:10px;font-size:.88rem}.app-layout{min-height:100vh;background:#f3f6f8}.topbar{min-height:76px;background:#fff;border-bottom:1px solid #dfe6ec;display:flex;align-items:center;justify-content:space-between;padding:14px clamp(18px,4vw,54px);position:sticky;top:0;z-index:10}.topbar-brand,.user-area{display:flex;align-items:center;gap:13px}.topbar-brand>div:last-child,.user-copy{display:grid;gap:2px}.topbar-brand strong{color:#0b2a4a;letter-spacing:.05em}.topbar-brand span,.user-copy span{color:#718091;font-size:.78rem}.user-copy{text-align:right}.user-copy strong{font-size:.88rem}.page{width:min(1280px,calc(100% - 40px));margin:0 auto;padding:42px 0 70px}.page-heading{margin-bottom:26px}.page-heading h1{margin:0;font-size:clamp(2rem,4vw,3rem);letter-spacing:-.045em;color:#102d48}.stats-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-bottom:20px}.stat-card,.content-card,.message-card,.loader-card{background:#fff;border:1px solid #e0e7ed;border-radius:16px;box-shadow:0 8px 30px #142c420d}.stat-card{padding:22px;display:grid;gap:9px}.stat-card span{color:#647486;font-size:.84rem;font-weight:700}.stat-card strong{font-size:1.65rem;letter-spacing:-.04em;color:#0b2a4a}.stat-card small{color:#8492a0;line-height:1.45}.content-card{padding:28px}.content-card p:last-child{color:#607182;line-height:1.65;max-width:860px}.card-title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:20px}.card-title-row h2{margin:0;color:#163652;letter-spacing:-.03em}.status-badge{background:#eef6f1;color:#2a6943;border-radius:999px;padding:7px 10px;font-size:.75rem;font-weight:800;white-space:nowrap}.fullscreen-center{min-height:100vh;display:grid;place-items:center;padding:24px;background:#f3f6f8}.message-card,.loader-card{width:min(520px,100%);padding:32px;text-align:center}.message-card .brand-mark,.loader-card .brand-mark{margin:0 auto 20px}.message-card h1{color:#102d48}.message-card p{color:#66788a;line-height:1.6}.link-button{display:inline-block;text-decoration:none;margin-top:10px}.loader-card{width:min(360px,100%)}.loader-card p{margin-bottom:0;color:#66788a}@media(max-width:920px){.login-screen{grid-template-columns:1fr}.login-side{display:none}.stats-grid{grid-template-columns:1fr}}@media(max-width:640px){.login-panel{padding:30px 22px}.login-brand{flex-direction:column}.topbar-brand span,.user-copy{display:none}.page{width:min(100% - 28px,1280px);padding-top:28px}.card-title-row{flex-direction:column}}.users-card{margin-top:20px}.section-description{margin:8px 0 0;color:#718091;font-size:.9rem}.table-wrapper{width:100%;overflow-x:auto;margin-top:24px;border:1px solid #e1e8ee;border-radius:12px}.data-table{width:100%;border-collapse:collapse;min-width:760px;background:#fff}.data-table th,.data-table td{padding:15px 17px;text-align:left;border-bottom:1px solid #e7edf2;vertical-align:middle}.data-table th{background:#f7f9fb;color:#607182;font-size:.76rem;text-transform:uppercase;letter-spacing:.06em;font-weight:800}.data-table td{color:#344b60;font-size:.88rem}.data-table tbody tr:last-child td{border-bottom:0}.data-table tbody tr:hover{background:#fafcfd}.username-cell{color:#123754}.table-message{text-align:center!important;color:#7a8997!important;padding:28px!important}.role-badge,.account-status{display:inline-flex;align-items:center;border-radius:999px;padding:6px 9px;font-size:.72rem;font-weight:800;white-space:nowrap}.role-professional{background:#eef3f7;color:#425c72}.role-coordinator{background:#edf2fa;color:#375d88}.role-administrator{background:#f1ecf8;color:#654786}.account-active{background:#eef6f1;color:#2a6943}.account-inactive{background:#f8eeee;color:#914343}.admin-actions{display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:flex-end}.primary-button,.secondary-button{border:0;border-radius:10px;padding:10px 15px;font:inherit;font-size:.82rem;font-weight:800;cursor:pointer;transition:.15s ease}.primary-button{background:#0c3557;color:#fff}.primary-button:hover:not(:disabled){background:#082b48}.secondary-button{background:#eef2f5;color:#304b61}.secondary-button:hover:not(:disabled){background:#e2e8ed}.primary-button:disabled,.secondary-button:disabled{opacity:.6;cursor:not-allowed}.modal-backdrop{position:fixed;inset:0;z-index:1000;display:grid;place-items:center;padding:24px;background:#081b2b7a}.modal-card{width:min(560px,100%);max-height:calc(100vh - 48px);overflow-y:auto;background:#fff;border-radius:18px;box-shadow:0 24px 70px #0720343d;padding:26px}.modal-header{display:flex;justify-content:space-between;align-items:flex-start;gap:20px;margin-bottom:22px}.modal-header h2{margin:4px 0 0;color:#0b3557}.modal-close{width:36px;height:36px;border:0;border-radius:50%;background:#eef2f5;color:#385266;font-size:1.35rem;cursor:pointer}.admin-form{display:grid;gap:17px}.form-field{display:grid;gap:7px;color:#385266;font-size:.83rem;font-weight:700}.form-field input,.form-field select{width:100%;box-sizing:border-box;border:1px solid #ccd7df;border-radius:10px;padding:11px 12px;background:#fff;color:#153950;font:inherit;outline:none}.form-field input:focus,.form-field select:focus{border-color:#6286a3;box-shadow:0 0 0 3px #406f941f}.form-field small{color:#7b8995;font-size:.74rem;font-weight:500}.form-error{padding:11px 13px;border-radius:10px;background:#faeeee;color:#8c3535;font-size:.82rem;font-weight:700}.modal-actions{display:flex;justify-content:flex-end;gap:10px;padding-top:5px}@media(max-width:600px){.modal-backdrop{padding:12px}.modal-card{padding:20px}.modal-actions{flex-direction:column-reverse}.modal-actions button{width:100%}}.table-action-button{border:1px solid #cad7e0;border-radius:9px;padding:7px 11px;background:#fff;color:#174361;font:inherit;font-size:.76rem;font-weight:800;cursor:pointer}.table-action-button:hover{background:#f2f6f8;border-color:#9db2c1}.protected-badge{display:inline-flex;align-items:center;padding:6px 9px;border-radius:999px;background:#f0f2f4;color:#77838d;font-size:.72rem;font-weight:800}.form-field input:disabled{background:#f2f5f7;color:#74828d;cursor:not-allowed}.professional-filters{display:grid;grid-template-columns:repeat(4,minmax(150px,1fr));gap:12px;margin-top:24px}.filter-field{display:grid;gap:6px;color:#52697b;font-size:.76rem;font-weight:800}.filter-field input,.filter-field select{width:100%;box-sizing:border-box;border:1px solid #d3dde5;border-radius:9px;padding:10px 11px;background:#fff;color:#27465d;font:inherit;outline:none}.filter-field input:focus,.filter-field select:focus{border-color:#6c8ba3;box-shadow:0 0 0 3px #406f941a}.filter-actions{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-top:14px;color:#718091;font-size:.78rem}.professional-table{min-width:760px}@media(max-width:1050px){.professional-filters{grid-template-columns:repeat(2,minmax(180px,1fr))}}@media(max-width:600px){.professional-filters{grid-template-columns:1fr}.filter-actions{align-items:stretch;flex-direction:column}}.table-actions-inline{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.linked-professional{display:inline-flex;align-items:center;padding:6px 9px;border-radius:999px;background:#eef5f8;color:#285a72;font-size:.72rem;font-weight:800;white-space:nowrap}.link-empty{color:#8a97a1;font-size:.78rem}.link-user-summary{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;padding:14px;margin-bottom:20px;border:1px solid #e1e8ee;border-radius:12px;background:#f8fafb}.link-user-summary div{display:grid;gap:4px}.link-user-summary span{color:#7b8995;font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em}.link-user-summary strong{color:#28485f;font-size:.86rem}.link-information{padding:11px 13px;border-radius:10px;background:#f1f5f7;color:#5a6e7d;font-size:.8rem}@media(max-width:600px){.link-user-summary{grid-template-columns:1fr}}.date-fields{display:grid;grid-template-columns:1fr 1fr;gap:14px}.form-textarea{width:100%;box-sizing:border-box;resize:vertical;min-height:100px;border:1px solid #ccd7df;border-radius:10px;padding:11px 12px;background:#fff;color:#153950;font:inherit;outline:none}.form-textarea:focus{border-color:#6286a3;box-shadow:0 0 0 3px #406f941f}.description-helper{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.description-helper span{flex-shrink:0;color:#718091;font-size:.74rem;font-weight:700}.overlap-warning{padding:14px;border:1px solid #ead9a5;border-radius:10px;background:#fff9e8;color:#725b1d;font-size:.8rem}.overlap-warning strong{display:block;margin-bottom:6px}.overlap-warning p{margin:6px 0}.overlap-warning ul{margin:8px 0;padding-left:20px}.professional-summary-card{margin-bottom:20px}.professional-summary-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:14px;margin-top:20px;max-width:420px}.professional-summary-grid div{display:grid;gap:5px;padding:12px 14px;border:1px solid #e1e8ee;border-radius:10px;background:#f8fafb}.professional-summary-grid span{color:#758491;font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em}.professional-summary-grid strong{color:#294960;font-size:.88rem}.impediment-notice{margin-top:20px;padding:12px 14px;border-radius:10px;background:#f2f6f8;color:#536c7e;font-size:.8rem}.impediment-table{min-width:850px}.impediment-description{max-width:420px;white-space:normal;line-height:1.45}.impediment-status{display:inline-flex;align-items:center;border-radius:999px;padding:6px 9px;font-size:.72rem;font-weight:800;white-space:nowrap}.impediment-status-futuro{background:#eef3f7;color:#425f75}.impediment-status-em-andamento{background:#eef6f1;color:#286842}.impediment-status-encerrado{background:#f0f2f4;color:#78858e}.danger-action-button{color:#8b4242}.danger-action-button:hover{background:#faf0f0;border-color:#ddb5b5}@media(max-width:700px){.date-fields,.professional-summary-grid{grid-template-columns:1fr}}.impediments-coordinator-card{margin-top:20px}.impediment-coordinator-notice{margin-top:20px;padding:12px 14px;border-radius:10px;background:#f2f6f8;color:#536c7e;font-size:.8rem}.impediment-filters{display:grid;grid-template-columns:2fr 1fr 1fr;gap:12px;margin-top:18px}.coordinator-impediment-table{min-width:950px}@media(max-width:800px){.impediment-filters{grid-template-columns:1fr}}.schedule-manager-card{margin-bottom:20px}.schedule-slot-fields{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.schedule-create-notice{padding:12px 14px;border-radius:10px;background:#f2f6f8;color:#536c7e;font-size:.8rem;line-height:1.45}.schedule-table{min-width:900px}.schedule-status{display:inline-flex;align-items:center;padding:6px 9px;border-radius:999px;font-size:.72rem;font-weight:800;white-space:nowrap}.schedule-status-draft{background:#fff6df;color:#856718}.schedule-status-published{background:#eef6f1;color:#286842}@media(max-width:700px){.schedule-slot-fields{grid-template-columns:1fr}}.schedule-calendar-card{margin-bottom:20px}.schedule-calendar-wrapper{margin-top:24px;overflow-x:auto}.schedule-calendar-weekdays,.schedule-calendar-grid{min-width:980px;display:grid;grid-template-columns:repeat(7,1fr)}.schedule-calendar-weekdays{border:1px solid #dde6ec;border-bottom:0;border-radius:12px 12px 0 0;overflow:hidden}.schedule-calendar-weekdays div{padding:10px;background:#f5f8fa;color:#607586;text-align:center;font-size:.75rem;font-weight:800;text-transform:uppercase}.schedule-calendar-grid{border-top:1px solid #dde6ec;border-left:1px solid #dde6ec}.schedule-calendar-day{min-height:150px;box-sizing:border-box;padding:10px;border-right:1px solid #dde6ec;border-bottom:1px solid #dde6ec;background:#fff}.schedule-calendar-day-empty{background:#f7f9fa}.calendar-day-number{margin-bottom:9px;color:#183f59;font-size:.9rem;font-weight:900}.calendar-day-shifts{display:grid;gap:6px}.calendar-shift{display:flex;justify-content:space-between;align-items:center;gap:8px;border-radius:8px;padding:7px 8px;font-size:.7rem}.calendar-shift span{font-weight:700}.calendar-shift strong{font-size:.72rem}.calendar-shift-open{background:#f4f5f6;color:#667681}.calendar-shift-partial{background:#fff6df;color:#80631a}.calendar-shift-complete{background:#eef6f1;color:#296a43}.calendar-shift-empty{background:#fafbfc;color:#a0aab1}.calendar-legend{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12px}.calendar-legend-item{display:inline-flex;align-items:center;gap:6px;color:#657786;font-size:.72rem;font-weight:700}.legend-dot{width:9px;height:9px;border-radius:50%}.legend-open{background:#b9c2c8}.legend-partial{background:#d9b74c}.legend-complete{background:#5c9a72}.table-action-button-selected{background:#eef5f8;border-color:#9cb7c7;color:#174b67}.schedule-calendar-header{display:flex;align-items:flex-start;justify-content:space-between;gap:24px}.calendar-month-navigation{display:flex;align-items:center;gap:12px;margin-top:3px}.calendar-month-navigation h2{min-width:220px;margin:0;text-align:center;color:#173f5a}.calendar-navigation-button{display:grid;place-items:center;width:36px;height:36px;border:1px solid #cad6de;border-radius:10px;background:#fff;color:#234c66;font-size:1.5rem;line-height:1;cursor:pointer}.calendar-navigation-button:hover:not(:disabled){background:#f1f5f7;border-color:#9fb4c2}.calendar-navigation-button:disabled{opacity:.3;cursor:not-allowed}.calendar-schedule-meta{display:flex;align-items:center;gap:10px;margin-top:12px;color:#6b7d8a;font-size:.78rem}@media(max-width:800px){.schedule-calendar-header{flex-direction:column}.calendar-legend{justify-content:flex-start}}.calendar-shift-button{width:100%;border:0;font:inherit;text-align:left;cursor:pointer}.calendar-shift-button:hover:not(:disabled){filter:brightness(.97);box-shadow:inset 0 0 0 1px #1e435b1f}.calendar-shift-button:disabled{cursor:default}.shift-slots-modal{width:min(820px,100%)}.shift-modal-subtitle{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:8px;color:#6d7f8c;font-size:.8rem}.shift-modal-subtitle strong{color:#244c66}.shift-modal-subtitle span{padding-left:10px;border-left:1px solid #d9e1e6}.shift-slot-list{display:grid;gap:10px}.shift-slot-row{display:grid;grid-template-columns:62px minmax(220px,1fr) 145px auto;align-items:end;gap:12px;padding:13px;border:1px solid #dfe7ec;border-left-width:5px;border-radius:11px;background:#fff}.slot-visual-gray{border-left-color:#aab5bd}.slot-visual-red{border-left-color:#c56464}.slot-visual-purple{border-left-color:#8c6eb2}.shift-slot-number{display:grid;gap:2px}.shift-slot-number span{color:#80909b;font-size:.67rem;font-weight:800;text-transform:uppercase}.shift-slot-number strong{color:#123e5a;font-size:1.05rem}.shift-slot-field{display:grid;gap:6px}.shift-slot-field>span{color:#526979;font-size:.72rem;font-weight:800}.shift-slot-field select{width:100%;box-sizing:border-box;border:1px solid #ccd8df;border-radius:9px;padding:9px 10px;background:#fff;color:#24465d;font:inherit;font-size:.8rem}.shift-slot-field small{color:#7d8c96;font-size:.7rem}.shift-slot-save{min-width:78px}.shift-readonly-notice{margin-bottom:18px;padding:11px 13px;border-radius:10px;background:#f2f5f7;color:#60727f;font-size:.8rem}.assignment-impediment-warning{margin-top:18px;padding:15px;border:1px solid #e3c980;border-radius:11px;background:#fff9e8;color:#70591d;font-size:.8rem;line-height:1.45}.assignment-impediment-warning>strong{display:block;margin-bottom:7px;font-size:.86rem}.assignment-impediment-warning p{margin:7px 0}.assignment-impediment-warning ul{margin:9px 0;padding-left:20px}.override-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:13px}.danger-confirm-button{border:0;border-radius:10px;padding:10px 15px;background:#8b4444;color:#fff;font:inherit;font-size:.8rem;font-weight:800;cursor:pointer}.danger-confirm-button:disabled{opacity:.6;cursor:not-allowed}.form-success{margin-top:14px;padding:11px 13px;border-radius:10px;background:#edf6f0;color:#2d6844;font-size:.8rem;font-weight:700}@media(max-width:760px){.shift-slot-row{grid-template-columns:1fr;align-items:stretch}.shift-slot-save{width:100%}.override-actions{flex-direction:column-reverse}.override-actions button{width:100%}}.schedule-view-switcher{display:inline-flex;align-items:center;gap:4px;margin:0 0 20px;padding:4px;border:1px solid #dce5eb;border-radius:12px;background:#edf2f5}.schedule-view-button{border:0;border-radius:9px;padding:9px 16px;background:transparent;color:#667b8a;font:inherit;font-size:.8rem;font-weight:800;cursor:pointer;transition:background .15s ease,color .15s ease,box-shadow .15s ease}.schedule-view-button:hover{color:#244e68}.schedule-view-button-active{background:#fff;color:#153f5b;box-shadow:0 2px 8px #14354b14}.professional-schedule-view{margin-bottom:20px}.professional-schedule-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:24px}.professional-schedule-stats>div{display:grid;gap:5px;padding:15px 17px;border:1px solid #e0e8ed;border-radius:11px;background:#f8fafb}.professional-schedule-stats span{color:#748591;font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.04em}.professional-schedule-stats strong{color:#123d59;font-size:1.3rem}.professional-schedule-filters{display:grid;grid-template-columns:minmax(220px,2fr) minmax(160px,1fr) minmax(240px,2fr);gap:12px;margin-top:22px}.professional-schedule-list{display:grid;gap:12px;margin-top:20px}.professional-schedule-card{padding:17px;border:1px solid #dee7ec;border-radius:13px;background:#fff}.professional-schedule-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:18px}.professional-schedule-card-header h3{margin:0;color:#143f5b;font-size:1rem}.professional-schedule-card-header p{margin:5px 0 0;color:#71828e;font-size:.78rem}.professional-workload-summary{display:flex;align-items:center;gap:9px;white-space:nowrap}.professional-workload-summary strong{color:#38596e;font-size:.79rem}.professional-workload-summary span{display:inline-flex;padding:6px 9px;border-radius:999px;background:#eef4f7;color:#28536d;font-size:.75rem;font-weight:900}.professional-assignment-list{display:flex;flex-wrap:wrap;gap:8px;margin-top:15px}.professional-assignment-chip{display:inline-flex;align-items:center;gap:7px;padding:8px 10px;border:1px solid #dde5ea;border-radius:9px;background:#f8fafb;color:#486273;font-size:.74rem}.professional-assignment-chip strong{color:#183f59}.professional-assignment-chip small{padding-left:7px;border-left:1px solid #d7e0e6;color:#7b8a94;font-size:.69rem;font-weight:800}.professional-assignment-morning{border-left:4px solid #86a7b7}.professional-assignment-afternoon{border-left:4px solid #c4a652}.professional-assignment-night{border-left:4px solid #697d9a}.professional-no-assignments{margin-top:13px;padding:10px 12px;border-radius:9px;background:#f5f7f8;color:#87939b;font-size:.77rem}.professional-schedule-inactive{margin-top:11px;padding:8px 10px;border-radius:8px;background:#f8eeee;color:#874747;font-size:.74rem}.professional-schedule-empty{padding:30px;border:1px dashed #d7e1e7;border-radius:12px;color:#7a8995;text-align:center;font-size:.84rem}@media(max-width:800px){.professional-schedule-stats,.professional-schedule-filters{grid-template-columns:1fr}.professional-schedule-card-header{flex-direction:column}.professional-workload-summary{white-space:normal}}@media(max-width:520px){.schedule-view-switcher{display:grid;grid-template-columns:1fr 1fr;width:100%}.schedule-view-button{width:100%}}.shift-capacity-control{display:flex;align-items:center;justify-content:space-between;gap:18px;margin-bottom:10px;padding:14px 16px;border:1px solid #dfe7ec;border-radius:11px;background:#f8fafb}.shift-capacity-control>div:first-child{display:grid;gap:4px}.shift-capacity-control span{color:#244b64;font-size:.8rem;font-weight:800}.shift-capacity-control small{color:#7a8994;font-size:.72rem;line-height:1.4}.shift-capacity-stepper{display:inline-flex;align-items:center;gap:10px;flex:0 0 auto}.shift-capacity-stepper strong{min-width:34px;text-align:center;color:#123e5a;font-size:1.05rem}.shift-capacity-button{display:grid;place-items:center;width:34px;height:34px;border:1px solid #cbd8e0;border-radius:9px;background:#fff;color:#1e4b67;font:inherit;font-size:1.15rem;font-weight:900;line-height:1;cursor:pointer}.shift-capacity-button:hover:not(:disabled){background:#eef4f7;border-color:#9eb6c5}.shift-capacity-button:disabled{opacity:.4;cursor:not-allowed}.shift-capacity-helper{margin-bottom:16px;color:#72828e;font-size:.74rem;line-height:1.45}.shift-empty-slots{padding:24px 16px;border:1px dashed #d6e0e6;border-radius:11px;background:#fafcfd;color:#778894;text-align:center;font-size:.8rem;line-height:1.5}@media(max-width:600px){.shift-capacity-control{align-items:stretch;flex-direction:column}.shift-capacity-stepper{justify-content:flex-start}}.shift-modal-header{align-items:flex-start}.shift-modal-header-actions{display:flex;align-items:flex-start;gap:12px}.shift-modality-field{display:grid;gap:6px;min-width:180px}.shift-modality-field>span{color:#526979;font-size:.72rem;font-weight:800}.shift-modality-field select{width:100%;box-sizing:border-box;border:1px solid #ccd8df;border-radius:9px;padding:9px 10px;background:#fff;color:#24465d;font:inherit;font-size:.8rem}.shift-modality-field small{color:#7d8c96;font-size:.7rem}.shift-slot-row{grid-template-columns:62px minmax(220px,1fr) auto;border-left-width:1px}.calendar-shift-modality-gray{background:#eef1f3;color:#566b78}.calendar-shift-modality-red{background:#f6dddd;color:#8a3e3e}.calendar-shift-modality-purple{background:#d9c9e8;color:#654a82}.legend-modality-gray{background:#aab5bd}.legend-modality-red{background:#c56464}.legend-modality-purple{background:#8c6eb2}@media(max-width:700px){.shift-modal-header-actions{width:100%;justify-content:space-between}.shift-modality-field{min-width:0;flex:1}}ontem 19:11 Texto colado(7).txt Documento Faça o ajuste neste código: Texto colado(8).txt Documento [Texto colado(9).txt Documento Funcionou perfeitamente. Vamos fazer dois ajustes: Queria que por padrão a listagem dos profissionais (e a própria lista suspensa na hora de atribuir plantão) ficasse em ordem alfabética Texto colado(10).txt Documento Ajuste o CoordinatorDashboard para mim e depois aguarde eu mandar o ShiftSlotsModal para você também ajustar Além disso,troque a posição desses fatores. Quero que o posto/grad. fique mais a esquerda Os coordenadores não precisarão do número de vagas divididas por turno,deixa apenas a coluna de Vagas (que deve passar a se chamar Vagas a preencher) e a coluna de Preenchidas (que deve passar a se chamar Vagas preenchidas) Texto colado(20260823-005339).txt Documento O sistema permite apenas diminuir a quantidade de vagas e não aumentar Ficou perfeito. Vamos proceder com outra alteração: Quero que o botão de escolha da cor da escala deixe de existir individualmente para cada profissional e passe a existir para o turno de plantão. Além disso,o nome não será mais Tipo visual e sim Modalidade. Nesse sentido,quando eu escolher a cor em Modalidade,que a cor no calendário seja correspondente aquela cor. Por exemplo,escolhendo roxo o turno fique roxo. Ainda neste viés,.os nomes das cores devem estar no feminino,ficando assim: Cinza,Vermelha,Roxa,Ciano Funcionou,vamos a mais alguns ajustes: Quero que por padrão,ao criar uma nova escala,a escala venha com essa distribuição de cores que segue as seguintes regras: Sábado todos os turnos vermelhos; Domingo todos os turnos vermelhos; Turno noturno de qualquer dia vermelho; Os demais turnos que não sigam estas regras em cinza. Essa configuração padrão não deve me impedir de manualmente alterar a cor de um turno,sobrepujando estas regras,é apenas a base de como deve vir criada a escala. Por fim,estaremos excluindo a modalidade ciano styles(1).css Arquivo Modifique o styles pra mim pois não consegui achar a área a ser alterada. Vamos. Neste ponto,a montagem estrutural da escala está praticamente fechada: criação mensal,exclusão de rascunho,vagas por dia/turno,atribuição de profissionais,impedimentos,Modalidade por turno e visualização “Por profissional” já estão funcionando. A próxima etapa que eu faria é a publicação da escala. Ela é importante porque separa definitivamente o que é trabalho interno do coordenador do que passa a ser a escala oficial visível aos profissionais. Eu estruturaria assim: RASCUNHO ↓ coordenador monta e revisa ↓ [Publicar escala] ↓ confirmação ↓ PUBLICADA Depois de publicada: ✓ profissionais passam a enxergar a escala ✓ carga horária mensal passa a ser calculada ✓ "Meus plantões" passa a funcionar ✓ calendário continua disponível para consulta ✕ não pode alterar profissionais ✕ não pode alterar número de vagas ✕ não pode alterar Modalidade ✕ não pode excluir a escala Antes de colocar o botão Publicar,sugiro uma regra importante: não permitir publicação enquanto houver vagas não preenchidas. Exemplo: Setembro de 2026 Vagas a preencher: 330 Vagas preenchidas: 327 ⚠ Existem 3 vagas sem profissional. A escala ainda não pode ser publicada. Quando estiver: 330 / 330 o botão fica disponível. Também colocaria uma confirmação forte: Publicar escala de Setembro de 2026? Após a publicação,a escala ficará disponível aos profissionais e não poderá mais ser editada. 330 vagas 330 preenchidas [Cancelar] [Publicar escala] E essa proteção deve existir também no Supabase,não apenas no botão da tela. Depois dessa etapa,entramos na parte que vai transformar bastante o painel profissional: MEUS PLANTÕES Setembro de 2026 8 plantões 60 horas 03/09 Manhã 6h 07/09 Noite 12h ... seguida da funcionalidade de trocas/permutas. Portanto,proponho a sequência: Publicação → Meus plantões → carga horária → trocas. Para começarmos a publicação sem correr o risco de trabalhar sobre uma versão antiga,envie agora o ScheduleManager.tsx atual que está funcionando no seu computador. Eu faço a implementação em cima dele e devolvo o arquivo completo. hoje 12:49 1c87473e-ed98-4df7-97d7-ded77b7d699a.tsx TypeScript Perfeito. Implementei a etapa de publicação da escala diretamente sobre o ScheduleManager.tsx atual que você enviou,preservando a exclusão de rascunhos e todas as funcionalidades existentes. 1 Substitua o ScheduleManager.tsx Baixar ScheduleManager.tsx com publicação Substitua: src/components/ScheduleManager.tsx pelo arquivo acima. A tabela passará a funcionar assim: MÊS STATUS VAGAS PREENCHIDAS AÇÕES Setembro de 2026 Rascunho 330 327 Abrir | Publicar | Excluir ↑ desabilitado Outubro de 2026 Rascunho 330 330 Abrir | Publicar | Excluir ↑ habilitado O botão Publicar só fica habilitado quando: Vagas a preencher = Vagas preenchidas Se houver: 330 vagas 329 preenchidas não é possível publicar. Quando estiver completa e você clicar em Publicar,aparecerá uma confirmação: Publicar a escala de Setembro de 2026? Vagas: 330 Vagas preenchidas: 330 Após a publicação,a escala ficará disponível aos profissionais e não poderá mais ser editada. Deseja continuar? [Cancelar] [OK] Após confirmar: STATUS Publicada e os botões Publicar e Excluir desaparecem. O seu modelo já possui os campos published_at e status draft | published,então a implementação aproveita a estrutura existente. 2 Acrescente este pequeno CSS Para o botão Publicar ficar visualmente diferente,preparei o CSS: Baixar publicacao_styles.css Você não precisa procurar nenhum trecho. Abra: src/styles.css vá até a última linha e cole todo o conteúdo desse arquivo. Ele fará o botão Publicar aparecer em tom esverdeado e deixará visualmente claro quando estiver desabilitado. 3 A segurança no Supabase já está pronta Fiz duas proteções. A primeira é a função: publish_schedule Ela verifica novamente no servidor: ✓ usuário autenticado ✓ coordenador ativo ✓ escala em rascunho ✓ existe pelo menos uma vaga ✓ absolutamente todas as vagas estão preenchidas A segunda proteção é ainda mais importante: adicionei um trigger no PostgreSQL. Isso significa que nem mesmo uma tentativa de contornar o botão e alterar diretamente: draft → published funcionará se existir uma vaga vazia. Portanto,a regra: Uma escala incompleta não pode ser publicada. agora é uma regra do próprio banco. 4 Depois teste Rode: npm.cmd run build npm.cmd run dev No rascunho atual,como ainda há muitas vagas vazias,o esperado inicialmente é: [Visualizando] [Publicar] [Excluir] ↑ desabilitado Quando todas as vagas estiverem preenchidas: [Visualizando] [Publicar] [Excluir] ↑ habilitado E depois da publicação: Publicada [Visualizando] A partir daí estaremos prontos para a próxima grande etapa: fazer a escala publicada aparecer no painel do profissional,com Meus plantões e carga horária mensal. ScheduleManager_com_publicacao.tsx Código publicacao_styles.css Código Transferi o arquivo para outro PC cujo caminho agora é esse: C:UsersReis\documentsTrabalhoྫProjetossiscala-v0.1.2 Como faço para selecionar o novo caminho? No PowerShell,basta entrar na nova pasta com cd. Como o caminho tem subpastas e pode ter espaços em nomes futuros,eu usaria aspas: cd "C:UsersReis\documentsTrabalhoྫProjetossiscala-v0.1.2" Depois confirme que você está no lugar certo: pwd Deve aparecer: C:UsersReis\documentsTrabalhoྫProjetossiscala-v0.1.2 Você também pode conferir os arquivos: dir E então continuar normalmente com,por exemplo: npm.cmd run dev ou: npm.cmd run build Daqui pra frente,quando eu te passar comandos do projeto,vou considerar esse novo caminho como o caminho atual do SISCALA. Biblioteca / publicacao_styles.css .publish-schedule-button {border-color: #9dc9ae; background: #eef7f1; color: #286842;} .publish-schedule-button:hover:not(:disabled) {background: #e1f1e7; border-color: #78ad8b;} .table-action-button:disabled {opacity: .5; cursor: not-allowed;}]{}
