{"_id":"@capitalforlife/lovable-export","_rev":"4-25a64f0c62686b1e04f07e1f292b085e","name":"@capitalforlife/lovable-export","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"@capitalforlife/lovable-export","version":"1.0.0","_id":"@capitalforlife/lovable-export@1.0.0","maintainers":[{"name":"capitalforlife","email":"jared.foy+capital@armstrong.so"}],"dist":{"shasum":"96a28514d77824edf120775917c90b0f0fd37f76","tarball":"https://registry.npmjs.org/@capitalforlife/lovable-export/-/lovable-export-1.0.0.tgz","fileCount":6,"integrity":"sha512-+sjAg95qr4NgyZO1tF2llRsViDaP3TZuye0hlGs1H6LrG86rYWp18b+ittcqZnl2IpQstXahdFe8BjojHy3Mvw==","signatures":[{"sig":"MEUCIQCF+T5gJGdGBIRHo6XvIbe4hVre+D1Qk4YKUvxtqzKEmwIgaokz7uNnY/TU7Btf/WoiYusfYbc4NWMXYZsPoCuZXJk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":292643},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles.css"},"gitHead":"5406f401a6c912168afa19308ba020ebf41812dc","scripts":{"dev":"vite build --watch","build":"vite build && pnpm build:css","build:css":"cp src/styles/input.css dist/styles.css","typecheck":"tsc --noEmit"},"_npmUser":{"name":"capitalforlife","email":"jared.foy+capital@armstrong.so"},"_npmVersion":"11.2.0","description":"A React component library for exporting Lovable.dev pages as static HTML and uploading them to a proxy server.","directories":{},"_nodeVersion":"20.18.1","dependencies":{"jszip":"^3.10.1","file-saver":"^2.0.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typescript":"^5.7.0","tailwindcss":"^4.0.0","@types/react":"^19.0.0","vite-plugin-dts":"^4.0.0","@types/react-dom":"^19.0.0","@types/file-saver":"^2.0.7","@vitejs/plugin-react":"^4.3.0"},"peerDependencies":{"react":">=17.0.0","react-dom":">=17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/lovable-export_1.0.0_1770237429533_0.5849368192015196","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@capitalforlife/lovable-export","version":"1.0.1","_id":"@capitalforlife/lovable-export@1.0.1","maintainers":[{"name":"capitalforlife","email":"jared.foy+capital@armstrong.so"}],"dist":{"shasum":"42127999d2dc627f118498449f39008b06439f69","tarball":"https://registry.npmjs.org/@capitalforlife/lovable-export/-/lovable-export-1.0.1.tgz","fileCount":6,"integrity":"sha512-tqhzDrInaPpwx1uYA3KqCT+MuVc0TMvMlCHY1vOretvdCKGuqUTkm9gdEvled80ThbfSZeZt8mAegaRefRiPwg==","signatures":[{"sig":"MEQCIAQM45ykajLmT7k/yoa3Fn+irGs133Am6VOPemZN3+tnAiAPgI00vlnrruSVJy1S4xS6cCYEh2gjEK4nF/0Q2qTQww==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":292755},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles.css"},"gitHead":"5406f401a6c912168afa19308ba020ebf41812dc","scripts":{"dev":"vite build --watch","build":"vite build && pnpm build:css","build:css":"cp src/styles/input.css dist/styles.css","typecheck":"tsc --noEmit"},"_npmUser":{"name":"capitalforlife","email":"jared.foy+capital@armstrong.so"},"_npmVersion":"11.2.0","description":"A React component library for exporting Lovable.dev pages as static HTML and uploading them to a proxy server.","directories":{},"_nodeVersion":"20.18.1","dependencies":{"jszip":"^3.10.1","file-saver":"^2.0.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typescript":"^5.7.0","tailwindcss":"^4.0.0","@types/react":"^19.0.0","vite-plugin-dts":"^4.0.0","@types/react-dom":"^19.0.0","@types/file-saver":"^2.0.7","@vitejs/plugin-react":"^4.3.0"},"peerDependencies":{"react":">=17.0.0","react-dom":">=17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/lovable-export_1.0.1_1770237669069_0.5003397367394249","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@capitalforlife/lovable-export","version":"1.0.2","_id":"@capitalforlife/lovable-export@1.0.2","maintainers":[{"name":"capitalforlife","email":"jared.foy+capital@armstrong.so"}],"dist":{"shasum":"541d2a31996171a581c9e56fe481e426064c932b","tarball":"https://registry.npmjs.org/@capitalforlife/lovable-export/-/lovable-export-1.0.2.tgz","fileCount":6,"integrity":"sha512-P3u4oT0TXyf4T+hRNNC8QidFNriOyi2NBTITir6xVsA0C0dl9ZpTdk393uKu0FXmpfigybJ46wRhZZNUL5vwRA==","signatures":[{"sig":"MEYCIQCDfl4Q3+X/CIerZiEDYU6kuoZL1xH43lsxEFH49oxtTAIhAPNeef0KVvD/SPg9uqWoZGPMmp6DNBiNZEBw/uK07Fug","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":295936},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles.css"},"gitHead":"5406f401a6c912168afa19308ba020ebf41812dc","scripts":{"dev":"vite build --watch","build":"vite build && pnpm build:css","build:css":"cp src/styles/input.css dist/styles.css","typecheck":"tsc --noEmit"},"_npmUser":{"name":"capitalforlife","email":"jared.foy+capital@armstrong.so"},"_npmVersion":"11.2.0","description":"A React component library for exporting Lovable.dev pages as static HTML and uploading them to a proxy server.","directories":{},"_nodeVersion":"20.18.1","dependencies":{"jszip":"^3.10.1","file-saver":"^2.0.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typescript":"^5.7.0","tailwindcss":"^4.0.0","@types/react":"^19.0.0","vite-plugin-dts":"^4.0.0","@types/react-dom":"^19.0.0","@types/file-saver":"^2.0.7","@vitejs/plugin-react":"^4.3.0"},"peerDependencies":{"react":">=17.0.0","react-dom":">=17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/lovable-export_1.0.2_1770239046107_0.7465120411570481","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@capitalforlife/lovable-export","version":"1.1.0","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles.css"},"scripts":{"build":"vite build && pnpm build:css","build:css":"cp src/styles/input.css dist/styles.css","dev":"vite build --watch","typecheck":"tsc --noEmit"},"peerDependencies":{"react":">=17.0.0","react-dom":">=17.0.0"},"dependencies":{"jszip":"^3.10.1","file-saver":"^2.0.5"},"devDependencies":{"@types/file-saver":"^2.0.7","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitejs/plugin-react":"^4.3.0","typescript":"^5.7.0","vite":"^6.0.0","vite-plugin-dts":"^4.0.0","tailwindcss":"^4.0.0"},"_id":"@capitalforlife/lovable-export@1.1.0","gitHead":"29775d2876e800d70790177f13d72d4533b4af3a","description":"A React component library for exporting Lovable.dev pages as static HTML and uploading them to a proxy server.","_nodeVersion":"20.18.1","_npmVersion":"11.2.0","dist":{"integrity":"sha512-STWnxQkw2SvbVdPVDJ/JsAtoRu8u2ea25ePnW26nEKMt6nFL4YKnc1WpY6jzbSDTloE9kAi1vZk8mhIf6GH84A==","shasum":"ada27ca9989f1a40c2b376ae8e7a36a158645024","tarball":"https://registry.npmjs.org/@capitalforlife/lovable-export/-/lovable-export-1.1.0.tgz","fileCount":6,"unpackedSize":295901,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDirh4Lwi4AJlWMKfEDwPaKJxsMAu0g+7N5JGFJkaAtBwIhANUTUH0YCymWMOb7B51uN9J54RqboJkQZ/mdbaXSJ9vE"}]},"_npmUser":{"name":"capitalforlife","email":"jared.foy+capital@armstrong.so"},"directories":{},"maintainers":[{"name":"capitalforlife","email":"jared.foy+capital@armstrong.so"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/lovable-export_1.1.0_1770329615107_0.8152856942658882"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-04T20:37:09.445Z","modified":"2026-02-05T22:13:35.417Z","1.0.0":"2026-02-04T20:37:09.819Z","1.0.1":"2026-02-04T20:41:09.242Z","1.0.2":"2026-02-04T21:04:06.277Z","1.1.0":"2026-02-05T22:13:35.283Z"},"description":"A React component library for exporting Lovable.dev pages as static HTML and uploading them to a proxy server.","maintainers":[{"name":"capitalforlife","email":"jared.foy+capital@armstrong.so"}],"readme":"# @capitalforlife/lovable-export\n\nA React component library for exporting Lovable.dev pages as static HTML and uploading them to a proxy server.\n\n## Installation\n\n```bash\nnpm install @capitalforlife/lovable-export\n```\n\nor\n\n```bash\npnpm add @capitalforlife/lovable-export\n```\n\n## Quick Start\n\nThere are three ways to configure the export functionality:\n\n### Option 1: Direct Props (Simplest)\n\nPass configuration directly to the ExportButton component:\n\n```tsx\nimport { Toaster } from \"@/components/ui/toaster\";\nimport { Toaster as Sonner } from \"@/components/ui/sonner\";\nimport { TooltipProvider } from \"@/components/ui/tooltip\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { BrowserRouter, Routes, Route } from \"react-router-dom\";\nimport { ExportButton } from '@capitalforlife/lovable-export'\nimport '@capitalforlife/lovable-export/styles.css'\nimport Index from \"./pages/Index\";\nimport NotFound from \"./pages/NotFound\";\n\nconst queryClient = new QueryClient();\n\nconst App = () => (\n  <QueryClientProvider client={queryClient}>\n    <TooltipProvider>\n      <Toaster />\n      <Sonner />\n      <BrowserRouter>\n        <Routes>\n          <Route path=\"/\" element={<Index />} />\n          <Route path=\"*\" element={<NotFound />} />\n        </Routes>\n      </BrowserRouter>\n      <ExportButton\n        proxyUrl=\"https://your-proxy.com\"\n        authPassword=\"your-admin-password\"\n        defaultSlug=\"my-page\"\n      />\n    </TooltipProvider>\n  </QueryClientProvider>\n);\n\nexport default App;\n```\n\n### Option 2: Environment Variables\n\nConfigure via Vite environment variables:\n\n```env\n# .env or .env.local\nVITE_PROXY_URL=https://your-proxy.com\nVITE_ADMIN_PASSWORD=your-admin-password\n```\n\n```tsx\nimport { Toaster } from \"@/components/ui/toaster\";\nimport { Toaster as Sonner } from \"@/components/ui/sonner\";\nimport { TooltipProvider } from \"@/components/ui/tooltip\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { BrowserRouter, Routes, Route } from \"react-router-dom\";\nimport { ExportButton } from '@capitalforlife/lovable-export'\nimport '@capitalforlife/lovable-export/styles.css'\nimport Index from \"./pages/Index\";\nimport NotFound from \"./pages/NotFound\";\n\nconst queryClient = new QueryClient();\n\nconst App = () => (\n  <QueryClientProvider client={queryClient}>\n    <TooltipProvider>\n      <Toaster />\n      <Sonner />\n      <BrowserRouter>\n        <Routes>\n          <Route path=\"/\" element={<Index />} />\n          <Route path=\"*\" element={<NotFound />} />\n        </Routes>\n      </BrowserRouter>\n      {/* No props needed - reads from env vars */}\n      <ExportButton defaultSlug=\"my-page\" />\n    </TooltipProvider>\n  </QueryClientProvider>\n);\n\nexport default App;\n```\n\n### Option 3: React Context Provider\n\nWrap your app with ExportProvider for centralized configuration:\n\n```tsx\nimport { Toaster } from \"@/components/ui/toaster\";\nimport { Toaster as Sonner } from \"@/components/ui/sonner\";\nimport { TooltipProvider } from \"@/components/ui/tooltip\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { BrowserRouter, Routes, Route } from \"react-router-dom\";\nimport { ExportProvider, ExportButton } from '@capitalforlife/lovable-export'\nimport '@capitalforlife/lovable-export/styles.css'\nimport Index from \"./pages/Index\";\nimport NotFound from \"./pages/NotFound\";\n\nconst queryClient = new QueryClient();\n\nconst App = () => (\n  <QueryClientProvider client={queryClient}>\n    <ExportProvider\n      proxyUrl=\"https://your-proxy.com\"\n      authPassword=\"your-admin-password\"\n    >\n      <TooltipProvider>\n        <Toaster />\n        <Sonner />\n        <BrowserRouter>\n          <Routes>\n            <Route path=\"/\" element={<Index />} />\n            <Route path=\"*\" element={<NotFound />} />\n          </Routes>\n        </BrowserRouter>\n        <ExportButton defaultSlug=\"my-page\" />\n      </TooltipProvider>\n    </ExportProvider>\n  </QueryClientProvider>\n);\n\nexport default App;\n```\n\n## API Reference\n\n### ExportButton\n\nA floating button component that opens an export modal.\n\n#### Props\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| `defaultSlug` | `string` | `''` | Pre-filled slug for the export |\n| `defaultTitle` | `string` | `''` | Pre-filled title (falls back to `document.title`) |\n| `defaultDescription` | `string` | `''` | Pre-filled description for SEO |\n| `position` | `'bottom-right' \\| 'bottom-left' \\| 'top-right' \\| 'top-left'` | `'bottom-right'` | Button position |\n| `proxyUrl` | `string` | From context or env | URL of the proxy server |\n| `authPassword` | `string` | From context or env | Admin password for uploads |\n\n### ExportProvider\n\nReact context provider for centralized configuration.\n\n#### Props\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| `proxyUrl` | `string` | Yes | URL of the proxy server |\n| `authPassword` | `string` | Yes | Admin password for uploads |\n| `children` | `ReactNode` | Yes | Child components |\n\n### useExport Hook\n\nFor building custom export UIs.\n\n```tsx\nimport { useExport } from '@capitalforlife/lovable-export'\n\nfunction CustomExporter() {\n  const {\n    status,       // 'idle' | 'exporting' | 'uploading' | 'success' | 'error'\n    message,      // Status message string\n    handleDownload,  // (slug, title?, description?) => Promise<void>\n    handleUpload,    // (slug, title?, description?) => Promise<void>\n    createExportZip  // (options?) => Promise<Blob>\n  } = useExport({\n    proxyUrl: 'https://your-proxy.com',\n    authPassword: 'your-password'\n  })\n\n  return (\n    <button onClick={() => handleDownload('my-slug')}>\n      Export to ZIP\n    </button>\n  )\n}\n```\n\n### useConfig Hook\n\nGet resolved configuration (props > context > env vars).\n\n```tsx\nimport { useConfig } from '@capitalforlife/lovable-export'\n\nfunction MyComponent() {\n  const config = useConfig({\n    proxyUrl: 'optional-override',\n    authPassword: 'optional-override'\n  })\n\n  console.log(config.proxyUrl, config.authPassword)\n}\n```\n\n### Utility Functions\n\n#### createExportZip\n\nCreate a ZIP blob from the current page.\n\n```tsx\nimport { createExportZip } from '@capitalforlife/lovable-export'\n\nconst zipBlob = await createExportZip({\n  title: 'My Page Title',\n  description: 'Page description for SEO'\n})\n```\n\n#### uploadExport\n\nUpload a ZIP to the proxy server.\n\n```tsx\nimport { uploadExport } from '@capitalforlife/lovable-export'\n\nconst result = await uploadExport({\n  zipBlob,\n  slug: 'my-page',\n  title: 'My Page',\n  description: 'Description',\n  config: { proxyUrl: '...', authPassword: '...' },\n  replace: true\n})\n```\n\n## Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| `VITE_PROXY_URL` | URL of your proxy server (e.g., `https://your-domain.com`) |\n| `VITE_ADMIN_PASSWORD` | Admin password for authenticated uploads |\n\n## Configuration Priority\n\nThe library resolves configuration in this order (highest priority first):\n\n1. **Props** - Values passed directly to components\n2. **Context** - Values from `ExportProvider`\n3. **Environment Variables** - `VITE_PROXY_URL` and `VITE_ADMIN_PASSWORD`\n4. **Defaults** - `http://localhost:3000` for proxy URL, empty string for password\n\n## Styling\n\nImport the CSS file in your application:\n\n```tsx\nimport '@capitalforlife/lovable-export/styles.css'\n```\n\n### CSS Custom Properties\n\nCustomize the appearance using CSS custom properties:\n\n```css\n:root {\n  --lovable-export-primary: #2563eb;\n  --lovable-export-primary-hover: #1d4ed8;\n  --lovable-export-bg: #ffffff;\n  --lovable-export-text: #1f2937;\n  --lovable-export-border: #e5e7eb;\n  /* See input.css for all available properties */\n}\n```\n\n## TypeScript Types\n\n```tsx\nimport type {\n  ExportButtonProps,\n  ExportConfig,\n  ExportResult,\n  UploadResult,\n  ExportStatus\n} from '@capitalforlife/lovable-export'\n```\n\n## Troubleshooting\n\n### Export button not appearing\n\nMake sure you've imported the CSS file:\n```tsx\nimport '@capitalforlife/lovable-export/styles.css'\n```\n\n### Upload fails with 401 error\n\nCheck that your `authPassword` matches the `ADMIN_PASSWORD` configured on your proxy server.\n\n### Assets not loading in exported page\n\nThe export utility automatically converts absolute paths to relative paths. However, external CDN resources are preserved. Ensure all local assets use relative paths (`./assets/...` not `/assets/...`).\n\n### Page validation warnings\n\nThe export utility checks for:\n- Absolute paths that may not work after export\n- Missing `<title>` tag\n\nAddress these warnings to ensure the exported page works correctly.\n\n## Peer Dependencies\n\nThis package requires:\n- `react` >= 18.0.0\n- `react-dom` >= 18.0.0\n\n## License\n\nMIT\n","readmeFilename":"README.md"}