adp-web-components 0.3.21 → 0.4.0

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 (384) hide show
  1. package/dist/cjs/branch-date-dropdown_17.cjs.entry.js +35 -35
  2. package/dist/cjs/dead-stock-lookup_3.cjs.entry.js +9 -9
  3. package/dist/cjs/flexible-container.cjs.entry.js +5 -23
  4. package/dist/cjs/form-checkbox.cjs.entry.js +2 -2
  5. package/dist/cjs/form-date-picker.cjs.entry.js +5 -5
  6. package/dist/cjs/form-input_7.cjs.entry.js +17 -17
  7. package/dist/cjs/form-switch.cjs.entry.js +2 -2
  8. package/dist/cjs/form-time-picker.cjs.entry.js +6 -6
  9. package/dist/cjs/{functions-COlPGX7F.js → functions-gb1i8Hkl.js} +1 -1
  10. package/dist/cjs/general-form.cjs.entry.js +4 -4
  11. package/dist/cjs/general-inquiry-form.cjs.entry.js +4 -4
  12. package/dist/cjs/{get-local-language-rWhci9Es.js → get-local-language-CZeC0BN9.js} +4 -4
  13. package/dist/cjs/{get-mock-files-Cceb_318.js → get-mock-files-NMHm1Vgn.js} +1 -1
  14. package/dist/cjs/information-table.cjs.entry.js +24 -12
  15. package/dist/cjs/loader.cjs.js +1 -1
  16. package/dist/cjs/loading-spinner.cjs.entry.js +2 -2
  17. package/dist/cjs/manufacturer-part-lookup.cjs.entry.js +3 -3
  18. package/dist/cjs/parents-with-tag-CV2Y9Chq.js +26 -0
  19. package/dist/cjs/part-lookup.cjs.entry.js +2 -2
  20. package/dist/cjs/reveal-below-CyYolTYX.js +127 -0
  21. package/dist/cjs/service-booking-form.cjs.entry.js +4 -4
  22. package/dist/cjs/shift-accordion.cjs.entry.js +2 -2
  23. package/dist/cjs/shift-checkbox.cjs.entry.js +2 -2
  24. package/dist/cjs/shift-components.cjs.js +1 -1
  25. package/dist/cjs/shift-slider.cjs.entry.js +1 -1
  26. package/dist/cjs/shift-switch.cjs.entry.js +2 -2
  27. package/dist/cjs/shift-tab-content.cjs.entry.js +2 -2
  28. package/dist/cjs/shift-tabs_2.cjs.entry.js +10 -10
  29. package/dist/cjs/ssc-lookup-form.cjs.entry.js +4 -4
  30. package/dist/cjs/test-drive-form.cjs.entry.js +4 -4
  31. package/dist/cjs/{type-BHyLb1S8.js → type-CTsARyVi.js} +63 -18
  32. package/dist/cjs/vehicle-accessories_8.cjs.entry.js +819 -204
  33. package/dist/cjs/vehicle-lookup.cjs.entry.js +56 -40
  34. package/dist/cjs/vehicle-quotation-form.cjs.entry.js +4 -4
  35. package/dist/collection/collection-manifest.json +1 -1
  36. package/dist/collection/components/components/empty.css +1 -1
  37. package/dist/collection/components/components/flexible-container.css +1 -1
  38. package/dist/collection/components/components/flexible-container.js +2 -2
  39. package/dist/collection/components/components/information-table.css +1 -1
  40. package/dist/collection/components/components/information-table.js +21 -8
  41. package/dist/collection/components/components/loading-spinner.css +1 -1
  42. package/dist/collection/components/components/loading-spinner.js +1 -1
  43. package/dist/collection/components/components/shift-accordion.css +1 -1
  44. package/dist/collection/components/components/shift-accordion.js +1 -1
  45. package/dist/collection/components/components/shift-checkbox.js +1 -1
  46. package/dist/collection/components/components/shift-portal.css +1 -1
  47. package/dist/collection/components/components/shift-select-dropdown.css +1 -1
  48. package/dist/collection/components/components/shift-select-dropdown.js +2 -2
  49. package/dist/collection/components/components/shift-select.css +1 -1
  50. package/dist/collection/components/components/shift-select.js +3 -3
  51. package/dist/collection/components/components/shift-slider.js +1 -1
  52. package/dist/collection/components/components/shift-switch.js +1 -1
  53. package/dist/collection/components/components/shift-tab-content.css +1 -1
  54. package/dist/collection/components/components/shift-tab-content.js +1 -1
  55. package/dist/collection/components/components/shift-tabs.css +1 -1
  56. package/dist/collection/components/components/shift-tabs.js +2 -2
  57. package/dist/collection/components/form-elements/branch-date-dropdown.js +2 -2
  58. package/dist/collection/components/form-elements/branch-date-picker.js +2 -2
  59. package/dist/collection/components/form-elements/branch-slot-dropdown.js +1 -1
  60. package/dist/collection/components/form-elements/branch-slot-picker.js +2 -2
  61. package/dist/collection/components/form-elements/form-checkbox.js +1 -1
  62. package/dist/collection/components/form-elements/form-date-picker-legacy.js +4 -4
  63. package/dist/collection/components/form-elements/form-dialog.js +1 -1
  64. package/dist/collection/components/form-elements/form-file.js +2 -2
  65. package/dist/collection/components/form-elements/form-input.js +2 -2
  66. package/dist/collection/components/form-elements/form-inputs.css +1 -1
  67. package/dist/collection/components/form-elements/form-picker-input.js +2 -2
  68. package/dist/collection/components/form-elements/form-shadow-input.js +1 -1
  69. package/dist/collection/components/form-elements/form-stepper-control.js +2 -2
  70. package/dist/collection/components/form-elements/form-stepper-submit.js +2 -2
  71. package/dist/collection/components/form-elements/form-stepper.js +1 -1
  72. package/dist/collection/components/form-elements/form-structure-error.js +1 -1
  73. package/dist/collection/components/form-elements/form-submit.js +2 -2
  74. package/dist/collection/components/form-elements/form-switch.js +1 -1
  75. package/dist/collection/components/form-elements/form-text-area.js +2 -2
  76. package/dist/collection/components/form-elements/form-time-picker-legacy.js +5 -5
  77. package/dist/collection/components/form-elements/form-vin-input.js +2 -2
  78. package/dist/collection/components/forms/general-form.js +2 -2
  79. package/dist/collection/components/forms/general-inquiry.js +2 -2
  80. package/dist/collection/components/forms/service-booking.js +2 -2
  81. package/dist/collection/components/forms/ssc-lookup.js +2 -2
  82. package/dist/collection/components/forms/test-drive.js +2 -2
  83. package/dist/collection/components/forms/vehicle-quotation.js +2 -2
  84. package/dist/collection/components/part-lookup/dead-stock-lookup.css +1 -1
  85. package/dist/collection/components/part-lookup/dead-stock-lookup.js +2 -2
  86. package/dist/collection/components/part-lookup/distributor-lookup.css +1 -1
  87. package/dist/collection/components/part-lookup/distributor-lookup.js +2 -2
  88. package/dist/collection/components/part-lookup/manufacturer-lookup.css +1 -1
  89. package/dist/collection/components/part-lookup/manufacturer-part-lookup.css +1 -1
  90. package/dist/collection/components/part-lookup/manufacturer-part-lookup.js +1 -1
  91. package/dist/collection/components/part-lookup/part-lookup.css +1 -1
  92. package/dist/collection/components/vehicle-lookup/components/CoverageTimeline.js +5 -8
  93. package/dist/collection/components/vehicle-lookup/components/SscCampaigns.js +236 -0
  94. package/dist/collection/components/vehicle-lookup/components/glyphs.js +19 -0
  95. package/dist/collection/components/vehicle-lookup/vehicle-accessories.css +1 -1
  96. package/dist/collection/components/vehicle-lookup/vehicle-accessories.js +3 -3
  97. package/dist/collection/components/vehicle-lookup/vehicle-claimable-items.css +1 -1
  98. package/dist/collection/components/vehicle-lookup/vehicle-claimable-items.js +61 -9
  99. package/dist/collection/components/vehicle-lookup/vehicle-item-claim-form.css +1 -1
  100. package/dist/collection/components/vehicle-lookup/vehicle-item-claim-form.js +6 -6
  101. package/dist/collection/components/vehicle-lookup/vehicle-lookup.css +1 -1
  102. package/dist/collection/components/vehicle-lookup/vehicle-lookup.js +99 -59
  103. package/dist/collection/components/vehicle-lookup/vehicle-paint-thickness.css +1 -1
  104. package/dist/collection/components/vehicle-lookup/vehicle-paint-thickness.js +1 -1
  105. package/dist/collection/components/vehicle-lookup/vehicle-sale-information.css +1 -1
  106. package/dist/collection/components/vehicle-lookup/vehicle-sale-information.js +3 -3
  107. package/dist/collection/components/vehicle-lookup/vehicle-service-history.css +1 -1
  108. package/dist/collection/components/vehicle-lookup/vehicle-service-history.js +2 -2
  109. package/dist/collection/components/vehicle-lookup/vehicle-specification.css +1 -1
  110. package/dist/collection/components/vehicle-lookup/vehicle-specification.js +2 -2
  111. package/dist/collection/components/vehicle-lookup/vehicle-ssc.css +1 -0
  112. package/dist/collection/components/vehicle-lookup/{vehicle-warranty-details.js → vehicle-ssc.js} +583 -189
  113. package/dist/collection/components/vehicle-lookup/vehicle-warranty-timeline.css +1 -1
  114. package/dist/collection/components/vehicle-lookup/vehicle-warranty-timeline.js +5 -6
  115. package/dist/collection/components/vin-extractor/vin-extractor.js +1 -1
  116. package/dist/collection/features/vehicle-lookup-component/index.js +1 -0
  117. package/dist/collection/features/vehicle-lookup-component/request-headers.js +42 -0
  118. package/dist/collection/features/vehicle-lookup-component/vehicle-lookup-api-integration.js +9 -7
  119. package/dist/collection/global/lib/flexible-parents.js +46 -0
  120. package/dist/collection/global/lib/reveal-below.js +118 -0
  121. package/dist/collection/global/types/generated/vehicle-lookup/ssc-repair-trace-dto.js +1 -0
  122. package/dist/collection/global/types/generated/vehicle-lookup/ssc-repair-trace-labor-code-dto.js +1 -0
  123. package/dist/collection/global/types/generated/vehicle-lookup/ssc-repair-trace-labor-line-dto.js +1 -0
  124. package/dist/collection/global/types/generated/vehicle-lookup/ssc-repair-trace-warranty-claim-dto.js +1 -0
  125. package/dist/collection/locale-mapper.js +3 -3
  126. package/dist/collection/locales/vehicleLookup/ssc/type.js +70 -0
  127. package/dist/collection/locales/vehicleLookup/wrapper-type.js +2 -2
  128. package/dist/collection/templates/harness.js +3 -1
  129. package/dist/components/branch-date-dropdown.js +1 -1
  130. package/dist/components/branch-date-picker.js +1 -1
  131. package/dist/components/branch-slot-dropdown.js +1 -1
  132. package/dist/components/branch-slot-picker.js +1 -1
  133. package/dist/components/dead-stock-lookup.js +1 -1
  134. package/dist/components/distributor-lookup.js +1 -1
  135. package/dist/components/flexible-container.js +1 -1
  136. package/dist/components/form-checkbox.js +1 -1
  137. package/dist/components/form-date-picker.js +1 -1
  138. package/dist/components/form-dialog.js +1 -1
  139. package/dist/components/form-file.js +1 -1
  140. package/dist/components/form-input-preview.js +1 -1
  141. package/dist/components/form-input.js +1 -1
  142. package/dist/components/form-phone-number.js +1 -1
  143. package/dist/components/form-picker-input.js +1 -1
  144. package/dist/components/form-select.js +1 -1
  145. package/dist/components/form-shadow-input.js +1 -1
  146. package/dist/components/form-stepper-control.js +1 -1
  147. package/dist/components/form-stepper-submit.js +1 -1
  148. package/dist/components/form-stepper.js +1 -1
  149. package/dist/components/form-structure-error.js +1 -1
  150. package/dist/components/form-structure.js +1 -1
  151. package/dist/components/form-submit.js +1 -1
  152. package/dist/components/form-switch.js +1 -1
  153. package/dist/components/form-text-area.js +1 -1
  154. package/dist/components/form-time-picker.js +1 -1
  155. package/dist/components/form-vin-input.js +1 -1
  156. package/dist/components/general-form.js +1 -1
  157. package/dist/components/general-inquiry-form.js +1 -1
  158. package/dist/components/information-table.js +1 -1
  159. package/dist/components/loading-spinner.js +1 -1
  160. package/dist/components/manufacturer-lookup.js +1 -1
  161. package/dist/components/manufacturer-part-lookup.js +1 -1
  162. package/dist/components/{p-CmIFPUXD.js → p-AkWKeTFc.js} +1 -1
  163. package/dist/components/{p-UeoCFDF-.js → p-B2Rwfoy0.js} +1 -1
  164. package/dist/components/p-B4nj03om.js +5 -0
  165. package/dist/components/p-BAkLdLKZ.js +5 -0
  166. package/dist/components/p-BDCBfHZQ.js +5 -0
  167. package/dist/components/{p-CDdYNb7K.js → p-BDOUh9fr.js} +1 -1
  168. package/dist/components/p-BGf2deKN.js +5 -0
  169. package/dist/components/{p-40jijfEq.js → p-BNmsN10T.js} +1 -1
  170. package/dist/components/{p-CYuQunRn.js → p-BOaqSzZZ.js} +1 -1
  171. package/dist/components/p-B_1NtFJh.js +5 -0
  172. package/dist/components/{p-C1I6zBo7.js → p-BhekdMkM.js} +1 -1
  173. package/dist/components/p-BpZlI-gl.js +5 -0
  174. package/dist/components/p-BtipOZUG.js +5 -0
  175. package/dist/components/{p-BcbFXFPI.js → p-BvM3siIc.js} +1 -1
  176. package/dist/components/{p-CXigg5tn.js → p-BwoBk7eI.js} +1 -1
  177. package/dist/components/{p-Dl0BmrLe.js → p-BxGye2qd.js} +1 -1
  178. package/dist/components/{p-DaQOYb2R.js → p-BySGDlQi.js} +1 -1
  179. package/dist/components/{p-3kY-T9ID.js → p-ByrX91PC.js} +1 -1
  180. package/dist/components/p-C9uBduBY.js +5 -0
  181. package/dist/components/{p-BoQgpmtN.js → p-CETvww16.js} +1 -1
  182. package/dist/components/{p-HpXp7TBt.js → p-CT-MbmyW.js} +1 -1
  183. package/dist/components/p-CUO3vXQr.js +5 -0
  184. package/dist/components/{p-OdEwTuBq.js → p-CbRoCi89.js} +1 -1
  185. package/dist/components/{p-BgJljKxp.js → p-CebvOd8T.js} +1 -1
  186. package/dist/components/{p-CjdYtmBI.js → p-Cy8khSKP.js} +1 -1
  187. package/dist/components/{p-DDhVlLOx.js → p-D4VK-Fv7.js} +1 -1
  188. package/dist/components/p-D4aXUm2Y.js +5 -0
  189. package/dist/components/{p-CU0gZwVU.js → p-D8w2fZLP.js} +1 -1
  190. package/dist/components/p-DCO6piZ9.js +5 -0
  191. package/dist/components/{p-CE9wNugx.js → p-DConDqrK.js} +1 -1
  192. package/dist/components/{p-Wfd6v4yE.js → p-DDTSLfBG.js} +1 -1
  193. package/dist/components/{p-Dd_3uKgv.js → p-DJDhhX5A.js} +1 -1
  194. package/dist/components/p-DKWqzBVM.js +5 -0
  195. package/dist/components/{p-O0AragmD.js → p-DOIpj5PH.js} +1 -1
  196. package/dist/components/{p-BwKzJeLy.js → p-DVkAlTjC.js} +1 -1
  197. package/dist/components/p-D_uU2Pi-.js +5 -0
  198. package/dist/components/{p-DFKEx7TJ.js → p-DfVskL_i.js} +1 -1
  199. package/dist/components/p-DkCqJ072.js +5 -0
  200. package/dist/components/p-DpuHkgw0.js +5 -0
  201. package/dist/components/{p-Ce2mazYo.js → p-DrF7UQxE.js} +1 -1
  202. package/dist/components/p-DxRQkoRz.js +5 -0
  203. package/dist/components/{p-yWyKiQgx.js → p-Imck426q.js} +1 -1
  204. package/dist/components/p-UFwS4oV2.js +5 -0
  205. package/dist/components/p-WIpbRULc.js +5 -0
  206. package/dist/components/p-XFwQkeZH.js +5 -0
  207. package/dist/components/{p-3450p9UN.js → p-Ype8FNjy.js} +1 -1
  208. package/dist/components/{p-zeGxLJvE.js → p-a4ooD0o_.js} +1 -1
  209. package/dist/components/{p-nX_t9aCK.js → p-bVbnoz7C.js} +1 -1
  210. package/dist/components/{p-Dsu3xdDz.js → p-d1WgLP9O.js} +1 -1
  211. package/dist/components/{p-CjQ2hRI-.js → p-vlA3PJQv.js} +1 -1
  212. package/dist/components/{p-BpHkd1L9.js → p-vuYBsCyI.js} +1 -1
  213. package/dist/components/part-lookup.js +1 -1
  214. package/dist/components/service-booking-form.js +1 -1
  215. package/dist/components/shift-accordion.js +1 -1
  216. package/dist/components/shift-checkbox.js +1 -1
  217. package/dist/components/shift-portal.js +1 -1
  218. package/dist/components/shift-select-dropdown.js +1 -1
  219. package/dist/components/shift-select.js +1 -1
  220. package/dist/components/shift-slider.js +1 -1
  221. package/dist/components/shift-switch.js +1 -1
  222. package/dist/components/shift-tab-content.js +1 -1
  223. package/dist/components/shift-tabs.js +1 -1
  224. package/dist/components/ssc-lookup-form.js +1 -1
  225. package/dist/components/test-drive-form.js +1 -1
  226. package/dist/components/vehicle-accessories.js +1 -1
  227. package/dist/components/vehicle-claimable-items.js +1 -1
  228. package/dist/components/vehicle-item-claim-form.js +1 -1
  229. package/dist/components/vehicle-lookup.js +1 -1
  230. package/dist/components/vehicle-paint-thickness.js +1 -1
  231. package/dist/components/vehicle-quotation-form.js +1 -1
  232. package/dist/components/vehicle-sale-information.js +1 -1
  233. package/dist/components/vehicle-service-history.js +1 -1
  234. package/dist/components/vehicle-specification.js +1 -1
  235. package/dist/components/vehicle-ssc.d.ts +11 -0
  236. package/dist/components/vehicle-ssc.js +5 -0
  237. package/dist/components/vehicle-warranty-timeline.js +1 -1
  238. package/dist/components/vin-extractor.js +1 -1
  239. package/dist/esm/branch-date-dropdown_17.entry.js +35 -35
  240. package/dist/esm/dead-stock-lookup_3.entry.js +9 -9
  241. package/dist/esm/flexible-container.entry.js +4 -22
  242. package/dist/esm/form-checkbox.entry.js +2 -2
  243. package/dist/esm/form-date-picker.entry.js +5 -5
  244. package/dist/esm/form-input_7.entry.js +17 -17
  245. package/dist/esm/form-switch.entry.js +2 -2
  246. package/dist/esm/form-time-picker.entry.js +6 -6
  247. package/dist/esm/{functions-DJ_k25ew.js → functions-SHZO3nZB.js} +1 -1
  248. package/dist/esm/general-form.entry.js +4 -4
  249. package/dist/esm/general-inquiry-form.entry.js +4 -4
  250. package/dist/esm/{get-local-language-Bx6zWD91.js → get-local-language-BLpgwBTx.js} +4 -4
  251. package/dist/esm/{get-mock-files-BBSjMVMQ.js → get-mock-files-Dpb0udoz.js} +1 -1
  252. package/dist/esm/information-table.entry.js +22 -10
  253. package/dist/esm/loader.js +1 -1
  254. package/dist/esm/loading-spinner.entry.js +2 -2
  255. package/dist/esm/manufacturer-part-lookup.entry.js +3 -3
  256. package/dist/esm/parents-with-tag-WIpbRULc.js +24 -0
  257. package/dist/esm/part-lookup.entry.js +2 -2
  258. package/dist/esm/reveal-below-DWXRi5w3.js +124 -0
  259. package/dist/esm/service-booking-form.entry.js +4 -4
  260. package/dist/esm/shift-accordion.entry.js +2 -2
  261. package/dist/esm/shift-checkbox.entry.js +2 -2
  262. package/dist/esm/shift-components.js +1 -1
  263. package/dist/esm/shift-slider.entry.js +1 -1
  264. package/dist/esm/shift-switch.entry.js +2 -2
  265. package/dist/esm/shift-tab-content.entry.js +2 -2
  266. package/dist/esm/shift-tabs_2.entry.js +10 -10
  267. package/dist/esm/ssc-lookup-form.entry.js +4 -4
  268. package/dist/esm/test-drive-form.entry.js +4 -4
  269. package/dist/esm/{type-DEzFTlhs.js → type-CQsUzIOf.js} +63 -18
  270. package/dist/esm/vehicle-accessories_8.entry.js +819 -204
  271. package/dist/esm/vehicle-lookup.entry.js +56 -40
  272. package/dist/esm/vehicle-quotation-form.entry.js +4 -4
  273. package/dist/integration-manifest.json +38 -23
  274. package/dist/locales/vehicleLookup/ssc/ar.json +64 -0
  275. package/dist/locales/vehicleLookup/ssc/en.json +64 -0
  276. package/dist/locales/vehicleLookup/ssc/ku.json +64 -0
  277. package/dist/locales/vehicleLookup/ssc/ru.json +64 -0
  278. package/dist/locales/vehicleLookup/ssc/type.ts +68 -0
  279. package/dist/locales/vehicleLookup/wrapper-type.ts +2 -2
  280. package/dist/mocks/generated/broker-dealer/vehicle-lookup.json +40 -2
  281. package/dist/mocks/generated/standard-dealer/vehicle-lookup.json +61 -2
  282. package/dist/shift-components/{p-81257775.entry.js → p-005d0a3a.entry.js} +1 -1
  283. package/dist/shift-components/p-0965eb41.entry.js +5 -0
  284. package/dist/shift-components/{p-7e89d3fc.entry.js → p-164eeced.entry.js} +1 -1
  285. package/dist/shift-components/{p-1a0b40e6.entry.js → p-219e589c.entry.js} +1 -1
  286. package/dist/shift-components/{p-d23d9d1f.entry.js → p-3324bdf6.entry.js} +1 -1
  287. package/dist/shift-components/{p-7f2e2763.entry.js → p-3790e469.entry.js} +1 -1
  288. package/dist/shift-components/{p-c2512cb2.entry.js → p-3895d8e5.entry.js} +1 -1
  289. package/dist/shift-components/p-391c55af.entry.js +5 -0
  290. package/dist/shift-components/{p-cc900265.entry.js → p-3ba3f543.entry.js} +1 -1
  291. package/dist/shift-components/{p-3YRvA44H.js → p-48Fp2I0C.js} +1 -1
  292. package/dist/shift-components/p-5c28fb6d.entry.js +5 -0
  293. package/dist/shift-components/{p-e02f3a3f.entry.js → p-60232b66.entry.js} +1 -1
  294. package/dist/shift-components/{p-c197b86b.entry.js → p-82bb8960.entry.js} +1 -1
  295. package/dist/shift-components/{p-a1b97bce.entry.js → p-879faeec.entry.js} +1 -1
  296. package/dist/shift-components/{p-0398f3c4.entry.js → p-90034cd8.entry.js} +1 -1
  297. package/dist/shift-components/p-93ddc847.entry.js +5 -0
  298. package/dist/shift-components/p-C68bG4KE.js +5 -0
  299. package/dist/shift-components/{p-DwFtCPcT.js → p-DIe_G0iC.js} +1 -1
  300. package/dist/shift-components/p-Tjvj6pk4.js +5 -0
  301. package/dist/shift-components/p-WIpbRULc.js +5 -0
  302. package/dist/shift-components/{p-165ff895.entry.js → p-a4f1502c.entry.js} +1 -1
  303. package/dist/shift-components/{p-10882717.entry.js → p-af71f000.entry.js} +1 -1
  304. package/dist/shift-components/p-bd8dbd1d.entry.js +5 -0
  305. package/dist/shift-components/{p-327774de.entry.js → p-be19d7ff.entry.js} +1 -1
  306. package/dist/shift-components/{p-95a4096f.entry.js → p-c40bda31.entry.js} +1 -1
  307. package/dist/shift-components/p-d47428d1.entry.js +5 -0
  308. package/dist/shift-components/p-d8844424.entry.js +5 -0
  309. package/dist/shift-components/{p-f30a355a.entry.js → p-e7986265.entry.js} +1 -1
  310. package/dist/shift-components/p-f638970e.entry.js +5 -0
  311. package/dist/shift-components/{p-8870420e.entry.js → p-f93d79bc.entry.js} +1 -1
  312. package/dist/shift-components/{p-1be40385.entry.js → p-fa296247.entry.js} +1 -1
  313. package/dist/shift-components/p-pkYWYULB.js +5 -0
  314. package/dist/shift-components/shift-components.esm.js +1 -1
  315. package/dist/stencil-docs.json +260 -102
  316. package/dist/types/components/components/information-table.d.ts +3 -0
  317. package/dist/types/components/vehicle-lookup/components/SscCampaigns.d.ts +128 -0
  318. package/dist/types/components/vehicle-lookup/components/glyphs.d.ts +15 -0
  319. package/dist/types/components/vehicle-lookup/vehicle-claimable-items.d.ts +6 -1
  320. package/dist/types/components/vehicle-lookup/vehicle-lookup.d.ts +25 -6
  321. package/dist/types/components/vehicle-lookup/vehicle-ssc.d.ts +214 -0
  322. package/dist/types/components/vehicle-lookup/vehicle-warranty-timeline.d.ts +3 -4
  323. package/dist/types/components.d.ts +214 -43
  324. package/dist/types/features/vehicle-lookup-component/index.d.ts +1 -0
  325. package/dist/types/features/vehicle-lookup-component/interface.d.ts +8 -1
  326. package/dist/types/features/vehicle-lookup-component/request-headers.d.ts +40 -0
  327. package/dist/types/global/lib/flexible-parents.d.ts +16 -0
  328. package/dist/types/global/lib/reveal-below.d.ts +26 -0
  329. package/dist/types/global/types/generated/vehicle-lookup/ssc-dto.d.ts +3 -0
  330. package/dist/types/global/types/generated/vehicle-lookup/ssc-repair-trace-dto.d.ts +12 -0
  331. package/dist/types/global/types/generated/vehicle-lookup/ssc-repair-trace-labor-code-dto.d.ts +4 -0
  332. package/dist/types/global/types/generated/vehicle-lookup/ssc-repair-trace-labor-line-dto.d.ts +9 -0
  333. package/dist/types/global/types/generated/vehicle-lookup/ssc-repair-trace-warranty-claim-dto.d.ts +13 -0
  334. package/dist/types/locale-mapper.d.ts +2 -2
  335. package/dist/types/locales/vehicleLookup/serviceHistory/type.d.ts +2 -2
  336. package/dist/types/locales/vehicleLookup/ssc/type.d.ts +128 -0
  337. package/dist/types/locales/vehicleLookup/warrantyTimeline/type.d.ts +4 -4
  338. package/dist/types/locales/vehicleLookup/wrapper-type.d.ts +126 -36
  339. package/package.json +1 -1
  340. package/dist/cjs/arrow-icon-yMlETDbD.js +0 -11
  341. package/dist/collection/components/vehicle-lookup/components/CardsContainer.js +0 -12
  342. package/dist/collection/components/vehicle-lookup/components/StatusCard.js +0 -11
  343. package/dist/collection/components/vehicle-lookup/vehicle-warranty-details.css +0 -1
  344. package/dist/collection/locales/vehicleLookup/warranty/type.js +0 -25
  345. package/dist/components/p-BJrbtmnU.js +0 -5
  346. package/dist/components/p-BTt7sEhA.js +0 -5
  347. package/dist/components/p-BiTpOAiT.js +0 -5
  348. package/dist/components/p-BwcxrN3h.js +0 -5
  349. package/dist/components/p-CC5K40ze.js +0 -5
  350. package/dist/components/p-CUTQhKeo.js +0 -5
  351. package/dist/components/p-CsXGhc7r.js +0 -5
  352. package/dist/components/p-D1JLecvO.js +0 -5
  353. package/dist/components/p-DQSUv7pB.js +0 -5
  354. package/dist/components/p-DU9WzEFX.js +0 -5
  355. package/dist/components/p-DdgLsuaX.js +0 -5
  356. package/dist/components/p-DeeDRJ2C.js +0 -5
  357. package/dist/components/p-Dts2Iuoc.js +0 -5
  358. package/dist/components/p-DvcOTV3l.js +0 -5
  359. package/dist/components/p-g-v1c-Sz.js +0 -5
  360. package/dist/components/p-kvRYCMvP.js +0 -5
  361. package/dist/components/p-rW_ExFCn.js +0 -5
  362. package/dist/components/vehicle-warranty-details.d.ts +0 -11
  363. package/dist/components/vehicle-warranty-details.js +0 -5
  364. package/dist/esm/arrow-icon-DziuNOTp.js +0 -9
  365. package/dist/locales/vehicleLookup/warranty/ar.json +0 -24
  366. package/dist/locales/vehicleLookup/warranty/en.json +0 -24
  367. package/dist/locales/vehicleLookup/warranty/ku.json +0 -24
  368. package/dist/locales/vehicleLookup/warranty/ru.json +0 -24
  369. package/dist/locales/vehicleLookup/warranty/type.ts +0 -23
  370. package/dist/shift-components/p--hCDlSpp.js +0 -5
  371. package/dist/shift-components/p-020fbe81.entry.js +0 -5
  372. package/dist/shift-components/p-79e08717.entry.js +0 -5
  373. package/dist/shift-components/p-7b1c5abb.entry.js +0 -5
  374. package/dist/shift-components/p-8d205235.entry.js +0 -5
  375. package/dist/shift-components/p-BggCINTA.js +0 -5
  376. package/dist/shift-components/p-D1ioFMhR.js +0 -5
  377. package/dist/shift-components/p-a0dc1bcc.entry.js +0 -5
  378. package/dist/shift-components/p-bd1a0763.entry.js +0 -5
  379. package/dist/shift-components/p-ddf6c6f6.entry.js +0 -5
  380. package/dist/shift-components/p-e72947e0.entry.js +0 -5
  381. package/dist/types/components/vehicle-lookup/components/CardsContainer.d.ts +0 -12
  382. package/dist/types/components/vehicle-lookup/components/StatusCard.d.ts +0 -14
  383. package/dist/types/components/vehicle-lookup/vehicle-warranty-details.d.ts +0 -77
  384. package/dist/types/locales/vehicleLookup/warranty/type.d.ts +0 -38
