@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,6 +1,9 @@
1
1
  <template>
2
2
  <div>
3
- <VCard class="mx-auto">
3
+ <!-- AppCard, not VCard: the design's 14px radius and 1px rule, without
4
+ Vuetify's own elevation and 4px corner fighting the class for it.
5
+ Same swap as TiptapEditor, which wraps the same editor. -->
6
+ <AppCard class="mx-auto">
4
7
  <VuetifyTiptap
5
8
  v-model="content"
6
9
  markdown-theme="github"
@@ -9,7 +12,7 @@
9
12
  :maxWidth="maxWidth"
10
13
  :disabled="isViewMode"
11
14
  />
12
- </VCard>
15
+ </AppCard>
13
16
  </div>
14
17
  </template>
15
18
 
@@ -1,33 +1,78 @@
1
+ <!--
2
+ The little "i" that explains a field.
3
+
4
+ TWO FIXES, one of them the same defect batch P found in the toast:
5
+
6
+ 1. `size` is declared `default: ""`. An EMPTY STRING IS NOT `undefined`, so
7
+ Vue's default machinery never runs and the empty string reaches Vuetify,
8
+ which builds the class `v-btn--size-` - a class that matches nothing. The
9
+ button then had no size class at all and fell back to the bare `.v-btn`
10
+ box. `props.size || undefined` lets Vuetify's own default apply when a
11
+ caller says nothing, which is what the prop was written to mean.
12
+ 2. `p-0 m-0` are not Vuetify classes and never were - nothing in this project
13
+ defines them. Dead attributes, removed.
14
+
15
+ DESIGN GAP, STATED: the handoff draws no tooltip anywhere (`grep -i tooltip`
16
+ returns nothing). So the surface below is not invented - it is the same
17
+ assembly the toast uses for the same reason: the design's inner radius, its
18
+ menu shadow, its font and its button type scale, applied to Vuetify's
19
+ tooltip in place of a 4px Roboto pill.
20
+ -->
1
21
  <template>
2
- <v-tooltip v-bind="$attrs" :text="text" @click.stop>
3
- <template v-slot:activator="{ props: activatorProps }">
4
- <v-btn icon="mdi-information-symbol" v-bind="activatorProps" class="p-0 m-0 d-flex align-center"
5
- :density="density" :size="size" color="primary-button" />
6
- </template>
7
- </v-tooltip>
22
+ <v-tooltip v-bind="$attrs" :text="text" content-class="app-tooltip" @click.stop>
23
+ <template #activator="{ props: activatorProps }">
24
+ <v-btn
25
+ icon="mdi-information-symbol"
26
+ v-bind="activatorProps"
27
+ class="d-flex align-center"
28
+ :density="density"
29
+ :size="props.size || undefined"
30
+ color="primary-button"
31
+ />
32
+ </template>
33
+ </v-tooltip>
8
34
  </template>
9
35
 
10
36
  <script setup lang="ts">
37
+ import type { VTooltip } from "vuetify/components";
11
38
 
12
- import type { VTooltip} from "vuetify/components"
13
-
14
- type TTooltipDensity = VTooltip["$props"]["density"]
39
+ type TTooltipDensity = VTooltip["$props"]["density"];
15
40
 
16
41
  const props = defineProps({
17
- text: {
18
- type: String,
19
- default: ""
20
- },
21
- size: {
22
- type: String,
23
- default: ""
24
- },
25
- density: {
26
- type: String as PropType<TTooltipDensity>,
27
- default: "default"
28
- }
29
- })
30
-
42
+ text: {
43
+ type: String,
44
+ default: "",
45
+ },
46
+ size: {
47
+ type: String,
48
+ default: "",
49
+ },
50
+ density: {
51
+ type: String as PropType<TTooltipDensity>,
52
+ default: "default",
53
+ },
54
+ });
31
55
  </script>
32
56
 
33
- <style scoped></style>
57
+ <style>
58
+ /* NOT scoped: a tooltip teleports to the overlay container, outside this
59
+ component's DOM, so a scoped rule cannot reach it. The class is namespaced
60
+ for the same reason. */
61
+ .v-tooltip > .v-overlay__content.app-tooltip {
62
+ /* MEASURED FIRST, then fixed. Left to Vuetify the panel came out
63
+ `rgb(251,251,248)` on the light page - `--sidebar`, the navigation-rail
64
+ colour, 1.03:1 against `--bg` with no border. The identical fall-through
65
+ batch P found behind the invisible toast. `--card` + `--border` is what
66
+ every other floating panel in this product uses (see `.app-profile-menu`
67
+ in `Layout/Header.vue`), so the edge is what carries the boundary. */
68
+ background: var(--card);
69
+ border: 1px solid var(--border);
70
+ color: var(--text2);
71
+ border-radius: var(--r-inner);
72
+ box-shadow: var(--shadow-menu);
73
+ font-family: var(--font-sans);
74
+ font-size: var(--fs-btn);
75
+ font-weight: 600;
76
+ letter-spacing: 0;
77
+ }
78
+ </style>
@@ -24,10 +24,8 @@
24
24
  <!-- Primary action -->
