adp-web-components 0.4.1 → 0.4.2

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 (474) hide show
  1. package/dist/cjs/{add-icon-BklgM02f.js → add-icon-r-uugVfd.js} +1 -1
  2. package/dist/cjs/{app-globals-XGpRBTr6.js → app-globals-BoQSQFz7.js} +1 -1
  3. package/dist/cjs/{arrow-up-icon-BLo1aQC2.js → arrow-up-icon-BfnEuyBs.js} +1 -1
  4. package/dist/cjs/branch-date-dropdown_17.cjs.entry.js +51 -45
  5. package/dist/cjs/{calendar-days-icon-Cf14ROXV.js → calendar-days-icon-CDsv0_-r.js} +1 -1
  6. package/dist/cjs/{check-icon-DaQxP2EY.js → check-icon-BNxUv6rL.js} +1 -1
  7. package/dist/cjs/clock-DsYk5zt3.js +30 -0
  8. package/dist/cjs/dead-stock-lookup_3.cjs.entry.js +10 -9
  9. package/dist/cjs/{decode-time-offset-DOUImlif.js → decode-time-offset-CcpzHLhD.js} +10 -2
  10. package/dist/cjs/flexible-container.cjs.entry.js +2 -2
  11. package/dist/cjs/form-checkbox.cjs.entry.js +3 -3
  12. package/dist/cjs/form-date-picker.cjs.entry.js +25 -19
  13. package/dist/cjs/{form-error-message-BtLdHgxO.js → form-error-message-DdEeLvoD.js} +1 -1
  14. package/dist/cjs/{form-input-label-B4lkF89K.js → form-input-label-U5kCHkJl.js} +1 -1
  15. package/dist/cjs/form-input_7.cjs.entry.js +13 -13
  16. package/dist/cjs/form-switch.cjs.entry.js +3 -3
  17. package/dist/cjs/form-time-picker.cjs.entry.js +4 -4
  18. package/dist/cjs/{functions-BoIF2xlx.js → functions-Bz2-CHK9.js} +5 -4
  19. package/dist/cjs/general-form.cjs.entry.js +11 -10
  20. package/dist/cjs/general-inquiry-form.cjs.entry.js +11 -10
  21. package/dist/cjs/{get-language-from-url-DwOt9DVH.js → get-language-from-url-CivsCH6R.js} +1 -1
  22. package/dist/cjs/{get-local-language-BPRCaIar.js → get-local-language-BBdU8ppU.js} +2 -2
  23. package/dist/cjs/get-mock-files-VecUdVE7.js +61 -0
  24. package/dist/cjs/{index-BdHAYIvO.js → index-BXyIPFx-.js} +3 -0
  25. package/dist/cjs/information-table.cjs.entry.js +3 -3
  26. package/dist/cjs/{loader-icon-aY56OHXW.js → loader-icon-BkPuyYFm.js} +1 -1
  27. package/dist/cjs/loader.cjs.js +3 -3
  28. package/dist/cjs/loading-spinner.cjs.entry.js +1 -1
  29. package/dist/cjs/manufacturer-part-lookup.cjs.entry.js +4 -4
  30. package/dist/cjs/{mappers-DnWgECCv.js → mappers-D-v6mh0y.js} +10 -8
  31. package/dist/cjs/{material-card-D1UQcy6U.js → material-card-mXTu16Ev.js} +1 -1
  32. package/dist/cjs/mock-assets-Dio-Q8Yd.js +13 -0
  33. package/dist/cjs/part-lookup.cjs.entry.js +4 -4
  34. package/dist/cjs/{qr-code-scan-CtKK6wLL.js → qr-code-scan-BH1paDvW.js} +1 -1
  35. package/dist/cjs/{reveal-below-CyYolTYX.js → reveal-below-7_fSN_sU.js} +1 -1
  36. package/dist/cjs/service-booking-form.cjs.entry.js +11 -10
  37. package/dist/cjs/shift-accordion.cjs.entry.js +2 -2
  38. package/dist/cjs/shift-checkbox.cjs.entry.js +3 -3
  39. package/dist/cjs/shift-components.cjs.js +3 -3
  40. package/dist/cjs/shift-slider.cjs.entry.js +1 -1
  41. package/dist/cjs/shift-switch.cjs.entry.js +2 -2
  42. package/dist/cjs/shift-tab-content.cjs.entry.js +2 -2
  43. package/dist/cjs/shift-tabs_2.cjs.entry.js +7 -7
  44. package/dist/cjs/ssc-lookup-form.cjs.entry.js +11 -10
  45. package/dist/cjs/test-drive-form.cjs.entry.js +11 -10
  46. package/dist/cjs/{triangle-alert-CTvU1eGY.js → triangle-alert-C_xSEmRy.js} +1 -1
  47. package/dist/cjs/vehicle-accessories_8.cjs.entry.js +36 -34
  48. package/dist/cjs/{vehicle-info-layout-CRpL8UMY.js → vehicle-info-layout-CjYyiBEq.js} +1 -1
  49. package/dist/cjs/vehicle-lookup.cjs.entry.js +21 -17
  50. package/dist/cjs/vehicle-quotation-form.cjs.entry.js +8 -7
  51. package/dist/cjs/{white-loader-CveXuRsH.js → white-loader-CH2BrmT6.js} +1 -1
  52. package/dist/collection/components/components/empty.css +1 -1
  53. package/dist/collection/components/components/flexible-container.css +1 -1
  54. package/dist/collection/components/components/information-table.css +1 -1
  55. package/dist/collection/components/components/shift-accordion.css +1 -1
  56. package/dist/collection/components/components/shift-portal.css +1 -1
  57. package/dist/collection/components/components/shift-select-dropdown.css +1 -1
  58. package/dist/collection/components/components/shift-select.css +1 -1
  59. package/dist/collection/components/components/shift-tab-content.css +1 -1
  60. package/dist/collection/components/components/shift-tabs.css +1 -1
  61. package/dist/collection/components/form-elements/branch-date-picker.js +30 -8
  62. package/dist/collection/components/form-elements/branch-slot-picker.css +1 -1
  63. package/dist/collection/components/form-elements/branch-slot-picker.js +29 -6
  64. package/dist/collection/components/form-elements/form-date-picker-legacy.js +40 -15
  65. package/dist/collection/components/form-elements/form-inputs.css +1 -1
  66. package/dist/collection/components/form-elements/form-picker-input.js +27 -7
  67. package/dist/collection/components/form-elements/form-structure.js +20 -1
  68. package/dist/collection/components/forms/defaults/mappers.js +6 -4
  69. package/dist/collection/components/forms/general-form.js +21 -2
  70. package/dist/collection/components/forms/general-inquiry.js +21 -2
  71. package/dist/collection/components/forms/service-booking.js +21 -2
  72. package/dist/collection/components/forms/ssc-lookup.js +21 -2
  73. package/dist/collection/components/forms/test-drive.js +21 -2
  74. package/dist/collection/components/forms/vehicle-quotation.js +21 -2
  75. package/dist/collection/components/part-lookup/dead-stock-lookup.css +1 -1
  76. package/dist/collection/components/part-lookup/distributor-lookup.css +1 -1
  77. package/dist/collection/components/part-lookup/manufacturer-lookup.css +1 -1
  78. package/dist/collection/components/part-lookup/manufacturer-part-lookup.css +1 -1
  79. package/dist/collection/components/part-lookup/part-lookup.css +1 -1
  80. package/dist/collection/components/vehicle-lookup/components/CoverageTimeline.js +2 -2
  81. package/dist/collection/components/vehicle-lookup/vehicle-accessories.css +1 -1
  82. package/dist/collection/components/vehicle-lookup/vehicle-accessories.js +21 -2
  83. package/dist/collection/components/vehicle-lookup/vehicle-claimable-items.css +1 -1
  84. package/dist/collection/components/vehicle-lookup/vehicle-claimable-items.js +24 -5
  85. package/dist/collection/components/vehicle-lookup/vehicle-item-claim-form.css +1 -1
  86. package/dist/collection/components/vehicle-lookup/vehicle-lookup.css +1 -1
  87. package/dist/collection/components/vehicle-lookup/vehicle-lookup.js +61 -12
  88. package/dist/collection/components/vehicle-lookup/vehicle-paint-thickness.css +1 -1
  89. package/dist/collection/components/vehicle-lookup/vehicle-paint-thickness.js +19 -0
  90. package/dist/collection/components/vehicle-lookup/vehicle-sale-information.css +1 -1
  91. package/dist/collection/components/vehicle-lookup/vehicle-sale-information.js +21 -2
  92. package/dist/collection/components/vehicle-lookup/vehicle-service-history.css +1 -1
  93. package/dist/collection/components/vehicle-lookup/vehicle-service-history.js +20 -1
  94. package/dist/collection/components/vehicle-lookup/vehicle-specification.css +1 -1
  95. package/dist/collection/components/vehicle-lookup/vehicle-specification.js +20 -1
  96. package/dist/collection/components/vehicle-lookup/vehicle-ssc.css +1 -1
  97. package/dist/collection/components/vehicle-lookup/vehicle-ssc.js +21 -2
  98. package/dist/collection/components/vehicle-lookup/vehicle-warranty-timeline.css +1 -1
  99. package/dist/collection/components/vehicle-lookup/vehicle-warranty-timeline.js +20 -1
  100. package/dist/collection/features/form-hook/functions.js +2 -1
  101. package/dist/collection/features/form-hook/render-structure.js +1 -1
  102. package/dist/collection/features/mocks/data/assets/accessories/accessory.svg +10 -0
  103. package/dist/collection/features/mocks/data/assets/accessories/floor-mats.svg +10 -0
  104. package/dist/collection/features/mocks/data/assets/accessories/mud-guards.svg +11 -0
  105. package/dist/collection/features/mocks/data/assets/accessories/roof-rack.svg +11 -0
  106. package/dist/collection/features/mocks/data/assets/accessories/roof-rails.svg +11 -0
  107. package/dist/collection/features/mocks/data/assets/accessories/side-steps.svg +11 -0
  108. package/dist/collection/features/mocks/data/assets/accessories/tow-bar.svg +12 -0
  109. package/dist/collection/features/mocks/data/assets/badges/badge-1.svg +5 -0
  110. package/dist/collection/features/mocks/data/assets/badges/badge-2.svg +5 -0
  111. package/dist/collection/features/mocks/data/assets/badges/badge-3.svg +5 -0
  112. package/dist/collection/features/mocks/data/assets/badges/badge-4.svg +5 -0
  113. package/dist/collection/features/mocks/data/assets/badges/badge-5.svg +5 -0
  114. package/dist/collection/features/mocks/data/assets/badges/badge-6.svg +5 -0
  115. package/dist/collection/features/mocks/data/assets/documents/service-invoice-qr.svg +18 -0
  116. package/dist/collection/features/mocks/data/assets/documents/signed-claim-document.svg +21 -0
  117. package/dist/collection/features/mocks/data/assets/paint-panels/door-front-left-detail.svg +7 -0
  118. package/dist/collection/features/mocks/data/assets/paint-panels/door-front-left.svg +6 -0
  119. package/dist/collection/features/mocks/data/assets/paint-panels/door-front-right-detail.svg +7 -0
  120. package/dist/collection/features/mocks/data/assets/paint-panels/door-front-right.svg +6 -0
  121. package/dist/collection/features/mocks/data/assets/paint-panels/door-rear-left-detail.svg +7 -0
  122. package/dist/collection/features/mocks/data/assets/paint-panels/door-rear-left.svg +6 -0
  123. package/dist/collection/features/mocks/data/assets/paint-panels/door-rear-right-detail.svg +7 -0
  124. package/dist/collection/features/mocks/data/assets/paint-panels/door-rear-right.svg +6 -0
  125. package/dist/collection/features/mocks/data/assets/paint-panels/fender-front-left-detail.svg +7 -0
  126. package/dist/collection/features/mocks/data/assets/paint-panels/fender-front-left.svg +6 -0
  127. package/dist/collection/features/mocks/data/assets/paint-panels/fender-front-right-detail.svg +7 -0
  128. package/dist/collection/features/mocks/data/assets/paint-panels/fender-front-right.svg +6 -0
  129. package/dist/collection/features/mocks/data/assets/paint-panels/fender-rear-left-detail.svg +7 -0
  130. package/dist/collection/features/mocks/data/assets/paint-panels/fender-rear-left.svg +6 -0
  131. package/dist/collection/features/mocks/data/assets/paint-panels/fender-rear-right-detail.svg +7 -0
  132. package/dist/collection/features/mocks/data/assets/paint-panels/fender-rear-right.svg +6 -0
  133. package/dist/collection/features/mocks/data/assets/paint-panels/hood-detail.svg +7 -0
  134. package/dist/collection/features/mocks/data/assets/paint-panels/hood.svg +6 -0
  135. package/dist/collection/features/mocks/data/assets/paint-panels/panel.svg +6 -0
  136. package/dist/collection/features/mocks/data/assets/paint-panels/roof-detail.svg +7 -0
  137. package/dist/collection/features/mocks/data/assets/paint-panels/roof.svg +6 -0
  138. package/dist/collection/features/mocks/data/assets/paint-panels/tail-gate-detail.svg +7 -0
  139. package/dist/collection/features/mocks/data/assets/paint-panels/tail-gate.svg +6 -0
  140. package/dist/collection/features/mocks/get-mock-files.js +19 -14
  141. package/dist/collection/features/mocks/index.js +1 -0
  142. package/dist/collection/features/mocks/mock-assets.js +33 -0
  143. package/dist/collection/features/vehicle-lookup-component/vehicle-lookup-api-integration.js +3 -1
  144. package/dist/collection/global/lib/clock.js +25 -0
  145. package/dist/collection/global/lib/decode-time-offset.js +9 -1
  146. package/dist/collection/templates/forms/docs-content/structure.js +1 -1
  147. package/dist/collection/templates/harness-connection.js +282 -0
  148. package/dist/collection/templates/harness-environment.js +31 -0
  149. package/dist/collection/templates/harness.js +610 -83
  150. package/dist/collection/templates/site-header.js +2 -2
  151. package/dist/components/branch-date-picker.js +1 -1
  152. package/dist/components/branch-slot-picker.js +1 -1
  153. package/dist/components/dead-stock-lookup.js +1 -1
  154. package/dist/components/distributor-lookup.js +1 -1
  155. package/dist/components/flexible-container.js +1 -1
  156. package/dist/components/form-checkbox.js +1 -1
  157. package/dist/components/form-date-picker.js +1 -1
  158. package/dist/components/form-file.js +1 -1
  159. package/dist/components/form-input-preview.js +1 -1
  160. package/dist/components/form-input.js +1 -1
  161. package/dist/components/form-phone-number.js +1 -1
  162. package/dist/components/form-picker-input.js +1 -1
  163. package/dist/components/form-select.js +1 -1
  164. package/dist/components/form-shadow-input.js +1 -1
  165. package/dist/components/form-stepper-control.js +1 -1
  166. package/dist/components/form-stepper-submit.js +1 -1
  167. package/dist/components/form-stepper.js +1 -1
  168. package/dist/components/form-structure-error.js +1 -1
  169. package/dist/components/form-structure.js +1 -1
  170. package/dist/components/form-submit.js +1 -1
  171. package/dist/components/form-switch.js +1 -1
  172. package/dist/components/form-text-area.js +1 -1
  173. package/dist/components/form-time-picker.js +1 -1
  174. package/dist/components/form-vin-input.js +1 -1
  175. package/dist/components/general-form.js +1 -1
  176. package/dist/components/general-inquiry-form.js +1 -1
  177. package/dist/components/index.js +1 -1
  178. package/dist/components/information-table.js +1 -1
  179. package/dist/components/manufacturer-lookup.js +1 -1
  180. package/dist/components/manufacturer-part-lookup.js +1 -1
  181. package/dist/components/{p-C_JD7r43.js → p-3e83-if9.js} +1 -1
  182. package/dist/components/p-B3ztFt72.js +5 -0
  183. package/dist/components/p-B4PUnAtc.js +5 -0
  184. package/dist/components/{p-5PJtxaSF.js → p-BEHSLtOA.js} +1 -1
  185. package/dist/components/{p-pTG13K0y.js → p-B_EZX2Nj.js} +1 -1
  186. package/dist/components/{p-EdmsQERC.js → p-BcgJGb3U.js} +1 -1
  187. package/dist/components/p-BdxXAS3w.js +5 -0
  188. package/dist/components/{p-CCu0O_ud.js → p-Bf7SK7BI.js} +1 -1
  189. package/dist/components/{p-3srybk04.js → p-Bhy0nttE.js} +1 -1
  190. package/dist/components/p-BjDxP9Ar.js +5 -0
  191. package/dist/components/{p-BoXPpy-O.js → p-C-R7Zf1I.js} +1 -1
  192. package/dist/components/{p-ChBR-zl5.js → p-C1-ek7if.js} +1 -1
  193. package/dist/components/p-C3gFyogx.js +5 -0
  194. package/dist/components/p-CI0_r45y.js +5 -0
  195. package/dist/components/p-CJkthPWR.js +5 -0
  196. package/dist/components/{p-CK4mf-4k.js → p-COKUmuuf.js} +1 -1
  197. package/dist/components/{p-Wj1ZYmiQ.js → p-CQ0f2MVb.js} +1 -1
  198. package/dist/components/{p-J4ycJc9N.js → p-CYj0zRtR.js} +1 -1
  199. package/dist/components/{p-D1uN8yoZ.js → p-C_91yYxZ.js} +1 -1
  200. package/dist/components/p-CbIjjt3n.js +5 -0
  201. package/dist/components/{p-C2Rek_O6.js → p-CpX72zLP.js} +1 -1
  202. package/dist/components/{p-CGg_zTw_.js → p-Cuy8EM9Y.js} +1 -1
  203. package/dist/components/p-CwYr8ZOV.js +5 -0
  204. package/dist/components/{p-CRvBKqFL.js → p-Cy-0pkLa.js} +1 -1
  205. package/dist/components/p-DDWKS6lH.js +5 -0
  206. package/dist/components/p-DJr19tRD.js +5 -0
  207. package/dist/components/{p-CGuZmJQb.js → p-DNpppK6M.js} +1 -1
  208. package/dist/components/{p-M-Eh9oXr.js → p-DRtn1_4P.js} +1 -1
  209. package/dist/components/{p-DBaY1d1H.js → p-D_2r73sx.js} +1 -1
  210. package/dist/components/p-De3WmHLm.js +5 -0
  211. package/dist/components/{p-DUf2UXLh.js → p-DokN3NzH.js} +1 -1
  212. package/dist/components/{p-alNayf2Z.js → p-DqCIuURq.js} +1 -1
  213. package/dist/components/{p-C9Yt2FEi.js → p-DuaTomIT.js} +1 -1
  214. package/dist/components/{p-BYRlvNii.js → p-DzPqV0I6.js} +1 -1
  215. package/dist/components/p-GgvQ0B7I.js +5 -0
  216. package/dist/components/p-HVSqY6-d.js +5 -0
  217. package/dist/components/{p-CGrk6CsB.js → p-RKSY-Miv.js} +1 -1
  218. package/dist/components/p-Ty1rh9Up.js +5 -0
  219. package/dist/components/{p-BlpEaYNy.js → p-VTefgaxv.js} +1 -1
  220. package/dist/components/{p-Brn0yPz6.js → p-_8V0swcd.js} +1 -1
  221. package/dist/components/{p-CP502WVr.js → p-ge2RA7lk.js} +1 -1
  222. package/dist/components/p-mZnLUhNr.js +5 -0
  223. package/dist/components/{p-BSU3azxv.js → p-mzWr8UUl.js} +1 -1
  224. package/dist/components/{p-BBZ9h1N0.js → p-wX0fQQYY.js} +1 -1
  225. package/dist/components/{p-8JAXcyx8.js → p-x1Tlf19a.js} +1 -1
  226. package/dist/components/p-z7jdJ402.js +5 -0
  227. package/dist/components/part-lookup.js +1 -1
  228. package/dist/components/service-booking-form.js +1 -1
  229. package/dist/components/shift-accordion.js +1 -1
  230. package/dist/components/shift-checkbox.js +1 -1
  231. package/dist/components/shift-portal.js +1 -1
  232. package/dist/components/shift-select-dropdown.js +1 -1
  233. package/dist/components/shift-select.js +1 -1
  234. package/dist/components/shift-slider.js +1 -1
  235. package/dist/components/shift-switch.js +1 -1
  236. package/dist/components/shift-tab-content.js +1 -1
  237. package/dist/components/shift-tabs.js +1 -1
  238. package/dist/components/ssc-lookup-form.js +1 -1
  239. package/dist/components/test-drive-form.js +1 -1
  240. package/dist/components/vehicle-accessories.js +1 -1
  241. package/dist/components/vehicle-claimable-items.js +1 -1
  242. package/dist/components/vehicle-item-claim-form.js +1 -1
  243. package/dist/components/vehicle-lookup.js +1 -1
  244. package/dist/components/vehicle-paint-thickness.js +1 -1
  245. package/dist/components/vehicle-quotation-form.js +1 -1
  246. package/dist/components/vehicle-sale-information.js +1 -1
  247. package/dist/components/vehicle-service-history.js +1 -1
  248. package/dist/components/vehicle-specification.js +1 -1
  249. package/dist/components/vehicle-ssc.js +1 -1
  250. package/dist/components/vehicle-warranty-timeline.js +1 -1
  251. package/dist/esm/{add-icon-DHh6DJXR.js → add-icon-D9Jel7-B.js} +1 -1
  252. package/dist/esm/{app-globals-CusTGK9D.js → app-globals-inc67m-q.js} +1 -1
  253. package/dist/esm/{arrow-up-icon-Dw_d-rG9.js → arrow-up-icon-Dfl2olS1.js} +1 -1
  254. package/dist/esm/branch-date-dropdown_17.entry.js +51 -45
  255. package/dist/esm/{calendar-days-icon-CnASOv7M.js → calendar-days-icon-zUqcb-fP.js} +1 -1
  256. package/dist/esm/{check-icon-BZQF4tzH.js → check-icon-CcYgNcDZ.js} +1 -1
  257. package/dist/esm/clock-DDWKS6lH.js +27 -0
  258. package/dist/esm/dead-stock-lookup_3.entry.js +10 -9
  259. package/dist/esm/{decode-time-offset-Cib1aJfV.js → decode-time-offset-CDd68_1V.js} +10 -2
  260. package/dist/esm/flexible-container.entry.js +2 -2
  261. package/dist/esm/form-checkbox.entry.js +3 -3
  262. package/dist/esm/form-date-picker.entry.js +25 -19
  263. package/dist/esm/{form-error-message-DWl6p6Dz.js → form-error-message-DxLEOczK.js} +1 -1
  264. package/dist/esm/{form-input-label-6blOw1BN.js → form-input-label-DEqq8CcC.js} +1 -1
  265. package/dist/esm/form-input_7.entry.js +13 -13
  266. package/dist/esm/form-switch.entry.js +3 -3
  267. package/dist/esm/form-time-picker.entry.js +4 -4
  268. package/dist/esm/{functions-BtbnACx_.js → functions-M6Gsc8Mz.js} +5 -4
  269. package/dist/esm/general-form.entry.js +11 -10
  270. package/dist/esm/general-inquiry-form.entry.js +11 -10
  271. package/dist/esm/{get-language-from-url-fV-K15uy.js → get-language-from-url-Bq07dpsD.js} +1 -1
  272. package/dist/esm/{get-local-language-BOTR5Kxb.js → get-local-language-D9DW53vG.js} +2 -2
  273. package/dist/esm/get-mock-files-DQV5ioOw.js +59 -0
  274. package/dist/esm/{index-CteZTPhq.js → index-CsEiWLCt.js} +3 -1
  275. package/dist/esm/information-table.entry.js +3 -3
  276. package/dist/esm/{loader-icon-BvAmA41s.js → loader-icon-CbaFiiB_.js} +1 -1
  277. package/dist/esm/loader.js +4 -4
  278. package/dist/esm/loading-spinner.entry.js +1 -1
  279. package/dist/esm/manufacturer-part-lookup.entry.js +4 -4
  280. package/dist/esm/{mappers-CZs2R7k6.js → mappers-DOWx0ySR.js} +10 -8
  281. package/dist/esm/{material-card-jbQd-0as.js → material-card-CB2xHWMN.js} +1 -1
  282. package/dist/esm/mock-assets-Bixlrdd4.js +11 -0
  283. package/dist/esm/part-lookup.entry.js +4 -4
  284. package/dist/esm/{qr-code-scan-B1nViqZl.js → qr-code-scan-FY8RR9ow.js} +1 -1
  285. package/dist/esm/{reveal-below-DWXRi5w3.js → reveal-below-8wAOxdZk.js} +1 -1
  286. package/dist/esm/service-booking-form.entry.js +11 -10
  287. package/dist/esm/shift-accordion.entry.js +2 -2
  288. package/dist/esm/shift-checkbox.entry.js +3 -3
  289. package/dist/esm/shift-components.js +4 -4
  290. package/dist/esm/shift-slider.entry.js +1 -1
  291. package/dist/esm/shift-switch.entry.js +2 -2
  292. package/dist/esm/shift-tab-content.entry.js +2 -2
  293. package/dist/esm/shift-tabs_2.entry.js +7 -7
  294. package/dist/esm/ssc-lookup-form.entry.js +11 -10
  295. package/dist/esm/test-drive-form.entry.js +11 -10
  296. package/dist/esm/{triangle-alert-BlnfPzWh.js → triangle-alert-DNqiuE_3.js} +1 -1
  297. package/dist/esm/vehicle-accessories_8.entry.js +37 -35
  298. package/dist/esm/{vehicle-info-layout-Dmx94GLp.js → vehicle-info-layout-I6iG9Fcg.js} +1 -1
  299. package/dist/esm/vehicle-lookup.entry.js +21 -17
  300. package/dist/esm/vehicle-quotation-form.entry.js +8 -7
  301. package/dist/esm/{white-loader-B3tJFuNO.js → white-loader-DusGamWD.js} +1 -1
  302. package/dist/integration-manifest.json +19 -9
  303. package/dist/mocks/assets/README.md +54 -0
  304. package/dist/mocks/assets/accessories/accessory.svg +10 -0
  305. package/dist/mocks/assets/accessories/floor-mats.svg +10 -0
  306. package/dist/mocks/assets/accessories/mud-guards.svg +11 -0
  307. package/dist/mocks/assets/accessories/roof-rack.svg +11 -0
  308. package/dist/mocks/assets/accessories/roof-rails.svg +11 -0
  309. package/dist/mocks/assets/accessories/side-steps.svg +11 -0
  310. package/dist/mocks/assets/accessories/tow-bar.svg +12 -0
  311. package/dist/mocks/assets/badges/badge-1.svg +5 -0
  312. package/dist/mocks/assets/badges/badge-2.svg +5 -0
  313. package/dist/mocks/assets/badges/badge-3.svg +5 -0
  314. package/dist/mocks/assets/badges/badge-4.svg +5 -0
  315. package/dist/mocks/assets/badges/badge-5.svg +5 -0
  316. package/dist/mocks/assets/badges/badge-6.svg +5 -0
  317. package/dist/mocks/assets/documents/service-invoice-qr.svg +18 -0
  318. package/dist/mocks/assets/documents/signed-claim-document.svg +21 -0
  319. package/dist/mocks/assets/paint-panels/door-front-left-detail.svg +7 -0
  320. package/dist/mocks/assets/paint-panels/door-front-left.svg +6 -0
  321. package/dist/mocks/assets/paint-panels/door-front-right-detail.svg +7 -0
  322. package/dist/mocks/assets/paint-panels/door-front-right.svg +6 -0
  323. package/dist/mocks/assets/paint-panels/door-rear-left-detail.svg +7 -0
  324. package/dist/mocks/assets/paint-panels/door-rear-left.svg +6 -0
  325. package/dist/mocks/assets/paint-panels/door-rear-right-detail.svg +7 -0
  326. package/dist/mocks/assets/paint-panels/door-rear-right.svg +6 -0
  327. package/dist/mocks/assets/paint-panels/fender-front-left-detail.svg +7 -0
  328. package/dist/mocks/assets/paint-panels/fender-front-left.svg +6 -0
  329. package/dist/mocks/assets/paint-panels/fender-front-right-detail.svg +7 -0
  330. package/dist/mocks/assets/paint-panels/fender-front-right.svg +6 -0
  331. package/dist/mocks/assets/paint-panels/fender-rear-left-detail.svg +7 -0
  332. package/dist/mocks/assets/paint-panels/fender-rear-left.svg +6 -0
  333. package/dist/mocks/assets/paint-panels/fender-rear-right-detail.svg +7 -0
  334. package/dist/mocks/assets/paint-panels/fender-rear-right.svg +6 -0
  335. package/dist/mocks/assets/paint-panels/hood-detail.svg +7 -0
  336. package/dist/mocks/assets/paint-panels/hood.svg +6 -0
  337. package/dist/mocks/assets/paint-panels/panel.svg +6 -0
  338. package/dist/mocks/assets/paint-panels/roof-detail.svg +7 -0
  339. package/dist/mocks/assets/paint-panels/roof.svg +6 -0
  340. package/dist/mocks/assets/paint-panels/tail-gate-detail.svg +7 -0
  341. package/dist/mocks/assets/paint-panels/tail-gate.svg +6 -0
  342. package/dist/shift-components/{p-d2619ed3.entry.js → p-0395b900.entry.js} +1 -1
  343. package/dist/shift-components/{p-be19d7ff.entry.js → p-041ff6e5.entry.js} +1 -1
  344. package/dist/shift-components/p-131c79c9.entry.js +5 -0
  345. package/dist/shift-components/{p-dd104fca.entry.js → p-287c5e75.entry.js} +1 -1
  346. package/dist/shift-components/{p-de2f961f.entry.js → p-30be4db4.entry.js} +1 -1
  347. package/dist/shift-components/p-3c735b0a.entry.js +5 -0
  348. package/dist/shift-components/{p-01ef46a4.entry.js → p-4c826390.entry.js} +1 -1
  349. package/dist/shift-components/p-6833930c.entry.js +5 -0
  350. package/dist/shift-components/{p-72d60d70.entry.js → p-7760cb43.entry.js} +1 -1
  351. package/dist/shift-components/p-81a7b7dd.entry.js +5 -0
  352. package/dist/shift-components/p-82adf890.entry.js +5 -0
  353. package/dist/shift-components/{p-f5c26761.entry.js → p-91d15921.entry.js} +1 -1
  354. package/dist/shift-components/p-9f017e84.entry.js +5 -0
  355. package/dist/shift-components/p-B2ivJ0St.js +5 -0
  356. package/dist/shift-components/{p-Tjvj6pk4.js → p-BHLT4-AT.js} +1 -1
  357. package/dist/shift-components/p-BKobZCvH.js +5 -0
  358. package/dist/shift-components/{p-MzYTUgsB.js → p-BTJYrubY.js} +1 -1
  359. package/dist/shift-components/p-BTfrQeMt.js +5 -0
  360. package/dist/shift-components/{p-BkVfhjgg.js → p-Bxxrkd94.js} +1 -1
  361. package/dist/shift-components/{p-C8PvXL-3.js → p-C7KIr58m.js} +1 -1
  362. package/dist/shift-components/{p-Ccwtsrgg.js → p-CHQ9vjK9.js} +1 -1
  363. package/dist/shift-components/{p-DzV_ls5o.js → p-CTvdWiVG.js} +1 -1
  364. package/dist/shift-components/p-CTy3HfBE.js +5 -0
  365. package/dist/shift-components/{p-oQAUbfw7.js → p-Cet0ur1z.js} +1 -1
  366. package/dist/shift-components/{p-OlAbjfKx.js → p-Cn5_F5mW.js} +1 -1
  367. package/dist/shift-components/p-CsEiWLCt.js +6 -0
  368. package/dist/shift-components/{p-oFzLYYzz.js → p-D5QsRU5_.js} +1 -1
  369. package/dist/shift-components/p-DBog8aSI.js +5 -0
  370. package/dist/shift-components/p-DDWKS6lH.js +5 -0
  371. package/dist/shift-components/{p-DtD7FZCG.js → p-DZGcyLWV.js} +1 -1
  372. package/dist/shift-components/p-Dh2tKZeJ.js +5 -0
  373. package/dist/shift-components/{p-BTNA9XsD.js → p-DxRW_Tfa.js} +1 -1
  374. package/dist/shift-components/{p-D7cqTTll.js → p-M1S8gM54.js} +1 -1
  375. package/dist/shift-components/{p-1b7a0b56.entry.js → p-a863f984.entry.js} +1 -1
  376. package/dist/shift-components/p-a8c58abe.entry.js +5 -0
  377. package/dist/shift-components/p-b6dfb75b.entry.js +5 -0
  378. package/dist/shift-components/{p-d47428d1.entry.js → p-bcfc5126.entry.js} +1 -1
  379. package/dist/shift-components/{p-6704f14c.entry.js → p-c20b97c6.entry.js} +1 -1
  380. package/dist/shift-components/p-c7e694c0.entry.js +5 -0
  381. package/dist/shift-components/p-ceeebc95.entry.js +5 -0
  382. package/dist/shift-components/p-d118078b.entry.js +5 -0
  383. package/dist/shift-components/{p-d9498a58.entry.js → p-d89b19fa.entry.js} +1 -1
  384. package/dist/shift-components/p-dc408027.entry.js +5 -0
  385. package/dist/shift-components/p-e3c2fb00.entry.js +5 -0
  386. package/dist/shift-components/{p-529dc71d.entry.js → p-e3f9e20f.entry.js} +1 -1
  387. package/dist/shift-components/p-f6ca88a5.entry.js +5 -0
  388. package/dist/shift-components/{p-bfwabdVa.js → p-h1L6xTqG.js} +1 -1
  389. package/dist/shift-components/p-iSEtUbmS.js +5 -0
  390. package/dist/shift-components/p-xtI4pqVk.js +5 -0
  391. package/dist/shift-components/shift-components.esm.js +1 -1
  392. package/dist/stencil-docs.json +501 -1
  393. package/dist/types/components/form-elements/branch-date-picker.d.ts +2 -0
  394. package/dist/types/components/form-elements/branch-slot-picker.d.ts +2 -0
  395. package/dist/types/components/form-elements/form-date-picker-legacy.d.ts +4 -0
  396. package/dist/types/components/form-elements/form-picker-input.d.ts +2 -0
  397. package/dist/types/components/form-elements/form-structure.d.ts +1 -0
  398. package/dist/types/components/forms/general-form.d.ts +2 -0
  399. package/dist/types/components/forms/general-inquiry.d.ts +2 -0
  400. package/dist/types/components/forms/service-booking.d.ts +2 -0
  401. package/dist/types/components/forms/ssc-lookup.d.ts +2 -0
  402. package/dist/types/components/forms/test-drive.d.ts +2 -0
  403. package/dist/types/components/forms/vehicle-quotation.d.ts +2 -0
  404. package/dist/types/components/vehicle-lookup/vehicle-accessories.d.ts +1 -0
  405. package/dist/types/components/vehicle-lookup/vehicle-claimable-items.d.ts +1 -0
  406. package/dist/types/components/vehicle-lookup/vehicle-lookup.d.ts +5 -1
  407. package/dist/types/components/vehicle-lookup/vehicle-paint-thickness.d.ts +1 -0
  408. package/dist/types/components/vehicle-lookup/vehicle-sale-information.d.ts +1 -0
  409. package/dist/types/components/vehicle-lookup/vehicle-service-history.d.ts +1 -0
  410. package/dist/types/components/vehicle-lookup/vehicle-specification.d.ts +1 -0
  411. package/dist/types/components/vehicle-lookup/vehicle-ssc.d.ts +1 -0
  412. package/dist/types/components/vehicle-lookup/vehicle-warranty-timeline.d.ts +2 -0
  413. package/dist/types/components.d.ts +136 -0
  414. package/dist/types/features/form-hook/interface.d.ts +1 -0
  415. package/dist/types/features/mocks/index.d.ts +1 -0
  416. package/dist/types/features/mocks/mock-assets.d.ts +1 -0
  417. package/dist/types/features/vehicle-lookup-component/interface.d.ts +1 -0
  418. package/dist/types/global/lib/clock.d.ts +11 -0
  419. package/dist/types/global/lib/decode-time-offset.d.ts +2 -1
  420. package/package.json +2 -1
  421. package/dist/cjs/get-mock-files-Bi8eYFFc.js +0 -53
  422. package/dist/collection/global/api/urls.js +0 -6
  423. package/dist/collection/templates/vehicle-lookup/mock-data.js +0 -4922
  424. package/dist/collection/templates/vehicle-lookup/mock-loader.js +0 -26
  425. package/dist/collection/templates/vehicle-lookup/warranty-mock-data.js +0 -3211
  426. package/dist/components/p-B4vHwF1I.js +0 -5
  427. package/dist/components/p-BGkXfkCv.js +0 -5
  428. package/dist/components/p-BmqqvfSO.js +0 -5
  429. package/dist/components/p-BtsUnQg8.js +0 -5
  430. package/dist/components/p-C9uBduBY.js +0 -5
  431. package/dist/components/p-CIoAFWwG.js +0 -5
  432. package/dist/components/p-CP0ARfFD.js +0 -5
  433. package/dist/components/p-Cpg1zisv.js +0 -5
  434. package/dist/components/p-D8f7alDh.js +0 -5
  435. package/dist/components/p-DkPiQv-q.js +0 -5
  436. package/dist/components/p-Ju9wl6f3.js +0 -5
  437. package/dist/components/p-M8EGY8dT.js +0 -5
  438. package/dist/components/p-SFsQZegW.js +0 -5
  439. package/dist/components/p-Ub4_exfj.js +0 -5
  440. package/dist/components/p-d7wdNFwt.js +0 -5
  441. package/dist/components/p-ziEMlegx.js +0 -5
  442. package/dist/esm/get-mock-files-CI8h9TGH.js +0 -51
  443. package/dist/mocks/generated/broker-dealer/paint-thickness-certificate.json +0 -1
  444. package/dist/mocks/generated/broker-dealer/part-lookup.json +0 -155
  445. package/dist/mocks/generated/broker-dealer/vehicle-lookup.json +0 -794
  446. package/dist/mocks/generated/edge-cases/paint-thickness-certificate.json +0 -1
  447. package/dist/mocks/generated/edge-cases/part-lookup.json +0 -1
  448. package/dist/mocks/generated/edge-cases/vehicle-lookup.json +0 -124
  449. package/dist/mocks/generated/standard-dealer/paint-thickness-certificate.json +0 -146
  450. package/dist/mocks/generated/standard-dealer/part-lookup.json +0 -157
  451. package/dist/mocks/generated/standard-dealer/vehicle-lookup.json +0 -809
  452. package/dist/shift-components/p-1d93dd0f.entry.js +0 -5
  453. package/dist/shift-components/p-22d7f148.entry.js +0 -5
  454. package/dist/shift-components/p-2e15bfc3.entry.js +0 -5
  455. package/dist/shift-components/p-44bc2f4d.entry.js +0 -5
  456. package/dist/shift-components/p-453a643a.entry.js +0 -5
  457. package/dist/shift-components/p-4818e499.entry.js +0 -5
  458. package/dist/shift-components/p-4e5448da.entry.js +0 -5
  459. package/dist/shift-components/p-5ca9f913.entry.js +0 -5
  460. package/dist/shift-components/p-615471cd.entry.js +0 -5
  461. package/dist/shift-components/p-8623889b.entry.js +0 -5
  462. package/dist/shift-components/p-B9INqdFT.js +0 -5
  463. package/dist/shift-components/p-C4NpWwNE.js +0 -5
  464. package/dist/shift-components/p-C_QDvFTV.js +0 -5
  465. package/dist/shift-components/p-CteZTPhq.js +0 -6
  466. package/dist/shift-components/p-DWoutohJ.js +0 -5
  467. package/dist/shift-components/p-Vn-59FWk.js +0 -5
  468. package/dist/shift-components/p-b59814e8.entry.js +0 -5
  469. package/dist/shift-components/p-c070868c.entry.js +0 -5
  470. package/dist/shift-components/p-cf09a231.entry.js +0 -5
  471. package/dist/shift-components/p-da019c70.entry.js +0 -5
  472. package/dist/shift-components/p-dmBPGl8u.js +0 -5
  473. package/dist/shift-components/p-wZPqPELt.js +0 -5
  474. package/dist/types/global/api/urls.d.ts +0 -2
