@tantainnovative/ndpr-toolkit 3.5.1 → 3.6.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 (199) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/README.md +29 -8
  3. package/dist/adapters.d.mts +137 -3
  4. package/dist/adapters.d.ts +137 -3
  5. package/dist/adapters.js +1 -2
  6. package/dist/adapters.mjs +1 -2
  7. package/dist/breach.d.mts +80 -1
  8. package/dist/breach.d.ts +80 -1
  9. package/dist/breach.js +1 -2
  10. package/dist/breach.mjs +1 -2
  11. package/dist/{chunk-PATONNTZ.mjs → chunk-3HOXQNCH.mjs} +1 -2
  12. package/dist/{chunk-MJGOLP5M.js → chunk-3IA3KDII.js} +1 -2
  13. package/dist/{chunk-M2TPT5GB.js → chunk-3JPDTXGC.js} +1 -2
  14. package/dist/{chunk-BKRETVJ6.js → chunk-3YTAOT5O.js} +1 -2
  15. package/dist/{chunk-GOU6FU6Y.js → chunk-4CVBQC66.js} +1 -2
  16. package/dist/{chunk-E4NCJ7RD.mjs → chunk-4G3SRVRI.mjs} +1 -2
  17. package/dist/{chunk-6QPRDQZF.js → chunk-4QXTB3L6.js} +1 -2
  18. package/dist/{chunk-XNSZ7KUH.js → chunk-5GVMKUMP.js} +1 -2
  19. package/dist/chunk-66NQ5CVY.mjs +1 -0
  20. package/dist/chunk-732C2EVN.js +1 -0
  21. package/dist/chunk-7BJXI2HI.mjs +1 -0
  22. package/dist/{chunk-C5QO3SX4.js → chunk-7IFSWCQP.js} +1 -2
  23. package/dist/{chunk-A4PK7JB2.js → chunk-7ZZO7GVB.js} +1 -2
  24. package/dist/chunk-AME4HJR4.js +1 -0
  25. package/dist/chunk-AOHKVFAS.mjs +322 -0
  26. package/dist/{chunk-HO5M7M4M.js → chunk-B46SJB5V.js} +1 -2
  27. package/dist/chunk-BFAX7JQA.mjs +1 -0
  28. package/dist/{chunk-ID2NYIVE.mjs → chunk-BNHQFZHL.mjs} +2 -3
  29. package/dist/{chunk-RLYTX3MM.js → chunk-BRS52EDT.js} +1 -2
  30. package/dist/{chunk-OPYQIJKY.js → chunk-C7IDR2IV.js} +1 -2
  31. package/dist/{chunk-CISJAQ6W.mjs → chunk-COD3RMTL.mjs} +1 -2
  32. package/dist/chunk-CR2QZTGW.js +1 -0
  33. package/dist/{chunk-6WIP33TW.mjs → chunk-DBZSN4WP.mjs} +1 -2
  34. package/dist/{chunk-74Z23WUA.mjs → chunk-EEQALYOY.mjs} +1 -2
  35. package/dist/chunk-EFIBHKQE.mjs +1 -0
  36. package/dist/{chunk-GKKAK6ES.mjs → chunk-EWVK45Z3.mjs} +1 -2
  37. package/dist/{chunk-QSVVAZVT.mjs → chunk-EXEXUAF6.mjs} +1 -2
  38. package/dist/chunk-EZCGTHQV.js +6 -0
  39. package/dist/{chunk-SYMQJO2W.mjs → chunk-GTYXVAJX.mjs} +2 -3
  40. package/dist/{chunk-6FGCGLH5.mjs → chunk-H3XJV2IR.mjs} +1 -2
  41. package/dist/chunk-HBLGN4SD.js +1 -0
  42. package/dist/{chunk-MCWV7S2G.js → chunk-HHK5LHEG.js} +1 -2
  43. package/dist/{chunk-XHROISIF.mjs → chunk-HWHBINVN.mjs} +1 -2
  44. package/dist/{chunk-3EGQWLJ6.js → chunk-I2LMQWK3.js} +2 -3
  45. package/dist/{chunk-NQNFS3QI.js → chunk-I3Y4LOSL.js} +4 -5
  46. package/dist/chunk-ITCY2Z66.mjs +4 -0
  47. package/dist/{chunk-Z6IIMLZU.mjs → chunk-KDAZQO3N.mjs} +1 -2
  48. package/dist/{chunk-J5WCPZLW.js → chunk-L2BRFMVS.js} +1 -2
  49. package/dist/chunk-L2VO3MEJ.js +1 -0
  50. package/dist/{chunk-R5FW5XUQ.mjs → chunk-LQTARVPU.mjs} +1 -2
  51. package/dist/{chunk-6TA2MVTU.mjs → chunk-LRRENTT5.mjs} +1 -2
  52. package/dist/chunk-LTPSN2SU.mjs +1 -0
  53. package/dist/{chunk-LIM64IV2.js → chunk-LVGT3DLT.js} +2 -3
  54. package/dist/{chunk-TXBZPCGF.mjs → chunk-LWIKDDSU.mjs} +1 -2
  55. package/dist/chunk-MPBPAEZC.mjs +1 -0
  56. package/dist/{chunk-Z73T6MWY.js → chunk-N3MQQUQP.js} +39 -35
  57. package/dist/{chunk-HGGLW5TE.js → chunk-NUWVPRNI.js} +1 -2
  58. package/dist/chunk-O45PKBZA.mjs +6 -0
  59. package/dist/chunk-O6CUBNXK.mjs +3 -0
  60. package/dist/{chunk-7SMLHZ4B.js → chunk-P4LNLCSF.js} +1 -2
  61. package/dist/{chunk-VWPGIES4.mjs → chunk-PCU6GKBE.mjs} +1 -2
  62. package/dist/chunk-PGI2LM6P.js +103 -0
  63. package/dist/{chunk-U62QYKVG.mjs → chunk-PJNKQPQP.mjs} +1 -2
  64. package/dist/chunk-PL4XNCQA.mjs +1 -0
  65. package/dist/{chunk-LSNL4XR5.js → chunk-PZRQWPWD.js} +1 -2
  66. package/dist/chunk-Q64735OC.js +144 -0
  67. package/dist/chunk-QPRYXVH2.js +1 -0
  68. package/dist/{chunk-MQFZHA2D.js → chunk-RFPLZDIO.js} +1 -2
  69. package/dist/chunk-RMQ7OLNY.mjs +144 -0
  70. package/dist/chunk-ROTLSZMV.js +1 -0
  71. package/dist/{chunk-2AW7KAZO.mjs → chunk-RPXRPGHL.mjs} +1 -2
  72. package/dist/chunk-RV2VMWZJ.mjs +1 -0
  73. package/dist/chunk-RXZFYBUJ.js +1 -0
  74. package/dist/chunk-RYREGZVQ.js +1 -0
  75. package/dist/{chunk-B4Z5MBUC.mjs → chunk-RZ6GC6WN.mjs} +1 -2
  76. package/dist/chunk-S6COXIZA.js +2 -0
  77. package/dist/chunk-SFGW37LE.mjs +1 -0
  78. package/dist/{chunk-3NQQSU4P.js → chunk-SJDDNB6M.js} +1 -2
  79. package/dist/chunk-SJRIOZ4K.mjs +1 -0
  80. package/dist/{chunk-H3EYBSVP.mjs → chunk-TMXK4QKK.mjs} +2 -3
  81. package/dist/{chunk-P42Z5CFE.js → chunk-TQZWJGJ2.js} +1 -2
  82. package/dist/{chunk-EPT2K355.mjs → chunk-U5RWJRGA.mjs} +1 -2
  83. package/dist/{chunk-R3OYAJI6.mjs → chunk-UASG46LP.mjs} +1 -2
  84. package/dist/{chunk-RXL6CZAI.js → chunk-UAV7V4EM.js} +1 -2
  85. package/dist/chunk-UI536RU2.js +3 -0
  86. package/dist/{chunk-7AVN424U.js → chunk-UTFBKL73.js} +1 -2
  87. package/dist/{chunk-I54CDQGN.js → chunk-UXUMYP4L.js} +1 -2
  88. package/dist/chunk-V3RYHNHN.js +1 -0
  89. package/dist/{chunk-P3PULLYP.mjs → chunk-V7UFP6QU.mjs} +1 -2
  90. package/dist/{chunk-I4M2AA3N.js → chunk-VJTQXVAF.js} +1 -2
  91. package/dist/{chunk-ELKB2AFZ.js → chunk-VWED6UTN.js} +1 -2
  92. package/dist/{chunk-LU7PKE7Y.mjs → chunk-VYAL2TGT.mjs} +1 -2
  93. package/dist/chunk-W47OSMT6.js +2 -0
  94. package/dist/chunk-W65ZWTLD.mjs +1 -0
  95. package/dist/chunk-W7RBGZCC.js +1 -0
  96. package/dist/{chunk-5HL4UBFV.js → chunk-WDDCKYWA.js} +1 -2
  97. package/dist/{chunk-DJGS7SSN.mjs → chunk-WTGKZX7J.mjs} +1 -2
  98. package/dist/{chunk-TDDAYVKK.js → chunk-WZYCBW2R.js} +1 -2
  99. package/dist/chunk-X3GCGC3H.mjs +103 -0
  100. package/dist/chunk-XJO4DH3L.mjs +2 -0
  101. package/dist/{chunk-LWXZMKC2.js → chunk-XO3VQYTL.js} +7 -8
  102. package/dist/{chunk-IZCWCE7W.mjs → chunk-XOH4WXOZ.mjs} +1 -2
  103. package/dist/{chunk-SHMJNRHO.mjs → chunk-XP5PL6K7.mjs} +1 -2
  104. package/dist/{chunk-CKGJK4D7.mjs → chunk-Y3MKMAFQ.mjs} +2 -3
  105. package/dist/chunk-YFBDJ4FH.js +1 -0
  106. package/dist/chunk-YTU4FNM2.mjs +1 -0
  107. package/dist/{chunk-TV4U6AIS.js → chunk-Z763UI5U.js} +1 -2
  108. package/dist/chunk-ZHFLBL63.mjs +2 -0
  109. package/dist/{chunk-RRVKUCFR.mjs → chunk-ZIZL37BG.mjs} +1 -2
  110. package/dist/{chunk-WWT2ZSNU.mjs → chunk-ZJYULEER.mjs} +1 -2
  111. package/dist/{chunk-LJNNPAFU.mjs → chunk-ZQZJNKVB.mjs} +1 -2
  112. package/dist/chunk-ZVOIR4QH.js +4 -0
  113. package/dist/consent.js +1 -2
  114. package/dist/consent.mjs +1 -2
  115. package/dist/core.d.mts +98 -19
  116. package/dist/core.d.ts +98 -19
  117. package/dist/core.js +1 -2
  118. package/dist/core.mjs +1 -2
  119. package/dist/cross-border.d.mts +36 -14
  120. package/dist/cross-border.d.ts +36 -14
  121. package/dist/cross-border.js +1 -2
  122. package/dist/cross-border.mjs +1 -2
  123. package/dist/dpia.d.mts +4 -4
  124. package/dist/dpia.d.ts +4 -4
  125. package/dist/dpia.js +1 -2
  126. package/dist/dpia.mjs +1 -2
  127. package/dist/dsr.d.mts +30 -17
  128. package/dist/dsr.d.ts +30 -17
  129. package/dist/dsr.js +1 -2
  130. package/dist/dsr.mjs +1 -2
  131. package/dist/hooks.d.mts +113 -20
  132. package/dist/hooks.d.ts +113 -20
  133. package/dist/hooks.js +1 -2
  134. package/dist/hooks.mjs +1 -2
  135. package/dist/index.d.mts +422 -26
  136. package/dist/index.d.ts +422 -26
  137. package/dist/index.js +1 -2
  138. package/dist/index.mjs +1 -2
  139. package/dist/lawful-basis.js +1 -2
  140. package/dist/lawful-basis.mjs +1 -2
  141. package/dist/policy.js +1 -2
  142. package/dist/policy.mjs +1 -2
  143. package/dist/presets-consent.d.mts +139 -0
  144. package/dist/presets-consent.d.ts +139 -0
  145. package/dist/presets-consent.js +2 -0
  146. package/dist/presets-consent.mjs +2 -0
  147. package/dist/presets-dsr.d.mts +133 -0
  148. package/dist/presets-dsr.d.ts +133 -0
  149. package/dist/presets-dsr.js +2 -0
  150. package/dist/presets-dsr.mjs +2 -0
  151. package/dist/presets-policy.d.mts +203 -0
  152. package/dist/presets-policy.d.ts +203 -0
  153. package/dist/presets-policy.js +2 -0
  154. package/dist/presets-policy.mjs +2 -0
  155. package/dist/presets.d.mts +127 -5
  156. package/dist/presets.d.ts +127 -5
  157. package/dist/presets.js +1 -2
  158. package/dist/presets.mjs +1 -2
  159. package/dist/ropa.js +1 -2
  160. package/dist/ropa.mjs +1 -2
  161. package/dist/server.d.mts +226 -22
  162. package/dist/server.d.ts +226 -22
  163. package/dist/server.js +1 -2
  164. package/dist/server.mjs +1 -2
  165. package/dist/styles.css +34 -0
  166. package/dist/unstyled.d.mts +3 -1
  167. package/dist/unstyled.d.ts +3 -1
  168. package/dist/unstyled.js +1 -2
  169. package/dist/unstyled.mjs +1 -2
  170. package/package.json +83 -20
  171. package/dist/chunk-3VQAYQR7.js +0 -7
  172. package/dist/chunk-6HZL2WDU.mjs +0 -2
  173. package/dist/chunk-75TJPK2N.mjs +0 -2
  174. package/dist/chunk-ABDB7LEV.mjs +0 -2
  175. package/dist/chunk-AYKLAEOU.mjs +0 -2
  176. package/dist/chunk-C4YM4UMI.js +0 -2
  177. package/dist/chunk-CKJAECGV.js +0 -2
  178. package/dist/chunk-CPK5D5FY.js +0 -132
  179. package/dist/chunk-CWHBCQGT.mjs +0 -2
  180. package/dist/chunk-E64TU6IU.js +0 -2
  181. package/dist/chunk-F5TXUA4O.mjs +0 -4
  182. package/dist/chunk-GN5C32JB.mjs +0 -2
  183. package/dist/chunk-GRLIPT5V.mjs +0 -132
  184. package/dist/chunk-I557S566.mjs +0 -15
  185. package/dist/chunk-JBSCER34.js +0 -2
  186. package/dist/chunk-JFFOPHU3.mjs +0 -318
  187. package/dist/chunk-KF3EFJEF.mjs +0 -3
  188. package/dist/chunk-ORFC66EA.js +0 -4
  189. package/dist/chunk-RY3PGVLZ.mjs +0 -2
  190. package/dist/chunk-S4GRSNB4.js +0 -2
  191. package/dist/chunk-SCWNM4PC.mjs +0 -2
  192. package/dist/chunk-SKKOMFXH.js +0 -81
  193. package/dist/chunk-TCN22KYP.mjs +0 -7
  194. package/dist/chunk-TUNQUVHU.mjs +0 -81
  195. package/dist/chunk-VIQUXWJC.js +0 -2
  196. package/dist/chunk-WTJGLNTB.js +0 -3
  197. package/dist/chunk-XIM7KMD6.js +0 -2
  198. package/dist/chunk-YPKUHSK4.js +0 -15
  199. package/dist/chunk-ZPKVLTSX.js +0 -2
