Skip to content

Embedded Widgets

IOF Widgets are drop-in UI components that let you launch customer-facing Islamic finance journeys without building the front-end from scratch. Every widget is white-label, ABAC-policy-bound, and emits structured audit events. Maker-checker is preserved on every sensitive action — no widget moves money on its own.

Live catalog: widgets.islamicopenfinance.com · Live gallery: widgets.islamicopenfinance.com/gallery

IDNameCategoryTier
murabaha-calculatorMurabaha Repayment CalculatorLead generationStarter
ijarah-calculatorIjarah Rental Schedule CalculatorLead generationStarter
sukuk-distribution-calculatorSukuk Distribution CalculatorLead generationStarter
takaful-contribution-calculatorTakaful Contribution CalculatorLead generationStarter
roi-calculatorIslamic Finance ROI CalculatorLead generationStarter
murabaha-applicationMurabaha Finance ApplicationEmbedded financeProfessional
qr-paymentQR Payment / Request-to-PayEmbedded financeStarter
evidence-pack-viewerEvidence Pack ViewerComplianceStarter
consent-captureConsent / Delegation WidgetComplianceProfessional
compliance-badgePowered-by-IOF Evidence BadgeLead generationStarter
trade-doc-checkerTrade Finance Document CheckerOperationsProfessional
reconciliation-viewerReconciliation Exception ViewerOperationsProfessional
sandbox-launcherSandbox Tenant LauncherDeveloperStarter

Source of truth: packages/widgets-core/src/registry.ts.

<iframe
src="https://widgets.islamicopenfinance.com/widgets/murabaha-calculator?tenant=tnt_xyz"
width="100%"
height="520"
frameborder="0"
></iframe>
<script src="https://widgets.islamicopenfinance.com/embed.js"></script>
<div data-iof-widget="murabaha-calculator" data-iof-tenant="tnt_xyz"></div>

The loader scans the DOM on DOMContentLoaded and injects an iframe for every [data-iof-widget] element. Multiple widgets per page are supported.

import { MurabahaCalculator } from "@iof/embedded-ux-kit/widgets";
export function Page() {
return <MurabahaCalculator />;
}

See the @iof/embedded-ux-kit SDK reference for the full component list and props.

Every widget emits structured WidgetEvent messages to your configured callback URL. The event family is:

  • widget.session.started — user initiated the embedded session
  • widget.session.terminated — session ended (timeout, explicit close, navigation)
  • widget.submission.received — user submitted a form; payload includes submissionId and sanitised summary
  • widget.error.thrown — widget-side error (validation, network, policy denial)

Full schemas live in packages/event-schema-registry/src/schemas/widget-events.ts and are re-exported from @iof/contracts-core.

Every widget is bound to one or more policy-engine resources. Authorisation is evaluated by the embedded PDP (EPDP) at the edge before any API call leaves the browser, and again by the service PDP (SPDP) inside rail-api. The canonical policy for widget sessions is config/cerbos/policies/widget_session.yaml.

End-users can only read their own sessions. terminate and impersonate actions are explicitly denied for end_user roles. Tenant owners and admins retain full control.

No widget moves money unilaterally. Sensitive actions (contract creation, payment execution, consent grant) are marked approvalGated in the widget definition and routed through the maker-checker flow in rail-api. The widget surface shows the approval status in real time but never short-circuits it.