@canonry/canonry 7.85.0 → 7.87.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 (145) hide show
  1. package/assets/agent-workspace/skills/aero/references/ai-traffic-tracking.md +7 -4
  2. package/assets/agent-workspace/skills/canonry/references/ai-traffic-tracking.md +7 -4
  3. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +22 -1
  4. package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +5 -3
  5. package/assets/assets/{AgentSetupPage-NdqmQkYa.js → AgentSetupPage-_ZP3F_zA.js} +1 -1
  6. package/assets/assets/{AuditHistoryPanel-CuqdFCb9.js → AuditHistoryPanel-9B0XpYsN.js} +1 -1
  7. package/assets/assets/{BacklinksPage-CVjZiG1i.js → BacklinksPage-CsvVgXTZ.js} +1 -1
  8. package/assets/assets/{ChartPrimitives-B5L9FUj3.js → ChartPrimitives-4D5wgAn5.js} +1 -1
  9. package/assets/assets/{HistoryPage-DRvdgemW.js → HistoryPage-BCxpCul0.js} +1 -1
  10. package/assets/assets/{MeasurementPropertyPage-Bc5EpJFV.js → MeasurementPropertyPage-BObvWjVx.js} +4 -4
  11. package/assets/assets/ProjectPage-y378tOaT.js +11 -0
  12. package/assets/assets/{RunsPage-B6_o81G3.js → RunsPage-CfQ_kqlu.js} +1 -1
  13. package/assets/assets/{SettingsPage-DjmVapHO.js → SettingsPage-PIgRvqJc.js} +1 -1
  14. package/assets/assets/SiteHealthSection-DuUE1cB0.js +2 -0
  15. package/assets/assets/ToneBadge-BgTLSTKp.js +60 -0
  16. package/assets/assets/{TrafficPage-BvbjxOw3.js → TrafficPage-B_YunwjH.js} +1 -1
  17. package/assets/assets/{TrafficSourceDetailPage-BGJwxS_Q.js → TrafficSourceDetailPage-C51W87fU.js} +1 -1
  18. package/assets/assets/{account-context-D7M4W4wP.js → account-context-CVjb3ZSn.js} +1 -1
  19. package/assets/assets/{agent-trust-copy-WXXeDvDs.js → agent-trust-copy-BlpC8jo5.js} +1 -1
  20. package/assets/assets/{card-DULVRmzI.js → card-BnVez9nG.js} +1 -1
  21. package/assets/assets/{extract-error-message-B9-6WgLm.js → extract-error-message-Dqirbrl0.js} +1 -1
  22. package/assets/assets/{format-helpers-Cgq0VzXz.js → format-helpers-DVXZD864.js} +1 -1
  23. package/assets/assets/index-BOUrrC9J.css +1 -0
  24. package/assets/assets/index-CsvEqhK4.js +60 -0
  25. package/assets/assets/query-client-CVc7wMKJ.js +1 -0
  26. package/assets/assets/react-query-CSlTSOjz.js +1 -0
  27. package/assets/assets/{react-sigma_core.esm.min-CR09uPhZ.js → react-sigma_core.esm.min-CVfGIEIE.js} +3 -3
  28. package/assets/assets/{service-Bu-7icpb.js → service-BGqeyqhZ.js} +1 -1
  29. package/assets/index.html +9 -9
  30. package/dist/{ads-ETZIGLL5.js → ads-ZUZWSIBV.js} +3 -3
  31. package/dist/{agent-WG2FUC7C.js → agent-YDS3WY7B.js} +7 -7
  32. package/dist/{agent-ask-775XBFOH.js → agent-ask-7VUPXTXL.js} +3 -3
  33. package/dist/{agent-conversations-AYZ3LQJQ.js → agent-conversations-WPEBK3BS.js} +3 -3
  34. package/dist/{agent-journeys-GWNZG73C.js → agent-journeys-H5CCYLNB.js} +3 -3
  35. package/dist/{agent-memory-E5MRRS5P.js → agent-memory-CNPKPIWD.js} +3 -3
  36. package/dist/{agent-providers-DEQZWO2M.js → agent-providers-U7FLJO5I.js} +3 -3
  37. package/dist/{agent-transcript-4AKVVHQC.js → agent-transcript-VY3BQNPU.js} +3 -3
  38. package/dist/{analytics-HSLTWKDA.js → analytics-PYUNO7C2.js} +3 -3
  39. package/dist/{apply-4GD7VGG7.js → apply-YNBEYC2G.js} +3 -3
  40. package/dist/{backfill-LNE2BW34.js → backfill-LIMS34H6.js} +10 -10
  41. package/dist/{backlinks-TGE3DWA2.js → backlinks-LVHZ2MQ7.js} +3 -3
  42. package/dist/{bing-56GNRC55.js → bing-A2MUG6AV.js} +3 -3
  43. package/dist/{bootstrap-42XCWZTS.js → bootstrap-AZYQXBHN.js} +10 -10
  44. package/dist/{cdp-UODIMKE3.js → cdp-HCYY4SXR.js} +7 -7
  45. package/dist/{chunk-OS5BVALI.js → chunk-2AXFKYJU.js} +2 -2
  46. package/dist/{chunk-DWK6NIJF.js → chunk-2FJB3CSS.js} +1 -1
  47. package/dist/{chunk-PQWZCAVS.js → chunk-3KK6FWDF.js} +1 -1
  48. package/dist/{chunk-BQTXXXUG.js → chunk-4FWDITQG.js} +1 -1
  49. package/dist/{chunk-Z53CKLDS.js → chunk-4LNZTL7M.js} +3 -3
  50. package/dist/{chunk-ZXMDIWW6.js → chunk-6F5ULQDY.js} +4 -4
  51. package/dist/{chunk-VFSHZHZS.js → chunk-BJHHD7VE.js} +2 -2
  52. package/dist/{chunk-4KK3OTHE.js → chunk-CBWGUGME.js} +2 -1
  53. package/dist/{chunk-KBLMQDUZ.js → chunk-D5V6YQXA.js} +7 -7
  54. package/dist/{chunk-X7XKMARG.js → chunk-DOPUEXMC.js} +2 -2
  55. package/dist/{chunk-UMEQ7EYN.js → chunk-EJZHL67Y.js} +4 -4
  56. package/dist/{chunk-JVO5GQZH.js → chunk-EQGCGZZY.js} +271 -60
  57. package/dist/{chunk-KNKOTLVW.js → chunk-F643WELJ.js} +1942 -1752
  58. package/dist/{chunk-GR7VVRNN.js → chunk-FAMCDCVK.js} +1 -1
  59. package/dist/{chunk-RCAB7M6A.js → chunk-G44S34CE.js} +2 -2
  60. package/dist/{chunk-PX2KVGOJ.js → chunk-GBWCEOZR.js} +1 -1
  61. package/dist/{chunk-TPUBPXBN.js → chunk-GDU6IMGB.js} +2 -2
  62. package/dist/{chunk-OHDSI5XS.js → chunk-GXTCDNX7.js} +1 -1
  63. package/dist/{chunk-6SGHSSWQ.js → chunk-IBGZ6D6R.js} +2 -2
  64. package/dist/{chunk-NY252PIY.js → chunk-ICS2WJ7H.js} +3 -3
  65. package/dist/{chunk-AICFUZ6X.js → chunk-IK7QEKKD.js} +1 -1
  66. package/dist/{chunk-IOW23XNK.js → chunk-INH773FB.js} +3 -3
  67. package/dist/{chunk-2O5XBKEO.js → chunk-ITOK75B6.js} +5 -5
  68. package/dist/{chunk-SS33RWKG.js → chunk-JAYUWQAV.js} +1 -1
  69. package/dist/{chunk-5NEZO3SC.js → chunk-JDTKG7KJ.js} +7 -3
  70. package/dist/{chunk-C2H5TPKD.js → chunk-JGGDENAA.js} +398 -344
  71. package/dist/{chunk-TVZMFCX2.js → chunk-KOBOKZXF.js} +6 -6
  72. package/dist/{chunk-2X6UAPAC.js → chunk-L5NMS7AU.js} +5 -5
  73. package/dist/{chunk-QEATYB7C.js → chunk-MNLAIB67.js} +1 -1
  74. package/dist/{chunk-L5R5S57T.js → chunk-O26FQ7RI.js} +1 -1
  75. package/dist/{chunk-YDC2V5FQ.js → chunk-OJKWT6U6.js} +21 -21
  76. package/dist/{chunk-UMV4HYHD.js → chunk-TEQF4ZJA.js} +22 -2
  77. package/dist/{chunk-Q7354YI3.js → chunk-TN53B5AB.js} +28 -3
  78. package/dist/{chunk-2R6WI237.js → chunk-VDYXB6SV.js} +1 -1
  79. package/dist/{chunk-D45AMUYA.js → chunk-YKB67YKH.js} +4 -4
  80. package/dist/{citations-RXBPR5MX.js → citations-3EZTHA65.js} +3 -3
  81. package/dist/{cli-catalog-QVCJWPCI.js → cli-catalog-CBTM3JKP.js} +3 -3
  82. package/dist/{cli-commands-ZXR4Z2RW.js → cli-commands-J6KWSWIS.js} +7 -7
  83. package/dist/cli.js +13 -13
  84. package/dist/{competitor-MDNNHRSD.js → competitor-VH4TXJLT.js} +3 -3
  85. package/dist/{content-D3JZZQ64.js → content-TSMNHXJZ.js} +3 -3
  86. package/dist/{dashboard-5S2A46GM.js → dashboard-5QMYF4ZP.js} +6 -6
  87. package/dist/{demo-DQHWRIKR.js → demo-KGQL5EJM.js} +1 -1
  88. package/dist/{demo-server-FY2XBSD2.js → demo-server-ERIR2T2N.js} +13 -12
  89. package/dist/{discover-NVNWHOTZ.js → discover-XTJXTKCI.js} +3 -3
  90. package/dist/{discover-eval-CJB6GYUS.js → discover-eval-IVQI5YEW.js} +3 -3
  91. package/dist/{doctor-DLSKNC4W.js → doctor-SJ4SHSQO.js} +3 -3
  92. package/dist/{evidence-QNJULIXM.js → evidence-C6T556YH.js} +3 -3
  93. package/dist/{export-cmd-Z2YG2WLK.js → export-cmd-JQZ5ZRSI.js} +3 -3
  94. package/dist/{ga-RSNHBP2B.js → ga-W2WHVRHN.js} +3 -3
  95. package/dist/{gbp-ZEV62LSZ.js → gbp-3AZIV5WF.js} +3 -3
  96. package/dist/{google-RZHEIKW5.js → google-3CKWPZT7.js} +4 -4
  97. package/dist/{google-marketing-DYQXPTD3.js → google-marketing-PJBGQYYW.js} +1 -1
  98. package/dist/{health-cmd-6ATPYUYG.js → health-cmd-4JTQMCXM.js} +3 -3
  99. package/dist/{history-KLX6XRY4.js → history-TXUJFEO2.js} +3 -3
  100. package/dist/index.d.ts +90 -90
  101. package/dist/index.js +25 -25
  102. package/dist/{init-5BALV6SU.js → init-HOBW5K2Q.js} +12 -12
  103. package/dist/{insights-ARCEFFK5.js → insights-XZQO4B45.js} +3 -3
  104. package/dist/intelligence-service-2AH42Y4Q.js +16 -0
  105. package/dist/{journeys-WVRQRZQJ.js → journeys-VFIV5JYV.js} +21 -12
  106. package/dist/{keys-5KAJFRZZ.js → keys-PV23G4LW.js} +3 -3
  107. package/dist/{keyword-PTUH3TFD.js → keyword-D76KBIV5.js} +3 -3
  108. package/dist/{logs-NM7ACXGQ.js → logs-DYDZ6IEJ.js} +3 -3
  109. package/dist/{mcp-ALRQXYL3.js → mcp-GAR5LDQD.js} +4 -4
  110. package/dist/mcp.js +9 -9
  111. package/dist/{measurement-plan-T52JHK2J.js → measurement-plan-K24EOGMI.js} +5 -5
  112. package/dist/{notify-MJBMRDXD.js → notify-XQHMPDQQ.js} +3 -3
  113. package/dist/{organic-evidence-ZUCQFWD5.js → organic-evidence-UHHE7AO4.js} +3 -3
  114. package/dist/{overview-74IHPU2A.js → overview-AUZ3XRS5.js} +4 -4
  115. package/dist/{project-DKQOPMH6.js → project-FUCPU2BD.js} +3 -3
  116. package/dist/{query-YDJ5T46L.js → query-HRMSXDKL.js} +3 -3
  117. package/dist/{research-5DU6DFZW.js → research-R23XLZJ3.js} +3 -3
  118. package/dist/{results-export-EDVVXKVW.js → results-export-N6IV3KG4.js} +3 -3
  119. package/dist/{run-HRHGSIYE.js → run-CJLG5EXH.js} +4 -4
  120. package/dist/{schedule-GZVKQGMP.js → schedule-IPDCQ2I5.js} +3 -3
  121. package/dist/{search-M37GRKVC.js → search-ZU4AKJ76.js} +3 -3
  122. package/dist/{serve-DW6PPZPJ.js → serve-WF5ZXWW6.js} +26 -26
  123. package/dist/{session-H427H2SK.js → session-HEDEP77R.js} +13 -13
  124. package/dist/{settings-WGS7GP7C.js → settings-4FS5NRKP.js} +3 -3
  125. package/dist/{skills-CDDUPMAU.js → skills-GSFHACGN.js} +2 -2
  126. package/dist/{snapshot-5MAK7PWE.js → snapshot-4NUVPDK3.js} +3 -3
  127. package/dist/{src-FEV4KYXN.js → src-SJYGA7NH.js} +2 -2
  128. package/dist/{status-EHFOYTXQ.js → status-ASBLMFP2.js} +4 -4
  129. package/dist/{technical-aeo-KVY4RQWT.js → technical-aeo-QXHRBGYY.js} +3 -3
  130. package/dist/{telemetry-7XRRIHVC.js → telemetry-J2I577I3.js} +4 -4
  131. package/dist/{tools-EHONHGB6.js → tools-KYG67FBW.js} +11 -11
  132. package/dist/{traffic-TBR6GOWN.js → traffic-B7Q4WPOV.js} +5 -5
  133. package/dist/trends-YOLCJBNM.js +56 -0
  134. package/dist/{users-YQS4X47Q.js → users-LPSCZV3M.js} +3 -3
  135. package/dist/{visibility-stats-JXIOSJXC.js → visibility-stats-JJQTZSSK.js} +3 -3
  136. package/dist/{wordpress-HVOLEPQY.js → wordpress-4IKDT5KT.js} +3 -3
  137. package/package.json +1 -1
  138. package/assets/assets/ProjectPage-CGGBSiK7.js +0 -11
  139. package/assets/assets/SiteHealthSection-BPPB0D9D.js +0 -2
  140. package/assets/assets/ToneBadge-DwUBSAjL.js +0 -60
  141. package/assets/assets/index-A-4JN4Pv.js +0 -60
  142. package/assets/assets/index-BnmWwrZA.css +0 -1
  143. package/assets/assets/query-client-1Q6EwPba.js +0 -1
  144. package/assets/assets/react-query-D0OiMBt3.js +0 -1
  145. package/dist/intelligence-service-YJFZ6IBI.js +0 -16
@@ -78,8 +78,10 @@ through these in order and say which one applies.
78
78
  - The WordPress logger runs inside WordPress, so it cannot see page views a
79
79
  cache serves before WordPress runs.
80
80
  - Vercel logs carry no IP, so journey keys use the user agent only
81
- (`keyBasis`); people with the same device and browser version merge,
82
- which undercounts people and overstates return rates.
81
+ (`keyBasis`), and one key can be everyone on a device and browser
82
+ version. Visitor and return figures leave those keys out; with only
83
+ those, `aiVisitors` and the return figures are null: not measurable,
84
+ never zero. `aiVisits` still counts every AI-referred visit.
83
85
  - A hosted checkout or booking engine on another domain is outside the
84
86
  site's server logs.
85
87
  7. **Is a Queue backlog hiding recent traffic?** For Cloudflare Queue pull,
@@ -161,8 +163,9 @@ Do not infer clicks, a user's prompt, business outcomes or off-site browsing.
161
163
 
162
164
  **"Do AI visitors come back?"**
163
165
  `cnry journeys summary <p>`: `returnRate`, `returnedVia` and
164
- `medianDaysToReturn`. Report `keyBasis` and `partialSources` with the numbers;
165
- a user-agent-only or partial source changes what the rate means.
166
+ `medianDaysToReturn`, counted over visitors matched by IP and user agent.
167
+ Report `keyBasis` and `partialSources` with the numbers. Null visitor figures
168
+ mean only user-agent matches were seen: say "not measurable", never zero.
166
169
 
167
170
  ## Reporting language
168
171
 
@@ -71,8 +71,10 @@ through these in order and say which one applies.
71
71
  - The WordPress logger runs inside WordPress, so it cannot see page views a
72
72
  cache serves before WordPress runs.
73
73
  - Vercel logs carry no IP, so journey keys use the user agent only
74
- (`keyBasis`); people with the same device and browser version merge,
75
- which undercounts people and overstates return rates.
74
+ (`keyBasis`), and one key can be everyone on a device and browser
75
+ version. Visitor and return figures leave those keys out; with only
76
+ those, `aiVisitors` and the return figures are null: not measurable,
77
+ never zero. `aiVisits` still counts every AI-referred visit.
76
78
  - A hosted checkout or booking engine on another domain is outside the
77
79
  site's server logs.
78
80
  7. **Is a Queue backlog hiding recent traffic?** For Cloudflare Queue pull,
@@ -154,8 +156,9 @@ Do not infer clicks, a user's prompt, business outcomes or off-site browsing.
154
156
 
155
157
  **"Do AI visitors come back?"**
156
158
  `cnry journeys summary <p>`: `returnRate`, `returnedVia` and
157
- `medianDaysToReturn`. Report `keyBasis` and `partialSources` with the numbers;
158
- a user-agent-only or partial source changes what the rate means.
159
+ `medianDaysToReturn`, counted over visitors matched by IP and user agent.
160
+ Report `keyBasis` and `partialSources` with the numbers. Null visitor figures
161
+ mean only user-agent matches were seen: say "not measurable", never zero.
159
162
 
160
163
  ## Reporting language
161
164
 
@@ -434,6 +434,24 @@ cnry sources <project> --include-by-query false --format json # drop
434
434
  - Counts are **cited slots**: one per (answer, cited domain) pair, so a domain cited 3× in one answer counts once. Probe runs are excluded.
435
435
  - Without `--run-id` every run in the window is pooled (the scope line and `runCount` say how many); without `--query-class` branded and non-brand answers are pooled, and branded queries inflate your own domain. `--query-class branded|non-brand` takes the class from an active v2 measurement plan, otherwise from the project's brand name/aliases (a project with neither is refused). Answers the class filter cannot place are excluded and counted in `unclassifiedAnswers`. `--include-by-query` defaults to the server's `true`.
436
436
 
437
+ ### Stored trend figures (`cnry trends`)
438
+
439
+ The figures a dashboard tab's trend card leads with, from stored data only: each figure's latest reading, its change since the first reading in the window, and its readings. Backed by `GET /api/v1/projects/<name>/trends` and the `canonry_trends` MCP tool, so the dashboard, the CLI and MCP agree on every figure.
440
+
441
+ ```bash
442
+ cnry trends <project> --surface index-coverage # Google and Bing indexed / not indexed pages, last 90 days by default
443
+ cnry trends <project> --surface site-health # site score and pages checked, one reading per scan, all history by default
444
+ cnry trends <project> --surface backlinks --window 90d # referring domains, linking hosts and top-10 concentration per Common Crawl release
445
+ cnry trends <project> --surface index-coverage --start 2026-08-01 --end 2026-08-31 # your own calendar range instead of a window
446
+ cnry trends <project> --surface backlinks --format json # TrendsResponse; jsonl degrades to the json document
447
+ ```
448
+
449
+ - A figure is a level, never a sum. `change.difference` is in the figure's own unit (a share moves in points), `change.ratio` is null from a zero basis, and `change.basis` names the first reading in the window it is measured from.
450
+ - `tone` follows `better`: not indexed pages falling is `better`; pages checked and top-10 concentration are `neither`.
451
+ - The window ends on the latest reading, not today; `--start`/`--end` read a calendar range instead (never with `--window`; `window` is then null). `recordedFrom` is the first reading ever: earlier dates were never recorded, not zero.
452
+ - Scans are moments and carry `observedAt`; the human output prints the UTC date.
453
+ - Backlinks uses the crawler- and proxy-excluded totals the Backlinks tab shows, one reading per release in crawl order (however late a release was extracted), dated by the window's last month and named by its window in `label` ("May-Jul 2026"); the human output says "since May-Jul 2026". A release whose domain rows are missing is unknown, never zero.
454
+
437
455
  ### Aggregated visibility stats (`cnry visibility-stats`)
438
456
 
439
457
  Per-query mention (answer-text) and citation (source-list) **counts with a sample size**, pooled across many answer-visibility runs — the data to compute a confidence-aware proportion (e.g. Wilson) or detect drift without fetching every run. Backed by `GET /api/v1/projects/<name>/visibility-stats` and the `canonry_visibility_stats` MCP tool. Probe runs and non-`answer-visibility` runs are excluded; only completed/partial runs count. `--share-of-voice` adds a head-to-head vs tracked competitors (`project / (project + competitor)` brand mentions) — the primitive for a month-over-month client report: call it with `--month <this>` and `--month <last>` and compare. **It is scoped to NON-BRAND queries by default and the response echoes `queryClass`.** A branded query hands the model your name, so you are mentioned on ~all of them and a competitor structurally cannot be; a pooled figure therefore reports brand recall as category placement (measured: one basket read 42% / rank 1 pooled and 3% / rank LAST non-brand). Pass `--query-class branded` for the recall figure. There is no "all" — the two never share a denominator.