package/dist/server.d.ts CHANGED
@@ -3,10 +3,144 @@
3
3
  */
4
4
  export declare type AdequacyStatus = 'adequate' | 'inadequate' | 'pending_review' | 'unknown';
5
5
 
6
- export declare function apiAdapter<T = unknown>(endpoint: string, options?: ApiAdapterOptions): StorageAdapter<T>;
6
+ /**
7
+ * Production-ready API storage adapter.
8
+ *
9
+ * Backward-compatible with the 3.5.x signature — `apiAdapter('/api/x')`
10
+ * still works exactly as before. New options are all opt-in.
11
+ *
12
+ * @example basic
13
+ * const adapter = apiAdapter<ConsentSettings>('/api/consent');
14
+ *
15
+ * @example with credentials and CSRF
16
+ * const adapter = apiAdapter<ConsentSettings>('/api/consent', {
17
+ * credentials: 'include',
18
+ * headers: () => ({
19
+ * 'X-CSRF-Token': document.querySelector<HTMLMetaElement>(
20
+ * 'meta[name="csrf-token"]'
21
+ * )?.content ?? '',
22
+ * }),
23
+ * });
24
+ *
25
+ * @example with retry + telemetry
26
+ * const adapter = apiAdapter<ConsentSettings>('/api/consent', {
27
+ * retry: { attempts: 2, baseDelayMs: 300 },
28
+ * onError: (ctx) => Sentry.captureException(ctx.error, { extra: ctx }),
29
+ * onSuccess: (ctx) => analytics.track('consent_saved', { method: ctx.method }),
30
+ * });
31
+ *
32
+ * @example with response unwrap
33
+ * const adapter = apiAdapter<ConsentSettings>('/api/consent', {
34
+ * // API returns { data: ConsentSettings, ok: true }
35
+ * unwrap: (raw) => (raw as { data: ConsentSettings }).data,
36
+ * });
37
+ */
38
+ export declare function apiAdapter<T = unknown>(endpoint: string, options?: ApiAdapterOptions<T>): StorageAdapter<T>;
39
+
40
+ declare interface ApiAdapterErrorContext<T = unknown> {
41
+ /** Which adapter operation triggered this — `load`, `save`, or `remove`. */
42
+ method: ApiAdapterMethod;
43
+ /** The endpoint URL that failed. */
44
+ endpoint: string;
45
+ /** Underlying error (for network failures / parse errors). */
46
+ error?: unknown;
47
+ /** Response object, if a response was received. */
48
+ response?: Response;
49
+ /** HTTP status code, if available. */
50
+ status?: number;
51
+ /** For `save`, the payload that failed to send. */
52
+ payload?: T;
53
+ /** Which retry attempt this is (0 = first try). Capped at `retry.attempts`. */
54
+ attempt: number;
55
+ }
56
+
57
+ declare type ApiAdapterMethod = 'load' | 'save' | 'remove';
58
+
59
+ declare interface ApiAdapterOptions<T = unknown> {
60
+ /**
61
+ * Extra HTTP headers to send with every request. Useful for `Authorization`,
62
+ * `X-CSRF-Token`, `X-Requested-With`, etc.
63
+ *
64
+ * Can also be a function that returns headers, which lets you read a CSRF
65
+ * token from the DOM/cookie at request time rather than at adapter
66
+ * construction time.
67
+ */
68
+ headers?: Record<string, string> | (() => Record<string, string>);
69
+ /**
70
+ * Forwarded to fetch's `credentials` option. Defaults to `'same-origin'`
71
+ * (the browser default). Set to `'include'` for cross-origin endpoints
72
+ * that need cookies / auth.
73
+ */
74
+ credentials?: RequestCredentials;
75
+ /**
76
+ * HTTP method override for the load operation. Defaults to `'GET'`.
77
+ */
78
+ loadMethod?: 'GET' | 'POST';
79
+ /**
80
+ * HTTP method override for the save operation. Defaults to `'POST'`. Some
81
+ * REST APIs prefer `'PUT'` for upsert semantics.
82
+ */
83
+ saveMethod?: 'POST' | 'PUT' | 'PATCH';
84
+ /**
85
+ * Transform the raw JSON response into the expected `T`. Useful for APIs
86
+ * that wrap responses in `{ data: ... }` or similar envelopes. Called
87
+ * after `res.json()`. If omitted, the parsed JSON is used as-is.
88
+ */
89
+ unwrap?: (raw: unknown) => T | null;
90
+ /**
91
+ * Retry policy for failed requests. Defaults to no retries (preserves the
92
+ * pre-3.6.0 behaviour). When configured, applies to all three operations.
93
+ */
94
+ retry?: ApiAdapterRetryConfig;
95
+ /**
96
+ * Called when a request fails (after all retries exhausted). The adapter
97
+ * still returns a graceful null/void result so the consuming hook
98
+ * doesn't crash — this hook is for telemetry, toasts, or audit logging.
99
+ */
100
+ onError?: (ctx: ApiAdapterErrorContext<T>) => void;
101
+ /**
102
+ * Called when a request succeeds. Useful for cache invalidation,
103
+ * analytics, or syncing other state.
104
+ */
105
+ onSuccess?: (ctx: ApiAdapterSuccessContext<T>) => void;
106
+ /**
107
+ * Per-request fetch options to merge into every request. Use this for
108
+ * things `fetch` itself supports that aren't directly modelled above —
109
+ * `signal`, `mode`, `cache`, `redirect`, etc.
110
+ */
111
+ fetchInit?: Omit<RequestInit, 'method' | 'headers' | 'body' | 'credentials'>;
112
+ }
113
+
114
+ declare interface ApiAdapterRetryConfig {
115
+ /**
116
+ * Number of additional attempts after the initial request. Defaults to 0
117
+ * (no retries). e.g. `attempts: 2` means up to 3 total requests.
118
+ */
119
+ attempts?: number;
120
+ /**
121
+ * Base delay in ms between attempts. Defaults to 250ms. The actual delay
122
+ * uses exponential backoff: `baseDelayMs * 2^attempt`.
123
+ */
124
+ baseDelayMs?: number;
125
+ /**
126
+ * Predicate that decides whether to retry given the failure context. By
127
+ * default we retry on network errors and 5xx responses, but not on 4xx
128
+ * (those are client errors that won't fix themselves).
129
+ */
130
+ shouldRetry?: (ctx: ApiAdapterErrorContext<unknown>) => boolean;
131
+ }
7
132
 
