@certrev/cert-block 0.5.4 → 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.
- package/CHANGELOG.md +195 -12
- package/LICENSE +21 -0
- package/README.md +422 -50
- package/dist/builder/cert-chrome-data.d.ts +26 -8
- package/dist/builder/cert-chrome-data.d.ts.map +1 -1
- package/dist/builder/cert-chrome-data.js +5 -5
- package/dist/builder/cert-chrome-data.js.map +1 -1
- package/dist/builder/cert-review-card.d.ts +35 -5
- package/dist/builder/cert-review-card.d.ts.map +1 -1
- package/dist/builder/cert-review-card.js +115 -34
- package/dist/builder/cert-review-card.js.map +1 -1
- package/dist/builder/index.d.ts +33 -16
- package/dist/builder/index.d.ts.map +1 -1
- package/dist/builder/index.js +33 -16
- package/dist/builder/index.js.map +1 -1
- package/dist/components/CertBadge.d.ts +2 -2
- package/dist/components/CertBadge.d.ts.map +1 -1
- package/dist/components/CertBadge.js +11 -5
- package/dist/components/CertBadge.js.map +1 -1
- package/dist/components/CertJsonLd.d.ts.map +1 -1
- package/dist/components/CertJsonLd.js.map +1 -1
- package/dist/components/CertRevBacklink.d.ts.map +1 -1
- package/dist/components/CertRevBacklink.js +3 -2
- package/dist/components/CertRevBacklink.js.map +1 -1
- package/dist/components/CertReview.d.ts +1 -1
- package/dist/components/ExpertBio.d.ts.map +1 -1
- package/dist/components/ExpertBio.js +12 -4
- package/dist/components/ExpertBio.js.map +1 -1
- package/dist/components/escape.d.ts +28 -1
- package/dist/components/escape.d.ts.map +1 -1
- package/dist/components/escape.js +37 -8
- package/dist/components/escape.js.map +1 -1
- package/dist/components/format.d.ts +51 -2
- package/dist/components/format.d.ts.map +1 -1
- package/dist/components/format.js +103 -6
- package/dist/components/format.js.map +1 -1
- package/dist/components/preview-block.d.ts +1 -1
- package/dist/components/preview-block.js +3 -3
- package/dist/components/preview-block.js.map +1 -1
- package/dist/components/rel.d.ts +24 -0
- package/dist/components/rel.d.ts.map +1 -0
- package/dist/components/rel.js +24 -0
- package/dist/components/rel.js.map +1 -0
- package/dist/components/render-cert-block.d.ts +50 -22
- package/dist/components/render-cert-block.d.ts.map +1 -1
- package/dist/components/render-cert-block.js +146 -80
- package/dist/components/render-cert-block.js.map +1 -1
- package/dist/components/render-def.d.ts +13 -14
- package/dist/components/render-def.d.ts.map +1 -1
- package/dist/components/render-def.js +14 -15
- package/dist/components/render-def.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/jsonld/project.d.ts +46 -13
- package/dist/jsonld/project.d.ts.map +1 -1
- package/dist/jsonld/project.js +139 -56
- package/dist/jsonld/project.js.map +1 -1
- package/dist/modal/avatar-resize.d.ts +10 -10
- package/dist/modal/avatar-resize.js +14 -14
- package/dist/modal/avatar-resize.js.map +1 -1
- package/dist/modal/cert-modal-view.d.ts +27 -7
- package/dist/modal/cert-modal-view.d.ts.map +1 -1
- package/dist/modal/cert-modal-view.js +49 -25
- package/dist/modal/cert-modal-view.js.map +1 -1
- package/dist/modal/certrev-cert-modal.d.ts +5 -5
- package/dist/modal/certrev-cert-modal.js +9 -9
- package/dist/modal/certrev-cert-modal.js.map +1 -1
- package/dist/modal/certrev-cert-modal.styles.d.ts +6 -6
- package/dist/modal/certrev-cert-modal.styles.d.ts.map +1 -1
- package/dist/modal/certrev-cert-modal.styles.js +8 -8
- package/dist/modal/certrev-cert-modal.styles.js.map +1 -1
- package/dist/modal/certrev-cert.entry.d.ts +8 -6
- package/dist/modal/certrev-cert.entry.d.ts.map +1 -1
- package/dist/modal/certrev-cert.entry.js +9 -7
- package/dist/modal/certrev-cert.entry.js.map +1 -1
- package/dist/modal/certrev-cert.js +6 -6
- package/dist/modal/display-strings.d.ts +25 -5
- package/dist/modal/display-strings.d.ts.map +1 -1
- package/dist/modal/display-strings.js +27 -5
- package/dist/modal/display-strings.js.map +1 -1
- package/dist/modal/escape.d.ts +26 -3
- package/dist/modal/escape.d.ts.map +1 -1
- package/dist/modal/escape.js +32 -3
- package/dist/modal/escape.js.map +1 -1
- package/dist/modal/font-face.d.ts.map +1 -1
- package/dist/modal/font-face.js +8 -11
- package/dist/modal/font-face.js.map +1 -1
- package/dist/modal/ftc-disclosure.d.ts +2 -2
- package/dist/modal/ftc-disclosure.js +2 -2
- package/dist/modal/ftc-guard.d.ts +44 -9
- package/dist/modal/ftc-guard.d.ts.map +1 -1
- package/dist/modal/ftc-guard.js +50 -17
- package/dist/modal/ftc-guard.js.map +1 -1
- package/dist/modal/index.d.ts +1 -1
- package/dist/modal/index.js +1 -1
- package/dist/modal/interactions.d.ts +2 -2
- package/dist/modal/interactions.js +2 -2
- package/dist/modal/logo-paths.js +2 -2
- package/dist/modal/logo-paths.js.map +1 -1
- package/dist/modal/placement.d.ts +4 -3
- package/dist/modal/placement.d.ts.map +1 -1
- package/dist/modal/placement.js +7 -6
- package/dist/modal/placement.js.map +1 -1
- package/dist/modal/revalidate.d.ts +2 -3
- package/dist/modal/revalidate.d.ts.map +1 -1
- package/dist/modal/revalidate.js +2 -3
- package/dist/modal/revalidate.js.map +1 -1
- package/dist/modal/verify-client.d.ts +2 -2
- package/dist/modal/verify-client.js +2 -2
- package/dist/verify/cache.d.ts +21 -6
- package/dist/verify/cache.d.ts.map +1 -1
- package/dist/verify/cache.js +29 -8
- package/dist/verify/cache.js.map +1 -1
- package/dist/verify/fetch-with-deadline.d.ts +35 -0
- package/dist/verify/fetch-with-deadline.d.ts.map +1 -0
- package/dist/verify/fetch-with-deadline.js +55 -0
- package/dist/verify/fetch-with-deadline.js.map +1 -0
- package/dist/verify/get-verified-envelope.d.ts +23 -9
- package/dist/verify/get-verified-envelope.d.ts.map +1 -1
- package/dist/verify/get-verified-envelope.js +89 -40
- package/dist/verify/get-verified-envelope.js.map +1 -1
- package/dist/verify/resolve-kid.d.ts +3 -0
- package/dist/verify/resolve-kid.d.ts.map +1 -1
- package/dist/verify/resolve-kid.js +17 -8
- package/dist/verify/resolve-kid.js.map +1 -1
- package/dist/webcomponent/certrev-badge.d.ts.map +1 -1
- package/dist/webcomponent/certrev-badge.js +24 -2
- package/dist/webcomponent/certrev-badge.js.map +1 -1
- package/dist/webcomponent/render-badge-html.d.ts +1 -1
- package/dist/webcomponent/render-badge-html.d.ts.map +1 -1
- package/dist/webcomponent/render-badge-html.js +36 -17
- package/dist/webcomponent/render-badge-html.js.map +1 -1
- package/package.json +14 -2
- package/src/builder/cert-chrome-data.ts +26 -8
- package/src/builder/cert-review-card.tsx +147 -38
- package/src/builder/index.tsx +34 -17
- package/src/components/CertBadge.tsx +14 -9
- package/src/components/CertJsonLd.tsx +1 -1
- package/src/components/CertRevBacklink.tsx +10 -3
- package/src/components/CertReview.tsx +1 -1
- package/src/components/ExpertBio.tsx +12 -7
- package/src/components/escape.ts +37 -7
- package/src/components/format.ts +102 -6
- package/src/components/preview-block.ts +3 -3
- package/src/components/rel.ts +23 -0
- package/src/components/render-cert-block.ts +192 -109
- package/src/components/render-def.ts +14 -15
- package/src/index.ts +4 -2
- package/src/jsonld/project.ts +155 -59
- package/src/modal/avatar-resize.ts +14 -14
- package/src/modal/cert-modal-view.ts +52 -27
- package/src/modal/certrev-cert-modal.styles.ts +8 -8
- package/src/modal/certrev-cert-modal.ts +9 -9
- package/src/modal/certrev-cert.entry.ts +9 -7
- package/src/modal/display-strings.ts +26 -5
- package/src/modal/escape.ts +32 -4
- package/src/modal/font-face.ts +8 -11
- package/src/modal/ftc-disclosure.ts +2 -2
- package/src/modal/ftc-guard.ts +73 -18
- package/src/modal/index.ts +1 -1
- package/src/modal/interactions.ts +2 -2
- package/src/modal/logo-paths.ts +2 -2
- package/src/modal/placement.ts +7 -6
- package/src/modal/revalidate.ts +2 -3
- package/src/modal/verify-client.ts +2 -2
- package/src/verify/cache.ts +34 -8
- package/src/verify/fetch-with-deadline.ts +60 -0
- package/src/verify/get-verified-envelope.ts +131 -48
- package/src/verify/resolve-kid.ts +22 -6
- package/src/webcomponent/certrev-badge.ts +24 -2
- package/src/webcomponent/render-badge-html.ts +66 -19
- package/src/__tests__/__snapshots__/render-cert-block.test.ts.snap +0 -17
- package/src/__tests__/components.test.tsx +0 -206
- package/src/__tests__/preview-block.test.ts +0 -84
- package/src/__tests__/project.test.ts +0 -128
- package/src/__tests__/render-cert-block.test.ts +0 -657
- package/src/__tests__/render-def.test.tsx +0 -295
- package/src/__tests__/verify.test.ts +0 -239
- package/src/__tests__/webcomponent.test.tsx +0 -116
- package/src/builder/__tests__/builder.test.tsx +0 -158
- package/src/modal/cert-modal-view.test.ts +0 -175
- package/src/modal/certrev-cert-modal.test.ts +0 -125
- package/src/modal/ftc-guard.test.ts +0 -153
- package/src/modal/interactions.test.ts +0 -250
- package/src/modal/placement.test.ts +0 -398
- package/src/modal/revalidate.test.ts +0 -111
- package/src/modal/verify-client.test.ts +0 -164
package/CHANGELOG.md
CHANGED
|
@@ -1,24 +1,207 @@
|
|
|
1
|
-
# Changelog
|
|
1
|
+
# Changelog: @certrev/cert-block
|
|
2
2
|
|
|
3
3
|
The cert card is a **design-locked** component. Semver contract: **patch and minor releases never
|
|
4
4
|
change the rendered cert output and never break a compiling integration** (registration surface,
|
|
5
|
-
exports, types). Anything that would alter what a visitor sees
|
|
5
|
+
exports, types). Anything that would alter what a visitor sees, or require integration changes,
|
|
6
6
|
is announced loudly here first.
|
|
7
7
|
|
|
8
|
-
## 0.
|
|
8
|
+
## 1.0.0 · 2026-08-17
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
**A major, and the semver contract at the top of this file is why.** It says patch and minor
|
|
11
|
+
releases never change the rendered cert output and never break a compiling integration. This
|
|
12
|
+
release does both, deliberately. 0.5.4's entry records what happens when that rule is applied
|
|
13
|
+
loosely; this one applies it strictly.
|
|
14
|
+
|
|
15
|
+
### Breaking: sidebar is the default placement
|
|
16
|
+
|
|
17
|
+
Any previously-exported entry that omits `mode` rendered as a **banner** and now renders as a
|
|
18
|
+
**sidebar**, on every brand, not just the one that asked for it. That is the intended outcome. No
|
|
19
|
+
compatibility flag, no backfill, no per-brand switch: one default, everywhere.
|
|
20
|
+
|
|
21
|
+
The mechanism matters as much as the value. `renderCertBlock`'s `switch (mode)` had no `default:`,
|
|
22
|
+
so an unmatched mode returned `undefined` from a function declared `: string`. On the Builder path
|
|
23
|
+
that lands in `dangerouslySetInnerHTML` and emits a 39-byte empty div: HTTP 200, no console error,
|
|
24
|
+
no throw, card silently gone. `case 'sidebar':` now falls into `default:`, so the declared default
|
|
25
|
+
and the runtime fallback are the same physical line and cannot drift. `RenderCertBlockInput.mode`
|
|
26
|
+
is optional, and the `?? 'banner'` in the Builder card is deleted rather than flipped, because two
|
|
27
|
+
layers naming a default is the bug class. Every arm passes a string literal to the root wrapper, so
|
|
28
|
+
an untyped `mode` can no longer reach the root class name or `data-certrev-mode`. `part` is
|
|
29
|
+
normalised by an explicit rule instead of a catch-all ternary arm. The Builder `mode` and `part`
|
|
30
|
+
inputs now carry a default and an enum, which constrains new editor input; the runtime fallback is
|
|
31
|
+
what covers already-stored content and anything written through Builder's Write API.
|
|
32
|
+
|
|
33
|
+
### Breaking: compliance strings are constants, not caller input
|
|
34
|
+
|
|
35
|
+
- **Removed from `CertBlockFacts`:** `scopeLine` and `credentialLine`. The FTC scope line's curly
|
|
36
|
+
apostrophe is documented in `render-def.ts` as pinned to MSA §3, and `locked(supplied, constant)`
|
|
37
|
+
returned the caller's value whenever it was a non-blank string, so that copy was rewritable from
|
|
38
|
+
a Builder "Advanced" text box. `locked()` is deleted; the package renders its constants.
|
|
39
|
+
- **`compensationCue` is now `string | null`,** and only `null` is meaningful: it OMITS the cue,
|
|
40
|
+
which is the pro-bono reviewer. Any other value renders the locked constant. Previously a null
|
|
41
|
+
cue caused the key to be dropped and the constant to substitute, so a volunteer's card asserted
|
|
42
|
+
"Compensated expert" while the modal in this same package got the same null right.
|
|
43
|
+
|
|
44
|
+
### Breaking: the escape helpers accept what actually arrives
|
|
45
|
+
|
|
46
|
+
`escapeHtml` / `escapeAttribute` widen from `string` to `string | null | undefined` and coerce a
|
|
47
|
+
wrong TYPE rather than throwing. `formatDate` returns null for a non-string instead of fabricating
|
|
48
|
+
a date from a number. `expertNameWithCredentials` returns `''` when the display name is missing.
|
|
49
|
+
Well-formed output is byte-identical; only off-contract input behaves differently.
|
|
50
|
+
|
|
51
|
+
### Rendered output changes
|
|
52
|
+
|
|
53
|
+
- **Every anchor is qualified.** All 14 emission sites across the React components, the string
|
|
54
|
+
renderer, the Web Component and the modal now carry `rel="nofollow sponsored noopener"` from one
|
|
55
|
+
exported constant, `CERTREV_LINK_REL`. Google's link-spam policy names an unqualified
|
|
56
|
+
vendor-required link on a customer's page directly, and `CertBadgeProps` had no `rel` prop, so
|
|
57
|
+
the customer could not qualify them.
|
|
58
|
+
- **An empty memo no longer renders an "Expert memo" heading over an empty `<p>`,** or an empty
|
|
59
|
+
accent-bordered blockquote on the sidebar and custom faces. `bio` already did this correctly
|
|
60
|
+
three times in the same file; only `memo` skipped the check.
|
|
61
|
+
- **An unparseable or blank date no longer asserts a date.** "Credential verified by CertREV on
|
|
62
|
+
not-a-date" and a dangling "on " are gone; so is a bare "Certified" with nothing after it.
|
|
63
|
+
- **A credential carried in the display name is no longer printed twice.** "Dr. Erik Schraga, MD,
|
|
64
|
+
MD, EM" renders one "MD". A token is dropped only when it equals a WHOLE comma-separated segment
|
|
65
|
+
of the name, so "MD" survives "Dr. MDonald", "Jane Amdahl" and "Md. Rahman". This is a render
|
|
66
|
+
boundary declining to print a duplicate; the stored data is still wrong and the repair is
|
|
67
|
+
portal-side.
|
|
68
|
+
- **The expert avatar is marked decorative (`alt=""`) on all four faces.** Three of them emitted
|
|
69
|
+
`alt="Photo of {name}"` beside the same name in text. In `<ExpertBio>` that made a screen reader
|
|
70
|
+
announce it three times running: the aside's `aria-label`, then "Photo of Jane Doe, image", then
|
|
71
|
+
the heading. The modal avatar already had `alt=""`, which is the tell that one decision was made
|
|
72
|
+
four times by hand and landed differently. A source sweep now holds all four in lockstep.
|
|
73
|
+
- **The bio accordion's toggle attribute changed** from `data-certrev-bio-toggle`, which had zero
|
|
74
|
+
consumers anywhere, to `data-certrev-acc`, which is what `modal/interactions.ts` binds. The
|
|
75
|
+
focusable `role="button"` was emitted even with no bio, so a screen reader announced "Read more
|
|
76
|
+
about Dr. X, button, collapsed" over nothing: WCAG 2.1 4.1.2 and 2.1.1, in a vendor string
|
|
77
|
+
renderer the consumer cannot patch. With no bio the row is now inert markup.
|
|
78
|
+
|
|
79
|
+
### JSON-LD
|
|
80
|
+
|
|
81
|
+
- `reviewNode` dropped the caller's `opts`, so any `pageUrl` differing from `canonicalUrls[0]` left
|
|
82
|
+
the Review's `itemReviewed` pointing at an `@id` no node in the graph carried. Fixed, and a graph
|
|
83
|
+
integrity test now walks every `@id` reference and asserts it resolves.
|
|
84
|
+
- `reviewBody`, `Article.author` and `Person.image` were emitted regardless of the display flags
|
|
85
|
+
the card gates them on. All three now resolve visibility through the same `resolveDisplay` the
|
|
86
|
+
card uses, which folds in the render-def's subtractive hide-set. Google: don't mark up content
|
|
87
|
+
that is not visible to readers.
|
|
88
|
+
- **New:** a `WebPage` node with `lastReviewed`, and `recognizedBy` on every credential.
|
|
89
|
+
- **Changed `@id`:** the Organization node is now the constant
|
|
90
|
+
`https://certrev.com/#certrev-organization` instead of being derived from the per-payload
|
|
91
|
+
`verifyUrl` origin, which is what made "one stable CertREV organization node across all pages"
|
|
92
|
+
false. Portal-side alignment is a separate job.
|
|
93
|
+
- `ProjectJsonLdOptions` gains an optional `renderDef`.
|
|
94
|
+
|
|
95
|
+
### Verify layer
|
|
96
|
+
|
|
97
|
+
- **Every fetch now has a deadline.** A hung origin was confirmed still pending at 45 seconds
|
|
98
|
+
inside a server render, with no `AbortSignal` anywhere. An abort lands on the same fail-closed
|
|
99
|
+
suppress path as any other failure.
|
|
100
|
+
- **`ttlMs` is wired through.** It was declared in the shipped `.d.ts` with a documented default
|
|
101
|
+
and never read.
|
|
102
|
+
- **Truthful suppress reasons.** A network failure, a 404 and malformed JSON all collapsed to
|
|
103
|
+
`unsupported_contract_version`.
|
|
104
|
+
- The `delivery_api` cache key omitted `baseUrl` and the whole `RenderContext`, while the
|
|
105
|
+
`metafield` branch two lines below keyed on both.
|
|
106
|
+
|
|
107
|
+
### FTC guard
|
|
108
|
+
|
|
109
|
+
`enforceFtcDisclosure` returns `'intact' | 'tampered' | 'unguarded'` instead of a boolean. Nothing
|
|
110
|
+
in this package emits `.certrev-memo` (that markup is portal's Liquid), so on every React / Web
|
|
111
|
+
Component / `renderCertBlock` surface the guard installed a whole-body, subtree, attributes and
|
|
112
|
+
characterData observer that could never match, then reported `true` for "intact" on a page it had
|
|
113
|
+
not checked. It now declines to observe a document with no guarded surface, and says so. Which
|
|
114
|
+
surfaces the kill switch *should* cover is an open design question, documented not guessed.
|
|
115
|
+
|
|
116
|
+
### Packaging and docs
|
|
117
|
+
|
|
118
|
+
- **`LICENSE` now exists.** Both packages declared MIT and shipped no license text; there was no
|
|
119
|
+
LICENSE file anywhere in the repo. Holder: CertREV LLC.
|
|
120
|
+
- **The tarball no longer ships its own test suite:** 227 files / 315.8 kB → 210 / 269.7 kB, with
|
|
121
|
+
every production source still shipping, `.tsx` included.
|
|
122
|
+
- **The README's central trust claim was false about the path it recommends.** "The package never
|
|
123
|
+
renders an unverified credential" is now scoped to the verify layer, where it holds, and a new
|
|
124
|
+
"PUSH trust model" section states what the Builder path actually guarantees and what revocation
|
|
125
|
+
does and does not do.
|
|
126
|
+
- **The route example exists.** "(See the route example.)" had shipped in `dist/builder/index.d.ts`
|
|
127
|
+
for releases, pointing at a file that never existed.
|
|
128
|
+
- The Hydrogen example wired the kid `certrev-2026-1`, which appears nowhere else in the repo; the
|
|
129
|
+
live JWKS serves `cert-issuer-1`, and a wrong kid suppresses silently with nothing logged.
|
|
130
|
+
- CSP docs gain `font-src` for the 12 `@font-face` rules the modal injects, and `data-fonts` is
|
|
131
|
+
documented.
|
|
132
|
+
- **Biome now lints and formats `.tsx`.** `files.includes` had never listed the extension, so all
|
|
133
|
+
11 React components in the repo were unchecked by the linter that gates every other file. Turning
|
|
134
|
+
it on surfaced the avatar `alt` defect above, three computed keys that were plain string literals,
|
|
135
|
+
a suppression comment for a rule that was never firing, and six files with unsorted imports.
|
|
136
|
+
- **Internal notes stripped from published source** (this package publishes `src/`), and
|
|
137
|
+
`scripts/check-publish-hygiene.mjs` now fails CI on a new one, covering `@certrev/cert-contract`
|
|
138
|
+
on the same rules.
|
|
139
|
+
- **Copy:** the preview block's caption is `Preview · Not a verified certification`; its HTML
|
|
140
|
+
comment banner uses a colon; the Builder registration description uses a semicolon. The npm
|
|
141
|
+
`description` is rewritten to 236 characters, because npm caps the packument description at 255
|
|
142
|
+
and was serving this one cut off mid-word at "…and a".
|
|
143
|
+
|
|
144
|
+
502 tests, up from 249.
|
|
145
|
+
|
|
146
|
+
## 0.5.5 · 2026-07-31
|
|
147
|
+
|
|
148
|
+
- **New:** `repository`, `homepage`, and `bugs` in `package.json`: the npm page now links to the
|
|
149
|
+
public source mirror (`github.com/CertREV/cert-kit`, `packages/cert-block`) and to the issue
|
|
150
|
+
tracker, so the registry listing is no longer a dead end. Provenance metadata only: no code, no
|
|
151
|
+
exports, no dependency change.
|
|
152
|
+
- **Docs:** README gains a source-repo link and states the peer requirement explicitly: **React
|
|
153
|
+
`>=18`**. `peerDependencies.react` has enforced `>=18.0.0` since before 0.5.0 (and
|
|
154
|
+
`peerDependenciesMeta` marks it non-optional), but the README never said so; a consumer had to
|
|
155
|
+
read `package.json` to find the floor.
|
|
156
|
+
- Rendered output: **byte-identical to 0.5.4** (metadata and prose only: no file under `dist/`
|
|
157
|
+
changes).
|
|
158
|
+
|
|
159
|
+
## 0.5.4 · 2026-07-23
|
|
160
|
+
|
|
161
|
+
- **Backfilled: this release shipped with no entry.** 0.5.4 published 2026-07-23 and is the first
|
|
162
|
+
release after this file was written; every other version from 0.3.0 on has a section, including
|
|
163
|
+
0.5.2 (a no-op republish). It changed the public type surface without the notice the contract
|
|
164
|
+
above requires. The omission is recorded here rather than quietly closed.
|
|
165
|
+
- **Changed:** `FONT_SLOTS` / `FONT_STACKS` (`render-def`) widened 3 → 5: `grotesk` (Plus Jakarta
|
|
166
|
+
Sans) and `mono` (JetBrains Mono) added at the shared guide values, byte-identical to this
|
|
167
|
+
package's `RENDER_BLOCK_FONT_STACKS`, the portal `FONT_SLOT_STACKS`, and the Liquid twin's
|
|
168
|
+
branches. Purely additive: `sans` / `serif` / `system` are untouched, so the card == modal
|
|
169
|
+
invariant holds. Shipped lockstep with the portal's Liquid + WordPress grotesk/mono wiring
|
|
170
|
+
This was Phase-3 enablement of a vocabulary that was dormant on both engines, not a repair of a
|
|
171
|
+
live intra-page mismatch: before this release the Liquid card dropped
|
|
172
|
+
`grotesk`/`mono` too, and fell back exactly as the modal did.
|
|
173
|
+
- **Breaking (types). This belonged in a minor, with notice:** `FONT_SLOTS`, `FONT_STACKS`, `FontSlot`
|
|
174
|
+
and `isFontSlot` are public exports. Widening the `FontSlot` union 3 → 5 breaks any consumer
|
|
175
|
+
holding an exhaustive `Record<FontSlot, string>` or an exhaustive `switch` over the slots: a
|
|
176
|
+
break of a compiling integration (exports, types) under the semver contract at the top of this
|
|
177
|
+
file, shipped in a patch.
|
|
178
|
+
- Rendered output: the design-locked cert card and the modal bundle are **byte-identical to
|
|
179
|
+
0.5.3**: across the two published tarballs `dist/components/render-cert-block.js` (sha1
|
|
180
|
+
`22267d5d…`) and all 65 files under `dist/modal/` (`certrev-cert.js` sha1 `2013ebbe…`) are
|
|
181
|
+
unchanged, and neither resolves the shared `FONT_STACKS` (the card carries its own
|
|
182
|
+
`RENDER_BLOCK_FONT_STACKS`, which already listed all five slots; the modal consults no font map
|
|
183
|
+
at all). `<certrev-badge>` passes no `renderDef`, so it is unaffected by construction. Output can
|
|
184
|
+
differ on ONE path: a caller passing a `renderDef` with `fontSlot: 'grotesk' | 'mono'` into the
|
|
185
|
+
legacy `<CertBadge>` / `renderBadgeHtml`, where that slot now resolves to a `--certrev-font`
|
|
186
|
+
stack instead of being dropped as invalid. No brand could author those slots at release time (the
|
|
187
|
+
portal editor did not offer them; every known `render_def` writer emits `sans`), so no visitor's
|
|
188
|
+
render is known to have changed; that last point is inference from the call graph and the
|
|
189
|
+
authoring surface, not a production data check.
|
|
190
|
+
|
|
191
|
+
## 0.5.3 · 2026-07-22
|
|
192
|
+
|
|
193
|
+
- **New:** `certRevCertComponent` (`./builder`): the drop-in gen2 registration entry, with the
|
|
11
194
|
mutable `inputs[]` the SDK's `RegisteredComponent` type expects:
|
|
12
195
|
`customComponents={[...yourComponents, certRevCertComponent]}`. One import, no re-wrapping, no
|
|
13
196
|
readonly spread. `BUILDER_REGISTRATION` (the readonly canonical view) is unchanged.
|
|
14
|
-
- **New:** the 19 exporter-populated wire inputs are marked `advanced
|
|
197
|
+
- **New:** the 19 exporter-populated wire inputs are marked `advanced`: the Builder editor's
|
|
15
198
|
Options tab now leads with the two placement inputs (`mode`, `part`) and tucks the
|
|
16
199
|
system-populated fields under "Advanced". Editor-cosmetic only.
|
|
17
200
|
- **Changed:** `@certrev/cert-contract` moved from a peer dependency (`>=0.5.0`, unbounded) to a
|
|
18
|
-
regular dependency (bounded `^0.5.0`)
|
|
201
|
+
regular dependency (bounded `^0.5.0`): a plain `npm i @certrev/cert-block` is a complete
|
|
19
202
|
install regardless of the consumer's peer-install settings, and a future contract 0.6 can no
|
|
20
203
|
longer float in unreviewed.
|
|
21
|
-
- **Docs:** README rewritten for the gen2 SDK (`customComponents` array)
|
|
204
|
+
- **Docs:** README rewritten for the gen2 SDK (`customComponents` array): the previous README
|
|
22
205
|
showed the gen1 `Builder.registerComponent` API and pre-publish notes that no longer applied
|
|
23
206
|
(the contract package and the modal bundle both ship for real since 0.5.x). Added in-package
|
|
24
207
|
modal instructions (`?url` import + external script + literal CSP allowances), a known-issues
|
|
@@ -27,21 +210,21 @@ is announced loudly here first.
|
|
|
27
210
|
- Rendered output: **byte-identical to 0.5.2** (changes outside the registration surface are
|
|
28
211
|
comment-only).
|
|
29
212
|
|
|
30
|
-
## 0.5.2
|
|
213
|
+
## 0.5.2 · 2026-07-21
|
|
31
214
|
|
|
32
215
|
- Republish of 0.5.1 (the 0.5.1 GitHub-Packages tarball was unfetchable). No code changes.
|
|
33
216
|
|
|
34
|
-
## 0.5.1
|
|
217
|
+
## 0.5.1 · 2026-07
|
|
35
218
|
|
|
36
219
|
- `./modal/placement` subpath exposed (the side-effect-free placement engine).
|
|
37
220
|
|
|
38
|
-
## 0.5.0
|
|
221
|
+
## 0.5.0 · 2026-07
|
|
39
222
|
|
|
40
|
-
- The certificate-modal Web Component moved **into** the package
|
|
223
|
+
- The certificate-modal Web Component moved **into** the package: prebuilt
|
|
41
224
|
dependency-free IIFE at `./modal/certrev-cert.js` (byte-parity with the deployed theme-extension
|
|
42
225
|
asset) + the `./modal` subpath. Banner memo placement (`part`), font hook, static preview block.
|
|
43
226
|
|
|
44
|
-
## 0.4.0
|
|
227
|
+
## 0.4.0 · 2026-07
|
|
45
228
|
|
|
46
229
|
- Render strictly from `placedFields` + `renderCustomFace`; v2 brand-ink theming
|
|
47
230
|
(`barInk` / `inkColor`).
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 CertREV LLC
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|