@7365admin1/layer-common 3.2.2-staging.89 → 3.2.2-staging.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div
|
|
3
|
-
class="d-flex flex-column align-center justify-center text-center
|
|
3
|
+
class="d-flex flex-column align-center justify-center text-center dashboard-empty"
|
|
4
4
|
:style="{ minHeight: compact ? '72px' : '140px', gap: '8px' }"
|
|
5
5
|
>
|
|
6
6
|
<v-icon icon="mdi-database-search-outline" size="28" />
|
|
@@ -16,3 +16,13 @@ defineProps({
|
|
|
16
16
|
},
|
|
17
17
|
});
|
|
18
18
|
</script>
|
|
19
|
+
|
|
20
|
+
<style scoped>
|
|
21
|
+
/* Was `text-blue-grey-lighten-1`, a fixed Vuetify grey that measured 2.4:1 in
|
|
22
|
+
LIGHT mode - the empty state was the hardest thing on the page to read. The
|
|
23
|
+
muted token is the design's own and follows the theme. */
|
|
24
|
+
.dashboard-empty {
|
|
25
|
+
font-family: var(--font-sans);
|
|
26
|
+
color: var(--muted);
|
|
27
|
+
}
|
|
28
|
+
</style>
|
|
@@ -207,7 +207,7 @@
|
|
|
207
207
|
class="d-flex flex-column flex-md-row align-md-start justify-space-between ga-5 mb-6"
|
|
208
208
|
>
|
|
209
209
|
<div>
|
|
210
|
-
<h1 class="
|
|
210
|
+
<h1 class="dashboard-title mb-0">
|
|
211
211
|
{{ dashboardTitle }}
|
|
212
212
|
</h1>
|
|
213
213
|
<div class="d-flex align-center text-medium-emphasis ga-1 mt-2 text-caption">
|
|
@@ -300,9 +300,7 @@
|
|
|
300
300
|
>
|
|
301
301
|
<v-card
|
|
302
302
|
flat
|
|
303
|
-
|
|
304
|
-
rounded="lg"
|
|
305
|
-
class="pa-4 flex-grow-1"
|
|
303
|
+
class="dashboard-card dashboard-kpi-card pa-4 flex-grow-1"
|
|
306
304
|
style="min-height: 158px"
|
|
307
305
|
>
|
|
308
306
|
<div class="d-flex align-start justify-space-between">
|
|
@@ -360,9 +358,7 @@
|
|
|
360
358
|
</div>
|
|
361
359
|
|
|
362
360
|
<div class="mt-6 w-100">
|
|
363
|
-
<p
|
|
364
|
-
class="text-caption font-weight-black text-uppercase text-medium-emphasis mb-3"
|
|
365
|
-
>
|
|
361
|
+
<p class="dashboard-kpi-label mb-3">
|
|
366
362
|
{{ card.title }}
|
|
367
363
|
</p>
|
|
368
364
|
<template
|
|
@@ -383,7 +379,7 @@
|
|
|
383
379
|
</template>
|
|
384
380
|
<template v-else>
|
|
385
381
|
<div class="d-flex align-center mb-3" style="min-height: 31px">
|
|
386
|
-
<span class="
|
|
382
|
+
<span class="dashboard-kpi-value">
|
|
387
383
|
{{ card.value }}
|
|
388
384
|
</span>
|
|
389
385
|
</div>
|
|
@@ -419,12 +415,10 @@
|
|
|
419
415
|
<v-card
|
|
420
416
|
v-if="isWidgetVisible('activity')"
|
|
421
417
|
flat
|
|
422
|
-
|
|
423
|
-
rounded="lg"
|
|
424
|
-
class="px-5 pt-4 pb-3 mt-3"
|
|
418
|
+
class="dashboard-card px-5 pt-4 pb-3 mt-3"
|
|
425
419
|
>
|
|
426
420
|
<div class="d-flex align-center justify-space-between">
|
|
427
|
-
<h2 class="
|
|
421
|
+
<h2 class="dashboard-card-title mb-0">
|
|
428
422
|
{{ activityTitle }}
|
|
429
423
|
</h2>
|
|
430
424
|
</div>
|
|
@@ -556,9 +550,7 @@
|
|
|
556
550
|
v-for="item in taskScheduleItems"
|
|
557
551
|
:key="item.id"
|
|
558
552
|
flat
|
|
559
|
-
|
|
560
|
-
rounded="lg"
|
|
561
|
-
class="pa-3"
|
|
553
|
+
class="dashboard-row-card pa-3"
|
|
562
554
|
>
|
|
563
555
|
<div class="d-flex align-center flex-wrap ga-3">
|
|
564
556
|
<div class="flex-grow-1" style="min-width: 0">
|
|
@@ -622,9 +614,7 @@
|
|
|
622
614
|
v-for="item in staffStatusItems"
|
|
623
615
|
:key="item.id"
|
|
624
616
|
flat
|
|
625
|
-
|
|
626
|
-
rounded="lg"
|
|
627
|
-
class="pa-3"
|
|
617
|
+
class="dashboard-row-card pa-3"
|
|
628
618
|
>
|
|
629
619
|
<div class="d-flex align-start ga-3">
|
|
630
620
|
<AvatarMain :name="item.name" :size="32" />
|
|
@@ -663,7 +653,7 @@
|
|
|
663
653
|
<div
|
|
664
654
|
v-for="item in feedbackItems"
|
|
665
655
|
:key="item.id"
|
|
666
|
-
class="d-flex align-center justify-space-between"
|
|
656
|
+
class="d-flex align-center justify-space-between dashboard-feedback-row"
|
|
667
657
|
style="
|
|
668
658
|
padding: 16px 20px;
|
|
669
659
|
border: 1px solid rgba(var(--v-border-color), var(--v-border-opacity));
|
|
@@ -1128,7 +1118,7 @@
|
|
|
1128
1118
|
<div
|
|
1129
1119
|
v-for="item in feedbackItems"
|
|
1130
1120
|
:key="item.id"
|
|
1131
|
-
class="d-flex align-center justify-space-between"
|
|
1121
|
+
class="d-flex align-center justify-space-between dashboard-feedback-row"
|
|
1132
1122
|
style="
|
|
1133
1123
|
padding: 16px 20px;
|
|
1134
1124
|
border: 1px solid rgba(var(--v-border-color), var(--v-border-opacity));
|
|
@@ -3250,31 +3240,37 @@ function getInitials(name?: string) {
|
|
|
3250
3240
|
function getStatusPillStyle(status: any) {
|
|
3251
3241
|
const tone = getStatusTone(status);
|
|
3252
3242
|
const map: Record<string, { backgroundColor: string; color: string }> = {
|
|
3253
|
-
success: { backgroundColor: "
|
|
3254
|
-
warning: { backgroundColor: "
|
|
3255
|
-
error: { backgroundColor: "
|
|
3256
|
-
neutral: { backgroundColor: "
|
|
3243
|
+
success: { backgroundColor: "var(--ok-bg)", color: "var(--ok)" },
|
|
3244
|
+
warning: { backgroundColor: "var(--warn-bg)", color: "var(--warn)" },
|
|
3245
|
+
error: { backgroundColor: "var(--err-bg)", color: "var(--err)" },
|
|
3246
|
+
neutral: { backgroundColor: "var(--hover)", color: "var(--text2)" },
|
|
3257
3247
|
};
|
|
3258
3248
|
return map[tone] || map.neutral;
|
|
3259
3249
|
}
|
|
3260
3250
|
|
|
3251
|
+
/**
|
|
3252
|
+
* The pills are drawn by inline style, so the literal colours lived here rather
|
|
3253
|
+
* than in the stylesheet - which is why they survived the dark-mode repair and
|
|
3254
|
+
* still measured 3.86:1. Same three cases, same words, the design's tones.
|
|
3255
|
+
*/
|
|
3261
3256
|
function getPatrolStatusStyle(status: any) {
|
|
3262
3257
|
const s = String(status || "").toLowerCase();
|
|
3263
3258
|
if (s === "completed" || s === "complete")
|
|
3264
|
-
return { backgroundColor: "
|
|
3259
|
+
return { backgroundColor: "var(--ok-bg)", color: "var(--ok)" };
|
|
3265
3260
|
if (s === "on paused" || s === "paused")
|
|
3266
|
-
return { backgroundColor: "
|
|
3267
|
-
return { backgroundColor: "
|
|
3261
|
+
return { backgroundColor: "var(--hover)", color: "var(--text2)" };
|
|
3262
|
+
return { backgroundColor: "var(--hover)", color: "var(--text2)" };
|
|
3268
3263
|
}
|
|
3269
3264
|
|
|
3270
3265
|
function getStaffStatusPillStyle(status: any) {
|
|
3271
3266
|
const s = String(status || "").toLowerCase();
|
|
3272
3267
|
if (s === "on duty" || s === "on-duty")
|
|
3273
|
-
return { backgroundColor: "
|
|
3268
|
+
return { backgroundColor: "var(--ok-bg)", color: "var(--ok)" };
|
|
3274
3269
|
if (s === "on break" || s === "on-break")
|
|
3275
|
-
return { backgroundColor: "
|
|
3276
|
-
if (s === "absent")
|
|
3277
|
-
|
|
3270
|
+
return { backgroundColor: "var(--warn-bg)", color: "var(--warn)" };
|
|
3271
|
+
if (s === "absent")
|
|
3272
|
+
return { backgroundColor: "var(--err-bg)", color: "var(--err)" };
|
|
3273
|
+
return { backgroundColor: "var(--hover)", color: "var(--text2)" };
|
|
3278
3274
|
}
|
|
3279
3275
|
|
|
3280
3276
|
function getStatusProgressStyle(item: { percent: number; color: string }) {
|
|
@@ -4154,37 +4150,98 @@ function formatDashboardTime(value?: string) {
|
|
|
4154
4150
|
text-transform: capitalize;
|
|
4155
4151
|
}
|
|
4156
4152
|
|
|
4153
|
+
/* Was five pairs of literal pastels - the same pale green on the dark page,
|
|
4154
|
+
and none of them the tones the rest of the product uses. */
|
|
4157
4155
|
.badge-success {
|
|
4158
|
-
background-color:
|
|
4159
|
-
color:
|
|
4156
|
+
background-color: var(--ok-bg);
|
|
4157
|
+
color: var(--ok);
|
|
4160
4158
|
}
|
|
4161
4159
|
|
|
4162
4160
|
.badge-info {
|
|
4163
|
-
background-color:
|
|
4164
|
-
color:
|
|
4161
|
+
background-color: var(--info-bg);
|
|
4162
|
+
color: var(--info);
|
|
4165
4163
|
}
|
|
4166
4164
|
|
|
4167
4165
|
.badge-danger,
|
|
4168
4166
|
.badge-error {
|
|
4169
|
-
background-color:
|
|
4170
|
-
color:
|
|
4167
|
+
background-color: var(--err-bg);
|
|
4168
|
+
color: var(--err);
|
|
4171
4169
|
}
|
|
4172
4170
|
|
|
4173
4171
|
.badge-warning {
|
|
4174
|
-
background-color:
|
|
4175
|
-
color:
|
|
4172
|
+
background-color: var(--warn-bg);
|
|
4173
|
+
color: var(--warn);
|
|
4176
4174
|
}
|
|
4177
4175
|
|
|
4178
4176
|
.badge-neutral {
|
|
4179
|
-
background-color:
|
|
4180
|
-
color:
|
|
4177
|
+
background-color: var(--hover);
|
|
4178
|
+
color: var(--text2);
|
|
4181
4179
|
}
|
|
4182
4180
|
|
|
4181
|
+
/* ------------------------------------------------------------------ */
|
|
4182
|
+
/* PHASE 5 - the design's card, type and semantic tones. */
|
|
4183
|
+
/* */
|
|
4184
|
+
/* The dark-mode repair earlier today moved these surfaces off literal */
|
|
4185
|
+
/* white onto the Vuetify theme; this keeps that and takes the last */
|
|
4186
|
+
/* step, onto the design tokens themselves - so the dashboard's cards, */
|
|
4187
|
+
/* headings and pills are the same 14px card, the same Manrope and the */
|
|
4188
|
+
/* same four status tones as every other screen. */
|
|
4189
|
+
/* ------------------------------------------------------------------ */
|
|
4190
|
+
|
|
4183
4191
|
.dashboard-card {
|
|
4184
|
-
background:
|
|
4185
|
-
border: 1px solid
|
|
4186
|
-
border-radius:
|
|
4187
|
-
box-shadow:
|
|
4192
|
+
background: var(--card);
|
|
4193
|
+
border: 1px solid var(--border);
|
|
4194
|
+
border-radius: var(--r-card);
|
|
4195
|
+
box-shadow: var(--shadow);
|
|
4196
|
+
font-family: var(--font-sans);
|
|
4197
|
+
}
|
|
4198
|
+
|
|
4199
|
+
/* The KPI tile and the rows inside a panel are the same card, one step in. */
|
|
4200
|
+
.dashboard-kpi-card,
|
|
4201
|
+
.dashboard-row-card {
|
|
4202
|
+
background: var(--card);
|
|
4203
|
+
border: 1px solid var(--border);
|
|
4204
|
+
border-radius: var(--r-card);
|
|
4205
|
+
box-shadow: var(--shadow);
|
|
4206
|
+
font-family: var(--font-sans);
|
|
4207
|
+
}
|
|
4208
|
+
|
|
4209
|
+
.dashboard-title {
|
|
4210
|
+
font-family: var(--font-sans);
|
|
4211
|
+
font-size: var(--fs-h1);
|
|
4212
|
+
font-weight: var(--fw-h1);
|
|
4213
|
+
letter-spacing: var(--ls-h1);
|
|
4214
|
+
color: var(--text);
|
|
4215
|
+
}
|
|
4216
|
+
|
|
4217
|
+
.dashboard-card-title {
|
|
4218
|
+
font-family: var(--font-sans);
|
|
4219
|
+
font-size: var(--fs-card-title);
|
|
4220
|
+
font-weight: var(--fw-card-title);
|
|
4221
|
+
letter-spacing: 0;
|
|
4222
|
+
color: var(--text);
|
|
4223
|
+
}
|
|
4224
|
+
|
|
4225
|
+
/* 11px/800 uppercase over a 30px/800 number, tabular so the columns of
|
|
4226
|
+
figures line up - the design's KPI, and the same header type the table
|
|
4227
|
+
card already uses. */
|
|
4228
|
+
.dashboard-kpi-label {
|
|
4229
|
+
font-family: var(--font-sans);
|
|
4230
|
+
font-size: var(--fs-table-head);
|
|
4231
|
+
font-weight: var(--fw-table-head);
|
|
4232
|
+
letter-spacing: var(--ls-table-head);
|
|
4233
|
+
text-transform: uppercase;
|
|
4234
|
+
color: var(--muted);
|
|
4235
|
+
}
|
|
4236
|
+
|
|
4237
|
+
.dashboard-kpi-value {
|
|
4238
|
+
font-family: var(--font-sans);
|
|
4239
|
+
font-size: var(--fs-kpi);
|
|
4240
|
+
font-weight: var(--fw-kpi);
|
|
4241
|
+
letter-spacing: var(--ls-kpi);
|
|
4242
|
+
line-height: 1.1;
|
|
4243
|
+
color: var(--text);
|
|
4244
|
+
font-variant-numeric: tabular-nums;
|
|
4188
4245
|
}
|
|
4189
4246
|
|
|
4190
4247
|
.dashboard-section-grid {
|
|
@@ -4219,14 +4276,17 @@ function formatDashboardTime(value?: string) {
|
|
|
4219
4276
|
min-height: 18px;
|
|
4220
4277
|
}
|
|
4221
4278
|
|
|
4279
|
+
/* The panel heading is the design's card title: 15.5px/800, sentence case. It
|
|
4280
|
+
was a 12px/900 uppercase label from the earlier Figma. */
|
|
4222
4281
|
.figma-panel-header h2 {
|
|
4223
|
-
color:
|
|
4224
|
-
font-
|
|
4225
|
-
font-
|
|
4282
|
+
color: var(--text);
|
|
4283
|
+
font-family: var(--font-sans);
|
|
4284
|
+
font-size: var(--fs-card-title);
|
|
4285
|
+
font-weight: var(--fw-card-title);
|
|
4226
4286
|
letter-spacing: 0;
|
|
4227
4287
|
line-height: 1.2;
|
|
4228
4288
|
margin: 0;
|
|
4229
|
-
text-transform:
|
|
4289
|
+
text-transform: none;
|
|
4230
4290
|
}
|
|
4231
4291
|
|
|
4232
4292
|
.figma-panel-action,
|
|
@@ -4373,30 +4433,30 @@ function formatDashboardTime(value?: string) {
|
|
|
4373
4433
|
|
|
4374
4434
|
.figma-event-dot-info,
|
|
4375
4435
|
.figma-event-dot-neutral {
|
|
4376
|
-
background:
|
|
4377
|
-
border: 2px solid
|
|
4436
|
+
background: var(--info-bg);
|
|
4437
|
+
border: 2px solid var(--info);
|
|
4378
4438
|
}
|
|
4379
4439
|
|
|
4380
4440
|
.figma-event-dot-success {
|
|
4381
|
-
background:
|
|
4382
|
-
border: 2px solid
|
|
4441
|
+
background: var(--ok-bg);
|
|
4442
|
+
border: 2px solid var(--ok);
|
|
4383
4443
|
}
|
|
4384
4444
|
|
|
4385
4445
|
.figma-event-dot-danger {
|
|
4386
|
-
background:
|
|
4387
|
-
border: 2px solid
|
|
4446
|
+
background: var(--err-bg);
|
|
4447
|
+
border: 2px solid var(--err);
|
|
4388
4448
|
}
|
|
4389
4449
|
|
|
4390
4450
|
.figma-event-dot-warning {
|
|
4391
|
-
background:
|
|
4392
|
-
border: 2px solid
|
|
4451
|
+
background: var(--warn-bg);
|
|
4452
|
+
border: 2px solid var(--warn);
|
|
4393
4453
|
}
|
|
4394
4454
|
|
|
4395
4455
|
.active-patrol-row {
|
|
4396
4456
|
align-items: center;
|
|
4397
|
-
background-color:
|
|
4398
|
-
border: 1px solid
|
|
4399
|
-
border-radius:
|
|
4457
|
+
background-color: var(--card);
|
|
4458
|
+
border: 1px solid var(--border);
|
|
4459
|
+
border-radius: var(--r-inner-lg);
|
|
4400
4460
|
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.02);
|
|
4401
4461
|
display: grid;
|
|
4402
4462
|
gap: 10px;
|
|
@@ -4449,6 +4509,21 @@ function formatDashboardTime(value?: string) {
|
|
|
4449
4509
|
padding: 2px 8px 2px 3px;
|
|
4450
4510
|
}
|
|
4451
4511
|
|
|
4512
|
+
/**
|
|
4513
|
+
* Carried from Phase 1: `AvatarMain` colours each person from their NAME, and
|
|
4514
|
+
* writes WHITE initials on whatever tint it picks - 2.34:1 on this dashboard.
|
|
4515
|
+
* That is right in a members list, where the colour tells two people apart,
|
|
4516
|
+
* and wrong on a dashboard, where the same face appears in four panels.
|
|
4517
|
+
*
|
|
4518
|
+
* The component is left alone - Phase 2 took exactly this route for the top
|
|
4519
|
+
* bar's own avatar - and the dashboard paints every avatar it draws with the
|
|
4520
|
+
* design's accent pair instead. One rule, all seven call sites.
|
|
4521
|
+
*/
|
|
4522
|
+
.unified-dashboard :deep(.v-avatar) {
|
|
4523
|
+
background: var(--accent-soft) !important;
|
|
4524
|
+
color: var(--accent-text) !important;
|
|
4525
|
+
}
|
|
4526
|
+
|
|
4452
4527
|
.active-patrol-assignee span {
|
|
4453
4528
|
color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity));
|
|
4454
4529
|
font-size: 11px;
|
|
@@ -4503,11 +4578,11 @@ function formatDashboardTime(value?: string) {
|
|
|
4503
4578
|
}
|
|
4504
4579
|
|
|
4505
4580
|
.active-patrol-tooltip::after {
|
|
4506
|
-
background:
|
|
4507
|
-
border-radius:
|
|
4581
|
+
background: var(--text);
|
|
4582
|
+
border-radius: var(--r-inner-sm);
|
|
4508
4583
|
bottom: calc(100% + 8px);
|
|
4509
|
-
box-shadow:
|
|
4510
|
-
color:
|
|
4584
|
+
box-shadow: var(--shadow-menu);
|
|
4585
|
+
color: var(--card);
|
|
4511
4586
|
content: attr(data-tooltip);
|
|
4512
4587
|
font-size: 11px;
|
|
4513
4588
|
font-weight: 600;
|
|
@@ -4537,6 +4612,28 @@ function formatDashboardTime(value?: string) {
|
|
|
4537
4612
|
}
|
|
4538
4613
|
}
|
|
4539
4614
|
|
|
4615
|
+
/**
|
|
4616
|
+
* Carried from Phase 1: the dashboard scrolled sideways at 360. This row is a
|
|
4617
|
+
* four-column grid whose last two columns are `max-content`, so on a phone the
|
|
4618
|
+
* assignee pill, the status pill and the action button cannot fit beside a
|
|
4619
|
+
* 120px title and the row pushes ~39px past the viewport.
|
|
4620
|
+
*
|
|
4621
|
+
* Below 600 the four columns become one. Nothing is hidden, dropped or
|
|
4622
|
+
* reordered - the same four blocks, stacked in the same order.
|
|
4623
|
+
*/
|
|
4624
|
+
@media (max-width: 599.98px) {
|
|
4625
|
+
.active-patrol-row {
|
|
4626
|
+
grid-template-columns: minmax(0, 1fr);
|
|
4627
|
+
}
|
|
4628
|
+
|
|
4629
|
+
.active-patrol-action,
|
|
4630
|
+
.active-patrol-statuses,
|
|
4631
|
+
.active-patrol-assignees {
|
|
4632
|
+
justify-self: start;
|
|
4633
|
+
text-align: left;
|
|
4634
|
+
}
|
|
4635
|
+
}
|
|
4636
|
+
|
|
4540
4637
|
.figma-icon-badge {
|
|
4541
4638
|
align-items: center;
|
|
4542
4639
|
border-radius: 50%;
|
|
@@ -4548,28 +4645,28 @@ function formatDashboardTime(value?: string) {
|
|
|
4548
4645
|
}
|
|
4549
4646
|
|
|
4550
4647
|
.figma-icon-badge-danger {
|
|
4551
|
-
background:
|
|
4552
|
-
color:
|
|
4648
|
+
background: var(--err-bg);
|
|
4649
|
+
color: var(--err);
|
|
4553
4650
|
}
|
|
4554
4651
|
|
|
4555
4652
|
.figma-icon-badge-info {
|
|
4556
|
-
background:
|
|
4557
|
-
color:
|
|
4653
|
+
background: var(--info-bg);
|
|
4654
|
+
color: var(--info);
|
|
4558
4655
|
}
|
|
4559
4656
|
|
|
4560
4657
|
.figma-icon-badge-success {
|
|
4561
|
-
background:
|
|
4562
|
-
color:
|
|
4658
|
+
background: var(--ok-bg);
|
|
4659
|
+
color: var(--ok);
|
|
4563
4660
|
}
|
|
4564
4661
|
|
|
4565
4662
|
.figma-icon-badge-warning {
|
|
4566
|
-
background:
|
|
4567
|
-
color:
|
|
4663
|
+
background: var(--warn-bg);
|
|
4664
|
+
color: var(--warn);
|
|
4568
4665
|
}
|
|
4569
4666
|
|
|
4570
4667
|
.figma-icon-badge-neutral {
|
|
4571
|
-
background:
|
|
4572
|
-
color:
|
|
4668
|
+
background: var(--hover);
|
|
4669
|
+
color: var(--text2);
|
|
4573
4670
|
}
|
|
4574
4671
|
|
|
4575
4672
|
.figma-status-stack {
|
|
@@ -4620,9 +4717,9 @@ function formatDashboardTime(value?: string) {
|
|
|
4620
4717
|
|
|
4621
4718
|
.feedback-row {
|
|
4622
4719
|
align-items: center;
|
|
4623
|
-
background:
|
|
4624
|
-
border: 1px solid
|
|
4625
|
-
border-radius:
|
|
4720
|
+
background: var(--card);
|
|
4721
|
+
border: 1px solid var(--border);
|
|
4722
|
+
border-radius: var(--r-inner-lg);
|
|
4626
4723
|
display: grid;
|
|
4627
4724
|
gap: 16px;
|
|
4628
4725
|
grid-template-columns: minmax(180px, 225px) minmax(130px, 175px) 100px auto;
|
|
@@ -4631,6 +4728,39 @@ function formatDashboardTime(value?: string) {
|
|
|
4631
4728
|
transition: border-color 0.16s ease, box-shadow 0.16s ease;
|
|
4632
4729
|
}
|
|
4633
4730
|
|
|
4731
|
+
/**
|
|
4732
|
+
* The property-mode feedback row is four flex children that each ask for at
|
|
4733
|
+
* least 140px, so on a 360px phone the status pill and the View button were
|
|
4734
|
+
* clipped by the card edge - visible, but cut in half. It wraps now, and below
|
|
4735
|
+
* 600 each block takes the full width: same four blocks, same order.
|
|
4736
|
+
*/
|
|
4737
|
+
.dashboard-feedback-row {
|
|
4738
|
+
flex-wrap: wrap;
|
|
4739
|
+
gap: 12px;
|
|
4740
|
+
}
|
|
4741
|
+
|
|
4742
|
+
@media (max-width: 599.98px) {
|
|
4743
|
+
.dashboard-feedback-row > div {
|
|
4744
|
+
flex: 1 1 100% !important;
|
|
4745
|
+
justify-content: flex-start !important;
|
|
4746
|
+
text-align: left !important;
|
|
4747
|
+
}
|
|
4748
|
+
}
|
|
4749
|
+
|
|
4750
|
+
/* Same story as the patrol row: four fixed-ish columns need ~600px, so on a
|
|
4751
|
+
phone the status pill and the View button were clipped by the card edge.
|
|
4752
|
+
One column below 600, same blocks, same order. */
|
|
4753
|
+
@media (max-width: 599.98px) {
|
|
4754
|
+
.feedback-row {
|
|
4755
|
+
grid-template-columns: minmax(0, 1fr);
|
|
4756
|
+
}
|
|
4757
|
+
|
|
4758
|
+
.feedback-status-pill,
|
|
4759
|
+
.feedback-action {
|
|
4760
|
+
justify-self: start;
|
|
4761
|
+
}
|
|
4762
|
+
}
|
|
4763
|
+
|
|
4634
4764
|
.feedback-row:hover {
|
|
4635
4765
|
border-color: rgba(var(--v-border-color), var(--v-border-opacity));
|
|
4636
4766
|
box-shadow: 0 6px 14px rgba(15, 44, 69, 0.04);
|
|
@@ -4675,11 +4805,13 @@ function formatDashboardTime(value?: string) {
|
|
|
4675
4805
|
white-space: nowrap;
|
|
4676
4806
|
}
|
|
4677
4807
|
|
|
4808
|
+
/* Carried from Phase 1: the initials measured 1.26:1 in dark mode, because the
|
|
4809
|
+
tint was a literal light blue whatever the theme. */
|
|
4678
4810
|
.feedback-avatar {
|
|
4679
4811
|
align-items: center;
|
|
4680
|
-
background:
|
|
4812
|
+
background: var(--accent-soft);
|
|
4681
4813
|
border-radius: 50%;
|
|
4682
|
-
color:
|
|
4814
|
+
color: var(--accent-text);
|
|
4683
4815
|
display: inline-flex;
|
|
4684
4816
|
flex-shrink: 0;
|
|
4685
4817
|
font-size: 11px;
|
|
@@ -4698,24 +4830,25 @@ function formatDashboardTime(value?: string) {
|
|
|
4698
4830
|
white-space: nowrap;
|
|
4699
4831
|
}
|
|
4700
4832
|
|
|
4833
|
+
/* The other two carried Phase 1 items: hard-coded chips. */
|
|
4701
4834
|
.feedback-status-pill-completed {
|
|
4702
|
-
background:
|
|
4703
|
-
color:
|
|
4835
|
+
background: var(--ok-bg);
|
|
4836
|
+
color: var(--ok);
|
|
4704
4837
|
}
|
|
4705
4838
|
|
|
4706
4839
|
.feedback-status-pill-progress {
|
|
4707
|
-
background:
|
|
4708
|
-
color:
|
|
4840
|
+
background: var(--warn-bg);
|
|
4841
|
+
color: var(--warn);
|
|
4709
4842
|
}
|
|
4710
4843
|
|
|
4711
4844
|
.feedback-status-pill-danger {
|
|
4712
|
-
background:
|
|
4713
|
-
color:
|
|
4845
|
+
background: var(--err-bg);
|
|
4846
|
+
color: var(--err);
|
|
4714
4847
|
}
|
|
4715
4848
|
|
|
4716
4849
|
.feedback-status-pill-todo {
|
|
4717
|
-
background:
|
|
4718
|
-
color:
|
|
4850
|
+
background: var(--hover);
|
|
4851
|
+
color: var(--text2);
|
|
4719
4852
|
}
|
|
4720
4853
|
|
|
4721
4854
|
.feedback-view-button {
|