@@ -1815,6 +1833,7 @@ Compact reference for the composite / keyed commands agents read most (shapes ca
1815
1833
  | `cnry analytics <p> [--feature metrics\|gaps\|sources] [--window 7d\|30d\|90d\|all]` | Object **keyed by feature**: `{ metrics?, gaps?, sources? }` (all three present with no `--feature`; one with `--feature X`). `metrics`=`BrandMetricsDto{ window, buckets[], overall, byProvider, trend, mentionTrend, queryChanges[] }`; `gaps`=`GapAnalysisDto{ cited[], gap[], uncited[], mentionedQueries[], mentionGap[], notMentioned[], runId, window }` (each `[]`=`GapQuery`); `sources`=`SourceBreakdownDto` (same shape as `cnry sources`, below). @ `contracts/analytics.ts` | → degrades to the `json` document |
1816
1834
  | `cnry sources <p> [--rank] [--limit N] [--by-provider] [--window …]` | `SourceBreakdownDto{ overall[], byQuery, ranked, byProvider, runId, window, limit }` @ `contracts/analytics.ts`. `ranked`/each `byProvider[name]` = `RankedSourceList{ totalCitedSlots, domainTotal, entries[], truncatedDomainCount, truncatedCitedSlots, bySurfaceClass[] }`; `entries[]`=`SourceRankEntry{ domain, count, percentage, category, label, surfaceClass }`; `bySurfaceClass[]`=`SurfaceClassCount{ surfaceClass, label, count, percentage, domainCount }`. `surfaceClass` ∈ own \| direct-competitor \| ota-aggregator \| editorial-media \| other. | ✅ streams `ranked.entries` one / line as `{project, …entry}` |
1817
1835
  | `cnry visibility-stats <p> [--since <iso>] [--until <iso>] [--month <YYYY-MM>] [--last-runs N] [--by-provider] [--share-of-voice] [--query-class branded\|non-brand]` | `VisibilityStatsDto{ project, groupBy, window{since,until,lastRuns,runCount}, totals, byProvider?[], queries[], shareOfVoice? }` @ `contracts/visibility-stats.ts`. Each query / provider / totals entry = `{ total, checked, mentioned, cited, mentionRate, citedRate }` (+ `query`/`queryId`/`firstObserved`/`lastObserved` on queries, + `provider`/observed on provider entries). `checked`=snapshots with non-null `answerMentioned` (tri-state n for mention); `mentionRate=mentioned/checked`, `citedRate=cited/total`, both `null` on a 0 denominator. `byProvider`/per-query `providers` present only with `--by-provider`; counts sum to pooled. `--month YYYY-MM` echoes the resolved `window.since`/`until`. `shareOfVoice` present only with `--share-of-voice` = `{ queryClass, percent, projectMentions, competitorMentions, snapshotsWithAnswerText, perCompetitor[{domain,mentions}] }`; `percent` (0-100) = `projectMentions/(projectMentions+competitorMentions)`, `null` when no competitors configured. `queryClass` is what was actually served: `non-brand` (the default), `branded` (via `--query-class`), or `pooled` — which appears ONLY when the project has no usable brand alias to split by, never as a default. Branded and non-brand never share a denominator. | ✅ streams `queries` one / line as `{project, runCount, …query}` (envelope-only `shareOfVoice` not in the jsonl rows) |
1836
+ | `cnry trends <p> --surface index-coverage\|site-health\|backlinks [--window 7d\|30d\|90d\|all \| --start YYYY-MM-DD --end YYYY-MM-DD]` | `TrendsResponse{ project, surface, window (null for a date range), startDate, endDate, groups[] }` @ `contracts/trends.ts`. Each group = `{ key, label, figures[] }`; each figure = `TrendFigure{ key, label, unit(count\|score\|fraction), better(higher\|lower\|neither), value, asOf, change{ difference, ratio, tone(better\|worse\|neutral), basis{ type: first-in-window, date, observedAt, label } }\|null, series[{ date, observedAt, label, value }], recordedFrom }`. A group that never recorded a reading is omitted; an empty surface has no groups and null dates. | → degrades to the `json` document |
1818
1837
  | `cnry google coverage <p>` (index coverage) | `{ summary{total,indexed,notIndexed,deindexed,percentage}, lastInspectedAt, lastSyncedAt, indexed[], notIndexed[], deindexed[], reasonGroups[] }` — `GscCoverageSummaryDto` @ `contracts/google.ts`. `indexed[]`/`notIndexed[]`=`GscUrlInspectionDto`, `deindexed[]`=`GscDeindexedRowDto`. | → degrades to the `json` document. The single-array reads `google inspections` / `coverage-history` / `deindexed` **stream** `jsonl`. |
1819
1838
  | `cnry google query-totals <p> [--start …] [--end …] [--window …] [--limit N] [--offset N]` | `GscQueryTotalsDto{ rows[], totalMatching, truncated, window }` @ `contracts/google.ts`. Each row = `{ query, clicks, impressions, ctr, position, days, source(google\|page-summed\|mixed) }`; `window` = `GscWindowRange{ startDate, endDate, latestDataDate, daysSinceLatestData }` plus `earliestDataDate` (first stored per-query date, `null` with none; a window starting before it is only partly covered). Named queries only: the rows do not add up to the property total. | Streams one line per query, each tagged with `project` and `window`. |
1820
1839
  | `cnry ga measurement-analysis <p> [--window 30d\|60d\|90d] [--host-scope marketing\|all] [--path-prefix /…]` | `GaMeasurementAnalysisDto` @ `contracts/measurement.ts`: fixed 30-day `acquisition.periods/channels/pages`, configured-event `leads.periods/channels` with explicit attribution/filter scope, `leads.aiEngines{ leadRateAvailable, leadRateUnavailableReason, organic, paid }`, each class `{ periods[], engines[{ engine, label, sources[], periods[] }], unattributed{ sources[], periods[] } }` (lead events per AI engine from GA4 `sessionSource` via the shared `aiEngineForReferralSource` mapping, split by `classifyAiReferralTrafficClass` so tagged ad clicks never pool with organic, with the landing page left out on both sides when leads are channel-scoped; each cohort has `eventCount`, same-source same-class `sessions` under the same host/path filters, and `leadRate` = eventCount / sessions as a fraction, `null` on 0 sessions or when `leadRateAvailable` is false; `leadRateUnavailableReason` is `no-data`, `sync-not-ready` (latest acquisition or lead sync failed), `channel-leads-unfiltered` (channel-scoped leads cannot follow the host/path filters), `paid-split-needs-landing-page` (channel-scoped leads, and some AI sessions were paid only by landing-page utm tags, so they count as organic), `sessions-behind-leads` (leads stored past the last acquisition date) or `sessions-missing-on-lead-days` (a day in the window has leads but no stored acquisition rows); `unattributed` is GA4 `AI Assistant` channel rows matching no engine; a class's `periods[]` is its engines plus `unattributed`), and `searchDemand.periods/queries/pages` with property totals, reported branded/non-brand rows, and unreported residuals. Each GA component carries independent status/error/sync freshness. | → degrades to the `json` document |
@@ -1991,7 +2010,9 @@ sign-in, payment or booking-engine referer is a step inside the visit.
1991
2010
  Visits are stored when they fall within 30 days after one of the visitor's AI visits;
1992
2011
  rows are deleted after 180 days. A visitor key is a keyed hash, never an IP.
1993
2012
  Sources without an IP (Vercel) key on the user agent only, so people with the
1994
- same device and browser version can merge; `keyBasis` says which. A key stores
2013
+ same device and browser version can merge; `keyBasis` says which. Visitor and
2014
+ return figures count only IP-and-user-agent keys and are null (not measurable)
2015
+ when there are none; `list` takes `--key-basis ip-ua|ua`. A key stores
1995
2016
  at most 300 requests per UTC day besides AI touches; `cappedDays` counts the days it hit
1996
2017
  that cap. `partialSources` names sources whose logs miss later visits (the
1997
2018
  Cloudflare Worker forwards only AI and bot requests). Query
@@ -1300,9 +1300,11 @@ every source and needs no site snippet or goal setup. Read it with
1300
1300
  overcount people slightly. The once-after-startup correction joins stored
1301
1301
  visitors the same way.
1302
1302
  - Vercel logs carry no IP, so those visitors are keyed by user agent only.
1303
- Chrome reports the same user agent for every Mac on one version, so a key can
1304
- merge people: such visitors undercount people and can overstate return rates.
1305
- Read `keyBasis` before quoting a return rate. A key stores at most 300
1303
+ Chrome reports the same user agent for every Mac on one version, so one key
1304
+ can be many people. Visitor and return figures leave such keys out; with
1305
+ only those, `aiVisitors` and the return figures are null (not measurable)
1306
+ while `aiVisits` still counts. `cnry journeys list --key-basis ua` lists them
1307
+ as browser groups. A key stores at most 300
1306
1308
  requests per UTC day besides AI touches; `cappedDays` counts the days it hit
1307
1309
  that cap.
1308
1310
  - By default the Cloudflare Worker forwards only AI-referred and bot requests,
@@ -1,4 +1,4 @@
1
- import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{B as t,H as n,X as r,st as i}from"./vendor-lucide-CoTHJwai.js";import{r as a}from"./vendor-markdown-cQgSk2i0.js";import{Br as o,Dn as s,Qt as c,Rr as l,Tt as u,Zt as d,ct as f,r as p,t as m,wt as h,zr as g}from"./ToneBadge-DwUBSAjL.js";import{r as _}from"./account-context-D7M4W4wP.js";import{t as v}from"./async-handler-Bj3TnIRw.js";import{Q as y,nt as b}from"./index-A-4JN4Pv.js";var x=e(i(),1),S=a(),C=`https://github.com/Canonry/canonry/blob/main/docs/mcp.md`,w=`https://github.com/Canonry/canonry/blob/main/docs/plugins.md`,T=`https://help.openai.com/en/articles/12584461-connecting-custom-mcp-servers-in-chatgpt`,E=`https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp`,D=`codex plugin marketplace add Canonry/canonry
1
+ import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{B as t,H as n,X as r,st as i}from"./vendor-lucide-CoTHJwai.js";import{r as a}from"./vendor-markdown-cQgSk2i0.js";import{Br as o,Dn as s,Qt as c,Rr as l,Tt as u,Zt as d,ct as f,r as p,t as m,wt as h,zr as g}from"./ToneBadge-BgTLSTKp.js";import{r as _}from"./account-context-CVjb3ZSn.js";import{t as v}from"./async-handler-Bj3TnIRw.js";import{$ as y,rt as b}from"./index-CsvEqhK4.js";var x=e(i(),1),S=a(),C=`https://github.com/Canonry/canonry/blob/main/docs/mcp.md`,w=`https://github.com/Canonry/canonry/blob/main/docs/plugins.md`,T=`https://help.openai.com/en/articles/12584461-connecting-custom-mcp-servers-in-chatgpt`,E=`https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp`,D=`codex plugin marketplace add Canonry/canonry
2
2
  codex plugin add canonry-remote@canonry`,O={[g[`public-url-required`]]:`Configure this instance’s public URL before connecting a hosted client.`,[g[`https-required`]]:`Configure an HTTPS public URL for this instance.`,[g[`public-host-required`]]:`Use a public HTTPS address that your client can reach. Localhost and private-network addresses do not work for hosted connectors.`,[g[`public-path-mismatch`]]:`Make the publicUrl path match basePath, and preserve that prefix when the proxy forwards requests for hosted OAuth.`,[g[`oauth-unavailable`]]:`The sign-in routes are unavailable. Check this instance’s OAuth configuration.`,[g[`account-required`]]:`Create a named Canonry account on this instance’s server with canonry user create. A shared dashboard password does not provide an OAuth account.`,[g[`transport-unavailable`]]:`Restore the instance’s HTTP MCP service before connecting a hosted client.`},k={codex:{label:`Codex`,command:`codex plugin marketplace add Canonry/canonry
3
3
  codex plugin add canonry@canonry`},claude:{label:`Claude Code`,command:`claude plugin marketplace add Canonry/canonry
4
4
  claude plugin install canonry@canonry`},other:{label:`Other MCP clients`,command:`canonry-mcp`}};function A({label:e,value:t,showText:i=!1,secondary:a=!1,action:o=`agent_setup.copy`}){let c=(0,x.useId)(),[l,u]=(0,x.useState)(!1),[d,f]=(0,x.useState)(!1);async function m(){try{await navigator.clipboard.writeText(t),s(o),u(!0),f(!1)}catch{u(!1),f(!0)}}return(0,S.jsxs)(`div`,{className:`min-w-0 space-y-3`,children:[i?(0,S.jsx)(`pre`,{className:`overflow-x-auto material-base p-3 text-copy-14 text-heading`,children:(0,S.jsx)(`code`,{children:t})}):null,(0,S.jsxs)(p,{type:`button`,className:`pointer-coarse:min-h-11`,variant:a?`outline`:`default`,onClick:v(m),children:[l?(0,S.jsx)(r,{className:`size-4`,"aria-hidden":`true`}):(0,S.jsx)(n,{className:`size-4`,"aria-hidden":`true`}),e]}),l?(0,S.jsx)(`p`,{role:`status`,className:`text-copy-14 text-secondary`,children:`Copied.`}):null,!i||d?(0,S.jsxs)(`details`,{open:d||void 0,className:`text-label-14 text-secondary`,children:[(0,S.jsx)(`summary`,{className:`min-h-11 w-fit cursor-pointer py-3`,children:d?`Copy unavailable. Select the text below.`:`Preview text`}),(0,S.jsxs)(`label`,{htmlFor:c,className:`sr-only`,children:[e,` text`]}),(0,S.jsx)(`textarea`,{id:c,readOnly:!0,rows:d&&i?3:8,value:t,className:`mt-2 w-full rounded-md border border-default bg-bg p-3 text-copy-14 text-heading`})]}):null]})}function j(){return h()||u()?(0,S.jsxs)(`div`,{className:`page-container`,children:[(0,S.jsx)(`h1`,{className:`page-title`,children:`Agent setup`}),(0,S.jsx)(`p`,{className:`mt-3 text-copy-14 text-secondary`,children:`Open Agent setup in your own Canonry instance to connect your agent.`}),c()?(0,S.jsx)(`a`,{className:`mt-4 inline-block text-label-14 underline`,href:C,target:`_blank`,rel:`noopener noreferrer`,children:`Read the connection guide`}):null]}):(0,S.jsx)(M,{})}function M(){let e=b(),{isAdmin:n}=_(),r=d(),i=c(),a=y(!e,e?.health),s=a.data?.apiStatus,u=s?.state===`ok`?s.mcp:void 0,p=u?.status===o.available&&u.hosted?.status===l.ready?u.hosted:void 0,h=u?.hosted?.status===l.unavailable?u.hosted.reason:void 0,g=`${window.location.origin}${f()}`,v=`This server has not confirmed a public URL and OAuth sign-in. Ask your administrator to check the connection configuration or update Canonry.`;a.isPending?v=`Checking the instance’s hosted connection settings.`:h?v=n&&r?O[h]:`Ask your Canonry administrator to finish hosted connection setup for this instance.`:s?.state===`error`?v=`The instance’s connection settings could not be checked. Try again after the service is available.`:u?.status===o[`not-supported`]&&(v=`This deployment does not provide hosted MCP connections. Ask your administrator for a supported connection.`);let x=p?`Help me connect this existing Canonry instance to ChatGPT or Claude Desktop using its remote MCP URL: ${p.url}
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{st as t}from"./vendor-lucide-CoTHJwai.js";import{r as n}from"./vendor-markdown-cQgSk2i0.js";import{b as r}from"./vendor-tanstack-q5SvZtcv.js";import{mt as i,r as a,t as o}from"./ToneBadge-DwUBSAjL.js";import{Y as s,i as c,rn as l}from"./react-query-D0OiMBt3.js";import{t as u}from"./card-DULVRmzI.js";var d=e(t(),1),f=n(),p=100;function m(e){if(e===`all`)return;let t=Number.parseInt(e,10);return new Date(Date.now()-t*24*60*60*1e3).toISOString()}function h(e){let t=e.userAgent?.toLowerCase()??``;return t.includes(`canonry-mcp`)?`MCP`:t.includes(`canonry-cli`)?`CLI`:t.includes(`mozilla/`)?`Dashboard`:e.actor===`scheduler`?`Scheduler`:e.actor===`agent`?`Agent`:e.actor===`mcp`?`MCP`:e.actor===`cli`?`CLI`:e.actor}function g(e){return/delete|remove|revoke|disconnect|failed|refused/.test(e)?`negative`:/create|add|connect|completed/.test(e)?`positive`:/update|replace|sync|apply/.test(e)?`caution`:`neutral`}function _(e){return[e.action,e.actor,e.entityType,e.entityId,e.actorSession,e.userAgent,e.diff==null?``:JSON.stringify(e.diff)].filter(Boolean).join(` `).toLowerCase()}function v({projectName:e}){let[t,n]=(0,d.useState)(0),[v,y]=(0,d.useState)(`90d`),[b,x]=(0,d.useState)(``),[S,C]=(0,d.useState)(``),w=(0,d.useMemo)(()=>m(v),[v]),T={limit:p,offset:t*p,since:w,actor:b||void 0},E=r({...s({client:i,path:{name:e??``},query:T}),enabled:!!e}),D=r({...c({client:i,query:T}),enabled:!e}),O=r({...l({client:i}),enabled:!e}),k=e?E:D,A=k.data??[],j=(0,d.useMemo)(()=>new Map((O.data??[]).map(e=>[e.id,e.displayName||e.name])),[O.data]),M=S.trim().toLowerCase(),N=(0,d.useMemo)(()=>M?A.filter(e=>_(e).includes(M)):A,[A,M]),P=e=>{n(0),e()};return k.isLoading?(0,f.jsx)(`p`,{className:`supporting-copy mt-6`,role:`status`,children:`Loading change history…`}):(0,f.jsxs)(`section`,{className:`mt-6`,"aria-labelledby":`change-history-heading`,children:[(0,f.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`Audit trail`}),(0,f.jsx)(`h2`,{id:`change-history-heading`,children:`Change history`}),(0,f.jsx)(`p`,{className:`supporting-copy mt-1 max-w-2xl`,children:`Configuration and operator actions. Execution outcomes remain in Runs.`})]}),(0,f.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>void k.refetch(),disabled:k.isFetching,children:k.isFetching?`Refreshing…`:`Refresh`})]}),(0,f.jsxs)(`div`,{className:`mt-4 grid gap-2 sm:grid-cols-3`,children:[(0,f.jsx)(`input`,{type:`search`,"aria-label":`Search change history`,value:S,onChange:e=>C(e.target.value),placeholder:`Search actions, entities, or details`,className:`min-h-11 rounded-md border border-base bg-bg px-3 text-label-14 text-strong placeholder-mono-400 focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-600`}),(0,f.jsxs)(`select`,{"aria-label":`Filter change history by actor`,value:b,onChange:e=>P(()=>x(e.target.value)),className:`min-h-11 rounded-md border border-base bg-bg px-3 text-label-14 text-strong focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-600`,children:[(0,f.jsx)(`option`,{value:``,children:`All actors`}),(0,f.jsx)(`option`,{value:`api`,children:`API and dashboard`}),(0,f.jsx)(`option`,{value:`cli`,children:`CLI`}),(0,f.jsx)(`option`,{value:`scheduler`,children:`Scheduler`}),(0,f.jsx)(`option`,{value:`agent`,children:`Agent`}),(0,f.jsx)(`option`,{value:`mcp`,children:`MCP`})]}),(0,f.jsxs)(`select`,{"aria-label":`Filter change history by date range`,value:v,onChange:e=>P(()=>y(e.target.value)),className:`min-h-11 rounded-md border border-base bg-bg px-3 text-label-14 text-strong focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-600`,children:[(0,f.jsx)(`option`,{value:`30d`,children:`Last 30 days`}),(0,f.jsx)(`option`,{value:`90d`,children:`Last 90 days`}),(0,f.jsx)(`option`,{value:`365d`,children:`Last year`}),(0,f.jsx)(`option`,{value:`all`,children:`All retained history`})]})]}),k.isError?(0,f.jsxs)(u,{className:`surface-card empty-card mt-4`,children:[(0,f.jsx)(`h3`,{children:`Change history unavailable`}),(0,f.jsx)(`p`,{children:k.error instanceof Error?k.error.message:`Could not load the audit trail.`})]}):N.length===0?(0,f.jsxs)(u,{className:`surface-card empty-card mt-4`,children:[(0,f.jsx)(`h3`,{children:`No changes match these filters`}),(0,f.jsx)(`p`,{children:`Widen the date range or clear the actor and search filters.`})]}):(0,f.jsx)(`div`,{className:`evidence-table-wrap mt-4`,children:(0,f.jsxs)(`table`,{className:`evidence-table`,children:[(0,f.jsx)(`thead`,{children:(0,f.jsxs)(`tr`,{children:[(0,f.jsx)(`th`,{children:`When`}),e?null:(0,f.jsx)(`th`,{children:`Scope`}),(0,f.jsx)(`th`,{children:`Action`}),(0,f.jsx)(`th`,{children:`Entity`}),(0,f.jsx)(`th`,{children:`Origin`}),(0,f.jsx)(`th`,{children:`Details`})]})}),(0,f.jsx)(`tbody`,{children:N.map(t=>(0,f.jsxs)(`tr`,{children:[(0,f.jsx)(`td`,{className:`whitespace-nowrap tabular-nums text-muted`,children:new Date(t.createdAt).toLocaleString()}),e?null:(0,f.jsx)(`td`,{className:`text-secondary`,children:t.projectId?j.get(t.projectId)??`Deleted project · ${t.projectId}`:`Instance settings`}),(0,f.jsx)(`td`,{children:(0,f.jsx)(o,{tone:g(t.action),children:t.action})}),(0,f.jsxs)(`td`,{children:[(0,f.jsx)(`span`,{className:`text-strong`,children:t.entityType}),t.entityId?(0,f.jsx)(`span`,{className:`mt-0.5 block max-w-48 truncate text-label-12-mono text-faint`,title:t.entityId,children:t.entityId}):null]}),(0,f.jsxs)(`td`,{children:[(0,f.jsx)(`span`,{className:`text-secondary`,children:h(t)}),t.actorSession?(0,f.jsxs)(`span`,{className:`mt-0.5 block max-w-40 truncate text-label-12-mono text-faint`,title:t.actorSession,children:[`Session `,t.actorSession]}):null]}),(0,f.jsx)(`td`,{children:t.diff==null?(0,f.jsx)(`span`,{className:`text-faint`,children:`No field diff`}):(0,f.jsxs)(`details`,{children:[(0,f.jsx)(`summary`,{className:`min-h-11 cursor-pointer py-3 text-label-14 text-secondary hover:text-strong`,children:`View diff`}),(0,f.jsx)(`pre`,{className:`max-h-72 max-w-xl overflow-auto whitespace-pre-wrap break-words rounded-md bg-bg-elevated p-3 text-copy-13 text-secondary`,children:JSON.stringify(t.diff,null,2)})]})})]},t.id))})]})}),!k.isError&&(t>0||A.length===p)?(0,f.jsxs)(`div`,{className:`mt-4 flex items-center justify-between gap-3`,children:[(0,f.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,disabled:t===0,onClick:()=>n(e=>Math.max(0,e-1)),children:`Previous`}),(0,f.jsxs)(`span`,{className:`text-label-12 tabular-nums text-muted`,children:[`Page `,t+1]}),(0,f.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,disabled:A.length<p,onClick:()=>n(e=>e+1),children:`Next`})]}):null]})}export{v as t};
1
+ import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{st as t}from"./vendor-lucide-CoTHJwai.js";import{r as n}from"./vendor-markdown-cQgSk2i0.js";import{b as r}from"./vendor-tanstack-q5SvZtcv.js";import{mt as i,r as a,t as o}from"./ToneBadge-BgTLSTKp.js";import{Y as s,i as c,in as l}from"./react-query-CSlTSOjz.js";import{t as u}from"./card-BnVez9nG.js";var d=e(t(),1),f=n(),p=100;function m(e){if(e===`all`)return;let t=Number.parseInt(e,10);return new Date(Date.now()-t*24*60*60*1e3).toISOString()}function h(e){let t=e.userAgent?.toLowerCase()??``;return t.includes(`canonry-mcp`)?`MCP`:t.includes(`canonry-cli`)?`CLI`:t.includes(`mozilla/`)?`Dashboard`:e.actor===`scheduler`?`Scheduler`:e.actor===`agent`?`Agent`:e.actor===`mcp`?`MCP`:e.actor===`cli`?`CLI`:e.actor}function g(e){return/delete|remove|revoke|disconnect|failed|refused/.test(e)?`negative`:/create|add|connect|completed/.test(e)?`positive`:/update|replace|sync|apply/.test(e)?`caution`:`neutral`}function _(e){return[e.action,e.actor,e.entityType,e.entityId,e.actorSession,e.userAgent,e.diff==null?``:JSON.stringify(e.diff)].filter(Boolean).join(` `).toLowerCase()}function v({projectName:e}){let[t,n]=(0,d.useState)(0),[v,y]=(0,d.useState)(`90d`),[b,x]=(0,d.useState)(``),[S,C]=(0,d.useState)(``),w=(0,d.useMemo)(()=>m(v),[v]),T={limit:p,offset:t*p,since:w,actor:b||void 0},E=r({...s({client:i,path:{name:e??``},query:T}),enabled:!!e}),D=r({...c({client:i,query:T}),enabled:!e}),O=r({...l({client:i}),enabled:!e}),k=e?E:D,A=k.data??[],j=(0,d.useMemo)(()=>new Map((O.data??[]).map(e=>[e.id,e.displayName||e.name])),[O.data]),M=S.trim().toLowerCase(),N=(0,d.useMemo)(()=>M?A.filter(e=>_(e).includes(M)):A,[A,M]),P=e=>{n(0),e()};return k.isLoading?(0,f.jsx)(`p`,{className:`supporting-copy mt-6`,role:`status`,children:`Loading change history…`}):(0,f.jsxs)(`section`,{className:`mt-6`,"aria-labelledby":`change-history-heading`,children:[(0,f.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`Audit trail`}),(0,f.jsx)(`h2`,{id:`change-history-heading`,children:`Change history`}),(0,f.jsx)(`p`,{className:`supporting-copy mt-1 max-w-2xl`,children:`Configuration and operator actions. Execution outcomes remain in Runs.`})]}),(0,f.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>void k.refetch(),disabled:k.isFetching,children:k.isFetching?`Refreshing…`:`Refresh`})]}),(0,f.jsxs)(`div`,{className:`mt-4 grid gap-2 sm:grid-cols-3`,children:[(0,f.jsx)(`input`,{type:`search`,"aria-label":`Search change history`,value:S,onChange:e=>C(e.target.value),placeholder:`Search actions, entities, or details`,className:`min-h-11 rounded-md border border-base bg-bg px-3 text-label-14 text-strong placeholder-mono-400 focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-600`}),(0,f.jsxs)(`select`,{"aria-label":`Filter change history by actor`,value:b,onChange:e=>P(()=>x(e.target.value)),className:`min-h-11 rounded-md border border-base bg-bg px-3 text-label-14 text-strong focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-600`,children:[(0,f.jsx)(`option`,{value:``,children:`All actors`}),(0,f.jsx)(`option`,{value:`api`,children:`API and dashboard`}),(0,f.jsx)(`option`,{value:`cli`,children:`CLI`}),(0,f.jsx)(`option`,{value:`scheduler`,children:`Scheduler`}),(0,f.jsx)(`option`,{value:`agent`,children:`Agent`}),(0,f.jsx)(`option`,{value:`mcp`,children:`MCP`})]}),(0,f.jsxs)(`select`,{"aria-label":`Filter change history by date range`,value:v,onChange:e=>P(()=>y(e.target.value)),className:`min-h-11 rounded-md border border-base bg-bg px-3 text-label-14 text-strong focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-600`,children:[(0,f.jsx)(`option`,{value:`30d`,children:`Last 30 days`}),(0,f.jsx)(`option`,{value:`90d`,children:`Last 90 days`}),(0,f.jsx)(`option`,{value:`365d`,children:`Last year`}),(0,f.jsx)(`option`,{value:`all`,children:`All retained history`})]})]}),k.isError?(0,f.jsxs)(u,{className:`surface-card empty-card mt-4`,children:[(0,f.jsx)(`h3`,{children:`Change history unavailable`}),(0,f.jsx)(`p`,{children:k.error instanceof Error?k.error.message:`Could not load the audit trail.`})]}):N.length===0?(0,f.jsxs)(u,{className:`surface-card empty-card mt-4`,children:[(0,f.jsx)(`h3`,{children:`No changes match these filters`}),(0,f.jsx)(`p`,{children:`Widen the date range or clear the actor and search filters.`})]}):(0,f.jsx)(`div`,{className:`evidence-table-wrap mt-4`,children:(0,f.jsxs)(`table`,{className:`evidence-table`,children:[(0,f.jsx)(`thead`,{children:(0,f.jsxs)(`tr`,{children:[(0,f.jsx)(`th`,{children:`When`}),e?null:(0,f.jsx)(`th`,{children:`Scope`}),(0,f.jsx)(`th`,{children:`Action`}),(0,f.jsx)(`th`,{children:`Entity`}),(0,f.jsx)(`th`,{children:`Origin`}),(0,f.jsx)(`th`,{children:`Details`})]})}),(0,f.jsx)(`tbody`,{children:N.map(t=>(0,f.jsxs)(`tr`,{children:[(0,f.jsx)(`td`,{className:`whitespace-nowrap tabular-nums text-muted`,children:new Date(t.createdAt).toLocaleString()}),e?null:(0,f.jsx)(`td`,{className:`text-secondary`,children:t.projectId?j.get(t.projectId)??`Deleted project · ${t.projectId}`:`Instance settings`}),(0,f.jsx)(`td`,{children:(0,f.jsx)(o,{tone:g(t.action),children:t.action})}),(0,f.jsxs)(`td`,{children:[(0,f.jsx)(`span`,{className:`text-strong`,children:t.entityType}),t.entityId?(0,f.jsx)(`span`,{className:`mt-0.5 block max-w-48 truncate text-label-12-mono text-faint`,title:t.entityId,children:t.entityId}):null]}),(0,f.jsxs)(`td`,{children:[(0,f.jsx)(`span`,{className:`text-secondary`,children:h(t)}),t.actorSession?(0,f.jsxs)(`span`,{className:`mt-0.5 block max-w-40 truncate text-label-12-mono text-faint`,title:t.actorSession,children:[`Session `,t.actorSession]}):null]}),(0,f.jsx)(`td`,{children:t.diff==null?(0,f.jsx)(`span`,{className:`text-faint`,children:`No field diff`}):(0,f.jsxs)(`details`,{children:[(0,f.jsx)(`summary`,{className:`min-h-11 cursor-pointer py-3 text-label-14 text-secondary hover:text-strong`,children:`View diff`}),(0,f.jsx)(`pre`,{className:`max-h-72 max-w-xl overflow-auto whitespace-pre-wrap break-words rounded-md bg-bg-elevated p-3 text-copy-13 text-secondary`,children:JSON.stringify(t.diff,null,2)})]})})]},t.id))})]})}),!k.isError&&(t>0||A.length===p)?(0,f.jsxs)(`div`,{className:`mt-4 flex items-center justify-between gap-3`,children:[(0,f.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,disabled:t===0,onClick:()=>n(e=>Math.max(0,e-1)),children:`Previous`}),(0,f.jsxs)(`span`,{className:`text-label-12 tabular-nums text-muted`,children:[`Page `,t+1]}),(0,f.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,disabled:A.length<p,onClick:()=>n(e=>e+1),children:`Next`})]}):null]})}export{v as t};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{B as t,C as n,V as r,o as i,s as a,st as o}from"./vendor-lucide-CoTHJwai.js";import{r as s}from"./vendor-markdown-cQgSk2i0.js";import{J as c,L as l,R as u,U as d,W as f,a as p,jt as m,r as h,t as g,un as _,vt as v,wt as y}from"./ToneBadge-DwUBSAjL.js";import{t as b}from"./async-handler-Bj3TnIRw.js";import{t as x}from"./card-DULVRmzI.js";import{t as S}from"./Hint-CfeZmZig.js";var C=e(o(),1),w=s(),T=`https://commoncrawl.org/web-graphs`;function E(e){return e==null?`—`:e>=0xe8d4a51000?`${(e/0xe8d4a51000).toFixed(1)} TB`:e>=1e9?`${(e/1e9).toFixed(1)} GB`:e>=1e6?`${(e/1e6).toFixed(1)} MB`:e>=1e3?`${(e/1e3).toFixed(1)} KB`:`${e} B`}function D(e){if(!e)return`—`;let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/6e4);if(n<1)return`just now`;if(n<60)return`${n}m ago`;let r=Math.floor(n/60);return r<24?`${r}h ago`:`${Math.floor(r/24)}d ago`}function O(e){switch(e){case`ready`:return`positive`;case`failed`:return`negative`;case`downloading`:case`querying`:case`queued`:return`caution`}}function k(){let[e,o]=(0,C.useState)(null),[s,k]=(0,C.useState)(null),[A,j]=(0,C.useState)([]),[M,N]=(0,C.useState)([]),[P,F]=(0,C.useState)(null),[I,L]=(0,C.useState)(!0),[R,z]=(0,C.useState)(!1),[B,V]=(0,C.useState)(!1),[H,U]=(0,C.useState)(``),[W,G]=(0,C.useState)(!1),[K,q]=(0,C.useState)(null),[J,Y]=(0,C.useState)(null),X=(0,C.useCallback)(async()=>{L(!0),q(null);try{let[e,t,n,r,i]=await Promise.all([l(),f().catch(()=>null),c().catch(()=>[]),u().catch(()=>[]),d().catch(()=>null)]);o(e),k(t),j(n),N(r),F(i)}catch(e){q(e instanceof Error?e.message:`Failed to load backlinks status`)}finally{L(!1)}},[]);(0,C.useEffect)(()=>{X()},[X]);async function Z(){z(!0),q(null),Y(null);try{let e=await v();Y(e.alreadyPresent?`DuckDB already installed (${e.version}).`:`Installed DuckDB ${e.version}.`),await X()}catch(e){q(e instanceof Error?e.message:`Failed to install DuckDB`)}finally{z(!1)}}async function Q(){let e=H.trim()||void 0;V(!0),q(null),Y(null);try{let t=await _(e);Y(e?`Queued sync for ${t.release}. Download + query runs in the background.`:`Queued sync for auto-discovered release ${t.release}. Download + query runs in the background.`),U(``),G(!1),await X()}catch(e){e instanceof p&&e.code===`MISSING_DEPENDENCY`?q(`DuckDB is not installed. Install it first.`):q(e instanceof Error?e.message:`Failed to trigger sync`)}finally{V(!1)}}async function $(e){q(null),Y(null);try{await m(e),Y(`Pruned cached release ${e}.`),await X()}catch(e){q(e instanceof Error?e.message:`Failed to prune release`)}}let ee=s?.status===`ready`&&M.every(e=>e.release!==s.release);return(0,w.jsxs)(`div`,{className:`page-container`,children:[(0,w.jsx)(`div`,{className:`page-header`,children:(0,w.jsxs)(`div`,{className:`page-header-left`,children:[(0,w.jsx)(`h1`,{className:`page-title`,children:`Backlink data`}),(0,w.jsx)(`p`,{className:`page-subtitle`,children:`Manage the shared backlink source and review its latest data.`})]})}),K&&(0,w.jsx)(x,{className:`surface-card p-4 mb-4 bg-negative-soft`,children:(0,w.jsx)(`p`,{className:`text-copy-14 text-negative`,children:K})}),J&&(0,w.jsx)(x,{className:`surface-card p-4 mb-4 bg-positive-soft`,children:(0,w.jsx)(`p`,{className:`text-copy-14 text-positive`,children:J})}),(0,w.jsxs)(`section`,{className:`page-section-divider`,children:[(0,w.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`Readiness`}),(0,w.jsx)(`h2`,{children:`Backlink source`})]}),e?.duckdbInstalled?(0,w.jsx)(g,{tone:`positive`,children:`Installed`}):(0,w.jsx)(g,{tone:`caution`,children:`Not installed`})]}),(0,w.jsx)(x,{className:`surface-card p-4`,children:I?(0,w.jsx)(`p`,{className:`text-copy-14 text-muted`,children:`Checking…`}):e?.duckdbInstalled?(0,w.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`Ready to sync a Common Crawl release.`}):(0,w.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,w.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`Install the local query engine to enable release syncs.`}),!y()&&(0,w.jsxs)(h,{type:`button`,size:`sm`,disabled:R,onClick:b(Z),children:[(0,w.jsx)(r,{className:`h-4 w-4 mr-1.5`,"aria-hidden":!0}),R?`Installing…`:`Install DuckDB`]})]})})]}),(0,w.jsxs)(`section`,{className:`page-section-divider`,children:[(0,w.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`Latest sync`}),(0,w.jsxs)(`h2`,{className:`flex items-center gap-2`,children:[`Release sync`,(0,w.jsx)(S,{label:`What is a release sync?`,children:`A release sync downloads one Common Crawl dump (~16 GB) and extracts backlinks for every project in this workspace in one pass. This is the heavy job — subsequent per-project re-runs skip the download and just re-query the cached files.`})]})]}),s&&(0,w.jsx)(g,{tone:O(s.status),children:s.status})]}),(0,w.jsxs)(x,{className:`surface-card p-5`,children:[s?(0,w.jsxs)(`div`,{className:`space-y-2 text-label-14`,children:[(0,w.jsxs)(`p`,{className:`text-strong`,children:[`Release `,(0,w.jsx)(`code`,{className:`text-neutral`,children:s.release})]}),s.phaseDetail&&(0,w.jsx)(`p`,{className:`text-secondary`,children:s.phaseDetail}),(0,w.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-4 gap-4 text-label-12 text-muted pt-2`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`text-faint normal-case text-label-12`,children:`Projects`}),(0,w.jsx)(`p`,{className:`text-neutral mt-0.5`,children:s.projectsProcessed??`—`})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsxs)(`p`,{className:`text-faint normal-case text-label-12 flex items-center gap-1`,children:[`Rows`,(0,w.jsx)(S,{label:`What are rows?`,children:`Total number of (project, referring domain) pairs persisted in SQLite from this sync, across every project in the workspace.`})]}),(0,w.jsx)(`p`,{className:`text-neutral mt-0.5`,children:s.domainsDiscovered??`—`})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`text-faint normal-case text-label-12`,children:`Started`}),(0,w.jsx)(`p`,{className:`text-neutral mt-0.5`,children:D(s.downloadStartedAt??s.createdAt)})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`text-faint normal-case text-label-12`,children:`Finished`}),(0,w.jsx)(`p`,{className:`text-neutral mt-0.5`,children:D(s.queryFinishedAt)})]})]}),s.error&&(0,w.jsx)(`p`,{className:`text-copy-14 text-negative-400 pt-2`,children:s.error})]}):(0,w.jsx)(`p`,{className:`text-copy-14 text-muted`,children:`No release sync has run in this workspace yet.`}),ee&&(0,w.jsx)(`div`,{className:`mt-4 rounded border border-caution-800/60 bg-caution-950/20 p-3`,children:(0,w.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,w.jsx)(i,{className:`h-4 w-4 text-caution-400 shrink-0 mt-0.5`,"aria-hidden":!0}),(0,w.jsxs)(`div`,{className:`text-label-14 text-neutral`,children:[(0,w.jsx)(`p`,{className:`text-copy-14-strong text-caution-200`,children:`Cached files for this release are missing.`}),(0,w.jsx)(`p`,{className:`mt-1 text-secondary`,children:`Sync this release again, or sync the newest release, before refreshing individual projects.`})]})]})}),(0,w.jsxs)(`div`,{className:`mt-4 material-base p-3`,children:[(0,w.jsxs)(`div`,{className:`flex items-start justify-between gap-3 mb-3`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`text-label-12 normal-case text-muted`,children:`Auto-detected release`}),P?(0,w.jsxs)(`p`,{className:`text-copy-14 text-strong mt-0.5`,children:[(0,w.jsx)(`code`,{className:`text-heading`,children:P.release}),(0,w.jsxs)(`span`,{className:`ml-2 text-label-12 text-muted`,children:[`Vertex `,E(P.vertexBytes),`, edges `,E(P.edgesBytes)]})]}):(0,w.jsx)(`p`,{className:`text-copy-14 text-muted mt-0.5`,children:I?`Checking Common Crawl…`:`Could not find a release. Choose one below.`}),(0,w.jsxs)(`a`,{href:T,target:`_blank`,rel:`noopener noreferrer`,className:`mt-1 inline-flex items-center gap-1 text-label-12 text-secondary hover:text-strong focus:text-strong focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-500 rounded`,children:[`Browse all Common Crawl web-graph releases`,(0,w.jsx)(t,{className:`h-3 w-3`,"aria-hidden":!0})]})]}),!y()&&(0,w.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[(0,w.jsxs)(h,{type:`button`,size:`sm`,disabled:B||!e?.duckdbInstalled||!P&&!H.trim(),onClick:b(Q),children:[(0,w.jsx)(n,{className:`h-4 w-4 mr-1.5`,"aria-hidden":!0}),B?`Queuing…`:`Run sync`]}),(0,w.jsxs)(S,{label:`What does Run sync do?`,children:[(0,w.jsxs)(`span`,{className:`block`,children:[`Downloads the auto-detected (or chosen) Common Crawl release (~16 GB) to`,` `,(0,w.jsx)(`code`,{className:`text-neutral`,children:`~/.canonry/cache/commoncrawl/`}),`, then runs a single DuckDB query that extracts referring domains for every project in this workspace.`]}),(0,w.jsxs)(`span`,{className:`mt-2 block text-secondary`,children:[`First time for a release: `,(0,w.jsx)(`span`,{className:`text-strong`,children:`~10–20 min download + ~5 min query`}),`. Re-running the same release later: `,(0,w.jsx)(`span`,{className:`text-strong`,children:`skips download, just re-queries`}),` (~5 min).`]})]})]})]}),y()?null:W?(0,w.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,w.jsx)(`input`,{type:`text`,className:`flex-1 min-w-[240px] rounded border border-strong bg-transparent px-2.5 py-1.5 text-label-14 text-strong placeholder-mono-400 focus:border-mono-500 focus:outline-none`,placeholder:`cc-main-2026-jan-feb-mar`,value:H,onChange:e=>U(e.target.value),disabled:B,autoFocus:!0}),(0,w.jsx)(`button`,{type:`button`,className:`text-button-14 text-secondary hover:text-neutral focus:text-neutral focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-500 rounded`,onClick:()=>{U(``),G(!1)},disabled:B,children:`Cancel`})]}):(0,w.jsx)(`button`,{type:`button`,className:`text-button-14 text-secondary hover:text-neutral focus:text-neutral focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-500 rounded`,onClick:()=>G(!0),disabled:B,children:`Use a different release →`})]}),!e?.duckdbInstalled&&(0,w.jsx)(`p`,{className:`text-copy-14 text-secondary mt-2`,children:`Install DuckDB first to enable sync.`})]})]}),(0,w.jsxs)(`details`,{className:`page-section-divider group`,children:[(0,w.jsx)(`summary`,{className:`cursor-pointer text-label-14-strong text-secondary hover:text-strong focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-500 rounded`,children:`Technical details and cache`}),(0,w.jsxs)(`div`,{className:`mt-4`,children:[(0,w.jsx)(`p`,{className:`text-copy-14 text-secondary mb-3`,children:`Cached releases support project re-extracts. Pruning a release does not remove saved backlink results.`}),(0,w.jsx)(x,{className:`surface-card overflow-hidden`,children:(0,w.jsxs)(`table`,{className:`w-full text-label-14`,children:[(0,w.jsx)(`thead`,{children:(0,w.jsxs)(`tr`,{className:`border-b border-base text-left text-label-12 normal-case text-faint`,children:[(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Release`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Sync status`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-right text-label-12-strong`,children:`Size`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Last used`}),!y()&&(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong sr-only`,children:`Actions`})]})}),(0,w.jsxs)(`tbody`,{children:[M.map(e=>(0,w.jsxs)(`tr`,{className:`border-b border-mono-900 last:border-0`,children:[(0,w.jsx)(`td`,{className:`px-4 py-2 text-strong`,children:(0,w.jsx)(`code`,{children:e.release})}),(0,w.jsx)(`td`,{className:`px-4 py-2`,children:e.syncStatus?(0,w.jsx)(g,{tone:O(e.syncStatus),children:e.syncStatus}):(0,w.jsx)(`span`,{className:`text-faint`,children:`—`})}),(0,w.jsx)(`td`,{className:`px-4 py-2 text-right text-secondary tabular-nums`,children:E(e.bytes)}),(0,w.jsx)(`td`,{className:`px-4 py-2 text-secondary`,children:D(e.lastUsedAt)}),!y()&&(0,w.jsx)(`td`,{className:`px-4 py-2 text-right`,children:(0,w.jsxs)(`div`,{className:`inline-flex items-center gap-1`,children:[(0,w.jsxs)(h,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{$(e.release)},children:[(0,w.jsx)(a,{className:`h-4 w-4 mr-1.5`,"aria-hidden":!0}),`Prune`]}),(0,w.jsx)(S,{label:`What does Prune do?`,placement:`top`,children:`Deletes the ~16 GB cache for this release from disk. Backlink results already in SQLite remain untouched. To re-run extracts against this release, you’d have to sync it again (another ~16 GB download).`})]})})]},e.release)),M.length===0&&(0,w.jsx)(`tr`,{children:(0,w.jsx)(`td`,{className:`px-4 py-4 text-label-14 text-muted`,colSpan:y()?4:5,children:`No cached releases on this machine. If you ran a sync from a different machine (or deleted the cache), the backlink data is still in the database — but you’ll need to re-sync a release to run new extracts.`})})]})]})}),(0,w.jsx)(`p`,{className:`mt-3 text-copy-13 text-muted`,children:`Common Crawl files are stored locally. DuckDB reads them; Canonry stores results in its normal database.`})]})]}),A.length>1&&(0,w.jsxs)(`section`,{className:`page-section-divider`,children:[(0,w.jsx)(`div`,{className:`section-head section-head-inline`,children:(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`History`}),(0,w.jsx)(`h2`,{children:`Past release syncs`})]})}),(0,w.jsx)(x,{className:`surface-card overflow-hidden`,children:(0,w.jsxs)(`table`,{className:`w-full text-label-14`,children:[(0,w.jsx)(`thead`,{children:(0,w.jsxs)(`tr`,{className:`border-b border-base text-left text-label-12 normal-case text-faint`,children:[(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Release`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Status`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-right text-label-12-strong`,children:`Projects`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-right text-label-12-strong`,children:`Rows`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Finished`})]})}),(0,w.jsx)(`tbody`,{children:A.map(e=>(0,w.jsxs)(`tr`,{className:`border-b border-mono-900 last:border-0`,children:[(0,w.jsx)(`td`,{className:`px-4 py-2 text-strong`,children:(0,w.jsx)(`code`,{children:e.release})}),(0,w.jsx)(`td`,{className:`px-4 py-2`,children:(0,w.jsx)(g,{tone:O(e.status),children:e.status})}),(0,w.jsx)(`td`,{className:`px-4 py-2 text-right text-secondary tabular-nums`,children:e.projectsProcessed??`—`}),(0,w.jsx)(`td`,{className:`px-4 py-2 text-right text-secondary tabular-nums`,children:e.domainsDiscovered??`—`}),(0,w.jsx)(`td`,{className:`px-4 py-2 text-secondary`,children:D(e.queryFinishedAt??e.updatedAt)})]},e.id))})]})})]})]})}export{k as BacklinksPage};
1
+ import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{B as t,C as n,V as r,o as i,s as a,st as o}from"./vendor-lucide-CoTHJwai.js";import{r as s}from"./vendor-markdown-cQgSk2i0.js";import{H as c,I as l,L as u,U as d,a as f,jt as p,q as m,r as h,t as g,un as _,vt as v,wt as y}from"./ToneBadge-BgTLSTKp.js";import{t as b}from"./async-handler-Bj3TnIRw.js";import{t as x}from"./card-BnVez9nG.js";import{t as S}from"./Hint-CfeZmZig.js";var C=e(o(),1),w=s(),T=`https://commoncrawl.org/web-graphs`;function E(e){return e==null?`—`:e>=0xe8d4a51000?`${(e/0xe8d4a51000).toFixed(1)} TB`:e>=1e9?`${(e/1e9).toFixed(1)} GB`:e>=1e6?`${(e/1e6).toFixed(1)} MB`:e>=1e3?`${(e/1e3).toFixed(1)} KB`:`${e} B`}function D(e){if(!e)return`—`;let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/6e4);if(n<1)return`just now`;if(n<60)return`${n}m ago`;let r=Math.floor(n/60);return r<24?`${r}h ago`:`${Math.floor(r/24)}d ago`}function O(e){switch(e){case`ready`:return`positive`;case`failed`:return`negative`;case`downloading`:case`querying`:case`queued`:return`caution`}}function k(){let[e,o]=(0,C.useState)(null),[s,k]=(0,C.useState)(null),[A,j]=(0,C.useState)([]),[M,N]=(0,C.useState)([]),[P,F]=(0,C.useState)(null),[I,L]=(0,C.useState)(!0),[R,z]=(0,C.useState)(!1),[B,V]=(0,C.useState)(!1),[H,U]=(0,C.useState)(``),[W,G]=(0,C.useState)(!1),[K,q]=(0,C.useState)(null),[J,Y]=(0,C.useState)(null),X=(0,C.useCallback)(async()=>{L(!0),q(null);try{let[e,t,n,r,i]=await Promise.all([l(),d().catch(()=>null),m().catch(()=>[]),u().catch(()=>[]),c().catch(()=>null)]);o(e),k(t),j(n),N(r),F(i)}catch(e){q(e instanceof Error?e.message:`Failed to load backlinks status`)}finally{L(!1)}},[]);(0,C.useEffect)(()=>{X()},[X]);async function Z(){z(!0),q(null),Y(null);try{let e=await v();Y(e.alreadyPresent?`DuckDB already installed (${e.version}).`:`Installed DuckDB ${e.version}.`),await X()}catch(e){q(e instanceof Error?e.message:`Failed to install DuckDB`)}finally{z(!1)}}async function Q(){let e=H.trim()||void 0;V(!0),q(null),Y(null);try{let t=await _(e);Y(e?`Queued sync for ${t.release}. Download + query runs in the background.`:`Queued sync for auto-discovered release ${t.release}. Download + query runs in the background.`),U(``),G(!1),await X()}catch(e){e instanceof f&&e.code===`MISSING_DEPENDENCY`?q(`DuckDB is not installed. Install it first.`):q(e instanceof Error?e.message:`Failed to trigger sync`)}finally{V(!1)}}async function $(e){q(null),Y(null);try{await p(e),Y(`Pruned cached release ${e}.`),await X()}catch(e){q(e instanceof Error?e.message:`Failed to prune release`)}}let ee=s?.status===`ready`&&M.every(e=>e.release!==s.release);return(0,w.jsxs)(`div`,{className:`page-container`,children:[(0,w.jsx)(`div`,{className:`page-header`,children:(0,w.jsxs)(`div`,{className:`page-header-left`,children:[(0,w.jsx)(`h1`,{className:`page-title`,children:`Backlink data`}),(0,w.jsx)(`p`,{className:`page-subtitle`,children:`Manage the shared backlink source and review its latest data.`})]})}),K&&(0,w.jsx)(x,{className:`surface-card p-4 mb-4 bg-negative-soft`,children:(0,w.jsx)(`p`,{className:`text-copy-14 text-negative`,children:K})}),J&&(0,w.jsx)(x,{className:`surface-card p-4 mb-4 bg-positive-soft`,children:(0,w.jsx)(`p`,{className:`text-copy-14 text-positive`,children:J})}),(0,w.jsxs)(`section`,{className:`page-section-divider`,children:[(0,w.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`Readiness`}),(0,w.jsx)(`h2`,{children:`Backlink source`})]}),e?.duckdbInstalled?(0,w.jsx)(g,{tone:`positive`,children:`Installed`}):(0,w.jsx)(g,{tone:`caution`,children:`Not installed`})]}),(0,w.jsx)(x,{className:`surface-card p-4`,children:I?(0,w.jsx)(`p`,{className:`text-copy-14 text-muted`,children:`Checking…`}):e?.duckdbInstalled?(0,w.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`Ready to sync a Common Crawl release.`}):(0,w.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,w.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`Install the local query engine to enable release syncs.`}),!y()&&(0,w.jsxs)(h,{type:`button`,size:`sm`,disabled:R,onClick:b(Z),children:[(0,w.jsx)(r,{className:`h-4 w-4 mr-1.5`,"aria-hidden":!0}),R?`Installing…`:`Install DuckDB`]})]})})]}),(0,w.jsxs)(`section`,{className:`page-section-divider`,children:[(0,w.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`Latest sync`}),(0,w.jsxs)(`h2`,{className:`flex items-center gap-2`,children:[`Release sync`,(0,w.jsx)(S,{label:`What is a release sync?`,children:`A release sync downloads one Common Crawl dump (~16 GB) and extracts backlinks for every project in this workspace in one pass. This is the heavy job — subsequent per-project re-runs skip the download and just re-query the cached files.`})]})]}),s&&(0,w.jsx)(g,{tone:O(s.status),children:s.status})]}),(0,w.jsxs)(x,{className:`surface-card p-5`,children:[s?(0,w.jsxs)(`div`,{className:`space-y-2 text-label-14`,children:[(0,w.jsxs)(`p`,{className:`text-strong`,children:[`Release `,(0,w.jsx)(`code`,{className:`text-neutral`,children:s.release})]}),s.phaseDetail&&(0,w.jsx)(`p`,{className:`text-secondary`,children:s.phaseDetail}),(0,w.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-4 gap-4 text-label-12 text-muted pt-2`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`text-faint normal-case text-label-12`,children:`Projects`}),(0,w.jsx)(`p`,{className:`text-neutral mt-0.5`,children:s.projectsProcessed??`—`})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsxs)(`p`,{className:`text-faint normal-case text-label-12 flex items-center gap-1`,children:[`Rows`,(0,w.jsx)(S,{label:`What are rows?`,children:`Total number of (project, referring domain) pairs persisted in SQLite from this sync, across every project in the workspace.`})]}),(0,w.jsx)(`p`,{className:`text-neutral mt-0.5`,children:s.domainsDiscovered??`—`})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`text-faint normal-case text-label-12`,children:`Started`}),(0,w.jsx)(`p`,{className:`text-neutral mt-0.5`,children:D(s.downloadStartedAt??s.createdAt)})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`text-faint normal-case text-label-12`,children:`Finished`}),(0,w.jsx)(`p`,{className:`text-neutral mt-0.5`,children:D(s.queryFinishedAt)})]})]}),s.error&&(0,w.jsx)(`p`,{className:`text-copy-14 text-negative-400 pt-2`,children:s.error})]}):(0,w.jsx)(`p`,{className:`text-copy-14 text-muted`,children:`No release sync has run in this workspace yet.`}),ee&&(0,w.jsx)(`div`,{className:`mt-4 rounded border border-caution-800/60 bg-caution-950/20 p-3`,children:(0,w.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,w.jsx)(i,{className:`h-4 w-4 text-caution-400 shrink-0 mt-0.5`,"aria-hidden":!0}),(0,w.jsxs)(`div`,{className:`text-label-14 text-neutral`,children:[(0,w.jsx)(`p`,{className:`text-copy-14-strong text-caution-200`,children:`Cached files for this release are missing.`}),(0,w.jsx)(`p`,{className:`mt-1 text-secondary`,children:`Sync this release again, or sync the newest release, before refreshing individual projects.`})]})]})}),(0,w.jsxs)(`div`,{className:`mt-4 material-base p-3`,children:[(0,w.jsxs)(`div`,{className:`flex items-start justify-between gap-3 mb-3`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`text-label-12 normal-case text-muted`,children:`Auto-detected release`}),P?(0,w.jsxs)(`p`,{className:`text-copy-14 text-strong mt-0.5`,children:[(0,w.jsx)(`code`,{className:`text-heading`,children:P.release}),(0,w.jsxs)(`span`,{className:`ml-2 text-label-12 text-muted`,children:[`Vertex `,E(P.vertexBytes),`, edges `,E(P.edgesBytes)]})]}):(0,w.jsx)(`p`,{className:`text-copy-14 text-muted mt-0.5`,children:I?`Checking Common Crawl…`:`Could not find a release. Choose one below.`}),(0,w.jsxs)(`a`,{href:T,target:`_blank`,rel:`noopener noreferrer`,className:`mt-1 inline-flex items-center gap-1 text-label-12 text-secondary hover:text-strong focus:text-strong focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-500 rounded`,children:[`Browse all Common Crawl web-graph releases`,(0,w.jsx)(t,{className:`h-3 w-3`,"aria-hidden":!0})]})]}),!y()&&(0,w.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[(0,w.jsxs)(h,{type:`button`,size:`sm`,disabled:B||!e?.duckdbInstalled||!P&&!H.trim(),onClick:b(Q),children:[(0,w.jsx)(n,{className:`h-4 w-4 mr-1.5`,"aria-hidden":!0}),B?`Queuing…`:`Run sync`]}),(0,w.jsxs)(S,{label:`What does Run sync do?`,children:[(0,w.jsxs)(`span`,{className:`block`,children:[`Downloads the auto-detected (or chosen) Common Crawl release (~16 GB) to`,` `,(0,w.jsx)(`code`,{className:`text-neutral`,children:`~/.canonry/cache/commoncrawl/`}),`, then runs a single DuckDB query that extracts referring domains for every project in this workspace.`]}),(0,w.jsxs)(`span`,{className:`mt-2 block text-secondary`,children:[`First time for a release: `,(0,w.jsx)(`span`,{className:`text-strong`,children:`~10–20 min download + ~5 min query`}),`. Re-running the same release later: `,(0,w.jsx)(`span`,{className:`text-strong`,children:`skips download, just re-queries`}),` (~5 min).`]})]})]})]}),y()?null:W?(0,w.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,w.jsx)(`input`,{type:`text`,className:`flex-1 min-w-[240px] rounded border border-strong bg-transparent px-2.5 py-1.5 text-label-14 text-strong placeholder-mono-400 focus:border-mono-500 focus:outline-none`,placeholder:`cc-main-2026-jan-feb-mar`,value:H,onChange:e=>U(e.target.value),disabled:B,autoFocus:!0}),(0,w.jsx)(`button`,{type:`button`,className:`text-button-14 text-secondary hover:text-neutral focus:text-neutral focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-500 rounded`,onClick:()=>{U(``),G(!1)},disabled:B,children:`Cancel`})]}):(0,w.jsx)(`button`,{type:`button`,className:`text-button-14 text-secondary hover:text-neutral focus:text-neutral focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-500 rounded`,onClick:()=>G(!0),disabled:B,children:`Use a different release →`})]}),!e?.duckdbInstalled&&(0,w.jsx)(`p`,{className:`text-copy-14 text-secondary mt-2`,children:`Install DuckDB first to enable sync.`})]})]}),(0,w.jsxs)(`details`,{className:`page-section-divider group`,children:[(0,w.jsx)(`summary`,{className:`cursor-pointer text-label-14-strong text-secondary hover:text-strong focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-500 rounded`,children:`Technical details and cache`}),(0,w.jsxs)(`div`,{className:`mt-4`,children:[(0,w.jsx)(`p`,{className:`text-copy-14 text-secondary mb-3`,children:`Cached releases support project re-extracts. Pruning a release does not remove saved backlink results.`}),(0,w.jsx)(x,{className:`surface-card overflow-hidden`,children:(0,w.jsxs)(`table`,{className:`w-full text-label-14`,children:[(0,w.jsx)(`thead`,{children:(0,w.jsxs)(`tr`,{className:`border-b border-base text-left text-label-12 normal-case text-faint`,children:[(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Release`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Sync status`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-right text-label-12-strong`,children:`Size`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Last used`}),!y()&&(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong sr-only`,children:`Actions`})]})}),(0,w.jsxs)(`tbody`,{children:[M.map(e=>(0,w.jsxs)(`tr`,{className:`border-b border-mono-900 last:border-0`,children:[(0,w.jsx)(`td`,{className:`px-4 py-2 text-strong`,children:(0,w.jsx)(`code`,{children:e.release})}),(0,w.jsx)(`td`,{className:`px-4 py-2`,children:e.syncStatus?(0,w.jsx)(g,{tone:O(e.syncStatus),children:e.syncStatus}):(0,w.jsx)(`span`,{className:`text-faint`,children:`—`})}),(0,w.jsx)(`td`,{className:`px-4 py-2 text-right text-secondary tabular-nums`,children:E(e.bytes)}),(0,w.jsx)(`td`,{className:`px-4 py-2 text-secondary`,children:D(e.lastUsedAt)}),!y()&&(0,w.jsx)(`td`,{className:`px-4 py-2 text-right`,children:(0,w.jsxs)(`div`,{className:`inline-flex items-center gap-1`,children:[(0,w.jsxs)(h,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{$(e.release)},children:[(0,w.jsx)(a,{className:`h-4 w-4 mr-1.5`,"aria-hidden":!0}),`Prune`]}),(0,w.jsx)(S,{label:`What does Prune do?`,placement:`top`,children:`Deletes the ~16 GB cache for this release from disk. Backlink results already in SQLite remain untouched. To re-run extracts against this release, you’d have to sync it again (another ~16 GB download).`})]})})]},e.release)),M.length===0&&(0,w.jsx)(`tr`,{children:(0,w.jsx)(`td`,{className:`px-4 py-4 text-label-14 text-muted`,colSpan:y()?4:5,children:`No cached releases on this machine. If you ran a sync from a different machine (or deleted the cache), the backlink data is still in the database — but you’ll need to re-sync a release to run new extracts.`})})]})]})}),(0,w.jsx)(`p`,{className:`mt-3 text-copy-13 text-muted`,children:`Common Crawl files are stored locally. DuckDB reads them; Canonry stores results in its normal database.`})]})]}),A.length>1&&(0,w.jsxs)(`section`,{className:`page-section-divider`,children:[(0,w.jsx)(`div`,{className:`section-head section-head-inline`,children:(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`History`}),(0,w.jsx)(`h2`,{children:`Past release syncs`})]})}),(0,w.jsx)(x,{className:`surface-card overflow-hidden`,children:(0,w.jsxs)(`table`,{className:`w-full text-label-14`,children:[(0,w.jsx)(`thead`,{children:(0,w.jsxs)(`tr`,{className:`border-b border-base text-left text-label-12 normal-case text-faint`,children:[(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Release`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Status`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-right text-label-12-strong`,children:`Projects`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-right text-label-12-strong`,children:`Rows`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Finished`})]})}),(0,w.jsx)(`tbody`,{children:A.map(e=>(0,w.jsxs)(`tr`,{className:`border-b border-mono-900 last:border-0`,children:[(0,w.jsx)(`td`,{className:`px-4 py-2 text-strong`,children:(0,w.jsx)(`code`,{children:e.release})}),(0,w.jsx)(`td`,{className:`px-4 py-2`,children:(0,w.jsx)(g,{tone:O(e.status),children:e.status})}),(0,w.jsx)(`td`,{className:`px-4 py-2 text-right text-secondary tabular-nums`,children:e.projectsProcessed??`—`}),(0,w.jsx)(`td`,{className:`px-4 py-2 text-right text-secondary tabular-nums`,children:e.domainsDiscovered??`—`}),(0,w.jsx)(`td`,{className:`px-4 py-2 text-secondary`,children:D(e.queryFinishedAt??e.updatedAt)})]},e.id))})]})})]})]})}export{k as BacklinksPage};
@@ -1 +1 @@
1
- import{r as e}from"./vendor-markdown-cQgSk2i0.js";import{c as t,f as n,i as r,m as i,r as a,s as o,t as s,u as c}from"./vendor-recharts-AnNqECZW.js";var l=e(),u={contentStyle:{backgroundColor:`var(--chart-tooltip-bg, #0a0a0a)`,border:`none`,borderRadius:`var(--radius-material-tooltip)`,boxShadow:`var(--shadow-material-tooltip)`,fontSize:13,lineHeight:`18px`,fontWeight:400},labelStyle:{color:`var(--chart-tooltip-label, #ededed)`},itemStyle:{color:`var(--chart-tooltip-item, #a1a1a1)`}},d={fill:`var(--chart-neutral-text-dim, #a1a1a1)`,fontSize:12},f=`var(--chart-grid, #2e2e2e)`,p=`var(--chart-axis, #2e2e2e)`,m=[`var(--chart-series-1, #34d399)`,`var(--chart-series-2, #60a5fa)`,`var(--chart-series-3, #f472b6)`,`var(--chart-series-4, #facc15)`,`var(--chart-series-5, #a78bfa)`,`var(--chart-series-6, #fb923c)`,`var(--chart-series-7, #22d3ee)`,`var(--chart-series-8, #f87171)`],h={gemini:`#60a5fa`,openai:`#34d399`,claude:`#fb923c`,perplexity:`#22d3ee`,muse:`#818cf8`,local:`#a78bfa`};function g(e,t=0){return h[e]??m[t%m.length]}var _={text:`var(--chart-neutral-text, #a1a1a1)`,textDim:`var(--chart-neutral-text-dim, #a1a1a1)`,textFaint:`var(--chart-neutral-text-faint, #7d7d7d)`,surface:`var(--chart-neutral-surface, #2e2e2e)`,trackSubtle:`var(--chart-neutral-track-subtle, rgb(255 255 255 / 0.04))`,gridLine:`var(--chart-neutral-grid-line, rgb(255 255 255 / 0.06))`},v={positive:`var(--chart-tone-positive, #34d399)`,positiveDeep:`var(--chart-tone-positive-deep, #10b981)`,caution:`var(--chart-tone-caution, #fbbf24)`,negative:`var(--chart-tone-negative, #fb7185)`,neutral:`var(--chart-tone-neutral, #a1a1a1)`};function y(e){return e}function b(e){let t=/^(\d{4})-(\d{2})-(\d{2})/.exec(e);return t?{year:Number(t[1]),month:Number(t[2]),day:Number(t[3])}:null}function x(e){let t=String(e),n=b(t);return n?new Date(Date.UTC(n.year,n.month-1,n.day)).toLocaleDateString(void 0,{timeZone:`UTC`,month:`short`,day:`numeric`,year:`numeric`}):t}function S(e){let t=b(String(e));return t?`${t.month}/${t.day}`:String(e)}function C(e){let t=b(String(e));return t?new Date(Date.UTC(t.year,t.month-1,t.day)).toLocaleDateString(void 0,{timeZone:`UTC`,month:`short`,day:`numeric`}):String(e)}function w(e){return new Date(e).toLocaleDateString(void 0,{month:`short`,day:`numeric`,year:`numeric`})}function T(e){return new Date(e).toLocaleDateString(void 0,{month:`short`,day:`numeric`})}function E(e){return new Date(e).getFullYear()}function D(e){let t=new Date(e);return`${t.getMonth()+1}/${t.getDate()}`}function O({data:e,xKey:m,series:h,height:g=260,xTickFormatter:v,labelFormatter:y,onSelectX:b,selectedX:x,accessibilityLayer:S=!0,ariaLabel:C}){let w=[...new Set(h.map(e=>e.axisId))],T=new Map(h.map(e=>[e.label,e.formatValue])),E=e.map((t,n)=>{let r={...t};for(let t of h){if(!t.trend)continue;let i=t.trend.startIndex??0,a=t.trend.endIndex??e.length-1;n<i||n>a?r[`${t.dataKey}__trend`]=null:r[`${t.dataKey}__trend`]=a<=i?t.trend.start:t.trend.start+(t.trend.end-t.trend.start)*(n-i)/(a-i)}return r});return(0,l.jsx)(i,{width:`100%`,height:g,children:(0,l.jsxs)(s,{data:E,accessibilityLayer:S,"aria-label":C,margin:{top:8,right:8,bottom:4,left:0},onClick:b?e=>{e?.activeLabel!==void 0&&b(String(e.activeLabel))}:void 0,style:b?{cursor:`pointer`}:void 0,children:[(0,l.jsx)(t,{stroke:f,strokeDasharray:`3 3`,vertical:!1}),x!=null&&(0,l.jsx)(c,{x,yAxisId:w[0],stroke:_.text,strokeDasharray:`2 3`,strokeWidth:1}),(0,l.jsx)(r,{dataKey:m,tick:d,stroke:p,tickFormatter:v,minTickGap:24}),w.map((e,t)=>{let n=h.find(t=>t.axisId===e);return(0,l.jsx)(a,{yAxisId:e,orientation:t===1?`right`:`left`,hide:t>1,reversed:n.inverted??!1,domain:n.inverted?[1,`auto`]:[0,`auto`],tick:d,stroke:p,width:48,tickFormatter:n.formatValue},e)}),(0,l.jsx)(n,{...u,labelFormatter:e=>{let t=typeof e==`string`||typeof e==`number`?String(e):``;return y?y(t):t},formatter:(e,t)=>{let n=String(t??``);return typeof e==`number`?[T.get(n)?.(e)??e.toLocaleString(),n]:[String(e??``),n]}}),h.filter(e=>e.trend).map(e=>(0,l.jsx)(o,{yAxisId:e.axisId,dataKey:`${e.dataKey}__trend`,name:`${e.label} trend`,stroke:e.color,strokeWidth:1.5,strokeDasharray:`5 4`,strokeOpacity:.55,dot:!1,activeDot:!1,isAnimationActive:!1,legendType:`none`,tooltipType:`none`},`${e.dataKey}-trend`)),h.map(e=>(0,l.jsx)(o,{yAxisId:e.axisId,dataKey:e.dataKey,name:e.label,stroke:e.color,strokeWidth:2,dot:!1,activeDot:{r:3},connectNulls:!1,isAnimationActive:!1},e.dataKey))]})})}export{g as _,m as a,O as c,S as d,w as f,E as g,y as h,_ as i,x as l,D as m,d as n,v as o,T as p,f as r,u as s,p as t,C as u};
1
+ import{r as e}from"./vendor-markdown-cQgSk2i0.js";import{c as t,f as n,i as r,m as i,r as a,s as o,t as s,u as c}from"./vendor-recharts-AnNqECZW.js";var l=e(),u={contentStyle:{backgroundColor:`var(--chart-tooltip-bg, #0a0a0a)`,border:`none`,borderRadius:`var(--radius-material-tooltip)`,boxShadow:`var(--shadow-material-tooltip)`,fontSize:13,lineHeight:`18px`,fontWeight:400},labelStyle:{color:`var(--chart-tooltip-label, #ededed)`},itemStyle:{color:`var(--chart-tooltip-item, #a1a1a1)`}},d={fill:`var(--chart-neutral-text-dim, #a1a1a1)`,fontSize:12},f=`var(--chart-grid, #2e2e2e)`,p=`var(--chart-axis, #2e2e2e)`,m=[`var(--chart-series-1, #34d399)`,`var(--chart-series-2, #60a5fa)`,`var(--chart-series-3, #f472b6)`,`var(--chart-series-4, #facc15)`,`var(--chart-series-5, #a78bfa)`,`var(--chart-series-6, #fb923c)`,`var(--chart-series-7, #22d3ee)`,`var(--chart-series-8, #f87171)`],h={gemini:`#60a5fa`,openai:`#34d399`,claude:`#fb923c`,perplexity:`#22d3ee`,muse:`#818cf8`,local:`#a78bfa`};function g(e,t=0){return h[e]??m[t%m.length]}var _={text:`var(--chart-neutral-text, #a1a1a1)`,textDim:`var(--chart-neutral-text-dim, #a1a1a1)`,textFaint:`var(--chart-neutral-text-faint, #7d7d7d)`,surface:`var(--chart-neutral-surface, #2e2e2e)`,trackSubtle:`var(--chart-neutral-track-subtle, rgb(255 255 255 / 0.04))`,gridLine:`var(--chart-neutral-grid-line, rgb(255 255 255 / 0.06))`},v={positive:`var(--chart-tone-positive, #34d399)`,positiveDeep:`var(--chart-tone-positive-deep, #10b981)`,caution:`var(--chart-tone-caution, #fbbf24)`,negative:`var(--chart-tone-negative, #fb7185)`,neutral:`var(--chart-tone-neutral, #a1a1a1)`};function y(e){return e}function b(e){let t=/^(\d{4})-(\d{2})-(\d{2})/.exec(e);return t?{year:Number(t[1]),month:Number(t[2]),day:Number(t[3])}:null}function x(e){let t=String(e),n=b(t);return n?new Date(Date.UTC(n.year,n.month-1,n.day)).toLocaleDateString(void 0,{timeZone:`UTC`,month:`short`,day:`numeric`,year:`numeric`}):t}function S(e){let t=b(String(e));return t?`${t.month}/${t.day}`:String(e)}function C(e){let t=b(String(e));return t?new Date(Date.UTC(t.year,t.month-1,t.day)).toLocaleDateString(void 0,{timeZone:`UTC`,month:`short`,day:`numeric`}):String(e)}function w(e){return new Date(e).toLocaleDateString(void 0,{month:`short`,day:`numeric`,year:`numeric`})}function T(e){return new Date(e).toLocaleDateString(void 0,{month:`short`,day:`numeric`})}function E(e){return new Date(e).getFullYear()}function D(e){let t=new Date(e);return`${t.getMonth()+1}/${t.getDate()}`}function O({data:e,xKey:m,series:h,height:g=260,xTickFormatter:v,labelFormatter:y,onSelectX:b,selectedX:x,accessibilityLayer:S=!0,ariaLabel:C}){let w=[...new Set(h.map(e=>e.axisId))],T=new Map(h.map(e=>[e.label,e.formatValue])),E=e.map((t,n)=>{let r={...t};for(let t of h){if(!t.trend)continue;let i=t.trend.startIndex??0,a=t.trend.endIndex??e.length-1;n<i||n>a?r[`${t.dataKey}__trend`]=null:r[`${t.dataKey}__trend`]=a<=i?t.trend.start:t.trend.start+(t.trend.end-t.trend.start)*(n-i)/(a-i)}return r});return(0,l.jsx)(i,{width:`100%`,height:g,children:(0,l.jsxs)(s,{data:E,accessibilityLayer:S,"aria-label":C,margin:{top:8,right:8,bottom:4,left:0},onClick:b?e=>{e?.activeLabel!==void 0&&b(String(e.activeLabel))}:void 0,style:b?{cursor:`pointer`}:void 0,children:[(0,l.jsx)(t,{stroke:f,strokeDasharray:`3 3`,vertical:!1}),x!=null&&(0,l.jsx)(c,{x,yAxisId:w[0],stroke:_.text,strokeDasharray:`2 3`,strokeWidth:1}),(0,l.jsx)(r,{dataKey:m,tick:d,stroke:p,tickFormatter:v,minTickGap:24}),w.map((e,t)=>{let n=h.find(t=>t.axisId===e);return(0,l.jsx)(a,{yAxisId:e,orientation:t===1?`right`:`left`,hide:t>1,reversed:n.inverted??!1,domain:n.inverted?[1,`auto`]:[0,`auto`],tick:d,stroke:p,width:48,tickFormatter:n.formatValue},e)}),(0,l.jsx)(n,{...u,labelFormatter:e=>{let t=typeof e==`string`||typeof e==`number`?String(e):``;return y?y(t):t},formatter:(e,t)=>{let n=String(t??``);return typeof e==`number`?[T.get(n)?.(e)??e.toLocaleString(),n]:[String(e??``),n]}}),h.filter(e=>e.trend).map(e=>(0,l.jsx)(o,{yAxisId:e.axisId,dataKey:`${e.dataKey}__trend`,name:`${e.label} trend`,stroke:e.color,strokeWidth:1.5,strokeDasharray:`5 4`,strokeOpacity:.55,dot:!1,activeDot:!1,isAnimationActive:!1,legendType:`none`,tooltipType:`none`},`${e.dataKey}-trend`)),h.map(e=>(0,l.jsx)(o,{yAxisId:e.axisId,dataKey:e.dataKey,name:e.label,stroke:e.color,strokeWidth:2,dot:!1,activeDot:{r:3},connectNulls:e.connectNulls??!1,isAnimationActive:!1},e.dataKey))]})})}export{g as _,m as a,O as c,S as d,w as f,E as g,y as h,_ as i,x as l,D as m,d as n,v as o,T as p,f as r,u as s,p as t,C as u};
@@ -1 +1 @@
1
- import{r as e}from"./vendor-markdown-cQgSk2i0.js";import{t}from"./AuditHistoryPanel-CuqdFCb9.js";var n=e();function r(){return(0,n.jsxs)(`div`,{className:`page-container`,children:[(0,n.jsx)(`div`,{className:`page-header`,children:(0,n.jsxs)(`div`,{className:`page-header-left`,children:[(0,n.jsx)(`h1`,{className:`page-title`,children:`History`}),(0,n.jsx)(`p`,{className:`page-subtitle`,children:`Changes to projects and settings.`})]})}),(0,n.jsx)(t,{})]})}export{r as HistoryPage};
1
+ import{r as e}from"./vendor-markdown-cQgSk2i0.js";import{t}from"./AuditHistoryPanel-9B0XpYsN.js";var n=e();function r(){return(0,n.jsxs)(`div`,{className:`page-container`,children:[(0,n.jsx)(`div`,{className:`page-header`,children:(0,n.jsxs)(`div`,{className:`page-header-left`,children:[(0,n.jsx)(`h1`,{className:`page-title`,children:`History`}),(0,n.jsx)(`p`,{className:`page-subtitle`,children:`Changes to projects and settings.`})]})}),(0,n.jsx)(t,{})]})}export{r as HistoryPage};
@@ -1,4 +1,4 @@
1
- import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{at as t,st as n}from"./vendor-lucide-CoTHJwai.js";import{r}from"./vendor-markdown-cQgSk2i0.js";import{_ as i,b as a,d as o,f as s,g as c,p as l,u}from"./vendor-tanstack-q5SvZtcv.js";import{Ct as d,Gr as f,Kr as p,Qr as ee,ji as m,mt as h,oi as g,ot as te,r as _,t as v}from"./ToneBadge-DwUBSAjL.js";import{_ as y,a as b,b as x}from"./format-helpers-Cgq0VzXz.js";import{r as ne}from"./account-context-D7M4W4wP.js";import{et as S,it as C,nn as re,nt as ie,rt as w,st as T,tt as ae,ut as oe}from"./react-query-D0OiMBt3.js";import{f as E,h as D}from"./ChartPrimitives-B5L9FUj3.js";import{t as O}from"./InfoTooltip-DrBIPuSU.js";import{I as k,J as A,L as j,V as se,W as M,X as N,at as P,cn as ce,fn as le,q as ue,st as F,un as de,z as fe}from"./index-A-4JN4Pv.js";import{c as I,r as L,s as pe,t as R}from"./service-Bu-7icpb.js";var z=e(n(),1),B=r(),V={heading:`Names that count as this Property`,help:`An answer mentions this Property when its text contains one of these names as whole words. Source titles and source links never count, but a link in the answer whose text is one of these names does. Qualified names are longer forms, such as the name with its street or city, for a name that other places share.`,names:`Names`,qualifiedNames:`Qualified names`,noNames:`No names are set, so answers can cite this Property but never mention it.`,edit:`Edit names`,save:`Save to draft`,saving:`Saving…`,cancel:`Cancel`,namesHint:`One name per line.`,qualifiedHint:`One per line. Each must include one of the names above plus more words, such as a street or city.`,qualifiedNote:`With qualified names set, an answer that uses only a plain name counts as a mention only when it also cites this Property’s own page. Otherwise it is left out as not tied to one property.`,draftOnly:`Saving changes the draft only. Nothing is measured differently until the setup is published.`,saved:`Saved to the draft. Publish the setup to start using these names.`,pending:`Name changes are saved in the draft and not published yet.`,review:`Review and publish`,noChanges:`No changes to save.`,staleDraft:`The draft is based on an older published setup. Open measurement setup to restart it before editing names.`,missingFromDraft:`This Property is not included in the current draft. Open measurement setup to review it.`,conflict:`The draft changed in another session. The latest names are loaded; review them and save again.`,failed:`Could not save these names. Try again.`};function H(e){return[...new Set(e.split(`
2
- `).map(e=>e.trim()).filter(Boolean))]}function U(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}function W(e,t){return U(e.aliases,t.aliases)&&U(e.identityAliases??[],t.identityAliases??[])}function me(e,t,n){let{identityAliases:r,...i}=e;return n.length>0?{...i,aliases:t,identityAliases:n}:{...i,aliases:t}}function he({label:e,names:t}){return(0,B.jsxs)(`div`,{className:`space-y-1`,children:[(0,B.jsx)(`h3`,{className:`text-heading-14 text-heading`,children:e}),(0,B.jsx)(`ul`,{className:`space-y-1`,children:t.map(e=>(0,B.jsx)(`li`,{className:`text-label-14 text-secondary`,children:e},e))})]})}function G({id:e,issues:t}){return t.length===0?null:(0,B.jsx)(`ul`,{id:e,className:`mt-2 space-y-1`,"aria-label":`Name warnings`,children:t.map(e=>(0,B.jsx)(`li`,{className:`text-label-14 text-caution`,children:f(e)},`${e.field}:${e.index}`))})}function ge({projectName:e,targetKey:t,published:n,activeRevision:r,publishedBrandNames:o,service:s=R}){let{canWrite:c}=ne(),l=(0,z.useId)(),d=a({...ae({client:h,path:{name:e}}),enabled:c}),f=a({...oe({client:h,path:{name:e}}),enabled:c}),m=d.data?.draft?.authoring.targets.find(e=>e.stableKey===t),g=n.identityAliases??[],te=m!==void 0&&d.data?.draft?.baseActiveRevision===r&&!W(m,n),v=!d.isFetching&&!f.isPending,y=f.data,b=(0,z.useMemo)(()=>y?ee(y):o,[y,o]),[x,S]=(0,z.useState)(!1),[C,re]=(0,z.useState)(``),[ie,w]=(0,z.useState)(``),[T,E]=(0,z.useState)(n),[D,k]=(0,z.useState)(null),A=`${e}\u0000${t}`,[j,se]=(0,z.useState)(A);j!==A&&(se(A),S(!1),re(``),w(``),E(n),k(null));let M=(0,z.useRef)(A);M.current=A;let N=(0,z.useMemo)(()=>H(C),[C]),P=(0,z.useMemo)(()=>H(ie),[ie]),ce=(0,z.useMemo)(()=>p({aliases:N,identityAliases:P,brandNames:b}),[N,P,b]),le=ce.filter(e=>e.field===`aliases`),ue=ce.filter(e=>e.field===`identityAliases`);function F(e){re(e.aliases.join(`
3
- `)),w((e.identityAliases??[]).join(`
4
- `)),E({aliases:[...e.aliases],identityAliases:[...e.identityAliases??[]]})}function de(e){return e.draft?e.draft.authoring.targets.find(e=>e.stableKey===t)??null:n}function I(){F(te?m:n),k(null),S(!0)}function pe(e){e&&F(e),k({tone:`negative`,text:V.conflict,review:!1})}let U=i({mutationFn:async i=>{let a=await s.loadDraft(e);if(!a.draft){if(W(i.names,n))return{outcome:`unchanged`};if(!W(i.base,n))return{outcome:`conflict`,latest:n};await s.createDraft(e,r),a=await s.loadDraft(e)}let o=a.draft;if(!o||!a.etag)throw Error(V.failed);if(o.baseActiveRevision!==r)return{outcome:`stale`};let c=o.authoring.targets.find(e=>e.stableKey===t);return!c||c.status!==`included`?{outcome:`missing`}:W(i.names,c)?{outcome:`unchanged`}:W(i.base,c)?(await s.upsertTarget(e,a.etag,me(c,i.names.aliases,i.names.identityAliases)),{outcome:`saved`}):{outcome:`conflict`,latest:c}},meta:{skipGlobalErrorToast:!0},onSuccess:(e,t)=>{if(t.openFor===M.current)switch(e.outcome){case`saved`:S(!1),k({tone:`positive`,text:V.saved,review:!0});return;case`unchanged`:S(!1),k({tone:`positive`,text:V.noChanges,review:!1});return;case`stale`:k({tone:`negative`,text:V.staleDraft,review:!0});return;case`missing`:k({tone:`negative`,text:V.missingFromDraft,review:!0});return;case`conflict`:pe(e.latest),d.refetch();return}},onError:(e,t)=>{t.openFor===M.current&&(L(e)?(pe(null),d.refetch().then(e=>{e.isSuccess&&pe(de(e.data))})):k({tone:`negative`,text:V.failed,review:!1}))}}),ge=(0,B.jsx)(u,{to:`/projects/$projectName/portfolio`,params:{projectName:e},className:`text-link underline-offset-2 hover:underline`,children:V.review}),K=n.aliases.length+g.length;return(0,B.jsxs)(`section`,{"aria-labelledby":`property-names`,className:`page-section-divider`,children:[(0,B.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,B.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,B.jsx)(`h2`,{id:`property-names`,className:`text-heading-16 text-heading`,children:V.heading}),(0,B.jsx)(O,{text:V.help})]}),(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,B.jsxs)(`p`,{className:`supporting-copy`,children:[K,` `,K===1?`name`:`names`]}),c&&!x?(0,B.jsx)(_,{type:`button`,size:`sm`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,disabled:!v,onClick:I,children:V.edit}):null]})]}),D?(0,B.jsxs)(`p`,{role:D.tone===`negative`?`alert`:`status`,className:`mb-3 text-copy-14 ${D.tone===`negative`?`text-negative`:`text-positive`}`,children:[D.text,D.review?(0,B.jsxs)(B.Fragment,{children:[` `,ge]}):null]}):te&&!x?(0,B.jsxs)(`p`,{role:`status`,className:`mb-3 text-copy-14 text-caution`,children:[V.pending,` `,ge]}):null,x?(0,B.jsxs)(`form`,{className:`space-y-4`,"aria-label":`Edit names`,onSubmit:e=>{e.preventDefault(),!U.isPending&&U.mutate({names:{aliases:N,identityAliases:P},base:T,openFor:A})},children:[(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`label`,{htmlFor:`${l}-names`,className:`block text-label-14-strong text-heading`,children:V.names}),(0,B.jsx)(`p`,{id:`${l}-names-hint`,className:`text-copy-14 text-secondary`,children:V.namesHint}),(0,B.jsx)(`textarea`,{id:`${l}-names`,className:`mt-1 min-h-24 w-full rounded-md border border-strong bg-transparent px-3 py-2 text-copy-14 text-strong focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-mono-400`,"aria-describedby":`${l}-names-hint${le.length?` ${l}-names-issues`:``}`,value:C,onChange:e=>re(e.target.value)}),(0,B.jsx)(G,{id:`${l}-names-issues`,issues:le}),N.length===0?(0,B.jsx)(`p`,{className:`mt-2 text-copy-14 text-caution`,children:V.noNames}):null]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`label`,{htmlFor:`${l}-qualified`,className:`block text-label-14-strong text-heading`,children:V.qualifiedNames}),(0,B.jsx)(`p`,{id:`${l}-qualified-hint`,className:`text-copy-14 text-secondary`,children:V.qualifiedHint}),(0,B.jsx)(`textarea`,{id:`${l}-qualified`,className:`mt-1 min-h-20 w-full rounded-md border border-strong bg-transparent px-3 py-2 text-copy-14 text-strong focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-mono-400`,"aria-describedby":`${l}-qualified-hint ${l}-qualified-note${ue.length?` ${l}-qualified-issues`:``}`,value:ie,onChange:e=>w(e.target.value)}),(0,B.jsx)(G,{id:`${l}-qualified-issues`,issues:ue}),(0,B.jsx)(`p`,{id:`${l}-qualified-note`,className:`mt-2 max-w-3xl text-copy-14 text-secondary`,children:V.qualifiedNote})]}),(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:V.draftOnly}),(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,B.jsx)(fe,{type:`submit`,className:`h-11 px-4 text-label-14 md:h-11`,disabled:U.isPending,children:U.isPending?V.saving:V.save}),(0,B.jsx)(_,{type:`button`,variant:`ghost`,className:`h-11 px-4 text-button-14 md:h-11`,disabled:U.isPending,onClick:()=>{S(!1),k(null)},children:V.cancel})]})]}):K===0?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:V.noNames}):(0,B.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[n.aliases.length>0?(0,B.jsx)(he,{label:V.names,names:n.aliases}):null,g.length>0?(0,B.jsx)(he,{label:V.qualifiedNames,names:g}):null]})]})}var K=50,q={branded:{headline:`When they know your name`,technical:`Branded queries`},"non-brand":{headline:`When they don't`,technical:`Non-brand queries`}},_e={plan_v1:`Setup update required`,no_completed_run:`No completed measurement yet`,no_population:`No queries of this type are assigned`,evidence_incomplete:`Source evidence is incomplete`,identity_ambiguous:x,not_applicable:`Not applicable for this Property`},ve={complete:{label:`Measured`,tone:`positive`},partial:{label:`Partly measured`,tone:`caution`},running:{label:`Measuring now`,tone:`neutral`},queued:{label:`Measurement queued`,tone:`neutral`},failed:{label:`Measurement failed`,tone:`negative`},not_measured:{label:`Not measured`,tone:`neutral`}},J={assigned:{label:`Matches this Property`,tone:`positive`},sibling:{label:`Matches another Property`,tone:`caution`},ownedUnmapped:{label:`Site URL not in a Property`,tone:`caution`},external:{label:`External URL`,tone:`neutral`},ambiguous:{label:`Matches multiple Properties`,tone:`caution`},invalid:{label:`Invalid URL`,tone:`negative`}};function Y(e){return[...e].sort((e,t)=>Number(t.classification===`assigned`)-Number(e.classification===`assigned`))}function ye(e){return`${e.expectedSlotId}:${e.usageEdgeId}`}function be({row:e}){return e.mentioned===null?(0,B.jsxs)(`span`,{className:`inline-flex flex-col items-start gap-0.5`,children:[(0,B.jsx)(v,{tone:`neutral`,children:`Not measured`}),(0,B.jsx)(`span`,{className:`text-label-12 text-muted`,children:`No mention signal for this Property`})]}):!e.mentioned&&e.mentionIdentity===`wrong-subject`?(0,B.jsxs)(`span`,{className:`inline-flex flex-col items-start gap-0.5`,children:[(0,B.jsx)(v,{tone:`neutral`,children:`Not mentioned`}),(0,B.jsxs)(`span`,{className:`inline-flex items-center gap-1 text-label-12 text-muted`,children:[F.label,(0,B.jsx)(O,{text:F.property})]})]}):(0,B.jsx)(v,{tone:e.mentioned?`positive`:`neutral`,children:e.mentioned?`Mentioned`:`Not mentioned`})}var xe=`—`;function Se({row:e}){return e.cited===null?(0,B.jsxs)(`span`,{className:`inline-flex flex-col items-start gap-0.5`,children:[(0,B.jsx)(v,{tone:`neutral`,children:`Not measured`}),(0,B.jsx)(`span`,{className:`text-label-12 text-muted`,children:`Sources were not fully captured`})]}):(0,B.jsx)(v,{tone:e.cited?`positive`:`neutral`,children:e.cited?`Cited`:`Not cited`})}function Ce({row:e}){return e.cited===null&&e.sources.length===0?(0,B.jsx)(`p`,{className:`py-2 text-copy-14 text-secondary`,children:`The sources for this answer were not fully captured, so none can be shown.`}):e.sources.length===0?(0,B.jsx)(`p`,{className:`py-2 text-copy-14 text-secondary`,children:`This answer returned no source URLs at all.`}):(0,B.jsxs)(`details`,{className:`mt-2`,"data-answer-sources":!0,children:[(0,B.jsxs)(`summary`,{className:`min-h-11 cursor-pointer py-3 text-label-14 text-secondary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-mono-400`,children:[k,` (`,e.sources.length,`)`]}),(0,B.jsx)(`div`,{className:`overflow-x-auto`,children:(0,B.jsxs)(`table`,{className:`evidence-table min-w-[420px]`,children:[(0,B.jsxs)(`caption`,{className:`sr-only`,children:[`Source URLs for `,e.queryText]}),(0,B.jsx)(`thead`,{children:(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`th`,{children:`Match`}),(0,B.jsx)(`th`,{children:`URL`})]})}),(0,B.jsx)(`tbody`,{children:Y(e.sources).map(e=>(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`td`,{children:(0,B.jsx)(v,{tone:J[e.classification].tone,children:J[e.classification].label})}),(0,B.jsx)(`td`,{children:(0,B.jsx)(P,{url:e.sourceUrl})})]},e.sourceUrl))})]})})]})}function we({project:e,targetKey:t,resultId:n}){let r=a({...T({client:h,path:{name:e},query:{targetKey:t,resultId:n}})});if(r.isPending)return(0,B.jsx)(`p`,{className:`py-2 text-copy-14 text-secondary`,role:`status`,"aria-live":`polite`,children:`Loading the answer…`});if(r.isError)return(0,B.jsx)(`p`,{className:`py-2 text-copy-14 text-secondary`,role:`alert`,children:`Could not load this answer.`});let i=r.data?.answer;return i==null||i.trim()===``?(0,B.jsx)(`p`,{className:`py-2 text-copy-14 text-secondary`,children:`This answer was measured, but its text was not stored.`}):(0,B.jsx)(`div`,{className:`py-2`,children:(0,B.jsx)(j,{headingLevel:4,copyable:!0,children:i})})}function Te(e){return _e[e.reason]??`Not measured`}function X({metric:e,signal:t,emphasis:n=!1}){if(e.state===`unavailable`)return(0,B.jsxs)(`span`,{className:`inline-flex flex-col gap-0.5`,children:[(0,B.jsx)(`span`,{className:n?`text-label-18-strong text-secondary`:`text-label-14-strong text-secondary`,children:`Not measured`}),(0,B.jsx)(`span`,{className:`text-label-14 text-secondary`,children:Te(e)})]});let r=g(e.value),i=e.numerator===void 0||e.denominator===void 0?null:`${e.numerator} of ${e.denominator}`,a=b(e,t);return(0,B.jsxs)(`span`,{className:`inline-flex flex-col gap-0.5 tabular-nums`,children:[(0,B.jsx)(`span`,{className:n?`text-label-18-strong text-heading`:`text-label-14-strong text-primary`,children:r}),i?(0,B.jsx)(`span`,{className:`text-label-12 text-muted`,children:i}):null,a?(0,B.jsx)(`span`,{className:`-ml-2 flex`,children:(0,B.jsx)(O,{tone:`caution`,placement:`bottom`,label:a.label,text:a.text})}):null]})}function Ee(e,t,n){return S({client:h,path:{name:e},query:{scope:`property`,targetKey:t,queryClass:n}})}function De(e){return e?.properties.items.at(0)}function Oe({measuredAt:e,unmeasuredReason:t,queryClass:n}){let r=e===void 0?null:e===null?`No completed check yet`:`Measured ${E(D(e))}`;return r===null&&t===void 0?null:(0,B.jsxs)(`p`,{className:`supporting-copy`,children:[[r,t].filter(Boolean).join(` · `),r!==null&&t===void 0?` · ${q[n].technical.toLocaleLowerCase()} only`:``]})}function ke({project:e,groups:t}){return t.length===0?null:(0,B.jsxs)(`section`,{"aria-labelledby":`property-market`,className:`page-section-divider`,children:[(0,B.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`Competitive comparison`}),(0,B.jsxs)(`h2`,{id:`property-market`,className:`text-heading-16 text-heading`,children:[`Measured at the market level`,(0,B.jsx)(O,{text:`Competitors are attached to a market rather than to a single Property, because one building has nobody to be compared against. Share of voice and competitor pressure are reported for the market this Property sits in.`})]})]}),(0,B.jsx)(_,{asChild:!0,type:`button`,size:`sm`,variant:`outline`,children:(0,B.jsx)(u,{to:`/projects/$projectName`,params:{projectName:e},search:e=>A(M(e),{measurementScope:`project`}),children:`Open measurement overview`})})]}),(0,B.jsx)(`ul`,{className:`flex flex-wrap gap-2`,children:t.map(e=>(0,B.jsxs)(`li`,{className:`rounded-md border border-default px-3 py-1.5 text-label-14 text-strong`,children:[e.label,(0,B.jsxs)(`span`,{className:`ml-2 text-label-12 text-muted`,children:[e.competitors.length,` `,e.competitors.length===1?`competitor`:`competitors`]})]},e.stableKey))})]})}function Z({label:e,metric:t,signal:n,failed:r=!1}){if(t===void 0)return(0,B.jsxs)(`div`,{className:`aeo-hero-row`,children:[(0,B.jsx)(`p`,{className:`aeo-hero-row-label`,children:e}),(0,B.jsx)(`p`,{className:`aeo-hero-row-value text-copy-16-strong text-secondary`,children:r?`Unavailable`:`…`}),r?(0,B.jsx)(`div`,{}):(0,B.jsx)(`div`,{className:`aeo-hero-row-bar`,"aria-hidden":`true`}),(0,B.jsx)(`p`,{className:`aeo-hero-row-detail`,children:r?`Could not be loaded`:`Loading`})]});if(t.state===`unavailable`){let n=Te(t);return(0,B.jsxs)(`div`,{className:`aeo-hero-row`,children:[(0,B.jsx)(`p`,{className:`aeo-hero-row-label`,children:e}),(0,B.jsx)(`p`,{className:`aeo-hero-row-value text-copy-16-strong text-secondary`,children:`Not measured`}),(0,B.jsx)(`div`,{}),(0,B.jsx)(`p`,{className:`aeo-hero-row-detail`,children:n===`Not measured`?``:n})]})}let{figure:i,sign:a}=y(g(t.value)),o=t.numerator===void 0||t.denominator===void 0?null:`${t.numerator} of ${t.denominator}`,s=b(t,n);return(0,B.jsxs)(`div`,{className:`aeo-hero-row`,children:[(0,B.jsx)(`p`,{className:`aeo-hero-row-label`,children:e}),(0,B.jsxs)(`p`,{className:`aeo-hero-row-value text-heading`,children:[i,a?(0,B.jsx)(`span`,{className:`text-faint`,children:a}):null]}),(0,B.jsx)(`div`,{className:`aeo-hero-row-bar`,"aria-hidden":`true`,children:(0,B.jsx)(`div`,{className:`metric-card-bar-fill progress-fill-neutral`,style:{width:`${t.value*100}%`}})}),(0,B.jsxs)(`p`,{className:`aeo-hero-row-detail tabular-nums`,children:[o??``,s?(0,B.jsx)(`span`,{className:`block`,children:(0,B.jsx)(O,{tone:`caution`,placement:`bottom`,label:s.label,text:s.text})}):null]})]})}function Ae({branded:e,nonBrand:t,brandedFailed:n=!1,nonBrandFailed:r=!1}){return(0,B.jsxs)(`section`,{"aria-labelledby":`property-coverage-hero`,children:[(0,B.jsx)(`h2`,{id:`property-coverage-hero`,className:`sr-only`,children:`Coverage for this Property`}),(0,B.jsxs)(`div`,{className:`space-y-5`,children:[(0,B.jsxs)(`div`,{className:`space-y-2`,children:[(0,B.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`Non-brand · the demand to earn`}),(0,B.jsx)(Z,{label:`Mentioned`,metric:t?.mentionCoverage,signal:`mentioned`,failed:r}),(0,B.jsx)(Z,{label:`Cited`,metric:t?.citationCoverage,signal:`cited`,failed:r})]}),(0,B.jsxs)(`div`,{className:`space-y-2`,children:[(0,B.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`Branded · already named`}),(0,B.jsx)(Z,{label:`Mentioned`,metric:e?.mentionCoverage,signal:`mentioned`,failed:n}),(0,B.jsx)(Z,{label:`Cited`,metric:e?.citationCoverage,signal:`cited`,failed:n})]})]})]})}function je({branded:e,nonBrand:t,brandedError:n,nonBrandError:r,onRetry:i}){return(0,B.jsxs)(`section`,{"aria-labelledby":`property-brand-contrast`,children:[(0,B.jsx)(`div`,{className:`section-head section-head-inline`,children:(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`The gap`}),(0,B.jsxs)(`h2`,{id:`property-brand-contrast`,className:`text-heading-16 text-heading`,children:[`Named versus not named`,(0,B.jsx)(O,{text:`Branded queries already contain your name, so an answer engine has an easy path back to you. Non-brand queries describe the need instead, and that is the demand you have to earn. Each row is measured only over the queries assigned to this Property in that class; a class with no assigned query reads Not measured rather than 0%.`})]})]})}),(0,B.jsx)(`div`,{className:`overflow-x-auto rounded-md border border-default`,children:(0,B.jsxs)(`table`,{className:`evidence-table min-w-[560px]`,children:[(0,B.jsx)(`caption`,{className:`sr-only`,children:`Mention and citation coverage for this Property, split by query class`}),(0,B.jsx)(`thead`,{children:(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`th`,{children:`Query type`}),(0,B.jsx)(`th`,{children:`Mentioned in the answer`}),(0,B.jsx)(`th`,{children:`Cited as a source`})]})}),(0,B.jsx)(`tbody`,{children:[{queryClass:`branded`,row:e,isError:n},{queryClass:`non-brand`,row:t,isError:r}].map(({queryClass:e,row:t,isError:n})=>(0,B.jsxs)(`tr`,{children:[(0,B.jsxs)(`td`,{children:[(0,B.jsx)(`span`,{className:`block text-label-14-strong text-heading`,children:q[e].headline}),(0,B.jsx)(`span`,{className:`mt-0.5 block text-label-12 text-muted`,children:q[e].technical}),t&&n?(0,B.jsxs)(`span`,{className:`mt-2 flex flex-wrap items-center gap-2 text-label-14 text-caution`,children:[(0,B.jsx)(`span`,{role:`status`,children:`Refresh failed.`}),(0,B.jsxs)(_,{type:`button`,size:`sm`,variant:`ghost`,className:`h-11 px-3 text-button-14 md:h-11`,onClick:()=>i(e),children:[`Retry `,q[e].technical.toLocaleLowerCase()]})]}):null]}),t?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`td`,{children:(0,B.jsx)(X,{metric:t.mentionCoverage,signal:`mentioned`,emphasis:!0})}),(0,B.jsx)(`td`,{children:(0,B.jsx)(X,{metric:t.citationCoverage,signal:`cited`,emphasis:!0})})]}):n?(0,B.jsx)(`td`,{colSpan:2,children:(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 text-label-14 text-secondary`,children:[(0,B.jsxs)(`span`,{role:`alert`,children:[`Could not load `,q[e].technical.toLocaleLowerCase(),`.`]}),(0,B.jsxs)(_,{type:`button`,size:`sm`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,onClick:()=>i(e),children:[`Retry `,q[e].technical.toLocaleLowerCase()]})]})}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`td`,{children:(0,B.jsx)(`span`,{className:`text-label-14 text-secondary`,children:`Loading…`})}),(0,B.jsx)(`td`,{children:(0,B.jsx)(`span`,{className:`text-label-14 text-secondary`,children:`Loading…`})})]})]},e))})]})})]})}function Me({row:e,queryClass:t,isError:n}){return(0,B.jsxs)(`section`,{"aria-labelledby":`property-providers`,className:`page-section-divider`,children:[(0,B.jsx)(`div`,{className:`section-head section-head-inline`,children:(0,B.jsx)(`div`,{children:(0,B.jsxs)(`h2`,{id:`property-providers`,className:`text-heading-16 text-heading`,children:[`Which engines answer for this Property`,(0,B.jsx)(O,{text:`Each row is measured over the queries that engine actually answered for this Property, so the rows are a split of the same population rather than parts that add up to the Property total. An engine that answered nothing for this Property is absent instead of shown at 0%.`})]})})}),e===void 0&&n?(0,B.jsxs)(`p`,{className:`text-copy-14 text-secondary`,children:[`Details for `,q[t].technical.toLocaleLowerCase(),` are unavailable. Retry that query type above.`]}):e===void 0?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`Loading…`}):e.providers.length===0?(0,B.jsxs)(`p`,{className:`text-copy-14 text-secondary`,children:[`No answer engine has measured `,q[t].technical.toLocaleLowerCase(),` for this Property.`,e.mentionCoverage.state===`unavailable`?` ${Te(e.mentionCoverage)}.`:``]}):(0,B.jsx)(`div`,{className:`overflow-x-auto rounded-md border border-default`,children:(0,B.jsxs)(`table`,{className:`evidence-table min-w-[520px]`,children:[(0,B.jsx)(`caption`,{className:`sr-only`,children:`Per-engine mention and citation coverage`}),(0,B.jsx)(`thead`,{children:(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`th`,{children:`Engine`}),(0,B.jsx)(`th`,{children:`Mentioned`}),(0,B.jsx)(`th`,{children:`Cited`})]})}),(0,B.jsx)(`tbody`,{children:e.providers.map(e=>(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`td`,{className:`text-label-14-strong text-heading`,children:e.provider}),(0,B.jsx)(`td`,{children:(0,B.jsx)(X,{metric:e.mentionCoverage,signal:`mentioned`})}),(0,B.jsx)(`td`,{children:(0,B.jsx)(X,{metric:e.citationCoverage,signal:`cited`})})]},e.provider))})]})})]})}function Ne(e){let t=e.questions.join(` · `);return e.questionsTruncated?`${t} +${e.questionTotal-e.questions.length} more`:t}function Pe({project:e,targetKey:t,queryClass:n}){let r=a({...w({client:h,path:{name:e},query:{targetKey:t,queryClass:n}})});if(r.isPending||r.isError)return null;let i=r.data?.competitors??[],o=r.data?.basis;return(0,B.jsxs)(`section`,{"aria-labelledby":`property-named-instead`,className:`page-section-divider`,children:[(0,B.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,B.jsx)(`div`,{children:(0,B.jsxs)(`h2`,{id:`property-named-instead`,className:`text-heading-16 text-heading`,children:[`Named instead of this Property`,(0,B.jsx)(O,{text:`Counted from the answers that did not name this Property, so a name here is one an engine recommended in its place. Occurrences count answers, not positions: an engine naming the same rival in two answers counts twice, and one naming it twice in a single answer counts once.`})]})}),i.length>0?(0,B.jsxs)(`p`,{className:`supporting-copy`,children:[r.data?.total??i.length,` named`]}):null]}),i.length===0?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`No rival was named in the answers this Property missed. Nothing to compete with here yet.`}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`div`,{className:`overflow-x-auto rounded-md border border-default`,children:(0,B.jsxs)(`table`,{className:`evidence-table min-w-[420px]`,children:[(0,B.jsx)(`caption`,{className:`sr-only`,children:`Names the engines gave instead of this Property`}),(0,B.jsx)(`thead`,{children:(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`th`,{children:`Named`}),(0,B.jsx)(`th`,{children:`Answers`}),(0,B.jsx)(`th`,{children:`Engines`}),(0,B.jsx)(`th`,{children:`Queries`})]})}),(0,B.jsx)(`tbody`,{children:i.map(e=>(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`td`,{className:`text-strong`,children:e.name}),(0,B.jsx)(`td`,{className:`tabular-nums text-secondary`,children:e.occurrences}),(0,B.jsxs)(`td`,{className:`text-secondary`,children:[e.providers.join(`, `),e.providersTruncated?` +${e.providerTotal-e.providers.length}`:``]}),(0,B.jsx)(`td`,{className:`text-right`,children:(0,B.jsxs)(`span`,{className:`inline-flex items-center justify-end gap-1`,children:[(0,B.jsx)(`span`,{className:`tabular-nums text-secondary`,children:e.questionTotal}),(0,B.jsx)(O,{text:Ne(e)})]})})]},e.name))})]})}),o?.state===`available`?(0,B.jsxs)(`p`,{className:`supporting-copy mt-2`,children:[o.targetMissResults,` of `,o.answeredResults,` answers to `,q[n].technical.toLocaleLowerCase(),` did not name this Property.`]}):null]})]})}function Fe({questions:e,queryClass:t}){return(0,B.jsxs)(`section`,{"aria-labelledby":`property-questions`,className:`page-section-divider`,children:[(0,B.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,B.jsx)(`div`,{children:(0,B.jsxs)(`h2`,{id:`property-questions`,className:`text-heading-16 text-heading`,children:[q[t].technical,` assigned to this Property`]})}),(0,B.jsxs)(`p`,{className:`supporting-copy`,children:[e.length,` assigned`]})]}),e.length===0?(0,B.jsxs)(`p`,{className:`text-copy-14 text-secondary`,children:[`No `,q[t].technical.toLocaleLowerCase(),` are assigned. Add one in advanced measurement setup to measure this class.`]}):(0,B.jsx)(`div`,{className:`overflow-x-auto rounded-md border border-default`,children:(0,B.jsxs)(`table`,{className:`evidence-table min-w-[420px]`,children:[(0,B.jsx)(`caption`,{className:`sr-only`,children:`Queries assigned to this Property`}),(0,B.jsx)(`thead`,{children:(0,B.jsx)(`tr`,{children:(0,B.jsx)(`th`,{children:`Query`})})}),(0,B.jsx)(`tbody`,{children:e.map(e=>(0,B.jsx)(`tr`,{children:(0,B.jsx)(`td`,{className:`text-secondary`,children:e})},e))})]})})]})}function Ie({urls:e}){return(0,B.jsxs)(`section`,{"aria-labelledby":`property-urls`,className:`page-section-divider`,children:[(0,B.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,B.jsx)(`div`,{children:(0,B.jsxs)(`h2`,{id:`property-urls`,className:`text-heading-16 text-heading`,children:[`URLs that count as this Property`,(0,B.jsx)(O,{text:`A cited source URL is credited to this Property when it matches one of these. The most specific matcher wins, so a URL covered by two Properties at the same specificity is flagged for review instead of being credited to either.`})]})}),(0,B.jsxs)(`p`,{className:`supporting-copy`,children:[e.length,` configured`]})]}),e.length===0?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`No URLs are configured for this Property.`}):(0,B.jsx)(`div`,{className:`overflow-x-auto rounded-md border border-default`,children:(0,B.jsxs)(`table`,{className:`evidence-table min-w-[420px]`,children:[(0,B.jsx)(`caption`,{className:`sr-only`,children:`URL matchers configured for this Property`}),(0,B.jsx)(`thead`,{children:(0,B.jsx)(`tr`,{children:(0,B.jsx)(`th`,{children:`URL`})})}),(0,B.jsx)(`tbody`,{children:e.map(e=>(0,B.jsx)(`tr`,{children:(0,B.jsx)(`td`,{className:`break-all text-secondary`,children:e})},e))})]})})]})}var Q={heading:`Cited on other queries`,help:`Answers to queries assigned to other properties that still cited one of this Property’s own pages. This Property was not measured on those queries, so these answers are not in its Mentioned or Cited rates.`,notCounted:`not in this Property’s rates`,empty:`No answer to a query assigned elsewhere cited this Property’s pages in the displayed measurement.`,loadError:`Citations from other queries could not be loaded.`,partlySaved:`Sources partly saved`};function Le({project:e,targetKey:t,queryClass:n,runId:r,targetLabels:i}){let[a,o]=(0,z.useState)(new Set),s={client:h,path:{name:e},query:{targetKey:t,queryClass:n,shape:m[`other-queries`],limit:K,...r?{runId:r}:{}}},l=c({...C(s),initialPageParam:s,getNextPageParam:e=>e.otherQueries?.nextCursor?{path:s.path,query:{...s.query,cursor:e.otherQueries.nextCursor}}:void 0}),d=l.data?.pages??[];if(d[0]?.measurement.state===`not_measured`)return null;let f=d.flatMap(e=>e.otherQueries?.items??[]),p=d[0]?.otherQueries?.totalEstimate??f.length,ee=e=>`${e.expectedSlotId}:${e.queryClass}`,g=q[n].technical.toLocaleLowerCase();return(0,B.jsxs)(`section`,{"aria-labelledby":`property-other-queries`,className:`page-section-divider`,children:[(0,B.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,B.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,B.jsx)(`h2`,{id:`property-other-queries`,className:`text-heading-16 text-heading`,children:Q.heading}),(0,B.jsx)(O,{text:Q.help})]}),l.data?(0,B.jsxs)(`p`,{className:`supporting-copy`,children:[p,` `,p===1?`answer`:`answers`,` · `,g,` · `,Q.notCounted]}):null]}),l.isPending?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`Loading…`}):l.isError&&f.length===0?(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 text-label-14 text-secondary`,children:[(0,B.jsx)(`span`,{role:`alert`,children:Q.loadError}),(0,B.jsx)(_,{type:`button`,size:`sm`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,onClick:()=>{l.refetch()},children:`Retry`})]}):f.length===0?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:Q.empty}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`div`,{className:`overflow-x-auto rounded-md border border-default`,children:(0,B.jsxs)(`table`,{className:`evidence-table min-w-[640px]`,children:[(0,B.jsx)(`caption`,{className:`sr-only`,children:`Answers to other properties’ queries that cited this Property’s pages`}),(0,B.jsx)(`thead`,{children:(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`th`,{children:`Query`}),(0,B.jsx)(`th`,{children:`Assigned to`}),(0,B.jsx)(`th`,{children:`Pages cited`}),(0,B.jsx)(`th`,{children:(0,B.jsx)(`span`,{className:`sr-only`,children:`Answer`})})]})}),(0,B.jsx)(`tbody`,{children:f.map(t=>{let n=ee(t),r=a.has(n),s=`property-other-query-${encodeURIComponent(n)}`;return(0,B.jsxs)(z.Fragment,{children:[(0,B.jsxs)(`tr`,{children:[(0,B.jsxs)(`td`,{className:`text-secondary`,children:[(0,B.jsx)(`span`,{className:`block text-label-14-strong text-heading`,children:t.queryText}),(0,B.jsx)(`span`,{className:`mt-1 block text-label-12 text-muted`,children:[t.provider,t.location].filter(Boolean).join(` · `)})]}),(0,B.jsx)(`td`,{children:(0,B.jsx)(`ul`,{className:`space-y-1`,children:t.assignedTargetKeys.map(t=>(0,B.jsx)(`li`,{children:(0,B.jsx)(u,{to:`/projects/$projectName/properties/$targetKey`,params:{projectName:e,targetKey:t},search:M,className:`text-label-14 text-link hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-mono-400`,children:i.get(t)??t})},t))})}),(0,B.jsxs)(`td`,{children:[(0,B.jsx)(`ul`,{className:`space-y-1`,children:t.sources.map(e=>(0,B.jsx)(`li`,{className:`min-w-0`,children:(0,B.jsx)(P,{url:e.sourceUrl})},e.sourceUrl))}),t.sourcesTruncated?(0,B.jsxs)(`span`,{className:`mt-1 block text-label-12 text-muted`,children:[t.sourceCount,` pages in total`]}):null,t.evidenceComplete?null:(0,B.jsx)(`span`,{className:`mt-1 block text-label-12 text-muted`,children:Q.partlySaved})]}),(0,B.jsx)(`td`,{className:`text-right`,children:(0,B.jsx)(_,{type:`button`,size:`sm`,variant:`ghost`,className:`h-auto pointer-coarse:min-h-11 max-w-full whitespace-normal py-2 text-left md:h-auto`,"aria-expanded":r,"aria-label":r?`Hide the answer for ${t.queryText}`:`Read the answer for ${t.queryText}`,"aria-controls":r?s:void 0,onClick:()=>o(e=>{let t=new Set(e);return t.delete(n)||t.add(n),t}),children:r?`Hide answer`:`Read answer`})})]}),r?(0,B.jsx)(`tr`,{children:(0,B.jsx)(`td`,{id:s,colSpan:4,className:`bg-surface-subtle px-4`,children:(0,B.jsx)(we,{project:e,targetKey:t.assignedTargetKeys[0],resultId:t.observationId})})}):null]},n)})})]})}),l.hasNextPage?(0,B.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-3 text-label-14 text-secondary`,children:[(0,B.jsxs)(`span`,{children:[`Showing `,f.length,` of `,p]}),(0,B.jsx)(_,{size:`sm`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,disabled:l.isFetchingNextPage,onClick:()=>{l.fetchNextPage()},children:l.isFetchingNextPage?`Loading…`:`Show ${K} more`})]}):null]})]})}function Re(e,t){let n=[e.marketKey?t??`the selected market`:null,e.provider?`the ${e.provider} answer engine`:null,e.model?`the ${e.model} model`:null,e.location?`location ${e.location}`:null,e.from||e.to?`a date range`:null,e.measurementRunId?`a saved check`:null].filter(e=>e!==null);return n.length===0?null:`AI Visibility is filtered to ${n.join(`, `)}. This page shows the latest measurement for ${I.allMarkets.toLocaleLowerCase()} and answer engines.`}function ze(){let{projectName:e,targetKey:n}=l({strict:!1}),r=o(),i=s({strict:!1}),f=(0,z.useMemo)(()=>ue(i),[i]),[p,ee]=(0,z.useState)(new Set),g=e??``,y=n??``,b=!!g&&!!y,x=(0,z.useMemo)(()=>de(`portfolio`,ce(te())),[]),S=b&&x,{canWrite:w}=ne(),T=a({...ie({client:h,path:{name:g}}),enabled:S}),ae=T.data?.active?.plan,oe=ae?.schemaVersion===2?ae:null,E=f.queryClass===`branded`||f.queryClass===`non-brand`?f.queryClass:null,D=e=>oe?.assignments.some(t=>t.targetKey===y&&t.queryClass===e)??!1,j=E??(!D(`non-brand`)&&D(`branded`)?`branded`:`non-brand`);(0,z.useEffect)(()=>{oe&&!E&&r({to:`.`,replace:!0,search:e=>A(e,{queryClass:j})})},[oe,E,j,r]);let P=a({...Ee(g,y,`branded`),enabled:S}),F=a({...Ee(g,y,`non-brand`),enabled:S}),fe=De(P.data),I=De(F.data),L=j===`branded`?P.data:F.data,R=j===`branded`?fe:I,V=(j===`branded`?P.isError:F.isError)&&R===void 0,H=L?.measurement.displayedRunId;le(g,{view:`property`,selection:{mode:`advanced`,scope:`property`,scopeKey:y,queryClass:j,limit:10,...H?{runId:H}:{}}});let U=R?.mentionCoverage.state===`unavailable`?Te(R.mentionCoverage):void 0,W=L===void 0?void 0:L.measurement.completedAt??null,me=L!==void 0&&(L.measurement.state===`not_measured`||L.nextAction.kind===`run_measurement`),he=e=>A(M(e),{measurementScope:`property`,measurementScopeKey:y,queryClass:j,measurementRunId:void 0,measurementRevision:void 0,measurementTo:void 0}),G=a({...re({client:h,path:{name:g},query:N(ue(he(i)))}),enabled:S&&me,retry:!1}).data,_e=G!==void 0&&G.selection.measurement.measuredRevision!==null&&(G.populations.find(e=>e.queryClass===j)?.summary.queryCount??0)>0,J={client:h,path:{name:g},query:{targetKey:y,queryClass:j,shape:m.answers,limit:K,...H?{runId:H}:{}}},Y=c({...C(J),enabled:S&&L!==void 0,initialPageParam:J,getNextPageParam:e=>e.answers?.nextCursor?{path:J.path,query:{...J.query,cursor:e.answers.nextCursor}}:void 0}),X=T.data?.active??null,Z=X?.plan.schemaVersion===2?X.plan:null,Ne=X!==null&&Z===null,Q=Z?.targets.find(e=>e.stableKey===y)??null,ze=Re(f,Z?.reportingScopes?.find(e=>e.stableKey===f.marketKey)?.label),Be=(0,z.useMemo)(()=>{if(!Z)return[];let e=new Map(Z.querySnapshots.map(e=>[e.queryId,e.queryText]));return[...new Set(Z.assignments.filter(e=>e.targetKey===y&&e.queryClass===j).flatMap(t=>{let n=e.get(t.queryId);return n===void 0?[]:[n]}))].sort((e,t)=>e.localeCompare(t))},[Z,y,j]),Ve=(0,z.useMemo)(()=>Q?.urlMatchers.map(pe)??[],[Q]),He=(0,z.useMemo)(()=>new Map((Z?.targets??[]).map(e=>[e.stableKey,e.label])),[Z]),Ue=(0,z.useMemo)(()=>Z?.groups.filter(e=>e.targetKeys.includes(y))??[],[Z,y]),$=(0,z.useMemo)(()=>(Y.data?.pages??[]).flatMap(e=>e.answers?.items??[]),[Y.data]),We=Y.data?.pages[0]?.answers?.totalEstimate??$.length,Ge=(Y.data?.pages??[]).length>0&&(Y.data?.pages??[]).every(e=>e.answers===void 0),Ke=Y.data?.pages[0]?.measurement.state,qe=(0,B.jsxs)(u,{to:`/projects/$projectName`,params:{projectName:g},search:M,className:`inline-flex items-center gap-1 text-label-12 text-muted hover:text-strong`,children:[(0,B.jsx)(t,{className:`size-3.5`,"aria-hidden":`true`}),`Back to AI Visibility`]});if(!b)return(0,B.jsx)(`div`,{className:`page-container`,children:(0,B.jsx)(`p`,{className:`text-copy-14 text-muted`,children:`Missing project name or Property key in URL.`})});if(!x)return(0,B.jsxs)(`div`,{className:`page-container space-y-3`,children:[qe,(0,B.jsx)(`p`,{className:`text-copy-14 text-muted`,children:`This view is not available here.`})]});if(T.isPending&&!T.isError)return(0,B.jsx)(`div`,{className:`page-container`,children:(0,B.jsxs)(`div`,{role:`status`,"aria-live":`polite`,children:[(0,B.jsx)(`span`,{className:`sr-only`,children:`Loading Property`}),(0,B.jsx)(`div`,{className:`h-32 animate-pulse rounded-md bg-surface-subtle`,"aria-hidden":`true`})]})});let Je=T.isError&&T.data===void 0,Ye=P.isError&&P.data===void 0,Xe=F.isError&&F.data===void 0;return Je||Ye&&Xe?(0,B.jsxs)(`div`,{className:`page-container space-y-3`,children:[qe,(0,B.jsx)(`p`,{role:`alert`,className:`text-copy-14 text-negative`,children:`Could not load this Property.`}),(0,B.jsx)(_,{type:`button`,size:`sm`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,onClick:()=>{T.refetch(),P.refetch(),F.refetch()},children:`Try again`})]}):!Z||!Q?(0,B.jsxs)(`div`,{className:`page-container space-y-3`,children:[qe,(0,B.jsx)(`p`,{role:`status`,className:`text-copy-14 text-secondary`,children:Z?`This Property is not in the published setup. It may have been renamed or removed.`:`A Property page needs a published advanced measurement setup. Republish setup from the project Portfolio tab.`}),(0,B.jsx)(_,{asChild:!0,type:`button`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,children:(0,B.jsx)(u,{to:`/projects/$projectName/portfolio`,params:{projectName:g},children:w?Ne?`Republish setup`:`Open measurement setup`:`View measurement setup`})})]}):(0,B.jsxs)(`div`,{className:`page-container space-y-8`,children:[(0,B.jsxs)(`div`,{className:`page-header`,children:[(0,B.jsxs)(`div`,{className:`page-header-left`,children:[qe,(0,B.jsx)(`h1`,{className:`page-title mt-2`,children:Q.label}),(0,B.jsxs)(`p`,{className:`page-subtitle`,children:[`Property in `,g,ze?(0,B.jsxs)(B.Fragment,{children:[` · Filters not applied `,(0,B.jsx)(O,{text:ze})]}):null]})]}),(0,B.jsxs)(`div`,{className:`page-header-right`,children:[L?(0,B.jsx)(v,{tone:ve[L.measurement.state].tone,children:ve[L.measurement.state].label}):null,R&&R.flags>0?(0,B.jsxs)(v,{tone:`caution`,children:[R.flags,` flagged`]}):null]})]}),(0,B.jsx)(Ae,{branded:fe,nonBrand:I,brandedFailed:Ye,nonBrandFailed:Xe}),(0,B.jsx)(je,{branded:fe,nonBrand:I,brandedError:P.isError,nonBrandError:F.isError,onRetry:e=>{e===`branded`?P.refetch():F.refetch()}}),me?(0,B.jsxs)(`section`,{className:`flex flex-wrap items-center justify-between gap-3 border-y border-default py-4`,"aria-label":`Measurement next step`,children:[(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:d()?se:w?`Run a measurement from the project overview to collect this Property’s coverage and source evidence.${_e?` AI Visibility still shows the last results.`:``}`:`This Property needs a new measurement before coverage and source evidence are available.`}),(0,B.jsx)(_,{asChild:!0,type:`button`,className:`h-11 px-4 text-button-14 md:h-11`,children:(0,B.jsx)(u,{to:`/projects/$projectName`,params:{projectName:g},search:_e?he:M,children:_e?`See the last results`:w?`Go to AI Visibility`:`View AI Visibility`})})]}):null,(0,B.jsxs)(`div`,{className:`flex flex-wrap items-end gap-4 border-y border-default py-4`,children:[(0,B.jsxs)(`div`,{className:`space-y-1`,children:[(0,B.jsx)(`label`,{htmlFor:`property-query-class`,className:`block text-label-14-strong text-heading`,children:`Query type`}),(0,B.jsxs)(`select`,{id:`property-query-class`,value:j,onChange:e=>{let t=e.target.value===`branded`?`branded`:`non-brand`;r({to:`.`,search:e=>A(e,{queryClass:t})})},className:`h-11 rounded-md border border-default bg-surface px-3 text-label-14 text-primary focus:outline-none focus:ring-2 focus:ring-mono-400`,children:[(0,B.jsx)(`option`,{value:`non-brand`,children:q[`non-brand`].technical}),(0,B.jsx)(`option`,{value:`branded`,children:q.branded.technical})]})]}),(0,B.jsx)(Oe,{measuredAt:W,unmeasuredReason:U,queryClass:j})]}),(0,B.jsx)(Me,{row:R,queryClass:j,isError:V}),(0,B.jsx)(Pe,{project:g,targetKey:y,queryClass:j}),(0,B.jsx)(Fe,{questions:Be,queryClass:j}),(0,B.jsx)(ge,{projectName:g,targetKey:y,published:Q,activeRevision:X.revision,publishedBrandNames:Z.identities.projectBrand.names}),(0,B.jsx)(Ie,{urls:Ve}),(0,B.jsx)(ke,{project:g,groups:Ue}),(0,B.jsxs)(`section`,{"aria-labelledby":`property-evidence`,className:`page-section-divider`,children:[(0,B.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,B.jsx)(`div`,{children:(0,B.jsxs)(`h2`,{id:`property-evidence`,className:`text-heading-16 text-heading`,children:[`Answers the engines gave`,(0,B.jsx)(O,{text:`One row per answer an engine gave for the queries assigned to this Property in the displayed measurement. Mentioned and cited are independent: an answer can name this Property without linking it, or link it without naming it. Answers that did neither are listed first, because those are what a gap is made of. Where the answer text was not stored the mention reads Not measured, never a zero. Open a row to read what the engine actually said, followed by the source URLs it returned, this Property's own first. The answer is where a miss becomes actionable: a query this Property was not named in may still have named a sibling building.`})]})}),$.length>0?(0,B.jsxs)(`p`,{className:`supporting-copy`,children:[$.length,` of `,We]}):null]}),V?(0,B.jsxs)(`p`,{className:`text-copy-14 text-secondary`,children:[`Evidence for `,q[j].technical.toLocaleLowerCase(),` is unavailable. Retry that query type above.`]}):Y.isPending&&$.length===0?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`Loading evidence…`}):Y.isError&&$.length===0?(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 text-label-14 text-secondary`,children:[(0,B.jsx)(`span`,{role:`alert`,children:`Evidence could not be loaded.`}),(0,B.jsx)(_,{type:`button`,size:`sm`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,onClick:()=>{Y.refetch()},children:`Retry evidence`})]}):Ke===`not_measured`?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:d()?se:`Not measured yet. Run a measurement to collect the answers for this Property.`}):Ge?(0,B.jsx)(`p`,{role:`alert`,className:`text-copy-14 text-caution`,children:`This measurement was returned in an older format, so the answers cannot be shown here. The numbers above are unaffected.`}):$.length===0?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`No answers matched this Property in the displayed measurement.`}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`div`,{className:`property-answer-table-container overflow-x-auto rounded-md border border-default`,children:(0,B.jsxs)(`table`,{className:`evidence-table property-evidence-table`,children:[(0,B.jsx)(`caption`,{className:`sr-only`,children:`Answers measured for this Property`}),(0,B.jsx)(`thead`,{children:(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`th`,{children:`Query`}),(0,B.jsx)(`th`,{children:`Mentioned in the answer`}),(0,B.jsx)(`th`,{children:`Cited as a source`}),(0,B.jsx)(`th`,{children:`Sources`}),(0,B.jsx)(`th`,{children:(0,B.jsx)(`span`,{className:`sr-only`,children:`Sources detail`})})]})}),(0,B.jsx)(`tbody`,{children:$.map(e=>{let t=ye(e),n=p.has(t),r=`property-answer-${encodeURIComponent(t)}`;return(0,B.jsxs)(z.Fragment,{children:[(0,B.jsxs)(`tr`,{className:`property-answer-summary`,children:[(0,B.jsxs)(`td`,{className:`text-secondary`,children:[(0,B.jsx)(`h3`,{className:`text-heading-14 text-heading`,children:e.queryText}),(0,B.jsx)(`span`,{className:`mt-1 block text-label-12 text-muted`,children:[e.provider,e.location].filter(Boolean).join(` · `)}),e.historical||e.bridged?(0,B.jsx)(`span`,{className:`mt-1 flex`,children:(0,B.jsx)(v,{tone:`caution`,children:`Historical`})}):null]}),(0,B.jsxs)(`td`,{children:[(0,B.jsx)(`span`,{className:`property-evidence-mobile-label`,"aria-hidden":`true`,children:`Mentioned`}),(0,B.jsx)(be,{row:e})]}),(0,B.jsxs)(`td`,{children:[(0,B.jsx)(`span`,{className:`property-evidence-mobile-label`,"aria-hidden":`true`,children:`Cited`}),(0,B.jsx)(Se,{row:e})]}),(0,B.jsxs)(`td`,{className:`tabular-nums text-secondary`,children:[(0,B.jsx)(`span`,{className:`property-evidence-mobile-label`,"aria-hidden":`true`,children:k}),e.cited===null?xe:e.sources.length]}),(0,B.jsx)(`td`,{className:`text-right`,children:(0,B.jsx)(_,{type:`button`,size:`sm`,variant:`ghost`,className:`h-auto pointer-coarse:min-h-11 max-w-full whitespace-normal py-2 text-left md:h-auto`,"aria-expanded":n,"aria-label":n?`Hide the answer for ${e.queryText}`:`Read the answer for ${e.queryText}`,"aria-controls":n?r:void 0,onClick:()=>ee(e=>{let n=new Set(e);return n.delete(t)||n.add(t),n}),children:n?`Hide answer`:`Read answer`})})]}),n?(0,B.jsx)(`tr`,{className:`property-answer-detail`,children:(0,B.jsxs)(`td`,{id:r,colSpan:5,className:`bg-surface-subtle px-4`,children:[(0,B.jsx)(we,{project:g,targetKey:y,resultId:e.observationId}),(0,B.jsx)(Ce,{row:e})]})}):null]},t)})})]})}),Y.hasNextPage?(0,B.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-3 text-label-14 text-secondary`,children:[(0,B.jsxs)(`span`,{children:[`Showing `,$.length,` of `,We]}),Y.isFetchNextPageError?(0,B.jsx)(`span`,{role:`alert`,children:`Could not load more evidence.`}):null,(0,B.jsx)(_,{size:`sm`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,disabled:Y.isFetchingNextPage,onClick:()=>{Y.fetchNextPage()},children:Y.isFetchingNextPage?`Loading…`:Y.isFetchNextPageError?`Retry more evidence`:`Show ${K} more`})]}):null]})]}),L?(0,B.jsx)(Le,{project:g,targetKey:y,queryClass:j,runId:H,targetLabels:He}):null]})}export{J as EVIDENCE_LABELS,ze as MeasurementPropertyPage,Q as OTHER_QUERIES_COPY};
1
+ import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{at as t,st as n}from"./vendor-lucide-CoTHJwai.js";import{r}from"./vendor-markdown-cQgSk2i0.js";import{_ as i,b as a,d as o,f as s,g as c,p as l,u}from"./vendor-tanstack-q5SvZtcv.js";import{Ct as d,Gr as f,Kr as p,Ni as m,Qr as ee,mt as h,ot as g,r as _,si as v,t as y}from"./ToneBadge-BgTLSTKp.js";import{_ as b,a as x,b as S}from"./format-helpers-DVXZD864.js";import{r as te}from"./account-context-CVjb3ZSn.js";import{et as C,it as w,nt as ne,rn as re,rt as T,st as E,tt as ie,ut as ae}from"./react-query-CSlTSOjz.js";import{f as D,h as O}from"./ChartPrimitives-4D5wgAn5.js";import{t as k}from"./InfoTooltip-DrBIPuSU.js";import{G as A,H as j,I as oe,J as se,L as M,Y as N,Z as ce,ct as P,dn as le,ln as ue,ot as F,pn as de,z as fe}from"./index-CsvEqhK4.js";import{c as I,r as L,s as pe,t as R}from"./service-BGqeyqhZ.js";var z=e(n(),1),B=r(),V={heading:`Names that count as this Property`,help:`An answer mentions this Property when its text contains one of these names as whole words. Source titles and source links never count, but a link in the answer whose text is one of these names does. Qualified names are longer forms, such as the name with its street or city, for a name that other places share.`,names:`Names`,qualifiedNames:`Qualified names`,noNames:`No names are set, so answers can cite this Property but never mention it.`,edit:`Edit names`,save:`Save to draft`,saving:`Saving…`,cancel:`Cancel`,namesHint:`One name per line.`,qualifiedHint:`One per line. Each must include one of the names above plus more words, such as a street or city.`,qualifiedNote:`With qualified names set, an answer that uses only a plain name counts as a mention only when it also cites this Property’s own page. Otherwise it is left out as not tied to one property.`,draftOnly:`Saving changes the draft only. Nothing is measured differently until the setup is published.`,saved:`Saved to the draft. Publish the setup to start using these names.`,pending:`Name changes are saved in the draft and not published yet.`,review:`Review and publish`,noChanges:`No changes to save.`,staleDraft:`The draft is based on an older published setup. Open measurement setup to restart it before editing names.`,missingFromDraft:`This Property is not included in the current draft. Open measurement setup to review it.`,conflict:`The draft changed in another session. The latest names are loaded; review them and save again.`,failed:`Could not save these names. Try again.`};function H(e){return[...new Set(e.split(`
2
+ `).map(e=>e.trim()).filter(Boolean))]}function U(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}function W(e,t){return U(e.aliases,t.aliases)&&U(e.identityAliases??[],t.identityAliases??[])}function me(e,t,n){let{identityAliases:r,...i}=e;return n.length>0?{...i,aliases:t,identityAliases:n}:{...i,aliases:t}}function he({label:e,names:t}){return(0,B.jsxs)(`div`,{className:`space-y-1`,children:[(0,B.jsx)(`h3`,{className:`text-heading-14 text-heading`,children:e}),(0,B.jsx)(`ul`,{className:`space-y-1`,children:t.map(e=>(0,B.jsx)(`li`,{className:`text-label-14 text-secondary`,children:e},e))})]})}function G({id:e,issues:t}){return t.length===0?null:(0,B.jsx)(`ul`,{id:e,className:`mt-2 space-y-1`,"aria-label":`Name warnings`,children:t.map(e=>(0,B.jsx)(`li`,{className:`text-label-14 text-caution`,children:f(e)},`${e.field}:${e.index}`))})}function ge({projectName:e,targetKey:t,published:n,activeRevision:r,publishedBrandNames:o,service:s=R}){let{canWrite:c}=te(),l=(0,z.useId)(),d=a({...ie({client:h,path:{name:e}}),enabled:c}),f=a({...ae({client:h,path:{name:e}}),enabled:c}),m=d.data?.draft?.authoring.targets.find(e=>e.stableKey===t),g=n.identityAliases??[],v=m!==void 0&&d.data?.draft?.baseActiveRevision===r&&!W(m,n),y=!d.isFetching&&!f.isPending,b=f.data,x=(0,z.useMemo)(()=>b?ee(b):o,[b,o]),[S,C]=(0,z.useState)(!1),[w,ne]=(0,z.useState)(``),[re,T]=(0,z.useState)(``),[E,D]=(0,z.useState)(n),[O,A]=(0,z.useState)(null),j=`${e}\u0000${t}`,[oe,se]=(0,z.useState)(j);oe!==j&&(se(j),C(!1),ne(``),T(``),D(n),A(null));let M=(0,z.useRef)(j);M.current=j;let N=(0,z.useMemo)(()=>H(w),[w]),ce=(0,z.useMemo)(()=>H(re),[re]),P=(0,z.useMemo)(()=>p({aliases:N,identityAliases:ce,brandNames:x}),[N,ce,x]),le=P.filter(e=>e.field===`aliases`),ue=P.filter(e=>e.field===`identityAliases`);function F(e){ne(e.aliases.join(`
3
+ `)),T((e.identityAliases??[]).join(`
4
+ `)),D({aliases:[...e.aliases],identityAliases:[...e.identityAliases??[]]})}function de(e){return e.draft?e.draft.authoring.targets.find(e=>e.stableKey===t)??null:n}function I(){F(v?m:n),A(null),C(!0)}function pe(e){e&&F(e),A({tone:`negative`,text:V.conflict,review:!1})}let U=i({mutationFn:async i=>{let a=await s.loadDraft(e);if(!a.draft){if(W(i.names,n))return{outcome:`unchanged`};if(!W(i.base,n))return{outcome:`conflict`,latest:n};await s.createDraft(e,r),a=await s.loadDraft(e)}let o=a.draft;if(!o||!a.etag)throw Error(V.failed);if(o.baseActiveRevision!==r)return{outcome:`stale`};let c=o.authoring.targets.find(e=>e.stableKey===t);return!c||c.status!==`included`?{outcome:`missing`}:W(i.names,c)?{outcome:`unchanged`}:W(i.base,c)?(await s.upsertTarget(e,a.etag,me(c,i.names.aliases,i.names.identityAliases)),{outcome:`saved`}):{outcome:`conflict`,latest:c}},meta:{skipGlobalErrorToast:!0},onSuccess:(e,t)=>{if(t.openFor===M.current)switch(e.outcome){case`saved`:C(!1),A({tone:`positive`,text:V.saved,review:!0});return;case`unchanged`:C(!1),A({tone:`positive`,text:V.noChanges,review:!1});return;case`stale`:A({tone:`negative`,text:V.staleDraft,review:!0});return;case`missing`:A({tone:`negative`,text:V.missingFromDraft,review:!0});return;case`conflict`:pe(e.latest),d.refetch();return}},onError:(e,t)=>{t.openFor===M.current&&(L(e)?(pe(null),d.refetch().then(e=>{e.isSuccess&&pe(de(e.data))})):A({tone:`negative`,text:V.failed,review:!1}))}}),ge=(0,B.jsx)(u,{to:`/projects/$projectName/portfolio`,params:{projectName:e},className:`text-link underline-offset-2 hover:underline`,children:V.review}),K=n.aliases.length+g.length;return(0,B.jsxs)(`section`,{"aria-labelledby":`property-names`,className:`page-section-divider`,children:[(0,B.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,B.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,B.jsx)(`h2`,{id:`property-names`,className:`text-heading-16 text-heading`,children:V.heading}),(0,B.jsx)(k,{text:V.help})]}),(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,B.jsxs)(`p`,{className:`supporting-copy`,children:[K,` `,K===1?`name`:`names`]}),c&&!S?(0,B.jsx)(_,{type:`button`,size:`sm`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,disabled:!y,onClick:I,children:V.edit}):null]})]}),O?(0,B.jsxs)(`p`,{role:O.tone===`negative`?`alert`:`status`,className:`mb-3 text-copy-14 ${O.tone===`negative`?`text-negative`:`text-positive`}`,children:[O.text,O.review?(0,B.jsxs)(B.Fragment,{children:[` `,ge]}):null]}):v&&!S?(0,B.jsxs)(`p`,{role:`status`,className:`mb-3 text-copy-14 text-caution`,children:[V.pending,` `,ge]}):null,S?(0,B.jsxs)(`form`,{className:`space-y-4`,"aria-label":`Edit names`,onSubmit:e=>{e.preventDefault(),!U.isPending&&U.mutate({names:{aliases:N,identityAliases:ce},base:E,openFor:j})},children:[(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`label`,{htmlFor:`${l}-names`,className:`block text-label-14-strong text-heading`,children:V.names}),(0,B.jsx)(`p`,{id:`${l}-names-hint`,className:`text-copy-14 text-secondary`,children:V.namesHint}),(0,B.jsx)(`textarea`,{id:`${l}-names`,className:`mt-1 min-h-24 w-full rounded-md border border-strong bg-transparent px-3 py-2 text-copy-14 text-strong focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-mono-400`,"aria-describedby":`${l}-names-hint${le.length?` ${l}-names-issues`:``}`,value:w,onChange:e=>ne(e.target.value)}),(0,B.jsx)(G,{id:`${l}-names-issues`,issues:le}),N.length===0?(0,B.jsx)(`p`,{className:`mt-2 text-copy-14 text-caution`,children:V.noNames}):null]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`label`,{htmlFor:`${l}-qualified`,className:`block text-label-14-strong text-heading`,children:V.qualifiedNames}),(0,B.jsx)(`p`,{id:`${l}-qualified-hint`,className:`text-copy-14 text-secondary`,children:V.qualifiedHint}),(0,B.jsx)(`textarea`,{id:`${l}-qualified`,className:`mt-1 min-h-20 w-full rounded-md border border-strong bg-transparent px-3 py-2 text-copy-14 text-strong focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-mono-400`,"aria-describedby":`${l}-qualified-hint ${l}-qualified-note${ue.length?` ${l}-qualified-issues`:``}`,value:re,onChange:e=>T(e.target.value)}),(0,B.jsx)(G,{id:`${l}-qualified-issues`,issues:ue}),(0,B.jsx)(`p`,{id:`${l}-qualified-note`,className:`mt-2 max-w-3xl text-copy-14 text-secondary`,children:V.qualifiedNote})]}),(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:V.draftOnly}),(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,B.jsx)(fe,{type:`submit`,className:`h-11 px-4 text-label-14 md:h-11`,disabled:U.isPending,children:U.isPending?V.saving:V.save}),(0,B.jsx)(_,{type:`button`,variant:`ghost`,className:`h-11 px-4 text-button-14 md:h-11`,disabled:U.isPending,onClick:()=>{C(!1),A(null)},children:V.cancel})]})]}):K===0?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:V.noNames}):(0,B.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[n.aliases.length>0?(0,B.jsx)(he,{label:V.names,names:n.aliases}):null,g.length>0?(0,B.jsx)(he,{label:V.qualifiedNames,names:g}):null]})]})}var K=50,q={branded:{headline:`When they know your name`,technical:`Branded queries`},"non-brand":{headline:`When they don't`,technical:`Non-brand queries`}},_e={plan_v1:`Setup update required`,no_completed_run:`No completed measurement yet`,no_population:`No queries of this type are assigned`,evidence_incomplete:`Source evidence is incomplete`,identity_ambiguous:S,not_applicable:`Not applicable for this Property`},ve={complete:{label:`Measured`,tone:`positive`},partial:{label:`Partly measured`,tone:`caution`},running:{label:`Measuring now`,tone:`neutral`},queued:{label:`Measurement queued`,tone:`neutral`},failed:{label:`Measurement failed`,tone:`negative`},not_measured:{label:`Not measured`,tone:`neutral`}},J={assigned:{label:`Matches this Property`,tone:`positive`},sibling:{label:`Matches another Property`,tone:`caution`},ownedUnmapped:{label:`Site URL not in a Property`,tone:`caution`},external:{label:`External URL`,tone:`neutral`},ambiguous:{label:`Matches multiple Properties`,tone:`caution`},invalid:{label:`Invalid URL`,tone:`negative`}};function Y(e){return[...e].sort((e,t)=>Number(t.classification===`assigned`)-Number(e.classification===`assigned`))}function ye(e){return`${e.expectedSlotId}:${e.usageEdgeId}`}function be({row:e}){return e.mentioned===null?(0,B.jsxs)(`span`,{className:`inline-flex flex-col items-start gap-0.5`,children:[(0,B.jsx)(y,{tone:`neutral`,children:`Not measured`}),(0,B.jsx)(`span`,{className:`text-label-12 text-muted`,children:`No mention signal for this Property`})]}):!e.mentioned&&e.mentionIdentity===`wrong-subject`?(0,B.jsxs)(`span`,{className:`inline-flex flex-col items-start gap-0.5`,children:[(0,B.jsx)(y,{tone:`neutral`,children:`Not mentioned`}),(0,B.jsxs)(`span`,{className:`inline-flex items-center gap-1 text-label-12 text-muted`,children:[P.label,(0,B.jsx)(k,{text:P.property})]})]}):(0,B.jsx)(y,{tone:e.mentioned?`positive`:`neutral`,children:e.mentioned?`Mentioned`:`Not mentioned`})}var xe=`—`;function Se({row:e}){return e.cited===null?(0,B.jsxs)(`span`,{className:`inline-flex flex-col items-start gap-0.5`,children:[(0,B.jsx)(y,{tone:`neutral`,children:`Not measured`}),(0,B.jsx)(`span`,{className:`text-label-12 text-muted`,children:`Sources were not fully captured`})]}):(0,B.jsx)(y,{tone:e.cited?`positive`:`neutral`,children:e.cited?`Cited`:`Not cited`})}function Ce({row:e}){return e.cited===null&&e.sources.length===0?(0,B.jsx)(`p`,{className:`py-2 text-copy-14 text-secondary`,children:`The sources for this answer were not fully captured, so none can be shown.`}):e.sources.length===0?(0,B.jsx)(`p`,{className:`py-2 text-copy-14 text-secondary`,children:`This answer returned no source URLs at all.`}):(0,B.jsxs)(`details`,{className:`mt-2`,"data-answer-sources":!0,children:[(0,B.jsxs)(`summary`,{className:`min-h-11 cursor-pointer py-3 text-label-14 text-secondary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-mono-400`,children:[oe,` (`,e.sources.length,`)`]}),(0,B.jsx)(`div`,{className:`overflow-x-auto`,children:(0,B.jsxs)(`table`,{className:`evidence-table min-w-[420px]`,children:[(0,B.jsxs)(`caption`,{className:`sr-only`,children:[`Source URLs for `,e.queryText]}),(0,B.jsx)(`thead`,{children:(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`th`,{children:`Match`}),(0,B.jsx)(`th`,{children:`URL`})]})}),(0,B.jsx)(`tbody`,{children:Y(e.sources).map(e=>(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`td`,{children:(0,B.jsx)(y,{tone:J[e.classification].tone,children:J[e.classification].label})}),(0,B.jsx)(`td`,{children:(0,B.jsx)(F,{url:e.sourceUrl})})]},e.sourceUrl))})]})})]})}function we({project:e,targetKey:t,resultId:n}){let r=a({...E({client:h,path:{name:e},query:{targetKey:t,resultId:n}})});if(r.isPending)return(0,B.jsx)(`p`,{className:`py-2 text-copy-14 text-secondary`,role:`status`,"aria-live":`polite`,children:`Loading the answer…`});if(r.isError)return(0,B.jsx)(`p`,{className:`py-2 text-copy-14 text-secondary`,role:`alert`,children:`Could not load this answer.`});let i=r.data?.answer;return i==null||i.trim()===``?(0,B.jsx)(`p`,{className:`py-2 text-copy-14 text-secondary`,children:`This answer was measured, but its text was not stored.`}):(0,B.jsx)(`div`,{className:`py-2`,children:(0,B.jsx)(M,{headingLevel:4,copyable:!0,children:i})})}function Te(e){return _e[e.reason]??`Not measured`}function X({metric:e,signal:t,emphasis:n=!1}){if(e.state===`unavailable`)return(0,B.jsxs)(`span`,{className:`inline-flex flex-col gap-0.5`,children:[(0,B.jsx)(`span`,{className:n?`text-label-18-strong text-secondary`:`text-label-14-strong text-secondary`,children:`Not measured`}),(0,B.jsx)(`span`,{className:`text-label-14 text-secondary`,children:Te(e)})]});let r=v(e.value),i=e.numerator===void 0||e.denominator===void 0?null:`${e.numerator} of ${e.denominator}`,a=x(e,t);return(0,B.jsxs)(`span`,{className:`inline-flex flex-col gap-0.5 tabular-nums`,children:[(0,B.jsx)(`span`,{className:n?`text-label-18-strong text-heading`:`text-label-14-strong text-primary`,children:r}),i?(0,B.jsx)(`span`,{className:`text-label-12 text-muted`,children:i}):null,a?(0,B.jsx)(`span`,{className:`-ml-2 flex`,children:(0,B.jsx)(k,{tone:`caution`,placement:`bottom`,label:a.label,text:a.text})}):null]})}function Ee(e,t,n){return C({client:h,path:{name:e},query:{scope:`property`,targetKey:t,queryClass:n}})}function De(e){return e?.properties.items.at(0)}function Oe({measuredAt:e,unmeasuredReason:t,queryClass:n}){let r=e===void 0?null:e===null?`No completed check yet`:`Measured ${D(O(e))}`;return r===null&&t===void 0?null:(0,B.jsxs)(`p`,{className:`supporting-copy`,children:[[r,t].filter(Boolean).join(` · `),r!==null&&t===void 0?` · ${q[n].technical.toLocaleLowerCase()} only`:``]})}function ke({project:e,groups:t}){return t.length===0?null:(0,B.jsxs)(`section`,{"aria-labelledby":`property-market`,className:`page-section-divider`,children:[(0,B.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`Competitive comparison`}),(0,B.jsxs)(`h2`,{id:`property-market`,className:`text-heading-16 text-heading`,children:[`Measured at the market level`,(0,B.jsx)(k,{text:`Competitors are attached to a market rather than to a single Property, because one building has nobody to be compared against. Share of voice and competitor pressure are reported for the market this Property sits in.`})]})]}),(0,B.jsx)(_,{asChild:!0,type:`button`,size:`sm`,variant:`outline`,children:(0,B.jsx)(u,{to:`/projects/$projectName`,params:{projectName:e},search:e=>N(A(e),{measurementScope:`project`}),children:`Open measurement overview`})})]}),(0,B.jsx)(`ul`,{className:`flex flex-wrap gap-2`,children:t.map(e=>(0,B.jsxs)(`li`,{className:`rounded-md border border-default px-3 py-1.5 text-label-14 text-strong`,children:[e.label,(0,B.jsxs)(`span`,{className:`ml-2 text-label-12 text-muted`,children:[e.competitors.length,` `,e.competitors.length===1?`competitor`:`competitors`]})]},e.stableKey))})]})}function Z({label:e,metric:t,signal:n,failed:r=!1}){if(t===void 0)return(0,B.jsxs)(`div`,{className:`aeo-hero-row`,children:[(0,B.jsx)(`p`,{className:`aeo-hero-row-label`,children:e}),(0,B.jsx)(`p`,{className:`aeo-hero-row-value text-copy-16-strong text-secondary`,children:r?`Unavailable`:`…`}),r?(0,B.jsx)(`div`,{}):(0,B.jsx)(`div`,{className:`aeo-hero-row-bar`,"aria-hidden":`true`}),(0,B.jsx)(`p`,{className:`aeo-hero-row-detail`,children:r?`Could not be loaded`:`Loading`})]});if(t.state===`unavailable`){let n=Te(t);return(0,B.jsxs)(`div`,{className:`aeo-hero-row`,children:[(0,B.jsx)(`p`,{className:`aeo-hero-row-label`,children:e}),(0,B.jsx)(`p`,{className:`aeo-hero-row-value text-copy-16-strong text-secondary`,children:`Not measured`}),(0,B.jsx)(`div`,{}),(0,B.jsx)(`p`,{className:`aeo-hero-row-detail`,children:n===`Not measured`?``:n})]})}let{figure:i,sign:a}=b(v(t.value)),o=t.numerator===void 0||t.denominator===void 0?null:`${t.numerator} of ${t.denominator}`,s=x(t,n);return(0,B.jsxs)(`div`,{className:`aeo-hero-row`,children:[(0,B.jsx)(`p`,{className:`aeo-hero-row-label`,children:e}),(0,B.jsxs)(`p`,{className:`aeo-hero-row-value text-heading`,children:[i,a?(0,B.jsx)(`span`,{className:`text-faint`,children:a}):null]}),(0,B.jsx)(`div`,{className:`aeo-hero-row-bar`,"aria-hidden":`true`,children:(0,B.jsx)(`div`,{className:`metric-card-bar-fill progress-fill-neutral`,style:{width:`${t.value*100}%`}})}),(0,B.jsxs)(`p`,{className:`aeo-hero-row-detail tabular-nums`,children:[o??``,s?(0,B.jsx)(`span`,{className:`block`,children:(0,B.jsx)(k,{tone:`caution`,placement:`bottom`,label:s.label,text:s.text})}):null]})]})}function Ae({branded:e,nonBrand:t,brandedFailed:n=!1,nonBrandFailed:r=!1}){return(0,B.jsxs)(`section`,{"aria-labelledby":`property-coverage-hero`,children:[(0,B.jsx)(`h2`,{id:`property-coverage-hero`,className:`sr-only`,children:`Coverage for this Property`}),(0,B.jsxs)(`div`,{className:`space-y-5`,children:[(0,B.jsxs)(`div`,{className:`space-y-2`,children:[(0,B.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`Non-brand · the demand to earn`}),(0,B.jsx)(Z,{label:`Mentioned`,metric:t?.mentionCoverage,signal:`mentioned`,failed:r}),(0,B.jsx)(Z,{label:`Cited`,metric:t?.citationCoverage,signal:`cited`,failed:r})]}),(0,B.jsxs)(`div`,{className:`space-y-2`,children:[(0,B.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`Branded · already named`}),(0,B.jsx)(Z,{label:`Mentioned`,metric:e?.mentionCoverage,signal:`mentioned`,failed:n}),(0,B.jsx)(Z,{label:`Cited`,metric:e?.citationCoverage,signal:`cited`,failed:n})]})]})]})}function je({branded:e,nonBrand:t,brandedError:n,nonBrandError:r,onRetry:i}){return(0,B.jsxs)(`section`,{"aria-labelledby":`property-brand-contrast`,children:[(0,B.jsx)(`div`,{className:`section-head section-head-inline`,children:(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`The gap`}),(0,B.jsxs)(`h2`,{id:`property-brand-contrast`,className:`text-heading-16 text-heading`,children:[`Named versus not named`,(0,B.jsx)(k,{text:`Branded queries already contain your name, so an answer engine has an easy path back to you. Non-brand queries describe the need instead, and that is the demand you have to earn. Each row is measured only over the queries assigned to this Property in that class; a class with no assigned query reads Not measured rather than 0%.`})]})]})}),(0,B.jsx)(`div`,{className:`overflow-x-auto rounded-md border border-default`,children:(0,B.jsxs)(`table`,{className:`evidence-table min-w-[560px]`,children:[(0,B.jsx)(`caption`,{className:`sr-only`,children:`Mention and citation coverage for this Property, split by query class`}),(0,B.jsx)(`thead`,{children:(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`th`,{children:`Query type`}),(0,B.jsx)(`th`,{children:`Mentioned in the answer`}),(0,B.jsx)(`th`,{children:`Cited as a source`})]})}),(0,B.jsx)(`tbody`,{children:[{queryClass:`branded`,row:e,isError:n},{queryClass:`non-brand`,row:t,isError:r}].map(({queryClass:e,row:t,isError:n})=>(0,B.jsxs)(`tr`,{children:[(0,B.jsxs)(`td`,{children:[(0,B.jsx)(`span`,{className:`block text-label-14-strong text-heading`,children:q[e].headline}),(0,B.jsx)(`span`,{className:`mt-0.5 block text-label-12 text-muted`,children:q[e].technical}),t&&n?(0,B.jsxs)(`span`,{className:`mt-2 flex flex-wrap items-center gap-2 text-label-14 text-caution`,children:[(0,B.jsx)(`span`,{role:`status`,children:`Refresh failed.`}),(0,B.jsxs)(_,{type:`button`,size:`sm`,variant:`ghost`,className:`h-11 px-3 text-button-14 md:h-11`,onClick:()=>i(e),children:[`Retry `,q[e].technical.toLocaleLowerCase()]})]}):null]}),t?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`td`,{children:(0,B.jsx)(X,{metric:t.mentionCoverage,signal:`mentioned`,emphasis:!0})}),(0,B.jsx)(`td`,{children:(0,B.jsx)(X,{metric:t.citationCoverage,signal:`cited`,emphasis:!0})})]}):n?(0,B.jsx)(`td`,{colSpan:2,children:(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 text-label-14 text-secondary`,children:[(0,B.jsxs)(`span`,{role:`alert`,children:[`Could not load `,q[e].technical.toLocaleLowerCase(),`.`]}),(0,B.jsxs)(_,{type:`button`,size:`sm`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,onClick:()=>i(e),children:[`Retry `,q[e].technical.toLocaleLowerCase()]})]})}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`td`,{children:(0,B.jsx)(`span`,{className:`text-label-14 text-secondary`,children:`Loading…`})}),(0,B.jsx)(`td`,{children:(0,B.jsx)(`span`,{className:`text-label-14 text-secondary`,children:`Loading…`})})]})]},e))})]})})]})}function Me({row:e,queryClass:t,isError:n}){return(0,B.jsxs)(`section`,{"aria-labelledby":`property-providers`,className:`page-section-divider`,children:[(0,B.jsx)(`div`,{className:`section-head section-head-inline`,children:(0,B.jsx)(`div`,{children:(0,B.jsxs)(`h2`,{id:`property-providers`,className:`text-heading-16 text-heading`,children:[`Which engines answer for this Property`,(0,B.jsx)(k,{text:`Each row is measured over the queries that engine actually answered for this Property, so the rows are a split of the same population rather than parts that add up to the Property total. An engine that answered nothing for this Property is absent instead of shown at 0%.`})]})})}),e===void 0&&n?(0,B.jsxs)(`p`,{className:`text-copy-14 text-secondary`,children:[`Details for `,q[t].technical.toLocaleLowerCase(),` are unavailable. Retry that query type above.`]}):e===void 0?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`Loading…`}):e.providers.length===0?(0,B.jsxs)(`p`,{className:`text-copy-14 text-secondary`,children:[`No answer engine has measured `,q[t].technical.toLocaleLowerCase(),` for this Property.`,e.mentionCoverage.state===`unavailable`?` ${Te(e.mentionCoverage)}.`:``]}):(0,B.jsx)(`div`,{className:`overflow-x-auto rounded-md border border-default`,children:(0,B.jsxs)(`table`,{className:`evidence-table min-w-[520px]`,children:[(0,B.jsx)(`caption`,{className:`sr-only`,children:`Per-engine mention and citation coverage`}),(0,B.jsx)(`thead`,{children:(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`th`,{children:`Engine`}),(0,B.jsx)(`th`,{children:`Mentioned`}),(0,B.jsx)(`th`,{children:`Cited`})]})}),(0,B.jsx)(`tbody`,{children:e.providers.map(e=>(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`td`,{className:`text-label-14-strong text-heading`,children:e.provider}),(0,B.jsx)(`td`,{children:(0,B.jsx)(X,{metric:e.mentionCoverage,signal:`mentioned`})}),(0,B.jsx)(`td`,{children:(0,B.jsx)(X,{metric:e.citationCoverage,signal:`cited`})})]},e.provider))})]})})]})}function Ne(e){let t=e.questions.join(` · `);return e.questionsTruncated?`${t} +${e.questionTotal-e.questions.length} more`:t}function Pe({project:e,targetKey:t,queryClass:n}){let r=a({...T({client:h,path:{name:e},query:{targetKey:t,queryClass:n}})});if(r.isPending||r.isError)return null;let i=r.data?.competitors??[],o=r.data?.basis;return(0,B.jsxs)(`section`,{"aria-labelledby":`property-named-instead`,className:`page-section-divider`,children:[(0,B.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,B.jsx)(`div`,{children:(0,B.jsxs)(`h2`,{id:`property-named-instead`,className:`text-heading-16 text-heading`,children:[`Named instead of this Property`,(0,B.jsx)(k,{text:`Counted from the answers that did not name this Property, so a name here is one an engine recommended in its place. Occurrences count answers, not positions: an engine naming the same rival in two answers counts twice, and one naming it twice in a single answer counts once.`})]})}),i.length>0?(0,B.jsxs)(`p`,{className:`supporting-copy`,children:[r.data?.total??i.length,` named`]}):null]}),i.length===0?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`No rival was named in the answers this Property missed. Nothing to compete with here yet.`}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`div`,{className:`overflow-x-auto rounded-md border border-default`,children:(0,B.jsxs)(`table`,{className:`evidence-table min-w-[420px]`,children:[(0,B.jsx)(`caption`,{className:`sr-only`,children:`Names the engines gave instead of this Property`}),(0,B.jsx)(`thead`,{children:(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`th`,{children:`Named`}),(0,B.jsx)(`th`,{children:`Answers`}),(0,B.jsx)(`th`,{children:`Engines`}),(0,B.jsx)(`th`,{children:`Queries`})]})}),(0,B.jsx)(`tbody`,{children:i.map(e=>(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`td`,{className:`text-strong`,children:e.name}),(0,B.jsx)(`td`,{className:`tabular-nums text-secondary`,children:e.occurrences}),(0,B.jsxs)(`td`,{className:`text-secondary`,children:[e.providers.join(`, `),e.providersTruncated?` +${e.providerTotal-e.providers.length}`:``]}),(0,B.jsx)(`td`,{className:`text-right`,children:(0,B.jsxs)(`span`,{className:`inline-flex items-center justify-end gap-1`,children:[(0,B.jsx)(`span`,{className:`tabular-nums text-secondary`,children:e.questionTotal}),(0,B.jsx)(k,{text:Ne(e)})]})})]},e.name))})]})}),o?.state===`available`?(0,B.jsxs)(`p`,{className:`supporting-copy mt-2`,children:[o.targetMissResults,` of `,o.answeredResults,` answers to `,q[n].technical.toLocaleLowerCase(),` did not name this Property.`]}):null]})]})}function Fe({questions:e,queryClass:t}){return(0,B.jsxs)(`section`,{"aria-labelledby":`property-questions`,className:`page-section-divider`,children:[(0,B.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,B.jsx)(`div`,{children:(0,B.jsxs)(`h2`,{id:`property-questions`,className:`text-heading-16 text-heading`,children:[q[t].technical,` assigned to this Property`]})}),(0,B.jsxs)(`p`,{className:`supporting-copy`,children:[e.length,` assigned`]})]}),e.length===0?(0,B.jsxs)(`p`,{className:`text-copy-14 text-secondary`,children:[`No `,q[t].technical.toLocaleLowerCase(),` are assigned. Add one in advanced measurement setup to measure this class.`]}):(0,B.jsx)(`div`,{className:`overflow-x-auto rounded-md border border-default`,children:(0,B.jsxs)(`table`,{className:`evidence-table min-w-[420px]`,children:[(0,B.jsx)(`caption`,{className:`sr-only`,children:`Queries assigned to this Property`}),(0,B.jsx)(`thead`,{children:(0,B.jsx)(`tr`,{children:(0,B.jsx)(`th`,{children:`Query`})})}),(0,B.jsx)(`tbody`,{children:e.map(e=>(0,B.jsx)(`tr`,{children:(0,B.jsx)(`td`,{className:`text-secondary`,children:e})},e))})]})})]})}function Ie({urls:e}){return(0,B.jsxs)(`section`,{"aria-labelledby":`property-urls`,className:`page-section-divider`,children:[(0,B.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,B.jsx)(`div`,{children:(0,B.jsxs)(`h2`,{id:`property-urls`,className:`text-heading-16 text-heading`,children:[`URLs that count as this Property`,(0,B.jsx)(k,{text:`A cited source URL is credited to this Property when it matches one of these. The most specific matcher wins, so a URL covered by two Properties at the same specificity is flagged for review instead of being credited to either.`})]})}),(0,B.jsxs)(`p`,{className:`supporting-copy`,children:[e.length,` configured`]})]}),e.length===0?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`No URLs are configured for this Property.`}):(0,B.jsx)(`div`,{className:`overflow-x-auto rounded-md border border-default`,children:(0,B.jsxs)(`table`,{className:`evidence-table min-w-[420px]`,children:[(0,B.jsx)(`caption`,{className:`sr-only`,children:`URL matchers configured for this Property`}),(0,B.jsx)(`thead`,{children:(0,B.jsx)(`tr`,{children:(0,B.jsx)(`th`,{children:`URL`})})}),(0,B.jsx)(`tbody`,{children:e.map(e=>(0,B.jsx)(`tr`,{children:(0,B.jsx)(`td`,{className:`break-all text-secondary`,children:e})},e))})]})})]})}var Q={heading:`Cited on other queries`,help:`Answers to queries assigned to other properties that still cited one of this Property’s own pages. This Property was not measured on those queries, so these answers are not in its Mentioned or Cited rates.`,notCounted:`not in this Property’s rates`,empty:`No answer to a query assigned elsewhere cited this Property’s pages in the displayed measurement.`,loadError:`Citations from other queries could not be loaded.`,partlySaved:`Sources partly saved`};function Le({project:e,targetKey:t,queryClass:n,runId:r,targetLabels:i}){let[a,o]=(0,z.useState)(new Set),s={client:h,path:{name:e},query:{targetKey:t,queryClass:n,shape:m[`other-queries`],limit:K,...r?{runId:r}:{}}},l=c({...w(s),initialPageParam:s,getNextPageParam:e=>e.otherQueries?.nextCursor?{path:s.path,query:{...s.query,cursor:e.otherQueries.nextCursor}}:void 0}),d=l.data?.pages??[];if(d[0]?.measurement.state===`not_measured`)return null;let f=d.flatMap(e=>e.otherQueries?.items??[]),p=d[0]?.otherQueries?.totalEstimate??f.length,ee=e=>`${e.expectedSlotId}:${e.queryClass}`,g=q[n].technical.toLocaleLowerCase();return(0,B.jsxs)(`section`,{"aria-labelledby":`property-other-queries`,className:`page-section-divider`,children:[(0,B.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,B.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,B.jsx)(`h2`,{id:`property-other-queries`,className:`text-heading-16 text-heading`,children:Q.heading}),(0,B.jsx)(k,{text:Q.help})]}),l.data?(0,B.jsxs)(`p`,{className:`supporting-copy`,children:[p,` `,p===1?`answer`:`answers`,` · `,g,` · `,Q.notCounted]}):null]}),l.isPending?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`Loading…`}):l.isError&&f.length===0?(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 text-label-14 text-secondary`,children:[(0,B.jsx)(`span`,{role:`alert`,children:Q.loadError}),(0,B.jsx)(_,{type:`button`,size:`sm`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,onClick:()=>{l.refetch()},children:`Retry`})]}):f.length===0?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:Q.empty}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`div`,{className:`overflow-x-auto rounded-md border border-default`,children:(0,B.jsxs)(`table`,{className:`evidence-table min-w-[640px]`,children:[(0,B.jsx)(`caption`,{className:`sr-only`,children:`Answers to other properties’ queries that cited this Property’s pages`}),(0,B.jsx)(`thead`,{children:(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`th`,{children:`Query`}),(0,B.jsx)(`th`,{children:`Assigned to`}),(0,B.jsx)(`th`,{children:`Pages cited`}),(0,B.jsx)(`th`,{children:(0,B.jsx)(`span`,{className:`sr-only`,children:`Answer`})})]})}),(0,B.jsx)(`tbody`,{children:f.map(t=>{let n=ee(t),r=a.has(n),s=`property-other-query-${encodeURIComponent(n)}`;return(0,B.jsxs)(z.Fragment,{children:[(0,B.jsxs)(`tr`,{children:[(0,B.jsxs)(`td`,{className:`text-secondary`,children:[(0,B.jsx)(`span`,{className:`block text-label-14-strong text-heading`,children:t.queryText}),(0,B.jsx)(`span`,{className:`mt-1 block text-label-12 text-muted`,children:[t.provider,t.location].filter(Boolean).join(` · `)})]}),(0,B.jsx)(`td`,{children:(0,B.jsx)(`ul`,{className:`space-y-1`,children:t.assignedTargetKeys.map(t=>(0,B.jsx)(`li`,{children:(0,B.jsx)(u,{to:`/projects/$projectName/properties/$targetKey`,params:{projectName:e,targetKey:t},search:A,className:`text-label-14 text-link hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-mono-400`,children:i.get(t)??t})},t))})}),(0,B.jsxs)(`td`,{children:[(0,B.jsx)(`ul`,{className:`space-y-1`,children:t.sources.map(e=>(0,B.jsx)(`li`,{className:`min-w-0`,children:(0,B.jsx)(F,{url:e.sourceUrl})},e.sourceUrl))}),t.sourcesTruncated?(0,B.jsxs)(`span`,{className:`mt-1 block text-label-12 text-muted`,children:[t.sourceCount,` pages in total`]}):null,t.evidenceComplete?null:(0,B.jsx)(`span`,{className:`mt-1 block text-label-12 text-muted`,children:Q.partlySaved})]}),(0,B.jsx)(`td`,{className:`text-right`,children:(0,B.jsx)(_,{type:`button`,size:`sm`,variant:`ghost`,className:`h-auto pointer-coarse:min-h-11 max-w-full whitespace-normal py-2 text-left md:h-auto`,"aria-expanded":r,"aria-label":r?`Hide the answer for ${t.queryText}`:`Read the answer for ${t.queryText}`,"aria-controls":r?s:void 0,onClick:()=>o(e=>{let t=new Set(e);return t.delete(n)||t.add(n),t}),children:r?`Hide answer`:`Read answer`})})]}),r?(0,B.jsx)(`tr`,{children:(0,B.jsx)(`td`,{id:s,colSpan:4,className:`bg-surface-subtle px-4`,children:(0,B.jsx)(we,{project:e,targetKey:t.assignedTargetKeys[0],resultId:t.observationId})})}):null]},n)})})]})}),l.hasNextPage?(0,B.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-3 text-label-14 text-secondary`,children:[(0,B.jsxs)(`span`,{children:[`Showing `,f.length,` of `,p]}),(0,B.jsx)(_,{size:`sm`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,disabled:l.isFetchingNextPage,onClick:()=>{l.fetchNextPage()},children:l.isFetchingNextPage?`Loading…`:`Show ${K} more`})]}):null]})]})}function Re(e,t){let n=[e.marketKey?t??`the selected market`:null,e.provider?`the ${e.provider} answer engine`:null,e.model?`the ${e.model} model`:null,e.location?`location ${e.location}`:null,e.from||e.to?`a date range`:null,e.measurementRunId?`a saved check`:null].filter(e=>e!==null);return n.length===0?null:`AI Visibility is filtered to ${n.join(`, `)}. This page shows the latest measurement for ${I.allMarkets.toLocaleLowerCase()} and answer engines.`}function ze(){let{projectName:e,targetKey:n}=l({strict:!1}),r=o(),i=s({strict:!1}),f=(0,z.useMemo)(()=>se(i),[i]),[p,ee]=(0,z.useState)(new Set),v=e??``,b=n??``,x=!!v&&!!b,S=(0,z.useMemo)(()=>le(`portfolio`,ue(g())),[]),C=x&&S,{canWrite:T}=te(),E=a({...ne({client:h,path:{name:v}}),enabled:C}),ie=E.data?.active?.plan,ae=ie?.schemaVersion===2?ie:null,D=f.queryClass===`branded`||f.queryClass===`non-brand`?f.queryClass:null,O=e=>ae?.assignments.some(t=>t.targetKey===b&&t.queryClass===e)??!1,M=D??(!O(`non-brand`)&&O(`branded`)?`branded`:`non-brand`);(0,z.useEffect)(()=>{ae&&!D&&r({to:`.`,replace:!0,search:e=>N(e,{queryClass:M})})},[ae,D,M,r]);let P=a({...Ee(v,b,`branded`),enabled:C}),F=a({...Ee(v,b,`non-brand`),enabled:C}),fe=De(P.data),I=De(F.data),L=M===`branded`?P.data:F.data,R=M===`branded`?fe:I,V=(M===`branded`?P.isError:F.isError)&&R===void 0,H=L?.measurement.displayedRunId;de(v,{view:`property`,selection:{mode:`advanced`,scope:`property`,scopeKey:b,queryClass:M,limit:10,...H?{runId:H}:{}}});let U=R?.mentionCoverage.state===`unavailable`?Te(R.mentionCoverage):void 0,W=L===void 0?void 0:L.measurement.completedAt??null,me=L!==void 0&&(L.measurement.state===`not_measured`||L.nextAction.kind===`run_measurement`),he=e=>N(A(e),{measurementScope:`property`,measurementScopeKey:b,queryClass:M,measurementRunId:void 0,measurementRevision:void 0,measurementTo:void 0}),G=a({...re({client:h,path:{name:v},query:ce(se(he(i)))}),enabled:C&&me,retry:!1}).data,_e=G!==void 0&&G.selection.measurement.measuredRevision!==null&&(G.populations.find(e=>e.queryClass===M)?.summary.queryCount??0)>0,J={client:h,path:{name:v},query:{targetKey:b,queryClass:M,shape:m.answers,limit:K,...H?{runId:H}:{}}},Y=c({...w(J),enabled:C&&L!==void 0,initialPageParam:J,getNextPageParam:e=>e.answers?.nextCursor?{path:J.path,query:{...J.query,cursor:e.answers.nextCursor}}:void 0}),X=E.data?.active??null,Z=X?.plan.schemaVersion===2?X.plan:null,Ne=X!==null&&Z===null,Q=Z?.targets.find(e=>e.stableKey===b)??null,ze=Re(f,Z?.reportingScopes?.find(e=>e.stableKey===f.marketKey)?.label),Be=(0,z.useMemo)(()=>{if(!Z)return[];let e=new Map(Z.querySnapshots.map(e=>[e.queryId,e.queryText]));return[...new Set(Z.assignments.filter(e=>e.targetKey===b&&e.queryClass===M).flatMap(t=>{let n=e.get(t.queryId);return n===void 0?[]:[n]}))].sort((e,t)=>e.localeCompare(t))},[Z,b,M]),Ve=(0,z.useMemo)(()=>Q?.urlMatchers.map(pe)??[],[Q]),He=(0,z.useMemo)(()=>new Map((Z?.targets??[]).map(e=>[e.stableKey,e.label])),[Z]),Ue=(0,z.useMemo)(()=>Z?.groups.filter(e=>e.targetKeys.includes(b))??[],[Z,b]),$=(0,z.useMemo)(()=>(Y.data?.pages??[]).flatMap(e=>e.answers?.items??[]),[Y.data]),We=Y.data?.pages[0]?.answers?.totalEstimate??$.length,Ge=(Y.data?.pages??[]).length>0&&(Y.data?.pages??[]).every(e=>e.answers===void 0),Ke=Y.data?.pages[0]?.measurement.state,qe=(0,B.jsxs)(u,{to:`/projects/$projectName`,params:{projectName:v},search:A,className:`inline-flex items-center gap-1 text-label-12 text-muted hover:text-strong`,children:[(0,B.jsx)(t,{className:`size-3.5`,"aria-hidden":`true`}),`Back to AI Visibility`]});if(!x)return(0,B.jsx)(`div`,{className:`page-container`,children:(0,B.jsx)(`p`,{className:`text-copy-14 text-muted`,children:`Missing project name or Property key in URL.`})});if(!S)return(0,B.jsxs)(`div`,{className:`page-container space-y-3`,children:[qe,(0,B.jsx)(`p`,{className:`text-copy-14 text-muted`,children:`This view is not available here.`})]});if(E.isPending&&!E.isError)return(0,B.jsx)(`div`,{className:`page-container`,children:(0,B.jsxs)(`div`,{role:`status`,"aria-live":`polite`,children:[(0,B.jsx)(`span`,{className:`sr-only`,children:`Loading Property`}),(0,B.jsx)(`div`,{className:`h-32 animate-pulse rounded-md bg-surface-subtle`,"aria-hidden":`true`})]})});let Je=E.isError&&E.data===void 0,Ye=P.isError&&P.data===void 0,Xe=F.isError&&F.data===void 0;return Je||Ye&&Xe?(0,B.jsxs)(`div`,{className:`page-container space-y-3`,children:[qe,(0,B.jsx)(`p`,{role:`alert`,className:`text-copy-14 text-negative`,children:`Could not load this Property.`}),(0,B.jsx)(_,{type:`button`,size:`sm`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,onClick:()=>{E.refetch(),P.refetch(),F.refetch()},children:`Try again`})]}):!Z||!Q?(0,B.jsxs)(`div`,{className:`page-container space-y-3`,children:[qe,(0,B.jsx)(`p`,{role:`status`,className:`text-copy-14 text-secondary`,children:Z?`This Property is not in the published setup. It may have been renamed or removed.`:`A Property page needs a published advanced measurement setup. Republish setup from the project Portfolio tab.`}),(0,B.jsx)(_,{asChild:!0,type:`button`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,children:(0,B.jsx)(u,{to:`/projects/$projectName/portfolio`,params:{projectName:v},children:T?Ne?`Republish setup`:`Open measurement setup`:`View measurement setup`})})]}):(0,B.jsxs)(`div`,{className:`page-container space-y-8`,children:[(0,B.jsxs)(`div`,{className:`page-header`,children:[(0,B.jsxs)(`div`,{className:`page-header-left`,children:[qe,(0,B.jsx)(`h1`,{className:`page-title mt-2`,children:Q.label}),(0,B.jsxs)(`p`,{className:`page-subtitle`,children:[`Property in `,v,ze?(0,B.jsxs)(B.Fragment,{children:[` · Filters not applied `,(0,B.jsx)(k,{text:ze})]}):null]})]}),(0,B.jsxs)(`div`,{className:`page-header-right`,children:[L?(0,B.jsx)(y,{tone:ve[L.measurement.state].tone,children:ve[L.measurement.state].label}):null,R&&R.flags>0?(0,B.jsxs)(y,{tone:`caution`,children:[R.flags,` flagged`]}):null]})]}),(0,B.jsx)(Ae,{branded:fe,nonBrand:I,brandedFailed:Ye,nonBrandFailed:Xe}),(0,B.jsx)(je,{branded:fe,nonBrand:I,brandedError:P.isError,nonBrandError:F.isError,onRetry:e=>{e===`branded`?P.refetch():F.refetch()}}),me?(0,B.jsxs)(`section`,{className:`flex flex-wrap items-center justify-between gap-3 border-y border-default py-4`,"aria-label":`Measurement next step`,children:[(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:d()?j:T?`Run a measurement from the project overview to collect this Property’s coverage and source evidence.${_e?` AI Visibility still shows the last results.`:``}`:`This Property needs a new measurement before coverage and source evidence are available.`}),(0,B.jsx)(_,{asChild:!0,type:`button`,className:`h-11 px-4 text-button-14 md:h-11`,children:(0,B.jsx)(u,{to:`/projects/$projectName`,params:{projectName:v},search:_e?he:A,children:_e?`See the last results`:T?`Go to AI Visibility`:`View AI Visibility`})})]}):null,(0,B.jsxs)(`div`,{className:`flex flex-wrap items-end gap-4 border-y border-default py-4`,children:[(0,B.jsxs)(`div`,{className:`space-y-1`,children:[(0,B.jsx)(`label`,{htmlFor:`property-query-class`,className:`block text-label-14-strong text-heading`,children:`Query type`}),(0,B.jsxs)(`select`,{id:`property-query-class`,value:M,onChange:e=>{let t=e.target.value===`branded`?`branded`:`non-brand`;r({to:`.`,search:e=>N(e,{queryClass:t})})},className:`h-11 rounded-md border border-default bg-surface px-3 text-label-14 text-primary focus:outline-none focus:ring-2 focus:ring-mono-400`,children:[(0,B.jsx)(`option`,{value:`non-brand`,children:q[`non-brand`].technical}),(0,B.jsx)(`option`,{value:`branded`,children:q.branded.technical})]})]}),(0,B.jsx)(Oe,{measuredAt:W,unmeasuredReason:U,queryClass:M})]}),(0,B.jsx)(Me,{row:R,queryClass:M,isError:V}),(0,B.jsx)(Pe,{project:v,targetKey:b,queryClass:M}),(0,B.jsx)(Fe,{questions:Be,queryClass:M}),(0,B.jsx)(ge,{projectName:v,targetKey:b,published:Q,activeRevision:X.revision,publishedBrandNames:Z.identities.projectBrand.names}),(0,B.jsx)(Ie,{urls:Ve}),(0,B.jsx)(ke,{project:v,groups:Ue}),(0,B.jsxs)(`section`,{"aria-labelledby":`property-evidence`,className:`page-section-divider`,children:[(0,B.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,B.jsx)(`div`,{children:(0,B.jsxs)(`h2`,{id:`property-evidence`,className:`text-heading-16 text-heading`,children:[`Answers the engines gave`,(0,B.jsx)(k,{text:`One row per answer an engine gave for the queries assigned to this Property in the displayed measurement. Mentioned and cited are independent: an answer can name this Property without linking it, or link it without naming it. Answers that did neither are listed first, because those are what a gap is made of. Where the answer text was not stored the mention reads Not measured, never a zero. Open a row to read what the engine actually said, followed by the source URLs it returned, this Property's own first. The answer is where a miss becomes actionable: a query this Property was not named in may still have named a sibling building.`})]})}),$.length>0?(0,B.jsxs)(`p`,{className:`supporting-copy`,children:[$.length,` of `,We]}):null]}),V?(0,B.jsxs)(`p`,{className:`text-copy-14 text-secondary`,children:[`Evidence for `,q[M].technical.toLocaleLowerCase(),` is unavailable. Retry that query type above.`]}):Y.isPending&&$.length===0?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`Loading evidence…`}):Y.isError&&$.length===0?(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 text-label-14 text-secondary`,children:[(0,B.jsx)(`span`,{role:`alert`,children:`Evidence could not be loaded.`}),(0,B.jsx)(_,{type:`button`,size:`sm`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,onClick:()=>{Y.refetch()},children:`Retry evidence`})]}):Ke===`not_measured`?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:d()?j:`Not measured yet. Run a measurement to collect the answers for this Property.`}):Ge?(0,B.jsx)(`p`,{role:`alert`,className:`text-copy-14 text-caution`,children:`This measurement was returned in an older format, so the answers cannot be shown here. The numbers above are unaffected.`}):$.length===0?(0,B.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`No answers matched this Property in the displayed measurement.`}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`div`,{className:`property-answer-table-container overflow-x-auto rounded-md border border-default`,children:(0,B.jsxs)(`table`,{className:`evidence-table property-evidence-table`,children:[(0,B.jsx)(`caption`,{className:`sr-only`,children:`Answers measured for this Property`}),(0,B.jsx)(`thead`,{children:(0,B.jsxs)(`tr`,{children:[(0,B.jsx)(`th`,{children:`Query`}),(0,B.jsx)(`th`,{children:`Mentioned in the answer`}),(0,B.jsx)(`th`,{children:`Cited as a source`}),(0,B.jsx)(`th`,{children:`Sources`}),(0,B.jsx)(`th`,{children:(0,B.jsx)(`span`,{className:`sr-only`,children:`Sources detail`})})]})}),(0,B.jsx)(`tbody`,{children:$.map(e=>{let t=ye(e),n=p.has(t),r=`property-answer-${encodeURIComponent(t)}`;return(0,B.jsxs)(z.Fragment,{children:[(0,B.jsxs)(`tr`,{className:`property-answer-summary`,children:[(0,B.jsxs)(`td`,{className:`text-secondary`,children:[(0,B.jsx)(`h3`,{className:`text-heading-14 text-heading`,children:e.queryText}),(0,B.jsx)(`span`,{className:`mt-1 block text-label-12 text-muted`,children:[e.provider,e.location].filter(Boolean).join(` · `)}),e.historical||e.bridged?(0,B.jsx)(`span`,{className:`mt-1 flex`,children:(0,B.jsx)(y,{tone:`caution`,children:`Historical`})}):null]}),(0,B.jsxs)(`td`,{children:[(0,B.jsx)(`span`,{className:`property-evidence-mobile-label`,"aria-hidden":`true`,children:`Mentioned`}),(0,B.jsx)(be,{row:e})]}),(0,B.jsxs)(`td`,{children:[(0,B.jsx)(`span`,{className:`property-evidence-mobile-label`,"aria-hidden":`true`,children:`Cited`}),(0,B.jsx)(Se,{row:e})]}),(0,B.jsxs)(`td`,{className:`tabular-nums text-secondary`,children:[(0,B.jsx)(`span`,{className:`property-evidence-mobile-label`,"aria-hidden":`true`,children:oe}),e.cited===null?xe:e.sources.length]}),(0,B.jsx)(`td`,{className:`text-right`,children:(0,B.jsx)(_,{type:`button`,size:`sm`,variant:`ghost`,className:`h-auto pointer-coarse:min-h-11 max-w-full whitespace-normal py-2 text-left md:h-auto`,"aria-expanded":n,"aria-label":n?`Hide the answer for ${e.queryText}`:`Read the answer for ${e.queryText}`,"aria-controls":n?r:void 0,onClick:()=>ee(e=>{let n=new Set(e);return n.delete(t)||n.add(t),n}),children:n?`Hide answer`:`Read answer`})})]}),n?(0,B.jsx)(`tr`,{className:`property-answer-detail`,children:(0,B.jsxs)(`td`,{id:r,colSpan:5,className:`bg-surface-subtle px-4`,children:[(0,B.jsx)(we,{project:v,targetKey:b,resultId:e.observationId}),(0,B.jsx)(Ce,{row:e})]})}):null]},t)})})]})}),Y.hasNextPage?(0,B.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-3 text-label-14 text-secondary`,children:[(0,B.jsxs)(`span`,{children:[`Showing `,$.length,` of `,We]}),Y.isFetchNextPageError?(0,B.jsx)(`span`,{role:`alert`,children:`Could not load more evidence.`}):null,(0,B.jsx)(_,{size:`sm`,variant:`outline`,className:`h-11 px-4 text-button-14 md:h-11`,disabled:Y.isFetchingNextPage,onClick:()=>{Y.fetchNextPage()},children:Y.isFetchingNextPage?`Loading…`:Y.isFetchNextPageError?`Retry more evidence`:`Show ${K} more`})]}):null]})]}),L?(0,B.jsx)(Le,{project:v,targetKey:b,queryClass:M,runId:H,targetLabels:He}):null]})}export{J as EVIDENCE_LABELS,ze as MeasurementPropertyPage,Q as OTHER_QUERIES_COPY};