diff --git a/src/main/webapp/css/app.css b/src/main/webapp/css/app.css index 434e2e9..2da4c94 100644 --- a/src/main/webapp/css/app.css +++ b/src/main/webapp/css/app.css @@ -1,6 +1,1072 @@ -:root{--bg:#f6f7f9;--panel:#fff;--line:#d9dee7;--text:#1c2430;--muted:#667085;--brand:#176b87;--brand-strong:#0f5268;--ok:#1f8a5b;--warn:#b7791f;--danger:#b42318}*{box-sizing:border-box}body{margin:0;min-height:100vh;font-family:Arial,Helvetica,sans-serif;background:var(--bg);color:var(--text);user-select:none}a{color:inherit}button,input,select,textarea{font:inherit}.login-page{min-height:100vh;display:grid;place-items:center;padding:32px}.login-box,.panel{background:var(--panel);border:1px solid var(--line);border-radius:8px;box-shadow:0 16px 40px rgba(16,24,40,.08)}.login-box{width:min(440px,100%);padding:28px}.tabs,.nav-tabs{display:flex;gap:8px;border-bottom:1px solid var(--line);margin-bottom:20px}.tabs button,.nav-tabs button{border:0;background:transparent;padding:10px 12px;cursor:pointer;color:var(--muted)}.tabs button.active,.nav-tabs button.active{color:var(--brand);border-bottom:3px solid var(--brand)}.field{display:grid;gap:6px;margin-bottom:12px}label{color:var(--muted);font-size:13px}input,select,textarea{width:100%;border:1px solid var(--line);border-radius:6px;padding:10px 12px;background:#fff;user-select:text}textarea{min-height:88px;resize:vertical}.btn{border:0;border-radius:6px;padding:10px 14px;color:#fff;background:var(--brand);cursor:pointer;display:inline-flex;align-items:center;gap:8px;justify-content:center}.btn:hover{background:var(--brand-strong)}.btn.secondary{color:var(--text);background:#eef2f6}.btn.danger{background:var(--danger)}.app{display:grid;grid-template-columns:250px minmax(0,1fr);min-height:100vh}.sidebar{background:#102a38;color:#fff;padding:22px 16px;display:flex;flex-direction:column;gap:20px;position:sticky;top:0;height:100vh;overflow:hidden}.brand{font-size:20px;font-weight:700}.user{color:#c9d6df;font-size:13px}.menu{display:grid;gap:6px}.menu a{text-decoration:none;padding:10px 12px;border-radius:6px;color:#dbe6ec}.menu a.active,.menu a:hover{background:rgba(255,255,255,.12);color:#fff}.sidebar .btn{margin-top:auto;width:100%;background:rgba(255,255,255,.14)}.content{padding:28px;min-width:0}.topbar{display:flex;justify-content:space-between;gap:16px;align-items:center;margin-bottom:18px}h1{margin:0;font-size:26px}h2{margin:0 0 14px;font-size:18px}.grid{display:grid;gap:16px}.cols{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.panel{padding:18px;box-shadow:none}.panel-block{margin-top:16px}.row{display:flex;gap:10px;align-items:end;flex-wrap:wrap}.table-wrap{overflow:auto}table{width:100%;border-collapse:collapse;min-width:680px}th,td{padding:10px 8px;border-bottom:1px solid var(--line);text-align:left;font-size:14px}th{color:var(--muted);font-size:12px;text-transform:uppercase}.badge{display:inline-block;padding:4px 8px;border-radius:999px;background:#eef2f6;font-size:12px}.badge.ok{background:#dcfce7;color:var(--ok)}.badge.warn{background:#fef3c7;color:var(--warn)}.toast,.finance-banner{position:fixed;left:50%;transform:translateX(-50%);z-index:20;max-width:min(720px,calc(100vw - 24px));border-radius:8px;padding:12px 14px}.toast{bottom:18px;background:#17202a;color:#fff}.toast.error{background:var(--danger)}.finance-banner{top:12px;background:#fff7ed;border:1px solid #fed7aa;color:#9a3412}.hidden{display:none!important}.qr{max-width:260px;border:1px solid var(--line);border-radius:8px;padding:8px;background:#fff}.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}.stat{border:1px solid var(--line);border-radius:8px;padding:14px;background:#fff}.stat strong{display:block;font-size:22px;margin-top:6px}@media(max-width:820px){.app{display:block}.sidebar{position:sticky;top:0;z-index:25;height:auto;min-height:0;padding:12px 14px;gap:10px;border-bottom:1px solid rgba(255,255,255,.12);overflow:visible}.brand{font-size:18px}.user{font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.menu{display:flex;gap:8px;overflow-x:auto;padding-bottom:2px;scrollbar-width:none}.menu::-webkit-scrollbar{display:none}.menu a{flex:0 0 auto;padding:9px 12px;white-space:nowrap}.sidebar .btn{margin-top:0;width:auto;align-self:flex-start;padding:8px 12px}.content{padding:16px;overflow-x:hidden}.topbar{align-items:flex-start;margin-bottom:14px}h1{font-size:24px}.panel{padding:14px}.row{display:grid;grid-template-columns:1fr;align-items:stretch}.grid.cols{grid-template-columns:1fr;gap:10px}.field{margin-bottom:8px}.btn{width:100%;min-height:42px}.sidebar .btn,td .btn,.modal-head .btn,.calendar-toolbar .btn{width:auto}.tabs,.nav-tabs{overflow-x:auto;white-space:nowrap}.cards{grid-template-columns:1fr}.stat strong{font-size:20px}.table-wrap{margin-left:-2px;margin-right:-2px;border:1px solid var(--line);border-radius:8px;background:#fff}table{min-width:640px}th,td{padding:10px 8px}.toast{bottom:12px}.finance-banner{top:8px}}.status-action{border:0;background:transparent;padding:0;display:inline-flex;align-items:center;gap:8px;cursor:pointer}.status-action span{font-size:12px;color:var(--brand);text-decoration:underline}.status-action:hover span{color:var(--brand-strong)}.inline-panel{background:#f8fafc;border:1px solid var(--line);border-radius:8px;padding:14px}.inline-panel h2{margin-bottom:10px}.inline-panel p{margin:6px 0}.row.compact{align-items:center;gap:8px}.row.compact select{min-width:180px}.link-button{border:0;background:transparent;color:var(--brand);cursor:pointer;font-size:12px;text-decoration:underline;padding:0 0 0 6px}.link-button:hover{color:var(--brand-strong)}.finance-temp{margin-bottom:14px;border-color:#fed7aa;background:#fff7ed;color:#9a3412}.finance-temp p{margin:6px 0 0;color:#9a3412} -.modal{position:fixed;inset:0;z-index:30;display:grid;place-items:center;padding:24px}.modal-backdrop{position:absolute;inset:0;background:rgba(15,23,42,.45)}.modal-panel{position:relative;width:min(860px,100%);max-height:calc(100vh - 48px);overflow:auto;background:#fff;border:1px solid var(--line);border-radius:8px;padding:18px;box-shadow:0 24px 80px rgba(15,23,42,.24)}.modal-head{display:flex;justify-content:space-between;gap:12px;align-items:center;margin-bottom:16px}.modal-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.modal-grid h3{margin:0 0 10px;font-size:15px}.cond-item{display:flex;justify-content:space-between;gap:12px;align-items:center;border:1px solid var(--line);border-radius:8px;padding:10px;margin-bottom:8px}.muted{color:var(--muted)}@media(max-width:720px){.modal-grid{grid-template-columns:1fr}.modal{padding:12px}} -.success-message{display:inline-block;margin:0 0 10px;padding:10px 12px;border:1px solid #bbf7d0;border-radius:8px;background:#dcfce7;color:var(--ok);font-weight:700} -.section-head{display:flex;justify-content:space-between;gap:12px;align-items:center;margin-bottom:14px}.section-head h2{margin:0}.icon-btn{position:relative;width:42px;height:42px;border:1px solid var(--line);border-radius:6px;background:#fff;cursor:pointer;display:inline-grid;place-items:center}.icon-btn:hover{border-color:var(--brand);background:#eef8fb}.calendar-open::before{content:"";width:20px;height:18px;border:2px solid var(--brand);border-radius:3px;box-shadow:inset 0 5px 0 #e8f3f7;position:relative}.calendar-open::after{content:"";position:absolute;width:12px;height:2px;background:var(--brand);transform:translateY(-7px)}.calendar-modal{width:min(1120px,100%)}.calendar-layout{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:18px}.calendar-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px}.calendar-toolbar strong{text-transform:capitalize}.calendar-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));border:1px solid var(--line);border-radius:8px;overflow:hidden;background:#fff}.calendar-weekday{padding:10px;background:#f8fafc;color:var(--muted);font-size:12px;font-weight:700;text-align:center;border-bottom:1px solid var(--line)}.calendar-day{min-height:86px;border:0;border-right:1px solid var(--line);border-bottom:1px solid var(--line);background:#fff;padding:8px;text-align:left;color:var(--text);cursor:pointer;position:relative}.calendar-day:nth-child(7n+7){border-right:0}.calendar-day.other{background:#f8fafc;color:#98a2b3}.calendar-day.busy{background:#fff7ed}.calendar-day.busy span{font-weight:700;color:var(--warn)}.calendar-day.today{box-shadow:inset 0 0 0 2px var(--brand)}.calendar-day.selected{background:#e8f3f7}.calendar-day b{position:absolute;right:8px;bottom:8px;background:var(--brand);color:#fff;border-radius:999px;padding:2px 7px;font-size:12px}.calendar-side{border:1px solid var(--line);border-radius:8px;padding:14px;background:#fff;min-height:420px}.calendar-side h3{margin:0 0 12px}.calendar-event{border:1px solid var(--line);border-radius:8px;padding:10px;margin-bottom:10px;display:grid;gap:6px}.calendar-event span{font-size:13px}.calendar-event p{margin:0;color:var(--muted);font-size:13px}@media(max-width:900px){.calendar-layout{grid-template-columns:1fr}.calendar-day{min-height:64px}.calendar-side{min-height:auto}} +:root { + --bg: #f4f7fb; + --bg-soft: #edf6f5; + --panel: #ffffff; + --panel-muted: #f8fafc; + --line: #d8e1ea; + --line-strong: #bdc9d6; + --text: #182230; + --muted: #667085; + --muted-strong: #475467; + --brand: #0f766e; + --brand-strong: #115e59; + --brand-soft: #dff4f1; + --accent: #2563eb; + --accent-soft: #dbeafe; + --ok: #178457; + --ok-soft: #dcfce7; + --warn: #b7791f; + --warn-soft: #fef3c7; + --danger: #b42318; + --danger-soft: #fee4e2; + --radius-sm: 6px; + --radius: 8px; + --radius-lg: 14px; + --shadow-sm: 0 1px 2px rgba(16, 24, 40, .06); + --shadow-md: 0 14px 34px rgba(16, 24, 40, .09); + --shadow-lg: 0 26px 70px rgba(15, 23, 42, .18); + --focus: 0 0 0 4px rgba(15, 118, 110, .18); +} -@media(max-width:520px){.content{padding:12px}h1{font-size:22px}h2{font-size:17px}.panel{padding:12px;border-radius:6px}.login-page{padding:16px}.login-box{padding:20px}.modal{padding:8px;align-items:start}.modal-panel{max-height:calc(100vh - 16px);padding:14px}.modal-head{align-items:flex-start}.modal-head .btn{width:auto}.calendar-grid{font-size:12px}.calendar-weekday{padding:8px 4px}.calendar-day{min-height:54px;padding:5px}.calendar-day b{right:4px;bottom:4px;padding:1px 5px}.calendar-toolbar .btn{width:auto}.section-head{align-items:flex-start}.icon-btn{width:40px;min-width:40px}.cond-item{display:grid;grid-template-columns:1fr;align-items:stretch}.cond-item .btn{width:100%}} +* { + box-sizing: border-box; +} + +html { + min-height: 100%; + background: var(--bg); +} + +body { + margin: 0; + min-height: 100vh; + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + background: + radial-gradient(circle at top left, rgba(15, 118, 110, .10), transparent 34rem), + linear-gradient(180deg, #fbfcfe 0%, var(--bg) 26rem); + color: var(--text); + line-height: 1.45; + user-select: none; +} + +a { + color: inherit; +} + +button, +input, +select, +textarea { + font: inherit; +} + +button { + -webkit-tap-highlight-color: transparent; +} + +button:disabled, +input:disabled, +select:disabled, +textarea:disabled { + cursor: not-allowed; + opacity: .62; +} + +:focus-visible { + outline: 0; + box-shadow: var(--focus); +} + +.login-page { + min-height: 100vh; + display: grid; + place-items: center; + padding: 32px; + background: + linear-gradient(135deg, rgba(15, 118, 110, .12), rgba(37, 99, 235, .08)), + var(--bg); +} + +.login-box, +.panel { + background: rgba(255, 255, 255, .94); + border: 1px solid rgba(216, 225, 234, .92); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-sm); +} + +.login-box { + width: min(440px, 100%); + padding: 30px; + box-shadow: var(--shadow-lg); +} + +.login-box h1 { + margin-bottom: 6px; +} + +.tabs, +.nav-tabs { + display: flex; + gap: 6px; + border-bottom: 1px solid var(--line); + margin: 20px 0; +} + +.tabs button, +.nav-tabs button { + border: 0; + border-radius: var(--radius-sm) var(--radius-sm) 0 0; + background: transparent; + padding: 11px 12px; + cursor: pointer; + color: var(--muted); + font-weight: 700; +} + +.tabs button:hover, +.nav-tabs button:hover { + color: var(--brand); + background: var(--brand-soft); +} + +.tabs button.active, +.nav-tabs button.active { + color: var(--brand-strong); + border-bottom: 3px solid var(--brand); +} + +.field { + display: grid; + gap: 7px; + margin-bottom: 12px; +} + +label { + color: var(--muted-strong); + font-size: 13px; + font-weight: 700; +} + +input, +select, +textarea { + width: 100%; + min-height: 42px; + border: 1px solid var(--line); + border-radius: var(--radius); + padding: 10px 12px; + background: #fff; + color: var(--text); + user-select: text; + transition: border-color .16s ease, box-shadow .16s ease, background .16s ease; +} + +input::placeholder, +textarea::placeholder { + color: #98a2b3; +} + +input:hover, +select:hover, +textarea:hover { + border-color: var(--line-strong); +} + +input:focus, +select:focus, +textarea:focus { + border-color: var(--brand); + box-shadow: var(--focus); + outline: 0; +} + +textarea { + min-height: 96px; + resize: vertical; +} + +.btn { + min-height: 42px; + border: 0; + border-radius: var(--radius); + padding: 10px 15px; + color: #fff; + background: var(--brand); + cursor: pointer; + display: inline-flex; + align-items: center; + gap: 8px; + justify-content: center; + font-weight: 800; + text-decoration: none; + box-shadow: 0 8px 18px rgba(15, 118, 110, .18); + transition: transform .16s ease, background .16s ease, box-shadow .16s ease; +} + +.btn:hover { + background: var(--brand-strong); + transform: translateY(-1px); + box-shadow: 0 12px 24px rgba(15, 118, 110, .22); +} + +.btn:active { + transform: translateY(0); + box-shadow: none; +} + +.btn.secondary { + color: var(--text); + background: #eef4f7; + box-shadow: none; +} + +.btn.secondary:hover { + background: #dfe8ee; +} + +.btn.danger { + background: var(--danger); + box-shadow: 0 8px 18px rgba(180, 35, 24, .18); +} + +.btn.danger:hover { + background: #8f1f16; +} + +.app { + display: grid; + grid-template-columns: 264px minmax(0, 1fr); + min-height: 100vh; +} + +.sidebar { + background: linear-gradient(180deg, #10323a 0%, #102830 100%); + color: #fff; + padding: 24px 16px; + display: flex; + flex-direction: column; + gap: 22px; + position: sticky; + top: 0; + height: 100vh; + overflow: hidden; + box-shadow: inset -1px 0 0 rgba(255, 255, 255, .08); +} + +.brand { + font-size: 21px; + font-weight: 900; + letter-spacing: 0; +} + +.user { + color: #bfd0d7; + font-size: 13px; + margin: 6px 0 0; +} + +.menu { + display: grid; + gap: 6px; +} + +.menu a { + text-decoration: none; + padding: 11px 12px; + border-radius: var(--radius); + color: #dce8ed; + font-weight: 700; + transition: background .16s ease, color .16s ease, transform .16s ease; +} + +.menu a.active, +.menu a:hover { + background: rgba(255, 255, 255, .14); + color: #fff; +} + +.menu a.active { + box-shadow: inset 3px 0 0 #8ee6dc; +} + +.menu a:hover { + transform: translateX(2px); +} + +.sidebar .btn { + margin-top: auto; + width: 100%; + background: rgba(255, 255, 255, .14); + box-shadow: none; +} + +.sidebar .btn:hover { + background: rgba(255, 255, 255, .22); +} + +.content { + min-width: 0; + padding: 30px; +} + +.topbar { + display: flex; + justify-content: space-between; + gap: 16px; + align-items: center; + margin-bottom: 18px; +} + +h1, +h2, +h3 { + color: var(--text); + line-height: 1.2; +} + +h1 { + margin: 0; + font-size: 28px; + font-weight: 900; +} + +h2 { + margin: 0 0 14px; + font-size: 18px; + font-weight: 850; +} + +.grid { + display: grid; + gap: 16px; +} + +.cols { + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); +} + +.panel { + padding: 18px; + margin-bottom: 16px; +} + +.panel-block { + margin-top: 18px; +} + +.row { + display: flex; + gap: 12px; + align-items: end; + flex-wrap: wrap; +} + +.table-wrap { + overflow: auto; + border: 1px solid var(--line); + border-radius: var(--radius); + background: #fff; +} + +table { + width: 100%; + border-collapse: collapse; + min-width: 680px; +} + +th, +td { + padding: 12px 10px; + border-bottom: 1px solid var(--line); + text-align: left; + font-size: 14px; + vertical-align: middle; +} + +tbody tr:hover { + background: #f8fbfc; +} + +tbody tr:last-child td { + border-bottom: 0; +} + +th { + background: var(--panel-muted); + color: var(--muted-strong); + font-size: 12px; + font-weight: 900; + text-transform: uppercase; +} + +.badge { + display: inline-flex; + align-items: center; + min-height: 26px; + padding: 4px 9px; + border-radius: 999px; + background: #eef2f6; + color: var(--muted-strong); + font-size: 12px; + font-weight: 800; +} + +.badge.ok { + background: var(--ok-soft); + color: var(--ok); +} + +.badge.warn { + background: var(--warn-soft); + color: var(--warn); +} + +.toast, +.finance-banner { + position: fixed; + left: 50%; + transform: translateX(-50%); + z-index: 20; + max-width: min(720px, calc(100vw - 24px)); + border-radius: var(--radius); + padding: 12px 14px; + box-shadow: var(--shadow-md); +} + +.toast { + bottom: 18px; + background: #17202a; + color: #fff; +} + +.toast.error { + background: var(--danger); +} + +.finance-banner { + top: 12px; + background: #fff7ed; + border: 1px solid #fed7aa; + color: #9a3412; +} + +.hidden { + display: none !important; +} + +.qr { + max-width: 260px; + border: 1px solid var(--line); + border-radius: var(--radius); + padding: 8px; + background: #fff; +} + +.cards { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 12px; +} + +.stat { + border: 1px solid var(--line); + border-radius: var(--radius); + padding: 15px; + background: #fff; + box-shadow: var(--shadow-sm); +} + +.stat strong { + display: block; + font-size: 24px; + margin-top: 6px; +} + +.status-action { + border: 0; + background: transparent; + padding: 0; + display: inline-flex; + align-items: center; + gap: 8px; + cursor: pointer; +} + +.status-action span { + font-size: 12px; + color: var(--brand); + text-decoration: underline; + font-weight: 700; +} + +.status-action:hover span { + color: var(--brand-strong); +} + +.inline-panel { + background: var(--panel-muted); + border: 1px solid var(--line); + border-radius: var(--radius); + padding: 14px; +} + +.inline-panel h2 { + margin-bottom: 10px; +} + +.inline-panel p { + margin: 6px 0; +} + +.row.compact { + align-items: center; + gap: 8px; +} + +.row.compact select { + min-width: 180px; +} + +.link-button { + border: 0; + background: transparent; + color: var(--brand); + cursor: pointer; + font-size: 12px; + font-weight: 800; + text-decoration: underline; + padding: 0 0 0 6px; +} + +.link-button:hover { + color: var(--brand-strong); +} + +.finance-temp { + margin-bottom: 14px; + border-color: #fed7aa; + background: #fff7ed; + color: #9a3412; +} + +.finance-temp p { + margin: 6px 0 0; + color: #9a3412; +} + +.modal { + position: fixed; + inset: 0; + z-index: 30; + display: grid; + place-items: center; + padding: 24px; +} + +.modal-backdrop { + position: absolute; + inset: 0; + background: rgba(15, 23, 42, .50); + backdrop-filter: blur(2px); +} + +.modal-panel { + position: relative; + width: min(860px, 100%); + max-height: calc(100vh - 48px); + overflow: auto; + background: #fff; + border: 1px solid var(--line); + border-radius: var(--radius-lg); + padding: 18px; + box-shadow: var(--shadow-lg); +} + +.modal-head { + display: flex; + justify-content: space-between; + gap: 12px; + align-items: center; + margin-bottom: 16px; +} + +.modal-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; +} + +.modal-grid h3 { + margin: 0 0 10px; + font-size: 15px; +} + +.cond-item { + display: flex; + justify-content: space-between; + gap: 12px; + align-items: center; + border: 1px solid var(--line); + border-radius: var(--radius); + padding: 10px; + margin-bottom: 8px; + background: #fff; +} + +.muted { + color: var(--muted); +} + +.success-message { + display: inline-block; + margin: 0 0 10px; + padding: 10px 12px; + border: 1px solid #bbf7d0; + border-radius: var(--radius); + background: var(--ok-soft); + color: var(--ok); + font-weight: 800; +} + +.section-head { + display: flex; + justify-content: space-between; + gap: 12px; + align-items: center; + margin-bottom: 14px; +} + +.section-head h2 { + margin: 0; +} + +.icon-btn { + position: relative; + width: 42px; + height: 42px; + border: 1px solid var(--line); + border-radius: var(--radius); + background: #fff; + cursor: pointer; + display: inline-grid; + place-items: center; + transition: border-color .16s ease, background .16s ease, box-shadow .16s ease; +} + +.icon-btn:hover { + border-color: var(--brand); + background: var(--brand-soft); +} + +.calendar-open::before { + content: ""; + width: 20px; + height: 18px; + border: 2px solid var(--brand); + border-radius: 3px; + box-shadow: inset 0 5px 0 #e8f3f7; + position: relative; +} + +.calendar-open::after { + content: ""; + position: absolute; + width: 12px; + height: 2px; + background: var(--brand); + transform: translateY(-7px); +} + +.calendar-modal { + width: min(1120px, 100%); +} + +.calendar-layout { + display: grid; + grid-template-columns: minmax(0, 1fr) 320px; + gap: 18px; +} + +.calendar-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + margin-bottom: 12px; +} + +.calendar-toolbar strong { + text-transform: capitalize; +} + +.calendar-grid { + display: grid; + grid-template-columns: repeat(7, minmax(0, 1fr)); + border: 1px solid var(--line); + border-radius: var(--radius); + overflow: hidden; + background: #fff; +} + +.calendar-weekday { + padding: 10px; + background: var(--panel-muted); + color: var(--muted); + font-size: 12px; + font-weight: 900; + text-align: center; + border-bottom: 1px solid var(--line); +} + +.calendar-day { + min-height: 86px; + border: 0; + border-right: 1px solid var(--line); + border-bottom: 1px solid var(--line); + background: #fff; + padding: 8px; + text-align: left; + color: var(--text); + cursor: pointer; + position: relative; +} + +.calendar-day:hover { + background: #f8fbfc; +} + +.calendar-day:nth-child(7n+7) { + border-right: 0; +} + +.calendar-day.other { + background: var(--panel-muted); + color: #98a2b3; +} + +.calendar-day.busy { + background: #fff7ed; +} + +.calendar-day.busy span { + font-weight: 800; + color: var(--warn); +} + +.calendar-day.today { + box-shadow: inset 0 0 0 2px var(--brand); +} + +.calendar-day.selected { + background: var(--brand-soft); +} + +.calendar-day b { + position: absolute; + right: 8px; + bottom: 8px; + background: var(--brand); + color: #fff; + border-radius: 999px; + padding: 2px 7px; + font-size: 12px; +} + +.calendar-side { + border: 1px solid var(--line); + border-radius: var(--radius); + padding: 14px; + background: #fff; + min-height: 420px; +} + +.calendar-side h3 { + margin: 0 0 12px; +} + +.calendar-event { + border: 1px solid var(--line); + border-radius: var(--radius); + padding: 10px; + margin-bottom: 10px; + display: grid; + gap: 6px; + background: var(--panel-muted); +} + +.calendar-event span { + font-size: 13px; +} + +.calendar-event p { + margin: 0; + color: var(--muted); + font-size: 13px; +} + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + scroll-behavior: auto !important; + transition-duration: .01ms !important; + animation-duration: .01ms !important; + animation-iteration-count: 1 !important; + } +} + +@media (max-width: 900px) { + .calendar-layout { + grid-template-columns: 1fr; + } + + .calendar-day { + min-height: 64px; + } + + .calendar-side { + min-height: auto; + } +} + +@media (max-width: 820px) { + body { + background: var(--bg); + } + + .app { + display: block; + } + + .sidebar { + position: sticky; + top: 0; + z-index: 25; + height: auto; + min-height: 0; + padding: 12px 14px; + gap: 10px; + border-bottom: 1px solid rgba(255, 255, 255, .12); + overflow: visible; + } + + .brand { + font-size: 18px; + } + + .user { + font-size: 12px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; + } + + .menu { + display: flex; + gap: 8px; + overflow-x: auto; + padding-bottom: 2px; + scrollbar-width: none; + } + + .menu::-webkit-scrollbar { + display: none; + } + + .menu a { + flex: 0 0 auto; + padding: 9px 12px; + white-space: nowrap; + } + + .menu a:hover { + transform: none; + } + + .sidebar .btn { + margin-top: 0; + width: auto; + align-self: flex-start; + padding: 8px 12px; + } + + .content { + padding: 16px; + overflow-x: hidden; + } + + .topbar { + align-items: flex-start; + margin-bottom: 14px; + } + + h1 { + font-size: 24px; + } + + .panel { + padding: 14px; + } + + .row { + display: grid; + grid-template-columns: 1fr; + align-items: stretch; + } + + .grid.cols { + grid-template-columns: 1fr; + gap: 10px; + } + + .field { + margin-bottom: 8px; + } + + .btn { + width: 100%; + min-height: 44px; + } + + .sidebar .btn, + td .btn, + .modal-head .btn, + .calendar-toolbar .btn { + width: auto; + } + + .tabs, + .nav-tabs { + overflow-x: auto; + white-space: nowrap; + } + + .cards { + grid-template-columns: 1fr; + } + + .stat strong { + font-size: 20px; + } + + .table-wrap { + margin-left: -2px; + margin-right: -2px; + } + + table { + min-width: 640px; + } + + th, + td { + padding: 10px 8px; + } + + .toast { + bottom: 12px; + } + + .finance-banner { + top: 8px; + } +} + +@media (max-width: 720px) { + .modal-grid { + grid-template-columns: 1fr; + } + + .modal { + padding: 12px; + } +} + +@media (max-width: 520px) { + .content { + padding: 12px; + } + + h1 { + font-size: 22px; + } + + h2 { + font-size: 17px; + } + + .panel { + padding: 12px; + border-radius: var(--radius); + } + + .login-page { + padding: 16px; + } + + .login-box { + padding: 20px; + } + + .modal { + padding: 8px; + align-items: start; + } + + .modal-panel { + max-height: calc(100vh - 16px); + padding: 14px; + } + + .modal-head { + align-items: flex-start; + } + + .modal-head .btn { + width: auto; + } + + .calendar-grid { + font-size: 12px; + } + + .calendar-weekday { + padding: 8px 4px; + } + + .calendar-day { + min-height: 54px; + padding: 5px; + } + + .calendar-day b { + right: 4px; + bottom: 4px; + padding: 1px 5px; + } + + .calendar-toolbar .btn { + width: auto; + } + + .section-head { + align-items: flex-start; + } + + .icon-btn { + width: 40px; + min-width: 40px; + } + + .cond-item { + display: grid; + grid-template-columns: 1fr; + align-items: stretch; + } + + .cond-item .btn { + width: 100%; + } +} diff --git a/src/main/webapp/js/layout.js b/src/main/webapp/js/layout.js index 03bcfe7..f5dd7c7 100644 --- a/src/main/webapp/js/layout.js +++ b/src/main/webapp/js/layout.js @@ -1 +1 @@ -window.Layout={mount(scope,active){Auth.require(scope);const label=localStorage.getItem('auth_label')||(scope==='master'?'Master':'Escritorio');const master=[['Clientes','/master/clientes.html','clientes'],['Planos','/master/planos.html','planos'],['Financeiro','/master/financeiro.html','financeiro'],['Configuracoes','/master/configuracoes.html','configuracoes'],['Backup','/master/backup.html','backup']];let cliente=[['Cadastro','/cliente/condominios.html','condominios'],['Lembrete','/cliente/lembretes.html','lembretes'],['Financeiro','/cliente/financeiro.html','financeiro'],['WhatsApp','/cliente/configuracoes.html','configuracoes']];if(scope==='empresa'&&!Auth.isAdminEmpresa())cliente=cliente.filter(x=>x[2]!=='configuracoes');const menu=(scope==='master'?master:cliente).map(([n,h,k])=>`${n}`).join('');document.body.insertAdjacentHTML('afterbegin',``);document.body.classList.add('app');document.querySelector('main')?.classList.add('content')}}; +window.Layout={mount(scope,active){Auth.require(scope);const label=localStorage.getItem('auth_label')||(scope==='master'?'Master':'Escritório');const master=[['Clientes','/master/clientes.html','clientes'],['Planos','/master/planos.html','planos'],['Financeiro','/master/financeiro.html','financeiro'],['Configurações','/master/configuracoes.html','configuracoes'],['Backup','/master/backup.html','backup']];let cliente=[['Cadastro','/cliente/condominios.html','condominios'],['Lembretes','/cliente/lembretes.html','lembretes'],['Financeiro','/cliente/financeiro.html','financeiro'],['WhatsApp','/cliente/configuracoes.html','configuracoes']];if(scope==='empresa'&&!Auth.isAdminEmpresa())cliente=cliente.filter(x=>x[2]!=='configuracoes');const menu=(scope==='master'?master:cliente).map(([n,h,k])=>`${n}`).join('');document.body.insertAdjacentHTML('afterbegin',``);document.body.classList.add('app');document.querySelector('main')?.classList.add('content')}}; diff --git a/src/main/webapp/login.html b/src/main/webapp/login.html index 9e88a96..0eac92d 100644 --- a/src/main/webapp/login.html +++ b/src/main/webapp/login.html @@ -1 +1 @@ -Login - SeConectai

SeConectai

Acesse o painel administrativo ou o escritorio.

\ No newline at end of file +Login - SeConectai

SeConectai

Acesse o painel administrativo ou o escritório.