@alfadocs/ui-kit-debug 0.50.0 → 0.51.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.
- package/dist/_chunks/{agenda-card-BaSfVfrL.js → agenda-card-Bl-SBiCh.js} +55 -45
- package/dist/_chunks/agenda-card-Bl-SBiCh.js.map +1 -0
- package/dist/_chunks/agenda-tray-DA6qj8BL.js +203 -0
- package/dist/_chunks/agenda-tray-DA6qj8BL.js.map +1 -0
- package/dist/_chunks/{ai-consent-banner-F2md5JD3.js → ai-consent-banner-DBKV27je.js} +2 -2
- package/dist/_chunks/{ai-consent-banner-F2md5JD3.js.map → ai-consent-banner-DBKV27je.js.map} +1 -1
- package/dist/_chunks/ai-tools-rail-7tC3GT4h.js +340 -0
- package/dist/_chunks/ai-tools-rail-7tC3GT4h.js.map +1 -0
- package/dist/_chunks/{alert-CUTxnym2.js → alert-_mUKLmwA.js} +54 -44
- package/dist/_chunks/alert-_mUKLmwA.js.map +1 -0
- package/dist/_chunks/{audio-recorder-DVJXV7_k.js → audio-recorder-D6OVfNiZ.js} +2 -2
- package/dist/_chunks/{audio-recorder-DVJXV7_k.js.map → audio-recorder-D6OVfNiZ.js.map} +1 -1
- package/dist/_chunks/{bishop-score-2MzAz8NE.js → bishop-score-CMQxsdy4.js} +2 -2
- package/dist/_chunks/{bishop-score-2MzAz8NE.js.map → bishop-score-CMQxsdy4.js.map} +1 -1
- package/dist/_chunks/{bmi-calculator-DdylQzT6.js → bmi-calculator-DuUneHuZ.js} +2 -2
- package/dist/_chunks/{bmi-calculator-DdylQzT6.js.map → bmi-calculator-DuUneHuZ.js.map} +1 -1
- package/dist/_chunks/{booking-DljH0JkS.js → booking-BUV9fspj.js} +2 -2
- package/dist/_chunks/{booking-DljH0JkS.js.map → booking-BUV9fspj.js.map} +1 -1
- package/dist/_chunks/{cycle-calculator-oOkj5wlB.js → cycle-calculator-vTtZZAmn.js} +2 -2
- package/dist/_chunks/{cycle-calculator-oOkj5wlB.js.map → cycle-calculator-vTtZZAmn.js.map} +1 -1
- package/dist/_chunks/{document-scanner-Cxqvq7GR.js → document-scanner-biBS_f6c.js} +2 -2
- package/dist/_chunks/{document-scanner-Cxqvq7GR.js.map → document-scanner-biBS_f6c.js.map} +1 -1
- package/dist/_chunks/dropdown-menu-DwwPovMZ.js +354 -0
- package/dist/_chunks/dropdown-menu-DwwPovMZ.js.map +1 -0
- package/dist/_chunks/{due-date-calculator-DykajWzh.js → due-date-calculator-CUm5KJbf.js} +2 -2
- package/dist/_chunks/{due-date-calculator-DykajWzh.js.map → due-date-calculator-CUm5KJbf.js.map} +1 -1
- package/dist/_chunks/{editable-currency-cell-renderer-Bh48OHRv.js → editable-currency-cell-renderer-D5C5tCfu.js} +3 -3
- package/dist/_chunks/{editable-currency-cell-renderer-Bh48OHRv.js.map → editable-currency-cell-renderer-D5C5tCfu.js.map} +1 -1
- package/dist/_chunks/{fetal-weight-Da-B4P4k.js → fetal-weight-Xf8-ZoDy.js} +2 -2
- package/dist/_chunks/{fetal-weight-Da-B4P4k.js.map → fetal-weight-Xf8-ZoDy.js.map} +1 -1
- package/dist/_chunks/{freemium-paywall-BWaLWje-.js → freemium-paywall-gHGA44dW.js} +2 -2
- package/dist/_chunks/{freemium-paywall-BWaLWje-.js.map → freemium-paywall-gHGA44dW.js.map} +1 -1
- package/dist/_chunks/{gestational-age-calculator-Bc55hq6t.js → gestational-age-calculator-830KJql3.js} +2 -2
- package/dist/_chunks/{gestational-age-calculator-Bc55hq6t.js.map → gestational-age-calculator-830KJql3.js.map} +1 -1
- package/dist/_chunks/{hcg-doubling-DAnpbale.js → hcg-doubling-kVOpDfny.js} +2 -2
- package/dist/_chunks/{hcg-doubling-DAnpbale.js.map → hcg-doubling-kVOpDfny.js.map} +1 -1
- package/dist/_chunks/{header-settings-Bx0Biimh.js → header-settings-D5Z2B_Yz.js} +3 -3
- package/dist/_chunks/{header-settings-Bx0Biimh.js.map → header-settings-D5Z2B_Yz.js.map} +1 -1
- package/dist/_chunks/insert-result-njqBthzT.js +742 -0
- package/dist/_chunks/insert-result-njqBthzT.js.map +1 -0
- package/dist/_chunks/{marketplace-app-shell-UKSLx9K_.js → marketplace-app-shell-Dmo1S9av.js} +6 -6
- package/dist/_chunks/{marketplace-app-shell-UKSLx9K_.js.map → marketplace-app-shell-Dmo1S9av.js.map} +1 -1
- package/dist/_chunks/{patient-search-BJOmTmDA.js → patient-search-CArmRKeg.js} +3 -3
- package/dist/_chunks/{patient-search-BJOmTmDA.js.map → patient-search-CArmRKeg.js.map} +1 -1
- package/dist/_chunks/{patient-shell-DUmhXnFq.js → patient-shell-c2YixkQw.js} +4 -4
- package/dist/_chunks/{patient-shell-DUmhXnFq.js.map → patient-shell-c2YixkQw.js.map} +1 -1
- package/dist/_chunks/{payment-form-xmeCkxas.js → payment-form-DJ9vnzrT.js} +2 -2
- package/dist/_chunks/{payment-form-xmeCkxas.js.map → payment-form-DJ9vnzrT.js.map} +1 -1
- package/dist/_chunks/{pdf-viewer-q1D3Uion.js → pdf-viewer-4odMFuFW.js} +2 -2
- package/dist/_chunks/{pdf-viewer-q1D3Uion.js.map → pdf-viewer-4odMFuFW.js.map} +1 -1
- package/dist/_chunks/{practice-results-Cq1y8JFD.js → practice-results-CtfciF2v.js} +3 -3
- package/dist/_chunks/{practice-results-Cq1y8JFD.js.map → practice-results-CtfciF2v.js.map} +1 -1
- package/dist/_chunks/{pregnancy-dating-48Gfvod1.js → pregnancy-dating-BA37LSkF.js} +16 -16
- package/dist/_chunks/{pregnancy-dating-48Gfvod1.js.map → pregnancy-dating-BA37LSkF.js.map} +1 -1
- package/dist/_chunks/{pregnancy-weight-gain-CCGrvarh.js → pregnancy-weight-gain-BMRBeA8V.js} +2 -2
- package/dist/_chunks/{pregnancy-weight-gain-CCGrvarh.js.map → pregnancy-weight-gain-BMRBeA8V.js.map} +1 -1
- package/dist/_chunks/{recaptcha-widget-CFYyLSEX.js → recaptcha-widget-BCNHsgqt.js} +2 -2
- package/dist/_chunks/{recaptcha-widget-CFYyLSEX.js.map → recaptcha-widget-BCNHsgqt.js.map} +1 -1
- package/dist/_chunks/{sidebar-h78cTNLh.js → sidebar-DPEHzxLZ.js} +397 -346
- package/dist/_chunks/sidebar-DPEHzxLZ.js.map +1 -0
- package/dist/_chunks/{sign-document-CZkAf28g.js → sign-document-Bzld9jVM.js} +2 -2
- package/dist/_chunks/{sign-document-CZkAf28g.js.map → sign-document-Bzld9jVM.js.map} +1 -1
- package/dist/_chunks/{task-card-CPyQ5AXC.js → task-card-BwY9jaV1.js} +48 -42
- package/dist/_chunks/task-card-BwY9jaV1.js.map +1 -0
- package/dist/_chunks/task-tray-Cb_hK4yb.js +234 -0
- package/dist/_chunks/task-tray-Cb_hK4yb.js.map +1 -0
- package/dist/_chunks/{theme-toggle-ClATnY4Q.js → theme-toggle-DAW7uC0B.js} +3 -3
- package/dist/_chunks/{theme-toggle-ClATnY4Q.js.map → theme-toggle-DAW7uC0B.js.map} +1 -1
- package/dist/_chunks/{unit-converter-jWp3Z85y.js → unit-converter-BQ6lEYvd.js} +2 -2
- package/dist/_chunks/{unit-converter-jWp3Z85y.js.map → unit-converter-BQ6lEYvd.js.map} +1 -1
- package/dist/_chunks/use-edge-resize-ZnGG7gyO.js +139 -0
- package/dist/_chunks/use-edge-resize-ZnGG7gyO.js.map +1 -0
- package/dist/_chunks/use-theme-CAuo6EYT.js +159 -0
- package/dist/_chunks/use-theme-CAuo6EYT.js.map +1 -0
- package/dist/_chunks/{warning-stack-CXfoAT-_.js → warning-stack-Cv4fr5zo.js} +2 -2
- package/dist/_chunks/{warning-stack-CXfoAT-_.js.map → warning-stack-Cv4fr5zo.js.map} +1 -1
- package/dist/_chunks/{workflow-map-DzX_LI4y.js → workflow-map-BJDUNYlX.js} +3 -3
- package/dist/_chunks/{workflow-map-DzX_LI4y.js.map → workflow-map-BJDUNYlX.js.map} +1 -1
- package/dist/agent-catalog.json +1 -1
- package/dist/components/_shared/insert-result.d.ts.map +1 -1
- package/dist/components/agenda-card/agenda-card.d.ts +19 -2
- package/dist/components/agenda-card/agenda-card.d.ts.map +1 -1
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/agenda-tray.d.ts +24 -1
- package/dist/components/agenda-tray/agenda-tray.d.ts.map +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-consent-banner/index.js +1 -1
- package/dist/components/ai-tools-rail/ai-tools-rail.d.ts +8 -0
- package/dist/components/ai-tools-rail/ai-tools-rail.d.ts.map +1 -1
- package/dist/components/ai-tools-rail/index.js +1 -1
- package/dist/components/alert/index.js +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/bishop-score/index.js +1 -1
- package/dist/components/bmi-calculator/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/button-group/button-group.d.ts +1 -1
- package/dist/components/checkbox-group/checkbox-group.d.ts +1 -1
- package/dist/components/cycle-calculator/index.js +1 -1
- package/dist/components/data-table/index.js +1 -1
- package/dist/components/document-scanner/index.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.d.ts +2 -0
- package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/index.js +1 -1
- package/dist/components/due-date-calculator/index.js +1 -1
- package/dist/components/fetal-weight/index.js +1 -1
- package/dist/components/form-field/form-field.d.ts +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/gestational-age-calculator/index.js +1 -1
- package/dist/components/hcg-doubling/index.js +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/icon-button-group/icon-button-group.d.ts +15 -15
- package/dist/components/key-value-pair/key-value-pair.d.ts +1 -1
- package/dist/components/patient-search/index.js +1 -1
- package/dist/components/payment-form/index.js +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/pregnancy-dating/pregnancy-dating.d.ts.map +1 -1
- package/dist/components/pregnancy-weight-gain/index.js +1 -1
- package/dist/components/radio-group/radio-group.d.ts +1 -1
- package/dist/components/recaptcha-widget/index.js +1 -1
- package/dist/components/separator/separator.d.ts +1 -1
- package/dist/components/sidebar/index.js +1 -1
- package/dist/components/sidebar/sidebar.d.ts +8 -0
- package/dist/components/sidebar/sidebar.d.ts.map +1 -1
- package/dist/components/sign-document/index.js +1 -1
- package/dist/components/tabs/tabs.d.ts +2 -2
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-card/task-card.d.ts +15 -1
- package/dist/components/task-card/task-card.d.ts.map +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/task-tray/task-tray.d.ts +24 -1
- package/dist/components/task-tray/task-tray.d.ts.map +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/unit-converter/index.js +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/components/workflow/workflow-map.d.ts +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +12 -10
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-edge-resize.d.ts +78 -0
- package/dist/hooks/use-edge-resize.d.ts.map +1 -0
- package/dist/hooks/use-theme.d.ts.map +1 -1
- package/dist/i18n/locales/ar.d.ts +4 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +7 -3
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +4 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +7 -3
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +4 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +7 -3
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +4 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +7 -3
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +4 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +7 -3
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +4 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +7 -3
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +4 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +7 -3
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +4 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +7 -3
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +4 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +7 -3
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +4 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +7 -3
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +4 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +7 -3
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +4 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +7 -3
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +4 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +7 -3
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +4 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +7 -3
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +4 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +7 -3
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +4 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +7 -3
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +4 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +7 -3
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +4 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +7 -3
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +37 -37
- package/dist/locales/ar.json +7 -3
- package/dist/locales/de.json +7 -3
- package/dist/locales/el.json +7 -3
- package/dist/locales/en.json +7 -3
- package/dist/locales/es.json +7 -3
- package/dist/locales/fr.json +7 -3
- package/dist/locales/hi.json +7 -3
- package/dist/locales/it.json +7 -3
- package/dist/locales/ja.json +7 -3
- package/dist/locales/nl.json +7 -3
- package/dist/locales/pl.json +7 -3
- package/dist/locales/pt.json +7 -3
- package/dist/locales/ro.json +7 -3
- package/dist/locales/ru.json +7 -3
- package/dist/locales/sq.json +7 -3
- package/dist/locales/sv.json +7 -3
- package/dist/locales/tr.json +7 -3
- package/dist/locales/zh.json +7 -3
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/patterns/patient-shell/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/agenda-card-BaSfVfrL.js.map +0 -1
- package/dist/_chunks/agenda-tray-DQayYmQ0.js +0 -165
- package/dist/_chunks/agenda-tray-DQayYmQ0.js.map +0 -1
- package/dist/_chunks/ai-tools-rail-CYLWrRmm.js +0 -280
- package/dist/_chunks/ai-tools-rail-CYLWrRmm.js.map +0 -1
- package/dist/_chunks/alert-CUTxnym2.js.map +0 -1
- package/dist/_chunks/circle-arrow-up-CC_85SuH.js +0 -16
- package/dist/_chunks/circle-arrow-up-CC_85SuH.js.map +0 -1
- package/dist/_chunks/dropdown-menu-CUEXqKis.js +0 -299
- package/dist/_chunks/dropdown-menu-CUEXqKis.js.map +0 -1
- package/dist/_chunks/insert-result-DNdi_JYW.js +0 -683
- package/dist/_chunks/insert-result-DNdi_JYW.js.map +0 -1
- package/dist/_chunks/sidebar-h78cTNLh.js.map +0 -1
- package/dist/_chunks/task-card-CPyQ5AXC.js.map +0 -1
- package/dist/_chunks/task-tray-B8jFv5FV.js +0 -196
- package/dist/_chunks/task-tray-B8jFv5FV.js.map +0 -1
- package/dist/_chunks/use-theme-C2dHKUAN.js +0 -145
- package/dist/_chunks/use-theme-C2dHKUAN.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recaptcha-widget-CFYyLSEX.js","sources":["../../src/components/recaptcha-widget/recaptcha-widget.agent.ts","../../src/components/recaptcha-widget/recaptcha-widget.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — RecaptchaWidget. */\n/* */\n/* Recaptcha already exposes a curated `RecaptchaWidgetHandle` via */\n/* useImperativeHandle. The adapter wires `execute` (issue token, write) */\n/* and `reset` (clear token, destructive) into that existing handle. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { RecaptchaWidgetHandle } from './recaptcha-widget';\n\nexport const recaptchaWidgetAgent: AgentAdapter<RecaptchaWidgetHandle> = {\n id: 'recaptcha-widget',\n capabilities: ['submit'],\n state: {\n hasToken: {\n type: 'boolean',\n descriptionKey: 'ui.agent.recaptchaWidget.state.hasToken',\n description:\n 'True when the widget currently holds a valid verification token.',\n read: (handle) => handle.getResponse().length > 0,\n },\n },\n actions: {\n execute: {\n safety: 'write',\n descriptionKey: 'ui.agent.recaptchaWidget.actions.execute',\n description:\n 'Programmatically trigger the captcha challenge. Issues a token via the callback.',\n invoke: (handle) => {\n handle.execute();\n },\n },\n reset: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.recaptchaWidget.actions.reset',\n description:\n 'Clear the current token and re-roll the captcha. Irreversible.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'recaptcha-widget',\n description: 'Marks the RecaptchaWidget wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop (or the surrounding FormField id).',\n },\n },\n};\n","import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useFormField } from '../form-field/form-field-context';\nimport { useTheme } from '../../hooks';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { recaptchaWidgetAgent } from './recaptcha-widget.agent';\n\n/* ------------------------------------------------------------------ */\n/* Loader — idempotent across instances */\n/* ------------------------------------------------------------------ */\n\n/**\n * Google reCAPTCHA v2 ships as a global `grecaptcha` object loaded from\n * `https://www.google.com/recaptcha/api.js`. We lazy-load the script\n * once per page using a shared promise so N widgets on the same form\n * (or N renders of a single widget) all wait on the same fetch.\n *\n * The `?render=explicit` query parameter is required so we control\n * when each widget mounts via `grecaptcha.render`, rather than letting\n * the global auto-bind to every `.g-recaptcha` div on the page.\n */\nconst SCRIPT_SRC = 'https://www.google.com/recaptcha/api.js';\nconst SCRIPT_ID = 'alfadocs-ui-recaptcha-loader';\nconst FOREIGN_LOADER_GRACE_MS = 10_000;\nconst POLL_INTERVAL_MS = 100;\n\ninterface RecaptchaApi {\n render: (\n container: HTMLElement,\n parameters: {\n sitekey: string;\n theme?: 'light' | 'dark';\n size?: 'normal' | 'compact' | 'invisible';\n hl?: string;\n callback?: (token: string) => void;\n 'expired-callback'?: () => void;\n 'error-callback'?: () => void;\n },\n ) => number;\n reset: (widgetId?: number) => void;\n getResponse: (widgetId?: number) => string;\n execute: (widgetId?: number) => void;\n}\n\ndeclare global {\n interface Window {\n grecaptcha?: RecaptchaApi;\n ___grecaptchaOnLoad___?: () => void;\n }\n}\n\nlet loaderPromise: Promise<RecaptchaApi> | null = null;\n\nfunction loadRecaptcha(hl: string | undefined): Promise<RecaptchaApi> {\n if (typeof window === 'undefined') {\n return Promise.reject(new Error('recaptcha: window is not available'));\n }\n if (window.grecaptcha && typeof window.grecaptcha.render === 'function') {\n return Promise.resolve(window.grecaptcha);\n }\n if (loaderPromise) {\n return loaderPromise;\n }\n\n loaderPromise = new Promise<RecaptchaApi>((resolve, reject) => {\n const existing = document.getElementById(\n SCRIPT_ID,\n ) as HTMLScriptElement | null;\n\n const onReady = () => {\n if (window.grecaptcha && typeof window.grecaptcha.render === 'function') {\n resolve(window.grecaptcha);\n } else {\n reject(new Error('recaptcha: grecaptcha global missing after load'));\n }\n };\n\n window.___grecaptchaOnLoad___ = onReady;\n\n if (existing) {\n // Foreign loader present (e.g. host page already injected\n // api.js without ?onload=). Poll for grecaptcha; if it never\n // arrives, inject our own redundant loader with a fresh onload.\n let pollHandle: ReturnType<typeof setInterval> | null = null;\n let timeoutHandle: ReturnType<typeof setTimeout> | null = null;\n const clearTimers = () => {\n if (pollHandle !== null) clearInterval(pollHandle);\n if (timeoutHandle !== null) clearTimeout(timeoutHandle);\n pollHandle = null;\n timeoutHandle = null;\n };\n pollHandle = setInterval(() => {\n if (\n window.grecaptcha &&\n typeof window.grecaptcha.render === 'function'\n ) {\n clearTimers();\n resolve(window.grecaptcha);\n }\n }, POLL_INTERVAL_MS);\n timeoutHandle = setTimeout(() => {\n clearTimers();\n if (\n window.grecaptcha &&\n typeof window.grecaptcha.render === 'function'\n ) {\n resolve(window.grecaptcha);\n return;\n }\n // Foreign loader didn't deliver in time — inject our own.\n const fallbackCb = `___grecaptchaOnLoad___fallback_${Date.now()}___`;\n (window as unknown as Record<string, () => void>)[fallbackCb] = () => {\n delete (window as unknown as Record<string, () => void>)[fallbackCb];\n if (\n window.grecaptcha &&\n typeof window.grecaptcha.render === 'function'\n ) {\n resolve(window.grecaptcha);\n } else {\n reject(\n new Error('recaptcha: grecaptcha global missing after fallback'),\n );\n }\n };\n const fallbackParams = new URLSearchParams({\n onload: fallbackCb,\n render: 'explicit',\n });\n if (hl) fallbackParams.set('hl', hl);\n const fallbackScript = document.createElement('script');\n fallbackScript.src = `${SCRIPT_SRC}?${fallbackParams.toString()}`;\n fallbackScript.async = true;\n fallbackScript.defer = true;\n fallbackScript.onerror = () => {\n delete (window as unknown as Record<string, () => void>)[fallbackCb];\n loaderPromise = null;\n reject(new Error('recaptcha: fallback script failed to load'));\n };\n document.head.appendChild(fallbackScript);\n }, FOREIGN_LOADER_GRACE_MS);\n return;\n }\n\n const params = new URLSearchParams({\n onload: '___grecaptchaOnLoad___',\n render: 'explicit',\n });\n if (hl) params.set('hl', hl);\n\n const script = document.createElement('script');\n script.id = SCRIPT_ID;\n script.src = `${SCRIPT_SRC}?${params.toString()}`;\n script.async = true;\n script.defer = true;\n script.onerror = () => {\n loaderPromise = null;\n reject(new Error('recaptcha: script failed to load'));\n };\n document.head.appendChild(script);\n });\n\n return loaderPromise;\n}\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------ */\n\nexport interface RecaptchaWidgetHandle {\n /** Re-roll the captcha — clears the response token. */\n reset: () => void;\n /** Returns the current response token, or empty string when unsolved. */\n getResponse: () => string;\n /** Programmatically trigger an invisible captcha challenge. */\n execute: () => void;\n}\n\nexport interface RecaptchaWidgetProps {\n /** Google reCAPTCHA v2 site key. Required. */\n siteKey: string;\n /**\n * Visual theme. Defaults to the resolved DS theme (`useTheme`).\n * Pass `'light'` / `'dark'` to force.\n */\n theme?: 'light' | 'dark';\n /** Two-letter locale hint. Defaults to the current i18next language. */\n locale?: string;\n /** Widget size. */\n size?: 'normal' | 'compact' | 'invisible';\n /** Called with the verification token, or `null` when expired/reset. */\n onChange?: (token: string | null) => void;\n /** Called when the user solves but the token then times out. */\n onExpired?: () => void;\n /** Called when the script or challenge errors out. */\n onError?: () => void;\n /** Error message — wires aria-describedby + announces via the live region. */\n error?: string;\n /** Override the DOM id; defaults to the surrounding FormField id. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const RecaptchaWidget = forwardRef<\n RecaptchaWidgetHandle,\n RecaptchaWidgetProps\n>(function RecaptchaWidget(\n {\n siteKey,\n theme,\n locale,\n size = 'normal',\n onChange,\n onExpired,\n onError,\n error,\n id,\n className,\n },\n ref,\n) {\n const { t, i18n } = useTranslation();\n const formField = useFormField();\n const { resolvedTheme } = useTheme();\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const widgetIdRef = useRef<number | null>(null);\n const apiRef = useRef<RecaptchaApi | null>(null);\n const [statusMessage, setStatusMessage] = useState<string>('');\n\n const wrapperId = id ?? formField.id;\n const errorId = error ? `${wrapperId}-error` : undefined;\n const describedBy =\n [formField.describedBy, errorId].filter(Boolean).join(' ') || undefined;\n\n // Mirror the DS theme into reCAPTCHA's two-tone setting.\n const effectiveTheme: 'light' | 'dark' =\n theme ?? (resolvedTheme.startsWith('dark') ? 'dark' : 'light');\n const effectiveLocale = locale ?? i18n.language;\n\n // Stable callbacks via refs so we don't re-render the widget on\n // every parent state change.\n const onChangeRef = useRef(onChange);\n const onExpiredRef = useRef(onExpired);\n const onErrorRef = useRef(onError);\n onChangeRef.current = onChange;\n onExpiredRef.current = onExpired;\n onErrorRef.current = onError;\n\n const expiredLabel = t(\n 'inputs.recaptcha.expired',\n 'Verification expired — please retry.',\n );\n const errorLabel = t(\n 'inputs.recaptcha.error',\n 'Verification failed — please retry.',\n );\n\n useEffect(() => {\n if (!siteKey || !containerRef.current) return;\n let cancelled = false;\n\n loadRecaptcha(effectiveLocale)\n .then((api) => {\n if (cancelled || !containerRef.current) return;\n apiRef.current = api;\n widgetIdRef.current = api.render(containerRef.current, {\n sitekey: siteKey,\n theme: effectiveTheme,\n size,\n hl: effectiveLocale,\n callback: (token) => {\n setStatusMessage('');\n onChangeRef.current?.(token);\n },\n 'expired-callback': () => {\n setStatusMessage(expiredLabel);\n onChangeRef.current?.(null);\n onExpiredRef.current?.();\n },\n 'error-callback': () => {\n setStatusMessage(errorLabel);\n onChangeRef.current?.(null);\n onErrorRef.current?.();\n },\n });\n })\n .catch(() => {\n if (cancelled) return;\n setStatusMessage(errorLabel);\n onErrorRef.current?.();\n });\n\n return () => {\n cancelled = true;\n // grecaptcha has no public destroy. The shared script stays\n // loaded; we reset the widget so its iframe stops listening.\n if (apiRef.current && widgetIdRef.current !== null) {\n try {\n apiRef.current.reset(widgetIdRef.current);\n } catch {\n /* widget id may already be invalid — safe to ignore. */\n }\n }\n };\n // Re-render the widget when the underlying configuration changes.\n }, [\n siteKey,\n effectiveTheme,\n effectiveLocale,\n size,\n expiredLabel,\n errorLabel,\n ]);\n\n const agentHandle = useMemo<RecaptchaWidgetHandle>(\n () => ({\n reset: () => {\n if (apiRef.current && widgetIdRef.current !== null) {\n apiRef.current.reset(widgetIdRef.current);\n setStatusMessage('');\n onChangeRef.current?.(null);\n }\n },\n getResponse: () => {\n if (apiRef.current && widgetIdRef.current !== null) {\n return apiRef.current.getResponse(widgetIdRef.current);\n }\n return '';\n },\n execute: () => {\n if (apiRef.current && widgetIdRef.current !== null) {\n apiRef.current.execute(widgetIdRef.current);\n }\n },\n }),\n [],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(recaptchaWidgetAgent, agentHandle, wrapperId);\n\n const liveMessage = error || statusMessage;\n // For invisible widgets the iframe is offscreen, so we mark the\n // wrapper as a non-visual badge. Otherwise the wrapper just hosts\n // the rendered iframe and contributes no interactive role itself.\n const wrapperRole = size === 'invisible' ? 'presentation' : undefined;\n\n return (\n <div\n className={[\n 'ds:inline-block',\n // Keep the iframe inside the wrapper's stacking context so\n // popovers etc. above the form continue to overlay correctly.\n 'ds:relative ds:isolate',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n data-component=\"recaptcha-widget\"\n data-component-id={wrapperId}\n data-size={size}\n role={wrapperRole}\n >\n <div\n ref={containerRef}\n id={wrapperId}\n // The class name is the canonical hook Google's verifier\n // looks for when the page form is submitted server-side. Some\n // Symfony / Laravel validators short-circuit when this class\n // is missing, so we render it even though we're using\n // grecaptcha.render explicitly.\n className=\"g-recaptcha\"\n data-sitekey={siteKey}\n data-theme={effectiveTheme}\n data-size={size}\n aria-describedby={describedBy}\n aria-invalid={error || formField.invalid ? true : undefined}\n />\n {/* Live announcement for expired / error states. Empty when the\n widget is healthy so SR users aren't spammed. */}\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n >\n {liveMessage}\n </div>\n </div>\n );\n});\n\nRecaptchaWidget.displayName = 'RecaptchaWidget';\n"],"names":["recaptchaWidgetAgent","handle","SCRIPT_SRC","SCRIPT_ID","FOREIGN_LOADER_GRACE_MS","POLL_INTERVAL_MS","loaderPromise","loadRecaptcha","hl","resolve","reject","existing","onReady","pollHandle","timeoutHandle","clearTimers","fallbackCb","fallbackParams","fallbackScript","params","script","RecaptchaWidget","forwardRef","siteKey","theme","locale","size","onChange","onExpired","onError","error","id","className","ref","t","i18n","useTranslation","formField","useFormField","resolvedTheme","useTheme","containerRef","useRef","widgetIdRef","apiRef","statusMessage","setStatusMessage","useState","wrapperId","errorId","describedBy","effectiveTheme","effectiveLocale","onChangeRef","onExpiredRef","onErrorRef","expiredLabel","errorLabel","useEffect","cancelled","api","token","_a","_b","agentHandle","useMemo","useImperativeHandle","useAgentRegistration","liveMessage","wrapperRole","jsxs","jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"recaptcha-widget-BCNHsgqt.js","sources":["../../src/components/recaptcha-widget/recaptcha-widget.agent.ts","../../src/components/recaptcha-widget/recaptcha-widget.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — RecaptchaWidget. */\n/* */\n/* Recaptcha already exposes a curated `RecaptchaWidgetHandle` via */\n/* useImperativeHandle. The adapter wires `execute` (issue token, write) */\n/* and `reset` (clear token, destructive) into that existing handle. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { RecaptchaWidgetHandle } from './recaptcha-widget';\n\nexport const recaptchaWidgetAgent: AgentAdapter<RecaptchaWidgetHandle> = {\n id: 'recaptcha-widget',\n capabilities: ['submit'],\n state: {\n hasToken: {\n type: 'boolean',\n descriptionKey: 'ui.agent.recaptchaWidget.state.hasToken',\n description:\n 'True when the widget currently holds a valid verification token.',\n read: (handle) => handle.getResponse().length > 0,\n },\n },\n actions: {\n execute: {\n safety: 'write',\n descriptionKey: 'ui.agent.recaptchaWidget.actions.execute',\n description:\n 'Programmatically trigger the captcha challenge. Issues a token via the callback.',\n invoke: (handle) => {\n handle.execute();\n },\n },\n reset: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.recaptchaWidget.actions.reset',\n description:\n 'Clear the current token and re-roll the captcha. Irreversible.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'recaptcha-widget',\n description: 'Marks the RecaptchaWidget wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop (or the surrounding FormField id).',\n },\n },\n};\n","import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useFormField } from '../form-field/form-field-context';\nimport { useTheme } from '../../hooks';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { recaptchaWidgetAgent } from './recaptcha-widget.agent';\n\n/* ------------------------------------------------------------------ */\n/* Loader — idempotent across instances */\n/* ------------------------------------------------------------------ */\n\n/**\n * Google reCAPTCHA v2 ships as a global `grecaptcha` object loaded from\n * `https://www.google.com/recaptcha/api.js`. We lazy-load the script\n * once per page using a shared promise so N widgets on the same form\n * (or N renders of a single widget) all wait on the same fetch.\n *\n * The `?render=explicit` query parameter is required so we control\n * when each widget mounts via `grecaptcha.render`, rather than letting\n * the global auto-bind to every `.g-recaptcha` div on the page.\n */\nconst SCRIPT_SRC = 'https://www.google.com/recaptcha/api.js';\nconst SCRIPT_ID = 'alfadocs-ui-recaptcha-loader';\nconst FOREIGN_LOADER_GRACE_MS = 10_000;\nconst POLL_INTERVAL_MS = 100;\n\ninterface RecaptchaApi {\n render: (\n container: HTMLElement,\n parameters: {\n sitekey: string;\n theme?: 'light' | 'dark';\n size?: 'normal' | 'compact' | 'invisible';\n hl?: string;\n callback?: (token: string) => void;\n 'expired-callback'?: () => void;\n 'error-callback'?: () => void;\n },\n ) => number;\n reset: (widgetId?: number) => void;\n getResponse: (widgetId?: number) => string;\n execute: (widgetId?: number) => void;\n}\n\ndeclare global {\n interface Window {\n grecaptcha?: RecaptchaApi;\n ___grecaptchaOnLoad___?: () => void;\n }\n}\n\nlet loaderPromise: Promise<RecaptchaApi> | null = null;\n\nfunction loadRecaptcha(hl: string | undefined): Promise<RecaptchaApi> {\n if (typeof window === 'undefined') {\n return Promise.reject(new Error('recaptcha: window is not available'));\n }\n if (window.grecaptcha && typeof window.grecaptcha.render === 'function') {\n return Promise.resolve(window.grecaptcha);\n }\n if (loaderPromise) {\n return loaderPromise;\n }\n\n loaderPromise = new Promise<RecaptchaApi>((resolve, reject) => {\n const existing = document.getElementById(\n SCRIPT_ID,\n ) as HTMLScriptElement | null;\n\n const onReady = () => {\n if (window.grecaptcha && typeof window.grecaptcha.render === 'function') {\n resolve(window.grecaptcha);\n } else {\n reject(new Error('recaptcha: grecaptcha global missing after load'));\n }\n };\n\n window.___grecaptchaOnLoad___ = onReady;\n\n if (existing) {\n // Foreign loader present (e.g. host page already injected\n // api.js without ?onload=). Poll for grecaptcha; if it never\n // arrives, inject our own redundant loader with a fresh onload.\n let pollHandle: ReturnType<typeof setInterval> | null = null;\n let timeoutHandle: ReturnType<typeof setTimeout> | null = null;\n const clearTimers = () => {\n if (pollHandle !== null) clearInterval(pollHandle);\n if (timeoutHandle !== null) clearTimeout(timeoutHandle);\n pollHandle = null;\n timeoutHandle = null;\n };\n pollHandle = setInterval(() => {\n if (\n window.grecaptcha &&\n typeof window.grecaptcha.render === 'function'\n ) {\n clearTimers();\n resolve(window.grecaptcha);\n }\n }, POLL_INTERVAL_MS);\n timeoutHandle = setTimeout(() => {\n clearTimers();\n if (\n window.grecaptcha &&\n typeof window.grecaptcha.render === 'function'\n ) {\n resolve(window.grecaptcha);\n return;\n }\n // Foreign loader didn't deliver in time — inject our own.\n const fallbackCb = `___grecaptchaOnLoad___fallback_${Date.now()}___`;\n (window as unknown as Record<string, () => void>)[fallbackCb] = () => {\n delete (window as unknown as Record<string, () => void>)[fallbackCb];\n if (\n window.grecaptcha &&\n typeof window.grecaptcha.render === 'function'\n ) {\n resolve(window.grecaptcha);\n } else {\n reject(\n new Error('recaptcha: grecaptcha global missing after fallback'),\n );\n }\n };\n const fallbackParams = new URLSearchParams({\n onload: fallbackCb,\n render: 'explicit',\n });\n if (hl) fallbackParams.set('hl', hl);\n const fallbackScript = document.createElement('script');\n fallbackScript.src = `${SCRIPT_SRC}?${fallbackParams.toString()}`;\n fallbackScript.async = true;\n fallbackScript.defer = true;\n fallbackScript.onerror = () => {\n delete (window as unknown as Record<string, () => void>)[fallbackCb];\n loaderPromise = null;\n reject(new Error('recaptcha: fallback script failed to load'));\n };\n document.head.appendChild(fallbackScript);\n }, FOREIGN_LOADER_GRACE_MS);\n return;\n }\n\n const params = new URLSearchParams({\n onload: '___grecaptchaOnLoad___',\n render: 'explicit',\n });\n if (hl) params.set('hl', hl);\n\n const script = document.createElement('script');\n script.id = SCRIPT_ID;\n script.src = `${SCRIPT_SRC}?${params.toString()}`;\n script.async = true;\n script.defer = true;\n script.onerror = () => {\n loaderPromise = null;\n reject(new Error('recaptcha: script failed to load'));\n };\n document.head.appendChild(script);\n });\n\n return loaderPromise;\n}\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------ */\n\nexport interface RecaptchaWidgetHandle {\n /** Re-roll the captcha — clears the response token. */\n reset: () => void;\n /** Returns the current response token, or empty string when unsolved. */\n getResponse: () => string;\n /** Programmatically trigger an invisible captcha challenge. */\n execute: () => void;\n}\n\nexport interface RecaptchaWidgetProps {\n /** Google reCAPTCHA v2 site key. Required. */\n siteKey: string;\n /**\n * Visual theme. Defaults to the resolved DS theme (`useTheme`).\n * Pass `'light'` / `'dark'` to force.\n */\n theme?: 'light' | 'dark';\n /** Two-letter locale hint. Defaults to the current i18next language. */\n locale?: string;\n /** Widget size. */\n size?: 'normal' | 'compact' | 'invisible';\n /** Called with the verification token, or `null` when expired/reset. */\n onChange?: (token: string | null) => void;\n /** Called when the user solves but the token then times out. */\n onExpired?: () => void;\n /** Called when the script or challenge errors out. */\n onError?: () => void;\n /** Error message — wires aria-describedby + announces via the live region. */\n error?: string;\n /** Override the DOM id; defaults to the surrounding FormField id. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const RecaptchaWidget = forwardRef<\n RecaptchaWidgetHandle,\n RecaptchaWidgetProps\n>(function RecaptchaWidget(\n {\n siteKey,\n theme,\n locale,\n size = 'normal',\n onChange,\n onExpired,\n onError,\n error,\n id,\n className,\n },\n ref,\n) {\n const { t, i18n } = useTranslation();\n const formField = useFormField();\n const { resolvedTheme } = useTheme();\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const widgetIdRef = useRef<number | null>(null);\n const apiRef = useRef<RecaptchaApi | null>(null);\n const [statusMessage, setStatusMessage] = useState<string>('');\n\n const wrapperId = id ?? formField.id;\n const errorId = error ? `${wrapperId}-error` : undefined;\n const describedBy =\n [formField.describedBy, errorId].filter(Boolean).join(' ') || undefined;\n\n // Mirror the DS theme into reCAPTCHA's two-tone setting.\n const effectiveTheme: 'light' | 'dark' =\n theme ?? (resolvedTheme.startsWith('dark') ? 'dark' : 'light');\n const effectiveLocale = locale ?? i18n.language;\n\n // Stable callbacks via refs so we don't re-render the widget on\n // every parent state change.\n const onChangeRef = useRef(onChange);\n const onExpiredRef = useRef(onExpired);\n const onErrorRef = useRef(onError);\n onChangeRef.current = onChange;\n onExpiredRef.current = onExpired;\n onErrorRef.current = onError;\n\n const expiredLabel = t(\n 'inputs.recaptcha.expired',\n 'Verification expired — please retry.',\n );\n const errorLabel = t(\n 'inputs.recaptcha.error',\n 'Verification failed — please retry.',\n );\n\n useEffect(() => {\n if (!siteKey || !containerRef.current) return;\n let cancelled = false;\n\n loadRecaptcha(effectiveLocale)\n .then((api) => {\n if (cancelled || !containerRef.current) return;\n apiRef.current = api;\n widgetIdRef.current = api.render(containerRef.current, {\n sitekey: siteKey,\n theme: effectiveTheme,\n size,\n hl: effectiveLocale,\n callback: (token) => {\n setStatusMessage('');\n onChangeRef.current?.(token);\n },\n 'expired-callback': () => {\n setStatusMessage(expiredLabel);\n onChangeRef.current?.(null);\n onExpiredRef.current?.();\n },\n 'error-callback': () => {\n setStatusMessage(errorLabel);\n onChangeRef.current?.(null);\n onErrorRef.current?.();\n },\n });\n })\n .catch(() => {\n if (cancelled) return;\n setStatusMessage(errorLabel);\n onErrorRef.current?.();\n });\n\n return () => {\n cancelled = true;\n // grecaptcha has no public destroy. The shared script stays\n // loaded; we reset the widget so its iframe stops listening.\n if (apiRef.current && widgetIdRef.current !== null) {\n try {\n apiRef.current.reset(widgetIdRef.current);\n } catch {\n /* widget id may already be invalid — safe to ignore. */\n }\n }\n };\n // Re-render the widget when the underlying configuration changes.\n }, [\n siteKey,\n effectiveTheme,\n effectiveLocale,\n size,\n expiredLabel,\n errorLabel,\n ]);\n\n const agentHandle = useMemo<RecaptchaWidgetHandle>(\n () => ({\n reset: () => {\n if (apiRef.current && widgetIdRef.current !== null) {\n apiRef.current.reset(widgetIdRef.current);\n setStatusMessage('');\n onChangeRef.current?.(null);\n }\n },\n getResponse: () => {\n if (apiRef.current && widgetIdRef.current !== null) {\n return apiRef.current.getResponse(widgetIdRef.current);\n }\n return '';\n },\n execute: () => {\n if (apiRef.current && widgetIdRef.current !== null) {\n apiRef.current.execute(widgetIdRef.current);\n }\n },\n }),\n [],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(recaptchaWidgetAgent, agentHandle, wrapperId);\n\n const liveMessage = error || statusMessage;\n // For invisible widgets the iframe is offscreen, so we mark the\n // wrapper as a non-visual badge. Otherwise the wrapper just hosts\n // the rendered iframe and contributes no interactive role itself.\n const wrapperRole = size === 'invisible' ? 'presentation' : undefined;\n\n return (\n <div\n className={[\n 'ds:inline-block',\n // Keep the iframe inside the wrapper's stacking context so\n // popovers etc. above the form continue to overlay correctly.\n 'ds:relative ds:isolate',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n data-component=\"recaptcha-widget\"\n data-component-id={wrapperId}\n data-size={size}\n role={wrapperRole}\n >\n <div\n ref={containerRef}\n id={wrapperId}\n // The class name is the canonical hook Google's verifier\n // looks for when the page form is submitted server-side. Some\n // Symfony / Laravel validators short-circuit when this class\n // is missing, so we render it even though we're using\n // grecaptcha.render explicitly.\n className=\"g-recaptcha\"\n data-sitekey={siteKey}\n data-theme={effectiveTheme}\n data-size={size}\n aria-describedby={describedBy}\n aria-invalid={error || formField.invalid ? true : undefined}\n />\n {/* Live announcement for expired / error states. Empty when the\n widget is healthy so SR users aren't spammed. */}\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n >\n {liveMessage}\n </div>\n </div>\n );\n});\n\nRecaptchaWidget.displayName = 'RecaptchaWidget';\n"],"names":["recaptchaWidgetAgent","handle","SCRIPT_SRC","SCRIPT_ID","FOREIGN_LOADER_GRACE_MS","POLL_INTERVAL_MS","loaderPromise","loadRecaptcha","hl","resolve","reject","existing","onReady","pollHandle","timeoutHandle","clearTimers","fallbackCb","fallbackParams","fallbackScript","params","script","RecaptchaWidget","forwardRef","siteKey","theme","locale","size","onChange","onExpired","onError","error","id","className","ref","t","i18n","useTranslation","formField","useFormField","resolvedTheme","useTheme","containerRef","useRef","widgetIdRef","apiRef","statusMessage","setStatusMessage","useState","wrapperId","errorId","describedBy","effectiveTheme","effectiveLocale","onChangeRef","onExpiredRef","onErrorRef","expiredLabel","errorLabel","useEffect","cancelled","api","token","_a","_b","agentHandle","useMemo","useImperativeHandle","useAgentRegistration","liveMessage","wrapperRole","jsxs","jsx"],"mappings":"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"}
|