@7365admin1/layer-common 3.2.7 → 3.2.8-staging.201

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.
Files changed (283) hide show
  1. package/assets/css/primitives.css +1113 -0
  2. package/assets/css/screens.css +1097 -0
  3. package/assets/css/shell.css +258 -0
  4. package/assets/css/tokens.css +236 -0
  5. package/components/AcceptDialog.vue +17 -18
  6. package/components/AccessCard/AvailableStats.vue +24 -16
  7. package/components/AccessCardAddForm.vue +42 -42
  8. package/components/AccessCardAssignToUnitForm.vue +13 -21
  9. package/components/AccessCardDeleteDialog.vue +41 -39
  10. package/components/AccessCardDetailsDialog.vue +125 -79
  11. package/components/AccessCardPreviewDialog.vue +58 -84
  12. package/components/AccessCardQrTagging.vue +60 -63
  13. package/components/AccessCardReplaceForm.vue +27 -23
  14. package/components/AccessManagement.vue +86 -85
  15. package/components/AddEqupmentForm.vue +18 -22
  16. package/components/AddPassKeyToVisitor.vue +95 -73
  17. package/components/AppButton.vue +62 -0
  18. package/components/AppCard.vue +20 -0
  19. package/components/AppDateField.vue +49 -0
  20. package/components/AppField.vue +76 -0
  21. package/components/AppKpiTile.vue +65 -0
  22. package/components/AppSegmented.vue +38 -0
  23. package/components/AppSelect.vue +247 -0
  24. package/components/AreaChecklistHistoryLogs.vue +51 -44
  25. package/components/AreaChecklistHistoryMain.vue +14 -7
  26. package/components/AreaFormDialog.vue +71 -59
  27. package/components/AreaMain.vue +73 -107
  28. package/components/AttachmentsViewer.vue +84 -22
  29. package/components/AttendanceCheckInOutDialog.vue +85 -88
  30. package/components/AttendanceDetailsDialog.vue +57 -63
  31. package/components/AttendanceMain.vue +4 -3
  32. package/components/AttendanceMapSearchDialog.vue +42 -44
  33. package/components/AttendanceSettingsDialog.vue +79 -63
  34. package/components/Avatar/Main.vue +54 -2
  35. package/components/BillingMain.vue +26 -30
  36. package/components/BtnUploadFile.vue +53 -11
  37. package/components/BuildingForm.vue +34 -27
  38. package/components/BuildingManagement/buildings.vue +39 -39
  39. package/components/BuildingManagement/units.vue +26 -42
  40. package/components/BuildingUnitFormAdd.vue +20 -23
  41. package/components/BuildingUnitFormEdit.vue +8 -4
  42. package/components/BulletinBoardForm.vue +19 -24
  43. package/components/BulletinBoardManagement.vue +49 -57
  44. package/components/BulletinBoardView.vue +9 -6
  45. package/components/BulletinExpirationChip.vue +13 -4
  46. package/components/Button/Close.vue +2 -2
  47. package/components/CameraForm.vue +21 -22
  48. package/components/CameraMain.vue +50 -49
  49. package/components/Card/DeleteConfirmation.vue +24 -22
  50. package/components/Card/MemberInfoSummary.vue +28 -3
  51. package/components/Card/Toggle.vue +15 -3
  52. package/components/CardToolbar.vue +37 -0
  53. package/components/Carousel.vue +56 -36
  54. package/components/Chat/Bubbles.vue +43 -14
  55. package/components/Chat/Information.vue +49 -32
  56. package/components/Chat/ListCard.vue +38 -9
  57. package/components/Chat/Message.vue +41 -15
  58. package/components/Chat/Navigation.vue +27 -15
  59. package/components/Chat/SkeletonLoader.vue +9 -2
  60. package/components/ChecklistItemRow.vue +25 -1
  61. package/components/CleaningScheduleMain.vue +44 -49
  62. package/components/ClientDetailForm.vue +81 -56
  63. package/components/ClientMain.vue +92 -82
  64. package/components/ConfirmDialog.vue +14 -8
  65. package/components/Container/Standard.vue +9 -7
  66. package/components/CreateSubsciptionPlan.vue +148 -89
  67. package/components/DashboardEmptyState.vue +48 -3
  68. package/components/DashboardMain.vue +924 -676
  69. package/components/DashboardPanel.vue +84 -21
  70. package/components/DeliveryCompany.vue +34 -20
  71. package/components/Dialog/DeleteConfirmation.vue +20 -21
  72. package/components/Dialog/ReplaceAutofillPrompt.vue +19 -26
  73. package/components/Dialog/ReusablePrompt.vue +30 -29
  74. package/components/Dialog/UpdateMoreAction.vue +62 -59
  75. package/components/DocumentForm.vue +14 -21
  76. package/components/DocumentManagement.vue +162 -108
  77. package/components/DocumentViewer.vue +29 -12
  78. package/components/DrawImage.vue +29 -21
  79. package/components/EntryPass/QrTemplatePreview.vue +27 -16
  80. package/components/EntryPassInformation.vue +40 -10
  81. package/components/EntryPassMain.vue +49 -27
  82. package/components/EquipmentItemMain.vue +84 -97
  83. package/components/EquipmentManagementMain.vue +81 -103
  84. package/components/Facility/BookingSetup.vue +43 -52
  85. package/components/Feedback/Form.vue +26 -12
  86. package/components/FeedbackMain.vue +35 -49
  87. package/components/FileInput.vue +75 -58
  88. package/components/FileInputWithList.vue +59 -12
  89. package/components/FormDialog.vue +60 -21
  90. package/components/HidAccessLogDashboard.vue +512 -490
  91. package/components/HidCameraCaptureDialog.vue +216 -0
  92. package/components/HidEnabledGate.vue +67 -9
  93. package/components/HidIntercomManagement.vue +1322 -653
  94. package/components/HidQrCodeConfiguration.vue +1030 -258
  95. package/components/HidReaderForm.vue +142 -59
  96. package/components/HidReaderManagement.vue +211 -323
  97. package/components/HidServiceSettingsPanel.vue +44 -13
  98. package/components/HidUserEnrollment.vue +1185 -412
  99. package/components/HygieneUpdateMoreAction.vue +44 -44
  100. package/components/IncidentReport/Authorities.vue +30 -18
  101. package/components/IncidentReport/IncidentInformation.vue +10 -10
  102. package/components/IncidentReport/IncidentInformationDownload.vue +3 -4
  103. package/components/IncidentReport/affectedEntities.vue +41 -20
  104. package/components/Input/Date.vue +3 -0
  105. package/components/Input/DatePicker.vue +1 -2
  106. package/components/Input/DateTimePicker.vue +1 -1
  107. package/components/Input/File.vue +55 -10
  108. package/components/Input/FileV2.vue +39 -6
  109. package/components/Input/InputPhoneNumberV2.vue +2 -1
  110. package/components/Input/ListGroupSelection.vue +56 -8
  111. package/components/Input/NRICNumber.vue +1 -0
  112. package/components/Input/NewDate.vue +1 -0
  113. package/components/Input/Number.vue +1 -0
  114. package/components/Input/Password.vue +1 -0
  115. package/components/Input/PhoneNumber.vue +21 -1
  116. package/components/Input/VehicleNumber.vue +1 -0
  117. package/components/InputLabel.vue +2 -2
  118. package/components/InvitationClientForm.vue +21 -19
  119. package/components/InvitationForm.vue +15 -21
  120. package/components/InvitationMain.vue +46 -61
  121. package/components/Layout/Header.vue +263 -36
  122. package/components/Layout/NavigationDrawer.vue +300 -30
  123. package/components/ListItem.vue +33 -3
  124. package/components/LocalPagination.vue +27 -3
  125. package/components/ManageChecklistMain.vue +136 -86
  126. package/components/MemberInformation.vue +32 -16
  127. package/components/MemberMain.vue +113 -93
  128. package/components/MyAttendanceMain.vue +3 -5
  129. package/components/NavigationItem.vue +83 -3
  130. package/components/Nfc/NFCPatrolReportMain.vue +47 -33
  131. package/components/Nfc/NFCPatrolRouteForm.vue +18 -20
  132. package/components/Nfc/NFCPatrolRouteMain.vue +116 -103
  133. package/components/Nfc/NFCPatrolSettings.vue +14 -4
  134. package/components/Nfc/NFCTagForm.vue +22 -8
  135. package/components/Nfc/NFCTagMain.vue +41 -43
  136. package/components/Nfc/PatrolReport/DailyReportTab.vue +8 -1
  137. package/components/Nfc/PatrolReport/MonthlyReportTab.vue +8 -1
  138. package/components/Nfc/PatrolReport/MonthlyReportTable.vue +5 -3
  139. package/components/Nfc/PatrolReport/PatrolActivityTable.vue +26 -6
  140. package/components/Nfc/PatrolReport/PatrolReportTab.vue +8 -0
  141. package/components/Nfc/PatrolReport/PatrolRouteSummary.vue +41 -9
  142. package/components/Nfc/PatrolReport/RemarksDialog.vue +39 -9
  143. package/components/Nfc/PatrolReport/ReportEmptyState.vue +29 -9
  144. package/components/Nfc/PatrolReport/ReportFilters.vue +19 -10
  145. package/components/Nfc/PatrolReport/ReportLocationHeader.vue +32 -6
  146. package/components/Nfc/PatrolReport/SummaryReportTable.vue +28 -6
  147. package/components/NotificationSettings.vue +373 -0
  148. package/components/NumberSettingField.vue +9 -2
  149. package/components/OnlineFormConfigurationForm.vue +725 -237
  150. package/components/OnlineFormFill.vue +213 -106
  151. package/components/OnlineFormRenderPreview.vue +25 -30
  152. package/components/OnlineFormsConfiguration.vue +113 -109
  153. package/components/OrgViewDialog.vue +34 -16
  154. package/components/OvernightParkingAvailability.vue +49 -26
  155. package/components/OvernightParkingManagement.vue +78 -18
  156. package/components/PageHeader.vue +43 -0
  157. package/components/PassInformation.vue +109 -53
  158. package/components/PasswordConfirmation.vue +44 -26
  159. package/components/PeopleForm.vue +41 -20
  160. package/components/PhotoUpload.vue +110 -48
  161. package/components/PlaceholderComponent.vue +35 -19
  162. package/components/PlanActionsMenu.vue +12 -2
  163. package/components/PlanStatusBadge.vue +7 -8
  164. package/components/PlateNumberDisplay.vue +9 -6
  165. package/components/QrTemplate/PrintDialog.vue +66 -43
  166. package/components/RolePermissionFormCreate.vue +104 -79
  167. package/components/RolePermissionFormPreviewUpdate.vue +111 -109
  168. package/components/RolePermissionMain.vue +183 -81
  169. package/components/ScanVisitorQRCode.vue +99 -35
  170. package/components/ScheduleAreaMain.vue +34 -59
  171. package/components/ScheduleTaskForm.vue +61 -42
  172. package/components/ScheduleTaskMain.vue +56 -69
  173. package/components/SearchVehicleNumberUser.vue +39 -37
  174. package/components/ServiceProviderFormCreate.vue +29 -20
  175. package/components/ServiceProviderInvitationPrompt.vue +155 -0
  176. package/components/ServiceProviderMain.vue +601 -432
  177. package/components/Signature.vue +40 -34
  178. package/components/SignaturePad.vue +5 -29
  179. package/components/SiteSettings.vue +41 -11
  180. package/components/SiteSettingsWorkOrder.vue +61 -30
  181. package/components/SlideCardGroup.vue +35 -11
  182. package/components/Snackbar.vue +36 -3
  183. package/components/SpecificAttr.vue +18 -8
  184. package/components/StatusChip.vue +156 -0
  185. package/components/StockCard.vue +17 -12
  186. package/components/SubscriptionPlanTable.vue +207 -140
  187. package/components/SwitchContext.vue +201 -9
  188. package/components/TableHygiene.vue +36 -46
  189. package/components/TableList.vue +10 -10
  190. package/components/TableListSecondary.vue +105 -54
  191. package/components/TableMain.vue +251 -78
  192. package/components/TableV3.vue +61 -70
  193. package/components/TiptapEditor.vue +33 -40
  194. package/components/TiptapEditorQr.vue +5 -2
  195. package/components/Tooltip/Info.vue +69 -24
  196. package/components/UnitMain.vue +40 -60
  197. package/components/UnitPersonCard.vue +42 -13
  198. package/components/VehicleAddSelection.vue +48 -32
  199. package/components/VehicleForm.vue +112 -129
  200. package/components/VehicleManagement.vue +26 -12
  201. package/components/VehicleUpdateMoreAction.vue +59 -46
  202. package/components/VisitorDataFromScannedQRCodeForm.vue +90 -65
  203. package/components/VisitorForm.vue +774 -210
  204. package/components/VisitorFormSelection.vue +40 -37
  205. package/components/VisitorManagement.vue +239 -82
  206. package/components/VisitorPassKeyQRScanner.vue +65 -18
  207. package/components/VisitorSearchResultSummary.vue +60 -16
  208. package/components/VisitorSocketPopUp.vue +22 -14
  209. package/components/VisitorsReportPreview.vue +44 -29
  210. package/components/WorkOrder/Create.vue +26 -17
  211. package/components/WorkOrder/ListView.vue +38 -7
  212. package/components/WorkOrder/Main.vue +62 -59
  213. package/composables/useFeedback.ts +3 -3
  214. package/composables/useHidAmico.ts +269 -0
  215. package/composables/useHidNavigation.ts +2 -9
  216. package/composables/useMember.ts +3 -3
  217. package/composables/useNFCPatrolDailyReport.ts +13 -0
  218. package/composables/useNFCPatrolMonthlyReport.ts +22 -56
  219. package/composables/useNFCPatrolReport.ts +13 -0
  220. package/composables/useNotificationPreference.ts +87 -0
  221. package/composables/useOnlineFormPages.ts +2 -0
  222. package/composables/useRole.ts +22 -0
  223. package/composables/useServiceProvider.ts +3 -3
  224. package/composables/useServiceProviderInvitation.ts +145 -0
  225. package/composables/useSipWebPhone.ts +336 -0
  226. package/composables/useSubscriptionPlan.ts +62 -0
  227. package/composables/useThemePreference.ts +63 -0
  228. package/composables/useVisitor.ts +6 -1
  229. package/composables/useWebUsb.ts +127 -37
  230. package/composables/useWorkOrder.ts +17 -3
  231. package/error.vue +30 -6
  232. package/nuxt.config.ts +36 -0
  233. package/package.json +25 -4
  234. package/pages/[org]/[site]/access-mgmt/administrator/index.vue +2 -2
  235. package/pages/[org]/[site]/access-mgmt/{identity-mapping → hid-cards}/index.vue +2 -2
  236. package/pages/[org]/[site]/access-mgmt/intercom/index.vue +1 -1
  237. package/pages/notification-settings.vue +19 -0
  238. package/pages/payment-method-linked.vue +34 -10
  239. package/pages/require-customer.vue +48 -10
  240. package/pages/require-organization-membership.vue +32 -8
  241. package/pages/unauthorized.vue +29 -4
  242. package/plugins/secure-member.client.ts +21 -56
  243. package/plugins/vuetify.ts +69 -2
  244. package/types/nfc-patrol-report.ts +3 -2
  245. package/types/site.d.ts +71 -0
  246. package/types/subscription.ts +18 -11
  247. package/utils/breadcrumb.test.ts +108 -0
  248. package/utils/breadcrumb.ts +82 -0
  249. package/utils/dashboard.test.ts +118 -0
  250. package/utils/dashboard.ts +53 -0
  251. package/utils/data.test.ts +95 -0
  252. package/utils/data.ts +40 -2
  253. package/utils/hid-discover.test.ts +102 -0
  254. package/utils/list-page.test.ts +60 -0
  255. package/utils/list-page.ts +38 -0
  256. package/utils/materialSymbols.ts +363 -0
  257. package/utils/nav-sections.test.ts +190 -0
  258. package/utils/nav-sections.ts +151 -0
  259. package/utils/nfc-patrol-report.test.ts +130 -0
  260. package/utils/nfc-patrol-report.ts +101 -0
  261. package/utils/role.test.ts +69 -0
  262. package/utils/role.ts +10 -0
  263. package/utils/route-name.test.ts +85 -0
  264. package/utils/route-name.ts +24 -0
  265. package/utils/status.test.ts +110 -0
  266. package/utils/status.ts +135 -0
  267. package/utils/table-card.test.ts +84 -0
  268. package/utils/theme-aa-ledger.ts +148 -0
  269. package/utils/theme.test.ts +485 -7
  270. package/utils/theme.ts +295 -110
  271. package/.changeset/README.md +0 -8
  272. package/.changeset/config.json +0 -11
  273. package/.editorconfig +0 -12
  274. package/.github/workflows/main.yml +0 -17
  275. package/.github/workflows/publish-staging.yml +0 -47
  276. package/.github/workflows/publish.yml +0 -39
  277. package/PUBLISHING.md +0 -269
  278. package/components/HidIdentityMapping.vue +0 -975
  279. package/components/ScheduleTaskAreaFormDialog.vue +0 -144
  280. package/components/ScheduleTaskAreaUpdateMoreAction.vue +0 -109
  281. package/components/ScheduleTastTicketMain.vue +0 -182
  282. package/components/TableWithButton.vue +0 -94
  283. package/test/visitor-socket.test.mjs +0 -36