8
- declare interface ApiAdapterOptions {
9
- headers?: Record<string, string>;
133
+ declare interface ApiAdapterSuccessContext<T = unknown> {
134
+ /** Which adapter operation succeeded — `load`, `save`, or `remove`. */
135
+ method: ApiAdapterMethod;
136
+ /** The endpoint URL. */
137
+ endpoint: string;
138
+ /** Response object. */
139
+ response: Response;
140
+ /** For `load` operations, the parsed (and optionally unwrapped) data. */
141
+ data?: T;
142
+ /** For `save` operations, the payload that was sent. */
143
+ payload?: T;
10
144
  }
11
145
 
12
146
  /**
@@ -139,10 +273,51 @@ export declare interface BreachReport {
139
273
  affectedSystems: string[];
140
274
  /** Types of data involved in the breach */
141
275
  dataTypes: string[];
142
- /** Whether sensitive personal data is involved (NDPA Section 27) */
276
+ /** Whether sensitive personal data is involved (NDPA Section 30) */
143
277
  involvesSensitiveData?: boolean;
144
278
  /** Estimated number of data subjects affected */
145
279
  estimatedAffectedSubjects?: number;
280
+ /**
281
+ * Approximate number of personal data RECORDS concerned (distinct from subject count).
282
+ * Required content under NDPA Section 40(1)(a) and Section 40(2).
283
+ */
284
+ approximateRecordCount?: number;
285
+ /**
286
+ * Categories of data subjects affected (e.g. customers, employees, minors, patients).
287
+ * Required content under NDPA Section 40(1)(a) and Section 40(2).
288
+ */
289
+ dataSubjectCategories?: string[];
290
+ /**
291
+ * Likely consequences of the breach for affected data subjects (e.g. identity theft,
292
+ * financial loss, reputational damage). Reported to the NDPC and, where applicable,
293
+ * communicated to data subjects under Section 40(3).
294
+ */
295
+ likelyConsequences?: string;
296
+ /**
297
+ * Measures taken or proposed to mitigate adverse effects of the breach.
298
+ * Required content for Section 40(3) communications to data subjects.
299
+ */
300
+ mitigationMeasures?: string;
301
+ /**
302
+ * Whether this is a phased / interim report submitted before full investigation
303
+ * is complete. The NDPC permits phased reporting where complete information is
304
+ * not available within 72 hours.
305
+ */
306
+ isPhasedReport?: boolean;
307
+ /**
308
+ * ID of the prior phased report this report supplements, if any.
309
+ */
310
+ supplementsReportId?: string;
311
+ /**
312
+ * Data Protection Officer contact details. The DPO is the named contact point
313
+ * for the NDPC per NDPA Section 32(3)(c). Required content in the regulatory
314
+ * report (Section 40(2)).
315
+ */
316
+ dpoContact?: {
317
+ name: string;
318
+ email: string;
319
+ phone?: string;
320
+ };
146
321
  /** Whether the breach is ongoing or contained */
147
322
  status: 'ongoing' | 'contained' | 'resolved';
148
323
  /** Initial actions taken to address the breach */
@@ -823,20 +998,25 @@ export declare interface DsrSubmissionValidationResult {
823
998
  }
824
999
 
825
1000
  /**
826
- * Data Subject Rights types aligned with NDPA 2023 Part IV (Sections 29-36)
1001
+ * Data Subject Rights types aligned with NDPA 2023 Part VI (Sections 34-38)
1002
+ * and the related provisions in Part V (Section 27 — information to the data subject)
1003
+ * and Part X (Section 46 — complaint to the Commission).
1004
+ *
1005
+ * Note: These are guidance labels — not legal advice. Verify with your DPO or counsel.
827
1006
  */
828
1007
  /**
829
- * Types of data subject requests per NDPA Part IV
830
- * - 'information': Right to be informed (Section 29)
831
- * - 'access': Right of access (Section 30)
832
- * - 'rectification': Right to rectification (Section 31)
833
- * - 'erasure': Right to erasure (Section 32)
834
- * - 'restriction': Right to restrict processing (Section 33)
835
- * - 'portability': Right to data portability (Section 34)
836
- * - 'objection': Right to object (Section 35)
837
- * - 'automated_decision_making': Rights related to automated decision-making (Section 36)
1008
+ * Types of data subject requests per NDPA Part VI
1009
+ * - 'information': Right to be informed (Section 27 — provision of information; Section 34(1)(a))
1010
+ * - 'access': Right of access / confirmation + data copy (Section 34(1)(a)–(b))
1011
+ * - 'rectification': Right to rectification (Section 34(1)(c))
1012
+ * - 'erasure': Right to erasure (Section 34(1)(d), Section 34(2))
1013
+ * - 'restriction': Right to restrict processing (Section 34(1)(e))
1014
+ * - 'portability': Right to data portability (Section 38)
1015
+ * - 'objection': Right to object (Section 36)
1016
+ * - 'automated_decision_making': Rights re. automated decisions / profiling (Section 37)
1017
+ * - 'withdraw_consent': Right to withdraw consent (Section 35)
838
1018
  */
839
- export declare type DSRType = 'information' | 'access' | 'rectification' | 'erasure' | 'restriction' | 'portability' | 'objection' | 'automated_decision_making';
1019
+ export declare type DSRType = 'information' | 'access' | 'rectification' | 'erasure' | 'restriction' | 'portability' | 'objection' | 'automated_decision_making' | 'withdraw_consent';
840
1020
 
841
1021
  export declare type EffortLevel = 'low' | 'medium' | 'high';
842
1022
 
@@ -1100,11 +1280,13 @@ export declare type Industry = 'fintech' | 'healthcare' | 'ecommerce' | 'saas' |
1100
1280
 
1101
1281
  /**
1102
1282
  * Returns whether NDPC approval is required for a given transfer mechanism.
1103
- * Approval is required for standard contractual clauses (Section 42),
1104
- * binding corporate rules (Section 43), and specific NDPC authorization (Section 44).
1283
+ * Under NDPA Section 42(5), the Commission may approve binding corporate rules,
1284
+ * codes of conduct, certification mechanisms, or similar instruments. Standard
1285
+ * contractual clauses are one of the appropriate safeguards under Section 41(1)(a)
1286
+ * and the Commission may approve them per Section 42(4).
1105
1287
  *
1106
1288
  * @param mechanism The transfer mechanism
1107
- * @returns Whether NDPC approval is required
1289
+ * @returns Whether NDPC approval is typically required
1108
1290
  */
1109
1291
  export declare function isNDPCApprovalRequired(mechanism: TransferMechanism): boolean;
1110
1292
 
@@ -1162,6 +1344,23 @@ export declare interface LawfulBasisValidationResult {
1162
1344
  warnings: string[];
1163
1345
  }
1164
1346
 
1347
+ /**
1348
+ * Full disclaimer suitable for PDF/DOCX footers and exported artifacts.
1349
+ */
1350
+ export declare const LEGAL_DISCLAIMER_LONG: string;
1351
+
1352
+ /**
1353
+ * Short disclaimer suitable for component captions and dashboard footers.
1354
+ * One line, no markdown.
1355
+ */
1356
+ export declare const LEGAL_DISCLAIMER_SHORT = "Generated for guidance only. Not legal advice \u2014 verify with your DPO or counsel.";
1357
+
1358
+ /**
1359
+ * Returns the long disclaimer wrapped with a leading heading suitable for
1360
+ * embedding at the foot of an exported document.
1361
+ */
1362
+ export declare function legalDisclaimerBlock(heading?: string): string;
1363
+
1165
1364
  /**
1166
1365
  * Represents a Legitimate Interest Assessment (LIA)
1167
1366
  * Required when the lawful basis is 'legitimate_interests'
@@ -1770,7 +1969,9 @@ export declare interface RequestType {
1770
1969
  /** Description of what this request type entails */
1771
1970
  description: string;
1772
1971
  /**
1773
- * NDPA section reference (e.g., "Section 30" for access requests)
1972
+ * NDPA 2023 section reference for this right
1973
+ * (e.g., "Section 34(1)(a)" for access, "Section 38" for portability).
1974
+ * Used for display purposes only — verify the exact subsection with counsel.
1774
1975
  */
1775
1976
  ndpaSection?: string;
1776
1977
  /**
@@ -1978,8 +2179,11 @@ export declare interface TransferImpactAssessment {
1978
2179
  }
1979
2180
 
1980
2181
  /**
1981
- * Cross-Border Data Transfer types aligned with NDPA 2023 Part VI (Sections 41-45)
1982
- * Personal data may only be transferred outside Nigeria under specific conditions
2182
+ * Cross-Border Data Transfer types aligned with NDPA 2023 Part VIII (Sections 41-43).
2183
+ * Personal data may only be transferred outside Nigeria under the bases listed in
2184
+ * Section 41(1), where Section 42 defines adequacy and Section 43 lists derogations.
2185
+ *
2186
+ * Note: These are guidance labels — not legal advice. Verify with your DPO or counsel.
1983
2187
  */
1984
2188
  /**
1985
2189
  * Transfer mechanisms recognized under the NDPA
@@ -2090,7 +2294,7 @@ export declare interface ValidateDsrSubmissionOptions {
2090
2294
  /**
2091
2295
  * Allowed request types. When provided, the payload's `requestType`
2092
2296
  * must be one of these — useful for locking the server to a specific
2093
- * set of supported NDPA Part IV §29-36 rights.
2297
+ * set of supported NDPA Part VI §34-38 (plus §35, §36, §37) data-subject rights.
2094
2298
  */
2095
2299
  allowedRequestTypes?: string[];
2096
2300
  }
