Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
572 commits
Select commit Hold shift + click to select a range
9c7ca20
fix(website): continue the Tokamak column behind the mobile/stacked c…
rstaib Sep 20, 2026
ed62382
fix(website): let the Tokamak bottom rim sit below the canvas (option B)
rstaib Sep 20, 2026
baaa193
fix(website): flare the Tokamak top/bottom rims to meet the wall's un…
rstaib Sep 20, 2026
3f6f306
fix(website): rebuild the Tokamak column base as a true tile union, c…
rstaib Sep 20, 2026
f0822f5
fix(website): normalise Tokamak base-quad winding so the nonzero fill…
rstaib Sep 20, 2026
39657c3
feat(website): energise the Fusion hero plasma (faster orbit, live sh…
rstaib Sep 20, 2026
0705796
fix(website): Tokamak wkf housekeeping -- dead fallback removal, anal…
rstaib Sep 20, 2026
08d438b
fix(website): halo the Tokamak sparks, raise the surge peak to 1.5x, …
rstaib Sep 20, 2026
98a4aab
fix(website): rename Fusion copy's source/composite schema to subgrap…
rstaib Sep 20, 2026
c6cdafd
fix(website): rename Fusion visuals' source/composite schema labels
rstaib Sep 20, 2026
0f13f13
fix(website): tile the Fusion pillar's ceiling/floor junctions at the…
rstaib Sep 21, 2026
408ccca
fix(website): pin the Tokamak wall's instrument-light row range so th…
rstaib Sep 21, 2026
2ffccb7
fix(website): fold the pillar's ceiling/floor tiles over its rim (rou…
rstaib Sep 21, 2026
b41c65a
fix(website): grow Fusion visuals' SVG labels to meet the 11px floor …
rstaib Sep 21, 2026
c364542
fix(website): drop Fusion labels' textLength pinning, add a Scene rat…
rstaib Sep 21, 2026
0e1b4b9
fix(website): re-flow the Fusion visuals to a natural-width mobile co…
rstaib Sep 21, 2026
7cdb856
fix(website): build TelemetryStrip's mobile trace from its own panel …
rstaib Sep 21, 2026
3f8bcea
fix(website): boost TelemetryStrip's labels to the 11px floor at ever…
rstaib Sep 21, 2026
d2f2298
fix(website): re-flow PreflightChecklist and QueryTrack for the boost…
rstaib Sep 21, 2026
9c6910d
fix(website): de-duplicate dotLines/wrapWords, close SpecPatchbay's e…
rstaib Sep 21, 2026
b25b4de
fix(website): extend the crowded-label wrap to every desktop boost an…
rstaib Sep 21, 2026
bc3bbd5
fix(website): wrap QueryTrack's station status line wherever it excee…
rstaib Sep 21, 2026
ff9f8a5
fix(website): mirror the pillar's top rim and bridge to the bottom's
rstaib Sep 21, 2026
da3b050
fix(website): centre the stacked band at the band area's exact middle
rstaib Sep 21, 2026
0a55711
fix(website): match the pillar's top limb to the bottom's projected p…
rstaib Sep 21, 2026
fa415f4
fix(website): re-tune the top bridge against rv2g-rhythm's own measure
rstaib Sep 21, 2026
703de8b
fix(website): fix the top bridge's interpolation direction in its own…
rstaib Sep 21, 2026
7630004
fix(website): use the neutral ink-dim eyebrow tone on the Fusion hero…
rstaib Sep 21, 2026
349ac39
fix(website): drop the Fusion diagram's grid backdrop and size it to …
rstaib Sep 21, 2026
63bce39
fix(website): move the Fusion diagram into the What is Fusion? row
rstaib Sep 21, 2026
b849400
fix(website): delete the unused QueryTrack visual
rstaib Sep 21, 2026
6549b12
fix(website): collapse the Fusion diagram's tiers with a container qu…
rstaib Sep 21, 2026
b724f54
fix(website): point the Fusion federation page at the renamed GraphQL…
rstaib Sep 21, 2026
9a3d92a
docs(website): rename the GraphQL Composite Schemas spec to GraphQL F…
rstaib Sep 21, 2026
8f608a0
fix(website): apply the planner ruling on the two out-of-list spec me…
rstaib Sep 21, 2026
0a82f4c
fix(website): update the Fusion hero teaser and remove its eyebrow
rstaib Sep 22, 2026
29dda88
refactor(website): extract syntaxTokens into a shared component
rstaib Sep 22, 2026
de92abe
refactor(website): extract ClientImpactMatrix into a shared component
rstaib Sep 22, 2026
5464fbd
refactor(website): extract ClassificationCard into a shared component
rstaib Sep 22, 2026
07de732
feat(website): replace the Fusion any-server visual with a compositio…
rstaib Sep 22, 2026
54d60b9
chore(website): delete the Mission Control PreflightChecklist visual
rstaib Sep 22, 2026
2c5df90
feat(website): replace the Fusion both-specifications visual with a s…
rstaib Sep 22, 2026
10ed7c2
feat(website): add a density prop to ClientImpactMatrix and Classific…
rstaib Sep 22, 2026
9cfea21
feat(website): reuse ClientImpactMatrix and ClassificationCard on the…
rstaib Sep 22, 2026
8a3dce4
chore(website): delete the Mission Control FlightRecorder and Telemet…
rstaib Sep 22, 2026
bee4502
docs(website): correct the Nitro band changes comment on the Fusion page
rstaib Sep 22, 2026
d740749
fix(website): keep comfortable ClientImpactMatrix labels off the stat…
rstaib Sep 22, 2026
a378e37
chore(website): delete the dead Fusion Scene scaffolding and label-sc…
rstaib Sep 22, 2026
3c60b48
chore(website): drop the Scene wrapper from FusionPage's panel box
rstaib Sep 22, 2026
4730033
refactor(website): name ProtocolBadge's props interface on the Fusion…
rstaib Sep 22, 2026
938162b
fix(website): wrap the comfortable ClassificationCard change text ins…
rstaib Sep 22, 2026
401e5d3
fix(website): stack the compact ClientImpactMatrix bar label at 375
rstaib Sep 22, 2026
43da857
fix(website): size the Fusion In practice line like the paragraph abo…
rstaib Sep 22, 2026
92a5efd
fix(website): drop the Fusion Nitro band's outer card wrapper border
rstaib Sep 22, 2026
e0d015c
feat(website): give the GraphQL Federation hero a full-viewport 3D gr…
rstaib Sep 23, 2026
53e4b09
fix(website): brighten the hero graph's nodes, edges and glow
rstaib Sep 23, 2026
a6baa95
fix(website): recentre the GraphQL Federation hero graph and tighten …
rstaib Sep 23, 2026
8ec3fd7
fix(website): make the GraphQL Federation hero backdrop a static, res…
rstaib Sep 23, 2026
e3b4ba2
fix(website): rebuild the GraphQL Federation hero as one continuous c…
rstaib Sep 23, 2026
684009f
refactor(website): extract the Layered Diagram into src/components/La…
rstaib Sep 23, 2026
89e01de
refactor(website): move LayeredDiagram's tokens out of the Fusion pag…
rstaib Sep 23, 2026
4391c16
feat(website): draw the What is GraphQL Federation intro as a two-col…
rstaib Sep 23, 2026
edba769
fix(website): give the GraphQL Federation hero real 3D projection, gu…
rstaib Sep 23, 2026
f63ad30
feat(website): draw the What problem does GraphQL Federation solve in…
rstaib Sep 23, 2026
09d3ba1
fix(website): stack ProblemWindows at every width instead of side by …
rstaib Sep 23, 2026
a96243f
refactor(website): fold RingGlyph into ProblemWindows as a local child
rstaib Sep 23, 2026
470af13
fix(website): rebalance the GraphQL Federation hero's copy-zone alpha…
rstaib Sep 23, 2026
5899f91
Merge branch 'rst/fusion-hero-craft' into rst/graphql-federation-page
rstaib Sep 23, 2026
0f58ae0
fix(website): generate the GraphQL Federation hero graph in real worl…
rstaib Sep 23, 2026
c97b2ef
fix(website): reach 7:1 hero copy contrast without a white-mixed near…
rstaib Sep 23, 2026
09eeb07
fix(website): keep Layered Diagram spec badges full-width below 360px
rstaib Sep 24, 2026
d489ad9
fix(website): tighten the Layered Diagram spec-badge container query …
rstaib Sep 24, 2026
9d402f9
fix(website): match Fusion's 16px paragraph rhythm in the Federation …
rstaib Sep 24, 2026
85852e3
fix(website): widen Layered Diagram badge threshold to 359px and wrap…
rstaib Sep 24, 2026
3f677b4
chore(website): ignore gitignored test-results/ in eslint globalIgnores
rstaib Sep 24, 2026
8ab7ddf
chore(website): drop two unneeded code comments
rstaib Sep 24, 2026
90c61e3
Merge branch 'rst/fed-hero-final-pass' into rst/graphql-federation-page
rstaib Sep 24, 2026
4777585
fix(website): keep Federation Problem section's paragraphs together b…
rstaib Sep 24, 2026
36c62db
perf(website): cut the Federation hero graph's build time with a spat…
rstaib Sep 24, 2026
a7e5c9f
perf(website): squared-distance prefilter in farEnough with an exact …
rstaib Sep 24, 2026
a60a554
fix(website): trim hero graph's review comments, dead gridRadius, and…
rstaib Sep 24, 2026
50ad9a8
feat(website): zig-zag the Federation Problem section into paired rows
rstaib Sep 24, 2026
ab5e1c8
feat(website): add Checkout and Accounts subgraphs to the What-is dia…
rstaib Sep 24, 2026
09dc5ab
fix(website): pull Federation Problem section's first row closer to t…
rstaib Sep 24, 2026
bab1602
fix(website): clarify What-is copy on single vs many APIs behind the …
rstaib Sep 24, 2026
3bf6611
feat(website): rewrite Fusion hero teaser for high-performance gatewa…
rstaib Sep 25, 2026
9340c39
feat(website): rewrite What is Fusion? copy to gateway-first framing
rstaib Sep 25, 2026
e990e15
feat(website): add Fusion Performance by design execution window
rstaib Sep 25, 2026
7cea58c
fix(website): drop multi-line comments from PerformanceWindow
rstaib Sep 25, 2026
366f283
feat(website): add Fusion gateway policy decisions security window
rstaib Sep 25, 2026
76d2686
feat(website): add Fusion operational insights trace panel
rstaib Sep 25, 2026
c71575f
fix(website): zoom the Fusion insights trace panel to clear the label…
rstaib Sep 25, 2026
103dee2
feat(website): wire Fusion's four new blocks, feature grid and closin…
rstaib Sep 25, 2026
b75b926
fix(website): fix ProtocolsWindow badge clipping in the narrow two-tr…
rstaib Sep 25, 2026
52d5c0a
fix(website): extend Layered Diagram container rules to the 760-868px…
rstaib Sep 25, 2026
a35e33b
fix(website): widen Layered Diagram card band to 869px
rstaib Sep 25, 2026
5192c3f
fix(website): add commas around appositive in federation Problem section
rstaib Sep 26, 2026
eadd890
fix(website): align Fusion page meta description with new hero message
rstaib Sep 26, 2026
635e789
fix(website): restyle Fusion Insights waterfall in the page's muted w…
rstaib Sep 26, 2026
775cee8
feat(website): replace Fusion band's protocols window with a network …
rstaib Sep 26, 2026
68cf4b5
fix(website): trim comments in GraphSphere
rstaib Sep 26, 2026
8c61dac
feat(website): add Fusion Featured Content section with three teaser …
rstaib Sep 26, 2026
6226acd
fix(website): stop clamping Fusion Featured Content descriptions
rstaib Sep 26, 2026
e9c7bca
fix(website): use a literal blog href for Fusion's Featured Content card
rstaib Sep 26, 2026
7b03bdc
feat(website): add full-bleed section separators to the Fusion page
rstaib Sep 26, 2026
aacba11
fix(website): match the federation page's section spacing on Fusion
rstaib Sep 26, 2026
c0e30d4
feat(website): widen the Fusion diagram to one row at xl and rename t…
rstaib Sep 26, 2026
7ed2a3b
feat(website): compose the Fusion Insights row from Nitro page graphs
rstaib Sep 26, 2026
6feb415
feat(website): animate the Fusion Security row as a policy checkpoint
rstaib Sep 26, 2026
a65f0b9
fix(website): reserve the router's denial-line height in the checkpoint
rstaib Sep 26, 2026
f580c69
feat(website): give Fusion's Performance row a Nitro-card bento with …
rstaib Sep 26, 2026
09f649a
feat(website): animate Fusion's client-safety row as a registry publi…
rstaib Sep 26, 2026
c65be97
fix(website): restore Fusion's 5/7 split with a dense one-row diagram
rstaib Sep 26, 2026
e0a6c18
fix(website): make the Insights bento its own container query root
rstaib Sep 26, 2026
5ad33bb
fix(website): fix the checkpoint's connector geometry and audit-strip…
rstaib Sep 26, 2026
178e78a
feat(website): animate the Fusion closing band's GraphSphere
rstaib Sep 26, 2026
4f42487
fix(website): pivot the Tachometer needle at the hub and clear the re…
rstaib Sep 26, 2026
5c82ef3
refactor(website): trim LayeredDiagram comments and dense-mode duplic…
rstaib Sep 26, 2026
049f6ed
fix(website): fit the Protect-your-clients card and fix its motion ti…
rstaib Sep 26, 2026
a8d041f
fix(website): fit the Fusion Cost stat and mirror Nitro's card chrome
rstaib Sep 26, 2026
cd0e12b
fix(website): rebucket GraphSphere edges by live depth each frame
rstaib Sep 26, 2026
46cf52f
fix(website): reserve both verdict heights in the Fusion checkpoint
rstaib Sep 26, 2026
24bd3eb
Merge branch 'rst/fusion-sphere-motion' into rst/graphql-federation-page
rstaib Sep 26, 2026
2cec501
feat(website): centre Fusion's diagram buses and drop FED from its ba…
rstaib Sep 26, 2026
fa41630
Merge branch 'rst/fusion-row-whatis' into rst/graphql-federation-page
rstaib Sep 26, 2026
de6007f
fix(website): sync Fusion tachometer to a hydration-safe, evenly-fit …
rstaib Sep 26, 2026
1847adc
Merge branch 'rst/federation-sections' into rst/graphql-federation-page
rstaib Sep 26, 2026
3ef35f8
Merge branch 'rst/fusion-row-security' into rst/graphql-federation-page
rstaib Sep 26, 2026
0d477e4
fix(website): polish Protect-window comments, ticks, and static frame
rstaib Sep 26, 2026
98d46e0
fix(website): depth-sort GraphSphere paint order and fix clock resume…
rstaib Sep 26, 2026
7b75418
fix(website): seed Nitro's useBentoProgress from the hydration-safe r…
rstaib Sep 26, 2026
51da0ec
Merge branch 'rst/fusion-sphere-motion' into rst/graphql-federation-page
rstaib Sep 26, 2026
039191f
fix(website): seed Insights bento progress at 0 and scale the trace c…
rstaib Sep 26, 2026
6003764
Merge branch 'rst/fusion-row-whatis' into rst/graphql-federation-page
rstaib Sep 26, 2026
ab291e1
Merge branch 'rst/fusion-row-insights' into rst/graphql-federation-page
rstaib Sep 26, 2026
d13fbaf
fix(website): hydrate Nitro hero's reduced-motion flags from the safe…
rstaib Sep 26, 2026
e8f84f8
Merge branch 'rst/fusion-row-whatis' into rst/graphql-federation-page
rstaib Sep 26, 2026
808f3c6
feat(website): add elastic node drift and arrival pulse to GraphSphere
rstaib Sep 26, 2026
655858f
fix(website): keep the Protect-window travel card inside its lane
rstaib Sep 26, 2026
c0cf8e9
Merge branch 'rst/fusion-hero-craft' into rst/graphql-federation-page
rstaib Sep 26, 2026
71d88f4
Merge branch 'rst/fusion-sphere-motion' into rst/graphql-federation-page
rstaib Sep 26, 2026
aed03f8
chore(website): sweep restating comments from LayeredDiagram and Fusi…
rstaib Sep 26, 2026
8ffa869
chore(website): remove remaining restating comments in LayeredDiagram…
rstaib Sep 26, 2026
dbe93f1
fix(website): drop the outer panel around Fusion Performance and Insi…
rstaib Sep 27, 2026
f0aa241
feat(website): give every GraphSphere node the soft depth-driven glow
rstaib Sep 27, 2026
3ac43e1
chore(website): tighten GraphSphere glow constant comment to one line
rstaib Sep 27, 2026
cac8d71
chore(website): drop restating GraphSphere glow comment
rstaib Sep 27, 2026
23f9004
feat(website): give each Fusion feature card its own 80x80 icon
rstaib Sep 27, 2026
5a53f28
Merge branch 'rst/fusion-sphere-motion' into rst/graphql-federation-page
rstaib Sep 27, 2026
41df0c7
feat(website): show each client's entry protocol in the What is Fusio…
rstaib Sep 27, 2026
405f764
feat(website): give the Fusion throughput gauge a racing tachometer a…
rstaib Sep 27, 2026
f3150d2
Merge branch 'rst/fusion-hero-craft' into rst/graphql-federation-page
rstaib Sep 27, 2026
6267b91
fix(website): close up the Fusion router header and fix MCP entry ove…
rstaib Sep 27, 2026
d0b0f95
Merge branch 'rst/fusion-row-whatis' into rst/graphql-federation-page
rstaib Sep 27, 2026
051d5b0
feat(website): give Fusion feature icons a premium glass-tile duotone…
rstaib Sep 27, 2026
d53fe5d
feat(website): add an icon-left layout option for the Fusion feature …
rstaib Sep 27, 2026
ed46c74
chore(website): tighten ProductionPulseIcon doc comment to one line
rstaib Sep 27, 2026
68284d1
feat(website): switch the Fusion feature grid to icon-left layout
rstaib Sep 27, 2026
ef8ef4b
chore(website): remove restating JSDocs from FusionFeatureGrid
rstaib Sep 27, 2026
74811d2
fix(website): racing-style tachometer rework, live latency/sustained …
rstaib Sep 27, 2026
2509111
Merge branch 'rst/fusion-hero-craft' into rst/graphql-federation-page
rstaib Sep 27, 2026
f7ea404
feat(website): render Connect every API icon as a static GraphSphere
rstaib Sep 27, 2026
726cf02
fix(website): match the Connect every API icon's weight to its neighb…
rstaib Sep 27, 2026
873f487
fix(website): move tachometer legend clear of the needle, scroll perf…
rstaib Sep 27, 2026
b8d1682
Merge branch 'rst/fusion-row-security' into rst/graphql-federation-page
rstaib Sep 27, 2026
c44acfa
feat(website): replace the Performance bento with a car-HUD dashboard…
rstaib Sep 27, 2026
8bfb8cd
fix(website): put the HUD readout in the arc and glow the value-fill
rstaib Sep 27, 2026
d63b6b6
fix(website): centre the HUD legend, mirror the gauges, darken the faces
rstaib Sep 27, 2026
6e09d8e
fix(website): grow the HUD readout and pair the gauges evenly
rstaib Sep 27, 2026
ebbb38b
router
rstaib Sep 27, 2026
501a100
feat(website): replace performance HUD with interlocking three-dial c…
rstaib Sep 27, 2026
06b1b5b
fix(website): concentric pressure arcs, ops scale and bluer HUD glow
rstaib Sep 28, 2026
0c3bdb0
fix(website): thin the pressure arcs for full label clearance
rstaib Sep 28, 2026
42d59b2
fix(website): trim a restating comment in gaugeArcPath
rstaib Sep 28, 2026
9583781
fix(website): align the centre dial's fill and scale, band its numera…
rstaib Sep 28, 2026
0c03f0e
fix(website): move the latency dial's ms-scale numerals off the bezel
rstaib Sep 28, 2026
e0ec9a5
fix(website): clear the pressure dial's cached-doc readouts and perce…
rstaib Sep 28, 2026
62e6c0f
fix(website): darken the HUD backdrop and raise the glow to a bluer i…
rstaib Sep 28, 2026
bc94204
fix(website): rebuild the performance HUD cluster geometry so text ne…
rstaib Sep 28, 2026
fb3824b
fix(website): keep the performance HUD highlight rotating forward acr…
rstaib Sep 28, 2026
14bae47
fix(website): saturate the performance HUD with an electric blue token
rstaib Sep 28, 2026
7cee9da
refactor(website): declare the pressure dial row props as interfaces
rstaib Sep 28, 2026
9e7dc72
Merge branch 'rst/fusion-row-security' into rst/graphql-federation-page
rstaib Sep 28, 2026
bf50655
feat(website): merge the performance HUD dials into one cluster with …
rstaib Sep 29, 2026
f0634d5
fix(website): put the HUD scale numerals inside the dials, scale ops …
rstaib Sep 29, 2026
97b7503
fix(website): start the performance HUD row layout at 464 px so the c…
rstaib Sep 29, 2026
44c98b5
fix(website): drop the HUD card and screen box, label the network and…
rstaib Sep 29, 2026
c4f670d
fix(website): separate the HUD text rects in the latency and centre d…
rstaib Sep 29, 2026
0582be5
Merge branch 'rst/fusion-hud-cluster' into rst/graphql-federation-page
rstaib Sep 29, 2026
c2397b6
fix(website): draw the reduced-motion HUD network and latency traces …
rstaib Sep 29, 2026
81ae5ae
fix(website): lift the HUD CPU value and dial scale numerals to 4.5:1…
rstaib Sep 29, 2026
f2faab0
fix(website): keep the desktop header and its mega menus inside the v…
rstaib Sep 29, 2026
96aeacd
Merge branch 'rst/fusion-hud-polish' into rst/graphql-federation-page
rstaib Sep 29, 2026
6e577b9
fix(website): show a sustained burst in the reduced-motion HUD networ…
rstaib Sep 29, 2026
81de40b
fix(website): tint the HUD dial scale numerals bluer per dial while h…
rstaib Sep 29, 2026
6a340e9
fix(website): keep every header mega menu inside the viewport from 12…
rstaib Sep 29, 2026
84303b4
feat(website): put the HUD latency dial on a logarithmic 1 to 40 ms s…
rstaib Sep 29, 2026
bebbee2
fix(website): centre the HUD ops readout in the centre dial and drop …
rstaib Sep 29, 2026
765781e
fix(website): open and navigate the header mega menus with the keyboard
rstaib Sep 29, 2026
b57471f
Merge branch 'rst/fusion-hud-polish-2' into rst/graphql-federation-page
rstaib Sep 29, 2026
0f77837
fix(website): give the HUD network chart the same width as the latenc…
rstaib Sep 30, 2026
b42118b
fix(website): centre the HUD ops dial content as one block and remove…
rstaib Sep 30, 2026
448b44f
Merge branch 'rst/fusion-hud-polish-2' into rst/graphql-federation-page
rstaib Sep 30, 2026
d42fdb1
fix(website): grow both HUD trend charts to the widest chord the late…
rstaib Sep 30, 2026
fa43262
fix(website): drive the header mega menus from one open state for mou…
rstaib Sep 30, 2026
e66fd85
Merge branch 'rst/fusion-hud-polish-2' into rst/graphql-federation-page
rstaib Sep 30, 2026
da66525
fix(website): size the HUD network chart to 110% of the ops readout i…
rstaib Sep 30, 2026
1ba378c
Merge branch 'rst/fusion-hud-polish-2' into rst/graphql-federation-page
rstaib Sep 30, 2026
be5583c
refactor(website): drop the per-dial chart-width indirection from the…
rstaib Sep 30, 2026
e7ab5fd
fix(website): let assistive-tech clicks close a header mega menu from…
rstaib Sep 30, 2026
51ab9d3
fix(website): run two permanent twisting filaments around the Fusion …
rstaib Sep 30, 2026
071f358
Merge branch 'rst/fusion-polish-3' into rst/graphql-federation-page
rstaib Sep 30, 2026
df8e926
Merge remote-tracking branch 'origin/main' into rst/graphql-federatio…
rstaib Oct 25, 2026
6ffc8c9
docs(website): update GraphQL Federation hero copy
rstaib Oct 25, 2026
676ccf0
docs(website): clarify the GraphQL Federation definition
rstaib Oct 25, 2026
22f9c26
docs(website): reorder GraphQL Federation problem and comparisons
rstaib Oct 25, 2026
a887aae
feat(website): update federation closing call to action
rstaib Oct 25, 2026
46c2e33
fix(website): alternate federation problem rows and correct headings
rstaib Oct 25, 2026
340a19b
docs(website): simplify GraphQL Federation comparisons
rstaib Oct 25, 2026
06a15fe
docs(website): clarify what Fusion is
rstaib Oct 25, 2026
72fb49d
docs: update GraphQL federation comparison article
rstaib Oct 25, 2026
c659ac3
fix(website): support comparison article meta titles
rstaib Oct 25, 2026
2276c2d
docs(website): update GraphQL federation vs BFF article
rstaib Oct 25, 2026
8eda628
docs(website): update federation vs individual APIs article
rstaib Oct 26, 2026
ab5873e
refactor(website): remove superseded federation sections
rstaib Oct 26, 2026
8a992a3
feat(website): add federation building blocks section
rstaib Oct 26, 2026
ba0eb22
docs: add Apollo Federation evolution section
rstaib Oct 26, 2026
b8658df
docs: add GraphQL Federation AI development section
rstaib Oct 26, 2026
7b47c9c
fix(website): match federation building blocks to Fusion tiles
rstaib Oct 26, 2026
a834532
fix(website): align federation section width and center problem heading
rstaib Oct 26, 2026
64b94a8
fix(website): match federation diagram rendering to Fusion
rstaib Oct 26, 2026
a6a8713
docs(website): compare GraphQL Federation with Schema Stitching
rstaib Oct 26, 2026
a066bfb
docs(website): compare GraphQL Federation with a monolith
rstaib Oct 26, 2026
2b2c68b
chore(website): update comparison article publication dates
rstaib Oct 26, 2026
15e387c
fix(website): link federation comparisons to their articles
rstaib Oct 26, 2026
f6e249e
fix(website): link federation comparison to individual APIs
rstaib Oct 26, 2026
c1f7616
fix(website): add featured images to comparison articles
rstaib Oct 26, 2026
b8c304e
fix(website): make federation comparison cards fully clickable
rstaib Oct 26, 2026
e8b9cf9
fix(website): remove federation FAQ and structured data
rstaib Oct 26, 2026
19d23e9
Merge remote-tracking branch 'origin/main' into rst/graphql-federatio…
rstaib Oct 26, 2026
232ce93
fix(website): remove federation comparison heading arrows
rstaib Oct 26, 2026
6231afb
chore(website): remove federation prototype routes and code
rstaib Oct 26, 2026
3e4409e
Merge branch 'main' into rst/graphql-federation-page
rstaib Oct 26, 2026
691df57
chore(website): run visual tests in a pinned Docker renderer
rstaib Oct 26, 2026
e04ed54
Fix visual test input containment
rstaib Oct 27, 2026
f6f4671
Fix visual test output path containment
rstaib Oct 27, 2026
64b5ebe
fix(website): capture complete Fusion visual story states
rstaib Oct 27, 2026
2a12f38
Merge branch 'main' into rst/graphql-federation-page
rstaib Oct 27, 2026
40a7e5e
test(website): temporarily quarantine known visual failures
rstaib Oct 27, 2026
8daaf77
Merge branch 'main' into rst/graphql-federation-page
rstaib Oct 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,9 @@ jobs:
run: npm ci
working-directory: website

- name: Install Playwright Chromium
# rehype-mermaid renders inline SVG with Chromium during the app build.
# Visual tests use their own pinned Docker browser, not this installation.
- name: Install Chromium for Mermaid Build
run: npx playwright install --with-deps chromium
working-directory: website

Expand All @@ -187,10 +189,25 @@ jobs:
run: npm run build
working-directory: website

- name: Visual Runner Contract Tests
run: node --test scripts/visual-tests-docker.test.mjs
working-directory: website

- name: Visual Regression Tests
run: npm run test:visual
working-directory: website

- name: Clean Up Visual Test Containers
if: ${{ always() }}
shell: bash
run: |
workspace="$(pwd -P)"
run="${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}-${GITHUB_JOB}"
docker ps --all --quiet --filter "label=website-visual-workspace=$workspace" --filter "label=website-visual-run=$run" |
xargs --no-run-if-empty docker rm --force
docker volume ls --quiet --filter "label=website-visual-workspace=$workspace" --filter "label=website-visual-run=$run" |
xargs --no-run-if-empty docker volume rm

- name: Upload Playwright Report
if: ${{ !cancelled() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
Expand Down
51 changes: 51 additions & 0 deletions website/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,57 @@ npm ci
npm run dev
```

## Visual tests

Install the website dependencies with `npm ci` and start Docker Desktop (or a
Linux Docker Engine). Visual tests require a running Linux-container daemon;
there is no host-browser fallback. Run these commands from `website`:

```bash
npm run test:visual
npm run test:visual -- --grep 'Button|Card' --workers=2
npm run test:visual:update -- --grep 'Button'
node --test scripts/visual-tests-docker.test.mjs
```

Both visual scripts build static Storybook on the host, then run the static
server, Chromium and screenshots in the same Docker renderer used by GitHub
Actions. Arguments after `--` are forwarded unchanged to Playwright. Direct
`npx playwright test` execution is rejected by the configuration guard.

The renderer is always `linux/amd64`, including on Apple Silicon. The official
Playwright 1.62.1 Noble image is pinned by digest in
`scripts/visual-tests.Dockerfile`; its only customization is npm 11.21.1 to
satisfy the repository's npm contract. A Playwright dependency upgrade must also
update and verify the image digest, runner version and configuration guard.
The runner logs the image, platform, Node, npm, Playwright and Chromium versions.

Each invocation stages a finite, read-only set of inputs into an owned Linux
worktree volume before installing dependencies. The host checkout, including its
`node_modules`, is never mounted during installation or capture. Staged inputs
are the website package/configuration, visual tests, built Storybook, and the
local Mocha visualizer package files needed by its `file:` dependency. The
worktree volume is removed on completion or interruption; the
workspace/runtime/lockfile-specific npm cache volume persists between invocations.

The test container has writable host mounts only for baselines in
`tests/visual/__screenshots__`, test artifacts in `test-results`, and CI HTML
reports in `playwright-report`. Those directories are created as the caller, so
written files retain the caller's UID/GID; Docker Desktop handles ownership on
Windows. Playwright `--output` paths must be relative paths within `test-results`
or `playwright-report`, which preserves artifacts without exposing another
checkout path for writes.

Ordinary comparisons do not update baselines, including missing images, unless
an explicit snapshot-update argument is supplied. Review screenshot diffs before
accepting updates: the shared renderer prevents OS, font and browser drift, but
does not add missing baselines or fix unintended UI changes.

Stories tagged `visual-reduced-motion` capture their authored static state with
`prefers-reduced-motion: reduce` applied before navigation; untagged stories keep
the default media preference. InsightsWindow and ProtectWindow opt in to capture
complete telemetry and static publish verdicts.

## Authoring Markdown Content

Docs live in `content/docs/<product>/...` as Markdown (`.md`) files and are
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import type { Meta, StoryObj } from "@storybook/nextjs-vite";
import { expect, within } from "storybook/test";

import { ExplainerPage } from "./ExplainerPage";

const meta = {
title: "Pages/Platform/GraphQLFederation",
component: ExplainerPage,
parameters: { layout: "fullscreen" },
tags: ["no-snapshot"],
} satisfies Meta<typeof ExplainerPage>;

export default meta;
type Story = StoryObj<typeof meta>;

export const Default: Story = {
play: async ({ canvasElement }) => {
const page = canvasElement.firstElementChild;
const sections = Array.from(page?.children ?? []);

expect(sections.map((section) => section.tagName)).toEqual(
Array(8).fill("SECTION"),
);
expect(sections.map((section) => section.id)).toEqual([
"",
"what-is",
"problem",
"how-it-works",
"from-apollo-federation",
"ai-driven-development",
"federation-comparisons",
"fusion",
]);
expect(
within(sections[0] as HTMLElement).getByRole("heading", {
level: 1,
name: "GraphQL Federation",
}),
).toBeVisible();
const closingSection = within(sections[7] as HTMLElement);
expect(
closingSection.getByRole("heading", {
level: 2,
name: "Get started with GraphQL Federation",
}),
).toBeVisible();
expect(
closingSection.getByRole("link", { name: "Get started with Fusion" }),
).toHaveAttribute("href", "/docs/fusion/getting-started");
},
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { ButtonRow } from "@/src/components/ButtonRow";
import { OutlineButton, SolidButton } from "@/src/design-system/Button";

import { GraphBackdrop } from "./hero/GraphBackdrop";
import { AiDevelopmentSection } from "./sections/AiDevelopmentSection";
import { BuildingBlocksSection } from "./sections/BuildingBlocksSection";
import { ComparisonsSection } from "./sections/ComparisonsSection";
import { FromApolloSection } from "./sections/FromApolloSection";
import { FusionCta } from "./sections/FusionCta";
import { ProblemSection } from "./sections/ProblemSection";
import { GRADIENT } from "./sections/shared";
import { WhatIsSection } from "./sections/WhatIsSection";

export function ExplainerPage() {
return (
<div className="bg-cc-bg relative left-1/2 -mt-26 w-screen -translate-x-1/2">
<section className="border-cc-card-border relative flex min-h-[100svh] flex-col items-center justify-center overflow-hidden border-b px-5 py-24 text-center sm:px-12">
<GraphBackdrop />
<div
data-hero-copy
className="relative z-10 flex flex-col items-center"
>
<h1 className="font-heading text-cc-heading text-h3 sm:text-h2 mx-auto w-full max-w-3xl text-balance">
GraphQL{" "}
<span
className="bg-clip-text text-transparent sm:whitespace-nowrap"
style={{ backgroundImage: GRADIENT }}
>
Federation
</span>
</h1>
<p
data-hero-paragraph
className="text-cc-ink mx-auto mt-7 max-w-2xl text-lg"
>
GraphQL Federation brings independent GraphQL services together into
a single, unified API. It enables teams to develop, deploy, and
scale their services independently while giving clients one coherent
graph to query.
</p>
<div data-hero-cta>
<ButtonRow className="mt-7">
<SolidButton href="/docs/fusion/getting-started">
Get Started
</SolidButton>
<OutlineButton href="/services/support/contact?subject=Sales&context=GraphQL%20Federation">
Contact an Expert
</OutlineButton>
</ButtonRow>
</div>
</div>
</section>

<WhatIsSection />
<ProblemSection />
<BuildingBlocksSection />
<FromApolloSection />
<AiDevelopmentSection />
<ComparisonsSection />
<FusionCta />
</div>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// A minimal perspective camera, the same idea as
// products/fusion/hero/Tokamak/geometry.ts (never imported from here):
// a world point with a real depth, a focal length and a perspective
// divide. The slab has no rotation, so this only needs the divide, not
// Tokamak's pitch tilt.
export interface Vec3 {
readonly x: number;
readonly y: number;
/** Distance from the camera's near plane; 0 = nearest the camera. */
readonly z: number;
}

export interface Camera {
readonly originX: number;
readonly originY: number;
readonly focal: number;
/** Distance from the camera to the z = 0 plane. */
readonly dist: number;
}

export interface Projected {
readonly x: number;
readonly y: number;
/** Screen px per world unit at this depth; larger = nearer the camera. */
readonly scale: number;
readonly depth: number;
}

export function makeCamera(
originX: number,
originY: number,
focal: number,
dist: number,
): Camera {
return { originX, originY, focal, dist };
}

export function project(p: Vec3, cam: Camera): Projected {
const depth = cam.dist + p.z;
const scale = cam.focal / depth;
return {
x: cam.originX + p.x * scale,
y: cam.originY + p.y * scale,
scale,
depth,
};
}

/**
* Screen px per world unit at depth `z` -- the forward half of `project`'s
* math, with no (x, y). Used to size the world-space sampling volume (how
* wide a world slice at this depth needs to be to cover the screen) --
* never to place a node at a chosen screen position, which would be the
* inverse of `project` and is not used anywhere in this folder.
*/
export function scaleAtDepth(z: number, cam: Camera): number {
return cam.focal / (cam.dist + z);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// The single local colour helper: every colour value the folder paints
// flows through here from hero/palette.ts (plus the words "white"/"black"),
// so the folder itself holds no hex literals. `mix` blends one or more
// further colours in at a low ratio each, applied in order -- how a tint
// stays a faint wash on the structural colour instead of a second
// saturated hue, and how the near-edge band lightens toward white a touch
// without becoming its own bright colour. An optional `darken` blends
// black in afterward -- how the copy-zone contrast fix keeps a node or
// edge's alpha in its normal visible range while still lowering the actual
// luminance it contributes under the text.
export function rgba(
color: string,
alpha: number,
mix?:
| { readonly with: string; readonly ratio: number }
| readonly { readonly with: string; readonly ratio: number }[],
darken = 0,
): string {
let [r, g, b] = toRgb(color);
const mixes = mix ? (Array.isArray(mix) ? mix : [mix]) : [];
for (const m of mixes) {
if (m.ratio <= 0) {
continue;
}
const [r1, g1, b1] = toRgb(m.with);
const t = m.ratio;
r = r + (r1 - r) * t;
g = g + (g1 - g) * t;
b = b + (b1 - b) * t;
}
if (darken > 0) {
r = r * (1 - darken);
g = g * (1 - darken);
b = b * (1 - darken);
}
return `rgba(${Math.round(r)},${Math.round(g)},${Math.round(b)},${alpha})`;
}

function toRgb(color: string): readonly [number, number, number] {
if (color === "white") {
return [255, 255, 255];
}
if (color === "black") {
return [0, 0, 0];
}
const hex = color.replace("#", "");
return [
parseInt(hex.slice(0, 2), 16),
parseInt(hex.slice(2, 4), 16),
parseInt(hex.slice(4, 6), 16),
];
}

export const WHITE = "white";
Loading
Loading