From 7a794ac3680bd64a39b93492d903fe9e0653d35f Mon Sep 17 00:00:00 2001 From: Steeve Pastorelli Date: Wed, 10 Jun 2026 00:46:30 +0200 Subject: [PATCH 1/2] Add visitor claims demo integration --- .../visitor-claims-webframe-demo/README.md | 22 ++ .../assets/icon.png | Bin 0 -> 14269 bytes .../gitbook-manifest.yaml | 20 ++ .../visitor-claims-webframe-demo/package.json | 21 ++ .../src/index.tsx | 66 ++++++ .../src/webframe.ts | 215 ++++++++++++++++++ .../tsconfig.json | 3 + 7 files changed, 347 insertions(+) create mode 100644 integrations/visitor-claims-webframe-demo/README.md create mode 100644 integrations/visitor-claims-webframe-demo/assets/icon.png create mode 100644 integrations/visitor-claims-webframe-demo/gitbook-manifest.yaml create mode 100644 integrations/visitor-claims-webframe-demo/package.json create mode 100644 integrations/visitor-claims-webframe-demo/src/index.tsx create mode 100644 integrations/visitor-claims-webframe-demo/src/webframe.ts create mode 100644 integrations/visitor-claims-webframe-demo/tsconfig.json diff --git a/integrations/visitor-claims-webframe-demo/README.md b/integrations/visitor-claims-webframe-demo/README.md new file mode 100644 index 000000000..b2f37119d --- /dev/null +++ b/integrations/visitor-claims-webframe-demo/README.md @@ -0,0 +1,22 @@ +# Visitor Claims Webframe Demo + +Dev/test integration for validating that GitBook/GBX passes adaptive visitor context into ContentKit webframes. + +The integration exposes one block, `visitorClaimsWebframeDemo`, which renders a self-contained webframe at `/webframe`. The webframe displays: + +- The full posted ContentKit webframe state. +- `state.visitor`. +- `state.visitor.claims`. +- `state.visitor.isSet`. +- Regular webframe `data` values, including `label` and `mode`, as part of the full state. + +## Test + +1. Enable and configure adaptive content for the target site/space. +2. Install this integration in the target space. +3. Add the **Visitor Claims Demo** integration block to a space page. +4. Set visitor input/test values in the GitBook UI. +5. Confirm the webframe displays `visitor.claims` and `visitor.isSet`. +6. Open the browser console and check the `visitor-claims-webframe-demo: received state` log for the raw state object. + +If the webframe receives state without visitor context, it shows `No visitor context received.` while still rendering the full state JSON for debugging. diff --git a/integrations/visitor-claims-webframe-demo/assets/icon.png b/integrations/visitor-claims-webframe-demo/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3ceb32a6a489652e050d50e58d78b9c794fb5e2c GIT binary patch literal 14269 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 literal 0 HcmV?d00001 diff --git a/integrations/visitor-claims-webframe-demo/gitbook-manifest.yaml b/integrations/visitor-claims-webframe-demo/gitbook-manifest.yaml new file mode 100644 index 000000000..60461a2a9 --- /dev/null +++ b/integrations/visitor-claims-webframe-demo/gitbook-manifest.yaml @@ -0,0 +1,20 @@ +name: visitor-claims-webframe-demo +title: Visitor Claims Webframe Demo +icon: ./assets/icon.png +organization: 7RDn7qEEPSHhRACRvwrt +description: Dev/test integration for inspecting ContentKit webframe visitor context. +summary: | + # Overview + + This development-only integration renders a ContentKit webframe and displays the full state GitBook posts into it. + + # How it works + + Add the Visitor Claims Webframe Demo block to a space page. The webframe displays regular ContentKit webframe data alongside any visitor context injected by GitBook, including `visitor.claims` and `visitor.isSet`. +visibility: private +script: ./src/index.tsx +scopes: [] +blocks: + - id: visitorClaimsWebframeDemo + title: Visitor Claims Demo + description: Inspect visitor claims passed into a ContentKit webframe. diff --git a/integrations/visitor-claims-webframe-demo/package.json b/integrations/visitor-claims-webframe-demo/package.json new file mode 100644 index 000000000..7efedf29f --- /dev/null +++ b/integrations/visitor-claims-webframe-demo/package.json @@ -0,0 +1,21 @@ +{ + "name": "@gitbook/integration-visitor-claims-webframe-demo", + "version": "0.0.0", + "private": true, + "dependencies": { + "@gitbook/api": "*", + "@gitbook/runtime": "*", + "itty-router": "^2.6.1" + }, + "devDependencies": { + "@gitbook/cli": "workspace:*", + "@gitbook/tsconfig": "workspace:*" + }, + "scripts": { + "typecheck": "tsc --noEmit", + "check": "gitbook check", + "publish-integrations": "gitbook publish .", + "publish-integrations-staging": "gitbook publish .", + "dev": "gitbook dev ." + } +} diff --git a/integrations/visitor-claims-webframe-demo/src/index.tsx b/integrations/visitor-claims-webframe-demo/src/index.tsx new file mode 100644 index 000000000..12a7857be --- /dev/null +++ b/integrations/visitor-claims-webframe-demo/src/index.tsx @@ -0,0 +1,66 @@ +import { Router } from 'itty-router'; + +import { + createComponent, + createIntegration, + FetchEventCallback, + RuntimeContext, +} from '@gitbook/runtime'; + +import { webFrameHTML } from './webframe'; + +const visitorClaimsWebframeDemo = createComponent({ + componentId: 'visitorClaimsWebframeDemo', + async render(_element, { environment }) { + const webframeURL = new URL(`${environment.integration.urls.publicEndpoint}/webframe`); + webframeURL.searchParams.set('v', String(environment.integration.version)); + + return ( + + + + ); + }, +}); + +const handleFetchEvent: FetchEventCallback = async (request, context) => { + const { environment } = context; + const router = Router({ + base: new URL( + environment.spaceInstallation?.urls?.publicEndpoint || + environment.installation?.urls.publicEndpoint || + environment.integration.urls.publicEndpoint, + ).pathname, + }); + + router.get( + '/webframe', + async () => + new Response(webFrameHTML, { + headers: { + 'Content-Type': 'text/html; charset=utf-8', + 'Cache-Control': 'no-store', + }, + }), + ); + + const response = await router.handle(request, context); + if (!response) { + return new Response('No route matching', { status: 404 }); + } + + return response; +}; + +export default createIntegration({ + fetch: handleFetchEvent, + components: [visitorClaimsWebframeDemo], +}); diff --git a/integrations/visitor-claims-webframe-demo/src/webframe.ts b/integrations/visitor-claims-webframe-demo/src/webframe.ts new file mode 100644 index 000000000..6b8461d0e --- /dev/null +++ b/integrations/visitor-claims-webframe-demo/src/webframe.ts @@ -0,0 +1,215 @@ +export const webFrameHTML: string = ` + + + + + + + Visitor claims webframe demo + + + +
+
+

