/** * Copyright since 2025 Mifos Initiative * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ :host { --ccd-blue: #1d4ed8; --ccd-blue-d: #1e40af; --ccd-blue-l: #eff6ff; --ccd-blue-tint: #dbeafe; --ccd-teal: #0d9488; --ccd-teal-l: #ccfbf1; --ccd-amber: #d97706; --ccd-amber-l: #fef3c7; --ccd-red: #b91c1c; --ccd-red-l: #fee2e2; --ccd-red-tint: #fecaca; --ccd-green: #15803d; --ccd-green-l: #dcfce7; --ccd-purple: #6d28d9; --ccd-purple-l: #ede9fe; --ccd-g50: #f8fafc; --ccd-g100: #f1f5f9; --ccd-g200: #e2e8f0; --ccd-g300: #cbd5e1; --ccd-g500: #64748b; --ccd-g700: #334155; --ccd-g900: #0f172a; display: block; } .ccd-root { background: #fff; padding: 14px 18px 18px; width: 100%; max-height: 86vh; display: flex; flex-direction: column; overflow: hidden; } /* ───────── Header ───────── */ .ccd-head { display: flex; align-items: center; justify-content: space-between; gap: 14px; padding-bottom: 12px; margin-bottom: 12px; border-bottom: 1px solid var(--ccd-g200); } .ccd-head-l { display: flex; align-items: center; gap: 12px; } .ccd-head-ic { width: 38px; height: 38px; flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; border-radius: 12px; background: var(--ccd-green); color: #fff; font-size: 15px; } .ccd-head-t { margin: 0; font-size: 16px; font-weight: 800; color: var(--ccd-g900); line-height: 1.2; } .ccd-head-s { margin-top: 3px; font-size: 11.5px; color: var(--ccd-g500); } .ccd-x { width: 32px; height: 32px; border-radius: 999px; border: 1px solid var(--ccd-g200); background: #fff; color: var(--ccd-g500); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; font-size: 13px; flex-shrink: 0; transition: all 0.12s ease; &:hover { background: var(--ccd-red-l); color: var(--ccd-red); border-color: var(--ccd-red-tint); } } .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; } /* ───────── Body ───────── */ .ccd-body { flex: 1; display: flex; flex-direction: column; gap: 8px; overflow-y: auto; padding-right: 2px; } /* ───────── Contact row ───────── */ .ccd-row { position: relative; display: grid; grid-template-columns: 44px 1fr auto; align-items: center; gap: 12px; padding: 12px 14px 12px 18px; background: #fff; border: 1px solid var(--ccd-g200); border-radius: 12px; transition: border-color 0.15s ease, box-shadow 0.15s ease; overflow: hidden; &:hover { border-color: var(--ccd-blue-tint); box-shadow: 0 4px 14px -8px rgb(15 23 42 / 18%); } } .ccd-row-strip { position: absolute; left: 0; top: 0; bottom: 0; width: 4px; .accent-blue & { background: var(--ccd-blue); } .accent-teal & { background: var(--ccd-teal); } .accent-amber & { background: var(--ccd-amber); } .accent-purple & { background: var(--ccd-purple); } } .ccd-row-icon { width: 38px; height: 38px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: 14px; flex-shrink: 0; .accent-blue & { background: var(--ccd-blue-l); color: var(--ccd-blue-d); } .accent-teal & { background: var(--ccd-teal-l); color: var(--ccd-teal); } .accent-amber & { background: var(--ccd-amber-l); color: var(--ccd-amber); } .accent-purple & { background: var(--ccd-purple-l); color: var(--ccd-purple); } } .ccd-row-text { min-width: 0; display: flex; flex-direction: column; gap: 1px; line-height: 1.25; } .ccd-row-label { font-size: 9.5px; font-weight: 800; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ccd-g500); } .ccd-row-name { font-size: 13px; font-weight: 700; color: var(--ccd-g900); } .ccd-row-mobile { font-size: 12.5px; font-weight: 600; color: var(--ccd-g700); font-variant-numeric: tabular-nums; letter-spacing: 0.02em; } /* ───────── Row actions ───────── */ .ccd-row-actions { display: inline-flex; align-items: center; gap: 6px; flex-shrink: 0; } .ccd-act { display: inline-flex; align-items: center; gap: 6px; height: 34px; padding: 0 11px; border-radius: 8px; border: 1px solid var(--ccd-g200); background: #fff; color: var(--ccd-g700); font-size: 12.5px; font-weight: 700; cursor: pointer; transition: all 0.12s ease; fa-icon { font-size: 12px; color: var(--ccd-g500); } span { letter-spacing: 0.02em; } &:hover { background: var(--ccd-blue-l); border-color: var(--ccd-blue-tint); color: var(--ccd-blue-d); fa-icon { color: var(--ccd-blue-d); } } &:focus-visible { outline: 2px solid var(--ccd-blue); outline-offset: 2px; } } /* Primary "Call" button → solid green so it pops as the recommended action. */ .ccd-act.ccd-act--primary { background: var(--ccd-green); color: #fff; border-color: var(--ccd-green); fa-icon { color: #fff; } &:hover { background: #14532d; border-color: #14532d; color: #fff; fa-icon { color: #fff; } } } /* "Log call outcome" toggle button. */ .ccd-act.ccd-act--log { width: 34px; padding: 0; justify-content: center; &.is-on { background: var(--ccd-blue-d); border-color: var(--ccd-blue-d); color: #fff; fa-icon { color: #fff; } } } /* "Save call log" — primary blue when enabled. */ .ccd-act.ccd-act--save { background: var(--ccd-blue-d); color: #fff; border-color: var(--ccd-blue-d); fa-icon { color: #fff; } &:hover:not(:disabled) { background: var(--ccd-blue); border-color: var(--ccd-blue); } &:disabled { opacity: 0.5; cursor: not-allowed; } } /* ───────── Latest-log strip on the contact row ───────── */ .ccd-row-group { display: flex; flex-direction: column; gap: 0; } .ccd-row.is-logging { border-color: var(--ccd-blue-tint); border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .ccd-row-lastlog { display: inline-flex; align-items: center; gap: 6px; margin-top: 4px; padding: 3px 9px; border-radius: 999px; font-size: 10.5px; font-weight: 700; letter-spacing: 0.02em; align-self: flex-start; fa-icon { font-size: 10px; } &.tone-green { background: var(--ccd-green-l); color: var(--ccd-green); } &.tone-blue { background: var(--ccd-blue-l); color: var(--ccd-blue-d); } &.tone-amber { background: var(--ccd-amber-l); color: var(--ccd-amber); } &.tone-red { background: var(--ccd-red-l); color: var(--ccd-red); } } .ccd-lastlog-m { font-weight: 500; color: inherit; opacity: 0.85; } .ccd-lastlog-ptp { margin-left: 6px; padding-left: 6px; border-left: 1px solid currentcolor; opacity: 0.85; } /* ───────── Inline disposition picker ───────── */ .ccd-log { border: 1px solid var(--ccd-blue-tint); border-top: 0; border-bottom-left-radius: 12px; border-bottom-right-radius: 12px; background: linear-gradient(180deg, #f8fafc 0%, #fff 100%); padding: 12px 14px 14px; display: flex; flex-direction: column; gap: 10px; margin-bottom: 8px; } .ccd-log-h { display: flex; align-items: center; gap: 8px; font-size: 12.5px; font-weight: 800; color: var(--ccd-g900); padding-bottom: 8px; border-bottom: 1px dashed var(--ccd-g200); } .ccd-log-h-ic { width: 22px; height: 22px; display: inline-flex; align-items: center; justify-content: center; border-radius: 7px; background: var(--ccd-blue-d); color: #fff; font-size: 11px; } .ccd-log-h-sub { margin-left: auto; font-size: 11px; font-weight: 600; color: var(--ccd-g500); letter-spacing: 0.01em; } .ccd-log-l { font-size: 10px; font-weight: 800; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ccd-g500); } /* Outcome chip group */ .ccd-chips { display: flex; flex-wrap: wrap; gap: 6px; } .ccd-chip { display: inline-flex; align-items: center; gap: 6px; padding: 5px 11px; border-radius: 999px; border: 1px solid var(--ccd-g200); background: #fff; color: var(--ccd-g700); font-size: 11.5px; font-weight: 700; letter-spacing: 0.01em; cursor: pointer; transition: all 0.12s ease; fa-icon { font-size: 11px; color: var(--ccd-g500); } &:hover:not(.is-on) { background: var(--ccd-g50); border-color: var(--ccd-g300); } &.is-on { color: #fff; fa-icon { color: #fff; } &.tone-green { background: var(--ccd-green); border-color: var(--ccd-green); } &.tone-blue { background: var(--ccd-blue-d); border-color: var(--ccd-blue-d); } &.tone-amber { background: var(--ccd-amber); border-color: var(--ccd-amber); } &.tone-red { background: var(--ccd-red); border-color: var(--ccd-red); } } } /* Promise-to-pay fields */ .ccd-ptp { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; padding: 10px 12px; background: var(--ccd-green-l); border: 1px solid #bbf7d0; border-radius: 10px; } .ccd-field { display: flex; flex-direction: column; gap: 4px; label { font-size: 10px; font-weight: 800; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ccd-g500); } input, textarea { box-sizing: border-box; width: 100%; border: 1px solid var(--ccd-g200); border-radius: 8px; padding: 8px 11px; background: #fff; font-size: 12.5px; color: var(--ccd-g900); font-family: inherit; outline: none; transition: border-color 0.15s ease; resize: vertical; &:focus { border-color: var(--ccd-blue); } } textarea { min-height: 50px; } } .ccd-log-actions { display: flex; justify-content: flex-end; gap: 8px; padding-top: 4px; } /* ───────── Recent-calls history list ───────── */ .ccd-history { margin-top: 14px; padding-top: 14px; border-top: 1px dashed var(--ccd-g200); } .ccd-history-h { display: flex; align-items: center; gap: 8px; font-size: 10px; font-weight: 800; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ccd-g500); margin-bottom: 8px; fa-icon { font-size: 11px; color: var(--ccd-blue); } } .ccd-history-c { margin-left: 4px; padding: 2px 8px; border-radius: 999px; background: var(--ccd-g100); color: var(--ccd-g500); font-size: 9.5px; font-weight: 800; } .ccd-history-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; } .ccd-history-item { padding: 8px 10px 8px 14px; border: 1px solid var(--ccd-g200); border-radius: 9px; background: #fff; position: relative; &.tone-green { border-left: 4px solid var(--ccd-green); } &.tone-blue { border-left: 4px solid var(--ccd-blue); } &.tone-amber { border-left: 4px solid var(--ccd-amber); } &.tone-red { border-left: 4px solid var(--ccd-red); } } .ccd-history-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; font-size: 11.5px; } .ccd-history-outcome { display: inline-flex; align-items: center; gap: 5px; font-weight: 800; color: var(--ccd-g900); fa-icon { font-size: 10.5px; } .tone-green & fa-icon { color: var(--ccd-green); } .tone-blue & fa-icon { color: var(--ccd-blue-d); } .tone-amber & fa-icon { color: var(--ccd-amber); } .tone-red & fa-icon { color: var(--ccd-red); } } .ccd-history-kind { font-size: 10.5px; font-weight: 600; color: var(--ccd-g500); } .ccd-history-num { font-size: 11.5px; font-weight: 600; color: var(--ccd-g700); font-variant-numeric: tabular-nums; } .ccd-history-meta { margin-left: auto; font-size: 11px; color: var(--ccd-g500); } .ccd-history-ptp { margin-top: 6px; padding: 4px 9px; display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 700; color: var(--ccd-green); background: var(--ccd-green-l); border-radius: 8px; fa-icon { font-size: 10px; } } .ccd-history-notes { margin-top: 6px; font-size: 11.5px; font-style: italic; color: var(--ccd-g500); line-height: 1.45; } /* ───────── Empty state ───────── */ .ccd-empty { display: flex; align-items: flex-start; gap: 12px; padding: 18px 16px; border: 1px dashed var(--ccd-g300); border-radius: 10px; background: var(--ccd-g50); color: var(--ccd-g700); fa-icon { color: var(--ccd-blue); font-size: 18px; margin-top: 2px; } p { margin: 4px 0 0; font-size: 12.5px; color: var(--ccd-g500); } } @media (width <= 540px) { .ccd-row { grid-template-columns: 38px 1fr; grid-template-areas: 'icon text' 'actions actions'; row-gap: 8px; } .ccd-row-icon { grid-area: icon; } .ccd-row-text { grid-area: text; } .ccd-row-actions { grid-area: actions; justify-content: flex-end; } }