{"compiledCode":"\"use strict\";Object.defineProperty(exports, \"__esModule\", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _react = require('react'); var _react2 = _interopRequireDefault(_react);\n\n// Two-proportion sample size: runs per prompt in each of the two periods being compared, at 80% power.\nconst Z_CONFIDENCE = { \"90\": 1.6449, \"95\": 1.96, \"99\": 2.5758 };\nconst Z_POWER_80 = 0.8416;\nconst MAX_SENSIBLE_RUNS = 1000;\n\nfunction runsPerPrompt(p1, delta, zA) {\n  const p2 = p1 + delta <= 0.99 ? p1 + delta : p1 - delta;\n  if (delta <= 0 || p2 < 0.01 || p2 > 0.99) return null;\n  const pBar = (p1 + p2) / 2;\n  const top = zA * Math.sqrt(2 * pBar * (1 - pBar)) + Z_POWER_80 * Math.sqrt(p1 * (1 - p1) + p2 * (1 - p2));\n  return Math.ceil((top * top) / (delta * delta));\n}\n\nfunction smallestDetectable(p1, budget, zA) {\n  const maxDelta = Math.max(0.99 - p1, p1 - 0.01);\n  const atMax = runsPerPrompt(p1, maxDelta, zA);\n  if (atMax === null || atMax > budget) return null;\n  let lo = 0.0005, hi = maxDelta;\n  for (let i = 0; i < 60; i++) {\n    const mid = (lo + hi) / 2;\n    const n = runsPerPrompt(p1, mid, zA);\n    if (n !== null && n <= budget) hi = mid; else lo = mid;\n  }\n  return hi;\n}\n\nfunction readNumber(raw) {\n  if (raw.trim() === \"\") return null;\n  const n = Number(raw);\n  return Number.isFinite(n) ? n : null;\n}\n\n\n\nfunction calculate(v) {\n  const base = readNumber(v.base), change = readNumber(v.change), prompts = readNumber(v.prompts), models = readNumber(v.models), cadence = readNumber(v.cadence), budget = readNumber(v.budget);\n  if (base === null || base < 1 || base > 99) return { error: \"Enter a baseline appearance rate between 1 and 99 percent.\" };\n  if (change === null || change <= 0 || change >= 98) return { error: \"Enter a detectable change greater than 0 and below 98 percentage points.\" };\n  if (prompts === null || prompts < 1 || !Number.isInteger(prompts) || prompts > 10000) return { error: \"Enter a whole number of prompts from 1 to 10,000.\" };\n  if (models === null || models < 1 || !Number.isInteger(models) || models > 50) return { error: \"Enter a whole number of models from 1 to 50.\" };\n  if (cadence === null || cadence < 1 || !Number.isInteger(cadence) || cadence > 365) return { error: \"Enter how many measurement periods you run per year, from 1 to 365.\" };\n  const zA = _nullishCoalesce(Z_CONFIDENCE[v.confidence], () => ( 1.96));\n  const n = runsPerPrompt(base / 100, change / 100, zA);\n  if (n === null) return { error: \"That change takes the appearance rate outside 1 to 99 percent. Enter a smaller change.\" };\n  const validBudget = budget !== null && budget >= 1 && Number.isInteger(budget) && budget <= 1000000 ? budget : null;\n  return { n, perPeriod: n * prompts * models, perYear: n * prompts * models * cadence, tooLarge: n > MAX_SENSIBLE_RUNS, minDelta: validBudget === null ? null : smallestDetectable(base / 100, validBudget, zA), budget: validBudget };\n}\n\nconst FORMULA_TEXT = \"n = [z(confidence) × √(2·p̄(1−p̄)) + z(power) × √(p1(1−p1) + p2(1−p2))]² ÷ (p2 − p1)², where p1 is the baseline rate, p2 is the baseline plus the change, p̄ is their average, and power is fixed at 80%.\";\nconst ASSUMPTION_TEXT = \"Assumes independent runs, an unchanged model, a fixed prompt set, a yes-or-no appearance outcome per answer, and a comparison between two measurement periods of equal size. No other adjustment is applied.\";\nconst fmt = (x) => x.toLocaleString(\"en-US\");\n\nconst CALC_FIELDS = [\n  { key: \"base\", label: \"Baseline appearance rate (%)\", hint: \"How often the brand is named now, roughly.\" },\n  { key: \"change\", label: \"Detectable change (percentage points)\", hint: \"The smallest shift that would change a decision.\" },\n  { key: \"prompts\", label: \"Prompts in your set\", hint: \"Distinct prompts, before phrasing variants.\" },\n  { key: \"models\", label: \"Models in your roster\", hint: \"Each assistant you query.\" },\n  { key: \"cadence\", label: \"Measurement periods per year\", hint: \"12 for monthly, 4 for quarterly.\" },\n  { key: \"budget\", label: \"Runs per prompt you can afford (optional)\", hint: \"Works backwards to the smallest detectable change.\" },\n];\n\nfunction SampleSizeCalculator() {\n  const [v, setV] = _react2.default.useState({ base: \"30\", change: \"10\", prompts: \"20\", models: \"3\", cadence: \"12\", budget: \"\", confidence: \"95\" });\n  const r = calculate(v);\n  const set = (key) => (e) => setV((prev) => ({ ...prev, [key]: e.target.value }));\n  return (\n    _react2.default.createElement('section', { 'aria-labelledby': \"rr-calc-title\", className: \"rr-calc\",}\n      , _react2.default.createElement('style', null, \".np-rankrift .rr-calc-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:16px 20px;margin:12px 0 20px}.np-rankrift .rr-calc label{display:block;font-weight:600;font-size:15px;margin-bottom:4px}.np-rankrift .rr-calc input,.np-rankrift .rr-calc select{width:100%;padding:10px 12px;border:1px solid #6b7280;background:#fff;color:#1a1f2b}.np-rankrift .rr-calc .rr-hint{font-size:14px;margin:4px 0 0!important;color:#3b4250!important}.np-rankrift .rr-calc-out{background:#f2f3fb;border-left:4px solid #3d3f8c;padding:14px 18px;border-radius:6px;color:#1a1f2b}.np-rankrift .rr-calc-out p{margin:0 0 8px!important}\")\n      , _react2.default.createElement('h2', { id: \"rr-calc-title\",}, \"Size your runs\"  )\n      , _react2.default.createElement('div', { className: \"rr-calc-grid\",}\n        , CALC_FIELDS.map((f) => (\n          _react2.default.createElement('div', { key: f.key,}\n            , _react2.default.createElement('label', { htmlFor: \"rr-\" + f.key,}, f.label)\n            , _react2.default.createElement('input', { id: \"rr-\" + f.key, type: \"number\", inputMode: \"decimal\", value: v[f.key], onChange: set(f.key), 'aria-describedby': \"rr-\" + f.key + \"-hint\",} )\n            , _react2.default.createElement('p', { className: \"rr-hint\", id: \"rr-\" + f.key + \"-hint\",}, f.hint)\n          )\n        ))\n        , _react2.default.createElement('div', null\n          , _react2.default.createElement('label', { htmlFor: \"rr-confidence\",}, \"Confidence level\" )\n          , _react2.default.createElement('select', { id: \"rr-confidence\", value: v.confidence, onChange: set(\"confidence\"),}\n            , _react2.default.createElement('option', { value: \"90\",}, \"90%\")\n            , _react2.default.createElement('option', { value: \"95\",}, \"95%\")\n            , _react2.default.createElement('option', { value: \"99\",}, \"99%\")\n          )\n        )\n      )\n      , _react2.default.createElement('div', { className: \"rr-calc-out\", 'aria-live': \"polite\",}\n        , \"error\" in r ? _react2.default.createElement('p', null, r.error) : (\n          _react2.default.createElement(_react2.default.Fragment, null\n            , _react2.default.createElement('p', null, _react2.default.createElement('strong', null, fmt(r.n), \" runs per prompt\"   ), \" in each measurement period.\"    )\n            , _react2.default.createElement('p', null, fmt(r.perPeriod), \" runs per period across your prompts and models, and \"          , fmt(r.perYear), \" API calls a year at your cadence. Price the call volume against your providers' current published rates.\"                 )\n            , r.tooLarge ? _react2.default.createElement('p', null, \"Warning: more than \"   , fmt(MAX_SENSIBLE_RUNS), \" runs per prompt per period. Consider a larger detectable change, fewer prompts or models, or a longer cadence.\"                  ) : null\n            , r.budget !== null ? _react2.default.createElement('p', null, r.minDelta === null ? \"With \" + fmt(r.budget) + \" runs per prompt, no change within the 1 to 99 percent range can be detected reliably.\" : \"With \" + fmt(r.budget) + \" runs per prompt, the smallest change you could reliably detect is about \" + (r.minDelta * 100).toFixed(1) + \" percentage points.\") : null\n          )\n        )\n      )\n      , _react2.default.createElement('p', null, _react2.default.createElement('strong', null, \"Formula:\"), \" \" , FORMULA_TEXT)\n      , _react2.default.createElement('p', null, _react2.default.createElement('strong', null, \"Assumptions:\"), \" \" , ASSUMPTION_TEXT)\n    )\n  );\n}\n\n\n function CalculatorPage() {\n  const d = {\"h1\":\"Sample-size and confidence calculator\",\"intro\":\"Work out how many runs per prompt you need to detect a change of a given size at a given confidence, and what that costs in API calls, before you spend a budget on a measurement that could never have proved anything.\",\"primaryCtas\":[{\"label\":\"Read the sampling method\",\"href\":\"/methodology\"},{\"label\":\"Learn the measurement basics first\",\"href\":\"/measure\"}],\"notice\":\"The calculator shows its assumptions and its formula on screen. If a tool will not tell you what it assumed, do not trust the number it gives you.\",\"inShort\":\"This calculator answers one question: how many times do you need to run each prompt before a difference you observe means anything. You give it the change you want to be able to detect, the confidence you want in that detection, and roughly how often the brand currently appears. It returns the runs required per prompt, the total runs across your prompt set and model roster, and the resulting number of API calls so you can price the exercise before committing. It is client-side, it shows the assumptions it made, and it will tell you when your target is unaffordable rather than quietly rounding it down.\",\"whoFor\":[\"In-house SEO leads scoping a measurement programme before asking for budget\",\"Agency strategists pricing recurring client measurement across several brands and categories\",\"Analytics and RevOps people checking whether a proposed test could ever have detected the effect it claims to look for\",\"Anyone about to buy a tracking tool who wants to know what sample volume the plan actually implies\",\"Anyone who ran a prompt three times, got three answers, and wants to know how many times is enough\"],\"whenToUse\":[\"Before a first measurement run, so you size it rather than guess it\",\"Before promising leadership you can detect a specific improvement by a specific date\",\"When a figure moved and you want to know whether your sample could have resolved a move that size\",\"When comparing measurement plans or tool tiers on cost per meaningful result\"],\"sections\":[{\"heading\":\"Why sample size matters here more than in normal reporting\",\"paragraphs\":[\"Most marketing metrics are counts of things that already happened. Sessions, signups, orders. You do not sample them, you total them. AI visibility is not like that. An assistant's answer is generated fresh each time, and the same question asked twice can name a different set of brands. So what you have is not a total, it is a sample drawn from a process, and every figure you compute from it is an estimate that would come out somewhat differently if you ran it again.\",\"That has a blunt consequence. If you run each prompt a handful of times, the natural wobble in your estimate can easily be larger than the change you are trying to detect. You will see movement every month, and none of it will mean anything. The number of runs is what sets the size of change your programme is physically capable of noticing.\",\"The uncomfortable version: if you have not sized your runs, you do not know whether your report is measuring your work or measuring noise, and neither does anyone reading it.\"],\"bullets\":[{\"text\":\"How many samples do you need, in plain English\",\"href\":\"/blog/how-many-samples-do-you-need\"},{\"text\":\"Telling a real change from noise\",\"href\":\"/blog/variance-and-noise\"},{\"text\":\"Why two people asking the same question get different brands\",\"href\":\"/blog/why-ai-answers-vary-between-people\"}]},{\"heading\":\"What the calculator computes\",\"paragraphs\":[\"It works in both directions, because the two questions people actually have are different sides of the same arithmetic.\",\"Forwards: given the change you want to detect and the confidence you want, how many runs per prompt does that require, and what does the whole programme cost in API calls once you multiply by your prompt count, your model roster, and your reporting cadence.\",\"Backwards: given the run budget you already have, what is the smallest change that budget could reliably detect. This is the more useful direction for most people, and often the more sobering one.\"],\"bullets\":[{\"text\":\"Runs required per prompt for your target detectable change and confidence level\"},{\"text\":\"Total runs across your prompt set, model roster, and cadence\"},{\"text\":\"Resulting API call volume, so cost can be estimated against your providers' own current rates\"},{\"text\":\"The smallest change your existing budget could detect, if you work backwards\"},{\"text\":\"A clear warning when the target you entered is not achievable at any sensible cost\"}]},{\"heading\":\"The inputs, and how to choose them\",\"paragraphs\":[\"Every input is a judgement call, and changing one at a time in the calculator shows how sensitive the answer is to it. Two of them dominate the result.\",\"The detectable change is the big one. Halving the change you want to detect increases the runs required far more than proportionally, which is why \\\"we want to catch any movement\\\" is not a specification and cannot be costed. Pick a change size that would actually alter a decision, and size for that.\"],\"bullets\":[{\"text\":\"Baseline appearance rate: roughly how often the brand is currently named. A first small run or the manual snapshot is enough to estimate this.\",\"href\":\"/check\"},{\"text\":\"Detectable change: the smallest difference you need to be able to see. Choose the size that would change what you do.\"},{\"text\":\"Confidence level: how sure you want to be that an observed difference is not just run-to-run variation.\"},{\"text\":\"Prompts in your set: the number of distinct prompts you will run, before phrasing variants.\",\"href\":\"/competitive/prompt-sets\"},{\"text\":\"Models in your roster: each assistant you query multiplies the run count.\"},{\"text\":\"Cadence: how often you repeat the programme, which turns a one-off number into a recurring cost.\"}],\"note\":\"Illustrative only: if you enter a low baseline appearance rate and ask to detect a very small change at high confidence, expect the tool to return a run count large enough that you will want to reconsider the target. That behaviour is the tool working.\"},{\"heading\":\"How to read the output\",\"paragraphs\":[\"The headline figure is runs per prompt. Multiply it out and you get the programme's true size, which is usually larger than people expect because the model roster and the cadence both multiply rather than add.\",\"If the number is affordable, size for it and freeze your prompt set before you start. If it is not, you have three honest options and one dishonest one. The honest ones: accept a larger detectable change, cut the prompt set or model roster to concentrate your runs, or lengthen the cadence so each report covers more accumulated data. The dishonest one is running the small sample anyway and reporting the point estimates as though they were solid.\",\"One thing the output does not do is tell you a result is real. It tells you what your design is capable of resolving. A well-sized run can still produce an ambiguous answer, and that answer is still worth reporting as ambiguous.\"],\"bullets\":[{\"text\":\"Setting a baseline you can defend six months later\",\"href\":\"/blog/defensible-baseline\"},{\"text\":\"Presenting uncertainty without losing the room\",\"href\":\"/blog/presenting-uncertainty\"}]},{\"heading\":\"The assumptions, shown on screen\",\"paragraphs\":[\"The calculator prints its assumptions next to the result rather than burying them, because a sample-size figure without its assumptions is false precision. If any of the following does not hold for your situation, treat the output as an approximation and widen your own expectations accordingly.\",\"We would rather you distrust the output for the right reason than trust it for the wrong one.\"],\"bullets\":[{\"text\":\"It treats each run as an independent draw. Caching, session reuse, or a provider serving a stable response will violate this and make your effective sample smaller than your run count.\"},{\"text\":\"It assumes the underlying model does not change mid-programme. A version update during your window is a confounder no sample size fixes.\",\"href\":\"/methodology\"},{\"text\":\"It treats appearance as a binary outcome per answer. Framing and position are richer signals that need their own handling.\"},{\"text\":\"It assumes your prompt set is fixed for the duration. Editing prompts mid-programme breaks the comparison the sample size was calculated for.\"},{\"text\":\"It applies no hidden adjustment factors. The formula in use is shown alongside the result so you can check the arithmetic yourself.\"},{\"text\":\"Cost is expressed in API call volume, not currency. Rates change and vary by provider, so price it against your own providers' current published rates.\"}]},{\"heading\":\"When this is the wrong instrument\",\"paragraphs\":[\"A sample-size calculator answers a narrow question well and several adjacent questions not at all. If your real problem is on this list, sizing runs will not help you.\",\"Sizing is also the wrong first move when your prompt set is not settled. A perfectly powered run against prompts your buyers would never ask is a precise measurement of the wrong thing.\"],\"bullets\":[{\"text\":\"You do not yet know whether you appear at all. Get a rough reading first, then size.\",\"href\":\"/check\"},{\"text\":\"Your prompt set is still being argued about. Fix the questions before sizing the runs.\",\"href\":\"/blog/build-a-prompt-set\"},{\"text\":\"You want to know why a figure moved. Sizing detects change; it never explains it.\",\"href\":\"/blog/causal-claims\"},{\"text\":\"You need to attribute revenue to AI visibility. Different problem, different discipline.\",\"href\":\"/reporting\"},{\"text\":\"An assistant is saying something false about your brand. That is an incident to correct, not a quantity to sample.\",\"href\":\"/risk\"},{\"text\":\"You are choosing between measurement approaches entirely. Start with whether you need a tool at all.\",\"href\":\"/blog/build-buy-or-spreadsheet\"}],\"note\":\"This page claims no specialist review. Before using the result for a consequential decision, record the formula, assumptions, method version, reviewer identity, review scope, and review date; otherwise keep the interpretation within the stated assumptions.\"}],\"related\":[{\"label\":\"How to measure AI visibility without fooling yourself\",\"href\":\"/measure\"},{\"label\":\"The measurement methodology\",\"href\":\"/methodology\"},{\"label\":\"How many samples do you need\",\"href\":\"/blog/how-many-samples-do-you-need\"},{\"label\":\"Reading variance and telling change from noise\",\"href\":\"/blog/variance-and-noise\"},{\"label\":\"Prompt-set library by category\",\"href\":\"/competitive/prompt-sets\"},{\"label\":\"Manual AI visibility snapshot\",\"href\":\"/check\"}],\"faqs\":[{\"q\":\"Why can't you just tell me a good default number of runs?\",\"a\":\"Because the right number depends almost entirely on two things this page cannot know: how often your brand currently appears, and how small a change you need to notice. A brand named in most answers and a brand named in a handful need very different run counts to resolve the same sized shift. Any universal rule of thumb would be over-sized for some readers and useless for others, so the tool asks instead of guessing.\"},{\"q\":\"Does running the same prompt many times just give me the same answer repeatedly?\",\"a\":\"Not usually, and where it does, that is itself worth knowing. Assistant output is generated rather than retrieved from a fixed list, so repeats vary. But caching, sticky sessions, or a provider serving a stable response will reduce the real variation, which makes your effective sample smaller than your run count. The calculator assumes independent draws, so it flags this as an assumption to check on your own setup.\"},{\"q\":\"How do I estimate the baseline appearance rate before I have measured anything?\",\"a\":\"Run a small exploratory batch, or the manual snapshot, and take the resulting rate as a rough input. It does not need to be accurate, it needs to be in the right region, because the run count is not very sensitive to small errors in the baseline. If you are genuinely unsure, enter a range of plausible values and size for the one that demands the most runs.\"},{\"q\":\"The calculator says I need more runs than I can afford. Now what?\",\"a\":\"Three legitimate moves. Widen the change you are trying to detect, because catching a large shift is far cheaper than catching a small one. Narrow the programme, concentrating runs on fewer prompts or fewer assistants. Or lengthen the cadence so each report pools more accumulated data. What you should not do is run the small sample and present the point estimates as though the sample supported them.\"},{\"q\":\"Do I need to size each assistant separately?\",\"a\":\"For a per-assistant figure, yes, because each model is its own sampling problem and they do not share variance. Each assistant you add multiplies your run count rather than splitting it. If your budget only supports a pooled cross-model figure, that is a defensible choice, but say so in the reporting and do not present per-model breakdowns your sample cannot support.\"},{\"q\":\"Why is the cost shown as API calls rather than money?\",\"a\":\"Because provider rates change, differ by model, and depend on how much text each call produces, and quoting a currency figure here would be a number we could not stand behind next month. Call volume is the part that follows from your inputs and does not go stale. Take the volume, apply your own providers' current published rates, and you have a price you can actually defend internally.\"},{\"q\":\"Does a properly sized run mean my result is correct?\",\"a\":\"It means your design could resolve the change you targeted. It does not mean the measurement is right. A well-powered run against a flattering prompt set, or across a model roster that does not match where your buyers are, produces a precise answer to the wrong question. Sizing is the last step of designing a measurement, not the first, and prompt-set quality matters more than run count.\"}],\"closingCtaHeading\":\"Size it before you spend on it\",\"closingCtaText\":\"Most disappointing measurement programmes were under-powered from the day they were scoped. Fix the prompt set, size the runs, then start.\",\"closingCtas\":[{\"label\":\"Build a prompt set worth sizing\",\"href\":\"/competitive/prompt-sets\"},{\"label\":\"Read the sampling methodology\",\"href\":\"/methodology\"}]};\n  const btn = (kind) => ({\n    display: \"inline-block\",\n    padding: kind === \"primary\" ? \"11px 18px\" : \"9px 16px\",\n    margin: \"6px 10px 6px 0\",\n    borderRadius: 8,\n    textDecoration: \"none\",\n    fontWeight: 700,\n    fontSize: 15,\n    background: kind === \"primary\" ? \"#3d3f8c\" : \"transparent\",\n    color: kind === \"primary\" ? \"#ffffff\" : \"#3d3f8c\",\n    border: \"2px solid #3d3f8c\",\n  });\n  return (\n    _react2.default.createElement('div', { className: [\"np-rankrift\",\"rrpage\"].join(\" \"), 'aria-labelledby': \"rr-title\",}\n, _react2.default.createElement('style', null, \"\\n        .np-rankrift.rrpage{max-width:880px;margin:0 auto;padding:28px 20px 64px;color:#1a1f2b;\\n          font-family:var(--cdqcat5-font-body, \\\"DM Sans\\\", Arial, sans-serif);\\n          line-height:1.62;font-size:17px}\\n        .np-rankrift.rrpage h1{font-size:2rem;line-height:1.2;margin:0 0 12px}\\n        .np-rankrift.rrpage h2{font-size:1.35rem;line-height:1.3;margin:36px 0 10px}\\n        .np-rankrift.rrpage p{margin:0 0 14px}\\n        .np-rankrift.rrpage ul{margin:0 0 16px;padding-left:22px}\\n        .np-rankrift.rrpage li{margin:0 0 8px}\\n        .np-rankrift.rrpage a{color:#33368a}\\n        .np-rankrift .rr-intro{font-size:1.16rem;color:#39414f}\\n        .np-rankrift .rr-callout{background:#f2f3fb;border-left:4px solid #3d3f8c;padding:12px 16px;border-radius:6px;margin:6px 0 16px;font-size:0.98rem}\\n        .np-rankrift.rrpage details{border:1px solid #e3e5ef;border-radius:8px;padding:10px 14px;margin:0 0 10px;background:#fbfbfe}\\n        .np-rankrift.rrpage summary{cursor:pointer;font-weight:600}\\n        .np-rankrift.rrpage details p{margin:10px 0 2px}\\n        .np-rankrift .rr-ctarow{margin:16px 0 10px}\\n        @media (max-width:560px){.np-rankrift.rrpage{font-size:16px;padding:22px 16px 56px}.np-rankrift.rrpage h1{font-size:1.6rem}}\\n      \")\n\n      , _react2.default.createElement('h1', { id: \"rr-title\",}, d.h1)\n      , _react2.default.createElement('p', { className: \"rr-intro\",}, d.intro)\n      , _react2.default.createElement('div', { className: \"rr-ctarow\",}\n        , d.primaryCtas.map((c, i) => (\n          _react2.default.createElement('a', { key: i, href: c.href, style: btn(i === 0 ? \"primary\" : \"ghost\"),}, c.label)\n        ))\n      )\n\n      , d.notice ? _react2.default.createElement('div', { className: \"rr-callout\",}, d.notice) : null\n\n      , _react2.default.createElement(SampleSizeCalculator, null )\n\n      , d.inShort ? (\n        _react2.default.createElement('section', { 'aria-label': \"In short\" ,}\n          , _react2.default.createElement('h2', null, \"In short\" )\n          , _react2.default.createElement('p', null, d.inShort)\n        )\n      ) : null\n\n      , d.whoFor && d.whoFor.length ? (\n        _react2.default.createElement('section', { 'aria-label': \"Who this is for\"   ,}\n          , _react2.default.createElement('h2', null, \"Who this is for\"   )\n          , _react2.default.createElement('ul', null, d.whoFor.map((x, i) => _react2.default.createElement('li', { key: i,}, x)))\n        )\n      ) : null\n\n      , d.whenToUse && d.whenToUse.length ? (\n        _react2.default.createElement('section', { 'aria-label': \"When to use this\"   ,}\n          , _react2.default.createElement('h2', null, \"When to use this\"   )\n          , _react2.default.createElement('ul', null, d.whenToUse.map((x, i) => _react2.default.createElement('li', { key: i,}, x)))\n        )\n      ) : null\n\n      , d.sections.map((s, i) => (\n        _react2.default.createElement('section', { key: i,}\n          , _react2.default.createElement('h2', { id: s.heading.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\"),}, s.heading)\n          , (s.paragraphs || []).map((p, j) => _react2.default.createElement('p', { key: j,}, p))\n          , s.bullets && s.bullets.length ? (\n            _react2.default.createElement('ul', null\n              , s.bullets.map((b, j) => (\n                _react2.default.createElement('li', { key: j,}, b.href ? _react2.default.createElement('a', { href: b.href,}, b.text) : b.text)\n              ))\n            )\n          ) : null\n          , s.note ? _react2.default.createElement('div', { className: \"rr-callout\",}, s.note) : null\n        )\n      ))\n\n      , d.related && d.related.length ? (\n        _react2.default.createElement('section', { 'aria-label': \"Related pages\" ,}\n          , _react2.default.createElement('h2', null, \"Related pages\" )\n          , _react2.default.createElement('ul', null, d.related.map((r, i) => _react2.default.createElement('li', { key: i,}, _react2.default.createElement('a', { href: r.href,}, r.label))))\n        )\n      ) : null\n\n      , d.faqs && d.faqs.length ? (\n        _react2.default.createElement('section', { 'aria-label': \"Frequently asked questions\"  ,}\n          , _react2.default.createElement('h2', null, \"Frequently asked questions\"  )\n          , d.faqs.map((f, i) => (\n            _react2.default.createElement('details', { key: i,}\n              , _react2.default.createElement('summary', null, f.q)\n              , _react2.default.createElement('p', null, f.a)\n            )\n          ))\n        )\n      ) : null\n\n      , _react2.default.createElement('section', { 'aria-label': \"Next step\" ,}\n        , _react2.default.createElement('h2', null, d.closingCtaHeading)\n        , _react2.default.createElement('p', null, d.closingCtaText)\n        , _react2.default.createElement('div', { className: \"rr-ctarow\",}\n          , d.closingCtas.map((c, i) => (\n            _react2.default.createElement('a', { key: i, href: c.href, style: btn(i === 0 ? \"primary\" : \"ghost\"),}, c.label)\n          ))\n        )\n      )\n\n, _react2.default.createElement('style', null, \"\\n.np-rankrift{--np-paper:#eef0ef;--np-ink:#2b3439;--np-accent:#c8ccd9;box-sizing:border-box;max-width:none!important;width:100%;min-height:100vh;background:var(--np-paper)!important;color:var(--np-ink)!important;margin:0!important;padding:0 clamp(20px,5vw,72px) 72px!important;font-family:var(--cdqcat5-font-body, \\\"DM Sans\\\", Arial, sans-serif)!important;font-size:17px!important;line-height:1.75!important;overflow-wrap:anywhere}\\n.np-rankrift *{box-sizing:border-box;min-width:0}.np-rankrift>*{max-width:1080px;margin-left:auto;margin-right:auto}.np-rankrift .np-topbar{display:flex;justify-content:space-between;align-items:center;gap:24px;padding:24px 0;margin-bottom:52px;border-bottom:1px solid var(--np-ink)}.np-rankrift .np-brand{font-family:var(--cdqcat5-font-heading, \\\"Space Grotesk\\\", Arial, sans-serif);font-size:22px;letter-spacing:-.5px;text-decoration:none}.np-rankrift .np-topbar nav{display:flex;flex-wrap:wrap;gap:10px 22px}.np-rankrift .np-topbar nav a{display:inline-flex;align-items:center;min-height:44px;font-size:13px;text-decoration:none;border-bottom:1px solid transparent}.np-rankrift .np-topbar nav a:hover{border-bottom-color:currentColor}\\n.np-rankrift h1{font-family:var(--cdqcat5-font-heading, \\\"Space Grotesk\\\", Arial, sans-serif)!important;font-weight:400!important;font-size:clamp(36px,5.2vw,66px)!important;line-height:1.08!important;letter-spacing:-1.8px!important;max-width:960px;margin-top:0!important;margin-bottom:28px!important;text-wrap:balance;color:var(--np-ink)!important}.np-rankrift h2{font-family:var(--cdqcat5-font-heading, \\\"Space Grotesk\\\", Arial, sans-serif)!important;font-weight:400!important;font-size:clamp(25px,3vw,35px)!important;line-height:1.25!important;letter-spacing:-.5px!important;color:var(--np-ink)!important;margin-top:38px!important;margin-bottom:18px!important;text-wrap:balance}.np-rankrift h3{font-size:19px!important;line-height:1.4!important;color:var(--np-ink)!important;margin-top:24px!important;margin-bottom:10px!important}.np-rankrift p,.np-rankrift li{line-height:1.8!important;max-width:78ch}.np-rankrift p{margin-bottom:18px!important}.np-rankrift p,.np-rankrift li,.np-rankrift label{color:var(--np-ink)!important}.np-rankrift main,.np-rankrift article,.np-rankrift section{max-width:100%}.np-rankrift section{padding-top:8px!important;padding-bottom:24px!important;background:transparent!important}.np-rankrift section+section{border-top:1px solid color-mix(in srgb,var(--np-ink) 22%,transparent);margin-top:32px!important}.np-rankrift ul,.np-rankrift ol{padding-left:24px;max-width:78ch}.np-rankrift li{margin-bottom:10px!important}\\n.np-rankrift a{color:var(--np-ink);text-underline-offset:4px;text-decoration-thickness:1px}.np-rankrift a:hover{text-decoration:underline}.np-rankrift a:focus-visible,.np-rankrift button:focus-visible,.np-rankrift input:focus-visible,.np-rankrift select:focus-visible,.np-rankrift textarea:focus-visible,.np-rankrift summary:focus-visible{outline:3px solid var(--np-ink);outline-offset:5px}.np-rankrift button,.np-rankrift input,.np-rankrift select,.np-rankrift textarea{font:inherit;max-width:100%;min-height:44px;border-radius:3px!important}.np-rankrift button{cursor:pointer}.np-rankrift [class*=\\\"cta\\\"] a,.np-rankrift [class*=\\\"button\\\"]{min-height:44px;display:inline-flex;align-items:center;justify-content:center;padding:12px 20px!important;background:var(--np-ink)!important;color:var(--np-paper)!important;border:1px solid var(--np-ink)!important;border-radius:3px!important;text-decoration:none!important;font-size:14px!important;font-weight:600!important;white-space:normal;line-height:1.45!important}.np-rankrift details{border:1px solid color-mix(in srgb,var(--np-ink) 28%,transparent)!important;border-radius:3px!important;padding:0 18px!important;background:transparent!important;margin-bottom:12px!important}.np-rankrift summary{min-height:48px;padding:14px 0;cursor:pointer;font-weight:600;line-height:1.5}.np-rankrift details>p{padding-bottom:12px}.np-rankrift blockquote{border-left:3px solid var(--np-ink)!important;background:var(--np-accent)!important;color:var(--np-ink)!important;padding:18px 22px!important;margin:24px 0!important;max-width:78ch}.np-rankrift .np-table{width:100%;max-width:100%;overflow-x:auto;overscroll-behavior-x:contain;margin:24px 0;outline-offset:4px}.np-rankrift table{width:100%;border-collapse:collapse;font-size:15px;line-height:1.65;display:table!important;overflow:visible!important}.np-rankrift th{background:var(--np-accent)!important;color:var(--np-ink)!important;text-align:left;padding:15px!important;font-weight:600}.np-rankrift td{color:var(--np-ink)!important;background:transparent!important;padding:15px!important;border-bottom:1px solid color-mix(in srgb,var(--np-ink) 22%,transparent)!important;vertical-align:top}.np-rankrift pre{max-width:100%;overflow-x:auto;padding:20px;background:var(--np-ink)!important;color:var(--np-paper)!important;line-height:1.6;font-size:14px}.np-rankrift pre code{color:inherit!important;background:transparent!important}.np-rankrift img,.np-rankrift svg{max-width:100%;height:auto}\\n@media(max-width:680px){.np-rankrift{font-size:16px!important;padding-left:20px!important;padding-right:20px!important}.np-rankrift .np-topbar{display:block;margin-bottom:36px;padding-top:20px}.np-rankrift .np-topbar nav{margin-top:12px;gap:4px 18px}.np-rankrift h1{letter-spacing:-1px!important}.np-rankrift [style*=\\\"grid-template-columns\\\"]{grid-template-columns:minmax(0,1fr)!important}.np-rankrift [class*=\\\"cta\\\"]{flex-wrap:wrap!important;gap:12px!important}.np-rankrift .np-table table{min-width:580px}.np-rankrift th,.np-rankrift td{padding:12px!important}.np-rankrift blockquote{padding:16px!important}}\\n@media(prefers-reduced-motion:reduce){.np-rankrift *{scroll-behavior:auto!important;transition:none!important}}\\n\")\n, _react2.default.createElement('style', null, \".np-rankrift{--np-paper:var(--cdqcat5r-bg);--np-ink:var(--cdqcat5r-fg);--np-accent:var(--cdqcat5r-panel-muted);--tr-ink:var(--cdqcat5r-fg);--tr-ink-soft:var(--cdqcat5r-fg);--tr-muted:var(--cdqcat5r-muted);--tr-line:var(--cdqcat5r-border);--tr-bg:var(--cdqcat5r-bg);--tr-bg-soft:var(--cdqcat5r-panel-muted);--tr-accent:var(--cdqcat5r-link);--tr-accent-deep:var(--cdqcat5r-link);padding-top:64px!important;padding-bottom:88px!important;font-family:var(--cdqcat5-font-body)!important;background:var(--cdqcat5r-bg)!important;color:var(--cdqcat5r-fg)!important}\\n.np-rankrift h1,.np-rankrift h2,.np-rankrift h3{font-family:var(--cdqcat5-font-heading)!important;font-weight:400!important}.np-rankrift h1{max-width:22ch!important;font-size:clamp(36px,4.8vw,64px)!important;letter-spacing:-.04em!important;line-height:1.12!important}.np-rankrift h2{letter-spacing:-.025em!important}.np-rankrift h3{letter-spacing:-.015em!important}\\n.np-rankrift a{color:var(--cdqcat5r-link)!important}.np-rankrift p,.np-rankrift li{color:var(--cdqcat5r-fg)!important}.np-rankrift [class*=\\\"intro\\\"],.np-rankrift [class*=\\\"lede\\\"]{font-size:20px!important;line-height:1.7!important;max-width:64ch!important;color:var(--cdqcat5r-muted)!important}\\n.np-rankrift [class*=\\\"callout\\\"],.np-rankrift [class*=\\\"note\\\"],.np-rankrift [class*=\\\"summary\\\"],.np-rankrift [class*=\\\"card\\\"],.np-rankrift .tr-cta{background:var(--cdqcat5r-panel-muted)!important;border-color:var(--cdqcat5r-border)!important;color:var(--cdqcat5r-fg)!important;border-radius:8px!important}\\n.np-rankrift [class*=\\\"cta\\\"] a,.np-rankrift [class*=\\\"button\\\"],.np-rankrift .tr-btn{background:var(--cdqcat5r-fg)!important;color:var(--cdqcat5r-bg)!important;border-color:var(--cdqcat5r-fg)!important;min-height:48px!important}.np-rankrift [class*=\\\"eyebrow\\\"]{color:var(--cdqcat5r-link)!important;letter-spacing:.12em!important}.np-rankrift details{border-color:var(--cdqcat5r-border)!important}.np-rankrift th{background:var(--cdqcat5r-panel-muted)!important;color:var(--cdqcat5r-fg)!important}\\n.np-rankrift .tr-hero{padding-top:0!important}.np-rankrift .tr-wrap{max-width:1080px!important;padding-left:0!important;padding-right:0!important}.np-rankrift :focus-visible{outline-color:var(--cdqcat5r-link)!important}@media(max-width:680px){.np-rankrift{padding-top:38px!important;padding-bottom:56px!important}.np-rankrift [class*=\\\"intro\\\"],.np-rankrift [class*=\\\"lede\\\"]{font-size:18px!important}}\")\n, _react2.default.createElement('style', null, \".np-rankrift .rr-calc,.np-rankrift .rr-calc-out{background:var(--cdqcat5r-panel-muted)!important;color:var(--cdqcat5r-fg)!important;border-color:var(--cdqcat5r-border)!important}.np-rankrift .rr-calc input,.np-rankrift .rr-calc select{background:var(--cdqcat5r-bg)!important;color:var(--cdqcat5r-fg)!important;border-color:var(--cdqcat5r-border)!important}.np-rankrift .rr-calc .rr-hint{color:var(--cdqcat5r-muted)!important}\"))\n  );\n} exports.default = CalculatorPage;"}