@certrev/cert-block 0.5.5 → 1.0.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 (190) hide show
  1. package/CHANGELOG.md +164 -26
  2. package/LICENSE +21 -0
  3. package/README.md +415 -54
  4. package/dist/builder/cert-chrome-data.d.ts +26 -8
  5. package/dist/builder/cert-chrome-data.d.ts.map +1 -1
  6. package/dist/builder/cert-chrome-data.js +5 -5
  7. package/dist/builder/cert-chrome-data.js.map +1 -1
  8. package/dist/builder/cert-review-card.d.ts +35 -5
  9. package/dist/builder/cert-review-card.d.ts.map +1 -1
  10. package/dist/builder/cert-review-card.js +115 -34
  11. package/dist/builder/cert-review-card.js.map +1 -1
  12. package/dist/builder/index.d.ts +33 -16
  13. package/dist/builder/index.d.ts.map +1 -1
  14. package/dist/builder/index.js +33 -16
  15. package/dist/builder/index.js.map +1 -1
  16. package/dist/components/CertBadge.d.ts +2 -2
  17. package/dist/components/CertBadge.d.ts.map +1 -1
  18. package/dist/components/CertBadge.js +11 -5
  19. package/dist/components/CertBadge.js.map +1 -1
  20. package/dist/components/CertJsonLd.d.ts.map +1 -1
  21. package/dist/components/CertJsonLd.js.map +1 -1
  22. package/dist/components/CertRevBacklink.d.ts.map +1 -1
  23. package/dist/components/CertRevBacklink.js +3 -2
  24. package/dist/components/CertRevBacklink.js.map +1 -1
  25. package/dist/components/CertReview.d.ts +1 -1
  26. package/dist/components/ExpertBio.d.ts.map +1 -1
  27. package/dist/components/ExpertBio.js +12 -4
  28. package/dist/components/ExpertBio.js.map +1 -1
  29. package/dist/components/escape.d.ts +28 -1
  30. package/dist/components/escape.d.ts.map +1 -1
  31. package/dist/components/escape.js +37 -8
  32. package/dist/components/escape.js.map +1 -1
  33. package/dist/components/format.d.ts +51 -2
  34. package/dist/components/format.d.ts.map +1 -1
  35. package/dist/components/format.js +103 -6
  36. package/dist/components/format.js.map +1 -1
  37. package/dist/components/preview-block.d.ts +1 -1
  38. package/dist/components/preview-block.js +3 -3
  39. package/dist/components/preview-block.js.map +1 -1
  40. package/dist/components/rel.d.ts +24 -0
  41. package/dist/components/rel.d.ts.map +1 -0
  42. package/dist/components/rel.js +24 -0
  43. package/dist/components/rel.js.map +1 -0
  44. package/dist/components/render-cert-block.d.ts +50 -22
  45. package/dist/components/render-cert-block.d.ts.map +1 -1
  46. package/dist/components/render-cert-block.js +146 -80
  47. package/dist/components/render-cert-block.js.map +1 -1
  48. package/dist/components/render-def.d.ts +13 -14
  49. package/dist/components/render-def.d.ts.map +1 -1
  50. package/dist/components/render-def.js +14 -15
  51. package/dist/components/render-def.js.map +1 -1
  52. package/dist/index.d.ts +1 -0
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +4 -2
  55. package/dist/index.js.map +1 -1
  56. package/dist/jsonld/project.d.ts +46 -13
  57. package/dist/jsonld/project.d.ts.map +1 -1
  58. package/dist/jsonld/project.js +139 -56
  59. package/dist/jsonld/project.js.map +1 -1
  60. package/dist/modal/avatar-resize.d.ts +10 -10
  61. package/dist/modal/avatar-resize.js +14 -14
  62. package/dist/modal/avatar-resize.js.map +1 -1
  63. package/dist/modal/cert-modal-view.d.ts +27 -7
  64. package/dist/modal/cert-modal-view.d.ts.map +1 -1
  65. package/dist/modal/cert-modal-view.js +49 -25
  66. package/dist/modal/cert-modal-view.js.map +1 -1
  67. package/dist/modal/certrev-cert-modal.d.ts +5 -5
  68. package/dist/modal/certrev-cert-modal.js +9 -9
  69. package/dist/modal/certrev-cert-modal.js.map +1 -1
  70. package/dist/modal/certrev-cert-modal.styles.d.ts +6 -6
  71. package/dist/modal/certrev-cert-modal.styles.d.ts.map +1 -1
  72. package/dist/modal/certrev-cert-modal.styles.js +8 -8
  73. package/dist/modal/certrev-cert-modal.styles.js.map +1 -1
  74. package/dist/modal/certrev-cert.entry.d.ts +8 -6
  75. package/dist/modal/certrev-cert.entry.d.ts.map +1 -1
  76. package/dist/modal/certrev-cert.entry.js +9 -7
  77. package/dist/modal/certrev-cert.entry.js.map +1 -1
  78. package/dist/modal/certrev-cert.js +6 -6
  79. package/dist/modal/display-strings.d.ts +25 -5
  80. package/dist/modal/display-strings.d.ts.map +1 -1
  81. package/dist/modal/display-strings.js +27 -5
  82. package/dist/modal/display-strings.js.map +1 -1
  83. package/dist/modal/escape.d.ts +26 -3
  84. package/dist/modal/escape.d.ts.map +1 -1
  85. package/dist/modal/escape.js +32 -3
  86. package/dist/modal/escape.js.map +1 -1
  87. package/dist/modal/font-face.d.ts.map +1 -1
  88. package/dist/modal/font-face.js +8 -11
  89. package/dist/modal/font-face.js.map +1 -1
  90. package/dist/modal/ftc-disclosure.d.ts +2 -2
  91. package/dist/modal/ftc-disclosure.js +2 -2
  92. package/dist/modal/ftc-guard.d.ts +44 -9
  93. package/dist/modal/ftc-guard.d.ts.map +1 -1
  94. package/dist/modal/ftc-guard.js +50 -17
  95. package/dist/modal/ftc-guard.js.map +1 -1
  96. package/dist/modal/index.d.ts +1 -1
  97. package/dist/modal/index.js +1 -1
  98. package/dist/modal/interactions.d.ts +2 -2
  99. package/dist/modal/interactions.js +2 -2
  100. package/dist/modal/logo-paths.js +2 -2
  101. package/dist/modal/logo-paths.js.map +1 -1
  102. package/dist/modal/placement.d.ts +4 -3
  103. package/dist/modal/placement.d.ts.map +1 -1
  104. package/dist/modal/placement.js +7 -6
  105. package/dist/modal/placement.js.map +1 -1
  106. package/dist/modal/revalidate.d.ts +2 -3
  107. package/dist/modal/revalidate.d.ts.map +1 -1
  108. package/dist/modal/revalidate.js +2 -3
  109. package/dist/modal/revalidate.js.map +1 -1
  110. package/dist/modal/verify-client.d.ts +2 -2
  111. package/dist/modal/verify-client.js +2 -2
  112. package/dist/verify/cache.d.ts +21 -6
  113. package/dist/verify/cache.d.ts.map +1 -1
  114. package/dist/verify/cache.js +29 -8
  115. package/dist/verify/cache.js.map +1 -1
  116. package/dist/verify/fetch-with-deadline.d.ts +35 -0
  117. package/dist/verify/fetch-with-deadline.d.ts.map +1 -0
  118. package/dist/verify/fetch-with-deadline.js +55 -0
  119. package/dist/verify/fetch-with-deadline.js.map +1 -0
  120. package/dist/verify/get-verified-envelope.d.ts +23 -9
  121. package/dist/verify/get-verified-envelope.d.ts.map +1 -1
  122. package/dist/verify/get-verified-envelope.js +89 -40
  123. package/dist/verify/get-verified-envelope.js.map +1 -1
  124. package/dist/verify/resolve-kid.d.ts +3 -0
  125. package/dist/verify/resolve-kid.d.ts.map +1 -1
  126. package/dist/verify/resolve-kid.js +17 -8
  127. package/dist/verify/resolve-kid.js.map +1 -1
  128. package/dist/webcomponent/certrev-badge.d.ts.map +1 -1
  129. package/dist/webcomponent/certrev-badge.js +24 -2
  130. package/dist/webcomponent/certrev-badge.js.map +1 -1
  131. package/dist/webcomponent/render-badge-html.d.ts +1 -1
  132. package/dist/webcomponent/render-badge-html.d.ts.map +1 -1
  133. package/dist/webcomponent/render-badge-html.js +36 -17
  134. package/dist/webcomponent/render-badge-html.js.map +1 -1
  135. package/package.json +5 -2
  136. package/src/builder/cert-chrome-data.ts +26 -8
  137. package/src/builder/cert-review-card.tsx +147 -38
  138. package/src/builder/index.tsx +34 -17
  139. package/src/components/CertBadge.tsx +14 -9
  140. package/src/components/CertJsonLd.tsx +1 -1
  141. package/src/components/CertRevBacklink.tsx +10 -3
  142. package/src/components/CertReview.tsx +1 -1
  143. package/src/components/ExpertBio.tsx +12 -7
  144. package/src/components/escape.ts +37 -7
  145. package/src/components/format.ts +102 -6
  146. package/src/components/preview-block.ts +3 -3
  147. package/src/components/rel.ts +23 -0
  148. package/src/components/render-cert-block.ts +192 -109
  149. package/src/components/render-def.ts +14 -15
  150. package/src/index.ts +4 -2
  151. package/src/jsonld/project.ts +155 -59
  152. package/src/modal/avatar-resize.ts +14 -14
  153. package/src/modal/cert-modal-view.ts +52 -27
  154. package/src/modal/certrev-cert-modal.styles.ts +8 -8
  155. package/src/modal/certrev-cert-modal.ts +9 -9
  156. package/src/modal/certrev-cert.entry.ts +9 -7
  157. package/src/modal/display-strings.ts +26 -5
  158. package/src/modal/escape.ts +32 -4
  159. package/src/modal/font-face.ts +8 -11
  160. package/src/modal/ftc-disclosure.ts +2 -2
  161. package/src/modal/ftc-guard.ts +73 -18
  162. package/src/modal/index.ts +1 -1
  163. package/src/modal/interactions.ts +2 -2
  164. package/src/modal/logo-paths.ts +2 -2
  165. package/src/modal/placement.ts +7 -6
  166. package/src/modal/revalidate.ts +2 -3
  167. package/src/modal/verify-client.ts +2 -2
  168. package/src/verify/cache.ts +34 -8
  169. package/src/verify/fetch-with-deadline.ts +60 -0
  170. package/src/verify/get-verified-envelope.ts +131 -48
  171. package/src/verify/resolve-kid.ts +22 -6
  172. package/src/webcomponent/certrev-badge.ts +24 -2
  173. package/src/webcomponent/render-badge-html.ts +66 -19
  174. package/src/__tests__/__snapshots__/render-cert-block.test.ts.snap +0 -17
  175. package/src/__tests__/components.test.tsx +0 -206
  176. package/src/__tests__/preview-block.test.ts +0 -84
  177. package/src/__tests__/project.test.ts +0 -128
  178. package/src/__tests__/readme-version.test.ts +0 -51
  179. package/src/__tests__/render-cert-block.test.ts +0 -657
  180. package/src/__tests__/render-def.test.tsx +0 -295
  181. package/src/__tests__/verify.test.ts +0 -239
  182. package/src/__tests__/webcomponent.test.tsx +0 -116
  183. package/src/builder/__tests__/builder.test.tsx +0 -158
  184. package/src/modal/cert-modal-view.test.ts +0 -175
  185. package/src/modal/certrev-cert-modal.test.ts +0 -125
  186. package/src/modal/ftc-guard.test.ts +0 -153
  187. package/src/modal/interactions.test.ts +0 -250
  188. package/src/modal/placement.test.ts +0 -398
  189. package/src/modal/revalidate.test.ts +0 -111
  190. package/src/modal/verify-client.test.ts +0 -164
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * FTC disclosure tamper guard for the NATIVE Shopify cert render (iframe→native parity).
3
3
  *
