@limboai/react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +134 -0
  2. package/dist/icons/CRLogo.d.ts +12 -0
  3. package/dist/icons/LinkedInIcon.d.ts +13 -0
  4. package/dist/icons/index.d.ts +4 -0
  5. package/dist/index.cjs +2169 -0
  6. package/dist/index.cjs.map +1 -0
  7. package/dist/index.d.ts +11 -0
  8. package/dist/index.mjs +2147 -0
  9. package/dist/index.mjs.map +1 -0
  10. package/dist/shared/hooks/index.d.ts +2 -0
  11. package/dist/shared/hooks/useTooltipVisibility.d.ts +32 -0
  12. package/dist/shared/index.d.ts +2 -0
  13. package/dist/types/index.d.ts +59 -0
  14. package/dist/types/media.d.ts +56 -0
  15. package/dist/ui/core/Slot.d.ts +33 -0
  16. package/dist/ui/core/credential/CredentialBadge.d.ts +63 -0
  17. package/dist/ui/core/credential/CredentialOverlayContent.d.ts +23 -0
  18. package/dist/ui/core/credential/CredentialOverlayRoot.d.ts +35 -0
  19. package/dist/ui/core/credential/CredentialOverlayTrigger.d.ts +23 -0
  20. package/dist/ui/core/credential/context/CredentialBadgeContext.d.ts +8 -0
  21. package/dist/ui/core/credential/context/CredentialOverlayContext.d.ts +21 -0
  22. package/dist/ui/core/credential/context/index.d.ts +2 -0
  23. package/dist/ui/core/credential/hooks/index.d.ts +2 -0
  24. package/dist/ui/core/credential/hooks/useCredentialBadgeContext.d.ts +15 -0
  25. package/dist/ui/core/credential/hooks/useCredentialOverlayContext.d.ts +23 -0
  26. package/dist/ui/core/credential/index.d.ts +36 -0
  27. package/dist/ui/core/index.d.ts +2 -0
  28. package/dist/ui/core/passport/PassportActions.d.ts +27 -0
  29. package/dist/ui/core/passport/PassportCopyButton.d.ts +38 -0
  30. package/dist/ui/core/passport/PassportField.d.ts +39 -0
  31. package/dist/ui/core/passport/PassportFooter.d.ts +20 -0
  32. package/dist/ui/core/passport/PassportHeader.d.ts +19 -0
  33. package/dist/ui/core/passport/PassportIdentities.d.ts +35 -0
  34. package/dist/ui/core/passport/PassportLogo.d.ts +25 -0
  35. package/dist/ui/core/passport/PassportRoot.d.ts +24 -0
  36. package/dist/ui/core/passport/PassportSigners.d.ts +28 -0
  37. package/dist/ui/core/passport/PassportTitle.d.ts +30 -0
  38. package/dist/ui/core/passport/context/PassportContext.d.ts +12 -0
  39. package/dist/ui/core/passport/context/index.d.ts +1 -0
  40. package/dist/ui/core/passport/hooks/index.d.ts +2 -0
  41. package/dist/ui/core/passport/hooks/usePassportContext.d.ts +20 -0
  42. package/dist/ui/core/passport/hooks/usePassportData.d.ts +22 -0
  43. package/dist/ui/core/passport/index.d.ts +49 -0
  44. package/dist/ui/default/LimboBadge.d.ts +22 -0
  45. package/dist/ui/default/LimboImage.d.ts +66 -0
  46. package/dist/ui/default/LimboPassport.d.ts +30 -0
  47. package/dist/ui/default/LimboVideo.d.ts +64 -0
  48. package/dist/ui/default/constants.d.ts +19 -0
  49. package/dist/ui/default/index.d.ts +10 -0
  50. package/dist/ui/index.d.ts +3 -0
  51. package/dist/ui/media/MediaImage.d.ts +87 -0
  52. package/dist/ui/media/MediaVideo.d.ts +85 -0
  53. package/dist/ui/media/context/MediaContext.d.ts +19 -0
  54. package/dist/ui/media/context/index.d.ts +1 -0
  55. package/dist/ui/media/hooks/index.d.ts +3 -0
  56. package/dist/ui/media/hooks/useHeicConversion.d.ts +32 -0
  57. package/dist/ui/media/hooks/useMediaContext.d.ts +13 -0
  58. package/dist/ui/media/hooks/useMediaOverlay.d.ts +37 -0
  59. package/dist/ui/media/index.d.ts +5 -0
  60. package/package.json +71 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["Children","isValidElement","PassportVariant","PassportVariant","PassportVariant","PassportVariant"],"sources":["../src/icons/CRLogo.tsx","../src/icons/LinkedInIcon.tsx","../src/shared/hooks/useTooltipVisibility.ts","../src/types/media.ts","../src/types/index.ts","../src/ui/core/credential/context/CredentialBadgeContext.tsx","../src/ui/core/credential/hooks/useCredentialBadgeContext.ts","../src/ui/core/credential/context/CredentialOverlayContext.tsx","../src/ui/core/credential/hooks/useCredentialOverlayContext.ts","../src/ui/core/credential/CredentialBadge.tsx","../src/ui/core/credential/CredentialOverlayContent.tsx","../src/ui/core/credential/CredentialOverlayRoot.tsx","../src/ui/core/Slot.tsx","../src/ui/core/credential/CredentialOverlayTrigger.tsx","../src/ui/core/credential/index.ts","../src/ui/core/passport/context/PassportContext.tsx","../src/ui/core/passport/hooks/usePassportContext.ts","../src/ui/core/passport/hooks/usePassportData.ts","../src/ui/core/passport/PassportActions.tsx","../src/ui/core/passport/PassportCopyButton.tsx","../src/ui/core/passport/PassportField.tsx","../src/ui/core/passport/PassportFooter.tsx","../src/ui/core/passport/PassportHeader.tsx","../src/ui/core/passport/PassportIdentities.tsx","../src/ui/core/passport/PassportLogo.tsx","../src/ui/core/passport/PassportRoot.tsx","../src/ui/core/passport/PassportSigners.tsx","../src/ui/core/passport/PassportTitle.tsx","../src/ui/core/passport/index.ts","../src/ui/default/constants.ts","../src/ui/default/LimboBadge.tsx","../src/ui/media/hooks/useHeicConversion.ts","../src/ui/media/context/MediaContext.tsx","../src/ui/media/hooks/useMediaContext.ts","../src/ui/media/hooks/useMediaOverlay.ts","../src/ui/media/MediaImage.tsx","../src/ui/media/MediaVideo.tsx","../src/ui/default/LimboPassport.tsx","../src/ui/default/LimboImage.tsx","../src/ui/default/LimboVideo.tsx"],"sourcesContent":["import type { CSSProperties, FC } from \"react\";\n\nexport interface CRLogoProps {\n\tclassName?: string;\n\tstyle?: CSSProperties;\n\tsize?: number;\n}\n\nconst CR_LOGO_BASE64 =\n\t\"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\";\n/**\n * Content Credentials (CR) Logo\n *\n * Based on the Content Authenticity Initiative logo\n */\nexport const CRLogo: FC<CRLogoProps> = ({ size = 20, className, style }) => {\n\treturn (\n\t\t<img\n\t\t\tsrc={`data:image/png;base64,${CR_LOGO_BASE64}`}\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tclassName={className}\n\t\t\tstyle={style}\n\t\t\talt=\"Content Credentials\"\n\t\t/>\n\t);\n};\n","import type { CSSProperties, FC } from \"react\";\n\nexport interface LinkedInIconProps {\n\tclassName?: string;\n\tstyle?: CSSProperties;\n\tsize?: number;\n\tcolor?: string;\n}\n\n/**\n * LinkedIn Icon as inline SVG\n *\n * Used for LinkedIn identity verification links\n */\nexport const LinkedInIcon: FC<LinkedInIconProps> = ({\n\tsize = 14,\n\tcolor = \"#0077B5\",\n\tclassName,\n\tstyle,\n}) => {\n\treturn (\n\t\t<svg\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill={color}\n\t\t\tclassName={className}\n\t\t\tstyle={style}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t<path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n\t\t</svg>\n\t);\n};\n","\"use client\";\n\nimport { useCallback, useDebugValue, useEffect, useRef, useState } from \"react\";\n\nexport interface UseTooltipVisibilityOptions {\n\t/** Whether the content has credentials (tooltip only shown when true) */\n\thasCredentials: boolean;\n\t/** Initial visibility state */\n\tinitialVisible?: boolean;\n\t/** Delay in ms before hiding the tooltip (default: 300ms) */\n\thideDelay?: number;\n}\n\nexport interface UseTooltipVisibilityReturn {\n\t/** Whether the tooltip is currently visible */\n\tisVisible: boolean;\n\t/** Show the tooltip (only if hasCredentials is true) */\n\tshow: () => void;\n\t/** Hide the tooltip (with delay) */\n\thide: () => void;\n\t/** Toggle tooltip visibility */\n\ttoggle: () => void;\n\t/** Set visibility directly */\n\tsetVisible: (visible: boolean) => void;\n}\n\n/**\n * Hook for managing tooltip visibility with delayed hide\n *\n * @example\n * ```tsx\n * const { isVisible, show, hide, toggle } = useTooltipVisibility({\n * hasCredentials: validation?.has_credentials ?? false,\n * hideDelay: 300,\n * });\n * ```\n */\nexport function useTooltipVisibility({\n\thasCredentials,\n\tinitialVisible = false,\n\thideDelay = 300,\n}: UseTooltipVisibilityOptions): UseTooltipVisibilityReturn {\n\tconst [isVisible, setIsVisible] = useState(initialVisible);\n\tconst timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\tconst clearPendingHide = useCallback(() => {\n\t\tif (timeoutRef.current !== null) {\n\t\t\tclearTimeout(timeoutRef.current);\n\t\t\ttimeoutRef.current = null;\n\t\t}\n\t}, []);\n\n\t// Cleanup on unmount\n\tuseEffect(() => clearPendingHide, [clearPendingHide]);\n\n\tconst show = useCallback(() => {\n\t\tclearPendingHide();\n\t\tif (hasCredentials) setIsVisible(true);\n\t}, [hasCredentials, clearPendingHide]);\n\n\tconst hide = useCallback(() => {\n\t\tclearPendingHide();\n\t\ttimeoutRef.current = setTimeout(() => setIsVisible(false), hideDelay);\n\t}, [hideDelay, clearPendingHide]);\n\n\tconst toggle = useCallback(() => {\n\t\tclearPendingHide();\n\t\tif (hasCredentials) setIsVisible((v) => !v);\n\t}, [hasCredentials, clearPendingHide]);\n\n\tconst setVisible = useCallback(\n\t\t(visible: boolean) => {\n\t\t\tclearPendingHide();\n\t\t\tif (!visible || hasCredentials) setIsVisible(visible);\n\t\t},\n\t\t[hasCredentials, clearPendingHide],\n\t);\n\n\tuseDebugValue({ isVisible, hasCredentials });\n\n\treturn { isVisible, show, hide, toggle, setVisible };\n}\n","\"use client\";\n\nimport type { C2PAValidationResponse } from \"@limboai/node\";\nimport type { ValidationStatusType } from \"./index\";\n\n/**\n * Interaction mode for media components\n */\nexport const InteractionMode = {\n\tClick: \"click\",\n\tHover: \"hover\",\n} as const satisfies Record<string, string>;\n\nexport type InteractionModeType =\n\t(typeof InteractionMode)[keyof typeof InteractionMode];\n\n/**\n * Field names available in passport components\n */\nexport const PassportFieldName = {\n\tIssuer: \"issuer\",\n\tDate: \"date\",\n} as const satisfies Record<string, string>;\n\nexport type PassportFieldNameType =\n\t(typeof PassportFieldName)[keyof typeof PassportFieldName];\n\n/**\n * Passport display variants\n */\nexport const PassportVariant = {\n\tBasic: \"basic\",\n\tFull: \"full\",\n} as const satisfies Record<string, string>;\n\nexport type PassportVariantType =\n\t(typeof PassportVariant)[keyof typeof PassportVariant];\n\n/**\n * Props passed to renderBadge function in media components\n */\nexport interface RenderBadgeProps {\n\t/** Current validation status */\n\tstatus: ValidationStatusType;\n\t/** Whether the content has credentials */\n\thasCredentials: boolean;\n\t/** Whether the tooltip is currently visible */\n\tisVisible: boolean;\n\t/** Show the tooltip */\n\tshow: () => void;\n\t/** Hide the tooltip (with delay) */\n\thide: () => void;\n\t/** Toggle tooltip visibility */\n\ttoggle: () => void;\n}\n\n/**\n * Props passed to renderTooltip function in media components\n */\nexport interface RenderTooltipProps {\n\t/** Validation result from @limboai/node SDK */\n\tvalidation: C2PAValidationResponse;\n\t/** Whether the tooltip is currently visible */\n\tisVisible: boolean;\n\t/** Call when mouse enters tooltip (cancels pending hide) */\n\tonMouseEnter: () => void;\n\t/** Close the tooltip */\n\tonClose: () => void;\n}\n","import type {\n\tC2PAValidationResponse,\n\tManifestEntry,\n\tVerifiedIdentity,\n} from \"@limboai/node\";\n\n/**\n * Validation status enum with const assertion and satisfies for type safety\n */\nexport const ValidationStatus = {\n\tIdle: \"idle\",\n\tError: \"error\",\n\tSuccess: \"success\",\n\tLoading: \"loading\",\n} as const satisfies Record<string, string>;\n\nexport type ValidationStatusType =\n\t(typeof ValidationStatus)[keyof typeof ValidationStatus];\n\n/**\n * Processed data extracted from C2PA validation response\n */\nexport interface PassportData {\n\t/** The issuer of the active manifest */\n\treadonly issuer: string;\n\t/** Formatted date when the manifest was issued */\n\treadonly issuedDate: string;\n\t/** Raw ISO date string */\n\treadonly issuedDateRaw: string | null;\n\t/** List of actions from the manifest */\n\treadonly actions: readonly string[];\n\t/** Verified identities from the manifest */\n\treadonly verifiedIdentities: readonly VerifiedIdentity[];\n\t/** Previous signers in the manifest chain */\n\treadonly previousSigners: readonly ManifestEntry[];\n\t/** The active manifest entry */\n\treadonly activeManifest: ManifestEntry | null;\n\t/** The original validation response */\n\treadonly validation: C2PAValidationResponse;\n}\n\n/**\n * Identity information for rendering\n */\nexport interface IdentityInfo {\n\t/** Display name/username */\n\treadonly username: string;\n\t/** Provider name (e.g., \"LinkedIn\", \"X\") */\n\treadonly provider: string;\n\t/** URI to the identity profile */\n\treadonly uri?: string;\n\t/** When the identity was verified */\n\treadonly verifiedAt?: string;\n}\n\n/**\n * Signer information for rendering\n */\nexport interface SignerInfo {\n\t/** Unique identifier */\n\treadonly id: string;\n\t/** Display label (issuer name) */\n\treadonly label: string;\n\t/** When signed */\n\treadonly signedAt?: string;\n}\n\nexport type { C2PAValidationResponse, ManifestEntry, VerifiedIdentity };\n\nexport type {\n\tInteractionModeType,\n\tPassportFieldNameType,\n\tPassportVariantType,\n\tRenderBadgeProps,\n\tRenderTooltipProps,\n} from \"./media\";\nexport {\n\tInteractionMode,\n\tPassportFieldName,\n\tPassportVariant,\n} from \"./media\";\n","\"use client\";\n\nimport { createContext } from \"react\";\nimport type { ValidationStatusType } from \"@/types\";\n\nexport interface CredentialBadgeContextValue {\n\t/** Current validation status */\n\tstatus: ValidationStatusType;\n\t/** Whether the content has credentials */\n\thasCredentials: boolean;\n}\n\nexport const CredentialBadgeContext =\n\tcreateContext<CredentialBadgeContextValue | null>(null);\n","\"use client\";\n\nimport { useContext, useDebugValue } from \"react\";\nimport {\n\tCredentialBadgeContext,\n\ttype CredentialBadgeContextValue,\n} from \"../context/CredentialBadgeContext\";\n\n/**\n * Access the CredentialBadge context\n *\n * Must be used within a CredentialBadge.Root component\n *\n * @example\n * ```tsx\n * function MyBadgeContent() {\n * const { status, hasCredentials } = useCredentialBadgeContext();\n * return <div>{status}</div>;\n * }\n * ```\n */\nexport function useCredentialBadgeContext(): CredentialBadgeContextValue {\n\tconst context = useContext(CredentialBadgeContext);\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"useCredentialBadgeContext must be used within a CredentialBadge.Root\",\n\t\t);\n\t}\n\tuseDebugValue({\n\t\tstatus: context.status,\n\t\thasCredentials: context.hasCredentials,\n\t});\n\treturn context;\n}\n","\"use client\";\n\nimport type { C2PAValidationResponse } from \"@limboai/node\";\nimport { createContext } from \"react\";\nimport type { ValidationStatusType } from \"@/types\";\n\nexport interface CredentialOverlayContextValue {\n\t/** Validation result from @limboai/node SDK */\n\tvalidation?: C2PAValidationResponse | null;\n\t/** Current validation status */\n\tstatus: ValidationStatusType;\n\t/** Whether the content has credentials */\n\thasCredentials: boolean;\n\t/** Whether the tooltip is visible */\n\tisVisible: boolean;\n\t/** Show the tooltip */\n\tshow: () => void;\n\t/** Hide the tooltip */\n\thide: () => void;\n\t/** Toggle tooltip visibility */\n\ttoggle: () => void;\n\t/** Unique ID for aria associations */\n\toverlayId: string;\n}\n\nexport const CredentialOverlayContext =\n\tcreateContext<CredentialOverlayContextValue | null>(null);\n","\"use client\";\n\nimport { useContext, useDebugValue } from \"react\";\nimport {\n\tCredentialOverlayContext,\n\ttype CredentialOverlayContextValue,\n} from \"../context/CredentialOverlayContext\";\n\n/**\n * Access the CredentialOverlay context\n *\n * Must be used within a CredentialOverlay.Root component\n *\n * @example\n * ```tsx\n * function MyTrigger() {\n * const { show, hide, toggle, isVisible } = useCredentialOverlayContext();\n * return (\n * <button\n * onMouseEnter={show}\n * onMouseLeave={hide}\n * onClick={toggle}\n * >\n * {isVisible ? \"Hide\" : \"Show\"}\n * </button>\n * );\n * }\n * ```\n */\nexport function useCredentialOverlayContext(): CredentialOverlayContextValue {\n\tconst context = useContext(CredentialOverlayContext);\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"useCredentialOverlayContext must be used within a CredentialOverlay.Root\",\n\t\t);\n\t}\n\tuseDebugValue({ status: context.status, isVisible: context.isVisible });\n\treturn context;\n}\n","\"use client\";\n\nimport {\n\ttype FC,\n\tforwardRef,\n\ttype HTMLAttributes,\n\ttype PropsWithChildren,\n\ttype ReactNode,\n\tuseMemo,\n} from \"react\";\nimport { ValidationStatus, type ValidationStatusType } from \"@/types\";\nimport type { CredentialBadgeContextValue } from \"./context\";\nimport { CredentialBadgeContext } from \"./context/CredentialBadgeContext\";\nimport { useCredentialBadgeContext } from \"./hooks\";\n\nexport interface CredentialBadgeRootProps\n\textends HTMLAttributes<HTMLDivElement> {\n\t/** Current validation status */\n\tstatus: ValidationStatusType;\n\t/** Whether the content has credentials */\n\thasCredentials: boolean;\n\t/** Children to render */\n\tchildren: ReactNode;\n}\n\n/**\n * CredentialBadge.Root - Provider wrapper for the CredentialBadge compound component\n *\n * Provides context with status and hasCredentials to all child components.\n * Children are slot components that render based on the current state.\n *\n * @example\n * ```tsx\n * <CredentialBadge.Root status={status} hasCredentials={hasCredentials}>\n * <CredentialBadge.Loading>\n * <Spinner />\n * </CredentialBadge.Loading>\n *\n * <CredentialBadge.Verified>\n * <CheckIcon className=\"text-green-500\" />\n * </CredentialBadge.Verified>\n *\n * <CredentialBadge.NoCredentials>\n * <span>No credentials</span>\n * </CredentialBadge.NoCredentials>\n *\n * <CredentialBadge.Error>\n * <span>Error</span>\n * </CredentialBadge.Error>\n * </CredentialBadge.Root>\n * ```\n */\nconst CredentialBadgeRoot = forwardRef<\n\tHTMLDivElement,\n\tCredentialBadgeRootProps\n>(({ status, hasCredentials, children, ...props }, ref) => {\n\tconst contextValue = useMemo<CredentialBadgeContextValue>(\n\t\t() => ({\n\t\t\tstatus,\n\t\t\thasCredentials,\n\t\t}),\n\t\t[status, hasCredentials],\n\t);\n\n\treturn (\n\t\t<CredentialBadgeContext.Provider value={contextValue}>\n\t\t\t<div ref={ref} {...props}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</CredentialBadgeContext.Provider>\n\t);\n});\n\nCredentialBadgeRoot.displayName = \"CredentialBadge.Root\";\n\nexport type StatusComponentProps = PropsWithChildren;\n\ntype StatusPredicate = (\n\tstatus: ValidationStatusType,\n\thasCredentials: boolean,\n) => boolean;\n\nfunction createStatusComponent(\n\tdisplayName: string,\n\tshouldRender: StatusPredicate,\n): FC<StatusComponentProps> {\n\tconst Component: FC<StatusComponentProps> = ({ children }) => {\n\t\tconst { status, hasCredentials } = useCredentialBadgeContext();\n\n\t\tif (!shouldRender(status, hasCredentials)) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn <>{children}</>;\n\t};\n\n\tComponent.displayName = displayName;\n\n\treturn Component;\n}\n\n/**\n * CredentialBadge.Loading - Renders children only when status is \"loading\"\n */\nconst CredentialBadgeLoading = createStatusComponent(\n\t\"CredentialBadge.Loading\",\n\t(status) => status === ValidationStatus.Loading,\n);\n\n/**\n * CredentialBadge.Error - Renders children only when status is \"error\"\n */\nconst CredentialBadgeError = createStatusComponent(\n\t\"CredentialBadge.Error\",\n\t(status) => status === ValidationStatus.Error,\n);\n\n/**\n * CredentialBadge.Verified - Renders children only when status is \"success\" and has credentials\n */\nconst CredentialBadgeVerified = createStatusComponent(\n\t\"CredentialBadge.Verified\",\n\t(status, hasCredentials) =>\n\t\tstatus === ValidationStatus.Success && hasCredentials,\n);\n\n/**\n * CredentialBadge.Idle - Renders children only when status is \"idle\"\n */\nconst CredentialBadgeIdle = createStatusComponent(\n\t\"CredentialBadge.Idle\",\n\t(status) => status === ValidationStatus.Idle,\n);\n\n/**\n * CredentialBadge.NoCredentials - Renders children only when status is \"success\" but no credentials\n */\nconst CredentialBadgeNoCredentials = createStatusComponent(\n\t\"CredentialBadge.NoCredentials\",\n\t(status, hasCredentials) =>\n\t\tstatus === ValidationStatus.Success && !hasCredentials,\n);\n\n/**\n * CredentialBadge - Headless compound component for displaying credential status\n *\n * @example\n * ```tsx\n * import { CredentialBadge } from \"@limboai/react\";\n *\n * <CredentialBadge.Root status={status} hasCredentials={hasCredentials}>\n * <CredentialBadge.Loading>\n * <div className=\"animate-pulse bg-blue-500 rounded-full p-2\">\n * <Spinner />\n * </div>\n * </CredentialBadge.Loading>\n *\n * <CredentialBadge.Verified>\n * <button className=\"bg-green-500 rounded-full p-2\">\n * <CheckIcon />\n * </button>\n * </CredentialBadge.Verified>\n *\n * <CredentialBadge.NoCredentials>\n * <span className=\"bg-red-500 text-white text-xs px-2 py-1 rounded\">\n * No credentials\n * </span>\n * </CredentialBadge.NoCredentials>\n *\n * <CredentialBadge.Error>\n * <span className=\"bg-red-500 text-white text-xs px-2 py-1 rounded\">\n * Error\n * </span>\n * </CredentialBadge.Error>\n * </CredentialBadge.Root>\n * ```\n */\nexport const CredentialBadge = {\n\tRoot: CredentialBadgeRoot,\n\tLoading: CredentialBadgeLoading,\n\tVerified: CredentialBadgeVerified,\n\tNoCredentials: CredentialBadgeNoCredentials,\n\tError: CredentialBadgeError,\n\tIdle: CredentialBadgeIdle,\n};\n","\"use client\";\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\nimport { useCredentialOverlayContext } from \"./hooks\";\n\nexport interface CredentialOverlayContentProps\n\textends HTMLAttributes<HTMLDivElement> {\n\t/** Children to render when visible */\n\tchildren: ReactNode;\n\t/** Force content to always render (for CSS-based visibility) */\n\tforceMount?: boolean;\n}\n\n/**\n * CredentialOverlay.Content - Content that appears when the overlay is visible\n *\n * Only renders when the overlay is visible and credentials exist.\n * Use forceMount to always render (useful for CSS transitions).\n *\n * @example\n * ```tsx\n * <CredentialOverlay.Content className=\"absolute top-12 right-0 bg-white shadow-lg rounded-lg p-4\">\n * <Passport.Root validation={validation}>\n * ...\n * </Passport.Root>\n * </CredentialOverlay.Content>\n * ```\n */\nexport const CredentialOverlayContent = forwardRef<\n\tHTMLDivElement,\n\tCredentialOverlayContentProps\n>(({ children, forceMount, onMouseLeave, ...props }, ref) => {\n\tconst { isVisible, hasCredentials, validation, hide } =\n\t\tuseCredentialOverlayContext();\n\n\t// Don't render if no credentials or not visible (unless forceMount)\n\tif (!forceMount && (!isVisible || !hasCredentials || !validation)) {\n\t\treturn null;\n\t}\n\n\tconst handleMouseLeave = (e: React.MouseEvent<HTMLDivElement>) => {\n\t\thide();\n\t\tonMouseLeave?.(e);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\trole=\"tooltip\"\n\t\t\ttabIndex={-1}\n\t\t\tdata-state={isVisible ? \"open\" : \"closed\"}\n\t\t\tonMouseLeave={handleMouseLeave}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n});\n\nCredentialOverlayContent.displayName = \"CredentialOverlay.Content\";\n","\"use client\";\n\nimport type { C2PAValidationResponse } from \"@limboai/node\";\nimport {\n\tforwardRef,\n\ttype HTMLAttributes,\n\ttype ReactNode,\n\tuseId,\n\tuseMemo,\n} from \"react\";\nimport { useTooltipVisibility } from \"@/shared\";\nimport type { ValidationStatusType } from \"@/types\";\nimport type { CredentialOverlayContextValue } from \"./context\";\nimport { CredentialOverlayContext } from \"./context/CredentialOverlayContext\";\n\nexport interface CredentialOverlayRootProps\n\textends HTMLAttributes<HTMLDivElement> {\n\t/** Validation result from @limboai/node SDK (null if not validated yet) */\n\tvalidation?: C2PAValidationResponse | null;\n\t/** Current validation status */\n\tstatus?: ValidationStatusType;\n\t/** Children to render */\n\tchildren: ReactNode;\n\t/** Delay in ms before hiding the tooltip (default: 300ms) */\n\thideDelay?: number;\n}\n\n/**\n * CredentialOverlay.Root - Provider wrapper for the CredentialOverlay compound component\n *\n * Provides context with validation data and visibility state to all child components.\n * Manages tooltip visibility with configurable hide delay.\n *\n * @example\n * ```tsx\n * <CredentialOverlay.Root validation={validation} status=\"success\">\n * <CredentialOverlay.Trigger className=\"absolute top-2 right-2\">\n * <button className=\"bg-green-500 p-2 rounded-full\">✓</button>\n * </CredentialOverlay.Trigger>\n *\n * <CredentialOverlay.Content className=\"absolute top-12 right-0 bg-white shadow-lg rounded-lg p-4\">\n * <Passport.Root validation={validation}>\n * ...\n * </Passport.Root>\n * </CredentialOverlay.Content>\n * </CredentialOverlay.Root>\n * ```\n */\nexport const CredentialOverlayRoot = forwardRef<\n\tHTMLDivElement,\n\tCredentialOverlayRootProps\n>(\n\t(\n\t\t{ validation, status = \"idle\", hideDelay = 300, children, ...props },\n\t\tref,\n\t) => {\n\t\tconst overlayId = useId();\n\t\tconst hasCredentials = validation?.has_credentials ?? false;\n\n\t\tconst { isVisible, show, hide, toggle } = useTooltipVisibility({\n\t\t\thasCredentials,\n\t\t\thideDelay,\n\t\t});\n\n\t\tconst contextValue = useMemo<CredentialOverlayContextValue>(\n\t\t\t() => ({\n\t\t\t\tvalidation,\n\t\t\t\tstatus,\n\t\t\t\thasCredentials,\n\t\t\t\tisVisible,\n\t\t\t\tshow,\n\t\t\t\thide,\n\t\t\t\ttoggle,\n\t\t\t\toverlayId,\n\t\t\t}),\n\t\t\t[\n\t\t\t\tvalidation,\n\t\t\t\tstatus,\n\t\t\t\thasCredentials,\n\t\t\t\tisVisible,\n\t\t\t\tshow,\n\t\t\t\thide,\n\t\t\t\ttoggle,\n\t\t\t\toverlayId,\n\t\t\t],\n\t\t);\n\n\t\treturn (\n\t\t\t<CredentialOverlayContext.Provider value={contextValue}>\n\t\t\t\t<div ref={ref} {...props}>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</CredentialOverlayContext.Provider>\n\t\t);\n\t},\n);\n\nCredentialOverlayRoot.displayName = \"CredentialOverlay.Root\";\n","\"use client\";\n\nimport {\n\tChildren,\n\tcloneElement,\n\tforwardRef,\n\ttype HTMLAttributes,\n\tisValidElement,\n\ttype MutableRefObject,\n\ttype ReactElement,\n\ttype ReactNode,\n\ttype Ref,\n\ttype RefCallback,\n} from \"react\";\n\nexport interface SlotProps extends HTMLAttributes<HTMLElement> {\n\tchildren?: ReactNode;\n\t/** Disabled state for button-like elements */\n\tdisabled?: boolean;\n}\n\ntype AnyRef<T> = Ref<T> | undefined;\n\n/**\n * Compose multiple refs into a single callback ref\n * Handles function refs, object refs, and undefined refs safely\n */\nfunction composeRefs<T>(...refs: AnyRef<T>[]): RefCallback<T> {\n\treturn (instance) => {\n\t\tfor (const ref of refs) {\n\t\t\tif (typeof ref === \"function\") {\n\t\t\t\tref(instance);\n\t\t\t} else if (ref != null) {\n\t\t\t\t(ref as MutableRefObject<T | null>).current = instance;\n\t\t\t}\n\t\t}\n\t};\n}\n\n/**\n * Compose event handlers, calling child handler first then slot handler\n */\nfunction composeEventHandlers<E>(\n\tchildHandler: ((event: E) => void) | undefined,\n\tslotHandler: ((event: E) => void) | undefined,\n): ((event: E) => void) | undefined {\n\tif (!childHandler && !slotHandler) return undefined;\n\tif (!childHandler) return slotHandler;\n\tif (!slotHandler) return childHandler;\n\n\treturn (event: E) => {\n\t\tchildHandler(event);\n\t\tslotHandler(event);\n\t};\n}\n\n/**\n * Merge props from slot and child element\n * - Event handlers are composed (child first, then slot)\n * - className is concatenated\n * - style is shallow merged (child overrides slot)\n * - Other props: child overrides slot\n */\nfunction mergeProps(\n\tslotProps: Record<string, unknown>,\n\tchildProps: Record<string, unknown>,\n): Record<string, unknown> {\n\tconst merged: Record<string, unknown> = { ...slotProps };\n\n\tfor (const key in childProps) {\n\t\tconst slotValue = slotProps[key];\n\t\tconst childValue = childProps[key];\n\n\t\tif (/^on[A-Z]/.test(key)) {\n\t\t\t// Compose event handlers\n\t\t\tmerged[key] = composeEventHandlers(\n\t\t\t\tchildValue as ((e: unknown) => void) | undefined,\n\t\t\t\tslotValue as ((e: unknown) => void) | undefined,\n\t\t\t);\n\t\t} else if (key === \"className\") {\n\t\t\t// Concatenate classNames\n\t\t\tmerged[key] = [slotValue, childValue].filter(Boolean).join(\" \");\n\t\t} else if (key === \"style\") {\n\t\t\t// Merge styles (child overrides)\n\t\t\tmerged[key] = { ...(slotValue as object), ...(childValue as object) };\n\t\t} else {\n\t\t\t// Child value overrides slot value\n\t\t\tmerged[key] = childValue;\n\t\t}\n\t}\n\n\treturn merged;\n}\n\n/**\n * Slot - Enables the asChild pattern for composable components\n *\n * Renders the child element with merged props and refs from the slot.\n * This enables consumers to use their own elements while inheriting\n * behavior from headless components.\n *\n * Inspired by Radix UI's Slot primitive.\n *\n * @example\n * ```tsx\n * // Component with asChild support\n * const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n * ({ asChild, ...props }, ref) => {\n * const Comp = asChild ? Slot : 'button';\n * return <Comp ref={ref} {...props} />;\n * }\n * );\n *\n * // Consumer renders their own element\n * <Button asChild onClick={handleClick}>\n * <a href=\"/link\">Click me</a>\n * </Button>\n * // Renders: <a href=\"/link\" onClick={handleClick}>Click me</a>\n * ```\n */\nexport const Slot = forwardRef<HTMLElement, SlotProps>(\n\t({ children, ...slotProps }, forwardedRef) => {\n\t\tconst childArray = Children.toArray(children);\n\n\t\t// Find the first valid React element\n\t\tconst slottableChild = childArray.find(isValidElement);\n\n\t\tif (!slottableChild || !isValidElement(slottableChild)) {\n\t\t\t// No slottable child, render children as-is\n\t\t\treturn <>{children}</>;\n\t\t}\n\n\t\tconst child = slottableChild as ReactElement<\n\t\t\tRecord<string, unknown> & { ref?: Ref<unknown>; children?: ReactNode }\n\t\t>;\n\n\t\t// Preserve grandchildren from the slottable element\n\t\tconst grandchildren = childArray.flatMap((c) =>\n\t\t\tc === slottableChild ? Children.toArray(child.props.children) : [c],\n\t\t);\n\n\t\treturn cloneElement(child, {\n\t\t\t...mergeProps(slotProps, child.props),\n\t\t\tref: forwardedRef\n\t\t\t\t? composeRefs(forwardedRef, child.props.ref)\n\t\t\t\t: child.props.ref,\n\t\t\tchildren: grandchildren.length > 0 ? grandchildren : undefined,\n\t\t});\n\t},\n);\n\nSlot.displayName = \"Slot\";\n","\"use client\";\n\nimport {\n\tforwardRef,\n\ttype HTMLAttributes,\n\ttype ReactNode,\n\tuseCallback,\n} from \"react\";\nimport { Slot } from \"../Slot\";\nimport { useCredentialOverlayContext } from \"./hooks\";\n\nexport interface CredentialOverlayTriggerProps\n\textends Omit<HTMLAttributes<HTMLElement>, \"children\"> {\n\t/** Use child element instead of default div */\n\tasChild?: boolean;\n\t/** Children to render */\n\tchildren: ReactNode;\n}\n\n/**\n * CredentialOverlay.Trigger - Trigger element for showing/hiding the overlay\n *\n * Attaches hover and click handlers to show/hide the tooltip.\n * Use asChild to render your own element.\n *\n * @example\n * ```tsx\n * <CredentialOverlay.Trigger asChild>\n * <button className=\"bg-green-500 p-2 rounded-full\">\n * <CheckIcon />\n * </button>\n * </CredentialOverlay.Trigger>\n * ```\n */\nexport const CredentialOverlayTrigger = forwardRef<\n\tHTMLElement,\n\tCredentialOverlayTriggerProps\n>(\n\t(\n\t\t{ asChild, children, onMouseEnter, onMouseLeave, onClick, ...props },\n\t\tref,\n\t) => {\n\t\tconst { show, hide, toggle, hasCredentials } =\n\t\t\tuseCredentialOverlayContext();\n\n\t\tconst handleMouseEnter = useCallback(\n\t\t\t(e: React.MouseEvent<HTMLElement>) => {\n\t\t\t\tshow();\n\t\t\t\tonMouseEnter?.(e);\n\t\t\t},\n\t\t\t[show, onMouseEnter],\n\t\t);\n\n\t\tconst handleMouseLeave = useCallback(\n\t\t\t(e: React.MouseEvent<HTMLElement>) => {\n\t\t\t\thide();\n\t\t\t\tonMouseLeave?.(e);\n\t\t\t},\n\t\t\t[hide, onMouseLeave],\n\t\t);\n\n\t\tconst handleClick = useCallback(\n\t\t\t(e: React.MouseEvent<HTMLElement>) => {\n\t\t\t\ttoggle();\n\t\t\t\tonClick?.(e);\n\t\t\t},\n\t\t\t[toggle, onClick],\n\t\t);\n\n\t\tconst triggerProps = {\n\t\t\tonMouseEnter: handleMouseEnter,\n\t\t\tonMouseLeave: handleMouseLeave,\n\t\t\tonClick: handleClick,\n\t\t\t\"aria-label\": hasCredentials\n\t\t\t\t? \"View content credentials\"\n\t\t\t\t: \"No credentials found\",\n\t\t\t\"aria-haspopup\": \"dialog\" as const,\n\t\t\t...props,\n\t\t};\n\n\t\tif (asChild) {\n\t\t\treturn (\n\t\t\t\t<Slot ref={ref} {...triggerProps}>\n\t\t\t\t\t{children}\n\t\t\t\t</Slot>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<div ref={ref as React.Ref<HTMLDivElement>} {...triggerProps}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nCredentialOverlayTrigger.displayName = \"CredentialOverlay.Trigger\";\n","import { CredentialBadge } from \"./CredentialBadge\";\nimport { CredentialOverlayContent } from \"./CredentialOverlayContent\";\nimport { CredentialOverlayRoot } from \"./CredentialOverlayRoot\";\nimport { CredentialOverlayTrigger } from \"./CredentialOverlayTrigger\";\n\nexport { CredentialBadge };\n\n/**\n * CredentialOverlay - Headless compound component for trigger + tooltip pattern\n *\n * @example\n * ```tsx\n * import { CredentialOverlay, Passport, CredentialBadge } from \"@limboai/react\";\n *\n * <div className=\"relative\">\n * <img src=\"/photo.jpg\" />\n *\n * <CredentialOverlay.Root validation={validation} status={status}>\n * <CredentialOverlay.Trigger className=\"absolute top-2 right-2\">\n * <CredentialBadge.Root status={status} hasCredentials={hasCredentials}>\n * <CredentialBadge.Verified>\n * <button className=\"bg-green-500 p-2 rounded-full\">✓</button>\n * </CredentialBadge.Verified>\n * </CredentialBadge.Root>\n * </CredentialOverlay.Trigger>\n *\n * <CredentialOverlay.Content className=\"absolute top-12 right-0 bg-white shadow-lg rounded-lg p-4\">\n * <Passport.Root validation={validation}>\n * ...\n * </Passport.Root>\n * </CredentialOverlay.Content>\n * </CredentialOverlay.Root>\n * </div>\n * ```\n */\nexport const CredentialOverlay = {\n\tRoot: CredentialOverlayRoot,\n\tTrigger: CredentialOverlayTrigger,\n\tContent: CredentialOverlayContent,\n};\n\nexport {\n\tuseCredentialBadgeContext,\n\tuseCredentialOverlayContext,\n} from \"./hooks\";\n","\"use client\";\n\nimport { createContext } from \"react\";\nimport type { PassportData } from \"@/types\";\n\nexport interface PassportContextValue extends PassportData {\n\t/** Copy validation JSON to clipboard */\n\tcopyJson: () => Promise<boolean>;\n\t/** Whether the JSON was recently copied */\n\tcopied: boolean;\n\t/** Whether a copy action is in progress */\n\tisPending: boolean;\n\t/** Unique ID for the title element (for aria-labelledby) */\n\ttitleId: string;\n}\n\nexport const PassportContext = createContext<PassportContextValue | null>(null);\n","\"use client\";\n\nimport { useContext, useDebugValue } from \"react\";\nimport {\n\tPassportContext,\n\ttype PassportContextValue,\n} from \"../context/PassportContext\";\n\n/**\n * Access the Passport context\n *\n * Must be used within a Passport.Root component\n *\n * @example\n * ```tsx\n * function MyCustomField() {\n * const { issuer, issuedDate, copied, isPending } = usePassportContext();\n * return (\n * <div>\n * <p>{issuer} - {issuedDate}</p>\n * {isPending && <span>Copying...</span>}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePassportContext(): PassportContextValue {\n\tconst context = useContext(PassportContext);\n\tif (!context) {\n\t\tthrow new Error(\"usePassportContext must be used within a Passport.Root\");\n\t}\n\tuseDebugValue({ issuer: context.issuer, copied: context.copied });\n\treturn context;\n}\n","\"use client\";\n\nimport type {\n\tC2PAValidationResponse,\n\tIdentityAssertionValue,\n\tManifestEntry,\n\tVerifiedIdentity,\n} from \"@limboai/node\";\nimport { useDebugValue, useMemo } from \"react\";\nimport type { PassportData } from \"@/types\";\n\ninterface ActionValue {\n\taction?: string;\n\tactions?: Array<{ action?: string }>;\n}\n\n/**\n * Extract actions from c2pa.actions.v2 or c2pa.actions assertion\n */\nfunction extractActions(\n\tassertions: { label: string; value?: unknown }[],\n): string[] {\n\tconst actionsAssertion = assertions.find(\n\t\t(a) => a.label === \"c2pa.actions.v2\" || a.label === \"c2pa.actions\",\n\t);\n\n\tif (!actionsAssertion?.value) {\n\t\treturn [];\n\t}\n\n\tconst value = actionsAssertion.value as ActionValue;\n\n\t// Handle both single action and actions array formats\n\tif (value.actions && Array.isArray(value.actions)) {\n\t\treturn value.actions\n\t\t\t.map((a) => a.action)\n\t\t\t.filter((action): action is string => Boolean(action));\n\t}\n\n\tif (value.action) {\n\t\treturn [value.action];\n\t}\n\n\treturn [];\n}\n\n/**\n * Extract verified identities from cawg.identity assertion\n * Supports both:\n * - Direct format: value.verifiedIdentities\n * - CAWG 1.1 Verifiable Credential format: value.credentialSubject.verifiedIdentities\n */\nfunction extractIdentities(\n\tassertions: { label: string; value?: unknown }[],\n): VerifiedIdentity[] {\n\tconst identityAssertion = assertions.find((a) => a.label === \"cawg.identity\");\n\n\tif (!identityAssertion?.value) {\n\t\treturn [];\n\t}\n\n\tconst value = identityAssertion.value as IdentityAssertionValue;\n\n\t// Try CAWG 1.1 Verifiable Credential format first (credentialSubject.verifiedIdentities)\n\tif (\n\t\tvalue.credentialSubject?.verifiedIdentities &&\n\t\tArray.isArray(value.credentialSubject.verifiedIdentities)\n\t) {\n\t\treturn value.credentialSubject.verifiedIdentities;\n\t}\n\n\t// Fall back to direct format (verifiedIdentities at root)\n\tif (value.verifiedIdentities && Array.isArray(value.verifiedIdentities)) {\n\t\treturn value.verifiedIdentities;\n\t}\n\n\treturn [];\n}\n\n/**\n * Format a date string for display\n */\nfunction formatDate(dateString: string): string {\n\treturn new Date(dateString).toLocaleDateString(\"en-US\", {\n\t\tyear: \"numeric\",\n\t\tmonth: \"long\",\n\t\tday: \"numeric\",\n\t});\n}\n\n/**\n * Hook to extract and process data from a C2PA validation response\n *\n * Extracts issuer, date, actions, identities, and signers from the validation\n * response for easy consumption by Passport components.\n *\n * @example\n * ```tsx\n * const { issuer, issuedDate, actions, verifiedIdentities, previousSigners } =\n * usePassportData(validation);\n *\n * return (\n * <div>\n * <p>Issued by: {issuer}</p>\n * <p>Date: {issuedDate}</p>\n * </div>\n * );\n * ```\n */\nexport function usePassportData(\n\tvalidation: C2PAValidationResponse,\n): PassportData {\n\tconst data = useMemo(() => {\n\t\t// Find the active manifest from the chain\n\t\tconst activeManifest =\n\t\t\tvalidation.manifest_chain?.find(\n\t\t\t\t(manifest) => manifest.label === validation.active_manifest_label,\n\t\t\t) ||\n\t\t\tvalidation.manifest_chain?.[0] ||\n\t\t\tnull;\n\n\t\t// Extract basic info\n\t\tconst issuer = activeManifest?.signature_info.issuer || \"Unknown\";\n\t\tconst issuedDateRaw = activeManifest?.signature_info.time || null;\n\t\tconst issuedDate = issuedDateRaw\n\t\t\t? formatDate(issuedDateRaw)\n\t\t\t: \"Date unknown\";\n\n\t\t// Extract actions from assertions\n\t\tconst actions = activeManifest?.assertions\n\t\t\t? extractActions(activeManifest.assertions)\n\t\t\t: [];\n\n\t\t// Extract verified identities from assertions\n\t\tconst verifiedIdentities = activeManifest?.assertions\n\t\t\t? extractIdentities(activeManifest.assertions)\n\t\t\t: [];\n\n\t\t// Get other manifests (non-active) as previous signers\n\t\tconst previousSigners: ManifestEntry[] =\n\t\t\tvalidation.manifest_chain?.filter(\n\t\t\t\t(m) => m.label !== validation.active_manifest_label,\n\t\t\t) || [];\n\n\t\treturn {\n\t\t\tissuer,\n\t\t\tissuedDate,\n\t\t\tissuedDateRaw,\n\t\t\tactions,\n\t\t\tverifiedIdentities,\n\t\t\tpreviousSigners,\n\t\t\tactiveManifest,\n\t\t\tvalidation,\n\t\t};\n\t}, [validation]);\n\n\tuseDebugValue({ issuer: data.issuer, hasActions: data.actions.length > 0 });\n\n\treturn data;\n}\n","\"use client\";\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\nimport { usePassportContext } from \"./hooks\";\n\nexport interface PassportActionsProps\n\textends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n\t/** Render function for custom layout */\n\tchildren?: (actions: string[]) => ReactNode;\n}\n\n/**\n * Format action label for display\n * e.g., \"c2pa.edited\" -> \"Edited\"\n */\nfunction formatActionLabel(action: string): string {\n\t// Remove namespace prefix (e.g., \"c2pa.edited\" -> \"edited\")\n\tconst withoutNamespace = action.split(\".\").pop() || action;\n\t// Capitalize first letter\n\treturn withoutNamespace.charAt(0).toUpperCase() + withoutNamespace.slice(1);\n}\n\n/**\n * Passport.Actions - Display actions from the manifest\n *\n * Renders actions using a render prop for full styling control.\n * Returns null if there are no actions.\n *\n * @example\n * ```tsx\n * <Passport.Actions className=\"mt-4\">\n * {(actions) => (\n * <div className=\"flex gap-2\">\n * {actions.map((action) => (\n * <span key={action} className=\"tag bg-gray-100 px-2 py-1 rounded\">\n * {action}\n * </span>\n * ))}\n * </div>\n * )}\n * </Passport.Actions>\n * ```\n */\nexport const PassportActions = forwardRef<HTMLDivElement, PassportActionsProps>(\n\t({ children, ...props }, ref) => {\n\t\tconst { actions } = usePassportContext();\n\n\t\t// Don't render if no actions\n\t\tif (actions.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Format action labels\n\t\tconst formattedActions = actions.map(formatActionLabel);\n\n\t\t// Render function required\n\t\tif (typeof children !== \"function\") {\n\t\t\treturn (\n\t\t\t\t<div ref={ref} {...props}>\n\t\t\t\t\t<div data-passport-actions-label>Actions</div>\n\t\t\t\t\t<div data-passport-actions-list>\n\t\t\t\t\t\t{formattedActions.map((action) => (\n\t\t\t\t\t\t\t<span key={action} data-passport-action>\n\t\t\t\t\t\t\t\t{action}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<div ref={ref} {...props}>\n\t\t\t\t{children(formattedActions)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nPassportActions.displayName = \"Passport.Actions\";\n","\"use client\";\n\nimport { type ButtonHTMLAttributes, forwardRef, type ReactNode } from \"react\";\nimport { Slot } from \"../Slot\";\nimport { usePassportContext } from \"./hooks\";\n\nexport interface PassportCopyButtonProps\n\textends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n\t/** Use child element instead of default button */\n\tasChild?: boolean;\n\t/** Custom element to render (only used with asChild) */\n\tchildren?: ReactNode;\n}\n\n/**\n * Passport.CopyButton - Copy validation JSON to clipboard\n *\n * Renders a button that copies the validation JSON to clipboard.\n * Supports pending state from React 19's useActionState.\n * Use asChild to provide your own button element.\n *\n * @example\n * ```tsx\n * // Default button\n * <Passport.CopyButton className=\"btn\" />\n *\n * // Custom button with asChild\n * <Passport.CopyButton asChild>\n * <button className=\"my-button\">\n * Copy JSON\n * </button>\n * </Passport.CopyButton>\n *\n * // Access pending state in custom component\n * function CustomCopyButton() {\n * const { copyJson, copied, isPending } = usePassportContext();\n * return (\n * <button onClick={copyJson} disabled={isPending}>\n * {isPending ? \"Copying...\" : copied ? \"Copied!\" : \"Copy\"}\n * </button>\n * );\n * }\n * ```\n */\nexport const PassportCopyButton = forwardRef<\n\tHTMLButtonElement,\n\tPassportCopyButtonProps\n>(({ asChild, children, onClick, disabled, ...props }, ref) => {\n\tconst { copyJson, copied, isPending } = usePassportContext();\n\n\tconst handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n\t\tcopyJson();\n\t\tonClick?.(e);\n\t};\n\n\tconst isDisabled = disabled || isPending;\n\n\t// Common props for both slot and button\n\tconst commonProps = {\n\t\tonClick: handleClick,\n\t\tdisabled: isDisabled,\n\t\t\"data-copied\": copied || undefined,\n\t\t\"data-pending\": isPending || undefined,\n\t\t\"aria-busy\": isPending || undefined,\n\t\t...props,\n\t};\n\n\tif (asChild && children) {\n\t\treturn (\n\t\t\t<Slot ref={ref} {...commonProps}>\n\t\t\t\t{children}\n\t\t\t</Slot>\n\t\t);\n\t}\n\n\treturn (\n\t\t<button ref={ref} type=\"button\" {...commonProps}>\n\t\t\t{isPending ? \"Copying...\" : copied ? \"Copied!\" : \"Copy JSON\"}\n\t\t</button>\n\t);\n});\n\nPassportCopyButton.displayName = \"Passport.CopyButton\";\n","\"use client\";\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\nimport { PassportFieldName, type PassportFieldNameType } from \"@/types\";\nimport { usePassportContext } from \"./hooks\";\n\nexport interface PassportFieldProps\n\textends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n\t/** Field name to display */\n\tname: PassportFieldNameType;\n\t/** Custom label (overrides default) */\n\tlabel?: string;\n\t/** Render function for custom layout */\n\tchildren?: (props: { label: string; value: string }) => ReactNode;\n}\n\nconst DEFAULT_LABELS: Record<PassportFieldNameType, string> = {\n\t[PassportFieldName.Issuer]: \"Issued by\",\n\t[PassportFieldName.Date]: \"Date issued\",\n};\n\n/**\n * Passport.Field - Display a field from the passport data\n *\n * Automatically fills the value from context based on the field name.\n * Use a render function for complete control over layout.\n *\n * @example\n * ```tsx\n * // Simple usage with default rendering\n * <Passport.Field name=\"issuer\" className=\"mb-2\" />\n *\n * // Custom label\n * <Passport.Field name=\"date\" label=\"Signed on\" />\n *\n * // Render function for custom layout\n * <Passport.Field name=\"issuer\">\n * {({ label, value }) => (\n * <div className=\"flex justify-between\">\n * <span className=\"font-bold\">{label}</span>\n * <span>{value}</span>\n * </div>\n * )}\n * </Passport.Field>\n * ```\n */\nexport const PassportField = forwardRef<HTMLDivElement, PassportFieldProps>(\n\t({ name, label, children, ...props }, ref) => {\n\t\tconst context = usePassportContext();\n\n\t\t// Get the value based on field name\n\t\tconst value =\n\t\t\tname === PassportFieldName.Issuer ? context.issuer : context.issuedDate;\n\t\tconst displayLabel = label ?? DEFAULT_LABELS[name];\n\n\t\t// If children is a render function, use it\n\t\tif (typeof children === \"function\") {\n\t\t\treturn (\n\t\t\t\t<div ref={ref} {...props}>\n\t\t\t\t\t{children({ label: displayLabel, value })}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\t// Default rendering - just a wrapper div\n\t\t// Users style the label and value themselves\n\t\treturn (\n\t\t\t<div ref={ref} {...props}>\n\t\t\t\t<div data-passport-field-label>{displayLabel}</div>\n\t\t\t\t<div data-passport-field-value>{value}</div>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nPassportField.displayName = \"Passport.Field\";\n","\"use client\";\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\n\nexport interface PassportFooterProps extends HTMLAttributes<HTMLDivElement> {\n\t/** Children to render in the footer */\n\tchildren?: ReactNode;\n}\n\n/**\n * Passport.Footer - Footer slot for the Passport\n *\n * A simple div wrapper for footer content. Style it yourself.\n *\n * @example\n * ```tsx\n * <Passport.Footer className=\"mt-4 border-t pt-4 flex justify-end\">\n * <Passport.CopyButton asChild>\n * <button className=\"btn-primary\">Copy JSON</button>\n * </Passport.CopyButton>\n * </Passport.Footer>\n * ```\n */\nexport const PassportFooter = forwardRef<HTMLDivElement, PassportFooterProps>(\n\t({ children, ...props }, ref) => {\n\t\treturn (\n\t\t\t<div ref={ref} {...props}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nPassportFooter.displayName = \"Passport.Footer\";\n","\"use client\";\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\n\nexport interface PassportHeaderProps extends HTMLAttributes<HTMLDivElement> {\n\t/** Children to render in the header */\n\tchildren?: ReactNode;\n}\n\n/**\n * Passport.Header - Header slot for the Passport\n *\n * A simple div wrapper for header content. Style it yourself.\n *\n * @example\n * ```tsx\n * <Passport.Header className=\"flex items-center gap-2 mb-4\">\n * <Passport.Logo className=\"w-6 h-6\" />\n * <Passport.Title className=\"text-lg font-bold\" />\n * </Passport.Header>\n * ```\n */\nexport const PassportHeader = forwardRef<HTMLDivElement, PassportHeaderProps>(\n\t({ children, ...props }, ref) => {\n\t\treturn (\n\t\t\t<div ref={ref} {...props}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nPassportHeader.displayName = \"Passport.Header\";\n","\"use client\";\n\nimport type { VerifiedIdentity } from \"@limboai/node\";\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\nimport type { IdentityInfo } from \"@/types\";\nimport { usePassportContext } from \"./hooks\";\n\nexport interface PassportIdentitiesProps\n\textends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n\t/** Render function for custom layout */\n\tchildren?: (identities: IdentityInfo[]) => ReactNode;\n}\n\n/**\n * Convert VerifiedIdentity to IdentityInfo for easier rendering\n */\nfunction toIdentityInfo(identity: VerifiedIdentity): IdentityInfo {\n\treturn {\n\t\tusername: identity.name,\n\t\tprovider: identity.provider.name,\n\t\turi: identity.uri,\n\t\tverifiedAt: identity.verifiedAt,\n\t};\n}\n\n/**\n * Passport.Identities - Display verified identities from the manifest\n *\n * Renders identities using a render prop for full styling control.\n * Returns null if there are no identities.\n *\n * @example\n * ```tsx\n * <Passport.Identities className=\"mt-4\">\n * {(identities) => (\n * <ul className=\"space-y-2\">\n * {identities.map((identity) => (\n * <li key={identity.provider} className=\"flex items-center gap-2\">\n * {identity.provider === \"LinkedIn\" && <LinkedInIcon />}\n * {identity.uri ? (\n * <a href={identity.uri} target=\"_blank\" rel=\"noopener noreferrer\">\n * {identity.username}\n * </a>\n * ) : (\n * <span>{identity.username}</span>\n * )}\n * </li>\n * ))}\n * </ul>\n * )}\n * </Passport.Identities>\n * ```\n */\nexport const PassportIdentities = forwardRef<\n\tHTMLDivElement,\n\tPassportIdentitiesProps\n>(({ children, ...props }, ref) => {\n\tconst { verifiedIdentities } = usePassportContext();\n\n\t// Don't render if no identities\n\tif (verifiedIdentities.length === 0) {\n\t\treturn null;\n\t}\n\n\t// Convert to IdentityInfo\n\tconst identities = verifiedIdentities.map(toIdentityInfo);\n\n\t// Determine label\n\tconst label =\n\t\tidentities.length === 1\n\t\t\t? \"Verified Identity\"\n\t\t\t: `Verified Identities (${identities.length})`;\n\n\t// Render function required\n\tif (typeof children !== \"function\") {\n\t\treturn (\n\t\t\t<div ref={ref} {...props}>\n\t\t\t\t<div data-passport-identities-label>{label}</div>\n\t\t\t\t<div data-passport-identities-list>\n\t\t\t\t\t{identities.map((identity) => (\n\t\t\t\t\t\t<div key={identity.provider} data-passport-identity>\n\t\t\t\t\t\t\t<span data-passport-identity-provider>{identity.provider}</span>\n\t\t\t\t\t\t\t{identity.uri ? (\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\thref={identity.uri}\n\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t\tdata-passport-identity-link\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{identity.username}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<span data-passport-identity-username>{identity.username}</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div ref={ref} {...props}>\n\t\t\t{children(identities)}\n\t\t</div>\n\t);\n});\n\nPassportIdentities.displayName = \"Passport.Identities\";\n","\"use client\";\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\nimport { CRLogo } from \"@/icons\";\nimport { Slot } from \"../Slot\";\n\nexport interface PassportLogoProps\n\textends Omit<HTMLAttributes<HTMLElement>, \"children\"> {\n\t/** Use child element instead of default logo */\n\tasChild?: boolean;\n\t/** Custom element to render (only used with asChild) */\n\tchildren?: ReactNode;\n}\n\n/**\n * Passport.Logo - Logo for the Passport\n *\n * Renders the Content Credentials logo by default.\n * Use asChild to provide your own logo element.\n *\n * @example\n * ```tsx\n * // Default logo\n * <Passport.Logo className=\"w-6 h-6\" />\n *\n * // Custom logo with asChild\n * <Passport.Logo asChild>\n * <img src=\"/my-logo.svg\" alt=\"Logo\" className=\"w-6 h-6\" />\n * </Passport.Logo>\n * ```\n */\nexport const PassportLogo = forwardRef<HTMLElement, PassportLogoProps>(\n\t({ asChild, children, ...props }, ref) => {\n\t\tif (asChild && children) {\n\t\t\treturn (\n\t\t\t\t<Slot ref={ref} {...props}>\n\t\t\t\t\t{children}\n\t\t\t\t</Slot>\n\t\t\t);\n\t\t}\n\n\t\treturn <CRLogo {...props} />;\n\t},\n);\n\nPassportLogo.displayName = \"Passport.Logo\";\n","\"use client\";\n\nimport type { C2PAValidationResponse } from \"@limboai/node\";\nimport {\n\tforwardRef,\n\ttype HTMLAttributes,\n\ttype ReactNode,\n\tuseCallback,\n\tuseId,\n\tuseMemo,\n\tuseState,\n\tuseTransition,\n} from \"react\";\nimport type { PassportContextValue } from \"./context\";\nimport { PassportContext } from \"./context/PassportContext\";\nimport { usePassportData } from \"./hooks\";\n\nexport interface PassportRootProps extends HTMLAttributes<HTMLDivElement> {\n\t/** Validation result from @limboai/node SDK */\n\tvalidation: C2PAValidationResponse;\n\t/** Children to render */\n\tchildren: ReactNode;\n}\n\n/**\n * Passport.Root - Provider wrapper for the Passport compound component\n *\n * Provides context with processed validation data to all child components.\n * Uses React 19's useTransition for non-blocking copy operations.\n *\n * @example\n * ```tsx\n * <Passport.Root validation={validation} className=\"my-tooltip bg-white p-4 rounded\">\n * <Passport.Header />\n * <Passport.Field name=\"issuer\" />\n * <Passport.Footer />\n * </Passport.Root>\n * ```\n */\nexport const PassportRoot = forwardRef<HTMLDivElement, PassportRootProps>(\n\t({ validation, children, ...props }, ref) => {\n\t\tconst titleId = useId();\n\t\tconst passportData = usePassportData(validation);\n\t\tconst [copied, setCopied] = useState(false);\n\t\tconst [isPending, startTransition] = useTransition();\n\n\t\tconst copyJson = useCallback(async (): Promise<boolean> => {\n\t\t\tstartTransition(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait navigator.clipboard.writeText(\n\t\t\t\t\t\tJSON.stringify(validation, null, 2),\n\t\t\t\t\t);\n\t\t\t\t\tsetCopied(true);\n\t\t\t\t\tsetTimeout(() => setCopied(false), 2000);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(\"Failed to copy:\", error);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn true;\n\t\t}, [validation]);\n\n\t\tconst contextValue: PassportContextValue = useMemo(\n\t\t\t() => ({\n\t\t\t\t...passportData,\n\t\t\t\tcopyJson,\n\t\t\t\tcopied,\n\t\t\t\tisPending,\n\t\t\t\ttitleId,\n\t\t\t}),\n\t\t\t[passportData, copyJson, copied, isPending, titleId],\n\t\t);\n\n\t\treturn (\n\t\t\t<PassportContext.Provider value={contextValue}>\n\t\t\t\t<div ref={ref} role=\"dialog\" aria-labelledby={titleId} {...props}>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</PassportContext.Provider>\n\t\t);\n\t},\n);\n\nPassportRoot.displayName = \"Passport.Root\";\n","\"use client\";\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\nimport type { SignerInfo } from \"@/types\";\nimport { usePassportContext } from \"./hooks\";\n\nexport interface PassportSignersProps\n\textends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n\t/** Render function for custom layout */\n\tchildren?: (signers: SignerInfo[]) => ReactNode;\n}\n\n/**\n * Passport.Signers - Display previous signers in the manifest chain\n *\n * Renders signers using a render prop for full styling control.\n * Returns null if there are no previous signers.\n *\n * @example\n * ```tsx\n * <Passport.Signers className=\"mt-4\">\n * {(signers) => (\n * <ul className=\"space-y-1\">\n * {signers.map((signer) => (\n * <li key={signer.id} className=\"text-sm text-gray-600\">\n * {signer.label}\n * </li>\n * ))}\n * </ul>\n * )}\n * </Passport.Signers>\n * ```\n */\nexport const PassportSigners = forwardRef<HTMLDivElement, PassportSignersProps>(\n\t({ children, ...props }, ref) => {\n\t\tconst { previousSigners } = usePassportContext();\n\n\t\t// Don't render if no signers\n\t\tif (previousSigners.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Convert to SignerInfo\n\t\tconst signers: SignerInfo[] = previousSigners.map((manifest) => ({\n\t\t\tid: manifest.instance_id,\n\t\t\tlabel: manifest.signature_info.issuer,\n\t\t\tsignedAt: manifest.signature_info.time ?? undefined,\n\t\t}));\n\n\t\t// Determine label\n\t\tconst label =\n\t\t\tsigners.length === 1\n\t\t\t\t? \"Previous Signer\"\n\t\t\t\t: `Previous Signers (${signers.length})`;\n\n\t\t// Render function required\n\t\tif (typeof children !== \"function\") {\n\t\t\treturn (\n\t\t\t\t<div ref={ref} {...props}>\n\t\t\t\t\t<div data-passport-signers-label>{label}</div>\n\t\t\t\t\t<div data-passport-signers-list>\n\t\t\t\t\t\t{signers.map((signer) => (\n\t\t\t\t\t\t\t<div key={signer.id} data-passport-signer>\n\t\t\t\t\t\t\t\t{signer.label}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<div ref={ref} {...props}>\n\t\t\t\t{children(signers)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nPassportSigners.displayName = \"Passport.Signers\";\n","\"use client\";\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\nimport { Slot } from \"../Slot\";\n\nexport interface PassportTitleProps extends HTMLAttributes<HTMLHeadingElement> {\n\t/** Use child element as the title element */\n\tasChild?: boolean;\n\t/** Children to render (if not provided, renders \"Content Credentials\") */\n\tchildren?: ReactNode;\n}\n\n/**\n * Passport.Title - Title for the Passport\n *\n * Renders a heading with the passport title. Defaults to \"Content Credentials\"\n * if no children are provided.\n *\n * @example\n * ```tsx\n * // Default title\n * <Passport.Title className=\"text-lg font-bold\" />\n *\n * // Custom title\n * <Passport.Title className=\"text-lg font-bold\">\n * My Custom Title\n * </Passport.Title>\n *\n * // With asChild\n * <Passport.Title asChild>\n * <h1 className=\"custom-heading\">Content Credentials</h1>\n * </Passport.Title>\n * ```\n */\nexport const PassportTitle = forwardRef<HTMLHeadingElement, PassportTitleProps>(\n\t({ asChild, children, ...props }, ref) => {\n\t\tconst Comp = asChild ? Slot : \"h2\";\n\t\tconst content = children ?? \"Content Credentials\";\n\n\t\treturn (\n\t\t\t<Comp ref={ref} id=\"passport-title\" {...props}>\n\t\t\t\t{content}\n\t\t\t</Comp>\n\t\t);\n\t},\n);\n\nPassportTitle.displayName = \"Passport.Title\";\n","import { PassportActions } from \"./PassportActions\";\nimport { PassportCopyButton } from \"./PassportCopyButton\";\nimport { PassportField } from \"./PassportField\";\nimport { PassportFooter } from \"./PassportFooter\";\nimport { PassportHeader } from \"./PassportHeader\";\nimport { PassportIdentities } from \"./PassportIdentities\";\nimport { PassportLogo } from \"./PassportLogo\";\nimport { PassportRoot } from \"./PassportRoot\";\nimport { PassportSigners } from \"./PassportSigners\";\nimport { PassportTitle } from \"./PassportTitle\";\n\n/**\n * Passport - Headless compound component for displaying C2PA content credentials\n *\n * @example\n * ```tsx\n * import { Passport } from \"@limboai/react\";\n *\n * <Passport.Root validation={validation} className=\"my-tooltip\">\n * <Passport.Header className=\"flex items-center gap-2\">\n * <Passport.Logo className=\"w-6 h-6\" />\n * <Passport.Title className=\"text-lg font-bold\" />\n * </Passport.Header>\n *\n * <Passport.Field name=\"issuer\" className=\"my-field\" />\n * <Passport.Field name=\"date\" className=\"my-field\" />\n *\n * <Passport.Actions className=\"mt-4\">\n * {(actions) => actions.map(a => <span key={a} className=\"tag\">{a}</span>)}\n * </Passport.Actions>\n *\n * <Passport.Identities>\n * {(identities) => identities.map(id => <MyIdentityCard key={id.provider} {...id} />)}\n * </Passport.Identities>\n *\n * <Passport.Signers>\n * {(signers) => signers.map(s => <MySignerRow key={s.id} {...s} />)}\n * </Passport.Signers>\n *\n * <Passport.Footer className=\"mt-4 border-t pt-4\">\n * <Passport.CopyButton asChild>\n * <button className=\"btn-primary\">Copy JSON</button>\n * </Passport.CopyButton>\n * </Passport.Footer>\n * </Passport.Root>\n * ```\n */\nexport const Passport = {\n\tRoot: PassportRoot,\n\tHeader: PassportHeader,\n\tTitle: PassportTitle,\n\tLogo: PassportLogo,\n\tField: PassportField,\n\tActions: PassportActions,\n\tIdentities: PassportIdentities,\n\tSigners: PassportSigners,\n\tFooter: PassportFooter,\n\tCopyButton: PassportCopyButton,\n};\n\nexport { usePassportContext, usePassportData } from \"./hooks\";\n","import type { CSSProperties } from \"react\";\n\nexport const BadgePosition = {\n\tTopRight: \"top-right\",\n\tTopLeft: \"top-left\",\n\tBottomRight: \"bottom-right\",\n\tBottomLeft: \"bottom-left\",\n} as const satisfies Record<string, string>;\n\nexport type BadgePositionType =\n\t(typeof BadgePosition)[keyof typeof BadgePosition];\n\nexport const PassportVariant = {\n\tBasic: \"basic\",\n\tFull: \"full\",\n} as const satisfies Record<string, string>;\n\nexport type PassportVariantType =\n\t(typeof PassportVariant)[keyof typeof PassportVariant];\n\nexport const Theme = {\n\tLight: \"light\",\n\tDark: \"dark\",\n} as const satisfies Record<string, string>;\n\nexport type ThemeType = (typeof Theme)[keyof typeof Theme];\n\nexport const wrapperStyle: CSSProperties = {\n\tposition: \"relative\",\n\tdisplay: \"inline-block\",\n};\n","\"use client\";\n\nimport type { CSSProperties, FC } from \"react\";\nimport { CRLogo } from \"@/icons\";\nimport {\n\tBadgePosition,\n\ttype BadgePositionType,\n\tTheme,\n\ttype ThemeType,\n} from \"./constants\";\n\n// Badge styles\nconst badgeStyles: Record<ThemeType, CSSProperties> = {\n\tlight: {\n\t\tbackgroundColor: \"#ffffff\",\n\t\tborderRadius: \"9999px\",\n\t\tpadding: \"8px\",\n\t\tboxShadow:\n\t\t\t\"0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)\",\n\t\tcursor: \"pointer\",\n\t\tborder: \"1px solid #e5e7eb\",\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t},\n\tdark: {\n\t\tbackgroundColor: \"#1f2937\",\n\t\tborderRadius: \"9999px\",\n\t\tpadding: \"8px\",\n\t\tboxShadow:\n\t\t\t\"0 10px 15px -3px rgb(0 0 0 / 0.3), 0 4px 6px -4px rgb(0 0 0 / 0.3)\",\n\t\tcursor: \"pointer\",\n\t\tborder: \"1px solid #374151\",\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t},\n};\n\n// Badge position styles\nconst badgePositionStyles: Record<BadgePositionType, CSSProperties> = {\n\t\"top-right\": {\n\t\tposition: \"absolute\",\n\t\ttop: \"8px\",\n\t\tright: \"8px\",\n\t},\n\t\"top-left\": {\n\t\tposition: \"absolute\",\n\t\ttop: \"8px\",\n\t\tleft: \"8px\",\n\t},\n\t\"bottom-right\": {\n\t\tposition: \"absolute\",\n\t\tbottom: \"8px\",\n\t\tright: \"8px\",\n\t},\n\t\"bottom-left\": {\n\t\tposition: \"absolute\",\n\t\tbottom: \"8px\",\n\t\tleft: \"8px\",\n\t},\n};\n\nexport interface LimboBadgeProps {\n\t/** Position of the badge */\n\tposition?: BadgePositionType;\n\t/** Theme for the badge */\n\ttheme?: ThemeType;\n\t/** Click handler */\n\tonClick?: () => void;\n\t/** Mouse enter handler */\n\tonMouseEnter?: () => void;\n\t/** Mouse leave handler */\n\tonMouseLeave?: () => void;\n\t/** Additional inline styles */\n\tstyle?: CSSProperties;\n}\n\n/**\n * LimboBadge - Pre-styled badge component with CRLogo\n *\n * A ready-to-use badge for displaying content credentials status.\n */\nexport const LimboBadge: FC<LimboBadgeProps> = ({\n\tposition = BadgePosition.TopRight,\n\ttheme = Theme.Light,\n\tonClick,\n\tonMouseEnter,\n\tonMouseLeave,\n\tstyle,\n}) => {\n\tconst combinedStyle: CSSProperties = {\n\t\t...badgeStyles[theme],\n\t\t...badgePositionStyles[position],\n\t\t...style,\n\t};\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={onClick}\n\t\t\tonMouseEnter={onMouseEnter}\n\t\t\tonMouseLeave={onMouseLeave}\n\t\t\tstyle={combinedStyle}\n\t\t\taria-label=\"View content credentials\"\n\t\t>\n\t\t\t<CRLogo size={16} />\n\t\t</button>\n\t);\n};\n\nLimboBadge.displayName = \"LimboBadge\";\n","\"use client\";\n\nimport { useDebugValue, useEffect, useState } from \"react\";\n\nexport interface UseHeicConversionOptions {\n\tsrc: string | undefined;\n\tenabled?: boolean;\n\tquality?: number;\n}\n\nexport interface UseHeicConversionReturn {\n\tdisplaySrc: string | undefined;\n\tisConverting: boolean;\n\terror: string | null;\n}\n\nconst isHeic = (src: string) => /\\.(heic|heif)$/i.test(src);\n\nasync function convertHeicToJpeg(\n\tfile: Blob,\n\tsignal: AbortSignal,\n): Promise<Blob | undefined> {\n\tif (typeof window === \"undefined\") return undefined;\n\n\tconst { default: heic2any } = await import(\"heic2any\");\n\n\t// Check if aborted after dynamic import\n\tif (signal.aborted) return undefined;\n\n\tconst res = await heic2any({ blob: file, toType: \"image/jpeg\" });\n\n\tconst blob = res instanceof Blob ? res : res[0];\n\tif (!blob) {\n\t\tthrow new Error(\"HEIC to JPEG conversion failed\");\n\t}\n\n\treturn blob;\n}\n\n/**\n * Hook for automatic HEIC to JPEG conversion\n *\n * Uses AbortController for proper cleanup and race condition handling.\n * Automatically revokes blob URLs on cleanup.\n *\n * @example\n * ```tsx\n * const { displaySrc, isConverting, error } = useHeicConversion({\n * src: imageUrl,\n * enabled: true,\n * });\n *\n * return (\n * <img\n * src={displaySrc}\n * data-converting={isConverting || undefined}\n * />\n * );\n * ```\n */\nexport function useHeicConversion({\n\tsrc,\n\tenabled = true,\n}: UseHeicConversionOptions): UseHeicConversionReturn {\n\tconst [displaySrc, setDisplaySrc] = useState<string | undefined>(src);\n\tconst [isConverting, setIsConverting] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\n\tuseEffect(() => {\n\t\t// Reset state for non-HEIC or disabled\n\t\tif (!src || !enabled || !isHeic(src)) {\n\t\t\tsetDisplaySrc(src);\n\t\t\tsetIsConverting(false);\n\t\t\tsetError(null);\n\t\t\treturn;\n\t\t}\n\n\t\tconst controller = new AbortController();\n\t\tconst { signal } = controller;\n\t\tlet blobUrl: string | null = null;\n\n\t\tsetIsConverting(true);\n\t\tsetError(null);\n\n\t\tconst convert = async () => {\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(src, { signal });\n\t\t\t\tif (!response.ok) throw new Error(`Fetch failed: ${response.status}`);\n\n\t\t\t\tconst blob = await convertHeicToJpeg(await response.blob(), signal);\n\n\t\t\t\tif (signal.aborted || !blob) return;\n\n\t\t\t\tblobUrl = URL.createObjectURL(blob);\n\t\t\t\tsetDisplaySrc(blobUrl);\n\t\t\t\tsetIsConverting(false);\n\t\t\t} catch (e) {\n\t\t\t\tif (signal.aborted) return;\n\n\t\t\t\tsetError(e instanceof Error ? e.message : \"HEIC conversion failed\");\n\t\t\t\tsetDisplaySrc(src);\n\t\t\t\tsetIsConverting(false);\n\t\t\t}\n\t\t};\n\n\t\tconvert();\n\n\t\treturn () => {\n\t\t\tcontroller.abort();\n\t\t\tif (blobUrl) URL.revokeObjectURL(blobUrl);\n\t\t};\n\t}, [src, enabled]);\n\n\tuseDebugValue({ isConverting, hasError: !!error });\n\n\treturn { displaySrc, isConverting, error };\n}\n","\"use client\";\n\nimport type { C2PAValidationResponse } from \"@limboai/node\";\nimport { createContext } from \"react\";\nimport type { ValidationStatusType } from \"@/types\";\n\nexport interface MediaContextValue {\n\t/** Validation result from @limboai/node SDK (null if not validated yet) */\n\tvalidation: C2PAValidationResponse | null;\n\t/** Current validation status */\n\tstatus: ValidationStatusType;\n\t/** Whether the content has credentials */\n\thasCredentials: boolean;\n\t/** Whether the tooltip is currently visible */\n\tisVisible: boolean;\n\t/** Show the tooltip */\n\tshow: () => void;\n\t/** Hide the tooltip (with delay) */\n\thide: () => void;\n\t/** Toggle tooltip visibility */\n\ttoggle: () => void;\n}\n\nexport const MediaContext = createContext<MediaContextValue | null>(null);\n\nMediaContext.displayName = \"MediaContext\";\n","\"use client\";\n\nimport { useContext, useDebugValue } from \"react\";\nimport { MediaContext, type MediaContextValue } from \"../context/MediaContext\";\n\n/**\n * Hook to access Media context\n *\n * Use this hook inside MediaImage/MediaVideo render props to access\n * the media context including validation data and overlay visibility state.\n *\n * @example\n * ```tsx\n * const { validation, status, isVisible, toggle } = useMediaContext();\n * ```\n */\nexport function useMediaContext(): MediaContextValue {\n\tconst context = useContext(MediaContext);\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"useMediaContext must be used within a MediaImage or MediaVideo component\",\n\t\t);\n\t}\n\tuseDebugValue({ status: context.status, isVisible: context.isVisible });\n\treturn context;\n}\n","\"use client\";\n\nimport type { C2PAValidationResponse } from \"@limboai/node\";\nimport { useDebugValue } from \"react\";\nimport { useTooltipVisibility } from \"@/shared\";\nimport type {\n\tRenderBadgeProps,\n\tRenderTooltipProps,\n\tValidationStatusType,\n} from \"@/types\";\nimport type { MediaContextValue } from \"../context\";\n\nexport interface UseMediaOverlayOptions {\n\t/** Validation result from @limboai/node SDK (null if not validated yet) */\n\tvalidation: C2PAValidationResponse | null;\n\t/** Current validation status */\n\tvalidationStatus: ValidationStatusType;\n\t/** Delay in ms before hiding the tooltip (default: 300ms) */\n\thideDelay?: number;\n}\n\nexport interface UseMediaOverlayReturn {\n\t/** Whether the content has credentials */\n\thasCredentials: boolean;\n\t/** Context value for MediaContext.Provider */\n\tcontextValue: MediaContextValue;\n\t/** Props for the renderBadge callback */\n\tbadgeProps: RenderBadgeProps;\n\t/** Props for the renderTooltip callback (null if no validation) */\n\ttooltipProps: RenderTooltipProps | null;\n}\n\n/**\n * Shared hook for overlay state management in media components\n *\n * Extracts common logic used by both MediaImage and MediaVideo components\n * for managing tooltip visibility and building render props.\n *\n * @example\n * ```tsx\n * const { hasCredentials, contextValue, badgeProps, tooltipProps } = useMediaOverlay({\n * validation,\n * validationStatus,\n * hideDelay: 300,\n * });\n * ```\n */\nexport function useMediaOverlay({\n\tvalidation,\n\tvalidationStatus,\n\thideDelay = 300,\n}: UseMediaOverlayOptions): UseMediaOverlayReturn {\n\t// Calculate derived state\n\tconst hasCredentials = validation?.has_credentials ?? false;\n\n\t// Use tooltip visibility hook for overlay state\n\tconst { isVisible, show, hide, toggle } = useTooltipVisibility({\n\t\thasCredentials,\n\t\thideDelay,\n\t});\n\n\t// Create context value for potential use in render props\n\tconst contextValue: MediaContextValue = {\n\t\tvalidation,\n\t\tstatus: validationStatus,\n\t\thasCredentials,\n\t\tisVisible,\n\t\tshow,\n\t\thide,\n\t\ttoggle,\n\t};\n\n\t// Build badge props\n\tconst badgeProps: RenderBadgeProps = {\n\t\tstatus: validationStatus,\n\t\thasCredentials,\n\t\tisVisible,\n\t\tshow,\n\t\thide,\n\t\ttoggle,\n\t};\n\n\t// Build tooltip props (only when validation exists)\n\tconst tooltipProps: RenderTooltipProps | null = validation\n\t\t? {\n\t\t\t\tvalidation,\n\t\t\t\tisVisible,\n\t\t\t\tonMouseEnter: show,\n\t\t\t\tonClose: hide,\n\t\t\t}\n\t\t: null;\n\n\tuseDebugValue({ isVisible, hasCredentials });\n\n\treturn {\n\t\thasCredentials,\n\t\tcontextValue,\n\t\tbadgeProps,\n\t\ttooltipProps,\n\t};\n}\n","\"use client\";\n\nimport type { C2PAValidationResponse } from \"@limboai/node\";\nimport {\n\ttype CSSProperties,\n\tforwardRef,\n\ttype ImgHTMLAttributes,\n\ttype ReactNode,\n} from \"react\";\nimport type {\n\tRenderBadgeProps,\n\tRenderTooltipProps,\n\tValidationStatusType,\n} from \"@/types\";\nimport { MediaContext } from \"./context/MediaContext\";\nimport { useHeicConversion } from \"./hooks\";\nimport { useMediaOverlay } from \"./hooks/useMediaOverlay\";\n\nexport interface MediaImageProps\n\textends Omit<ImgHTMLAttributes<HTMLImageElement>, \"onError\"> {\n\t/** Validation result from @limboai/node SDK (null if not validated yet) */\n\tvalidation?: C2PAValidationResponse | null;\n\t/** Current validation status */\n\tvalidationStatus?: ValidationStatusType;\n\t/** Native img onError handler */\n\tonError?: ImgHTMLAttributes<HTMLImageElement>[\"onError\"];\n\n\t/** CSS class for the wrapper div (required for positioning badge/tooltip) */\n\twrapperClassName?: string;\n\t/** Inline styles for the wrapper div */\n\twrapperStyle?: CSSProperties;\n\n\t/** Custom badge render function */\n\trenderBadge?: (props: RenderBadgeProps) => ReactNode;\n\t/** Custom tooltip render function */\n\trenderTooltip?: (props: RenderTooltipProps) => ReactNode;\n\n\t/** Delay in ms before hiding the tooltip (default: 300ms) */\n\thideDelay?: number;\n\t/** Whether to enable automatic HEIC conversion (default: true) */\n\tenableHeicConversion?: boolean;\n}\n\n/**\n * MediaImage - Headless image component with built-in credential overlay support\n *\n * A minimal image component that handles HEIC to JPEG conversion and provides\n * built-in support for displaying credential badges and tooltips via render props.\n *\n * This component is headless - it applies no styles. Users must provide\n * all styling through className, style props, or render functions.\n *\n * @example\n * ```tsx\n * // Basic usage - just the image with HEIC support\n * <MediaImage src=\"/photo.heic\" alt=\"Photo\" className=\"w-full h-auto\" />\n *\n * // With built-in overlay (using render props)\n * <MediaImage\n * src=\"/photo.jpg\"\n * alt=\"Photo\"\n * validation={validation}\n * validationStatus=\"success\"\n * wrapperClassName=\"relative inline-block\"\n * className=\"w-80 h-60 object-cover rounded-lg\"\n * renderBadge={({ status, hasCredentials, toggle }) => (\n * <button\n * onClick={toggle}\n * className=\"absolute top-2 right-2 bg-green-500 rounded-full p-2\"\n * >\n * <CRLogo size={16} />\n * </button>\n * )}\n * renderTooltip={({ validation, isVisible, onClose }) =>\n * isVisible && (\n * <div className=\"absolute top-14 right-0 bg-white shadow-lg rounded-lg p-4\">\n * <Passport.Root validation={validation}>\n * <Passport.Header>...</Passport.Header>\n * <Passport.Field name=\"issuer\" />\n * <Passport.Footer>\n * <Passport.CopyButton />\n * </Passport.Footer>\n * </Passport.Root>\n * </div>\n * )\n * }\n * />\n *\n * // With compound components (external overlay)\n * <div className=\"relative\">\n * <MediaImage src=\"/photo.jpg\" alt=\"Photo\" className=\"w-full\" />\n * <CredentialOverlay.Root validation={validation} status=\"success\">\n * <CredentialOverlay.Trigger className=\"absolute top-2 right-2\">\n * <CredentialBadge.Root status=\"success\" hasCredentials={true}>\n * <CredentialBadge.Verified>\n * <button className=\"bg-green-500 p-2 rounded-full\">OK</button>\n * </CredentialBadge.Verified>\n * </CredentialBadge.Root>\n * </CredentialOverlay.Trigger>\n * <CredentialOverlay.Content className=\"absolute top-12 right-0\">\n * <Passport.Root validation={validation}>...</Passport.Root>\n * </CredentialOverlay.Content>\n * </CredentialOverlay.Root>\n * </div>\n * ```\n */\nexport const MediaImage = forwardRef<HTMLImageElement, MediaImageProps>(\n\t(\n\t\t{\n\t\t\tvalidation = null,\n\t\t\tvalidationStatus = \"idle\",\n\t\t\trenderBadge,\n\t\t\trenderTooltip,\n\t\t\twrapperClassName,\n\t\t\twrapperStyle,\n\t\t\thideDelay = 300,\n\t\t\tenableHeicConversion = true,\n\t\t\tsrc,\n\t\t\t...imgProps\n\t\t},\n\t\tref,\n\t) => {\n\t\t// Handle HEIC to JPEG conversion automatically\n\t\tconst { displaySrc, isConverting } = useHeicConversion({\n\t\t\tsrc,\n\t\t\tenabled: enableHeicConversion,\n\t\t});\n\n\t\t// Use shared overlay hook\n\t\tconst { contextValue, badgeProps, tooltipProps } = useMediaOverlay({\n\t\t\tvalidation,\n\t\t\tvalidationStatus,\n\t\t\thideDelay,\n\t\t});\n\n\t\t// The image element\n\t\tconst imageElement = (\n\t\t\t<img\n\t\t\t\tref={ref}\n\t\t\t\t{...imgProps}\n\t\t\t\tsrc={displaySrc}\n\t\t\t\talt={imgProps.alt || \"\"}\n\t\t\t\tdata-converting={isConverting || undefined}\n\t\t\t/>\n\t\t);\n\n\t\t// If no render props provided, just return the image\n\t\tif (!renderBadge && !renderTooltip) {\n\t\t\treturn imageElement;\n\t\t}\n\n\t\t// With render props, wrap in a container with context\n\t\treturn (\n\t\t\t<MediaContext.Provider value={contextValue}>\n\t\t\t\t<div className={wrapperClassName} style={wrapperStyle}>\n\t\t\t\t\t{imageElement}\n\t\t\t\t\t{renderBadge?.(badgeProps)}\n\t\t\t\t\t{tooltipProps && renderTooltip?.(tooltipProps)}\n\t\t\t\t</div>\n\t\t\t</MediaContext.Provider>\n\t\t);\n\t},\n);\n\nMediaImage.displayName = \"MediaImage\";\n","\"use client\";\n\nimport type { C2PAValidationResponse } from \"@limboai/node\";\nimport {\n\ttype CSSProperties,\n\tforwardRef,\n\ttype ReactNode,\n\ttype VideoHTMLAttributes,\n} from \"react\";\nimport type {\n\tRenderBadgeProps,\n\tRenderTooltipProps,\n\tValidationStatusType,\n} from \"@/types\";\nimport { MediaContext } from \"./context/MediaContext\";\nimport { useMediaOverlay } from \"./hooks/useMediaOverlay\";\n\nexport interface MediaVideoProps\n\textends Omit<VideoHTMLAttributes<HTMLVideoElement>, \"onError\"> {\n\t/** Validation result from @limboai/node SDK (null if not validated yet) */\n\tvalidation?: C2PAValidationResponse | null;\n\t/** Current validation status */\n\tvalidationStatus?: ValidationStatusType;\n\t/** Native video onError handler */\n\tonError?: VideoHTMLAttributes<HTMLVideoElement>[\"onError\"];\n\n\t/** CSS class for the wrapper div (required for positioning badge/tooltip) */\n\twrapperClassName?: string;\n\t/** Inline styles for the wrapper div */\n\twrapperStyle?: CSSProperties;\n\n\t/** Custom badge render function */\n\trenderBadge?: (props: RenderBadgeProps) => ReactNode;\n\t/** Custom tooltip render function */\n\trenderTooltip?: (props: RenderTooltipProps) => ReactNode;\n\n\t/** Delay in ms before hiding the tooltip (default: 300ms) */\n\thideDelay?: number;\n}\n\n/**\n * MediaVideo - Headless video component with built-in credential overlay support\n *\n * A minimal video component for use with C2PA credentials. Provides built-in\n * support for displaying credential badges and tooltips via render props.\n *\n * This component is headless - it applies no styles. Users must provide\n * all styling through className, style props, or render functions.\n *\n * @example\n * ```tsx\n * // Basic usage - just the video\n * <MediaVideo src=\"/video.mp4\" controls className=\"w-full h-auto\" />\n *\n * // With built-in overlay (using render props)\n * <MediaVideo\n * src=\"/video.mp4\"\n * controls\n * validation={validation}\n * validationStatus=\"success\"\n * wrapperClassName=\"relative inline-block\"\n * className=\"w-80 h-60 object-cover rounded-lg\"\n * renderBadge={({ status, hasCredentials, toggle }) => (\n * <button\n * onClick={toggle}\n * className=\"absolute top-2 right-2 bg-green-500 rounded-full p-2\"\n * >\n * <CRLogo size={16} />\n * </button>\n * )}\n * renderTooltip={({ validation, isVisible, onClose }) =>\n * isVisible && (\n * <div className=\"absolute top-14 right-0 bg-white shadow-lg rounded-lg p-4\">\n * <Passport.Root validation={validation}>\n * <Passport.Header>...</Passport.Header>\n * <Passport.Field name=\"issuer\" />\n * <Passport.Footer>\n * <Passport.CopyButton />\n * </Passport.Footer>\n * </Passport.Root>\n * </div>\n * )\n * }\n * />\n *\n * // With compound components (external overlay)\n * <div className=\"relative\">\n * <MediaVideo src=\"/video.mp4\" controls className=\"w-full\" />\n * <CredentialOverlay.Root validation={validation} status=\"success\">\n * <CredentialOverlay.Trigger className=\"absolute top-2 right-2\">\n * <CredentialBadge.Root status=\"success\" hasCredentials={true}>\n * <CredentialBadge.Verified>\n * <button className=\"bg-green-500 p-2 rounded-full\">OK</button>\n * </CredentialBadge.Verified>\n * </CredentialBadge.Root>\n * </CredentialOverlay.Trigger>\n * <CredentialOverlay.Content className=\"absolute top-12 right-0\">\n * <Passport.Root validation={validation}>...</Passport.Root>\n * </CredentialOverlay.Content>\n * </CredentialOverlay.Root>\n * </div>\n * ```\n */\nexport const MediaVideo = forwardRef<HTMLVideoElement, MediaVideoProps>(\n\t(\n\t\t{\n\t\t\tvalidation = null,\n\t\t\tvalidationStatus = \"idle\",\n\t\t\trenderBadge,\n\t\t\trenderTooltip,\n\t\t\twrapperClassName,\n\t\t\twrapperStyle,\n\t\t\thideDelay = 300,\n\t\t\t...videoProps\n\t\t},\n\t\tref,\n\t) => {\n\t\t// Use shared overlay hook\n\t\tconst { contextValue, badgeProps, tooltipProps } = useMediaOverlay({\n\t\t\tvalidation,\n\t\t\tvalidationStatus,\n\t\t\thideDelay,\n\t\t});\n\n\t\t// The video element\n\t\tconst videoElement = <video ref={ref} {...videoProps} />;\n\n\t\t// If no render props provided, just return the video\n\t\tif (!renderBadge && !renderTooltip) {\n\t\t\treturn videoElement;\n\t\t}\n\n\t\t// With render props, wrap in a container with context\n\t\treturn (\n\t\t\t<MediaContext.Provider value={contextValue}>\n\t\t\t\t<div className={wrapperClassName} style={wrapperStyle}>\n\t\t\t\t\t{videoElement}\n\t\t\t\t\t{renderBadge?.(badgeProps)}\n\t\t\t\t\t{tooltipProps && renderTooltip?.(tooltipProps)}\n\t\t\t\t</div>\n\t\t\t</MediaContext.Provider>\n\t\t);\n\t},\n);\n\nMediaVideo.displayName = \"MediaVideo\";\n","\"use client\";\n\nimport type { C2PAValidationResponse } from \"@limboai/node\";\nimport type { CSSProperties, FC } from \"react\";\nimport { LinkedInIcon } from \"@/icons\";\nimport type { PassportVariantType } from \"@/types\";\n\nimport { Passport } from \"../core/passport\";\nimport {\n\tBadgePosition,\n\ttype BadgePositionType,\n\tPassportVariant,\n\tTheme,\n\ttype ThemeType,\n} from \"./constants\";\n\n// Tooltip position styles\nconst tooltipPositionStyles: Record<BadgePositionType, CSSProperties> = {\n\t\"top-right\": {\n\t\tposition: \"absolute\",\n\t\ttop: \"56px\",\n\t\tright: \"0\",\n\t\tzIndex: 10,\n\t},\n\t\"top-left\": {\n\t\tposition: \"absolute\",\n\t\ttop: \"56px\",\n\t\tleft: \"0\",\n\t\tzIndex: 10,\n\t},\n\t\"bottom-right\": {\n\t\tposition: \"absolute\",\n\t\tbottom: \"56px\",\n\t\tright: \"0\",\n\t\tzIndex: 10,\n\t},\n\t\"bottom-left\": {\n\t\tposition: \"absolute\",\n\t\tbottom: \"56px\",\n\t\tleft: \"0\",\n\t\tzIndex: 10,\n\t},\n};\n\n// Passport container styles\nconst passportContainerStyles: Record<ThemeType, CSSProperties> = {\n\tlight: {\n\t\tbackgroundColor: \"#ffffff\",\n\t\tborder: \"1px solid #e5e7eb\",\n\t\tborderRadius: \"12px\",\n\t\tpadding: \"20px\",\n\t\twidth: \"320px\",\n\t\tboxShadow:\n\t\t\t\"0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)\",\n\t\tfontFamily: \"system-ui, -apple-system, sans-serif\",\n\t},\n\tdark: {\n\t\tbackgroundColor: \"#111827\",\n\t\tborder: \"1px solid #374151\",\n\t\tborderRadius: \"12px\",\n\t\tpadding: \"20px\",\n\t\twidth: \"320px\",\n\t\tboxShadow:\n\t\t\t\"0 10px 15px -3px rgb(0 0 0 / 0.3), 0 4px 6px -4px rgb(0 0 0 / 0.3)\",\n\t\tfontFamily: \"system-ui, -apple-system, sans-serif\",\n\t},\n};\n\n// Field label styles\nconst fieldLabelStyles: Record<ThemeType, CSSProperties> = {\n\tlight: {\n\t\tfontSize: \"11px\",\n\t\tfontWeight: 500,\n\t\tcolor: \"#6b7280\",\n\t\ttextTransform: \"uppercase\",\n\t\tletterSpacing: \"0.05em\",\n\t\tmarginBottom: \"4px\",\n\t},\n\tdark: {\n\t\tfontSize: \"11px\",\n\t\tfontWeight: 500,\n\t\tcolor: \"#9ca3af\",\n\t\ttextTransform: \"uppercase\",\n\t\tletterSpacing: \"0.05em\",\n\t\tmarginBottom: \"4px\",\n\t},\n};\n\n// Field value styles\nconst fieldValueStyles: Record<ThemeType, CSSProperties> = {\n\tlight: {\n\t\tfontSize: \"13px\",\n\t\tcolor: \"#111827\",\n\t},\n\tdark: {\n\t\tfontSize: \"13px\",\n\t\tcolor: \"#f3f4f6\",\n\t},\n};\n\n// Passport header styles\nconst passportHeaderStyles = {\n\tcontainer: {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tgap: \"8px\",\n\t\tmarginBottom: \"16px\",\n\t} as CSSProperties,\n\tlogo: {\n\t\twidth: \"20px\",\n\t\theight: \"20px\",\n\t} as CSSProperties,\n\ttitle: {\n\t\tlight: {\n\t\t\tfontSize: \"16px\",\n\t\t\tfontWeight: 600,\n\t\t\tcolor: \"#111827\",\n\t\t} as CSSProperties,\n\t\tdark: {\n\t\t\tfontSize: \"16px\",\n\t\t\tfontWeight: 600,\n\t\t\tcolor: \"#ffffff\",\n\t\t} as CSSProperties,\n\t},\n};\n\n// Passport footer styles\nconst passportFooterStyles = {\n\tcontainer: {\n\t\tlight: {\n\t\t\tmarginTop: \"16px\",\n\t\t\tpaddingTop: \"16px\",\n\t\t\tborderTop: \"1px solid #f3f4f6\",\n\t\t\tdisplay: \"flex\",\n\t\t\tjustifyContent: \"space-between\",\n\t\t\talignItems: \"center\",\n\t\t} as CSSProperties,\n\t\tdark: {\n\t\t\tmarginTop: \"16px\",\n\t\t\tpaddingTop: \"16px\",\n\t\t\tborderTop: \"1px solid #374151\",\n\t\t\tdisplay: \"flex\",\n\t\t\tjustifyContent: \"space-between\",\n\t\t\talignItems: \"center\",\n\t\t} as CSSProperties,\n\t},\n\tcopyButton: {\n\t\tlight: {\n\t\t\tdisplay: \"inline-flex\",\n\t\t\talignItems: \"center\",\n\t\t\tgap: \"6px\",\n\t\t\tfontSize: \"13px\",\n\t\t\tfontWeight: 500,\n\t\t\tcolor: \"#4b5563\",\n\t\t\tcursor: \"pointer\",\n\t\t\tbackgroundColor: \"transparent\",\n\t\t\tborder: \"none\",\n\t\t\tpadding: 0,\n\t\t} as CSSProperties,\n\t\tdark: {\n\t\t\tdisplay: \"inline-flex\",\n\t\t\talignItems: \"center\",\n\t\t\tgap: \"6px\",\n\t\t\tfontSize: \"13px\",\n\t\t\tfontWeight: 500,\n\t\t\tcolor: \"#9ca3af\",\n\t\t\tcursor: \"pointer\",\n\t\t\tbackgroundColor: \"transparent\",\n\t\t\tborder: \"none\",\n\t\t\tpadding: 0,\n\t\t} as CSSProperties,\n\t},\n\tcloseButton: {\n\t\tlight: {\n\t\t\tfontSize: \"13px\",\n\t\t\tcolor: \"#9ca3af\",\n\t\t\tbackgroundColor: \"transparent\",\n\t\t\tborder: \"none\",\n\t\t\tcursor: \"pointer\",\n\t\t} as CSSProperties,\n\t\tdark: {\n\t\t\tfontSize: \"13px\",\n\t\t\tcolor: \"#6b7280\",\n\t\t\tbackgroundColor: \"transparent\",\n\t\t\tborder: \"none\",\n\t\t\tcursor: \"pointer\",\n\t\t} as CSSProperties,\n\t},\n};\n\n// Field container style\nconst fieldContainerStyle: CSSProperties = {\n\tmarginBottom: \"12px\",\n};\n\n// Identity styles\nconst identityStyles = {\n\tcontainer: {\n\t\tdisplay: \"flex\",\n\t\tflexDirection: \"column\",\n\t\tgap: \"6px\",\n\t} as CSSProperties,\n\titem: {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tgap: \"8px\",\n\t} as CSSProperties,\n\tlink: {\n\t\tcolor: \"#3b82f6\",\n\t\ttextDecoration: \"none\",\n\t} as CSSProperties,\n};\n\n// Signer styles\nconst signerStyles = {\n\tcontainer: {\n\t\tdisplay: \"flex\",\n\t\tflexDirection: \"column\",\n\t\tgap: \"4px\",\n\t} as CSSProperties,\n};\n\n// Action tag styles\nconst actionTagStyles: Record<ThemeType, CSSProperties> = {\n\tlight: {\n\t\tbackgroundColor: \"#f3f4f6\",\n\t\tcolor: \"#374151\",\n\t\tfontSize: \"12px\",\n\t\tpadding: \"2px 8px\",\n\t\tborderRadius: \"4px\",\n\t},\n\tdark: {\n\t\tbackgroundColor: \"#374151\",\n\t\tcolor: \"#d1d5db\",\n\t\tfontSize: \"12px\",\n\t\tpadding: \"2px 8px\",\n\t\tborderRadius: \"4px\",\n\t},\n};\n\nconst actionsContainerStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexWrap: \"wrap\",\n\tgap: \"6px\",\n};\n\nexport interface LimboPassportProps {\n\t/** Validation result from @limboai/node SDK */\n\tvalidation: C2PAValidationResponse;\n\t/** Whether the passport is visible */\n\tisVisible: boolean;\n\t/** Theme for the passport */\n\ttheme?: ThemeType;\n\t/** Position (determines tooltip placement) */\n\tposition?: BadgePositionType;\n\t/** Passport variant - basic shows issuer/date, full shows all fields */\n\tvariant?: PassportVariantType;\n\t/** Whether to show the date field */\n\tshowDate?: boolean;\n\t/** Mouse enter handler */\n\tonMouseEnter?: () => void;\n\t/** Close handler */\n\tonClose?: () => void;\n\t/** Additional inline styles for the container */\n\tstyle?: CSSProperties;\n}\n\n/**\n * LimboPassport - Pre-styled passport tooltip component\n *\n * Renders a passport with configurable variant (basic or full).\n */\nexport const LimboPassport: FC<LimboPassportProps> = ({\n\tvalidation,\n\tisVisible,\n\ttheme = Theme.Light,\n\tposition = BadgePosition.TopRight,\n\tvariant = PassportVariant.Basic,\n\tshowDate = true,\n\tonMouseEnter,\n\tonClose,\n\tstyle,\n}) => {\n\tif (!isVisible) {\n\t\treturn null;\n\t}\n\n\tconst containerStyle: CSSProperties = {\n\t\t...tooltipPositionStyles[position],\n\t\t...style,\n\t};\n\n\tconst isFull = variant === PassportVariant.Full;\n\n\treturn (\n\t\t<div\n\t\t\trole=\"tooltip\"\n\t\t\tstyle={containerStyle}\n\t\t\tonMouseEnter={onMouseEnter}\n\t\t\tonMouseLeave={onClose}\n\t\t>\n\t\t\t<Passport.Root\n\t\t\t\tvalidation={validation}\n\t\t\t\tstyle={passportContainerStyles[theme]}\n\t\t\t>\n\t\t\t\t{/* Header */}\n\t\t\t\t<Passport.Header style={passportHeaderStyles.container}>\n\t\t\t\t\t<Passport.Logo style={passportHeaderStyles.logo} />\n\t\t\t\t\t<Passport.Title style={passportHeaderStyles.title[theme]} />\n\t\t\t\t</Passport.Header>\n\n\t\t\t\t{/* Issuer Field */}\n\t\t\t\t<Passport.Field name=\"issuer\" style={fieldContainerStyle}>\n\t\t\t\t\t{({ label, value }) => (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div style={fieldLabelStyles[theme]}>{label}</div>\n\t\t\t\t\t\t\t<div style={fieldValueStyles[theme]}>{value}</div>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</Passport.Field>\n\n\t\t\t\t{/* Date Field */}\n\t\t\t\t{showDate && (\n\t\t\t\t\t<Passport.Field name=\"date\" style={fieldContainerStyle}>\n\t\t\t\t\t\t{({ label, value }) => (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<div style={fieldLabelStyles[theme]}>{label}</div>\n\t\t\t\t\t\t\t\t<div style={fieldValueStyles[theme]}>{value}</div>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Passport.Field>\n\t\t\t\t)}\n\n\t\t\t\t{/* Full variant: Identities */}\n\t\t\t\t{isFull && (\n\t\t\t\t\t<Passport.Identities style={fieldContainerStyle}>\n\t\t\t\t\t\t{(identities) => (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<div style={fieldLabelStyles[theme]}>\n\t\t\t\t\t\t\t\t\t{identities.length === 1\n\t\t\t\t\t\t\t\t\t\t? \"Verified Identity\"\n\t\t\t\t\t\t\t\t\t\t: `Verified Identities (${identities.length})`}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div style={identityStyles.container}>\n\t\t\t\t\t\t\t\t\t{identities.map((identity) => (\n\t\t\t\t\t\t\t\t\t\t<div key={identity.provider} style={identityStyles.item}>\n\t\t\t\t\t\t\t\t\t\t\t{identity.provider.toLowerCase().includes(\"linkedin\") && (\n\t\t\t\t\t\t\t\t\t\t\t\t<LinkedInIcon size={16} />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t{identity.uri ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\t\t\thref={identity.uri}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...fieldValueStyles[theme],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...identityStyles.link,\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{identity.username}\n\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<span style={fieldValueStyles[theme]}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{identity.username}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Passport.Identities>\n\t\t\t\t)}\n\n\t\t\t\t{/* Full variant: Signers */}\n\t\t\t\t{isFull && (\n\t\t\t\t\t<Passport.Signers style={fieldContainerStyle}>\n\t\t\t\t\t\t{(signers) => (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<div style={fieldLabelStyles[theme]}>\n\t\t\t\t\t\t\t\t\t{signers.length === 1\n\t\t\t\t\t\t\t\t\t\t? \"Previous Signer\"\n\t\t\t\t\t\t\t\t\t\t: `Previous Signers (${signers.length})`}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div style={signerStyles.container}>\n\t\t\t\t\t\t\t\t\t{signers.map((signer) => (\n\t\t\t\t\t\t\t\t\t\t<div key={signer.id} style={fieldValueStyles[theme]}>\n\t\t\t\t\t\t\t\t\t\t\t{signer.label}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Passport.Signers>\n\t\t\t\t)}\n\n\t\t\t\t{/* Full variant: Actions */}\n\t\t\t\t{isFull && (\n\t\t\t\t\t<Passport.Actions style={fieldContainerStyle}>\n\t\t\t\t\t\t{(actions) => (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<div style={fieldLabelStyles[theme]}>Actions</div>\n\t\t\t\t\t\t\t\t<div style={actionsContainerStyle}>\n\t\t\t\t\t\t\t\t\t{actions.map((action) => (\n\t\t\t\t\t\t\t\t\t\t<span key={action} style={actionTagStyles[theme]}>\n\t\t\t\t\t\t\t\t\t\t\t{action}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Passport.Actions>\n\t\t\t\t)}\n\n\t\t\t\t{/* Footer */}\n\t\t\t\t<Passport.Footer style={passportFooterStyles.container[theme]}>\n\t\t\t\t\t<Passport.CopyButton style={passportFooterStyles.copyButton[theme]} />\n\t\t\t\t\t{isFull && onClose && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\tstyle={passportFooterStyles.closeButton[theme]}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tClose\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</Passport.Footer>\n\t\t\t</Passport.Root>\n\t\t</div>\n\t);\n};\n\nLimboPassport.displayName = \"LimboPassport\";\n","\"use client\";\n\nimport type { C2PAValidationResponse } from \"@limboai/node\";\nimport { type CSSProperties, forwardRef, type ImgHTMLAttributes } from \"react\";\nimport type {\n\tInteractionModeType,\n\tPassportVariantType,\n\tRenderBadgeProps,\n\tRenderTooltipProps,\n\tValidationStatusType,\n} from \"@/types\";\nimport { MediaImage } from \"../media\";\nimport {\n\tBadgePosition,\n\ttype BadgePositionType,\n\tPassportVariant,\n\tTheme,\n\ttype ThemeType,\n\twrapperStyle,\n} from \"./constants\";\nimport { LimboBadge } from \"./LimboBadge\";\nimport { LimboPassport } from \"./LimboPassport\";\n\nexport interface LimboImageProps\n\textends Omit<ImgHTMLAttributes<HTMLImageElement>, \"onError\"> {\n\t/** Validation result from @limboai/node SDK (null if not validated yet) */\n\tvalidation?: C2PAValidationResponse | null;\n\t/** Current validation status */\n\tvalidationStatus?: ValidationStatusType;\n\t/** Native img onError handler */\n\tonError?: ImgHTMLAttributes<HTMLImageElement>[\"onError\"];\n\n\t/** Position of the badge (default: 'top-right') */\n\tbadgePosition?: BadgePositionType;\n\t/** Color theme (default: 'light') */\n\ttheme?: ThemeType;\n\t/** Passport variant - basic shows issuer/date, full shows all fields (default: 'basic') */\n\tpassportVariant?: PassportVariantType;\n\t/** Interaction mode - click or hover to show passport (default: 'click') */\n\tinteractionMode?: InteractionModeType;\n\t/** Whether to show the date field in passport (default: true) */\n\tshowDate?: boolean;\n\n\t/** Delay in ms before hiding the tooltip (default: 300ms) */\n\thideDelay?: number;\n\t/** Whether to enable automatic HEIC conversion (default: true) */\n\tenableHeicConversion?: boolean;\n\n\t/** Additional inline styles for the wrapper div */\n\twrapperStyle?: CSSProperties;\n}\n\n/**\n * LimboImage - Pre-styled image component with default badge and passport\n *\n * A ready-to-use image component that displays content credentials with\n * a pre-configured badge and passport tooltip.\n *\n * @example\n * ```tsx\n * // Basic usage with click interaction\n * <LimboImage\n * src=\"/photo.jpg\"\n * alt=\"Photo\"\n * validation={validation}\n * validationStatus=\"success\"\n * />\n *\n * // With hover interaction and dark theme\n * <LimboImage\n * src=\"/photo.jpg\"\n * alt=\"Photo\"\n * validation={validation}\n * validationStatus=\"success\"\n * interactionMode=\"hover\"\n * theme=\"dark\"\n * badgePosition=\"bottomRight\"\n * />\n *\n * // Full passport variant\n * <LimboImage\n * src=\"/photo.jpg\"\n * alt=\"Photo\"\n * validation={validation}\n * validationStatus=\"success\"\n * passportVariant=\"full\"\n * />\n * ```\n */\nexport const LimboImage = forwardRef<HTMLImageElement, LimboImageProps>(\n\t(\n\t\t{\n\t\t\tvalidation = null,\n\t\t\tvalidationStatus = \"idle\",\n\t\t\tbadgePosition = BadgePosition.TopRight,\n\t\t\ttheme = Theme.Light,\n\t\t\tpassportVariant = PassportVariant.Basic,\n\t\t\tinteractionMode = \"click\",\n\t\t\tshowDate = true,\n\t\t\thideDelay = 300,\n\t\t\tenableHeicConversion = true,\n\t\t\twrapperStyle: customWrapperStyle,\n\t\t\t...imgProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst combinedWrapperStyle: CSSProperties = {\n\t\t\t...wrapperStyle,\n\t\t\t...customWrapperStyle,\n\t\t};\n\n\t\tconst renderBadge = ({\n\t\t\thasCredentials,\n\t\t\ttoggle,\n\t\t\tshow,\n\t\t\thide,\n\t\t}: RenderBadgeProps) => {\n\t\t\tif (!hasCredentials) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst badgeProps =\n\t\t\t\tinteractionMode === \"hover\"\n\t\t\t\t\t? { onMouseEnter: show, onMouseLeave: hide }\n\t\t\t\t\t: { onClick: toggle };\n\n\t\t\treturn (\n\t\t\t\t<LimboBadge position={badgePosition} theme={theme} {...badgeProps} />\n\t\t\t);\n\t\t};\n\n\t\tconst renderTooltip = ({\n\t\t\tvalidation: tooltipValidation,\n\t\t\tisVisible,\n\t\t\tonMouseEnter,\n\t\t\tonClose,\n\t\t}: RenderTooltipProps) => (\n\t\t\t<LimboPassport\n\t\t\t\tvalidation={tooltipValidation}\n\t\t\t\tisVisible={isVisible}\n\t\t\t\ttheme={theme}\n\t\t\t\tposition={badgePosition}\n\t\t\t\tvariant={passportVariant}\n\t\t\t\tshowDate={showDate}\n\t\t\t\tonMouseEnter={interactionMode === \"hover\" ? onMouseEnter : undefined}\n\t\t\t\tonClose={onClose}\n\t\t\t/>\n\t\t);\n\n\t\treturn (\n\t\t\t<MediaImage\n\t\t\t\tref={ref}\n\t\t\t\t{...imgProps}\n\t\t\t\tvalidation={validation}\n\t\t\t\tvalidationStatus={validationStatus}\n\t\t\t\thideDelay={hideDelay}\n\t\t\t\tenableHeicConversion={enableHeicConversion}\n\t\t\t\twrapperStyle={combinedWrapperStyle}\n\t\t\t\trenderBadge={renderBadge}\n\t\t\t\trenderTooltip={renderTooltip}\n\t\t\t/>\n\t\t);\n\t},\n);\n\nLimboImage.displayName = \"LimboImage\";\n","\"use client\";\n\nimport type { C2PAValidationResponse } from \"@limboai/node\";\nimport {\n\ttype CSSProperties,\n\tforwardRef,\n\ttype VideoHTMLAttributes,\n} from \"react\";\nimport type {\n\tInteractionModeType,\n\tPassportVariantType,\n\tRenderBadgeProps,\n\tRenderTooltipProps,\n\tValidationStatusType,\n} from \"@/types\";\nimport { MediaVideo } from \"../media\";\nimport {\n\tBadgePosition,\n\ttype BadgePositionType,\n\tPassportVariant,\n\tTheme,\n\ttype ThemeType,\n\twrapperStyle,\n} from \"./constants\";\nimport { LimboBadge } from \"./LimboBadge\";\nimport { LimboPassport } from \"./LimboPassport\";\n\nexport interface LimboVideoProps\n\textends Omit<VideoHTMLAttributes<HTMLVideoElement>, \"onError\"> {\n\t/** Validation result from @limboai/node SDK (null if not validated yet) */\n\tvalidation?: C2PAValidationResponse | null;\n\t/** Current validation status */\n\tvalidationStatus?: ValidationStatusType;\n\t/** Native video onError handler */\n\tonError?: VideoHTMLAttributes<HTMLVideoElement>[\"onError\"];\n\n\t/** Position of the badge (default: 'top-right') */\n\tbadgePosition?: BadgePositionType;\n\t/** Color theme (default: 'light') */\n\ttheme?: ThemeType;\n\t/** Passport variant - basic shows issuer/date, full shows all fields (default: 'basic') */\n\tpassportVariant?: PassportVariantType;\n\t/** Interaction mode - click or hover to show passport (default: 'click') */\n\tinteractionMode?: InteractionModeType;\n\t/** Whether to show the date field in passport (default: true) */\n\tshowDate?: boolean;\n\n\t/** Delay in ms before hiding the tooltip (default: 300ms) */\n\thideDelay?: number;\n\n\t/** Additional inline styles for the wrapper div */\n\twrapperStyle?: CSSProperties;\n}\n\n/**\n * LimboVideo - Pre-styled video component with default badge and passport\n *\n * A ready-to-use video component that displays content credentials with\n * a pre-configured badge and passport tooltip.\n *\n * @example\n * ```tsx\n * // Basic usage with click interaction\n * <LimboVideo\n * src=\"/video.mp4\"\n * controls\n * validation={validation}\n * validationStatus=\"success\"\n * />\n *\n * // With hover interaction and dark theme\n * <LimboVideo\n * src=\"/video.mp4\"\n * controls\n * validation={validation}\n * validationStatus=\"success\"\n * interactionMode=\"hover\"\n * theme=\"dark\"\n * badgePosition=\"bottomRight\"\n * />\n *\n * // Full passport variant\n * <LimboVideo\n * src=\"/video.mp4\"\n * controls\n * validation={validation}\n * validationStatus=\"success\"\n * passportVariant=\"full\"\n * />\n * ```\n */\nexport const LimboVideo = forwardRef<HTMLVideoElement, LimboVideoProps>(\n\t(\n\t\t{\n\t\t\tvalidation = null,\n\t\t\tvalidationStatus = \"idle\",\n\t\t\tbadgePosition = BadgePosition.TopRight,\n\t\t\ttheme = Theme.Light,\n\t\t\tpassportVariant = PassportVariant.Basic,\n\t\t\tinteractionMode = \"click\",\n\t\t\tshowDate = true,\n\t\t\thideDelay = 300,\n\t\t\twrapperStyle: customWrapperStyle,\n\t\t\t...videoProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst combinedWrapperStyle: CSSProperties = {\n\t\t\t...wrapperStyle,\n\t\t\t...customWrapperStyle,\n\t\t};\n\n\t\tconst renderBadge = ({\n\t\t\thasCredentials,\n\t\t\ttoggle,\n\t\t\tshow,\n\t\t\thide,\n\t\t}: RenderBadgeProps) => {\n\t\t\tif (!hasCredentials) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst badgeProps =\n\t\t\t\tinteractionMode === \"hover\"\n\t\t\t\t\t? { onMouseEnter: show, onMouseLeave: hide }\n\t\t\t\t\t: { onClick: toggle };\n\n\t\t\treturn (\n\t\t\t\t<LimboBadge position={badgePosition} theme={theme} {...badgeProps} />\n\t\t\t);\n\t\t};\n\n\t\tconst renderTooltip = ({\n\t\t\tvalidation: tooltipValidation,\n\t\t\tisVisible,\n\t\t\tonMouseEnter,\n\t\t\tonClose,\n\t\t}: RenderTooltipProps) => (\n\t\t\t<LimboPassport\n\t\t\t\tvalidation={tooltipValidation}\n\t\t\t\tisVisible={isVisible}\n\t\t\t\ttheme={theme}\n\t\t\t\tposition={badgePosition}\n\t\t\t\tvariant={passportVariant}\n\t\t\t\tshowDate={showDate}\n\t\t\t\tonMouseEnter={interactionMode === \"hover\" ? onMouseEnter : undefined}\n\t\t\t\tonClose={onClose}\n\t\t\t/>\n\t\t);\n\n\t\treturn (\n\t\t\t<MediaVideo\n\t\t\t\tref={ref}\n\t\t\t\t{...videoProps}\n\t\t\t\tvalidation={validation}\n\t\t\t\tvalidationStatus={validationStatus}\n\t\t\t\thideDelay={hideDelay}\n\t\t\t\twrapperStyle={combinedWrapperStyle}\n\t\t\t\trenderBadge={renderBadge}\n\t\t\t\trenderTooltip={renderTooltip}\n\t\t\t/>\n\t\t);\n\t},\n);\n\nLimboVideo.displayName = \"LimboVideo\";\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type { CRLogoProps, LinkedInIconProps } from "./icons";
2
+ export { CRLogo, LinkedInIcon } from "./icons";
3
+ export { useTooltipVisibility } from "./shared";
4
+ export type { C2PAValidationResponse, IdentityInfo, ManifestEntry, PassportData, PassportVariantType, RenderBadgeProps, RenderTooltipProps, SignerInfo, ValidationStatusType, VerifiedIdentity, } from "./types";
5
+ export { PassportVariant, ValidationStatus } from "./types";
6
+ export { CredentialBadge, CredentialOverlay, useCredentialBadgeContext, useCredentialOverlayContext, } from "./ui/core/credential";
7
+ export { Passport, usePassportContext, usePassportData, } from "./ui/core/passport";
8
+ export type { BadgePositionType, LimboBadgeProps, LimboImageProps, LimboPassportProps, LimboVideoProps, ThemeType, } from "./ui/default";
9
+ export { BadgePosition, LimboBadge, LimboImage, LimboPassport, LimboVideo, Theme, } from "./ui/default";
10
+ export type { MediaImageProps, MediaVideoProps } from "./ui/media";
11
+ export { MediaImage, MediaVideo, useHeicConversion, useMediaContext, } from "./ui/media";