@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
@@ -22,6 +22,13 @@
22
22
  />
23
23
  </template>
24
24
 
25
+ <!-- A failed request is not an empty result. Saying "no patrol log found"
26
+ for a 500 states something about the data the server never said. -->
27
+ <ReportEmptyState
28
+ v-else-if="!loading && failed"
29
+ title="Report unavailable"
30
+ message="The patrol logs could not be loaded. Please try again."
31
+ />
25
32
  <ReportEmptyState
26
33
  v-else-if="!loading && notFound"
27
34
  title="No Patrol Log"
@@ -63,6 +70,7 @@ const {
63
70
  report,
64
71
  loading,
65
72
  notFound,
73
+ failed,
66
74
  selectedActivityRemarks,
67
75
  dialogRemarks,
68
76
  fetchReport,
@@ -1,14 +1,28 @@
1
+ <!--
2
+ The schedule-vs-actual pair at the top of a patrol report.
3
+
4
+ Was `variant="flat"` - a Vuetify surface with no border on either theme - and
5
+ the table inside it was `border-thin`, i.e. a hairline the theme does not
6
+ own. `.table-card` is the design's table surface: `--card` on `--border` at
7
+ `--r-card`, and it styles the `thead`/`tbody` of a raw `v-table` for us, so
8
+ the header row picks up the design's uppercase 11px/800 and the rows the
9
+ 49px line box.
10
+
11
+ `text-body-2 text-medium-emphasis` on the tolerance was Vuetify's Roboto
12
+ scale plus an opacity; `--text2` is the design's secondary ink and measures
13
+ 9.62:1 on a card.
14
+ -->
1
15
  <template>
2
- <v-card class="mb-6" variant="flat" rounded="lg">
3
- <v-card-title class="d-flex justify-space-between align-center">
4
- <span>Patrol Route Summary: {{ summary.routeName }}</span>
5
- <span class="text-body-2 text-medium-emphasis">
16
+ <div class="table-card table-card__shrink mb-6">
17
+ <div class="route-summary__head">
18
+ <span class="screen-card-title">Patrol Route Summary: {{ summary.routeName }}</span>
19
+ <span class="route-summary__tolerance">
6
20
  Tolerance: {{ summary.tolerance }} mins
7
21
  </span>
8
- </v-card-title>
22
+ </div>
9
23
 
10
- <v-card-text class="pa-0">
11
- <v-table class="border-thin">
24
+ <div>
25
+ <v-table>
12
26
  <thead>
13
27
  <tr>
14
28
  <th>Time</th>
@@ -50,8 +64,8 @@
50
64
  </tr>
51
65
  </tbody>
52
66
  </v-table>
53
- </v-card-text>
54
- </v-card>
67
+ </div>
68
+ </div>
55
69
  </template>
56
70
 
57
71
  <script setup lang="ts">
@@ -61,3 +75,21 @@ defineProps<{
61
75
  summary: NFCPatrolRouteSummary;
62
76
  }>();
63
77
  </script>
78
+
79
+ <style scoped>
80
+ .route-summary__head {
81
+ display: flex;
82
+ align-items: center;
83
+ justify-content: space-between;
84
+ gap: 12px;
85
+ padding: 14px var(--cellpad-x);
86
+ border-bottom: 1px solid var(--border);
87
+ }
88
+
89
+ .route-summary__tolerance {
90
+ font-family: var(--font-sans);
91
+ font-size: var(--fs-cell);
92
+ color: var(--text2);
93
+ white-space: nowrap;
94
+ }
95
+ </style>
@@ -1,22 +1,39 @@
1
+ <!--
2
+ The remarks a guard left when skipping a checkpoint.
3
+
4
+ Was a bare `v-card rounded="xl"` - a 24px corner where the design's modal is
5
+ 16px (`--r-modal`) - with a `text-h6` heading and Vuetify's default elevation
6
+ rather than `--shadow-modal`. `.screen-modal` is all three, and it styles its
7
+ own `.v-card-title`, so the `text-h6` span becomes the title element the
8
+ design already draws.
9
+
10
+ The close control was a tinted `variant="text"` icon button; `.screen-icon-btn`
11
+ is the design's bordered square, the same one every other dialog uses.
12
+ -->
1
13
  <template>
2
14
  <v-dialog :model-value="modelValue" max-width="600" persistent>
3
- <v-card rounded="xl">
4
- <v-card-title class="d-flex align-center pa-6">
5
- <span class="text-h6">Skip Checkpoint Remarks</span>
6
- <v-spacer />
7
- <v-btn icon="mdi-close" variant="text" size="small" @click="close" />
8
- </v-card-title>
15
+ <v-card class="screen-modal">
16
+ <div class="remarks-dialog__head">
17
+ <v-card-title class="pa-0">Skip Checkpoint Remarks</v-card-title>
18
+ <v-btn
19
+ class="screen-icon-btn"
20
+ icon="mdi-close"
21
+ variant="flat"
22
+ aria-label="Close"
23
+ @click="close"
24
+ />
25
+ </div>
9
26
 
10
- <v-card-text class="px-6 pb-6">
27
+ <div class="screen-modal__body px-6 pb-6">
11
28
  <v-textarea
29
+ class="filter-field"
12
30
  :model-value="remarks"
13
31
  variant="outlined"
14
- rounded="lg"
15
32
  readonly
16
33
  rows="4"
17
34
  hide-details
18
35
  />
19
- </v-card-text>
36
+ </div>
20
37
  </v-card>
21
38
  </v-dialog>
22
39
  </template>
@@ -35,3 +52,16 @@ function close() {
35
52
  emit("update:modelValue", false);
36
53
  }
37
54
  </script>
55
+
56
+ <style scoped>
57
+ /* The title row was a `v-card-title` with a `v-spacer` inside it. A flex row
58
+ with the title and the close button as its two children says the same thing
59
+ and lets `.screen-modal .v-card-title` reach the heading. */
60
+ .remarks-dialog__head {
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: space-between;
64
+ gap: 12px;
65
+ padding: 20px 24px;
66
+ }
67
+ </style>
@@ -1,13 +1,21 @@
1
+ <!--
2
+ The patrol report's "nothing selected yet" state.
3
+
4
+ It was a bordered `v-card` with a `text-h6` heading, a `text-body-2
5
+ text-medium-emphasis` line and `color="grey-lighten-1"` on the icon - a fixed
6
+ Vuetify grey, i.e. the same light grey on the dark page.
7
+
8
+ The design already has this exact object: `.screen-empty` is the centred
9
+ column with the muted icon and the muted sentence, and it colours its own
10
+ `.v-icon`. So the card and the three type classes go and the design's one
11
+ class replaces them.
12
+ -->
1
13
  <template>
2
- <v-card class="text-center pa-12" variant="outlined" rounded="lg">
3
- <v-icon size="64" color="grey-lighten-1" class="mb-4">
4
- mdi-clipboard-text-outline
5
- </v-icon>
6
- <h3 class="text-h6 mb-2">{{ title }}</h3>
7
- <p class="text-body-2 text-medium-emphasis">
8
- {{ message }}
9
- </p>
10
- </v-card>
14
+ <div class="screen-empty">
15
+ <v-icon size="64">mdi-clipboard-text-outline</v-icon>
16
+ <p class="screen-empty__title">{{ title }}</p>
17
+ <p class="mb-0">{{ message }}</p>
18
+ </div>
11
19
  </template>
12
20
 
13
21
  <script setup lang="ts">
@@ -22,3 +30,15 @@ withDefaults(
22
30
  },
23
31
  );
