From 492c07d5ce9ba586194ed8fd19227210ad36d984 Mon Sep 17 00:00:00 2001 From: Paul Loth Date: Thu, 6 Aug 2026 12:35:11 +0200 Subject: [PATCH 1/6] Add SDK downloads page with click-through license agreement - Add ClickThroughGate React component that gates content behind a license acceptance stored in localStorage - Add LicenseText component with placeholder legal text - Add /sdk page with download links wrapped in the gate - Add SDKs entry to top navigation The license text and download URL are placeholders to be replaced with final versions from legal and the actual SDK artifacts. --- components/ClickThroughGate.tsx | 150 ++++++++++++++++++++++++++++++++ components/LicenseText.tsx | 91 +++++++++++++++++++ docs/_nav.json | 4 + docs/sdk.mdx | 32 +++++++ 4 files changed, 277 insertions(+) create mode 100644 components/ClickThroughGate.tsx create mode 100644 components/LicenseText.tsx create mode 100644 docs/sdk.mdx diff --git a/components/ClickThroughGate.tsx b/components/ClickThroughGate.tsx new file mode 100644 index 0000000..249c467 --- /dev/null +++ b/components/ClickThroughGate.tsx @@ -0,0 +1,150 @@ +import { type ReactNode, useEffect, useState } from "react"; +import { LicenseText } from "./LicenseText"; + +const STORAGE_KEY = "signhost-sdk-license-accepted"; + +interface Acceptance { + accepted: boolean; + timestamp: string; +} + +function getAcceptance(): Acceptance | null { + try { + const raw = localStorage.getItem(STORAGE_KEY); + if (!raw) return null; + const parsed = JSON.parse(raw); + if (parsed?.accepted === true && typeof parsed.timestamp === "string") { + return parsed as Acceptance; + } + } catch { + // Corrupted or unavailable localStorage + } + return null; +} + +export const ClickThroughGate = ({ children }: { children: ReactNode }) => { + const [mounted, setMounted] = useState(false); + const [acceptance, setAcceptance] = useState(null); + const [checked, setChecked] = useState(false); + + useEffect(() => { + setAcceptance(getAcceptance()); + setMounted(true); + }, []); + + const handleAccept = () => { + const record: Acceptance = { + accepted: true, + timestamp: new Date().toISOString(), + }; + localStorage.setItem(STORAGE_KEY, JSON.stringify(record)); + setAcceptance(record); + setChecked(false); + }; + + // Avoid hydration mismatch — render nothing until client-side mount + if (!mounted) return null; + + if (acceptance) { + const date = new Date(acceptance.timestamp).toLocaleDateString("en-US", { + year: "numeric", + month: "long", + day: "numeric", + }); + + return ( +
+
+ + You accepted the SDK License Agreement on {date}. + +
+ {children} +
+ ); + } + + return ( +
+
+ +
+ +
+ +
+
+ ); +}; + +const styles: Record = { + licenseContainer: { + maxHeight: "400px", + overflowY: "auto", + border: "1px solid var(--rp-c-divider)", + borderRadius: "8px", + padding: "24px", + marginBottom: "20px", + backgroundColor: "var(--rp-c-bg-soft)", + fontSize: "14px", + lineHeight: "1.6", + }, + checkboxLabel: { + display: "flex", + alignItems: "center", + gap: "8px", + marginBottom: "16px", + fontSize: "15px", + fontWeight: 500, + cursor: "pointer", + userSelect: "none", + }, + checkbox: { + width: "18px", + height: "18px", + accentColor: "var(--rp-c-brand)", + cursor: "pointer", + }, + acceptButton: { + padding: "10px 28px", + fontSize: "15px", + fontWeight: 600, + color: "#fff", + backgroundColor: "var(--rp-c-brand)", + border: "none", + borderRadius: "6px", + cursor: "pointer", + transition: "opacity 0.2s", + }, + acceptButtonDisabled: { + opacity: 0.5, + cursor: "not-allowed", + }, + acceptedBanner: { + padding: "12px 16px", + marginBottom: "24px", + borderRadius: "8px", + backgroundColor: "var(--rp-c-bg-soft)", + border: "1px solid var(--rp-c-divider-light)", + fontSize: "14px", + color: "var(--rp-c-text-2)", + }, +}; diff --git a/components/LicenseText.tsx b/components/LicenseText.tsx new file mode 100644 index 0000000..f3c3698 --- /dev/null +++ b/components/LicenseText.tsx @@ -0,0 +1,91 @@ +export const LicenseText = () => ( + <> +

Entrust Signhost SDK License Agreement

+

+ Last updated: August 2026 +

+

+ PLEASE READ THIS SDK LICENSE AGREEMENT ("AGREEMENT") CAREFULLY BEFORE + DOWNLOADING OR USING THE ENTRUST SIGNHOST SDK. BY CLICKING "I ACCEPT" OR + BY DOWNLOADING, INSTALLING, OR USING THE SDK, YOU AGREE TO BE BOUND BY THE + TERMS OF THIS AGREEMENT. +

+ +

1. Grant of license

+

+ Subject to the terms of this Agreement, Entrust Corporation ("Entrust") + grants you a limited, non-exclusive, non-transferable, revocable license + to use the Signhost Software Development Kit ("SDK") solely for the + purpose of developing, testing, and deploying applications that integrate + with the Entrust Signhost API. +

+ +

2. Restrictions

+

You may not:

+
    +
  • + Sublicense, sell, lease, or otherwise distribute the SDK to any third + party. +
  • +
  • + Modify, decompile, reverse engineer, or disassemble the SDK or any part + thereof, except to the extent permitted by applicable law. +
  • +
  • Use the SDK to develop competing products or services.
  • +
  • + Remove or alter any proprietary notices, labels, or marks on the SDK. +
  • +
+ +

3. Intellectual property

+

+ The SDK and all copies thereof are proprietary to Entrust and title + thereto remains in Entrust. All applicable rights to patents, copyrights, + trademarks, and trade secrets in the SDK are and shall remain in Entrust. +

+ +

4. No warranty

+

+ THE SDK IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. ENTRUST DOES NOT + WARRANT THAT THE SDK WILL BE ERROR-FREE OR UNINTERRUPTED. +

+ +

5. Limitation of liability

+

+ IN NO EVENT SHALL ENTRUST BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, + CONSEQUENTIAL, OR PUNITIVE DAMAGES, OR ANY LOSS OF PROFITS OR REVENUE, + WHETHER INCURRED DIRECTLY OR INDIRECTLY, ARISING OUT OF YOUR USE OF OR + INABILITY TO USE THE SDK. +

+ +

6. Termination

+

+ This Agreement is effective until terminated. Entrust may terminate this + Agreement at any time if you fail to comply with any term herein. Upon + termination, you must cease all use of the SDK and destroy all copies in + your possession. +

+ +

7. Export compliance

+

+ You agree to comply with all applicable export and re-export control laws + and regulations in connection with your use of the SDK. +

+ +

8. Governing law

+

+ This Agreement shall be governed by and construed in accordance with the + laws of the Province of Ontario, Canada, without regard to its conflict of + laws principles. +

+ +

9. Entire agreement

+

+ This Agreement constitutes the entire agreement between you and Entrust + regarding the SDK and supersedes all prior agreements and understandings, + whether written or oral, relating to the SDK. +

+ +); diff --git a/docs/_nav.json b/docs/_nav.json index f60e341..88cd7a4 100644 --- a/docs/_nav.json +++ b/docs/_nav.json @@ -17,6 +17,10 @@ } ] }, + { + "text": "SDKs", + "link": "/sdk" + }, { "text": "About", "link": "/about" diff --git a/docs/sdk.mdx b/docs/sdk.mdx new file mode 100644 index 0000000..241e1a7 --- /dev/null +++ b/docs/sdk.mdx @@ -0,0 +1,32 @@ +--- +title: SDKs +sidebar: false +outline: false +--- + +import { ClickThroughGate } from "../components/ClickThroughGate"; + +# SDKs + +Download the Signhost SDK for your platform to get started with the API integration. You must accept the license agreement below before accessing the downloads. + + + +## Downloads + +| SDK | Download | +| --- | --- | +| Signhost Signer SDK | [Download](https://github.com/Evidos/signhost-signer-sdk/releases) | + +:::tip +Can't find the SDK for your platform? Check out the [API reference](/openapi) and [quick start guide](/guide/start/quick-start) to integrate directly with the REST API. +::: + +## Getting started + +1. Download the SDK for your platform +2. Follow the installation instructions in the SDK's README +3. Configure your API credentials (see [authentication](/guide/features/authentication)) +4. Create your first transaction using the [quick start guide](/guide/start/quick-start) + + From cf59709b396866a9755b8368f18d8ca973c9f6ff Mon Sep 17 00:00:00 2001 From: Paul Loth Date: Thu, 6 Aug 2026 12:42:31 +0200 Subject: [PATCH 2/6] Fix Biome formatting: inline span content --- components/ClickThroughGate.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/components/ClickThroughGate.tsx b/components/ClickThroughGate.tsx index 249c467..14fb891 100644 --- a/components/ClickThroughGate.tsx +++ b/components/ClickThroughGate.tsx @@ -55,9 +55,7 @@ export const ClickThroughGate = ({ children }: { children: ReactNode }) => { return (
- - You accepted the SDK License Agreement on {date}. - + You accepted the SDK License Agreement on {date}.
{children}
From 5a11883f4026e650f390790f7cb54e10c0b4e3b4 Mon Sep 17 00:00:00 2001 From: Paul Loth Date: Thu, 6 Aug 2026 12:46:15 +0200 Subject: [PATCH 3/6] SIG-6013: SDK click-through agreement page From c6329929e275cbe9bcd0db5565c1cfeecd1d7029 Mon Sep 17 00:00:00 2001 From: Paul Loth Date: Thu, 6 Aug 2026 12:46:21 +0200 Subject: [PATCH 4/6] SIG-6013: SDK click-through agreement page From 07e35cebf522c299b1165353298dfa90cd962a7a Mon Sep 17 00:00:00 2001 From: Paul Loth Date: Thu, 6 Aug 2026 12:46:29 +0200 Subject: [PATCH 5/6] SIG-6013: SDK click-through agreement page From d21066b66759d8dd71602a46037a06ff915b5a2a Mon Sep 17 00:00:00 2001 From: Paul Loth Date: Thu, 6 Aug 2026 12:46:34 +0200 Subject: [PATCH 6/6] SIG-6013: SDK click-through agreement page