@@ -1,23 +1,19 @@
1
1
  <template>
2
2
  <v-dialog v-model="showDialog" max-width="450" persistent>
3
- <v-card>
4
- <v-toolbar>
5
- <v-row no-gutters class="fill-height px-6" align="center">
6
- <span class="font-weight-bold text-h6">{{
7
- action === "checkIn" ? "Check In" : "Check Out"
8
- }}</span>
9
- </v-row>
10
- </v-toolbar>
11
-
12
- <v-card-text class="pa-4">
3
+ <v-card class="screen-modal">
4
+ <!-- Was a bare `v-toolbar` at each end of the card, which Vuetify paints
5
+ from its own `surface` - two grey slabs visibly lighter than the card
6
+ on the dark theme - carrying a `text-h6` (20px/500) heading. The
7
+ design's modal heading is the card's own `v-card-title` row. -->
8
+ <v-card-title>
9
+ {{ action === "checkIn" ? "Check In" : "Check Out" }}
10
+ </v-card-title>
11
+
12
+ <v-card-text class="screen-modal__body">
13
13
  <v-form ref="formRef" v-model="valid">
14
14
  <v-row no-gutters class="pa-0">
15
15
  <v-col cols="12" class="pa-0">
16
- <v-card
17
- variant="outlined"
18
- class="mb-2"
19
- style="height: 400px; position: relative; overflow: hidden"
20
- >
16
+ <v-card variant="outlined" class="mb-2 attendance-capture__stage">
21
17
  <div