24
32
  </script>
33
+
34
+ <style scoped>
35
+ /* The heading keeps its emphasis over the sentence under it, but at the
36
+ design's card-title size rather than Vuetify's `text-h6` (20px/500 Roboto
37
+ metrics). `.screen-empty` already supplies the family and the muted ink. */
38
+ .screen-empty__title {
39
+ font-size: var(--fs-card-title);
40
+ font-weight: var(--fw-card-title);
41
+ color: var(--text2);
42
+ margin-bottom: 0;
43
+ }
44
+ </style>
@@ -1,3 +1,17 @@
1
+ <!--
2
+ The route / time / date filters above a patrol report, and its Export menu.
3
+
4
+ The three fields were raw Vuetify: `rounded="lg"` is an 8px corner where the
5
+ design's input is `--r-inner`, and the label and placeholder sat at Vuetify's
6
+ own scale rather than `--fs-cell`. `.filter-field` is the design's input, and
7
+ it is the same class the rest of the estate's filter rows already use, so
8
+ these three now match every other filter on the product.
9
+
10
+ The Export button was `variant="outlined" size="large"` - 44px against the
11
+ design's 40 - with `rounded="lg"` again. `.screen-btn-ghost` is the design's
12
+ secondary button; `block` still reaches it, because the layer names
13
+ `.v-btn--block.screen-btn-ghost` for exactly that.
14
+ -->
1
15
  <template>
2
16
  <v-row no-gutters class="mb-6">
3
17
  <v-col cols="12" md="3" class="pr-md-2 mb-2 mb-md-0">
@@ -7,11 +21,10 @@
7
21
  item-title="title"
8
22
  item-value="value"
9
23
  label="Select Route"
24
+ class="filter-field"
10
25
  variant="outlined"
11
26
  density="comfortable"
12
- rounded="lg"
13
27
  hide-details
14
- bg-color="white"
15
28
  @update:model-value="updateFilter('route', $event)"
16
29
  />
17
30
  </v-col>
@@ -26,11 +39,10 @@
26
39
  :model-value="modelValue.timeRange"
27
40
  :items="options.timeRanges"
28
41
  label="Start Time"
42
+ class="filter-field"
29
43
  variant="outlined"
30
44
  density="comfortable"
31
- rounded="lg"
32
45
  hide-details
33
- bg-color="white"
34
46
  @update:model-value="updateFilter('timeRange', $event)"
35
47
  />
36
48
  </v-col>
@@ -43,11 +55,10 @@
43
55
  >
44
56
  <ReportDatePicker