@@ -2,35 +2,92 @@
2
2
  * Built by ShiftSoftware
3
3
  * Copyright (c)
4
4
  */
5
- import { Host, h } from "@stencil/core";
5
+ import { Host, forceUpdate, h } from "@stencil/core";
6
6
  import cn from "../../global/lib/cn";
7
- import warrantySchema from "../../locales/vehicleLookup/warranty/type";
8
- import CardsContainer from "./components/CardsContainer";
9
- import XIcon from "~assets/x-mark.svg";
10
- import CheckIcon from "~assets/check.svg";
7
+ import { revealBelow } from "../../global/lib/reveal-below";
8
+ import { createHeightChangeAnnouncer } from "../../global/lib/flexible-parents";
9
+ import sscSchema from "../../locales/vehicleLookup/ssc/type";
10
+ import { SscCampaigns, openDrawerKey, panelBody, sscTraceKey } from "./components/SscCampaigns";
11
11
  import { VehicleInfoLayout } from "../../features/vehicle-info-layout/index";
12
12
  import { smartInvokable } from "../../features/blazor-ref/index";
13
- import { setVehicleLookupData, setVehicleLookupErrorState } from "../../features/vehicle-lookup-component/vehicle-lookup-api-integration";
13
+ import { resolveRequestHeaders, setVehicleLookupData, setVehicleLookupErrorState, } from "../../features/vehicle-lookup-component/index";
14
14
  import { getLocaleLanguage, getSharedLocal, sharedLocalesSchema } from "../../features/multi-lingual/index";
