@7365admin1/layer-common 3.2.2-staging.111 → 3.2.2-staging.112

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.
@@ -242,6 +242,76 @@
242
242
  font-size: var(--fs-cell);
243
243
  }
244
244
 
245
+ /**
246
+ * ...and the same size again, because inside a real dialog the rule above
247
+ * never reached the glass. Vuetify scopes
248
+ *
249
+ * .v-dialog > .v-overlay__content > .v-card > .v-card-text { font-size: inherit }
250
+ *
251
+ * which is a FOUR-class chain against our one, so a `.screen-modal__body` in a
252
+ * `v-dialog` inherited the root 16px instead of the design's 13.5px --fs-cell.
253
+ * Measured on `AccessCardDeleteDialog`: 16px/400 where --fs-cell is 13.5px.
254
+ * It is invisible in a harness that mounts the card WITHOUT its dialog, which
255
+ * is how it survived. Naming the same chain plus the card's own class wins it
256
+ * back on specificity alone - no `!important`, same technique as the button
257
+ * height fix.
258
+ */
259
+ .v-dialog > .v-overlay__content > .v-card.screen-modal > .screen-modal__body {
260
+ font-size: var(--fs-cell);
261
+ }
262
+
263
+ /**
264
+ * The design's modal footer, literal from the prototype's Create Role dialog:
265
+ *
266
+ * <div style="display:flex;gap:10px;padding:16px 22px;
267
+ * border-top:1px solid var(--border)">
268
+ * <button style="flex:1; ...ghost">Cancel</button>
269
+ * <button style="flex:1; ...primary">Submit</button>
270
+ *
271
+ * Two EQUAL-WIDTH buttons on a bordered strip, ghost first. Stated once
272
+ * because the product opens confirm dialogs from a couple of dozen components
273
+ * and each of them was drawing its own footer by hand.
274
+ */
275
+ .screen-modal__footer {
276
+ display: flex;
277
+ gap: 10px;
278
+ padding: 16px 22px;
279
+ border-top: 1px solid var(--border);
280
+ }
281
+
282
+ .screen-modal__footer > .v-btn,
283
+ .screen-modal__footer > .app-btn {
284
+ flex: 1;
285
+ }
286
+
287
+ /**
288
+ * The modal's close control, literal from the same Create Role dialog:
289
+ *
290
+ * <button style="display:flex;align-items:center;justify-content:center;
291
+ * width:32px;height:32px;border:none;border-radius:8px;
292
+ * background:transparent;color:var(--muted);"
293
+ * style-hover="background:var(--hover)">close</button>
294
+ *
295
+ * Borderless and 32px square - NOT `.screen-icon-btn`, which is the bordered
296
+ * 40px square the design draws in a toolbar. The glyph is 19px.
297
+ */
298
+ .screen-modal__close {
299
+ width: 32px;
300
+ height: 32px;
301
+ min-width: 32px;
302
+ border-radius: 8px;
303
+ background: transparent;
304
+ color: var(--muted);
305
+ }
306
+
307
+ .screen-modal__close:hover {
308
+ background: var(--hover);
309
+ }
310
+
311
+ .screen-modal__close .v-icon {
312
+ font-size: 19px;
313
+ }
314
+
245
315
  /**
246
316
  * The design's two buttons, for the dialogs and toolbars that draw their own.
247
317
  *
@@ -1,20 +1,28 @@
1
1
  <template>
2
- <v-dialog :model-value="modelValue" width="450" persistent>
3
- <v-card width="100%">
4
- <v-toolbar density="compact" class="pl-4">
5
- <span class="font-weight-medium text-h5">Delete Card</span>
6
- </v-toolbar>
2
+ <!-- 520px is the handoff's `--modal-w`; the card wears `.screen-modal` for
3
+ the 16px corner, the `--card` surface and the modal shadow. The two
4
+ `v-toolbar`s it used for the title row and the footer were grey slabs
5
+ that stay grey on the dark theme - a `v-card-title` and the shared
6
+ `.screen-modal__footer` are the same rows on the card's own surface. -->
7
+ <v-dialog :model-value="modelValue" width="520" persistent>
8
+ <v-card class="screen-modal" width="100%">
9
+ <v-card-title>Delete Card</v-card-title>
7
10
 
8
- <v-card-text>
9
- <p class="text-subtitle-2 text-center mb-4">
11
+ <v-card-text class="screen-modal__body">
12
+ <p class="text-center mb-4">
10
13
  Are you sure you want to delete this card? This action cannot be
11
14
  undone.
12
15
  </p>
13
16
 
14
17
  <v-form v-model="validForm" :disabled="loading">
15
18
  <InputLabel class="text-capitalize font-weight-bold" title="Remarks" required />
19
+ <!-- Still a `v-textarea`, not an `AppField`: Delete Card is gated on
20
+ `validForm`, which only exists because this `:rules` runs.
21
+ `.filter-field` gives it the design's 10px corner and 13.5px
22
+ type without taking the validation away. -->
16
23
  <v-textarea
17
24
  v-model="remarks"
25
+ class="filter-field"
18
26
  placeholder="Enter remarks..."
19
27
  persistent-placeholder
20
28
  rows="3"
@@ -29,38 +37,32 @@
29
37
  </v-row>
30
38
  </v-card-text>
31
39
 
32
- <v-toolbar density="compact">
33
- <v-row no-gutters>
34
- <v-col cols="6">
35
- <v-btn
36
- tile
37
- block
38
- size="48"
39
- variant="text"
40
- class="text-none"
41
- :disabled="loading"
42
- @click="handleClose"
43
- >
44
- Close
45
- </v-btn>
46
- </v-col>
47
- <v-col cols="6">
48
- <v-btn
49
- tile
50
- block
51
- size="48"
52
- color="black"
53
- variant="flat"
54
- class="text-none"
55
- :loading="loading"
56
- :disabled="!validForm || loading"
57
- @click="handleConfirm"
58
- >
59
- Delete Card
60
- </v-btn>
61
- </v-col>
62
- </v-row>
63
- </v-toolbar>
40
+ <!-- The design's footer: two equal-width buttons, ghost then primary, on
41
+ a bordered strip. The confirming button was a hardcoded color="black"
42
+ fill - the same black on both themes. The handoff draws no
43
+ destructive button, so it takes the primary shape like every other
44
+ modal's confirm; the destructive-variant gap stays a design
45
+ decision. `loading` keeps it a v-btn: AppButton has no in-flight
46
+ state, and this is the only signal the delete is running. -->
47
+ <div class="screen-modal__footer">
48
+ <v-btn
49
+ variant="outlined"
50
+ class="screen-btn-ghost"
51
+ :disabled="loading"
52
+ @click="handleClose"
53
+ >
54
+ Close
55
+ </v-btn>
56
+ <v-btn
57
+ variant="flat"
58
+ class="screen-btn-primary"
59
+ :loading="loading"
60
+ :disabled="!validForm || loading"
61
+ @click="handleConfirm"
62
+ >
63
+ Delete Card
64
+ </v-btn>
65
+ </div>
64
66
  </v-card>
65
67
  </v-dialog>
66
68
  </template>
@@ -4,16 +4,14 @@
4
4
  :max-width="attendance?.checkOut?.timestamp ? 900 : 500"
5
5
  persistent
6
6
  >
7
- <v-card>
8
- <v-toolbar>
9
- <v-row no-gutters class="fill-height px-6" align="center">
10
- <span class="font-weight-bold text-h6 text-capitalize"
11
- >Attendance Details</span
12
- >
13
- </v-row>
14
- </v-toolbar>
7
+ <!-- The card wears `.screen-modal` (16px corner, `--card`, the modal
8
+ shadow). The `v-toolbar` that stood in for the title row and the one
9
+ that stood in for the footer were both fixed grey slabs that stay grey
10
+ on the dark theme. -->
11
+ <v-card class="screen-modal">
12
+ <v-card-title class="text-capitalize">Attendance Details</v-card-title>
15
13
 
16
- <v-card-text class="pa-6">
14
+ <v-card-text class="screen-modal__body pa-6">
17
15
  <v-row v-if="attendance" dense>
18
16
  <v-col :cols="attendance.checkOut?.timestamp ? 6 : 12">
19
17
  <v-row dense>
@@ -21,14 +19,14 @@
21
19
  <InputLabel title="Check In" />
22
20
  </v-col>
23
21
  <v-col cols="12" class="mb-1">
24
- <span class="text-body-1">{{
22
+ <span class="att-dlg__time">{{
25
23
  attendance.checkIn?.timestamp
26
24
  ? formatDate(attendance.checkIn.timestamp)
27
25
  : "N/A"
28
26
  }}</span>
29
27
  </v-col>
30
28
  <v-col cols="12" class="mb-2">
31
- <span class="text-caption text-medium-emphasis">
29
+ <span class="screen-hint att-dlg__meta">
32
30
  {{
33
31
  attendance.checkIn?.location?.latitude &&
34
32
  attendance.checkIn?.location?.longitude
@@ -38,29 +36,21 @@
38
36
  </span>
39
37
  </v-col>
40
38
  <v-col cols="12">
41
- <v-card
42
- v-if="attendance.checkIn?.img"
43
- variant="outlined"
44
- class="pa-0"
45
- style="border: 1px solid rgba(0, 0, 0, 0.12)"
46
- >
39
+ <!-- Was an inline `border: 1px solid rgba(0,0,0,.12)` - a
40
+ literal black rule that is the same black on the dark
41
+ theme. `--border` is that rule in each theme, and the
42
+ frame takes the design's inner radius. -->
43
+ <div v-if="attendance.checkIn?.img" class="att-dlg__frame">
47
44
  <v-img
48
45
  :src="getFileUrl(attendance.checkIn.img)"
49
46
  height="280"
50
47
  width="100%"
51
48
  cover
52
49
  ></v-img>
53
- </v-card>
54
- <v-card
55
- v-else
56
- variant="outlined"
57
- class="pa-8 text-center"
58
- style="border: 1px solid rgba(0, 0, 0, 0.12); height: 280px"
59
- >
60
- <span class="text-caption text-medium-emphasis"
61
- >No image</span
62
- >
63
- </v-card>
50
+ </div>
51
+ <div class="att-dlg__frame att-dlg__frame--empty pa-8 text-center" v-else>
52
+ <span class="screen-hint att-dlg__meta">No image</span>
53
+ </div>
64
54
  </v-col>
65
55
  </v-row>
66
56
  </v-col>
@@ -71,12 +61,12 @@
71
61
  <InputLabel title="Check Out" />
72
62
  </v-col>
73
63
  <v-col cols="12" class="mb-1">
74
- <span class="text-body-1">{{
64
+ <span class="att-dlg__time">{{
75
65
  formatDate(attendance.checkOut.timestamp)
76
66
  }}</span>
77
67
  </v-col>
78
68
  <v-col cols="12" class="mb-2">
79
- <span class="text-caption text-medium-emphasis">
69
+ <span class="screen-hint att-dlg__meta">
80
70
  {{
81
71
  attendance.checkOut?.location?.latitude &&
82
72
  attendance.checkOut?.location?.longitude
@@ -86,29 +76,17 @@
86
76
  </span>
87
77
  </v-col>
88
78
  <v-col cols="12">
89
- <v-card
90
- v-if="attendance.checkOut?.img"
91
- variant="outlined"
92
- class="pa-0"
93
- style="border: 1px solid rgba(0, 0, 0, 0.12)"
94
- >
79
+ <div v-if="attendance.checkOut?.img" class="att-dlg__frame">
95
80
  <v-img
96
81
  :src="getFileUrl(attendance.checkOut.img)"
97
82
  height="280"
98
83
  width="100%"
99
84
  cover
100
85
  ></v-img>
101
- </v-card>
102
- <v-card
103
- v-else
104
- variant="outlined"
105
- class="pa-8 text-center"
106
- style="border: 1px solid rgba(0, 0, 0, 0.12); height: 280px"
107
- >
108
- <span class="text-caption text-medium-emphasis"
109
- >No image</span
110
- >
111
- </v-card>
86
+ </div>
87
+ <div class="att-dlg__frame att-dlg__frame--empty pa-8 text-center" v-else>
88
+ <span class="screen-hint att-dlg__meta">No image</span>
89
+ </div>
112
90
  </v-col>
113
91
  </v-row>
114
92
  </v-col>
@@ -121,22 +99,11 @@
121
99
  </v-row>
122
100
  </v-card-text>
123
101
 
124
- <v-toolbar class="pa-0" density="compact">
125
- <v-row no-gutters>
126
- <v-col cols="12" class="pa-0">
127
- <v-btn
128
- block
129
- variant="text"
130
- class="text-none"
131
- size="large"
132
- @click="close"
133
- height="48"
134
- >
135
- Close
136
- </v-btn>
137
- </v-col>
138
- </v-row>
139
- </v-toolbar>
102
+ <div class="screen-modal__footer">
103
+ <v-btn variant="outlined" class="screen-btn-ghost" @click="close">
104
+ Close
105
+ </v-btn>
106
+ </div>
140
107
  </v-card>
141
108
  </v-dialog>
142
109
  </template>
@@ -183,3 +150,30 @@ watch(showDialog, (newVal) => {
183
150
  }
184
151
  });
185
152
  </script>
153
+
154
+ <style scoped>
155
+ /* `text-body-1` was 1rem/400 and `text-caption text-medium-emphasis` was
156
+ 0.75rem on Vuetify's 60%-alpha ink. The handoff names no type for a
157
+ label/value detail row, so both take the established cell and hint. */
158
+ .att-dlg__time {
159
+ font-size: var(--fs-cell);
160
+ font-weight: var(--fw-cell);
161
+ }
162
+
163
+ .att-dlg__meta {
164
+ font-size: var(--fs-breadcrumb);
165
+ }
166
+
167
+ .att-dlg__frame {
168
+ border: 1px solid var(--border);
169
+ border-radius: var(--r-inner);
170
+ overflow: hidden;
171
+ }
172
+
173
+ .att-dlg__frame--empty {
174
+ height: 280px;
175
+ display: flex;
176
+ align-items: center;
177
+ justify-content: center;
178
+ }
179
+ </style>
@@ -1,36 +1,42 @@
1
1
  <template>