25
25
  <v-btn
26
26
  v-if="canCreateUnit"
27
- class="text-none mr-3"
28
- rounded="pill"
29
- variant="tonal"
30
- size="large"
27
+ class="text-none mr-3 screen-btn-primary"
28
+ variant="flat"
31
29
  @click="onCreateUnit()"
32
30
  >
33
31
  Add Unit
@@ -37,10 +35,8 @@
37
35
  <template #activator="{ props: t }">
38
36
  <v-btn
39
37
  v-bind="t"
40
- class="ma-1"
41
- variant="tonal"
42
- size="large"
43
- rounded="pill"
38
+ class="ma-1 screen-icon-btn"
39
+ variant="flat"
44
40
  href="/files/unit-sample-data.xlsx"
45
41
  target="_blank"
46
42
  download
@@ -55,10 +51,8 @@
55
51
  <template #activator="{ props: t }">
56
52
  <v-btn
57
53
  v-bind="t"
58
- class="ma-1"
59
- variant="tonal"
60
- size="large"
61
- rounded="pill"
54
+ class="ma-1 screen-icon-btn"
55
+ variant="flat"
62
56
  @click="onImportData"
63
57
  >
64
58
  <v-icon>mdi-upload</v-icon>
@@ -71,10 +65,8 @@
71
65
  <template #activator="{ props: t }">
72
66
  <v-btn
73
67
  v-bind="t"
74
- class="ma-1"
75
- variant="tonal"
76
- size="large"
77
- rounded="pill"
68
+ class="ma-1 screen-icon-btn"
69
+ variant="flat"
78
70
  @click="handleDownloadExcel"
79
71
  :loading="isDownloading"
80
72
  >
@@ -88,7 +80,7 @@
88
80
 
89
81
  <v-spacer />
90
82
 
91
- <v-col cols="auto">
83
+ <v-col cols="auto" class="filter-field">
92
84
  <v-text-field
93
85
  v-model="searchInput"
94
86
  density="compact"
@@ -149,51 +141,39 @@
149
141
  </HygieneUpdateMoreAction>
150
142
  </v-dialog>
151
143
 
152
- <v-dialog v-model="dialogDeleteUnit" max-width="450">
153
- <v-card>
154
- <v-toolbar>
155
- <v-row no-gutters class="fill-height px-6" align="center">
156
- <span class="font-weight-bold text-h6 text-capitalize">
157
- Delete {{ selectedUnit?.name || "Unit" }}
158
- </span>
159
- </v-row>
160
- </v-toolbar>
161
- <v-card-text>
162
- <span class="text-subtitle-2"
163
- >Are you sure you want to delete this unit?</span
164
- >
144
+ <!--
145
+ Was a `v-toolbar` title bar over a toolbar footer of two block buttons, the
146
+ confirm one on `color="black"` - not a token, so it drew a light-theme fill
147
+ on the dark theme. The shared confirmation shape now.
148
+ -->
149
+ <v-dialog v-model="dialogDeleteUnit" max-width="520">
150
+ <v-card class="screen-modal">
151
+ <v-card-title class="text-capitalize">
152
+ Delete {{ selectedUnit?.name || "Unit" }}
153
+ </v-card-title>
154
+
155
+ <v-card-text class="screen-modal__body">
156
+ Are you sure you want to delete this unit?
165
157
  </v-card-text>
166
158
 
167
- <v-toolbar class="pa-0" density="compact">
168
- <v-row no-gutters>
169
- <v-col cols="6" class="pa-0">
170
- <v-btn
171
- block
172
- variant="text"
173
- class="text-none"
174
- size="large"
175
- @click="dialogDeleteUnit = false"
176
- height="48"
177
- >
178
- Cancel
179
- </v-btn>
180
- </v-col>
181
-
182
- <v-col cols="6" class="pa-0">
183
- <v-btn
184
- block
185
- variant="flat"
186
- color="black"
187
- class="text-none font-weight-bold"
188
- height="48"
189
- :loading="submitting"
190
- @click="_deleteUnit"
191
- >
192
- Delete
193
- </v-btn>
194
- </v-col>
195
- </v-row>
196
- </v-toolbar>
159
+ <div class="screen-modal__footer">
160
+ <v-btn
161
+ class="screen-btn-ghost"
162
+ variant="outlined"
163
+ :disabled="submitting"
164
+ @click="dialogDeleteUnit = false"
165
+ >
166
+ Cancel
167
+ </v-btn>
168
+ <v-btn
169
+ class="screen-btn-primary"
170
+ variant="flat"
171
+ :loading="submitting"
172
+ @click="_deleteUnit"
173
+ >
174
+ Delete
175
+ </v-btn>
176
+ </div>
197
177
  </v-card>