4
- * In the cross-origin iframe model the expert-memo embed inlined `ftcTamperGuardScript()`
5
- * (src/lib/embed/ftc-disclosure.ts): a kill switch that blanks the memo if the verbatim FTC
4
+ * In the cross-origin iframe model the expert-memo embed inlined the portal's
5
+ * `ftcTamperGuardScript()`: a kill switch that blanks the memo if the verbatim FTC
6
6
  * material-connection disclosure is stripped, hidden, or altered — making the MSA §3
7
7
  * anti-stripping covenant TECHNICALLY enforced, not just contractual. The native memo renders
8
8
  * in the host theme's DOM (no sandbox), so without this it would lose that runtime enforcement.
@@ -17,6 +17,13 @@
17
17
  * - On tamper it neutralizes ONLY the memo (never `document.body` — we're in the host page).
18
18
  * - The contributors card is governed by the badge re-verify (`revalidate.ts`), not this guard;
19
19
  * the card carries only the one-word "Compensated" cue, never the guarded disclosure.
20
+ * - COVERAGE, and it is narrower than it reads: `.certrev-memo` / `.certrev-memo-wrap` are portal
21
+ * LIQUID markup — NOTHING in this package emits either. So the kill switch covers the Liquid
22
+ * memo surface and nothing else. `<CertBadge>` and `render-badge-html.ts` emit the same
23
+ * `[data-ftc-line]` hook inside a `.certrev-badge` (no memo), and `renderCertBlock` emits no
24
+ * hook at all; on those surfaces a pass verifies nothing and says so (`'unguarded'`) rather
25
+ * than reporting success, and no observer is installed at all. Widening enforcement to the
26
+ * badge is a live design decision, not an omission — see `FtcEnforcementResult`.
20
27
  *
21
28
  * Pure DOM, no crypto, no network. The expected text is the single source of truth
22
29
  * `FTC_DISCLOSURE_LINE` (imported, not copied — so a reword can never desync this guard).
@@ -33,18 +40,46 @@ export declare function isDisclosureIntact(memo: Element): boolean;
33
40
  * seal — so the surface can never read as an endorsement without its required disclosure.
34
41
  */
35
42
  export declare function neutralizeMemo(memo: Element): void;
43
+ /**
44
+ * What ONE enforcement pass actually established:
45
+ * - `'intact'` — at least one memo was checked, and every one carried its verbatim, visible line.
46
+ * - `'tampered'` — at least one memo failed the check and was neutralized.
47
+ * - `'unguarded'` — the document holds no `.certrev-memo`, so the pass checked nothing.
48
+ *
49
+ * `'unguarded'` used to be reported as `true`, indistinguishable from `'intact'`, and that
50
+ * conflation was a correctness bug, not a cosmetic one: `.certrev-memo` is portal Liquid markup
51
+ * this package never emits, so on every React / Web Component / `renderCertBlock` surface the pass
52
+ * finds nothing and answered "all intact" about a disclosure it had never looked at — the kill
53
+ * switch silently reporting success on exactly the surfaces it does not protect.
54
+ *
55
+ * The legitimate no-memo certified article (card only, no memo, no disclosure owed) lands here too,
56
+ * and the guard genuinely cannot tell the two apart from the DOM alone. That is the point of a
57
+ * third state rather than a second boolean: "nothing was verified" is the honest answer to both,
58
+ * and it is the caller — which knows which surface it rendered — that can tell whether that is
59
+ * expected or a coverage gap.
60
+ */
61
+ export type FtcEnforcementResult = 'intact' | 'tampered' | 'unguarded';
36
62
  /**
37
63
  * Enforce the disclosure across every memo in the doc: neutralize any whose disclosure isn't
38
- * intact. A doc with no `.certrev-memo` (no-memo article) is a no-op. Returns true if all memos
39
- * present were intact (or none existed).
64
+ * intact. A doc with no `.certrev-memo` is a no-op — see `FtcEnforcementResult` for why that is
65
+ * `'unguarded'` and not success.
40
66
  */
41
- export declare function enforceFtcDisclosure(doc: Document): boolean;
67
+ export declare function enforceFtcDisclosure(doc: Document): FtcEnforcementResult;
42
68
  /**
43
69
  * Install the guard once per document: enforce now (on DOM ready) and re-enforce on later DOM
44
- * mutations within the memo wrap(s) — so a host script that strips / hides / edits the disclosure
45
- * after load still trips the kill switch. Scoping the observer to the small `.certrev-memo-wrap`
46
- * subtree(s) keeps it cheap on a busy storefront page (cf. the iframe, which observed its whole
47
- * — tiny — body). Idempotent.
70
+ * mutations within the guarded subtree(s) — so a host script that strips / hides / edits the
71
+ * disclosure after load still trips the kill switch. Idempotent.
72
+ *
73
+ * The observer scope is the memo wrap(s) — placement.ts relocates a wrap as a node, so the observer
74
+ * tracks it wherever it moves — plus any memo sitting outside a wrap. When the document has
75
+ * NEITHER, NO observer is installed at all. That bail-out is the whole storefront case, not an edge
76
+ * one: this package emits neither selector (both are portal Liquid), so the old `<body>` fallback
77
+ * was the only branch a React / Web Component / `renderCertBlock` page could take, and it pinned a
78
+ * subtree + attributes + characterData observer — no `attributeFilter`, no coalescing — on the
79
+ * host's entire page for the life of the tab, re-running an enforce pass on EVERY mutation a busy
80
+ * storefront makes, to query a selector that could never match. A guard watching a page it cannot
81
+ * act on is pure cost; `enforceFtcDisclosure`'s `'unguarded'` result is the correctness half of the
82
+ * same gap.
48
83
  */
49
84
  export declare function installFtcGuard(doc: Document): void;
50
85
  //# sourceMappingURL=ftc-guard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ftc-guard.d.ts","sourceRoot":"","sources":["../../src/modal/ftc-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,eAAO,MAAM,iBAAiB,oBAAoB,CAAA;AAClD,eAAO,MAAM,aAAa,kBAAkB,CAAA;AAC5C,eAAO,MAAM,kBAAkB,uBAAuB,CAAA;AACtD,+FAA+F;AAC/F,eAAO,MAAM,oBAAoB,iCAAiC,CAAA;AAiBlE,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAKzD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAUlD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAS3D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAwBnD"}
1
+ {"version":3,"file":"ftc-guard.d.ts","sourceRoot":"","sources":["../../src/modal/ftc-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH,eAAO,MAAM,iBAAiB,oBAAoB,CAAA;AAClD,eAAO,MAAM,aAAa,kBAAkB,CAAA;AAC5C,eAAO,MAAM,kBAAkB,uBAAuB,CAAA;AACtD,+FAA+F;AAC/F,eAAO,MAAM,oBAAoB,iCAAiC,CAAA;AAgClE,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAKzD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAUlD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAA;AAEtE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,GAAG,oBAAoB,CAWxE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CA0BnD"}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * FTC disclosure tamper guard for the NATIVE Shopify cert render (iframe→native parity).
3
3
  *
4
- * In the cross-origin iframe model the expert-memo embed inlined `ftcTamperGuardScript()`
5
- * (src/lib/embed/ftc-disclosure.ts): a kill switch that blanks the memo if the verbatim FTC
4
+ * In the cross-origin iframe model the expert-memo embed inlined the portal's
5
+ * `ftcTamperGuardScript()`: a kill switch that blanks the memo if the verbatim FTC
6
6
  * material-connection disclosure is stripped, hidden, or altered — making the MSA §3
7
7
  * anti-stripping covenant TECHNICALLY enforced, not just contractual. The native memo renders
8
8
  * in the host theme's DOM (no sandbox), so without this it would lose that runtime enforcement.
@@ -17,6 +17,13 @@
17
17
  * - On tamper it neutralizes ONLY the memo (never `document.body` — we're in the host page).
18
18
  * - The contributors card is governed by the badge re-verify (`revalidate.ts`), not this guard;
19
19
  * the card carries only the one-word "Compensated" cue, never the guarded disclosure.
20
+ * - COVERAGE, and it is narrower than it reads: `.certrev-memo` / `.certrev-memo-wrap` are portal
21
+ * LIQUID markup — NOTHING in this package emits either. So the kill switch covers the Liquid
22
+ * memo surface and nothing else. `<CertBadge>` and `render-badge-html.ts` emit the same
23
+ * `[data-ftc-line]` hook inside a `.certrev-badge` (no memo), and `renderCertBlock` emits no
24
+ * hook at all; on those surfaces a pass verifies nothing and says so (`'unguarded'`) rather
25
+ * than reporting success, and no observer is installed at all. Widening enforcement to the
26
+ * badge is a live design decision, not an omission — see `FtcEnforcementResult`.
20
27
  *
21
28
  * Pure DOM, no crypto, no network. The expected text is the single source of truth
22
29
  * `FTC_DISCLOSURE_LINE` (imported, not copied — so a reword can never desync this guard).
@@ -27,6 +34,20 @@ export const MEMO_SELECTOR = '.certrev-memo';
27
34
  export const MEMO_WRAP_SELECTOR = '.certrev-memo-wrap';
28
35
  /** Marker on the neutral notice node that replaces a tampered memo (testable / idempotent). */
29
36
  export const FTC_NEUTRALIZED_ATTR = 'data-certrev-ftc-neutralized';
37
+ /**
38
+ * Link qualification for the notice's CertREV anchor — a CertREV link on a brand's page that the
39
+ * brand did not author, so it carries the same qualification as every other anchor this package
40
+ * emits. Deliberately a LOCAL literal rather than an import of `CERTREV_LINK_REL`
41
+ * (`../components/rel.ts`): `src/modal/` imports NOTHING from `src/components/` by design — every
42
+ * shared string here (`ftc-disclosure.ts`, `logo-paths.ts`, `display-strings.ts`) is a modal-local
43
+ * copy so the browser IIFE never drags the SSR renderer in. `ftc-guard.test.ts` imports the
44
+ * components constant and asserts this value stays a superset of it, so the copies cannot drift.
45
+ *
46
+ * `noreferrer` rides ON TOP of the shared tokens (which omit it): this is the only anchor the
47
+ * package opens with `target="_blank"`, and it fires from a page whose operator has just stripped
48
+ * the disclosure — withholding the referrer there is worth the token.
49
+ */
50
+ const NOTICE_LINK_REL = 'nofollow sponsored noopener noreferrer';
30
51
  /** Documents already guarded, so a double script-load can't double-bind. */
31
52
  const guardedDocs = new WeakSet();
32
53
  /** Visible = not display:none / visibility:hidden / opacity:0 and a non-zero box. */
@@ -63,30 +84,42 @@ export function neutralizeMemo(memo) {
63
84
  'font-family:system-ui,-apple-system,sans-serif;font-size:12px;color:#555;padding:12px;line-height:1.4';
64
85
  notice.innerHTML =
65
86
  'This CertREV verification cannot be displayed because its required disclosure was not shown. ' +
66
- '<a href="https://certrev.com" style="color:#555" target="_blank" rel="noopener noreferrer">Learn more</a>.';
87
+ `<a href="https://certrev.com" style="color:#555" target="_blank" rel="${NOTICE_LINK_REL}">Learn more</a>.`;
67
88
  memo.replaceWith(notice);
68
89
  }
69
90
  /**
70
91
  * Enforce the disclosure across every memo in the doc: neutralize any whose disclosure isn't
71
- * intact. A doc with no `.certrev-memo` (no-memo article) is a no-op. Returns true if all memos
72
- * present were intact (or none existed).
92
+ * intact. A doc with no `.certrev-memo` is a no-op — see `FtcEnforcementResult` for why that is
93
+ * `'unguarded'` and not success.
73
94
  */
74
95
  export function enforceFtcDisclosure(doc) {
75
- let allIntact = true;
76
- for (const memo of Array.from(doc.querySelectorAll(MEMO_SELECTOR))) {
96
+ const memos = Array.from(doc.querySelectorAll(MEMO_SELECTOR));
97
+ if (!memos.length)
98
+ return 'unguarded';
99
+ let result = 'intact';
100
+ for (const memo of memos) {
77
101
  if (!isDisclosureIntact(memo)) {
78
- allIntact = false;
102
+ result = 'tampered';
79
103
  neutralizeMemo(memo);
80
104
  }
81
105
  }
82
- return allIntact;
106
+ return result;
83
107
  }
84
108
  /**
85
109
  * Install the guard once per document: enforce now (on DOM ready) and re-enforce on later DOM
86
- * mutations within the memo wrap(s) — so a host script that strips / hides / edits the disclosure
87
- * after load still trips the kill switch. Scoping the observer to the small `.certrev-memo-wrap`
88
- * subtree(s) keeps it cheap on a busy storefront page (cf. the iframe, which observed its whole
89
- * — tiny — body). Idempotent.
110
+ * mutations within the guarded subtree(s) — so a host script that strips / hides / edits the
111
+ * disclosure after load still trips the kill switch. Idempotent.
112
+ *
113
+ * The observer scope is the memo wrap(s) — placement.ts relocates a wrap as a node, so the observer
114
+ * tracks it wherever it moves — plus any memo sitting outside a wrap. When the document has
115
+ * NEITHER, NO observer is installed at all. That bail-out is the whole storefront case, not an edge
116
+ * one: this package emits neither selector (both are portal Liquid), so the old `<body>` fallback
117
+ * was the only branch a React / Web Component / `renderCertBlock` page could take, and it pinned a
118
+ * subtree + attributes + characterData observer — no `attributeFilter`, no coalescing — on the
119
+ * host's entire page for the life of the tab, re-running an enforce pass on EVERY mutation a busy
120
+ * storefront makes, to query a selector that could never match. A guard watching a page it cannot
121
+ * act on is pure cost; `enforceFtcDisclosure`'s `'unguarded'` result is the correctness half of the
122
+ * same gap.
90
123
  */
91
124
  export function installFtcGuard(doc) {
92
125
  if (guardedDocs.has(doc))
@@ -100,11 +133,11 @@ export function installFtcGuard(doc) {
100
133
  const MO = doc.defaultView?.MutationObserver;
101
134
  if (!MO)
102
135
  return;
103
- // Observe the stable memo wrap(s) — placement.js relocates the wrap as a node, so the
104
- // observer tracks it wherever it moves. Fall back to <body> only if no wrap exists.
136
+ // The guarded roots: the stable wrap(s), plus any memo not inside one (in the Liquid shape a
137
+ // wrap always contains its memo, so this is normally just the wraps). No root ⇒ no observer.
105
138
  const wraps = Array.from(doc.querySelectorAll(MEMO_WRAP_SELECTOR));
106
- const scope = wraps.length ? wraps : doc.body ? [doc.body] : [];
107
- for (const node of scope) {
139
+ const looseMemos = Array.from(doc.querySelectorAll(MEMO_SELECTOR)).filter((memo) => !memo.closest(MEMO_WRAP_SELECTOR));
140
+ for (const node of [...wraps, ...looseMemos]) {
108
141
  const mo = new MO(run);
109
142
  mo.observe(node, { childList: true, subtree: true, characterData: true, attributes: true });
110
143
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ftc-guard.js","sourceRoot":"","sources":["../../src/modal/ftc-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAEzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAAiB,CAAA;AAClD,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAA;AAC5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAA;AACtD,+FAA+F;AAC/F,MAAM,CAAC,MAAM,oBAAoB,GAAG,8BAA8B,CAAA;AAElE,4EAA4E;AAC5E,MAAM,WAAW,GAAG,IAAI,OAAO,EAAY,CAAA;AAE3C,qFAAqF;AACrF,SAAS,SAAS,CAAC,EAAW;IAC7B,MAAM,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,WAAW,CAAA;IACxC,2FAA2F;IAC3F,oEAAoE;IACpE,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IACrB,MAAM,CAAC,GAAG,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAA;IAClC,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAChH,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAA;IACpC,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;AACnC,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAA;IAClD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IACvB,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,mBAAmB;QAAE,OAAO,KAAK,CAAA;IACzE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAA;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAa;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAA;IAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,CAAC,YAAY,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAA;IAC7C,MAAM,CAAC,KAAK,CAAC,OAAO;QACnB,uGAAuG,CAAA;IACxG,MAAM,CAAC,SAAS;QACf,+FAA+F;YAC/F,4GAA4G,CAAA;IAC7G,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAa;IACjD,IAAI,SAAS,GAAG,IAAI,CAAA;IACpB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACpE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,SAAS,GAAG,KAAK,CAAA;YACjB,cAAc,CAAC,IAAI,CAAC,CAAA;QACrB,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAA;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,GAAa;IAC5C,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAM;IAChC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAEpB,MAAM,GAAG,GAAG,GAAS,EAAE;QACtB,oBAAoB,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC,CAAA;IAED,MAAM,KAAK,GAAG,GAAS,EAAE;QACxB,GAAG,EAAE,CAAA;QACL,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAA;QAC5C,IAAI,CAAC,EAAE;YAAE,OAAM;QACf,sFAAsF;QACtF,oFAAoF;QACpF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAA;QAClE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,CAAA;YACtB,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5F,CAAC;IACF,CAAC,CAAA;IAED,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS;QAAE,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;;QAC5F,KAAK,EAAE,CAAA;AACb,CAAC"}
1
+ {"version":3,"file":"ftc-guard.js","sourceRoot":"","sources":["../../src/modal/ftc-guard.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * `@certrev/cert-block/modal` — the browser cert MODAL + badge-revalidation Web Component
3
- * (POR-10721 W2). A BYTE-FAITHFUL relocation of portal `src/lib/cert-delivery/wc/`; the IIFE
3
+ * — a BYTE-FAITHFUL relocation of the portal's cert-delivery web-component sources. The IIFE
4
4
  * built from `certrev-cert.entry.ts` (`build:modal-bundle`) is structurally byte-identical to the
5
5
  * Shopify-deployed `certrev-cert.js`, so a headless brand can drop the SAME verified modal onto its
6
6
  * storefront (`<script src=".../dist/modal/certrev-cert.js">`) instead of vendoring a copy.
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * `@certrev/cert-block/modal` — the browser cert MODAL + badge-revalidation Web Component
3
- * (POR-10721 W2). A BYTE-FAITHFUL relocation of portal `src/lib/cert-delivery/wc/`; the IIFE
3
+ * — a BYTE-FAITHFUL relocation of the portal's cert-delivery web-component sources. The IIFE
4
4
  * built from `certrev-cert.entry.ts` (`build:modal-bundle`) is structurally byte-identical to the
5
5
  * Shopify-deployed `certrev-cert.js`, so a headless brand can drop the SAME verified modal onto its
6
6
  * storefront (`<script src=".../dist/modal/certrev-cert.js">`) instead of vendoring a copy.
@@ -2,14 +2,14 @@
2
2
  * Cert-card INTERACTIONS for the native Shopify cert experience.
3
3
  *
4
4
  * Progressive enhancement, delegated from the document (one listener, survives the placement
5
- * reposition). Two behaviours (POR-9827 chevron model):
5
+ * reposition). Two behaviours (the chevron model):
6
6
  *
7
7
  * • Accordion bios — a contributor row carrying `[data-certrev-acc]` toggles its `.open` class
8
8
  * (revealing the row's `.acc-bio` in place; the name caret rotates via CSS) and mirrors the
9
9
  * state on `aria-expanded`. A click on a link inside the row (e.g. the "Compensated expert"
10
10
  * cue) is NOT a toggle. Keyboard: Enter/Space on the role=button row.
11
11
  * • In-page modals: a `[data-certrev-modal-open]` control opens the unified
12
- * `<certrev-cert-modal>` element (POR-10102) via its `.open('cert'|'expert')` method. Bare /
12
+ * `<certrev-cert-modal>` element via its `.open('cert'|'expert')` method. Bare /
13
13
  * `"cert"` opens the certificate dialog; `"expert"` opens the reviewer dialog. With no JS / no
14
14
  * element / no envelope a link control falls back to its href (the certificate or the CertREV
15
15
  * profile page). The element owns its OWN close plumbing (× / Close / backdrop / Esc) inside its
@@ -2,14 +2,14 @@
2
2
  * Cert-card INTERACTIONS for the native Shopify cert experience.
3
3
  *
4
4
  * Progressive enhancement, delegated from the document (one listener, survives the placement
5
- * reposition). Two behaviours (POR-9827 chevron model):
5
+ * reposition). Two behaviours (the chevron model):
6
6
  *
7
7
  * • Accordion bios — a contributor row carrying `[data-certrev-acc]` toggles its `.open` class
8
8
  * (revealing the row's `.acc-bio` in place; the name caret rotates via CSS) and mirrors the
9
9
  * state on `aria-expanded`. A click on a link inside the row (e.g. the "Compensated expert"
10
10
  * cue) is NOT a toggle. Keyboard: Enter/Space on the role=button row.
11
11
  * • In-page modals: a `[data-certrev-modal-open]` control opens the unified
12
- * `<certrev-cert-modal>` element (POR-10102) via its `.open('cert'|'expert')` method. Bare /
12
+ * `<certrev-cert-modal>` element via its `.open('cert'|'expert')` method. Bare /
13
13
  * `"cert"` opens the certificate dialog; `"expert"` opens the reviewer dialog. With no JS / no
14
14
  * element / no envelope a link control falls back to its href (the certificate or the CertREV
15
15
  * profile page). The element owns its OWN close plumbing (× / Close / backdrop / Esc) inside its
@@ -1,5 +1,5 @@
1
- // ⚠ VENDORED, BYTE-FAITHFUL copy of portal `src/lib/design-guide/logo.ts` `LOGO_PATHS`
2
- // (POR-10721 W2). Byte-identical to `../components/render-cert-block.ts`'s private copy;
1
+ // ⚠ VENDORED, BYTE-FAITHFUL copy of the portal design-guide's `LOGO_PATHS`.
2
+ // Byte-identical to `../components/render-cert-block.ts`'s private copy;
3
3
  // kept modal-local so the browser bundle never pulls in the SSR renderer. Unifying the
4
4
  // package's two copies onto one shared leaf module is a post-publish follow-up.
5
5
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"logo-paths.js","sourceRoot":"","sources":["../../src/modal/logo-paths.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,yFAAyF;AACzF,uFAAuF;AACvF,gFAAgF;AAChF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,gOAAgO;IAChO,6NAA6N;IAC7N,yOAAyO;IACzO,6OAA6O;CACpO,CAAC"}
1
+ {"version":3,"file":"logo-paths.js","sourceRoot":"","sources":["../../src/modal/logo-paths.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,yEAAyE;AACzE,uFAAuF;AACvF,gFAAgF;AAChF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,gOAAgO;IAChO,6NAA6N;IAC7N,yOAAyO;IACzO,6OAA6O;CACpO,CAAC"}
@@ -18,7 +18,7 @@
18
18
  * When no references exist, each falls back to a chrome-aware semantic-landmark / theme-class
19
19
  * scan, with a STYLED end-of-article fallback when nothing matches.
20
20
  * (c) Records the matched tier on each wrap as `data-certrev-placement` — the observability the
21
- * pre-launch theme-matrix sweep + the POR-9578 liveness check read, so a silent misplacement
21
+ * pre-launch theme-matrix sweep + the liveness check read, so a silent misplacement
22
22
  * becomes an inspectable signal rather than a surprise on a real brand's store.
23
23
  *
24
24
  * It runs BEFORE the badge re-verify pass and never moves a wrap twice, so the `<certrev-badge>`
@@ -50,8 +50,9 @@ export declare const TOP_CONTENT_SELECTOR: string;
50
50
  * footer, nav, or cart drawer often carries its own `.rte` that precedes the article in document
51
51
  * order — IntelliPure's announcement bar is literally `<div class="announcement__content … rte">`.
52
52
  * `isRenderable` can't reject those (they're visible), so `querySelector('.rte')` returned the
53
- * announcement bar and the contributors card was injected there instead of the article (POR-9809 —
54
- * "contributors not showing"). Placement scopes anchors out of chrome STRUCTURALLY via this set. */
53
+ * announcement bar and the contributors card was injected there instead of the article (the
54
+ * "contributors not showing" regression). Placement scopes anchors out of chrome STRUCTURALLY
55
+ * via this set. */
55
56
  export declare const SITE_CHROME_SELECTOR = "header, [role=\"banner\"], [class*=\"announcement\"], footer, [role=\"contentinfo\"], nav, [role=\"navigation\"], cart-drawer, .cart-drawer, .drawer, .mini-cart, .modal, [role=\"dialog\"]";
56
57
  /** Achieved-tier attribute the JS stamps on each wrap (CSS body-fallback styling + observability). */
57
58
  export declare const PLACEMENT_ATTR = "data-certrev-placement";
@@ -1 +1 @@
1
- {"version":3,"file":"placement.d.ts","sourceRoot":"","sources":["../../src/modal/placement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH;;mDAEmD;AACnD,eAAO,MAAM,iBAAiB,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAOjG,CAAA;AAED;;;;mEAImE;AACnE,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAO3F,CAAA;AAED;;;4FAG4F;AAC5F,eAAO,MAAM,oBAAoB,QAAgD,CAAA;AAEjF;;;;;;qGAMqG;AACrG,eAAO,MAAM,oBAAoB,gMACmJ,CAAA;AAEpL,sGAAsG;AACtG,eAAO,MAAM,cAAc,2BAA2B,CAAA;AACtD,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,wBAAwB,CAAA;AACvD,eAAO,MAAM,cAAc,6DAA2D,CAAA;AACtF,eAAO,MAAM,kBAAkB,uBAAuB,CAAA;AACtD,eAAO,MAAM,kBAAkB,uBAAuB,CAAA;AACtD,uGAAuG;AACvG,eAAO,MAAM,kBAAkB,uBAAuB,CAAA;AACtD,mGAAmG;AACnG,eAAO,MAAM,eAAe,MAAM,CAAA;AAClC,2EAA2E;AAC3E,eAAO,MAAM,QAAQ,KAAK,CAAA;AAC1B;4FAC4F;AAC5F,eAAO,MAAM,mBAAmB,gBAAgB,CAAA;AAEhD,MAAM,WAAW,WAAW;IAC3B,8FAA8F;IAC9F,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,qGAAqG;IACrG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC/B,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IACjC,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;CACjC;AAkED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,GAAG,WAAW,CAyFvE;AAED,sGAAsG;AACtG,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,eAAe,CAoBxD;AAwCD,mGAAmG;AACnG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAOrD"}
1
+ {"version":3,"file":"placement.d.ts","sourceRoot":"","sources":["../../src/modal/placement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH;;mDAEmD;AACnD,eAAO,MAAM,iBAAiB,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAOjG,CAAA;AAED;;;;mEAImE;AACnE,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAO3F,CAAA;AAED;;;4FAG4F;AAC5F,eAAO,MAAM,oBAAoB,QAAgD,CAAA;AAEjF;;;;;;;oBAOoB;AACpB,eAAO,MAAM,oBAAoB,gMACmJ,CAAA;AAEpL,sGAAsG;AACtG,eAAO,MAAM,cAAc,2BAA2B,CAAA;AACtD,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,wBAAwB,CAAA;AACvD,eAAO,MAAM,cAAc,6DAA2D,CAAA;AACtF,eAAO,MAAM,kBAAkB,uBAAuB,CAAA;AACtD,eAAO,MAAM,kBAAkB,uBAAuB,CAAA;AACtD,uGAAuG;AACvG,eAAO,MAAM,kBAAkB,uBAAuB,CAAA;AACtD,mGAAmG;AACnG,eAAO,MAAM,eAAe,MAAM,CAAA;AAClC,2EAA2E;AAC3E,eAAO,MAAM,QAAQ,KAAK,CAAA;AAC1B;4FAC4F;AAC5F,eAAO,MAAM,mBAAmB,gBAAgB,CAAA;AAEhD,MAAM,WAAW,WAAW;IAC3B,8FAA8F;IAC9F,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,qGAAqG;IACrG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC/B,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IACjC,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;CACjC;AAkED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,GAAG,WAAW,CAyFvE;AAED,sGAAsG;AACtG,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,eAAe,CAoBxD;AAwCD,mGAAmG;AACnG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAOrD"}
@@ -18,7 +18,7 @@
18
18
  * When no references exist, each falls back to a chrome-aware semantic-landmark / theme-class
19
19
  * scan, with a STYLED end-of-article fallback when nothing matches.
20
20
  * (c) Records the matched tier on each wrap as `data-certrev-placement` — the observability the
21
- * pre-launch theme-matrix sweep + the POR-9578 liveness check read, so a silent misplacement
21
+ * pre-launch theme-matrix sweep + the liveness check read, so a silent misplacement
22
22
  * becomes an inspectable signal rather than a surprise on a real brand's store.
23
23
  *
24
24
  * It runs BEFORE the badge re-verify pass and never moves a wrap twice, so the `<certrev-badge>`
@@ -58,8 +58,9 @@ export const TOP_CONTENT_SELECTOR = TOP_ANCHORS.map((a) => a.selector).join(', '
58
58
  * footer, nav, or cart drawer often carries its own `.rte` that precedes the article in document
59
59
  * order — IntelliPure's announcement bar is literally `<div class="announcement__content … rte">`.
60
60
  * `isRenderable` can't reject those (they're visible), so `querySelector('.rte')` returned the
61
- * announcement bar and the contributors card was injected there instead of the article (POR-9809 —
62
- * "contributors not showing"). Placement scopes anchors out of chrome STRUCTURALLY via this set. */
61
+ * announcement bar and the contributors card was injected there instead of the article (the
62
+ * "contributors not showing" regression). Placement scopes anchors out of chrome STRUCTURALLY
63
+ * via this set. */
63
64
  export const SITE_CHROME_SELECTOR = 'header, [role="banner"], [class*="announcement"], footer, [role="contentinfo"], nav, [role="navigation"], cart-drawer, .cart-drawer, .drawer, .mini-cart, .modal, [role="dialog"]';
64
65
  /** Achieved-tier attribute the JS stamps on each wrap (CSS body-fallback styling + observability). */
65
66
  export const PLACEMENT_ATTR = 'data-certrev-placement';
@@ -105,7 +106,7 @@ function isRenderable(el) {
105
106
  * Whether `el` sits inside SITE CHROME (announcement bar / header / footer / nav / cart drawer /
106
107
  * modal). Complements `isRenderable`: chrome anchors are usually VISIBLE, so the visibility guard
107
108
  * can't reject them — but a cert wrap must never anchor there. This is the guard that keeps the
108
- * contributors card out of IntelliPure's `.rte`-classed announcement bar (POR-9809).
109
+ * contributors card out of IntelliPure's `.rte`-classed announcement bar.
109
110
  */
110
111
  function isInSiteChrome(el) {
111
112
  return el.closest(SITE_CHROME_SELECTOR) !== null;
@@ -121,7 +122,7 @@ function anchorTier(el, anchors) {
121
122
  }
122
123
  /**
123
124
  * First anchor that exists, is RENDERABLE (not in a hidden drawer/popup), is NOT site chrome (a
124
- * visible announcement bar / header / nav — POR-9809), and is safely positionable relative to
125
+ * visible announcement bar / header / nav), and is safely positionable relative to
125
126
  * `wrap`. Iterates ALL matches per selector (not just the first in document order) so an unusable
126
127
  * early match (a closed drawer's `.rte`, or the announcement bar's) is skipped for the article copy.
127
128
  */
@@ -180,7 +181,7 @@ export function placeWrap(doc, wrap) {
180
181
  // on a certified article) lives INSIDE the body-content container, so `closest(TOP_CONTENT_SELECTOR)`
181
182
  // resolves the exact article `.rte` / `article` / `main` — never a same-classed site-chrome element
182
183
  // that merely precedes the article in document order (IntelliPure's `.rte` announcement bar, which
183
- // is visible so isRenderable can't reject it — POR-9809 "contributors not showing"). This also ties
184
+ // is visible so isRenderable can't reject it — the "contributors not showing" regression). This ties
184
185
  // the card + memo to the SAME article region by construction.
185
186
  const refs = doc.querySelector(REFERENCES_SELECTOR);
186
187
  const owner = refs?.closest(TOP_CONTENT_SELECTOR) ?? null;
@@ -1 +1 @@
1
- {"version":3,"file":"placement.js","sourceRoot":"","sources":["../../src/modal/placement.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"placement.js","sourceRoot":"","sources":["../../src/modal/placement.ts"],"names":[],"mappings":"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"}
@@ -11,10 +11,9 @@
11
11
  * • verdict `render` → leave the SSR badge (verified live);
12
12
  * • verdict `suppress` (invalid-sig / subject-mismatch / revoked / expired) → HIDE it
13
13
  * (fail-closed), stamping `data-certrev-suppressed` with the verdict's reason. A revoked
14
- * placement now serves the SLIM `CertTombstone` (POR-10481), which `verifyArtifact`
14
+ * placement now serves the SLIM `CertTombstone`, which `verifyArtifact`
15
15
  * resolves to `suppress:'revoked'` — so the badge hides AND the suppressed-reason telemetry
16
- * is right (`verifyEnvelope` used to mis-report it as `unsupported_contract_version`;
17
- * POR-10684);
16
+ * is right (`verifyEnvelope` used to mis-report it as `unsupported_contract_version`);
18
17
  * • the Delivery API 404s (no servable artifact) or the network errors → LEAVE the SSR badge.
19
18
  * The SSR copy already passed the Liquid lifecycle gate against the app-owned metafield
20
19
  * (the authoritative revoke/expire surface — the binding retracts it on revoke), so the WC
@@ -1 +1 @@
1
- {"version":3,"file":"revalidate.d.ts","sourceRoot":"","sources":["../../src/modal/revalidate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEzD,4FAA4F;AAC5F,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC3B;AAED;gFACgF;AAChF,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAA;AAEzE,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAC9B;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBxF;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI,CAQ/E"}
1
+ {"version":3,"file":"revalidate.d.ts","sourceRoot":"","sources":["../../src/modal/revalidate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEzD,4FAA4F;AAC5F,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC3B;AAED;gFACgF;AAChF,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAA;AAEzE,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAC9B;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBxF;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI,CAQ/E"}
@@ -11,10 +11,9 @@
11
11
  * • verdict `render` → leave the SSR badge (verified live);
12
12
  * • verdict `suppress` (invalid-sig / subject-mismatch / revoked / expired) → HIDE it
13
13
  * (fail-closed), stamping `data-certrev-suppressed` with the verdict's reason. A revoked
14
- * placement now serves the SLIM `CertTombstone` (POR-10481), which `verifyArtifact`
14
+ * placement now serves the SLIM `CertTombstone`, which `verifyArtifact`
15
15
  * resolves to `suppress:'revoked'` — so the badge hides AND the suppressed-reason telemetry
16
- * is right (`verifyEnvelope` used to mis-report it as `unsupported_contract_version`;
17
- * POR-10684);
16
+ * is right (`verifyEnvelope` used to mis-report it as `unsupported_contract_version`);
18
17
  * • the Delivery API 404s (no servable artifact) or the network errors → LEAVE the SSR badge.
19
18
  * The SSR copy already passed the Liquid lifecycle gate against the app-owned metafield
20
19
  * (the authoritative revoke/expire surface — the binding retracts it on revoke), so the WC
@@ -1 +1 @@
1
- {"version":3,"file":"revalidate.js","sourceRoot":"","sources":["../../src/modal/revalidate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAmBH;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAa,EAAE,IAAoB;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAA;IAClD,IAAI,CAAC,KAAK;QAAE,OAAM;IAElB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAA;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAA;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,SAAS,CAAA;IAChE,IAAI,CAAC,OAAO,IAAI,CAAC,UAAU;QAAE,OAAM,CAAC,gDAAgD;IAEpF,IAAI,OAAoB,CAAA;IACxB,IAAI,CAAC;QACJ,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAA;IAC/D,CAAC;IAAC,MAAM,CAAC;QACR,OAAM,CAAC,sEAAsE;IAC9E,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACnC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QAChC,KAAK,CAAC,YAAY,CAAC,yBAAyB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAC9D,CAAC;AACF,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,qBAAqB,CAAC,GAAa,EAAE,IAAoB;IACxE,MAAM,GAAG,GAAG,GAAS,EAAE;QACtB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,CAAC,EAAE,CAAC;YAClF,KAAK,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACjC,CAAC;IACF,CAAC,CAAA;IACD,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS;QAAE,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;;QAC1F,GAAG,EAAE,CAAA;AACX,CAAC"}
1
+ {"version":3,"file":"revalidate.js","sourceRoot":"","sources":["../../src/modal/revalidate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAmBH;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAa,EAAE,IAAoB;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAA;IAClD,IAAI,CAAC,KAAK;QAAE,OAAM;IAElB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAA;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAA;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,SAAS,CAAA;IAChE,IAAI,CAAC,OAAO,IAAI,CAAC,UAAU;QAAE,OAAM,CAAC,gDAAgD;IAEpF,IAAI,OAAoB,CAAA;IACxB,IAAI,CAAC;QACJ,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAA;IAC/D,CAAC;IAAC,MAAM,CAAC;QACR,OAAM,CAAC,sEAAsE;IAC9E,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACnC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QAChC,KAAK,CAAC,YAAY,CAAC,yBAAyB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAC9D,CAAC;AACF,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,qBAAqB,CAAC,GAAa,EAAE,IAAoB;IACxE,MAAM,GAAG,GAAG,GAAS,EAAE;QACtB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,CAAC,EAAE,CAAC;YAClF,KAAK,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACjC,CAAC;IACF,CAAC,CAAA;IACD,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS;QAAE,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;;QAC1F,GAAG,EAAE,CAAA;AACX,CAAC"}
@@ -5,9 +5,9 @@
5
5
  * `@certrev/cert-contract` (WebCrypto Ed25519 over RFC-8785 JCS — the same kernel the server +
6
6
  * every other edge run). No crypto is reimplemented here.
7
7
  *
8
- * `verifyArtifact` (POR-10684, cert-contract 0.3.0) dispatches on the `kind: 'tombstone'`
8
+ * `verifyArtifact` (cert-contract 0.3.0) dispatches on the `kind: 'tombstone'`
9
9
  * discriminator: a full `CertDeliveryEnvelope` runs the whole crypto + lifecycle pipeline, while
10
- * the SLIM `CertTombstone` the control plane now serves for a revoked placement (POR-10481) —
10
+ * the SLIM `CertTombstone` the control plane now serves for a revoked placement —
11
11
  * which carries NO payload — verifies its own signature + subject and resolves to
12
12
  * `suppress:'revoked'`. The old `verifyEnvelope` fails a tombstone's shape-check and returns
13
13
  * `suppress:'unsupported_contract_version'` (still a blank badge, but the wrong suppressed-reason
@@ -5,9 +5,9 @@
5
5
  * `@certrev/cert-contract` (WebCrypto Ed25519 over RFC-8785 JCS — the same kernel the server +
6
6
  * every other edge run). No crypto is reimplemented here.
7
7
  *
8
- * `verifyArtifact` (POR-10684, cert-contract 0.3.0) dispatches on the `kind: 'tombstone'`
8
+ * `verifyArtifact` (cert-contract 0.3.0) dispatches on the `kind: 'tombstone'`
9
9
  * discriminator: a full `CertDeliveryEnvelope` runs the whole crypto + lifecycle pipeline, while
10
- * the SLIM `CertTombstone` the control plane now serves for a revoked placement (POR-10481) —
10
+ * the SLIM `CertTombstone` the control plane now serves for a revoked placement —
11
11
  * which carries NO payload — verifies its own signature + subject and resolves to
12
12
  * `suppress:'revoked'`. The old `verifyEnvelope` fails a tombstone's shape-check and returns
13
13
  * `suppress:'unsupported_contract_version'` (still a blank badge, but the wrong suppressed-reason
@@ -13,9 +13,9 @@
13
13
  * still recovering quickly (short negative TTL).
14
14
  *
15
15
  * It is deliberately tiny + dependency-free (a Map + timestamps) so it runs in any server
16
- * runtime (Node, edge, workerd). For multi-instance deployments this is per-instance L1;
17
- * pair with a shared CDN/KV cache (the Delivery API is CDN-cacheable on
18
- * `lifecycle.revision`) for L2 — see README.
16
+ * runtime (Node, edge, workerd). For multi-instance deployments this is per-instance L1 and
17
+ * nothing more: each instance keeps its own copy, so an L2 (the CDN in front of the Delivery
18
+ * API, which is cacheable on `lifecycle.revision`, or a shared KV) is the caller's to add.
19
19
  */
20
20
  export interface TtlCacheOptions {
21
21
  /** Positive-result TTL in ms (default 60_000). */
@@ -44,12 +44,27 @@ export declare class TtlCache<V> {
44
44
  * TTL; if `isNegative(value)` returns true (e.g. a 'suppress' verdict) it's cached
45
45
  * with the shorter negative TTL so a transient failure recovers fast. A thrown loader
46
46
  * is NOT cached (it rejects all current waiters and the next call retries).
47
+ *
48
+ * `positiveTtlMs` overrides the cache's positive TTL FOR THIS WRITE only, so one caller
49
+ * can hold a verdict longer/shorter than the cache's default without owning the cache.
50
+ * It deliberately does NOT apply to a negative result: a caller asking for a 10-minute
51
+ * positive TTL is asking for fewer origin reads, not for a transient failure to be
52
+ * remembered for ten minutes (see the negative-TTL rationale in the module header).
47
53
  */
48
- getOrLoad(key: string, loader: () => Promise<V>, isNegative?: (v: V) => boolean): Promise<V>;
49
- /** Insert/overwrite an entry with the appropriate TTL. */
50
- set(key: string, value: V, negative?: boolean): void;
54
+ getOrLoad(key: string, loader: () => Promise<V>, isNegative?: (v: V) => boolean, positiveTtlMs?: number): Promise<V>;
55
+ /** Insert/overwrite an entry. `ttlMsOverride` replaces the TTL this write would otherwise
56
+ * get (positive or negative); omit it for the cache's configured TTLs. */
57
+ set(key: string, value: V, negative?: boolean, ttlMsOverride?: number): void;
51
58
  /** Drop a key (e.g. on a known revocation push). */
52
59
  delete(key: string): void;
60
+ /**
61
+ * Drop every key under a prefix. WHY it exists: a cache key identifies everything the
62
+ * cached value depends on, which for a verdict includes the live content hash the render
63
+ * observed — a fact a revocation webhook does not know. Invalidating by prefix lets the
64
+ * webhook drop a placement without having to reconstruct every render context that ever
65
+ * cached it.
66
+ */
67
+ deletePrefix(prefix: string): void;
53
68
  clear(): void;
54
69
  get size(): number;
55
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/verify/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,eAAe;IAC/B,kDAAkD;IAClD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,8DAA8D;IAC9D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,gDAAgD;IAChD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAC3B;AAQD,qBAAa,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;gBAEtB,IAAI,GAAE,eAAoB;IAOtC,kFAAkF;IAClF,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAUhC;;;;;;;OAOG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAoBlG,0DAA0D;IAC1D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,UAAQ,GAAG,IAAI;IAUlD,oDAAoD;IACpD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIzB,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI,MAAM,CAEjB;CACD"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/verify/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,eAAe;IAC/B,kDAAkD;IAClD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,8DAA8D;IAC9D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,gDAAgD;IAChD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAC3B;AAQD,qBAAa,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;gBAEtB,IAAI,GAAE,eAAoB;IAOtC,kFAAkF;IAClF,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAUhC;;;;;;;;;;;;;OAaG;IACG,SAAS,CACd,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,EAC9B,aAAa,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,CAAC,CAAC;IAoBb;+EAC2E;IAC3E,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,UAAQ,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAW1E,oDAAoD;IACpD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIzB;;;;;;OAMG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMlC,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI,MAAM,CAEjB;CACD"}