@@ -0,0 +1,33 @@
1
+ /*!
2
+ * Built by ShiftSoftware
3
+ * Copyright (c)
4
+ */
5
+ import { Build } from "@stencil/core";
6
+ /**
7
+ * The generated fixtures point their pictures (paint panels, company badges, claim documents,
8
+ * accessories) at the copy of `dist/mocks/assets/` on the CDN, so one URL works wherever a fixture
9
+ * is loaded. On the CDN those files exist only from the first release that carries them; the dev
10
+ * server has them right away, at `/mocks/assets/` (the build copies `features/mocks/data` there).
11
+ * In a dev build every such URL is rewritten to the local copy, whichever way the fixture arrived
12
+ * (the component's own fetch or a harness pushing `setMockData`). Prod builds leave the data alone.
13
+ */
14
+ const CDN_MOCKS_PREFIX = /^https:\/\/cdn\.jsdelivr\.net\/npm\/adp-web-components@[^/]+\/dist\/mocks\//;
15
+ const DEV_MOCKS_BASE = 'http://localhost:3000/mocks/';
16
+ export function localizeMockAssets(value) {
17
+ if (!Build.isDev)
18
+ return value;
19
+ return rewrite(value);
20
+ }
21
+ function rewrite(value) {
22
+ if (typeof value === 'string')
23
+ return value.replace(CDN_MOCKS_PREFIX, DEV_MOCKS_BASE);
24
+ if (Array.isArray(value))
25
+ return value.map(rewrite);
26
+ if (value && typeof value === 'object') {
27
+ const copy = {};
28
+ for (const [key, entry] of Object.entries(value))
29
+ copy[key] = rewrite(entry);
30
+ return copy;
31
+ }
32
+ return value;
33
+ }
@@ -3,6 +3,7 @@
3
3
  * Copyright (c)
