@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/NOTICE.md ADDED
@@ -0,0 +1,17 @@
1
+ # Third-party font licences
2
+
3
+ `@redacto.io/consent-sdk-react` bundles the webfonts below so a consent notice can render the font
4
+ family chosen in the Redacto console without contacting any third-party server. The files are
5
+ subset to Latin + Latin-Extended and converted to WOFF2; they are derived works of the upstreams
6
+ listed here.
7
+
8
+ | Family | Licence | Upstream |
9
+ |---|---|---|
10
+ | Montserrat | OFL-1.1 | https://github.com/google/fonts/tree/main/ofl/montserrat |
11
+
12
+ None of these families carry a Reserved Font Name, so the derived files keep the original family
13
+ names. The full licence text is reproduced in `fonts/licenses/` in the source repository and in
14
+ each family's `LICENSE.txt` alongside the font files.
15
+
16
+ The other font families the console offers (Arial, Georgia, Verdana, …) are **not** redistributed —
17
+ they are referenced by name and resolved from whatever the visitor's device already has.
package/README.md CHANGED
@@ -117,6 +117,80 @@ npm install @tanstack/react-query @tanstack/react-table \
117
117
 
118
118
  If you only use `RedactoNoticeConsent` or `RedactoNoticeConsentInline`, these peers are not needed.
119
119
 
