From 9a976ea4cc7444b7d650f6f3019c48e0f3704555 Mon Sep 17 00:00:00 2001 From: Kris Date: Tue, 2 Jun 2026 03:16:26 +0000 Subject: [PATCH] Upload files to "assets/css" --- assets/css/landing.css | 656 ++++++++++ assets/css/responsive-fix.css | 749 ++++++++++++ assets/css/style.css | 2168 +++++++++++++++++++++++++++++++++ 3 files changed, 3573 insertions(+) create mode 100644 assets/css/landing.css create mode 100644 assets/css/responsive-fix.css create mode 100644 assets/css/style.css diff --git a/assets/css/landing.css b/assets/css/landing.css new file mode 100644 index 0000000..87e0984 --- /dev/null +++ b/assets/css/landing.css @@ -0,0 +1,656 @@ +body.landing-page { + min-height: 100vh; + overflow-x: hidden; + overflow-y: auto; + color: #102033; + background: + radial-gradient(circle at 12% 10%, rgba(15, 76, 129, 0.14), transparent 34%), + radial-gradient(circle at 88% 18%, rgba(13, 148, 136, 0.13), transparent 32%), + linear-gradient(180deg, #f8fbff 0%, #eef7ff 48%, #f8fafc 100%); +} + +.landing-page a { text-decoration: none; } + +.landing-nav { + position: sticky; + top: 18px; + z-index: 50; + width: min(1120px, calc(100% - 40px)); + margin: 18px auto 0; + padding: 12px 14px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 22px; + border: 1px solid rgba(219, 228, 239, 0.92); + background: rgba(255,255,255,0.78); + backdrop-filter: blur(18px); + border-radius: 999px; + box-shadow: 0 18px 50px rgba(15, 23, 42, 0.08); +} + +.landing-brand { + display: flex; + align-items: center; + gap: 11px; + color: #102033; + min-width: 170px; +} + +.landing-brand > span { + width: 40px; + height: 40px; + border-radius: 15px; + display: grid; + place-items: center; + color: white; + background: linear-gradient(135deg, #0f4c81, #0d9488); + font-size: 21px; + font-weight: 950; + box-shadow: 0 12px 24px rgba(15, 76, 129, 0.2); +} + +.landing-brand b { + font-size: 16px; + letter-spacing: 0.5px; +} + +.landing-menu, +.landing-actions, +.hero-buttons { + display: flex; + align-items: center; + gap: 10px; + flex-wrap: wrap; +} + +.landing-menu a { + color: #64748b; + font-size: 13px; + font-weight: 850; + padding: 10px 12px; + border-radius: 999px; +} + +.landing-menu a:hover { + color: #0f4c81; + background: #eff6ff; +} + +.btn-pill, +.cta-primary, +.cta-secondary { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 44px; + padding: 0 20px; + border-radius: 999px; + font-size: 13px; + font-weight: 950; + transition: .2s ease; +} + +.btn-pill.solid, +.cta-primary { + color: white; + background: linear-gradient(135deg, #0f4c81, #0d9488); + box-shadow: 0 14px 32px rgba(15, 76, 129, 0.22); +} + +.btn-pill.ghost, +.cta-secondary { + color: #0f4c81; + background: rgba(239, 246, 255, 0.9); + border: 1px solid #dbeafe; +} + +.btn-pill:hover, +.cta-primary:hover, +.cta-secondary:hover { + transform: translateY(-1px); +} + +.landing-toast { + width: min(560px, calc(100% - 40px)); + margin: 18px auto 0; + padding: 12px 16px; + border-radius: 18px; + color: #166534; + background: #dcfce7; + border: 1px solid #86efac; + font-size: 13px; + font-weight: 850; + text-align: center; +} + +.hero-section, +.landing-section, +.access-section, +.landing-footer { + width: min(1120px, calc(100% - 40px)); + margin-left: auto; + margin-right: auto; +} + +.hero-section { + min-height: 620px; + padding: 78px 0 54px; + display: grid; + grid-template-columns: 0.92fr 1.08fr; + gap: 64px; + align-items: center; +} + +.eyebrow { + display: inline-flex; + align-items: center; + padding: 8px 13px; + margin-bottom: 22px; + border: 1px solid #dbeafe; + color: #0f4c81; + background: rgba(239, 246, 255, 0.78); + border-radius: 999px; + font-size: 12px; + font-weight: 950; +} + +.hero-copy h1 { + max-width: 710px; + font-size: clamp(42px, 5.6vw, 72px); + line-height: .98; + letter-spacing: -2.6px; + margin-bottom: 22px; +} + +.hero-copy p { + max-width: 560px; + color: #64748b; + font-size: 18px; + line-height: 1.75; + margin-bottom: 32px; +} + +.hero-visual { + min-height: 540px; + display: grid; + place-items: center; +} + +.map-card { + position: relative; + width: min(100%, 610px); + height: 510px; + overflow: hidden; + border-radius: 38px; + background: linear-gradient(140deg, rgba(219, 234, 254, 0.92), rgba(236, 253, 245, 0.88)); + border: 1px solid rgba(226, 232, 240, 0.95); + box-shadow: 0 34px 85px rgba(15, 23, 42, 0.17); +} + +.map-grid { + position: absolute; + inset: 0; + opacity: .44; + background-image: + linear-gradient(rgba(15,76,129,.08) 1px, transparent 1px), + linear-gradient(90deg, rgba(15,76,129,.08) 1px, transparent 1px); + background-size: 46px 46px; +} + +.map-river { + position: absolute; + left: -12%; + top: 45%; + width: 124%; + height: 92px; + transform: rotate(-9deg); + background: rgba(56,189,248,.34); + border-top: 2px solid rgba(14,165,233,.18); + border-bottom: 2px solid rgba(14,165,233,.18); +} + +.map-radius { + position: absolute; + border: 2px solid rgba(37,99,235,.34); + background: rgba(37,99,235,.10); + border-radius: 50%; +} + +.r1 { width: 260px; height: 260px; left: 17%; top: 20%; } +.r2 { width: 210px; height: 210px; right: 14%; bottom: 15%; } + +.pin { + position: absolute; + width: 26px; + height: 26px; + display: grid; + place-items: center; + border-radius: 50% 50% 50% 0; + transform: rotate(-45deg); + border: 3px solid white; + box-shadow: 0 14px 26px rgba(15,23,42,.22); + font-size: 8px; + font-weight: 950; + color: white; +} + +.pin::before { + content: attr(class); + display: none; +} + +.pin.ri { + width: 42px; + height: 42px; + background: #2563eb; +} + +.pin.ri { transform: rotate(-45deg); } +.pin.ri { color: transparent; } +.pin.ri::after { + content: 'RI'; + color: white; + transform: rotate(45deg); +} + +.pin.ok { background: #16a34a; } +.pin.wait { background: #f59e0b; } +.pin.danger { background: #dc2626; } + +.p1 { left: 32%; top: 36%; } +.p2 { right: 25%; bottom: 27%; } +.p3 { left: 25%; top: 29%; } +.p4 { right: 33%; bottom: 39%; } +.p5 { right: 14%; top: 20%; } + +.route { + position: absolute; + left: 31%; + top: 29%; + width: 276px; + height: 214px; + border-left: 5px dashed rgba(124,58,237,.78); + border-bottom: 5px dashed rgba(124,58,237,.78); + border-radius: 0 0 0 82px; + transform: rotate(8deg); +} + +.map-stat { + position: absolute; + left: 24px; + bottom: 24px; + width: 156px; + padding: 17px 18px; + border-radius: 24px; + background: rgba(255,255,255,.86); + border: 1px solid rgba(226,232,240,.9); + box-shadow: 0 18px 42px rgba(15,23,42,.12); + backdrop-filter: blur(14px); +} + +.map-stat small, +.map-stat b { + display: block; +} + +.map-stat small { + color: #64748b; + font-size: 12px; + font-weight: 900; +} + +.map-stat b { + color: #0f172a; + margin-top: 4px; + font-size: 32px; +} + +.landing-section { + padding: 74px 0 0; +} + +.section-heading { + max-width: 660px; + margin: 0 auto 30px; + text-align: center; +} + +.section-heading.left { + text-align: left; + margin: 0; +} + +.section-heading small, +.access-section small { + color: #0f4c81; + font-size: 12px; + font-weight: 950; + text-transform: uppercase; + letter-spacing: .12em; +} + +.section-heading h2, +.access-section h2 { + margin-top: 10px; + color: #0f172a; + font-size: clamp(30px, 3.6vw, 46px); + line-height: 1.08; + letter-spacing: -1.35px; +} + +.section-heading p, +.access-section p { + margin-top: 13px; + color: #64748b; + line-height: 1.7; +} + +.clean-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 18px; +} + +.feature-card { + padding: 26px; + border-radius: 30px; + background: rgba(255,255,255,.86); + border: 1px solid #e2e8f0; + box-shadow: 0 18px 44px rgba(15,23,42,.06); +} + +.feature-icon { + width: 48px; + height: 48px; + display: grid; + place-items: center; + border-radius: 18px; + color: white; + font-size: 22px; + font-weight: 950; + margin-bottom: 22px; +} + +.blue-icon { background: #2563eb; } +.green-icon { background: #16a34a; } +.red-icon { background: #dc2626; } +.purple-icon { background: #7c3aed; } + +.feature-card h3 { + font-size: 18px; + margin-bottom: 10px; +} + +.feature-card p { + color: #64748b; + font-size: 14px; + line-height: 1.7; +} + +.flow-section { + display: grid; + grid-template-columns: .8fr 1.2fr; + gap: 44px; + align-items: center; +} + +.flow-cards { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 14px; +} + +.flow-cards article { + min-height: 156px; + padding: 22px; + display: flex; + flex-direction: column; + justify-content: space-between; + border-radius: 28px; + background: white; + border: 1px solid #e2e8f0; + box-shadow: 0 18px 44px rgba(15,23,42,.06); +} + +.flow-cards b { + width: 44px; + height: 44px; + display: grid; + place-items: center; + border-radius: 16px; + color: white; + background: linear-gradient(135deg, #0f4c81, #0d9488); +} + +.flow-cards span { + color: #0f172a; + font-size: 16px; + font-weight: 900; + line-height: 1.35; +} + +.clean-access { + margin-top: 88px; + padding: 46px; + display: grid; + grid-template-columns: 1fr auto; + gap: 28px; + align-items: center; + border-radius: 36px; + color: white; + background: linear-gradient(135deg, #0f4c81, #0d9488); + box-shadow: 0 28px 70px rgba(15,76,129,.22); +} + +.clean-access small, +.clean-access h2, +.clean-access p { + color: white; +} + +.clean-access p { + max-width: 580px; + opacity: .86; +} + +.clean-access .cta-primary { + color: #0f4c81; + background: white; + box-shadow: none; +} + +.clean-access .cta-secondary { + color: white; + background: rgba(255,255,255,.12); + border-color: rgba(255,255,255,.24); +} + +.landing-footer { + padding: 34px 0 44px; + color: #64748b; + font-size: 13px; + text-align: center; +} + +/* Auth pages */ +.login-card { + max-width: 420px; + padding: 34px; +} + +.login-card h1 { + font-size: 28px; + letter-spacing: -0.6px; +} + +.login-card p { + margin-bottom: 18px; +} + +.login-back { + display: inline-flex; + margin-bottom: 14px; + color: #0f4c81; + font-weight: 900; + font-size: 13px; +} + +@media (max-width: 980px) { + .landing-menu { display: none; } + .hero-section, + .flow-section, + .clean-access { + grid-template-columns: 1fr; + } + .hero-section { + padding-top: 54px; + gap: 36px; + } + .clean-grid, + .flow-cards { + grid-template-columns: repeat(2, 1fr); + } + .clean-access { + padding: 34px; + } +} + +@media (max-width: 640px) { + .landing-nav { + top: 10px; + width: min(100% - 24px, 1120px); + border-radius: 26px; + align-items: flex-start; + } + .landing-brand { min-width: auto; } + .landing-actions { justify-content: flex-end; } + .btn-pill { min-height: 38px; padding: 0 14px; } + .hero-section, + .landing-section, + .access-section, + .landing-footer { + width: min(100% - 24px, 1120px); + } + .hero-copy h1 { + font-size: 42px; + letter-spacing: -1.8px; + } + .hero-copy p { + font-size: 16px; + } + .hero-visual { min-height: auto; } + .map-card { height: 360px; border-radius: 30px; } + .clean-grid, + .flow-cards { + grid-template-columns: 1fr; + } + .clean-access { + padding: 28px; + border-radius: 30px; + } +} + +.login-card.register-card { + max-width: 560px; +} + +/* Final auth refinement */ +.login-page { + min-height: 100vh; + overflow-y: auto; + display: grid; + place-items: center; + padding: 32px 18px; +} + +.login-card { + width: min(100%, 430px); + max-width: 430px; + background: rgba(255,255,255,.94); + backdrop-filter: blur(18px); + border: 1px solid rgba(219,228,239,.94); + box-shadow: 0 28px 70px rgba(15,23,42,.12); +} + +.login-card.register-card { + width: min(100%, 880px); + max-width: 880px; +} + +.login-card.register-card form { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 0 16px; +} + +.login-card.register-card form > .info-box, +.login-card.register-card form > .role-picker, +.login-card.register-card form > .role-extra, +.login-card.register-card form > .btn { + grid-column: 1 / -1; +} + +.role-select-hidden { + position: absolute; + width: 1px; + height: 1px; + opacity: 0; + pointer-events: none; +} + +.role-picker { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 10px; + margin: 8px 0 12px; +} + +.role-card-option { + text-align: left; + border: 1px solid #dbe4ef; + background: #ffffff; + border-radius: 18px; + padding: 14px; + cursor: pointer; + transition: .18s ease; + min-height: 94px; +} + +.role-card-option b, +.role-card-option span { + display: block; +} + +.role-card-option b { + color: #0f172a; + font-size: 14px; + margin-bottom: 6px; +} + +.role-card-option span { + color: #64748b; + font-size: 12px; + line-height: 1.4; +} + +.role-card-option:hover, +.role-card-option.active { + border-color: #0f4c81; + background: #eff6ff; + box-shadow: 0 10px 24px rgba(15, 76, 129, .11); +} + +.role-card-option.active b { + color: #0f4c81; +} + +@media (max-width: 640px) { + .login-card.register-card form { + display: block; + } + + .role-picker { + grid-template-columns: 1fr; + } +} diff --git a/assets/css/responsive-fix.css b/assets/css/responsive-fix.css new file mode 100644 index 0000000..2cf3b7a --- /dev/null +++ b/assets/css/responsive-fix.css @@ -0,0 +1,749 @@ +/* ========================================================= + SIPANTAS responsive UI fix + Fokus: tampilan lebih rapi di desktop dan mobile tanpa mengubah fitur utama. + ========================================================= */ + +:root { + --app-radius: 26px; + --app-gap: 14px; + --touch-size: 46px; +} + +html { + -webkit-text-size-adjust: 100%; +} + +body { + min-width: 320px; +} + +button, +a, +input, +select, +textarea { + -webkit-tap-highlight-color: transparent; +} + +button, +.btn, +.tool-btn, +.tab, +.mini-btn, +.role-card-option { + touch-action: manipulation; +} + +/* ---------- Dashboard shell ---------- */ +.app-shell { + width: min(472px, calc(100vw - 32px)); + top: 16px; + left: 16px; + bottom: 16px; + max-height: none; + height: auto; + border-radius: 28px; +} + +.brand-panel { + grid-template-columns: 48px minmax(0, 1fr) auto auto auto !important; + gap: 10px; +} + +.brand-panel > div:not(.brand-logo) { + min-width: 0; +} + +.brand-panel h1, +.brand-panel p { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.panel-toggle, +.help-button, +.logout { + flex: 0 0 auto; + min-width: 34px; +} + +.user-box { + grid-template-columns: minmax(0, 1fr) auto; +} + +.user-main { + min-width: 0; +} + +.user-main b, +.user-main span, +.role-chip { + overflow-wrap: anywhere; +} + +.quick-guide-card { + align-items: center; +} + +.tabs { + flex-wrap: nowrap !important; + overflow-x: auto !important; + overflow-y: hidden; + padding-bottom: 14px; + scroll-snap-type: x proximity; + -webkit-overflow-scrolling: touch; +} + +.tabs::-webkit-scrollbar { + height: 6px; +} + +.tabs::-webkit-scrollbar-thumb { + background: #cbd5e1; + border-radius: 999px; +} + +.tab { + flex: 0 0 auto !important; + scroll-snap-align: start; + min-height: 42px; + white-space: nowrap; +} + +.panel-body { + flex: 1; + min-height: 0; + overflow-y: auto; + overscroll-behavior: contain; + padding-bottom: 22px; +} + +.hero-actions { + gap: 8px; +} + +.hero-actions .btn, +.guide-dialog-actions .btn { + width: auto; +} + +.stats-wide { + grid-template-columns: repeat(2, minmax(0, 1fr)) !important; +} + +.stat-card { + min-width: 0; +} + +.stat-card small { + min-height: 28px; +} + +.two-col, +.quick-actions { + grid-template-columns: repeat(2, minmax(0, 1fr)) !important; +} + +.two-col > div, +.quick-actions > * { + min-width: 0; +} + +input, +select, +textarea, +.btn { + font-size: 14px; +} + +input, +select, +.btn { + min-height: var(--touch-size); +} + +textarea { + min-height: 92px; +} + +.list-box { + max-height: none !important; + overflow: visible !important; + padding-right: 0; +} + +.list-title-row { + align-items: flex-start; +} + +.item-actions { + align-items: center; +} + +.mini-btn, +.badge { + line-height: 1.25; +} + +.anggota-card { + overflow: hidden; +} + +.anggota-card .two-col { + margin-top: 0; +} + +/* ---------- Map controls ---------- */ +.map-toolbar { + top: 18px; + right: 18px; + left: auto; + max-width: calc(100vw - 526px); + justify-content: flex-end; +} + +.tool-btn { + min-height: 38px; +} + +.map-helper { + left: min(506px, calc(100vw - 420px)); + right: auto; + bottom: 18px; +} + +.legend { + max-width: 230px; +} + +/* ---------- Auth and register pages ---------- */ +.login-page { + align-items: start; + padding: 34px 18px; +} + +.login-card { + margin: auto 0; +} + +.login-card.register-card, +.login-card.register-card-wide { + width: min(920px, calc(100vw - 36px)); + max-width: 920px; +} + +.login-card.register-card form { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0 18px; +} + +.login-card.register-card form > .role-picker, +.login-card.register-card form > .info-box, +.login-card.register-card form > .role-extra, +.login-card.register-card form > .btn { + grid-column: 1 / -1; +} + +.role-picker { + grid-template-columns: repeat(3, minmax(0, 1fr)) !important; +} + +.role-card-option { + min-height: 106px; +} + +.location-picker-box { + padding: 16px; +} + +.location-search-row { + grid-template-columns: minmax(0, 1fr) 112px !important; +} + +.register-map { + height: 300px; +} + +.selected-location-text { + overflow-wrap: anywhere; +} + +/* ---------- Landing page ---------- */ +.landing-nav { + gap: 14px; +} + +.landing-menu { + min-width: 0; + justify-content: center; +} + +.hero-section { + grid-template-columns: minmax(0, .92fr) minmax(0, 1.08fr); +} + +.hero-copy, +.hero-visual, +.map-card { + min-width: 0; +} + +.feature-card, +.access-card, +.flow-card { + min-width: 0; +} + +/* ---------- Tablet ---------- */ +@media (max-width: 1100px) { + .app-shell { + width: min(452px, calc(100vw - 28px)); + } + + .map-toolbar { + max-width: calc(100vw - 500px); + } + + .map-helper { + display: none; + } + + .hero-section { + gap: 36px; + } +} + +@media (max-width: 980px) { + body { + overflow: hidden; + } + + #map { + height: 100dvh; + } + + .app-shell { + left: 12px; + right: 12px; + top: auto !important; + bottom: 12px; + width: auto; + height: min(70dvh, 640px); + max-height: 70dvh; + border-radius: 24px; + } + + body.panel-collapsed .app-shell { + transform: translateY(calc(100% + 26px)); + } + + .panel-open { + left: 12px; + bottom: 12px; + min-height: 42px; + } + + .brand-panel { + grid-template-columns: 44px minmax(0, 1fr) auto auto auto !important; + padding: 14px 14px 12px; + } + + .brand-logo { + width: 44px; + height: 44px; + border-radius: 15px; + } + + .user-box, + .quick-guide-card { + margin-left: 14px; + margin-right: 14px; + } + + .tabs { + padding-left: 14px; + padding-right: 14px; + } + + .panel-body { + padding: 14px; + } + + .map-toolbar { + top: 12px !important; + left: 12px; + right: 12px !important; + bottom: auto !important; + max-width: none; + justify-content: flex-start; + overflow-x: auto; + border-radius: 20px; + padding: 7px; + } + + .map-toolbar::-webkit-scrollbar { + display: none; + } + + .tool-btn { + flex: 0 0 auto; + white-space: nowrap; + } + + .legend { + display: none !important; + } + + .map-helper { + display: none !important; + } + + .leaflet-control-zoom { + margin-top: 70px !important; + } + + .landing-nav { + width: min(100% - 28px, 1120px); + top: 12px; + border-radius: 26px; + flex-wrap: wrap; + } + + .landing-brand { + flex: 1 1 auto; + } + + .landing-menu { + order: 3; + width: 100%; + overflow-x: auto; + justify-content: flex-start; + flex-wrap: nowrap; + padding-top: 4px; + } + + .landing-menu::-webkit-scrollbar { + display: none; + } + + .hero-section { + grid-template-columns: 1fr; + gap: 28px; + min-height: auto; + padding-top: 54px; + } + + .hero-copy h1 { + max-width: 760px; + } + + .hero-visual { + min-height: auto; + } + + .map-card { + height: 430px; + } +} + +/* ---------- Phone ---------- */ +@media (max-width: 640px) { + .app-shell { + left: 8px; + right: 8px; + bottom: 8px; + height: min(72dvh, 620px); + max-height: 72dvh; + border-radius: 22px; + } + + .brand-panel { + grid-template-columns: 42px minmax(0, 1fr) auto !important; + gap: 9px; + } + + .brand-logo { + width: 42px; + height: 42px; + } + + .brand-panel h1 { + font-size: 17px; + } + + .brand-panel p { + font-size: 11px; + } + + .help-button, + .logout { + display: none !important; + } + + .panel-toggle { + display: grid; + place-items: center; + } + + .user-box { + grid-template-columns: 1fr; + gap: 8px; + } + + .role-chip { + width: fit-content; + } + + .quick-guide-card { + flex-direction: column; + align-items: stretch; + } + + .quick-guide-card button { + width: 100%; + } + + .dashboard-hero, + .tab-intro, + .stat-card, + .progress-wrap, + .list-item, + .report-card, + .info-box, + .anggota-card { + border-radius: 17px; + } + + .hero-card h2 { + font-size: 19px; + } + + .hero-card p, + .tab-intro span, + .guide-step span { + font-size: 12px; + } + + .hero-actions, + .guide-dialog-actions { + flex-direction: column; + } + + .hero-actions .btn, + .guide-dialog-actions .btn { + width: 100%; + } + + .stats-wide, + .two-col, + .quick-actions, + .report-grid { + grid-template-columns: 1fr !important; + } + + .stat-card { + min-height: 78px; + } + + .stat-card span { + font-size: 24px; + } + + .item-actions { + display: grid; + grid-template-columns: 1fr; + } + + .item-actions .mini-btn { + width: 100%; + text-align: center; + } + + .badge { + white-space: normal; + text-align: center; + } + + .guide-dialog { + width: calc(100vw - 24px); + max-height: calc(100dvh - 28px); + overflow-y: auto; + padding: 18px; + border-radius: 22px; + } + + .guide-modal-step { + grid-template-columns: 34px 1fr; + } + + .guide-modal-step i { + width: 34px; + height: 34px; + } + + .toast { + bottom: 14px; + border-radius: 18px; + width: calc(100vw - 24px); + text-align: center; + } + + .login-page { + padding: 20px 12px; + } + + .login-card, + .login-card.register-card, + .login-card.register-card-wide { + width: 100%; + max-width: none; + padding: 22px; + border-radius: 22px; + } + + .login-card h1 { + font-size: 25px; + } + + .login-card.register-card form { + display: block; + } + + .role-picker { + grid-template-columns: 1fr !important; + } + + .role-card-option { + min-height: auto; + } + + .location-search-row { + grid-template-columns: 1fr !important; + } + + .register-map { + height: 220px; + } + + .landing-nav { + width: calc(100% - 20px); + margin-top: 10px; + padding: 10px; + border-radius: 22px; + } + + .landing-brand { + min-width: 0; + } + + .landing-brand > span { + width: 36px; + height: 36px; + border-radius: 13px; + } + + .landing-actions { + width: 100%; + display: grid; + grid-template-columns: 1fr 1fr; + } + + .landing-actions .btn-pill { + width: 100%; + padding: 0 12px; + } + + .landing-menu { + display: none; + } + + .hero-section, + .landing-section, + .access-section, + .landing-footer { + width: calc(100% - 24px); + } + + .hero-section { + padding: 44px 0 36px; + } + + .hero-copy h1 { + font-size: clamp(34px, 11vw, 46px); + letter-spacing: -1.6px; + } + + .hero-copy p { + font-size: 15px; + line-height: 1.65; + } + + .hero-buttons { + display: grid; + grid-template-columns: 1fr; + } + + .hero-buttons a { + width: 100%; + } + + .map-card { + height: 330px; + border-radius: 26px; + } +} + +@media (max-width: 380px) { + .brand-logo { + display: none; + } + + .brand-panel { + grid-template-columns: minmax(0, 1fr) auto !important; + } + + .tab, + .tool-btn { + font-size: 11px; + } + + .panel-body { + padding: 12px; + } +} + +/* Better print output for reports */ +@media print { + #map, + .map-toolbar, + .legend, + .map-helper, + .panel-toggle, + .panel-open, + .help-button, + .logout, + .tabs, + .quick-guide-card { + display: none !important; + } + + body { + overflow: visible !important; + background: white !important; + } + + .app-shell { + position: static !important; + width: 100% !important; + height: auto !important; + max-height: none !important; + box-shadow: none !important; + border: 0 !important; + } + + .panel-body { + overflow: visible !important; + } +} diff --git a/assets/css/style.css b/assets/css/style.css new file mode 100644 index 0000000..bb17f73 --- /dev/null +++ b/assets/css/style.css @@ -0,0 +1,2168 @@ +:root { + --primary: #0f4c81; + --primary-2: #0a3a63; + --surface: rgba(255, 255, 255, 0.96); + --line: #dbe4ef; + --text: #102033; + --muted: #64748b; + --green: #16a34a; + --red: #dc2626; + --yellow: #f59e0b; + --blue: #2563eb; + --purple: #7c3aed; + --gray: #6b7280; +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; + font-family: Inter, Arial, Helvetica, sans-serif; +} + +body { + overflow: hidden; + color: var(--text); + background: #eef4fb; +} + +#map { + width: 100vw; + height: 100vh; + z-index: 1; +} + +.app-shell { + position: absolute; + top: 16px; + left: 16px; + width: 420px; + max-height: calc(100vh - 32px); + display: flex; + flex-direction: column; + z-index: 1000; + background: var(--surface); + border: 1px solid rgba(219, 228, 239, 0.9); + border-radius: 24px; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.22); + backdrop-filter: blur(18px); + overflow: hidden; +} + +.brand-panel { + display: grid; + grid-template-columns: 48px 1fr auto; + gap: 12px; + align-items: center; + padding: 16px 16px 12px; + background: linear-gradient(135deg, #0f4c81, #0d749b); + color: white; +} + +.brand-logo { + width: 48px; + height: 48px; + display: grid; + place-items: center; + border-radius: 16px; + background: rgba(255,255,255,0.18); + border: 1px solid rgba(255,255,255,0.26); + font-size: 24px; + font-weight: 900; +} + +.brand-panel h1 { + font-size: 22px; + line-height: 1.1; + letter-spacing: 0.4px; +} + +.brand-panel p { + margin-top: 3px; + font-size: 11px; + opacity: 0.86; + line-height: 1.35; +} + +.logout { + align-self: flex-start; + text-decoration: none; + background: rgba(255,255,255,0.18); + color: white; + padding: 7px 10px; + border-radius: 999px; + font-size: 12px; + font-weight: 800; + white-space: nowrap; +} + +.user-box { + margin: 12px 14px 0; + padding: 12px; + border-radius: 16px; + background: #f8fafc; + border: 1px solid var(--line); +} + +.user-box b, +.user-box span { + display: block; +} + +.user-box b { + color: #0f172a; + font-size: 14px; +} + +.user-box span { + color: var(--muted); + font-size: 11px; + margin-top: 4px; + line-height: 1.35; +} + +.tabs { + display: flex; + gap: 8px; + overflow-x: auto; + padding: 12px 14px 10px; + border-bottom: 1px solid var(--line); +} + +.tab { + flex: 0 0 auto; + border: 1px solid var(--line); + background: white; + color: #334155; + padding: 9px 12px; + border-radius: 999px; + cursor: pointer; + font-size: 12px; + font-weight: 850; + white-space: nowrap; + transition: 0.18s; +} + +.tab:hover { + border-color: var(--primary); +} + +.tab.active { + border-color: var(--primary); + background: var(--primary); + color: white; + box-shadow: 0 8px 18px rgba(15, 76, 129, 0.18); +} + +.panel-body { + padding: 14px; + overflow-y: auto; +} + +.tab-panel { + display: none; +} + +.tab-panel.active { + display: block; +} + +.hero-card { + padding: 16px; + border-radius: 18px; + color: white; + background: linear-gradient(135deg, #0f4c81, #2563eb 55%, #0891b2); + box-shadow: 0 16px 36px rgba(37, 99, 235, 0.22); +} + +.hero-card small { + font-size: 11px; + font-weight: 900; + letter-spacing: 0.5px; + text-transform: uppercase; + opacity: 0.82; +} + +.hero-card h2 { + font-size: 20px; + margin-top: 4px; + line-height: 1.2; +} + +.hero-card p { + margin-top: 8px; + font-size: 12px; + line-height: 1.55; + opacity: 0.93; +} + +.section-title { + position: relative; + font-size: 14px; + font-weight: 900; + margin: 18px 0 10px; + color: #0f172a; + padding-left: 10px; +} + +.section-title::before { + content: ''; + position: absolute; + left: 0; + top: 2px; + width: 4px; + height: 16px; + border-radius: 999px; + background: var(--primary); +} + +.stats { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px; + margin-top: 12px; +} + +.stat-card { + min-height: 78px; + padding: 13px; + border-radius: 18px; + background: white; + border: 1px solid var(--line); + box-shadow: 0 8px 18px rgba(15, 23, 42, 0.06); +} + +.stat-card span { + display: block; + font-size: 24px; + font-weight: 950; + color: var(--primary); +} + +.stat-card small { + display: block; + margin-top: 4px; + color: var(--muted); + font-size: 11px; + line-height: 1.25; +} + +.green-card span { color: var(--green); } +.red-card span { color: var(--red); } +.yellow-card span { color: var(--yellow); } + +.progress-wrap { + margin-top: 12px; + padding: 12px; + background: white; + border: 1px solid var(--line); + border-radius: 16px; +} + +.progress-label { + display: flex; + justify-content: space-between; + color: #334155; + font-size: 12px; + font-weight: 800; +} + +.progress { + height: 10px; + background: #e2e8f0; + border-radius: 999px; + overflow: hidden; + margin-top: 8px; +} + +.progress-bar { + height: 100%; + width: 0%; + background: linear-gradient(90deg, var(--primary), var(--green)); + border-radius: 999px; + transition: 0.25s; +} + +label { + display: block; + font-size: 12px; + color: #334155; + margin: 11px 0 5px; + font-weight: 850; +} + +input, +select, +textarea { + width: 100%; + border: 1px solid #cbd5e1; + border-radius: 12px; + padding: 10px 11px; + font-size: 13px; + background: white; + color: #0f172a; + outline: none; + transition: 0.16s; +} + +input[readonly], +textarea[readonly], +select:disabled { + background: #f1f5f9; + color: #64748b; +} + +input:focus, +select:focus, +textarea:focus { + border-color: var(--primary); + box-shadow: 0 0 0 3px rgba(15, 76, 129, 0.12); +} + +textarea { + min-height: 68px; + resize: vertical; +} + +input[type="range"] { + padding: 0; + border: none; + accent-color: var(--primary); +} + +.two-col { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px; +} + +.quick-actions { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 8px; +} + +.btn { + display: block; + width: 100%; + border: none; + border-radius: 12px; + padding: 11px 12px; + margin-top: 10px; + font-size: 13px; + font-weight: 900; + cursor: pointer; + text-align: center; + text-decoration: none; + transition: 0.16s; +} + +.btn-primary { + background: var(--primary); + color: white; +} + +.btn-primary:hover { + background: var(--primary-2); +} + +.btn-secondary { + background: #e0f2fe; + color: #075985; +} + +.btn-secondary:hover { + background: #bae6fd; +} + +.btn-danger { + background: #fee2e2; + color: #991b1b; +} + +.info-box, +.alert { + padding: 11px; + border-radius: 14px; + font-size: 12px; + line-height: 1.55; + margin-top: 10px; +} + +.info-box { + background: #fff7ed; + border: 1px solid #fed7aa; + color: #9a3412; +} + +.alert-danger { + background: #fee2e2; + border: 1px solid #fecaca; + color: #b91c1c; +} + +.list-box { + display: flex; + flex-direction: column; + gap: 9px; +} + +.list-item { + background: white; + border: 1px solid var(--line); + border-radius: 16px; + padding: 12px; + cursor: pointer; + box-shadow: 0 8px 18px rgba(15, 23, 42, 0.045); + transition: 0.16s; +} + +.list-item:hover { + border-color: var(--primary); + transform: translateY(-1px); +} + +.list-title-row { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 8px; +} + +.list-item b { + display: block; + font-size: 13px; + color: #0f172a; + line-height: 1.35; +} + +.list-item span { + display: block; + font-size: 11px; + color: var(--muted); + margin-top: 4px; + line-height: 1.4; +} + +.item-actions { + display: flex; + flex-wrap: wrap; + gap: 6px; + margin-top: 8px; +} + +.mini-btn { + border: none; + padding: 7px 9px; + border-radius: 9px; + font-size: 11px; + font-weight: 850; + cursor: pointer; + background: #eff6ff; + color: #1d4ed8; +} + +.mini-btn.green { background: #dcfce7; color: #166534; } +.mini-btn.red { background: #fee2e2; color: #991b1b; } +.mini-btn.purple { background: #ede9fe; color: #5b21b6; } + +.badge { + display: inline-block; + padding: 4px 8px; + border-radius: 999px; + font-size: 10px; + font-weight: 900; + white-space: nowrap; +} + +.badge-green { background: #dcfce7; color: #166534; } +.badge-red { background: #fee2e2; color: #991b1b; } +.badge-yellow { background: #fef3c7; color: #92400e; } +.badge-gray { background: #e5e7eb; color: #374151; } +.badge-blue { background: #dbeafe; color: #1e40af; } +.badge-purple { background: #ede9fe; color: #5b21b6; } + +.report-grid { + display: grid; + grid-template-columns: 1fr; + gap: 10px; +} + +.report-card { + display: block; + width: 100%; + text-align: left; + text-decoration: none; + border: 1px solid var(--line); + background: white; + border-radius: 16px; + padding: 14px; + color: #0f172a; + cursor: pointer; +} + +.report-card b, +.report-card span { + display: block; +} + +.report-card span { + color: var(--muted); + font-size: 12px; + margin-top: 5px; + line-height: 1.45; +} + +.map-toolbar { + position: absolute; + top: 16px; + right: 16px; + display: flex; + gap: 8px; + z-index: 1000; +} + +.tool-btn { + border: 1px solid var(--line); + background: white; + color: #334155; + padding: 9px 12px; + border-radius: 999px; + font-size: 12px; + font-weight: 900; + cursor: pointer; + box-shadow: 0 10px 24px rgba(15, 23, 42, 0.12); +} + +.tool-btn.active { + background: var(--primary); + color: white; + border-color: var(--primary); +} + +.legend { + position: absolute; + right: 16px; + bottom: 16px; + background: white; + z-index: 1000; + padding: 13px; + border-radius: 16px; + border: 1px solid var(--line); + box-shadow: 0 14px 35px rgba(15, 23, 42, 0.18); + font-size: 13px; + line-height: 1.85; +} + +.dot { + display: inline-block; + width: 12px; + height: 12px; + border-radius: 50%; + margin-right: 7px; + vertical-align: middle; +} + +.blue { background: var(--blue); } +.green { background: var(--green); } +.red { background: var(--red); } +.yellow { background: var(--yellow); } +.gray { background: var(--gray); } + +.popup-title { + font-weight: 900; + color: var(--primary); + margin-bottom: 6px; +} + +.popup-btn { + border: none; + padding: 7px 9px; + border-radius: 8px; + margin-top: 7px; + margin-right: 5px; + color: white; + background: var(--primary); + cursor: pointer; + font-weight: 800; + font-size: 12px; +} + +.popup-btn.secondary { background: var(--purple); } +.popup-btn.danger { background: var(--red); } +.popup-btn.green { background: var(--green); } + +.toast { + position: fixed; + left: 50%; + bottom: 24px; + transform: translateX(-50%) translateY(80px); + background: #0f172a; + color: white; + padding: 12px 16px; + border-radius: 999px; + z-index: 2000; + opacity: 0; + transition: 0.25s ease; + font-size: 13px; + box-shadow: 0 14px 35px rgba(15, 23, 42, 0.25); + max-width: 90vw; +} + +.toast.show { + opacity: 1; + transform: translateX(-50%) translateY(0); +} + +.leaflet-routing-container { display: none; } + +.login-page { + min-height: 100vh; + overflow: auto; + display: grid; + place-items: center; + padding: 24px; + background: + radial-gradient(circle at top left, rgba(15, 76, 129, 0.24), transparent 32%), + radial-gradient(circle at bottom right, rgba(22, 163, 74, 0.16), transparent 30%), + linear-gradient(135deg, #eff6ff, #f8fafc); +} + +.login-card { + width: 100%; + max-width: 430px; + background: white; + padding: 26px; + border-radius: 26px; + box-shadow: 0 24px 60px rgba(15, 23, 42, 0.18); + border: 1px solid var(--line); +} + +.brand-badge { + display: inline-block; + background: var(--primary); + color: white; + border-radius: 999px; + padding: 8px 12px; + font-size: 12px; + font-weight: 950; + margin-bottom: 12px; +} + +.login-card h1 { + font-size: 25px; + color: #0f172a; + margin-bottom: 6px; +} + +.login-card p { + color: var(--muted); + font-size: 13px; + line-height: 1.6; + margin-bottom: 14px; +} + +@media (max-width: 860px) { + .app-shell { + width: calc(100vw - 32px); + max-height: 58vh; + } + + .map-toolbar { + top: auto; + right: 16px; + bottom: 104px; + flex-wrap: wrap; + justify-content: flex-end; + } + + .legend { + right: 16px; + bottom: 16px; + font-size: 12px; + } +} + + +.auth-switch { + margin-top: 16px; + text-align: center; + color: var(--muted); + font-size: 13px; +} + +.auth-switch a { + color: var(--primary); + font-weight: 900; + text-decoration: none; +} + +.info-box.small-note { + margin-top: 14px; + font-size: 12px; + line-height: 1.55; +} + +/* UI polish: lebih lega dan minim teks */ +.app-shell { + width: 460px; + border-radius: 28px; +} + +.brand-panel { + grid-template-columns: 46px 1fr auto; + padding: 18px 18px 16px; +} + +.brand-panel h1 { + font-size: 21px; +} + +.brand-panel p { + font-size: 12px; + opacity: .78; +} + +.user-box { + margin: 16px 18px 0; + padding: 14px 15px; + border-radius: 18px; +} + +.tabs { + padding: 16px 18px 14px; + gap: 10px; + flex-wrap: wrap; + overflow-x: visible; +} + +.tab { + flex: 1 1 calc(50% - 10px); + padding: 11px 12px; + text-align: center; + border-radius: 14px; + background: #f8fafc; +} + +.panel-body { + padding: 20px; +} + +.hero-card { + padding: 22px; + border-radius: 24px; +} + +.hero-card h2 { + font-size: 22px; + margin-top: 5px; +} + +.hero-card p { + font-size: 13px; + line-height: 1.55; + max-width: 320px; +} + +.stats { + gap: 12px; + margin-top: 16px; +} + +.stat-card { + min-height: 92px; + padding: 16px; + border-radius: 22px; +} + +.stat-card span { + font-size: 28px; +} + +.section-title { + margin: 24px 0 13px; + font-size: 15px; +} + +.progress-wrap, +.report-card, +.list-item, +.info-box, +.alert { + border-radius: 18px; +} + +.info-box, +.alert { + padding: 13px 14px; +} + +label { + margin: 14px 0 6px; +} + +input, +select, +textarea { + padding: 12px 13px; + border-radius: 14px; +} + +textarea { + min-height: 86px; +} + +.two-col { + gap: 12px; +} + +.quick-actions { + gap: 10px; +} + +.btn { + padding: 13px 14px; + border-radius: 14px; + margin-top: 12px; +} + +.list-box { + gap: 12px; +} + +.list-item { + padding: 15px; +} + +.item-actions { + margin-top: 12px; + gap: 8px; +} + +.mini-btn { + padding: 8px 10px; + border-radius: 10px; +} + +.map-toolbar { + top: 20px; + right: 20px; + gap: 10px; +} + +.tool-btn { + padding: 11px 14px; + border-radius: 14px; +} + +.legend { + right: 20px; + bottom: 20px; + padding: 15px; + border-radius: 18px; +} + +.login-card { + max-width: 420px; + padding: 34px; + border-radius: 30px; +} + +.brand-badge { + margin-bottom: 16px; +} + +.login-card h1 { + font-size: 30px; + letter-spacing: -0.8px; +} + +.login-card p { + font-size: 14px; + margin-bottom: 18px; +} + +@media (max-width: 860px) { + .app-shell { + width: calc(100vw - 28px); + left: 14px; + top: 14px; + max-height: 62vh; + } + + .tabs { + flex-wrap: nowrap; + overflow-x: auto; + } + + .tab { + flex: 0 0 auto; + } + + .panel-body { + padding: 16px; + } +} + +.alert-success { + background: #dcfce7; + border: 1px solid #bbf7d0; + color: #166534; +} + +.register-card { + max-width: 560px; +} + +.role-extra { + display: none; +} + +.role-extra .btn { + margin-top: 8px; +} + +/* UI/UX refinement: cleaner final app layout */ +body { + background: #eaf2fb; +} + +.app-shell { + width: 456px; + border-radius: 28px; + transition: transform .24s ease, opacity .18s ease; +} + +body.panel-collapsed .app-shell { + transform: translateX(calc(-100% - 28px)); + opacity: 0; + pointer-events: none; +} + +.brand-panel { + grid-template-columns: 48px 1fr auto auto; + padding: 16px; +} + +.panel-toggle { + width: 34px; + height: 34px; + border: 1px solid rgba(255,255,255,.28); + border-radius: 999px; + color: white; + background: rgba(255,255,255,.16); + cursor: pointer; + font-size: 24px; + line-height: 1; + transition: .18s ease; +} + +.panel-toggle:hover, +.logout:hover, +.panel-open:hover, +.tool-btn:hover { + transform: translateY(-1px); +} + +.panel-open { + position: absolute; + top: 20px; + left: 20px; + z-index: 1001; + display: none; + border: 1px solid rgba(219, 228, 239, .96); + border-radius: 999px; + padding: 12px 16px; + color: #0f4c81; + background: rgba(255,255,255,.92); + box-shadow: 0 14px 38px rgba(15, 23, 42, .16); + backdrop-filter: blur(16px); + font-size: 13px; + font-weight: 950; + cursor: pointer; +} + +body.panel-collapsed .panel-open { + display: inline-flex; +} + +.user-box { + display: grid; + grid-template-columns: 1fr auto; + gap: 10px 12px; + align-items: start; + padding: 14px; +} + +.user-box .user-main b { + font-size: 15px; +} + +.user-box .user-main span { + margin-top: 5px; + word-break: break-word; +} + +.user-box p { + grid-column: 1 / -1; + color: var(--muted); + font-size: 12px; + line-height: 1.5; +} + +.role-chip { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 7px 10px; + border-radius: 999px; + color: #0f4c81; + background: #eff6ff; + border: 1px solid #dbeafe; + font-size: 11px; + font-weight: 950; + white-space: nowrap; +} + +.tabs { + flex-wrap: wrap; + gap: 8px; + padding: 14px 14px 12px; +} + +.tab { + flex: 1 1 auto; + text-align: center; + padding: 10px 12px; +} + +.panel-body { + padding: 16px; + scrollbar-width: thin; +} + +.hero-card, +.stat-card, +.progress-wrap, +.info-box, +.list-item, +.report-card { + box-shadow: 0 10px 26px rgba(15, 23, 42, .06); +} + +.hero-card { + padding: 18px; +} + +.hero-card h2 { + font-size: 22px; +} + +.stats.stats-wide { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.stat-card { + min-height: 90px; + padding: 15px; +} + +.stat-card span { + font-size: 28px; +} + +.section-title { + margin-top: 22px; +} + +input, +select, +textarea { + min-height: 44px; +} + +textarea { + line-height: 1.5; +} + +.btn { + min-height: 46px; +} + +.quick-actions, +.report-grid { + margin-top: 10px; +} + +.list-box { + max-height: 360px; + overflow-y: auto; + padding-right: 2px; +} + +.list-title-row { + gap: 10px; +} + +.item-actions { + display: flex; + flex-wrap: wrap; +} + +.badge, +.mini-btn, +.popup-btn { + white-space: nowrap; +} + +.map-toolbar { + flex-wrap: wrap; + max-width: calc(100vw - 520px); +} + +.legend { + line-height: 1.9; +} + +.leaflet-popup-content-wrapper { + border-radius: 18px; +} + +.leaflet-popup-content { + line-height: 1.55; +} + +/* Authentication pages */ +.login-page { + min-height: 100vh; + overflow-y: auto; + display: grid; + place-items: center; + padding: 32px 18px; + background: + radial-gradient(circle at 18% 12%, rgba(15,76,129,.16), transparent 30%), + radial-gradient(circle at 82% 18%, rgba(13,148,136,.15), transparent 30%), + linear-gradient(180deg, #f8fbff 0%, #eef7ff 100%); +} + +.login-card { + width: min(100%, 430px); + background: rgba(255,255,255,.94); + backdrop-filter: blur(18px); + border: 1px solid rgba(219,228,239,.94); +} + +.login-card.register-card { + width: min(100%, 880px); + max-width: 880px; + display: grid; + grid-template-columns: .78fr 1.22fr; + gap: 24px; + align-items: start; +} + +.login-card.register-card > .brand-badge, +.login-card.register-card > h1, +.login-card.register-card > p, +.login-card.register-card > .login-back, +.login-card.register-card > .alert, +.login-card.register-card > .auth-switch { + grid-column: 1 / -1; +} + +.login-card.register-card form { + grid-column: 1 / -1; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 0 16px; +} + +.login-card.register-card form > label, +.login-card.register-card form > input, +.login-card.register-card form > select, +.login-card.register-card form > textarea, +.login-card.register-card form > .info-box, +.login-card.register-card form > .role-extra, +.login-card.register-card form > .btn { + grid-column: span 1; +} + +.login-card.register-card form > .info-box, +.login-card.register-card form > .role-extra, +.login-card.register-card form > .btn { + grid-column: 1 / -1; +} + +.small-note { + font-size: 12px; + padding: 12px 13px; +} + +.auth-switch a, +.login-back { + color: var(--primary); + font-weight: 900; +} + +@media (max-width: 980px) { + .app-shell { + width: calc(100vw - 28px); + left: 14px; + top: auto; + bottom: 14px; + max-height: 68vh; + border-radius: 26px; + } + + body.panel-collapsed .app-shell { + transform: translateY(calc(100% + 28px)); + } + + .panel-open { + top: auto; + bottom: 20px; + left: 18px; + } + + .map-toolbar { + top: 14px; + left: 14px; + right: auto; + max-width: calc(100vw - 28px); + } + + .legend { + display: none; + } + + .tabs { + flex-wrap: nowrap; + } + + .tab { + flex: 0 0 auto; + } +} + +@media (max-width: 640px) { + .brand-panel { + grid-template-columns: 44px 1fr auto; + } + + .brand-logo { + width: 44px; + height: 44px; + } + + .brand-panel .logout { + display: none; + } + + .panel-toggle { + display: block; + } + + .stats.stats-wide, + .two-col, + .quick-actions, + .report-grid { + grid-template-columns: 1fr; + } + + .login-card.register-card, + .login-card.register-card form { + display: block; + } + + .login-card { + padding: 26px; + border-radius: 24px; + } + + .map-toolbar .tool-btn { + padding: 9px 11px; + } +} + +.role-select-hidden { + position: absolute; + width: 1px; + height: 1px; + opacity: 0; + pointer-events: none; +} + +.role-picker { + grid-column: 1 / -1; + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 10px; + margin: 8px 0 12px; +} + +.role-card-option { + text-align: left; + border: 1px solid #dbe4ef; + background: #ffffff; + border-radius: 18px; + padding: 14px; + cursor: pointer; + transition: .18s ease; + min-height: 94px; +} + +.role-card-option b, +.role-card-option span { + display: block; +} + +.role-card-option b { + color: #0f172a; + font-size: 14px; + margin-bottom: 6px; +} + +.role-card-option span { + color: #64748b; + font-size: 12px; + line-height: 1.4; +} + +.role-card-option:hover, +.role-card-option.active { + border-color: var(--primary); + background: #eff6ff; + box-shadow: 0 10px 24px rgba(15, 76, 129, .11); +} + +.role-card-option.active b { + color: var(--primary); +} + +@media (max-width: 640px) { + .role-picker { + grid-template-columns: 1fr; + } +} + +/* ========================================================= + UI/UX refinement: clearer onboarding, softer spacing, final look + ========================================================= */ +:root { + --surface: rgba(255, 255, 255, 0.94); + --surface-solid: #ffffff; + --ink: #0f172a; + --soft-shadow: 0 18px 50px rgba(15, 23, 42, 0.16); +} + +body { + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + color: var(--ink); +} + +.app-shell { + width: min(450px, calc(100vw - 28px)); + border-radius: 28px; + background: var(--surface); + backdrop-filter: blur(18px); + box-shadow: var(--soft-shadow); + border: 1px solid rgba(226, 232, 240, 0.88); +} + +.brand-panel { + align-items: center; + gap: 11px; + padding: 17px 18px; + background: linear-gradient(135deg, #0b3f6d, #0f72a8 58%, #0e7490); +} + +.brand-logo { + box-shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 12px 24px rgba(0,0,0,.12); +} + +.panel-toggle, +.logout, +.help-button { + height: 34px; + border: 0; + border-radius: 999px; + font-weight: 800; +} + +.help-button { + margin-left: auto; + padding: 0 12px; + background: rgba(255,255,255,.18); + color: #fff; + cursor: pointer; +} + +.logout { + align-self: center; + background: rgba(255,255,255,.13); +} + +.user-box { + display: grid; + gap: 8px; + margin: 14px 16px 0; + padding: 14px; + border-radius: 20px; + background: linear-gradient(180deg, #ffffff, #f8fafc); +} + +.user-box p { + margin: 0; + font-size: 12px; + color: var(--muted); + line-height: 1.45; +} + +.role-chip { + width: max-content; + max-width: 100%; + padding: 5px 9px; + border-radius: 999px; + background: #e0f2fe; + color: #075985 !important; + font-size: 11px !important; + font-weight: 850; +} + +.quick-guide-card { + display: flex; + align-items: center; + gap: 12px; + margin: 12px 16px 0; + padding: 13px; + border: 1px solid #dbeafe; + border-radius: 20px; + background: #eff6ff; +} + +.quick-guide-card div { + min-width: 0; + flex: 1; +} + +.quick-guide-card small, +.quick-guide-card span, +.quick-guide-card b { + display: block; +} + +.quick-guide-card small { + color: #2563eb; + font-weight: 900; + font-size: 10px; + text-transform: uppercase; + letter-spacing: .45px; +} + +.quick-guide-card b { + margin-top: 3px; + font-size: 13px; + color: #172554; +} + +.quick-guide-card span { + margin-top: 4px; + color: #475569; + line-height: 1.38; + font-size: 12px; +} + +.quick-guide-card button { + width: auto; + flex: 0 0 auto; + border: 0; + border-radius: 14px; + padding: 10px 12px; + background: #0f4c81; + color: white; + font-weight: 900; + cursor: pointer; +} + +.tabs { + padding: 14px 16px 12px; + gap: 9px; + scrollbar-width: thin; +} + +.tab { + padding: 10px 14px; + border-color: #e2e8f0; + background: #f8fafc; +} + +.panel-body { + padding: 16px; +} + +.dashboard-hero { + padding: 18px; + border-radius: 24px; + overflow: hidden; + position: relative; +} + +.dashboard-hero::after { + content: ''; + position: absolute; + width: 170px; + height: 170px; + right: -70px; + top: -70px; + border-radius: 999px; + background: rgba(255,255,255,.15); +} + +.hero-actions { + display: flex; + gap: 9px; + flex-wrap: wrap; + margin-top: 15px; + position: relative; + z-index: 1; +} + +.hero-btn { + width: auto; + margin: 0; + padding: 10px 13px; + border-radius: 999px; + background: #fff; + color: #0f4c81; + border: 0; +} + +.hero-btn.ghost { + background: rgba(255,255,255,.18); + color: white; + border: 1px solid rgba(255,255,255,.24); +} + +.guide-stepper { + display: grid; + gap: 10px; + margin: 14px 0 12px; +} + +.guide-step { + display: grid; + grid-template-columns: 34px 1fr; + column-gap: 10px; + padding: 12px; + border: 1px solid #e2e8f0; + border-radius: 18px; + background: #fff; +} + +.guide-step i { + grid-row: span 2; + width: 34px; + height: 34px; + display: grid; + place-items: center; + border-radius: 12px; + background: #e0f2fe; + color: #0369a1; + font-style: normal; + font-weight: 950; +} + +.guide-step b { + color: #0f172a; + font-size: 13px; +} + +.guide-step span { + margin-top: 3px; + color: #64748b; + font-size: 12px; + line-height: 1.42; +} + +.tab-intro { + display: grid; + gap: 5px; + padding: 15px; + border-radius: 20px; + background: linear-gradient(180deg, #ffffff, #f8fafc); + border: 1px solid #e2e8f0; + margin-bottom: 14px; +} + +.tab-intro b { + font-size: 16px; + color: #0f172a; +} + +.tab-intro span { + font-size: 12.5px; + line-height: 1.55; + color: #64748b; +} + +.mini-step-list { + display: grid; + gap: 8px; + margin-bottom: 14px; +} + +.mini-step-list span { + display: flex; + align-items: center; + gap: 9px; + padding: 10px 11px; + border-radius: 15px; + background: #f8fafc; + border: 1px solid #e2e8f0; + color: #475569; + font-size: 12px; +} + +.mini-step-list b { + width: 22px; + height: 22px; + display: grid; + place-items: center; + border-radius: 999px; + background: #0f4c81; + color: white; + font-size: 11px; +} + +.stats-wide { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 11px; +} + +.stat-card { + border-radius: 20px; + padding: 14px; + background: #fff; + border: 1px solid #e2e8f0; + box-shadow: 0 10px 24px rgba(15, 23, 42, .05); +} + +.stat-card span { + font-size: 24px; + letter-spacing: -.5px; +} + +.progress-wrap, +.info-box, +.report-card, +.list-item, +.empty-state { + border-radius: 18px; +} + +input, +select, +textarea { + border-radius: 14px; + min-height: 42px; + border: 1px solid #dbe3ee; + background: #fff; +} + +textarea { + min-height: 84px; +} + +label { + margin-top: 12px; + margin-bottom: 6px; + font-weight: 850; + color: #334155; +} + +.btn { + border-radius: 15px; + min-height: 43px; +} + +.quick-actions { + gap: 9px; +} + +.list-box { + display: grid; + gap: 10px; +} + +.list-item { + padding: 13px; + background: #fff; + border: 1px solid #e2e8f0; + box-shadow: 0 8px 20px rgba(15, 23, 42, .045); +} + +.list-item:hover { + transform: translateY(-1px); + border-color: #bfdbfe; + box-shadow: 0 14px 28px rgba(15, 23, 42, .08); +} + +.list-item span { + line-height: 1.45; +} + +.item-actions { + gap: 7px; +} + +.mini-btn { + border-radius: 999px; + padding: 7px 10px; +} + +.empty-state { + display: grid; + place-items: center; + text-align: center; + gap: 7px; + min-height: 150px; + padding: 20px; + background: #f8fafc; + border: 1px dashed #cbd5e1; + color: #64748b; +} + +.empty-state b { + color: #334155; + font-size: 14px; +} + +.empty-state span { + font-size: 12.5px; + line-height: 1.45; +} + +.empty-icon { + width: 42px; + height: 42px; + display: grid; + place-items: center; + border-radius: 16px; + background: #e0f2fe; + color: #0369a1; + font-size: 20px; + font-weight: 900; +} + +.map-toolbar { + right: 18px; + top: 18px; + padding: 8px; + border-radius: 999px; + background: rgba(255,255,255,.94); + backdrop-filter: blur(14px); + box-shadow: 0 12px 36px rgba(15,23,42,.13); +} + +.tool-btn { + border-radius: 999px; + padding: 9px 12px; +} + +.legend { + right: 18px; + bottom: 18px; + border-radius: 20px; + background: rgba(255,255,255,.94); + backdrop-filter: blur(14px); + box-shadow: 0 12px 36px rgba(15,23,42,.13); + line-height: 1.9; +} + +.map-helper { + position: absolute; + left: 482px; + bottom: 18px; + max-width: 360px; + z-index: 900; + display: grid; + gap: 4px; + padding: 12px 14px; + border-radius: 20px; + background: rgba(15, 23, 42, .82); + color: white; + box-shadow: 0 12px 36px rgba(15,23,42,.18); + backdrop-filter: blur(14px); +} + +.map-helper b { + font-size: 12px; +} + +.map-helper span { + color: rgba(255,255,255,.82); + font-size: 12px; + line-height: 1.45; +} + +.panel-collapsed .map-helper { + left: 18px; +} + +.panel-open { + border-radius: 999px; + padding: 11px 14px; + box-shadow: 0 12px 36px rgba(15,23,42,.16); +} + +.guide-modal { + position: fixed; + inset: 0; + display: none; + z-index: 4000; +} + +.guide-modal.show { + display: block; +} + +.guide-backdrop { + position: absolute; + inset: 0; + background: rgba(15, 23, 42, .42); + backdrop-filter: blur(5px); +} + +.guide-dialog { + position: absolute; + left: 50%; + top: 50%; + width: min(520px, calc(100vw - 32px)); + transform: translate(-50%, -50%); + padding: 24px; + border-radius: 30px; + background: white; + box-shadow: 0 30px 80px rgba(15, 23, 42, .28); +} + +.guide-close { + position: absolute; + right: 16px; + top: 16px; + width: 34px; + height: 34px; + border: 0; + border-radius: 999px; + background: #f1f5f9; + color: #334155; + font-size: 22px; + line-height: 1; + cursor: pointer; +} + +.guide-dialog small { + color: #2563eb; + font-size: 11px; + font-weight: 950; + text-transform: uppercase; + letter-spacing: .5px; +} + +.guide-dialog h2 { + margin-top: 6px; + font-size: 24px; + line-height: 1.15; +} + +.guide-dialog p { + margin-top: 8px; + color: #64748b; + line-height: 1.55; +} + +.guide-list { + display: grid; + gap: 10px; + margin-top: 16px; +} + +.guide-modal-step { + display: grid; + grid-template-columns: 38px 1fr; + gap: 12px; + align-items: flex-start; + padding: 12px; + border-radius: 18px; + border: 1px solid #e2e8f0; + background: #f8fafc; +} + +.guide-modal-step i { + width: 38px; + height: 38px; + display: grid; + place-items: center; + border-radius: 14px; + background: #0f4c81; + color: white; + font-style: normal; + font-weight: 950; +} + +.guide-modal-step b, +.guide-modal-step span { + display: block; +} + +.guide-modal-step b { + font-size: 14px; +} + +.guide-modal-step span { + margin-top: 4px; + font-size: 12.5px; + color: #64748b; + line-height: 1.45; +} + +.guide-dialog-actions { + display: flex; + gap: 10px; + margin-top: 18px; +} + +.guide-dialog-actions .btn { + margin: 0; +} + +/* Landing/auth polishing */ +.landing-nav, +.login-card { + box-shadow: 0 18px 48px rgba(15, 23, 42, .10); +} + +.feature-card, +.access-card, +.flow-card, +.login-card { + border-radius: 26px; +} + +.login-page { + background: + radial-gradient(circle at 15% 10%, rgba(14, 165, 233, .18), transparent 32%), + radial-gradient(circle at 88% 12%, rgba(34, 197, 94, .14), transparent 34%), + linear-gradient(180deg, #f8fafc, #eff6ff); +} + +.register-card { + width: min(620px, calc(100vw - 28px)); +} + +.role-picker { + gap: 10px; +} + +.role-card-option { + border-radius: 20px; + padding: 14px; +} + +@media (max-width: 960px) { + .app-shell { + width: calc(100vw - 22px); + max-height: 62vh; + border-radius: 24px; + } + + .map-toolbar { + top: auto; + right: 12px; + bottom: 92px; + border-radius: 22px; + flex-wrap: wrap; + justify-content: flex-end; + max-width: calc(100vw - 24px); + } + + .legend { + display: none; + } + + .map-helper { + left: 12px; + right: 12px; + bottom: 12px; + max-width: none; + } + + .panel-collapsed .map-helper { + left: 12px; + } + + .guide-dialog { + padding: 20px; + border-radius: 26px; + } +} + +@media (max-width: 560px) { + .brand-panel { + padding: 14px; + } + + .brand-panel h1 { + font-size: 18px; + } + + .help-button { + display: none; + } + + .quick-guide-card { + align-items: stretch; + flex-direction: column; + } + + .quick-guide-card button { + width: 100%; + } + + .stats-wide { + grid-template-columns: 1fr; + } + + .two-col { + grid-template-columns: 1fr; + } + + .guide-dialog-actions { + flex-direction: column; + } +} + +/* Penyempurnaan catatan UX: pemilihan lokasi, anggota KK, musibah, dan pemberdayaan */ +.register-card-wide { + max-width: 760px; +} + +.location-picker-box { + margin-top: 14px; + padding: 14px; + border: 1px solid #dbeafe; + background: #f8fbff; + border-radius: 18px; +} + +.location-search-row { + display: grid; + grid-template-columns: 1fr 96px; + gap: 8px; + align-items: end; +} + +.location-search-row .btn { + margin-top: 0; + height: 44px; +} + +.register-map { + height: 260px; + border-radius: 16px; + overflow: hidden; + margin: 10px 0; + border: 1px solid #dbeafe; + background: #eff6ff; +} + +.selected-location-text { + font-size: 12px; + color: #475569; + background: #ffffff; + border: 1px dashed #93c5fd; + border-radius: 12px; + padding: 9px 10px; + margin-bottom: 8px; +} + +.anggota-container { + display: grid; + gap: 12px; + margin-bottom: 10px; +} + +.anggota-card { + padding: 12px; + border: 1px solid #e2e8f0; + border-radius: 18px; + background: #ffffff; + box-shadow: 0 10px 28px rgba(15, 23, 42, 0.05); +} + +.anggota-card label { + margin-top: 10px; +} + +.anggota-title { + margin-bottom: 4px; +} + +.member-details { + margin-top: 8px; + padding: 8px 10px; + border-radius: 12px; + background: #f8fafc; + border: 1px solid #e2e8f0; +} + +.member-details summary { + cursor: pointer; + font-weight: 700; + color: #0f4c81; + font-size: 12px; +} + +.member-row-mini { + display: grid; + gap: 2px; + padding: 8px 0; + border-top: 1px solid #e2e8f0; +} + +.member-row-mini:first-of-type { + border-top: 0; +} + +.member-row-mini b { + font-size: 12px; +} + +.member-row-mini span { + font-size: 12px; + color: #64748b; +} + +.danger-card span, +.hero-btn.danger { + color: #b91c1c; +} + +.hero-btn.danger { + background: #fee2e2; + border-color: #fecaca; +} + +.badge-blue { + background: #dbeafe; + color: #1d4ed8; +} + +@media (max-width: 720px) { + .location-search-row { + grid-template-columns: 1fr; + } + + .register-map { + height: 220px; + } +}