2
- <v-dialog v-model="dialog" max-width="400" persistent>
3
- <v-card class="rounded-xl pa-6" elevation="2">
2
+ <!-- 520px is the handoff's `--modal-w`; the card was `rounded-xl` (24px) on a
3
+ Material elevation, where the design draws a 16px corner and its own
4
+ modal shadow. -->
5
+ <v-dialog v-model="dialog" max-width="520" persistent>
6
+ <v-card class="screen-modal pa-6">
4
7
  <!-- Close Button -->
5
8
  <v-btn
6
9
  icon
7
10
  variant="text"
8
11
  size="small"
9
- class="position-absolute"
12
+ class="screen-modal__close position-absolute"
10
13
  style="top: 8px; right: 8px"
11
14
  @click="closeDialog"
12
15
  >
13
16
  <v-icon>mdi-close</v-icon>
14
17
  </v-btn>
15
18
 
16
- <v-card-text class="text-center">
19
+ <v-card-text class="screen-modal__body text-center">
17
20
  <v-row v-if="imageSrc" justify="center" class="py-10">
18
21
  <v-img height="120" :src="imageSrc" alt="Dialog Image" contain />
19
22
  </v-row>
20
23
 
21
- <!-- Title Slot -->
22
- <div class="text-h6 font-weight-medium mb-2">
24
+ <!-- Title Slot. The handoff's 17px/800 modal title belongs to a
25
+ bordered header row this dialog does not draw - a centred title
26
+ inside the body is a case it is silent on, so it takes the
27
+ established `.screen-card-title` primitive. -->
28
+ <div class="screen-card-title mb-2">
23
29
  <slot name="title"></slot>