package/dist/server.js CHANGED
@@ -1,2 +1 @@
1
- 'use strict';var chunkJBSCER34_js=require('./chunk-JBSCER34.js'),chunk6QPRDQZF_js=require('./chunk-6QPRDQZF.js'),chunkC5QO3SX4_js=require('./chunk-C5QO3SX4.js'),chunkZ73T6MWY_js=require('./chunk-Z73T6MWY.js'),chunkYPKUHSK4_js=require('./chunk-YPKUHSK4.js'),chunkLIM64IV2_js=require('./chunk-LIM64IV2.js'),chunkS4GRSNB4_js=require('./chunk-S4GRSNB4.js'),chunkCPK5D5FY_js=require('./chunk-CPK5D5FY.js'),chunkTDDAYVKK_js=require('./chunk-TDDAYVKK.js'),chunkC4YM4UMI_js=require('./chunk-C4YM4UMI.js'),chunkGOU6FU6Y_js=require('./chunk-GOU6FU6Y.js'),chunkMJGOLP5M_js=require('./chunk-MJGOLP5M.js'),chunkA4PK7JB2_js=require('./chunk-A4PK7JB2.js'),chunkHO5M7M4M_js=require('./chunk-HO5M7M4M.js'),chunkJ5WCPZLW_js=require('./chunk-J5WCPZLW.js'),chunkP42Z5CFE_js=require('./chunk-P42Z5CFE.js'),chunkBKRETVJ6_js=require('./chunk-BKRETVJ6.js'),chunkI54CDQGN_js=require('./chunk-I54CDQGN.js'),chunkELKB2AFZ_js=require('./chunk-ELKB2AFZ.js');require('./chunk-MQFZHA2D.js');Object.defineProperty(exports,"apiAdapter",{enumerable:true,get:function(){return chunkJBSCER34_js.a}});Object.defineProperty(exports,"composeAdapters",{enumerable:true,get:function(){return chunkJBSCER34_js.c}});Object.defineProperty(exports,"memoryAdapter",{enumerable:true,get:function(){return chunkJBSCER34_js.b}});Object.defineProperty(exports,"hausaLocale",{enumerable:true,get:function(){return chunk6QPRDQZF_js.c}});Object.defineProperty(exports,"igboLocale",{enumerable:true,get:function(){return chunk6QPRDQZF_js.b}});Object.defineProperty(exports,"pidginLocale",{enumerable:true,get:function(){return chunk6QPRDQZF_js.d}});Object.defineProperty(exports,"yorubaLocale",{enumerable:true,get:function(){return chunk6QPRDQZF_js.a}});Object.defineProperty(exports,"defaultLocale",{enumerable:true,get:function(){return chunkC5QO3SX4_js.a}});Object.defineProperty(exports,"mergeLocale",{enumerable:true,get:function(){return chunkC5QO3SX4_js.b}});Object.defineProperty(exports,"exportDOCX",{enumerable:true,get:function(){return chunkZ73T6MWY_js.d}});Object.defineProperty(exports,"exportHTML",{enumerable:true,get:function(){return chunkZ73T6MWY_js.a}});Object.defineProperty(exports,"exportMarkdown",{enumerable:true,get:function(){return chunkZ73T6MWY_js.b}});Object.defineProperty(exports,"exportPDF",{enumerable:true,get:function(){return chunkZ73T6MWY_js.c}});Object.defineProperty(exports,"DEFAULT_DATA_CATEGORIES",{enumerable:true,get:function(){return chunkYPKUHSK4_js.a}});Object.defineProperty(exports,"createDefaultContext",{enumerable:true,get:function(){return chunkYPKUHSK4_js.b}});Object.defineProperty(exports,"evaluatePolicyCompliance",{enumerable:true,get:function(){return chunkYPKUHSK4_js.c}});Object.defineProperty(exports,"DEFAULT_POLICY_SECTIONS",{enumerable:true,get:function(){return chunkLIM64IV2_js.c}});Object.defineProperty(exports,"DEFAULT_POLICY_VARIABLES",{enumerable:true,get:function(){return chunkLIM64IV2_js.d}});Object.defineProperty(exports,"createBusinessPolicyTemplate",{enumerable:true,get:function(){return chunkLIM64IV2_js.e}});Object.defineProperty(exports,"findUnfilledTokens",{enumerable:true,get:function(){return chunkLIM64IV2_js.a}});Object.defineProperty(exports,"generatePolicyText",{enumerable:true,get:function(){return chunkLIM64IV2_js.b}});Object.defineProperty(exports,"getComplianceScore",{enumerable:true,get:function(){return chunkS4GRSNB4_js.a}});Object.defineProperty(exports,"UNFILLED_PREFIX",{enumerable:true,get:function(){return chunkCPK5D5FY_js.a}});Object.defineProperty(exports,"UNFILLED_SUFFIX",{enumerable:true,get:function(){return chunkCPK5D5FY_js.b}});Object.defineProperty(exports,"assemblePolicy",{enumerable:true,get:function(){return chunkCPK5D5FY_js.c}});Object.defineProperty(exports,"assessComplianceGaps",{enumerable:true,get:function(){return chunkTDDAYVKK_js.c}});Object.defineProperty(exports,"generateLawfulBasisSummary",{enumerable:true,get:function(){return chunkTDDAYVKK_js.d}});Object.defineProperty(exports,"getLawfulBasisDescription",{enumerable:true,get:function(){return chunkTDDAYVKK_js.b}});Object.defineProperty(exports,"validateProcessingActivity",{enumerable:true,get:function(){return chunkTDDAYVKK_js.a}});Object.defineProperty(exports,"assessTransferRisk",{enumerable:true,get:function(){return chunkC4YM4UMI_js.h}});Object.defineProperty(exports,"getTransferMechanismDescription",{enumerable:true,get:function(){return chunkC4YM4UMI_js.f}});Object.defineProperty(exports,"isNDPCApprovalRequired",{enumerable:true,get:function(){return chunkC4YM4UMI_js.e}});Object.defineProperty(exports,"validateTransfer",{enumerable:true,get:function(){return chunkC4YM4UMI_js.g}});Object.defineProperty(exports,"exportROPAToCSV",{enumerable:true,get:function(){return chunkGOU6FU6Y_js.c}});Object.defineProperty(exports,"generateROPASummary",{enumerable:true,get:function(){return chunkGOU6FU6Y_js.b}});Object.defineProperty(exports,"identifyComplianceGaps",{enumerable:true,get:function(){return chunkGOU6FU6Y_js.d}});Object.defineProperty(exports,"validateProcessingRecord",{enumerable:true,get:function(){return chunkGOU6FU6Y_js.a}});Object.defineProperty(exports,"appendAuditEntry",{enumerable:true,get:function(){return chunkMJGOLP5M_js.c}});Object.defineProperty(exports,"createAuditEntry",{enumerable:true,get:function(){return chunkMJGOLP5M_js.a}});Object.defineProperty(exports,"getAuditLog",{enumerable:true,get:function(){return chunkMJGOLP5M_js.b}});Object.defineProperty(exports,"cookieAdapter",{enumerable:true,get:function(){return chunkA4PK7JB2_js.b}});Object.defineProperty(exports,"sessionStorageAdapter",{enumerable:true,get:function(){return chunkA4PK7JB2_js.a}});Object.defineProperty(exports,"validateConsent",{enumerable:true,get:function(){return chunkHO5M7M4M_js.a}});Object.defineProperty(exports,"validateConsentOptions",{enumerable:true,get:function(){return chunkHO5M7M4M_js.b}});Object.defineProperty(exports,"formatDSRRequest",{enumerable:true,get:function(){return chunkJ5WCPZLW_js.b}});Object.defineProperty(exports,"validateDsrSubmission",{enumerable:true,get:function(){return chunkJ5WCPZLW_js.a}});Object.defineProperty(exports,"assessDPIARisk",{enumerable:true,get:function(){return chunkP42Z5CFE_js.a}});Object.defineProperty(exports,"calculateBreachSeverity",{enumerable:true,get:function(){return chunkBKRETVJ6_js.a}});Object.defineProperty(exports,"sanitizeInput",{enumerable:true,get:function(){return chunkI54CDQGN_js.a}});Object.defineProperty(exports,"localStorageAdapter",{enumerable:true,get:function(){return chunkELKB2AFZ_js.a}});//# sourceMappingURL=server.js.map
2
- //# sourceMappingURL=server.js.map
1
+ 'use strict';var chunkROTLSZMV_js=require('./chunk-ROTLSZMV.js'),chunk4QXTB3L6_js=require('./chunk-4QXTB3L6.js'),chunk7IFSWCQP_js=require('./chunk-7IFSWCQP.js'),chunkN3MQQUQP_js=require('./chunk-N3MQQUQP.js'),chunkLVGT3DLT_js=require('./chunk-LVGT3DLT.js'),chunkQPRYXVH2_js=require('./chunk-QPRYXVH2.js'),chunkQ64735OC_js=require('./chunk-Q64735OC.js'),chunkWZYCBW2R_js=require('./chunk-WZYCBW2R.js'),chunkYFBDJ4FH_js=require('./chunk-YFBDJ4FH.js'),chunk4CVBQC66_js=require('./chunk-4CVBQC66.js'),chunk3IA3KDII_js=require('./chunk-3IA3KDII.js'),chunk7ZZO7GVB_js=require('./chunk-7ZZO7GVB.js'),chunkB46SJB5V_js=require('./chunk-B46SJB5V.js'),chunkL2BRFMVS_js=require('./chunk-L2BRFMVS.js'),chunkTQZWJGJ2_js=require('./chunk-TQZWJGJ2.js'),chunk3YTAOT5O_js=require('./chunk-3YTAOT5O.js'),chunkUXUMYP4L_js=require('./chunk-UXUMYP4L.js'),chunkZVOIR4QH_js=require('./chunk-ZVOIR4QH.js'),chunkVWED6UTN_js=require('./chunk-VWED6UTN.js');require('./chunk-RFPLZDIO.js');Object.defineProperty(exports,"apiAdapter",{enumerable:true,get:function(){return chunkROTLSZMV_js.a}});Object.defineProperty(exports,"composeAdapters",{enumerable:true,get:function(){return chunkROTLSZMV_js.c}});Object.defineProperty(exports,"memoryAdapter",{enumerable:true,get:function(){return chunkROTLSZMV_js.b}});Object.defineProperty(exports,"hausaLocale",{enumerable:true,get:function(){return chunk4QXTB3L6_js.c}});Object.defineProperty(exports,"igboLocale",{enumerable:true,get:function(){return chunk4QXTB3L6_js.b}});Object.defineProperty(exports,"pidginLocale",{enumerable:true,get:function(){return chunk4QXTB3L6_js.d}});Object.defineProperty(exports,"yorubaLocale",{enumerable:true,get:function(){return chunk4QXTB3L6_js.a}});Object.defineProperty(exports,"defaultLocale",{enumerable:true,get:function(){return chunk7IFSWCQP_js.a}});Object.defineProperty(exports,"mergeLocale",{enumerable:true,get:function(){return chunk7IFSWCQP_js.b}});Object.defineProperty(exports,"exportDOCX",{enumerable:true,get:function(){return chunkN3MQQUQP_js.d}});Object.defineProperty(exports,"exportHTML",{enumerable:true,get:function(){return chunkN3MQQUQP_js.a}});Object.defineProperty(exports,"exportMarkdown",{enumerable:true,get:function(){return chunkN3MQQUQP_js.b}});Object.defineProperty(exports,"exportPDF",{enumerable:true,get:function(){return chunkN3MQQUQP_js.c}});Object.defineProperty(exports,"DEFAULT_POLICY_SECTIONS",{enumerable:true,get:function(){return chunkLVGT3DLT_js.c}});Object.defineProperty(exports,"DEFAULT_POLICY_VARIABLES",{enumerable:true,get:function(){return chunkLVGT3DLT_js.d}});Object.defineProperty(exports,"createBusinessPolicyTemplate",{enumerable:true,get:function(){return chunkLVGT3DLT_js.e}});Object.defineProperty(exports,"findUnfilledTokens",{enumerable:true,get:function(){return chunkLVGT3DLT_js.a}});Object.defineProperty(exports,"generatePolicyText",{enumerable:true,get:function(){return chunkLVGT3DLT_js.b}});Object.defineProperty(exports,"getComplianceScore",{enumerable:true,get:function(){return chunkQPRYXVH2_js.a}});Object.defineProperty(exports,"DEFAULT_DATA_CATEGORIES",{enumerable:true,get:function(){return chunkQ64735OC_js.d}});Object.defineProperty(exports,"UNFILLED_PREFIX",{enumerable:true,get:function(){return chunkQ64735OC_js.a}});Object.defineProperty(exports,"UNFILLED_SUFFIX",{enumerable:true,get:function(){return chunkQ64735OC_js.b}});Object.defineProperty(exports,"assemblePolicy",{enumerable:true,get:function(){return chunkQ64735OC_js.c}});Object.defineProperty(exports,"createDefaultContext",{enumerable:true,get:function(){return chunkQ64735OC_js.e}});Object.defineProperty(exports,"evaluatePolicyCompliance",{enumerable:true,get:function(){return chunkQ64735OC_js.f}});Object.defineProperty(exports,"assessComplianceGaps",{enumerable:true,get:function(){return chunkWZYCBW2R_js.c}});Object.defineProperty(exports,"generateLawfulBasisSummary",{enumerable:true,get:function(){return chunkWZYCBW2R_js.d}});Object.defineProperty(exports,"getLawfulBasisDescription",{enumerable:true,get:function(){return chunkWZYCBW2R_js.b}});Object.defineProperty(exports,"validateProcessingActivity",{enumerable:true,get:function(){return chunkWZYCBW2R_js.a}});Object.defineProperty(exports,"assessTransferRisk",{enumerable:true,get:function(){return chunkYFBDJ4FH_js.h}});Object.defineProperty(exports,"getTransferMechanismDescription",{enumerable:true,get:function(){return chunkYFBDJ4FH_js.f}});Object.defineProperty(exports,"isNDPCApprovalRequired",{enumerable:true,get:function(){return chunkYFBDJ4FH_js.e}});Object.defineProperty(exports,"validateTransfer",{enumerable:true,get:function(){return chunkYFBDJ4FH_js.g}});Object.defineProperty(exports,"exportROPAToCSV",{enumerable:true,get:function(){return chunk4CVBQC66_js.c}});Object.defineProperty(exports,"generateROPASummary",{enumerable:true,get:function(){return chunk4CVBQC66_js.b}});Object.defineProperty(exports,"identifyComplianceGaps",{enumerable:true,get:function(){return chunk4CVBQC66_js.d}});Object.defineProperty(exports,"validateProcessingRecord",{enumerable:true,get:function(){return chunk4CVBQC66_js.a}});Object.defineProperty(exports,"appendAuditEntry",{enumerable:true,get:function(){return chunk3IA3KDII_js.c}});Object.defineProperty(exports,"createAuditEntry",{enumerable:true,get:function(){return chunk3IA3KDII_js.a}});Object.defineProperty(exports,"getAuditLog",{enumerable:true,get:function(){return chunk3IA3KDII_js.b}});Object.defineProperty(exports,"cookieAdapter",{enumerable:true,get:function(){return chunk7ZZO7GVB_js.b}});Object.defineProperty(exports,"sessionStorageAdapter",{enumerable:true,get:function(){return chunk7ZZO7GVB_js.a}});Object.defineProperty(exports,"validateConsent",{enumerable:true,get:function(){return chunkB46SJB5V_js.a}});Object.defineProperty(exports,"validateConsentOptions",{enumerable:true,get:function(){return chunkB46SJB5V_js.b}});Object.defineProperty(exports,"formatDSRRequest",{enumerable:true,get:function(){return chunkL2BRFMVS_js.b}});Object.defineProperty(exports,"validateDsrSubmission",{enumerable:true,get:function(){return chunkL2BRFMVS_js.a}});Object.defineProperty(exports,"assessDPIARisk",{enumerable:true,get:function(){return chunkTQZWJGJ2_js.a}});Object.defineProperty(exports,"calculateBreachSeverity",{enumerable:true,get:function(){return chunk3YTAOT5O_js.a}});Object.defineProperty(exports,"sanitizeInput",{enumerable:true,get:function(){return chunkUXUMYP4L_js.a}});Object.defineProperty(exports,"LEGAL_DISCLAIMER_LONG",{enumerable:true,get:function(){return chunkZVOIR4QH_js.b}});Object.defineProperty(exports,"LEGAL_DISCLAIMER_SHORT",{enumerable:true,get:function(){return chunkZVOIR4QH_js.a}});Object.defineProperty(exports,"legalDisclaimerBlock",{enumerable:true,get:function(){return chunkZVOIR4QH_js.c}});Object.defineProperty(exports,"localStorageAdapter",{enumerable:true,get:function(){return chunkVWED6UTN_js.a}});
package/dist/server.mjs CHANGED
@@ -1,2 +1 @@
1
- export{a as apiAdapter,c as composeAdapters,b as memoryAdapter}from'./chunk-RY3PGVLZ.mjs';export{c as hausaLocale,b as igboLocale,d as pidginLocale,a as yorubaLocale}from'./chunk-R5FW5XUQ.mjs';export{a as defaultLocale,b as mergeLocale}from'./chunk-XHROISIF.mjs';export{d as exportDOCX,a as exportHTML,b as exportMarkdown,c as exportPDF}from'./chunk-JFFOPHU3.mjs';export{a as DEFAULT_DATA_CATEGORIES,b as createDefaultContext,c as evaluatePolicyCompliance}from'./chunk-I557S566.mjs';export{c as DEFAULT_POLICY_SECTIONS,d as DEFAULT_POLICY_VARIABLES,e as createBusinessPolicyTemplate,a as findUnfilledTokens,b as generatePolicyText}from'./chunk-CKGJK4D7.mjs';export{a as getComplianceScore}from'./chunk-ABDB7LEV.mjs';export{a as UNFILLED_PREFIX,b as UNFILLED_SUFFIX,c as assemblePolicy}from'./chunk-GRLIPT5V.mjs';export{c as assessComplianceGaps,d as generateLawfulBasisSummary,b as getLawfulBasisDescription,a as validateProcessingActivity}from'./chunk-TXBZPCGF.mjs';export{h as assessTransferRisk,f as getTransferMechanismDescription,e as isNDPCApprovalRequired,g as validateTransfer}from'./chunk-75TJPK2N.mjs';export{c as exportROPAToCSV,b as generateROPASummary,d as identifyComplianceGaps,a as validateProcessingRecord}from'./chunk-SHMJNRHO.mjs';export{c as appendAuditEntry,a as createAuditEntry,b as getAuditLog}from'./chunk-P3PULLYP.mjs';export{b as cookieAdapter,a as sessionStorageAdapter}from'./chunk-R3OYAJI6.mjs';export{a as validateConsent,b as validateConsentOptions}from'./chunk-U62QYKVG.mjs';export{b as formatDSRRequest,a as validateDsrSubmission}from'./chunk-B4Z5MBUC.mjs';export{a as assessDPIARisk}from'./chunk-6TA2MVTU.mjs';export{a as calculateBreachSeverity}from'./chunk-DJGS7SSN.mjs';export{a as sanitizeInput}from'./chunk-GKKAK6ES.mjs';export{a as localStorageAdapter}from'./chunk-6WIP33TW.mjs';import'./chunk-WWT2ZSNU.mjs';//# sourceMappingURL=server.mjs.map
2
- //# sourceMappingURL=server.mjs.map
1
+ export{a as apiAdapter,c as composeAdapters,b as memoryAdapter}from'./chunk-PL4XNCQA.mjs';export{c as hausaLocale,b as igboLocale,d as pidginLocale,a as yorubaLocale}from'./chunk-LQTARVPU.mjs';export{a as defaultLocale,b as mergeLocale}from'./chunk-HWHBINVN.mjs';export{d as exportDOCX,a as exportHTML,b as exportMarkdown,c as exportPDF}from'./chunk-AOHKVFAS.mjs';export{c as DEFAULT_POLICY_SECTIONS,d as DEFAULT_POLICY_VARIABLES,e as createBusinessPolicyTemplate,a as findUnfilledTokens,b as generatePolicyText}from'./chunk-Y3MKMAFQ.mjs';export{a as getComplianceScore}from'./chunk-EFIBHKQE.mjs';export{d as DEFAULT_DATA_CATEGORIES,a as UNFILLED_PREFIX,b as UNFILLED_SUFFIX,c as assemblePolicy,e as createDefaultContext,f as evaluatePolicyCompliance}from'./chunk-RMQ7OLNY.mjs';export{c as assessComplianceGaps,d as generateLawfulBasisSummary,b as getLawfulBasisDescription,a as validateProcessingActivity}from'./chunk-LWIKDDSU.mjs';export{h as assessTransferRisk,f as getTransferMechanismDescription,e as isNDPCApprovalRequired,g as validateTransfer}from'./chunk-7BJXI2HI.mjs';export{c as exportROPAToCSV,b as generateROPASummary,d as identifyComplianceGaps,a as validateProcessingRecord}from'./chunk-XP5PL6K7.mjs';export{c as appendAuditEntry,a as createAuditEntry,b as getAuditLog}from'./chunk-V7UFP6QU.mjs';export{b as cookieAdapter,a as sessionStorageAdapter}from'./chunk-UASG46LP.mjs';export{a as validateConsent,b as validateConsentOptions}from'./chunk-PJNKQPQP.mjs';export{b as formatDSRRequest,a as validateDsrSubmission}from'./chunk-RZ6GC6WN.mjs';export{a as assessDPIARisk}from'./chunk-LRRENTT5.mjs';export{a as calculateBreachSeverity}from'./chunk-WTGKZX7J.mjs';export{a as sanitizeInput}from'./chunk-EWVK45Z3.mjs';export{b as LEGAL_DISCLAIMER_LONG,a as LEGAL_DISCLAIMER_SHORT,c as legalDisclaimerBlock}from'./chunk-ITCY2Z66.mjs';export{a as localStorageAdapter}from'./chunk-DBZSN4WP.mjs';import'./chunk-ZJYULEER.mjs';
package/dist/styles.css CHANGED
@@ -1440,3 +1440,37 @@
1440
1440
  .ndpr-font-medium { font-weight: 500; }
