@fleetbase/fleetops-engine 0.6.50 → 0.6.51

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 (159) hide show
  1. package/README.md +185 -67
  2. package/addon/components/contact/panel-header.hbs +11 -48
  3. package/addon/components/customer/details.hbs +1 -2
  4. package/addon/components/customer/form.hbs +63 -51
  5. package/addon/components/customer/form.js +27 -1
  6. package/addon/components/customer/orders.hbs +48 -0
  7. package/addon/components/customer/orders.js +67 -5
  8. package/addon/components/driver/form.hbs +1 -1
  9. package/addon/components/home/getting-started-guidance.hbs +113 -0
  10. package/addon/components/home/getting-started-guidance.js +107 -0
  11. package/addon/components/issue/details/comments.hbs +3 -0
  12. package/addon/components/issue/details/comments.js +3 -0
  13. package/addon/components/issue/details/correspondence.hbs +9 -0
  14. package/addon/components/issue/details/correspondence.js +83 -0
  15. package/addon/components/issue/details/documents.hbs +69 -0
  16. package/addon/components/issue/details/documents.js +85 -0
  17. package/addon/components/issue/details.hbs +220 -59
  18. package/addon/components/issue/details.js +245 -0
  19. package/addon/components/issue/form.hbs +19 -1
  20. package/addon/components/issue/panel-header.hbs +43 -0
  21. package/addon/components/issue/panel-header.js +22 -0
  22. package/addon/components/issue/timeline.hbs +40 -0
  23. package/addon/components/issue/timeline.js +45 -0
  24. package/addon/components/leaflet-tracking-marker.js +3 -0
  25. package/addon/components/map/drawer/position-listing.js +3 -0
  26. package/addon/components/map/leaflet-live-map.hbs +2 -2
  27. package/addon/components/map/leaflet-live-map.js +17 -0
  28. package/addon/components/map/order-list-overlay.hbs +4 -4
  29. package/addon/components/modals/convert-customer-to-vendor.hbs +30 -0
  30. package/addon/components/modals/convert-customer-to-vendor.js +55 -0
  31. package/addon/components/modals/issue-assign.hbs +20 -0
  32. package/addon/components/modals/issue-assign.js +49 -0
  33. package/addon/components/modals/issue-close.hbs +30 -0
  34. package/addon/components/modals/issue-close.js +73 -0
  35. package/addon/components/modals/issue-status.hbs +20 -0
  36. package/addon/components/modals/issue-status.js +43 -0
  37. package/addon/components/modals/reset-customer-credentials.js +12 -6
  38. package/addon/components/modals/update-order-activity.hbs +51 -17
  39. package/addon/components/modals/update-order-activity.js +59 -5
  40. package/addon/components/order/details/activity.js +2 -2
  41. package/addon/components/order/details/proof.hbs +40 -38
  42. package/addon/components/order/details/proof.js +31 -4
  43. package/addon/components/order/details.hbs +5 -5
  44. package/addon/components/order/details.js +19 -1
  45. package/addon/components/order/header.hbs +1 -1
  46. package/addon/components/route-list.hbs +0 -12
  47. package/addon/components/service-rate/details.hbs +1 -1
  48. package/addon/components/service-rate/form.hbs +1 -1
  49. package/addon/components/service-rate/form.js +4 -0
  50. package/addon/components/vendor/personnel-manager.hbs +166 -0
  51. package/addon/components/vendor/personnel-manager.js +143 -0
  52. package/addon/components/widget/live-fleet.hbs +1 -0
  53. package/addon/components/widget/live-fleet.js +2 -7
  54. package/addon/components/widget/revenue-trend.hbs +1 -1
  55. package/addon/components/widget/revenue-trend.js +75 -2
  56. package/addon/controllers/management/contacts/customers/details.js +31 -13
  57. package/addon/controllers/management/contacts/customers.js +16 -5
  58. package/addon/controllers/management/contacts/index/details.js +31 -13
  59. package/addon/controllers/management/contacts/index.js +7 -0
  60. package/addon/controllers/management/issues/index/details.js +52 -6
  61. package/addon/controllers/management/vendors/index/details.js +4 -0
  62. package/addon/controllers/operations/orders/index/details.js +11 -3
  63. package/addon/controllers/operations/orders/index.js +1 -1
  64. package/addon/extension.js +19 -12
  65. package/addon/helpers/format-duration.js +1 -38
  66. package/addon/initializers/load-leaflet-assets.js +5 -6
  67. package/addon/initializers/patch-ember-leaflet-tooltip-layer.js +51 -0
  68. package/addon/routes/management/issues/index/details.js +1 -1
  69. package/addon/routes.js +1 -0
  70. package/addon/services/contact-actions.js +231 -1
  71. package/addon/services/getting-started.js +44 -0
  72. package/addon/services/issue-actions.js +71 -0
  73. package/addon/services/leaflet-map-manager.js +2 -0
  74. package/addon/services/map-adapter/leaflet.js +19 -0
  75. package/addon/services/service-areas.js +3 -0
  76. package/addon/styles/fleetops-engine.css +1036 -0
  77. package/addon/templates/management/contacts/customers/details.hbs +1 -1
  78. package/addon/templates/management/contacts/index/details.hbs +1 -1
  79. package/addon/templates/management/contacts.hbs +2 -2
  80. package/addon/templates/management/issues/index/details/index.hbs +3 -1
  81. package/addon/templates/management/issues/index/details.hbs +3 -2
  82. package/addon/templates/management/vendors/index/details/personnel.hbs +1 -2
  83. package/addon/templates/operations/orders/index/details/index.hbs +2 -2
  84. package/addon/templates/operations/orders/index.hbs +1 -1
  85. package/addon/templates/operations/service-rates/index/edit.hbs +1 -0
  86. package/addon/templates/operations/service-rates/index/new.hbs +1 -0
  87. package/addon/templates/settings/payments/onboard.hbs +8 -8
  88. package/addon/utils/leaflet-draw-namespace-guard.js +22 -0
  89. package/addon/utils/leaflet-plugin-loader.js +219 -0
  90. package/addon/utils/setup-customer-portal.js +4 -64
  91. package/app/components/home/getting-started-guidance.js +1 -0
  92. package/app/components/issue/details/comments.js +1 -0
  93. package/app/components/issue/details/correspondence.js +1 -0
  94. package/app/components/issue/details/documents.js +1 -0
  95. package/app/components/issue/panel-header.js +1 -0
  96. package/app/components/modals/convert-customer-to-vendor.js +1 -0
  97. package/app/components/modals/issue-assign.js +1 -0
  98. package/app/components/modals/issue-close.js +1 -0
  99. package/app/components/modals/issue-status.js +1 -0
  100. package/app/components/vendor/personnel-manager.js +1 -0
  101. package/app/helpers/format-duration.js +1 -1
  102. package/app/services/getting-started.js +1 -0
  103. package/app/utils/leaflet-draw-namespace-guard.js +1 -0
  104. package/app/utils/leaflet-plugin-loader.js +1 -0
  105. package/composer.json +1 -1
  106. package/extension.json +1 -1
  107. package/package.json +5 -5
  108. package/server/migrations/2026_05_31_000001_add_portal_fields_to_vendor_personnels_table.php +30 -0
  109. package/server/migrations/2026_06_03_000000_ensure_tags_column_on_issues_table.php +31 -0
  110. package/server/migrations/2026_06_03_000001_add_order_uuid_to_issues_table.php +25 -0
  111. package/server/migrations/2026_06_04_000001_backfill_order_transaction_subjects.php +39 -0
  112. package/server/migrations/2026_06_04_000002_backfill_order_transaction_directions.php +24 -0
  113. package/server/resources/views/mail/customer-credentials.blade.php +16 -13
  114. package/server/src/Expansions/UserFilterExpansion.php +28 -0
  115. package/server/src/Http/Controllers/Api/v1/IssueController.php +2 -0
  116. package/server/src/Http/Controllers/Api/v1/OrderController.php +26 -25
  117. package/server/src/Http/Controllers/Api/v1/PlaceController.php +10 -58
  118. package/server/src/Http/Controllers/Internal/v1/ContactController.php +135 -0
  119. package/server/src/Http/Controllers/Internal/v1/CustomerController.php +116 -6
  120. package/server/src/Http/Controllers/Internal/v1/GettingStartedController.php +17 -0
  121. package/server/src/Http/Controllers/Internal/v1/IssueController.php +251 -0
  122. package/server/src/Http/Controllers/Internal/v1/OrderController.php +172 -97
  123. package/server/src/Http/Controllers/Internal/v1/PlaceController.php +10 -68
  124. package/server/src/Http/Controllers/Internal/v1/VendorController.php +89 -0
  125. package/server/src/Http/Requests/CreateIssueRequest.php +4 -0
  126. package/server/src/Http/Requests/UpdateIssueRequest.php +4 -0
  127. package/server/src/Http/Resources/v1/Index/Order.php +12 -9
  128. package/server/src/Http/Resources/v1/Issue.php +25 -0
  129. package/server/src/Http/Resources/v1/Order.php +20 -18
  130. package/server/src/Mail/CustomerCredentialsMail.php +5 -6
  131. package/server/src/Models/Contact.php +30 -51
  132. package/server/src/Models/Issue.php +47 -6
  133. package/server/src/Models/Order.php +33 -6
  134. package/server/src/Models/ServiceArea.php +1 -1
  135. package/server/src/Models/VendorPersonnel.php +10 -1
  136. package/server/src/Models/Zone.php +1 -1
  137. package/server/src/Observers/PurchaseRateObserver.php +20 -0
  138. package/server/src/Observers/ZoneObserver.php +56 -0
  139. package/server/src/Providers/FleetOpsServiceProvider.php +1 -0
  140. package/server/src/Support/Analytics/TopDrivers.php +9 -1
  141. package/server/src/Support/GettingStarted.php +144 -0
  142. package/server/src/Support/PlaceSearch.php +282 -0
  143. package/server/src/Support/ResolvesOrderServiceStops.php +22 -12
  144. package/server/src/routes.php +33 -1
  145. package/server/tests/AnalyticsRoutesTest.php +8 -0
  146. package/server/tests/CustomerContactIdentitySafetyTest.php +41 -0
  147. package/server/tests/DriverVehicleStatusDefaultTest.php +2 -2
  148. package/server/tests/GettingStartedStatusTest.php +21 -0
  149. package/server/tests/OrderActivityFlowRegressionTest.php +116 -0
  150. package/server/tests/ServiceAreaZoneApiShapeTest.php +44 -0
  151. package/translations/ar-ae.yml +9 -0
  152. package/translations/bg-bg.yaml +9 -0
  153. package/translations/en-us.yaml +11 -0
  154. package/translations/es-pa.yaml +9 -0
  155. package/translations/fr-fr.yaml +9 -0
  156. package/translations/mn-mn.yaml +9 -0
  157. package/translations/pt-br.yaml +9 -0
  158. package/translations/ru-ru.yaml +9 -0
  159. package/translations/vi-vn.yaml +9 -0
