1import{j as e}from"./vendor-react-BoyrKzsG.js";import{A as i}from"./AdminLayout-UtVj2u1H.js";import{a0 as s,Z as t,I as r,a1 as l}from"./vendor-ui-Cy9YOY35.js";import"./index-CKCEYSTE.js";import"./vendor-firebase-DbFCdLkQ.js";const x=()=>e.jsxs(i,{title:"System Limits & Billing",children:[e.jsx("div",{className:"admin-controls",style:{marginBottom:"24px"},children:e.jsxs("p",{style:{color:"#6b7280"},children:["Information about Firebase quotas, Blaze plan pricing (2025), and system optimizations.",e.jsx("br",{}),e.jsx("a",{href:"https://firebase.google.com/pricing",target:"_blank",rel:"noopener noreferrer",style:{color:"#2563eb",textDecoration:"underline",marginTop:"8px",display:"inline-block"},children:"View Official Firebase Pricing Page â"})]})}),e.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(450px, 1fr))",gap:"24px"},children:[e.jsxs("div",{className:"admin-section",style:{borderLeft:"4px solid #10b981"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"10px",marginBottom:"16px"},children:[e.jsx(s,{color:"#10b981"}),e.jsx("h3",{style:{margin:0},children:"Daily Free Quota (Spark & Blaze)"})]}),e.jsxs("p",{style:{fontSize:"0.85rem",color:"#666",marginBottom:"16px"},children:["These limits apply to ",e.jsx("b",{children:"both"})," Spark and Blaze plans. You are only charged after exceeding these."]}),e.jsxs("table",{style:{width:"100%",fontSize:"0.9rem",borderCollapse:"collapse"},children:[e.jsx("thead",{children:e.jsxs("tr",{style:{borderBottom:"1px solid #eee",textAlign:"left"},children:[e.jsx("th",{style:{padding:"8px 0"},children:"Resource"}),e.jsx("th",{style:{padding:"8px 0"},children:"Daily Free Limit"})]})}),e.jsxs("tbody",{children:[e.jsxs("tr",{children:[e.jsx("td",{style:{padding:"12px 0"},children:"Document Reads"}),e.jsx("td",{style:{fontWeight:"600"},children:"50,000"})]}),e.jsxs("tr",{children:[e.jsx("td",{style:{padding:"12px 0"},children:"Document Writes"}),e.jsx("td",{style:{fontWeight:"600"},children:"20,000"})]}),e.jsxs("tr",{children:[e.jsx("td",{style:{padding:"12px 0"},children:"Document Deletes"}),e.jsx("td",{style:{fontWeight:"600"},children:"20,000"})]}),e.jsxs("tr",{children:[e.jsx("td",{style:{padding:"12px 0"},children:"Storage"}),e.jsx("td",{style:{fontWeight:"600"},children:"1 GiB (Total)"})]})]})]})]}),e.jsxs("div",{className:"admin-section",style:{borderLeft:"4px solid #f59e0b"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"10px",marginBottom:"16px"},children:[e.jsx(t,{color:"#f59e0b",fill:"#f59e0b"}),e.jsx("h3",{style:{margin:0},children:"Blaze Plan Pricing (Post-Quota)"})]}),e.jsx("p",{style:{fontSize:"0.85rem",color:"#666",marginBottom:"16px"},children:"Rates applied only after you exceed the daily free limits."}),e.jsxs("table",{style:{width:"100%",fontSize:"0.9rem",borderCollapse:"collapse"},children:[e.jsx("thead",{children:e.jsxs("tr",{style:{borderBottom:"1px solid #eee",textAlign:"left"},children:[e.jsx("th",{style:{padding:"8px 0"},children:"Operation"}),e.jsx("th",{style:{padding:"8px 0"},children:"Rate (per 100k)"})]})}),e.jsxs("tbody",{children:[e.jsxs("tr",{children:[e.jsx("td",{style:{padding:"12px 0"},children:"Firestore Reads"}),e.jsx("td",{style:{fontWeight:"600"},children:"$0.06"})]}),e.jsxs("tr",{children:[e.jsx("td",{style:{padding:"12px 0"},children:"Firestore Writes"}),e.jsx("td",{style:{fontWeight:"600"},children:"$0.18"})]}),e.jsxs("tr",{children:[e.jsx("td",{style:{padding:"12px 0"},children:"Firestore Deletes"}),e.jsx("td",{style:{fontWeight:"600"},children:"$0.02"})]}),e.jsxs("tr",{children:[e.jsx("td",{style:{padding:"12px 0"},children:"TTL Deletes"}),e.jsx("td",{style:{fontWeight:"600"},children:"$0.02*"})]})]})]}),e.jsx("p",{style:{fontSize:"0.75rem",color:"#999",marginTop:"12px"},children:"* TTL deletes count towards your deletion quota. If you are on the Spark plan, TTL is unavailable."})]}),e.jsxs("div",{className:"admin-section",style:{borderLeft:"4px solid #3b82f6",gridColumn:"1 / -1"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"10px",marginBottom:"16
1px"},children:[e.jsx(r,{color:"#3b82f6"}),e.jsx("h3",{style:{margin:0},children:"System Efficiency & Cost Optimization"})]}),e.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(300px, 1fr))",gap:"20px"},children:[e.jsxs("div",{style:{padding:"16px",borderRadius:"8px",background:"#f8fafc",border:"1px solid #e2e8f0"},children:[e.jsx("h4",{style:{margin:"0 0 8px 0",color:"#1e40af"},children:"Aggregated Counting"}),e.jsxs("p",{style:{margin:0,fontSize:"0.85rem"},children:["We use ",e.jsx("code",{children:"getCountFromServer()"})," for dashboard stats. This costs ",e.jsx("b",{children:"1 read per 1,000 documents"}),", making it 1,000x cheaper than standard listing."]})]}),e.jsxs("div",{style:{padding:"16px",borderRadius:"8px",background:"#f8fafc",border:"1px solid #e2e8f0"},children:[e.jsx("h4",{style:{margin:"0 0 8px 0",color:"#1e40af"},children:"Guest Retention (3 Days)"}),e.jsx("p",{style:{margin:0,fontSize:"0.85rem"},children:'Reduced from 7 to 3 days to minimize storage costs and keep the "Users" list clean.'})]}),e.jsxs("div",{style:{padding:"16px",borderRadius:"8px",background:"#f8fafc",border:"1px solid #e2e8f0"},children:[e.jsx("h4",{style:{margin:"0 0 8px 0",color:"#1e40af"},children:"Optimization Pro-Tip"}),e.jsxs("p",{style:{margin:0,fontSize:"0.85rem"},children:["By default, Firestore indexes ",e.jsx("i",{children:"every"}),` field. To save storage, add "Single Field Index Exemptions" in Firebase Console for large text fields (like 'bio' or 'notes') that you don't filter by.`]})]})]})]}),e.jsxs("div",{className:"admin-section",style:{borderLeft:"4px solid #ef4444",gridColumn:"1 / -1",background:"#fff1f2"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"10px",marginBottom:"12px"},children:[e.jsx(l,{color:"#ef4444"}),e.jsx("h3",{style:{margin:0,color:"#991b1b"},children:"Critical Billing Awareness"})]}),e.jsxs("ul",{style:{margin:0,paddingLeft:"20px",fontSize:"0.9rem",color:"#7f1d1d"},children:[e.jsxs("li",{children:[e.jsx("b",{children:"Realtime Listeners:"}),' Each update to a document you are "listening" to counts as a read.']}),e.jsxs("li",{children:[e.jsx("b",{children:"Indexing:"})," Each index entry consumes ",e.jsx("b",{children:"storage space"}),". Having 20 indexes means every document write updates 20 index entries, increasing your storage bill (not your write quota)."]}),e.jsxs("li",{children:[e.jsx("b",{children:"Manual Wipe:"})," Wiping 10,000 users manually in the dashboard costs 10,000 delete operations ($0.002)."]})]})]})]})]});export{x as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.