22
18
  v-if="loadingCamera"
23
19
  class="d-flex align-center justify-center"
@@ -56,17 +52,15 @@
56
52
  "
57
53
  />
58
54
 
55
+ <!-- `background: #f5f5f5` was a literal light grey, so on the
56
+ dark theme this placeholder was a white slab inside a dark
57
+ card. It follows the theme now. -->
59
58
  <div
60
59
  v-else-if="!loadingCamera"
61
- class="d-flex align-center justify-center flex-column"
62
- style="height: 100%; background: #f5f5f5"
60
+ class="d-flex align-center justify-center flex-column attendance-capture__placeholder"
63
61
  >
64
- <v-icon size="64" color="grey" class="mb-2"
65
- >mdi-camera-off</v-icon
66
- >
67
- <span class="text-caption text-grey"
68
- >Initializing camera...</span
69
- >
62
+ <v-icon size="64" class="mb-2">mdi-camera-off</v-icon>
63
+ <span>Initializing camera...</span>
70
64
  </div>
71
65
  </v-card>
72
66
  </v-col>
@@ -86,71 +80,47 @@
86
80
  </v-form>
87
81
  </v-card-text>
88
82
 
89
- <v-toolbar class="pa-0" density="compact">
90
- <v-row no-gutters>
91
- <v-col v-if="!capturedImage" cols="6" class="pa-0">
92
- <v-btn
93
- block
94
- variant="text"
95
- class="text-none"
96
- size="large"
97
- @click="close"
98
- height="56"
99
- >
100
- Cancel
101
- </v-btn>
102
- </v-col>
103
-
104
- <v-col v-if="!capturedImage" cols="6" class="pa-0">
105
- <v-btn
106
- block
107
- variant="flat"
108
- color="black"
109
- class="text-none font-weight-bold rounded-0"
110
- height="56"
111
- size="large"
112
- @click="capturePhoto"
113
- :disabled="!showCamera"
114
- >
115
- <v-icon class="mr-2">mdi-camera</v-icon>
116
- Capture Photo
117
- </v-btn>
118
- </v-col>
119
-
120
- <template v-else>
121
- <v-col cols="6" class="pa-0">
122
- <v-btn
123
- block
124
- variant="text"
125
- class="text-none"
126
- size="large"
127
- @click="retakePhoto"
128
- height="56"
129
- :disabled="submitting"
130
- >
131
- <v-icon class="mr-2">mdi-camera-retake</v-icon>
132
- Retake
133
- </v-btn>
134
- </v-col>
135
-
136
- <v-col cols="6" class="pa-0">
137
- <v-btn
138
- block
139
- variant="flat"
140
- color="black"
141
- class="text-none font-weight-bold rounded-0"
142
- height="56"
143
- size="large"
144
- :loading="submitting"
145
- @click="submit"
146
- >
147
- <v-icon class="mr-2">mdi-check</v-icon>
148
- Submit
149
- </v-btn>
150
- </v-col>
151
- </template>
152
- </v-row>
153
- </v-toolbar>
83
+ <!-- `color="black"` was a literal, not a token: a pure-black 56px slab
84
+ with `rounded-0`, on both themes. `.screen-btn-primary` is the fill
85
+ the design draws, and the footer gives the pair the design's 40px
86
+ height and 10px radius. -->
87
+ <div class="screen-modal__footer">
88
+ <template v-if="!capturedImage">
89
+ <v-btn class="text-none screen-btn-ghost" variant="flat" @click="close">
90
+ Cancel
91
+ </v-btn>
92
+ <v-btn
93
+ class="text-none screen-btn-primary"
94
+ variant="flat"
95
+ prepend-icon="mdi-camera"
96
+ :disabled="!showCamera"
97
+ @click="capturePhoto"
98
+ >
99
+ Capture Photo
100
+ </v-btn>
101
+ </template>
102
+
103
+ <template v-else>
104
+ <v-btn
105
+ class="text-none screen-btn-ghost"
106
+ variant="flat"
107
+ prepend-icon="mdi-camera-retake"
108
+ :disabled="submitting"
109
+ @click="retakePhoto"
110
+ >
111
+ Retake
112
+ </v-btn>
113
+ <v-btn
114
+ class="text-none screen-btn-primary"
115
+ variant="flat"
116
+ prepend-icon="mdi-check"
117
+ :loading="submitting"
118
+ @click="submit"
119
+ >
120
+ Submit
121
+ </v-btn>
122
+ </template>
123
+ </div>
154
124
  </v-card>