198
178
  </v-dialog>
199
179
 
@@ -3,26 +3,26 @@
3
3
  <v-row>
4
4
  <v-col cols="12" md="4" class="mt-2">
5
5
  <InputLabel class="font-weight-bold" title="Name" />
6
- <v-text-field :model-value="person.name" density="compact" :readonly="readOnly"
7
- :class="{ 'no-pointer': readOnly }" />
6
+ <v-text-field :model-value="person.name" class="filter-field" density="comfortable"
7
+ :readonly="readOnly" :class="{ 'no-pointer': readOnly }" />
8
8
  </v-col>
9
9
 
10
10
  <v-col cols="12" md="4" class="mt-2">
11
11
  <InputLabel class="font-weight-bold" title="Email Address" />
12
- <v-text-field :model-value="person.email" density="compact" :readonly="readOnly"
13
- :class="{ 'no-pointer': readOnly }" />
12
+ <v-text-field :model-value="person.email" class="filter-field" density="comfortable"
13
+ :readonly="readOnly" :class="{ 'no-pointer': readOnly }" />
14
14
  </v-col>
15
15
 
16
16
  <v-col cols="12" md="4" class="mt-2">
17
17
  <InputLabel class="font-weight-bold" title="NRIC" />
18
- <v-text-field :model-value="person.nric" density="compact" :readonly="readOnly"
19
- :class="{ 'no-pointer': readOnly }" />
18
+ <v-text-field :model-value="person.nric" class="filter-field" density="comfortable"
19
+ :readonly="readOnly" :class="{ 'no-pointer': readOnly }" />
20
20
  </v-col>
21
21
 
22
22
  <v-col cols="12" md="4" class="mt-2">
23
23
  <InputLabel class="font-weight-bold" title="Mobile Number" />
24
- <v-text-field :model-value="person.contact" density="compact" :readonly="readOnly"
25
- :class="{ 'no-pointer': readOnly }" />
24
+ <v-text-field :model-value="person.contact" class="filter-field" density="comfortable"
25
+ :readonly="readOnly" :class="{ 'no-pointer': readOnly }" />
26
26
  </v-col>
27
27
  </v-row>
28
28
 
@@ -30,11 +30,14 @@
30
30
  <v-col cols="12" md="4" class="mt-2">
31
31
  <InputLabel class="font-weight-bold" title="Other Documents and Files" :viewMode="readOnly" />
32
32
 
33
- <p v-if="!person.files?.length" class="text-blue-darken-2 font-weight-thin text-caption ml-2 mt-5">
33
+ <!-- Was `text-blue-darken-2`, a fixed Vuetify blue that stays the same
34
+ on the dark theme. An empty note is `--muted`; a file link is
35
+ `--accent-text`, the design's link ink. -->
36
+ <p v-if="!person.files?.length" class="screen-hint unit-person__empty ml-2 mt-5">
34
37
  **No documents to display**
35
38
  </p>
36
- <v-list v-else dense nav class="mt-2">
37
- <v-list-item v-for="file in person.files" :key="file.id" class="text-blue-darken-2"
39
+ <v-list v-else dense nav class="mt-2 unit-person__files">
40
+ <v-list-item v-for="file in person.files" :key="file.id" class="unit-person__file"
38
41
  :href="getFileUrl(file.id)" target="_blank">
39
42
  <v-list-item-content>
40
43
  <v-list-item-title class="d-flex align-center">
@@ -53,11 +56,14 @@
53
56
  <v-col v-if="prop.showOwnerOption" cols="12" md="4">
54
57
  <v-checkbox :model-value="person.isOwner" readonly hide-details density="compact" @click="handleClick">
55
58
  <template #label>
56
- <span class="font-weight-bold text-subtitle-2 ml-2">Is Owner?</span>
59
+ <span class="unit-person__check-label ml-2">Is Owner?</span>
57
60
  </template>
58
61
  </v-checkbox>
59
62
 
