@7365admin1/layer-common 3.2.6 → 3.2.8-staging.200

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 (284) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/assets/css/primitives.css +1113 -0
  3. package/assets/css/screens.css +1097 -0
  4. package/assets/css/shell.css +258 -0
  5. package/assets/css/tokens.css +236 -0
  6. package/components/AcceptDialog.vue +17 -18
  7. package/components/AccessCard/AvailableStats.vue +24 -16
  8. package/components/AccessCardAddForm.vue +42 -42
  9. package/components/AccessCardAssignToUnitForm.vue +13 -21
  10. package/components/AccessCardDeleteDialog.vue +41 -39
  11. package/components/AccessCardDetailsDialog.vue +125 -79
  12. package/components/AccessCardPreviewDialog.vue +58 -84
  13. package/components/AccessCardQrTagging.vue +60 -63
  14. package/components/AccessCardReplaceForm.vue +27 -23
  15. package/components/AccessManagement.vue +86 -85
  16. package/components/AddEqupmentForm.vue +18 -22
  17. package/components/AddPassKeyToVisitor.vue +95 -73
  18. package/components/AppButton.vue +62 -0
  19. package/components/AppCard.vue +20 -0
  20. package/components/AppDateField.vue +49 -0
  21. package/components/AppField.vue +76 -0
  22. package/components/AppKpiTile.vue +65 -0
  23. package/components/AppSegmented.vue +38 -0
  24. package/components/AppSelect.vue +247 -0
  25. package/components/AreaChecklistHistoryLogs.vue +51 -44
  26. package/components/AreaChecklistHistoryMain.vue +14 -7
  27. package/components/AreaFormDialog.vue +71 -59
  28. package/components/AreaMain.vue +73 -107
  29. package/components/AttachmentsViewer.vue +84 -22
  30. package/components/AttendanceCheckInOutDialog.vue +85 -88
  31. package/components/AttendanceDetailsDialog.vue +57 -63
  32. package/components/AttendanceMain.vue +4 -3
  33. package/components/AttendanceMapSearchDialog.vue +42 -44
  34. package/components/AttendanceSettingsDialog.vue +79 -63
  35. package/components/Avatar/Main.vue +54 -2
  36. package/components/BillingMain.vue +26 -30
  37. package/components/BtnUploadFile.vue +53 -11
  38. package/components/BuildingForm.vue +34 -27
  39. package/components/BuildingManagement/buildings.vue +39 -39
  40. package/components/BuildingManagement/units.vue +26 -42
  41. package/components/BuildingUnitFormAdd.vue +20 -23
  42. package/components/BuildingUnitFormEdit.vue +8 -4
  43. package/components/BulletinBoardForm.vue +19 -24
  44. package/components/BulletinBoardManagement.vue +49 -57
  45. package/components/BulletinBoardView.vue +9 -6
  46. package/components/BulletinExpirationChip.vue +13 -4
  47. package/components/Button/Close.vue +2 -2
  48. package/components/CameraForm.vue +21 -22
  49. package/components/CameraMain.vue +50 -49
  50. package/components/Card/DeleteConfirmation.vue +24 -22
  51. package/components/Card/MemberInfoSummary.vue +28 -3
  52. package/components/Card/Toggle.vue +15 -3
  53. package/components/CardToolbar.vue +37 -0
  54. package/components/Carousel.vue +56 -36
  55. package/components/Chat/Bubbles.vue +43 -14
  56. package/components/Chat/Information.vue +49 -32
  57. package/components/Chat/ListCard.vue +38 -9
  58. package/components/Chat/Message.vue +41 -15
  59. package/components/Chat/Navigation.vue +27 -15
  60. package/components/Chat/SkeletonLoader.vue +9 -2
  61. package/components/ChecklistItemRow.vue +25 -1
  62. package/components/CleaningScheduleMain.vue +44 -49
  63. package/components/ClientDetailForm.vue +81 -56
  64. package/components/ClientMain.vue +92 -82
  65. package/components/ConfirmDialog.vue +14 -8
  66. package/components/Container/Standard.vue +9 -7
  67. package/components/CreateSubsciptionPlan.vue +148 -89
  68. package/components/DashboardEmptyState.vue +48 -3
  69. package/components/DashboardMain.vue +924 -676
  70. package/components/DashboardPanel.vue +84 -21
  71. package/components/DeliveryCompany.vue +34 -20
  72. package/components/Dialog/DeleteConfirmation.vue +20 -21
  73. package/components/Dialog/ReplaceAutofillPrompt.vue +19 -26
  74. package/components/Dialog/ReusablePrompt.vue +30 -29
  75. package/components/Dialog/UpdateMoreAction.vue +62 -59
  76. package/components/DocumentForm.vue +14 -21
  77. package/components/DocumentManagement.vue +162 -108
  78. package/components/DocumentViewer.vue +29 -12
  79. package/components/DrawImage.vue +29 -21
  80. package/components/EntryPass/QrTemplatePreview.vue +27 -16
  81. package/components/EntryPassInformation.vue +40 -10
  82. package/components/EntryPassMain.vue +49 -27
  83. package/components/EquipmentItemMain.vue +84 -97
  84. package/components/EquipmentManagementMain.vue +81 -103
  85. package/components/Facility/BookingSetup.vue +43 -52
  86. package/components/Feedback/Form.vue +26 -12
  87. package/components/FeedbackMain.vue +35 -49
  88. package/components/FileInput.vue +75 -58
  89. package/components/FileInputWithList.vue +59 -12
  90. package/components/FormDialog.vue +60 -21
  91. package/components/HidAccessLogDashboard.vue +512 -490
  92. package/components/HidCameraCaptureDialog.vue +216 -0
  93. package/components/HidEnabledGate.vue +67 -9
  94. package/components/HidIntercomManagement.vue +1322 -653
  95. package/components/HidQrCodeConfiguration.vue +1030 -258
  96. package/components/HidReaderForm.vue +142 -59
  97. package/components/HidReaderManagement.vue +211 -323
  98. package/components/HidServiceSettingsPanel.vue +44 -13
  99. package/components/HidUserEnrollment.vue +1185 -412
  100. package/components/HygieneUpdateMoreAction.vue +44 -44
  101. package/components/IncidentReport/Authorities.vue +30 -18
  102. package/components/IncidentReport/IncidentInformation.vue +10 -10
  103. package/components/IncidentReport/IncidentInformationDownload.vue +3 -4
  104. package/components/IncidentReport/affectedEntities.vue +41 -20
  105. package/components/Input/Date.vue +3 -0
  106. package/components/Input/DatePicker.vue +1 -2
  107. package/components/Input/DateTimePicker.vue +1 -1
  108. package/components/Input/File.vue +55 -10
  109. package/components/Input/FileV2.vue +39 -6
  110. package/components/Input/InputPhoneNumberV2.vue +2 -1
  111. package/components/Input/ListGroupSelection.vue +56 -8
  112. package/components/Input/NRICNumber.vue +1 -0
  113. package/components/Input/NewDate.vue +1 -0
  114. package/components/Input/Number.vue +1 -0
  115. package/components/Input/Password.vue +1 -0
  116. package/components/Input/PhoneNumber.vue +21 -1
  117. package/components/Input/VehicleNumber.vue +1 -0
  118. package/components/InputLabel.vue +2 -2
  119. package/components/InvitationClientForm.vue +21 -19
  120. package/components/InvitationForm.vue +15 -21
  121. package/components/InvitationMain.vue +46 -61
  122. package/components/Layout/Header.vue +263 -36
  123. package/components/Layout/NavigationDrawer.vue +300 -30
  124. package/components/ListItem.vue +33 -3
  125. package/components/LocalPagination.vue +27 -3
  126. package/components/ManageChecklistMain.vue +136 -86
  127. package/components/MemberInformation.vue +32 -16
  128. package/components/MemberMain.vue +113 -93
  129. package/components/MyAttendanceMain.vue +3 -5
  130. package/components/NavigationItem.vue +83 -3
  131. package/components/Nfc/NFCPatrolReportMain.vue +47 -33
  132. package/components/Nfc/NFCPatrolRouteForm.vue +18 -20
  133. package/components/Nfc/NFCPatrolRouteMain.vue +116 -103
  134. package/components/Nfc/NFCPatrolSettings.vue +14 -4
  135. package/components/Nfc/NFCTagForm.vue +22 -8
  136. package/components/Nfc/NFCTagMain.vue +41 -43
  137. package/components/Nfc/PatrolReport/DailyReportTab.vue +8 -1
  138. package/components/Nfc/PatrolReport/MonthlyReportTab.vue +8 -1
  139. package/components/Nfc/PatrolReport/MonthlyReportTable.vue +5 -3
  140. package/components/Nfc/PatrolReport/PatrolActivityTable.vue +26 -6
  141. package/components/Nfc/PatrolReport/PatrolReportTab.vue +8 -0
  142. package/components/Nfc/PatrolReport/PatrolRouteSummary.vue +41 -9
  143. package/components/Nfc/PatrolReport/RemarksDialog.vue +39 -9
  144. package/components/Nfc/PatrolReport/ReportEmptyState.vue +29 -9
  145. package/components/Nfc/PatrolReport/ReportFilters.vue +19 -10
  146. package/components/Nfc/PatrolReport/ReportLocationHeader.vue +32 -6
  147. package/components/Nfc/PatrolReport/SummaryReportTable.vue +28 -6
  148. package/components/NotificationSettings.vue +373 -0
  149. package/components/NumberSettingField.vue +9 -2
  150. package/components/OnlineFormConfigurationForm.vue +725 -237
  151. package/components/OnlineFormFill.vue +213 -106
  152. package/components/OnlineFormRenderPreview.vue +25 -30
  153. package/components/OnlineFormsConfiguration.vue +113 -109
  154. package/components/OrgViewDialog.vue +34 -16
  155. package/components/OvernightParkingAvailability.vue +49 -26
  156. package/components/OvernightParkingManagement.vue +78 -18
  157. package/components/PageHeader.vue +43 -0
  158. package/components/PassInformation.vue +109 -53
  159. package/components/PasswordConfirmation.vue +44 -26
  160. package/components/PeopleForm.vue +41 -20
  161. package/components/PhotoUpload.vue +110 -48
  162. package/components/PlaceholderComponent.vue +35 -19
  163. package/components/PlanActionsMenu.vue +12 -2
  164. package/components/PlanStatusBadge.vue +7 -8
  165. package/components/PlateNumberDisplay.vue +9 -6
  166. package/components/QrTemplate/PrintDialog.vue +66 -43
  167. package/components/RolePermissionFormCreate.vue +104 -79
  168. package/components/RolePermissionFormPreviewUpdate.vue +111 -109
  169. package/components/RolePermissionMain.vue +183 -81
  170. package/components/ScanVisitorQRCode.vue +99 -35
  171. package/components/ScheduleAreaMain.vue +34 -59
  172. package/components/ScheduleTaskForm.vue +61 -42
  173. package/components/ScheduleTaskMain.vue +56 -69
  174. package/components/SearchVehicleNumberUser.vue +39 -37
  175. package/components/ServiceProviderFormCreate.vue +29 -20
  176. package/components/ServiceProviderInvitationPrompt.vue +155 -0
  177. package/components/ServiceProviderMain.vue +601 -432
  178. package/components/Signature.vue +40 -34
  179. package/components/SignaturePad.vue +5 -29
  180. package/components/SiteSettings.vue +41 -11
  181. package/components/SiteSettingsWorkOrder.vue +61 -30
  182. package/components/SlideCardGroup.vue +35 -11
  183. package/components/Snackbar.vue +36 -3
  184. package/components/SpecificAttr.vue +18 -8
  185. package/components/StatusChip.vue +156 -0
  186. package/components/StockCard.vue +17 -12
  187. package/components/SubscriptionPlanTable.vue +207 -140
  188. package/components/SwitchContext.vue +201 -9
  189. package/components/TableHygiene.vue +36 -46
  190. package/components/TableList.vue +10 -10
  191. package/components/TableListSecondary.vue +105 -54
  192. package/components/TableMain.vue +241 -79
  193. package/components/TableV3.vue +61 -70
  194. package/components/TiptapEditor.vue +33 -40
  195. package/components/TiptapEditorQr.vue +5 -2
  196. package/components/Tooltip/Info.vue +69 -24
  197. package/components/UnitMain.vue +40 -60
  198. package/components/UnitPersonCard.vue +42 -13
  199. package/components/VehicleAddSelection.vue +48 -32
  200. package/components/VehicleForm.vue +112 -129
  201. package/components/VehicleManagement.vue +26 -12
  202. package/components/VehicleUpdateMoreAction.vue +59 -46
  203. package/components/VisitorDataFromScannedQRCodeForm.vue +90 -65
  204. package/components/VisitorForm.vue +774 -210
  205. package/components/VisitorFormSelection.vue +40 -37
  206. package/components/VisitorManagement.vue +239 -82
  207. package/components/VisitorPassKeyQRScanner.vue +65 -18
  208. package/components/VisitorSearchResultSummary.vue +60 -16
  209. package/components/VisitorSocketPopUp.vue +22 -14
  210. package/components/VisitorsReportPreview.vue +44 -29
  211. package/components/WorkOrder/Create.vue +26 -17
  212. package/components/WorkOrder/ListView.vue +38 -7
  213. package/components/WorkOrder/Main.vue +62 -59
  214. package/composables/useFeedback.ts +3 -3
  215. package/composables/useHidAmico.ts +269 -0
  216. package/composables/useHidNavigation.ts +2 -9
  217. package/composables/useMember.ts +3 -3
  218. package/composables/useNFCPatrolDailyReport.ts +13 -0
  219. package/composables/useNFCPatrolMonthlyReport.ts +22 -56
  220. package/composables/useNFCPatrolReport.ts +13 -0
  221. package/composables/useNotificationPreference.ts +87 -0
  222. package/composables/useOnlineFormPages.ts +2 -0
  223. package/composables/useRole.ts +22 -0
  224. package/composables/useServiceProvider.ts +3 -3
  225. package/composables/useServiceProviderInvitation.ts +145 -0
  226. package/composables/useSipWebPhone.ts +336 -0
  227. package/composables/useSubscriptionPlan.ts +62 -0
  228. package/composables/useThemePreference.ts +63 -0
  229. package/composables/useVisitor.ts +6 -1
  230. package/composables/useWebUsb.ts +127 -37
  231. package/composables/useWorkOrder.ts +17 -3
  232. package/error.vue +30 -6
  233. package/nuxt.config.ts +36 -0
  234. package/package.json +25 -4
  235. package/pages/[org]/[site]/access-mgmt/administrator/index.vue +2 -2
  236. package/pages/[org]/[site]/access-mgmt/{identity-mapping → hid-cards}/index.vue +2 -2
  237. package/pages/[org]/[site]/access-mgmt/intercom/index.vue +1 -1
  238. package/pages/notification-settings.vue +19 -0
  239. package/pages/payment-method-linked.vue +34 -10
  240. package/pages/require-customer.vue +48 -10
  241. package/pages/require-organization-membership.vue +32 -8
  242. package/pages/unauthorized.vue +29 -4
  243. package/plugins/secure-member.client.ts +21 -56
  244. package/plugins/vuetify.ts +69 -2
  245. package/types/nfc-patrol-report.ts +3 -2
  246. package/types/site.d.ts +71 -0
  247. package/types/subscription.ts +18 -11
  248. package/utils/breadcrumb.test.ts +108 -0
  249. package/utils/breadcrumb.ts +82 -0
  250. package/utils/dashboard.test.ts +118 -0
  251. package/utils/dashboard.ts +53 -0
  252. package/utils/data.test.ts +95 -0
  253. package/utils/data.ts +40 -2
  254. package/utils/hid-discover.test.ts +102 -0
  255. package/utils/list-page.test.ts +60 -0
  256. package/utils/list-page.ts +38 -0
  257. package/utils/materialSymbols.ts +363 -0
  258. package/utils/nav-sections.test.ts +190 -0
  259. package/utils/nav-sections.ts +151 -0
  260. package/utils/nfc-patrol-report.test.ts +130 -0
  261. package/utils/nfc-patrol-report.ts +101 -0
  262. package/utils/role.test.ts +69 -0
  263. package/utils/role.ts +10 -0
  264. package/utils/route-name.test.ts +85 -0
  265. package/utils/route-name.ts +24 -0
  266. package/utils/status.test.ts +110 -0
  267. package/utils/status.ts +135 -0
  268. package/utils/table-card.test.ts +84 -0
  269. package/utils/theme-aa-ledger.ts +148 -0
  270. package/utils/theme.test.ts +485 -7
  271. package/utils/theme.ts +295 -110
  272. package/.changeset/README.md +0 -8
  273. package/.changeset/config.json +0 -11
  274. package/.editorconfig +0 -12
  275. package/.github/workflows/main.yml +0 -17
  276. package/.github/workflows/publish-staging.yml +0 -47
  277. package/.github/workflows/publish.yml +0 -39
  278. package/PUBLISHING.md +0 -269
  279. package/components/HidIdentityMapping.vue +0 -975
  280. package/components/ScheduleTaskAreaFormDialog.vue +0 -144
  281. package/components/ScheduleTaskAreaUpdateMoreAction.vue +0 -109
  282. package/components/ScheduleTastTicketMain.vue +0 -182
  283. package/components/TableWithButton.vue +0 -94
  284. 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;