4
4
  */
5
5
  import { smartInvokable } from "../blazor-ref/index";
6
+ import { localizeMockAssets } from "../mocks/index";
6
7
  import { resolveRequestHeaders } from "./request-headers";
7
8
  import validateVin from "../../global/lib/validate-vin";
8
9
  export const setVehicleLookupData = async (context, newData, headers = {}, { beforeAssignment } = {}) => {
@@ -76,7 +77,8 @@ export const getVehicleLookup = async (context, generalProps, headers = {}) => {
76
77
  }
77
78
  };
78
79
  if (context === null || context === void 0 ? void 0 : context.isDev) {
79
- const newData = context === null || context === void 0 ? void 0 : context.mockData[vin];
80
+ // Fixture pictures point at the CDN copy of the package; a dev build reads the dev server's.
81
+ const newData = localizeMockAssets(context === null || context === void 0 ? void 0 : context.mockData[vin]);
80
82
  return handleResult(newData);
81
83
  }
82
84
  else {
@@ -0,0 +1,25 @@
1
+ /*!
2
+ * Built by ShiftSoftware
3
+ * Copyright (c)
4
+ */
5
+ const ISO_CALENDAR_DATE = /^\d{4}-\d{2}-\d{2}$/;
6
+ /**
7
+ * Resolves a component's optional calendar-date clock to an instant.
8
+ *
9
+ * A supplied value is always midnight UTC. Invalid values fall back to the wall
10
+ * clock so a malformed host attribute cannot leave date UI holding an Invalid
11
+ * Date. Callers that need a calendar label should use `today`, which keeps the
12
+ * same UTC interpretation.
13
+ */
14
+ export function now(value) {
15
+ if (value && ISO_CALENDAR_DATE.test(value)) {
16
+ const resolved = new Date(`${value}T00:00:00.000Z`);
17
+ if (!Number.isNaN(resolved.getTime()) && resolved.toISOString().slice(0, 10) === value)
18
+ return resolved;
19
+ }
20
+ return new Date();
21
+ }
22
+ /** Resolves a component's optional clock to an ISO calendar date in UTC. */
23
+ export function today(value) {
24
+ return now(value).toISOString().slice(0, 10);
25
+ }
@@ -3,7 +3,15 @@
3
3
  * Copyright (c)
4
4
  */
5
5
  import { addDays, addHours, addMinutes, addMonths, addSeconds, addYears, format, startOfDay } from "date-fns";
6
- export function decodeTimeOffset({ offsets, type, date = startOfDay(new Date()) }) {
6
+ import { now } from "./clock";
7
+ export function decodeTimeOffset({ offsets, type, date, today }) {
8
+ if (!date) {
9
+ const clock = now(today);
10
+ // date-fns performs calendar arithmetic in local time. Mirror an explicit
11
+ // UTC calendar date into local time first so a negative offset cannot roll
12
+ // the anchor back to the previous day.
13
+ date = today ? new Date(clock.getUTCFullYear(), clock.getUTCMonth(), clock.getUTCDate()) : startOfDay(clock);
14
+ }
7
15
  if (offsets.length > 0)
8
16
  date = addYears(date, offsets[0]);
9
17
  if (offsets.length > 1)
@@ -248,7 +248,7 @@ export const dataKeys = [
248
248
  summary:
249
249
  'A tiny rewrite language applied to the payload just before it is sent, in object-key order. Four behaviours, chosen by the shape of each entry:\n' +
250
250
  '1. value is an ARRAY — join. Each item is looked up in the payload; if there is no such key the item is used as a literal. The result is assigned to the entry key. Source fields are NOT removed.\n' +
251
- '2. key starts with `parse date: ` — `payload[rest] = parse(payload[rest], <value>, new Date())` using the date-fns format in the value. Produces a Date object.\n' +
251
+ '2. key starts with `parse date: ` — `payload[rest] = parse(payload[rest], <value>, now(today))` using the date-fns format in the value and the form’s optional `today` clock. Produces a Date object.\n' +
252
252
  '3. key starts with `format date: ` — `payload[rest] = formatISO(payload[rest])`. The value is ignored; any non-empty string works, so write something self-documenting.\n' +
253
253
  '4. anything else — RENAME AND MOVE: `additionalData[<value>] = payload[<key>]`, then `delete payload[<key>]`.\n' +
254
254
  'Whenever this key is present and non-empty, `payload.additionalData` is set, even if it ends up `{}`.',
@@ -0,0 +1,282 @@
1
+ const HTTP_PROTOCOLS = new Set(['http:', 'https:']);
2
+ const HEADER_NAME = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
3
+ const STORAGE_VERSION = 1;
4
+
5
+ const clone = value => {
6
+ if (value === undefined || value === null || typeof value !== 'object') return value;
7
+
8
+ return JSON.parse(JSON.stringify(value));
9
+ };
10
+
11
+ const asObject = value => {
12
+ if (!value) return {};
13
+
14
+ if (typeof value === 'object' && !Array.isArray(value)) return clone(value);
15
+
16
+ if (typeof value !== 'string') return {};
17
+
18
+ try {
19
+ const parsed = JSON.parse(value);
20
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};
21
+ } catch {
22
+ return {};
23
+ }
24
+ };
25
+
26
+ const urlField = (name, label, required = true) => ({
27
+ name,
28
+ label,
29
+ kind: 'url',
30
+ inputType: 'url',
31
+ required,
32
+ placeholder: 'https://api.example.invalid/',
33
+ });
34
+
35
+ const secretField = (name, label, kind, placeholder) => ({
36
+ name,
37
+ label,
38
+ kind,
39
+ inputType: 'password',
40
+ required: true,
41
+ placeholder,
42
+ secret: true,
43
+ });
44
+
45
+ export function connectionFields(profile, options = {}) {
46
+ if (profile === 'part') {
47
+ return [urlField('endpointUrl', 'Endpoint URL'), secretField('queryJson', 'Query JSON', 'query', '{"code":""}')];
48
+ }
49
+
50
+ if (profile === 'form') return [urlField('structureUrl', 'Structure URL')];
51
+ if (profile === 'vin-extractor') return [urlField('ocrEndpoint', 'OCR endpoint')];
52
+
53
+ const fields = [urlField('baseUrl', 'Base URL'), secretField('headersJson', 'Request headers JSON', 'headers', '{}')];
54
+
55
+ if (options.recaptcha) fields.push(secretField('recaptchaSiteKey', 'reCAPTCHA site key', 'text', 'Site key'));
56
+ if (options.claim) fields.push(urlField('claimEndpoint', 'Claim endpoint'));
57
+ if (options.unauthorizedSsc) fields.push(urlField('unauthorizedSscEndpoint', 'Manufacturer-check endpoint'));
58
+
59
+ return fields;
60
+ }
61
+
62
+ export function emptyConnectionDraft(profile, options = {}) {
63
+ return Object.fromEntries(connectionFields(profile, options).map(field => [field.name, field.kind === 'headers' || field.kind === 'query' ? '{}' : '']));
64
+ }
65
+
66
+ const validateUrl = value => {
67
+ try {
68
+ const url = new URL(value);
69
+
70
+ return HTTP_PROTOCOLS.has(url.protocol) && !url.username && !url.password;
71
+ } catch {
72
+ return false;
73
+ }
74
+ };
75
+
76
+ const parseJsonObject = (value, field, errors) => {
77
+ try {
78
+ const parsed = JSON.parse(value);
79
+
80
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) throw new Error();
81
+
82
+ return parsed;
83
+ } catch {
84
+ errors[field] = 'Enter one JSON object.';
85
+ return null;
86
+ }
87
+ };
88
+
89
+ export function validateConnection(profile, draft, options = {}) {
90
+ const errors = {};
91
+ const settings = {};
92
+
93
+ for (const field of connectionFields(profile, options)) {
94
+ const value = String(draft?.[field.name] ?? '').trim();
95
+
96
+ if (!value) {
97
+ if (field.required) errors[field.name] = `${field.label} is required.`;
98
+ continue;
99
+ }
100
+
101
+ if (field.kind === 'url') {
102
+ if (!validateUrl(value)) errors[field.name] = 'Enter an absolute HTTP or HTTPS URL without embedded credentials.';
103
+ else settings[field.name] = value;
104
+ continue;
105
+ }
106
+
107
+ if (field.kind === 'headers') {
108
+ const parsed = parseJsonObject(value, field.name, errors);
109
+
110
+ if (parsed) {
111
+ const invalidName = Object.keys(parsed).some(name => !HEADER_NAME.test(name));
112
+ const invalidValue = Object.values(parsed).some(header => !['string', 'number', 'boolean'].includes(typeof header));
113
+
114
+ if (invalidName || invalidValue) errors[field.name] = 'Use valid header names with string, number, or boolean values.';
115
+ else settings.headers = Object.fromEntries(Object.entries(parsed).map(([name, header]) => [name, String(header)]));
116
+ }
117
+ continue;
118
+ }
119
+
120
+ if (field.kind === 'query') {
121
+ const parsed = parseJsonObject(value, field.name, errors);
122
+ if (parsed) settings.query = parsed;
123
+ continue;
124
+ }
125
+
126
+ settings[field.name] = value;
127
+ }
128
+
129
+ return { ok: Object.keys(errors).length === 0, errors, settings };
130
+ }
131
+
132
+ const settingsToDraft = (profile, settings, options) => ({
133
+ ...emptyConnectionDraft(profile, options),
134
+ ...settings,
135
+ headersJson: JSON.stringify(settings?.headers ?? {}),
136
+ queryJson: JSON.stringify(settings?.query ?? {}),
137
+ });
138
+
139
+ export function connectionStorageKey(profile, pathname) {
140
+ return `adp-harness-connection:v${STORAGE_VERSION}:${profile}:${pathname || '/'}`;
141
+ }
142
+
143
+ export function saveConnection(storage, key, settings) {
144
+ storage.setItem(key, JSON.stringify({ version: STORAGE_VERSION, settings }));
145
+ }
146
+
147
+ export function loadConnection(storage, key, profile, options = {}) {
148
+ try {
149
+ const stored = JSON.parse(storage.getItem(key));
150
+ if (stored?.version !== STORAGE_VERSION) return null;
151
+
152
+ const validated = validateConnection(profile, settingsToDraft(profile, stored.settings, options), options);
153
+ return validated.ok ? validated.settings : null;
154
+ } catch {
155
+ return null;
156
+ }
157
+ }
158
+
159
+ export function clearConnection(storage, key) {
160
+ storage.removeItem(key);
161
+ }
162
+
163
+ export function connectionOptions(profile, configured) {
164
+ const options = configured && typeof configured === 'object' ? configured : {};
165
+
166
+ return {
167
+ recaptcha: profile === 'composite' || options.recaptcha === true,
168
+ claim: profile === 'composite' || options.claim === true,
169
+ unauthorizedSsc: profile === 'composite' || options.unauthorizedSsc === true,
170
+ targets: options.targets ?? null,
171
+ };
172
+ }
173
+
174
+ export function captureConnectionState(profile, subject, options = {}) {
175
+ if (profile === 'part') return { endpoint: clone(subject.endpoint) };
176
+ if (profile === 'form') return { structureUrl: subject.structureUrl || subject.getAttribute?.('structure-url') || '', fields: clone(subject.fields) };
177
+ if (profile === 'vin-extractor') return { endpoints: (options.targets ?? [subject]).map(target => target.ocrEndpoint || target.getAttribute?.('ocr-endpoint') || '') };
178
+
179
+ return {
180
+ baseUrl: subject.baseUrl ?? '',
181
+ headers: clone(subject.headers ?? {}),
182
+ requestHeadersProvider: subject.requestHeadersProvider,
183
+ recaptchaKey: subject.recaptchaKey ?? '',
184
+ claimEndPoint: subject.claimEndPoint ?? '',
185
+ unauthorizedSscLookupBaseUrl: subject.unauthorizedSscLookupBaseUrl ?? '',
186
+ childrenProps: clone(subject.childrenProps),
187
+ };
188
+ }
189
+
190
+ const applyCompositeSettings = (subject, settings, options) => {
191
+ const props = asObject(subject.childrenProps);
192
+
193
+ if (options.recaptcha || options.unauthorizedSsc) {
194
+ props['vehicle-ssc'] = {
195
+ ...(props['vehicle-ssc'] ?? {}),
196
+ ...(options.recaptcha ? { recaptchaKey: settings.recaptchaSiteKey } : {}),
197
+ ...(options.unauthorizedSsc ? { unauthorizedSscLookupBaseUrl: settings.unauthorizedSscEndpoint } : {}),
198
+ };
199
+ }
200
+
201
+ if (options.claim) {
202
+ props['vehicle-claimable-items'] = {
203
+ ...(props['vehicle-claimable-items'] ?? {}),
204
+ claimEndPoint: settings.claimEndpoint,
205
+ };
206
+ }
207
+
208
+ subject.childrenProps = props;
209
+ };
210
+
211
+ export function connectProfile(profile, subject, settings, options = {}) {
212
+ if (profile === 'part') {
213
+ subject.endpoint = { url: settings.endpointUrl, query: clone(settings.query) };
214
+ subject.isDev = false;
215
+ return;
216
+ }
217
+
218
+ if (profile === 'form') {
219
+ subject.structureUrl = settings.structureUrl;
220
+ subject.isDev = false;
221
+ return;
222
+ }
223
+
224
+ if (profile === 'vin-extractor') {
225
+ for (const target of options.targets ?? [subject]) target.ocrEndpoint = settings.ocrEndpoint;
226
+ return;
227
+ }
228
+
229
+ subject.baseUrl = settings.baseUrl;
230
+ subject.headers = clone(settings.headers);
231
+ subject.requestHeadersProvider = () => clone(settings.headers);
232
+
233
+ if (profile === 'composite') applyCompositeSettings(subject, settings, options);
234
+ else {
235
+ if (options.recaptcha) subject.recaptchaKey = settings.recaptchaSiteKey;
236
+ if (options.claim) subject.claimEndPoint = settings.claimEndpoint;
237
+ if (options.unauthorizedSsc) subject.unauthorizedSscLookupBaseUrl = settings.unauthorizedSscEndpoint;
238
+ }
239
+
240
+ subject.isDev = false;
241
+ }
242
+
243
+ export function disconnectProfile(profile, subject, baseline, options = {}) {
244
+ if (profile === 'part') {
245
+ subject.endpoint = clone(baseline.endpoint);
246
+ subject.isDev = true;
247
+ return;
248
+ }
249
+
250
+ if (profile === 'form') {
251
+ subject.structureUrl = baseline.structureUrl;
252
+ subject.fields = clone(baseline.fields);
253
+ subject.isDev = true;
254
+ return;
255
+ }
256
+
257
+ if (profile === 'vin-extractor') {
258
+ (options.targets ?? [subject]).forEach((target, index) => {
259
+ target.ocrEndpoint = baseline.endpoints[index] ?? '';
260
+ });
261
+ return;
262
+ }
263
+
264
+ subject.baseUrl = baseline.baseUrl;
265
+ subject.headers = clone(baseline.headers);
266
+ subject.requestHeadersProvider = baseline.requestHeadersProvider;
267
+ subject.recaptchaKey = baseline.recaptchaKey;
268
+ subject.claimEndPoint = baseline.claimEndPoint;
269
+ subject.unauthorizedSscLookupBaseUrl = baseline.unauthorizedSscLookupBaseUrl;
270
+ subject.childrenProps = clone(baseline.childrenProps);
271
+ subject.isDev = true;
272
+ }
273
+
274
+ export function todayChoiceAvailable(mode, connected, hasAnchor) {
275
+ if (connected) return mode === 'live';
276
+ return mode !== 'anchor' || hasAnchor;
277
+ }
278
+
279
+ export function connectionLog(action, profile) {
280
+ const label = profile === 'vin-extractor' ? 'VIN extractor' : profile === 'form' ? 'form' : profile === 'part' ? 'part lookup' : 'vehicle lookup';
281
+ return action === 'connect' ? `${label} · live settings applied · credentials withheld` : `${label} · generated settings restored`;
282
+ }
@@ -0,0 +1,31 @@
1
+ const ENVIRONMENT_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
2
+
3
+ /** Keep the generated index as the only authority for names, anchors and files. */
4
+ export function environmentsFrom(index) {
5
+ if (!Array.isArray(index?.environments)) return [];
6
+
7
+ return index.environments
8
+ .filter(environment => {
9
+ if (!ENVIRONMENT_NAME.test(environment?.name || '') || typeof environment?.files !== 'object' || environment.files === null) return false;
10
+
11
+ return Object.values(environment.files).every(keys => Array.isArray(keys));
12
+ })
13
+ .map(environment => ({ ...environment, label: environmentLabel(environment.name) }));
14
+ }
15
+
16
+ /** Query string wins, then this tab's memory, then the first generated entry. */
17
+ export function chooseEnvironment(environments, requested, stored) {
18
+ return environments.find(environment => environment.name === requested) ?? environments.find(environment => environment.name === stored) ?? environments[0] ?? null;
19
+ }
20
+
21
+ export function environmentFileUrl(siteRoot, environment, file) {
22
+ return new URL(`mocks/generated/${environment}/${file}.json`, siteRoot);
23
+ }
24
+
25
+ export function environmentLabel(name) {
26
+ return String(name)
27
+ .split('-')
28
+ .filter(Boolean)
29
+ .map(word => word[0].toUpperCase() + word.slice(1))
30
+ .join(' ');
31
+ }