155
125
  </v-dialog>
156
126
  </template>
@@ -418,3 +388,30 @@ watch(showDialog, async (newVal) => {
418
388
  }
419
389
  });
420
390
  </script>
391
+
392
+ <style scoped>
393
+ /* The camera stage. `height: 400px` and the rest were inline styles; the box is
394
+ the design's inner radius on the card's own border. */
395
+ .attendance-capture__stage {
396
+ position: relative;
397
+ height: 400px;
398
+ overflow: hidden;
399
+ border-radius: var(--r-inner);
400
+ border-color: var(--border);
401
+ }
402
+
403
+ /* Was `background: #f5f5f5` with `text-grey` / `text-caption` on it - a literal
404
+ light slab that stayed light on the dark theme. Both ends follow the theme. */
405
+ .attendance-capture__placeholder {
406
+ height: 100%;
407
+ background: var(--thead);
408
+ font-family: var(--font-sans);
409
+ font-size: var(--fs-cell);
410
+ font-weight: 500;
411
+ color: var(--muted);
412
+ }
413
+
414
+ .attendance-capture__placeholder .v-icon {
415
+ color: var(--muted);
416
+ }
417
+ </style>
@@ -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>
@@ -15,11 +15,12 @@
15
15
  @row-click="handleRowClick"
