Both APIs are now implemented (#746 #766 #751 #773) and adopted in Jahia/luxe-jahia-demo (#458, #459) and on Jahia/jahia.com. A review of both together returned consistent: mostly, learning curve: acceptable — up from "no / too steep" for the image API alone (#767). Five things should be fixed before release. Four are cheap; the fifth is cheap now and breaking the day after.
1. Two published guide snippets do not compile under the scaffold's own strict tsconfig, including one in the link guide's cache-dependency section that a reader copies verbatim. Fix the snippets, then type-check every fenced tsx block in both guides as part of the build.
2. Neither API is in the library README, and the link guide's Reference section links five symbols into it — all five anchors are dead. The image guide's Reference is a plain unlinked list, so the two guides also disagree on what a Reference section is. Add the symbols, or drop the dead links rather than shipping them.
3. context is required on getImageProps and optional on getLinkProps / resolveContentLink. Same concept — the render cache dependency, and the bundleKey that selects module defaults — opposite enforcement, and the two guides state the rule in contradictory terms. Making it required on the link side is a breaking change after release.
4. Only one of the two props tiers can cross into an Island, which is the question both are documented to answer. ImgProps is flat and serializable by design. LinkState carries a JCRNodeWrapper (state.node, added by #769), so state cannot be shipped into an Island at all — and that field has zero consumers in either adoption. Move node off LinkState (a third sibling of anchor/state, or drop it in favour of readNodeReference, which is what jahia.com actually used). While there: state should carry the aria-current value, not just the isCurrent boolean behind it — 7 Island call sites across the two repos hand-write that mapping today.
5. samples/hydrogen teaches the anti-pattern the link guide calls a bug. Five of its six link sites are still <a href={buildNodeUrl(...)}>, including the NavBar and the LanguageSwitcher — the two cases the guide is written around. Two Hero backgrounds should use buildBackgroundImageUrl. This is the cheapest way to give both guides a working showcase.
Decide before merging: what happens to layout="fluid"
fluid was added by #767 as the answer to "0 of 16 luxe sites could use what the guide teaches". It now has zero call sites across all three repos, and both adopters independently reinvented it — wrongly. luxe used constrained plus a hand-written sizes at five sites, its own commit message admitting no single number describes the slot; jahia.com made full-width + sizes="auto" its wrapper default, with a docstring explaining it picked that because fill takes normal-flow images out of flow — it never learned fluid exists.
The name was not the problem. The vocabulary is still missing the commonest real slot: a maximum width, with sizes written by hand. Either let fluid take slotWidth as an optional maximum (ladder capped at 2x, sizes still required from the caller), or delete fluid and document full-width + sizes as the answer. Shipping a layout with no users and two reinventions is how the next review reaches the same verdict.
Smaller divergences, non-breaking to fix later
cacheDependency is a boolean on the image side and a four-form union on the link side. absolute exists on every image function and nowhere on the link side, though a canonical link, an og:url and a JSON-LD url all need it and jahia.com reaches past the API for it. fallback (image) and whenUnresolved (link) answer the same "the content is not there" question with different names, different defaults and non-overlapping capability, and neither guide mentions the other's.
And the highest-value warning either API could carry, which neither does: a view emitting aria-current without cache.mainResource=true. getLinkProps can see the render context and can tell.
Both APIs are now implemented (#746 #766 #751 #773) and adopted in Jahia/luxe-jahia-demo (#458, #459) and on Jahia/jahia.com. A review of both together returned consistent: mostly, learning curve: acceptable — up from "no / too steep" for the image API alone (#767). Five things should be fixed before release. Four are cheap; the fifth is cheap now and breaking the day after.
1. Two published guide snippets do not compile under the scaffold's own
stricttsconfig, including one in the link guide's cache-dependency section that a reader copies verbatim. Fix the snippets, then type-check every fencedtsxblock in both guides as part of the build.2. Neither API is in the library README, and the link guide's Reference section links five symbols into it — all five anchors are dead. The image guide's Reference is a plain unlinked list, so the two guides also disagree on what a Reference section is. Add the symbols, or drop the dead links rather than shipping them.
3.
contextis required ongetImagePropsand optional ongetLinkProps/resolveContentLink. Same concept — the render cache dependency, and thebundleKeythat selects module defaults — opposite enforcement, and the two guides state the rule in contradictory terms. Making it required on the link side is a breaking change after release.4. Only one of the two props tiers can cross into an Island, which is the question both are documented to answer.
ImgPropsis flat and serializable by design.LinkStatecarries aJCRNodeWrapper(state.node, added by #769), sostatecannot be shipped into an Island at all — and that field has zero consumers in either adoption. MovenodeoffLinkState(a third sibling ofanchor/state, or drop it in favour ofreadNodeReference, which is what jahia.com actually used). While there:stateshould carry thearia-currentvalue, not just theisCurrentboolean behind it — 7 Island call sites across the two repos hand-write that mapping today.5.
samples/hydrogenteaches the anti-pattern the link guide calls a bug. Five of its six link sites are still<a href={buildNodeUrl(...)}>, including the NavBar and the LanguageSwitcher — the two cases the guide is written around. Two Hero backgrounds should usebuildBackgroundImageUrl. This is the cheapest way to give both guides a working showcase.Decide before merging: what happens to
layout="fluid"fluidwas added by #767 as the answer to "0 of 16 luxe sites could use what the guide teaches". It now has zero call sites across all three repos, and both adopters independently reinvented it — wrongly. luxe usedconstrainedplus a hand-writtensizesat five sites, its own commit message admitting no single number describes the slot; jahia.com madefull-width+sizes="auto"its wrapper default, with a docstring explaining it picked that becausefilltakes normal-flow images out of flow — it never learnedfluidexists.The name was not the problem. The vocabulary is still missing the commonest real slot: a maximum width, with
sizeswritten by hand. Either letfluidtakeslotWidthas an optional maximum (ladder capped at 2x,sizesstill required from the caller), or deletefluidand documentfull-width+sizesas the answer. Shipping a layout with no users and two reinventions is how the next review reaches the same verdict.Smaller divergences, non-breaking to fix later
cacheDependencyis a boolean on the image side and a four-form union on the link side.absoluteexists on every image function and nowhere on the link side, though a canonical link, anog:urland a JSON-LDurlall need it and jahia.com reaches past the API for it.fallback(image) andwhenUnresolved(link) answer the same "the content is not there" question with different names, different defaults and non-overlapping capability, and neither guide mentions the other's.And the highest-value warning either API could carry, which neither does: a view emitting
aria-currentwithoutcache.mainResource=true.getLinkPropscan see the render context and can tell.