feat: redesign client view header — dark gradient card with modern layout
- Dark gradient background (#0f1923 → #1c2d3f) replacing old blue card - Rounded 72px avatar with compact upload/capture/delete buttons - Name row: bold white text + green status badge + menu button - ID chips: monospace font, semi-transparent background - 4-column details grid with cell borders inside rounded container - All labels 9px uppercase, values 12.5px white - Responsive: 3-col → 2-col → 1-col on smaller screens - Also fix: 2-column grid specificity for dialog file upload Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
693ffed397
commit
54ab436563
@@ -6,165 +6,158 @@
|
||||
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
-->
|
||||
|
||||
<mat-card class="account-card">
|
||||
<mat-card-header class="header layout-column">
|
||||
<mat-card-title-group class="header-title-group">
|
||||
<div class="profile-image-container">
|
||||
<div>
|
||||
<img
|
||||
mat-card-md-image
|
||||
class="profile-image"
|
||||
[src]="clientImage ? clientImage : 'assets/images/user_placeholder.png'"
|
||||
/>
|
||||
</div>
|
||||
<div class="m-b-5 flex-center">
|
||||
<button
|
||||
class="client-image-button"
|
||||
mat-raised-button
|
||||
(click)="doAction('Upload Image')"
|
||||
matTooltip="{{ 'tooltips.Upload Image' | translate }}"
|
||||
*mifosxHasPermission="'CREATE_CLIENTIMAGE'"
|
||||
>
|
||||
<i class="fa fa-upload"></i>
|
||||
</button>
|
||||
<button
|
||||
class="client-image-button"
|
||||
mat-raised-button
|
||||
(click)="doAction('Capture Image')"
|
||||
matTooltip="{{ 'tooltips.Capture Image' | translate }}"
|
||||
*mifosxHasPermission="'CREATE_CLIENTIMAGE'"
|
||||
>
|
||||
<i class="fa fa-camera"></i>
|
||||
</button>
|
||||
<button
|
||||
class="client-image-button"
|
||||
mat-raised-button
|
||||
(click)="doAction('Delete Image')"
|
||||
matTooltip="{{ 'tooltips.Delete Image' | translate }}"
|
||||
*mifosxHasPermission="'DELETE_CLIENTIMAGE'"
|
||||
>
|
||||
<i class="fa fa-trash"></i>
|
||||
</button>
|
||||
<br />
|
||||
</div>
|
||||
<p (click)="doAction('View Signature')" class="signature">{{ 'labels.inputs.View Signature' | translate }}</p>
|
||||
<div class="cv-card">
|
||||
<div class="cv-top">
|
||||
<!-- Avatar -->
|
||||
<div class="cv-avatar">
|
||||
<img class="cv-avatar__img"
|
||||
[src]="clientImage ? clientImage : 'assets/images/user_placeholder.png'" />
|
||||
<div class="cv-avatar__actions">
|
||||
<button class="cv-avatar__btn"
|
||||
(click)="doAction('Upload Image')"
|
||||
matTooltip="{{ 'tooltips.Upload Image' | translate }}"
|
||||
*mifosxHasPermission="'CREATE_CLIENTIMAGE'">
|
||||
<i class="fa fa-upload"></i>
|
||||
</button>
|
||||
<button class="cv-avatar__btn"
|
||||
(click)="doAction('Capture Image')"
|
||||
matTooltip="{{ 'tooltips.Capture Image' | translate }}"
|
||||
*mifosxHasPermission="'CREATE_CLIENTIMAGE'">
|
||||
<i class="fa fa-camera"></i>
|
||||
</button>
|
||||
<button class="cv-avatar__btn cv-avatar__btn--danger"
|
||||
(click)="doAction('Delete Image')"
|
||||
matTooltip="{{ 'tooltips.Delete Image' | translate }}"
|
||||
*mifosxHasPermission="'DELETE_CLIENTIMAGE'">
|
||||
<i class="fa fa-trash"></i>
|
||||
</button>
|
||||
</div>
|
||||
<span class="cv-avatar__sig" (click)="doAction('View Signature')">{{ 'labels.inputs.View Signature' | translate }}</span>
|
||||
</div>
|
||||
|
||||
<div class="mat-typography account-card-title">
|
||||
<!-- Top Row: Name + Status + Actions -->
|
||||
<mat-card-title class="cv-title-row">
|
||||
<div class="cv-name-block">
|
||||
<i class="fa fa-stop" [ngClass]="clientViewData.status.code | statusLookup"
|
||||
matTooltip="{{ 'labels.status.' + clientViewData.status.value | translate }}"></i>
|
||||
<!-- Info -->
|
||||
<div class="cv-info">
|
||||
<!-- Name + Status + Menu -->
|
||||
<div class="cv-name-row">
|
||||
<div class="cv-name">
|
||||
<i class="fa fa-stop cv-name__dot" [ngClass]="clientViewData.status.code | statusLookup"
|
||||
matTooltip="{{ 'labels.status.' + clientViewData.status.value | translate }}"></i>
|
||||
<span class="cv-name__text">
|
||||
<mifosx-entity-name
|
||||
[entityName]="complianceHideClientData ? maskName(clientViewData.displayName) : clientViewData.displayName"
|
||||
[display]="'right'" [hideCopy]="complianceHideClientData"></mifosx-entity-name>
|
||||
<span class="cv-status-chip" [ngClass]="clientViewData.status.code | statusLookup">
|
||||
{{ 'labels.status.' + clientViewData.status.value | translate }}
|
||||
</span>
|
||||
<span class="cv-name__status">
|
||||
{{ 'labels.status.' + clientViewData.status.value | translate }}
|
||||
</span>
|
||||
</div>
|
||||
<button mat-icon-button [matMenuTriggerFor]="clientMenu" class="cv-menu-btn" aria-label="Client actions">
|
||||
<mat-icon matListIcon class="actions-menu"><fa-icon icon="bars" size="sm"></fa-icon></mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- ID Chips -->
|
||||
<div class="cv-ids">
|
||||
<div class="cv-id">
|
||||
<span class="cv-id__label">{{ 'labels.inputs.Account No' | translate }}</span>
|
||||
<span class="cv-id__val">
|
||||
<mifosx-account-number accountNo="{{ clientViewData.accountNo }}"></mifosx-account-number>
|
||||
</span>
|
||||
</div>
|
||||
@if (clientViewData.cifNumber) {
|
||||
<div class="cv-id">
|
||||
<span class="cv-id__label">{{ 'labels.inputs.CIF Number' | translate }}</span>
|
||||
<span class="cv-id__val">
|
||||
<mifosx-account-number accountNo="{{ clientViewData.cifNumber }}"></mifosx-account-number>
|
||||
</span>
|
||||
</div>
|
||||
<button mat-icon-button [matMenuTriggerFor]="clientMenu" aria-label="Client actions">
|
||||
<mat-icon matListIcon class="actions-menu"><fa-icon icon="bars" size="sm"></fa-icon></mat-icon>
|
||||
</button>
|
||||
</mat-card-title>
|
||||
|
||||
<!-- ID Chips Row -->
|
||||
<div class="cv-id-row">
|
||||
<div class="cv-id-chip">
|
||||
<span class="cv-id-label">{{ 'labels.inputs.Account No' | translate }}</span>
|
||||
<mifosx-account-number accountNo="{{ clientViewData.accountNo }}"></mifosx-account-number>
|
||||
</div>
|
||||
@if (clientViewData.cifNumber) {
|
||||
<div class="cv-id-chip">
|
||||
<span class="cv-id-label">{{ 'labels.inputs.CIF Number' | translate }}</span>
|
||||
<mifosx-account-number accountNo="{{ clientViewData.cifNumber }}"></mifosx-account-number>
|
||||
</div>
|
||||
}
|
||||
@if (clientViewData.externalId) {
|
||||
<div class="cv-id-chip">
|
||||
<span class="cv-id-label">{{ 'labels.inputs.External Id' | translate }}</span>
|
||||
}
|
||||
@if (clientViewData.externalId) {
|
||||
<div class="cv-id">
|
||||
<span class="cv-id__label">{{ 'labels.inputs.External Id' | translate }}</span>
|
||||
<span class="cv-id__val">
|
||||
<mifosx-external-identifier
|
||||
[externalId]="complianceHideClientData ? maskValue(clientViewData.externalId) : clientViewData.externalId"
|
||||
[completed]="true" [hideCopy]="complianceHideClientData"></mifosx-external-identifier>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
<!-- Details Grid -->
|
||||
<mat-card-subtitle>
|
||||
<div class="cv-details-grid">
|
||||
<div class="cv-detail">
|
||||
<span class="cv-dl">{{ 'labels.inputs.Office' | translate }}</span>
|
||||
<span class="cv-dv">{{ clientViewData.officeName }}</span>
|
||||
</div>
|
||||
<div class="cv-detail">
|
||||
<span class="cv-dl">{{ 'labels.inputs.Staff' | translate }}</span>
|
||||
<span class="cv-dv">{{ clientViewData.staffName || ('labels.inputs.Unassigned' | translate) }}</span>
|
||||
</div>
|
||||
@if (clientViewData.activationDate) {
|
||||
<div class="cv-detail">
|
||||
<span class="cv-dl">{{ 'labels.inputs.Activation Date' | translate }}</span>
|
||||
<span class="cv-dv">{{ clientViewData.activationDate | dateFormat }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (clientViewData.clientType) {
|
||||
<div class="cv-detail">
|
||||
<span class="cv-dl">{{ 'labels.inputs.Client Type' | translate }}</span>
|
||||
<span class="cv-dv">{{ clientViewData.clientType.name }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (clientViewData.clientClassification) {
|
||||
<div class="cv-detail">
|
||||
<span class="cv-dl">{{ 'labels.inputs.Client Classification' | translate }}</span>
|
||||
<span class="cv-dv">{{ clientViewData.clientClassification.name }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (clientViewData.mobileNo) {
|
||||
<div class="cv-detail">
|
||||
<span class="cv-dl">{{ 'labels.inputs.Mobile Number' | translate }}</span>
|
||||
<span class="cv-dv">
|
||||
<mifosx-external-identifier
|
||||
[externalId]="complianceHideClientData ? maskValue(clientViewData.mobileNo) : clientViewData.mobileNo"
|
||||
[completed]="true" [hideCopy]="complianceHideClientData"></mifosx-external-identifier>
|
||||
</span>
|
||||
</div>
|
||||
}
|
||||
@if (clientViewData.emailAddress) {
|
||||
<div class="cv-detail">
|
||||
<span class="cv-dl">{{ 'labels.inputs.Email' | translate }}</span>
|
||||
<span class="cv-dv">
|
||||
<mifosx-external-identifier
|
||||
[externalId]="complianceHideClientData ? maskEmail(clientViewData.emailAddress) : clientViewData.emailAddress"
|
||||
[completed]="true" [hideCopy]="complianceHideClientData"></mifosx-external-identifier>
|
||||
</span>
|
||||
</div>
|
||||
}
|
||||
@if (clientViewData.occupationCategory) {
|
||||
<div class="cv-detail">
|
||||
<span class="cv-dl">{{ 'labels.inputs.Occupation Category' | translate }}</span>
|
||||
<span class="cv-dv">{{ clientViewData.occupationCategory.name }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (clientViewData.occupation) {
|
||||
<div class="cv-detail">
|
||||
<span class="cv-dl">{{ 'labels.inputs.Occupation' | translate }}</span>
|
||||
<span class="cv-dv">{{ clientViewData.occupation.name }}</span>
|
||||
</div>
|
||||
}
|
||||
@if (clientViewData.groups?.length > 0) {
|
||||
<div class="cv-detail">
|
||||
<span class="cv-dl">{{ 'labels.inputs.Member Of' | translate }}</span>
|
||||
<span class="cv-dv">
|
||||
@for (group of clientViewData.groups; track group) {
|
||||
<span>{{ group.name }} </span>
|
||||
}
|
||||
</span>
|
||||
</div>
|
||||
}
|
||||
</span>
|
||||
</div>
|
||||
</mat-card-subtitle>
|
||||
}
|
||||
</div>
|
||||
|
||||
<!-- Details Grid -->
|
||||
<div class="cv-grid">
|
||||
<div class="cv-cell">
|
||||
<div class="cv-cell__label">{{ 'labels.inputs.Office' | translate }}</div>
|
||||
<div class="cv-cell__value">{{ clientViewData.officeName }}</div>
|
||||
</div>
|
||||
<div class="cv-cell">
|
||||
<div class="cv-cell__label">{{ 'labels.inputs.Staff' | translate }}</div>
|
||||
<div class="cv-cell__value">{{ clientViewData.staffName || ('labels.inputs.Unassigned' | translate) }}</div>
|
||||
</div>
|
||||
@if (clientViewData.activationDate) {
|
||||
<div class="cv-cell">
|
||||
<div class="cv-cell__label">{{ 'labels.inputs.Activation Date' | translate }}</div>
|
||||
<div class="cv-cell__value">{{ clientViewData.activationDate | dateFormat }}</div>
|
||||
</div>
|
||||
}
|
||||
@if (clientViewData.clientType) {
|
||||
<div class="cv-cell">
|
||||
<div class="cv-cell__label">{{ 'labels.inputs.Client Type' | translate }}</div>
|
||||
<div class="cv-cell__value">{{ clientViewData.clientType.name }}</div>
|
||||
</div>
|
||||
}
|
||||
@if (clientViewData.clientClassification) {
|
||||
<div class="cv-cell">
|
||||
<div class="cv-cell__label">{{ 'labels.inputs.Client Classification' | translate }}</div>
|
||||
<div class="cv-cell__value">{{ clientViewData.clientClassification.name }}</div>
|
||||
</div>
|
||||
}
|
||||
@if (clientViewData.mobileNo) {
|
||||
<div class="cv-cell">
|
||||
<div class="cv-cell__label">{{ 'labels.inputs.Mobile Number' | translate }}</div>
|
||||
<div class="cv-cell__value">
|
||||
<mifosx-external-identifier
|
||||
[externalId]="complianceHideClientData ? maskValue(clientViewData.mobileNo) : clientViewData.mobileNo"
|
||||
[completed]="true" [hideCopy]="complianceHideClientData"></mifosx-external-identifier>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
@if (clientViewData.emailAddress) {
|
||||
<div class="cv-cell">
|
||||
<div class="cv-cell__label">{{ 'labels.inputs.Email' | translate }}</div>
|
||||
<div class="cv-cell__value">
|
||||
<mifosx-external-identifier
|
||||
[externalId]="complianceHideClientData ? maskEmail(clientViewData.emailAddress) : clientViewData.emailAddress"
|
||||
[completed]="true" [hideCopy]="complianceHideClientData"></mifosx-external-identifier>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
@if (clientViewData.occupationCategory) {
|
||||
<div class="cv-cell">
|
||||
<div class="cv-cell__label">{{ 'labels.inputs.Occupation Category' | translate }}</div>
|
||||
<div class="cv-cell__value">{{ clientViewData.occupationCategory.name }}</div>
|
||||
</div>
|
||||
}
|
||||
@if (clientViewData.occupation) {
|
||||
<div class="cv-cell">
|
||||
<div class="cv-cell__label">{{ 'labels.inputs.Occupation' | translate }}</div>
|
||||
<div class="cv-cell__value">{{ clientViewData.occupation.name }}</div>
|
||||
</div>
|
||||
}
|
||||
@if (clientViewData.groups?.length > 0) {
|
||||
<div class="cv-cell">
|
||||
<div class="cv-cell__label">{{ 'labels.inputs.Member Of' | translate }}</div>
|
||||
<div class="cv-cell__value">
|
||||
@for (group of clientViewData.groups; track group) {
|
||||
<span>{{ group.name }} </span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<mat-menu #clientMenu="matMenu">
|
||||
<button mat-menu-item [routerLink]="['edit']" *mifosxHasPermission="'UPDATE_CLIENT'">
|
||||
<mat-icon matListIcon>
|
||||
@@ -362,10 +355,9 @@
|
||||
</span>
|
||||
}
|
||||
</mat-menu>
|
||||
</mat-card-title-group>
|
||||
</mat-card-header>
|
||||
</mat-menu>
|
||||
|
||||
<mat-card-content>
|
||||
<div>
|
||||
<nav mat-tab-nav-bar class="navigation-tabs" [tabPanel]="tabPanel">
|
||||
<a
|
||||
mat-tab-link
|
||||
@@ -464,5 +456,5 @@
|
||||
<mat-tab-nav-panel #tabPanel>
|
||||
<router-outlet></router-outlet>
|
||||
</mat-tab-nav-panel>
|
||||
</mat-card-content>
|
||||
</mat-card>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -6,145 +6,286 @@
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
.account-card {
|
||||
.header {
|
||||
.profile-image-container {
|
||||
.client-image-button {
|
||||
min-width: 26px;
|
||||
padding: 0 6px;
|
||||
margin: 4px;
|
||||
line-height: 25px;
|
||||
}
|
||||
$dark-1: #0f1923;
|
||||
$dark-2: #162231;
|
||||
$dark-3: #1c2d3f;
|
||||
$accent: #38bdf8;
|
||||
$accent-dim: rgba(56, 189, 248, 0.15);
|
||||
$green: #34d399;
|
||||
$green-dim: rgba(52, 211, 153, 0.15);
|
||||
$red: #f87171;
|
||||
$red-dim: rgba(248, 113, 113, 0.15);
|
||||
$amber: #fbbf24;
|
||||
$white: #fff;
|
||||
$white-70: rgba(255, 255, 255, 0.7);
|
||||
$white-50: rgba(255, 255, 255, 0.5);
|
||||
$white-30: rgba(255, 255, 255, 0.3);
|
||||
$white-15: rgba(255, 255, 255, 0.15);
|
||||
$white-08: rgba(255, 255, 255, 0.08);
|
||||
|
||||
.signature {
|
||||
color: white;
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
padding: 2%;
|
||||
// Main card
|
||||
.cv-card {
|
||||
background: linear-gradient(135deg, $dark-1 0%, $dark-2 50%, $dark-3 100%);
|
||||
border-radius: 12px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.25);
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
// Top section
|
||||
.cv-top {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 20px;
|
||||
padding: 20px 24px 16px;
|
||||
}
|
||||
|
||||
// Avatar column
|
||||
.cv-avatar {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
flex-shrink: 0;
|
||||
|
||||
&__img {
|
||||
width: 72px;
|
||||
height: 72px;
|
||||
border-radius: 12px;
|
||||
object-fit: cover;
|
||||
border: 2px solid $white-15;
|
||||
}
|
||||
|
||||
&__actions {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
&__btn {
|
||||
width: 28px !important;
|
||||
height: 28px !important;
|
||||
min-width: 28px !important;
|
||||
padding: 0 !important;
|
||||
border-radius: 6px !important;
|
||||
background: $white-08 !important;
|
||||
color: $white-50 !important;
|
||||
border: 1px solid $white-15 !important;
|
||||
display: flex !important;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
transition: all 0.15s ease;
|
||||
|
||||
i {
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: $white-15 !important;
|
||||
color: $white !important;
|
||||
}
|
||||
|
||||
&--danger:hover {
|
||||
background: $red-dim !important;
|
||||
color: $red !important;
|
||||
border-color: rgba($red, 0.3) !important;
|
||||
}
|
||||
}
|
||||
|
||||
&__sig {
|
||||
font-size: 10px;
|
||||
color: $accent;
|
||||
cursor: pointer;
|
||||
font-weight: 500;
|
||||
|
||||
&:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.mat-card-title-group {
|
||||
width: 100%;
|
||||
// Info column
|
||||
.cv-info {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
/* ── Title Row ── */
|
||||
.cv-title-row {
|
||||
// Name row
|
||||
.cv-name-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.cv-name-block {
|
||||
.cv-name {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
gap: 10px;
|
||||
|
||||
i.fa-stop {
|
||||
font-size: 12px;
|
||||
&__dot {
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
&__text {
|
||||
font-size: 20px;
|
||||
font-weight: 700;
|
||||
color: $white;
|
||||
letter-spacing: -0.3px;
|
||||
}
|
||||
|
||||
&__status {
|
||||
font-size: 9px;
|
||||
font-weight: 700;
|
||||
padding: 3px 10px;
|
||||
border-radius: 10px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
background: $green-dim;
|
||||
color: $green;
|
||||
border: 1px solid rgba($green, 0.2);
|
||||
}
|
||||
}
|
||||
|
||||
.cv-status-chip {
|
||||
font-size: 10px;
|
||||
font-weight: 700;
|
||||
padding: 2px 10px;
|
||||
border-radius: 12px;
|
||||
letter-spacing: 0.4px;
|
||||
text-transform: uppercase;
|
||||
background: rgba(255, 255, 255, 0.15);
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
.cv-menu-btn {
|
||||
color: $white-50 !important;
|
||||
width: 36px !important;
|
||||
height: 36px !important;
|
||||
border: 1px solid $white-15;
|
||||
border-radius: 8px !important;
|
||||
|
||||
&:hover {
|
||||
background: $white-08;
|
||||
color: $white !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* ── ID Chips Row ── */
|
||||
.cv-id-row {
|
||||
// ID chips
|
||||
.cv-ids {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
gap: 8px;
|
||||
margin-bottom: 14px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.cv-id-chip {
|
||||
.cv-id {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
padding: 4px 12px;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
border: 1px solid rgba(255, 255, 255, 0.15);
|
||||
border-radius: 5px;
|
||||
color: #fff;
|
||||
font-size: 12px;
|
||||
gap: 8px;
|
||||
padding: 5px 12px;
|
||||
background: $white-08;
|
||||
border: 1px solid $white-15;
|
||||
border-radius: 6px;
|
||||
|
||||
&__label {
|
||||
font-size: 9px;
|
||||
font-weight: 700;
|
||||
color: $white-30;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
&__val {
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
color: $white;
|
||||
font-family: 'SF Mono', 'Cascadia Code', 'Consolas', monospace;
|
||||
letter-spacing: 0.3px;
|
||||
}
|
||||
}
|
||||
|
||||
.cv-id-label {
|
||||
font-size: 10px;
|
||||
font-weight: 600;
|
||||
color: rgba(255, 255, 255, 0.55);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.4px;
|
||||
}
|
||||
|
||||
/* ── Details Grid ── */
|
||||
.cv-details-grid {
|
||||
// Details grid
|
||||
.cv-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 6px 16px;
|
||||
gap: 0;
|
||||
background: $white-08;
|
||||
border-radius: 8px;
|
||||
border: 1px solid $white-15;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.cv-detail {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1px;
|
||||
padding: 4px 0;
|
||||
}
|
||||
.cv-cell {
|
||||
padding: 8px 12px;
|
||||
border-bottom: 1px solid $white-08;
|
||||
border-right: 1px solid $white-08;
|
||||
|
||||
.cv-dl {
|
||||
font-size: 10px;
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
font-weight: 500;
|
||||
}
|
||||
&:nth-child(4n) {
|
||||
border-right: none;
|
||||
}
|
||||
|
||||
.cv-dv {
|
||||
font-size: 13px;
|
||||
color: rgba(255, 255, 255, 0.95);
|
||||
font-weight: 500;
|
||||
&__label {
|
||||
font-size: 9px;
|
||||
font-weight: 600;
|
||||
color: $white-30;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
&__value {
|
||||
font-size: 12.5px;
|
||||
font-weight: 500;
|
||||
color: $white;
|
||||
line-height: 1.3;
|
||||
}
|
||||
}
|
||||
|
||||
// Actions menu
|
||||
.actions-menu {
|
||||
color: #fff !important;
|
||||
color: $white !important;
|
||||
}
|
||||
|
||||
/* ── Responsive ── */
|
||||
// Responsive
|
||||
@media (max-width: 1024px) {
|
||||
.cv-details-grid {
|
||||
.cv-grid {
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
}
|
||||
|
||||
.cv-cell:nth-child(4n) {
|
||||
border-right: 1px solid $white-08;
|
||||
}
|
||||
|
||||
.cv-cell:nth-child(3n) {
|
||||
border-right: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.cv-details-grid {
|
||||
.cv-top {
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.cv-name-row {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.cv-ids {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.cv-grid {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
|
||||
.cv-id-row {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
.cv-cell:nth-child(3n) {
|
||||
border-right: 1px solid $white-08;
|
||||
}
|
||||
|
||||
.cv-cell:nth-child(2n) {
|
||||
border-right: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.cv-details-grid {
|
||||
.cv-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.cv-cell {
|
||||
border-right: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
+6
-6
@@ -89,13 +89,13 @@ $white: #fff;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
&--cols-2 {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 4px 16px;
|
||||
align-items: start;
|
||||
}
|
||||
.fd-grid.fd-grid--cols-2 {
|
||||
display: grid !important;
|
||||
grid-template-columns: repeat(2, 1fr) !important;
|
||||
gap: 4px 16px;
|
||||
align-items: start;
|
||||
}
|
||||
|
||||
.fd-field {
|
||||
|
||||
@@ -87,12 +87,12 @@ $white: #fff;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
&--cols-2 {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 4px 16px;
|
||||
}
|
||||
.fd-grid.fd-grid--cols-2 {
|
||||
display: grid !important;
|
||||
grid-template-columns: repeat(2, 1fr) !important;
|
||||
gap: 4px 16px;
|
||||
|
||||
&--cols-3 {
|
||||
display: grid;
|
||||
|
||||
Reference in New Issue
Block a user