1441
1441
  .ndpr-font-semibold { font-weight: 600; }
1442
1442
  .ndpr-font-bold { font-weight: 700; }
1443
+
1444
+ /* ==========================================================================
1445
+ * Accessibility — respect prefers-reduced-motion (WCAG 2.3.3)
1446
+ *
1447
+ * Users with vestibular-motion sensitivities can opt out of animation at the
1448
+ * OS level. When they do, neutralise every animation and transition the
1449
+ * toolkit ships so banners, dialogs, dashboards, and policy previews appear
1450
+ * without movement. Applies to all toolkit elements via the `[data-ndpr-*]`
1451
+ * attribute hooks that components emit, but we also widen to '*' below
1452
+ * because not every animated element carries one.
1453
+ * ========================================================================== */
1454
+ @media (prefers-reduced-motion: reduce) {
1455
+ .ndpr-banner,
1456
+ .ndpr-modal,
1457
+ .ndpr-modal__panel,
1458
+ .ndpr-modal__overlay,
1459
+ .ndpr-dialog,
1460
+ .ndpr-consent-banner,
1461
+ .ndpr-consent-manager,
1462
+ .ndpr-dsr-dashboard,
1463
+ .ndpr-dpia-questionnaire,
1464
+ .ndpr-breach-form,
1465
+ .ndpr-policy-preview,
1466
+ .animate-slide-in,
1467
+ .animate-slide-in-top,
1468
+ .animate-fade-in,
1469
+ [class*="ndpr-"] *,
1470
+ [data-ndpr-legal-notice] {
1471
+ animation-duration: 0.001ms !important;
1472
+ animation-iteration-count: 1 !important;
1473
+ transition-duration: 0.001ms !important;
1474
+ scroll-behavior: auto !important;
1475
+ }
1476
+ }
@@ -499,7 +499,9 @@ declare interface RequestType {
499
499
  /** Description of what this request type entails */
500
500
  description: string;
501
501
  /**
502
- * NDPA section reference (e.g., "Section 30" for access requests)
502
+ * NDPA 2023 section reference for this right
503
+ * (e.g., "Section 34(1)(a)" for access, "Section 38" for portability).
504
+ * Used for display purposes only — verify the exact subsection with counsel.
503
505
  */
504
506
  ndpaSection?: string;
505
507
  /**
@@ -499,7 +499,9 @@ declare interface RequestType {
499
499
  /** Description of what this request type entails */
500
500
  description: string;
501
501
  /**
502
- * NDPA section reference (e.g., "Section 30" for access requests)
502
+ * NDPA 2023 section reference for this right
503
+ * (e.g., "Section 34(1)(a)" for access, "Section 38" for portability).
504
+ * Used for display purposes only — verify the exact subsection with counsel.
503
505
  */
504
506
  ndpaSection?: string;
505
507
  /**
package/dist/unstyled.js CHANGED
@@ -1,3 +1,2 @@
1
1
  "use client";
2
- 'use strict';var chunkRLYTX3MM_js=require('./chunk-RLYTX3MM.js'),chunkXIM7KMD6_js=require('./chunk-XIM7KMD6.js'),chunkZPKVLTSX_js=require('./chunk-ZPKVLTSX.js');require('./chunk-I54CDQGN.js'),require('./chunk-E64TU6IU.js');var chunkMQFZHA2D_js=require('./chunk-MQFZHA2D.js'),P=require('react');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var P__default=/*#__PURE__*/_interopDefault(P);function e(C,R){let n=d=>{var s=d,{unstyled:l=true}=s,c=chunkMQFZHA2D_js.c(s,["unstyled"]);return P__default.default.createElement(C,chunkMQFZHA2D_js.b(chunkMQFZHA2D_js.a({},c),{unstyled:l}))};return n.displayName=R,n}var u=e(chunkXIM7KMD6_js.a,"UnstyledConsentBanner"),y=e(chunkRLYTX3MM_js.a,"UnstyledConsentManager"),S=e(chunkZPKVLTSX_js.a,"UnstyledDSRRequestForm");exports.ConsentBanner=u;exports.ConsentManager=y;exports.DSRRequestForm=S;//# sourceMappingURL=unstyled.js.map
3
- //# sourceMappingURL=unstyled.js.map
2
+ 'use strict';var chunkBRS52EDT_js=require('./chunk-BRS52EDT.js'),chunk732C2EVN_js=require('./chunk-732C2EVN.js');require('./chunk-L2VO3MEJ.js');var chunkW47OSMT6_js=require('./chunk-W47OSMT6.js');require('./chunk-UXUMYP4L.js'),require('./chunk-AME4HJR4.js');var chunkRFPLZDIO_js=require('./chunk-RFPLZDIO.js'),P=require('react');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var P__default=/*#__PURE__*/_interopDefault(P);function e(C,R){let n=d=>{var s=d,{unstyled:l=true}=s,c=chunkRFPLZDIO_js.c(s,["unstyled"]);return P__default.default.createElement(C,chunkRFPLZDIO_js.b(chunkRFPLZDIO_js.a({},c),{unstyled:l}))};return n.displayName=R,n}var u=e(chunk732C2EVN_js.a,"UnstyledConsentBanner"),y=e(chunkBRS52EDT_js.a,"UnstyledConsentManager"),S=e(chunkW47OSMT6_js.a,"UnstyledDSRRequestForm");exports.ConsentBanner=u;exports.ConsentManager=y;exports.DSRRequestForm=S;
package/dist/unstyled.mjs CHANGED
@@ -1,3 +1,2 @@
1
1
  "use client";
2
- import {a as a$2}from'./chunk-EPT2K355.mjs';import {a as a$1}from'./chunk-GN5C32JB.mjs';import {a as a$3}from'./chunk-6HZL2WDU.mjs';import'./chunk-GKKAK6ES.mjs';import'./chunk-AYKLAEOU.mjs';import {c,b,a}from'./chunk-WWT2ZSNU.mjs';import P from'react';function e(C,R){let n=d=>{var s=d,{unstyled:l=true}=s,c$1=c(s,["unstyled"]);return P.createElement(C,b(a({},c$1),{unstyled:l}))};return n.displayName=R,n}var u=e(a$1,"UnstyledConsentBanner"),y=e(a$2,"UnstyledConsentManager"),S=e(a$3,"UnstyledDSRRequestForm");export{u as ConsentBanner,y as ConsentManager,S as DSRRequestForm};//# sourceMappingURL=unstyled.mjs.map
3
- //# sourceMappingURL=unstyled.mjs.map
2
+ import {a as a$2}from'./chunk-U5RWJRGA.mjs';import {a as a$1}from'./chunk-BFAX7JQA.mjs';import'./chunk-YTU4FNM2.mjs';import {a as a$3}from'./chunk-XJO4DH3L.mjs';import'./chunk-EWVK45Z3.mjs';import'./chunk-SFGW37LE.mjs';import {c,b,a}from'./chunk-ZJYULEER.mjs';import P from'react';function e(C,R){let n=d=>{var s=d,{unstyled:l=true}=s,c$1=c(s,["unstyled"]);return P.createElement(C,b(a({},c$1),{unstyled:l}))};return n.displayName=R,n}var u=e(a$1,"UnstyledConsentBanner"),y=e(a$2,"UnstyledConsentManager"),S=e(a$3,"UnstyledDSRRequestForm");export{u as ConsentBanner,y as ConsentManager,S as DSRRequestForm};
package/package.json CHANGED
@@ -1,24 +1,80 @@
1
1
  {
2
2
  "name": "@tantainnovative/ndpr-toolkit",
3
- "version": "3.5.1",
3
+ "version": "3.6.0",
4
4
  "private": false,
5
5
  "description": "Nigeria Data Protection Toolkit — enterprise-grade compliance components for the Nigeria Data Protection Act (NDPA) 2023",
6
+ "pnpm": {
7
+ "overrides": {
8
+ "handlebars": ">=4.7.9",
9
+ "lodash": ">=4.17.21",
10
+ "glob": ">=7.2.3",
11
+ "tar": ">=7.5.10",
12
+ "brace-expansion": ">=2.0.1",
13
+ "js-yaml": "~3.14.2",
14
+ "yaml": ">=2.8.3",
15
+ "picomatch": ">=2.3.2",
16
+ "flatted": ">=3.4.2",
17
+ "dompurify": ">=3.4.0",
18
+ "protobufjs": ">=7.5.5",
19
+ "fast-xml-parser": ">=5.7.0"
20
+ }
21
+ },
22
+ "scripts": {
23
+ "dev": "next dev --turbopack",
24
+ "build": "next build && node scripts/post-build.js",
25
+ "build:lib": "tsup && cp packages/ndpr-toolkit/src/styles.d.ts dist/styles.d.ts && node scripts/rollup-dts.mjs",
26
+ "prepublishOnly": "pnpm build:lib",
27
+ "start": "next start",
28
+ "lint": "next lint .",
29
+ "test": "jest --passWithNoTests",
30
+ "export": "next export",
31
+ "build:static": "next build",
32
+ "deploy": "next build && touch out/.nojekyll && gh-pages -d out",
33
+ "release": "commit-and-tag-version",
34
+ "release:minor": "commit-and-tag-version --release-as minor",
35
+ "release:major": "commit-and-tag-version --release-as major",
36
+ "release:patch": "commit-and-tag-version --release-as patch",
37
+ "publish:cli": "cd packages/create-ndpr && npm publish --access public",
38
+ "publish:recipes": "cd packages/ndpr-recipes && npm publish --access public"
39
+ },
6
40
  "keywords": [
7
41
  "ndpa",
8
42
  "ndpr",
43
+ "ndpa-2023",
9
44
  "nigeria",
45
+ "nigeria-compliance",
10
46
  "data-protection",
47
+ "data-privacy",
11
48
  "compliance",
49
+ "compliance-tools",
12
50
  "privacy",
51
+ "privacy-policy",
13
52
  "ndpc",
53
+ "nitda",
54
+ "gdpr",
55
+ "gdpr-nigeria",
56
+ "africa",
14
57
  "consent",
58
+ "cookie-consent",
59
+ "cookie-banner",
15
60
  "dpia",
61
+ "dsr",
16
62
  "data-subject-rights",
17
63
  "breach-notification",
18
64
  "cross-border-transfer",
19
65
  "ropa",
20
- "lawful-basis"
66
+ "lawful-basis",
67
+ "react",
68
+ "nextjs",
69
+ "typescript"
21
70
  ],
71
+ "engines": {
72
+ "node": ">=18.0.0"
73
+ },
74
+ "funding": {
75
+ "type": "individual",
76
+ "url": "https://github.com/sponsors/mr-tanta"
77
+ },
22
78
  "author": {
23
79
  "name": "Abraham Esandayinze Tanta",
24
80
  "url": "https://linkedin.com/in/mr-tanta"
@@ -106,6 +162,21 @@
106
162
  "import": "./dist/presets.mjs",
107
163
  "require": "./dist/presets.js"
108
164
  },
165
+ "./presets/consent": {
166
+ "types": "./dist/presets-consent.d.ts",
167
+ "import": "./dist/presets-consent.mjs",
168
+ "require": "./dist/presets-consent.js"
169
+ },
170
+ "./presets/dsr": {
171
+ "types": "./dist/presets-dsr.d.ts",
172
+ "import": "./dist/presets-dsr.mjs",
173
+ "require": "./dist/presets-dsr.js"
174
+ },
175
+ "./presets/policy": {
176
+ "types": "./dist/presets-policy.d.ts",
177
+ "import": "./dist/presets-policy.mjs",
178
+ "require": "./dist/presets-policy.js"
179
+ },
109
180
  "./unstyled": {
110
181
  "types": "./dist/unstyled.d.ts",
111
182
  "import": "./dist/unstyled.mjs",
@@ -161,6 +232,15 @@
161
232
  "presets": [
162
233
  "./dist/presets.d.ts"
163
234
  ],
235
+ "presets/consent": [
236
+ "./dist/presets-consent.d.ts"
237
+ ],
238
+ "presets/dsr": [
239
+ "./dist/presets-dsr.d.ts"
240
+ ],
241
+ "presets/policy": [
242
+ "./dist/presets-policy.d.ts"
243
+ ],
164
244
  "unstyled": [
165
245
  "./dist/unstyled.d.ts"
166
246
  ]
@@ -275,22 +355,5 @@
275
355
  "tsup": "^8.5.1",
276
356
  "tw-animate-css": "^1.4.0",
277
357
  "typescript": "^5.0.0"
278
- },
279
- "scripts": {
280
- "dev": "next dev --turbopack",
281
- "build": "next build && node scripts/post-build.js",
282
- "build:lib": "tsup && cp packages/ndpr-toolkit/src/styles.d.ts dist/styles.d.ts && node scripts/rollup-dts.mjs",
283
- "start": "next start",
284
- "lint": "next lint .",
285
- "test": "jest --passWithNoTests",
286
- "export": "next export",
287
- "build:static": "next build",
288
- "deploy": "next build && touch out/.nojekyll && gh-pages -d out",
289
- "release": "commit-and-tag-version",
290
- "release:minor": "commit-and-tag-version --release-as minor",
291
- "release:major": "commit-and-tag-version --release-as major",
292
- "release:patch": "commit-and-tag-version --release-as patch",
293
- "publish:cli": "cd packages/create-ndpr && npm publish --access public",
294
- "publish:recipes": "cd packages/ndpr-recipes && npm publish --access public"
295
358
  }
296
- }
359
+ }
@@ -1,7 +0,0 @@
1
- 'use strict';var chunkE64TU6IU_js=require('./chunk-E64TU6IU.js'),I=require('react'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var I__default=/*#__PURE__*/_interopDefault(I);var B=({result:a,sections:m,showFullReport:g=true,allowPrint:u=true,allowExport:v=true,onExport:f,className:N="",buttonClassName:x="",classNames:b={},unstyled:y=false})=>{let o=I.useMemo(()=>new Date().toLocaleDateString(),[]),d=(r,s)=>{let i=s?b[s]:void 0;return !i&&s==="printButton"&&(i=b.primaryButton),chunkE64TU6IU_js.a(r,i,y)},l=r=>new Date(r).toLocaleDateString("en-GB",{day:"numeric",month:"long",year:"numeric"}),w=r=>{let s=a.answers[r];return s==null?"Not answered":typeof s=="boolean"?s?"Yes":"No":Array.isArray(s)?s.join(", "):String(s)},k=()=>{window.print();},C=r=>{f&&f(r);},R=r=>jsxRuntime.jsx("span",{className:d(`px-2 py-1 rounded text-xs font-medium ${{low:"ndpr-badge ndpr-badge--success",medium:"ndpr-badge ndpr-badge--warning",high:"ndpr-badge ndpr-badge--warning",critical:"ndpr-badge ndpr-badge--destructive"}[r]}`,"riskBadge"),children:r.charAt(0).toUpperCase()+r.slice(1)});return jsxRuntime.jsxs("div",{"data-ndpr-component":"dpia-report",className:`${d("bg-white dark:bg-gray-800 rounded-lg shadow-md p-6 print:shadow-none print:p-0","root")} ${N}`,children:[jsxRuntime.jsxs("div",{className:d("mb-8 border-b border-gray-200 dark:border-gray-700 pb-6 print:pb-4","header"),children:[jsxRuntime.jsxs("div",{className:"flex justify-between items-start",children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("h1",{className:d("ndpr-card__title","title"),children:"Data Protection Impact Assessment Report"}),jsxRuntime.jsx("h2",{className:"text-xl ndpr-text-muted mb-4",children:a.title})]}),(u||v)&&jsxRuntime.jsxs("div",{className:"flex space-x-2 print:hidden",children:[u&&jsxRuntime.jsx("button",{onClick:k,className:`${d("px-3 py-1 bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-white rounded hover:bg-gray-300 dark:hover:bg-gray-600","printButton")} ${x}`,children:jsxRuntime.jsxs("span",{className:"flex items-center",children:[jsxRuntime.jsx("svg",{className:"w-4 h-4 mr-1",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2h2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z"})}),"Print"]})}),v&&jsxRuntime.jsx("div",{className:"relative inline-block",children:jsxRuntime.jsx("button",{onClick:()=>C("pdf"),className:`px-3 py-1 bg-[rgb(var(--ndpr-primary))] text-white rounded hover:bg-[rgb(var(--ndpr-primary-hover))] ${x}`,children:jsxRuntime.jsxs("span",{className:"flex items-center",children:[jsxRuntime.jsx("svg",{className:"w-4 h-4 mr-1",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"})}),"Export PDF"]})})})]})]}),jsxRuntime.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4",children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("p",{className:"ndpr-form-field__hint",children:[jsxRuntime.jsx("span",{className:"font-medium",children:"Assessor:"})," ",a.assessor.name,", ",a.assessor.role]}),jsxRuntime.jsxs("p",{className:"ndpr-form-field__hint",children:[jsxRuntime.jsx("span",{className:"font-medium",children:"Contact:"})," ",a.assessor.email]})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("p",{className:"ndpr-form-field__hint",children:[jsxRuntime.jsx("span",{className:"font-medium",children:"Started:"})," ",l(a.startedAt)]}),jsxRuntime.jsxs("p",{className:"ndpr-form-field__hint",children:[jsxRuntime.jsx("span",{className:"font-medium",children:"Completed:"})," ",a.completedAt?l(a.completedAt):"In progress"]}),jsxRuntime.jsxs("p",{className:"ndpr-form-field__hint",children:[jsxRuntime.jsx("span",{className:"font-medium",children:"Next review:"})," ",a.reviewDate?l(a.reviewDate):"Not scheduled"]})]})]})]}),jsxRuntime.jsxs("div",{className:d("mb-8","summary"),children:[jsxRuntime.jsx("h2",{className:"ndpr-section-heading",children:"Executive Summary"}),jsxRuntime.jsxs("div",{className:"ndpr-panel",children:[jsxRuntime.jsxs("div",{className:"flex items-center mb-2",role:"status","aria-live":"polite",children:[jsxRuntime.jsx("span",{className:"font-medium mr-2",children:"Overall Risk Level:"}),R(a.overallRiskLevel)]}),jsxRuntime.jsxs("div",{className:d("mb-2","conclusion"),children:[jsxRuntime.jsx("span",{className:"font-medium",children:"Conclusion:"})," ",a.conclusion]}),jsxRuntime.jsxs("div",{role:"status","aria-live":"polite",children:[jsxRuntime.jsx("span",{className:"font-medium",children:"Can Proceed:"})," ",a.canProceed?"Yes":"No"]})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("h3",{className:"font-medium ndpr-text-foreground mb-2",children:"Processing Activity Description"}),jsxRuntime.jsx("p",{className:"ndpr-text-muted mb-4",children:a.processingDescription}),a.recommendations&&a.recommendations.length>0&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("h3",{className:"font-medium ndpr-text-foreground mb-2",children:"Key Recommendations"}),jsxRuntime.jsx("ul",{className:"list-disc pl-5 ndpr-text-muted",children:a.recommendations.map((r,s)=>jsxRuntime.jsx("li",{className:d("","recommendation"),children:r},s))})]})]})]}),jsxRuntime.jsxs("div",{className:"mb-8",children:[jsxRuntime.jsx("h2",{className:"ndpr-section-heading",children:"Identified Risks"}),a.risks.length===0?jsxRuntime.jsx("p",{className:"ndpr-text-muted",children:"No risks identified."}):jsxRuntime.jsx("div",{className:"overflow-x-auto",children:jsxRuntime.jsxs("table",{className:d("min-w-full divide-y divide-gray-200 dark:divide-gray-700","riskTable"),children:[jsxRuntime.jsx("thead",{className:"ndpr-panel",children:jsxRuntime.jsxs("tr",{children:[jsxRuntime.jsx("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium ndpr-text-muted uppercase tracking-wider",children:"Risk"}),jsxRuntime.jsx("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium ndpr-text-muted uppercase tracking-wider",children:"Likelihood"}),jsxRuntime.jsx("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium ndpr-text-muted uppercase tracking-wider",children:"Impact"}),jsxRuntime.jsx("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium ndpr-text-muted uppercase tracking-wider",children:"Risk Level"}),jsxRuntime.jsx("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium ndpr-text-muted uppercase tracking-wider",children:"Mitigated"})]})}),jsxRuntime.jsx("tbody",{className:"ndpr-table",children:a.risks.map(r=>jsxRuntime.jsxs("tr",{className:d("","riskRow"),children:[jsxRuntime.jsx("td",{className:"ndpr-table__cell",children:r.description}),jsxRuntime.jsxs("td",{className:"ndpr-table__cell ndpr-table__cell--muted",children:[r.likelihood," / 5"]}),jsxRuntime.jsxs("td",{className:"ndpr-table__cell ndpr-table__cell--muted",children:[r.impact," / 5"]}),jsxRuntime.jsx("td",{className:"px-6 py-4 whitespace-nowrap text-sm",children:R(r.level)}),jsxRuntime.jsx("td",{className:"ndpr-table__cell ndpr-table__cell--muted",children:r.mitigated?jsxRuntime.jsx("span",{className:"ndpr-text-success",children:"Yes"}):jsxRuntime.jsx("span",{className:"ndpr-text-destructive",children:"No"})})]},r.id))})]})})]}),g&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("h2",{className:"ndpr-section-heading",children:"Full Assessment Details"}),m.map(r=>{let s=r.questions.filter(i=>a.answers[i.id]!==void 0);return s.length===0?null:jsxRuntime.jsxs("div",{className:"mb-6",children:[jsxRuntime.jsx("h3",{className:"text-lg font-medium ndpr-text-foreground mb-2",children:r.title}),jsxRuntime.jsx("div",{className:"overflow-x-auto",children:jsxRuntime.jsxs("table",{className:"min-w-full divide-y divide-gray-200 dark:divide-gray-700",children:[jsxRuntime.jsx("thead",{className:"ndpr-panel",children:jsxRuntime.jsxs("tr",{children:[jsxRuntime.jsx("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium ndpr-text-muted uppercase tracking-wider",children:"Question"}),jsxRuntime.jsx("th",{scope:"col",className:"px-6 py-3 text-left text-xs font-medium ndpr-text-muted uppercase tracking-wider",children:"Answer"})]})}),jsxRuntime.jsx("tbody",{className:"ndpr-table",children:s.map(i=>jsxRuntime.jsxs("tr",{children:[jsxRuntime.jsx("td",{className:"ndpr-table__cell",children:i.text}),jsxRuntime.jsx("td",{className:"px-6 py-4 whitespace-normal text-sm ndpr-text-muted",children:w(i.id)})]},i.id))})]})})]},r.id)})]}),jsxRuntime.jsxs("div",{className:"mt-8 pt-4 border-t border-gray-200 dark:border-gray-700 text-sm ndpr-text-muted",children:[jsxRuntime.jsx("p",{children:"This DPIA was conducted in accordance with the Nigeria Data Protection Act (NDPA) 2023."}),jsxRuntime.jsxs("p",{children:["DPIA Report Version: ",a.version]}),jsxRuntime.jsxs("p",{children:["Generated on: ",o]})]})]})};var M=({steps:a,onStepClick:m,clickable:g=true,orientation:u="horizontal",className:v="",activeStepClassName:f="",completedStepClassName:N="",incompleteStepClassName:x="",classNames:b={},unstyled:y=false})=>{let o=(n,p)=>chunkE64TU6IU_js.a(n,p?b[p]:void 0,y),d=n=>{g&&m&&m(n);},l=u==="vertical";return jsxRuntime.jsx("div",{"data-ndpr-component":"dpia-step-indicator",role:"navigation","aria-label":"Step progress",className:`${o(l?"flex flex-col space-y-4":"flex items-center justify-between","root")} ${v}`,children:a.map((n,p)=>{let w=p===a.length-1,k=n.active?o(`font-medium ${f||"ndpr-text-primary"}`,"label"):n.completed?o(N||"ndpr-text-success","label"):o(x||"ndpr-card__subtitle","label"),C=n.active?o("flex items-center justify-center w-8 h-8 rounded-full bg-[rgb(var(--ndpr-primary)/0.1)] dark:bg-[rgb(var(--ndpr-primary)/0.2)] ndpr-text-primary border-2 border-[rgb(var(--ndpr-primary))] dark:border-[rgb(var(--ndpr-primary))]","stepActive"):n.completed?o("flex items-center justify-center w-8 h-8 rounded-full bg-green-100 dark:bg-green-900 ndpr-text-success border-2 border-green-600 dark:border-green-400","stepCompleted"):o("flex items-center justify-center w-8 h-8 rounded-full bg-gray-100 dark:bg-gray-700 ndpr-text-muted border-2 border-gray-300 dark:border-gray-600","stepPending");return jsxRuntime.jsxs(I__default.default.Fragment,{children:[jsxRuntime.jsxs("div",{className:o(`${l?"flex items-start":"flex flex-col items-center"} ${g?"cursor-pointer":""}`,"step"),onClick:()=>d(n.id),"aria-current":n.active?"step":void 0,children:[jsxRuntime.jsx("div",{className:`
2
- flex items-center justify-center
3
- ${l?"mr-4":""}
4
- `,children:jsxRuntime.jsx("div",{className:C,children:n.icon?n.icon:n.completed?jsxRuntime.jsx("svg",{className:"w-4 h-4",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg",children:jsxRuntime.jsx("path",{fillRule:"evenodd",d:"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",clipRule:"evenodd"})}):jsxRuntime.jsx("span",{children:p+1})})}),jsxRuntime.jsxs("div",{className:`
5
- ${l?"flex-1":"mt-2 text-center"}
6
- `,children:[jsxRuntime.jsx("div",{className:`text-sm font-medium ${k}`,children:n.label}),n.description&&jsxRuntime.jsx("div",{className:"ndpr-form-field__hint",children:n.description})]})]}),!w&&jsxRuntime.jsx("div",{className:o(l?"ml-4 h-8 border-l-2 border-gray-300 dark:border-gray-600":"w-full border-t-2 border-gray-300 dark:border-gray-600 hidden sm:block","connector")})]},n.id)})})};exports.a=B;exports.b=M;//# sourceMappingURL=chunk-3VQAYQR7.js.map
7
- //# sourceMappingURL=chunk-3VQAYQR7.js.map