60
- <span class="d-flex text-caption text-gray-5 ml-7">As owner, you will be receiving emails and updates
63
+ <!-- `text-gray-5` is not a Vuetify class and not a token - it resolved
64
+ to nothing, so this sat on the body ink. `.screen-hint` is the
65
+ design's sub-line. -->
66
+ <span class="d-flex screen-hint ml-7">As owner, you will be receiving emails and updates
61
67
  related to this unit.</span>
62
68
  </v-col>
63
69
  </v-row>
@@ -120,4 +126,27 @@ const handleClick = () => {
120
126
  .no-pointer {
121
127
  pointer-events: none;
122
128
  }
129
+
130
+ /* `.screen-hint` carries the ink; only the size is stated here, and it is the
131
+ cell size, not Vuetify's `text-caption` (12px/400 Roboto). */
132
+ .unit-person__empty {
133
+ font-size: var(--fs-cell);
134
+ }
135
+
136
+ /* A `v-list` paints Vuetify's own `surface` - a square-cornered lighter slab
137
+ sitting on the card, measured on the dark theme. The files are links on the
138
+ card, so the list carries no surface of its own. */
139
+ .unit-person__files {
140
+ background: transparent;
141
+ }
142
+
143
+ .unit-person__file {
144
+ color: var(--accent-text);
145
+ }
146
+
147
+ .unit-person__check-label {
148
+ font-size: var(--fs-cell);
149
+ font-weight: var(--fw-cell);
150
+ color: var(--text);
151
+ }
123
152
  </style>
@@ -1,36 +1,24 @@
1
1
  <template>
2
- <v-card width="100%">
3
- <v-toolbar>
4
- <v-row no-gutters class="fill-height px-6" align="center">
5
- <span class="font-weight-bold text-h5 text-capitalize">
6
- Add Vehicle
7
- </span>
8
- </v-row>
9
- </v-toolbar>
10
-
11
- <v-card-text style="max-height: 100vh; overflow-y: auto" class="pa-5 my-5">
12
- <span class="text-subtitle-2 w-100 font-weight-medium d-flex justify-center mb-3">Please Select Status</span>
13
- <template v-for="item in selection" :key="item.value">
14
- <v-btn color="primary-button" block variant="flat" rounded="md" size="48" :text="item.label" @click="select(item.value)" class="my-2 text-capitalize text-subtitle-2" />
15
- </template>
16
- </v-card-text>
17
-
18
- <v-toolbar density="compact">
19
- <v-row no-gutters>
20
- <v-col cols="12">
21
- <v-btn
22
- tile
23
- block
24
- variant="text"
25
- class="text-none"
26
- size="48"
27
- @click="cancel"
28
- >
29
- Cancel
30
- </v-btn>
31
- </v-col>
32
- </v-row>
33
- </v-toolbar>
2
+ <v-card width="100%" class="screen-modal vehicle-add">
3
+ <v-card-title>Add Vehicle</v-card-title>
4
+
5
+ <div class="screen-modal__body vehicle-add__body">
6
+ <p class="vehicle-add__hint">Please Select Status</p>
7
+ <AppButton
8
+ v-for="item in selection"
9
+ :key="item.value"
10
+ class="vehicle-add__option"
11
+ @click="select(item.value)"
12
+ >
13
+ {{ item.label }}
14
+ </AppButton>
15
+ </div>
16
+
17
+ <div class="vehicle-add__footer">
18
+ <AppButton variant="ghost" class="vehicle-add__cancel" @click="cancel">
19
+ Cancel
20
+ </AppButton>
21
+ </div>
34
22
  </v-card>
35
23
  </template>
36
24
 
@@ -56,3 +44,31 @@ function select(value: TVehicleType | 'seasonpass') {
56
44
  emit("select", value);
57
45
  }
58
46
  </script>
47
+
48
+ <style scoped>
49
+ /* The three choices are full-width by the screen's own design, so the only
50
+ thing said here is the width and the stack - the button itself is AppButton. */
51
+ .vehicle-add__body {
52
+ padding: 20px;
53
+ }
54
+
55
+ .vehicle-add__hint {
56
+ margin: 0 0 14px;
57
+ text-align: center;
58
+ font-size: var(--fs-cell);
59
+ color: var(--muted);
60
+ }
61
+
62
+ .vehicle-add__option {
63
+ display: flex;
64
+ width: 100%;
65
+ margin-bottom: 10px;
66
+ }
67
+
68
+ .vehicle-add__footer {
69
+ display: flex;
70
+ justify-content: flex-end;
71
+ gap: 8px;
72
+ padding: 0 20px 20px;
73
+ }
74
+ </style>