16
16
  >
17
17
  <template #actions>
18
+ <!-- Was `color="black"`: a black slab in both themes, and the only
19
+ black surface on the page. Same button, the design's ghost. -->
18
20
  <v-btn
19
21
  v-if="canManageAttendanceSettings"
20
- variant="flat"
21
- color="black"
22
- class="text-none"
22
+ variant="outlined"
23
+ class="text-none screen-btn-ghost"
23
24
  @click="dialogShowSettings = true"
24
25
  >
25
26
  <v-icon class="mr-2">mdi-cog</v-icon>
@@ -1,13 +1,11 @@
1
1
  <template>
2
2
  <v-dialog v-model="showDialog" max-width="500" persistent>
3
- <v-card>
4
- <v-toolbar>
5
- <v-row no-gutters class="fill-height px-6" align="center">
6
- <span class="font-weight-bold text-h6">Search Location</span>
7
- </v-row>
8
- </v-toolbar>
9
-
10
- <v-card-text class="pa-6">
3
+ <v-card class="screen-modal map-search">
4
+ <div class="map-search__head">
5
+ <v-card-title>Search Location</v-card-title>
6
+ </div>
7
+
8
+ <div class="screen-modal__body map-search__body filter-field">
11
9
  <v-form ref="formRef" @submit.prevent="handleSearch">