Visitor claims webframe demo

+
+ +
+

No webframe state received yet.

+
+ +
+

Full webframe state

+
{}
+
+ +
+
+

state.visitor

+
null
+
+
+ + +
+ + + + +`; diff --git a/integrations/visitor-claims-webframe-demo/tsconfig.json b/integrations/visitor-claims-webframe-demo/tsconfig.json new file mode 100644 index 000000000..1a48f875b --- /dev/null +++ b/integrations/visitor-claims-webframe-demo/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "@gitbook/tsconfig/integration.json" +} From a22f682caf1994bc9b7964f464a65a7f3a3026d0 Mon Sep 17 00:00:00 2001 From: Steeve Pastorelli Date: Thu, 11 Jun 2026 15:43:05 +0200 Subject: [PATCH 2/2] Add scope to manifest --- .../visitor-claims-webframe-demo/gitbook-manifest.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/visitor-claims-webframe-demo/gitbook-manifest.yaml b/integrations/visitor-claims-webframe-demo/gitbook-manifest.yaml index 60461a2a9..8bf0801f4 100644 --- a/integrations/visitor-claims-webframe-demo/gitbook-manifest.yaml +++ b/integrations/visitor-claims-webframe-demo/gitbook-manifest.yaml @@ -1,7 +1,7 @@ name: visitor-claims-webframe-demo title: Visitor Claims Webframe Demo icon: ./assets/icon.png -organization: 7RDn7qEEPSHhRACRvwrt +organization: QkobkeMSkvQjA19eKq3n description: Dev/test integration for inspecting ContentKit webframe visitor context. summary: | # Overview @@ -13,7 +13,7 @@ summary: | Add the Visitor Claims Webframe Demo block to a space page. The webframe displays regular ContentKit webframe data alongside any visitor context injected by GitBook, including `visitor.claims` and `visitor.isSet`. visibility: private script: ./src/index.tsx -scopes: [] +scopes: ['site:visitor:claims'] blocks: - id: visitorClaimsWebframeDemo title: Visitor Claims Demo