24
30
  </div>
25
31
 
26
32
  <!-- Description Slot -->
27
- <div class="text-body-1 mb-4">
33
+ <div class="mb-4">
28
34
  <slot name="description"></slot>
29
35
  </div>
30
36
  </v-card-text>
31
37
 
32
38
  <!-- Footer Slot -->
33
- <v-card-actions>
39
+ <v-card-actions class="screen-modal__footer">
34
40
  <slot name="footer"></slot>
35
41
  </v-card-actions>
36
42
  </v-card>
@@ -1,32 +1,25 @@
1
1
  <template>
2
- <v-card width="100%" :disabled="loading" :loading="loading">
3
- <v-card-text style="max-height: 100vh; overflow-y: auto" class="pa-5 my-5 px-7 text-center">
4
- <v-row no-gutters>
5
- <v-col cols="12" class="font-weight-bold text-h6">{{ promptTitle }}</v-col>
6
- <v-col cols="12" class="mt-5">
7
- <span>
8
- By proceeding, your previous user inputs will be replaced.
9
- </span>
10
- </v-col>
11
- </v-row>
2
+ <v-card class="screen-modal" width="100%" :disabled="loading" :loading="loading">
3
+ <v-card-text class="screen-modal__body pa-5 my-5 px-7 text-center">
4
+ <span class="screen-card-title d-block">{{ promptTitle }}</span>
5
+
6
+ <span class="d-block mt-5">
7
+ By proceeding, your previous user inputs will be replaced.
8
+ </span>
12
9
  </v-card-text>