15
- export class VehicleWarrantyDetails {
15
+ const RECAPTCHA_SCRIPT_SRC = 'https://www.google.com/recaptcha/api.js?render=explicit';
16
+ /** The --settle token (lookup-tokens.css) when the stylesheet cannot be read, as in tests. */
17
+ const DEFAULT_SETTLE_MS = 320;
18
+ const isAbort = (error) => (error === null || error === void 0 ? void 0 : error.name) === 'AbortError';
19
+ /**
20
+ * The Special Service Campaigns (safety recalls) affecting a vehicle, and nothing else: warranty
21
+ * coverage lives in <vehicle-warranty-timeline>. Replaces the campaign half of the retired
22
+ * <vehicle-warranty-details>.
23
+ *
24
+ * A vehicle is on exactly one of two paths, and the panel must never mix them (the rule is spelled
25
+ * out on `panelVerdict` in ./components/SscCampaigns.tsx and in
26
+ * .shift/repos/adp/web-components/vehicle-lookup-invariants.md):
27
+ *
28
+ * - authorized (in the distributor's records): the campaign list is the verdict;
29
+ * - unauthorized: the distributor has no records, so the only verdict is the manufacturer's
30
+ * answer to the reCAPTCHA-gated check — a yes/no, no list. Until it arrives the panel says the
31
+ * vehicle is not in the records and asserts nothing else.
32
+ *
33
+ * A third state is neither: a wrapper that only counts the SSC tab's own request as a campaign
34
+ * check (`sscQueryString`) tells this panel through `skipLookup` that a vehicle was looked up
35
+ * without it. The panel then says the check was not run and offers to run it, rather than sitting
36
+ * blank next to a VIN as if the vehicle had no campaigns.
37
+ *
38
+ * With `show-trace`, every campaign row can open the evidence behind its repair status: the labor
39
+ * codes accepted for the campaign, every warranty claim on the vehicle with how it was judged, and
40
+ * the service-history lines that matched. The trace is fetched on first use with `?trace=ssc`, so
41
+ * the ordinary lookup response stays small and the host can gate the detail behind a permission.
42
+ *
43
+ * Every state change is a movement (lookup-motion.css): the outgoing content stays rendered while
44
+ * the body shuts over it, and the incoming content is swapped in only while the body is shut. The
45
+ * shared lookup helper waits a second before it asks the server, which is what guarantees the body
46
+ * has settled shut before a response can land.
47
+ */
48
+ export class VehicleSsc {
16
49
  constructor() {
17
50
  // #region Localization
18
51
  this.language = 'en';
19
- this.locale = Object.assign({ sharedLocales: sharedLocalesSchema.getDefault() }, warrantySchema.getDefault());
52
+ this.locale = Object.assign({ sharedLocales: sharedLocalesSchema.getDefault() }, sscSchema.getDefault());
20
53
  // #endregion
21
54
  // #region Vehicle info layout prop
22
55
  this.coreOnly = false;
23
56
  this.disableVinValidation = false;
24
57
  this.headers = {};
25
58
  this.queryString = '';
59
+ /**
60
+ * Appended to the campaign lookup request only, never to the trace request. A wrapper passes its
61
+ * `sscQueryString` — typically a lookup-logging flag — here rather than into `queryString`, so
62
+ * opening a campaign's evidence (a re-read of a lookup that was already logged) is never counted
63
+ * as another lookup. The host's endpoint must refuse to log traced requests as well.
64
+ */
65
+ this.lookupQueryString = '';
66
+ /** Name of a [JSInvokable] method on the Blazor reference that answers with the current headers. */
67
+ this.blazorRequestHeadersProvider = '';
26
68
  this.isError = false;
27
69
  this.isLoading = false;
70
+ /** The panel is on its way to empty: the sheen is on and the body is shutting over its content. */
71
+ this.leaving = false;
72
+ this.leaveGeneration = 0;
73
+ /**
74
+ * The body's last non-empty content, kept while the body is shut so the content slides away
75
+ * with it instead of vanishing the frame the state changes. Dropped once the body has settled.
76
+ */
77
+ this.retainedBody = 'none';
78
+ this.runSkippedLookup = () => {
79
+ const vin = this.skippedVin;
80
+ if (!vin)
81
+ return;
82
+ void this.fetchVin(vin);
83
+ };
28
84
  // #endregion
29
- // #region Component Logic
30
- this.showSsc = false;
85
+ // #region Component props
86
+ /** Shows a per-campaign "why this status?" control. The host gates it on its own permission check; the trace lists claim and invoice details. */
87
+ this.showTrace = false;
31
88
  this.recaptchaKey = '';
89
+ /** Renders a click-to-pass stand-in for the reCAPTCHA widget. Implied by `isDev`; the real widget is only ever used in production mode. */
32
90
  this.mockRecaptcha = false;
33
- this.showWarranty = false;
34
91
  this.unauthorizedSscLookupBaseUrl = '';
35
92
  this.unauthorizedSscLookupQueryString = '';
36
93
  this.cityId = null;
@@ -44,8 +101,10 @@ export class VehicleWarrantyDetails {
44
101
  this.customerName = null;
45
102
  this.customerPhone = null;
46
103
  this.customerEmail = null;
104
+ // #endregion
105
+ // #region Manufacturer check (unauthorized vehicles)
106
+ /** The check is offered: the vehicle is unauthorized and the host configured a site key. */
47
107
  this.showRecaptcha = false;
48
- this.unInvoicedByBrokerName = null;
49
108
  this.checkingUnauthorizedSSC = false;
50
109
  this.devRecaptchaChecked = false;
51
110
  this.recaptchaRes = null;
@@ -55,10 +114,16 @@ export class VehicleWarrantyDetails {
55
114
  if (!this.mockRecaptchaTrigger)
56
115
  return;
57
116
  this.devRecaptchaChecked = true;
58
- await this.mockRecaptchaTrigger();
117
+ try {
118
+ await this.mockRecaptchaTrigger();
119
+ }
120
+ catch (error) {
121
+ if (!isAbort(error))
122
+ console.error('SSC manufacturer check failed', error);
123
+ }
59
124
  };
60
125
  this.syncRecaptchaPosition = () => {
61
- if (!this.recaptchaPlaceholderRef || !this.showRecaptcha)
126
+ if (!this.recaptchaPlaceholderRef || !this.recaptchaPortalEl || this.recaptchaPortalEl.style.display === 'none')
62
127
  return;
63
128
  const rect = this.recaptchaPlaceholderRef.getBoundingClientRect();
64
129
  this.recaptchaPortalEl.style.top = `${rect.top}px`;
@@ -68,29 +133,52 @@ export class VehicleWarrantyDetails {
68
133
  this.recaptchaPortalEl.style.pointerEvents = opacity < 0.1 ? 'none' : 'auto';
69
134
  this.positionRAF = requestAnimationFrame(this.syncRecaptchaPosition);
70
135
  };
136
+ this.traces = {};
137
+ this.traceLoading = false;
138
+ this.toggleTrace = async (key) => {
139
+ var _a, _b;
140
+ if (this.openTraceKey === key) {
141
+ this.openTraceKey = undefined;
142
+ return;
143
+ }
144
+ this.openTraceKey = key;
145
+ const vin = (_a = this.vehicleLookup) === null || _a === void 0 ? void 0 : _a.vin;
146
+ if (!vin)
147
+ return;
148
+ // A response that already carries traces (a host that turned the option on for this caller,
149
+ // or mock data) needs no second request.
150
+ const seeded = Object.fromEntries((((_b = this.vehicleLookup) === null || _b === void 0 ? void 0 : _b.ssc) || []).map((item, index) => [sscTraceKey(item, index), item === null || item === void 0 ? void 0 : item.trace]).filter(([, trace]) => !!trace));
151
+ if (this.tracesVin !== vin && Object.keys(seeded).length) {
152
+ this.traces = seeded;
153
+ this.tracesVin = vin;
154
+ }
155
+ if (this.traces[key] || this.tracesVin === vin)
156
+ return;
157
+ await this.loadTraces(vin);
158
+ };
71
159
  }
72
160
  async componentWillLoad() {
73
161
  await this.changeLanguage(this.language);
74
162
  }
75
163
  async changeLanguage(newLanguage) {
76
- const [sharedLocales, locale] = await Promise.all([getSharedLocal(newLanguage), getLocaleLanguage(newLanguage, 'vehicleLookup.warranty', warrantySchema)]);
164
+ const [sharedLocales, locale] = await Promise.all([getSharedLocal(newLanguage), getLocaleLanguage(newLanguage, 'vehicleLookup.ssc', sscSchema)]);
77
165
  this.locale = Object.assign({ sharedLocales }, locale);
78
166
  }
79
167
  async setMockData(newMockData) {
80
168
  this.mockData = newMockData;
81
169
  }
82
170
  async fetchVin(newData, headers = {}) {
83
- this.recaptchaRes = null;
84
- this.showRecaptcha = false;
85
- clearInterval(this.recaptchaIntervalRef);
171
+ this.leaveGeneration++;
172
+ this.skippedVin = undefined;
173
+ this.resetTraces();
174
+ // The check's machinery stops now; its widget stays on screen so it leaves with the body.
175
+ this.suspendManufacturerCheck();
86
176
  await setVehicleLookupData(this, newData, headers, {
87
177
  beforeAssignment: async (response, { scopedTimeoutRef }) => {
88
- var _a, _b, _c;
89
- if (((_a = response === null || response === void 0 ? void 0 : response.saleInformation) === null || _a === void 0 ? void 0 : _a.broker) !== null && ((_c = (_b = response === null || response === void 0 ? void 0 : response.saleInformation) === null || _b === void 0 ? void 0 : _b.broker) === null || _c === void 0 ? void 0 : _c.invoiceDate) === null)
90
- this.unInvoicedByBrokerName = response.saleInformation.broker.brokerName;
91
- else
92
- this.unInvoicedByBrokerName = null;
93
- await this.handleInitializingRecaptcha(response, scopedTimeoutRef);
178
+ // By now the body has settled shut (the helper's one-second wait outlasts --settle), so
179
+ // the previous vehicle's check can go and the next one's be prepared unseen.
180
+ this.resetManufacturerCheck();
181
+ this.prepareManufacturerCheck(response, scopedTimeoutRef);
94
182
  return response;
95
183
  },
96
184
  });
@@ -98,30 +186,239 @@ export class VehicleWarrantyDetails {
98
186
  async setErrorMessage(message) {
99
187
  setVehicleLookupErrorState(this, message);
100
188
  }
189
+ /** Back to "no vehicle": the body shuts over what it holds, then the panel is emptied unseen. */
101
190
  async clearData() {
191
+ await this.leave();
192
+ this.emptyPanel();
193
+ }
194
+ /**
195
+ * The other panels were given a vehicle but this one's own lookup was not run for it — a wrapper
196
+ * with `sscQueryString` only counts the SSC tab's own request as a campaign check. The panel says
197
+ * so and offers to run the check itself; the VIN is kept for that.
198
+ */
199
+ async skipLookup(vin) {
200
+ if (!this.vehicleLookup && this.skippedVin === vin)
201
+ return;
202
+ await this.leave();
203
+ this.emptyPanel();
204
+ this.skippedVin = vin;
205
+ }
206
+ onLoadingChange(newValue) {
207
+ smartInvokable.bind(this)(this.loadingStateChange, newValue);
208
+ }
209
+ /** How long a state change takes to settle: the --settle token plus a margin for the frame it starts on. */
210
+ settleMs() {
211
+ const raw = typeof getComputedStyle === 'function' ? getComputedStyle(this.el).getPropertyValue('--settle') : '';
212
+ const parsed = parseFloat(raw);
213
+ return (Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_SETTLE_MS) + 40;
214
+ }
215
+ /**
216
+ * Puts the chip and lead on the sheen, shuts the body over whatever it holds, and resolves once
217
+ * they have settled — so the caller can swap the content while nothing is on screen. Resolves at
218
+ * once when there is nothing to leave. A lookup started meanwhile takes over.
219
+ */
220
+ async leave() {
221
+ var _a;
222
+ const generation = ++this.leaveGeneration;
223
+ if (!this.vehicleLookup && !this.skippedVin && !this.isError)
224
+ return;
225
+ clearTimeout(this.networkTimeoutRef);
226
+ (_a = this.abortController) === null || _a === void 0 ? void 0 : _a.abort();
227
+ this.suspendManufacturerCheck();
228
+ this.leaving = true;
229
+ await new Promise(resolve => setTimeout(resolve, this.settleMs()));
230
+ if (generation === this.leaveGeneration)
231
+ this.leaving = false;
232
+ }
233
+ emptyPanel() {
102
234
  this.vehicleLookup = undefined;
103
- this.recaptchaRes = null;
104
- this.showRecaptcha = false;
105
- this.devRecaptchaChecked = false;
106
- this.checkingUnauthorizedSSC = false;
107
235
  this.isError = false;
108
236
  this.errorMessage = undefined;
109
237
  this.isLoading = false;
110
- clearInterval(this.recaptchaIntervalRef);
238
+ this.skippedVin = undefined;
239
+ this.resetManufacturerCheck();
240
+ this.resetTraces();
111
241
  }
112
- onLoadingChange(newValue) {
113
- smartInvokable.bind(this)(this.loadingStateChange, newValue);
242
+ componentDidRender() {
243
+ var _a, _b, _c;
244
+ this.followOpenDrawer();
245
+ const state = this.panelState();
246
+ const body = panelBody(state);
247
+ const signature = [
248
+ this.isLoading || this.leaving,
249
+ body,
250
+ this.retainedBody,
251
+ this.openTraceKey,
252
+ this.traceLoading,
253
+ this.traceError,
254
+ this.checkingUnauthorizedSSC,
255
+ this.showRecaptcha,
256
+ (_a = this.vehicleLookup) === null || _a === void 0 ? void 0 : _a.vin,
257
+ this.skippedVin,
258
+ (_b = this.recaptchaRes) === null || _b === void 0 ? void 0 : _b.status,
259
+ ].join('|');
260
+ const changed = this.layoutSignature !== undefined && this.layoutSignature !== signature;
261
+ this.layoutSignature = signature;
262
+ if (!changed)
263
+ return;
264
+ (_c = this.heightAnnouncer) !== null && _c !== void 0 ? _c : (this.heightAnnouncer = createHeightChangeAnnouncer(this.el));
265
+ this.heightAnnouncer.announce(this.settleMs() + 80);
266
+ }
267
+ /** Remembers what the body shows, and forgets it a settle after the body shut. */
268
+ retainBody(body) {
269
+ if (body !== 'none') {
270
+ this.retainedBody = body;
271
+ clearTimeout(this.retainTimer);
272
+ this.retainTimer = undefined;
273
+ return;
274
+ }
275
+ if (this.retainedBody !== 'none' && !this.retainTimer) {
276
+ this.retainTimer = setTimeout(() => {
277
+ this.retainTimer = undefined;
278
+ this.retainedBody = 'none';
279
+ forceUpdate(this);
280
+ }, this.settleMs());
281
+ }
114
282
  }
115
283
  async setBlazorRef(newBlazorRef) {
116
284
  this.blazorRef = newBlazorRef;
117
285
  }
286
+ /**
287
+ * Development never shows Google's widget. The stand-in is the default whenever `isDev` is on, and
288
+ * the real widget is created lazily, only when a production-mode lookup actually needs it — so a
289
+ * host that flips `isDev` after the element mounted (the dev showcase does) still gets the mock,
290
+ * instead of a real widget rendered at mount time sitting on top of a mock that never polls it.
291
+ */
118
292
  get useMockRecaptchaWidget() {
119
293
  return this.isDev || this.mockRecaptcha;
120
294
  }
295
+ onRecaptchaModeChange() {
296
+ this.syncRealRecaptchaVisibility();
297
+ }
298
+ /** Stops the check from answering — polling, the stand-in's trigger, a request in flight — without touching what is on screen. */
299
+ suspendManufacturerCheck() {
300
+ clearInterval(this.recaptchaIntervalRef);
301
+ this.mockRecaptchaTrigger = undefined;
302
+ }
303
+ /** Back to "nothing asked yet" — every new lookup, once the previous check has left the screen, and a cleared panel start here. */
304
+ resetManufacturerCheck() {
305
+ this.suspendManufacturerCheck();
306
+ clearTimeout(this.recaptchaHideTimer);
307
+ this.recaptchaRes = null;
308
+ this.showRecaptcha = false;
309
+ this.checkingUnauthorizedSSC = false;
310
+ this.devRecaptchaChecked = false;
311
+ this.hideRealRecaptcha();
312
+ }
313
+ /**
314
+ * Offers the check for an unauthorized vehicle. Not awaited by the lookup: loading Google's script
315
+ * must not delay the vehicle landing on screen, so the real widget is armed in the background and
316
+ * checked against the lookup generation before it starts polling.
317
+ */
318
+ prepareManufacturerCheck(newVehicleLookup, scopedTimeoutRef) {
319
+ if ((newVehicleLookup === null || newVehicleLookup === void 0 ? void 0 : newVehicleLookup.isAuthorized) !== false || this.recaptchaKey === '') {
320
+ this.showRecaptcha = false;
321
+ return;
322
+ }
323
+ this.showRecaptcha = true;
324
+ if (this.useMockRecaptchaWidget) {
325
+ this.mockRecaptchaTrigger = () => this.runUnauthorizedSscLookup(newVehicleLookup, 'mock-recaptcha-token', scopedTimeoutRef);
326
+ return;
327
+ }
328
+ void this.armRealRecaptcha(newVehicleLookup, scopedTimeoutRef);
329
+ }
330
+ async armRealRecaptcha(newVehicleLookup, scopedTimeoutRef) {
331
+ try {
332
+ await this.ensureRealRecaptcha();
333
+ }
334
+ catch (error) {
335
+ console.error('reCAPTCHA could not be loaded', error);
336
+ return;
337
+ }
338
+ // A newer lookup, a cleared panel or a flip to mock mode while the script loaded: this one is stale.
339
+ if (this.networkTimeoutRef !== scopedTimeoutRef || !this.showRecaptcha || this.useMockRecaptchaWidget)
340
+ return;
341
+ if (this.recaptchaWidgetId !== undefined)
342
+ grecaptcha.reset(this.recaptchaWidgetId);
343
+ this.syncRealRecaptchaVisibility();
344
+ clearInterval(this.recaptchaIntervalRef);
345
+ this.recaptchaIntervalRef = setInterval(async () => {
346
+ const recaptchaResponse = grecaptcha.getResponse(this.recaptchaWidgetId);
347
+ if (!recaptchaResponse)
348
+ return;
349
+ clearInterval(this.recaptchaIntervalRef);
350
+ try {
351
+ await this.runUnauthorizedSscLookup(newVehicleLookup, recaptchaResponse, scopedTimeoutRef);
352
+ }
353
+ catch (error) {
354
+ if (!isAbort(error))
355
+ console.error('SSC manufacturer check failed', error);
356
+ }
357
+ }, 500);
358
+ }
359
+ /** Loads Google's script and renders the widget into a body-level portal, once per element. */
360
+ ensureRealRecaptcha() {
361
+ if (!this.recaptchaReady) {
362
+ this.recaptchaReady = new Promise((resolve, reject) => {
363
+ if (!this.recaptchaPortalEl) {
364
+ this.recaptchaPortalEl = document.createElement('div');
365
+ this.recaptchaPortalEl.style.cssText = 'position: fixed; z-index: 1; display: none;';
366
+ document.body.appendChild(this.recaptchaPortalEl);
367
+ }
368
+ const renderWidget = () => grecaptcha.ready(() => {
369
+ this.recaptchaWidgetId = grecaptcha.render(this.recaptchaPortalEl, { sitekey: this.recaptchaKey });
370
+ resolve();
371
+ });
372
+ if (typeof grecaptcha !== 'undefined' && typeof (grecaptcha === null || grecaptcha === void 0 ? void 0 : grecaptcha.render) === 'function') {
373
+ renderWidget();
374
+ return;
375
+ }
376
+ const script = document.createElement('script');
377
+ script.src = RECAPTCHA_SCRIPT_SRC;
378
+ script.async = true;
379
+ script.defer = true;
380
+ script.onload = renderWidget;
381
+ script.onerror = () => {
382
+ this.recaptchaReady = undefined;
383
+ reject(new Error('reCAPTCHA script failed to load'));
384
+ };
385
+ document.head.appendChild(script);
386
+ });
387
+ }
388
+ return this.recaptchaReady;
389
+ }
390
+ hideRealRecaptcha() {
391
+ cancelAnimationFrame(this.positionRAF);
392
+ clearTimeout(this.recaptchaHideTimer);
393
+ if (this.recaptchaPortalEl)
394
+ this.recaptchaPortalEl.style.display = 'none';
395
+ }
396
+ /**
397
+ * The real widget is visible only while a production-mode check is offered and unanswered. It
398
+ * lives outside the shadow root, so the body cannot clip it as it shuts; instead it follows the
399
+ * body's opacity (see `getAncestorOpacity`) and is only taken down once the body has settled.
400
+ */
401
+ syncRealRecaptchaVisibility() {
402
+ if (!this.recaptchaPortalEl)
403
+ return;
404
+ if (this.showRecaptcha && !this.recaptchaRes && !this.useMockRecaptchaWidget) {
405
+ clearTimeout(this.recaptchaHideTimer);
406
+ this.recaptchaPortalEl.style.display = 'block';
407
+ this.syncRecaptchaPosition();
408
+ return;
409
+ }
410
+ clearTimeout(this.recaptchaHideTimer);
411
+ this.recaptchaHideTimer = setTimeout(() => this.hideRealRecaptcha(), this.settleMs());
412
+ }
413
+ onRecaptchaStateChange() {
414
+ this.syncRealRecaptchaVisibility();
415
+ }
121
416
  async runUnauthorizedSscLookup(newVehicleLookup, recaptchaToken, scopedTimeoutRef) {
122
417
  this.checkingUnauthorizedSSC = true;
123
418
  if (this.isDev) {
124
419
  await new Promise(r => setTimeout(r, 3000));
420
+ if (this.networkTimeoutRef !== scopedTimeoutRef)
421
+ return;
125
422
  this.checkingUnauthorizedSSC = false;
126
423
  const randomValue = Math.random();
127
424
  const devSscLookupStatus = randomValue < 0.33 ? 0 : randomValue > 0.33 && randomValue < 0.66 ? 2 : 1;
@@ -131,162 +428,180 @@ export class VehicleWarrantyDetails {
131
428
  smartInvokable.bind(this)(this.unauthorizedSscLookupResponse, devSscLookupStatus);
132
429
  return;
133
430
  }
431
+ // Resolved at call time: the token handed over with the search may have expired by the time
432
+ // the visitor completes the captcha.
433
+ const headers = await resolveRequestHeaders(this);
134
434
  const response = await fetch(`${this.unauthorizedSscLookupBaseUrl}${newVehicleLookup === null || newVehicleLookup === void 0 ? void 0 : newVehicleLookup.vin}/${newVehicleLookup === null || newVehicleLookup === void 0 ? void 0 : newVehicleLookup.sscLogId}?${this.unauthorizedSscLookupQueryString}`, {
135
435
  signal: this.abortController.signal,
136
- headers: Object.assign(Object.assign({}, this.headers), { 'Ssc-Recaptcha-Token': recaptchaToken }),
436
+ headers: Object.assign(Object.assign({}, headers), { 'Ssc-Recaptcha-Token': recaptchaToken }),
137
437
  });
138
438
  const vinResponse = await response.json();
139
- if (vinResponse && this.networkTimeoutRef === scopedTimeoutRef) {
140
- this.checkingUnauthorizedSSC = false;
141
- this.recaptchaRes = {
142
- status: vinResponse.sscLookupStatus === 0
143
- ? 'noRecall'
144
- : vinResponse.sscLookupStatus === 1
145
- ? 'recallExists'
146
- : vinResponse.sscLookupStatus === 2
147
- ? 'noApplicableVehicleFound'
148
- : null,
149
- };
150
- smartInvokable.bind(this)(this.unauthorizedSscLookupResponse, vinResponse.sscLookupStatus);
151
- }
152
- else
153
- throw new Error('wrongResponseFormat');
154
- }
155
- async handleInitializingRecaptcha(newVehicleLookup, scopedTimeoutRef) {
156
- if ((newVehicleLookup === null || newVehicleLookup === void 0 ? void 0 : newVehicleLookup.isAuthorized) === false && this.showSsc && this.recaptchaKey !== '') {
157
- this.devRecaptchaChecked = false;
158
- if (this.useMockRecaptchaWidget) {
159
- this.mockRecaptchaTrigger = () => this.runUnauthorizedSscLookup(newVehicleLookup, 'mock-recaptcha-token', scopedTimeoutRef);
160
- this.showRecaptcha = true;
161
- return;
162
- }
163
- if (this.recaptchaWidgetId !== undefined) {
164
- grecaptcha.reset(this.recaptchaWidgetId);
165
- }
166
- this.recaptchaIntervalRef = setInterval(async () => {
167
- const recaptchaResponse = grecaptcha.getResponse(this.recaptchaWidgetId);
168
- if (recaptchaResponse) {
169
- clearInterval(this.recaptchaIntervalRef);
170
- await this.runUnauthorizedSscLookup(newVehicleLookup, recaptchaResponse, scopedTimeoutRef);
171
- }
172
- }, 500);
173
- this.showRecaptcha = true;
174
- }
175
- else {
176
- this.showRecaptcha = false;
177
- }
178
- }
179
- async componentDidLoad() {
180
- if (this.useMockRecaptchaWidget)
439
+ // A newer lookup started while the manufacturer was answering: this answer is for a vehicle no longer shown.
440
+ if (this.networkTimeoutRef !== scopedTimeoutRef)
181
441
  return;
182
- if (this.recaptchaKey !== '') {
183
- this.recaptchaPortalEl = document.createElement('div');
184
- this.recaptchaPortalEl.style.cssText = 'position: fixed; z-index: 1; display: none;';
185
- document.body.appendChild(this.recaptchaPortalEl);
186
- const script = document.createElement('script');
187
- script.src = 'https://www.google.com/recaptcha/api.js?render=explicit';
188
- script.async = true;
189
- script.defer = true;
190
- script.onload = () => {
191
- grecaptcha.ready(() => {
192
- this.recaptchaWidgetId = grecaptcha.render(this.recaptchaPortalEl, { sitekey: this.recaptchaKey });
193
- });
194
- };
195
- document.head.appendChild(script);
196
- }
442
+ if (!vinResponse)
443
+ throw new Error('wrongResponseFormat');
444
+ this.checkingUnauthorizedSSC = false;
445
+ this.recaptchaRes = {
446
+ status: vinResponse.sscLookupStatus === 0 ? 'noRecall' : vinResponse.sscLookupStatus === 1 ? 'recallExists' : vinResponse.sscLookupStatus === 2 ? 'noApplicableVehicleFound' : null,
447
+ };
448
+ smartInvokable.bind(this)(this.unauthorizedSscLookupResponse, vinResponse.sscLookupStatus);
197
449
  }
198
450
  disconnectedCallback() {
451
+ var _a, _b;
452
+ (_a = this.heightAnnouncer) === null || _a === void 0 ? void 0 : _a.dispose();
453
+ this.stopFollowingDrawer();
199
454
  cancelAnimationFrame(this.positionRAF);
200
455
  clearInterval(this.recaptchaIntervalRef);
456
+ clearTimeout(this.recaptchaHideTimer);
457
+ clearTimeout(this.retainTimer);
458
+ (_b = this.traceAbortController) === null || _b === void 0 ? void 0 : _b.abort();
201
459
  if (this.recaptchaPortalEl) {
202
460
  this.recaptchaPortalEl.remove();
461
+ this.recaptchaPortalEl = undefined;
462
+ this.recaptchaReady = undefined;
463
+ this.recaptchaWidgetId = undefined;
203
464
  }
204
465
  }
205
- onShowRecaptchaChange(show) {
206
- if (!this.recaptchaPortalEl)
207
- return;
208
- if (show) {
209
- this.recaptchaPortalEl.style.display = 'block';
210
- this.syncRecaptchaPosition();
466
+ /**
467
+ * How see-through the widget's place on the page is: the product of every ancestor's opacity,
468
+ * from the placeholder up through this shadow root (the body fading as it shuts) and on up the
469
+ * host page (a tab sliding out). The portal copies it, so the real widget leaves with the panel.
470
+ */
471
+ getAncestorOpacity() {
472
+ let opacity = 1;
473
+ const walk = (from, until) => {
474
+ for (let el = from; el && el !== until; el = el.parentElement) {
475
+ const own = parseFloat(getComputedStyle(el).opacity);
476
+ if (!Number.isNaN(own))
477
+ opacity *= own;
478
+ }
479
+ };
480
+ walk(this.recaptchaPlaceholderRef, null);
481
+ walk(this.el, document.body);
482
+ return opacity;
483
+ }
484
+ resetTraces() {
485
+ var _a;
486
+ (_a = this.traceAbortController) === null || _a === void 0 ? void 0 : _a.abort();
487
+ this.stopFollowingDrawer();
488
+ this.openTraceKey = undefined;
489
+ this.traces = {};
490
+ this.tracesVin = undefined;
491
+ this.traceLoading = false;
492
+ this.traceError = undefined;
493
+ }
494
+ async loadTraces(vin) {
495
+ var _a, _b;
496
+ (_a = this.traceAbortController) === null || _a === void 0 ? void 0 : _a.abort();
497
+ this.traceAbortController = new AbortController();
498
+ const { signal } = this.traceAbortController;
499
+ this.traceLoading = true;
500
+ this.traceError = undefined;
501
+ try {
502
+ let response;
503
+ if (this.isDev) {
504
+ response = (_b = this.mockData) === null || _b === void 0 ? void 0 : _b[vin];
505
+ }
506
+ else {
507
+ if (!this.baseUrl)
508
+ throw new Error('noBaseUrl');
509
+ // KPI integrity: built from queryString alone. lookupQueryString (a wrapper's logging flag)
510
+ // must never join a trace request — this is a re-read, not a lookup. vehicle-ssc.spec.tsx pins it.
511
+ const query = [this.queryString, 'trace=ssc'].filter(Boolean).join('&');
512
+ const headers = await resolveRequestHeaders(this);
513
+ const httpResponse = await fetch(`${this.baseUrl}${vin}?${query}`, { headers, signal });
514
+ if (!httpResponse.ok)
515
+ throw new Error(`HTTP ${httpResponse.status}`);
516
+ response = (await httpResponse.json());
517
+ }
518
+ if (signal.aborted)
519
+ return;
520
+ const traces = {};
521
+ ((response === null || response === void 0 ? void 0 : response.ssc) || []).forEach((item, index) => {
522
+ if (item === null || item === void 0 ? void 0 : item.trace)
523
+ traces[sscTraceKey(item, index)] = item.trace;
524
+ });
525
+ this.traces = traces;
526
+ this.tracesVin = vin;
527
+ this.traceError = Object.keys(traces).length ? undefined : this.locale.traceUnavailable;
211
528
  }
212
- else {
213
- this.recaptchaPortalEl.style.display = 'none';
214
- cancelAnimationFrame(this.positionRAF);
529
+ catch (error) {
530
+ if (isAbort(error))
531
+ return;
532
+ console.error('SSC trace fetch failed', error);
533
+ this.traceError = this.locale.traceFailed;
215
534
  }
216
- }
217
- getAncestorOpacity() {
218
- let el = this.el.parentElement;
219
- while (el && el !== document.body) {
220
- const opacity = parseFloat(getComputedStyle(el).opacity);
221
- if (opacity < 1)
222
- return opacity;
223
- el = el.parentElement;
535
+ finally {
536
+ if (!signal.aborted)
537
+ this.traceLoading = false;
224
538
  }
225
- return 1;
539
+ }
540
+ /**
541
+ * When a row's evidence opens, brings the row to the top of the page and keeps it there while the
542
+ * drawer slides open beneath it — as an expanded service-history line does — so the reader is
543
+ * looking at the evidence they asked for and not at the drawer's edge below the fold. Runs after
544
+ * every render and acts only when the open drawer changes; closing it, or leaving, lets go.
545
+ */
546
+ followOpenDrawer() {
547
+ var _a, _b, _c;
548
+ const key = openDrawerKey({
549
+ campaigns: (_a = this.vehicleLookup) === null || _a === void 0 ? void 0 : _a.ssc,
550
+ showTrace: this.showTrace,
551
+ openTraceKey: this.openTraceKey,
552
+ traces: this.traces,
553
+ traceLoading: this.traceLoading,
554
+ });
555
+ if (key === this.followedDrawer)
556
+ return;
557
+ this.stopFollowingDrawer();
558
+ this.followedDrawer = key;
559
+ if (!key)
560
+ return;
561
+ const row = Array.from((_c = (_b = this.el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelectorAll('.ssc-row')) !== null && _c !== void 0 ? _c : []).find(el => el.getAttribute('data-trace-key') === key);
562
+ if (row)
563
+ this.stopFollowing = revealBelow(row, this.settleMs());
564
+ }
565
+ stopFollowingDrawer() {
566
+ var _a;
567
+ (_a = this.stopFollowing) === null || _a === void 0 ? void 0 : _a.call(this);
568
+ this.stopFollowing = undefined;
569
+ this.followedDrawer = undefined;
226
570
  }
227
571
  // #endregion
228
- render() {
229
- var _a, _b, _c, _d, _e, _f, _g;
230
- const tableHeaders = [
231
- {
232
- nowrap: true,
233
- key: 'sscTableCode',
234
- label: this.locale.sscTableCode,
235
- },
236
- {
237
- key: 'sscTableDescription',
238
- label: this.locale.sscTableDescription,
239
- },
240
- {
241
- nowrap: true,
242
- key: 'sscTableRepairStatus',
243
- label: this.locale.sscTableRepairStatus,
244
- },
245
- {
246
- key: 'sscTableOPCode',
247
- label: this.locale.sscTableOPCode,
248
- },
249
- {
250
- key: 'sscTablePartNumber',
251
- label: this.locale.sscTablePartNumber,
252
- },
253
- ];
254
- const rows = !((_a = this.vehicleLookup) === null || _a === void 0 ? void 0 : _a.ssc)
255
- ? []
256
- : (_b = this.vehicleLookup) === null || _b === void 0 ? void 0 : _b.ssc.map(sscItem => ({
257
- sscTableCode: sscItem === null || sscItem === void 0 ? void 0 : sscItem.sscCode,
258
- sscTableDescription: sscItem === null || sscItem === void 0 ? void 0 : sscItem.description,
259
- sscTableRepairStatus: () => (h("div", { class: "table-cell-container" }, h("img", { class: "table-status-icon", src: (sscItem === null || sscItem === void 0 ? void 0 : sscItem.repaired) ? CheckIcon : XIcon }), " ", sscItem === null || sscItem === void 0 ? void 0 :
260
- sscItem.repairDate)),
261
- sscTableOPCode: () => (h("div", { class: "table-cell-container table-cell-labors-container" }, (sscItem === null || sscItem === void 0 ? void 0 : sscItem.labors.length)
262
- ? sscItem === null || sscItem === void 0 ? void 0 : sscItem.labors.map(labor => (h("div", { key: labor === null || labor === void 0 ? void 0 : labor.laborCode, class: "success" }, labor === null || labor === void 0 ? void 0 : labor.laborCode)))
263
- : '...')),
264
- sscTablePartNumber: () => (h("div", { class: "table-cell-container table-cell-parts-container" }, (sscItem === null || sscItem === void 0 ? void 0 : sscItem.parts.length)
265
- ? sscItem === null || sscItem === void 0 ? void 0 : sscItem.parts.map(part => {
266
- // Three availability states: in stock (green check), not in stock (red cross), or not checked
267
- // — no Hub stock scope, or a repaired recall — which shows neutral grey with no icon.
268
- const state = (part === null || part === void 0 ? void 0 : part.isAvailable) === true ? 'available' : (part === null || part === void 0 ? void 0 : part.isAvailable) === false ? 'unavailable' : 'unchecked';
269
- return (h("div", { key: part === null || part === void 0 ? void 0 : part.partNumber, class: cn('part-chip', state) }, state !== 'unchecked' && h("img", { class: "part-chip-icon", src: state === 'available' ? CheckIcon : XIcon }), h("span", null, part === null || part === void 0 ? void 0 : part.partNumber)));
270
- })
271
- : '...')),
272
- }));
273
- const templateRow = {
274
- sscTableOPCode: () => h("div", { class: "h-[25px]" }),
275
- sscTablePartNumber: () => h("div", { class: "h-[25px]" }),
276
- sscTableRepairStatus: () => h("div", { class: "h-[25px]" }),
572
+ panelState() {
573
+ var _a, _b, _c;
574
+ return {
575
+ locale: this.locale,
576
+ vehicleLoaded: !!this.vehicleLookup,
577
+ authorized: (_a = this.vehicleLookup) === null || _a === void 0 ? void 0 : _a.isAuthorized,
578
+ campaigns: (_b = this.vehicleLookup) === null || _b === void 0 ? void 0 : _b.ssc,
579
+ skipped: !!this.skippedVin,
580
+ checkAvailable: this.recaptchaKey !== '',
581
+ checkStatus: (_c = this.recaptchaRes) === null || _c === void 0 ? void 0 : _c.status,
277
582
  };
278
- return (h(Host, { translate: "no" }, h(VehicleInfoLayout, { isError: this.isError, coreOnly: this.coreOnly, isLoading: this.isLoading, header: (_c = this.vehicleLookup) === null || _c === void 0 ? void 0 : _c.vin, direction: this.locale.sharedLocales.direction, errorMessage: this.locale.sharedLocales.errors[this.errorMessage] || this.locale.sharedLocales.errors.wildCard }, h("div", { class: "p-[16px]" }, this.showWarranty && (h(CardsContainer, { isLoading: this.isLoading, warrantyLocale: this.locale, vehicleInformation: this.vehicleLookup, isAuthorized: (_d = this.vehicleLookup) === null || _d === void 0 ? void 0 : _d.isAuthorized, unInvoicedByBrokerName: this.unInvoicedByBrokerName })), h("div", { class: "h-[8px]" }), h("flexible-container", { isOpened: this.showRecaptcha, classes: cn('w-fit mx-auto shift-skeleton', { loading: !this.showRecaptcha || this.isLoading }) }, h("div", { style: { height: 'auto' }, class: "recaptcha-container" }, this.useMockRecaptchaWidget ? (h("div", { ref: el => (this.recaptchaPlaceholderRef = el), onClick: this.handleDevRecaptchaClick, class: cn('dev-recaptcha', { 'dev-recaptcha-disabled': this.devRecaptchaChecked }) }, h("div", { class: cn('dev-recaptcha-checkbox', { checked: this.devRecaptchaChecked }) }, this.devRecaptchaChecked && h("span", { class: "dev-recaptcha-checkmark" }, "\u2713")), h("div", { class: "dev-recaptcha-label" }, "I'm not a robot"), h("div", { class: "dev-recaptcha-brand" }, h("div", { class: "dev-recaptcha-brand-name" }, "reCAPTCHA"), h("div", { class: "dev-recaptcha-brand-mock" }, "(dev mock)")))) : (h("div", { ref: el => (this.recaptchaPlaceholderRef = el), style: { minWidth: '302px', minHeight: '76px' } }))), this.recaptchaRes && (h("div", { class: cn('recaptcha-response', ((_e = this.recaptchaRes) === null || _e === void 0 ? void 0 : _e.status) === 'recallExists' ? 'reject-card ' : ((_f = this.recaptchaRes) === null || _f === void 0 ? void 0 : _f.status) === 'noRecall' ? 'success-card ' : 'warning-card ') }, this.locale[(_g = this.recaptchaRes) === null || _g === void 0 ? void 0 : _g.status])))), h("flexible-container", { isOpened: this.checkingUnauthorizedSSC, classes: "w-fit mx-auto" }, h("div", { class: "pt-[16px]" }, h("div", { class: "flex shift-skeleton flex-col gap-[8px]" }, h("strong", null, this.locale.checkingTMC), h("div", { class: "relative pt-[40px]" }, h("loading-spinner", { isLoading: this.checkingUnauthorizedSSC }))))), this.showSsc && (h("div", { class: "mt-[32px] w-full" }, h("div", { class: "bg-[#f6f6f6] h-[50px] flex items-center justify-center px-[16px] font-bold text-[18px]" }, this.locale.sscCampings), h("div", { class: "overflow-x-auto" }, h("information-table", { allowAutoWidth: true, isLoading: this.isLoading, templateRow: templateRow, rows: rows, headers: tableHeaders })))))));
279
583
  }
280
- static get is() { return "vehicle-warranty-details"; }
584
+ render() {
585
+ var _a, _b;
586
+ const state = this.panelState();
587
+ this.retainBody(panelBody(state));
588
+ // The widget block for an unauthorized vehicle: the stand-in or the real widget's anchor. It
589
+ // stays rendered after the manufacturer has answered — the body shuts over it and it leaves
590
+ // with the body — and is dropped with the check on the next lookup. Rendered by the campaigns
591
+ // panel inside its "check" body only, so it can never sit beside a list.
592
+ const manufacturerCheck = this.showRecaptcha && (h("div", { key: 'dcbff9ed43160482ef7b6573ae1d59aa5daa751d', class: "ssc-check-widget" }, h("div", { key: '3e9e0f41e871b4aa60a557d1d517e9d012e04ed3', class: "recaptcha-container" }, this.useMockRecaptchaWidget ? (h("div", { ref: el => (this.recaptchaPlaceholderRef = el), onClick: this.handleDevRecaptchaClick, class: cn('dev-recaptcha', { 'dev-recaptcha-disabled': this.devRecaptchaChecked }) }, h("div", { class: cn('dev-recaptcha-checkbox', { checked: this.devRecaptchaChecked }) }, this.devRecaptchaChecked && h("span", { class: "dev-recaptcha-checkmark" }, "\u2713")), h("div", { class: "dev-recaptcha-label" }, "I'm not a robot"), h("div", { class: "dev-recaptcha-brand" }, h("div", { class: "dev-recaptcha-brand-name" }, "reCAPTCHA"), h("div", { class: "dev-recaptcha-brand-mock" }, "(dev mock)")))) : (h("div", { ref: el => (this.recaptchaPlaceholderRef = el), style: { minWidth: '302px', minHeight: '76px' } })))));
593
+ return (h(Host, { key: '55baf0475afa6d3f4a37c65c2ad4a5f1c177e334', translate: "no" }, h(VehicleInfoLayout, { key: '08a2eee97c9e97a0eb9d7a9bd99c0055b1a19fd0', isError: this.isError, coreOnly: this.coreOnly, isLoading: this.isLoading, header: (_b = (_a = this.vehicleLookup) === null || _a === void 0 ? void 0 : _a.vin) !== null && _b !== void 0 ? _b : this.skippedVin, direction: this.locale.sharedLocales.direction, errorMessage: this.locale.sharedLocales.errors[this.errorMessage] || this.locale.sharedLocales.errors.wildCard }, h("div", { key: '355b56a6bf16cab6b8eeaebd362fd7d0fdf37efa', class: "ssc-panel", dir: this.locale.sharedLocales.direction }, h(SscCampaigns, Object.assign({ key: '3b5ae414e28c472fad1deeaa38238cd71aee72e2' }, state, { loading: this.isLoading || this.leaving, checking: this.checkingUnauthorizedSSC, retainedBody: this.retainedBody, onRunLookup: this.runSkippedLookup, showTrace: this.showTrace, openTraceKey: this.openTraceKey, traces: this.traces, traceLoading: this.traceLoading, traceError: this.traceError, onToggleTrace: this.toggleTrace }), manufacturerCheck)))));
594
+ }
595
+ static get is() { return "vehicle-ssc"; }
281
596
  static get encapsulation() { return "shadow"; }
282
597
  static get originalStyleUrls() {
283
598
  return {
284
- "$": ["vehicle-warranty-details.css"]
599
+ "$": ["vehicle-ssc.css"]
285
600
  };
286
601
  }
287
602
  static get styleUrls() {
288
603
  return {
289
- "$": ["vehicle-warranty-details.css"]
604
+ "$": ["vehicle-ssc.css"]
290
605
  };
291
606
  }
292
607
  static get properties() {
@@ -408,7 +723,7 @@ export class VehicleWarrantyDetails {
408
723
  "optional": false,
409
724
  "docs": {
410
725
  "tags": [],
411
- "text": ""
726
+ "text": "Static headers the host set on the element. The floor every request starts from."
412
727
  },
413
728
  "getter": false,
414
729
  "setter": false,
@@ -434,6 +749,70 @@ export class VehicleWarrantyDetails {
434
749
  "attribute": "query-string",
435
750
  "defaultValue": "''"
436
751
  },
752
+ "lookupQueryString": {
753
+ "type": "string",
754
+ "mutable": false,
755
+ "complexType": {
756
+ "original": "string",
757
+ "resolved": "string",
758
+ "references": {}
759
+ },
760
+ "required": false,
761
+ "optional": false,
762
+ "docs": {
763
+ "tags": [],
764
+ "text": "Appended to the campaign lookup request only, never to the trace request. A wrapper passes its\n`sscQueryString` \u2014 typically a lookup-logging flag \u2014 here rather than into `queryString`, so\nopening a campaign's evidence (a re-read of a lookup that was already logged) is never counted\nas another lookup. The host's endpoint must refuse to log traced requests as well."
765
+ },
766
+ "getter": false,
767
+ "setter": false,
768
+ "reflect": false,
769
+ "attribute": "lookup-query-string",
770
+ "defaultValue": "''"
771
+ },
772
+ "requestHeadersProvider": {
773
+ "type": "unknown",
774
+ "mutable": false,
775
+ "complexType": {
776
+ "original": "RequestHeadersProvider",
777
+ "resolved": "() => object | Promise<object>",
778
+ "references": {
779
+ "RequestHeadersProvider": {
780
+ "location": "import",
781
+ "path": "~features/vehicle-lookup-component",
782
+ "id": "src/features/vehicle-lookup-component/index.ts::RequestHeadersProvider",
783
+ "referenceLocation": "RequestHeadersProvider"
784
+ }
785
+ }
786
+ },
787
+ "required": false,
788
+ "optional": true,
789
+ "docs": {
790
+ "tags": [],
791
+ "text": "Asked for the current headers before every request this component makes itself; lets a host refresh its token on demand."
792
+ },
793
+ "getter": false,
794
+ "setter": false
795
+ },
796
+ "blazorRequestHeadersProvider": {
797
+ "type": "string",
798
+ "mutable": false,
799
+ "complexType": {
800
+ "original": "string",
801
+ "resolved": "string",
802
+ "references": {}
803
+ },
804
+ "required": false,
805
+ "optional": false,
806
+ "docs": {
807
+ "tags": [],
808
+ "text": "Name of a [JSInvokable] method on the Blazor reference that answers with the current headers."
809
+ },
810
+ "getter": false,
811
+ "setter": false,
812
+ "reflect": false,
813
+ "attribute": "blazor-request-headers-provider",
814
+ "defaultValue": "''"
815
+ },
437
816
  "errorCallback": {
438
817
  "type": "string",
439
818
  "mutable": false,
@@ -550,7 +929,7 @@ export class VehicleWarrantyDetails {
550
929
  "reflect": false,
551
930
  "attribute": "unauthorized-ssc-lookup-response"
552
931
  },
553
- "showSsc": {
932
+ "showTrace": {
554
933
  "type": "boolean",
555
934
  "mutable": false,
556
935
  "complexType": {
@@ -562,12 +941,12 @@ export class VehicleWarrantyDetails {
562
941
  "optional": false,
563
942
  "docs": {
564
943
  "tags": [],
565
- "text": ""
944
+ "text": "Shows a per-campaign \"why this status?\" control. The host gates it on its own permission check; the trace lists claim and invoice details."
566
945
  },
567
946
  "getter": false,
568
947
  "setter": false,
569
948
  "reflect": false,
570
- "attribute": "show-ssc",
949
+ "attribute": "show-trace",
571
950
  "defaultValue": "false"
572
951
  },
573
952
  "recaptchaKey": {
@@ -602,7 +981,7 @@ export class VehicleWarrantyDetails {
602
981
  "optional": false,
603
982
  "docs": {
604
983
  "tags": [],
605
- "text": ""
984
+ "text": "Renders a click-to-pass stand-in for the reCAPTCHA widget. Implied by `isDev`; the real widget is only ever used in production mode."
606
985
  },
607
986
  "getter": false,
608
987
  "setter": false,
@@ -610,26 +989,6 @@ export class VehicleWarrantyDetails {
610
989
  "attribute": "mock-recaptcha",
611
990
  "defaultValue": "false"
612
991
  },
613
- "showWarranty": {
614
- "type": "boolean",
615
- "mutable": false,
616
- "complexType": {
617
- "original": "boolean",
618
- "resolved": "boolean",
619
- "references": {}
620
- },
621
- "required": false,
622
- "optional": false,
623
- "docs": {
624
- "tags": [],
625
- "text": ""
626
- },
627
- "getter": false,
628
- "setter": false,
629
- "reflect": false,
630
- "attribute": "show-warranty",
631
- "defaultValue": "false"
632
- },
633
992
  "unauthorizedSscLookupBaseUrl": {
634
993
  "type": "string",
635
994
  "mutable": false,
@@ -899,12 +1258,17 @@ export class VehicleWarrantyDetails {
899
1258
  "errorMessage": {},
900
1259
  "isLoading": {},
901
1260
  "vehicleLookup": {},
1261
+ "skippedVin": {},
1262
+ "leaving": {},
902
1263
  "blazorRef": {},
903
1264
  "showRecaptcha": {},
904
- "unInvoicedByBrokerName": {},
905
1265
  "checkingUnauthorizedSSC": {},
906
1266
  "devRecaptchaChecked": {},
907
- "recaptchaRes": {}
1267
+ "recaptchaRes": {},
1268
+ "openTraceKey": {},
1269
+ "traces": {},
1270
+ "traceLoading": {},
1271
+ "traceError": {}
908
1272
  };
909
1273
  }
910
1274
  static get methods() {
@@ -1007,7 +1371,28 @@ export class VehicleWarrantyDetails {
1007
1371
  "return": "Promise<void>"
1008
1372
  },
1009
1373
  "docs": {
1010
- "text": "",
1374
+ "text": "Back to \"no vehicle\": the body shuts over what it holds, then the panel is emptied unseen.",
1375
+ "tags": []
1376
+ }
1377
+ },
1378
+ "skipLookup": {
1379
+ "complexType": {
1380
+ "signature": "(vin: string) => Promise<void>",
1381
+ "parameters": [{
1382
+ "name": "vin",
1383
+ "type": "string",
1384
+ "docs": ""
1385
+ }],
1386
+ "references": {
1387
+ "Promise": {
1388
+ "location": "global",
1389
+ "id": "global::Promise"
1390
+ }
1391
+ },
1392
+ "return": "Promise<void>"
1393
+ },
1394
+ "docs": {
1395
+ "text": "The other panels were given a vehicle but this one's own lookup was not run for it \u2014 a wrapper\nwith `sscQueryString` only counts the SSC tab's own request as a campaign check. The panel says\nso and offers to run the check itself; the VIN is kept for that.",
1011
1396
  "tags": []
1012
1397
  }
1013
1398
  },
@@ -1048,9 +1433,18 @@ export class VehicleWarrantyDetails {
1048
1433
  }, {
1049
1434
  "propName": "isLoading",
1050
1435
  "methodName": "onLoadingChange"
1436
+ }, {
1437
+ "propName": "isDev",
1438
+ "methodName": "onRecaptchaModeChange"
1439
+ }, {
1440
+ "propName": "mockRecaptcha",
1441
+ "methodName": "onRecaptchaModeChange"
1051
1442
  }, {
1052
1443
  "propName": "showRecaptcha",
1053
- "methodName": "onShowRecaptchaChange"
1444
+ "methodName": "onRecaptchaStateChange"
1445
+ }, {
1446
+ "propName": "recaptchaRes",
1447
+ "methodName": "onRecaptchaStateChange"
1054
1448
  }];
1055
1449
  }
1056
1450
  }