@@ -4914,3 +4914,1039 @@ body[data-theme='dark'] .next-google-container-map .fleetops-google-draw-actions
4914
4914
  .overflow-y-scroll-i {
4915
4915
  overflow-y: scroll !important;
4916
4916
  }
4917
+
4918
+ .fleet-ops-home-guidance-grid {
4919
+ display: grid;
4920
+ grid-template-columns: repeat(2, minmax(0, 1fr));
4921
+ gap: 1rem;
4922
+ }
4923
+
4924
+ .fleet-ops-get-started-content {
4925
+ min-height: 256px;
4926
+ }
4927
+
4928
+ .fleet-ops-get-started .fleet-ops-get-started-step {
4929
+ min-height: 52px;
4930
+ }
4931
+
4932
+ .fleet-ops-recommended-features-loading {
4933
+ min-height: 256px;
4934
+ }
4935
+
4936
+ .fleet-ops-recommended-feature {
4937
+ min-height: 92px;
4938
+ }
4939
+
4940
+ @media (width <= 1180px) {
4941
+ .fleet-ops-home-guidance-grid {
4942
+ grid-template-columns: 1fr;
4943
+ }
4944
+ }
4945
+
4946
+ .fleet-ops-recommended-feature-icon {
4947
+ background: rgba(37, 99, 235, 0.12);
4948
+ color: #2563eb;
4949
+ }
4950
+
4951
+ .fleet-ops-recommended-feature.feature-accent-green .fleet-ops-recommended-feature-icon {
4952
+ background: rgba(16, 185, 129, 0.12);
4953
+ color: #059669;
4954
+ }
4955
+
4956
+ .fleet-ops-recommended-feature.feature-accent-amber .fleet-ops-recommended-feature-icon {
4957
+ background: rgba(245, 158, 11, 0.14);
4958
+ color: #d97706;
4959
+ }
4960
+
4961
+ .fleet-ops-recommended-feature.feature-accent-purple .fleet-ops-recommended-feature-icon {
4962
+ background: rgba(124, 58, 237, 0.12);
4963
+ color: #7c3aed;
4964
+ }
4965
+
4966
+ [data-theme='dark'] .fleet-ops-recommended-feature-icon {
4967
+ background: rgba(96, 165, 250, 0.16);
4968
+ color: #93c5fd;
4969
+ }
4970
+
4971
+ [data-theme='dark'] .fleet-ops-recommended-feature.feature-accent-green .fleet-ops-recommended-feature-icon {
4972
+ background: rgba(52, 211, 153, 0.14);
4973
+ color: #6ee7b7;
4974
+ }
4975
+
4976
+ [data-theme='dark'] .fleet-ops-recommended-feature.feature-accent-amber .fleet-ops-recommended-feature-icon {
4977
+ background: rgba(251, 191, 36, 0.14);
4978
+ color: #fcd34d;
4979
+ }
4980
+
4981
+ [data-theme='dark'] .fleet-ops-recommended-feature.feature-accent-purple .fleet-ops-recommended-feature-icon {
4982
+ background: rgba(167, 139, 250, 0.14);
4983
+ color: #c4b5fd;
4984
+ }
4985
+
4986
+ .issue-panel-header {
4987
+ display: flex;
4988
+ align-items: flex-start;
4989
+ justify-content: space-between;
4990
+ gap: 1rem;
4991
+ background: #fff;
4992
+ padding: 0.75rem 1rem;
4993
+ }
4994
+
4995
+ .issue-panel-header-main {
4996
+ display: flex;
4997
+ flex: 1 1 0%;
4998
+ align-items: flex-start;
4999
+ gap: 0.75rem;
5000
+ min-width: 0;
5001
+ }
5002
+
5003
+ .issue-panel-header-icon {
5004
+ display: flex;
5005
+ flex-shrink: 0;
5006
+ align-items: center;
5007
+ justify-content: center;
5008
+ width: 2rem;
5009
+ height: 2rem;
5010
+ color: #d97706;
5011
+ font-size: 0.875rem;
5012
+ background: #fffbeb;
5013
+ border: 1px solid #fcd34d;
5014
+ border-radius: 0.375rem;
5015
+ box-shadow: 0 1px 2px rgb(0 0 0 / 5%);
5016
+ }
5017
+
5018
+ .issue-panel-header-content {
5019
+ flex: 1 1 0%;
5020
+ min-width: 0;
5021
+ }
5022
+
5023
+ .issue-panel-header-title-row {
5024
+ display: flex;
5025
+ flex-direction: row;
5026
+ align-items: flex-start;
5027
+ gap: 0.5rem;
5028
+ min-width: 0;
5029
+ }
5030
+
5031
+ .issue-panel-header-title {
5032
+ overflow: hidden;
5033
+ color: #111827;
5034
+ font-weight: 600;
5035
+ font-size: 1rem;
5036
+ line-height: 1.5rem;
5037
+ text-overflow: ellipsis;
5038
+ white-space: nowrap;
5039
+ }
5040
+
5041
+ .issue-panel-header-id {
5042
+ display: inline-flex;
5043
+ align-items: center;
5044
+ gap: 0.25rem;
5045
+ flex-shrink: 0;
5046
+ padding: 0.125rem 0.5rem;
5047
+ margin-top: 0.25rem;
5048
+ color: #6b7280;
5049
+ font-weight: 600;
5050
+ font-size: 0.75rem;
5051
+ background: #f9fafb;
5052
+ border: 1px solid #e5e7eb;
5053
+ border-radius: 9999px;
5054
+ }
5055
+
5056
+ .issue-panel-header-id:hover {
5057
+ color: #2563eb;
5058
+ }
5059
+
5060
+ .issue-panel-header-meta {
5061
+ display: flex;
5062
+ flex-flow: row wrap;
5063
+ align-items: center;
5064
+ gap: 0.25rem 0.75rem;
5065
+ margin-top: 0.25rem;
5066
+ color: #6b7280;
5067
+ font-size: 0.75rem;
5068
+ }
5069
+
5070
+ .issue-panel-header-actions {
5071
+ display: flex;
5072
+ flex-shrink: 0;
5073
+ flex-direction: row;
5074
+ align-items: flex-start;
5075
+ gap: 0.5rem;
5076
+ }
5077
+
5078
+ .issue-panel-header-badges {
5079
+ display: flex;
5080
+ flex-direction: row;
5081
+ align-items: flex-start;
5082
+ gap: 0.375rem;
5083
+ }
5084
+
5085
+ .issue-detail-surface {
5086
+ padding: 1rem;
5087
+ }
5088
+
5089
+ .issue-detail-grid {
5090
+ display: grid;
5091
+ grid-template-columns: minmax(0, 1fr);
5092
+ gap: 1rem;
5093
+ }
5094
+
5095
+ .issue-detail-main {
5096
+ min-width: 0;
5097
+ }
5098
+
5099
+ .issue-detail-main > * + * {
5100
+ margin-top: 1rem;
5101
+ }
5102
+
5103
+ .issue-detail-side-rail {
5104
+ min-width: 0;
5105
+ }
5106
+
5107
+ .issue-detail-side-rail > * + * {
5108
+ margin-top: 0.75rem;
5109
+ }
5110
+
5111
+ .issue-detail-message,
5112
+ .issue-detail-correspondence,
5113
+ .issue-detail-summary-card,
5114
+ .issue-detail-side-card {
5115
+ background: #fff;
5116
+ border: 1px solid #e5e7eb;
5117
+ border-radius: 0.5rem;
5118
+ box-shadow:
5119
+ 0 4px 6px -1px rgb(0 0 0 / 10%),
5120
+ 0 2px 4px -2px rgb(0 0 0 / 10%);
5121
+ }
5122
+
5123
+ .issue-detail-summary-card {
5124
+ padding: 0.875rem 1rem;
5125
+ margin-bottom: 1rem;
5126
+ }
5127
+
5128
+ .issue-detail-summary-grid {
5129
+ display: grid;
5130
+ grid-template-columns: repeat(1, minmax(0, 1fr));
5131
+ gap: 0.625rem 1rem;
5132
+ margin: 0;
5133
+ }
5134
+
5135
+ .issue-detail-summary-item {
5136
+ min-width: 0;
5137
+ overflow: hidden;
5138
+ }
5139
+
5140
+ .issue-detail-summary-item dt {
5141
+ margin-bottom: 0.25rem;
5142
+ color: #6b7280;
5143
+ font-weight: 700;
5144
+ font-size: 0.6875rem;
5145
+ letter-spacing: 0.025em;
5146
+ text-transform: uppercase;
5147
+ }
5148
+
5149
+ .issue-detail-summary-item dd {
5150
+ min-width: 0;
5151
+ margin: 0;
5152
+ overflow: hidden;
5153
+ color: #1f2937;
5154
+ font-size: 0.8125rem;
5155
+ text-overflow: ellipsis;
5156
+ white-space: nowrap;
5157
+ }
5158
+
5159
+ .issue-detail-summary-item dd > * {
5160
+ max-width: 100%;
5161
+ min-width: 0;
5162
+ }
5163
+
5164
+ .issue-detail-inline-link {
5165
+ max-width: 100%;
5166
+ overflow: hidden;
5167
+ color: #2563eb;
5168
+ font-weight: 600;
5169
+ text-align: left;
5170
+ text-overflow: ellipsis;
5171
+ text-decoration: underline;
5172
+ text-underline-offset: 2px;
5173
+ white-space: nowrap;
5174
+ }
5175
+
5176
+ .issue-detail-message {
5177
+ display: flex;
5178
+ gap: 0.75rem;
5179
+ padding: 1rem;
5180
+ border-radius: 0.75rem;
5181
+ }
5182
+
5183
+ .issue-detail-avatar {
5184
+ display: flex;
5185
+ flex-shrink: 0;
5186
+ align-items: center;
5187
+ justify-content: center;
5188
+ width: 2.5rem;
5189
+ height: 2.5rem;
5190
+ color: #1d4ed8;
5191
+ font-weight: 700;
5192
+ font-size: 0.875rem;
5193
+ background: #dbeafe;
5194
+ border-radius: 9999px;
5195
+ box-shadow: 0 1px 2px rgb(0 0 0 / 5%);
5196
+ }
5197
+
5198
+ .issue-detail-message-content {
5199
+ flex: 1 1 0%;
5200
+ min-width: 0;
5201
+ }
5202
+
5203
+ .issue-detail-message-meta {
5204
+ display: flex;
5205
+ flex-direction: row;
5206
+ align-items: flex-start;
5207
+ justify-content: space-between;
5208
+ gap: 0.75rem;
5209
+ margin-bottom: 0.75rem;
5210
+ }
5211
+
5212
+ .issue-detail-message-author {
5213
+ color: #111827;
5214
+ font-weight: 600;
5215
+ font-size: 0.875rem;
5216
+ }
5217
+
5218
+ .issue-detail-message-subtitle,
5219
+ .issue-detail-message-meta time,
5220
+ .issue-detail-section-header p {
5221
+ color: #6b7280;
5222
+ font-size: 0.75rem;
5223
+ }
5224
+
5225
+ .issue-detail-report {
5226
+ padding: 0.75rem;
5227
+ color: #1f2937;
5228
+ font-size: 0.8125rem;
5229
+ line-height: 1.375rem;
5230
+ white-space: pre-line;
5231
+ background: #f9fafb;
5232
+ border: 1px solid #f3f4f6;
5233
+ border-radius: 0.75rem;
5234
+ }
5235
+
5236
+ .issue-detail-documents {
5237
+ padding-top: 0.75rem;
5238
+ margin-top: 1rem;
5239
+ border-top: 1px solid #f3f4f6;
5240
+ }
5241
+
5242
+ .issue-detail-documents-header {
5243
+ display: flex;
5244
+ flex-direction: row;
5245
+ align-items: center;
5246
+ justify-content: space-between;
5247
+ gap: 0.75rem;
5248
+ margin-bottom: 0.75rem;
5249
+ }
5250
+
5251
+ .issue-detail-documents-title,
5252
+ .issue-detail-section-title {
5253
+ color: #4b5563;
5254
+ font-weight: 700;
5255
+ font-size: 0.75rem;
5256
+ letter-spacing: 0.025em;
5257
+ text-transform: uppercase;
5258
+ }
5259
+
5260
+ .issue-detail-documents-title {
5261
+ display: flex;
5262
+ align-items: center;
5263
+ gap: 0.5rem;
5264
+ }
5265
+
5266
+ .issue-detail-file-grid {
5267
+ display: grid;
5268
+ grid-template-columns: repeat(2, minmax(0, 1fr));
5269
+ gap: 0.5rem;
5270
+ }
5271
+
5272
+ .issue-detail-dropzone {
5273
+ display: flex;
5274
+ align-items: center;
5275
+ justify-content: center;
5276
+ min-height: 8rem;
5277
+ padding: 1rem;
5278
+ color: #4b5563;
5279
+ text-align: center;
5280
+ background: #f9fafb;
5281
+ border: 1px dashed #d1d5db;
5282
+ border-radius: 0.75rem;
5283
+ }
5284
+
5285
+ .issue-detail-dropzone-empty,
5286
+ .issue-detail-dropzone-ready {
5287
+ display: flex;
5288
+ flex-direction: column;
5289
+ align-items: center;
5290
+ gap: 0.5rem;
5291
+ }
5292
+
5293
+ .issue-detail-dropzone-empty svg,
5294
+ .issue-detail-dropzone-ready svg {
5295
+ color: #6b7280;
5296
+ font-size: 1.25rem;
5297
+ }
5298
+
5299
+ .issue-detail-upload-link {
5300
+ color: #2563eb;
5301
+ font-weight: 600;
5302
+ text-decoration: underline;
5303
+ text-underline-offset: 2px;
5304
+ }
5305
+
5306
+ .issue-detail-dropzone-progress {
5307
+ color: #2563eb;
5308
+ font-weight: 700;
5309
+ font-size: 0.75rem;
5310
+ }
5311
+
5312
+ .issue-detail-upload-queue {
5313
+ margin-bottom: 0.75rem;
5314
+ }
5315
+
5316
+ .issue-detail-upload-queue > * + * {
5317
+ margin-top: 0.5rem;
5318
+ }
5319
+
5320
+ .issue-detail-upload-row {
5321
+ display: flex;
5322
+ align-items: center;
5323
+ justify-content: space-between;
5324
+ padding: 0.5rem 0.75rem;
5325
+ color: #1e3a8a;
5326
+ font-size: 0.75rem;
5327
+ background: #eff6ff;
5328
+ border: 1px solid #bfdbfe;
5329
+ border-radius: 0.375rem;
5330
+ }
5331
+
5332
+ .issue-detail-correspondence {
5333
+ padding: 1rem;
5334
+ }
5335
+
5336
+ .issue-detail-section-header {
5337
+ display: flex;
5338
+ align-items: flex-start;
5339
+ justify-content: space-between;
5340
+ margin-bottom: 0.75rem;
5341
+ }
5342
+
5343
+ .issue-detail-comment-thread {
5344
+ font-size: 0.875rem;
5345
+ }
5346
+
5347
+ .issue-detail-side-card {
5348
+ padding: 0.75rem;
5349
+ }
5350
+
5351
+ .issue-detail-resolution-state {
5352
+ display: flex;
5353
+ gap: 0.75rem;
5354
+ padding: 0.75rem;
5355
+ margin-top: 0.75rem;
5356
+ background: #fffbeb;
5357
+ border: 1px solid #fde68a;
5358
+ border-radius: 0.5rem;
5359
+ }
5360
+
5361
+ .issue-detail-resolution-state.is-resolved {
5362
+ background: #f0fdf4;
5363
+ border-color: #bbf7d0;
5364
+ }
5365
+
5366
+ .issue-detail-resolution-icon {
5367
+ display: flex;
5368
+ flex-shrink: 0;
5369
+ align-items: center;
5370
+ justify-content: center;
5371
+ width: 2rem;
5372
+ height: 2rem;
5373
+ color: #b45309;
5374
+ background: #fef3c7;
5375
+ border-radius: 9999px;
5376
+ }
5377
+
5378
+ .issue-detail-resolution-state.is-resolved .issue-detail-resolution-icon {
5379
+ color: #15803d;
5380
+ background: #dcfce7;
5381
+ }
5382
+
5383
+ .issue-detail-resolution-title {
5384
+ color: #111827;
5385
+ font-weight: 600;
5386
+ font-size: 0.875rem;
5387
+ }
5388
+
5389
+ .issue-detail-resolution-state p {
5390
+ margin-top: 0.25rem;
5391
+ color: #6b7280;
5392
+ font-size: 0.75rem;
5393
+ line-height: 1.25rem;
5394
+ }
5395
+
5396
+ .issue-detail-meta-list {
5397
+ margin-top: 0.75rem;
5398
+ }
5399
+
5400
+ .issue-detail-meta-list > * + * {
5401
+ margin-top: 0.5rem;
5402
+ }
5403
+
5404
+ .issue-detail-meta-list > div {
5405
+ display: flex;
5406
+ align-items: center;
5407
+ justify-content: space-between;
5408
+ gap: 0.75rem;
5409
+ padding-top: 0.5rem;
5410
+ border-top: 1px dashed #e5e7eb;
5411
+ }
5412
+
5413
+ .issue-detail-meta-list dt,
5414
+ .issue-detail-resource-label,
5415
+ .issue-detail-timeline-label {
5416
+ color: #6b7280;
5417
+ font-weight: 600;
5418
+ font-size: 0.75rem;
5419
+ letter-spacing: 0.025em;
5420
+ text-transform: uppercase;
5421
+ }
5422
+
5423
+ .issue-detail-meta-list dd {
5424
+ color: #1f2937;
5425
+ font-size: 0.875rem;
5426
+ text-align: right;
5427
+ }
5428
+
5429
+ .issue-detail-resource-stack {
5430
+ margin-top: 0.75rem;
5431
+ }
5432
+
5433
+ .issue-detail-resource-stack > * + * {
5434
+ margin-top: 0.75rem;
5435
+ }
5436
+
5437
+ .issue-detail-resource-row {
5438
+ display: block;
5439
+ }
5440
+
5441
+ .issue-detail-resource-row > * + * {
5442
+ margin-top: 0.375rem;
5443
+ }
5444
+
5445
+ .issue-detail-order-card {
5446
+ display: block;
5447
+ width: 100%;
5448
+ padding: 0.75rem;
5449
+ margin-top: 0.75rem;
5450
+ overflow: hidden;
5451
+ text-align: left;
5452
+ background: #f9fafb;
5453
+ border: 1px solid #e5e7eb;
5454
+ border-radius: 0.5rem;
5455
+ box-shadow: 0 1px 2px rgb(0 0 0 / 5%);
5456
+ transition:
5457
+ background-color 0.15s ease,
5458
+ border-color 0.15s ease;
5459
+ }
5460
+
5461
+ .issue-detail-order-card:hover {
5462
+ background: #eff6ff;
5463
+ border-color: #93c5fd;
5464
+ }
5465
+
5466
+ .issue-detail-order-topline,
5467
+ .issue-detail-order-meta {
5468
+ display: flex;
5469
+ align-items: center;
5470
+ justify-content: space-between;
5471
+ gap: 0.5rem;
5472
+ }
5473
+
5474
+ .issue-detail-order-title-block {
5475
+ min-width: 0;
5476
+ }
5477
+
5478
+ .issue-detail-order-title {
5479
+ overflow: hidden;
5480
+ color: #111827;
5481
+ font-weight: 600;
5482
+ font-size: 0.875rem;
5483
+ text-overflow: ellipsis;
5484
+ white-space: nowrap;
5485
+ }
5486
+
5487
+ .issue-detail-order-subtitle,
5488
+ .issue-detail-order-meta,
5489
+ .issue-detail-timeline-value,
5490
+ .issue-detail-coordinate {
5491
+ color: #6b7280;
5492
+ font-size: 0.75rem;
5493
+ }
5494
+
5495
+ .issue-detail-order-progress {
5496
+ position: relative;
5497
+ height: 0.25rem;
5498
+ margin: 0.625rem 0 0.75rem;
5499
+ overflow: hidden;
5500
+ background: #e5e7eb;
5501
+ border-radius: 9999px;
5502
+ }
5503
+
5504
+ .issue-detail-order-progress span {
5505
+ position: absolute;
5506
+ inset: 0 auto 0 0;
5507
+ background: #3485e2;
5508
+ border-radius: inherit;
5509
+ }
5510
+
5511
+ .issue-detail-order-progress.is-pending span {
5512
+ width: 22%;
5513
+ background: #94a3b8;
5514
+ }
5515
+
5516
+ .issue-detail-order-progress.is-active span {
5517
+ width: 58%;
5518
+ }
5519
+
5520
+ .issue-detail-order-progress.is-complete span {
5521
+ width: 100%;
5522
+ background: #10b981;
5523
+ }
5524
+
5525
+ .issue-detail-order-route {
5526
+ display: grid;
5527
+ gap: 0.5rem;
5528
+ color: #64748b;
5529
+ font-size: 0.75rem;
5530
+ }
5531
+
5532
+ .issue-detail-order-stop {
5533
+ display: grid;
5534
+ grid-template-columns: 1.5rem minmax(0, 1fr);
5535
+ gap: 0.5rem;
5536
+ align-items: start;
5537
+ }
5538
+
5539
+ .issue-detail-order-stop.compact {
5540
+ opacity: 0.88;
5541
+ }
5542
+
5543
+ .issue-detail-order-stop-marker {
5544
+ display: inline-flex;
5545
+ align-items: center;
5546
+ justify-content: center;
5547
+ width: 1.5rem;
5548
+ height: 1.5rem;
5549
+ color: #fff;
5550
+ font-weight: 800;
5551
+ font-size: 0.6875rem;
5552
+ background: #64748b;
5553
+ border-radius: 9999px;
5554
+ }
5555
+
5556
+ .issue-detail-order-stop-marker.pickup {
5557
+ background: #3485e2;
5558
+ }
5559
+
5560
+ .issue-detail-order-stop-marker.dropoff {
5561
+ background: #10b981;
5562
+ }
5563
+
5564
+ .issue-detail-order-stop-marker.middle {
5565
+ color: #2563eb;
5566
+ background: #dbeafe;
5567
+ }
5568
+
5569
+ .issue-detail-order-stop-label {
5570
+ color: #94a3b8;
5571
+ font-weight: 700;
5572
+ font-size: 0.625rem;
5573
+ text-transform: uppercase;
5574
+ }
5575
+
5576
+ .issue-detail-order-stop-address {
5577
+ overflow: hidden;
5578
+ color: #334155;
5579
+ font-weight: 700;
5580
+ font-size: 0.75rem;
5581
+ line-height: 1.2rem;
5582
+ text-overflow: ellipsis;
5583
+ white-space: nowrap;
5584
+ }
5585
+
5586
+ .issue-detail-order-meta {
5587
+ flex-flow: row wrap;
5588
+ justify-content: flex-start;
5589
+ margin-top: 0.75rem;
5590
+ font-size: 0.6875rem;
5591
+ }
5592
+
5593
+ .issue-detail-order-meta span {
5594
+ display: inline-flex;
5595
+ align-items: center;
5596
+ gap: 0.25rem;
5597
+ }
5598
+
5599
+ .issue-detail-empty {
5600
+ display: flex;
5601
+ align-items: center;
5602
+ justify-content: center;
5603
+ gap: 0.5rem;
5604
+ padding: 1rem;
5605
+ margin-top: 0.75rem;
5606
+ color: #6b7280;
5607
+ font-size: 0.875rem;
5608
+ background: #f9fafb;
5609
+ border: 1px dashed #e5e7eb;
5610
+ border-radius: 0.5rem;
5611
+ }
5612
+
5613
+ .issue-detail-empty-compact {
5614
+ padding: 0.75rem;
5615
+ font-size: 0.75rem;
5616
+ }
5617
+
5618
+ .issue-detail-tags {
5619
+ display: flex;
5620
+ flex-flow: row wrap;
5621
+ gap: 0.375rem;
5622
+ margin-top: 0.75rem;
5623
+ }
5624
+
5625
+ .issue-detail-timeline {
5626
+ margin-top: 0.75rem;
5627
+ }
5628
+
5629
+ .issue-detail-timeline > * + * {
5630
+ margin-top: 0.75rem;
5631
+ }
5632
+
5633
+ .issue-detail-timeline li {
5634
+ display: flex;
5635
+ gap: 0.75rem;
5636
+ }
5637
+
5638
+ .issue-detail-timeline-marker {
5639
+ display: flex;
5640
+ flex-shrink: 0;
5641
+ align-items: center;
5642
+ justify-content: center;
5643
+ width: 1.75rem;
5644
+ height: 1.75rem;
5645
+ color: #6b7280;
5646
+ font-size: 0.75rem;
5647
+ background: #f9fafb;
5648
+ border: 1px solid #e5e7eb;
5649
+ border-radius: 9999px;
5650
+ }
5651
+
5652
+ .issue-timeline {
5653
+ margin-top: 0.75rem;
5654
+ }
5655
+
5656
+ .issue-timeline-loading {
5657
+ display: flex;
5658
+ justify-content: center;
5659
+ padding: 1rem;
5660
+ }
5661
+
5662
+ .issue-timeline-list {
5663
+ position: relative;
5664
+ display: flex;
5665
+ flex-direction: column;
5666
+ gap: 0.875rem;
5667
+ margin: 0;
5668
+ padding: 0;
5669
+ list-style: none;
5670
+ }
5671
+
5672
+ .issue-timeline-list::before {
5673
+ position: absolute;
5674
+ top: 0.875rem;
5675
+ bottom: 0.875rem;
5676
+ left: 0.875rem;
5677
+ width: 1px;
5678
+ background: #d1d5db;
5679
+ content: '';
5680
+ }
5681
+
5682
+ .issue-timeline-event {
5683
+ position: relative;
5684
+ display: grid;
5685
+ grid-template-columns: 1.75rem minmax(0, 1fr);
5686
+ gap: 0.75rem;
5687
+ }
5688
+
5689
+ .issue-timeline-marker {
5690
+ z-index: 1;
5691
+ display: flex;
5692
+ align-items: center;
5693
+ justify-content: center;
5694
+ width: 1.75rem;
5695
+ height: 1.75rem;
5696
+ color: #4b5563;
5697
+ font-size: 0.75rem;
5698
+ background: #fff;
5699
+ border: 1px solid #d1d5db;
5700
+ border-radius: 9999px;
5701
+ }
5702
+
5703
+ .issue-timeline-card {
5704
+ padding: 0.625rem 0.75rem;
5705
+ background: #f9fafb;
5706
+ border: 1px solid #e5e7eb;
5707
+ border-radius: 0.625rem;
5708
+ }
5709
+
5710
+ .issue-timeline-card-header {
5711
+ display: flex;
5712
+ align-items: flex-start;
5713
+ justify-content: space-between;
5714
+ gap: 0.75rem;
5715
+ }
5716
+
5717
+ .issue-timeline-label {
5718
+ color: #111827;
5719
+ font-weight: 600;
5720
+ font-size: 0.8125rem;
5721
+ line-height: 1.25rem;
5722
+ }
5723
+
5724
+ .issue-timeline-actor,
5725
+ .issue-timeline-card time,
5726
+ .issue-timeline-card p {
5727
+ color: #6b7280;
5728
+ font-size: 0.75rem;
5729
+ line-height: 1.125rem;
5730
+ }
5731
+
5732
+ .issue-timeline-card p {
5733
+ margin-top: 0.375rem;
5734
+ }
5735
+
5736
+ .issue-timeline-link {
5737
+ display: inline-flex;
5738
+ align-items: center;
5739
+ gap: 0.375rem;
5740
+ margin-top: 0.5rem;
5741
+ color: #2563eb;
5742
+ font-weight: 600;
5743
+ font-size: 0.75rem;
5744
+ }
5745
+
5746
+ .issue-timeline-event.tone-green .issue-timeline-marker {
5747
+ color: #15803d;
5748
+ border-color: #86efac;
5749
+ }
5750
+
5751
+ .issue-timeline-event.tone-blue .issue-timeline-marker {
5752
+ color: #2563eb;
5753
+ border-color: #93c5fd;
5754
+ }
5755
+
5756
+ .issue-timeline-event.tone-orange .issue-timeline-marker {
5757
+ color: #d97706;
5758
+ border-color: #fcd34d;
5759
+ }
5760
+
5761
+ .issue-timeline-event.tone-red .issue-timeline-marker {
5762
+ color: #dc2626;
5763
+ border-color: #fca5a5;
5764
+ }
5765
+
5766
+ .issue-timeline-event.tone-purple .issue-timeline-marker,
5767
+ .issue-timeline-event.tone-indigo .issue-timeline-marker {
5768
+ color: #4f46e5;
5769
+ border-color: #a5b4fc;
5770
+ }
5771
+
5772
+ .issue-detail-custom-fields {
5773
+ display: block;
5774
+ }
5775
+
5776
+ @media (width >= 768px) {
5777
+ .issue-detail-summary-grid {
5778
+ grid-template-columns: repeat(2, minmax(0, 1fr));
5779
+ }
5780
+
5781
+ .issue-detail-grid {
5782
+ grid-template-columns: repeat(5, minmax(0, 1fr));
5783
+ }
5784
+
5785
+ .issue-detail-main {
5786
+ grid-column: span 3 / span 3;
5787
+ }
5788
+
5789
+ .issue-detail-side-rail {
5790
+ grid-column: span 2 / span 2;
5791
+ }
5792
+ }
5793
+
5794
+ @media (width >= 1180px) {
5795
+ .issue-detail-summary-grid {
5796
+ grid-template-columns: repeat(4, minmax(0, 1fr));
5797
+ }
5798
+ }
5799
+
5800
+ body[data-theme='dark'] .issue-panel-header {
5801
+ background: #111827;
5802
+ border-color: #374151;
5803
+ }
5804
+
5805
+ body[data-theme='dark'] .issue-detail-message,
5806
+ body[data-theme='dark'] .issue-detail-correspondence,
5807
+ body[data-theme='dark'] .issue-detail-summary-card,
5808
+ body[data-theme='dark'] .issue-detail-side-card {
5809
+ background: #1f2937;
5810
+ border-color: #374151;
5811
+ box-shadow:
5812
+ 0 10px 15px -3px rgb(0 0 0 / 20%),
5813
+ 0 4px 6px -4px rgb(0 0 0 / 20%);
5814
+ }
5815
+
5816
+ body[data-theme='dark'] .issue-panel-header-icon {
5817
+ background: #111827;
5818
+ border-color: #374151;
5819
+ }
5820
+
5821
+ body[data-theme='dark'] .issue-detail-report,
5822
+ body[data-theme='dark'] .issue-detail-resolution-state,
5823
+ body[data-theme='dark'] .issue-detail-order-card,
5824
+ body[data-theme='dark'] .issue-detail-empty,
5825
+ body[data-theme='dark'] .issue-detail-timeline-marker {
5826
+ background: #374151;
5827
+ border-color: #374151;
5828
+ }
5829
+
5830
+ body[data-theme='dark'] .issue-panel-header-title,
5831
+ body[data-theme='dark'] .issue-detail-message-author,
5832
+ body[data-theme='dark'] .issue-detail-resolution-title,
5833
+ body[data-theme='dark'] .issue-detail-meta-list dd,
5834
+ body[data-theme='dark'] .issue-detail-summary-item dd,
5835
+ body[data-theme='dark'] .issue-detail-order-title,
5836
+ body[data-theme='dark'] .issue-detail-order-stop-address,
5837
+ body[data-theme='dark'] .issue-detail-report {
5838
+ color: #f9fafb;
5839
+ }
5840
+
5841
+ body[data-theme='dark'] .issue-panel-header-meta,
5842
+ body[data-theme='dark'] .issue-detail-message-subtitle,
5843
+ body[data-theme='dark'] .issue-detail-message-meta time,
5844
+ body[data-theme='dark'] .issue-detail-section-header p,
5845
+ body[data-theme='dark'] .issue-detail-resolution-state p,
5846
+ body[data-theme='dark'] .issue-detail-meta-list dt,
5847
+ body[data-theme='dark'] .issue-detail-summary-item dt,
5848
+ body[data-theme='dark'] .issue-detail-resource-label,
5849
+ body[data-theme='dark'] .issue-detail-timeline-label,
5850
+ body[data-theme='dark'] .issue-detail-order-subtitle,
5851
+ body[data-theme='dark'] .issue-detail-order-route,
5852
+ body[data-theme='dark'] .issue-detail-order-meta,
5853
+ body[data-theme='dark'] .issue-detail-timeline-value,
5854
+ body[data-theme='dark'] .issue-detail-coordinate,
5855
+ body[data-theme='dark'] .issue-detail-empty {
5856
+ color: #9ca3af;
5857
+ }
5858
+
5859
+ body[data-theme='dark'] .issue-panel-header-id {
5860
+ color: #9ca3af;
5861
+ background: #111827;
5862
+ border-color: #374151;
5863
+ }
5864
+
5865
+ body[data-theme='dark'] .issue-panel-header-id:hover {
5866
+ color: #93c5fd;
5867
+ }
5868
+
5869
+ body[data-theme='dark'] .issue-detail-documents {
5870
+ border-top-color: #374151;
5871
+ }
5872
+
5873
+ body[data-theme='dark'] .issue-detail-documents-title,
5874
+ body[data-theme='dark'] .issue-detail-section-title {
5875
+ color: #d1d5db;
5876
+ }
5877
+
5878
+ body[data-theme='dark'] .issue-detail-upload-row {
5879
+ color: #dbeafe;
5880
+ background: #1e3a8a;
5881
+ border-color: #1e40af;
5882
+ }
5883
+
5884
+ body[data-theme='dark'] .issue-detail-resolution-icon {
5885
+ color: #fde68a;
5886
+ background: #78350f;
5887
+ }
5888
+
5889
+ body[data-theme='dark'] .issue-detail-resolution-state.is-resolved .issue-detail-resolution-icon {
5890
+ color: #bbf7d0;
5891
+ background: #14532d;
5892
+ }
5893
+
5894
+ body[data-theme='dark'] .issue-detail-meta-list > div {
5895
+ border-top-color: #374151;
5896
+ }
5897
+
5898
+ body[data-theme='dark'] .issue-detail-order-card:hover {
5899
+ background: #374151;
5900
+ border-color: #2563eb;
5901
+ }
5902
+
5903
+ body[data-theme='dark'] .issue-detail-avatar {
5904
+ color: #bfdbfe;
5905
+ background: #1e3a8a;
5906
+ }
5907
+
5908
+ body[data-theme='dark'] .issue-detail-order-progress {
5909
+ background: #4b5563;
5910
+ }
5911
+
5912
+ body[data-theme='dark'] .issue-detail-order-stop-marker.middle {
5913
+ color: #93c5fd;
5914
+ background: rgb(37 99 235 / 24%);
5915
+ }
5916
+
5917
+ body[data-theme='dark'] .issue-detail-dropzone {
5918
+ color: #d1d5db;
5919
+ background: #1f2937;
5920
+ border-color: #4b5563;
5921
+ }
5922
+
5923
+ body[data-theme='dark'] .issue-detail-dropzone-empty svg,
5924
+ body[data-theme='dark'] .issue-detail-dropzone-ready svg {
5925
+ color: #d1d5db;
5926
+ }
5927
+
5928
+ body[data-theme='dark'] .issue-detail-upload-link,
5929
+ body[data-theme='dark'] .issue-detail-dropzone-progress,
5930
+ body[data-theme='dark'] .issue-timeline-link {
5931
+ color: #93c5fd;
5932
+ }
5933
+
5934
+ body[data-theme='dark'] .issue-timeline-list::before {
5935
+ background: #4b5563;
5936
+ }
5937
+
5938
+ body[data-theme='dark'] .issue-timeline-marker,
5939
+ body[data-theme='dark'] .issue-timeline-card {
5940
+ background: #1f2937;
5941
+ border-color: #4b5563;
5942
+ }
5943
+
5944
+ body[data-theme='dark'] .issue-timeline-label {
5945
+ color: #f9fafb;
5946
+ }
5947
+
5948
+ body[data-theme='dark'] .issue-timeline-actor,
5949
+ body[data-theme='dark'] .issue-timeline-card time,
5950
+ body[data-theme='dark'] .issue-timeline-card p {
5951
+ color: #d1d5db;
5952
+ }