13
10
 
14
- <v-toolbar class="pa-0" density="compact">
15
- <v-row no-gutters>
16
- <v-col cols="6" class="pa-0">
17
- <v-btn block variant="text" class="text-none" size="large" tile @click="emit('close')" height="48">
18
- Cancel
19
- </v-btn>
20
- </v-col>
11
+ <!-- The design's footer: two equal-width buttons, ghost then primary,
12
+ on a bordered strip. Replaces the `v-toolbar` of two square 48px
13
+ tiles, whose Proceed was a hardcoded `color="black"` fill. -->
14
+ <div class="screen-modal__footer">
15
+ <v-btn class="screen-btn-ghost" variant="outlined" @click="emit('close')">
16
+ Cancel
17
+ </v-btn>
21
18
 
22
- <v-col cols="6" class="pa-0">
23
- <v-btn block tile variant="flat" class="text-none" size="large" height="48" color="black"
24
- @click="emit('proceed')">
25
- Proceed
26
- </v-btn>
27
- </v-col>
28
- </v-row>
29
- </v-toolbar>
19
+ <v-btn class="screen-btn-primary" variant="flat" @click="emit('proceed')">
20
+ Proceed
21
+ </v-btn>
22
+ </div>
30
23
  </v-card>
31
24
  </template>