45
57
  :model-value="modelValue.date"
58
+ class="filter-field"
46
59
  variant="outlined"
47
60
  density="comfortable"
48
- rounded="lg"
49
61
  hide-details
50
- bg-color="white"
51
62
  @update:model-value="updateFilter('date', $event)"
52
63
  />
53
64
  </v-col>
@@ -59,11 +70,9 @@
59
70
  <template #activator="{ props: menuProps }">
60
71
  <v-btn
61
72
  v-bind="menuProps"
62
- variant="outlined"
73
+ class="screen-btn-ghost"
74
+ variant="flat"
63
75
  block
64
- size="large"
65
- rounded="lg"
66
- class="text-none"
67
76
  prepend-icon="mdi-export"
68
77
  >
69
78
  Export
@@ -1,11 +1,21 @@
1
+ <!--
2
+ The site header at the top of a patrol report.
3
+
4
+ Was a `variant="flat" rounded="lg"` card with `text-h5` and `text-body-2
5
+ text-medium-emphasis`. `variant="flat"` is a Vuetify surface with no border,
6
+ so the block had no edge on either theme; the design's card is
7
+ `--card` + `--border` + `--r-card` + `--shadow`, which is `.app-card`.
8
+
9
+ The two type classes are Vuetify's Roboto scale. `--fs-card-title` and
10
+ `--text2` are the design's, and `--text2` measures 9.62:1 on a card where
11
+ `--medium-emphasis` is an opacity applied to the theme ink.
12
+ -->
1
13
  <template>
2
- <v-card class="text-center pa-8 mt-2" variant="flat" rounded="lg">
14
+ <div class="app-card text-center pa-8 mt-2">
3
15
  <v-icon size="64" class="mb-4">mdi-office-building</v-icon>
4
- <h2 class="text-h5 mb-2">{{ location.name }}</h2>
5
- <p class="text-body-2 text-medium-emphasis">
6
- {{ location.address }}
7
- </p>
8
- </v-card>
16
+ <p class="location-header__name">{{ location.name }}</p>
17
+ <p class="location-header__address mb-0">{{ location.address }}</p>
18
+ </div>
9
19
  </template>
10
20
 
11
21
  <script setup lang="ts">
@@ -15,3 +25,19 @@ defineProps<{
15
25
  location: NFCPatrolReportLocation;
16
26
  }>();
17
27
  </script>
28
+
29
+ <style scoped>
30
+ .location-header__name {
31
+ font-family: var(--font-sans);
32
+ font-size: var(--fs-card-title);
33
+ font-weight: var(--fw-card-title);
34
+ color: var(--text);
35
+ margin-bottom: 8px;
36
+ }
37
+
38
+ .location-header__address {
39
+ font-family: var(--font-sans);
40
+ font-size: var(--fs-cell);
41
+ color: var(--text2);
42
+ }
43
+ </style>
@@ -1,9 +1,26 @@
1
+ <!--
2
+ The per-route summary rows of a patrol report.
3
+
4
+ Same change as `PatrolRouteSummary`: `variant="flat"` drew no border on
5
+ either theme and `border-thin` was a hairline outside the theme.
6
+ `.table-card` is the design's table surface and styles the raw `v-table`'s
7
+ header row and cells, so the uppercase 11px/800 header and the 49px rows
8
+ arrive without restating either here.
9
+
10
+ The status stays `text-success` / `text-error`. Those ARE the design tokens -
11
+ `utils/theme.ts` maps Vuetify's `success`/`error` onto `--ok`/`--err` - and
12
+ swapping them to `StatusChip` would be a meaning change, not a restyle:
13
+ `utils/status.ts` does not name "Missed", so the shared map would render it
14
+ NEUTRAL and a missed patrol would stop being red. Raised, not decided here.
15
+ -->
1
16
  <template>
2
- <v-card class="mb-6" variant="flat" rounded="lg">
3
- <v-card-title>{{ title }}</v-card-title>
17
+ <div class="table-card table-card__shrink mb-6">
18
+ <div class="summary-table__head">
19
+ <span class="screen-card-title">{{ title }}</span>
20
+ </div>
4
21
 
5
- <v-card-text>
6
- <v-table class="border-thin">
22
+ <div>
23
+ <v-table>
7
24
  <thead>
8
25
  <tr>
9
26
  <th>Patrol Route Name</th>
@@ -43,8 +60,8 @@
43
60
  </tr>
44
61
  </tbody>
45
62
  </v-table>
46
- </v-card-text>
47
- </v-card>
63
+ </div>
64
+ </div>
48
65
  </template>
49
66
 
50
67
  <script setup lang="ts">
@@ -66,6 +83,11 @@ function statusClass(status: NFCPatrolReportSummaryStatus) {
66
83
  </script>
67
84
 
68
85
  <style scoped>
86
+ .summary-table__head {
87
+ padding: 14px var(--cellpad-x);
88
+ border-bottom: 1px solid var(--border);
89
+ }
90
+
69
91
  .guard-signature {
70
92
  width: 80px;
71
93
  height: 40px;