@redacto.io/consent-sdk-react 10.0.0-beta.8 → 10.0.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 (262) hide show
  1. package/NOTICE.md +17 -0
  2. package/README.md +141 -3
  3. package/dist/chunk-FEGTW73Q.mjs +182 -0
  4. package/dist/{chunk-6A665OPR.mjs → chunk-OGL6OC3A.mjs} +4 -0
  5. package/dist/fonts.d.mts +35 -0
  6. package/dist/fonts.d.ts +35 -0
  7. package/dist/fonts.js +183 -0
  8. package/dist/fonts.mjs +10 -0
  9. package/dist/index.d.mts +41 -4
  10. package/dist/index.d.ts +41 -4
  11. package/dist/index.js +881 -416
  12. package/dist/index.mjs +502 -253
  13. package/dist/montserrat.generated-NBTECYRW.mjs +22 -0
  14. package/dist/privacy-center.d.mts +51 -11
  15. package/dist/privacy-center.d.ts +51 -11
  16. package/dist/privacy-center.js +252 -136
  17. package/dist/privacy-center.mjs +251 -137
  18. package/dist/types-6Aj7faxL.d.mts +57 -0
  19. package/dist/types-6Aj7faxL.d.ts +57 -0
  20. package/package.json +10 -1
  21. package/.turbo/turbo-build.log +0 -22
  22. package/.turbo/turbo-test.log +0 -203
  23. package/.turbo/turbo-verify-pack.log +0 -6
  24. package/CHANGELOG.md +0 -343
  25. package/src/RedactoNoticeAssisted/RedactoNoticeAssisted.test.tsx +0 -934
  26. package/src/RedactoNoticeAssisted/RedactoNoticeAssisted.tsx +0 -2160
  27. package/src/RedactoNoticeAssisted/api/index.ts +0 -275
  28. package/src/RedactoNoticeAssisted/api/types.ts +0 -182
  29. package/src/RedactoNoticeAssisted/assets/redacto-logo.png +0 -0
  30. package/src/RedactoNoticeAssisted/constants.ts +0 -51
  31. package/src/RedactoNoticeAssisted/i18n.ts +0 -1408
  32. package/src/RedactoNoticeAssisted/index.ts +0 -1
  33. package/src/RedactoNoticeAssisted/injectStyles.ts +0 -251
  34. package/src/RedactoNoticeAssisted/styles.ts +0 -730
  35. package/src/RedactoNoticeAssisted/types.ts +0 -26
  36. package/src/RedactoNoticeAssisted/useMediaQuery.ts +0 -36
  37. package/src/RedactoNoticeConsent/RedactoNoticeConsent.test.tsx +0 -1152
  38. package/src/RedactoNoticeConsent/RedactoNoticeConsent.tsx +0 -4258
  39. package/src/RedactoNoticeConsent/api/index.ts +0 -512
  40. package/src/RedactoNoticeConsent/api/types.ts +0 -469
  41. package/src/RedactoNoticeConsent/assets/redacto-logo.png +0 -0
  42. package/src/RedactoNoticeConsent/components/DigiLockerCallback.tsx +0 -602
  43. package/src/RedactoNoticeConsent/components/index.ts +0 -7
  44. package/src/RedactoNoticeConsent/constants.ts +0 -20
  45. package/src/RedactoNoticeConsent/index.ts +0 -1
  46. package/src/RedactoNoticeConsent/injectStyles.ts +0 -151
  47. package/src/RedactoNoticeConsent/language-codes.ts +0 -95
  48. package/src/RedactoNoticeConsent/services/storage.ts +0 -122
  49. package/src/RedactoNoticeConsent/styles.ts +0 -409
  50. package/src/RedactoNoticeConsent/types.ts +0 -54
  51. package/src/RedactoNoticeConsent/useMediaQuery.ts +0 -36
  52. package/src/RedactoNoticeConsentInline/RedactoNoticeConsentInline.test.tsx +0 -369
  53. package/src/RedactoNoticeConsentInline/RedactoNoticeConsentInline.tsx +0 -687
  54. package/src/RedactoNoticeConsentInline/api/index.ts +0 -106
  55. package/src/RedactoNoticeConsentInline/api/types.ts +0 -183
  56. package/src/RedactoNoticeConsentInline/assets/redacto-logo.png +0 -0
  57. package/src/RedactoNoticeConsentInline/index.ts +0 -1
  58. package/src/RedactoNoticeConsentInline/injectStyles.ts +0 -40
  59. package/src/RedactoNoticeConsentInline/styles.ts +0 -397
  60. package/src/RedactoNoticeConsentInline/types.ts +0 -51
  61. package/src/RedactoNoticeConsentInline/useMediaQuery.ts +0 -36
  62. package/src/RedactoPrivacyCenter/NotificationsPage.tsx +0 -182
  63. package/src/RedactoPrivacyCenter/PrivacyCenterActivityPage.tsx +0 -19
  64. package/src/RedactoPrivacyCenter/PrivacyCenterCaseDetailsPage.tsx +0 -156
  65. package/src/RedactoPrivacyCenter/PrivacyCenterConsentManagerPage.tsx +0 -17
  66. package/src/RedactoPrivacyCenter/PrivacyCenterFormPage.tsx +0 -79
  67. package/src/RedactoPrivacyCenter/PrivacyCenterHomePage.tsx +0 -36
  68. package/src/RedactoPrivacyCenter/PrivacyCenterLayout.tsx +0 -177
  69. package/src/RedactoPrivacyCenter/PrivacyCenterMyReceiptPage.tsx +0 -26
  70. package/src/RedactoPrivacyCenter/RedactoPrivacyCenter.tsx +0 -58
  71. package/src/RedactoPrivacyCenter/api/actions.ts +0 -695
  72. package/src/RedactoPrivacyCenter/api/client.ts +0 -911
  73. package/src/RedactoPrivacyCenter/api/config.ts +0 -33
  74. package/src/RedactoPrivacyCenter/api/fetcher.ts +0 -260
  75. package/src/RedactoPrivacyCenter/api/orgBranding.ts +0 -16
  76. package/src/RedactoPrivacyCenter/api/upload.ts +0 -93
  77. package/src/RedactoPrivacyCenter/assets/character.svg +0 -31
  78. package/src/RedactoPrivacyCenter/assets/fileAttach.svg +0 -9
  79. package/src/RedactoPrivacyCenter/assets/greenTick.svg +0 -4
  80. package/src/RedactoPrivacyCenter/assets/mail.svg +0 -3
  81. package/src/RedactoPrivacyCenter/assets/poweredByRedacto.svg +0 -9
  82. package/src/RedactoPrivacyCenter/assets/sentImg.svg +0 -9
  83. package/src/RedactoPrivacyCenter/assets/uploadFileIcon.svg +0 -9
  84. package/src/RedactoPrivacyCenter/components/ActivitiesList.tsx +0 -252
  85. package/src/RedactoPrivacyCenter/components/ActivityTimeline.tsx +0 -239
  86. package/src/RedactoPrivacyCenter/components/AppShell/AppShell.tsx +0 -268
  87. package/src/RedactoPrivacyCenter/components/AppShell/MobileNavDrawer.tsx +0 -218
  88. package/src/RedactoPrivacyCenter/components/AppShell/NavItem.tsx +0 -205
  89. package/src/RedactoPrivacyCenter/components/AppShell/PageHeader.tsx +0 -107
  90. package/src/RedactoPrivacyCenter/components/AppShell/SidebarNav.tsx +0 -100
  91. package/src/RedactoPrivacyCenter/components/AppShell/TopAppBar.tsx +0 -339
  92. package/src/RedactoPrivacyCenter/components/AppShell/UserMenu.tsx +0 -245
  93. package/src/RedactoPrivacyCenter/components/AppShell/hooks/useIsTruncated.ts +0 -28
  94. package/src/RedactoPrivacyCenter/components/AppShell/hooks/useKeyboardShortcut.ts +0 -40
  95. package/src/RedactoPrivacyCenter/components/AppShell/hooks/useSidebarState.ts +0 -62
  96. package/src/RedactoPrivacyCenter/components/AppShell/usePrivacyCenterExitAction.ts +0 -36
  97. package/src/RedactoPrivacyCenter/components/CaseDetails/AttachmentCard.tsx +0 -38
  98. package/src/RedactoPrivacyCenter/components/CaseDetails/ChatBubble.tsx +0 -31
  99. package/src/RedactoPrivacyCenter/components/CaseDetails/DocumentRequestCard.tsx +0 -79
  100. package/src/RedactoPrivacyCenter/components/CaseDetails/FinalizedTooltipWrapper.tsx +0 -25
  101. package/src/RedactoPrivacyCenter/components/CaseDetails/MessageComposer.tsx +0 -96
  102. package/src/RedactoPrivacyCenter/components/CaseDetails/MessageItem.tsx +0 -97
  103. package/src/RedactoPrivacyCenter/components/CaseDetails/MessagesTab.tsx +0 -156
  104. package/src/RedactoPrivacyCenter/components/CaseDetails/RequestDetailsTab.tsx +0 -171
  105. package/src/RedactoPrivacyCenter/components/CaseDetails/StatusEvent.tsx +0 -23
  106. package/src/RedactoPrivacyCenter/components/CaseDetails/useFileUpload.ts +0 -116
  107. package/src/RedactoPrivacyCenter/components/CaseDetails/useMessagePolling.ts +0 -43
  108. package/src/RedactoPrivacyCenter/components/CaseDetails/utils.ts +0 -71
  109. package/src/RedactoPrivacyCenter/components/CaseDetailsModal.tsx +0 -469
  110. package/src/RedactoPrivacyCenter/components/CaseHistory.tsx +0 -426
  111. package/src/RedactoPrivacyCenter/components/ConsentManager.tsx +0 -1206
  112. package/src/RedactoPrivacyCenter/components/ConsentManagerCells.tsx +0 -218
  113. package/src/RedactoPrivacyCenter/components/ConsentManagerColumns.tsx +0 -138
  114. package/src/RedactoPrivacyCenter/components/ConsentManagerConstants.ts +0 -7
  115. package/src/RedactoPrivacyCenter/components/ConsentManagerExpandedRow.tsx +0 -179
  116. package/src/RedactoPrivacyCenter/components/ConsentManagerGroupedColumns.tsx +0 -318
  117. package/src/RedactoPrivacyCenter/components/ConsentManagerProductCards.tsx +0 -333
  118. package/src/RedactoPrivacyCenter/components/ConsentManagerPurposeCards.tsx +0 -102
  119. package/src/RedactoPrivacyCenter/components/ConsentManagerTableSkeleton.tsx +0 -159
  120. package/src/RedactoPrivacyCenter/components/DataRequest/CorrectionDataSection.tsx +0 -189
  121. package/src/RedactoPrivacyCenter/components/DataRequest/GrievanceDataSection.tsx +0 -118
  122. package/src/RedactoPrivacyCenter/components/DataRequest/NominationDataSection.tsx +0 -66
  123. package/src/RedactoPrivacyCenter/components/DataRequest/ProductSelectionSection.tsx +0 -222
  124. package/src/RedactoPrivacyCenter/components/DataRequest/PurposeSelectionSection.tsx +0 -331
  125. package/src/RedactoPrivacyCenter/components/Form.tsx +0 -1796
  126. package/src/RedactoPrivacyCenter/components/GrievanceTable.tsx +0 -174
  127. package/src/RedactoPrivacyCenter/components/GrievanceTablePagination.tsx +0 -337
  128. package/src/RedactoPrivacyCenter/components/ModifyConsentModal.tsx +0 -334
  129. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationBell.tsx +0 -173
  130. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationCTAButton.tsx +0 -18
  131. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationDropdown.tsx +0 -54
  132. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationDropdownItem.tsx +0 -57
  133. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationIcon.tsx +0 -19
  134. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationListPanel.tsx +0 -92
  135. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationRefreshButton.tsx +0 -20
  136. package/src/RedactoPrivacyCenter/components/NotificationHub/NotificationRow.tsx +0 -58
  137. package/src/RedactoPrivacyCenter/components/NotificationHub/StatCard.tsx +0 -10
  138. package/src/RedactoPrivacyCenter/components/NotificationHub/useNotificationActions.ts +0 -112
  139. package/src/RedactoPrivacyCenter/components/NotificationHub/utils.ts +0 -27
  140. package/src/RedactoPrivacyCenter/components/Pagination.tsx +0 -140
  141. package/src/RedactoPrivacyCenter/components/PrivacyCenterEmptyState.tsx +0 -76
  142. package/src/RedactoPrivacyCenter/components/PrivacyCenterSessionExpired.tsx +0 -97
  143. package/src/RedactoPrivacyCenter/components/ReceiptsList.tsx +0 -454
  144. package/src/RedactoPrivacyCenter/components/RequestSubmit.tsx +0 -270
  145. package/src/RedactoPrivacyCenter/components/SelectUser.tsx +0 -95
  146. package/src/RedactoPrivacyCenter/components/SelectUserGate.tsx +0 -187
  147. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/constants.tsx +0 -25
  148. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/types.ts +0 -21
  149. package/src/RedactoPrivacyCenter/components/caseHistoryColumns.tsx +0 -159
  150. package/src/RedactoPrivacyCenter/components/constant.ts +0 -52
  151. package/src/RedactoPrivacyCenter/components/groupHelpers.ts +0 -119
  152. package/src/RedactoPrivacyCenter/components/receiptColumns.tsx +0 -203
  153. package/src/RedactoPrivacyCenter/components/types.ts +0 -123
  154. package/src/RedactoPrivacyCenter/components/utils.tsx +0 -10
  155. package/src/RedactoPrivacyCenter/config/routes.ts +0 -9
  156. package/src/RedactoPrivacyCenter/config/table.ts +0 -25
  157. package/src/RedactoPrivacyCenter/context/AuthContext.tsx +0 -160
  158. package/src/RedactoPrivacyCenter/context/BaseUrlContext.tsx +0 -47
  159. package/src/RedactoPrivacyCenter/context/BrandingContext.tsx +0 -52
  160. package/src/RedactoPrivacyCenter/context/DataAvailabilityContext.session-expired.test.tsx +0 -92
  161. package/src/RedactoPrivacyCenter/context/DataAvailabilityContext.tsx +0 -181
  162. package/src/RedactoPrivacyCenter/context/LocaleContext.tsx +0 -11
  163. package/src/RedactoPrivacyCenter/context/NavigationContext.tsx +0 -96
  164. package/src/RedactoPrivacyCenter/context/OrganizationContext.tsx +0 -30
  165. package/src/RedactoPrivacyCenter/context/PageChromeContext.tsx +0 -80
  166. package/src/RedactoPrivacyCenter/context/ProfileSwitchContext.tsx +0 -15
  167. package/src/RedactoPrivacyCenter/context/types.ts +0 -19
  168. package/src/RedactoPrivacyCenter/lib/api.ts +0 -759
  169. package/src/RedactoPrivacyCenter/lib/consent-manager/utils.tsx +0 -67
  170. package/src/RedactoPrivacyCenter/lib/constants.ts +0 -276
  171. package/src/RedactoPrivacyCenter/lib/i18n.ts +0 -81
  172. package/src/RedactoPrivacyCenter/lib/locales.ts +0 -102
  173. package/src/RedactoPrivacyCenter/lib/queries.ts +0 -141
  174. package/src/RedactoPrivacyCenter/lib/types.ts +0 -876
  175. package/src/RedactoPrivacyCenter/lib/useCurrentLanguage.ts +0 -37
  176. package/src/RedactoPrivacyCenter/lib/utils.refresh-circuit.test.ts +0 -127
  177. package/src/RedactoPrivacyCenter/lib/utils.refresh-storage.test.ts +0 -85
  178. package/src/RedactoPrivacyCenter/lib/utils.session-expired.test.ts +0 -109
  179. package/src/RedactoPrivacyCenter/lib/utils.ts +0 -783
  180. package/src/RedactoPrivacyCenter/locales/as/translation.json +0 -342
  181. package/src/RedactoPrivacyCenter/locales/bn/translation.json +0 -342
  182. package/src/RedactoPrivacyCenter/locales/brx/translation.json +0 -342
  183. package/src/RedactoPrivacyCenter/locales/doi/translation.json +0 -342
  184. package/src/RedactoPrivacyCenter/locales/en/translation.json +0 -357
  185. package/src/RedactoPrivacyCenter/locales/gom/translation.json +0 -342
  186. package/src/RedactoPrivacyCenter/locales/gu/translation.json +0 -342
  187. package/src/RedactoPrivacyCenter/locales/hi/translation.json +0 -345
  188. package/src/RedactoPrivacyCenter/locales/kn/translation.json +0 -342
  189. package/src/RedactoPrivacyCenter/locales/ks/translation.json +0 -342
  190. package/src/RedactoPrivacyCenter/locales/mai/translation.json +0 -342
  191. package/src/RedactoPrivacyCenter/locales/ml/translation.json +0 -342
  192. package/src/RedactoPrivacyCenter/locales/mni-Mtei/translation.json +0 -342
  193. package/src/RedactoPrivacyCenter/locales/mr/translation.json +0 -342
  194. package/src/RedactoPrivacyCenter/locales/ne/translation.json +0 -342
  195. package/src/RedactoPrivacyCenter/locales/or/translation.json +0 -342
  196. package/src/RedactoPrivacyCenter/locales/pa/translation.json +0 -342
  197. package/src/RedactoPrivacyCenter/locales/sa/translation.json +0 -342
  198. package/src/RedactoPrivacyCenter/locales/sat/translation.json +0 -342
  199. package/src/RedactoPrivacyCenter/locales/sd/translation.json +0 -342
  200. package/src/RedactoPrivacyCenter/locales/ta/translation.json +0 -342
  201. package/src/RedactoPrivacyCenter/locales/te/translation.json +0 -342
  202. package/src/RedactoPrivacyCenter/locales/ur/translation.json +0 -342
  203. package/src/RedactoPrivacyCenter/styles/applyBrandingTheme.ts +0 -66
  204. package/src/RedactoPrivacyCenter/styles/base.css +0 -117
  205. package/src/RedactoPrivacyCenter/styles/injectStyles.ts +0 -3108
  206. package/src/RedactoPrivacyCenter/styles/pcStyles.ts +0 -831
  207. package/src/RedactoPrivacyCenter/styles/responsive.ts +0 -138
  208. package/src/RedactoPrivacyCenter/styles/variables.css +0 -96
  209. package/src/RedactoPrivacyCenter/table/AdvancedTable.tsx +0 -387
  210. package/src/RedactoPrivacyCenter/table/AdvancedTablePagination.tsx +0 -468
  211. package/src/RedactoPrivacyCenter/table/index.ts +0 -2
  212. package/src/RedactoPrivacyCenter/types/images.d.ts +0 -29
  213. package/src/RedactoPrivacyCenter/ui/Footer.tsx +0 -69
  214. package/src/RedactoPrivacyCenter/ui/FormBlockWrapper.tsx +0 -54
  215. package/src/RedactoPrivacyCenter/ui/PCAccordion.tsx +0 -93
  216. package/src/RedactoPrivacyCenter/ui/PCActionIcon.tsx +0 -47
  217. package/src/RedactoPrivacyCenter/ui/PCAvatar.test.tsx +0 -83
  218. package/src/RedactoPrivacyCenter/ui/PCAvatar.tsx +0 -93
  219. package/src/RedactoPrivacyCenter/ui/PCBadge.tsx +0 -48
  220. package/src/RedactoPrivacyCenter/ui/PCButton.tsx +0 -77
  221. package/src/RedactoPrivacyCenter/ui/PCCheckbox.tsx +0 -55
  222. package/src/RedactoPrivacyCenter/ui/PCCollapse.tsx +0 -107
  223. package/src/RedactoPrivacyCenter/ui/PCEmpty.tsx +0 -35
  224. package/src/RedactoPrivacyCenter/ui/PCInput.tsx +0 -132
  225. package/src/RedactoPrivacyCenter/ui/PCLoader.tsx +0 -31
  226. package/src/RedactoPrivacyCenter/ui/PCModal.tsx +0 -106
  227. package/src/RedactoPrivacyCenter/ui/PCPopover.tsx +0 -206
  228. package/src/RedactoPrivacyCenter/ui/PCSelect.tsx +0 -433
  229. package/src/RedactoPrivacyCenter/ui/PCTable.tsx +0 -149
  230. package/src/RedactoPrivacyCenter/ui/PCText.tsx +0 -41
  231. package/src/RedactoPrivacyCenter/ui/PCTextarea.tsx +0 -43
  232. package/src/RedactoPrivacyCenter/ui/PCTitle.tsx +0 -37
  233. package/src/RedactoPrivacyCenter/ui/PCTooltip.tsx +0 -121
  234. package/src/RedactoPrivacyCenter/ui/SimpleBar.tsx +0 -25
  235. package/src/RedactoPrivacyCenter/ui/StatusBadge.tsx +0 -53
  236. package/src/RedactoPrivacyCenter/ui/index.ts +0 -18
  237. package/src/RedactoPrivacyCenter/utils/cn.ts +0 -28
  238. package/src/RedactoPrivacyCenter/utils/date.ts +0 -48
  239. package/src/RedactoPrivacyCenter/utils/status.ts +0 -111
  240. package/src/RedactoPrivacyCenter/utils/toast.ts +0 -130
  241. package/src/index.ts +0 -19
  242. package/src/privacy-center.ts +0 -113
  243. package/src/shared/api-errors.ts +0 -180
  244. package/src/shared/notice-consent-status.ts +0 -190
  245. package/src/types/css.d.ts +0 -4
  246. package/src/types/images.d.ts +0 -19
  247. package/src/types/react-jsx.d.ts +0 -26
  248. package/tests/DataAvailabilityContext.test.tsx +0 -123
  249. package/tests/Form.test.tsx +0 -1287
  250. package/tests/ManageConsentErrorMapping.test.tsx +0 -85
  251. package/tests/ProductSelectionSection.test.tsx +0 -328
  252. package/tests/RequestSubmit.test.tsx +0 -135
  253. package/tests/RevocablePurpose.test.tsx +0 -146
  254. package/tests/RevokeWarningMessage.test.tsx +0 -151
  255. package/tests/consentClient.test.ts +0 -217
  256. package/tests/manageConsentServer.test.ts +0 -38
  257. package/tests/mocks.ts +0 -257
  258. package/tests/resolveContactFromJwt.test.ts +0 -44
  259. package/tests/setup.ts +0 -16
  260. package/tsconfig.json +0 -16
  261. package/tsup.config.ts +0 -31
  262. package/vitest.config.ts +0 -16
