@7365admin1/layer-common 3.2.2-staging.132 → 3.2.2-staging.134

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.
@@ -294,11 +294,29 @@
294
294
  *
295
295
  * Borderless and 32px square - NOT `.screen-icon-btn`, which is the bordered
296
296
  * 40px square the design draws in a toolbar. The glyph is 19px.
297
+ *
298
+ * MEASURED, 2026-08-15: the size never reached the glass. Vuetify's own
299
+ *
300
+ * .v-btn--size-default.v-btn--icon { width: calc(var(--v-btn-height) + 12px);
301
+ * height: same }
302
+ *
303
+ * is TWO classes against this one, so every `.screen-modal__close` in the
304
+ * package drew at 36 + 12 = **48px**, with Vuetify's `padding: 0 16px` on top -
305
+ * half again the design's square, on all thirteen components that use it
306
+ * (`AreaFormDialog`, `Carousel`, `ConfirmDialog`, `DocumentViewer`, `DrawImage`,
307
+ * `EntryPass/QrTemplatePreview`, `EquipmentItemMain`, `EquipmentManagementMain`,
308
+ * `FileInput`, `ManageChecklistMain`, `PhotoUpload`, `ServiceProviderMain`,
309
+ * `Signature`). The `border-radius: 8px` DID win, which is what hid it: the
310
+ * control looked right and simply sat in a box a third too big.
311
+ *
312
+ * Naming `.v-btn` alongside it makes this (0,2,0) and the later sheet wins -
313
+ * the same specificity fix `.v-btn.screen-btn-primary` needed, no `!important`.
297
314
  */
