{"_id":"@bot_shashmit/expo-ai-privacy-compliance","_rev":"3-d50ed6fef6eef028db678a2881e8596b","name":"@bot_shashmit/expo-ai-privacy-compliance","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.1":{"name":"@bot_shashmit/expo-ai-privacy-compliance","version":"0.1.1","keywords":["expo","react-native","privacy","app-store","consent","ai"],"author":{"name":"Shashmit"},"license":"MIT","_id":"@bot_shashmit/expo-ai-privacy-compliance@0.1.1","maintainers":[{"name":"bot_shashmit","email":"shaashmit@gmail.com"}],"homepage":"https://github.com/shashmit/expo-ai-privacy-compliance#readme","bugs":{"url":"https://github.com/shashmit/expo-ai-privacy-compliance/issues"},"dist":{"shasum":"0255e300629ece909ef53f86c7f0c1b2eff542f8","tarball":"https://registry.npmjs.org/@bot_shashmit/expo-ai-privacy-compliance/-/expo-ai-privacy-compliance-0.1.1.tgz","fileCount":8,"integrity":"sha512-3+V7RAGag1wNXVM8SQfg7YITp239dfM9MQd4fvzmQE5rcDTrPrAhoiAm/UGsXBBMZ/3VcD/k3uPyFp9W9LnzgA==","signatures":[{"sig":"MEUCIH5oqoMxUiTBL0sck69ifd+ZFR5qy29gS1AYW/t2IyZ/AiEAh2ooMdfoKD7Q7cG+21nFgNddk6SyaUi0J1DM7rYCKC4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34420},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"2230add0204c4c9187b50e321c563691b66523d5","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\"","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm run lint && npm run typecheck"},"_npmUser":{"name":"bot_shashmit","email":"shaashmit@gmail.com"},"repository":{"url":"git+https://github.com/shashmit/expo-ai-privacy-compliance.git","type":"git"},"_npmVersion":"11.11.0","description":"Privacy compliance toolkit for Expo React Native AI integrations","directories":{},"_nodeVersion":"25.8.0","react-native":"dist/index.js","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","react":"18.3.1","eslint":"^9.0.0","typescript":"^5.5.0","@types/node":"^22.0.0","@types/react":"^18.3.0","react-native":"0.76.6","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18","react-native":">=0.73"},"_npmOperationalInternal":{"tmp":"tmp/expo-ai-privacy-compliance_0.1.1_1772995790610_0.7243566480318484","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@bot_shashmit/expo-ai-privacy-compliance","version":"0.1.2","keywords":["expo","react-native","privacy","app-store","consent","ai"],"author":{"name":"Shashmit"},"license":"MIT","_id":"@bot_shashmit/expo-ai-privacy-compliance@0.1.2","maintainers":[{"name":"bot_shashmit","email":"shaashmit@gmail.com"}],"homepage":"https://github.com/shashmit/expo-ai-privacy-compliance#readme","bugs":{"url":"https://github.com/shashmit/expo-ai-privacy-compliance/issues"},"dist":{"shasum":"3f45b35a65dabc6dad8774bebc53b69ec33d60af","tarball":"https://registry.npmjs.org/@bot_shashmit/expo-ai-privacy-compliance/-/expo-ai-privacy-compliance-0.1.2.tgz","fileCount":8,"integrity":"sha512-AXz8ehxq/r5eijEDjnC4ypv/0U47gfcq5GaPtGxYE4Ml8hxgYdtZCTUelfW4My46Tnz4zJ1wCDVfWHJzGEz0Ow==","signatures":[{"sig":"MEUCIGokD2EGBgSF9Nc+5RqMQ5zNm6sCEXFylbgyyIjNxw9dAiEA/2fZGnc+ehyAzc7Z74DbeilaDnsAwm6aCdch5TKV2kE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33848},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"a8ad8b3d236239160d86ad98ce20898c70dd02ef","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\"","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm run lint && npm run typecheck"},"_npmUser":{"name":"bot_shashmit","email":"shaashmit@gmail.com"},"repository":{"url":"git+https://github.com/shashmit/expo-ai-privacy-compliance.git","type":"git"},"_npmVersion":"11.11.0","description":"Privacy compliance toolkit for Expo React Native AI integrations","directories":{},"_nodeVersion":"25.8.0","react-native":"dist/index.js","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","react":"18.3.1","eslint":"^9.0.0","typescript":"^5.5.0","@types/node":"^22.0.0","@types/react":"^18.3.0","react-native":"0.76.6","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":">=18","react-native":">=0.73"},"_npmOperationalInternal":{"tmp":"tmp/expo-ai-privacy-compliance_0.1.2_1772996664652_0.6521172589244579","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@bot_shashmit/expo-ai-privacy-compliance","version":"0.1.3","description":"Privacy compliance toolkit for Expo React Native AI integrations","keywords":["expo","react-native","privacy","app-store","consent","ai"],"homepage":"https://github.com/shashmit/expo-ai-privacy-compliance#readme","bugs":{"url":"https://github.com/shashmit/expo-ai-privacy-compliance/issues"},"repository":{"type":"git","url":"git+https://github.com/shashmit/expo-ai-privacy-compliance.git"},"license":"MIT","author":{"name":"Shashmit"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js","default":"./dist/index.js"}},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc -p tsconfig.json --noEmit","lint":"eslint \"src/**/*.{ts,tsx}\"","prepublishOnly":"npm run build && npm run lint && npm run typecheck"},"devDependencies":{"@types/node":"^22.0.0","@types/react":"^18.3.0","@typescript-eslint/eslint-plugin":"^8.0.0","@typescript-eslint/parser":"^8.0.0","eslint":"^9.0.0","react":"18.3.1","react-native":"0.76.6","tsup":"^8.0.0","typescript":"^5.5.0"},"peerDependencies":{"react":">=18","react-native":">=0.73"},"publishConfig":{"access":"public"},"module":"dist/index.mjs","react-native":"dist/index.js","gitHead":"59a4bc250cf59f0a5e324baa0cdd32b7ef98a8e7","_id":"@bot_shashmit/expo-ai-privacy-compliance@0.1.3","_nodeVersion":"25.8.0","_npmVersion":"11.11.0","dist":{"integrity":"sha512-jsy9kEidnPt0VvSkT7fqGV0rmZzJaEQm4YprjSdwkL3ixd6fBuu3X0HnlLq39ntgBgUxF1gdDFzkQzhip8G4fw==","shasum":"971c3efa5f233786789d1292922879006092d806","tarball":"https://registry.npmjs.org/@bot_shashmit/expo-ai-privacy-compliance/-/expo-ai-privacy-compliance-0.1.3.tgz","fileCount":8,"unpackedSize":41596,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEMCIFlwV1l9FA33lw86/g1coxED/ue+RkvLV2gmATqfr/9JAh9cJS4d6k0xzluQOyfj7m6owVXkvXdDNZrzeHswfdfU"}]},"_npmUser":{"name":"bot_shashmit","email":"shaashmit@gmail.com"},"directories":{},"maintainers":[{"name":"bot_shashmit","email":"shaashmit@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/expo-ai-privacy-compliance_0.1.3_1772999742320_0.294860246069262"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-08T18:49:50.492Z","modified":"2026-03-08T19:55:42.593Z","0.1.1":"2026-03-08T18:49:50.756Z","0.1.2":"2026-03-08T19:04:24.811Z","0.1.3":"2026-03-08T19:55:42.475Z"},"bugs":{"url":"https://github.com/shashmit/expo-ai-privacy-compliance/issues"},"author":{"name":"Shashmit"},"license":"MIT","homepage":"https://github.com/shashmit/expo-ai-privacy-compliance#readme","keywords":["expo","react-native","privacy","app-store","consent","ai"],"repository":{"type":"git","url":"git+https://github.com/shashmit/expo-ai-privacy-compliance.git"},"description":"Privacy compliance toolkit for Expo React Native AI integrations","maintainers":[{"name":"bot_shashmit","email":"shaashmit@gmail.com"}],"readme":"# @bot_shashmit/expo-ai-privacy-compliance\n\nConsent UI framework for Expo React Native apps using AI providers.\n\n## What it provides\n\n- Consent flow with provider list and native allow/decline popup\n- Provider-level usage messaging plus optional global extra message\n- Privacy policy URL display with built-in link handling\n- Bottom sheet capped at 60% of screen height with automatic scrolling\n- Modular UI configuration for button colors, title color, link color, and roundness\n- Built-in provider badge image registry with slug-based mapping\n- Internationalization-ready consent copy and accessible UI defaults\n\n## Installation\n\n```bash\nnpm install @bot_shashmit/expo-ai-privacy-compliance\n```\n\n## AI implementation helper\n\nFor faster rollout planning, use the guided agent prompt in `AGENT.md`.\n\n- Open [AGENT.md](./AGENT.md)\n- Paste it into your preferred AI agent as the system prompt\n- Choose **Quick** mode for defaults or **Detailed** mode for full discovery\n- Follow the generated implementation plan and checklist\n\n## Quick start\n\n```tsx\nimport {\n  ConsentFlow,\n  defineConsentConfig\n} from \"@bot_shashmit/expo-ai-privacy-compliance\";\n\nconst consentConfig = defineConsentConfig({\n  providers: [\n    {\n      id: \"openai\",\n      name: \"OpenAI\",\n      usageDescription: \"Used for chat completion.\",\n      imageSlug: \"openai\"\n    },\n    {\n      id: \"claude\",\n      name: \"Claude\",\n      usageDescription: \"Used for safety review.\",\n      imageSlug: \"claude\"\n    },\n    {\n      id: \"openrouter\",\n      name: \"OpenRouter\",\n      usageDescription: \"Used for provider routing.\",\n      imageSlug: \"openrouter\"\n    }\n  ],\n  privacyPolicyUrl: \"https://example.com/privacy\",\n  extraMessage: \"We use AI providers to deliver assistant features.\",\n  ui: {\n    showRequiredDisclosure: false,\n    theme: {\n      buttonBackgroundColor: \"#111827\",\n      buttonTextColor: \"#FFFFFF\",\n      titleColor: \"#7C3AED\",\n      privacyPolicyColor: \"#0EA5E9\",\n      borderRadius: 16,\n      sheetRadius: 28,\n      buttonRadius: 14\n    }\n  }\n});\n```\n\n## Present consent bottom sheet\n\nTrigger the consent UI from any app action. The sheet includes an **I agree on terms** button that triggers a native allow/decline popup.\n\n```tsx\nconst [showConsentSheet, setShowConsentSheet] = useState(false);\n\n<Pressable onPress={() => setShowConsentSheet(true)}>\n  <Text>Open Consent</Text>\n</Pressable>\n\n<ConsentFlow\n  locale=\"en\"\n  isVisible={showConsentSheet}\n  onRequestClose={() => setShowConsentSheet(false)}\n  providers={consentConfig.providers}\n  privacyPolicyUrl={consentConfig.privacyPolicyUrl}\n  extraMessage={consentConfig.extraMessage}\n  theme={consentConfig.ui?.theme}\n  showRequiredDisclosure={consentConfig.ui?.showRequiredDisclosure}\n  onOpenPrivacyPolicy={(url) => Linking.openURL(url)}\n  onDecision={(accepted) => {\n    setConsentStatus(accepted ? \"granted\" : \"denied\");\n  }}\n/>\n```\n\n## UI customization guide\n\nUse the `ui.theme` object to control the consent sheet visuals:\n\n- `buttonBackgroundColor`: Agree button background color\n- `buttonTextColor`: Agree button text color\n- `titleColor`: Title color for the consent heading\n- `privacyPolicyColor`: Privacy policy link color\n- `borderRadius`: Roundness for consent card corners\n- `sheetRadius`: Roundness for bottom sheet top corners\n- `buttonRadius`: Roundness for the primary action button\n\nUse `showRequiredDisclosure: false` to remove the \"Required disclosure\" line from each provider row.\n\n## Provider image slug guide\n\nProvider images are bundled in the package and resolved by `imageSlug`.\n\nSet this inside each provider:\n\n```tsx\n{\n  id: \"openai\",\n  name: \"OpenAI\",\n  usageDescription: \"Used for chat completion.\",\n  imageSlug: \"openai\"\n}\n```\n\nBuilt-in slugs:\n\n- `openai`\n- `claude`\n- `openrouter`\n- `anthropic`\n- `awsbedrock`\n- `microsoft`\n- `azureopenai`\n- `vertexai`\n- `googleai`\n- `cohere`\n- `togetherai`\n- `huggingface`\n- `fireworks`\n- `replicate`\n- `mistral`\n- `perplexity`\n- `meta`\n- `grok`\n- `deepseek`\n\nIf `imageSlug` is not set, the package tries to resolve from `id`.\n\n## Consent UI components\n\n- `ConsentDisclosureCard`\n- `ConsentFlow`\n\nAll components are keyboard/screen-reader aware through native accessibility roles.\n","readmeFilename":"README.md"}