package/dist/index.mjs CHANGED
@@ -1,9 +1,20 @@
1
1
  import {
2
+ SANDBOX_TOKEN_HEADER,
2
3
  useMediaQuery
3
- } from "./chunk-6A665OPR.mjs";
4
+ } from "./chunk-OGL6OC3A.mjs";
5
+ import {
6
+ FONT_FAMILY_SEPARATOR,
7
+ FONT_NAME_QUOTE_CHARACTERS,
8
+ NOTICE_FONT_ENTRY_BY_ID,
9
+ NOTICE_FONT_FACE_STYLE_ID_PREFIX,
10
+ NOTICE_FONT_LOAD_ERROR_MESSAGE,
11
+ NOTICE_FONT_ROOT_PROPS,
12
+ injectNoticeFontStyles,
13
+ resolveNoticeFontFamily
14
+ } from "./chunk-FEGTW73Q.mjs";
4
15
 
5
16
  // src/RedactoNoticeConsent/RedactoNoticeConsent.tsx
6
- import { useCallback, useEffect, useMemo, useRef, useState } from "react";
17
+ import { useCallback, useEffect as useEffect2, useMemo as useMemo2, useRef, useState } from "react";
7
18
 
8
19
  // src/RedactoNoticeConsent/api/index.ts
9
20
  import { jwtDecode as jwtDecode2 } from "jwt-decode";
@@ -66,6 +77,64 @@ async function parseApiError(response, fallbackMessage) {
66
77
  });
67
78
  }
68
79
 