120
+ ## Sandbox Mode (No Backend Required)
121
+
122
+ Sandbox mode lets you build and test a full consent PoC — **notice → Privacy Center → DSAR** — straight from your app, with **no backend and no token minting**. Instead of your server generating a JWT, you paste a **static sandbox token** into the SDK. Everything you create is recorded as test data, isolated from your live records.
123
+
124
+ Going live is a config swap, not a rewrite: drop the sandbox props and pass a real JWT (see [Backend Server Setup](#backend-server-setup)).
125
+
126
+ ### 1. Get your sandbox credentials
127
+
128
+ In the **Redacto Dashboard → API Keys → Sandbox** tab, copy:
129
+
130
+ - your **Sandbox token** (a static string; it never expires and needs no refresh)
131
+ - your **Organization ID** and **Workspace ID** (shown under *Workspace identifiers* on the same page)
132
+
133
+ ### 2. Collect consent
134
+
135
+ Pass the sandbox `token`, org/workspace, and a test identity (`email`, `mobile`, or `ucic`). No `accessToken` is needed:
136
+
137
+ ```tsx
138
+ import { RedactoNoticeConsent } from "@redacto.io/consent-sdk-react";
139
+
140
+ <RedactoNoticeConsent
141
+ noticeId={NOTICE_UUID}
142
+ token={SANDBOX_TOKEN}
143
+ organisationUuid={ORG_UUID}
144
+ workspaceUuid={WORKSPACE_UUID}
145
+ email="test.user@example.com" // or `mobile`, or `ucic`
146
+ onAccept={() => console.log("consent recorded (test)")}
147
+ onDecline={() => {}}
148
+ />;
149
+ ```
150
+
151
+ ### 3. Manage consent & raise a DSAR
152
+
153
+ Point the Privacy Center at the same sandbox token and test identity. The same test user can now review the consent from step 2, withdraw it, and file a DSAR — end to end, all as test data:
154
+
155
+ ```tsx
156
+ import { RedactoPrivacyCenter } from "@redacto.io/consent-sdk-react/privacy-center";
157
+
158
+ <RedactoPrivacyCenter
159
+ token={SANDBOX_TOKEN}
160
+ organisationUuid={ORG_UUID}
161
+ workspaceUuid={WORKSPACE_UUID}
162
+ email="test.user@example.com" // or `mobile`, or `ucic`
163
+ slug="acme-co"
164
+ onError={(error) => {
165
+ console.error(error);
166
+ return false;
167
+ }}
168
+ />;
169
+ ```
170
+
171
+ ### Sandbox props
172
+
173
+ | Prop | Required | Description |
174
+ | --------------------------- | ------------ | --------------------------------------------------------------------------------- |
175
+ | `token` | Yes | Static sandbox token from the Dashboard. Its presence activates sandbox mode. |
176
+ | `organisationUuid` | Yes | Organization ID from the Dashboard. |
177
+ | `workspaceUuid` | Yes | Workspace ID from the Dashboard. |
178
+ | `email` / `mobile` / `ucic` | One required | The test subject. Precedence when more than one is set: `ucic` > `email` > `mobile`. |
179
+
180
+ `RedactoPrivacyCenter` takes the same sandbox props — `token`, `organisationUuid`, `workspaceUuid`, and `email` / `mobile` / `ucic`.
181
+
182
+ ### How it works
183
+
184
+ - The SDK sends the sandbox token as an `X-Consent-Token` header and the test identity inside each request (query params on reads, body on writes) — no JWT decode, no token refresh (a `401` fails fast).
185
+ - The server records everything under `environment=test`, namespaced so sandbox data never mixes with — or reads — your live records.
186
+ - Sandbox always talks to the consent server; it never routes to the Go ledger.
187
+
188
+ ### Going live
189
+
190
+ Sandbox and production use the same components. To ship, remove the sandbox props and pass a real `accessToken` / `refreshToken` (JWT) minted by your backend — see [Backend Server Setup](#backend-server-setup) below. New records are then written as `environment=live`.
191
+
192
+ > Sandbox is available on `RedactoNoticeConsent` and `RedactoPrivacyCenter`. The inline (`RedactoNoticeConsentInline`) and assisted (`RedactoNoticeAssisted`) widgets are JWT/OTP-only.
193
+
120
194
  ### Backend Server Setup
121
195
 
122
196
  Before using the SDK components, you need to set up backend server endpoints that generate access tokens by calling Redacto's API. Your server should implement the following endpoints:
@@ -673,7 +747,7 @@ export function AssistedConsent() {
673
747
 
674
748
  ### Custom Styling
675
749
 
676
- `RedactoNoticeConsent` and `RedactoNoticeConsentInline` support extensive styling customization via the `settings` prop. (`RedactoNoticeAssisted` does not take a `settings` prop — it themes itself from the notice's API configuration, such as primary/secondary colour and font.)
750
+ `RedactoNoticeConsent` and `RedactoNoticeConsentInline` support extensive styling customization via the `settings` prop, which overrides the notice's own API configuration. (`RedactoNoticeAssisted` does not take a `settings` prop — it themes itself entirely from the notice's API configuration, such as primary/secondary colour and font.)
677
751
 
678
752
  ```tsx
679
753
  const customSettings = {
@@ -699,7 +773,7 @@ const customSettings = {
699
773
  textColor: "#e6e6e6",
700
774
  borderColor: "white",
701
775
  link: "#9810fa",
702
- font: "Arial, sans-serif", // Optional: custom font family
776
+ font: "Arial, sans-serif", // Optional: overrides the notice's Font Family
703
777
  };
704
778
 
705
779
  // Use in component
@@ -717,11 +791,75 @@ const customSettings = {
717
791
  - `borderColor`: Color for borders
718
792
  - `borderRadius`: Border radius for rounded corners
719
793
  - `link`: Color for links
720
- - `font`: Font family (optional)
794
+ - `font`: Font family (optional) — overrides the Font Family configured on the notice
721
795
  - `button.accept`: Styles for accept button
722
796
  - `button.decline`: Styles for decline button
723
797
  - `button.language`: Styles for language selector
724
798
 
799
+ #### Font family
800
+
801
+ All three notice components apply the **Font Family** selected on the notice in the
802
+ Redacto console (`active_config.font_preference`), so the rendered notice matches the
803
+ console's live preview without any host configuration.
804
+
805
+ Resolution order is `settings.font` → the notice's Font Family → the host page's font.
806
+ Pass `settings.font` only when the host needs to override the configured family; omit it
807
+ and the console selection is used. The selected family is expanded into a full CSS stack
808
+ with a generic fallback (`Times New Roman` becomes `"Times New Roman", Times, serif`).
809
+
810
+ The two sources are deliberately **not** interchangeable. The notice's own Font Family must be one
811
+ of the families above; a stored value that is no longer offered renders as Arial, so the console and
812
+ the notice can never disagree. `settings.font` is a host override and is respected verbatim — pass a
813
+ family you have loaded yourself, or a full stack, and the SDK uses it as-is.
814
+
815
+ **Available families.** One is a self-hosted webfont — Montserrat — and five are system families
816
+ needing no download: Arial, Georgia, Times New Roman, Trebuchet MS, Verdana. The catalogue is
817
+ also importable on its own for building a font picker:
818
+
819
+ ```ts
820
+ import {
821
+ NOTICE_FONT_CATALOGUE,
822
+ toNoticeFontValue,
823
+ } from "@redacto.io/consent-sdk-react/fonts";
824
+ ```
825
+
826
+ That subpath is data plus one pure function, with no React dependency, so importing it does
827
+ not pull in the notice components.
828
+
829
+ #### Webfont loading
830
+
831
+ **Nothing to set up.** Montserrat ships inside this package, so the font an admin picks in the
832
+ console renders with no configuration, no network request, and no third-party origin to
833
+ allowlist — which matters here because a consent notice renders *before* the visitor has
834
+ consented to anything, and must not disclose their IP to anyone.
835
+
836
+ Loading is on demand: the payload is a lazily-imported module, so a visitor downloads it (214KB)
837
+ only when their notice actually uses Montserrat, and **nothing at all** when the notice uses a
838
+ system family such as Arial or Georgia. `src` leads with `local()`, so a visitor who already has
839
+ the family installed uses their own copy; and `font-display: swap` means notice text is never
840
+ invisible while a font loads.
841
+
842
+ To skip webfont loading entirely — to avoid the payload, or if your CSP omits `data:` from
843
+ `font-src` — call `configureNoticeFonts` once at app bootstrap:
844
+
845
+ ```ts
846
+ import { configureNoticeFonts } from "@redacto.io/consent-sdk-react";
847
+
848
+ configureNoticeFonts({ disabled: true });
849
+ ```
850
+
851
+ Selections then render via their fallback stack, which is a same-genre face.
852
+
853
+ **Content-Security-Policy.** The fonts are inlined as `data:` URIs, so a host with a `font-src`
854
+ directive must include `data:` (`font-src 'self'` blocks them, and `*` does not match the
855
+ `data:` scheme). A blocked font degrades to the next family in the stack — no error, no blank
856
+ notice.
857
+
858
+ **Non-Latin scripts.** Montserrat carries Latin and Latin-Extended glyphs only. On a notice
859
+ rendered in Hindi, Bengali, Tamil or another non-Latin script, per-glyph fallback means that
860
+ text renders in the device's own face for the script — fully readable, but not in Montserrat.
861
+ System families are unaffected.
862
+
725
863
  ## Component Comparison
726
864
 
727
865
  | Feature | `RedactoNoticeConsent` | `RedactoNoticeConsentInline` | `RedactoNoticeAssisted` |
@@ -0,0 +1,182 @@
1
+ // src/shared/font-catalogue.generated.ts
2
+ var NOTICE_FONT_CATALOGUE = [
3
+ {
4
+ id: "montserrat",
5
+ slug: "montserrat",
6
+ value: "Montserrat",
7
+ label: "Montserrat",
8
+ cssFamily: "Montserrat",
9
+ stack: 'Montserrat, "Trebuchet MS", "Segoe UI", Arial, sans-serif',
10
+ genericFallback: "sans-serif",
11
+ source: "webfont",
12
+ weights: [400, 500, 600, 700],
13
+ formats: ["woff2", "ttf"]
14
+ },
15
+ {
16
+ id: "arial",
17
+ slug: "arial",
18
+ value: "Arial",
19
+ label: "Arial",
20
+ cssFamily: "Arial",
21
+ stack: "Arial, Helvetica, sans-serif",
22
+ genericFallback: "sans-serif",
23
+ source: "system"
24
+ },
25
+ {
26
+ id: "georgia",
27
+ slug: "georgia",
28
+ value: "Georgia",
29
+ label: "Georgia",
30
+ cssFamily: "Georgia",
31
+ stack: 'Georgia, "Times New Roman", Times, serif',
32
+ genericFallback: "serif",
33
+ source: "system"
34
+ },
35
+ {
36
+ id: "times new roman",
37
+ slug: "times-new-roman",
38
+ value: "Times New Roman",
39
+ label: "Times New Roman",
40
+ cssFamily: "Times New Roman",
41
+ stack: '"Times New Roman", Times, serif',
42
+ genericFallback: "serif",
43
+ source: "system"
44
+ },
45
+ {
46
+ id: "trebuchet ms",
47
+ slug: "trebuchet-ms",
48
+ value: "Trebuchet MS",
49
+ label: "Trebuchet MS",
50
+ cssFamily: "Trebuchet MS",
51
+ stack: '"Trebuchet MS", "Lucida Sans Unicode", "Lucida Grande", sans-serif',
52
+ genericFallback: "sans-serif",
53
+ source: "system"
54
+ },
55
+ {
56
+ id: "verdana",
57
+ slug: "verdana",
58
+ value: "Verdana",
59
+ label: "Verdana",
60
+ cssFamily: "Verdana",
61
+ stack: "Verdana, Geneva, sans-serif",
62
+ genericFallback: "sans-serif",
63
+ source: "system"
64
+ }
65
+ ];
66
+ var NOTICE_FONT_ENTRY_BY_ID = Object.fromEntries(NOTICE_FONT_CATALOGUE.map((entry) => [entry.id, entry]));
67
+
68
+ // src/shared/constants.ts
69
+ var INHERIT_FONT_FAMILY = "inherit";
70
+ var NOTICE_FONT_STACKS = Object.fromEntries(
71
+ NOTICE_FONT_CATALOGUE.map((entry) => [entry.id, entry.stack])
72
+ );
73
+ var NOTICE_FONT_GENERIC_FALLBACK = ", sans-serif";
74
+ var DEFAULT_NOTICE_FONT_ID = "arial";
75
+ var CSS_FONT_KEYWORDS = [
76
+ "inherit",
77
+ "initial",
78
+ "revert",
79
+ "revert-layer",
80
+ "unset",
81
+ "serif",
82
+ "sans-serif",
83
+ "monospace",
84
+ "cursive",
85
+ "fantasy",
86
+ "system-ui",
87
+ "ui-serif",
88
+ "ui-sans-serif",
89
+ "ui-monospace",
90
+ "ui-rounded",
91
+ "math",
92
+ "emoji",
93
+ "fangsong"
94
+ ];
95
+ var UNSAFE_FONT_CHARACTERS = /["';{}\\]/g;
96
+ var FONT_NAME_QUOTE_CHARACTERS = /["']/g;
97
+ var FONT_FAMILY_SEPARATOR = ",";
98
+ var NOTICE_FONT_FACE_STYLE_ID_PREFIX = "redacto-notice-font-face-";
99
+ var NOTICE_FONT_LOAD_ERROR_MESSAGE = "[redacto] notice webfont payload failed to load; falling back to the next family in the stack";
100
+ var NOTICE_FONT_ROOT_ATTRIBUTE = "data-redacto-notice-font";
101
+ var NOTICE_FONT_ROOT_PROPS = {
102
+ [NOTICE_FONT_ROOT_ATTRIBUTE]: ""
103
+ };
104
+ var NOTICE_FONT_STYLE_ID = "redacto-notice-font-styles";
105
+ var NOTICE_FONT_CSS = `
106
+ [${NOTICE_FONT_ROOT_ATTRIBUTE}] button,
107
+ [${NOTICE_FONT_ROOT_ATTRIBUTE}] input,
108
+ [${NOTICE_FONT_ROOT_ATTRIBUTE}] optgroup,
109
+ [${NOTICE_FONT_ROOT_ATTRIBUTE}] option,
110
+ [${NOTICE_FONT_ROOT_ATTRIBUTE}] select,
111
+ [${NOTICE_FONT_ROOT_ATTRIBUTE}] textarea {
112
+ font-family: inherit;
113
+ }
114
+ `;
115
+
116
+ // src/shared/notice-font.ts
117
+ var toFontFamilyValue = (value) => {
118
+ var _a;
119
+ if (value.includes(",")) {
120
+ return value;
121
+ }
122
+ const family = value.replace(UNSAFE_FONT_CHARACTERS, "").trim();
123
+ if (!family) {
124
+ return INHERIT_FONT_FAMILY;
125
+ }
126
+ const lowered = family.toLowerCase();
127
+ if (CSS_FONT_KEYWORDS.includes(lowered)) {
128
+ return lowered;
129
+ }
130
+ return (_a = NOTICE_FONT_STACKS[lowered]) != null ? _a : `"${family}"${NOTICE_FONT_GENERIC_FALLBACK}`;
131
+ };
132
+ var toNoticeFontEntry = (fontPreference) => {
133
+ var _a;
134
+ const stored = fontPreference == null ? void 0 : fontPreference.trim();
135
+ if (!stored) {
136
+ return void 0;
137
+ }
138
+ return (_a = NOTICE_FONT_ENTRY_BY_ID[stored.toLowerCase()]) != null ? _a : NOTICE_FONT_ENTRY_BY_ID[DEFAULT_NOTICE_FONT_ID];
139
+ };
140
+ var toNoticeFontValue = (fontPreference) => {
141
+ var _a;
142
+ return (_a = toNoticeFontEntry(fontPreference)) == null ? void 0 : _a.value;
143
+ };
144
+ var resolveNoticeFontFamily = ({
145
+ hostFont,
146
+ noticeFont
147
+ }) => {
148
+ var _a, _b;
149
+ const host = hostFont == null ? void 0 : hostFont.trim();
150
+ if (host) {
151
+ return toFontFamilyValue(host);
152
+ }
153
+ return (_b = (_a = toNoticeFontEntry(noticeFont)) == null ? void 0 : _a.stack) != null ? _b : INHERIT_FONT_FAMILY;
154
+ };
155
+ var fontStylesInjected = false;
156
+ var injectNoticeFontStyles = () => {
157
+ if (fontStylesInjected || typeof document === "undefined") {
158
+ return;
159
+ }
160
+ if (document.getElementById(NOTICE_FONT_STYLE_ID)) {
161
+ fontStylesInjected = true;
162
+ return;
163
+ }
164
+ const style = document.createElement("style");
165
+ style.id = NOTICE_FONT_STYLE_ID;
166
+ style.textContent = NOTICE_FONT_CSS;
167
+ document.head.appendChild(style);
168
+ fontStylesInjected = true;
169
+ };
170
+
171
+ export {
172
+ NOTICE_FONT_CATALOGUE,
173
+ NOTICE_FONT_ENTRY_BY_ID,
174
+ FONT_NAME_QUOTE_CHARACTERS,
175
+ FONT_FAMILY_SEPARATOR,
176
+ NOTICE_FONT_FACE_STYLE_ID_PREFIX,
177
+ NOTICE_FONT_LOAD_ERROR_MESSAGE,
178
+ NOTICE_FONT_ROOT_PROPS,
179
+ toNoticeFontValue,
180
+ resolveNoticeFontFamily,
181
+ injectNoticeFontStyles
182
+ };
@@ -25,6 +25,10 @@ var useMediaQuery = (query) => {
25
25
  return matches;
26
26
  };
27
27
 
28
+ // src/shared/sandbox.ts
29
+ var SANDBOX_TOKEN_HEADER = "X-Consent-Token";
30
+
28
31
  export {
32
+ SANDBOX_TOKEN_HEADER,
29
33
  useMediaQuery
30
34
  };
@@ -0,0 +1,35 @@
1
+ import { N as NoticeFontEntry, a as NoticeFontSourceValue } from './types-6Aj7faxL.mjs';
2
+ export { b as NoticeFontFormat, c as NoticeFontGenericFallback, d as NoticeSystemFont, e as NoticeWebFont } from './types-6Aj7faxL.mjs';
3
+
4
+ /**
5
+ * Every font family the console can assign to a notice, in dropdown order
6
+ * (webfonts first, then system families). `source: "webfont"` families ship
7
+ * inside this package and load on demand; `"system"` families need no loading.
8
+ */
9
+ declare const NOTICE_FONT_CATALOGUE: ReadonlyArray<NoticeFontEntry>;
10
+
11
+ /**
12
+ * The family a stored `font_preference` will actually render in, canonically
13
+ * cased — the default family when the catalogue no longer offers the stored
14
+ * value, and `undefined` when nothing is stored. Lets a console dropdown show
15
+ * exactly what the notice will render.
16
+ */
17
+ declare const toNoticeFontValue: (fontPreference?: string) => string | undefined;
18
+ /**
19
+ * Resolves the `font-family` for a notice root. The two sources are deliberately
20
+ * NOT interchangeable:
21
+ *
22
+ * - `hostFont` is the integrator's own `settings.font`. They own it, so it is used
23
+ * as given — a family they loaded themselves, or a full stack, both pass through.
24
+ * - `noticeFont` is the console's stored `font_preference`, which is constrained to
25
+ * the catalogue. A value the console no longer offers resolves to the default
26
+ * family rather than being emitted verbatim, so the console and the rendered
27
+ * notice can never disagree. A side effect worth having: free text stored on the
28
+ * server can no longer reach the emitted CSS at all.
29
+ *
30
+ * Blank on both sides inherits the host page's font — "never set" is not the same
31
+ * as "set to something unavailable".
32
+ */
33
+ declare const resolveNoticeFontFamily: ({ hostFont, noticeFont, }: NoticeFontSourceValue) => string;
34
+
35
+ export { NOTICE_FONT_CATALOGUE, NoticeFontEntry, resolveNoticeFontFamily, toNoticeFontValue };
@@ -0,0 +1,35 @@
1
+ import { N as NoticeFontEntry, a as NoticeFontSourceValue } from './types-6Aj7faxL.js';
2
+ export { b as NoticeFontFormat, c as NoticeFontGenericFallback, d as NoticeSystemFont, e as NoticeWebFont } from './types-6Aj7faxL.js';
3
+
4
+ /**
5
+ * Every font family the console can assign to a notice, in dropdown order
6
+ * (webfonts first, then system families). `source: "webfont"` families ship
7
+ * inside this package and load on demand; `"system"` families need no loading.
8
+ */
9
+ declare const NOTICE_FONT_CATALOGUE: ReadonlyArray<NoticeFontEntry>;
10
+
11
+ /**
12
+ * The family a stored `font_preference` will actually render in, canonically
13
+ * cased — the default family when the catalogue no longer offers the stored
14
+ * value, and `undefined` when nothing is stored. Lets a console dropdown show
15
+ * exactly what the notice will render.
16
+ */
17
+ declare const toNoticeFontValue: (fontPreference?: string) => string | undefined;
18
+ /**
19
+ * Resolves the `font-family` for a notice root. The two sources are deliberately
20
+ * NOT interchangeable:
21
+ *
22
+ * - `hostFont` is the integrator's own `settings.font`. They own it, so it is used
23
+ * as given — a family they loaded themselves, or a full stack, both pass through.
24
+ * - `noticeFont` is the console's stored `font_preference`, which is constrained to
25
+ * the catalogue. A value the console no longer offers resolves to the default
26
+ * family rather than being emitted verbatim, so the console and the rendered
27
+ * notice can never disagree. A side effect worth having: free text stored on the
28
+ * server can no longer reach the emitted CSS at all.
29
+ *
30
+ * Blank on both sides inherits the host page's font — "never set" is not the same
31
+ * as "set to something unavailable".
32
+ */
33
+ declare const resolveNoticeFontFamily: ({ hostFont, noticeFont, }: NoticeFontSourceValue) => string;
34
+
35
+ export { NOTICE_FONT_CATALOGUE, NoticeFontEntry, resolveNoticeFontFamily, toNoticeFontValue };
package/dist/fonts.js ADDED
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/fonts.ts
21
+ var fonts_exports = {};
22
+ __export(fonts_exports, {
23
+ NOTICE_FONT_CATALOGUE: () => NOTICE_FONT_CATALOGUE,
24
+ resolveNoticeFontFamily: () => resolveNoticeFontFamily,
25
+ toNoticeFontValue: () => toNoticeFontValue
26
+ });
27
+ module.exports = __toCommonJS(fonts_exports);
28
+
29
+ // src/shared/font-catalogue.generated.ts
30
+ var NOTICE_FONT_CATALOGUE = [
31
+ {
32
+ id: "montserrat",
33
+ slug: "montserrat",
34
+ value: "Montserrat",
35
+ label: "Montserrat",
36
+ cssFamily: "Montserrat",
37
+ stack: 'Montserrat, "Trebuchet MS", "Segoe UI", Arial, sans-serif',
38
+ genericFallback: "sans-serif",
39
+ source: "webfont",
40
+ weights: [400, 500, 600, 700],
41
+ formats: ["woff2", "ttf"]
42
+ },
43
+ {
44
+ id: "arial",
45
+ slug: "arial",
46
+ value: "Arial",
47
+ label: "Arial",
48
+ cssFamily: "Arial",
49
+ stack: "Arial, Helvetica, sans-serif",
50
+ genericFallback: "sans-serif",
51
+ source: "system"
52
+ },
53
+ {
54
+ id: "georgia",
55
+ slug: "georgia",
56
+ value: "Georgia",
57
+ label: "Georgia",
58
+ cssFamily: "Georgia",
59
+ stack: 'Georgia, "Times New Roman", Times, serif',
60
+ genericFallback: "serif",
61
+ source: "system"
62
+ },
63
+ {
64
+ id: "times new roman",
65
+ slug: "times-new-roman",
66
+ value: "Times New Roman",
67
+ label: "Times New Roman",
68
+ cssFamily: "Times New Roman",
69
+ stack: '"Times New Roman", Times, serif',
70
+ genericFallback: "serif",
71
+ source: "system"
72
+ },
73
+ {
74
+ id: "trebuchet ms",
75
+ slug: "trebuchet-ms",
76
+ value: "Trebuchet MS",
77
+ label: "Trebuchet MS",
78
+ cssFamily: "Trebuchet MS",
79
+ stack: '"Trebuchet MS", "Lucida Sans Unicode", "Lucida Grande", sans-serif',
80
+ genericFallback: "sans-serif",
81
+ source: "system"
82
+ },
83
+ {
84
+ id: "verdana",
85
+ slug: "verdana",
86
+ value: "Verdana",
87
+ label: "Verdana",
88
+ cssFamily: "Verdana",
89
+ stack: "Verdana, Geneva, sans-serif",
90
+ genericFallback: "sans-serif",
91
+ source: "system"
92
+ }
93
+ ];
94
+ var NOTICE_FONT_ENTRY_BY_ID = Object.fromEntries(NOTICE_FONT_CATALOGUE.map((entry) => [entry.id, entry]));
95
+
96
+ // src/shared/constants.ts
97
+ var INHERIT_FONT_FAMILY = "inherit";
98
+ var NOTICE_FONT_STACKS = Object.fromEntries(
99
+ NOTICE_FONT_CATALOGUE.map((entry) => [entry.id, entry.stack])
100
+ );
101
+ var NOTICE_FONT_GENERIC_FALLBACK = ", sans-serif";
102
+ var DEFAULT_NOTICE_FONT_ID = "arial";
103
+ var CSS_FONT_KEYWORDS = [
104
+ "inherit",
105
+ "initial",
106
+ "revert",
107
+ "revert-layer",
108
+ "unset",
109
+ "serif",
110
+ "sans-serif",
111
+ "monospace",
112
+ "cursive",
113
+ "fantasy",
114
+ "system-ui",
115
+ "ui-serif",
116
+ "ui-sans-serif",
117
+ "ui-monospace",
118
+ "ui-rounded",
119
+ "math",
120
+ "emoji",
121
+ "fangsong"
122
+ ];
123
+ var UNSAFE_FONT_CHARACTERS = /["';{}\\]/g;
124
+ var NOTICE_FONT_ROOT_ATTRIBUTE = "data-redacto-notice-font";
125
+ var NOTICE_FONT_ROOT_PROPS = {
126
+ [NOTICE_FONT_ROOT_ATTRIBUTE]: ""
127
+ };
128
+ var NOTICE_FONT_CSS = `
129
+ [${NOTICE_FONT_ROOT_ATTRIBUTE}] button,
130
+ [${NOTICE_FONT_ROOT_ATTRIBUTE}] input,
131
+ [${NOTICE_FONT_ROOT_ATTRIBUTE}] optgroup,
132
+ [${NOTICE_FONT_ROOT_ATTRIBUTE}] option,
133
+ [${NOTICE_FONT_ROOT_ATTRIBUTE}] select,
134
+ [${NOTICE_FONT_ROOT_ATTRIBUTE}] textarea {
135
+ font-family: inherit;
136
+ }
137
+ `;
138
+
139
+ // src/shared/notice-font.ts
140
+ var toFontFamilyValue = (value) => {
141
+ var _a;
142
+ if (value.includes(",")) {
143
+ return value;
144
+ }
145
+ const family = value.replace(UNSAFE_FONT_CHARACTERS, "").trim();
146
+ if (!family) {
147
+ return INHERIT_FONT_FAMILY;
148
+ }
149
+ const lowered = family.toLowerCase();
150
+ if (CSS_FONT_KEYWORDS.includes(lowered)) {
151
+ return lowered;
152
+ }
153
+ return (_a = NOTICE_FONT_STACKS[lowered]) != null ? _a : `"${family}"${NOTICE_FONT_GENERIC_FALLBACK}`;
154
+ };
155
+ var toNoticeFontEntry = (fontPreference) => {
156
+ var _a;
157
+ const stored = fontPreference == null ? void 0 : fontPreference.trim();
158
+ if (!stored) {
159
+ return void 0;
160
+ }
161
+ return (_a = NOTICE_FONT_ENTRY_BY_ID[stored.toLowerCase()]) != null ? _a : NOTICE_FONT_ENTRY_BY_ID[DEFAULT_NOTICE_FONT_ID];
162
+ };
163
+ var toNoticeFontValue = (fontPreference) => {
164
+ var _a;
165
+ return (_a = toNoticeFontEntry(fontPreference)) == null ? void 0 : _a.value;
166
+ };
167
+ var resolveNoticeFontFamily = ({
168
+ hostFont,
169
+ noticeFont
170
+ }) => {
171
+ var _a, _b;
172
+ const host = hostFont == null ? void 0 : hostFont.trim();
173
+ if (host) {
174
+ return toFontFamilyValue(host);
175
+ }
176
+ return (_b = (_a = toNoticeFontEntry(noticeFont)) == null ? void 0 : _a.stack) != null ? _b : INHERIT_FONT_FAMILY;
177
+ };
178
+ // Annotate the CommonJS export names for ESM import in node:
179
+ 0 && (module.exports = {
180
+ NOTICE_FONT_CATALOGUE,
181
+ resolveNoticeFontFamily,
182
+ toNoticeFontValue
183
+ });
package/dist/fonts.mjs ADDED
@@ -0,0 +1,10 @@
1
+ import {
2
+ NOTICE_FONT_CATALOGUE,
3
+ resolveNoticeFontFamily,
4
+ toNoticeFontValue
5
+ } from "./chunk-FEGTW73Q.mjs";
6
+ export {
7
+ NOTICE_FONT_CATALOGUE,
8
+ resolveNoticeFontFamily,
9
+ toNoticeFontValue
10
+ };