12
10
  <v-row dense>
13
11
  <v-col cols="12" md="6">
@@ -64,47 +62,23 @@
64
62
  </v-col>
65
63
  </v-row>
66
64
  </v-form>
67
- </v-card-text>
68
-
69
- <v-toolbar class="pa-0" density="compact">
70
- <v-row no-gutters>
71
- <v-col cols="6" class="pa-0">
72
- <v-btn
73
- block
74
- variant="text"
75
- class="text-none"
76
- size="large"
77
- height="56"
78
- :disabled="searching"
79
- @click="handleClose"
80
- >
81
- Cancel
82
- </v-btn>
83
- </v-col>
84
- <v-col cols="6" class="pa-0">
85
- <v-btn
86
- block
87
- variant="flat"
88
- color="black"
89
- class="text-none font-weight-bold rounded-0"
90
- height="56"
91
- size="large"
92
- :loading="searching"
93
- :disabled="!formData.postalCode"
94
- @click="handleSearch"
95
- >
96
- <v-icon class="mr-2">mdi-magnify</v-icon>
97
- Search
98
- </v-btn>
99
- </v-col>
100
- </v-row>
101
- </v-toolbar>
65
+ </div>
66
+
67
+ <div class="map-search__footer">
68
+ <AppButton variant="ghost" :disabled="searching" @click="handleClose">Cancel</AppButton>
69
+ <AppButton
70
+ icon="mdi-magnify"
71
+ :disabled="searching || !formData.postalCode"
72
+ @click="handleSearch"
73
+ >
74
+ Search
75
+ </AppButton>
76
+ </div>
102
77
  </v-card>
103
78
  </v-dialog>
104
79
 
105
80
  <Snackbar v-model="messageSnackbar" :text="message" :color="messageColor" />
106
81
  </template>
107
- That is
108
82
 
109
83
  <script setup lang="ts">
110
84
  const showDialog = defineModel({ type: Boolean, default: false });
@@ -391,3 +365,27 @@ watch(showDialog, (newVal) => {
391
365
  }
392
366
  });
393
367
  </script>
368
+
369
+ <style scoped>
370
+ .map-search__head {
371
+ display: flex;
372
+ align-items: center;
373
+ justify-content: space-between;
374
+ padding-right: 12px;
375
+ }
376
+
377
+ .map-search__body {
378
+ padding: 0 20px;
379
+ }
380
+
381
+ /* The design's dialog footer - ghost secondary, then one primary, right
382
+ aligned. Deliberately not the shared `.screen-modal__footer`: that class is
383
+ on the batch-D branch (#1150), not on this base, and adding a second copy of
384
+ it to `screens.css` here would collide with that PR. */
385
+ .map-search__footer {
386
+ display: flex;
387
+ justify-content: flex-end;
388
+ gap: 8px;
389
+ padding: 16px 20px 20px;
390
+ }
391
+ </style>