80
+ // src/RedactoNoticeConsent/api/sandbox.ts
81
+ var resolveSandboxAuth = (params) => {
82
+ var _a, _b, _c, _d, _e;
83
+ const token = (_a = params.token) == null ? void 0 : _a.trim();
84
+ if (!token) {
85
+ return null;
86
+ }
87
+ const organisationUuid = (_b = params.organisationUuid) == null ? void 0 : _b.trim();
88
+ const workspaceUuid = (_c = params.workspaceUuid) == null ? void 0 : _c.trim();
89
+ const ucic = (_d = params.sandboxUcic) == null ? void 0 : _d.trim();
90
+ const subject = (_e = params.sandboxSubject) == null ? void 0 : _e.trim();
91
+ if (!organisationUuid || !workspaceUuid) {
92
+ throw new Error(
93
+ "Sandbox mode requires organisationUuid and workspaceUuid props"
94
+ );
95
+ }
96
+ if (!ucic && !subject) {
97
+ throw new Error("Sandbox mode requires a UCIC, email, or mobile");
98
+ }
99
+ return { token, ucic, subject: subject != null ? subject : "", organisationUuid, workspaceUuid };
100
+ };
101
+ var resolveRequestAuth = (accessToken, sandboxParams, decodeTokenSafely2) => {
102
+ const sandbox = resolveSandboxAuth(sandboxParams);
103
+ if (sandbox) {
104
+ return {
105
+ organisationUuid: sandbox.organisationUuid,
106
+ workspaceUuid: sandbox.workspaceUuid,
107
+ sandbox
108
+ };
109
+ }
110
+ const decodedToken = accessToken ? decodeTokenSafely2(accessToken) : null;
111
+ if (!decodedToken) {
112
+ throw new Error("Invalid access token");
113
+ }
114
+ const { organisation_uuid, workspace_uuid } = decodedToken;
115
+ if (!organisation_uuid || !workspace_uuid) {
116
+ throw new Error("Invalid token: missing organization or workspace UUID");
117
+ }
118
+ return {
119
+ organisationUuid: organisation_uuid,
120
+ workspaceUuid: workspace_uuid,
121
+ sandbox: null
122
+ };
123
+ };
124
+ var buildAuthHeaders = (accessToken, sandbox) => {
125
+ if (sandbox) {
126
+ return { [SANDBOX_TOKEN_HEADER]: sandbox.token };
127
+ }
128
+ return { Authorization: `Bearer ${accessToken}` };
129
+ };
130
+ var sandboxBodyIdentity = (sandbox) => {
131
+ if (sandbox.ucic) {
132
+ return { org_user_id: sandbox.ucic };
133
+ }
134
+ return sandbox.subject.includes("@") ? { primary_email: sandbox.subject } : { primary_mobile: sandbox.subject };
135
+ };
136
+ var sandboxQueryIdentity = (sandbox) => sandboxBodyIdentity(sandbox);
137
+
69
138
  // src/shared/notice-consent-status.ts
70
139
  import { jwtDecode } from "jwt-decode";
