@tantainnovative/ndpr-toolkit 1.0.10 → 2.1.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 (218) hide show
  1. package/README.md +289 -136
  2. package/dist/breach-BpSBPrdk.d.mts +185 -0
  3. package/dist/breach-BpSBPrdk.d.ts +185 -0
  4. package/dist/breach-D5zJYNph.d.mts +17 -0
  5. package/dist/breach-D7NgrdMX.d.ts +17 -0
  6. package/dist/breach.d.mts +275 -0
  7. package/dist/breach.d.ts +275 -0
  8. package/dist/breach.js +2 -0
  9. package/dist/breach.js.map +1 -0
  10. package/dist/breach.mjs +2 -0
  11. package/dist/breach.mjs.map +1 -0
  12. package/dist/chunk-2SYNHRP6.mjs +2 -0
  13. package/dist/chunk-2SYNHRP6.mjs.map +1 -0
  14. package/dist/chunk-2XHD22J7.mjs +7 -0
  15. package/dist/chunk-2XHD22J7.mjs.map +1 -0
  16. package/dist/chunk-4A354HL3.js +2 -0
  17. package/dist/chunk-4A354HL3.js.map +1 -0
  18. package/dist/chunk-4DKT6IB6.js +94 -0
  19. package/dist/chunk-4DKT6IB6.js.map +1 -0
  20. package/dist/chunk-5ZBO2UPH.js +2 -0
  21. package/dist/chunk-5ZBO2UPH.js.map +1 -0
  22. package/dist/chunk-6JFTAYXV.mjs +2 -0
  23. package/dist/chunk-6JFTAYXV.mjs.map +1 -0
  24. package/dist/chunk-6JVYYLS7.js +2 -0
  25. package/dist/chunk-6JVYYLS7.js.map +1 -0
  26. package/dist/chunk-6SGG6WPA.mjs +2 -0
  27. package/dist/chunk-6SGG6WPA.mjs.map +1 -0
  28. package/dist/chunk-AQEGDEQM.js +7 -0
  29. package/dist/chunk-AQEGDEQM.js.map +1 -0
  30. package/dist/chunk-C2IJWCZQ.mjs +2 -0
  31. package/dist/chunk-C2IJWCZQ.mjs.map +1 -0
  32. package/dist/chunk-CMZTI7SG.js +2 -0
  33. package/dist/chunk-CMZTI7SG.js.map +1 -0
  34. package/dist/chunk-DB3JH4DS.mjs +2 -0
  35. package/dist/chunk-DB3JH4DS.mjs.map +1 -0
  36. package/dist/chunk-EWOZKYLY.mjs +2 -0
  37. package/dist/chunk-EWOZKYLY.mjs.map +1 -0
  38. package/dist/chunk-FFW7RUAG.mjs +94 -0
  39. package/dist/chunk-FFW7RUAG.mjs.map +1 -0
  40. package/dist/chunk-FK3CSFLJ.js +2 -0
  41. package/dist/chunk-FK3CSFLJ.js.map +1 -0
  42. package/dist/chunk-GIV2OHE6.mjs +2 -0
  43. package/dist/chunk-GIV2OHE6.mjs.map +1 -0
  44. package/dist/chunk-GMLNWS2N.mjs +2 -0
  45. package/dist/chunk-GMLNWS2N.mjs.map +1 -0
  46. package/dist/chunk-IQF726GS.js +2 -0
  47. package/dist/chunk-IQF726GS.js.map +1 -0
  48. package/dist/chunk-IWUUVRLJ.js +2 -0
  49. package/dist/chunk-IWUUVRLJ.js.map +1 -0
  50. package/dist/chunk-JUN6YPLL.mjs +72 -0
  51. package/dist/chunk-JUN6YPLL.mjs.map +1 -0
  52. package/dist/chunk-L3FKTBGV.js +72 -0
  53. package/dist/chunk-L3FKTBGV.js.map +1 -0
  54. package/dist/chunk-L52PDW6O.mjs +2 -0
  55. package/dist/chunk-L52PDW6O.mjs.map +1 -0
  56. package/dist/chunk-LI6WJ3LZ.js +2 -0
  57. package/dist/chunk-LI6WJ3LZ.js.map +1 -0
  58. package/dist/chunk-LXRXDTPI.js +2 -0
  59. package/dist/chunk-LXRXDTPI.js.map +1 -0
  60. package/dist/chunk-MQFZHA2D.js +2 -0
  61. package/dist/chunk-MQFZHA2D.js.map +1 -0
  62. package/dist/chunk-OITITR6K.mjs +2 -0
  63. package/dist/chunk-OITITR6K.mjs.map +1 -0
  64. package/dist/chunk-PDJGTQMY.mjs +2 -0
  65. package/dist/chunk-PDJGTQMY.mjs.map +1 -0
  66. package/dist/chunk-PGSA2O5P.mjs +2 -0
  67. package/dist/chunk-PGSA2O5P.mjs.map +1 -0
  68. package/dist/chunk-PM7CMTMB.js +4 -0
  69. package/dist/chunk-PM7CMTMB.js.map +1 -0
  70. package/dist/chunk-PYEX7DFR.mjs +4 -0
  71. package/dist/chunk-PYEX7DFR.mjs.map +1 -0
  72. package/dist/chunk-QKK5S54L.mjs +2 -0
  73. package/dist/chunk-QKK5S54L.mjs.map +1 -0
  74. package/dist/chunk-RB26MIRI.js +2 -0
  75. package/dist/chunk-RB26MIRI.js.map +1 -0
  76. package/dist/chunk-RGYK4VAY.mjs +2 -0
  77. package/dist/chunk-RGYK4VAY.mjs.map +1 -0
  78. package/dist/chunk-RHWW5FDP.js +16 -0
  79. package/dist/chunk-RHWW5FDP.js.map +1 -0
  80. package/dist/chunk-RYZEIDNR.js +2 -0
  81. package/dist/chunk-RYZEIDNR.js.map +1 -0
  82. package/dist/chunk-SLNMKGQ2.mjs +2 -0
  83. package/dist/chunk-SLNMKGQ2.mjs.map +1 -0
  84. package/dist/chunk-SSGJREE3.js +2 -0
  85. package/dist/chunk-SSGJREE3.js.map +1 -0
  86. package/dist/chunk-SWF3YVE5.js +4 -0
  87. package/dist/chunk-SWF3YVE5.js.map +1 -0
  88. package/dist/chunk-T44JQT2O.mjs +2 -0
  89. package/dist/chunk-T44JQT2O.mjs.map +1 -0
  90. package/dist/chunk-TDDAYVKK.js +2 -0
  91. package/dist/chunk-TDDAYVKK.js.map +1 -0
  92. package/dist/chunk-TXBZPCGF.mjs +2 -0
  93. package/dist/chunk-TXBZPCGF.mjs.map +1 -0
  94. package/dist/chunk-U2CGMEWB.js +2 -0
  95. package/dist/chunk-U2CGMEWB.js.map +1 -0
  96. package/dist/chunk-UUWVBENC.js +2 -0
  97. package/dist/chunk-UUWVBENC.js.map +1 -0
  98. package/dist/chunk-UYP64PV7.mjs +4 -0
  99. package/dist/chunk-UYP64PV7.mjs.map +1 -0
  100. package/dist/chunk-VMJBW3EF.mjs +2 -0
  101. package/dist/chunk-VMJBW3EF.mjs.map +1 -0
  102. package/dist/chunk-WW3X3ELF.js +2 -0
  103. package/dist/chunk-WW3X3ELF.js.map +1 -0
  104. package/dist/chunk-WWT2ZSNU.mjs +2 -0
  105. package/dist/chunk-WWT2ZSNU.mjs.map +1 -0
  106. package/dist/chunk-XMKA6GVK.mjs +16 -0
  107. package/dist/chunk-XMKA6GVK.mjs.map +1 -0
  108. package/dist/chunk-Y34DQYS7.js +2 -0
  109. package/dist/chunk-Y34DQYS7.js.map +1 -0
  110. package/dist/chunk-ZU73VG3X.js +2 -0
  111. package/dist/chunk-ZU73VG3X.js.map +1 -0
  112. package/dist/consent-CmVzqZUk.d.mts +99 -0
  113. package/dist/consent-CmVzqZUk.d.ts +99 -0
  114. package/dist/consent-DCc5zjXI.d.mts +24 -0
  115. package/dist/consent-DLWb5ota.d.ts +24 -0
  116. package/dist/consent.d.mts +197 -0
  117. package/dist/consent.d.ts +197 -0
  118. package/dist/consent.js +2 -0
  119. package/dist/consent.js.map +1 -0
  120. package/dist/consent.mjs +2 -0
  121. package/dist/consent.mjs.map +1 -0
  122. package/dist/core.d.mts +14 -0
  123. package/dist/core.d.ts +14 -0
  124. package/dist/core.js +2 -0
  125. package/dist/core.js.map +1 -0
  126. package/dist/core.mjs +2 -0
  127. package/dist/core.mjs.map +1 -0
  128. package/dist/cross-border-BrIy1ieh.d.mts +192 -0
  129. package/dist/cross-border-BrIy1ieh.d.ts +192 -0
  130. package/dist/cross-border.d.mts +58 -0
  131. package/dist/cross-border.d.ts +58 -0
  132. package/dist/cross-border.js +2 -0
  133. package/dist/cross-border.js.map +1 -0
  134. package/dist/cross-border.mjs +2 -0
  135. package/dist/cross-border.mjs.map +1 -0
  136. package/dist/dpia-B9ZZJG5a.d.mts +15 -0
  137. package/dist/dpia-fdtTd2DI.d.ts +15 -0
  138. package/dist/dpia-vWfE_9bO.d.mts +137 -0
  139. package/dist/dpia-vWfE_9bO.d.ts +137 -0
  140. package/dist/dpia.d.mts +179 -0
  141. package/dist/dpia.d.ts +179 -0
  142. package/dist/dpia.js +2 -0
  143. package/dist/dpia.js.map +1 -0
  144. package/dist/dpia.mjs +2 -0
  145. package/dist/dpia.mjs.map +1 -0
  146. package/dist/dsr-jq5NUEdz.d.ts +14 -0
  147. package/dist/dsr-pQzQ3H1O.d.mts +128 -0
  148. package/dist/dsr-pQzQ3H1O.d.ts +128 -0
  149. package/dist/dsr-whPkiI0_.d.mts +14 -0
  150. package/dist/dsr.d.mts +192 -0
  151. package/dist/dsr.d.ts +192 -0
  152. package/dist/dsr.js +2 -0
  153. package/dist/dsr.js.map +1 -0
  154. package/dist/dsr.mjs +2 -0
  155. package/dist/dsr.mjs.map +1 -0
  156. package/dist/hooks.d.mts +17 -0
  157. package/dist/hooks.d.ts +17 -0
  158. package/dist/hooks.js +2 -0
  159. package/dist/hooks.js.map +1 -0
  160. package/dist/hooks.mjs +2 -0
  161. package/dist/hooks.mjs.map +1 -0
  162. package/dist/index.d.mts +31 -448
  163. package/dist/index.d.ts +31 -448
  164. package/dist/index.js +1 -190
  165. package/dist/index.js.map +1 -1
  166. package/dist/index.mjs +1 -190
  167. package/dist/index.mjs.map +1 -1
  168. package/dist/lawful-basis-CWtvDG1x.d.mts +112 -0
  169. package/dist/lawful-basis-CWtvDG1x.d.ts +112 -0
  170. package/dist/lawful-basis-D-oXFizg.d.mts +57 -0
  171. package/dist/lawful-basis-v04AhbK2.d.ts +57 -0
  172. package/dist/lawful-basis.d.mts +55 -0
  173. package/dist/lawful-basis.d.ts +55 -0
  174. package/dist/lawful-basis.js +2 -0
  175. package/dist/lawful-basis.js.map +1 -0
  176. package/dist/lawful-basis.mjs +2 -0
  177. package/dist/lawful-basis.mjs.map +1 -0
  178. package/dist/policy.d.mts +195 -0
  179. package/dist/policy.d.ts +195 -0
  180. package/dist/policy.js +2 -0
  181. package/dist/policy.js.map +1 -0
  182. package/dist/policy.mjs +2 -0
  183. package/dist/policy.mjs.map +1 -0
  184. package/dist/privacy-9FcJceMr.d.mts +15 -0
  185. package/dist/privacy-BXz7O2ej.d.ts +15 -0
  186. package/dist/privacy-Ca6te9Ir.d.mts +138 -0
  187. package/dist/privacy-Ca6te9Ir.d.ts +138 -0
  188. package/dist/ropa-BebGfqKQ.d.ts +200 -0
  189. package/dist/ropa-Rb4dsFSz.d.mts +200 -0
  190. package/dist/ropa.d.mts +45 -0
  191. package/dist/ropa.d.ts +45 -0
  192. package/dist/ropa.js +2 -0
  193. package/dist/ropa.js.map +1 -0
  194. package/dist/ropa.mjs +2 -0
  195. package/dist/ropa.mjs.map +1 -0
  196. package/dist/unstyled.d.mts +4 -4
  197. package/dist/unstyled.d.ts +4 -4
  198. package/dist/unstyled.js +1 -1
  199. package/dist/unstyled.js.map +1 -1
  200. package/dist/unstyled.mjs +1 -1
  201. package/dist/unstyled.mjs.map +1 -1
  202. package/dist/useBreach-DRKnexsk.d.mts +99 -0
  203. package/dist/useBreach-DuT0N0K1.d.ts +99 -0
  204. package/dist/useConsent-D0pAfTlb.d.ts +65 -0
  205. package/dist/useConsent-DOt2Njst.d.mts +65 -0
  206. package/dist/useCrossBorderTransfer-D4FQYfFt.d.ts +66 -0
  207. package/dist/useCrossBorderTransfer-TVnY8_UX.d.mts +66 -0
  208. package/dist/useDPIA-DFDHBLSa.d.ts +94 -0
  209. package/dist/useDPIA-FqPofFaV.d.mts +94 -0
  210. package/dist/useDSR-DAqqOBXb.d.ts +74 -0
  211. package/dist/useDSR-OXM5Q9rf.d.mts +74 -0
  212. package/dist/useLawfulBasis-DNQ8YszQ.d.mts +68 -0
  213. package/dist/useLawfulBasis-RILM_xsx.d.ts +68 -0
  214. package/dist/usePrivacyPolicy-CfySfBLS.d.ts +89 -0
  215. package/dist/usePrivacyPolicy-Dit2sFuV.d.mts +89 -0
  216. package/dist/useROPA-Bcs6cRdi.d.ts +64 -0
  217. package/dist/useROPA-nmcSiUYv.d.mts +64 -0
  218. package/package.json +144 -20
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/ndpr-toolkit/src/components/policy/PolicyGenerator.tsx","../packages/ndpr-toolkit/src/components/policy/PolicyPreview.tsx","../packages/ndpr-toolkit/src/components/policy/PolicyExporter.tsx"],"names":["PolicyGenerator","initialSections","initialVariables","onGenerate","title","description","className","buttonClassName","generateButtonText","showPreview","allowEditing","sections","setSections","useState","variables","setVariables","activeStep","setActiveStep","generatedPolicy","setGeneratedPolicy","editedPolicy","setEditedPolicy","isGenerated","setIsGenerated","errors","setErrors","useEffect","handleSectionToggle","sectionId","prevSections","section","__spreadProps","__spreadValues","handleVariableChange","variableId","value","prevVariables","variable","prevErrors","newErrors","validateVariables","isValid","generatePolicy","includedSections","variableMap","policyContent","generatePolicyText","handleSubmit","renderSectionList","React","renderVariableForm","variablesBySection","sectionVariables","s","e","option","renderPolicyPreview","line","index","renderStep","PolicyPreview","content","onExport","onEdit","showExportOptions","showEditButton","showTableOfContents","showMetadata","organizationName","lastUpdated","activeTab","setActiveTab","sectionTitles","lines","id","handleExport","format","element","file","renderTableOfContents","renderMetadata","renderHTMLContent","renderExportOptions","PolicyExporter","onExportComplete","componentTitle","showExportHistory","includeComplianceNotice","includeLogo","logoUrl","customStyles","exportHistory","setExportHistory","selectedFormat","setSelectedFormat","isExporting","setIsExporting","exportError","setExportError","customFilename","setCustomFilename","customHeader","setCustomHeader","customFooter","setCustomFooter","showAdvancedOptions","setShowAdvancedOptions","generateDefaultFilename","dateStr","getFilename","generateHTMLContent","fullTitle","html","htmlContent","__async","url","blob","htmlForPdf","filename","exportRecord","prevHistory","error","renderFormatOptions","renderAdvancedOptions","renderExportHistory","record"],"mappings":"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","file":"chunk-FFW7RUAG.mjs","sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { generatePolicyText } from '../../utils/privacy';\nimport { PolicySection, PolicyVariable } from '../../types/privacy';\n\n// Using PolicySection and PolicyVariable from types/privacy.ts\n\nexport interface PolicyGeneratorProps {\n /**\n * List of policy sections\n */\n sections: PolicySection[];\n \n /**\n * List of policy variables\n */\n variables: PolicyVariable[];\n \n /**\n * Callback function called when the policy is generated\n */\n onGenerate: (policy: { sections: PolicySection[], variables: PolicyVariable[], content: string }) => void;\n \n /**\n * Title displayed on the generator\n * @default \"NDPA Privacy Policy Generator\"\n */\n title?: string;\n\n /**\n * Description text displayed on the generator\n * @default \"Generate an NDPA-compliant privacy policy for your organization.\"\n */\n description?: string;\n \n /**\n * Custom CSS class for the generator\n */\n className?: string;\n \n /**\n * Custom CSS class for the buttons\n */\n buttonClassName?: string;\n \n /**\n * Text for the generate button\n * @default \"Generate Policy\"\n */\n generateButtonText?: string;\n \n /**\n * Whether to show a preview of the generated policy\n * @default true\n */\n showPreview?: boolean;\n \n /**\n * Whether to allow editing the policy content\n * @default true\n */\n allowEditing?: boolean;\n}\n\nexport const PolicyGenerator: React.FC<PolicyGeneratorProps> = ({\n sections: initialSections,\n variables: initialVariables,\n onGenerate,\n title = \"NDPA Privacy Policy Generator\",\n description = \"Generate an NDPA-compliant privacy policy for your organization.\",\n className = \"\",\n buttonClassName = \"\",\n generateButtonText = \"Generate Policy\",\n showPreview = true,\n allowEditing = true\n}) => {\n const [sections, setSections] = useState<PolicySection[]>(initialSections);\n const [variables, setVariables] = useState<PolicyVariable[]>(initialVariables);\n const [activeStep, setActiveStep] = useState<'sections' | 'variables' | 'preview'>('sections');\n const [generatedPolicy, setGeneratedPolicy] = useState<string>('');\n const [editedPolicy, setEditedPolicy] = useState<string>('');\n const [isGenerated, setIsGenerated] = useState<boolean>(false);\n const [errors, setErrors] = useState<Record<string, string>>({});\n \n // Update sections when initialSections changes\n useEffect(() => {\n setSections(initialSections);\n }, [initialSections]);\n \n // Update variables when initialVariables changes\n useEffect(() => {\n setVariables(initialVariables);\n }, [initialVariables]);\n \n // Handle section toggle\n const handleSectionToggle = (sectionId: string) => {\n setSections(prevSections => \n prevSections.map(section => \n section.id === sectionId \n ? { ...section, included: !section.included } \n : section\n )\n );\n };\n \n // Handle variable change\n const handleVariableChange = (variableId: string, value: string) => {\n setVariables(prevVariables => \n prevVariables.map(variable => \n variable.id === variableId \n ? { ...variable, value } \n : variable\n )\n );\n \n // Clear error for this variable if it exists\n if (errors[variableId]) {\n setErrors(prevErrors => {\n const newErrors = { ...prevErrors };\n delete newErrors[variableId];\n return newErrors;\n });\n }\n };\n \n // Validate variables\n const validateVariables = (): boolean => {\n const newErrors: Record<string, string> = {};\n let isValid = true;\n \n variables.forEach(variable => {\n if (variable.required && !variable.value) {\n newErrors[variable.id] = `${variable.name} is required`;\n isValid = false;\n }\n });\n \n setErrors(newErrors);\n return isValid;\n };\n \n // Generate policy\n const generatePolicy = () => {\n if (!validateVariables()) {\n setActiveStep('variables');\n return;\n }\n \n const includedSections = sections.filter(section => section.included);\n const variableMap = Object.fromEntries(\n variables.map(variable => [variable.name, variable.value])\n );\n \n let policyContent = '';\n \n includedSections.forEach(section => {\n policyContent += `## ${section.title}\\n\\n`;\n policyContent += generatePolicyText(section.template, variableMap);\n policyContent += '\\n\\n';\n });\n \n setGeneratedPolicy(policyContent);\n setEditedPolicy(policyContent);\n setIsGenerated(true);\n setActiveStep('preview');\n };\n \n // Handle policy submission\n const handleSubmit = () => {\n const policy = {\n sections,\n variables,\n content: allowEditing ? editedPolicy : generatedPolicy\n };\n \n onGenerate(policy);\n };\n \n // Render section list\n const renderSectionList = () => {\n return (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-medium mb-4\">Select Policy Sections</h3>\n \n {sections.map(section => (\n <div key={section.id} className=\"border border-gray-200 dark:border-gray-700 rounded-md p-4\">\n <div className=\"flex items-start\">\n <div className=\"flex items-center h-5\">\n <input\n id={`section-${section.id}`}\n type=\"checkbox\"\n checked={section.included}\n onChange={() => handleSectionToggle(section.id)}\n disabled={section.required}\n className=\"w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 dark:focus:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600\"\n />\n </div>\n <div className=\"ml-3 text-sm\">\n <label htmlFor={`section-${section.id}`} className=\"font-medium text-gray-900 dark:text-white\">\n {section.title} {section.required && <span className=\"text-red-500\">*</span>}\n </label>\n {section.description && (\n <p className=\"text-gray-500 dark:text-gray-400 mt-1\">{section.description}</p>\n )}\n </div>\n </div>\n </div>\n ))}\n \n <div className=\"mt-6\">\n <button\n onClick={() => setActiveStep('variables')}\n className={`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 ${buttonClassName}`}\n >\n Next: Fill Variables\n </button>\n </div>\n </div>\n );\n };\n \n // Render variable form\n const renderVariableForm = () => {\n // Group variables by section\n const variablesBySection: Record<string, PolicyVariable[]> = {};\n \n variables.forEach(variable => {\n const sectionId = variable.id.split('.')[0];\n if (!variablesBySection[sectionId]) {\n variablesBySection[sectionId] = [];\n }\n variablesBySection[sectionId].push(variable);\n });\n \n return (\n <div>\n <h3 className=\"text-lg font-medium mb-4\">Fill Policy Variables</h3>\n \n <div className=\"space-y-6\">\n {Object.entries(variablesBySection).map(([sectionId, sectionVariables]) => {\n const section = sections.find(s => s.id === sectionId);\n \n // Skip sections that are not included\n if (section && !section.included) {\n return null;\n }\n \n return (\n <div key={sectionId} className=\"border border-gray-200 dark:border-gray-700 rounded-md p-4\">\n <h4 className=\"font-medium text-lg mb-3\">\n {section ? section.title : 'General Information'}\n </h4>\n \n <div className=\"space-y-4\">\n {sectionVariables.map(variable => (\n <div key={variable.id}>\n <label htmlFor={`var-${variable.id}`} className=\"block text-sm font-medium mb-1\">\n {variable.name} {variable.required && <span className=\"text-red-500\">*</span>}\n </label>\n \n {variable.description && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mb-2\">\n {variable.description}\n </p>\n )}\n \n {variable.inputType === 'textarea' ? (\n <textarea\n id={`var-${variable.id}`}\n value={variable.value}\n onChange={e => handleVariableChange(variable.id, e.target.value)}\n rows={4}\n className={`w-full px-3 py-2 border ${\n errors[variable.id] \n ? 'border-red-500 focus:ring-red-500' \n : 'border-gray-300 dark:border-gray-600 focus:ring-blue-500'\n } rounded-md focus:outline-none focus:ring-2`}\n required={variable.required}\n />\n ) : variable.inputType === 'select' && variable.options ? (\n <select\n id={`var-${variable.id}`}\n value={variable.value}\n onChange={e => handleVariableChange(variable.id, e.target.value)}\n className={`w-full px-3 py-2 border ${\n errors[variable.id] \n ? 'border-red-500 focus:ring-red-500' \n : 'border-gray-300 dark:border-gray-600 focus:ring-blue-500'\n } rounded-md focus:outline-none focus:ring-2`}\n required={variable.required}\n >\n <option value=\"\">Select an option</option>\n {variable.options.map(option => (\n <option key={option} value={option}>{option}</option>\n ))}\n </select>\n ) : (\n <input\n id={`var-${variable.id}`}\n type={variable.inputType}\n value={variable.value}\n onChange={e => handleVariableChange(variable.id, e.target.value)}\n className={`w-full px-3 py-2 border ${\n errors[variable.id] \n ? 'border-red-500 focus:ring-red-500' \n : 'border-gray-300 dark:border-gray-600 focus:ring-blue-500'\n } rounded-md focus:outline-none focus:ring-2`}\n required={variable.required}\n />\n )}\n \n {errors[variable.id] && (\n <p className=\"mt-1 text-sm text-red-600 dark:text-red-500\">\n {errors[variable.id]}\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n })}\n </div>\n \n <div className=\"mt-6 flex space-x-4\">\n <button\n onClick={() => setActiveStep('sections')}\n className={`px-4 py-2 bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-white rounded hover:bg-gray-300 dark:hover:bg-gray-600 ${buttonClassName}`}\n >\n Back to Sections\n </button>\n <button\n onClick={generatePolicy}\n className={`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 ${buttonClassName}`}\n >\n {generateButtonText}\n </button>\n </div>\n </div>\n );\n };\n \n // Render policy preview\n const renderPolicyPreview = () => {\n return (\n <div>\n <h3 className=\"text-lg font-medium mb-4\">Preview Generated Policy</h3>\n \n {allowEditing ? (\n <div className=\"mb-4\">\n <label htmlFor=\"policy-content\" className=\"block text-sm font-medium mb-1\">\n Edit Policy Content\n </label>\n <textarea\n id=\"policy-content\"\n value={editedPolicy}\n onChange={e => setEditedPolicy(e.target.value)}\n rows={20}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 font-mono text-sm\"\n />\n </div>\n ) : (\n <div className=\"bg-gray-50 dark:bg-gray-700 p-4 rounded-md mb-4\">\n <div className=\"prose dark:prose-invert max-w-none\">\n {generatedPolicy.split('\\n').map((line, index) => {\n if (line.startsWith('## ')) {\n return <h2 key={index} className=\"text-xl font-bold mt-6 mb-3\">{line.substring(3)}</h2>;\n } else if (line.startsWith('### ')) {\n return <h3 key={index} className=\"text-lg font-bold mt-4 mb-2\">{line.substring(4)}</h3>;\n } else if (line === '') {\n return <br key={index} />;\n } else {\n return <p key={index} className=\"mb-2\">{line}</p>;\n }\n })}\n </div>\n </div>\n )}\n \n <div className=\"mt-6 flex space-x-4\">\n <button\n onClick={() => setActiveStep('variables')}\n className={`px-4 py-2 bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-white rounded hover:bg-gray-300 dark:hover:bg-gray-600 ${buttonClassName}`}\n >\n Back to Variables\n </button>\n <button\n onClick={handleSubmit}\n className={`px-4 py-2 bg-green-600 text-white rounded hover:bg-green-700 ${buttonClassName}`}\n >\n Save Policy\n </button>\n </div>\n </div>\n );\n };\n \n // Render the current step\n const renderStep = () => {\n switch (activeStep) {\n case 'sections':\n return renderSectionList();\n case 'variables':\n return renderVariableForm();\n case 'preview':\n return renderPolicyPreview();\n default:\n return renderSectionList();\n }\n };\n \n return (\n <div className={`bg-white dark:bg-gray-800 p-6 rounded-lg shadow-md ${className}`}>\n <h2 className=\"text-xl font-bold mb-2\">{title}</h2>\n <p className=\"mb-6 text-gray-600 dark:text-gray-300\">{description}</p>\n \n {/* Steps Indicator */}\n <div className=\"mb-8\">\n <ol className=\"flex items-center w-full\">\n <li className={`flex w-full items-center ${activeStep === 'sections' ? 'text-blue-600 dark:text-blue-500' : 'text-gray-500 dark:text-gray-400'} after:content-[''] after:w-full after:h-1 after:border-b after:border-gray-200 after:border-1 after:hidden sm:after:inline-block after:mx-6 xl:after:mx-10`}>\n <span className={`flex items-center justify-center w-8 h-8 ${activeStep === 'sections' ? 'bg-blue-100 dark:bg-blue-800' : 'bg-gray-100 dark:bg-gray-700'} rounded-full shrink-0`}>\n 1\n </span>\n <span className=\"hidden sm:inline-flex sm:ml-2\">Sections</span>\n </li>\n <li className={`flex w-full items-center ${activeStep === 'variables' ? 'text-blue-600 dark:text-blue-500' : 'text-gray-500 dark:text-gray-400'} after:content-[''] after:w-full after:h-1 after:border-b after:border-gray-200 after:border-1 after:hidden sm:after:inline-block after:mx-6 xl:after:mx-10`}>\n <span className={`flex items-center justify-center w-8 h-8 ${activeStep === 'variables' ? 'bg-blue-100 dark:bg-blue-800' : 'bg-gray-100 dark:bg-gray-700'} rounded-full shrink-0`}>\n 2\n </span>\n <span className=\"hidden sm:inline-flex sm:ml-2\">Variables</span>\n </li>\n <li className={`flex items-center ${activeStep === 'preview' ? 'text-blue-600 dark:text-blue-500' : 'text-gray-500 dark:text-gray-400'}`}>\n <span className={`flex items-center justify-center w-8 h-8 ${activeStep === 'preview' ? 'bg-blue-100 dark:bg-blue-800' : 'bg-gray-100 dark:bg-gray-700'} rounded-full shrink-0`}>\n 3\n </span>\n <span className=\"hidden sm:inline-flex sm:ml-2\">Preview</span>\n </li>\n </ol>\n </div>\n \n {/* NDPA Notice */}\n <div className=\"mb-6 p-4 bg-blue-50 dark:bg-blue-900/20 rounded-md\">\n <h3 className=\"text-sm font-bold text-blue-800 dark:text-blue-200 mb-2\">NDPA Compliance Notice</h3>\n <p className=\"text-blue-700 dark:text-blue-300 text-sm\">\n This tool helps you generate a privacy policy that aligns with the Nigeria Data Protection Act (NDPA) 2023.\n While we strive to ensure compliance, we recommend having the final policy reviewed by a legal professional\n familiar with NDPA requirements.\n </p>\n </div>\n \n {/* Current Step Content */}\n {renderStep()}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { PolicySection, PolicyVariable } from '../../types/privacy';\n\nexport interface PolicyPreviewProps {\n /**\n * The policy content to preview\n */\n content: string;\n \n /**\n * The policy sections\n */\n sections?: PolicySection[];\n \n /**\n * The policy variables\n */\n variables?: PolicyVariable[];\n \n /**\n * Callback function called when the policy is exported\n */\n onExport?: (format: 'pdf' | 'html' | 'markdown' | 'docx') => void;\n \n /**\n * Callback function called when the policy is edited\n */\n onEdit?: () => void;\n \n /**\n * Title displayed on the preview\n * @default \"Privacy Policy Preview\"\n */\n title?: string;\n \n /**\n * Description text displayed on the preview\n * @default \"Preview your NDPA-compliant privacy policy before exporting.\"\n */\n description?: string;\n \n /**\n * Custom CSS class for the preview\n */\n className?: string;\n \n /**\n * Custom CSS class for the buttons\n */\n buttonClassName?: string;\n \n /**\n * Whether to show the export options\n * @default true\n */\n showExportOptions?: boolean;\n \n /**\n * Whether to show the edit button\n * @default true\n */\n showEditButton?: boolean;\n \n /**\n * Whether to show the table of contents\n * @default true\n */\n showTableOfContents?: boolean;\n \n /**\n * Whether to show the policy metadata\n * @default true\n */\n showMetadata?: boolean;\n \n /**\n * The organization name to display in the policy\n */\n organizationName?: string;\n \n /**\n * The last updated date to display in the policy\n */\n lastUpdated?: Date;\n}\n\nexport const PolicyPreview: React.FC<PolicyPreviewProps> = ({\n content,\n sections,\n variables,\n onExport,\n onEdit,\n title = \"Privacy Policy Preview\",\n description = \"Preview your NDPA-compliant privacy policy before exporting.\",\n className = \"\",\n buttonClassName = \"\",\n showExportOptions = true,\n showEditButton = true,\n showTableOfContents = true,\n showMetadata = true,\n organizationName,\n lastUpdated = new Date()\n}) => {\n const [activeTab, setActiveTab] = useState<'preview' | 'markdown'>('preview');\n \n // Parse the content to extract section titles for the table of contents\n const extractSectionTitles = (): { id: string, title: string, level: number }[] => {\n const lines = content.split('\\n');\n const sectionTitles: { id: string, title: string, level: number }[] = [];\n \n lines.forEach(line => {\n if (line.startsWith('## ')) {\n const title = line.substring(3).trim();\n const id = title.toLowerCase().replace(/[^a-z0-9]+/g, '-');\n sectionTitles.push({ id, title, level: 2 });\n } else if (line.startsWith('### ')) {\n const title = line.substring(4).trim();\n const id = title.toLowerCase().replace(/[^a-z0-9]+/g, '-');\n sectionTitles.push({ id, title, level: 3 });\n }\n });\n \n return sectionTitles;\n };\n \n // Get the section titles for the table of contents\n const sectionTitles = extractSectionTitles();\n \n // Handle export button click\n const handleExport = (format: 'pdf' | 'html' | 'markdown' | 'docx') => {\n if (onExport) {\n onExport(format);\n } else {\n // Fallback export functionality\n if (format === 'markdown') {\n const element = document.createElement('a');\n const file = new Blob([content], {type: 'text/markdown'});\n element.href = URL.createObjectURL(file);\n element.download = `privacy-policy-${new Date().toISOString().split('T')[0]}.md`;\n document.body.appendChild(element);\n element.click();\n document.body.removeChild(element);\n }\n }\n };\n \n // Render the table of contents\n const renderTableOfContents = () => {\n if (!showTableOfContents || sectionTitles.length === 0) {\n return null;\n }\n \n return (\n <div className=\"mb-6 p-4 bg-gray-50 dark:bg-gray-700 rounded-md\">\n <h3 className=\"text-lg font-medium mb-3\">Table of Contents</h3>\n <ul className=\"space-y-1\">\n {sectionTitles.map((section, index) => (\n <li key={index} style={{ marginLeft: `${(section.level - 2) * 1.5}rem` }}>\n <a \n href={`#${section.id}`} \n className=\"text-blue-600 dark:text-blue-400 hover:underline\"\n >\n {section.title}\n </a>\n </li>\n ))}\n </ul>\n </div>\n );\n };\n \n // Render the policy metadata\n const renderMetadata = () => {\n if (!showMetadata) {\n return null;\n }\n \n return (\n <div className=\"mb-6\">\n <h1 className=\"text-2xl font-bold mb-2\">\n {organizationName ? `${organizationName} Privacy Policy` : 'Privacy Policy'}\n </h1>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n Last Updated: {lastUpdated.toLocaleDateString()}\n </p>\n </div>\n );\n };\n \n // Render the policy content in HTML format\n const renderHTMLContent = () => {\n return (\n <div className=\"prose dark:prose-invert max-w-none\">\n {content.split('\\n').map((line, index) => {\n if (line.startsWith('## ')) {\n const title = line.substring(3).trim();\n const id = title.toLowerCase().replace(/[^a-z0-9]+/g, '-');\n return <h2 id={id} key={index} className=\"text-xl font-bold mt-6 mb-3\">{title}</h2>;\n } else if (line.startsWith('### ')) {\n const title = line.substring(4).trim();\n const id = title.toLowerCase().replace(/[^a-z0-9]+/g, '-');\n return <h3 id={id} key={index} className=\"text-lg font-bold mt-4 mb-2\">{title}</h3>;\n } else if (line === '') {\n return <br key={index} />;\n } else {\n return <p key={index} className=\"mb-2\">{line}</p>;\n }\n })}\n </div>\n );\n };\n \n // Render the export options\n const renderExportOptions = () => {\n if (!showExportOptions) {\n return null;\n }\n \n return (\n <div className=\"mt-6\">\n <h3 className=\"text-lg font-medium mb-3\">Export Options</h3>\n <div className=\"flex flex-wrap gap-3\">\n <button\n onClick={() => handleExport('pdf')}\n className={`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 ${buttonClassName}`}\n >\n Export as PDF\n </button>\n <button\n onClick={() => handleExport('docx')}\n className={`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 ${buttonClassName}`}\n >\n Export as DOCX\n </button>\n <button\n onClick={() => handleExport('html')}\n className={`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 ${buttonClassName}`}\n >\n Export as HTML\n </button>\n <button\n onClick={() => handleExport('markdown')}\n className={`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 ${buttonClassName}`}\n >\n Export as Markdown\n </button>\n </div>\n </div>\n );\n };\n \n return (\n <div className={`bg-white dark:bg-gray-800 p-6 rounded-lg shadow-md ${className}`}>\n <div className=\"flex justify-between items-start mb-6\">\n <div>\n <h2 className=\"text-xl font-bold mb-2\">{title}</h2>\n <p className=\"text-gray-600 dark:text-gray-300\">{description}</p>\n </div>\n \n {showEditButton && onEdit && (\n <button\n onClick={onEdit}\n className={`px-4 py-2 bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-white rounded hover:bg-gray-300 dark:hover:bg-gray-600 ${buttonClassName}`}\n >\n Edit Policy\n </button>\n )}\n </div>\n \n {/* NDPA Notice */}\n <div className=\"mb-6 p-4 bg-blue-50 dark:bg-blue-900/20 rounded-md\">\n <h3 className=\"text-sm font-bold text-blue-800 dark:text-blue-200 mb-2\">NDPA Compliance Notice</h3>\n <p className=\"text-blue-700 dark:text-blue-300 text-sm\">\n This privacy policy has been generated to align with the Nigeria Data Protection Act (NDPA) 2023.\n We recommend having the final policy reviewed by a legal professional familiar with NDPA requirements\n before publishing it on your website or sharing it with your users.\n </p>\n </div>\n \n {/* Tabs */}\n <div className=\"mb-6 border-b border-gray-200 dark:border-gray-700\">\n <ul className=\"flex flex-wrap -mb-px\">\n <li className=\"mr-2\">\n <button\n onClick={() => setActiveTab('preview')}\n className={`inline-block p-4 ${\n activeTab === 'preview'\n ? 'text-blue-600 border-b-2 border-blue-600 dark:text-blue-500 dark:border-blue-500'\n : 'text-gray-500 hover:text-gray-600 hover:border-gray-300 dark:text-gray-400 dark:hover:text-gray-300'\n }`}\n >\n Preview\n </button>\n </li>\n <li className=\"mr-2\">\n <button\n onClick={() => setActiveTab('markdown')}\n className={`inline-block p-4 ${\n activeTab === 'markdown'\n ? 'text-blue-600 border-b-2 border-blue-600 dark:text-blue-500 dark:border-blue-500'\n : 'text-gray-500 hover:text-gray-600 hover:border-gray-300 dark:text-gray-400 dark:hover:text-gray-300'\n }`}\n >\n Markdown\n </button>\n </li>\n </ul>\n </div>\n \n {/* Content */}\n <div className=\"bg-white dark:bg-gray-800 p-4 rounded-md\">\n {activeTab === 'preview' ? (\n <div>\n {renderMetadata()}\n {renderTableOfContents()}\n <div className=\"bg-gray-50 dark:bg-gray-700 p-6 rounded-md\">\n {renderHTMLContent()}\n </div>\n </div>\n ) : (\n <div>\n <pre className=\"bg-gray-50 dark:bg-gray-700 p-4 rounded-md overflow-auto whitespace-pre-wrap font-mono text-sm text-gray-800 dark:text-gray-200\">\n {content}\n </pre>\n </div>\n )}\n </div>\n \n {/* Export Options */}\n {renderExportOptions()}\n </div>\n );\n};\n","import React, { useState } from 'react';\n\nexport interface PolicyExporterProps {\n /**\n * The policy content to export\n */\n content: string;\n \n /**\n * The policy title\n */\n title?: string;\n \n /**\n * The organization name to include in the exported policy\n */\n organizationName?: string;\n \n /**\n * The last updated date to include in the exported policy\n */\n lastUpdated?: Date;\n \n /**\n * Callback function called when the export is complete\n */\n onExportComplete?: (format: string, url: string) => void;\n \n /**\n * Title displayed on the exporter\n * @default \"Export Privacy Policy\"\n */\n componentTitle?: string;\n \n /**\n * Description text displayed on the exporter\n * @default \"Export your NDPA-compliant privacy policy in various formats.\"\n */\n description?: string;\n \n /**\n * Custom CSS class for the exporter\n */\n className?: string;\n \n /**\n * Custom CSS class for the buttons\n */\n buttonClassName?: string;\n \n /**\n * Whether to show the export history\n * @default true\n */\n showExportHistory?: boolean;\n \n /**\n * Whether to include the NDPA compliance notice in the exported policy\n * @default true\n */\n includeComplianceNotice?: boolean;\n \n /**\n * Whether to include the organization logo in the exported policy\n * @default false\n */\n includeLogo?: boolean;\n \n /**\n * URL of the organization logo\n */\n logoUrl?: string;\n \n /**\n * Custom CSS styles for the exported policy\n */\n customStyles?: string;\n}\n\ninterface ExportRecord {\n id: string;\n format: string;\n timestamp: number;\n url: string;\n filename: string;\n}\n\nexport const PolicyExporter: React.FC<PolicyExporterProps> = ({\n content,\n title = \"Privacy Policy\",\n organizationName,\n lastUpdated = new Date(),\n onExportComplete,\n componentTitle = \"Export Privacy Policy\",\n description = \"Export your NDPA-compliant privacy policy in various formats.\",\n className = \"\",\n buttonClassName = \"\",\n showExportHistory = true,\n includeComplianceNotice = true,\n includeLogo = false,\n logoUrl,\n customStyles\n}) => {\n const [exportHistory, setExportHistory] = useState<ExportRecord[]>([]);\n const [selectedFormat, setSelectedFormat] = useState<string>('pdf');\n const [isExporting, setIsExporting] = useState<boolean>(false);\n const [exportError, setExportError] = useState<string | null>(null);\n const [customFilename, setCustomFilename] = useState<string>('');\n const [customHeader, setCustomHeader] = useState<string>('');\n const [customFooter, setCustomFooter] = useState<string>('');\n const [showAdvancedOptions, setShowAdvancedOptions] = useState<boolean>(false);\n \n // Generate a default filename based on the organization name and format\n const generateDefaultFilename = (format: string): string => {\n const dateStr = new Date().toISOString().split('T')[0];\n const orgStr = organizationName ? \n organizationName.toLowerCase().replace(/[^a-z0-9]+/g, '-') : \n 'privacy-policy';\n \n return `${orgStr}-privacy-policy-${dateStr}.${format.toLowerCase()}`;\n };\n \n // Get the actual filename to use\n const getFilename = (format: string): string => {\n if (customFilename) {\n // Ensure the filename has the correct extension\n if (customFilename.endsWith(`.${format.toLowerCase()}`)) {\n return customFilename;\n } else {\n return `${customFilename}.${format.toLowerCase()}`;\n }\n }\n \n return generateDefaultFilename(format);\n };\n \n // Generate HTML content for export\n const generateHTMLContent = (): string => {\n const fullTitle = organizationName ? `${organizationName} ${title}` : title;\n const dateStr = lastUpdated.toLocaleDateString();\n \n let html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${fullTitle}</title>\n <style>\n body {\n font-family: Arial, sans-serif;\n line-height: 1.6;\n color: #333;\n max-width: 800px;\n margin: 0 auto;\n padding: 20px;\n }\n h1 {\n font-size: 24px;\n margin-bottom: 10px;\n }\n h2 {\n font-size: 20px;\n margin-top: 30px;\n margin-bottom: 10px;\n border-bottom: 1px solid #eee;\n padding-bottom: 5px;\n }\n h3 {\n font-size: 18px;\n margin-top: 20px;\n margin-bottom: 10px;\n }\n p {\n margin-bottom: 15px;\n }\n .header {\n text-align: center;\n margin-bottom: 30px;\n }\n .footer {\n margin-top: 50px;\n text-align: center;\n font-size: 12px;\n color: #666;\n border-top: 1px solid #eee;\n padding-top: 20px;\n }\n .logo {\n max-width: 200px;\n margin-bottom: 20px;\n }\n .last-updated {\n font-size: 12px;\n color: #666;\n margin-bottom: 30px;\n }\n .compliance-notice {\n background-color: #f8f9fa;\n border: 1px solid #e9ecef;\n padding: 15px;\n margin-bottom: 30px;\n font-size: 14px;\n }\n ${customStyles || ''}\n </style>\n</head>\n<body>\n <div class=\"header\">\n ${includeLogo && logoUrl ? `<img src=\"${logoUrl}\" alt=\"${organizationName || 'Company'} Logo\" class=\"logo\">` : ''}\n ${customHeader ? `<div class=\"custom-header\">${customHeader}</div>` : ''}\n <h1>${fullTitle}</h1>\n <div class=\"last-updated\">Last Updated: ${dateStr}</div>\n </div>`;\n \n if (includeComplianceNotice) {\n html += `\n <div class=\"compliance-notice\">\n <strong>NDPA Compliance Notice:</strong> This privacy policy has been created to comply with the Nigeria Data Protection Act (NDPA) 2023.\n It outlines how we collect, use, disclose, and protect your personal information in accordance with NDPA requirements.\n </div>`;\n }\n \n // Convert markdown content to HTML\n const htmlContent = content\n .replace(/^## (.*?)$/gm, '<h2>$1</h2>')\n .replace(/^### (.*?)$/gm, '<h3>$1</h3>')\n .replace(/\\n\\n/g, '</p><p>')\n .replace(/\\n/g, '<br>');\n \n html += `\n <div class=\"content\">\n <p>${htmlContent}</p>\n </div>\n \n <div class=\"footer\">\n ${customFooter ? `<div class=\"custom-footer\">${customFooter}</div>` : ''}\n <p>&copy; ${new Date().getFullYear()} ${organizationName || 'Company'}. All rights reserved.</p>\n </div>\n</body>\n</html>`;\n \n return html;\n };\n \n // Handle export button click\n const handleExport = async () => {\n setIsExporting(true);\n setExportError(null);\n \n try {\n const format = selectedFormat.toLowerCase();\n let url = '';\n let blob: Blob;\n \n switch (format) {\n case 'pdf':\n // In a real implementation, this would use a PDF generation library\n // For this example, we'll just create an HTML file with a note\n const htmlForPdf = generateHTMLContent();\n blob = new Blob([htmlForPdf], { type: 'text/html' });\n url = URL.createObjectURL(blob);\n break;\n \n case 'docx':\n // In a real implementation, this would use a DOCX generation library\n // For this example, we'll just create a text file with a note\n blob = new Blob([content], { type: 'text/plain' });\n url = URL.createObjectURL(blob);\n break;\n \n case 'html':\n const html = generateHTMLContent();\n blob = new Blob([html], { type: 'text/html' });\n url = URL.createObjectURL(blob);\n break;\n \n case 'markdown':\n default:\n blob = new Blob([content], { type: 'text/markdown' });\n url = URL.createObjectURL(blob);\n break;\n }\n \n // Create a download link and trigger it\n const filename = getFilename(format);\n const element = document.createElement('a');\n element.href = url;\n element.download = filename;\n document.body.appendChild(element);\n element.click();\n document.body.removeChild(element);\n \n // Add to export history\n const exportRecord: ExportRecord = {\n id: `export_${Date.now()}`,\n format,\n timestamp: Date.now(),\n url,\n filename\n };\n \n setExportHistory(prevHistory => [exportRecord, ...prevHistory]);\n \n // Call the callback\n if (onExportComplete) {\n onExportComplete(format, url);\n }\n } catch (error) {\n console.error('Export error:', error);\n setExportError('An error occurred during export. Please try again.');\n } finally {\n setIsExporting(false);\n }\n };\n \n // Render export format options\n const renderFormatOptions = () => {\n const formats = [\n { value: 'pdf', label: 'PDF Document (.pdf)' },\n { value: 'docx', label: 'Word Document (.docx)' },\n { value: 'html', label: 'Web Page (.html)' },\n { value: 'markdown', label: 'Markdown (.md)' }\n ];\n \n return (\n <div className=\"mb-6\">\n <label htmlFor=\"export-format\" className=\"block text-sm font-medium mb-1\">\n Export Format\n </label>\n <select\n id=\"export-format\"\n value={selectedFormat}\n onChange={e => setSelectedFormat(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {formats.map(format => (\n <option key={format.value} value={format.value}>\n {format.label}\n </option>\n ))}\n </select>\n </div>\n );\n };\n \n // Render advanced options\n const renderAdvancedOptions = () => {\n if (!showAdvancedOptions) {\n return (\n <button\n type=\"button\"\n onClick={() => setShowAdvancedOptions(true)}\n className=\"text-blue-600 dark:text-blue-400 text-sm mb-6\"\n >\n Show Advanced Options\n </button>\n );\n }\n \n return (\n <div className=\"mb-6 space-y-4 border border-gray-200 dark:border-gray-700 rounded-md p-4\">\n <div className=\"flex justify-between items-center\">\n <h3 className=\"text-md font-medium\">Advanced Export Options</h3>\n <button\n type=\"button\"\n onClick={() => setShowAdvancedOptions(false)}\n className=\"text-blue-600 dark:text-blue-400 text-sm\"\n >\n Hide Advanced Options\n </button>\n </div>\n \n <div>\n <label htmlFor=\"custom-filename\" className=\"block text-sm font-medium mb-1\">\n Custom Filename\n </label>\n <input\n type=\"text\"\n id=\"custom-filename\"\n value={customFilename}\n onChange={e => setCustomFilename(e.target.value)}\n placeholder={generateDefaultFilename(selectedFormat)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-1\">\n Leave blank to use the default filename format.\n </p>\n </div>\n \n <div>\n <label htmlFor=\"custom-header\" className=\"block text-sm font-medium mb-1\">\n Custom Header HTML (for HTML/PDF exports)\n </label>\n <textarea\n id=\"custom-header\"\n value={customHeader}\n onChange={e => setCustomHeader(e.target.value)}\n rows={3}\n placeholder=\"<div>Custom header content</div>\"\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n \n <div>\n <label htmlFor=\"custom-footer\" className=\"block text-sm font-medium mb-1\">\n Custom Footer HTML (for HTML/PDF exports)\n </label>\n <textarea\n id=\"custom-footer\"\n value={customFooter}\n onChange={e => setCustomFooter(e.target.value)}\n rows={3}\n placeholder=\"<div>Custom footer content</div>\"\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n \n <div className=\"flex items-start\">\n <div className=\"flex items-center h-5\">\n <input\n id=\"include-compliance-notice\"\n type=\"checkbox\"\n checked={includeComplianceNotice}\n onChange={e => setShowAdvancedOptions(e.target.checked)}\n className=\"w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 dark:focus:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600\"\n />\n </div>\n <div className=\"ml-3 text-sm\">\n <label htmlFor=\"include-compliance-notice\" className=\"font-medium text-gray-900 dark:text-white\">\n Include NDPA Compliance Notice\n </label>\n <p className=\"text-gray-500 dark:text-gray-400\">\n Adds a notice explaining that this policy complies with NDPA requirements.\n </p>\n </div>\n </div>\n </div>\n );\n };\n \n // Render export history\n const renderExportHistory = () => {\n if (!showExportHistory || exportHistory.length === 0) {\n return null;\n }\n \n return (\n <div className=\"mt-6\">\n <h3 className=\"text-lg font-medium mb-3\">Export History</h3>\n <div className=\"bg-gray-50 dark:bg-gray-700 rounded-md overflow-hidden\">\n <table className=\"min-w-full divide-y divide-gray-200 dark:divide-gray-600\">\n <thead className=\"bg-gray-100 dark:bg-gray-800\">\n <tr>\n <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider\">\n Date\n </th>\n <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider\">\n Format\n </th>\n <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider\">\n Filename\n </th>\n <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider\">\n Actions\n </th>\n </tr>\n </thead>\n <tbody className=\"bg-white dark:bg-gray-700 divide-y divide-gray-200 dark:divide-gray-600\">\n {exportHistory.map(record => (\n <tr key={record.id}>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500 dark:text-gray-300\">\n {new Date(record.timestamp).toLocaleString()}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500 dark:text-gray-300\">\n {record.format.toUpperCase()}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500 dark:text-gray-300\">\n {record.filename}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-sm font-medium\">\n <a \n href={record.url} \n download={record.filename}\n className=\"text-blue-600 dark:text-blue-400 hover:text-blue-900 dark:hover:text-blue-300 mr-4\"\n >\n Download\n </a>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n };\n \n return (\n <div className={`bg-white dark:bg-gray-800 p-6 rounded-lg shadow-md ${className}`}>\n <h2 className=\"text-xl font-bold mb-2\">{componentTitle}</h2>\n <p className=\"mb-6 text-gray-600 dark:text-gray-300\">{description}</p>\n \n {/* Format Selection */}\n {renderFormatOptions()}\n \n {/* Advanced Options */}\n {renderAdvancedOptions()}\n \n {/* Export Button */}\n <div className=\"mb-6\">\n <button\n onClick={handleExport}\n disabled={isExporting}\n className={`px-6 py-3 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 ${buttonClassName} ${isExporting ? 'opacity-70 cursor-not-allowed' : ''}`}\n >\n {isExporting ? 'Exporting...' : `Export as ${selectedFormat.toUpperCase()}`}\n </button>\n \n {exportError && (\n <p className=\"mt-2 text-sm text-red-600 dark:text-red-500\">\n {exportError}\n </p>\n )}\n </div>\n \n {/* Export Tips */}\n <div className=\"mb-6 p-4 bg-blue-50 dark:bg-blue-900/20 rounded-md\">\n <h3 className=\"text-sm font-bold text-blue-800 dark:text-blue-200 mb-2\">Export Tips</h3>\n <ul className=\"text-blue-700 dark:text-blue-300 text-sm list-disc list-inside space-y-1\">\n <li>PDF format is recommended for printing or sharing with stakeholders.</li>\n <li>HTML format is ideal for publishing on your website.</li>\n <li>DOCX format allows for further editing in Microsoft Word or similar applications.</li>\n <li>Markdown format is useful for version control systems or technical documentation.</li>\n </ul>\n </div>\n \n {/* Export History */}\n {renderExportHistory()}\n </div>\n );\n};\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkMQFZHA2D_js=require('./chunk-MQFZHA2D.js'),n=require('react');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var n__default=/*#__PURE__*/_interopDefault(n);var F=({options:g,onSave:m,title:b="We Value Your Privacy",description:S="We use cookies and similar technologies to provide our services and enhance your experience.",acceptAllButtonText:k="Accept All",rejectAllButtonText:C="Reject All",customizeButtonText:y="Customize",saveButtonText:l="Save Preferences",position:d="bottom",version:h="1.0",show:u,storageKey:x="ndpr_consent",className:N="",buttonClassName:p="",primaryButtonClassName:w="",secondaryButtonClassName:o=""})=>{let[t,c]=n.useState(false),[f,v]=n.useState(false),[$,O]=n.useState({});n.useEffect(()=>{let s={};if(g.forEach(i=>{s[i.id]=i.defaultValue||false;}),O(s),u===void 0){let i=localStorage.getItem(x);c(!i);}else c(u);},[g,u,x]);let e=()=>{let s={};g.forEach(i=>{s[i.id]=true;}),P(s);},a=()=>{let s={};g.forEach(i=>{s[i.id]=i.required||false;}),P(s);},D=(s,i)=>{O(V=>chunkMQFZHA2D_js.b(chunkMQFZHA2D_js.a({},V),{[s]:i}));},M=()=>{P($);},P=s=>{let i={consents:s,timestamp:Date.now(),version:h,method:f?"customize":"banner",hasInteracted:true};localStorage.setItem(x,JSON.stringify(i)),m(i),c(false),v(false);};return t?n__default.default.createElement("div",{className:`fixed z-50 bg-white dark:bg-gray-800 shadow-lg p-4 border border-gray-200 dark:border-gray-700 ${d==="top"?"top-0 left-0 right-0":d==="center"?"top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 max-w-lg":"bottom-0 left-0 right-0"} ${N}`,role:"dialog","aria-labelledby":"consent-banner-title"},n__default.default.createElement("div",{className:"max-w-6xl mx-auto"},n__default.default.createElement("h2",{id:"consent-banner-title",className:"text-lg font-bold mb-2"},b),n__default.default.createElement("p",{className:"mb-4"},S),f?n__default.default.createElement("div",{className:"mb-4"},n__default.default.createElement("div",{className:"space-y-3"},g.map(s=>n__default.default.createElement("div",{key:s.id,className:"flex items-start"},n__default.default.createElement("div",{className:"flex items-center h-5"},n__default.default.createElement("input",{id:`consent-${s.id}`,type:"checkbox",checked:$[s.id]||false,onChange:i=>D(s.id,i.target.checked),disabled:s.required,className:"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500"})),n__default.default.createElement("div",{className:"ml-3 text-sm"},n__default.default.createElement("label",{htmlFor:`consent-${s.id}`,className:"font-medium"},s.label," ",s.required&&n__default.default.createElement("span",{className:"text-red-500"},"*")),n__default.default.createElement("p",{className:"text-gray-500 dark:text-gray-400"},s.description))))),n__default.default.createElement("div",{className:"mt-4 flex flex-wrap gap-2"},n__default.default.createElement("button",{onClick:M,className:`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 ${p} ${w}`},l),n__default.default.createElement("button",{onClick:()=>v(false),className:`px-4 py-2 bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-white rounded hover:bg-gray-300 dark:hover:bg-gray-600 ${p} ${o}`},"Back"))):n__default.default.createElement("div",{className:"flex flex-wrap gap-2"},n__default.default.createElement("button",{onClick:e,className:`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 ${p} ${w}`},k),n__default.default.createElement("button",{onClick:a,className:`px-4 py-2 bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-white rounded hover:bg-gray-300 dark:hover:bg-gray-600 ${p} ${o}`},C),n__default.default.createElement("button",{onClick:()=>v(true),className:`px-4 py-2 bg-transparent text-gray-800 dark:text-white hover:underline ${p}`},y)),n__default.default.createElement("div",{className:"mt-2 text-xs text-gray-500 dark:text-gray-400"},'By clicking "Accept All", you agree to the use of ALL cookies. Visit our Cookie Policy to learn more.'))):null};var G=({options:g,settings:m,onSave:b,title:S="Manage Your Privacy Settings",description:k="Update your consent preferences at any time. Required cookies cannot be disabled as they are necessary for the website to function.",saveButtonText:C="Save Preferences",resetButtonText:y="Reset to Defaults",version:l="1.0",className:d="",buttonClassName:h="",primaryButtonClassName:u="",secondaryButtonClassName:x="",showSuccessMessage:N=true,successMessage:p="Your preferences have been saved.",successMessageDuration:w=3e3})=>{let[o,t]=n.useState({}),[c,f]=n.useState(false);n.useEffect(()=>{if(m&&m.consents)t(m.consents);else {let e={};g.forEach(a=>{e[a.id]=a.defaultValue||false;}),t(e);}},[g,m]);let v=(e,a)=>{t(D=>chunkMQFZHA2D_js.b(chunkMQFZHA2D_js.a({},D),{[e]:a}));},$=()=>{let e={consents:o,timestamp:Date.now(),version:l,method:"manager",hasInteracted:true};b(e),N&&(f(true),setTimeout(()=>{f(false);},w));},O=()=>{let e={};g.forEach(a=>{e[a.id]=a.defaultValue||false;}),t(e);};return n__default.default.createElement("div",{className:`bg-white dark:bg-gray-800 rounded-lg shadow-md p-6 ${d}`},n__default.default.createElement("h2",{className:"text-xl font-bold mb-2"},S),n__default.default.createElement("p",{className:"mb-6 text-gray-600 dark:text-gray-300"},k),n__default.default.createElement("div",{className:"space-y-6"},g.map(e=>n__default.default.createElement("div",{key:e.id,className:"border-b border-gray-200 dark:border-gray-700 pb-4 last:border-0"},n__default.default.createElement("div",{className:"flex items-start justify-between"},n__default.default.createElement("div",null,n__default.default.createElement("h3",{className:"font-medium text-gray-900 dark:text-white"},e.label),n__default.default.createElement("p",{className:"text-sm text-gray-500 dark:text-gray-400 mt-1"},e.description)),n__default.default.createElement("div",{className:"ml-4 flex-shrink-0"},n__default.default.createElement("label",{className:"relative inline-flex items-center cursor-pointer"},n__default.default.createElement("input",{type:"checkbox",className:"sr-only peer",checked:o[e.id]||false,onChange:a=>v(e.id,a.target.checked),disabled:e.required}),n__default.default.createElement("div",{className:`w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600 ${e.required?"opacity-60":""}`}),n__default.default.createElement("span",{className:"ml-3 text-sm font-medium text-gray-900 dark:text-gray-300"},o[e.id]?"Enabled":"Disabled",e.required&&n__default.default.createElement("span",{className:"text-xs text-red-500 ml-1"},"(Required)")))))))),c&&n__default.default.createElement("div",{className:"mt-4 p-3 bg-green-50 dark:bg-green-900/20 text-green-800 dark:text-green-200 rounded-md"},p),n__default.default.createElement("div",{className:"mt-6 flex flex-wrap gap-3"},n__default.default.createElement("button",{onClick:$,className:`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 ${h} ${u}`},C),n__default.default.createElement("button",{onClick:O,className:`px-4 py-2 bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-white rounded hover:bg-gray-300 dark:hover:bg-gray-600 ${h} ${x}`},y)),n__default.default.createElement("div",{className:"mt-4 text-xs text-gray-500 dark:text-gray-400"},n__default.default.createElement("p",null,"Last updated: ",m?new Date(m.timestamp).toLocaleString():"Never"),n__default.default.createElement("p",null,"Version: ",l)))};var X=({settings:g,storageOptions:m={},onLoad:b,onSave:S,autoSave:k=true,autoLoad:C=true,children:y})=>{let{storageKey:l="ndpr_consent",storageType:d="localStorage",cookieOptions:h={}}=m,[u,x]=n.useState(false);n.useEffect(()=>{C&&!u&&N();},[C,u]),n.useEffect(()=>{k&&u&&p(g);},[g,k,u]);let N=()=>{let o=null;try{if(d==="localStorage"&&typeof window!="undefined"){let t=localStorage.getItem(l);t&&(o=JSON.parse(t));}else if(d==="sessionStorage"&&typeof window!="undefined"){let t=sessionStorage.getItem(l);t&&(o=JSON.parse(t));}else if(d==="cookie"&&typeof document!="undefined"){let c=document.cookie.split(";").find(f=>f.trim().startsWith(`${l}=`));if(c){let f=c.split("=")[1];o=JSON.parse(decodeURIComponent(f));}}x(!0),b&&b(o);}catch(t){console.error("Error loading consent settings:",t),x(true),b&&b(null);}return o},p=o=>{try{let t=JSON.stringify(o);if(d==="localStorage"&&typeof window!="undefined")localStorage.setItem(l,t);else if(d==="sessionStorage"&&typeof window!="undefined")sessionStorage.setItem(l,t);else if(d==="cookie"&&typeof document!="undefined"){let{domain:c,path:f="/",expires:v=365,secure:$=!0,sameSite:O="Lax"}=h,e=new Date;e.setDate(e.getDate()+v);let a=`${l}=${encodeURIComponent(t)}; path=${f}; expires=${e.toUTCString()}`;c&&(a+=`; domain=${c}`),$&&(a+="; secure"),a+=`; samesite=${O}`,document.cookie=a;}return S&&S(o),!0}catch(t){return console.error("Error saving consent settings:",t),false}},w=()=>{try{if(d==="localStorage"&&typeof window!="undefined")localStorage.removeItem(l);else if(d==="sessionStorage"&&typeof window!="undefined")sessionStorage.removeItem(l);else if(d==="cookie"&&typeof document!="undefined"){let{domain:o,path:t="/"}=h,c=`${l}=; path=${t}; expires=Thu, 01 Jan 1970 00:00:00 GMT`;o&&(c+=`; domain=${o}`),document.cookie=c;}return !0}catch(o){return console.error("Error clearing consent settings:",o),false}};return typeof y=="function"?n__default.default.createElement(n__default.default.Fragment,null,y({loadSettings:N,saveSettings:p,clearSettings:w,loaded:u})):n__default.default.createElement(n__default.default.Fragment,null,y)};exports.a=F;exports.b=G;exports.c=X;//# sourceMappingURL=chunk-FK3CSFLJ.js.map
2
+ //# sourceMappingURL=chunk-FK3CSFLJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/ndpr-toolkit/src/components/consent/ConsentBanner.tsx","../packages/ndpr-toolkit/src/components/consent/ConsentManager.tsx","../packages/ndpr-toolkit/src/components/consent/ConsentStorage.tsx"],"names":["ConsentBanner","options","onSave","title","description","acceptAllButtonText","rejectAllButtonText","customizeButtonText","saveButtonText","position","version","show","storageKey","className","buttonClassName","primaryButtonClassName","secondaryButtonClassName","isOpen","setIsOpen","useState","showCustomize","setShowCustomize","consents","setConsents","useEffect","initialConsents","option","savedConsent","handleAcceptAll","allConsents","saveConsent","handleRejectAll","rejectedConsents","handleToggleConsent","id","value","prev","__spreadProps","__spreadValues","handleSavePreferences","consentValues","settings","React","e","ConsentManager","resetButtonText","showSuccessMessage","successMessage","successMessageDuration","showSuccess","setShowSuccess","handleSave","newSettings","handleReset","defaultConsents","ConsentStorage","storageOptions","onLoad","autoSave","autoLoad","children","storageType","cookieOptions","loaded","setLoaded","loadSettings","saveSettings","loadedSettings","savedData","consentCookie","cookie","cookieValue","error","settingsToSave","settingsString","domain","path","expires","secure","sameSite","expiryDate","cookieString","clearSettings"],"mappings":"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","file":"chunk-FK3CSFLJ.js","sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { ConsentOption, ConsentSettings } from '../../types/consent';\n\nexport interface ConsentBannerProps {\n /**\n * Array of consent options to display\n */\n options: ConsentOption[];\n \n /**\n * Callback function called when user saves their consent choices\n */\n onSave: (settings: ConsentSettings) => void;\n \n /**\n * Title displayed on the banner\n * @default \"We Value Your Privacy\"\n */\n title?: string;\n \n /**\n * Description text displayed on the banner\n * @default \"We use cookies and similar technologies to provide our services and enhance your experience.\"\n */\n description?: string;\n \n /**\n * Text for the accept all button\n * @default \"Accept All\"\n */\n acceptAllButtonText?: string;\n \n /**\n * Text for the reject all button\n * @default \"Reject All\"\n */\n rejectAllButtonText?: string;\n \n /**\n * Text for the customize button\n * @default \"Customize\"\n */\n customizeButtonText?: string;\n \n /**\n * Text for the save button\n * @default \"Save Preferences\"\n */\n saveButtonText?: string;\n \n /**\n * Position of the banner\n * @default \"bottom\"\n */\n position?: 'top' | 'bottom' | 'center';\n \n /**\n * Version of the consent form\n * @default \"1.0\"\n */\n version?: string;\n \n /**\n * Whether to show the banner\n * If not provided, the banner will be shown if no consent has been saved\n */\n show?: boolean;\n \n /**\n * Storage key for consent settings\n * @default \"ndpr_consent\"\n */\n storageKey?: string;\n \n /**\n * Custom CSS class for the banner\n */\n className?: string;\n \n /**\n * Custom CSS class for the buttons\n */\n buttonClassName?: string;\n \n /**\n * Custom CSS class for the primary button\n */\n primaryButtonClassName?: string;\n \n /**\n * Custom CSS class for the secondary button\n */\n secondaryButtonClassName?: string;\n}\n\nexport const ConsentBanner: React.FC<ConsentBannerProps> = ({\n options,\n onSave,\n title = \"We Value Your Privacy\",\n description = \"We use cookies and similar technologies to provide our services and enhance your experience.\",\n acceptAllButtonText = \"Accept All\",\n rejectAllButtonText = \"Reject All\",\n customizeButtonText = \"Customize\",\n saveButtonText = \"Save Preferences\",\n position = \"bottom\",\n version = \"1.0\",\n show,\n storageKey = \"ndpr_consent\",\n className = \"\",\n buttonClassName = \"\",\n primaryButtonClassName = \"\",\n secondaryButtonClassName = \"\"\n}) => {\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const [showCustomize, setShowCustomize] = useState<boolean>(false);\n const [consents, setConsents] = useState<Record<string, boolean>>({});\n \n // Initialize consents from options\n useEffect(() => {\n const initialConsents: Record<string, boolean> = {};\n options.forEach(option => {\n initialConsents[option.id] = option.defaultValue || false;\n });\n setConsents(initialConsents);\n \n // Check if consent is already saved\n if (show === undefined) {\n const savedConsent = localStorage.getItem(storageKey);\n setIsOpen(!savedConsent);\n } else {\n setIsOpen(show);\n }\n }, [options, show, storageKey]);\n \n const handleAcceptAll = () => {\n const allConsents: Record<string, boolean> = {};\n options.forEach(option => {\n allConsents[option.id] = true;\n });\n saveConsent(allConsents);\n };\n \n const handleRejectAll = () => {\n const rejectedConsents: Record<string, boolean> = {};\n options.forEach(option => {\n rejectedConsents[option.id] = option.required || false;\n });\n saveConsent(rejectedConsents);\n };\n \n const handleToggleConsent = (id: string, value: boolean) => {\n setConsents(prev => ({\n ...prev,\n [id]: value\n }));\n };\n \n const handleSavePreferences = () => {\n saveConsent(consents);\n };\n \n const saveConsent = (consentValues: Record<string, boolean>) => {\n const settings: ConsentSettings = {\n consents: consentValues,\n timestamp: Date.now(),\n version,\n method: showCustomize ? 'customize' : 'banner',\n hasInteracted: true\n };\n \n // Save to localStorage\n localStorage.setItem(storageKey, JSON.stringify(settings));\n \n // Call onSave callback\n onSave(settings);\n \n // Close the banner\n setIsOpen(false);\n setShowCustomize(false);\n };\n \n if (!isOpen) {\n return null;\n }\n \n const positionClass = \n position === 'top' ? 'top-0 left-0 right-0' :\n position === 'center' ? 'top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 max-w-lg' :\n 'bottom-0 left-0 right-0';\n \n return (\n <div \n className={`fixed z-50 bg-white dark:bg-gray-800 shadow-lg p-4 border border-gray-200 dark:border-gray-700 ${positionClass} ${className}`}\n role=\"dialog\"\n aria-labelledby=\"consent-banner-title\"\n >\n <div className=\"max-w-6xl mx-auto\">\n <h2 id=\"consent-banner-title\" className=\"text-lg font-bold mb-2\">{title}</h2>\n <p className=\"mb-4\">{description}</p>\n \n {showCustomize ? (\n <div className=\"mb-4\">\n <div className=\"space-y-3\">\n {options.map(option => (\n <div key={option.id} className=\"flex items-start\">\n <div className=\"flex items-center h-5\">\n <input\n id={`consent-${option.id}`}\n type=\"checkbox\"\n checked={consents[option.id] || false}\n onChange={e => handleToggleConsent(option.id, e.target.checked)}\n disabled={option.required}\n className=\"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500\"\n />\n </div>\n <div className=\"ml-3 text-sm\">\n <label htmlFor={`consent-${option.id}`} className=\"font-medium\">\n {option.label} {option.required && <span className=\"text-red-500\">*</span>}\n </label>\n <p className=\"text-gray-500 dark:text-gray-400\">{option.description}</p>\n </div>\n </div>\n ))}\n </div>\n \n <div className=\"mt-4 flex flex-wrap gap-2\">\n <button\n onClick={handleSavePreferences}\n className={`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 ${buttonClassName} ${primaryButtonClassName}`}\n >\n {saveButtonText}\n </button>\n <button\n onClick={() => setShowCustomize(false)}\n className={`px-4 py-2 bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-white rounded hover:bg-gray-300 dark:hover:bg-gray-600 ${buttonClassName} ${secondaryButtonClassName}`}\n >\n Back\n </button>\n </div>\n </div>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n <button\n onClick={handleAcceptAll}\n className={`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 ${buttonClassName} ${primaryButtonClassName}`}\n >\n {acceptAllButtonText}\n </button>\n <button\n onClick={handleRejectAll}\n className={`px-4 py-2 bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-white rounded hover:bg-gray-300 dark:hover:bg-gray-600 ${buttonClassName} ${secondaryButtonClassName}`}\n >\n {rejectAllButtonText}\n </button>\n <button\n onClick={() => setShowCustomize(true)}\n className={`px-4 py-2 bg-transparent text-gray-800 dark:text-white hover:underline ${buttonClassName}`}\n >\n {customizeButtonText}\n </button>\n </div>\n )}\n \n <div className=\"mt-2 text-xs text-gray-500 dark:text-gray-400\">\n By clicking \"Accept All\", you agree to the use of ALL cookies. Visit our Cookie Policy to learn more.\n </div>\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { ConsentOption, ConsentSettings } from '../../types/consent';\n\nexport interface ConsentManagerProps {\n /**\n * Array of consent options to display\n */\n options: ConsentOption[];\n \n /**\n * Current consent settings\n */\n settings?: ConsentSettings;\n \n /**\n * Callback function called when user saves their consent choices\n */\n onSave: (settings: ConsentSettings) => void;\n \n /**\n * Title displayed in the manager\n * @default \"Manage Your Privacy Settings\"\n */\n title?: string;\n \n /**\n * Description text displayed in the manager\n * @default \"Update your consent preferences at any time. Required cookies cannot be disabled as they are necessary for the website to function.\"\n */\n description?: string;\n \n /**\n * Text for the save button\n * @default \"Save Preferences\"\n */\n saveButtonText?: string;\n \n /**\n * Text for the reset button\n * @default \"Reset to Defaults\"\n */\n resetButtonText?: string;\n \n /**\n * Version of the consent form\n * @default \"1.0\"\n */\n version?: string;\n \n /**\n * Custom CSS class for the manager\n */\n className?: string;\n \n /**\n * Custom CSS class for the buttons\n */\n buttonClassName?: string;\n \n /**\n * Custom CSS class for the primary button\n */\n primaryButtonClassName?: string;\n \n /**\n * Custom CSS class for the secondary button\n */\n secondaryButtonClassName?: string;\n \n /**\n * Whether to show a success message after saving\n * @default true\n */\n showSuccessMessage?: boolean;\n \n /**\n * Success message to display after saving\n * @default \"Your preferences have been saved.\"\n */\n successMessage?: string;\n \n /**\n * Duration to show the success message (in milliseconds)\n * @default 3000\n */\n successMessageDuration?: number;\n}\n\nexport const ConsentManager: React.FC<ConsentManagerProps> = ({\n options,\n settings,\n onSave,\n title = \"Manage Your Privacy Settings\",\n description = \"Update your consent preferences at any time. Required cookies cannot be disabled as they are necessary for the website to function.\",\n saveButtonText = \"Save Preferences\",\n resetButtonText = \"Reset to Defaults\",\n version = \"1.0\",\n className = \"\",\n buttonClassName = \"\",\n primaryButtonClassName = \"\",\n secondaryButtonClassName = \"\",\n showSuccessMessage = true,\n successMessage = \"Your preferences have been saved.\",\n successMessageDuration = 3000\n}) => {\n const [consents, setConsents] = useState<Record<string, boolean>>({});\n const [showSuccess, setShowSuccess] = useState<boolean>(false);\n \n // Initialize consents from settings or options\n useEffect(() => {\n if (settings && settings.consents) {\n setConsents(settings.consents);\n } else {\n const initialConsents: Record<string, boolean> = {};\n options.forEach(option => {\n initialConsents[option.id] = option.defaultValue || false;\n });\n setConsents(initialConsents);\n }\n }, [options, settings]);\n \n const handleToggleConsent = (id: string, value: boolean) => {\n setConsents(prev => ({\n ...prev,\n [id]: value\n }));\n };\n \n const handleSave = () => {\n const newSettings: ConsentSettings = {\n consents,\n timestamp: Date.now(),\n version,\n method: 'manager',\n hasInteracted: true\n };\n \n onSave(newSettings);\n \n if (showSuccessMessage) {\n setShowSuccess(true);\n setTimeout(() => {\n setShowSuccess(false);\n }, successMessageDuration);\n }\n };\n \n const handleReset = () => {\n const defaultConsents: Record<string, boolean> = {};\n options.forEach(option => {\n defaultConsents[option.id] = option.defaultValue || false;\n });\n setConsents(defaultConsents);\n };\n \n return (\n <div className={`bg-white dark:bg-gray-800 rounded-lg shadow-md p-6 ${className}`}>\n <h2 className=\"text-xl font-bold mb-2\">{title}</h2>\n <p className=\"mb-6 text-gray-600 dark:text-gray-300\">{description}</p>\n \n <div className=\"space-y-6\">\n {options.map(option => (\n <div key={option.id} className=\"border-b border-gray-200 dark:border-gray-700 pb-4 last:border-0\">\n <div className=\"flex items-start justify-between\">\n <div>\n <h3 className=\"font-medium text-gray-900 dark:text-white\">{option.label}</h3>\n <p className=\"text-sm text-gray-500 dark:text-gray-400 mt-1\">{option.description}</p>\n </div>\n <div className=\"ml-4 flex-shrink-0\">\n <label className=\"relative inline-flex items-center cursor-pointer\">\n <input\n type=\"checkbox\"\n className=\"sr-only peer\"\n checked={consents[option.id] || false}\n onChange={e => handleToggleConsent(option.id, e.target.checked)}\n disabled={option.required}\n />\n <div className={`w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600 ${option.required ? 'opacity-60' : ''}`}></div>\n <span className=\"ml-3 text-sm font-medium text-gray-900 dark:text-gray-300\">\n {consents[option.id] ? 'Enabled' : 'Disabled'}\n {option.required && <span className=\"text-xs text-red-500 ml-1\">(Required)</span>}\n </span>\n </label>\n </div>\n </div>\n </div>\n ))}\n </div>\n \n {showSuccess && (\n <div className=\"mt-4 p-3 bg-green-50 dark:bg-green-900/20 text-green-800 dark:text-green-200 rounded-md\">\n {successMessage}\n </div>\n )}\n \n <div className=\"mt-6 flex flex-wrap gap-3\">\n <button\n onClick={handleSave}\n className={`px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 ${buttonClassName} ${primaryButtonClassName}`}\n >\n {saveButtonText}\n </button>\n <button\n onClick={handleReset}\n className={`px-4 py-2 bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-white rounded hover:bg-gray-300 dark:hover:bg-gray-600 ${buttonClassName} ${secondaryButtonClassName}`}\n >\n {resetButtonText}\n </button>\n </div>\n \n <div className=\"mt-4 text-xs text-gray-500 dark:text-gray-400\">\n <p>Last updated: {settings ? new Date(settings.timestamp).toLocaleString() : 'Never'}</p>\n <p>Version: {version}</p>\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { ConsentSettings, ConsentStorageOptions } from '../../types/consent';\n\nexport interface ConsentStorageProps {\n /**\n * Current consent settings\n */\n settings: ConsentSettings;\n \n /**\n * Storage options for consent settings\n */\n storageOptions?: ConsentStorageOptions;\n \n /**\n * Callback function called when settings are loaded from storage\n */\n onLoad?: (settings: ConsentSettings | null) => void;\n \n /**\n * Callback function called when settings are saved to storage\n */\n onSave?: (settings: ConsentSettings) => void;\n \n /**\n * Whether to automatically save settings to storage\n * @default true\n */\n autoSave?: boolean;\n \n /**\n * Whether to automatically load settings from storage on mount\n * @default true\n */\n autoLoad?: boolean;\n \n /**\n * Children to render\n * Can be either React nodes or a render prop function that receives storage methods\n */\n children?: React.ReactNode | ((props: {\n loadSettings: () => ConsentSettings | null;\n saveSettings: (settings: ConsentSettings) => void;\n clearSettings: () => void;\n loaded: boolean;\n }) => React.ReactNode);\n}\n\nexport const ConsentStorage = ({\n settings,\n storageOptions = {},\n onLoad,\n onSave,\n autoSave = true,\n autoLoad = true,\n children\n}: ConsentStorageProps): React.ReactElement | null => {\n const {\n storageKey = \"ndpr_consent\",\n storageType = \"localStorage\",\n cookieOptions = {}\n } = storageOptions;\n \n const [loaded, setLoaded] = useState<boolean>(false);\n \n // Load consent settings from storage on mount\n useEffect(() => {\n if (autoLoad && !loaded) {\n loadSettings();\n }\n }, [autoLoad, loaded]);\n \n // Save consent settings to storage when they change\n useEffect(() => {\n if (autoSave && loaded) {\n saveSettings(settings);\n }\n }, [settings, autoSave, loaded]);\n \n // Load settings from storage\n const loadSettings = (): ConsentSettings | null => {\n let loadedSettings: ConsentSettings | null = null;\n \n try {\n if (storageType === 'localStorage' && typeof window !== 'undefined') {\n const savedData = localStorage.getItem(storageKey);\n if (savedData) {\n loadedSettings = JSON.parse(savedData);\n }\n } else if (storageType === 'sessionStorage' && typeof window !== 'undefined') {\n const savedData = sessionStorage.getItem(storageKey);\n if (savedData) {\n loadedSettings = JSON.parse(savedData);\n }\n } else if (storageType === 'cookie' && typeof document !== 'undefined') {\n const cookies = document.cookie.split(';');\n const consentCookie = cookies.find(cookie => cookie.trim().startsWith(`${storageKey}=`));\n if (consentCookie) {\n const cookieValue = consentCookie.split('=')[1];\n loadedSettings = JSON.parse(decodeURIComponent(cookieValue));\n }\n }\n \n setLoaded(true);\n \n if (onLoad) {\n onLoad(loadedSettings);\n }\n } catch (error) {\n console.error('Error loading consent settings:', error);\n setLoaded(true);\n \n if (onLoad) {\n onLoad(null);\n }\n }\n \n return loadedSettings;\n };\n \n // Save settings to storage\n const saveSettings = (settingsToSave: ConsentSettings): boolean => {\n try {\n const settingsString = JSON.stringify(settingsToSave);\n \n if (storageType === 'localStorage' && typeof window !== 'undefined') {\n localStorage.setItem(storageKey, settingsString);\n } else if (storageType === 'sessionStorage' && typeof window !== 'undefined') {\n sessionStorage.setItem(storageKey, settingsString);\n } else if (storageType === 'cookie' && typeof document !== 'undefined') {\n const {\n domain,\n path = '/',\n expires = 365,\n secure = true,\n sameSite = 'Lax'\n } = cookieOptions;\n \n const expiryDate = new Date();\n expiryDate.setDate(expiryDate.getDate() + expires);\n \n let cookieString = `${storageKey}=${encodeURIComponent(settingsString)}; path=${path}; expires=${expiryDate.toUTCString()}`;\n \n if (domain) {\n cookieString += `; domain=${domain}`;\n }\n \n if (secure) {\n cookieString += '; secure';\n }\n \n cookieString += `; samesite=${sameSite}`;\n \n document.cookie = cookieString;\n }\n \n if (onSave) {\n onSave(settingsToSave);\n }\n \n return true;\n } catch (error) {\n console.error('Error saving consent settings:', error);\n return false;\n }\n };\n \n // Clear settings from storage\n const clearSettings = (): boolean => {\n try {\n if (storageType === 'localStorage' && typeof window !== 'undefined') {\n localStorage.removeItem(storageKey);\n } else if (storageType === 'sessionStorage' && typeof window !== 'undefined') {\n sessionStorage.removeItem(storageKey);\n } else if (storageType === 'cookie' && typeof document !== 'undefined') {\n const { domain, path = '/' } = cookieOptions;\n \n let cookieString = `${storageKey}=; path=${path}; expires=Thu, 01 Jan 1970 00:00:00 GMT`;\n \n if (domain) {\n cookieString += `; domain=${domain}`;\n }\n \n document.cookie = cookieString;\n }\n \n return true;\n } catch (error) {\n console.error('Error clearing consent settings:', error);\n return false;\n }\n };\n \n // If children is a function, call it with the storage methods\n if (typeof children === 'function') {\n return <>{children({\n loadSettings,\n saveSettings,\n clearSettings,\n loaded\n })}</>; \n }\n \n // Otherwise, just render the children\n return <>{children}</>;\n};\n"]}
@@ -0,0 +1,2 @@
1
+ function s(e){let n=[];(!e.consents||Object.keys(e.consents).length===0)&&n.push("Consent settings must include at least one consent option"),e.timestamp?(typeof e.timestamp!="number"||isNaN(e.timestamp))&&n.push("Consent timestamp must be a valid number"):n.push("Consent timestamp is required"),e.version||n.push("Consent version is required"),e.method||n.push("Consent collection method is required"),e.hasInteracted===void 0&&n.push("User interaction status is required");let t=Date.now()-390*24*60*60*1e3;return e.timestamp<t&&n.push("Consent is older than 13 months and should be refreshed"),{valid:n.length===0,errors:n}}function r(e){let n=[];return (!e||e.length===0)&&n.push("At least one consent option is required"),e==null||e.forEach(t=>{(!t.purpose||t.purpose.trim()==="")&&n.push(`Consent option "${t.id}" is missing a purpose. NDPA Section 26 requires consent to be specific to a stated purpose.`);}),{valid:n.length===0,errors:n}}export{s as a,r as b};//# sourceMappingURL=chunk-GIV2OHE6.mjs.map
2
+ //# sourceMappingURL=chunk-GIV2OHE6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/ndpr-toolkit/src/utils/consent.ts"],"names":["validateConsent","settings","errors","thirteenMonthsAgo","validateConsentOptions","options","option"],"mappings":"AAOO,SAASA,CAAAA,CAAgBC,CAAAA,CAG9B,CACA,IAAMC,CAAAA,CAAmB,EAAC,CAAA,CAGtB,CAACD,CAAAA,CAAS,QAAA,EAAY,MAAA,CAAO,IAAA,CAAKA,EAAS,QAAQ,CAAA,CAAE,MAAA,GAAW,CAAA,GAClEC,CAAAA,CAAO,IAAA,CAAK,2DAA2D,CAAA,CAIpED,CAAAA,CAAS,SAAA,CAAA,CAEH,OAAOA,CAAAA,CAAS,SAAA,EAAc,QAAA,EAAY,KAAA,CAAMA,CAAAA,CAAS,SAAS,CAAA,GAC3EC,CAAAA,CAAO,IAAA,CAAK,0CAA0C,CAAA,CAFtDA,CAAAA,CAAO,IAAA,CAAK,+BAA+B,CAAA,CAMxCD,CAAAA,CAAS,OAAA,EACZC,CAAAA,CAAO,IAAA,CAAK,6BAA6B,CAAA,CAItCD,CAAAA,CAAS,QACZC,CAAAA,CAAO,IAAA,CAAK,uCAAuC,CAAA,CAIjDD,CAAAA,CAAS,aAAA,GAAkB,MAAA,EAC7BC,CAAAA,CAAO,IAAA,CAAK,qCAAqC,CAAA,CAInD,IAAMC,CAAAA,CAAoB,IAAA,CAAK,GAAA,EAAI,CAAK,IAAU,EAAA,CAAK,EAAA,CAAK,EAAA,CAAK,GAAA,CACjE,OAAIF,CAAAA,CAAS,SAAA,CAAYE,CAAAA,EACvBD,CAAAA,CAAO,IAAA,CAAK,yDAAyD,CAAA,CAGhE,CACL,KAAA,CAAOA,CAAAA,CAAO,MAAA,GAAW,EACzB,MAAA,CAAAA,CACF,CACF,CASO,SAASE,CAAAA,CAAuBC,CAAAA,CAGrC,CACA,IAAMH,CAAAA,CAAmB,EAAC,CAE1B,OAAA,CAAI,CAACG,CAAAA,EAAWA,CAAAA,CAAQ,SAAW,CAAA,GACjCH,CAAAA,CAAO,IAAA,CAAK,yCAAyC,CAAA,CAGvDG,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAS,OAAA,CAASC,CAAAA,EAAW,CAAA,CACvB,CAACA,CAAAA,CAAO,OAAA,EAAWA,CAAAA,CAAO,OAAA,CAAQ,MAAK,GAAM,EAAA,GAC/CJ,CAAAA,CAAO,IAAA,CACL,CAAA,gBAAA,EAAmBI,CAAAA,CAAO,EAAE,CAAA,4FAAA,CAC9B,EAEJ,CAAA,CAAA,CAEO,CACL,KAAA,CAAOJ,CAAAA,CAAO,MAAA,GAAW,CAAA,CACzB,MAAA,CAAAA,CACF,CACF","file":"chunk-GIV2OHE6.mjs","sourcesContent":["import { ConsentOption, ConsentSettings } from '../types/consent';\n\n/**\n * Validates consent settings to ensure they meet NDPA requirements\n * @param settings The consent settings to validate\n * @returns An object containing validation result and any error messages\n */\nexport function validateConsent(settings: ConsentSettings): { \n valid: boolean; \n errors: string[] \n} {\n const errors: string[] = [];\n \n // Check if consents object exists\n if (!settings.consents || Object.keys(settings.consents).length === 0) {\n errors.push('Consent settings must include at least one consent option');\n }\n \n // Check if timestamp exists and is valid\n if (!settings.timestamp) {\n errors.push('Consent timestamp is required');\n } else if (typeof settings.timestamp !== 'number' || isNaN(settings.timestamp)) {\n errors.push('Consent timestamp must be a valid number');\n }\n \n // Check if version exists\n if (!settings.version) {\n errors.push('Consent version is required');\n }\n \n // Check if method exists\n if (!settings.method) {\n errors.push('Consent collection method is required');\n }\n \n // Check if hasInteracted is defined\n if (settings.hasInteracted === undefined) {\n errors.push('User interaction status is required');\n }\n \n // Check if consent is recent enough (within last 13 months for NDPA compliance)\n const thirteenMonthsAgo = Date.now() - (13 * 30 * 24 * 60 * 60 * 1000);\n if (settings.timestamp < thirteenMonthsAgo) {\n errors.push('Consent is older than 13 months and should be refreshed');\n }\n \n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * Validates that consent options meet NDPA Section 26 requirements.\n * Each consent option must specify a purpose for which data will be processed,\n * as consent must be specific and informed per the Nigeria Data Protection Act.\n * @param options The consent options to validate\n * @returns An object containing validation result and any error messages\n */\nexport function validateConsentOptions(options: ConsentOption[]): {\n valid: boolean;\n errors: string[];\n} {\n const errors: string[] = [];\n\n if (!options || options.length === 0) {\n errors.push('At least one consent option is required');\n }\n\n options?.forEach((option) => {\n if (!option.purpose || option.purpose.trim() === '') {\n errors.push(\n `Consent option \"${option.id}\" is missing a purpose. NDPA Section 26 requires consent to be specific to a stated purpose.`\n );\n }\n });\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {a}from'./chunk-2SYNHRP6.mjs';import {b,a as a$1,c}from'./chunk-WWT2ZSNU.mjs';import {useState,useEffect}from'react';function J({initialRequests:T=[],requestTypes:D,storageKey:R="ndpr_dsr_requests",useLocalStorage:r=true,onSubmit:c$1,onUpdate:l}){let[u,q]=useState(T);useEffect(()=>{if(r&&typeof window!="undefined")try{let e=localStorage.getItem(R);e&&q(JSON.parse(e));}catch(e){console.error("Error loading DSR requests:",e);}},[R,r]),useEffect(()=>{if(r&&typeof window!="undefined"&&u.length>0)try{localStorage.setItem(R,JSON.stringify(u));}catch(e){console.error("Error saving DSR requests:",e);}},[u,R,r]);let A=()=>"dsr_"+Date.now()+"_"+Math.random().toString(36).substr(2,9);return {requests:u,submitRequest:e=>{let t=D.find(S=>S.id===e.type),n=(t==null?void 0:t.estimatedCompletionTime)||30,s=Date.now(),i=s+n*24*60*60*1e3,f=e,{createdAt:p}=f,d=c(f,["createdAt"]),o=a$1({id:A(),status:"pending",createdAt:s,updatedAt:s,dueDate:i},d);return q(S=>[...S,o]),c$1&&c$1(o),o},updateRequest:(e,t)=>{let n=null;return q(s=>{let i=s.findIndex(o=>o.id===e);if(i===-1)return s;let p=s[i];n=b(a$1(a$1({},p),t),{updatedAt:Date.now()});let d=[...s];return d[i]=n,d}),n&&l&&l(n),n},getRequest:e=>u.find(t=>t.id===e)||null,getRequestsByStatus:e=>u.filter(t=>t.status===e),getRequestsByType:e=>u.filter(t=>t.type===e),getRequestType:e=>D.find(t=>t.id===e),formatRequest:e=>{let{formattedRequest:t}=a(e);return t},clearRequests:()=>{q([]),r&&typeof window!="undefined"&&localStorage.removeItem(R);}}}export{J as a};//# sourceMappingURL=chunk-GMLNWS2N.mjs.map
2
+ //# sourceMappingURL=chunk-GMLNWS2N.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/ndpr-toolkit/src/hooks/useDSR.ts"],"names":["useDSR","initialRequests","requestTypes","storageKey","useLocalStorage","onSubmit","onUpdate","requests","setRequests","useState","useEffect","savedRequests","error","generateId","requestData","requestType","type","estimatedCompletionDays","now","estimatedCompletionDate","_a","createdAt","restRequestData","__objRest","newRequest","__spreadValues","prevRequests","id","updates","updatedRequest","index","request","__spreadProps","newRequests","status","typeId","formattedRequest","formatDSRRequest"],"mappings":"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","file":"chunk-GMLNWS2N.mjs","sourcesContent":["import { useState, useEffect } from 'react';\nimport { DSRRequest, RequestStatus, RequestType } from '../types/dsr';\nimport { formatDSRRequest } from '../utils/dsr';\n\ninterface UseDSROptions {\n /**\n * Initial requests to load\n */\n initialRequests?: DSRRequest[];\n \n /**\n * Available request types\n */\n requestTypes: RequestType[];\n \n /**\n * Storage key for requests\n * @default \"ndpr_dsr_requests\"\n */\n storageKey?: string;\n \n /**\n * Whether to use local storage to persist requests\n * @default true\n */\n useLocalStorage?: boolean;\n \n /**\n * Callback function called when a request is submitted\n */\n onSubmit?: (request: DSRRequest) => void;\n \n /**\n * Callback function called when a request is updated\n */\n onUpdate?: (request: DSRRequest) => void;\n}\n\ninterface UseDSRReturn {\n /**\n * All requests\n */\n requests: DSRRequest[];\n \n /**\n * Submit a new request\n */\n submitRequest: (requestData: Omit<DSRRequest, 'id' | 'status' | 'submittedAt' | 'updatedAt' | 'estimatedCompletionDate'>) => DSRRequest;\n \n /**\n * Update an existing request\n */\n updateRequest: (id: string, updates: Partial<DSRRequest>) => DSRRequest | null;\n \n /**\n * Get a request by ID\n */\n getRequest: (id: string) => DSRRequest | null;\n \n /**\n * Get requests by status\n */\n getRequestsByStatus: (status: RequestStatus) => DSRRequest[];\n \n /**\n * Get requests by type\n */\n getRequestsByType: (type: string) => DSRRequest[];\n \n /**\n * Get the request type definition by ID\n */\n getRequestType: (typeId: string) => RequestType | undefined;\n \n /**\n * Format a request for display or submission\n */\n formatRequest: (request: DSRRequest) => Record<string, any>;\n \n /**\n * Clear all requests\n */\n clearRequests: () => void;\n}\n\n/**\n * Hook for managing Data Subject Requests in compliance with the NDPA\n */\nexport function useDSR({\n initialRequests = [],\n requestTypes,\n storageKey = \"ndpr_dsr_requests\",\n useLocalStorage = true,\n onSubmit,\n onUpdate\n}: UseDSROptions): UseDSRReturn {\n const [requests, setRequests] = useState<DSRRequest[]>(initialRequests);\n \n // Load requests from storage on mount\n useEffect(() => {\n if (useLocalStorage && typeof window !== 'undefined') {\n try {\n const savedRequests = localStorage.getItem(storageKey);\n if (savedRequests) {\n setRequests(JSON.parse(savedRequests));\n }\n } catch (error) {\n console.error('Error loading DSR requests:', error);\n }\n }\n }, [storageKey, useLocalStorage]);\n \n // Save requests to storage when they change\n useEffect(() => {\n if (useLocalStorage && typeof window !== 'undefined' && requests.length > 0) {\n try {\n localStorage.setItem(storageKey, JSON.stringify(requests));\n } catch (error) {\n console.error('Error saving DSR requests:', error);\n }\n }\n }, [requests, storageKey, useLocalStorage]);\n \n // Generate a unique ID\n const generateId = (): string => {\n return 'dsr_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);\n };\n \n // Submit a new request\n const submitRequest = (requestData: Omit<DSRRequest, 'id' | 'status' | 'submittedAt' | 'updatedAt' | 'estimatedCompletionDate'>): DSRRequest => {\n // Find the request type to get the estimated completion time\n const requestType = requestTypes.find(type => type.id === requestData.type);\n const estimatedCompletionDays = requestType?.estimatedCompletionTime || 30; // Default to 30 days\n \n const now = Date.now();\n const estimatedCompletionDate = now + (estimatedCompletionDays * 24 * 60 * 60 * 1000);\n \n // Extract any properties we want to override from requestData\n const { createdAt, ...restRequestData } = requestData as any;\n \n const newRequest: DSRRequest = {\n id: generateId(),\n status: 'pending',\n createdAt: now,\n updatedAt: now,\n dueDate: estimatedCompletionDate,\n ...restRequestData\n };\n \n setRequests(prevRequests => [...prevRequests, newRequest]);\n \n if (onSubmit) {\n onSubmit(newRequest);\n }\n \n return newRequest;\n };\n \n // Update an existing request\n const updateRequest = (id: string, updates: Partial<DSRRequest>): DSRRequest | null => {\n let updatedRequest: DSRRequest | null = null;\n \n setRequests(prevRequests => {\n const index = prevRequests.findIndex(request => request.id === id);\n \n if (index === -1) {\n return prevRequests;\n }\n \n const request = prevRequests[index];\n updatedRequest = {\n ...request,\n ...updates,\n updatedAt: Date.now()\n };\n \n const newRequests = [...prevRequests];\n newRequests[index] = updatedRequest as DSRRequest;\n \n return newRequests;\n });\n \n if (updatedRequest && onUpdate) {\n onUpdate(updatedRequest);\n }\n \n return updatedRequest;\n };\n \n // Get a request by ID\n const getRequest = (id: string): DSRRequest | null => {\n return requests.find(request => request.id === id) || null;\n };\n \n // Get requests by status\n const getRequestsByStatus = (status: RequestStatus): DSRRequest[] => {\n return requests.filter(request => request.status === status);\n };\n \n // Get requests by type\n const getRequestsByType = (type: string): DSRRequest[] => {\n return requests.filter(request => request.type === type);\n };\n \n // Get the request type definition by ID\n const getRequestType = (typeId: string): RequestType | undefined => {\n return requestTypes.find(type => type.id === typeId);\n };\n \n // Format a request for display or submission\n const formatRequest = (request: DSRRequest): Record<string, any> => {\n const { formattedRequest } = formatDSRRequest(request);\n return formattedRequest;\n };\n \n // Clear all requests\n const clearRequests = () => {\n setRequests([]);\n \n if (useLocalStorage && typeof window !== 'undefined') {\n localStorage.removeItem(storageKey);\n }\n };\n \n return {\n requests,\n submitRequest,\n updateRequest,\n getRequest,\n getRequestsByStatus,\n getRequestsByType,\n getRequestType,\n formatRequest,\n clearRequests\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';function u(e){return e==="standard_clauses"||e==="binding_corporate_rules"||e==="ndpc_authorization"}function h(e){return {adequacy_decision:"Adequacy Decision (NDPA Section 41) \u2014 Transfer to a country or territory that the NDPC has determined provides an adequate level of data protection.",standard_clauses:"Standard Contractual Clauses (NDPA Section 42) \u2014 Transfer based on standard contractual clauses approved by the NDPC between the controller/processor and the recipient.",binding_corporate_rules:"Binding Corporate Rules (NDPA Section 43) \u2014 Transfer within a group of undertakings based on binding corporate rules approved by the NDPC.",ndpc_authorization:"NDPC Authorization (NDPA Section 44) \u2014 Transfer authorized by the Nigeria Data Protection Commission under specific conditions.",explicit_consent:"Explicit Consent (NDPA Section 45(a)) \u2014 Transfer based on the explicit and informed consent of the data subject after being informed of the risks.",contract_performance:"Contract Performance (NDPA Section 45(b)) \u2014 Transfer necessary for the performance of a contract between the data subject and the controller.",public_interest:"Public Interest (NDPA Section 45(c)) \u2014 Transfer necessary for important reasons of public interest.",legal_claims:"Legal Claims (NDPA Section 45(d)) \u2014 Transfer necessary for the establishment, exercise, or defense of legal claims.",vital_interests:"Vital Interests (NDPA Section 45(e)) \u2014 Transfer necessary to protect the vital interests of the data subject or other persons."}[e]}function m(e){var s,n;let t=[],a=[];return e.id||t.push("Transfer ID is required."),(!e.destinationCountry||e.destinationCountry.trim()==="")&&t.push("Destination country is required."),(!e.recipientOrganization||e.recipientOrganization.trim()==="")&&t.push("Recipient organization is required."),(!((s=e.recipientContact)!=null&&s.name)||e.recipientContact.name.trim()==="")&&t.push("Recipient contact name is required."),(!((n=e.recipientContact)!=null&&n.email)||e.recipientContact.email.trim()==="")&&t.push("Recipient contact email is required."),(!e.purpose||e.purpose.trim()==="")&&t.push("Purpose of the transfer is required."),e.transferMechanism||t.push("Transfer mechanism is required."),(!e.dataCategories||e.dataCategories.length===0)&&t.push("At least one data category must be specified."),(!e.riskAssessment||e.riskAssessment.trim()==="")&&t.push("Risk assessment summary is required."),(!e.safeguards||e.safeguards.length===0)&&t.push("At least one safeguard must be documented for the transfer."),u(e.transferMechanism)&&(e.ndpcApproval?(e.ndpcApproval.required||a.push("NDPC approval is marked as not required, but the selected transfer mechanism requires NDPC approval."),e.ndpcApproval.required&&!e.ndpcApproval.applied&&t.push("NDPC approval is required but an application has not been submitted."),e.ndpcApproval.applied&&!e.ndpcApproval.approved&&e.status==="active"&&t.push('Transfer is marked as active but NDPC approval has not been granted. Status should be "pending_approval".')):t.push(`NDPC approval documentation is required for transfers using ${d(e.transferMechanism)}.`)),e.tiaCompleted||a.push("A Transfer Impact Assessment (TIA) has not been completed for this transfer."),e.adequacyStatus==="inadequate"&&e.transferMechanism==="adequacy_decision"&&t.push("Cannot rely on adequacy decision (Section 41) when the destination country is marked as inadequate."),e.endDate&&e.startDate>e.endDate&&t.push("Start date must be before end date."),e.includesSensitiveData&&e.riskLevel!=="high"&&a.push("Transfer includes sensitive personal data but the risk level is not set to high. Consider reviewing the risk assessment."),e.reviewDate||a.push("No review date has been set for this transfer. Periodic reviews are recommended."),{isValid:t.length===0,errors:t,warnings:a}}function f(e){var o,c;let t=[],a=[],s=0,p={adequate:0,pending_review:2,unknown:3,inadequate:4}[e.adequacyStatus];s+=p,e.adequacyStatus==="inadequate"?(t.push("Destination country does not have an adequate level of data protection."),a.push("Implement supplementary technical and organizational measures.")):e.adequacyStatus==="unknown"?(t.push("Data protection adequacy of the destination country has not been assessed."),a.push("Conduct an adequacy assessment of the destination country.")):e.adequacyStatus==="pending_review"&&(t.push("Destination country adequacy is currently under review."),a.push("Monitor the adequacy review outcome and plan for contingencies."));let r={adequacy_decision:0,standard_clauses:1,binding_corporate_rules:1,ndpc_authorization:1,contract_performance:2,explicit_consent:2,legal_claims:2,public_interest:2,vital_interests:3}[e.transferMechanism];s+=r,r>=2&&(t.push(`Transfer relies on a derogation mechanism (${d(e.transferMechanism)}), which provides fewer structural safeguards.`),a.push("Consider whether a stronger transfer mechanism (adequacy decision, standard clauses, or BCRs) could be used instead.")),e.includesSensitiveData&&(s+=3,t.push("Transfer includes sensitive personal data, increasing the potential impact of unauthorized access."),a.push("Ensure encryption in transit and at rest, and apply strict access controls.")),e.estimatedDataSubjects&&e.estimatedDataSubjects>1e4?(s+=2,t.push("Large number of data subjects involved increases the scope of potential harm."),a.push("Consider data minimization strategies and ensure robust incident response procedures.")):e.estimatedDataSubjects&&e.estimatedDataSubjects>1e3&&(s+=1,t.push("Moderate number of data subjects involved.")),e.tiaCompleted||(s+=2,t.push("Transfer Impact Assessment has not been completed."),a.push("Complete a Transfer Impact Assessment before proceeding with the transfer.")),u(e.transferMechanism)&&((o=e.ndpcApproval)!=null&&o.approved||(s+=2,t.push("NDPC approval is required but has not been granted."),a.push("Obtain NDPC approval before activating the transfer."))),(((c=e.safeguards)==null?void 0:c.length)||0)<3&&(s+=1,t.push("Limited number of safeguards documented."),a.push("Document additional technical, organizational, and contractual safeguards.")),e.frequency==="continuous"&&(s+=1,t.push("Continuous data transfer increases exposure window."),a.push("Implement real-time monitoring and anomaly detection for the transfer."));let i;return s<=4?i="low":s<=9?i="medium":i="high",{riskLevel:i,riskScore:s,factors:t,recommendations:a}}function d(e){return {adequacy_decision:"Adequacy Decision",standard_clauses:"Standard Contractual Clauses",binding_corporate_rules:"Binding Corporate Rules",ndpc_authorization:"NDPC Authorization",explicit_consent:"Explicit Consent",contract_performance:"Contract Performance",public_interest:"Public Interest",legal_claims:"Legal Claims",vital_interests:"Vital Interests"}[e]}exports.a=u;exports.b=h;exports.c=m;exports.d=f;//# sourceMappingURL=chunk-IQF726GS.js.map
2
+ //# sourceMappingURL=chunk-IQF726GS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/ndpr-toolkit/src/utils/cross-border.ts"],"names":["isNDPCApprovalRequired","mechanism","getTransferMechanismDescription","validateTransfer","transfer","_a","_b","errors","warnings","getTransferMechanismLabel","assessTransferRisk","factors","recommendations","riskScore","adequacyScore","mechanismScore","riskLevel"],"mappings":"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","file":"chunk-IQF726GS.js","sourcesContent":["import {\n CrossBorderTransfer,\n TransferMechanism,\n AdequacyStatus,\n} from '../types/cross-border';\n\n/**\n * Validation result for a cross-border transfer\n */\nexport interface TransferValidationResult {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Risk assessment result for a cross-border transfer\n */\nexport interface TransferRiskResult {\n riskLevel: 'low' | 'medium' | 'high';\n riskScore: number;\n factors: string[];\n recommendations: string[];\n}\n\n/**\n * Returns whether NDPC approval is required for a given transfer mechanism.\n * Approval is required for standard contractual clauses (Section 42),\n * binding corporate rules (Section 43), and specific NDPC authorization (Section 44).\n *\n * @param mechanism The transfer mechanism\n * @returns Whether NDPC approval is required\n */\nexport function isNDPCApprovalRequired(mechanism: TransferMechanism): boolean {\n return (\n mechanism === 'standard_clauses' ||\n mechanism === 'binding_corporate_rules' ||\n mechanism === 'ndpc_authorization'\n );\n}\n\n/**\n * Returns a human-readable description of a transfer mechanism with its NDPA section reference.\n *\n * @param mechanism The transfer mechanism\n * @returns Description including the relevant NDPA section\n */\nexport function getTransferMechanismDescription(mechanism: TransferMechanism): string {\n const descriptions: Record<TransferMechanism, string> = {\n adequacy_decision:\n 'Adequacy Decision (NDPA Section 41) — Transfer to a country or territory that the NDPC has determined provides an adequate level of data protection.',\n standard_clauses:\n 'Standard Contractual Clauses (NDPA Section 42) — Transfer based on standard contractual clauses approved by the NDPC between the controller/processor and the recipient.',\n binding_corporate_rules:\n 'Binding Corporate Rules (NDPA Section 43) — Transfer within a group of undertakings based on binding corporate rules approved by the NDPC.',\n ndpc_authorization:\n 'NDPC Authorization (NDPA Section 44) — Transfer authorized by the Nigeria Data Protection Commission under specific conditions.',\n explicit_consent:\n 'Explicit Consent (NDPA Section 45(a)) — Transfer based on the explicit and informed consent of the data subject after being informed of the risks.',\n contract_performance:\n 'Contract Performance (NDPA Section 45(b)) — Transfer necessary for the performance of a contract between the data subject and the controller.',\n public_interest:\n 'Public Interest (NDPA Section 45(c)) — Transfer necessary for important reasons of public interest.',\n legal_claims:\n 'Legal Claims (NDPA Section 45(d)) — Transfer necessary for the establishment, exercise, or defense of legal claims.',\n vital_interests:\n 'Vital Interests (NDPA Section 45(e)) — Transfer necessary to protect the vital interests of the data subject or other persons.',\n };\n\n return descriptions[mechanism];\n}\n\n/**\n * Validates a cross-border transfer record for completeness and compliance.\n * Checks required fields, verifies that NDPC approval is documented when required,\n * and ensures safeguards are in place.\n *\n * @param transfer The cross-border transfer to validate\n * @returns Validation result with errors and warnings\n */\nexport function validateTransfer(transfer: CrossBorderTransfer): TransferValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Validate required fields\n if (!transfer.id) {\n errors.push('Transfer ID is required.');\n }\n\n if (!transfer.destinationCountry || transfer.destinationCountry.trim() === '') {\n errors.push('Destination country is required.');\n }\n\n if (!transfer.recipientOrganization || transfer.recipientOrganization.trim() === '') {\n errors.push('Recipient organization is required.');\n }\n\n if (!transfer.recipientContact?.name || transfer.recipientContact.name.trim() === '') {\n errors.push('Recipient contact name is required.');\n }\n\n if (!transfer.recipientContact?.email || transfer.recipientContact.email.trim() === '') {\n errors.push('Recipient contact email is required.');\n }\n\n if (!transfer.purpose || transfer.purpose.trim() === '') {\n errors.push('Purpose of the transfer is required.');\n }\n\n if (!transfer.transferMechanism) {\n errors.push('Transfer mechanism is required.');\n }\n\n if (!transfer.dataCategories || transfer.dataCategories.length === 0) {\n errors.push('At least one data category must be specified.');\n }\n\n if (!transfer.riskAssessment || transfer.riskAssessment.trim() === '') {\n errors.push('Risk assessment summary is required.');\n }\n\n // Validate safeguards\n if (!transfer.safeguards || transfer.safeguards.length === 0) {\n errors.push('At least one safeguard must be documented for the transfer.');\n }\n\n // Validate NDPC approval when required\n if (isNDPCApprovalRequired(transfer.transferMechanism)) {\n if (!transfer.ndpcApproval) {\n errors.push(\n `NDPC approval documentation is required for transfers using ${getTransferMechanismLabel(transfer.transferMechanism)}.`\n );\n } else {\n if (!transfer.ndpcApproval.required) {\n warnings.push(\n 'NDPC approval is marked as not required, but the selected transfer mechanism requires NDPC approval.'\n );\n }\n if (transfer.ndpcApproval.required && !transfer.ndpcApproval.applied) {\n errors.push('NDPC approval is required but an application has not been submitted.');\n }\n if (transfer.ndpcApproval.applied && !transfer.ndpcApproval.approved && transfer.status === 'active') {\n errors.push(\n 'Transfer is marked as active but NDPC approval has not been granted. Status should be \"pending_approval\".'\n );\n }\n }\n }\n\n // Validate TIA\n if (!transfer.tiaCompleted) {\n warnings.push('A Transfer Impact Assessment (TIA) has not been completed for this transfer.');\n }\n\n // Validate adequacy status alignment\n if (transfer.adequacyStatus === 'inadequate' && transfer.transferMechanism === 'adequacy_decision') {\n errors.push(\n 'Cannot rely on adequacy decision (Section 41) when the destination country is marked as inadequate.'\n );\n }\n\n // Validate dates\n if (transfer.endDate && transfer.startDate > transfer.endDate) {\n errors.push('Start date must be before end date.');\n }\n\n // Sensitive data warnings\n if (transfer.includesSensitiveData && transfer.riskLevel !== 'high') {\n warnings.push(\n 'Transfer includes sensitive personal data but the risk level is not set to high. Consider reviewing the risk assessment.'\n );\n }\n\n // Review date warning\n if (!transfer.reviewDate) {\n warnings.push('No review date has been set for this transfer. Periodic reviews are recommended.');\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Performs a basic risk assessment of a cross-border transfer based on adequacy status,\n * transfer mechanism, and data sensitivity.\n *\n * @param transfer The cross-border transfer to assess\n * @returns Risk assessment result with score, factors, and recommendations\n */\nexport function assessTransferRisk(transfer: CrossBorderTransfer): TransferRiskResult {\n const factors: string[] = [];\n const recommendations: string[] = [];\n let riskScore = 0;\n\n // Factor 1: Adequacy status\n const adequacyScores: Record<AdequacyStatus, number> = {\n adequate: 0,\n pending_review: 2,\n unknown: 3,\n inadequate: 4,\n };\n const adequacyScore = adequacyScores[transfer.adequacyStatus];\n riskScore += adequacyScore;\n\n if (transfer.adequacyStatus === 'inadequate') {\n factors.push('Destination country does not have an adequate level of data protection.');\n recommendations.push('Implement supplementary technical and organizational measures.');\n } else if (transfer.adequacyStatus === 'unknown') {\n factors.push('Data protection adequacy of the destination country has not been assessed.');\n recommendations.push('Conduct an adequacy assessment of the destination country.');\n } else if (transfer.adequacyStatus === 'pending_review') {\n factors.push('Destination country adequacy is currently under review.');\n recommendations.push('Monitor the adequacy review outcome and plan for contingencies.');\n }\n\n // Factor 2: Transfer mechanism strength\n const mechanismScores: Record<TransferMechanism, number> = {\n adequacy_decision: 0,\n standard_clauses: 1,\n binding_corporate_rules: 1,\n ndpc_authorization: 1,\n contract_performance: 2,\n explicit_consent: 2,\n legal_claims: 2,\n public_interest: 2,\n vital_interests: 3,\n };\n const mechanismScore = mechanismScores[transfer.transferMechanism];\n riskScore += mechanismScore;\n\n if (mechanismScore >= 2) {\n factors.push(\n `Transfer relies on a derogation mechanism (${getTransferMechanismLabel(transfer.transferMechanism)}), which provides fewer structural safeguards.`\n );\n recommendations.push(\n 'Consider whether a stronger transfer mechanism (adequacy decision, standard clauses, or BCRs) could be used instead.'\n );\n }\n\n // Factor 3: Sensitive data\n if (transfer.includesSensitiveData) {\n riskScore += 3;\n factors.push('Transfer includes sensitive personal data, increasing the potential impact of unauthorized access.');\n recommendations.push('Ensure encryption in transit and at rest, and apply strict access controls.');\n }\n\n // Factor 4: Scale of transfer\n if (transfer.estimatedDataSubjects && transfer.estimatedDataSubjects > 10000) {\n riskScore += 2;\n factors.push('Large number of data subjects involved increases the scope of potential harm.');\n recommendations.push('Consider data minimization strategies and ensure robust incident response procedures.');\n } else if (transfer.estimatedDataSubjects && transfer.estimatedDataSubjects > 1000) {\n riskScore += 1;\n factors.push('Moderate number of data subjects involved.');\n }\n\n // Factor 5: Missing TIA\n if (!transfer.tiaCompleted) {\n riskScore += 2;\n factors.push('Transfer Impact Assessment has not been completed.');\n recommendations.push('Complete a Transfer Impact Assessment before proceeding with the transfer.');\n }\n\n // Factor 6: NDPC approval pending\n if (isNDPCApprovalRequired(transfer.transferMechanism)) {\n if (!transfer.ndpcApproval?.approved) {\n riskScore += 2;\n factors.push('NDPC approval is required but has not been granted.');\n recommendations.push('Obtain NDPC approval before activating the transfer.');\n }\n }\n\n // Factor 7: Safeguards count\n if ((transfer.safeguards?.length || 0) < 3) {\n riskScore += 1;\n factors.push('Limited number of safeguards documented.');\n recommendations.push('Document additional technical, organizational, and contractual safeguards.');\n }\n\n // Factor 8: Continuous transfers\n if (transfer.frequency === 'continuous') {\n riskScore += 1;\n factors.push('Continuous data transfer increases exposure window.');\n recommendations.push('Implement real-time monitoring and anomaly detection for the transfer.');\n }\n\n // Determine risk level\n let riskLevel: 'low' | 'medium' | 'high';\n if (riskScore <= 4) {\n riskLevel = 'low';\n } else if (riskScore <= 9) {\n riskLevel = 'medium';\n } else {\n riskLevel = 'high';\n }\n\n return {\n riskLevel,\n riskScore,\n factors,\n recommendations,\n };\n}\n\n/**\n * Returns a short label for a transfer mechanism (without the full description).\n *\n * @param mechanism The transfer mechanism\n * @returns Short label\n */\nfunction getTransferMechanismLabel(mechanism: TransferMechanism): string {\n const labels: Record<TransferMechanism, string> = {\n adequacy_decision: 'Adequacy Decision',\n standard_clauses: 'Standard Contractual Clauses',\n binding_corporate_rules: 'Binding Corporate Rules',\n ndpc_authorization: 'NDPC Authorization',\n explicit_consent: 'Explicit Consent',\n contract_performance: 'Contract Performance',\n public_interest: 'Public Interest',\n legal_claims: 'Legal Claims',\n vital_interests: 'Vital Interests',\n };\n\n return labels[mechanism];\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkPM7CMTMB_js=require('./chunk-PM7CMTMB.js'),chunkMQFZHA2D_js=require('./chunk-MQFZHA2D.js'),react=require('react');function U({templates:m,initialPolicy:g,storageKey:d="ndpr_privacy_policy",useLocalStorage:f=true,onGenerate:v}){let[r,u]=react.useState(g||null),[a,y]=react.useState(null),[c,P]=react.useState({name:"",website:"",privacyEmail:"",address:"",privacyPhone:"",dpoName:"",dpoEmail:"",industry:""});react.useEffect(()=>{if(f&&typeof window!="undefined"&&!g)try{let i=localStorage.getItem(d);if(i){let{policy:n,template:e,organizationInfo:t}=JSON.parse(i);if(n&&u(n),e){let s=m.find(E=>E.id===e.id);s&&y(s);}t&&P(t);}}catch(i){console.error("Error loading privacy policy data:",i);}},[d,f,g,m]),react.useEffect(()=>{if(f&&typeof window!="undefined")try{localStorage.setItem(d,JSON.stringify({policy:r,template:a,organizationInfo:c}));}catch(i){console.error("Error saving privacy policy data:",i);}},[r,a,c,d,f]);let I=i=>{let n=m.find(s=>s.id===i);if(!n)return false;y(n);n.sections.map(s=>chunkMQFZHA2D_js.b(chunkMQFZHA2D_js.a({},s),{customContent:void 0}));return Object.keys(n.variables).forEach(s=>{n.variables[s].defaultValue||"";}),true},h=i=>{P(n=>chunkMQFZHA2D_js.a(chunkMQFZHA2D_js.a({},n),i));},V=(i,n)=>{a&&(r?u(e=>e&&chunkMQFZHA2D_js.b(chunkMQFZHA2D_js.a({},e),{sections:e.sections.map(t=>t.id===i?chunkMQFZHA2D_js.b(chunkMQFZHA2D_js.a({},t),{included:n}):t)})):y(e=>e&&chunkMQFZHA2D_js.b(chunkMQFZHA2D_js.a({},e),{sections:e.sections.map(t=>t.id===i?chunkMQFZHA2D_js.b(chunkMQFZHA2D_js.a({},t),{included:n}):t)})));},w=(i,n)=>{a&&(r?u(e=>e&&chunkMQFZHA2D_js.b(chunkMQFZHA2D_js.a({},e),{sections:e.sections.map(t=>t.id===i?chunkMQFZHA2D_js.b(chunkMQFZHA2D_js.a({},t),{customContent:n}):t)})):y(e=>e&&chunkMQFZHA2D_js.b(chunkMQFZHA2D_js.a({},e),{sections:e.sections.map(t=>t.id===i?chunkMQFZHA2D_js.b(chunkMQFZHA2D_js.a({},t),{customContent:n}):t)})));},O=(i,n)=>{r&&u(e=>e&&chunkMQFZHA2D_js.b(chunkMQFZHA2D_js.a({},e),{variableValues:chunkMQFZHA2D_js.b(chunkMQFZHA2D_js.a({},e.variableValues),{[i]:n})}));},z=()=>"policy_"+Date.now()+"_"+Math.random().toString(36).substr(2,9);return {policy:r,selectedTemplate:a,organizationInfo:c,selectTemplate:I,updateOrganizationInfo:h,toggleSection:V,updateSectionContent:w,updateVariableValue:O,generatePolicy:()=>{if(!a)throw new Error("No template selected");let i=Date.now(),n={id:(r==null?void 0:r.id)||z(),title:`Privacy Policy for ${c.name}`,templateId:a.id,organizationInfo:c,sections:a.sections.map(e=>{var t;return chunkMQFZHA2D_js.b(chunkMQFZHA2D_js.a({},e),{customContent:(t=r==null?void 0:r.sections.find(s=>s.id===e.id))==null?void 0:t.customContent})}),variableValues:(r==null?void 0:r.variableValues)||{},effectiveDate:i,lastUpdated:i,version:"1.0"};return u(n),v&&v(n),n},getPolicyText:()=>{if(!r)return {fullText:"",sectionTexts:{},missingVariables:[]};let i=chunkPM7CMTMB_js.a(r.sections,r.organizationInfo);return typeof i=="string"?{fullText:i,sectionTexts:{full:i},missingVariables:[]}:i},resetPolicy:()=>{u(null),y(null),P({name:"",website:"",privacyEmail:"",address:"",privacyPhone:"",dpoName:"",dpoEmail:"",industry:""}),f&&typeof window!="undefined"&&localStorage.removeItem(d);},isValid:()=>{let i=[];if(a||i.push("No template selected"),c.name||i.push("Organization name is required"),c.website||i.push("Organization website is required"),c.privacyEmail||i.push("Privacy contact email is required"),a){let n=a.sections.filter(t=>t.required),e=(r==null?void 0:r.sections.filter(t=>t.included))||[];n.forEach(t=>{e.some(s=>s.id===t.id)||i.push(`Required section "${t.title}" must be included`);});}return a&&r&&Object.entries(a.variables).forEach(([n,e])=>{e.required&&!r.variableValues[n]&&i.push(`Required variable "${e.name}" must have a value`);}),{valid:i.length===0,errors:i}}}}exports.a=U;//# sourceMappingURL=chunk-IWUUVRLJ.js.map
2
+ //# sourceMappingURL=chunk-IWUUVRLJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/ndpr-toolkit/src/hooks/usePrivacyPolicy.ts"],"names":["usePrivacyPolicy","templates","initialPolicy","storageKey","useLocalStorage","onGenerate","policy","setPolicy","useState","selectedTemplate","setSelectedTemplate","organizationInfo","setOrganizationInfo","useEffect","savedData","template","foundTemplate","t","error","selectTemplate","templateId","section","__spreadProps","__spreadValues","variable","updateOrganizationInfo","updates","prev","toggleSection","sectionId","included","updateSectionContent","content","updateVariableValue","value","generateId","now","newPolicy","_a","result","generatePolicyText","errors","requiredSections","includedSections","info"],"mappings":"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","file":"chunk-IWUUVRLJ.js","sourcesContent":["import { useState, useEffect } from 'react';\nimport { PolicySection, PolicyTemplate, OrganizationInfo, PrivacyPolicy } from '../types/privacy';\nimport { generatePolicyText } from '../utils/privacy';\n\ninterface UsePrivacyPolicyOptions {\n /**\n * Available policy templates\n */\n templates: PolicyTemplate[];\n \n /**\n * Initial policy data (if editing an existing policy)\n */\n initialPolicy?: PrivacyPolicy;\n \n /**\n * Storage key for policy data\n * @default \"ndpr_privacy_policy\"\n */\n storageKey?: string;\n \n /**\n * Whether to use local storage to persist policy data\n * @default true\n */\n useLocalStorage?: boolean;\n \n /**\n * Callback function called when a policy is generated\n */\n onGenerate?: (policy: PrivacyPolicy) => void;\n}\n\ninterface UsePrivacyPolicyReturn {\n /**\n * Current policy data\n */\n policy: PrivacyPolicy | null;\n \n /**\n * Selected template\n */\n selectedTemplate: PolicyTemplate | null;\n \n /**\n * Organization information\n */\n organizationInfo: OrganizationInfo;\n \n /**\n * Select a template\n */\n selectTemplate: (templateId: string) => boolean;\n \n /**\n * Update organization information\n */\n updateOrganizationInfo: (updates: Partial<OrganizationInfo>) => void;\n \n /**\n * Toggle whether a section is included in the policy\n */\n toggleSection: (sectionId: string, included: boolean) => void;\n \n /**\n * Update section content\n */\n updateSectionContent: (sectionId: string, content: string) => void;\n \n /**\n * Update variable values\n */\n updateVariableValue: (variable: string, value: string) => void;\n \n /**\n * Generate the policy\n */\n generatePolicy: () => PrivacyPolicy;\n \n /**\n * Get the generated policy text\n */\n getPolicyText: () => {\n fullText: string;\n sectionTexts: Record<string, string>;\n missingVariables: string[];\n };\n \n /**\n * Reset the policy\n */\n resetPolicy: () => void;\n \n /**\n * Check if the policy is valid\n */\n isValid: () => {\n valid: boolean;\n errors: string[];\n };\n}\n\n/**\n * Hook for generating NDPA-compliant privacy policies\n */\nexport function usePrivacyPolicy({\n templates,\n initialPolicy,\n storageKey = \"ndpr_privacy_policy\",\n useLocalStorage = true,\n onGenerate\n}: UsePrivacyPolicyOptions): UsePrivacyPolicyReturn {\n const [policy, setPolicy] = useState<PrivacyPolicy | null>(initialPolicy || null);\n const [selectedTemplate, setSelectedTemplate] = useState<PolicyTemplate | null>(null);\n const [organizationInfo, setOrganizationInfo] = useState<OrganizationInfo>({\n name: '',\n website: '',\n privacyEmail: '',\n address: '',\n privacyPhone: '',\n dpoName: '',\n dpoEmail: '',\n industry: ''\n });\n \n // Load policy data from storage on mount\n useEffect(() => {\n if (useLocalStorage && typeof window !== 'undefined' && !initialPolicy) {\n try {\n const savedData = localStorage.getItem(storageKey);\n if (savedData) {\n const { policy, template, organizationInfo } = JSON.parse(savedData);\n \n if (policy) {\n setPolicy(policy);\n }\n \n if (template) {\n const foundTemplate = templates.find(t => t.id === template.id);\n if (foundTemplate) {\n setSelectedTemplate(foundTemplate);\n }\n }\n \n if (organizationInfo) {\n setOrganizationInfo(organizationInfo);\n }\n }\n } catch (error) {\n console.error('Error loading privacy policy data:', error);\n }\n }\n }, [storageKey, useLocalStorage, initialPolicy, templates]);\n \n // Save policy data to storage when it changes\n useEffect(() => {\n if (useLocalStorage && typeof window !== 'undefined') {\n try {\n localStorage.setItem(storageKey, JSON.stringify({\n policy,\n template: selectedTemplate,\n organizationInfo\n }));\n } catch (error) {\n console.error('Error saving privacy policy data:', error);\n }\n }\n }, [policy, selectedTemplate, organizationInfo, storageKey, useLocalStorage]);\n \n // Select a template\n const selectTemplate = (templateId: string): boolean => {\n const template = templates.find(t => t.id === templateId);\n \n if (!template) {\n return false;\n }\n \n setSelectedTemplate(template);\n \n // Initialize sections from the template\n const sections = template.sections.map(section => ({\n ...section,\n customContent: undefined\n }));\n \n // Initialize variable values\n const variableValues: Record<string, string> = {};\n Object.keys(template.variables).forEach(variable => {\n variableValues[variable] = template.variables[variable].defaultValue || '';\n });\n \n return true;\n };\n \n // Update organization information\n const updateOrganizationInfo = (updates: Partial<OrganizationInfo>) => {\n setOrganizationInfo(prev => ({\n ...prev,\n ...updates\n }));\n };\n \n // Toggle whether a section is included in the policy\n const toggleSection = (sectionId: string, included: boolean) => {\n if (!selectedTemplate) {\n return;\n }\n \n if (policy) {\n setPolicy(prev => {\n if (!prev) return prev;\n \n return {\n ...prev,\n sections: prev.sections.map(section => \n section.id === sectionId ? { ...section, included } : section\n )\n };\n });\n } else {\n // If no policy exists yet, update the template sections\n setSelectedTemplate(prev => {\n if (!prev) return prev;\n \n return {\n ...prev,\n sections: prev.sections.map(section => \n section.id === sectionId ? { ...section, included } : section\n )\n };\n });\n }\n };\n \n // Update section content\n const updateSectionContent = (sectionId: string, content: string) => {\n if (!selectedTemplate) {\n return;\n }\n \n if (policy) {\n setPolicy(prev => {\n if (!prev) return prev;\n \n return {\n ...prev,\n sections: prev.sections.map(section => \n section.id === sectionId ? { ...section, customContent: content } : section\n )\n };\n });\n } else {\n // If no policy exists yet, update the template sections\n setSelectedTemplate(prev => {\n if (!prev) return prev;\n \n return {\n ...prev,\n sections: prev.sections.map(section => \n section.id === sectionId ? { ...section, customContent: content } : section\n )\n };\n });\n }\n };\n \n // Update variable values\n const updateVariableValue = (variable: string, value: string) => {\n if (!policy) {\n return;\n }\n \n setPolicy(prev => {\n if (!prev) return prev;\n \n return {\n ...prev,\n variableValues: {\n ...prev.variableValues,\n [variable]: value\n }\n };\n });\n };\n \n // Generate a unique ID\n const generateId = (): string => {\n return 'policy_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);\n };\n \n // Generate the policy\n const generatePolicy = (): PrivacyPolicy => {\n if (!selectedTemplate) {\n throw new Error('No template selected');\n }\n \n const now = Date.now();\n \n const newPolicy: PrivacyPolicy = {\n id: policy?.id || generateId(),\n title: `Privacy Policy for ${organizationInfo.name}`,\n templateId: selectedTemplate.id,\n organizationInfo,\n sections: selectedTemplate.sections.map(section => ({\n ...section,\n customContent: policy?.sections.find(s => s.id === section.id)?.customContent\n })),\n variableValues: policy?.variableValues || {},\n effectiveDate: now,\n lastUpdated: now,\n version: '1.0'\n };\n \n setPolicy(newPolicy);\n \n if (onGenerate) {\n onGenerate(newPolicy);\n }\n \n return newPolicy;\n };\n \n // Get the generated policy text\n const getPolicyText = () => {\n if (!policy) {\n return {\n fullText: '',\n sectionTexts: {},\n missingVariables: []\n };\n }\n \n const result = generatePolicyText(policy.sections, policy.organizationInfo);\n \n // Handle both string and object return types from generatePolicyText\n if (typeof result === 'string') {\n return {\n fullText: result,\n sectionTexts: { 'full': result },\n missingVariables: []\n };\n }\n \n return result;\n };\n \n // Reset the policy\n const resetPolicy = () => {\n setPolicy(null);\n setSelectedTemplate(null);\n setOrganizationInfo({\n name: '',\n website: '',\n privacyEmail: '',\n address: '',\n privacyPhone: '',\n dpoName: '',\n dpoEmail: '',\n industry: ''\n });\n \n if (useLocalStorage && typeof window !== 'undefined') {\n localStorage.removeItem(storageKey);\n }\n };\n \n // Check if the policy is valid\n const isValid = () => {\n const errors: string[] = [];\n \n if (!selectedTemplate) {\n errors.push('No template selected');\n }\n \n if (!organizationInfo.name) {\n errors.push('Organization name is required');\n }\n \n if (!organizationInfo.website) {\n errors.push('Organization website is required');\n }\n \n if (!organizationInfo.privacyEmail) {\n errors.push('Privacy contact email is required');\n }\n \n // Check if all required sections are included\n if (selectedTemplate) {\n const requiredSections = selectedTemplate.sections.filter(section => section.required);\n const includedSections = policy?.sections.filter(section => section.included) || [];\n \n requiredSections.forEach(section => {\n if (!includedSections.some(s => s.id === section.id)) {\n errors.push(`Required section \"${section.title}\" must be included`);\n }\n });\n }\n \n // Check if all required variables have values\n if (selectedTemplate && policy) {\n Object.entries(selectedTemplate.variables).forEach(([variable, info]) => {\n if (info.required && !policy.variableValues[variable]) {\n errors.push(`Required variable \"${info.name}\" must have a value`);\n }\n });\n }\n \n return {\n valid: errors.length === 0,\n errors\n };\n };\n \n return {\n policy,\n selectedTemplate,\n organizationInfo,\n selectTemplate,\n updateOrganizationInfo,\n toggleSection,\n updateSectionContent,\n updateVariableValue,\n generatePolicy,\n getPolicyText,\n resetPolicy,\n isValid\n };\n}\n"]}