+ {verifyStatus === 'idle' && renderDropzone()}
+ {verifyStatus === 'verifying' && renderVerifying()}
+ {verifyStatus === 'network-select' && renderDropzone()}
+ {verifyStatus === 'valid' && (
+
+ )}
- {(verifyStatus === 'invalid' || verifyStatus === 'error') && (
-
- )}
- {verifyStatus === 'network-select' && (
-
- )}
-
-
-
-
Try our demo document!
-
-
-
- Experience the interoperability of our documents from the
- documents gallery!
+ {(verifyStatus === 'invalid' || verifyStatus === 'error') && (
+
+ )}
+ {verifyStatus === 'network-select' && (
+
+ )}
+
-
-
-
+ >
)
}
diff --git a/src/components/home/VerifySection/useVerify.test.ts b/src/components/home/VerifySection/useVerify.test.ts
index 3f196b6..3da0e57 100644
--- a/src/components/home/VerifySection/useVerify.test.ts
+++ b/src/components/home/VerifySection/useVerify.test.ts
@@ -778,6 +778,147 @@ describe('useVerify', () => {
})
})
+ // ── loadDocument ──────────────────────────────────────────────────────────
+
+ describe('loadDocument', () => {
+ it('sets fileName and transitions to valid on successful verification', async () => {
+ vi.mocked(verifyDocument).mockResolvedValue([
+ {
+ name: 'OpenAttestationHash',
+ status: 'VALID',
+ type: 'DOCUMENT_INTEGRITY',
+ },
+ ])
+ vi.mocked(isTransferableRecord).mockReturnValue(false)
+ vi.mocked(isDocumentRevokable).mockReturnValue(false)
+
+ const { result } = renderHook(() => useVerify(), { wrapper })
+
+ await act(async () => {
+ await result.current.loadDocument(
+ { test: true },
+ '11155111',
+ 'action-doc.json'
+ )
+ })
+
+ await waitFor(() => expect(result.current.verifyStatus).toBe('valid'))
+ expect(result.current.fileName).toBe('action-doc.json')
+ })
+
+ it('transitions through verifying before settling to valid', async () => {
+ let resolveFn!: (v: any) => void
+ vi.mocked(verifyDocument).mockReturnValue(
+ new Promise(res => {
+ resolveFn = res
+ })
+ )
+ vi.mocked(isTransferableRecord).mockReturnValue(false)
+ vi.mocked(isDocumentRevokable).mockReturnValue(false)
+
+ const { result } = renderHook(() => useVerify(), { wrapper })
+
+ act(() => {
+ result.current.loadDocument({ test: true }, '1', 'doc.json')
+ })
+
+ expect(result.current.verifyStatus).toBe('verifying')
+
+ await act(async () => {
+ resolveFn([
+ {
+ name: 'OpenAttestationHash',
+ status: 'VALID',
+ type: 'DOCUMENT_INTEGRITY',
+ },
+ ])
+ })
+ await waitFor(() => expect(result.current.verifyStatus).toBe('valid'))
+ })
+
+ it('resolves to invalid when fragments are invalid', async () => {
+ vi.mocked(verifyDocument).mockResolvedValue([
+ {
+ name: 'OpenAttestationHash',
+ status: 'INVALID',
+ type: 'DOCUMENT_INTEGRITY',
+ },
+ ])
+ vi.mocked(isTransferableRecord).mockReturnValue(false)
+ vi.mocked(isDocumentRevokable).mockReturnValue(false)
+
+ const { result } = renderHook(() => useVerify(), { wrapper })
+
+ await act(async () => {
+ await result.current.loadDocument({ test: true }, '1', 'doc.json')
+ })
+
+ await waitFor(() => expect(result.current.verifyStatus).toBe('invalid'))
+ })
+
+ it('sets error state when verifyDocument rejects', async () => {
+ vi.mocked(verifyDocument).mockRejectedValue(new Error('RPC down'))
+ vi.mocked(isTransferableRecord).mockReturnValue(false)
+ vi.mocked(isDocumentRevokable).mockReturnValue(false)
+
+ const { result } = renderHook(() => useVerify(), { wrapper })
+
+ await act(async () => {
+ await result.current.loadDocument({ test: true }, '1', 'doc.json')
+ })
+
+ await waitFor(() => expect(result.current.verifyStatus).toBe('error'))
+ expect(result.current.errorType).toBe(TYPES.VERIFICATION_ERROR)
+ })
+
+ it('overwrites fileName when called a second time', async () => {
+ vi.mocked(verifyDocument).mockResolvedValue([
+ {
+ name: 'OpenAttestationHash',
+ status: 'VALID',
+ type: 'DOCUMENT_INTEGRITY',
+ },
+ ])
+ vi.mocked(isTransferableRecord).mockReturnValue(false)
+ vi.mocked(isDocumentRevokable).mockReturnValue(false)
+
+ const { result } = renderHook(() => useVerify(), { wrapper })
+
+ await act(async () => {
+ await result.current.loadDocument({ v: 1 }, '1', 'first.json')
+ })
+ await waitFor(() => expect(result.current.verifyStatus).toBe('valid'))
+
+ await act(async () => {
+ await result.current.loadDocument({ v: 2 }, '137', 'second.json')
+ })
+ await waitFor(() => expect(result.current.verifyStatus).toBe('valid'))
+
+ expect(result.current.fileName).toBe('second.json')
+ })
+
+ it('accepts null chainId and still calls verifyDocument', async () => {
+ vi.mocked(verifyDocument).mockResolvedValue([
+ {
+ name: 'OpenAttestationHash',
+ status: 'VALID',
+ type: 'DOCUMENT_INTEGRITY',
+ },
+ ])
+ vi.mocked(isTransferableRecord).mockReturnValue(false)
+ vi.mocked(isDocumentRevokable).mockReturnValue(false)
+
+ const { result } = renderHook(() => useVerify(), { wrapper })
+
+ await act(async () => {
+ await result.current.loadDocument({ test: true }, null, 'doc.json')
+ })
+
+ await waitFor(() => expect(result.current.verifyStatus).toBe('valid'))
+ expect(verifyDocument).toHaveBeenCalledTimes(1)
+ })
+ })
+
// ── getErrorTypeFromFragments ───────────────────────────────────────────────
describe('getErrorTypeFromFragments', () => {
diff --git a/src/components/home/VerifySection/useVerify.ts b/src/components/home/VerifySection/useVerify.ts
index 0bbeae0..abe37f6 100644
--- a/src/components/home/VerifySection/useVerify.ts
+++ b/src/components/home/VerifySection/useVerify.ts
@@ -75,6 +75,11 @@ export interface UseVerifyReturn {
handleReset: () => void
handleNetworkConfirm: (_chainId: string) => void
handleNetworkCancel: () => void
+ loadDocument: (
+ _doc: unknown,
+ _chainId: string | null | undefined,
+ _name: string
+ ) => Promise
}
const computeGroupStatus = (
@@ -508,6 +513,27 @@ export const useVerify = (): UseVerifyReturn => {
}
}
+ const loadDocument = async (
+ doc: unknown,
+ chainId: string | null | undefined,
+ name: string
+ ) => {
+ const currentId = ++verificationIdRef.current
+ setFileName(name)
+ setVerifyStatus('verifying')
+ setFragments([])
+ setPendingDoc(null)
+ clearVerificationMetadata()
+
+ try {
+ await runVerification(doc, chainId, currentId)
+ } catch (err) {
+ clearVerificationMetadata()
+ setErrorType(getErrorTypeFromError(err))
+ setVerifyStatus('error')
+ }
+ }
+
const handleReset = () => {
setVerifyStatus('idle')
setFragments([])
@@ -541,5 +567,6 @@ export const useVerify = (): UseVerifyReturn => {
handleReset,
handleNetworkConfirm,
handleNetworkCancel,
+ loadDocument,
}
}
diff --git a/src/data/capabilities.ts b/src/data/capabilities.ts
new file mode 100644
index 0000000..e73a3c1
--- /dev/null
+++ b/src/data/capabilities.ts
@@ -0,0 +1,49 @@
+export interface Capability {
+ icon: string
+ tags: string[]
+ title: string
+ description: string
+}
+
+const capabilities: Capability[] = [
+ {
+ icon: '/images/about/single-source.svg',
+ tags: ['Transferable Record'],
+ title: 'Single Source of Truth',
+ description:
+ 'TrustVC uses a public blockchain to maintain a single source of truth for ETRs.',
+ },
+ {
+ icon: '/images/about/unified-foundation.svg',
+ tags: ['Verifiable Document', 'Transferable Record'],
+ title: 'Unified Foundation',
+ description:
+ 'Single SDK powering multiple industry-specific verification solutions.',
+ },
+ {
+ icon: '/images/about/global.svg',
+ tags: ['Verifiable Document', 'Transferable Record'],
+ title: 'Global Interoperability',
+ description: 'Cross-border verification utilising international standards.',
+ },
+ {
+ icon: '/images/about/privacy.svg',
+ tags: ['Verifiable Document', 'Transferable Record'],
+ title: 'Privacy First',
+ description: 'Selective disclosure of data to protect user privacy.',
+ },
+ {
+ icon: '/images/about/tamper.svg',
+ tags: ['Verifiable Document', 'Transferable Record'],
+ title: 'Tamper Evident',
+ description: 'Any modification invalidates the document.',
+ },
+ {
+ icon: '/images/about/ecosystem.svg',
+ tags: ['Verifiable Document', 'Transferable Record'],
+ title: 'Ecosystem Approach',
+ description: 'Growing network of issuers, verifiers, and users worldwide.',
+ },
+]
+
+export default capabilities
diff --git a/src/data/partners.ts b/src/data/partners.ts
new file mode 100644
index 0000000..bbae7f0
--- /dev/null
+++ b/src/data/partners.ts
@@ -0,0 +1,687 @@
+import type { Partner } from '../types/partner'
+
+const partners: Partner[] = [
+ {
+ name: 'AEOTRADE',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/AEOTRADE.png',
+ logo2x:
+ '/images/partners/2X/Card/Solution Provider/TradeTrust/AEOTRADE.png',
+ bannerLogo: '/images/partners/1X/Banner/AEOTRADE.png',
+ bannerLogo2x: '/images/partners/2X/Banner/AEOTRADE.png',
+ website: 'https://www.aeotrade.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'ASTROn',
+ logo: '/images/partners/1X/Card/Infrastructure/TradeTrust/ASTROn.png',
+ logo2x: '/images/partners/2X/Card/Infrastructure/TradeTrust/ASTROn.png',
+ bannerLogo: '/images/partners/1X/Banner/ASTROn.png',
+ bannerLogo2x: '/images/partners/2X/Banner/ASTROn.png',
+ website: 'https://bitfactory.cn',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Infrastructure',
+ },
+ {
+ name: 'Angsana Technology',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/Angsana Technology.png',
+ logo2x:
+ '/images/partners/2X/Card/Solution Provider/TradeTrust/Angsana Technology.png',
+ bannerLogo: '/images/partners/1X/Banner/Angsana Technology.png',
+ bannerLogo2x: '/images/partners/2X/Banner/Angsana Technology.png',
+ website: 'https://angsanatech.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'Automaxis',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/Automaxis.png',
+ logo2x:
+ '/images/partners/2X/Card/Solution Provider/TradeTrust/Automaxis.png',
+ bannerLogo: '/images/partners/1X/Banner/Automaxis.png',
+ bannerLogo2x: '/images/partners/2X/Banner/Automaxis.png',
+ website: 'https://autom-axis.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'Banco',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/Banco.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/Banco.png',
+ bannerLogo: '/images/partners/1X/Banner/Banco.png',
+ bannerLogo2x: '/images/partners/2X/Banner/Banco.png',
+ website: 'https://www.banco.com.sg',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'Bank of China',
+ logo: '/images/partners/1X/Card/Verification Validation/TradeTrust/Bank of China.png',
+ logo2x:
+ '/images/partners/2X/Card/Verification Validation/TradeTrust/Bank of China.png',
+ bannerLogo: '/images/partners/1X/Banner/Bank of China.png',
+ bannerLogo2x: '/images/partners/2X/Banner/Bank of China.png',
+ website: 'https://www.boc.cn/en/',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Verification & Validation',
+ },
+ {
+ name: 'BlockPeer',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/BlockPeer.png',
+ logo2x:
+ '/images/partners/2X/Card/Solution Provider/TradeTrust/BlockPeer.png',
+ bannerLogo: '/images/partners/1X/Banner/BlockPeer.png',
+ bannerLogo2x: '/images/partners/2X/Banner/BlockPeer.png',
+ website: 'https://www.blockpeer.finance',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'BunkerChain',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/BunkerChain.png',
+ logo2x:
+ '/images/partners/2X/Card/Solution Provider/TradeTrust/BunkerChain.png',
+ bannerLogo: '/images/partners/1X/Banner/BunkerChain.png',
+ bannerLogo2x: '/images/partners/2X/Banner/BunkerChain.png',
+ website: 'https://bunkerchain.io',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'CALISTA',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/CALISTA.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/CALISTA.png',
+ bannerLogo: '/images/partners/1X/Banner/CALISTA.png',
+ bannerLogo2x: '/images/partners/2X/Banner/CALISTA.png',
+ website: 'https://calistang.globaletrade.services/cng/home',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Infrastructure',
+ },
+ {
+ name: 'COFCO',
+ logo: '/images/partners/1X/Card/Issuance Attestation/TradeTrust/COFCO.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/TradeTrust/COFCO.png',
+ bannerLogo: '/images/partners/1X/Banner/COFCO.png',
+ bannerLogo2x: '/images/partners/2X/Banner/COFCO.png',
+ website: 'https://www.cofcointernational.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'CargoX',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/CargoX.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/CargoX.png',
+ bannerLogo: '/images/partners/1X/Banner/CargoX.png',
+ bannerLogo2x: '/images/partners/2X/Banner/CargoX.png',
+ website: 'https://cargox.io',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'ChainDoX',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/ChainDoX.png',
+ logo2x:
+ '/images/partners/2X/Card/Solution Provider/TradeTrust/ChainDoX.png',
+ bannerLogo: '/images/partners/1X/Banner/ChainDoX.png',
+ bannerLogo2x: '/images/partners/2X/Banner/ChainDoX.png',
+ website: 'https://chaindox.com/',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'Credore',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/Credore.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/Credore.png',
+ bannerLogo: '/images/partners/1X/Banner/Credore.png',
+ bannerLogo2x: '/images/partners/2X/Banner/Credore.png',
+ website: 'https://www.credore.xyz',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'DBS Group',
+ logo: '/images/partners/1X/Card/Verification Validation/TradeTrust/DBS Group.png',
+ logo2x:
+ '/images/partners/2X/Card/Verification Validation/TradeTrust/DBS Group.png',
+ bannerLogo: '/images/partners/1X/Banner/DBS Group.png',
+ bannerLogo2x: '/images/partners/2X/Banner/DBS Group.png',
+ website: 'https://www.dbsg.com/',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Verification & Validation',
+ },
+ {
+ name: 'DIMUTO',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/DIMUTO.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/DIMUTO.png',
+ bannerLogo: '/images/partners/1X/Banner/DIMUTO.png',
+ bannerLogo2x: '/images/partners/2X/Banner/DIMUTO.png',
+ website: 'https://dimuto.io',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'DLTLedgers',
+ logo: '/images/partners/1X/Card/Infrastructure/TradeTrust/DLTLedgers.png',
+ logo2x: '/images/partners/2X/Card/Infrastructure/TradeTrust/DLTLedgers.png',
+ bannerLogo: '/images/partners/1X/Banner/DLTLedgers.png',
+ bannerLogo2x: '/images/partners/2X/Banner/DLTLedgers.png',
+ website: 'https://dlt.sg/',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'DOCKLAB',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/DOCKLAB.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/DOCKLAB.png',
+ bannerLogo: '/images/partners/1X/Banner/DOCKLAB.png',
+ bannerLogo2x: '/images/partners/2X/Banner/DOCKLAB.png',
+ website: 'https://docklab.nl',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'Docsonblocks',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/Docsonblocks.png',
+ logo2x:
+ '/images/partners/2X/Card/Solution Provider/TradeTrust/Docsonblocks.png',
+ bannerLogo: '/images/partners/1X/Banner/Docsonblocks.png',
+ bannerLogo2x: '/images/partners/2X/Banner/Docsonblocks.png',
+ website: 'https://app.docsonblocks.com/',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'DocuShield',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/DocuShield.png',
+ logo2x:
+ '/images/partners/2X/Card/Solution Provider/TradeTrust/DocuShield.png',
+ bannerLogo: '/images/partners/1X/Banner/DocuShield.png',
+ bannerLogo2x: '/images/partners/2X/Banner/DocuShield.png',
+ website: 'https://www.docushield.co.in/',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'DocuTrade',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/DocuTrade.png',
+ logo2x:
+ '/images/partners/2X/Card/Solution Provider/TradeTrust/DocuTrade.png',
+ bannerLogo: '/images/partners/1X/Banner/DocuTrade.png',
+ bannerLogo2x: '/images/partners/2X/Banner/DocuTrade.png',
+ website: 'https://docutrade.io',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'FUIX LABS',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/FUIX LABS.png',
+ logo2x:
+ '/images/partners/2X/Card/Solution Provider/TradeTrust/FUIX LABS.png',
+ bannerLogo: '/images/partners/1X/Banner/FUIX LABS.png',
+ bannerLogo2x: '/images/partners/2X/Banner/FUIX LABS.png',
+ website: 'https://fuixlabs.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'FilPass',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/FilPass.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/FilPass.png',
+ bannerLogo: '/images/partners/1X/Banner/FilPass.png',
+ bannerLogo2x: '/images/partners/2X/Banner/FilPass.png',
+ website: 'https://filpass.ph',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'GUUD',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/GUUD.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/GUUD.png',
+ bannerLogo: '/images/partners/1X/Banner/GUUD.png',
+ bannerLogo2x: '/images/partners/2X/Banner/GUUD.png',
+ website: 'https://guud.company',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'ICICI Bank',
+ logo: '/images/partners/1X/Card/Issuance Attestation/TradeTrust/ICICI Bank.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/TradeTrust/ICICI Bank.png',
+ bannerLogo: '/images/partners/1X/Banner/ICICI Bank.png',
+ bannerLogo2x: '/images/partners/2X/Banner/ICICI Bank.png',
+ website: 'https://www.icicibank.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Verification & Validation',
+ },
+ {
+ name: 'Institute of Technical Education',
+ logo: '/images/partners/1X/Card/Issuance Attestation/OpenCert/Institute of Technical Education.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/OpenCert/Institute of Technical Education.png',
+ bannerLogo:
+ '/images/partners/1X/Banner/Institute of Technical Education.png',
+ bannerLogo2x:
+ '/images/partners/2X/Banner/Institute of Technical Education.png',
+ website: 'https://www.ite.edu.sg',
+ description: '',
+ verticalType: 'OpenCerts',
+ category: 'Issuance & Attestation',
+ },
+ {
+ name: 'JSLA',
+ logo: '/images/partners/1X/Card/Issuance Attestation/TradeTrust/JSLA.png',
+ logo2x: '/images/partners/2X/Card/Issuance Attestation/TradeTrust/JSLA.png',
+ bannerLogo: '/images/partners/1X/Banner/JSLA.png',
+ bannerLogo2x: '/images/partners/2X/Banner/JSLA.png',
+ website: '',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Issuance & Attestation',
+ },
+ {
+ name: 'JUPYTON',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/JUPYTON.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/JUPYTON.png',
+ bannerLogo: '/images/partners/1X/Banner/JUPYTON.png',
+ bannerLogo2x: '/images/partners/2X/Banner/JUPYTON.png',
+ website: 'https://jupyton.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'Jed',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/Jed.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/Jed.png',
+ bannerLogo: '/images/partners/1X/Banner/Jed.png',
+ bannerLogo2x: '/images/partners/2X/Banner/Jed.png',
+ website: 'https://www.jedtrade.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'LASALLE College of the Arts',
+ logo: '/images/partners/1X/Card/Issuance Attestation/OpenCert/LASALLE College of the Arts.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/OpenCert/LASALLE College of the Arts.png',
+ bannerLogo: '/images/partners/1X/Banner/LASALLE College of the Arts.png',
+ bannerLogo2x: '/images/partners/2X/Banner/LASALLE College of the Arts.png',
+ website: 'https://www.lasalle.edu.sg',
+ description: '',
+ verticalType: 'OpenCerts',
+ category: 'Issuance & Attestation',
+ },
+ {
+ name: 'Linklogis',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/Linklogis.png',
+ logo2x:
+ '/images/partners/2X/Card/Solution Provider/TradeTrust/Linklogis.png',
+ bannerLogo: '/images/partners/1X/Banner/Linklogis.png',
+ bannerLogo2x: '/images/partners/2X/Banner/Linklogis.png',
+ website: 'https://www.linklogis.com/en/',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'MAPTRASCO',
+ logo: '/images/partners/1X/Card/Issuance Attestation/TradeTrust/MAPTRASCO.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/TradeTrust/MAPTRASCO.png',
+ bannerLogo: '/images/partners/1X/Banner/MAPTRASCO.png',
+ bannerLogo2x: '/images/partners/2X/Banner/MAPTRASCO.png',
+ website: 'https://khaitan.com.sg/',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'Morpheus.Network',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/Morpheus.Network.png',
+ logo2x:
+ '/images/partners/2X/Card/Solution Provider/TradeTrust/Morpheus.Network.png',
+ bannerLogo: '/images/partners/1X/Banner/Morpheus.Network.png',
+ bannerLogo2x: '/images/partners/2X/Banner/Morpheus.Network.png',
+ website: 'https://morpheus.network',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Infrastructure',
+ },
+ {
+ name: 'NAFA',
+ logo: '/images/partners/1X/Card/Issuance Attestation/OpenCert/NAFA.png',
+ logo2x: '/images/partners/2X/Card/Issuance Attestation/OpenCert/NAFA.png',
+ bannerLogo: '/images/partners/1X/Banner/NAFA.png',
+ bannerLogo2x: '/images/partners/2X/Banner/NAFA.png',
+ website: 'https://www.nafa.edu.sg',
+ description: '',
+ verticalType: 'OpenCerts',
+ category: 'Issuance & Attestation',
+ },
+ {
+ name: 'NIEC',
+ logo: '/images/partners/1X/Card/Issuance Attestation/OpenCert/NIEC.png',
+ logo2x: '/images/partners/2X/Card/Issuance Attestation/OpenCert/NIEC.png',
+ bannerLogo: '/images/partners/1X/Banner/NIEC.png',
+ bannerLogo2x: '/images/partners/2X/Banner/NIEC.png',
+ website: 'https://niec.edu.sg',
+ description: '',
+ verticalType: 'OpenCerts',
+ category: 'Issuance & Attestation',
+ },
+ {
+ name: 'Nanyang Polytechnic',
+ logo: '/images/partners/1X/Card/Issuance Attestation/OpenCert/Nanyang Polytechnic.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/OpenCert/Nanyang Polytechnic.png',
+ bannerLogo: '/images/partners/1X/Banner/Nanyang Polytechnic.png',
+ bannerLogo2x: '/images/partners/2X/Banner/Nanyang Polytechnic.png',
+ website: 'https://www.nyp.edu.sg',
+ description: '',
+ verticalType: 'OpenCerts',
+ category: 'Issuance & Attestation',
+ },
+ {
+ name: 'National University of Singapore',
+ logo: '/images/partners/1X/Card/Issuance Attestation/OpenCert/National University of Singapore.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/OpenCert/National University of Singapore.png',
+ bannerLogo:
+ '/images/partners/1X/Banner/National University of Singapore.png',
+ bannerLogo2x:
+ '/images/partners/2X/Banner/National University of Singapore.png',
+ website: 'https://nus.edu.sg',
+ description: '',
+ verticalType: 'OpenCerts',
+ category: 'Issuance & Attestation',
+ },
+ {
+ name: 'Ngee Ann Polytechnic',
+ logo: '/images/partners/1X/Card/Issuance Attestation/OpenCert/Ngee Ann Polytechnic.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/OpenCert/Ngee Ann Polytechnic.png',
+ bannerLogo: '/images/partners/1X/Banner/Ngee Ann Polytechnic.png',
+ bannerLogo2x: '/images/partners/2X/Banner/Ngee Ann Polytechnic.png',
+ website: 'https://www.np.edu.sg',
+ description: '',
+ verticalType: 'OpenCerts',
+ category: 'Issuance & Attestation',
+ },
+ {
+ name: 'Pacific International Lines',
+ logo: '/images/partners/1X/Card/Issuance Attestation/TradeTrust/Pacific International Lines.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/TradeTrust/Pacific International Lines.png',
+ bannerLogo: '/images/partners/1X/Banner/Pacific International Lines.png',
+ bannerLogo2x: '/images/partners/2X/Banner/Pacific International Lines.png',
+ website: 'https://www.pilship.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'Republic Polytechnic',
+ logo: '/images/partners/1X/Card/Issuance Attestation/OpenCert/Republic Polytechnic.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/OpenCert/Republic Polytechnic.png',
+ bannerLogo: '/images/partners/1X/Banner/Republic Polytechnic.png',
+ bannerLogo2x: '/images/partners/2X/Banner/Republic Polytechnic.png',
+ website: 'https://www.rp.edu.sg',
+ description: '',
+ verticalType: 'OpenCerts',
+ category: 'Issuance & Attestation',
+ },
+ {
+ name: 'SECRO',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/SECRO.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/SECRO.png',
+ bannerLogo: '/images/partners/1X/Banner/SECRO.png',
+ bannerLogo2x: '/images/partners/2X/Banner/SECRO.png',
+ website: 'https://secro.io',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'SGTraDex',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/SGTraDex.png',
+ logo2x:
+ '/images/partners/2X/Card/Solution Provider/TradeTrust/SGTraDex.png',
+ bannerLogo: '/images/partners/1X/Banner/SGTraDex.png',
+ bannerLogo2x: '/images/partners/2X/Banner/SGTraDex.png',
+ website: 'https://sgtradex.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Infrastructure',
+ },
+ {
+ name: 'SMU',
+ logo: '/images/partners/1X/Card/Issuance Attestation/OpenCert/SMU.png',
+ logo2x: '/images/partners/2X/Card/Issuance Attestation/OpenCert/SMU.png',
+ bannerLogo: '/images/partners/1X/Banner/SMU.png',
+ bannerLogo2x: '/images/partners/2X/Banner/SMU.png',
+ website: 'https://www.smu.edu.sg',
+ description: '',
+ verticalType: 'OpenCerts',
+ category: 'Issuance & Attestation',
+ },
+ {
+ name: 'STABILITY',
+ logo: '/images/partners/1X/Card/Infrastructure/TradeTrust/STABILITY.png',
+ logo2x: '/images/partners/2X/Card/Infrastructure/TradeTrust/STABILITY.png',
+ bannerLogo: '/images/partners/1X/Banner/STABILITY.png',
+ bannerLogo2x: '/images/partners/2X/Banner/STABILITY.png',
+ website: 'https://stabilityprotocol.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Infrastructure',
+ },
+ {
+ name: 'Singapore Examinations and Assessment Board',
+ logo: '/images/partners/1X/Card/Issuance Attestation/OpenCert/Singapore Examinations and Assessment Board.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/OpenCert/Singapore Examinations and Assessment Board.png',
+ bannerLogo:
+ '/images/partners/1X/Banner/Singapore Examinations and Assessment Board.png',
+ bannerLogo2x:
+ '/images/partners/2X/Banner/Singapore Examinations and Assessment Board.png',
+ website: 'https://www.seab.gov.sg',
+ description: '',
+ verticalType: 'OpenCerts',
+ category: 'Issuance & Attestation',
+ },
+ {
+ name: 'Singapore Polytechnic',
+ logo: '/images/partners/1X/Card/Issuance Attestation/OpenCert/Singapore Polytechnic.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/OpenCert/Singapore Polytechnic.png',
+ bannerLogo: '/images/partners/1X/Banner/Singapore Polytechnic.png',
+ bannerLogo2x: '/images/partners/2X/Banner/Singapore Polytechnic.png',
+ website: 'https://www.sp.edu.sg',
+ description: '',
+ verticalType: 'OpenCerts',
+ category: 'Issuance & Attestation',
+ },
+ {
+ name: 'Singapore University of Social Sciences',
+ logo: '/images/partners/1X/Card/Issuance Attestation/OpenCert/Singapore University of Social Sciences.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/OpenCert/Singapore University of Social Sciences.png',
+ bannerLogo:
+ '/images/partners/1X/Banner/Singapore University of Social Sciences.png',
+ bannerLogo2x:
+ '/images/partners/2X/Banner/Singapore University of Social Sciences.png',
+ website: 'https://www.suss.edu.sg',
+ description: '',
+ verticalType: 'OpenCerts',
+ category: 'Issuance & Attestation',
+ },
+ {
+ name: 'SkillsFuture SG',
+ logo: '/images/partners/1X/Card/Issuance Attestation/OpenCert/SkillsFuture SG.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/OpenCert/SkillsFuture SG.png',
+ bannerLogo: '/images/partners/1X/Banner/SkillsFuture SG.png',
+ bannerLogo2x: '/images/partners/2X/Banner/SkillsFuture SG.png',
+ website: 'https://www.skillsfuture.gov.sg',
+ description: '',
+ verticalType: 'OpenCerts',
+ category: 'Issuance & Attestation',
+ },
+ {
+ name: 'TASConnect',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/TASConnect.png',
+ logo2x:
+ '/images/partners/2X/Card/Solution Provider/TradeTrust/TASConnect.png',
+ bannerLogo: '/images/partners/1X/Banner/TASConnect.png',
+ bannerLogo2x: '/images/partners/2X/Banner/TASConnect.png',
+ website: 'https://tasconnect.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'TRAMÉS',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/TRAMÉS.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/TRAMÉS.png',
+ bannerLogo: '/images/partners/1X/Banner/TRAMÉS.png',
+ bannerLogo2x: '/images/partners/2X/Banner/TRAMÉS.png',
+ website: 'https://trames.io',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'Temasek Polytechnic',
+ logo: '/images/partners/1X/Card/Issuance Attestation/OpenCert/Temasek Polytechnic.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/OpenCert/Temasek Polytechnic.png',
+ bannerLogo: '/images/partners/1X/Banner/Temasek Polytechnic.png',
+ bannerLogo2x: '/images/partners/2X/Banner/Temasek Polytechnic.png',
+ website: 'https://www.tp.edu.sg',
+ description: '',
+ verticalType: 'OpenCerts',
+ category: 'Issuance & Attestation',
+ },
+ {
+ name: 'TradeGo',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/TradeGo.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/TradeGo.png',
+ bannerLogo: '/images/partners/1X/Banner/TradeGo.png',
+ bannerLogo2x: '/images/partners/2X/Banner/TradeGo.png',
+ website: 'https://tradego.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'UOB',
+ logo: '/images/partners/1X/Card/Verification Validation/TradeTrust/UOB.png',
+ logo2x:
+ '/images/partners/2X/Card/Verification Validation/TradeTrust/UOB.png',
+ bannerLogo: '/images/partners/1X/Banner/UOB.png',
+ bannerLogo2x: '/images/partners/2X/Banner/UOB.png',
+ website: 'https://www.uobgroup.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Verification & Validation',
+ },
+ {
+ name: 'VAYANA',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/VAYANA.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/VAYANA.png',
+ bannerLogo: '/images/partners/1X/Banner/VAYANA.png',
+ bannerLogo2x: '/images/partners/2X/Banner/VAYANA.png',
+ website: 'https://www.vayana.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'XDC Network',
+ logo: '/images/partners/1X/Card/Infrastructure/TradeTrust/XDC Network.png',
+ logo2x:
+ '/images/partners/2X/Card/Infrastructure/TradeTrust/XDC Network.png',
+ bannerLogo: '/images/partners/1X/Banner/XDC Network.png',
+ bannerLogo2x: '/images/partners/2X/Banner/XDC Network.png',
+ website: 'https://xdc.org',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Infrastructure',
+ },
+ {
+ name: 'YIT HONG PTE LTD',
+ logo: '/images/partners/1X/Card/Issuance Attestation/TradeTrust/YIT HONG PTE LTD.png',
+ logo2x:
+ '/images/partners/2X/Card/Issuance Attestation/TradeTrust/YIT HONG PTE LTD.png',
+ bannerLogo: '/images/partners/1X/Banner/YIT HONG PTE LTD.png',
+ bannerLogo2x: '/images/partners/2X/Banner/YIT HONG PTE LTD.png',
+ website: 'https://www.yithong.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'ZenithBlox',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/ZenithBlox.png',
+ logo2x:
+ '/images/partners/2X/Card/Solution Provider/TradeTrust/ZenithBlox.png',
+ bannerLogo: '/images/partners/1X/Banner/ZenithBlox.png',
+ bannerLogo2x: '/images/partners/2X/Banner/ZenithBlox.png',
+ website: 'https://zenithblox.network',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'eTEU',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/eTEU.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/eTEU.png',
+ bannerLogo: '/images/partners/1X/Banner/eTEU.png',
+ bannerLogo2x: '/images/partners/2X/Banner/eTEU.png',
+ website: 'https://eteu.co.uk',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+ {
+ name: 'veriTAG',
+ logo: '/images/partners/1X/Card/Solution Providers/TradeTrust/veriTAG.png',
+ logo2x: '/images/partners/2X/Card/Solution Provider/TradeTrust/veriTAG.png',
+ bannerLogo: '/images/partners/1X/Banner/veriTAG.png',
+ bannerLogo2x: '/images/partners/2X/Banner/veriTAG.png',
+ website: 'https://veritag.com',
+ description: '',
+ verticalType: 'TradeTrust',
+ category: 'Solution Partners',
+ },
+]
+
+export default partners
diff --git a/src/index.css b/src/index.css
index 40426b9..cb5f3d2 100644
--- a/src/index.css
+++ b/src/index.css
@@ -184,6 +184,203 @@ body.dark-mode {
background-repeat: no-repeat;
}
+.app-shell--partners-light {
+ background-image:
+ url('/backgrounds/motif-left.png'), url('/backgrounds/motif-right.png'),
+ radial-gradient(
+ 84.7% 119.21% at 50% 15.3%,
+ #ffffff 0%,
+ rgba(223, 225, 255, 0.33) 100%
+ );
+ background-size:
+ auto 100vh,
+ auto 100vh,
+ cover;
+ background-position:
+ left top,
+ right top,
+ center;
+ background-repeat: no-repeat, no-repeat, no-repeat;
+ min-width: 320px;
+ overflow-x: hidden;
+}
+
+.app-shell--partners-dark {
+ background-image:
+ url('/backgrounds/motif-left.png'), url('/backgrounds/motif-right.png'),
+ radial-gradient(
+ 84.7% 119.21% at 50% 15.3%,
+ #1e2026 0%,
+ rgba(31, 27, 69, 0.33) 100%
+ );
+ background-size:
+ auto 100vh,
+ auto 100vh,
+ cover;
+ background-position:
+ left top,
+ right top,
+ center;
+ background-repeat: no-repeat, no-repeat, no-repeat;
+ min-width: 320px;
+ overflow-x: hidden;
+}
+
+@media (max-width: 639px) {
+ .app-shell--partners-light {
+ background-image: radial-gradient(
+ 84.7% 119.21% at 50% 15.3%,
+ #ffffff 0%,
+ rgba(223, 225, 255, 0.33) 100%
+ );
+ background-size: cover;
+ background-position: center;
+ }
+
+ .app-shell--partners-dark {
+ background-image: radial-gradient(
+ 84.7% 119.21% at 50% 15.3%,
+ #1e2026 0%,
+ rgba(31, 27, 69, 0.33) 100%
+ );
+ background-size: cover;
+ background-position: center;
+ }
+}
+
+.app-shell--about-light {
+ background-image:
+ url('/backgrounds/motif-left.png'), url('/backgrounds/motif-right.png'),
+ url('/backgrounds/bottom-backgound-grid.svg'),
+ radial-gradient(
+ 84.7% 119.21% at 50% 15.3%,
+ #ffffff 0%,
+ rgba(223, 225, 255, 0.33) 100%
+ );
+ background-size:
+ auto 100vh,
+ auto 100vh,
+ 100% auto,
+ cover;
+ background-position:
+ left top,
+ right top,
+ bottom center,
+ center;
+ background-repeat: no-repeat, no-repeat, no-repeat, no-repeat;
+ min-width: 320px;
+ overflow-x: hidden;
+}
+
+.app-shell--about-dark {
+ background-image:
+ url('/backgrounds/motif-left.png'), url('/backgrounds/motif-right.png'),
+ url('/backgrounds/bottom-backgound-grid.svg'),
+ radial-gradient(
+ 84.7% 119.21% at 50% 15.3%,
+ #1e2026 0%,
+ rgba(31, 27, 69, 0.33) 100%
+ );
+ background-size:
+ auto 100vh,
+ auto 100vh,
+ 100% auto,
+ cover;
+ background-position:
+ left top,
+ right top,
+ bottom center,
+ center;
+ background-repeat: no-repeat, no-repeat, no-repeat, no-repeat;
+ min-width: 320px;
+ overflow-x: hidden;
+}
+
+@media (max-width: 639px) {
+ .app-shell--about-light {
+ background-image:
+ url('/backgrounds/bottom-backgound-grid.svg'),
+ radial-gradient(
+ 84.7% 119.21% at 50% 15.3%,
+ #ffffff 0%,
+ rgba(223, 225, 255, 0.33) 100%
+ );
+ background-size:
+ 100% auto,
+ cover;
+ background-position:
+ bottom center,
+ center;
+ }
+
+ .app-shell--about-dark {
+ background-image:
+ url('/backgrounds/bottom-backgound-grid.svg'),
+ radial-gradient(
+ 84.7% 119.21% at 50% 15.3%,
+ #1e2026 0%,
+ rgba(31, 27, 69, 0.33) 100%
+ );
+ background-size:
+ 100% auto,
+ cover;
+ background-position: center, center;
+ }
+}
+
+.about-ecosystem-card {
+ position: relative;
+ overflow: hidden;
+ border-radius: 12px;
+ background: linear-gradient(97.83deg, #686ad2 10%, #167eb0 90%);
+ padding: 20px 30px;
+}
+.about-ecosystem-card-content {
+ position: relative;
+ background: #fff;
+ padding: 16px;
+ border-radius: 13px;
+ border: 1px solid rgba(169, 178, 187, 0.45);
+ box-sizing: border-box;
+}
+.about-ecosystem-card p {
+ background: none;
+ -webkit-background-clip: initial;
+ background-clip: initial;
+ -webkit-text-fill-color: #ffffff;
+}
+
+.about-ecosystem-card::before {
+ content: '';
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 100%;
+ height: 100%;
+ background-image: url('/images/about/frame-top.svg');
+ background-size: 100% auto;
+ background-position: top right;
+ background-repeat: no-repeat;
+ pointer-events: none;
+ z-index: 0;
+}
+
+.about-ecosystem-card::after {
+ content: '';
+ display: block;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image: url('/images/about/frame-bottom.svg');
+ background-size: 100% auto;
+ background-position: bottom left;
+ background-repeat: no-repeat;
+ pointer-events: none;
+ z-index: 0;
+}
.app-shell--settings-light {
background-image:
url('/backgrounds/motif-left.png'), url('/backgrounds/motif-right.png'),
@@ -1349,6 +1546,29 @@ p.small {
}
}
+@keyframes marquee {
+ from {
+ transform: translateX(0);
+ }
+ to {
+ transform: translateX(-50%);
+ }
+}
+
+/* Safari marquee fixes: pre-promote to GPU layer before animation starts */
+.animate-marquee {
+ -webkit-animation: marquee 200s linear infinite;
+ animation: marquee 200s linear infinite;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ will-change: transform;
+ /* translateZ(0) is intentionally on this element only, not its masked parent.
+ Combining WebkitMaskImage + 3D transform on the same element causes Safari
+ to drop the compositing layer, making child icons disappear. */
+ -webkit-transform: translateZ(0);
+ transform: translateZ(0);
+}
+
/* VerifySection - dropbox state variants */
.dropbox-area--centered {
justify-content: center;
@@ -4489,7 +4709,7 @@ p.small {
z-index: 2;
}
-button,
+button.solid,
label.solid {
--base: var(--primary-button-color, #5b5bb3);
--hover-overlay: var(--Primary-33-40, #4d4b9854);
diff --git a/src/pages/About/index.tsx b/src/pages/About/index.tsx
new file mode 100644
index 0000000..2c0cf31
--- /dev/null
+++ b/src/pages/About/index.tsx
@@ -0,0 +1,67 @@
+import clsx from 'clsx'
+import capabilities from '../../data/capabilities'
+import CapabilityCard from '../../components/about/CapabilityCard'
+import EcosystemCard from '../../components/about/EcosystemCard'
+
+interface AboutProps {
+ isDarkMode: boolean
+}
+
+const About = ({ isDarkMode }: AboutProps) => (
+
+
+ {/* Hero */}
+
+
+
+ The Foundation of{' '}
+
+ Digital Trust
+
+
+ TrustVC serves as a core infrastructure layer enabling secure,
+ verifiable digital credentials across multiple industries and use
+ cases.
+
+
+
+
+
+
+
+
+ {/* Core Capabilities */}
+
+
+ Core Capabilities
+
+
+
+
+ {capabilities.map(cap => (
+
+ ))}
+
+
+
+
+)
+
+export default About
diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx
index 72469f3..26d1c69 100644
--- a/src/pages/Home/index.tsx
+++ b/src/pages/Home/index.tsx
@@ -2,6 +2,7 @@ import HeroSection from '../../components/home/HeroSection'
import VerifySection from '../../components/home/VerifySection'
import Carousel from '../../components/home/Carousel'
import BuiltForDev from '../../components/home/BuiltForDev'
+import PartnersSection from '../../components/home/PartnersSection'
interface HomeProps {
isDarkMode: boolean
@@ -15,6 +16,7 @@ const Home = ({ isDarkMode }: HomeProps) => {
+