71
140
  var decodeNoticeConsentToken = (token) => {
@@ -179,21 +248,19 @@ var fetchConsentContent = async ({
179
248
  specific_uuid,
180
249
  validate_against = "all",
181
250
  include_fully_consented_data = false,
182
- signal
251
+ signal,
252
+ ...sandboxParams
183
253
  }) => {
184
- if (!noticeId || !accessToken || !validate_against) {
185
- throw new Error("noticeId and accessToken are required");
254
+ if (!noticeId || !validate_against) {
255
+ throw new Error("noticeId is required");
186
256
  }
187
- const decodedToken = decodeTokenSafely(accessToken);
188
- if (!decodedToken) {
189
- throw new Error("Invalid access token");
190
- }
191
- const { organisation_uuid: ORGANISATION_UUID, workspace_uuid: WORKSPACE_UUID } = decodedToken;
192
- if (!ORGANISATION_UUID || !WORKSPACE_UUID) {
193
- throw new Error("Invalid token: missing organization or workspace UUID");
257
+ if (!accessToken && !sandboxParams.token) {
258
+ throw new Error("accessToken or token is required");
194
259
  }
260
+ const { organisationUuid: ORGANISATION_UUID, workspaceUuid: WORKSPACE_UUID, sandbox } = resolveRequestAuth(accessToken, sandboxParams, decodeTokenSafely);
195
261
  const apiBaseUrl = baseUrl || BASE_URL;
196
- const cacheKey = `${accessToken}-${noticeId}-${validate_against}-${language}-${specific_uuid || ""}-${include_fully_consented_data}`;
262
+ const cacheIdentity = sandbox ? `sandbox:${sandbox.organisationUuid}:${sandbox.workspaceUuid}:${sandbox.ucic || sandbox.subject}` : accessToken;
263
+ const cacheKey = `${cacheIdentity}-${noticeId}-${validate_against}-${language}-${specific_uuid || ""}-${include_fully_consented_data}`;
197
264
  if (validate_against === "all" && !specific_uuid) {
198
265
  const cachedData = getCachedData(cacheKey);
199
266
  if (cachedData) {
@@ -210,10 +277,15 @@ var fetchConsentContent = async ({
210
277
  if (include_fully_consented_data) {
211
278
  url.searchParams.append("include_fully_consented_data", "true");
212
279
  }
280
+ if (sandbox) {
281
+ for (const [key, value] of Object.entries(sandboxQueryIdentity(sandbox))) {
282
+ url.searchParams.append(key, value);
283
+ }
284
+ }
213
285
  const response = await fetch(url.toString(), {
214
286
  method: "GET",
215
287
  headers: {
216
- Authorization: `Bearer ${accessToken}`,
288
+ ...buildAuthHeaders(accessToken, sandbox),
217
289
  "Accept-Language": language
218
290
  },
219
291
  signal
@@ -241,20 +313,17 @@ var submitConsentEvent = async ({
241
313
  meta_data,
242
314
  guardianVerificationReference,
243
315
  selfDeclaredAdult,
244
- signal
316
+ signal,
317
+ ...sandboxParams
245
318
  }) => {
246
- if (!noticeUuid || !accessToken || !Array.isArray(purposes)) {
247
- throw new Error("noticeUuid, accessToken, and purposes array are required");
248
- }
249
- const decodedToken = decodeTokenSafely(accessToken);
250
- if (!decodedToken) {
251
- throw new Error("Invalid access token");
319
+ if (!noticeUuid || !Array.isArray(purposes)) {
320
+ throw new Error("noticeUuid and purposes array are required");
252
321
  }
253
- const { organisation_uuid: ORGANISATION_UUID, workspace_uuid: WORKSPACE_UUID } = decodedToken;
254
- if (!ORGANISATION_UUID || !WORKSPACE_UUID) {
255
- throw new Error("Invalid token: missing organization or workspace UUID");
322
+ if (!accessToken && !sandboxParams.token) {
323
+ throw new Error("accessToken or token is required");
256
324
  }
257
- const apiBaseUrl = ledgerBaseUrl || baseUrl || BASE_URL;
325
+ const { organisationUuid: ORGANISATION_UUID, workspaceUuid: WORKSPACE_UUID, sandbox } = resolveRequestAuth(accessToken, sandboxParams, decodeTokenSafely);
326
+ const apiBaseUrl = (sandbox ? null : ledgerBaseUrl) || baseUrl || BASE_URL;
258
327
  const validatedPurposes = purposes.map((purpose) => {
259
328
  if (!purpose.uuid) {
260
329
  throw new Error(`Invalid purpose data: missing uuid`);
@@ -280,15 +349,16 @@ var submitConsentEvent = async ({
280
349
  guardian_verification_reference: guardianVerificationReference,
281
350
  self_declared_adult: selfDeclaredAdult
282
351
  };
352
+ const requestBody = sandbox ? { ...payload, ...sandboxBodyIdentity(sandbox) } : payload;
283
353
  const response = await fetch(
284
354
  `${apiBaseUrl}/public/organisations/${ORGANISATION_UUID}/workspaces/${WORKSPACE_UUID}/submit-consent`,
285
355
  {
286
356
  method: "POST",
287
357
  headers: {
288
- Authorization: `Bearer ${accessToken}`,
358
+ ...buildAuthHeaders(accessToken, sandbox),
289
359
  "Content-Type": "application/json"
290
360
  },
291
- body: JSON.stringify(payload),
361
+ body: JSON.stringify(requestBody),
292
362
  signal
293
363
  }
294
364
  );
@@ -300,69 +370,32 @@ var submitConsentEvent = async ({
300
370
  }
301
371
  apiCache.clear();
302
372
  };
303
- var buildLedgerConsentOverlay = (status, configPurposes) => {
304
- var _a, _b;
305
- const byUuid = new Map(status.purposes.map((p) => [p.uuid, p]));
306
- const hasHistory = status.purposes.some(
307
- (p) => (p.status || "INACTIVE") !== "INACTIVE"
308
- );
309
- if (!hasHistory) {
310
- return null;
311
- }
312
- const purpose_selections = {};
313
- for (const cp of configPurposes) {
314
- const lp = byUuid.get(cp.uuid);
315
- const purposeStatus = (lp == null ? void 0 : lp.status) || "INACTIVE";
316
- const selectedByUuid = new Map(
317
- ((lp == null ? void 0 : lp.data_elements) || []).map((de) => [de.uuid, de.selected])
318
- );
319
- const data_elements = {};
320
- for (const de of cp.data_elements) {
321
- data_elements[de.uuid] = {
322
- selected: (_a = selectedByUuid.get(de.uuid)) != null ? _a : false,
323
- enabled: de.enabled,
324
- required: de.required
325
- };
326
- }
327
- purpose_selections[cp.uuid] = {
328
- selected: (_b = lp == null ? void 0 : lp.selected) != null ? _b : false,
329
- status: purposeStatus,
330
- needs_reconsent: purposeStatus !== "ACTIVE",
331
- data_elements
332
- };
333
- }
334
- const reconsent_required = configPurposes.some(
335
- (cp) => {
336
- var _a2;
337
- return (((_a2 = purpose_selections[cp.uuid]) == null ? void 0 : _a2.status) || "INACTIVE") !== "ACTIVE";
338
- }
339
- );
340
- return { reconsent_required, purpose_selections };
341
- };
342
373
  var fetchTTSAudioUrls = async ({
343
374
  accessToken,
344
375
  baseUrl,
376
+ ledgerBaseUrl,
345
377
  noticeUuid,
346
378
  language,
347
- signal
379
+ signal,
380
+ ...sandboxParams
348
381
  }) => {
349
- if (!accessToken || !noticeUuid || !language) {
350
- throw new Error("accessToken, noticeUuid, and language are required");
382
+ if (!accessToken && !sandboxParams.token || !noticeUuid || !language) {
383
+ throw new Error("accessToken (or token), noticeUuid, and language are required");
351
384
  }
352
- const decodedToken = decodeTokenSafely(accessToken);
353
- if (!decodedToken) {
354
- throw new Error("Invalid access token");
355
- }
356
- const { organisation_uuid: ORGANISATION_UUID, workspace_uuid: WORKSPACE_UUID } = decodedToken;
357
- if (!ORGANISATION_UUID || !WORKSPACE_UUID) {
358
- throw new Error("Invalid token: missing organization or workspace UUID");
385
+ const { organisationUuid: ORGANISATION_UUID, workspaceUuid: WORKSPACE_UUID, sandbox } = resolveRequestAuth(accessToken, sandboxParams, decodeTokenSafely);
386
+ const apiBaseUrl = (sandbox ? null : ledgerBaseUrl) || baseUrl || BASE_URL;
387
+ const url = new URL(
388
+ `${apiBaseUrl}/public/organisations/${ORGANISATION_UUID}/workspaces/${WORKSPACE_UUID}/notices/${noticeUuid}/audio/${language}`
389
+ );
390
+ if (sandbox) {
391
+ for (const [key, value] of Object.entries(sandboxQueryIdentity(sandbox))) {
392
+ url.searchParams.append(key, value);
393
+ }
359
394
  }
360
- const apiBaseUrl = baseUrl || BASE_URL;
361
- const url = `${apiBaseUrl}/public/organisations/${ORGANISATION_UUID}/workspaces/${WORKSPACE_UUID}/notices/${noticeUuid}/audio/${language}`;
362
- const response = await fetch(url, {
395
+ const response = await fetch(url.toString(), {
363
396
  method: "GET",
364
397
  headers: {
365
- Authorization: `Bearer ${accessToken}`,
398
+ ...buildAuthHeaders(accessToken, sandbox),
366
399
  Accept: "application/json"
367
400
  },
368
401
  signal
@@ -404,7 +437,10 @@ var initiateGuardianVerification = async ({
404
437
  if (!decodedToken) {
405
438
  throw new Error("Invalid access token");
406
439
  }
407
- const { organisation_uuid: ORGANISATION_UUID, workspace_uuid: WORKSPACE_UUID } = decodedToken;
440
+ const {
441
+ organisation_uuid: ORGANISATION_UUID,
442
+ workspace_uuid: WORKSPACE_UUID
443
+ } = decodedToken;
408
444
  if (!ORGANISATION_UUID || !WORKSPACE_UUID) {
409
445
  throw new Error("Invalid token: missing organization or workspace UUID");
410
446
  }
@@ -478,7 +514,10 @@ var verifyGuardianStatus = async ({
478
514
  if (!decodedToken) {
479
515
  throw new Error("Invalid access token");
480
516
  }
481
- const { organisation_uuid: ORGANISATION_UUID, workspace_uuid: WORKSPACE_UUID } = decodedToken;
517
+ const {
518
+ organisation_uuid: ORGANISATION_UUID,
519
+ workspace_uuid: WORKSPACE_UUID
520
+ } = decodedToken;
482
521
  if (!ORGANISATION_UUID || !WORKSPACE_UUID) {
483
522
  throw new Error("Invalid token: missing organization or workspace UUID");
484
523
  }
@@ -491,9 +530,7 @@ var verifyGuardianStatus = async ({
491
530
  Authorization: `Bearer ${accessToken}`,
492
531
  "Content-Type": "application/json"
493
532
  },
494
- body: JSON.stringify({
495
- session_token: sessionToken
496
- }),
533
+ body: JSON.stringify({ session_token: sessionToken }),
497
534
  signal
498
535
  }
499
536
  );
@@ -520,6 +557,12 @@ var verifyGuardianStatus = async ({
520
557
  var redacto_logo_default = "data:image/png;base64,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";
521
558
 
522
559
  // src/RedactoNoticeConsent/constants.ts
560
+ var DEFAULT_LOGO_POSITION = "left";
561
+ var LOGO_POSITION_JUSTIFY = {
562
+ left: "flex-start",
563
+ center: "center",
564
+ right: "flex-end"
565
+ };
523
566
  var DPO_AUDIO_ELEMENT_MAP = [
524
567
  { audioKey: "grievance_text_audio_url", elementId: "dpo-grievance-text" },
525
568
  { audioKey: "grievance_anchor_text_audio_url", elementId: "dpo-grievance-link" },
@@ -531,6 +574,10 @@ var DPO_AUDIO_ELEMENT_MAP = [
531
574
  { audioKey: "dpo_anchor_text_audio_url", elementId: "dpo-dpo-link" }
532
575
  ];
533
576
 
577
+ // src/RedactoNoticeConsent/layout.ts
578
+ var resolveLogoPosition = (raw) => raw === "center" || raw === "right" ? raw : DEFAULT_LOGO_POSITION;
579
+ var logoRowJustify = (position) => LOGO_POSITION_JUSTIFY[position];
580
+
534
581
  // src/RedactoNoticeConsent/language-codes.ts
535
582
  var LANGUAGE_NATIVE_LABELS = {
536
583
  English: "English",
@@ -752,6 +799,123 @@ var injectCheckboxStyles = () => {
752
799
  stylesInjected = true;
753
800
  };
754
801
 
802
+ // src/shared/useNoticeFont.ts
803
+ import { useEffect, useMemo } from "react";
804
+
805
+ // src/shared/fonts/font-sources.generated.ts
806
+ var NOTICE_FONT_SOURCE_IMPORTS = {
807
+ "montserrat": () => import("./montserrat.generated-NBTECYRW.mjs")
808
+ };
809
+
810
+ // src/shared/notice-webfont.ts
811
+ var noticeFontOptions = {};
812
+ var configureNoticeFonts = (options) => {
813
+ noticeFontOptions = { ...noticeFontOptions, ...options };
814
+ };
815
+ var toFamilyTokens = (value) => value.split(FONT_FAMILY_SEPARATOR).map(
816
+ (token) => token.trim().replace(FONT_NAME_QUOTE_CHARACTERS, "").toLowerCase()
817
+ );
818
+ var findNoticeFontEntry = (value) => {
819
+ const id = toFamilyTokens(value).find(
820
+ (token) => Boolean(NOTICE_FONT_ENTRY_BY_ID[token])
821
+ );
822
+ if (!id) {
823
+ return void 0;
824
+ }
825
+ return NOTICE_FONT_ENTRY_BY_ID[id];
826
+ };
827
+ var toFontFaceCss = (entry, sources) => sources.map(
828
+ ({ weight, url }) => [
829
+ "@font-face {",
830
+ ` font-family: "${entry.cssFamily}";`,
831
+ " font-style: normal;",
832
+ ` font-weight: ${weight};`,
833
+ // `swap`, never the `auto` default: auto gives most browsers a ~3s block
834
+ // period with INVISIBLE text, which is unacceptable for a consent notice.
835
+ " font-display: swap;",
836
+ // `local()` still leads: the bundled copy is Latin + Latin-Extended only,
837
+ // so a visitor's own installation covers more scripts than ours does.
838
+ ` src: local("${entry.cssFamily}"),`,
839
+ // Quoted url(): a data URI carries `,` and `;`, which are hostile to an
840
+ // unquoted url token. Base64 never contains a double quote.
841
+ ` url("${url}") format("woff2");`,
842
+ "}"
843
+ ].join("\n")
844
+ ).join("\n\n");
845
+ var fontSourceLoads = /* @__PURE__ */ new Map();
846
+ var loadFontSources = (entry, importSources) => {
847
+ const pending = fontSourceLoads.get(entry.id);
848
+ if (pending) {
849
+ return pending;
850
+ }
851
+ const load = importSources().then((module) => module.NOTICE_FONT_SOURCES).catch((error) => {
852
+ fontSourceLoads.delete(entry.id);
853
+ throw error;
854
+ });
855
+ fontSourceLoads.set(entry.id, load);
856
+ return load;
857
+ };
858
+ var injectedFontFaceIds = /* @__PURE__ */ new Set();
859
+ var injectFontFace = (entry, sources) => {
860
+ if (injectedFontFaceIds.has(entry.id)) {
861
+ return;
862
+ }
863
+ injectedFontFaceIds.add(entry.id);
864
+ const styleId = `${NOTICE_FONT_FACE_STYLE_ID_PREFIX}${entry.slug}`;
865
+ if (document.getElementById(styleId)) {
866
+ return;
867
+ }
868
+ const style = document.createElement("style");
869
+ style.id = styleId;
870
+ style.textContent = toFontFaceCss(entry, sources);
871
+ document.head.appendChild(style);
872
+ };
873
+ var loadNoticeWebfont = async (value, signal) => {
874
+ if (typeof document === "undefined" || noticeFontOptions.disabled) {
875
+ return;
876
+ }
877
+ if (signal == null ? void 0 : signal.aborted) {
878
+ return;
879
+ }
880
+ const entry = findNoticeFontEntry(value);
881
+ if (!entry || entry.source !== "webfont" || injectedFontFaceIds.has(entry.id)) {
882
+ return;
883
+ }
884
+ const importSources = NOTICE_FONT_SOURCE_IMPORTS[entry.slug];
885
+ if (!importSources) {
886
+ return;
887
+ }
888
+ try {
889
+ const sources = await loadFontSources(entry, importSources);
890
+ if (signal == null ? void 0 : signal.aborted) {
891
+ return;
892
+ }
893
+ injectFontFace(entry, sources);
894
+ } catch (error) {
895
+ console.error(NOTICE_FONT_LOAD_ERROR_MESSAGE, error);
896
+ }
897
+ };
898
+
899
+ // src/shared/useNoticeFont.ts
900
+ var useNoticeFont = ({
901
+ hostFont,
902
+ noticeFont
903
+ }) => {
904
+ const fontFamily = useMemo(
905
+ () => resolveNoticeFontFamily({ hostFont, noticeFont }),
906
+ [hostFont, noticeFont]
907
+ );
908
+ useEffect(() => {
909
+ injectNoticeFontStyles();
910
+ }, []);
911
+ useEffect(() => {
912
+ const controller = new AbortController();
913
+ void loadNoticeWebfont(fontFamily, controller.signal);
914
+ return () => controller.abort();
915
+ }, [fontFamily]);
916
+ return fontFamily;
917
+ };
918
+
755
919
  // src/RedactoNoticeConsent/styles.ts
756
920
  var styles = {
757
921
  overlay: {
@@ -823,6 +987,41 @@ var styles = {
823
987
  padding: 0,
824
988
  boxSizing: "border-box"
825
989
  },
990
+ // The main notice header is two stacked rows: the logo alone on row 1,
991
+ // aligned per active_config.logo_position, then the title and the
992
+ // TTS/language controls on row 2. `topSection` and `topLeft` above keep their
993
+ // single-row shape for the age-verification, guardian and verification
994
+ // screens, which have no controls to place and share those styles.
995
+ headerStack: {
996
+ display: "flex",
997
+ flexDirection: "column",
998
+ alignItems: "stretch",
999
+ gap: "10px",
1000
+ paddingBottom: "15px",
1001
+ borderBottom: "none",
1002
+ backgroundColor: "#ffffff",
1003
+ margin: 0,
1004
+ boxSizing: "border-box",
1005
+ textAlign: "left"
1006
+ },
1007
+ logoRow: {
1008
+ display: "flex",
1009
+ alignItems: "center",
1010
+ width: "100%",
1011
+ margin: 0,
1012
+ padding: 0,
1013
+ boxSizing: "border-box"
1014
+ },
1015
+ headerRow: {
1016
+ display: "flex",
1017
+ alignItems: "center",
1018
+ justifyContent: "space-between",
1019
+ gap: "10px",
1020
+ width: "100%",
1021
+ margin: 0,
1022
+ padding: 0,
1023
+ boxSizing: "border-box"
1024
+ },
826
1025
  logo: {
827
1026
  height: "32px",
828
1027
  width: "auto",
@@ -866,7 +1065,8 @@ var styles = {
866
1065
  boxSizing: "border-box",
867
1066
  textAlign: "left",
868
1067
  cursor: "pointer",
869
- backgroundColor: "#ffffff"
1068
+ backgroundColor: "#ffffff",
1069
+ fontFamily: "inherit"
870
1070
  },
871
1071
  middleSection: {
872
1072
  margin: "0px",
@@ -1039,7 +1239,8 @@ var styles = {
1039
1239
  cursor: "pointer",
1040
1240
  margin: 0,
1041
1241
  boxSizing: "border-box",
1042
- textAlign: "center"
1242
+ textAlign: "center",
1243
+ fontFamily: "inherit"
1043
1244
  },
1044
1245
  acceptButton: {
1045
1246
  backgroundColor: "#4f87ff",
@@ -1053,6 +1254,9 @@ var styles = {
1053
1254
  },
1054
1255
  languageSelectorContainer: {
1055
1256
  position: "relative",
1257
+ // Shares `headerRow` with the title, which grows; without this a long
1258
+ // heading squeezes the language button instead of wrapping itself.
1259
+ flexShrink: 0,
1056
1260
  margin: 0,
1057
1261
  padding: 0,
1058
1262
  boxSizing: "border-box"
@@ -1192,19 +1396,17 @@ var PurposeItem = ({
1192
1396
  selectedLanguage,
1193
1397
  initialDataElementSelections = {}
1194
1398
  }) => {
1195
- const headingStyle = useMemo(
1399
+ const headingStyle = useMemo2(
1196
1400
  () => ({
1197
- color: (settings == null ? void 0 : settings.headingColor) || "#323B4B",
1198
- fontFamily: (settings == null ? void 0 : settings.font) || "inherit"
1401
+ color: (settings == null ? void 0 : settings.headingColor) || "#323B4B"
1199
1402
  }),
1200
- [settings]
1403
+ [settings == null ? void 0 : settings.headingColor]
1201
1404
  );
1202
- const textStyle = useMemo(
1405
+ const textStyle = useMemo2(
1203
1406
  () => ({
1204
- color: (settings == null ? void 0 : settings.textColor) || "#344054",
1205
- fontFamily: (settings == null ? void 0 : settings.font) || "inherit"
1407
+ color: (settings == null ? void 0 : settings.textColor) || "#344054"
1206
1408
  }),
1207
- [settings]
1409
+ [settings == null ? void 0 : settings.textColor]
1208
1410
  );
1209
1411
  return /* @__PURE__ */ jsxs("div", { children: [
1210
1412
  /* @__PURE__ */ jsxs("div", { style: styles4.optionItem, children: [
@@ -1509,7 +1711,7 @@ var GuardianForm = ({
1509
1711
  const [openUpward, setOpenUpward] = useState(false);
1510
1712
  const dropdownRef = useRef(null);
1511
1713
  const optionsRef = useRef(null);
1512
- useEffect(() => {
1714
+ useEffect2(() => {
1513
1715
  if (!isDropdownOpen) return;
1514
1716
  const handleClickOutside = (e) => {
1515
1717
  if (dropdownRef.current && !dropdownRef.current.contains(e.target)) {
@@ -1520,7 +1722,7 @@ var GuardianForm = ({
1520
1722
  document.addEventListener("mousedown", handleClickOutside);
1521
1723
  return () => document.removeEventListener("mousedown", handleClickOutside);
1522
1724
  }, [isDropdownOpen]);
1523
- useEffect(() => {
1725
+ useEffect2(() => {
1524
1726
  if (!isDropdownOpen || !dropdownRef.current) return;
1525
1727
  const rect = dropdownRef.current.getBoundingClientRect();
1526
1728
  const spaceBelow = window.innerHeight - rect.bottom;
@@ -1562,7 +1764,7 @@ var GuardianForm = ({
1562
1764
  break;
1563
1765
  }
1564
1766
  };
1565
- useEffect(() => {
1767
+ useEffect2(() => {
1566
1768
  var _a2;
1567
1769
  if (focusedIndex >= 0 && optionsRef.current) {
1568
1770
  const option = optionsRef.current.children[focusedIndex];
@@ -1573,14 +1775,12 @@ var GuardianForm = ({
1573
1775
  const textColor = (settings == null ? void 0 : settings.textColor) || "#344054";
1574
1776
  const bgColor = (settings == null ? void 0 : settings.backgroundColor) || "#ffffff";
1575
1777
  const radius = (settings == null ? void 0 : settings.borderRadius) || "8px";
1576
- const font = (settings == null ? void 0 : settings.font) || "inherit";
1577
1778
  const inputStyle = {
1578
1779
  width: "100%",
1579
1780
  padding: "10px 12px",
1580
1781
  border: `1px solid ${borderColor}`,
1581
1782
  borderRadius: radius,
1582
1783
  fontSize: "13px",
1583
- fontFamily: font,
1584
1784
  color: textColor,
1585
1785
  backgroundColor: bgColor,
1586
1786
  marginBottom: "2px",
@@ -1838,7 +2038,6 @@ var GuardianForm = ({
1838
2038
  style: {
1839
2039
  padding: "9px 12px",
1840
2040
  fontSize: "13px",
1841
- fontFamily: font,
1842
2041
  color: isSelected ? accentColor : textColor,
1843
2042
  backgroundColor: isFocused ? "#F3F4F6" : "transparent",
1844
2043
  cursor: "pointer",
@@ -2355,6 +2554,12 @@ var RedactoNoticeConsent = ({
2355
2554
  noticeId,
2356
2555
  accessToken,
2357
2556
  refreshToken,
2557
+ token,
2558
+ email,
2559
+ mobile,
2560
+ ucic,
2561
+ organisationUuid,
2562
+ workspaceUuid,
2358
2563
  baseUrl,
2359
2564
  ledgerBaseUrl,
2360
2565
  language = "en",
@@ -2373,15 +2578,43 @@ var RedactoNoticeConsent = ({
2373
2578
  reviewModeButtonText = "Continue"
2374
2579
  }) => {
2375
2580
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
2376
- const propValidationError = useMemo(() => {
2581
+ const sandboxParams = useMemo2(
2582
+ () => ({
2583
+ token,
2584
+ sandboxUcic: ucic,
2585
+ sandboxSubject: email || mobile,
2586
+ organisationUuid,
2587
+ workspaceUuid
2588
+ }),
2589
+ [token, ucic, email, mobile, organisationUuid, workspaceUuid]
2590
+ );
2591
+ const propValidationError = useMemo2(() => {
2377
2592
  if (!(noticeId == null ? void 0 : noticeId.trim())) {
2378
2593
  return "RedactoNoticeConsent: 'noticeId' prop is required and cannot be empty";
2379
2594
  }
2595
+ if (token == null ? void 0 : token.trim()) {
2596
+ if (!(organisationUuid == null ? void 0 : organisationUuid.trim()) || !(workspaceUuid == null ? void 0 : workspaceUuid.trim())) {
2597
+ return "RedactoNoticeConsent: sandbox mode requires 'organisationUuid' and 'workspaceUuid'";
2598
+ }
2599
+ if (!(email == null ? void 0 : email.trim()) && !(mobile == null ? void 0 : mobile.trim()) && !(ucic == null ? void 0 : ucic.trim())) {
2600
+ return "RedactoNoticeConsent: sandbox mode requires 'email', 'mobile', or 'ucic'";
2601
+ }
2602
+ return null;
2603
+ }
2380
2604
  if (!(accessToken == null ? void 0 : accessToken.trim())) {
2381
2605
  return "RedactoNoticeConsent: 'accessToken' prop is required and cannot be empty";
2382
2606
  }
2383
2607
  return null;
2384
- }, [noticeId, accessToken]);
2608
+ }, [
2609
+ noticeId,
2610
+ accessToken,
2611
+ token,
2612
+ organisationUuid,
2613
+ workspaceUuid,
2614
+ email,
2615
+ mobile,
2616
+ ucic
2617
+ ]);
2385
2618
  if (propValidationError) {
2386
2619
  return /* @__PURE__ */ jsxs(
2387
2620
  "div",
@@ -2461,7 +2694,7 @@ var RedactoNoticeConsent = ({
2461
2694
  const isPollingStatusRef = useRef(false);
2462
2695
  const verificationSessionTokenRef = useRef(null);
2463
2696
  const isMobile = useMediaQuery("(max-width: 768px)");
2464
- const responsiveStyles = useMemo(
2697
+ const responsiveStyles = useMemo2(
2465
2698
  () => ({
2466
2699
  modal: {
2467
2700
  width: isMobile ? "90%" : "700px"
@@ -2519,9 +2752,7 @@ var RedactoNoticeConsent = ({
2519
2752
  height: isMobile ? "auto" : void 0,
2520
2753
  width: isMobile ? "auto" : void 0
2521
2754
  },
2522
- topSection: {
2523
- flexDirection: isMobile ? "column" : "row",
2524
- alignItems: isMobile ? "stretch" : "flex-start",
2755
+ headerStack: {
2525
2756
  gap: isMobile ? "12px" : "10px"
2526
2757
  },
2527
2758
  logo: {
@@ -2542,28 +2773,36 @@ var RedactoNoticeConsent = ({
2542
2773
  }),
2543
2774
  [isMobile]
2544
2775
  );
2545
- const componentHeadingStyle = useMemo(
2776
+ const fontFamily = useNoticeFont({
2777
+ hostFont: settings == null ? void 0 : settings.font,
2778
+ noticeFont: content == null ? void 0 : content.font_preference
2779
+ });
2780
+ const componentHeadingStyle = useMemo2(
2781
+ () => ({
2782
+ color: (settings == null ? void 0 : settings.headingColor) || "#323B4B"
2783
+ }),
2784
+ [settings == null ? void 0 : settings.headingColor]
2785
+ );
2786
+ const componentTextStyle = useMemo2(
2546
2787
  () => ({
2547
- color: (settings == null ? void 0 : settings.headingColor) || "#323B4B",
2548
- fontFamily: (settings == null ? void 0 : settings.font) || "inherit"
2788
+ color: (settings == null ? void 0 : settings.textColor) || "#344054"
2549
2789
  }),
2550
- [settings == null ? void 0 : settings.headingColor, settings == null ? void 0 : settings.font]
2790
+ [settings == null ? void 0 : settings.textColor]
2551
2791
  );
2552
- const componentTextStyle = useMemo(
2792
+ const sectionStyle = useMemo2(
2553
2793
  () => ({
2554
- color: (settings == null ? void 0 : settings.textColor) || "#344054",
2555
- fontFamily: (settings == null ? void 0 : settings.font) || "inherit"
2794
+ color: (settings == null ? void 0 : settings.textColor) || "#344054"
2556
2795
  }),
2557
- [settings == null ? void 0 : settings.textColor, settings == null ? void 0 : settings.font]
2796
+ [settings == null ? void 0 : settings.textColor]
2558
2797
  );
2559
- const sectionStyle = useMemo(
2798
+ const logoRowStyle = useMemo2(
2560
2799
  () => ({
2561
- color: (settings == null ? void 0 : settings.textColor) || "#344054",
2562
- fontFamily: (settings == null ? void 0 : settings.font) || "inherit"
2800
+ ...styles.logoRow,
2801
+ justifyContent: logoRowJustify(resolveLogoPosition(content == null ? void 0 : content.logo_position))
2563
2802
  }),
2564
- [settings == null ? void 0 : settings.textColor, settings == null ? void 0 : settings.font]
2803
+ [content == null ? void 0 : content.logo_position]
2565
2804
  );
2566
- const areAllRequiredElementsChecked = useMemo(() => {
2805
+ const areAllRequiredElementsChecked = useMemo2(() => {
2567
2806
  if (!content) return false;
2568
2807
  return content.purposes.every((purpose) => {
2569
2808
  const requiredElements = purpose.data_elements.filter(
@@ -2575,7 +2814,7 @@ var RedactoNoticeConsent = ({
2575
2814
  });
2576
2815
  }, [content, selectedDataElements]);
2577
2816
  const acceptDisabled = isSubmitting || !areAllRequiredElementsChecked;
2578
- useEffect(() => {
2817
+ useEffect2(() => {
2579
2818
  var _a2, _b2;
2580
2819
  clearApiCache();
2581
2820
  isRequestInProgressRef.current = false;
@@ -2638,7 +2877,7 @@ var RedactoNoticeConsent = ({
2638
2877
  }
2639
2878
  isInitialMountRef.current = false;
2640
2879
  }, [accessToken]);
2641
- useEffect(() => {
2880
+ useEffect2(() => {
2642
2881
  if (hasAlreadyConsented) {
2643
2882
  onAccept == null ? void 0 : onAccept();
2644
2883
  }
@@ -2711,7 +2950,7 @@ var RedactoNoticeConsent = ({
2711
2950
  return content.dpo_info[key] || defaultText;
2712
2951
  };
2713
2952
  const fetchNotice = async () => {
2714
- var _a2, _b2, _c2;
2953
+ var _a2;
2715
2954
  if (isRequestInProgressRef.current) {
2716
2955
  return;
2717
2956
  }
@@ -2725,16 +2964,18 @@ var RedactoNoticeConsent = ({
2725
2964
  setShowAgeVerification(false);
2726
2965
  setShowGuardianForm(false);
2727
2966
  try {
2967
+ const noticeBaseUrl = ledgerBaseUrl && !applicationId && !token ? ledgerBaseUrl : baseUrl;
2728
2968
  const consentContentData = await fetchConsentContent({
2729
2969
  noticeId,
2730
2970
  accessToken,
2731
2971
  refreshToken,
2732
- baseUrl,
2972
+ baseUrl: noticeBaseUrl,
2733
2973
  language,
2734
2974
  specific_uuid: applicationId,
2735
2975
  validate_against: validateAgainst,
2736
2976
  include_fully_consented_data: includeFullyConsentedData,
2737
- signal: (_a2 = abortControllerRef.current) == null ? void 0 : _a2.signal
2977
+ signal: (_a2 = abortControllerRef.current) == null ? void 0 : _a2.signal,
2978
+ ...sandboxParams
2738
2979
  });
2739
2980
  const activeConfig = consentContentData.detail.active_config;
2740
2981
  setContent(activeConfig);
@@ -2752,24 +2993,8 @@ var RedactoNoticeConsent = ({
2752
2993
  {}
2753
2994
  );
2754
2995
  setCollapsedPurposes(initialCollapsedState);
2755
- let isReconsentRequired = consentContentData.detail.reconsent_required;
2756
- let purposeSelections = consentContentData.detail.purpose_selections;
2757
- if (ledgerBaseUrl && !applicationId) {
2758
- const ledgerStatus = await fetchNoticeConsentStatus({
2759
- accessToken,
2760
- ledgerBaseUrl,
2761
- noticeUuid: noticeId,
2762
- signal: (_b2 = abortControllerRef.current) == null ? void 0 : _b2.signal
2763
- });
2764
- if (ledgerStatus) {
2765
- const overlay = buildLedgerConsentOverlay(
2766
- ledgerStatus,
2767
- activeConfig.purposes
2768
- );
2769
- isReconsentRequired = (_c2 = overlay == null ? void 0 : overlay.reconsent_required) != null ? _c2 : false;
2770
- purposeSelections = overlay == null ? void 0 : overlay.purpose_selections;
2771
- }
2772
- }
2996
+ const isReconsentRequired = consentContentData.detail.reconsent_required;
2997
+ const purposeSelections = consentContentData.detail.purpose_selections;
2773
2998
  const newCategorizedPurposes = isReconsentRequired ? {
2774
2999
  alreadyConsented: activeConfig.purposes.filter(
2775
3000
  (purpose) => {
@@ -2800,9 +3025,9 @@ var RedactoNoticeConsent = ({
2800
3025
  const initialDataElementState = activeConfig.purposes.reduce(
2801
3026
  (acc, purpose) => {
2802
3027
  purpose.data_elements.forEach((element) => {
2803
- var _a3, _b3;
3028
+ var _a3, _b2;
2804
3029
  const combinedId = `${purpose.uuid}-${element.uuid}`;
2805
- if ((_b3 = (_a3 = purposeSelections == null ? void 0 : purposeSelections[purpose.uuid]) == null ? void 0 : _a3.data_elements) == null ? void 0 : _b3[element.uuid]) {
3030
+ if ((_b2 = (_a3 = purposeSelections == null ? void 0 : purposeSelections[purpose.uuid]) == null ? void 0 : _a3.data_elements) == null ? void 0 : _b2[element.uuid]) {
2806
3031
  acc[combinedId] = purposeSelections[purpose.uuid].data_elements[element.uuid].selected;
2807
3032
  } else {
2808
3033
  acc[combinedId] = false;
@@ -2818,9 +3043,9 @@ var RedactoNoticeConsent = ({
2818
3043
  const initialSelections = {};
2819
3044
  newCategorizedPurposes.alreadyConsented.forEach((purpose) => {
2820
3045
  purpose.data_elements.forEach((element) => {
2821
- var _a3, _b3;
3046
+ var _a3, _b2;
2822
3047
  const combinedId = `${purpose.uuid}-${element.uuid}`;
2823
- if ((_b3 = (_a3 = purposeSelections == null ? void 0 : purposeSelections[purpose.uuid]) == null ? void 0 : _a3.data_elements) == null ? void 0 : _b3[element.uuid]) {
3048
+ if ((_b2 = (_a3 = purposeSelections == null ? void 0 : purposeSelections[purpose.uuid]) == null ? void 0 : _a3.data_elements) == null ? void 0 : _b2[element.uuid]) {
2824
3049
  initialSelections[combinedId] = purposeSelections[purpose.uuid].data_elements[element.uuid].selected;
2825
3050
  } else {
2826
3051
  initialSelections[combinedId] = false;
@@ -2841,9 +3066,9 @@ var RedactoNoticeConsent = ({
2841
3066
  activeConfig.purposes.forEach(
2842
3067
  (purpose) => {
2843
3068
  purpose.data_elements.forEach((element) => {
2844
- var _a3, _b3;
3069
+ var _a3, _b2;
2845
3070
  const combinedId = `${purpose.uuid}-${element.uuid}`;
2846
- if ((_b3 = (_a3 = purposeSelections[purpose.uuid]) == null ? void 0 : _a3.data_elements) == null ? void 0 : _b3[element.uuid]) {
3071
+ if ((_b2 = (_a3 = purposeSelections[purpose.uuid]) == null ? void 0 : _a3.data_elements) == null ? void 0 : _b2[element.uuid]) {
2847
3072
  initialSelections[combinedId] = purposeSelections[purpose.uuid].data_elements[element.uuid].selected;
2848
3073
  } else {
2849
3074
  initialSelections[combinedId] = false;
@@ -2884,15 +3109,17 @@ var RedactoNoticeConsent = ({
2884
3109
  isRequestInProgressRef.current = false;
2885
3110
  }
2886
3111
  };
2887
- useEffect(() => {
3112
+ useEffect2(() => {
2888
3113
  injectCheckboxStyles();
2889
3114
  fetchNotice();
2890
3115
  }, [
2891
3116
  noticeId,
2892
3117
  accessToken,
2893
3118
  refreshToken,
3119
+ sandboxParams,
2894
3120
  language,
2895
3121
  applicationId,
3122
+ ledgerBaseUrl,
2896
3123
  validateAgainst,
2897
3124
  includeFullyConsentedData
2898
3125
  // Removed onError and isRefreshingToken from dependencies to prevent duplicate API calls
@@ -3007,7 +3234,8 @@ var RedactoNoticeConsent = ({
3007
3234
  meta_data: applicationId ? { specific_uuid: applicationId } : void 0,
3008
3235
  guardianVerificationReference: verificationReference || void 0,
3009
3236
  selfDeclaredAdult: selfDeclaredAdult || void 0,
3010
- signal: submitController.signal
3237
+ signal: submitController.signal,
3238
+ ...sandboxParams
3011
3239
  });
3012
3240
  }
3013
3241
  onAccept == null ? void 0 : onAccept();
@@ -3190,7 +3418,7 @@ var RedactoNoticeConsent = ({
3190
3418
  } finally {
3191
3419
  setIsSubmittingGuardian(false);
3192
3420
  }
3193
- }, [accessToken, baseUrl, guardianFormData, digilockerMode, digilockerCallbackUrl, selectedPurposes, selectedDataElements, noticeId, onError]);
3421
+ }, [accessToken, sandboxParams, baseUrl, guardianFormData, digilockerMode, digilockerCallbackUrl, selectedPurposes, selectedDataElements, noticeId, onError]);
3194
3422
  const handleAgeVerificationYes = useCallback(() => {
3195
3423
  setShowAgeVerification(false);
3196
3424
  setIsMinorFlow(false);
@@ -3247,7 +3475,7 @@ var RedactoNoticeConsent = ({
3247
3475
  setIsPollingStatus(false);
3248
3476
  isPollingStatusRef.current = false;
3249
3477
  setIsInitiatingVerification(false);
3250
- }, [accessToken, baseUrl]);
3478
+ }, [accessToken, sandboxParams, baseUrl]);
3251
3479
  const startPopupMonitoring = useCallback((popup) => {
3252
3480
  popupCheckIntervalRef.current = window.setInterval(() => {
3253
3481
  if (popup.closed) {
@@ -3275,8 +3503,8 @@ var RedactoNoticeConsent = ({
3275
3503
  []
3276
3504
  );
3277
3505
  const startStatusPolling = useCallback(
3278
- (token) => {
3279
- verificationSessionTokenRef.current = token;
3506
+ (token2) => {
3507
+ verificationSessionTokenRef.current = token2;
3280
3508
  setIsPollingStatus(true);
3281
3509
  isPollingStatusRef.current = true;
3282
3510
  setVerificationError(null);
@@ -3328,7 +3556,7 @@ var RedactoNoticeConsent = ({
3328
3556
  const response = await verifyGuardianStatus({
3329
3557
  accessToken,
3330
3558
  baseUrl,
3331
- sessionToken: token
3559
+ sessionToken: token2
3332
3560
  });
3333
3561
  consecutiveErrors = 0;
3334
3562
  if (response.status === "verified") {
@@ -3398,7 +3626,7 @@ var RedactoNoticeConsent = ({
3398
3626
  };
3399
3627
  statusPollIntervalRef.current = window.setTimeout(poll, POLL_INTERVAL);
3400
3628
  },
3401
- [accessToken, baseUrl, getVerificationErrorMessage]
3629
+ [accessToken, sandboxParams, baseUrl, getVerificationErrorMessage]
3402
3630
  );
3403
3631
  const handleBackToGuardianForm = useCallback((clearName = false) => {
3404
3632
  var _a2, _b2;
@@ -3436,7 +3664,7 @@ var RedactoNoticeConsent = ({
3436
3664
  }
3437
3665
  clearConsentState();
3438
3666
  }, []);
3439
- const availableLanguages = useMemo(() => {
3667
+ const availableLanguages = useMemo2(() => {
3440
3668
  if (!content) return [language];
3441
3669
  const pinned = ["English"];
3442
3670
  if (content.default_language && content.default_language !== "English" && content.default_language !== "en") {
@@ -3458,7 +3686,7 @@ var RedactoNoticeConsent = ({
3458
3686
  },
3459
3687
  [content]
3460
3688
  );
3461
- const audioSequence = useMemo(() => {
3689
+ const audioSequence = useMemo2(() => {
3462
3690
  if (!ttsAudioUrls || !content) return [];
3463
3691
  const sequence = [];
3464
3692
  if (ttsAudioUrls.notice_banner_heading_audio_url) {
@@ -3523,7 +3751,7 @@ var RedactoNoticeConsent = ({
3523
3751
  }
3524
3752
  return sequence;
3525
3753
  }, [ttsAudioUrls, content, categorizedPurposes]);
3526
- const elementIdSequence = useMemo(() => {
3754
+ const elementIdSequence = useMemo2(() => {
3527
3755
  if (!ttsAudioUrls || !content) return [];
3528
3756
  const elementIds = [];
3529
3757
  if (ttsAudioUrls.notice_banner_heading_audio_url) {
@@ -3656,7 +3884,7 @@ var RedactoNoticeConsent = ({
3656
3884
  playAudio();
3657
3885
  }
3658
3886
  }, [isPlaying, playAudio, pauseAudio]);
3659
- useEffect(() => {
3887
+ useEffect2(() => {
3660
3888
  var _a2;
3661
3889
  if (!isPlaying || !content || audioSequence.length === 0) return;
3662
3890
  const currentIndex = currentAudioIndex;
@@ -3690,7 +3918,7 @@ var RedactoNoticeConsent = ({
3690
3918
  categorizedPurposes,
3691
3919
  collapsedPurposes
3692
3920
  ]);
3693
- useEffect(() => {
3921
+ useEffect2(() => {
3694
3922
  const removeAllHighlights = () => {
3695
3923
  document.querySelectorAll(".redacto-tts-highlight").forEach((el) => {
3696
3924
  el.classList.remove("redacto-tts-highlight");
@@ -3726,7 +3954,7 @@ var RedactoNoticeConsent = ({
3726
3954
  removeAllHighlights();
3727
3955
  };
3728
3956
  }, [highlightedElementId, isPlaying]);
3729
- useEffect(() => {
3957
+ useEffect2(() => {
3730
3958
  setIsTTSAvailable(false);
3731
3959
  setTtsAudioUrls(null);
3732
3960
  stopAudio();
@@ -3738,9 +3966,11 @@ var RedactoNoticeConsent = ({
3738
3966
  fetchTTSAudioUrls({
3739
3967
  accessToken,
3740
3968
  baseUrl,
3969
+ ledgerBaseUrl,
3741
3970
  noticeUuid: content.notice_uuid,
3742
3971
  language: languageCode,
3743
- signal: ttsAbortController.signal
3972
+ signal: ttsAbortController.signal,
3973
+ ...sandboxParams
3744
3974
  }).then((response) => {
3745
3975
  setTtsAudioUrls(response.detail);
3746
3976
  setIsTTSAvailable(true);
@@ -3753,10 +3983,11 @@ var RedactoNoticeConsent = ({
3753
3983
  return () => {
3754
3984
  ttsAbortController.abort();
3755
3985
  };
3756
- }, [content, selectedLanguage, accessToken, baseUrl, getLanguageCode]);
3986
+ }, [content, selectedLanguage, accessToken, sandboxParams, baseUrl, ledgerBaseUrl, getLanguageCode]);
3757
3987
  const modalStyle = {
3758
3988
  borderRadius: (settings == null ? void 0 : settings.borderRadius) || "8px",
3759
- backgroundColor: (settings == null ? void 0 : settings.backgroundColor) || "#ffffff"
3989
+ backgroundColor: (settings == null ? void 0 : settings.backgroundColor) || "#ffffff",
3990
+ fontFamily
3760
3991
  };
3761
3992
  const buttonStyle = {
3762
3993
  borderRadius: (settings == null ? void 0 : settings.borderRadius) || "8px"
@@ -3790,7 +4021,7 @@ var RedactoNoticeConsent = ({
3790
4021
  const handleCloseError = () => {
3791
4022
  setErrorMessage(null);
3792
4023
  };
3793
- useEffect(() => {
4024
+ useEffect2(() => {
3794
4025
  const handleKeyDown = (event) => {
3795
4026
  if (!modalRef.current) return;
3796
4027
  const focusableElements = modalRef.current.querySelectorAll(
@@ -3829,13 +4060,13 @@ var RedactoNoticeConsent = ({
3829
4060
  modal == null ? void 0 : modal.removeEventListener("keydown", handleKeyDown);
3830
4061
  };
3831
4062
  }, [isLoading, handleDecline]);
3832
- useEffect(() => {
4063
+ useEffect2(() => {
3833
4064
  stopAudio();
3834
4065
  }, [selectedLanguage, stopAudio]);
3835
- useEffect(() => {
4066
+ useEffect2(() => {
3836
4067
  stopAudio();
3837
4068
  }, [content, stopAudio]);
3838
- useEffect(() => {
4069
+ useEffect2(() => {
3839
4070
  return () => {
3840
4071
  var _a2, _b2;
3841
4072
  if (abortControllerRef.current) {
@@ -3861,7 +4092,7 @@ var RedactoNoticeConsent = ({
3861
4092
  }
3862
4093
  };
3863
4094
  }, [stopAudio]);
3864
- useEffect(() => {
4095
+ useEffect2(() => {
3865
4096
  const persistedState = getConsentState();
3866
4097
  if (!persistedState) return;
3867
4098
  if (persistedState.noticeId && persistedState.noticeId !== noticeId) {
@@ -3911,6 +4142,7 @@ var RedactoNoticeConsent = ({
3911
4142
  "div",
3912
4143
  {
3913
4144
  ref: modalRef,
4145
+ ...NOTICE_FONT_ROOT_PROPS,
3914
4146
  style: {
3915
4147
  ...styles.modal,
3916
4148
  ...responsiveStyles.modal,
@@ -4171,8 +4403,8 @@ var RedactoNoticeConsent = ({
4171
4403
  "div",
4172
4404
  {
4173
4405
  style: {
4174
- ...styles.topSection,
4175
- ...responsiveStyles.topSection,
4406
+ ...styles.headerStack,
4407
+ ...responsiveStyles.headerStack,
4176
4408
  ...sectionStyle
4177
4409
  },
4178
4410
  children: (() => {
@@ -4341,40 +4573,12 @@ var RedactoNoticeConsent = ({
4341
4573
  }
4342
4574
  )
4343
4575
  ] });
4344
- return isMobile ? /* @__PURE__ */ jsxs(Fragment, { children: [
4345
- /* @__PURE__ */ jsxs(
4346
- "div",
4347
- {
4348
- style: {
4349
- display: "flex",
4350
- alignItems: "center",
4351
- gap: "10px",
4352
- width: "100%"
4353
- },
4354
- children: [
4355
- logoNode,
4356
- /* @__PURE__ */ jsx(
4357
- "div",
4358
- {
4359
- style: {
4360
- marginLeft: "auto",
4361
- display: "flex",
4362
- alignItems: "center",
4363
- flexShrink: 0
4364
- },
4365
- children: controlsBlock
4366
- }
4367
- )
4368
- ]
4369
- }
4370
- ),
4371
- titleNode
4372
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
4373
- /* @__PURE__ */ jsxs("div", { style: styles.topLeft, children: [
4374
- logoNode,
4375
- titleNode
4376
- ] }),
4377
- controlsBlock
4576
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
4577
+ /* @__PURE__ */ jsx("div", { style: logoRowStyle, children: logoNode }),
4578
+ /* @__PURE__ */ jsxs("div", { style: styles.headerRow, children: [
4579
+ titleNode,
4580
+ controlsBlock
4581
+ ] })
4378
4582
  ] });
4379
4583
  })()
4380
4584
  }
@@ -4719,7 +4923,7 @@ var RedactoNoticeConsent = ({
4719
4923
  };
4720
4924
 
4721
4925
  // src/RedactoNoticeConsentInline/RedactoNoticeConsentInline.tsx
4722
- import { useEffect as useEffect3, useMemo as useMemo2, useState as useState3, useRef as useRef2, useCallback as useCallback2, memo } from "react";
4926
+ import { useEffect as useEffect4, useMemo as useMemo3, useState as useState3, useRef as useRef2, useCallback as useCallback2, memo } from "react";
4723
4927
 
4724
4928
  // src/RedactoNoticeConsentInline/api/index.ts
4725
4929
  var BASE_URL2 = "https://api.redacto.tech/consent";
@@ -4727,12 +4931,16 @@ var fetchConsentContent2 = async ({
4727
4931
  org_uuid,
4728
4932
  workspace_uuid,
4729
4933
  notice_uuid,
4934
+ accessToken,
4730
4935
  baseUrl,
4731
- specific_uuid
4936
+ language,
4937
+ specific_uuid,
4938
+ signal
4732
4939
  }) => {
4733
4940
  const apiBaseUrl = baseUrl || BASE_URL2;
4941
+ const noticesUrl = `${apiBaseUrl}/public/organisations/${org_uuid}/workspaces/${workspace_uuid}/notices`;
4734
4942
  const url = new URL(
4735
- `${apiBaseUrl}/public/organisations/${org_uuid}/workspaces/${workspace_uuid}/notices/get-notice/${notice_uuid}`
4943
+ accessToken ? `${noticesUrl}/${notice_uuid}` : `${noticesUrl}/get-notice/${notice_uuid}`
4736
4944
  );
4737
4945
  if (specific_uuid) {
4738
4946
  url.searchParams.append("specific_uuid", specific_uuid);
@@ -4740,8 +4948,11 @@ var fetchConsentContent2 = async ({
4740
4948
  const response = await fetch(url.toString(), {
4741
4949
  method: "GET",
4742
4950
  headers: {
4743
- "Content-Type": "application/json"
4744
- }
4951
+ "Content-Type": "application/json",
4952
+ "Accept-Language": language || "en",
4953
+ ...accessToken ? { Authorization: `Bearer ${accessToken}` } : {}
4954
+ },
4955
+ signal
4745
4956
  });
4746
4957
  if (!response.ok) {
4747
4958
  throw await parseApiError(
@@ -4806,6 +5017,15 @@ var submitConsentEvent2 = async ({
4806
5017
 
4807
5018
  // src/RedactoNoticeConsentInline/styles.ts
4808
5019
  var styles2 = {
5020
+ // Root of the embedded widget — the host supplies the surrounding card, so this
5021
+ // is layout plus the font the rest of the widget inherits. (`container` below is
5022
+ // a standalone-card variant that the current layout does not use.)
5023
+ root: {
5024
+ display: "flex",
5025
+ flexDirection: "column",
5026
+ gap: "16px",
5027
+ fontFamily: "inherit"
5028
+ },
4809
5029
  overlay: {
4810
5030
  position: "fixed",
4811
5031
  top: 0,
@@ -5152,11 +5372,11 @@ var styles2 = {
5152
5372
  };
5153
5373
 
5154
5374
  // src/RedactoNoticeConsentInline/useMediaQuery.ts
5155
- import { useState as useState2, useEffect as useEffect2 } from "react";
5375
+ import { useState as useState2, useEffect as useEffect3 } from "react";
5156
5376
  var useMediaQuery2 = (query) => {
5157
5377
  const getMatches = () => typeof window !== "undefined" ? window.matchMedia(query).matches : false;
5158
5378
  const [matches, setMatches] = useState2(getMatches);
5159
- useEffect2(() => {
5379
+ useEffect3(() => {
5160
5380
  if (typeof window === "undefined") return;
5161
5381
  const media = window.matchMedia(query);
5162
5382
  const listener = (e) => {
@@ -5237,11 +5457,11 @@ var RedactoConsentInlineComponent = ({
5237
5457
  const [fetchError, setFetchError] = useState3(null);
5238
5458
  const [errorMessage, setErrorMessage] = useState3(null);
5239
5459
  const hasSubmittedRef = useRef2(false);
5240
- useEffect3(() => {
5460
+ useEffect4(() => {
5241
5461
  injectSpinnerAnimation();
5242
5462
  }, []);
5243
5463
  const isMobile = useMediaQuery2("(max-width: 768px)");
5244
- const responsiveStyles = useMemo2(
5464
+ const responsiveStyles = useMemo3(
5245
5465
  () => ({
5246
5466
  optionTitle: {
5247
5467
  fontSize: isMobile ? "14px" : "16px"
@@ -5259,7 +5479,7 @@ var RedactoConsentInlineComponent = ({
5259
5479
  }),
5260
5480
  [isMobile]
5261
5481
  );
5262
- const areAllRequiredElementsChecked = useMemo2(() => {
5482
+ const areAllRequiredElementsChecked = useMemo3(() => {
5263
5483
  if (!content) return false;
5264
5484
  return content.purposes.every((purpose) => {
5265
5485
  const requiredElements = purpose.data_elements.filter(
@@ -5270,10 +5490,10 @@ var RedactoConsentInlineComponent = ({
5270
5490
  );
5271
5491
  });
5272
5492
  }, [content, selectedDataElements]);
5273
- useEffect3(() => {
5493
+ useEffect4(() => {
5274
5494
  onValidationChange == null ? void 0 : onValidationChange(areAllRequiredElementsChecked);
5275
5495
  }, [areAllRequiredElementsChecked, onValidationChange]);
5276
- useEffect3(() => {
5496
+ useEffect4(() => {
5277
5497
  if (hasAlreadyConsented) {
5278
5498
  onAccept == null ? void 0 : onAccept();
5279
5499
  }
@@ -5315,18 +5535,24 @@ var RedactoConsentInlineComponent = ({
5315
5535
  }
5316
5536
  return defaultText;
5317
5537
  };
5318
- const fetchNotice = async () => {
5538
+ const fetchNotice = async (signal) => {
5319
5539
  setIsLoading(true);
5320
5540
  setFetchError(null);
5541
+ setHasAlreadyConsented(false);
5321
5542
  try {
5322
5543
  const consentContentData = await fetchConsentContent2({
5323
5544
  org_uuid,
5324
5545
  workspace_uuid,
5325
5546
  notice_uuid,
5547
+ accessToken,
5326
5548
  baseUrl,
5327
5549
  language,
5328
- specific_uuid: applicationId
5550
+ specific_uuid: applicationId,
5551
+ signal
5329
5552
  });
5553
+ if (signal == null ? void 0 : signal.aborted) {
5554
+ return;
5555
+ }
5330
5556
  const activeConfig = consentContentData.detail.active_config;
5331
5557
  setContent(activeConfig);
5332
5558
  if (activeConfig.default_language) {
@@ -5362,6 +5588,9 @@ var RedactoConsentInlineComponent = ({
5362
5588
  );
5363
5589
  setSelectedPurposes(initialPurposeState);
5364
5590
  } catch (err) {
5591
+ if ((signal == null ? void 0 : signal.aborted) || err instanceof Error && err.name === "AbortError") {
5592
+ return;
5593
+ }
5365
5594
  const error = err;
5366
5595
  setFetchError(error);
5367
5596
  if (error.status === 409) {
@@ -5370,13 +5599,19 @@ var RedactoConsentInlineComponent = ({
5370
5599
  onError == null ? void 0 : onError(error);
5371
5600
  }
5372
5601
  } finally {
5373
- setIsLoading(false);
5602
+ if (!(signal == null ? void 0 : signal.aborted)) {
5603
+ setIsLoading(false);
5604
+ }
5374
5605
  }
5375
5606
  };
5376
- useEffect3(() => {
5377
- fetchNotice();
5378
- }, [org_uuid, workspace_uuid, notice_uuid, language, applicationId]);
5379
- useEffect3(() => {
5607
+ useEffect4(() => {
5608
+ const controller = new AbortController();
5609
+ void fetchNotice(controller.signal);
5610
+ return () => {
5611
+ controller.abort();
5612
+ };
5613
+ }, [org_uuid, workspace_uuid, notice_uuid, language, applicationId, accessToken]);
5614
+ useEffect4(() => {
5380
5615
  if (!ledgerBaseUrl || applicationId) {
5381
5616
  return;
5382
5617
  }
@@ -5530,7 +5765,7 @@ var RedactoConsentInlineComponent = ({
5530
5765
  onAccept
5531
5766
  ]
5532
5767
  );
5533
- useEffect3(() => {
5768
+ useEffect4(() => {
5534
5769
  if (accessToken && content && areAllRequiredElementsChecked && !isSubmitting && !isCheckingConsent && !hasAlreadyConsented && !hasSubmittedRef.current) {
5535
5770
  hasSubmittedRef.current = true;
5536
5771
  const autoSubmit = async () => {
@@ -5552,7 +5787,7 @@ var RedactoConsentInlineComponent = ({
5552
5787
  hasAlreadyConsented,
5553
5788
  handleAcceptWithToken
5554
5789
  ]);
5555
- useEffect3(() => {
5790
+ useEffect4(() => {
5556
5791
  if (!accessToken) {
5557
5792
  hasSubmittedRef.current = false;
5558
5793
  }
@@ -5563,11 +5798,20 @@ var RedactoConsentInlineComponent = ({
5563
5798
  const textStyle = {
5564
5799
  color: (settings == null ? void 0 : settings.textColor) || "#344054"
5565
5800
  };
5801
+ const fontFamily = useNoticeFont({
5802
+ hostFont: settings == null ? void 0 : settings.font,
5803
+ noticeFont: content == null ? void 0 : content.font_preference
5804
+ });
5805
+ const rootStyle = { ...styles2.root, fontFamily };
5806
+ const loadingRootStyle = {
5807
+ ...styles2.loadingContainer,
5808
+ fontFamily
5809
+ };
5566
5810
  if (hasAlreadyConsented || fetchError) {
5567
5811
  return null;
5568
5812
  }
5569
5813
  if (isLoading) {
5570
- return /* @__PURE__ */ jsxs2("div", { style: styles2.loadingContainer, children: [
5814
+ return /* @__PURE__ */ jsxs2("div", { ...NOTICE_FONT_ROOT_PROPS, style: loadingRootStyle, children: [
5571
5815
  /* @__PURE__ */ jsx2("div", { style: styles2.loadingSpinner }),
5572
5816
  /* @__PURE__ */ jsx2("p", { style: { ...styles2.privacyText, ...textStyle }, children: "Loading..." })
5573
5817
  ] });
@@ -5575,7 +5819,7 @@ var RedactoConsentInlineComponent = ({
5575
5819
  if (!content) {
5576
5820
  return null;
5577
5821
  }
5578
- return /* @__PURE__ */ jsxs2("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: [
5822
+ return /* @__PURE__ */ jsxs2("div", { ...NOTICE_FONT_ROOT_PROPS, style: rootStyle, children: [
5579
5823
  errorMessage && /* @__PURE__ */ jsx2(
5580
5824
  "div",
5581
5825
  {
@@ -5754,7 +5998,7 @@ RedactoConsentInlineComponent.displayName = "RedactoConsentInline";
5754
5998
  var RedactoConsentInline = memo(RedactoConsentInlineComponent);
5755
5999
 
5756
6000
  // src/RedactoNoticeAssisted/RedactoNoticeAssisted.tsx
5757
- import { useState as useState5, useEffect as useEffect5, useMemo as useMemo3, useRef as useRef3, useCallback as useCallback3 } from "react";
6001
+ import { useState as useState5, useEffect as useEffect6, useMemo as useMemo4, useRef as useRef3, useCallback as useCallback3 } from "react";
5758
6002
 
5759
6003
  // src/RedactoNoticeAssisted/styles.ts
5760
6004
  var styles3 = {
@@ -5860,6 +6104,7 @@ var styles3 = {
5860
6104
  display: "flex",
5861
6105
  alignItems: "center",
5862
6106
  justifyContent: "center",
6107
+ fontFamily: "inherit",
5863
6108
  fontWeight: 400,
5864
6109
  fontSize: "12px",
5865
6110
  lineHeight: "150%",
@@ -6237,6 +6482,7 @@ var styles3 = {
6237
6482
  borderRadius: "8px",
6238
6483
  border: "1px solid #d0d5dd",
6239
6484
  textAlign: "center",
6485
+ fontFamily: "inherit",
6240
6486
  fontSize: "18px",
6241
6487
  fontWeight: 500,
6242
6488
  color: "#101828",
@@ -6358,6 +6604,7 @@ var styles3 = {
6358
6604
  width: "100%",
6359
6605
  borderRadius: "8px",
6360
6606
  padding: "9px 45px",
6607
+ fontFamily: "inherit",
6361
6608
  fontWeight: 400,
6362
6609
  fontSize: "16px",
6363
6610
  lineHeight: "150%",
@@ -6657,11 +6904,11 @@ var injectAssistedStyles = () => {
6657
6904
  };
6658
6905
 
6659
6906
  // src/RedactoNoticeAssisted/useMediaQuery.ts
6660
- import { useState as useState4, useEffect as useEffect4 } from "react";
6907
+ import { useState as useState4, useEffect as useEffect5 } from "react";
6661
6908
  var useMediaQuery3 = (query) => {
6662
6909
  const getMatches = () => typeof window !== "undefined" ? window.matchMedia(query).matches : false;
6663
6910
  const [matches, setMatches] = useState4(getMatches);
6664
- useEffect4(() => {
6911
+ useEffect5(() => {
6665
6912
  if (typeof window === "undefined") return;
6666
6913
  const media = window.matchMedia(query);
6667
6914
  const listener = (e) => {
@@ -8316,10 +8563,10 @@ var RedactoNoticeAssisted = ({
8316
8563
  const [isVerifying, setIsVerifying] = useState5(false);
8317
8564
  const [createError, setCreateError] = useState5(null);
8318
8565
  const [otpError, setOtpError] = useState5(null);
8319
- useEffect5(() => {
8566
+ useEffect6(() => {
8320
8567
  injectAssistedStyles();
8321
8568
  }, []);
8322
- useEffect5(() => {
8569
+ useEffect6(() => {
8323
8570
  const controller = new AbortController();
8324
8571
  setIsLoading(true);
8325
8572
  setFetchError(null);
@@ -8357,14 +8604,14 @@ var RedactoNoticeAssisted = ({
8357
8604
  });
8358
8605
  return () => controller.abort();
8359
8606
  }, [organisationUuid, workspaceUuid, noticeUuid, baseUrl]);
8360
- useEffect5(() => {
8607
+ useEffect6(() => {
8361
8608
  if (resendCountdown <= 0) return;
8362
8609
  const intervalId = window.setInterval(() => {
8363
8610
  setResendCountdown((prev) => prev <= 1 ? 0 : prev - 1);
8364
8611
  }, 1e3);
8365
8612
  return () => window.clearInterval(intervalId);
8366
8613
  }, [resendCountdown]);
8367
- useEffect5(() => {
8614
+ useEffect6(() => {
8368
8615
  if (step !== "verify") return;
8369
8616
  const id = window.setTimeout(
8370
8617
  () => scrollIntoViewSoft(verifyBlockRef.current),
@@ -8372,7 +8619,7 @@ var RedactoNoticeAssisted = ({
8372
8619
  );
8373
8620
  return () => window.clearTimeout(id);
8374
8621
  }, [step]);
8375
- useEffect5(() => {
8622
+ useEffect6(() => {
8376
8623
  if (!otpSent) return;
8377
8624
  const id = window.setTimeout(
8378
8625
  () => scrollIntoViewSoft(otpSectionRef.current),
@@ -8380,7 +8627,7 @@ var RedactoNoticeAssisted = ({
8380
8627
  );
8381
8628
  return () => window.clearTimeout(id);
8382
8629
  }, [otpSent]);
8383
- useEffect5(() => {
8630
+ useEffect6(() => {
8384
8631
  if (!isLanguageDropdownOpen) return;
8385
8632
  const handleClickOutside = (e) => {
8386
8633
  if (languageContainerRef.current && !languageContainerRef.current.contains(e.target)) {
@@ -8395,7 +8642,7 @@ var RedactoNoticeAssisted = ({
8395
8642
  const isMobileValid = mobile.replace(/\D/g, "").length >= 10;
8396
8643
  const isEmailValid = EMAIL_REGEX.test(email.trim());
8397
8644
  const isContactValid = verifyMethod === "email" ? isEmailValid : isMobileValid;
8398
- const areAllRequiredElementsChecked = useMemo3(() => {
8645
+ const areAllRequiredElementsChecked = useMemo4(() => {
8399
8646
  if (!content) return false;
8400
8647
  return content.purposes.every((purpose) => {
8401
8648
  const requiredElements = purpose.data_elements.filter(
@@ -8406,7 +8653,7 @@ var RedactoNoticeAssisted = ({
8406
8653
  );
8407
8654
  });
8408
8655
  }, [content, selectedDataElements]);
8409
- const normalizedDefaultLang = useMemo3(() => {
8656
+ const normalizedDefaultLang = useMemo4(() => {
8410
8657
  const dl = content == null ? void 0 : content.default_language;
8411
8658
  if (!dl) return "English";
8412
8659
  return dl === "en" || dl === "EN" ? "English" : dl;
@@ -8415,7 +8662,7 @@ var RedactoNoticeAssisted = ({
8415
8662
  (lang) => lang === "English" || lang === "en" || lang === "EN",
8416
8663
  []
8417
8664
  );
8418
- const ts = useMemo3(
8665
+ const ts = useMemo4(
8419
8666
  () => makeStaticT(toBcp47Code(selectedLanguage)),
8420
8667
  [selectedLanguage]
8421
8668
  );
@@ -8461,7 +8708,7 @@ var RedactoNoticeAssisted = ({
8461
8708
  },
8462
8709
  [content, selectedLanguage, isDefaultLanguage]
8463
8710
  );
8464
- const availableLanguages = useMemo3(() => {
8711
+ const availableLanguages = useMemo4(() => {
8465
8712
  if (!content) return [selectedLanguage];
8466
8713
  const pinned = ["English"];
8467
8714
  if (normalizedDefaultLang && normalizedDefaultLang !== "English") {
@@ -8478,10 +8725,10 @@ var RedactoNoticeAssisted = ({
8478
8725
  "--ra-accent": primaryColor,
8479
8726
  "--ra-accent-soft": accentSoft
8480
8727
  };
8481
- const fontFamily = (content == null ? void 0 : content.font_preference) || void 0;
8728
+ const fontFamily = useNoticeFont({ noticeFont: content == null ? void 0 : content.font_preference });
8482
8729
  const logoUrl = (content == null ? void 0 : content.logo_url) || redacto_logo_default2;
8483
8730
  const linkStyle = { ...styles3.link, color: secondaryColor };
8484
- const responsive = useMemo3(
8731
+ const responsive = useMemo4(
8485
8732
  () => ({
8486
8733
  modal: { width: isMobile ? "90%" : "700px" },
8487
8734
  title: { fontSize: isMobile ? "16px" : "18px" },
@@ -8572,7 +8819,7 @@ var RedactoNoticeAssisted = ({
8572
8819
  setSelectedLanguage(lang);
8573
8820
  setIsLanguageDropdownOpen(false);
8574
8821
  }, []);
8575
- const audioSequence = useMemo3(() => {
8822
+ const audioSequence = useMemo4(() => {
8576
8823
  if (!ttsAudioUrls || !content) return [];
8577
8824
  const sequence = [];
8578
8825
  if (ttsAudioUrls.notice_banner_heading_audio_url) {
@@ -8633,7 +8880,7 @@ var RedactoNoticeAssisted = ({
8633
8880
  }
8634
8881
  return sequence;
8635
8882
  }, [ttsAudioUrls, content]);
8636
- const elementIdSequence = useMemo3(() => {
8883
+ const elementIdSequence = useMemo4(() => {
8637
8884
  if (!ttsAudioUrls || !content) return [];
8638
8885
  const elementIds = [];
8639
8886
  if (ttsAudioUrls.notice_banner_heading_audio_url) {
@@ -8762,7 +9009,7 @@ var RedactoNoticeAssisted = ({
8762
9009
  playAudio();
8763
9010
  }
8764
9011
  }, [isPlaying, playAudio, pauseAudio]);
8765
- useEffect5(() => {
9012
+ useEffect6(() => {
8766
9013
  setIsTTSAvailable(false);
8767
9014
  setTtsAudioUrls(null);
8768
9015
  stopAudio();
@@ -8793,7 +9040,7 @@ var RedactoNoticeAssisted = ({
8793
9040
  baseUrl,
8794
9041
  stopAudio
8795
9042
  ]);
8796
- useEffect5(() => {
9043
+ useEffect6(() => {
8797
9044
  var _a;
8798
9045
  if (!isPlaying || !content || audioSequence.length === 0) return;
8799
9046
  const currentIndex = currentAudioIndex;
@@ -8812,7 +9059,7 @@ var RedactoNoticeAssisted = ({
8812
9059
  audioOffset += totalPurposeAudioCount;
8813
9060
  }
8814
9061
  }, [isPlaying, currentAudioIndex, audioSequence, content, collapsedPurposes]);
8815
- useEffect5(() => {
9062
+ useEffect6(() => {
8816
9063
  const removeAllHighlights = () => {
8817
9064
  document.querySelectorAll(".redacto-tts-highlight").forEach((el) => {
8818
9065
  el.classList.remove("redacto-tts-highlight");
@@ -9701,6 +9948,7 @@ var RedactoNoticeAssisted = ({
9701
9948
  return /* @__PURE__ */ jsx3("div", { style: styles3.overlay, children: /* @__PURE__ */ jsx3(
9702
9949
  "div",
9703
9950
  {
9951
+ ...NOTICE_FONT_ROOT_PROPS,
9704
9952
  style: {
9705
9953
  ...styles3.modal,
9706
9954
  ...responsive.modal,
@@ -9835,7 +10083,7 @@ var MailIcon = ({
9835
10083
  );
9836
10084
 
9837
10085
  // src/RedactoNoticeConsent/components/DigiLockerCallback.tsx
9838
- import { useCallback as useCallback4, useEffect as useEffect6, useRef as useRef4, useState as useState6 } from "react";
10086
+ import { useCallback as useCallback4, useEffect as useEffect7, useRef as useRef4, useState as useState6 } from "react";
9839
10087
  import { Fragment as Fragment3, jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
9840
10088
  var DigiLockerCallback = ({
9841
10089
  accessToken: propAccessToken,
@@ -10093,7 +10341,7 @@ var DigiLockerCallback = ({
10093
10341
  }
10094
10342
  }
10095
10343
  }, [propAccessToken, baseUrl, onSuccess, onError, redirectToOriginalPage]);
10096
- useEffect6(() => {
10344
+ useEffect7(() => {
10097
10345
  injectCheckboxStyles();
10098
10346
  handleCallback();
10099
10347
  return () => {
@@ -10311,5 +10559,6 @@ export {
10311
10559
  DigiLockerCallback,
10312
10560
  RedactoNoticeAssisted,
10313
10561
  RedactoNoticeConsent,
10314
- RedactoConsentInline as RedactoNoticeConsentInline
10562
+ RedactoConsentInline as RedactoNoticeConsentInline,
10563
+ configureNoticeFonts
10315
10564
  };