32
25
 
@@ -46,4 +39,4 @@ const emit = defineEmits(["close", "proceed"])
46
39
 
47
40
  </script>
48
41
 
49
- <style scoped></style>
42
+ <style scoped></style>
@@ -1,34 +1,35 @@
1
1
  <template>
2
- <v-card width="100%" :disabled="loading" :loading="loading">
3
- <v-card-text style="max-height: 100vh; overflow-y: auto" class="pa-5 my-5 px-7 text-center">
4
- <v-row no-gutters>
5
- <v-col cols="12" class="text-h6 font-weight-bold">
6
- <span class=""> {{ promptTitle }}</span>
7
- </v-col>
8
- <v-col v-if="message" cols="12" class="mt-5">
9
- <span >
10
- {{ message }}
11
- </span>
12
- </v-col>
13
- </v-row>
2
+ <v-card class="screen-modal" width="100%" :disabled="loading" :loading="loading">
3
+ <v-card-text class="screen-modal__body pa-5 my-5 px-7 text-center">
4
+ <span class="screen-card-title d-block">{{ promptTitle }}</span>
5
+
6
+ <span v-if="message" class="d-block mt-5">
7
+ {{ message }}
8
+ </span>
14
9
  </v-card-text>
15
10
 
16
- <v-toolbar class="pa-0" density="compact">
17
- <v-row no-gutters>
18
- <v-col cols="6" class="pa-0">
19
- <v-btn block variant="text" class="text-none" size="large" tile @click="emit('close')" height="48">
20
- Cancel
21
- </v-btn>
22
- </v-col>
11
+ <!-- The design's footer: two equal-width buttons, ghost then primary,
12
+ on a bordered strip. -->
13
+ <div class="screen-modal__footer">
14
+ <v-btn class="screen-btn-ghost" variant="outlined" @click="emit('close')">
15
+ Cancel
16
+ </v-btn>
17
+
18
+ <!-- The old default was a hardcoded `color="black"` fill, which is
19
+ the same black on the dark theme as on the light one. With no
20
+ colour asked for, the confirming action now takes the design's
21
+ primary shape like every other modal's Submit.
23
22
 
24
- <v-col cols="6" class="pa-0">
25
- <v-btn block tile variant="flat" class="text-none" size="large" height="48"
26
- :color="confirmButtonColor" @click="emit('proceed')">
27
- {{ confirmLabel }}
28
- </v-btn>
29
- </v-col>
30
- </v-row>
31
- </v-toolbar>
23
+ A caller that DOES name a colour keeps it: `NumberSettingField`
24
+ passes `red` to mark a destructive confirm, and the handoff
25
+ draws no destructive button, so overriding it here would be
26
+ inventing a control the design never named. Left as it renders
27
+ today and raised for a design decision. -->
28
+ <v-btn :class="confirmButtonColor ? 'text-none' : 'screen-btn-primary'"
29
+ variant="flat" :color="confirmButtonColor || undefined" @click="emit('proceed')">
30
+ {{ confirmLabel }}
31
+ </v-btn>
32
+ </div>
32
33
  </v-card>
33
34
  </template>
34
35
 
@@ -52,7 +53,7 @@ const props = defineProps({
52
53
  },
53
54
  confirmButtonColor: {
54
55
  type: String,
55
- default: "black"
56
+ default: ""
56
57
  }
57
58
 
58
59
  })
@@ -61,4 +62,4 @@ const emit = defineEmits(["close", "proceed"])
61
62
 
62
63
  </script>
63
64
 
64
- <style scoped></style>
65
+ <style scoped></style>