298
- .screen-modal__close {
315
+ .v-btn.screen-modal__close {
299
316
  width: 32px;
300
317
  height: 32px;
301
318
  min-width: 32px;
319
+ padding: 0;
302
320
  border-radius: 8px;
303
321
  background: transparent;
304
322
  color: var(--muted);
@@ -31,14 +31,23 @@
31
31
  >
32
32
  <!-- Status icon driven by local activeActions state -->
33
33
  <template #item-prepend="{ item, group }">
34
+ <!--
35
+ `success` and `error` ARE this theme's tokens (`utils/theme.ts` maps
36
+ them to `p.ok` / `p.err`), so they stay. `grey-lighten-2` was not -
37
+ it is Vuetify's raw grey, and it drew the idle circle at 1.32:1
38
+ against the card where a non-text indicator needs 3:1. The design's
39
+ de-emphasis token is `--muted`, applied by class because `color`
40
+ takes a theme name, not a custom property.
41
+ -->
34
42
  <v-icon
35
43
  size="20"
44
+ :class="{ 'checklist-icon--idle': !activeActions[getKey(item, group.set)] }"
36
45
  :color="
37
46
  activeActions[getKey(item, group.set)] === 'approve'
38
47
  ? 'success'
39
48
  : activeActions[getKey(item, group.set)] === 'reject'
40
49
  ? 'error'
41
- : 'grey-lighten-2'
50
+ : undefined
42
51
  "
43
52
  >
44
53
  {{
@@ -194,11 +203,13 @@
194
203
  v-if="group.attachments && group.attachments.length > 0"
195
204
  cols="auto"
196
205
  >
206
+ <!-- `variant="tonal"` was Vuetify's own tinted slab in the row -
207
+ the same off-design control `EquipmentManagementMain` had.
208
+ The design's ghost button. -->
197
209
  <v-btn
198
- size="x-small"
199
- variant="tonal"
200
- color="primary"
201
- class="text-none"
210
+ size="small"
211
+ variant="outlined"
212
+ class="screen-btn-ghost"
202
213
  prepend-icon="mdi-paperclip"
203
214
  @click.stop="openAttachmentDialog(group.set, group.attachments)"
204
215
  >
@@ -213,9 +224,16 @@
213
224
  </v-col>
214
225
  </v-row>
215
226
 
227
+ <!--
228
+ Was a bare `v-card` (Vuetify's own `surface`, a shade off the design's card)
229
+ with a `text-h5` title, and a `v-card-actions` footer whose Cancel sat on
230
+ `color="grey"` - not a token, so it drew the same grey on both themes and
231
+ the two buttons were right-aligned rather than the design's two equal
232
+ halves. It is the shared `.screen-modal` shape now.
233
+ -->
216
234
  <v-dialog v-model="showCompletionModal" max-width="600" persistent>
217
- <v-card>
218
- <v-card-title class="text-h5 pa-4">
235
+ <v-card class="screen-modal">
236
+ <v-card-title>
219
237
  {{
220
238
  modalData.currentSet !== undefined
221
239
  ? `Set ${modalData.currentSet} Completed`
@@ -225,15 +243,17 @@
225
243
 
226
244
  <v-divider />
227
245
 
228
- <v-card-text class="pa-4">
246
+ <v-card-text class="screen-modal__body pa-4">
229
247
  <v-row>
230
248
  <v-col cols="12">
231
249
  <InputLabel title="Remarks" :required="false" class="mb-2" />
250
+ <!-- `.filter-field` is the design's field on a `v-textarea`: the
251
+ 10px corner and 13.5px type, without taking the binding away. -->
232
252
  <v-textarea
233
253
  v-model="modalData.remark"
254
+ class="filter-field"
234
255
  placeholder="Enter your remarks here"
235
256
  rows="4"
236
- variant="outlined"
237
257
  density="comfortable"
238
258
  hide-details
239
259
  />
@@ -252,38 +272,47 @@
252
272
  </v-row>
253
273
  </v-card-text>
254
274
 
255
- <v-divider />
256
-
257
- <v-card-actions class="pa-4">
258
- <v-spacer />
259
- <v-btn color="grey" variant="text" @click="closeModal"> Cancel </v-btn>
275
+ <div class="screen-modal__footer">
276
+ <v-btn
277
+ class="screen-btn-ghost"
278
+ variant="outlined"
279
+ @click="closeModal"
280
+ >
281
+ Cancel
282
+ </v-btn>
260
283
  <v-btn
261
- color="primary"
284
+ class="screen-btn-primary"
262
285
  variant="flat"
263
286
  @click="submitModal"
264
287
  :disabled="!isModalValid"
265
288
  >
266
289
  Submit
267
290
  </v-btn>
268
- </v-card-actions>
291
+ </div>
269
292
  </v-card>
270
293
  </v-dialog>
271
294
 
295
+ <!--
296
+ Same shape, and this one carried BOTH of the defects that repeated across
297
+ this claim: a `v-toolbar` as the footer bar (Vuetify's `surface`, a grey
298
+ slab that stays grey on dark) and `color="black"` on the confirm button -
299
+ not a token, so a black slab painted on the dark theme too.
300
+ -->
272
301
  <v-dialog v-model="showRejectModal" max-width="600" persistent>
273
- <v-card>
274
- <v-card-title class="text-h5 pa-4">Reject Checklist Item</v-card-title>
302
+ <v-card class="screen-modal">
303
+ <v-card-title>Reject Checklist Item</v-card-title>
275
304
 
276
305
  <v-divider />
277
306
 
278
- <v-card-text class="pa-4">
307
+ <v-card-text class="screen-modal__body pa-4">
279
308
  <v-row>
280
309
  <v-col cols="12">
281
310
  <InputLabel title="Remarks" :required="true" class="mb-2" />
282
311
  <v-textarea
283
312
  v-model="rejectModal.remarks"
313
+ class="filter-field"
284
314
  placeholder="Enter remarks"
285
315
  rows="4"
286
- variant="outlined"
287
316
  density="comfortable"
288
317
  hide-details
289
318
  />
@@ -302,61 +331,50 @@
302
331
  </v-row>
303
332
  </v-card-text>
304
333
 
305
- <v-divider />
306
-
307
- <v-toolbar class="pa-0" density="compact">
308
- <v-row no-gutters>
309
- <v-col cols="6" class="pa-0">
310
- <v-btn
311
- block
312
- variant="text"
313
- class="text-none"
314
- size="large"
315
- height="48"
316
- :disabled="rejectModal.submitting"
317
- @click="closeRejectDialog"
318
- >
319
- Cancel
320
- </v-btn>
321
- </v-col>
322
-
323
- <v-col cols="6" class="pa-0">
324
- <v-btn
325
- block
326
- variant="flat"
327
- color="black"
328
- class="text-none font-weight-bold rounded-0"
329
- height="48"
330
- :loading="rejectModal.submitting"
331
- :disabled="!isRejectModalValid || rejectModal.submitting"
332
- @click="submitRejectDialog"
333
- >
334
- Confirm
335
- </v-btn>
336
- </v-col>
337
- </v-row>
338
- </v-toolbar>
334
+ <div class="screen-modal__footer">
335
+ <v-btn
336
+ class="screen-btn-ghost"
337
+ variant="outlined"
338
+ :disabled="rejectModal.submitting"
339
+ @click="closeRejectDialog"
340
+ >
341
+ Cancel
342
+ </v-btn>
343
+ <v-btn
344
+ class="screen-btn-primary"
345
+ variant="flat"
346
+ :loading="rejectModal.submitting"
347
+ :disabled="!isRejectModalValid || rejectModal.submitting"
348
+ @click="submitRejectDialog"
349
+ >
350
+ Confirm
351
+ </v-btn>
352
+ </div>
339
353
  </v-card>
340
354
  </v-dialog>
341
355
 
356
+ <!--
357
+ The design's modal close control is the borderless 32px square
358
+ `.screen-modal__close`, not the bordered toolbar icon button. The title was
359
+ a hand-set `text-h6 font-weight-bold`; `.screen-modal .v-card-title` is the
360
+ design's card-title size and weight, so the local pair goes.
361
+ -->
342
362
  <v-dialog v-model="showAttachmentDialog" max-width="700" scrollable>
343
- <v-card>
344
- <v-card-title class="d-flex align-center pa-4">
345
- <span class="text-h6 font-weight-bold">
346
- Set {{ attachmentDialogSetNum }} — Attachments
347
- </span>
363
+ <v-card class="screen-modal">
364
+ <v-card-title class="d-flex align-center">
365
+ <span>Set {{ attachmentDialogSetNum }} — Attachments</span>
348
366
  <v-spacer />
349
367
  <v-btn
350
368
  icon="mdi-close"
351
369
  variant="text"
352
- size="small"
370
+ class="screen-modal__close"
353
371
  @click="showAttachmentDialog = false"
354
372
  />
355
373
  </v-card-title>
356
374
 
357
375
  <v-divider />
358
376
 
359
- <v-card-text class="pa-4">
377
+ <v-card-text class="screen-modal__body pa-4">
360
378
  <v-row>
361
379
  <v-col
362
380
  v-for="(id, index) in attachmentDialogIds"
@@ -404,11 +422,16 @@
404
422
  </v-dialog>
405
423
 
406
424
  <v-dialog v-model="showLightbox" max-width="900">
407
- <v-card>
425
+ <v-card class="screen-modal">
408
426
  <v-card-actions class="pa-2 justify-end">
409
- <v-btn icon="mdi-close" variant="text" @click="showLightbox = false" />
427
+ <v-btn
428
+ icon="mdi-close"
429
+ variant="text"
430
+ class="screen-modal__close"
431
+ @click="showLightbox = false"
432
+ />
410
433
  </v-card-actions>
411
- <v-card-text class="pa-2 pt-0">
434
+ <v-card-text class="screen-modal__body pa-2 pt-0">
412
435
  <v-img :src="lightboxSrc" contain max-height="80vh" />
413
436
  </v-card-text>
414
437
  </v-card>
@@ -1006,3 +1029,12 @@ async function _updateUnitChecklist({
1006
1029
  }
1007
1030
  }
1008
1031
  </script>
1032
+
1033
+ <style scoped>
1034
+ /* The idle checklist circle. `--muted` is the design's de-emphasis token and
1035
+ clears the 3:1 bar a non-text indicator needs; Vuetify's `grey-lighten-2`
1036
+ read 1.32:1. */
1037
+ .checklist-icon--idle {
1038
+ color: var(--muted);
1039
+ }
1040
+ </style>
@@ -1,13 +1,12 @@
1
1
  <template>
2
2
  <v-row no-gutters class="w-100">
3
- <v-card class="w-100">
3
+ <v-card flat class="w-100 screen-card">
4
4
  <v-card-text>
5
5
  <v-btn
6
6
  block
7
- color="primary-button"
8
7
  :height="40"
9
8
  text="Scan QR Code"
10
- class="text-capitalize"
9
+ class="screen-btn-primary"
11
10
  prepend-icon="mdi-qrcode"
12
11
  @click="handleScanQRCode"
13
12
  />
@@ -15,7 +14,7 @@
15
14
  v-model="selectedPass"
16
15
  v-model:search="passInput"
17
16
  :hide-no-data="false"
18
- class="mt-3"
17
+ class="mt-3 filter-field"
19
18
  :items="passItems"
20
19
  :rules="props.passRules"
21
20
  item-title="prefixAndName"
@@ -23,7 +22,6 @@
23
22
  label="Pass"
24
23
  variant="outlined"
25
24
  hide-details
26
- density="compact"
27
25
  persistent-hint
28
26
  small-chips
29
27
  :clearable="props.clearable"
@@ -45,7 +43,7 @@
45
43
  v-model="selectedKeys"
46
44
  v-model:search="keyInput"
47
45
  :hide-no-data="false"
48
- class="mt-3"
46
+ class="mt-3 filter-field"
49
47
  :items="keyItems"
50
48
  :rules="props.passRules"
51
49
  item-title="prefixAndName"
@@ -54,7 +52,6 @@
54
52
  multiple
55
53
  variant="outlined"
56
54
  hide-details
57
- density="compact"
58
55
  persistent-hint
59
56
  small-chips
60
57
  closable-chips
@@ -78,10 +75,10 @@
78
75
  <template v-if="selectedType">
79
76
  <v-number-input
80
77
  v-model="count"
78
+ class="filter-field"
81
79
  variant="outlined"
82
80
  :min="1"
83
81
  :precision="0"
84
- density="compact"
85
82
  :rules="countRules"
86
83
  />
87
84
  </template>
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@7365admin1/layer-common",
3
3
  "license": "MIT",
4
4
  "type": "module",
5
- "version": "3.2.2-staging.132",
5
+ "version": "3.2.2-staging.134",
6
6
  "author": "7365admin1",
7
7
  "main": "./nuxt.config.ts",
8
8
  "//files": "What a consumer extending this layer actually loads. Without this npm ships the whole working tree - the changesets, the CI workflows, the render harness in tools/ and any scratch directory that happened to exist at publish time. Nuxt resolves a layer by directory, so every runtime directory below has to stay listed; adding a new top-level runtime directory means adding it here too.",